diff --git a/README.md b/README.md index c9d25016..291b574a 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ ![Static analysis](https://github.com/Part-DB/Part-DB-symfony/workflows/Static%20analysis/badge.svg) [![codecov](https://codecov.io/gh/Part-DB/Part-DB-server/branch/master/graph/badge.svg)](https://codecov.io/gh/Part-DB/Part-DB-server) ![GitHub License](https://img.shields.io/github/license/Part-DB/Part-DB-symfony) -![PHP Version](https://img.shields.io/badge/PHP-%3E%3D%208.1-green) +![PHP Version](https://img.shields.io/badge/PHP-%3E%3D%208.2-green) ![Docker Pulls](https://img.shields.io/docker/pulls/jbtronics/part-db1) ![Docker Build Status](https://github.com/Part-DB/Part-DB-symfony/workflows/Docker%20Image%20Build/badge.svg) diff --git a/VERSION b/VERSION index e9307ca5..eca07e4c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.0.2 +2.1.2 diff --git a/assets/controllers/common/markdown_controller.js b/assets/controllers/common/markdown_controller.js index b6ef0034..c6cb97df 100644 --- a/assets/controllers/common/markdown_controller.js +++ b/assets/controllers/common/markdown_controller.js @@ -56,12 +56,16 @@ export default class MarkdownController extends Controller { this.element.innerHTML = DOMPurify.sanitize(MarkdownController._marked.parse(this.unescapeHTML(raw))); for(let a of this.element.querySelectorAll('a')) { - //Mark all links as external - a.classList.add('link-external'); - //Open links in new tag - a.setAttribute('target', '_blank'); - //Dont track - a.setAttribute('rel', 'noopener'); + // test if link is absolute + var r = new RegExp('^(?:[a-z+]+:)?//', 'i'); + if (r.test(a.getAttribute('href'))) { + //Mark all links as external + a.classList.add('link-external'); + //Open links in new tag + a.setAttribute('target', '_blank'); + //Dont track + a.setAttribute('rel', 'noopener'); + } } //Apply bootstrap styles to tables @@ -108,4 +112,4 @@ export default class MarkdownController extends Controller { gfm: true, }); }*/ -} \ No newline at end of file +} diff --git a/assets/controllers/elements/attachment_autocomplete_controller.js b/assets/controllers/elements/attachment_autocomplete_controller.js index f8bc301e..0175b284 100644 --- a/assets/controllers/elements/attachment_autocomplete_controller.js +++ b/assets/controllers/elements/attachment_autocomplete_controller.js @@ -42,6 +42,7 @@ export default class extends Controller { selectOnTab: true, //This a an ugly solution to disable the delimiter parsing of the TomSelect plugin delimiter: 'VERY_L0NG_D€LIMITER_WHICH_WILL_NEVER_BE_ENCOUNTERED_IN_A_STRING', + dropdownParent: 'body', render: { item: (data, escape) => { return '' + escape(data.label) + ''; diff --git a/assets/controllers/elements/datatables/parts_controller.js b/assets/controllers/elements/datatables/parts_controller.js index 1fe11a20..c43fa276 100644 --- a/assets/controllers/elements/datatables/parts_controller.js +++ b/assets/controllers/elements/datatables/parts_controller.js @@ -45,8 +45,10 @@ export default class extends DatatablesController { //Hide/Unhide panel with the selection tools if (count > 0) { selectPanel.classList.remove('d-none'); + selectPanel.classList.add('sticky-select-bar'); } else { selectPanel.classList.add('d-none'); + selectPanel.classList.remove('sticky-select-bar'); } //Update selection count text diff --git a/assets/controllers/elements/part_select_controller.js b/assets/controllers/elements/part_select_controller.js index 5abd5ba3..0658f4b4 100644 --- a/assets/controllers/elements/part_select_controller.js +++ b/assets/controllers/elements/part_select_controller.js @@ -16,6 +16,7 @@ export default class extends Controller { searchField: ["name", "description", "category", "footprint"], valueField: "id", labelField: "name", + dropdownParent: 'body', preload: "focus", render: { item: (data, escape) => { @@ -71,4 +72,4 @@ export default class extends Controller { //Destroy the TomSelect instance this._tomSelect.destroy(); } -} \ No newline at end of file +} diff --git a/assets/controllers/elements/select_controller.js b/assets/controllers/elements/select_controller.js index cdafe4d0..f933731a 100644 --- a/assets/controllers/elements/select_controller.js +++ b/assets/controllers/elements/select_controller.js @@ -44,6 +44,7 @@ export default class extends Controller { allowEmptyOption: true, selectOnTab: true, maxOptions: null, + dropdownParent: 'body', render: { item: this.renderItem.bind(this), @@ -108,4 +109,4 @@ export default class extends Controller { //Destroy the TomSelect instance this._tomSelect.destroy(); } -} \ No newline at end of file +} diff --git a/assets/controllers/elements/select_multiple_controller.js b/assets/controllers/elements/select_multiple_controller.js index df37871d..daa6b0a1 100644 --- a/assets/controllers/elements/select_multiple_controller.js +++ b/assets/controllers/elements/select_multiple_controller.js @@ -29,6 +29,7 @@ export default class extends Controller { this._tomSelect = new TomSelect(this.element, { maxItems: 1000, allowEmptyOption: true, + dropdownParent: 'body', plugins: ['remove_button'], }); } @@ -39,4 +40,4 @@ export default class extends Controller { this._tomSelect.destroy(); } -} \ No newline at end of file +} diff --git a/assets/controllers/elements/static_file_autocomplete_controller.js b/assets/controllers/elements/static_file_autocomplete_controller.js index 31ca0314..0421a26d 100644 --- a/assets/controllers/elements/static_file_autocomplete_controller.js +++ b/assets/controllers/elements/static_file_autocomplete_controller.js @@ -50,6 +50,7 @@ export default class extends Controller { valueField: 'text', searchField: 'text', orderField: 'text', + dropdownParent: 'body', //This a an ugly solution to disable the delimiter parsing of the TomSelect plugin delimiter: 'VERY_L0NG_D€LIMITER_WHICH_WILL_NEVER_BE_ENCOUNTERED_IN_A_STRING', diff --git a/assets/controllers/elements/structural_entity_select_controller.js b/assets/controllers/elements/structural_entity_select_controller.js index a1114a97..5c6f9490 100644 --- a/assets/controllers/elements/structural_entity_select_controller.js +++ b/assets/controllers/elements/structural_entity_select_controller.js @@ -54,6 +54,7 @@ export default class extends Controller { maxItems: 1, delimiter: "$$VERY_LONG_DELIMITER_THAT_SHOULD_NEVER_APPEAR$$", splitOn: null, + dropdownParent: 'body', searchField: [ {field: "text", weight : 2}, diff --git a/assets/controllers/elements/tagsinput_controller.js b/assets/controllers/elements/tagsinput_controller.js index 1f10c457..53bf7608 100644 --- a/assets/controllers/elements/tagsinput_controller.js +++ b/assets/controllers/elements/tagsinput_controller.js @@ -43,6 +43,7 @@ export default class extends Controller { selectOnTab: true, createOnBlur: true, create: true, + dropdownParent: 'body', }; if(this.element.dataset.autocomplete) { @@ -73,4 +74,4 @@ export default class extends Controller { //Destroy the TomSelect instance this._tomSelect.destroy(); } -} \ No newline at end of file +} diff --git a/assets/css/app/images.css b/assets/css/app/images.css index 214776e7..0212a85b 100644 --- a/assets/css/app/images.css +++ b/assets/css/app/images.css @@ -18,8 +18,8 @@ */ .hoverpic { - min-width: 10px; - max-width: 30px; + min-width: var(--table-image-preview-min-size, 20px); + max-width: var(--table-image-preview-max-size, 35px); display: block; margin-left: auto; margin-right: auto; @@ -49,7 +49,7 @@ } .part-table-image { - max-height: 40px; + max-height: calc(1.2*var(--table-image-preview-max-size, 35px)); /** Aspect ratio of maximum 1.2 */ object-fit: contain; } diff --git a/assets/css/app/tables.css b/assets/css/app/tables.css index ae892f50..8d4b200c 100644 --- a/assets/css/app/tables.css +++ b/assets/css/app/tables.css @@ -17,6 +17,16 @@ * along with this program. If not, see . */ +/**************************************** + * Action bar + ****************************************/ + +.sticky-select-bar { + position: sticky; + top: 120px; + z-index: 1000; /* Ensure the bar is above other content */ +} + /**************************************** * Tables ****************************************/ @@ -109,4 +119,4 @@ Classes for Datatables export #export-messageTop, .export-helper{ display: none; -} \ No newline at end of file +} diff --git a/assets/css/components/ckeditor.css b/assets/css/components/ckeditor.css index d6b3def4..5f093bf2 100644 --- a/assets/css/components/ckeditor.css +++ b/assets/css/components/ckeditor.css @@ -71,6 +71,8 @@ --ck-color-button-on-hover-background: var(--bs-secondary-bg); --ck-color-button-on-active-background: var(--bs-secondary-bg); --ck-color-button-on-disabled-background: var(--bs-secondary-bg); - --ck-color-button-on-color: var(--bs-primary) + --ck-color-button-on-color: var(--bs-primary); -} \ No newline at end of file + --ck-content-font-color: var(--ck-color-base-text); + +} diff --git a/composer.json b/composer.json index 8e3d1194..80b413f8 100644 --- a/composer.json +++ b/composer.json @@ -25,8 +25,7 @@ "doctrine/doctrine-migrations-bundle": "^3.0", "doctrine/orm": "^3.2.0", "dompdf/dompdf": "^v3.0.0", - "florianv/swap": "^4.0", - "florianv/swap-bundle": "dev-master", + "part-db/swap-bundle": "^6.0.0", "gregwar/captcha-bundle": "^2.1.0", "hshn/base64-encoded-file": "^5.0", "jbtronics/2fa-webauthn": "^3.0.0", diff --git a/composer.lock b/composer.lock index 6b9888d7..1f67b80f 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "09b78f345ea8115b5b29ea3e67dcb579", + "content-hash": "fe6dfc229f551945cfa6be8ca26a437e", "packages": [ { "name": "amphp/amp", @@ -968,7 +968,7 @@ }, { "name": "api-platform/doctrine-common", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-common.git", @@ -1050,13 +1050,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-common/tree/v4.1.22" + "source": "https://github.com/api-platform/doctrine-common/tree/v4.1.23" }, "time": "2025-08-18T13:30:43+00:00" }, { "name": "api-platform/doctrine-orm", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/doctrine-orm.git", @@ -1135,13 +1135,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/doctrine-orm/tree/v4.1.22" + "source": "https://github.com/api-platform/doctrine-orm/tree/v4.1.23" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/documentation", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/documentation.git", @@ -1203,7 +1203,7 @@ }, { "name": "api-platform/http-cache", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/http-cache.git", @@ -1275,13 +1275,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/http-cache/tree/v4.1.22" + "source": "https://github.com/api-platform/http-cache/tree/v4.1.23" }, "time": "2025-06-06T14:56:47+00:00" }, { "name": "api-platform/hydra", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/hydra.git", @@ -1360,13 +1360,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/hydra/tree/v4.1.22" + "source": "https://github.com/api-platform/hydra/tree/v4.1.23" }, "time": "2025-07-15T14:10:59+00:00" }, { "name": "api-platform/json-api", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/json-api.git", @@ -1439,13 +1439,13 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/json-api/tree/v4.1.22" + "source": "https://github.com/api-platform/json-api/tree/v4.1.23" }, "time": "2025-08-06T07:56:58+00:00" }, { "name": "api-platform/json-schema", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/json-schema.git", @@ -1518,13 +1518,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/json-schema/tree/v4.1.22" + "source": "https://github.com/api-platform/json-schema/tree/v4.1.23" }, "time": "2025-06-29T12:24:14+00:00" }, { "name": "api-platform/jsonld", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/jsonld.git", @@ -1596,22 +1596,22 @@ "rest" ], "support": { - "source": "https://github.com/api-platform/jsonld/tree/v4.1.22" + "source": "https://github.com/api-platform/jsonld/tree/v4.1.23" }, "time": "2025-07-25T10:05:30+00:00" }, { "name": "api-platform/metadata", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/metadata.git", - "reference": "782477dd28cc675909597bfa47af7c1f85659ffa" + "reference": "58b25f9a82c12727afab09b5a311828aacff8e88" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/metadata/zipball/782477dd28cc675909597bfa47af7c1f85659ffa", - "reference": "782477dd28cc675909597bfa47af7c1f85659ffa", + "url": "https://api.github.com/repos/api-platform/metadata/zipball/58b25f9a82c12727afab09b5a311828aacff8e88", + "reference": "58b25f9a82c12727afab09b5a311828aacff8e88", "shasum": "" }, "require": { @@ -1693,13 +1693,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/metadata/tree/v4.1.22" + "source": "https://github.com/api-platform/metadata/tree/v4.1.23" }, - "time": "2025-08-29T15:13:26+00:00" + "time": "2025-09-05T09:06:52+00:00" }, { "name": "api-platform/openapi", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/openapi.git", @@ -1780,13 +1780,13 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/openapi/tree/v4.1.22" + "source": "https://github.com/api-platform/openapi/tree/v4.1.23" }, "time": "2025-07-29T08:53:27+00:00" }, { "name": "api-platform/serializer", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/serializer.git", @@ -1871,13 +1871,13 @@ "serializer" ], "support": { - "source": "https://github.com/api-platform/serializer/tree/v4.1.22" + "source": "https://github.com/api-platform/serializer/tree/v4.1.23" }, "time": "2025-08-29T15:13:26+00:00" }, { "name": "api-platform/state", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/state.git", @@ -1963,22 +1963,22 @@ "swagger" ], "support": { - "source": "https://github.com/api-platform/state/tree/v4.1.22" + "source": "https://github.com/api-platform/state/tree/v4.1.23" }, "time": "2025-07-16T14:01:52+00:00" }, { "name": "api-platform/symfony", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/symfony.git", - "reference": "735b9a80f3b7a5f528b663cd28489fbe52f52416" + "reference": "e35839489b4e76ffc5fc2b0cbadbbaece75b9ad1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/api-platform/symfony/zipball/735b9a80f3b7a5f528b663cd28489fbe52f52416", - "reference": "735b9a80f3b7a5f528b663cd28489fbe52f52416", + "url": "https://api.github.com/repos/api-platform/symfony/zipball/e35839489b4e76ffc5fc2b0cbadbbaece75b9ad1", + "reference": "e35839489b4e76ffc5fc2b0cbadbbaece75b9ad1", "shasum": "" }, "require": { @@ -2087,13 +2087,13 @@ "symfony" ], "support": { - "source": "https://github.com/api-platform/symfony/tree/v4.1.22" + "source": "https://github.com/api-platform/symfony/tree/v4.1.23" }, - "time": "2025-07-16T14:01:52+00:00" + "time": "2025-09-05T07:30:37+00:00" }, { "name": "api-platform/validator", - "version": "v4.1.22", + "version": "v4.1.23", "source": { "type": "git", "url": "https://github.com/api-platform/validator.git", @@ -2162,7 +2162,7 @@ "validator" ], "support": { - "source": "https://github.com/api-platform/validator/tree/v4.1.22" + "source": "https://github.com/api-platform/validator/tree/v4.1.23" }, "time": "2025-07-16T14:01:52+00:00" }, @@ -2881,16 +2881,16 @@ }, { "name": "doctrine/dbal", - "version": "4.3.2", + "version": "4.3.3", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "7669f131d43b880de168b2d2df9687d152d6c762" + "reference": "231959669bb2173194c95636eae7f1b41b2a8b19" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/7669f131d43b880de168b2d2df9687d152d6c762", - "reference": "7669f131d43b880de168b2d2df9687d152d6c762", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/231959669bb2173194c95636eae7f1b41b2a8b19", + "reference": "231959669bb2173194c95636eae7f1b41b2a8b19", "shasum": "" }, "require": { @@ -2900,10 +2900,10 @@ "psr/log": "^1|^2|^3" }, "require-dev": { - "doctrine/coding-standard": "13.0.0", + "doctrine/coding-standard": "13.0.1", "fig/log-test": "^1", "jetbrains/phpstorm-stubs": "2023.2", - "phpstan/phpstan": "2.1.17", + "phpstan/phpstan": "2.1.22", "phpstan/phpstan-phpunit": "2.0.6", "phpstan/phpstan-strict-rules": "^2", "phpunit/phpunit": "11.5.23", @@ -2967,7 +2967,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/4.3.2" + "source": "https://github.com/doctrine/dbal/tree/4.3.3" }, "funding": [ { @@ -2983,7 +2983,7 @@ "type": "tidelift" } ], - "time": "2025-08-05T13:30:38+00:00" + "time": "2025-09-04T23:52:42+00:00" }, { "name": "doctrine/deprecations", @@ -3035,16 +3035,16 @@ }, { "name": "doctrine/doctrine-bundle", - "version": "2.15.1", + "version": "2.16.1", "source": { "type": "git", "url": "https://github.com/doctrine/DoctrineBundle.git", - "reference": "5a305c5e776f9d3eb87f5b94d40d50aff439211d" + "reference": "152d5083f0cd205a278131dc4351a8c94d007fe1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/5a305c5e776f9d3eb87f5b94d40d50aff439211d", - "reference": "5a305c5e776f9d3eb87f5b94d40d50aff439211d", + "url": "https://api.github.com/repos/doctrine/DoctrineBundle/zipball/152d5083f0cd205a278131dc4351a8c94d007fe1", + "reference": "152d5083f0cd205a278131dc4351a8c94d007fe1", "shasum": "" }, "require": { @@ -3081,6 +3081,7 @@ "phpunit/phpunit": "^9.6.22", "psr/log": "^1.1.4 || ^2.0 || ^3.0", "symfony/doctrine-messenger": "^6.4 || ^7.0", + "symfony/expression-language": "^6.4 || ^7.0", "symfony/messenger": "^6.4 || ^7.0", "symfony/phpunit-bridge": "^7.2", "symfony/property-info": "^6.4 || ^7.0", @@ -3137,7 +3138,7 @@ ], "support": { "issues": "https://github.com/doctrine/DoctrineBundle/issues", - "source": "https://github.com/doctrine/DoctrineBundle/tree/2.15.1" + "source": "https://github.com/doctrine/DoctrineBundle/tree/2.16.1" }, "funding": [ { @@ -3153,7 +3154,7 @@ "type": "tidelift" } ], - "time": "2025-07-30T15:48:28+00:00" + "time": "2025-09-05T15:24:53+00:00" }, { "name": "doctrine/doctrine-migrations-bundle", @@ -4133,16 +4134,16 @@ }, { "name": "ergebnis/classy", - "version": "1.8.0", + "version": "1.9.0", "source": { "type": "git", "url": "https://github.com/ergebnis/classy.git", - "reference": "e5a695e44b083d4a4b4f2a40427301cd2916699d" + "reference": "05c3ac7d8d9d337c4cf1d5602a339f57cb2a27ef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/ergebnis/classy/zipball/e5a695e44b083d4a4b4f2a40427301cd2916699d", - "reference": "e5a695e44b083d4a4b4f2a40427301cd2916699d", + "url": "https://api.github.com/repos/ergebnis/classy/zipball/05c3ac7d8d9d337c4cf1d5602a339f57cb2a27ef", + "reference": "05c3ac7d8d9d337c4cf1d5602a339f57cb2a27ef", "shasum": "" }, "require": { @@ -4150,11 +4151,11 @@ "php": "~7.4.0 || ~8.0.0 || ~8.1.0 || ~8.2.0 || ~8.3.0 || ~8.4.0 || ~8.5.0" }, "require-dev": { - "ergebnis/composer-normalize": "^2.47.0", - "ergebnis/license": "^2.6.0", - "ergebnis/php-cs-fixer-config": "^6.51.0", - "ergebnis/phpstan-rules": "^2.10.5", - "ergebnis/phpunit-slow-test-detector": "^2.19.1", + "ergebnis/composer-normalize": "^2.48.1", + "ergebnis/license": "^2.7.0", + "ergebnis/php-cs-fixer-config": "^6.54.0", + "ergebnis/phpstan-rules": "^2.11.0", + "ergebnis/phpunit-slow-test-detector": "^2.20.0", "fakerphp/faker": "^1.24.1", "infection/infection": "~0.26.6", "phpstan/extension-installer": "^1.4.3", @@ -4163,7 +4164,7 @@ "phpstan/phpstan-phpunit": "^2.0.7", "phpstan/phpstan-strict-rules": "^2.0.6", "phpunit/phpunit": "^9.6.19", - "rector/rector": "^2.1.2" + "rector/rector": "^2.1.4" }, "type": "library", "autoload": { @@ -4196,208 +4197,7 @@ "issues": "https://github.com/ergebnis/classy/issues", "source": "https://github.com/ergebnis/classy" }, - "time": "2025-08-19T06:14:25+00:00" - }, - { - "name": "florianv/exchanger", - "version": "2.8.1", - "source": { - "type": "git", - "url": "https://github.com/florianv/exchanger.git", - "reference": "9214f51665fb907e7aa2397e21a90c456eb0c448" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/florianv/exchanger/zipball/9214f51665fb907e7aa2397e21a90c456eb0c448", - "reference": "9214f51665fb907e7aa2397e21a90c456eb0c448", - "shasum": "" - }, - "require": { - "ext-json": "*", - "ext-libxml": "*", - "ext-simplexml": "*", - "php": "^7.1.3 || ^8.0", - "php-http/client-implementation": "^1.0", - "php-http/discovery": "^1.6", - "php-http/httplug": "^1.0 || ^2.0", - "psr/http-factory": "^1.0.2", - "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" - }, - "require-dev": { - "nyholm/psr7": "^1.0", - "php-http/message": "^1.7", - "php-http/mock-client": "^1.0", - "phpunit/phpunit": "^7 || ^8 || ^9.4" - }, - "suggest": { - "php-http/guzzle6-adapter": "Required to use Guzzle for sending HTTP requests", - "php-http/message": "Required to use Guzzle for sending HTTP requests" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "2.x-dev" - } - }, - "autoload": { - "psr-4": { - "Exchanger\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florian Voutzinos", - "email": "florian@voutzinos.com", - "homepage": "https://voutzinos.com" - } - ], - "description": "Currency exchange rates framework for PHP", - "homepage": "https://github.com/florianv/exchanger", - "keywords": [ - "Rate", - "conversion", - "currency", - "exchange rates", - "money" - ], - "support": { - "issues": "https://github.com/florianv/exchanger/issues", - "source": "https://github.com/florianv/exchanger/tree/2.8.1" - }, - "time": "2023-11-03T17:11:52+00:00" - }, - { - "name": "florianv/swap", - "version": "4.3.0", - "source": { - "type": "git", - "url": "https://github.com/florianv/swap.git", - "reference": "88edd27fcb95bdc58bbbf9e4b00539a2843d97fd" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/florianv/swap/zipball/88edd27fcb95bdc58bbbf9e4b00539a2843d97fd", - "reference": "88edd27fcb95bdc58bbbf9e4b00539a2843d97fd", - "shasum": "" - }, - "require": { - "florianv/exchanger": "^2.0", - "php": "^7.1.3 || ^8.0" - }, - "require-dev": { - "nyholm/psr7": "^1.0", - "php-http/message": "^1.7", - "php-http/mock-client": "^1.0", - "phpunit/phpunit": "^7 || ^8 || ^9" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-master": "4.0-dev" - } - }, - "autoload": { - "psr-4": { - "Swap\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florian Voutzinos", - "email": "florian@voutzinos.com", - "homepage": "https://voutzinos.com" - } - ], - "description": "Exchange rates library for PHP", - "keywords": [ - "Rate", - "conversion", - "currency", - "exchange rates", - "money" - ], - "support": { - "issues": "https://github.com/florianv/swap/issues", - "source": "https://github.com/florianv/swap/tree/4.3.0" - }, - "time": "2020-12-28T10:14:12+00:00" - }, - { - "name": "florianv/swap-bundle", - "version": "dev-master", - "source": { - "type": "git", - "url": "https://github.com/florianv/symfony-swap.git", - "reference": "c8cd268ad6e2f636f10b91df9850e3941d7f5807" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/florianv/symfony-swap/zipball/c8cd268ad6e2f636f10b91df9850e3941d7f5807", - "reference": "c8cd268ad6e2f636f10b91df9850e3941d7f5807", - "shasum": "" - }, - "require": { - "florianv/swap": "^4.0", - "php": "^7.1.3|^8.0", - "symfony/framework-bundle": "~3.0|~4.0|~5.0|~6.0|~7.0" - }, - "require-dev": { - "nyholm/psr7": "^1.1", - "php-http/guzzle6-adapter": "^1.0", - "php-http/message": "^1.7", - "phpunit/phpunit": "~5.7|~6.0|~7.0|~8.0|~9.0", - "symfony/cache": "~3.0|~4.0|~5.0|~6.0|~7.0" - }, - "suggest": { - "symfony/cache": "For caching" - }, - "default-branch": true, - "type": "symfony-bundle", - "extra": { - "branch-alias": { - "dev-master": "5.0-dev" - } - }, - "autoload": { - "psr-4": { - "Florianv\\SwapBundle\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Florian Voutzinos", - "email": "florian@voutzinos.com", - "homepage": "http://florian.voutzinos.com" - } - ], - "description": "Integrates the Swap library with Symfony", - "homepage": "https://github.com/florianv/FlorianvSwapBundle", - "keywords": [ - "Rate", - "bundle", - "conversion", - "currency", - "exchange", - "money", - "symfony" - ], - "support": { - "issues": "https://github.com/florianv/symfony-swap/issues", - "source": "https://github.com/florianv/symfony-swap/tree/master" - }, - "time": "2024-07-09T13:51:01+00:00" + "time": "2025-09-04T10:17:22+00:00" }, { "name": "gregwar/captcha", @@ -6357,22 +6157,23 @@ }, { "name": "liip/imagine-bundle", - "version": "2.13.3", + "version": "2.14.0", "source": { "type": "git", "url": "https://github.com/liip/LiipImagineBundle.git", - "reference": "3faccde327f91368e51d05ecad49a9cd915abd81" + "reference": "f80dc13e9a454682b8c2255b3487829d2f8a7fe4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/liip/LiipImagineBundle/zipball/3faccde327f91368e51d05ecad49a9cd915abd81", - "reference": "3faccde327f91368e51d05ecad49a9cd915abd81", + "url": "https://api.github.com/repos/liip/LiipImagineBundle/zipball/f80dc13e9a454682b8c2255b3487829d2f8a7fe4", + "reference": "f80dc13e9a454682b8c2255b3487829d2f8a7fe4", "shasum": "" }, "require": { "ext-mbstring": "*", "imagine/imagine": "^1.3.2", "php": "^7.2|^8.0", + "symfony/deprecation-contracts": "^2.5 || ^3", "symfony/filesystem": "^3.4|^4.4|^5.3|^6.0|^7.0", "symfony/finder": "^3.4|^4.4|^5.3|^6.0|^7.0", "symfony/framework-bundle": "^3.4.23|^4.4|^5.3|^6.0|^7.0", @@ -6457,9 +6258,9 @@ ], "support": { "issues": "https://github.com/liip/LiipImagineBundle/issues", - "source": "https://github.com/liip/LiipImagineBundle/tree/2.13.3" + "source": "https://github.com/liip/LiipImagineBundle/tree/2.14.0" }, - "time": "2024-12-12T09:38:23+00:00" + "time": "2025-09-03T06:33:10+00:00" }, { "name": "lorenzo/pinky", @@ -7634,17 +7435,94 @@ "time": "2024-04-22T22:05:04+00:00" }, { - "name": "part-db/label-fonts", - "version": "v1.1.0", + "name": "part-db/exchanger", + "version": "v3.1.0", "source": { "type": "git", - "url": "https://github.com/Part-DB/label-fonts.git", - "reference": "77c84b70ed3bb005df15f30ff835ddec490394b9" + "url": "https://github.com/Part-DB/exchanger.git", + "reference": "a43fe79a082e331ec2b24f3579e4fba153743757" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Part-DB/label-fonts/zipball/77c84b70ed3bb005df15f30ff835ddec490394b9", - "reference": "77c84b70ed3bb005df15f30ff835ddec490394b9", + "url": "https://api.github.com/repos/Part-DB/exchanger/zipball/a43fe79a082e331ec2b24f3579e4fba153743757", + "reference": "a43fe79a082e331ec2b24f3579e4fba153743757", + "shasum": "" + }, + "require": { + "ext-json": "*", + "ext-libxml": "*", + "ext-simplexml": "*", + "php": "^7.1.3 || ^8.0", + "php-http/client-implementation": "^1.0", + "php-http/discovery": "^1.6", + "php-http/httplug": "^1.0 || ^2.0", + "psr/http-factory": "^1.0.2", + "psr/simple-cache": "^1.0 || ^2.0 || ^3.0" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "php-http/message": "^1.7", + "php-http/message-factory": "^1.1", + "php-http/mock-client": "^1.0", + "phpunit/phpunit": "^7 || ^8 || ^9.4 || ^10.5", + "symfony/http-client": "^5.4 || ^6.4 || ^7.0" + }, + "suggest": { + "php-http/guzzle6-adapter": "Required to use Guzzle for sending HTTP requests", + "php-http/message": "Required to use Guzzle for sending HTTP requests" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "Exchanger\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florian Voutzinos", + "email": "florian@voutzinos.com", + "homepage": "https://voutzinos.com" + }, + { + "name": "Jan Böhmer", + "email": "mail@jan-boehmer.de" + } + ], + "description": "Fork of florianv/exchanger, a library to convert currencies using different exchange rate providers. Modernized to be compatible with Part-DB.", + "homepage": "https://github.com/Part-DB/exchanger", + "keywords": [ + "Rate", + "conversion", + "currency", + "exchange rates", + "money" + ], + "support": { + "source": "https://github.com/Part-DB/exchanger/tree/v3.1.0" + }, + "time": "2025-09-05T19:48:23+00:00" + }, + { + "name": "part-db/label-fonts", + "version": "v1.2.0", + "source": { + "type": "git", + "url": "https://github.com/Part-DB/label-fonts.git", + "reference": "c85aeb051d6492961a2c59bc291979f15ce60e88" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Part-DB/label-fonts/zipball/c85aeb051d6492961a2c59bc291979f15ce60e88", + "reference": "c85aeb051d6492961a2c59bc291979f15ce60e88", "shasum": "" }, "type": "library", @@ -7667,9 +7545,152 @@ ], "support": { "issues": "https://github.com/Part-DB/label-fonts/issues", - "source": "https://github.com/Part-DB/label-fonts/tree/v1.1.0" + "source": "https://github.com/Part-DB/label-fonts/tree/v1.2.0" }, - "time": "2024-02-08T21:44:38+00:00" + "time": "2025-09-07T15:42:51+00:00" + }, + { + "name": "part-db/swap", + "version": "v5.0.0", + "source": { + "type": "git", + "url": "https://github.com/Part-DB/swap.git", + "reference": "4fa57dec2eb1cbe0f6b8c92a2c250ecbe80688fe" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Part-DB/swap/zipball/4fa57dec2eb1cbe0f6b8c92a2c250ecbe80688fe", + "reference": "4fa57dec2eb1cbe0f6b8c92a2c250ecbe80688fe", + "shasum": "" + }, + "require": { + "part-db/exchanger": "^3.0", + "php": "^7.1.3 || ^8.0", + "php-http/message-factory": "^1.1" + }, + "require-dev": { + "nyholm/psr7": "^1.0", + "php-http/discovery": "^1.0", + "php-http/message": "^1.7", + "php-http/mock-client": "^1.0", + "phpunit/phpunit": "^7 || ^8 || ^9", + "symfony/http-client": "^5.4||^6.0||^7.0" + }, + "suggest": { + "php-http/discovery": "If you are not using `useHttpClient` but instead want to auto-discover HttpClient" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "4.0-dev" + } + }, + "autoload": { + "psr-4": { + "Swap\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florian Voutzinos", + "email": "florian@voutzinos.com", + "homepage": "https://voutzinos.com" + }, + { + "name": "Jan Böhmer", + "email": "mail@jan-boehmer.de" + } + ], + "description": "Fork of florianv/swap modernized for use in Part-DB. Exchange rates library for PHP", + "keywords": [ + "Rate", + "conversion", + "currency", + "exchange rates", + "money" + ], + "support": { + "source": "https://github.com/Part-DB/swap/tree/v5.0.0" + }, + "time": "2025-09-05T17:10:01+00:00" + }, + { + "name": "part-db/swap-bundle", + "version": "v6.1.0", + "source": { + "type": "git", + "url": "https://github.com/Part-DB/symfony-swap.git", + "reference": "fd78ebfbd762b1d76b4d71f713f39add63dec62b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/Part-DB/symfony-swap/zipball/fd78ebfbd762b1d76b4d71f713f39add63dec62b", + "reference": "fd78ebfbd762b1d76b4d71f713f39add63dec62b", + "shasum": "" + }, + "require": { + "part-db/exchanger": "^3.1.0", + "part-db/swap": "^5.0", + "php": "^7.1.3|^8.0", + "psr/http-client": "^1.0", + "symfony/framework-bundle": "~3.0|~4.0|~5.0|~6.0|~7.0" + }, + "require-dev": { + "nyholm/psr7": "^1.1", + "php-http/guzzle6-adapter": "^1.0", + "php-http/message": "^1.7", + "phpunit/phpunit": "~5.7|~6.0|~7.0|~8.0|~9.0", + "symfony/cache": "~3.0|~4.0|~5.0|~6.0|~7.0", + "symfony/http-client": "~7.0|~6.0|~5.0" + }, + "suggest": { + "symfony/cache": "For caching" + }, + "type": "symfony-bundle", + "extra": { + "branch-alias": { + "dev-master": "5.0-dev" + } + }, + "autoload": { + "psr-4": { + "Florianv\\SwapBundle\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Florian Voutzinos", + "email": "florian@voutzinos.com", + "homepage": "http://florian.voutzinos.com" + }, + { + "name": "Jan Böhmer", + "email": "mail@jan-boehmer.de" + } + ], + "description": "Fork of florianv/swap-bundle, modernized for use with Part-DB. Integrates the Swap library with Symfony", + "homepage": "https://github.com/florianv/FlorianvSwapBundle", + "keywords": [ + "Rate", + "bundle", + "conversion", + "currency", + "exchange", + "money", + "symfony" + ], + "support": { + "source": "https://github.com/Part-DB/symfony-swap/tree/v6.1.0" + }, + "time": "2025-09-05T19:52:56+00:00" }, { "name": "php-http/discovery", @@ -7807,6 +7828,61 @@ }, "time": "2024-09-23T11:39:58+00:00" }, + { + "name": "php-http/message-factory", + "version": "1.1.0", + "source": { + "type": "git", + "url": "https://github.com/php-http/message-factory.git", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-http/message-factory/zipball/4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "reference": "4d8778e1c7d405cbb471574821c1ff5b68cc8f57", + "shasum": "" + }, + "require": { + "php": ">=5.4", + "psr/http-message": "^1.0 || ^2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Http\\Message\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Márk Sági-Kazár", + "email": "mark.sagikazar@gmail.com" + } + ], + "description": "Factory interfaces for PSR-7 HTTP Message", + "homepage": "http://php-http.org", + "keywords": [ + "factory", + "http", + "message", + "stream", + "uri" + ], + "support": { + "issues": "https://github.com/php-http/message-factory/issues", + "source": "https://github.com/php-http/message-factory/tree/1.1.0" + }, + "abandoned": "psr/http-factory", + "time": "2023-04-14T14:16:17+00:00" + }, { "name": "php-http/promise", "version": "1.3.1", @@ -17807,16 +17883,16 @@ }, { "name": "phpstan/phpstan-doctrine", - "version": "2.0.4", + "version": "2.0.5", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-doctrine.git", - "reference": "6271e66ce37545bd2edcddbe6bcbdd3b665ab7b8" + "reference": "eeff19808f8ae3a6f7c4e43e388a2848eb2b0865" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/6271e66ce37545bd2edcddbe6bcbdd3b665ab7b8", - "reference": "6271e66ce37545bd2edcddbe6bcbdd3b665ab7b8", + "url": "https://api.github.com/repos/phpstan/phpstan-doctrine/zipball/eeff19808f8ae3a6f7c4e43e388a2848eb2b0865", + "reference": "eeff19808f8ae3a6f7c4e43e388a2848eb2b0865", "shasum": "" }, "require": { @@ -17873,9 +17949,9 @@ "description": "Doctrine extensions for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-doctrine/issues", - "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.4" + "source": "https://github.com/phpstan/phpstan-doctrine/tree/2.0.5" }, - "time": "2025-07-17T11:57:55+00:00" + "time": "2025-09-07T11:52:30+00:00" }, { "name": "phpstan/phpstan-strict-rules", @@ -17927,16 +18003,16 @@ }, { "name": "phpstan/phpstan-symfony", - "version": "2.0.7", + "version": "2.0.8", "source": { "type": "git", "url": "https://github.com/phpstan/phpstan-symfony.git", - "reference": "392f7ab8f52a0a776977be4e62535358c28e1b15" + "reference": "8820c22d785c235f69bb48da3d41e688bc8a1796" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/392f7ab8f52a0a776977be4e62535358c28e1b15", - "reference": "392f7ab8f52a0a776977be4e62535358c28e1b15", + "url": "https://api.github.com/repos/phpstan/phpstan-symfony/zipball/8820c22d785c235f69bb48da3d41e688bc8a1796", + "reference": "8820c22d785c235f69bb48da3d41e688bc8a1796", "shasum": "" }, "require": { @@ -17992,9 +18068,9 @@ "description": "Symfony Framework extensions and rules for PHPStan", "support": { "issues": "https://github.com/phpstan/phpstan-symfony/issues", - "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.7" + "source": "https://github.com/phpstan/phpstan-symfony/tree/2.0.8" }, - "time": "2025-07-22T09:40:57+00:00" + "time": "2025-09-07T06:55:50+00:00" }, { "name": "phpunit/php-code-coverage", @@ -18333,16 +18409,16 @@ }, { "name": "phpunit/phpunit", - "version": "11.5.35", + "version": "11.5.36", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "d341ee94ee5007b286fc7907b383aae6b5b3cc91" + "reference": "264a87c7ef68b1ab9af7172357740dc266df5957" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/d341ee94ee5007b286fc7907b383aae6b5b3cc91", - "reference": "d341ee94ee5007b286fc7907b383aae6b5b3cc91", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/264a87c7ef68b1ab9af7172357740dc266df5957", + "reference": "264a87c7ef68b1ab9af7172357740dc266df5957", "shasum": "" }, "require": { @@ -18414,7 +18490,7 @@ "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", "security": "https://github.com/sebastianbergmann/phpunit/security/policy", - "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.35" + "source": "https://github.com/sebastianbergmann/phpunit/tree/11.5.36" }, "funding": [ { @@ -18438,20 +18514,20 @@ "type": "tidelift" } ], - "time": "2025-08-28T05:13:54+00:00" + "time": "2025-09-03T06:24:17+00:00" }, { "name": "rector/rector", - "version": "2.1.4", + "version": "2.1.6", "source": { "type": "git", "url": "https://github.com/rectorphp/rector.git", - "reference": "fe613c528819222f8686a9a037a315ef9d4915b3" + "reference": "729aabc0ec66e700ef164e26454a1357f222a2f3" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/rectorphp/rector/zipball/fe613c528819222f8686a9a037a315ef9d4915b3", - "reference": "fe613c528819222f8686a9a037a315ef9d4915b3", + "url": "https://api.github.com/repos/rectorphp/rector/zipball/729aabc0ec66e700ef164e26454a1357f222a2f3", + "reference": "729aabc0ec66e700ef164e26454a1357f222a2f3", "shasum": "" }, "require": { @@ -18490,7 +18566,7 @@ ], "support": { "issues": "https://github.com/rectorphp/rector/issues", - "source": "https://github.com/rectorphp/rector/tree/2.1.4" + "source": "https://github.com/rectorphp/rector/tree/2.1.6" }, "funding": [ { @@ -18498,7 +18574,7 @@ "type": "github" } ], - "time": "2025-08-15T14:41:36+00:00" + "time": "2025-09-05T15:43:08+00:00" }, { "name": "roave/security-advisories", @@ -18506,12 +18582,12 @@ "source": { "type": "git", "url": "https://github.com/Roave/SecurityAdvisories.git", - "reference": "e7589e01dc8452bfecb4c8df977346cd3132650f" + "reference": "dc5c4ede5c331ae21fb68947ff89672df9b7cc7d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/e7589e01dc8452bfecb4c8df977346cd3132650f", - "reference": "e7589e01dc8452bfecb4c8df977346cd3132650f", + "url": "https://api.github.com/repos/Roave/SecurityAdvisories/zipball/dc5c4ede5c331ae21fb68947ff89672df9b7cc7d", + "reference": "dc5c4ede5c331ae21fb68947ff89672df9b7cc7d", "shasum": "" }, "conflict": { @@ -18935,7 +19011,7 @@ "marshmallow/nova-tiptap": "<5.7", "matomo/matomo": "<1.11", "matyhtf/framework": "<3.0.6", - "mautic/core": "<5.2.6|>=6.0.0.0-alpha,<6.0.2", + "mautic/core": "<5.2.8|>=6.0.0.0-alpha,<6.0.5", "mautic/core-lib": ">=1.0.0.0-beta,<4.4.13|>=5.0.0.0-alpha,<5.1.1", "maximebf/debugbar": "<1.19", "mdanter/ecc": "<2", @@ -19081,7 +19157,7 @@ "pixelfed/pixelfed": "<0.12.5", "plotly/plotly.js": "<2.25.2", "pocketmine/bedrock-protocol": "<8.0.2", - "pocketmine/pocketmine-mp": "<5.25.2", + "pocketmine/pocketmine-mp": "<5.32.1", "pocketmine/raklib": ">=0.14,<0.14.6|>=0.15,<0.15.1", "pressbooks/pressbooks": "<5.18", "prestashop/autoupgrade": ">=4,<4.10.1", @@ -19089,7 +19165,7 @@ "prestashop/blockwishlist": ">=2,<2.1.1", "prestashop/contactform": ">=1.0.1,<4.3", "prestashop/gamification": "<2.3.2", - "prestashop/prestashop": "<8.1.6", + "prestashop/prestashop": "<8.2.3", "prestashop/productcomments": "<5.0.2", "prestashop/ps_contactinfo": "<=3.3.2", "prestashop/ps_emailsubscription": "<2.6.1", @@ -19463,7 +19539,7 @@ "type": "tidelift" } ], - "time": "2025-08-29T15:04:47+00:00" + "time": "2025-09-04T20:05:35+00:00" }, { "name": "sebastian/cli-parser", @@ -20959,7 +21035,6 @@ "aliases": [], "minimum-stability": "stable", "stability-flags": { - "florianv/swap-bundle": 20, "roave/security-advisories": 20 }, "prefer-stable": false, diff --git a/config/packages/nelmio_security.yaml b/config/packages/nelmio_security.yaml index 1cb74da7..c283cd8e 100644 --- a/config/packages/nelmio_security.yaml +++ b/config/packages/nelmio_security.yaml @@ -69,9 +69,3 @@ nelmio_security: - 'data:' block-all-mixed-content: true # defaults to false, blocks HTTP content over HTTPS transport # upgrade-insecure-requests: true # defaults to false, upgrades HTTP requests to HTTPS transport - -when@dev: - # disables the Content-Security-Policy header - nelmio_security: - csp: - enabled: false \ No newline at end of file diff --git a/config/packages/settings.yaml b/config/packages/settings.yaml index 05e21636..c16d1804 100644 --- a/config/packages/settings.yaml +++ b/config/packages/settings.yaml @@ -5,4 +5,11 @@ jbtronics_settings: default_cacheable: true orm_storage: - default_entity_class: App\Entity\SettingsEntry \ No newline at end of file + default_entity_class: App\Entity\SettingsEntry + + +# Disable caching for development environment +when@dev: + jbtronics_settings: + cache: + default_cacheable: false diff --git a/config/packages/swap.yaml b/config/packages/swap.yaml index beb41d26..4ef8fbdf 100644 --- a/config/packages/swap.yaml +++ b/config/packages/swap.yaml @@ -5,6 +5,12 @@ florianv_swap: providers: european_central_bank: ~ # European Central Bank (only works for EUR base currency) - fixer: # Fixer.io (needs an API key) - access_key: "%env(string:default:settings:exchange_rate:fixerApiKey:INVALID)%" - #exchange_rates_api: ~ \ No newline at end of file + central_bank_of_czech_republic: ~ + central_bank_of_republic_turkey: ~ + national_bank_of_romania: ~ + + fixer: # Fixer.io (needs an API key) + access_key: "%env(string:settings:exchange_rate:fixerApiKey)%" + + frankfurter: ~ + fawazahmed_currency_api: ~ diff --git a/config/permissions.yaml b/config/permissions.yaml index e5a1d65b..8cbd60c3 100644 --- a/config/permissions.yaml +++ b/config/permissions.yaml @@ -359,6 +359,10 @@ perms: # Here comes a list with all Permission names (they have a perm_[name] co label: "perm.revert_elements" alsoSet: ['read_profiles', 'edit_profiles', 'create_profiles', 'delete_profiles'] apiTokenRole: ROLE_API_EDIT + import: + label: "perm.import" + alsoSet: ['read_profiles', 'edit_profiles', 'create_profiles' ] + apiTokenRole: ROLE_API_EDIT api: label: "perm.api" diff --git a/docs/installation/installation_guide-debian.md b/docs/installation/installation_guide-debian.md index 312fe21e..b3c61126 100644 --- a/docs/installation/installation_guide-debian.md +++ b/docs/installation/installation_guide-debian.md @@ -28,9 +28,14 @@ It is recommended to install Part-DB on a 64-bit system, as the 32-bit version o For the installation of Part-DB, we need some prerequisites. They can be installed by running the following command: ```bash -sudo apt install git curl zip ca-certificates software-properties-common apt-transport-https lsb-release nano wget +sudo apt update && apt upgrade +sudo apt install git curl zip ca-certificates software-properties-common \ + apt-transport-https lsb-release nano wget sqlite3 ``` +Please run `sqlite3 --version` to assert that the SQLite version is 3.35 or higher. +Otherwise some database migrations will not succeed. + ### Install PHP and apache2 Part-DB is written in [PHP](https://php.net) and therefore needs a PHP interpreter to run. Part-DB needs PHP 8.2 or diff --git a/docs/usage/bom_import.md b/docs/usage/bom_import.md index 94a06d55..b4bcb2be 100644 --- a/docs/usage/bom_import.md +++ b/docs/usage/bom_import.md @@ -34,3 +34,12 @@ select the BOM file you want to import and some options for the import process: has a different format and does not work with this type. You can generate this BOM file by going to "File" -> "Fabrication Outputs" -> "Bill of Materials" in Pcbnew and save the file to your desired location. +* **KiCAD Schematic BOM (CSV file)**: A CSV file of the Bill of Material (BOM) generated + by [KiCAD Eeschema](https://www.kicad.org/). + You can generate this BOM file by going to "Tools" -> "Generate Bill of Materials" in Eeschema and save the file to your + desired location. In the next step you can customize the mapping of the fields in Part-DB, if you have any special fields + in your BOM to locate your fields correctly. +* **Generic CSV file**: A generic CSV file. You can use this option if you use some different ECAD software or wanna create + your own CSV file. You will need to specify at least the designators, quantity and value fields in the CSV. In the next + step you can customize the mapping of the fields in Part-DB, if you have any special fields in your BOM to locate your + parts correctly. diff --git a/makefile b/makefile new file mode 100644 index 00000000..9041ba0f --- /dev/null +++ b/makefile @@ -0,0 +1,112 @@ +# PartDB Makefile for Test Environment Management + +.PHONY: help test-setup test-clean test-db-create test-db-migrate test-cache-clear test-fixtures test-run dev-setup dev-clean dev-db-create dev-db-migrate dev-cache-clear dev-warmup dev-reset deps-install + +# Default target +help: + @echo "PartDB Test Environment Management" + @echo "==================================" + @echo "" + @echo "Available targets:" + @echo " deps-install - Install PHP dependencies with unlimited memory" + @echo "" + @echo "Development Environment:" + @echo " dev-setup - Complete development environment setup (clean, create DB, migrate, warmup)" + @echo " dev-clean - Clean development cache and database files" + @echo " dev-db-create - Create development database (if not exists)" + @echo " dev-db-migrate - Run database migrations for development environment" + @echo " dev-cache-clear - Clear development cache" + @echo " dev-warmup - Warm up development cache" + @echo " dev-reset - Quick development reset (clean + migrate)" + @echo "" + @echo "Test Environment:" + @echo " test-setup - Complete test environment setup (clean, create DB, migrate, load fixtures)" + @echo " test-clean - Clean test cache and database files" + @echo " test-db-create - Create test database (if not exists)" + @echo " test-db-migrate - Run database migrations for test environment" + @echo " test-cache-clear- Clear test cache" + @echo " test-fixtures - Load test fixtures" + @echo " test-run - Run PHPUnit tests" + @echo "" + @echo " help - Show this help message" + +# Install PHP dependencies with unlimited memory +deps-install: + @echo "📦 Installing PHP dependencies..." + COMPOSER_MEMORY_LIMIT=-1 composer install + @echo "✅ Dependencies installed" + +# Complete test environment setup +test-setup: deps-install test-clean test-db-create test-db-migrate test-fixtures + @echo "✅ Test environment setup complete!" + +# Clean test environment +test-clean: + @echo "🧹 Cleaning test environment..." + rm -rf var/cache/test + rm -f var/app_test.db + @echo "✅ Test environment cleaned" + +# Create test database +test-db-create: + @echo "🗄️ Creating test database..." + -php bin/console doctrine:database:create --if-not-exists --env test || echo "⚠️ Database creation failed (expected for SQLite) - continuing..." + +# Run database migrations for test environment +test-db-migrate: + @echo "🔄 Running database migrations..." + php -d memory_limit=1G bin/console doctrine:migrations:migrate -n --env test + +# Clear test cache +test-cache-clear: + @echo "🗑️ Clearing test cache..." + rm -rf var/cache/test + @echo "✅ Test cache cleared" + +# Load test fixtures +test-fixtures: + @echo "📦 Loading test fixtures..." + php bin/console partdb:fixtures:load -n --env test + +# Run PHPUnit tests +test-run: + @echo "🧪 Running tests..." + php bin/phpunit + +test-typecheck: + @echo "🧪 Running type checks..." + COMPOSER_MEMORY_LIMIT=-1 composer phpstan + +# Quick test reset (clean + migrate + fixtures, skip DB creation) +test-reset: test-cache-clear test-db-migrate test-fixtures + @echo "✅ Test environment reset complete!" + +# Development helpers +dev-setup: deps-install dev-clean dev-db-create dev-db-migrate dev-warmup + @echo "✅ Development environment setup complete!" + +dev-clean: + @echo "🧹 Cleaning development environment..." + rm -rf var/cache/dev + rm -f var/app_dev.db + @echo "✅ Development environment cleaned" + +dev-db-create: + @echo "🗄️ Creating development database..." + -php bin/console doctrine:database:create --if-not-exists --env dev || echo "⚠️ Database creation failed (expected for SQLite) - continuing..." + +dev-db-migrate: + @echo "🔄 Running database migrations..." + php -d memory_limit=1G bin/console doctrine:migrations:migrate -n --env dev + +dev-cache-clear: + @echo "🗑️ Clearing development cache..." + php -d memory_limit=1G bin/console cache:clear --env dev -n + @echo "✅ Development cache cleared" + +dev-warmup: + @echo "🔥 Warming up development cache..." + php -d memory_limit=1G bin/console cache:warmup --env dev -n + +dev-reset: dev-cache-clear dev-db-migrate + @echo "✅ Development environment reset complete!" \ No newline at end of file diff --git a/src/Controller/AttachmentFileController.php b/src/Controller/AttachmentFileController.php index 7917e97f..81369e12 100644 --- a/src/Controller/AttachmentFileController.php +++ b/src/Controller/AttachmentFileController.php @@ -24,6 +24,7 @@ namespace App\Controller; use App\DataTables\AttachmentDataTable; use App\DataTables\Filters\AttachmentFilter; +use App\DataTables\PartsDataTable; use App\Entity\Attachments\Attachment; use App\Form\Filters\AttachmentFilterType; use App\Services\Attachments\AttachmentManager; @@ -112,7 +113,7 @@ class AttachmentFileController extends AbstractController $filterForm->handleRequest($formRequest); - $table = $dataTableFactory->createFromType(AttachmentDataTable::class, ['filter' => $filter], ['pageLength' => $tableSettings->fullDefaultPageSize]) + $table = $dataTableFactory->createFromType(AttachmentDataTable::class, ['filter' => $filter], ['pageLength' => $tableSettings->fullDefaultPageSize, 'lengthMenu' => PartsDataTable::LENGTH_MENU]) ->handleRequest($request); if ($table->isCallback()) { diff --git a/src/Controller/InfoProviderController.php b/src/Controller/InfoProviderController.php index a6e886e6..dae8213e 100644 --- a/src/Controller/InfoProviderController.php +++ b/src/Controller/InfoProviderController.php @@ -30,6 +30,7 @@ use App\Services\InfoProviderSystem\ExistingPartFinder; use App\Services\InfoProviderSystem\PartInfoRetriever; use App\Services\InfoProviderSystem\ProviderRegistry; use App\Settings\AppSettings; +use App\Settings\InfoProviderSystem\InfoProviderGeneralSettings; use Doctrine\ORM\EntityManagerInterface; use Jbtronics\SettingsBundle\Form\SettingsFormFactoryInterface; use Jbtronics\SettingsBundle\Manager\SettingsManagerInterface; @@ -113,7 +114,7 @@ class InfoProviderController extends AbstractController #[Route('/search', name: 'info_providers_search')] #[Route('/update/{target}', name: 'info_providers_update_part_search')] - public function search(Request $request, #[MapEntity(id: 'target')] ?Part $update_target, LoggerInterface $exceptionLogger): Response + public function search(Request $request, #[MapEntity(id: 'target')] ?Part $update_target, LoggerInterface $exceptionLogger, InfoProviderGeneralSettings $infoProviderSettings): Response { $this->denyAccessUnlessGranted('@info_providers.create_parts'); @@ -144,6 +145,23 @@ class InfoProviderController extends AbstractController } } + //If the providers form is still empty, use our default value from the settings + if (count($form->get('providers')->getData() ?? []) === 0) { + $default_providers = $infoProviderSettings->defaultSearchProviders; + $provider_objects = []; + foreach ($default_providers as $provider_key) { + try { + $tmp = $this->providerRegistry->getProviderByKey($provider_key); + if ($tmp->isActive()) { + $provider_objects[] = $tmp; + } + } catch (\InvalidArgumentException $e) { + //If the provider is not found, just ignore it + } + } + $form->get('providers')->setData($provider_objects); + } + if ($form->isSubmitted() && $form->isValid()) { $keyword = $form->get('keyword')->getData(); $providers = $form->get('providers')->getData(); diff --git a/src/Controller/LabelController.php b/src/Controller/LabelController.php index 4950628b..90a6715b 100644 --- a/src/Controller/LabelController.php +++ b/src/Controller/LabelController.php @@ -58,12 +58,15 @@ use Symfony\Component\Form\FormError; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Validator\Validator\ValidatorInterface; use Symfony\Contracts\Translation\TranslatorInterface; #[Route(path: '/label')] class LabelController extends AbstractController { - public function __construct(protected LabelGenerator $labelGenerator, protected EntityManagerInterface $em, protected ElementTypeNameGenerator $elementTypeNameGenerator, protected RangeParser $rangeParser, protected TranslatorInterface $translator) + public function __construct(protected LabelGenerator $labelGenerator, protected EntityManagerInterface $em, protected ElementTypeNameGenerator $elementTypeNameGenerator, protected RangeParser $rangeParser, protected TranslatorInterface $translator, + private readonly ValidatorInterface $validator + ) { } @@ -85,6 +88,7 @@ class LabelController extends AbstractController $form = $this->createForm(LabelDialogType::class, null, [ 'disable_options' => $disable_options, + 'profile' => $profile ]); //Try to parse given target_type and target_id @@ -120,13 +124,50 @@ class LabelController extends AbstractController goto render; } - $profile = new LabelProfile(); - $profile->setName($form->get('save_profile_name')->getData()); - $profile->setOptions($form_options); - $this->em->persist($profile); + $new_profile = new LabelProfile(); + $new_profile->setName($form->get('save_profile_name')->getData()); + $new_profile->setOptions($form_options); + + //Validate the profile name + $errors = $this->validator->validate($new_profile); + if (count($errors) > 0) { + foreach ($errors as $error) { + $form->get('save_profile_name')->addError(new FormError($error->getMessage())); + } + goto render; + } + + $this->em->persist($new_profile); $this->em->flush(); $this->addFlash('success', 'label_generator.profile_saved'); + return $this->redirectToRoute('label_dialog_profile', [ + 'profile' => $new_profile->getID(), + 'target_id' => (string) $form->get('target_id')->getData() + ]); + } + + //Check if the current profile should be updated + if ($form->has('update_profile') + && $form->get('update_profile')->isClicked() //@phpstan-ignore-line Phpstan does not recognize the isClicked method + && $profile instanceof LabelProfile + && $this->isGranted('edit', $profile)) { + //Update the profile options + $profile->setOptions($form_options); + + //Validate the profile name + $errors = $this->validator->validate($profile); + if (count($errors) > 0) { + foreach ($errors as $error) { + $this->addFlash('error', $error->getMessage()); + } + goto render; + } + + $this->em->persist($profile); + $this->em->flush(); + $this->addFlash('success', 'label_generator.profile_updated'); + return $this->redirectToRoute('label_dialog_profile', [ 'profile' => $profile->getID(), 'target_id' => (string) $form->get('target_id')->getData() diff --git a/src/Controller/PartController.php b/src/Controller/PartController.php index b11a5c90..6708ed4c 100644 --- a/src/Controller/PartController.php +++ b/src/Controller/PartController.php @@ -46,6 +46,7 @@ use App\Services\Parameters\ParameterExtractor; use App\Services\Parts\PartLotWithdrawAddHelper; use App\Services\Parts\PricedetailHelper; use App\Services\ProjectSystem\ProjectBuildPartHelper; +use App\Settings\BehaviorSettings\PartInfoSettings; use DateTime; use Doctrine\ORM\EntityManagerInterface; use Exception; @@ -69,7 +70,7 @@ class PartController extends AbstractController protected PartPreviewGenerator $partPreviewGenerator, private readonly TranslatorInterface $translator, private readonly AttachmentSubmitHandler $attachmentSubmitHandler, private readonly EntityManagerInterface $em, - protected EventCommentHelper $commentHelper) + protected EventCommentHelper $commentHelper, private readonly PartInfoSettings $partInfoSettings) { } @@ -119,8 +120,8 @@ class PartController extends AbstractController 'pricedetail_helper' => $this->pricedetailHelper, 'pictures' => $this->partPreviewGenerator->getPreviewAttachments($part), 'timeTravel' => $timeTravel_timestamp, - 'description_params' => $parameterExtractor->extractParameters($part->getDescription()), - 'comment_params' => $parameterExtractor->extractParameters($part->getComment()), + 'description_params' => $this->partInfoSettings->extractParamsFromDescription ? $parameterExtractor->extractParameters($part->getDescription()) : [], + 'comment_params' => $this->partInfoSettings->extractParamsFromNotes ? $parameterExtractor->extractParameters($part->getComment()) : [], 'withdraw_add_helper' => $withdrawAddHelper, ] ); diff --git a/src/Controller/PartListsController.php b/src/Controller/PartListsController.php index f6836ddc..b2df18c1 100644 --- a/src/Controller/PartListsController.php +++ b/src/Controller/PartListsController.php @@ -161,7 +161,9 @@ class PartListsController extends AbstractController $filterForm->handleRequest($formRequest); - $table = $this->dataTableFactory->createFromType(PartsDataTable::class, array_merge(['filter' => $filter], $additional_table_vars), ['pageLength' => $this->tableSettings->fullDefaultPageSize]) + $table = $this->dataTableFactory->createFromType(PartsDataTable::class, array_merge( + ['filter' => $filter], $additional_table_vars), + ['pageLength' => $this->tableSettings->fullDefaultPageSize, 'lengthMenu' => PartsDataTable::LENGTH_MENU]) ->handleRequest($request); if ($table->isCallback()) { diff --git a/src/Controller/ProjectController.php b/src/Controller/ProjectController.php index a64c1851..2a6d19ee 100644 --- a/src/Controller/ProjectController.php +++ b/src/Controller/ProjectController.php @@ -36,6 +36,7 @@ use Doctrine\Common\Collections\ArrayCollection; use Doctrine\ORM\EntityManagerInterface; use League\Csv\SyntaxError; use Omines\DataTablesBundle\DataTableFactory; +use Psr\Log\LoggerInterface; use Symfony\Bundle\FrameworkBundle\Controller\AbstractController; use Symfony\Component\Form\Extension\Core\Type\CheckboxType; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; @@ -102,9 +103,14 @@ class ProjectController extends AbstractController $this->addFlash('success', 'project.build.flash.success'); return $this->redirect( - $request->get('_redirect', - $this->generateUrl('project_info', ['id' => $project->getID()] - ))); + $request->get( + '_redirect', + $this->generateUrl( + 'project_info', + ['id' => $project->getID()] + ) + ) + ); } $this->addFlash('error', 'project.build.flash.invalid_input'); @@ -120,9 +126,13 @@ class ProjectController extends AbstractController } #[Route(path: '/{id}/import_bom', name: 'project_import_bom', requirements: ['id' => '\d+'])] - public function importBOM(Request $request, EntityManagerInterface $entityManager, Project $project, - BOMImporter $BOMImporter, ValidatorInterface $validator): Response - { + public function importBOM( + Request $request, + EntityManagerInterface $entityManager, + Project $project, + BOMImporter $BOMImporter, + ValidatorInterface $validator + ): Response { $this->denyAccessUnlessGranted('edit', $project); $builder = $this->createFormBuilder(); @@ -138,6 +148,8 @@ class ProjectController extends AbstractController 'required' => true, 'choices' => [ 'project.bom_import.type.kicad_pcbnew' => 'kicad_pcbnew', + 'project.bom_import.type.kicad_schematic' => 'kicad_schematic', + 'project.bom_import.type.generic_csv' => 'generic_csv', ] ]); $builder->add('clear_existing_bom', CheckboxType::class, [ @@ -161,25 +173,40 @@ class ProjectController extends AbstractController $entityManager->flush(); } + $import_type = $form->get('type')->getData(); + try { + // For schematic imports, redirect to field mapping step + if (in_array($import_type, ['kicad_schematic', 'generic_csv'], true)) { + // Store file content and options in session for field mapping step + $file_content = $form->get('file')->getData()->getContent(); + $clear_existing = $form->get('clear_existing_bom')->getData(); + + $request->getSession()->set('bom_import_data', $file_content); + $request->getSession()->set('bom_import_clear', $clear_existing); + + return $this->redirectToRoute('project_import_bom_map_fields', ['id' => $project->getID()]); + } + + // For PCB imports, proceed directly $entries = $BOMImporter->importFileIntoProject($form->get('file')->getData(), $project, [ - 'type' => $form->get('type')->getData(), + 'type' => $import_type, ]); - //Validate the project entries + // Validate the project entries $errors = $validator->validateProperty($project, 'bom_entries'); - //If no validation errors occured, save the changes and redirect to edit page - if (count ($errors) === 0) { + // If no validation errors occurred, save the changes and redirect to edit page + if (count($errors) === 0) { $this->addFlash('success', t('project.bom_import.flash.success', ['%count%' => count($entries)])); $entityManager->flush(); return $this->redirectToRoute('project_edit', ['id' => $project->getID()]); } - //When we get here, there were validation errors + // When we get here, there were validation errors $this->addFlash('error', t('project.bom_import.flash.invalid_entries')); - } catch (\UnexpectedValueException|SyntaxError $e) { + } catch (\UnexpectedValueException | SyntaxError $e) { $this->addFlash('error', t('project.bom_import.flash.invalid_file', ['%message%' => $e->getMessage()])); } } @@ -191,11 +218,267 @@ class ProjectController extends AbstractController ]); } + #[Route(path: '/{id}/import_bom/map_fields', name: 'project_import_bom_map_fields', requirements: ['id' => '\d+'])] + public function importBOMMapFields( + Request $request, + EntityManagerInterface $entityManager, + Project $project, + BOMImporter $BOMImporter, + ValidatorInterface $validator, + LoggerInterface $logger + ): Response { + $this->denyAccessUnlessGranted('edit', $project); + + // Get stored data from session + $file_content = $request->getSession()->get('bom_import_data'); + $clear_existing = $request->getSession()->get('bom_import_clear', false); + + + if (!$file_content) { + $this->addFlash('error', 'project.bom_import.flash.session_expired'); + return $this->redirectToRoute('project_import_bom', ['id' => $project->getID()]); + } + + // Detect fields and get suggestions + $detected_fields = $BOMImporter->detectFields($file_content); + $suggested_mapping = $BOMImporter->getSuggestedFieldMapping($detected_fields); + + // Create mapping of original field names to sanitized field names for template + $field_name_mapping = []; + foreach ($detected_fields as $field) { + $sanitized_field = preg_replace('/[^a-zA-Z0-9_-]/', '_', $field); + $field_name_mapping[$field] = $sanitized_field; + } + + // Create form for field mapping + $builder = $this->createFormBuilder(); + + // Add delimiter selection + $builder->add('delimiter', ChoiceType::class, [ + 'label' => 'project.bom_import.delimiter', + 'required' => true, + 'data' => ',', + 'choices' => [ + 'project.bom_import.delimiter.comma' => ',', + 'project.bom_import.delimiter.semicolon' => ';', + 'project.bom_import.delimiter.tab' => "\t", + ] + ]); + + // Get dynamic field mapping targets from BOMImporter + $available_targets = $BOMImporter->getAvailableFieldTargets(); + $target_fields = ['project.bom_import.field_mapping.ignore' => '']; + + foreach ($available_targets as $target_key => $target_info) { + $target_fields[$target_info['label']] = $target_key; + } + + foreach ($detected_fields as $field) { + // Sanitize field name for form use - replace invalid characters with underscores + $sanitized_field = preg_replace('/[^a-zA-Z0-9_-]/', '_', $field); + $builder->add('mapping_' . $sanitized_field, ChoiceType::class, [ + 'label' => $field, + 'required' => false, + 'choices' => $target_fields, + 'data' => $suggested_mapping[$field] ?? '', + ]); + } + + $builder->add('submit', SubmitType::class, [ + 'label' => 'project.bom_import.preview', + ]); + + $form = $builder->getForm(); + $form->handleRequest($request); + + if ($form->isSubmitted() && $form->isValid()) { + // Build field mapping array with priority support + $field_mapping = []; + $field_priorities = []; + $delimiter = $form->get('delimiter')->getData(); + + foreach ($detected_fields as $field) { + $sanitized_field = preg_replace('/[^a-zA-Z0-9_-]/', '_', $field); + $target = $form->get('mapping_' . $sanitized_field)->getData(); + if (!empty($target)) { + $field_mapping[$field] = $target; + + // Get priority from request (default to 10) + $priority = $request->request->get('priority_' . $sanitized_field, 10); + $field_priorities[$field] = (int) $priority; + } + } + + // Validate field mapping + $validation = $BOMImporter->validateFieldMapping($field_mapping, $detected_fields); + + if (!$validation['is_valid']) { + foreach ($validation['errors'] as $error) { + $this->addFlash('error', $error); + } + foreach ($validation['warnings'] as $warning) { + $this->addFlash('warning', $warning); + } + + return $this->render('projects/import_bom_map_fields.html.twig', [ + 'project' => $project, + 'form' => $form->createView(), + 'detected_fields' => $detected_fields, + 'suggested_mapping' => $suggested_mapping, + 'field_name_mapping' => $field_name_mapping, + ]); + } + + // Show warnings but continue + foreach ($validation['warnings'] as $warning) { + $this->addFlash('warning', $warning); + } + + try { + // Re-detect fields with chosen delimiter + $detected_fields = $BOMImporter->detectFields($file_content, $delimiter); + + // Clear existing BOM entries if requested + if ($clear_existing) { + $existing_count = $project->getBomEntries()->count(); + $logger->info('Clearing existing BOM entries', [ + 'existing_count' => $existing_count, + 'project_id' => $project->getID(), + ]); + $project->getBomEntries()->clear(); + $entityManager->flush(); + $logger->info('Existing BOM entries cleared'); + } else { + $existing_count = $project->getBomEntries()->count(); + $logger->info('Keeping existing BOM entries', [ + 'existing_count' => $existing_count, + 'project_id' => $project->getID(), + ]); + } + + // Validate data before importing + $validation_result = $BOMImporter->validateBOMData($file_content, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'field_priorities' => $field_priorities, + 'delimiter' => $delimiter, + ]); + + // Log validation results + $logger->info('BOM import validation completed', [ + 'total_entries' => $validation_result['total_entries'], + 'valid_entries' => $validation_result['valid_entries'], + 'invalid_entries' => $validation_result['invalid_entries'], + 'error_count' => count($validation_result['errors']), + 'warning_count' => count($validation_result['warnings']), + ]); + + // Show validation warnings to user + foreach ($validation_result['warnings'] as $warning) { + $this->addFlash('warning', $warning); + } + + // If there are validation errors, show them and stop + if (!empty($validation_result['errors'])) { + foreach ($validation_result['errors'] as $error) { + $this->addFlash('error', $error); + } + + return $this->render('projects/import_bom_map_fields.html.twig', [ + 'project' => $project, + 'form' => $form->createView(), + 'detected_fields' => $detected_fields, + 'suggested_mapping' => $suggested_mapping, + 'field_name_mapping' => $field_name_mapping, + 'validation_result' => $validation_result, + ]); + } + + // Import with field mapping and priorities (validation already passed) + $entries = $BOMImporter->stringToBOMEntries($file_content, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'field_priorities' => $field_priorities, + 'delimiter' => $delimiter, + ]); + + // Log entry details for debugging + $logger->info('BOM entries created', [ + 'total_entries' => count($entries), + ]); + + foreach ($entries as $index => $entry) { + $logger->debug("BOM entry {$index}", [ + 'name' => $entry->getName(), + 'mountnames' => $entry->getMountnames(), + 'quantity' => $entry->getQuantity(), + 'comment' => $entry->getComment(), + 'part_id' => $entry->getPart()?->getID(), + ]); + } + + // Assign entries to project + $logger->info('Adding BOM entries to project', [ + 'entries_count' => count($entries), + 'project_id' => $project->getID(), + ]); + + foreach ($entries as $index => $entry) { + $logger->debug("Adding BOM entry {$index} to project", [ + 'name' => $entry->getName(), + 'part_id' => $entry->getPart()?->getID(), + 'quantity' => $entry->getQuantity(), + ]); + $project->addBomEntry($entry); + } + + // Validate the project entries (includes collection constraints) + $errors = $validator->validateProperty($project, 'bom_entries'); + + // If no validation errors occurred, save and redirect + if (count($errors) === 0) { + $this->addFlash('success', t('project.bom_import.flash.success', ['%count%' => count($entries)])); + $entityManager->flush(); + + // Clear session data + $request->getSession()->remove('bom_import_data'); + $request->getSession()->remove('bom_import_clear'); + + return $this->redirectToRoute('project_edit', ['id' => $project->getID()]); + } + + // When we get here, there were validation errors + $this->addFlash('error', t('project.bom_import.flash.invalid_entries')); + + //Print validation errors to log for debugging + foreach ($errors as $error) { + $logger->error('BOM entry validation error', [ + 'message' => $error->getMessage(), + 'invalid_value' => $error->getInvalidValue(), + ]); + //And show as flash message + $this->addFlash('error', $error->getMessage(),); + } + + } catch (\UnexpectedValueException | SyntaxError $e) { + $this->addFlash('error', t('project.bom_import.flash.invalid_file', ['%message%' => $e->getMessage()])); + } + } + + return $this->render('projects/import_bom_map_fields.html.twig', [ + 'project' => $project, + 'form' => $form, + 'detected_fields' => $detected_fields, + 'suggested_mapping' => $suggested_mapping, + 'field_name_mapping' => $field_name_mapping, + ]); + } + #[Route(path: '/add_parts', name: 'project_add_parts_no_id')] #[Route(path: '/{id}/add_parts', name: 'project_add_parts', requirements: ['id' => '\d+'])] public function addPart(Request $request, EntityManagerInterface $entityManager, ?Project $project): Response { - if($project instanceof Project) { + if ($project instanceof Project) { $this->denyAccessUnlessGranted('edit', $project); } else { $this->denyAccessUnlessGranted('@projects.edit'); @@ -242,7 +525,7 @@ class ProjectController extends AbstractController $data = $form->getData(); $bom_entries = $data['bom_entries']; - foreach ($bom_entries as $bom_entry){ + foreach ($bom_entries as $bom_entry) { $target_project->addBOMEntry($bom_entry); } diff --git a/src/DataFixtures/CurrencyFixtures.php b/src/DataFixtures/CurrencyFixtures.php new file mode 100644 index 00000000..2de5b277 --- /dev/null +++ b/src/DataFixtures/CurrencyFixtures.php @@ -0,0 +1,64 @@ +. + */ + +declare(strict_types=1); + + +namespace App\DataFixtures; + +use App\Entity\PriceInformations\Currency; +use Brick\Math\BigDecimal; +use Doctrine\Bundle\FixturesBundle\Fixture; +use Doctrine\Persistence\ObjectManager; + +class CurrencyFixtures extends Fixture +{ + public function load(ObjectManager $manager): void + { + $currency1 = new Currency(); + $currency1->setName('US-Dollar'); + $currency1->setIsoCode('USD'); + $manager->persist($currency1); + + $currency2 = new Currency(); + $currency2->setName('Swiss Franc'); + $currency2->setIsoCode('CHF'); + $currency2->setExchangeRate(BigDecimal::of('0.91')); + $manager->persist($currency2); + + $currency3 = new Currency(); + $currency3->setName('Great British Pound'); + $currency3->setIsoCode('GBP'); + $currency3->setExchangeRate(BigDecimal::of('0.78')); + $manager->persist($currency3); + + $currency7 = new Currency(); + $currency7->setName('Test Currency with long name'); + $currency7->setIsoCode('CNY'); + $manager->persist($currency7); + + $manager->flush(); + + + //Ensure that currency 7 gets ID 7 + $manager->getRepository(Currency::class)->changeID($currency7, 7); + $manager->flush(); + } +} diff --git a/src/DataTables/Filters/AttachmentFilter.php b/src/DataTables/Filters/AttachmentFilter.php index d41bbe39..69d2aeac 100644 --- a/src/DataTables/Filters/AttachmentFilter.php +++ b/src/DataTables/Filters/AttachmentFilter.php @@ -22,6 +22,7 @@ declare(strict_types=1); */ namespace App\DataTables\Filters; +use App\DataTables\Filters\Constraints\AbstractConstraint; use App\DataTables\Filters\Constraints\BooleanConstraint; use App\DataTables\Filters\Constraints\DateTimeConstraint; use App\DataTables\Filters\Constraints\EntityConstraint; @@ -32,6 +33,7 @@ use App\DataTables\Filters\Constraints\TextConstraint; use App\Entity\Attachments\AttachmentType; use App\Services\Trees\NodesListBuilder; use Doctrine\ORM\QueryBuilder; +use Omines\DataTablesBundle\Filter\AbstractFilter; class AttachmentFilter implements FilterInterface { @@ -51,6 +53,9 @@ class AttachmentFilter implements FilterInterface public function __construct(NodesListBuilder $nodesListBuilder) { + //Must be done for every new set of attachment filters, to ensure deterministic parameter names. + AbstractConstraint::resetParameterCounter(); + $this->dbId = new IntConstraint('attachment.id'); $this->name = new TextConstraint('attachment.name'); $this->targetType = new InstanceOfConstraint('attachment'); diff --git a/src/DataTables/Filters/Constraints/AbstractConstraint.php b/src/DataTables/Filters/Constraints/AbstractConstraint.php index 7f16511e..c632b2a4 100644 --- a/src/DataTables/Filters/Constraints/AbstractConstraint.php +++ b/src/DataTables/Filters/Constraints/AbstractConstraint.php @@ -28,10 +28,7 @@ abstract class AbstractConstraint implements FilterInterface { use FilterTrait; - /** - * @var string - */ - protected string $identifier; + protected ?string $identifier; /** diff --git a/src/DataTables/Filters/Constraints/FilterTrait.php b/src/DataTables/Filters/Constraints/FilterTrait.php index 3260e4e3..2932914a 100644 --- a/src/DataTables/Filters/Constraints/FilterTrait.php +++ b/src/DataTables/Filters/Constraints/FilterTrait.php @@ -28,6 +28,7 @@ trait FilterTrait { protected bool $useHaving = false; + protected static int $parameterCounter = 0; public function useHaving($value = true): static { @@ -50,8 +51,18 @@ trait FilterTrait { //Replace all special characters with underscores $property = preg_replace('/\W/', '_', $property); - //Add a random number to the end of the property name for uniqueness - return $property . '_' . uniqid("", false); + return $property . '_' . (self::$parameterCounter++) . '_'; + } + + /** + * Resets the parameter counter, so the next call to generateParameterIdentifier will start from 0 again. + * This should be done before initializing a new set of filters to a fresh query builder, to ensure that the parameter + * identifiers are deterministic so that they are cacheable. + * @return void + */ + public static function resetParameterCounter(): void + { + self::$parameterCounter = 0; } /** diff --git a/src/DataTables/Filters/Constraints/Part/TagsConstraint.php b/src/DataTables/Filters/Constraints/Part/TagsConstraint.php index 02eab7a1..2b28e6b4 100644 --- a/src/DataTables/Filters/Constraints/Part/TagsConstraint.php +++ b/src/DataTables/Filters/Constraints/Part/TagsConstraint.php @@ -88,7 +88,7 @@ class TagsConstraint extends AbstractConstraint //Escape any %, _ or \ in the tag $tag = addcslashes($tag, '%_\\'); - $tag_identifier_prefix = uniqid($this->identifier . '_', false); + $tag_identifier_prefix = $this->generateParameterIdentifier('tag'); $expr = $queryBuilder->expr(); diff --git a/src/DataTables/Filters/LogFilter.php b/src/DataTables/Filters/LogFilter.php index 35d32e74..38dc2191 100644 --- a/src/DataTables/Filters/LogFilter.php +++ b/src/DataTables/Filters/LogFilter.php @@ -22,6 +22,7 @@ declare(strict_types=1); */ namespace App\DataTables\Filters; +use App\DataTables\Filters\Constraints\AbstractConstraint; use App\DataTables\Filters\Constraints\ChoiceConstraint; use App\DataTables\Filters\Constraints\DateTimeConstraint; use App\DataTables\Filters\Constraints\EntityConstraint; @@ -44,6 +45,9 @@ class LogFilter implements FilterInterface public function __construct() { + //Must be done for every new set of attachment filters, to ensure deterministic parameter names. + AbstractConstraint::resetParameterCounter(); + $this->timestamp = new DateTimeConstraint('log.timestamp'); $this->dbId = new IntConstraint('log.id'); $this->level = new ChoiceConstraint('log.level'); diff --git a/src/DataTables/Filters/PartFilter.php b/src/DataTables/Filters/PartFilter.php index ff98c76f..8dcbd6b3 100644 --- a/src/DataTables/Filters/PartFilter.php +++ b/src/DataTables/Filters/PartFilter.php @@ -22,6 +22,7 @@ declare(strict_types=1); */ namespace App\DataTables\Filters; +use App\DataTables\Filters\Constraints\AbstractConstraint; use App\DataTables\Filters\Constraints\BooleanConstraint; use App\DataTables\Filters\Constraints\ChoiceConstraint; use App\DataTables\Filters\Constraints\DateTimeConstraint; @@ -103,6 +104,9 @@ class PartFilter implements FilterInterface public function __construct(NodesListBuilder $nodesListBuilder) { + //Must be done for every new set of attachment filters, to ensure deterministic parameter names. + AbstractConstraint::resetParameterCounter(); + $this->name = new TextConstraint('part.name'); $this->description = new TextConstraint('part.description'); $this->comment = new TextConstraint('part.comment'); diff --git a/src/DataTables/Filters/PartSearchFilter.php b/src/DataTables/Filters/PartSearchFilter.php index 6e2e5894..60832b26 100644 --- a/src/DataTables/Filters/PartSearchFilter.php +++ b/src/DataTables/Filters/PartSearchFilter.php @@ -21,6 +21,7 @@ declare(strict_types=1); * along with this program. If not, see . */ namespace App\DataTables\Filters; +use App\DataTables\Filters\Constraints\AbstractConstraint; use Doctrine\ORM\QueryBuilder; class PartSearchFilter implements FilterInterface diff --git a/src/Form/InfoProviderSystem/ProviderSelectType.php b/src/Form/InfoProviderSystem/ProviderSelectType.php index a9373390..95e10791 100644 --- a/src/Form/InfoProviderSystem/ProviderSelectType.php +++ b/src/Form/InfoProviderSystem/ProviderSelectType.php @@ -28,6 +28,7 @@ use App\Services\InfoProviderSystem\Providers\InfoProviderInterface; use Symfony\Component\Form\AbstractType; use Symfony\Component\Form\ChoiceList\ChoiceList; use Symfony\Component\Form\Extension\Core\Type\ChoiceType; +use Symfony\Component\OptionsResolver\Options; use Symfony\Component\OptionsResolver\OptionsResolver; class ProviderSelectType extends AbstractType @@ -44,13 +45,43 @@ class ProviderSelectType extends AbstractType public function configureOptions(OptionsResolver $resolver): void { - $resolver->setDefaults([ - 'choices' => $this->providerRegistry->getActiveProviders(), - 'choice_label' => ChoiceList::label($this, static fn (?InfoProviderInterface $choice) => $choice?->getProviderInfo()['name']), - 'choice_value' => ChoiceList::value($this, static fn(?InfoProviderInterface $choice) => $choice?->getProviderKey()), + $providers = $this->providerRegistry->getActiveProviders(); - 'multiple' => true, - ]); + $resolver->setDefault('input', 'object'); + $resolver->setAllowedTypes('input', 'string'); + //Either the form returns the provider objects or their keys + $resolver->setAllowedValues('input', ['object', 'string']); + $resolver->setDefault('multiple', true); + + $resolver->setDefault('choices', function (Options $options) use ($providers) { + if ('object' === $options['input']) { + return $this->providerRegistry->getActiveProviders(); + } + + $tmp = []; + foreach ($providers as $provider) { + $name = $provider->getProviderInfo()['name']; + $tmp[$name] = $provider->getProviderKey(); + } + + return $tmp; + }); + + //The choice_label and choice_value only needs to be set if we want the objects + $resolver->setDefault('choice_label', function (Options $options){ + if ('object' === $options['input']) { + return ChoiceList::label($this, static fn (?InfoProviderInterface $choice) => $choice?->getProviderInfo()['name']); + } + + return null; + }); + $resolver->setDefault('choice_value', function (Options $options) { + if ('object' === $options['input']) { + return ChoiceList::value($this, static fn(?InfoProviderInterface $choice) => $choice?->getProviderKey()); + } + + return null; + }); } -} \ No newline at end of file +} diff --git a/src/Form/LabelSystem/LabelDialogType.php b/src/Form/LabelSystem/LabelDialogType.php index f2710b19..d79d01f6 100644 --- a/src/Form/LabelSystem/LabelDialogType.php +++ b/src/Form/LabelSystem/LabelDialogType.php @@ -87,6 +87,16 @@ class LabelDialogType extends AbstractType ] ]); + if ($options['profile'] !== null) { + $builder->add('update_profile', SubmitType::class, [ + 'label' => 'label_generator.update_profile', + 'disabled' => !$this->security->isGranted('edit', $options['profile']), + 'attr' => [ + 'class' => 'btn btn-outline-success' + ] + ]); + } + $builder->add('update', SubmitType::class, [ 'label' => 'label_generator.update', ]); @@ -97,5 +107,6 @@ class LabelDialogType extends AbstractType parent::configureOptions($resolver); $resolver->setDefault('mapped', false); $resolver->setDefault('disable_options', false); + $resolver->setDefault('profile', null); } } diff --git a/src/Security/Voter/AttachmentVoter.php b/src/Security/Voter/AttachmentVoter.php index c2b17053..bd7ae4df 100644 --- a/src/Security/Voter/AttachmentVoter.php +++ b/src/Security/Voter/AttachmentVoter.php @@ -41,6 +41,7 @@ use App\Entity\Attachments\UserAttachment; use RuntimeException; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; use function in_array; @@ -56,7 +57,7 @@ final class AttachmentVoter extends Voter { } - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { //This voter only works for attachments @@ -65,7 +66,8 @@ final class AttachmentVoter extends Voter } if ($attribute === 'show_private') { - return $this->helper->isGranted($token, 'attachments', 'show_private'); + $vote?->addReason('User is not allowed to view private attachments.'); + return $this->helper->isGranted($token, 'attachments', 'show_private', $vote); } @@ -111,7 +113,8 @@ final class AttachmentVoter extends Voter throw new RuntimeException('Encountered unknown Parameter type: ' . $subject); } - return $this->helper->isGranted($token, $param, $this->mapOperation($attribute)); + $vote?->addReason('User is not allowed to '.$this->mapOperation($attribute).' attachments of type '.$param.'.'); + return $this->helper->isGranted($token, $param, $this->mapOperation($attribute), $vote); } return false; diff --git a/src/Security/Voter/GroupVoter.php b/src/Security/Voter/GroupVoter.php index 34839d38..f2ce6953 100644 --- a/src/Security/Voter/GroupVoter.php +++ b/src/Security/Voter/GroupVoter.php @@ -25,6 +25,7 @@ namespace App\Security\Voter; use App\Entity\UserSystem\Group; use App\Services\UserSystem\VoterHelper; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -43,9 +44,9 @@ final class GroupVoter extends Voter * * @param string $attribute */ - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { - return $this->helper->isGranted($token, 'groups', $attribute); + return $this->helper->isGranted($token, 'groups', $attribute, $vote); } /** diff --git a/src/Security/Voter/ImpersonateUserVoter.php b/src/Security/Voter/ImpersonateUserVoter.php index edf55c62..1f8a70c6 100644 --- a/src/Security/Voter/ImpersonateUserVoter.php +++ b/src/Security/Voter/ImpersonateUserVoter.php @@ -26,6 +26,7 @@ namespace App\Security\Voter; use App\Entity\UserSystem\User; use App\Services\UserSystem\VoterHelper; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; use Symfony\Component\Security\Core\User\UserInterface; @@ -47,9 +48,16 @@ final class ImpersonateUserVoter extends Voter && $subject instanceof UserInterface; } - protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token, ?Vote $vote = null): bool { - return $this->helper->isGranted($token, 'users', 'impersonate'); + $result = $this->helper->isGranted($token, 'users', 'impersonate'); + + if ($result === false) { + $vote?->addReason('User is not allowed to impersonate other users.'); + $this->helper->addReason($vote, 'users', 'impersonate'); + } + + return $result; } public function supportsAttribute(string $attribute): bool @@ -61,4 +69,4 @@ final class ImpersonateUserVoter extends Voter { return is_a($subjectType, User::class, true); } -} \ No newline at end of file +} diff --git a/src/Security/Voter/LabelProfileVoter.php b/src/Security/Voter/LabelProfileVoter.php index 47505bf9..1687bf45 100644 --- a/src/Security/Voter/LabelProfileVoter.php +++ b/src/Security/Voter/LabelProfileVoter.php @@ -44,6 +44,7 @@ namespace App\Security\Voter; use App\Entity\LabelSystem\LabelProfile; use App\Services\UserSystem\VoterHelper; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -58,14 +59,15 @@ final class LabelProfileVoter extends Voter 'delete' => 'delete_profiles', 'show_history' => 'show_history', 'revert_element' => 'revert_element', + 'import' => 'import', ]; public function __construct(private readonly VoterHelper $helper) {} - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { - return $this->helper->isGranted($token, 'labels', self::MAPPING[$attribute]); + return $this->helper->isGranted($token, 'labels', self::MAPPING[$attribute], $vote); } protected function supports($attribute, $subject): bool diff --git a/src/Security/Voter/LogEntryVoter.php b/src/Security/Voter/LogEntryVoter.php index 08bc3b70..dcb75a7a 100644 --- a/src/Security/Voter/LogEntryVoter.php +++ b/src/Security/Voter/LogEntryVoter.php @@ -26,6 +26,7 @@ use App\Services\UserSystem\VoterHelper; use Symfony\Bundle\SecurityBundle\Security; use App\Entity\LogSystem\AbstractLogEntry; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -39,7 +40,7 @@ final class LogEntryVoter extends Voter { } - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { $user = $this->helper->resolveUser($token); @@ -48,19 +49,19 @@ final class LogEntryVoter extends Voter } if ('delete' === $attribute) { - return $this->helper->isGranted($token, 'system', 'delete_logs'); + return $this->helper->isGranted($token, 'system', 'delete_logs', $vote); } if ('read' === $attribute) { //Allow read of the users own log entries if ( $subject->getUser() === $user - && $this->helper->isGranted($token, 'self', 'show_logs') + && $this->helper->isGranted($token, 'self', 'show_logs', $vote) ) { return true; } - return $this->helper->isGranted($token, 'system', 'show_logs'); + return $this->helper->isGranted($token, 'system', 'show_logs', $vote); } if ('show_details' === $attribute) { diff --git a/src/Security/Voter/OrderdetailVoter.php b/src/Security/Voter/OrderdetailVoter.php index 20843b9a..3bb2a3a3 100644 --- a/src/Security/Voter/OrderdetailVoter.php +++ b/src/Security/Voter/OrderdetailVoter.php @@ -46,6 +46,7 @@ use Symfony\Bundle\SecurityBundle\Security; use App\Entity\Parts\Part; use App\Entity\PriceInformations\Orderdetail; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -59,7 +60,7 @@ final class OrderdetailVoter extends Voter protected const ALLOWED_PERMS = ['read', 'edit', 'create', 'delete', 'show_history', 'revert_element']; - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { if (! is_a($subject, Orderdetail::class, true)) { throw new \RuntimeException('This voter can only handle Orderdetail objects!'); @@ -75,7 +76,7 @@ final class OrderdetailVoter extends Voter //If we have no part associated use the generic part permission if (is_string($subject) || !$subject->getPart() instanceof Part) { - return $this->helper->isGranted($token, 'parts', $operation); + return $this->helper->isGranted($token, 'parts', $operation, $vote); } //Otherwise vote on the part diff --git a/src/Security/Voter/ParameterVoter.php b/src/Security/Voter/ParameterVoter.php index 8ee2b9f5..f59bdeaf 100644 --- a/src/Security/Voter/ParameterVoter.php +++ b/src/Security/Voter/ParameterVoter.php @@ -39,6 +39,7 @@ use App\Entity\Parameters\StorageLocationParameter; use App\Entity\Parameters\SupplierParameter; use RuntimeException; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -53,7 +54,7 @@ final class ParameterVoter extends Voter { } - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { //return $this->resolver->inherit($user, 'attachments', $attribute) ?? false; @@ -108,7 +109,7 @@ final class ParameterVoter extends Voter throw new RuntimeException('Encountered unknown Parameter type: ' . (is_object($subject) ? $subject::class : $subject)); } - return $this->helper->isGranted($token, $param, $attribute); + return $this->helper->isGranted($token, $param, $attribute, $vote); } protected function supports(string $attribute, $subject): bool diff --git a/src/Security/Voter/PartAssociationVoter.php b/src/Security/Voter/PartAssociationVoter.php index 7678b67a..f1eb83c7 100644 --- a/src/Security/Voter/PartAssociationVoter.php +++ b/src/Security/Voter/PartAssociationVoter.php @@ -46,6 +46,7 @@ use App\Services\UserSystem\VoterHelper; use Symfony\Bundle\SecurityBundle\Security; use App\Entity\Parts\Part; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -61,7 +62,7 @@ final class PartAssociationVoter extends Voter protected const ALLOWED_PERMS = ['read', 'edit', 'create', 'delete', 'show_history', 'revert_element']; - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { if (!is_string($subject) && !$subject instanceof PartAssociation) { throw new \RuntimeException('Invalid subject type!'); @@ -77,7 +78,7 @@ final class PartAssociationVoter extends Voter //If we have no part associated use the generic part permission if (is_string($subject) || !$subject->getOwner() instanceof Part) { - return $this->helper->isGranted($token, 'parts', $operation); + return $this->helper->isGranted($token, 'parts', $operation, $vote); } //Otherwise vote on the part diff --git a/src/Security/Voter/PartLotVoter.php b/src/Security/Voter/PartLotVoter.php index a64473c8..87c3d135 100644 --- a/src/Security/Voter/PartLotVoter.php +++ b/src/Security/Voter/PartLotVoter.php @@ -46,6 +46,7 @@ use Symfony\Bundle\SecurityBundle\Security; use App\Entity\Parts\Part; use App\Entity\Parts\PartLot; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -59,13 +60,13 @@ final class PartLotVoter extends Voter protected const ALLOWED_PERMS = ['read', 'edit', 'create', 'delete', 'show_history', 'revert_element', 'withdraw', 'add', 'move']; - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { $user = $this->helper->resolveUser($token); if (in_array($attribute, ['withdraw', 'add', 'move'], true)) { - $base_permission = $this->helper->isGranted($token, 'parts_stock', $attribute); + $base_permission = $this->helper->isGranted($token, 'parts_stock', $attribute, $vote); $lot_permission = true; //If the lot has an owner, we need to check if the user is the owner of the lot to be allowed to withdraw it. @@ -73,6 +74,10 @@ final class PartLotVoter extends Voter $lot_permission = $subject->getOwner() === $user || $subject->getOwner()->getID() === $user->getID(); } + if (!$lot_permission) { + $vote->addReason('User is not the owner of the lot.'); + } + return $base_permission && $lot_permission; } @@ -86,7 +91,7 @@ final class PartLotVoter extends Voter //If we have no part associated use the generic part permission if (is_string($subject) || !$subject->getPart() instanceof Part) { - return $this->helper->isGranted($token, 'parts', $operation); + return $this->helper->isGranted($token, 'parts', $operation, $vote); } //Otherwise vote on the part diff --git a/src/Security/Voter/PartVoter.php b/src/Security/Voter/PartVoter.php index ef70b6ce..159e6893 100644 --- a/src/Security/Voter/PartVoter.php +++ b/src/Security/Voter/PartVoter.php @@ -25,6 +25,7 @@ namespace App\Security\Voter; use App\Entity\Parts\Part; use App\Services\UserSystem\VoterHelper; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -52,10 +53,9 @@ final class PartVoter extends Voter return false; } - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { - //Null concealing operator means, that no - return $this->helper->isGranted($token, 'parts', $attribute); + return $this->helper->isGranted($token, 'parts', $attribute, $vote); } public function supportsAttribute(string $attribute): bool diff --git a/src/Security/Voter/PermissionVoter.php b/src/Security/Voter/PermissionVoter.php index c6ec1b3d..8c304d86 100644 --- a/src/Security/Voter/PermissionVoter.php +++ b/src/Security/Voter/PermissionVoter.php @@ -24,6 +24,7 @@ namespace App\Security\Voter; use App\Services\UserSystem\VoterHelper; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -39,12 +40,17 @@ final class PermissionVoter extends Voter } - protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, mixed $subject, TokenInterface $token, ?Vote $vote = null): bool { $attribute = ltrim($attribute, '@'); [$perm, $op] = explode('.', $attribute); - return $this->helper->isGranted($token, $perm, $op); + $result = $this->helper->isGranted($token, $perm, $op); + if ($result === false) { + $this->helper->addReason($vote, $perm, $op); + } + + return $result; } public function supportsAttribute(string $attribute): bool diff --git a/src/Security/Voter/PricedetailVoter.php b/src/Security/Voter/PricedetailVoter.php index 681b73b7..ca86f1ce 100644 --- a/src/Security/Voter/PricedetailVoter.php +++ b/src/Security/Voter/PricedetailVoter.php @@ -47,6 +47,7 @@ use App\Entity\PriceInformations\Orderdetail; use App\Entity\Parts\Part; use App\Entity\PriceInformations\Pricedetail; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; /** @@ -60,7 +61,7 @@ final class PricedetailVoter extends Voter protected const ALLOWED_PERMS = ['read', 'edit', 'create', 'delete', 'show_history', 'revert_element']; - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { $operation = match ($attribute) { 'read' => 'read', @@ -72,7 +73,7 @@ final class PricedetailVoter extends Voter //If we have no part associated use the generic part permission if (is_string($subject) || !$subject->getOrderdetail() instanceof Orderdetail || !$subject->getOrderdetail()->getPart() instanceof Part) { - return $this->helper->isGranted($token, 'parts', $operation); + return $this->helper->isGranted($token, 'parts', $operation, $vote); } //Otherwise vote on the part diff --git a/src/Security/Voter/StructureVoter.php b/src/Security/Voter/StructureVoter.php index 2417b796..ad0299a7 100644 --- a/src/Security/Voter/StructureVoter.php +++ b/src/Security/Voter/StructureVoter.php @@ -33,6 +33,7 @@ use App\Entity\Parts\Supplier; use App\Entity\PriceInformations\Currency; use App\Services\UserSystem\VoterHelper; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; use function is_object; @@ -113,10 +114,10 @@ final class StructureVoter extends Voter * * @param string $attribute */ - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { $permission_name = $this->instanceToPermissionName($subject); //Just resolve the permission - return $this->helper->isGranted($token, $permission_name, $attribute); + return $this->helper->isGranted($token, $permission_name, $attribute, $vote); } } diff --git a/src/Security/Voter/UserVoter.php b/src/Security/Voter/UserVoter.php index b41c1a40..97f8e4fb 100644 --- a/src/Security/Voter/UserVoter.php +++ b/src/Security/Voter/UserVoter.php @@ -26,6 +26,7 @@ use App\Entity\UserSystem\User; use App\Services\UserSystem\PermissionManager; use App\Services\UserSystem\VoterHelper; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; use Symfony\Component\Security\Core\Authorization\Voter\Voter; use function in_array; @@ -79,7 +80,7 @@ final class UserVoter extends Voter * * @param string $attribute */ - protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool + protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token, ?Vote $vote = null): bool { $user = $this->helper->resolveUser($token); @@ -97,7 +98,7 @@ final class UserVoter extends Voter if (($subject instanceof User) && $subject->getID() === $user->getID() && $this->helper->isValidOperation('self', $attribute)) { //Then we also need to check the self permission - $tmp = $this->helper->isGranted($token, 'self', $attribute); + $tmp = $this->helper->isGranted($token, 'self', $attribute, $vote); //But if the self value is not allowed then use just the user value: if ($tmp) { return $tmp; @@ -106,7 +107,7 @@ final class UserVoter extends Voter //Else just check user permission: if ($this->helper->isValidOperation('users', $attribute)) { - return $this->helper->isGranted($token, 'users', $attribute); + return $this->helper->isGranted($token, 'users', $attribute, $vote); } return false; diff --git a/src/Services/ImportExportSystem/BOMImporter.php b/src/Services/ImportExportSystem/BOMImporter.php index d4876445..862fa463 100644 --- a/src/Services/ImportExportSystem/BOMImporter.php +++ b/src/Services/ImportExportSystem/BOMImporter.php @@ -22,10 +22,13 @@ declare(strict_types=1); */ namespace App\Services\ImportExportSystem; +use App\Entity\Parts\Part; use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\ProjectBOMEntry; +use Doctrine\ORM\EntityManagerInterface; use InvalidArgumentException; use League\Csv\Reader; +use Psr\Log\LoggerInterface; use Symfony\Component\HttpFoundation\File\File; use Symfony\Component\OptionsResolver\OptionsResolver; @@ -44,14 +47,25 @@ class BOMImporter 5 => 'Supplier and ref', ]; - public function __construct() - { + public function __construct( + private readonly EntityManagerInterface $entityManager, + private readonly LoggerInterface $logger, + private readonly BOMValidationService $validationService + ) { } protected function configureOptions(OptionsResolver $resolver): OptionsResolver { $resolver->setRequired('type'); - $resolver->setAllowedValues('type', ['kicad_pcbnew']); + $resolver->setAllowedValues('type', ['kicad_pcbnew', 'kicad_schematic']); + + // For flexible schematic import with field mapping + $resolver->setDefined(['field_mapping', 'field_priorities', 'delimiter']); + $resolver->setDefault('delimiter', ','); + $resolver->setDefault('field_priorities', []); + $resolver->setAllowedTypes('field_mapping', 'array'); + $resolver->setAllowedTypes('field_priorities', 'array'); + $resolver->setAllowedTypes('delimiter', 'string'); return $resolver; } @@ -82,6 +96,23 @@ class BOMImporter return $this->stringToBOMEntries($file->getContent(), $options); } + /** + * Validate BOM data before importing + * @return array Validation result with errors, warnings, and info + */ + public function validateBOMData(string $data, array $options): array + { + $resolver = new OptionsResolver(); + $resolver = $this->configureOptions($resolver); + $options = $resolver->resolve($options); + + return match ($options['type']) { + 'kicad_pcbnew' => $this->validateKiCADPCB($data), + 'kicad_schematic' => $this->validateKiCADSchematicData($data, $options), + default => throw new InvalidArgumentException('Invalid import type!'), + }; + } + /** * Import string data into an array of BOM entries, which are not yet assigned to a project. * @param string $data The data to import @@ -95,12 +126,13 @@ class BOMImporter $options = $resolver->resolve($options); return match ($options['type']) { - 'kicad_pcbnew' => $this->parseKiCADPCB($data, $options), + 'kicad_pcbnew' => $this->parseKiCADPCB($data), + 'kicad_schematic' => $this->parseKiCADSchematic($data, $options), default => throw new InvalidArgumentException('Invalid import type!'), }; } - private function parseKiCADPCB(string $data, array $options = []): array + private function parseKiCADPCB(string $data): array { $csv = Reader::createFromString($data); $csv->setDelimiter(';'); @@ -113,17 +145,17 @@ class BOMImporter $entry = $this->normalizeColumnNames($entry); //Ensure that the entry has all required fields - if (!isset ($entry['Designator'])) { - throw new \UnexpectedValueException('Designator missing at line '.($offset + 1).'!'); + if (!isset($entry['Designator'])) { + throw new \UnexpectedValueException('Designator missing at line ' . ($offset + 1) . '!'); } - if (!isset ($entry['Package'])) { - throw new \UnexpectedValueException('Package missing at line '.($offset + 1).'!'); + if (!isset($entry['Package'])) { + throw new \UnexpectedValueException('Package missing at line ' . ($offset + 1) . '!'); } - if (!isset ($entry['Designation'])) { - throw new \UnexpectedValueException('Designation missing at line '.($offset + 1).'!'); + if (!isset($entry['Designation'])) { + throw new \UnexpectedValueException('Designation missing at line ' . ($offset + 1) . '!'); } - if (!isset ($entry['Quantity'])) { - throw new \UnexpectedValueException('Quantity missing at line '.($offset + 1).'!'); + if (!isset($entry['Quantity'])) { + throw new \UnexpectedValueException('Quantity missing at line ' . ($offset + 1) . '!'); } $bom_entry = new ProjectBOMEntry(); @@ -138,6 +170,63 @@ class BOMImporter return $bom_entries; } + /** + * Validate KiCad PCB data + */ + private function validateKiCADPCB(string $data): array + { + $csv = Reader::createFromString($data); + $csv->setDelimiter(';'); + $csv->setHeaderOffset(0); + + $mapped_entries = []; + + foreach ($csv->getRecords() as $offset => $entry) { + // Translate the german field names to english + $entry = $this->normalizeColumnNames($entry); + $mapped_entries[] = $entry; + } + + return $this->validationService->validateBOMEntries($mapped_entries); + } + + /** + * Validate KiCad schematic data + */ + private function validateKiCADSchematicData(string $data, array $options): array + { + $delimiter = $options['delimiter'] ?? ','; + $field_mapping = $options['field_mapping'] ?? []; + $field_priorities = $options['field_priorities'] ?? []; + + // Handle potential BOM (Byte Order Mark) at the beginning + $data = preg_replace('/^\xEF\xBB\xBF/', '', $data); + + $csv = Reader::createFromString($data); + $csv->setDelimiter($delimiter); + $csv->setHeaderOffset(0); + + // Handle quoted fields properly + $csv->setEscape('\\'); + $csv->setEnclosure('"'); + + $mapped_entries = []; + + foreach ($csv->getRecords() as $offset => $entry) { + // Apply field mapping to translate column names + $mapped_entry = $this->applyFieldMapping($entry, $field_mapping, $field_priorities); + + // Extract footprint package name if it contains library prefix + if (isset($mapped_entry['Package']) && str_contains($mapped_entry['Package'], ':')) { + $mapped_entry['Package'] = explode(':', $mapped_entry['Package'], 2)[1]; + } + + $mapped_entries[] = $mapped_entry; + } + + return $this->validationService->validateBOMEntries($mapped_entries, $options); + } + /** * This function uses the order of the fields in the CSV files to make them locale independent. * @param array $entry @@ -160,4 +249,482 @@ class BOMImporter return $out; } + + /** + * Parse KiCad schematic BOM with flexible field mapping + */ + private function parseKiCADSchematic(string $data, array $options = []): array + { + $delimiter = $options['delimiter'] ?? ','; + $field_mapping = $options['field_mapping'] ?? []; + $field_priorities = $options['field_priorities'] ?? []; + + // Handle potential BOM (Byte Order Mark) at the beginning + $data = preg_replace('/^\xEF\xBB\xBF/', '', $data); + + $csv = Reader::createFromString($data); + $csv->setDelimiter($delimiter); + $csv->setHeaderOffset(0); + + // Handle quoted fields properly + $csv->setEscape('\\'); + $csv->setEnclosure('"'); + + $bom_entries = []; + $entries_by_key = []; // Track entries by name+part combination + $mapped_entries = []; // Collect all mapped entries for validation + + foreach ($csv->getRecords() as $offset => $entry) { + // Apply field mapping to translate column names + $mapped_entry = $this->applyFieldMapping($entry, $field_mapping, $field_priorities); + + // Extract footprint package name if it contains library prefix + if (isset($mapped_entry['Package']) && str_contains($mapped_entry['Package'], ':')) { + $mapped_entry['Package'] = explode(':', $mapped_entry['Package'], 2)[1]; + } + + $mapped_entries[] = $mapped_entry; + } + + // Validate all entries before processing + $validation_result = $this->validationService->validateBOMEntries($mapped_entries, $options); + + // Log validation results + $this->logger->info('BOM import validation completed', [ + 'total_entries' => $validation_result['total_entries'], + 'valid_entries' => $validation_result['valid_entries'], + 'invalid_entries' => $validation_result['invalid_entries'], + 'error_count' => count($validation_result['errors']), + 'warning_count' => count($validation_result['warnings']), + ]); + + // If there are validation errors, throw an exception with detailed messages + if (!empty($validation_result['errors'])) { + $error_message = $this->validationService->getErrorMessage($validation_result); + throw new \UnexpectedValueException("BOM import validation failed:\n" . $error_message); + } + + // Process validated entries + foreach ($mapped_entries as $offset => $mapped_entry) { + + // Set name - prefer MPN, fall back to Value, then default format + $mpn = trim($mapped_entry['MPN'] ?? ''); + $designation = trim($mapped_entry['Designation'] ?? ''); + $value = trim($mapped_entry['Value'] ?? ''); + + // Use the first non-empty value, or 'Unknown Component' if all are empty + $name = ''; + if (!empty($mpn)) { + $name = $mpn; + } elseif (!empty($designation)) { + $name = $designation; + } elseif (!empty($value)) { + $name = $value; + } else { + $name = 'Unknown Component'; + } + + if (isset($mapped_entry['Package']) && !empty(trim($mapped_entry['Package']))) { + $name .= ' (' . trim($mapped_entry['Package']) . ')'; + } + + // Set mountnames and quantity + // The Designator field contains comma-separated mount names for all instances + $designator = trim($mapped_entry['Designator']); + $quantity = (float) $mapped_entry['Quantity']; + + // Get mountnames array (validation already ensured they match quantity) + $mountnames_array = array_map('trim', explode(',', $designator)); + + // Try to link existing Part-DB part if ID is provided + $part = null; + if (isset($mapped_entry['Part-DB ID']) && !empty($mapped_entry['Part-DB ID'])) { + $partDbId = (int) $mapped_entry['Part-DB ID']; + $existingPart = $this->entityManager->getRepository(Part::class)->find($partDbId); + + if ($existingPart) { + $part = $existingPart; + // Update name with actual part name + $name = $existingPart->getName(); + } + } + + // Create unique key for this entry (name + part ID) + $entry_key = $name . '|' . ($part ? $part->getID() : 'null'); + + // Check if we already have an entry with the same name and part + if (isset($entries_by_key[$entry_key])) { + // Merge with existing entry + $existing_entry = $entries_by_key[$entry_key]; + + // Combine mountnames + $existing_mountnames = $existing_entry->getMountnames(); + $combined_mountnames = $existing_mountnames . ',' . $designator; + $existing_entry->setMountnames($combined_mountnames); + + // Add quantities + $existing_quantity = $existing_entry->getQuantity(); + $existing_entry->setQuantity($existing_quantity + $quantity); + + $this->logger->info('Merged duplicate BOM entry', [ + 'name' => $name, + 'part_id' => $part ? $part->getID() : null, + 'original_quantity' => $existing_quantity, + 'added_quantity' => $quantity, + 'new_quantity' => $existing_quantity + $quantity, + 'original_mountnames' => $existing_mountnames, + 'added_mountnames' => $designator, + ]); + + continue; // Skip creating new entry + } + + // Create new BOM entry + $bom_entry = new ProjectBOMEntry(); + $bom_entry->setName($name); + $bom_entry->setMountnames($designator); + $bom_entry->setQuantity($quantity); + + if ($part) { + $bom_entry->setPart($part); + } + + // Set comment with additional info + $comment_parts = []; + if (isset($mapped_entry['Value']) && $mapped_entry['Value'] !== ($mapped_entry['MPN'] ?? '')) { + $comment_parts[] = 'Value: ' . $mapped_entry['Value']; + } + if (isset($mapped_entry['MPN'])) { + $comment_parts[] = 'MPN: ' . $mapped_entry['MPN']; + } + if (isset($mapped_entry['Manufacturer'])) { + $comment_parts[] = 'Manf: ' . $mapped_entry['Manufacturer']; + } + if (isset($mapped_entry['LCSC'])) { + $comment_parts[] = 'LCSC: ' . $mapped_entry['LCSC']; + } + if (isset($mapped_entry['Supplier and ref'])) { + $comment_parts[] = $mapped_entry['Supplier and ref']; + } + + if ($part) { + $comment_parts[] = "Part-DB ID: " . $part->getID(); + } elseif (isset($mapped_entry['Part-DB ID']) && !empty($mapped_entry['Part-DB ID'])) { + $comment_parts[] = "Part-DB ID: " . $mapped_entry['Part-DB ID'] . " (NOT FOUND)"; + } + + $bom_entry->setComment(implode(', ', $comment_parts)); + + $bom_entries[] = $bom_entry; + $entries_by_key[$entry_key] = $bom_entry; + } + + return $bom_entries; + } + + /** + * Get all available field mapping targets with descriptions + */ + public function getAvailableFieldTargets(): array + { + $targets = [ + 'Designator' => [ + 'label' => 'Designator', + 'description' => 'Component reference designators (e.g., R1, C2, U3)', + 'required' => true, + 'multiple' => false, + ], + 'Quantity' => [ + 'label' => 'Quantity', + 'description' => 'Number of components', + 'required' => true, + 'multiple' => false, + ], + 'Designation' => [ + 'label' => 'Designation', + 'description' => 'Component designation/part number', + 'required' => false, + 'multiple' => true, + ], + 'Value' => [ + 'label' => 'Value', + 'description' => 'Component value (e.g., 10k, 100nF)', + 'required' => false, + 'multiple' => true, + ], + 'Package' => [ + 'label' => 'Package', + 'description' => 'Component package/footprint', + 'required' => false, + 'multiple' => true, + ], + 'MPN' => [ + 'label' => 'MPN', + 'description' => 'Manufacturer Part Number', + 'required' => false, + 'multiple' => true, + ], + 'Manufacturer' => [ + 'label' => 'Manufacturer', + 'description' => 'Component manufacturer name', + 'required' => false, + 'multiple' => true, + ], + 'Part-DB ID' => [ + 'label' => 'Part-DB ID', + 'description' => 'Existing Part-DB part ID for linking', + 'required' => false, + 'multiple' => false, + ], + 'Comment' => [ + 'label' => 'Comment', + 'description' => 'Additional component information', + 'required' => false, + 'multiple' => true, + ], + ]; + + // Add dynamic supplier fields based on available suppliers in the database + $suppliers = $this->entityManager->getRepository(\App\Entity\Parts\Supplier::class)->findAll(); + foreach ($suppliers as $supplier) { + $supplierName = $supplier->getName(); + $targets[$supplierName . ' SPN'] = [ + 'label' => $supplierName . ' SPN', + 'description' => "Supplier part number for {$supplierName}", + 'required' => false, + 'multiple' => true, + 'supplier_id' => $supplier->getID(), + ]; + } + + return $targets; + } + + /** + * Get suggested field mappings based on common field names + */ + public function getSuggestedFieldMapping(array $detected_fields): array + { + $suggestions = []; + + $field_patterns = [ + 'Part-DB ID' => ['part-db id', 'partdb_id', 'part_db_id', 'db_id', 'partdb'], + 'Designator' => ['reference', 'ref', 'designator', 'component', 'comp'], + 'Quantity' => ['qty', 'quantity', 'count', 'number', 'amount'], + 'Value' => ['value', 'val', 'component_value'], + 'Designation' => ['designation', 'part_number', 'partnumber', 'part'], + 'Package' => ['footprint', 'package', 'housing', 'fp'], + 'MPN' => ['mpn', 'part_number', 'partnumber', 'manf#', 'mfr_part_number', 'manufacturer_part'], + 'Manufacturer' => ['manufacturer', 'manf', 'mfr', 'brand', 'vendor'], + 'Comment' => ['comment', 'comments', 'note', 'notes', 'description'], + ]; + + // Add supplier-specific patterns + $suppliers = $this->entityManager->getRepository(\App\Entity\Parts\Supplier::class)->findAll(); + foreach ($suppliers as $supplier) { + $supplierName = $supplier->getName(); + $supplierLower = strtolower($supplierName); + + // Create patterns for each supplier + $field_patterns[$supplierName . ' SPN'] = [ + $supplierLower, + $supplierLower . '#', + $supplierLower . '_part', + $supplierLower . '_number', + $supplierLower . 'pn', + $supplierLower . '_spn', + $supplierLower . ' spn', + // Common abbreviations + $supplierLower === 'mouser' ? 'mouser' : null, + $supplierLower === 'digikey' ? 'dk' : null, + $supplierLower === 'farnell' ? 'farnell' : null, + $supplierLower === 'rs' ? 'rs' : null, + $supplierLower === 'lcsc' ? 'lcsc' : null, + ]; + + // Remove null values + $field_patterns[$supplierName . ' SPN'] = array_filter($field_patterns[$supplierName . ' SPN'], fn($value) => $value !== null); + } + + foreach ($detected_fields as $field) { + $field_lower = strtolower(trim($field)); + + foreach ($field_patterns as $target => $patterns) { + foreach ($patterns as $pattern) { + if (str_contains($field_lower, $pattern)) { + $suggestions[$field] = $target; + break 2; // Break both loops + } + } + } + } + + return $suggestions; + } + + /** + * Validate field mapping configuration + */ + public function validateFieldMapping(array $field_mapping, array $detected_fields): array + { + $errors = []; + $warnings = []; + $available_targets = $this->getAvailableFieldTargets(); + + // Check for required fields + $mapped_targets = array_values($field_mapping); + $required_fields = ['Designator', 'Quantity']; + + foreach ($required_fields as $required) { + if (!in_array($required, $mapped_targets, true)) { + $errors[] = "Required field '{$required}' is not mapped from any CSV column."; + } + } + + // Check for invalid target fields + foreach ($field_mapping as $csv_field => $target) { + if (!empty($target) && !isset($available_targets[$target])) { + $errors[] = "Invalid target field '{$target}' for CSV field '{$csv_field}'."; + } + } + + // Check for unmapped fields (warnings) + $unmapped_fields = array_diff($detected_fields, array_keys($field_mapping)); + if (!empty($unmapped_fields)) { + $warnings[] = "The following CSV fields are not mapped: " . implode(', ', $unmapped_fields); + } + + return [ + 'errors' => $errors, + 'warnings' => $warnings, + 'is_valid' => empty($errors), + ]; + } + + /** + * Apply field mapping with support for multiple fields and priority + */ + private function applyFieldMapping(array $entry, array $field_mapping, array $field_priorities = []): array + { + $mapped = []; + $field_groups = []; + + // Group fields by target with priority information + foreach ($field_mapping as $csv_field => $target) { + if (!empty($target)) { + if (!isset($field_groups[$target])) { + $field_groups[$target] = []; + } + $priority = $field_priorities[$csv_field] ?? 10; + $field_groups[$target][] = [ + 'field' => $csv_field, + 'priority' => $priority, + 'value' => $entry[$csv_field] ?? '' + ]; + } + } + + // Process each target field + foreach ($field_groups as $target => $field_data) { + // Sort by priority (lower number = higher priority) + usort($field_data, function ($a, $b) { + return $a['priority'] <=> $b['priority']; + }); + + $values = []; + $non_empty_values = []; + + // Collect all non-empty values for this target + foreach ($field_data as $data) { + $value = trim($data['value']); + if (!empty($value)) { + $non_empty_values[] = $value; + } + $values[] = $value; + } + + // Use the first non-empty value (highest priority) + if (!empty($non_empty_values)) { + $mapped[$target] = $non_empty_values[0]; + + // If multiple non-empty values exist, add alternatives to comment + if (count($non_empty_values) > 1) { + $mapped[$target . '_alternatives'] = array_slice($non_empty_values, 1); + } + } + } + + return $mapped; + } + + /** + * Detect available fields in CSV data for field mapping UI + */ + public function detectFields(string $data, ?string $delimiter = null): array + { + if ($delimiter === null) { + // Detect delimiter by counting occurrences in the first row (header) + $delimiters = [',', ';', "\t"]; + $lines = explode("\n", $data, 2); + $header_line = $lines[0] ?? ''; + $delimiter_counts = []; + foreach ($delimiters as $delim) { + $delimiter_counts[$delim] = substr_count($header_line, $delim); + } + // Choose the delimiter with the highest count, default to comma if all are zero + $max_count = max($delimiter_counts); + $delimiter = array_search($max_count, $delimiter_counts, true); + if ($max_count === 0 || $delimiter === false) { + $delimiter = ','; + } + } + // Handle potential BOM (Byte Order Mark) at the beginning + $data = preg_replace('/^\xEF\xBB\xBF/', '', $data); + + // Get first line only for header detection + $lines = explode("\n", $data); + $header_line = trim($lines[0] ?? ''); + + + // Simple manual parsing for header detection + // This handles quoted CSV fields better than the library for detection + $fields = []; + $current_field = ''; + $in_quotes = false; + $quote_char = '"'; + + for ($i = 0; $i < strlen($header_line); $i++) { + $char = $header_line[$i]; + + if ($char === $quote_char && !$in_quotes) { + $in_quotes = true; + } elseif ($char === $quote_char && $in_quotes) { + // Check for escaped quote (double quote) + if ($i + 1 < strlen($header_line) && $header_line[$i + 1] === $quote_char) { + $current_field .= $quote_char; + $i++; // Skip next quote + } else { + $in_quotes = false; + } + } elseif ($char === $delimiter && !$in_quotes) { + $fields[] = trim($current_field); + $current_field = ''; + } else { + $current_field .= $char; + } + } + + // Add the last field + if ($current_field !== '') { + $fields[] = trim($current_field); + } + + // Clean up headers - remove quotes and trim whitespace + $headers = array_map(function ($header) { + return trim($header, '"\''); + }, $fields); + + + return array_values($headers); + } } diff --git a/src/Services/ImportExportSystem/BOMValidationService.php b/src/Services/ImportExportSystem/BOMValidationService.php new file mode 100644 index 00000000..74f81fe3 --- /dev/null +++ b/src/Services/ImportExportSystem/BOMValidationService.php @@ -0,0 +1,476 @@ +. + */ +namespace App\Services\ImportExportSystem; + +use App\Entity\Parts\Part; +use App\Entity\ProjectSystem\ProjectBOMEntry; +use Doctrine\ORM\EntityManagerInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * Service for validating BOM import data with comprehensive validation rules + * and user-friendly error messages. + */ +class BOMValidationService +{ + public function __construct( + private readonly EntityManagerInterface $entityManager, + private readonly TranslatorInterface $translator + ) { + } + + /** + * Validation result structure + */ + public static function createValidationResult(): array + { + return [ + 'errors' => [], + 'warnings' => [], + 'info' => [], + 'is_valid' => true, + 'total_entries' => 0, + 'valid_entries' => 0, + 'invalid_entries' => 0, + ]; + } + + /** + * Validate a single BOM entry with comprehensive checks + */ + public function validateBOMEntry(array $mapped_entry, int $line_number, array $options = []): array + { + $result = [ + 'line_number' => $line_number, + 'errors' => [], + 'warnings' => [], + 'info' => [], + 'is_valid' => true, + ]; + + // Run all validation rules + $this->validateRequiredFields($mapped_entry, $result); + $this->validateDesignatorFormat($mapped_entry, $result); + $this->validateQuantityFormat($mapped_entry, $result); + $this->validateDesignatorQuantityMatch($mapped_entry, $result); + $this->validatePartDBLink($mapped_entry, $result); + $this->validateComponentName($mapped_entry, $result); + $this->validatePackageFormat($mapped_entry, $result); + $this->validateNumericFields($mapped_entry, $result); + + $result['is_valid'] = empty($result['errors']); + + return $result; + } + + /** + * Validate multiple BOM entries and provide summary + */ + public function validateBOMEntries(array $mapped_entries, array $options = []): array + { + $result = self::createValidationResult(); + $result['total_entries'] = count($mapped_entries); + + $line_results = []; + $all_errors = []; + $all_warnings = []; + $all_info = []; + + foreach ($mapped_entries as $index => $entry) { + $line_number = $index + 1; + $line_result = $this->validateBOMEntry($entry, $line_number, $options); + + $line_results[] = $line_result; + + if ($line_result['is_valid']) { + $result['valid_entries']++; + } else { + $result['invalid_entries']++; + } + + // Collect all messages + $all_errors = array_merge($all_errors, $line_result['errors']); + $all_warnings = array_merge($all_warnings, $line_result['warnings']); + $all_info = array_merge($all_info, $line_result['info']); + } + + // Add summary messages + $this->addSummaryMessages($result, $all_errors, $all_warnings, $all_info); + + $result['errors'] = $all_errors; + $result['warnings'] = $all_warnings; + $result['info'] = $all_info; + $result['line_results'] = $line_results; + $result['is_valid'] = empty($all_errors); + + return $result; + } + + /** + * Validate required fields are present + */ + private function validateRequiredFields(array $entry, array &$result): void + { + $required_fields = ['Designator', 'Quantity']; + + foreach ($required_fields as $field) { + if (!isset($entry[$field]) || trim($entry[$field]) === '') { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.required_field_missing', [ + '%line%' => $result['line_number'], + '%field%' => $field + ]); + } + } + } + + /** + * Validate designator format and content + */ + private function validateDesignatorFormat(array $entry, array &$result): void + { + if (!isset($entry['Designator']) || trim($entry['Designator']) === '') { + return; // Already handled by required fields validation + } + + $designator = trim($entry['Designator']); + $mountnames = array_map('trim', explode(',', $designator)); + + // Remove empty entries + $mountnames = array_filter($mountnames, fn($name) => !empty($name)); + + if (empty($mountnames)) { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.no_valid_designators', [ + '%line%' => $result['line_number'] + ]); + return; + } + + // Validate each mountname format (allow 1-2 uppercase letters, followed by 1+ digits) + $invalid_mountnames = []; + foreach ($mountnames as $mountname) { + if (!preg_match('/^[A-Z]{1,2}[0-9]+$/', $mountname)) { + $invalid_mountnames[] = $mountname; + } + } + + if (!empty($invalid_mountnames)) { + $result['warnings'][] = $this->translator->trans('project.bom_import.validation.warnings.unusual_designator_format', [ + '%line%' => $result['line_number'], + '%designators%' => implode(', ', $invalid_mountnames) + ]); + } + + // Check for duplicate mountnames within the same line + $duplicates = array_diff_assoc($mountnames, array_unique($mountnames)); + if (!empty($duplicates)) { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.duplicate_designators', [ + '%line%' => $result['line_number'], + '%designators%' => implode(', ', array_unique($duplicates)) + ]); + } + } + + /** + * Validate quantity format and value + */ + private function validateQuantityFormat(array $entry, array &$result): void + { + if (!isset($entry['Quantity']) || trim($entry['Quantity']) === '') { + return; // Already handled by required fields validation + } + + $quantity_str = trim($entry['Quantity']); + + // Check if it's a valid number + if (!is_numeric($quantity_str)) { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.invalid_quantity', [ + '%line%' => $result['line_number'], + '%quantity%' => $quantity_str + ]); + return; + } + + $quantity = (float) $quantity_str; + + // Check for reasonable quantity values + if ($quantity <= 0) { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.quantity_zero_or_negative', [ + '%line%' => $result['line_number'], + '%quantity%' => $quantity_str + ]); + } elseif ($quantity > 10000) { + $result['warnings'][] = $this->translator->trans('project.bom_import.validation.warnings.quantity_unusually_high', [ + '%line%' => $result['line_number'], + '%quantity%' => $quantity_str + ]); + } + + // Check if quantity is a whole number when it should be + if (isset($entry['Designator'])) { + $designator = trim($entry['Designator']); + $mountnames = array_map('trim', explode(',', $designator)); + $mountnames = array_filter($mountnames, fn($name) => !empty($name)); + + if (count($mountnames) > 0 && $quantity != (int) $quantity) { + $result['warnings'][] = $this->translator->trans('project.bom_import.validation.warnings.quantity_not_whole_number', [ + '%line%' => $result['line_number'], + '%quantity%' => $quantity_str, + '%count%' => count($mountnames) + ]); + } + } + } + + /** + * Validate that designator count matches quantity + */ + private function validateDesignatorQuantityMatch(array $entry, array &$result): void + { + if (!isset($entry['Designator']) || !isset($entry['Quantity'])) { + return; // Already handled by required fields validation + } + + $designator = trim($entry['Designator']); + $quantity_str = trim($entry['Quantity']); + + if (!is_numeric($quantity_str)) { + return; // Already handled by quantity validation + } + + $mountnames = array_map('trim', explode(',', $designator)); + $mountnames = array_filter($mountnames, fn($name) => !empty($name)); + $mountnames_count = count($mountnames); + $quantity = (float) $quantity_str; + + if ($mountnames_count !== (int) $quantity) { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.quantity_designator_mismatch', [ + '%line%' => $result['line_number'], + '%quantity%' => $quantity_str, + '%count%' => $mountnames_count, + '%designators%' => $designator + ]); + } + } + + /** + * Validate Part-DB ID link + */ + private function validatePartDBLink(array $entry, array &$result): void + { + if (!isset($entry['Part-DB ID']) || trim($entry['Part-DB ID']) === '') { + return; + } + + $part_db_id = trim($entry['Part-DB ID']); + + if (!is_numeric($part_db_id)) { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.invalid_partdb_id', [ + '%line%' => $result['line_number'], + '%id%' => $part_db_id + ]); + return; + } + + $part_id = (int) $part_db_id; + + if ($part_id <= 0) { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.partdb_id_zero_or_negative', [ + '%line%' => $result['line_number'], + '%id%' => $part_id + ]); + return; + } + + // Check if part exists in database + $existing_part = $this->entityManager->getRepository(Part::class)->find($part_id); + if (!$existing_part) { + $result['warnings'][] = $this->translator->trans('project.bom_import.validation.warnings.partdb_id_not_found', [ + '%line%' => $result['line_number'], + '%id%' => $part_id + ]); + } else { + $result['info'][] = $this->translator->trans('project.bom_import.validation.info.partdb_link_success', [ + '%line%' => $result['line_number'], + '%name%' => $existing_part->getName(), + '%id%' => $part_id + ]); + } + } + + /** + * Validate component name/designation + */ + private function validateComponentName(array $entry, array &$result): void + { + $name_fields = ['MPN', 'Designation', 'Value']; + $has_name = false; + + foreach ($name_fields as $field) { + if (isset($entry[$field]) && trim($entry[$field]) !== '') { + $has_name = true; + break; + } + } + + if (!$has_name) { + $result['warnings'][] = $this->translator->trans('project.bom_import.validation.warnings.no_component_name', [ + '%line%' => $result['line_number'] + ]); + } + } + + /** + * Validate package format + */ + private function validatePackageFormat(array $entry, array &$result): void + { + if (!isset($entry['Package']) || trim($entry['Package']) === '') { + return; + } + + $package = trim($entry['Package']); + + // Check for common package format issues + if (strlen($package) > 100) { + $result['warnings'][] = $this->translator->trans('project.bom_import.validation.warnings.package_name_too_long', [ + '%line%' => $result['line_number'], + '%package%' => $package + ]); + } + + // Check for library prefixes (KiCad format) + if (str_contains($package, ':')) { + $result['info'][] = $this->translator->trans('project.bom_import.validation.info.library_prefix_detected', [ + '%line%' => $result['line_number'], + '%package%' => $package + ]); + } + } + + /** + * Validate numeric fields + */ + private function validateNumericFields(array $entry, array &$result): void + { + $numeric_fields = ['Quantity', 'Part-DB ID']; + + foreach ($numeric_fields as $field) { + if (isset($entry[$field]) && trim($entry[$field]) !== '') { + $value = trim($entry[$field]); + if (!is_numeric($value)) { + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.non_numeric_field', [ + '%line%' => $result['line_number'], + '%field%' => $field, + '%value%' => $value + ]); + } + } + } + } + + /** + * Add summary messages to validation result + */ + private function addSummaryMessages(array &$result, array $errors, array $warnings, array $info): void + { + $total_entries = $result['total_entries']; + $valid_entries = $result['valid_entries']; + $invalid_entries = $result['invalid_entries']; + + // Add summary info + if ($total_entries > 0) { + $result['info'][] = $this->translator->trans('project.bom_import.validation.info.import_summary', [ + '%total%' => $total_entries, + '%valid%' => $valid_entries, + '%invalid%' => $invalid_entries + ]); + } + + // Add error summary + if (!empty($errors)) { + $error_count = count($errors); + $result['errors'][] = $this->translator->trans('project.bom_import.validation.errors.summary', [ + '%count%' => $error_count + ]); + } + + // Add warning summary + if (!empty($warnings)) { + $warning_count = count($warnings); + $result['warnings'][] = $this->translator->trans('project.bom_import.validation.warnings.summary', [ + '%count%' => $warning_count + ]); + } + + // Add success message if all entries are valid + if ($total_entries > 0 && $invalid_entries === 0) { + $result['info'][] = $this->translator->trans('project.bom_import.validation.info.all_valid'); + } + } + + /** + * Get user-friendly error message for a validation result + */ + public function getErrorMessage(array $validation_result): string + { + if ($validation_result['is_valid']) { + return ''; + } + + $messages = []; + + if (!empty($validation_result['errors'])) { + $messages[] = 'Errors:'; + foreach ($validation_result['errors'] as $error) { + $messages[] = '• ' . $error; + } + } + + if (!empty($validation_result['warnings'])) { + $messages[] = 'Warnings:'; + foreach ($validation_result['warnings'] as $warning) { + $messages[] = '• ' . $warning; + } + } + + return implode("\n", $messages); + } + + /** + * Get validation statistics + */ + public function getValidationStats(array $validation_result): array + { + return [ + 'total_entries' => $validation_result['total_entries'] ?? 0, + 'valid_entries' => $validation_result['valid_entries'] ?? 0, + 'invalid_entries' => $validation_result['invalid_entries'] ?? 0, + 'error_count' => count($validation_result['errors'] ?? []), + 'warning_count' => count($validation_result['warnings'] ?? []), + 'info_count' => count($validation_result['info'] ?? []), + 'success_rate' => $validation_result['total_entries'] > 0 + ? round(($validation_result['valid_entries'] / $validation_result['total_entries']) * 100, 1) + : 0, + ]; + } +} \ No newline at end of file diff --git a/src/Services/InfoProviderSystem/Providers/LCSCProvider.php b/src/Services/InfoProviderSystem/Providers/LCSCProvider.php index 58df3b82..2d83fc7c 100755 --- a/src/Services/InfoProviderSystem/Providers/LCSCProvider.php +++ b/src/Services/InfoProviderSystem/Providers/LCSCProvider.php @@ -123,11 +123,11 @@ class LCSCProvider implements InfoProviderInterface */ private function queryByTerm(string $term): array { - $response = $this->lcscClient->request('GET', self::ENDPOINT_URL . "/search/global", [ + $response = $this->lcscClient->request('POST', self::ENDPOINT_URL . "/search/v2/global", [ 'headers' => [ 'Cookie' => new Cookie('currencyCode', $this->settings->currency) ], - 'query' => [ + 'json' => [ 'keyword' => $term, ], ]); @@ -165,6 +165,9 @@ class LCSCProvider implements InfoProviderInterface if ($field === null) { return null; } + // Replace "range" indicators with mathematical tilde symbols + // so they don't get rendered as strikethrough by Markdown + $field = preg_replace("/~/", "\u{223c}", $field); return strip_tags($field); } @@ -197,9 +200,6 @@ class LCSCProvider implements InfoProviderInterface $category = $product['parentCatalogName'] ?? null; if (isset($product['catalogName'])) { $category = ($category ?? '') . ' -> ' . $product['catalogName']; - - // Replace the / with a -> for better readability - $category = str_replace('/', ' -> ', $category); } return new PartDetailDTO( diff --git a/src/Services/InfoProviderSystem/Providers/PollinProvider.php b/src/Services/InfoProviderSystem/Providers/PollinProvider.php index 55fa335a..b74e0365 100644 --- a/src/Services/InfoProviderSystem/Providers/PollinProvider.php +++ b/src/Services/InfoProviderSystem/Providers/PollinProvider.php @@ -158,7 +158,8 @@ class PollinProvider implements InfoProviderInterface category: $this->parseCategory($dom), manufacturer: $dom->filter('meta[property="product:brand"]')->count() > 0 ? $dom->filter('meta[property="product:brand"]')->attr('content') : null, preview_image_url: $dom->filter('meta[property="og:image"]')->attr('content'), - manufacturing_status: $this->mapAvailability($dom->filter('link[itemprop="availability"]')->attr('href')), + //TODO: Find another way to determine the manufacturing status, as the itemprop="availability" is often is not existing anymore in the page + //manufacturing_status: $this->mapAvailability($dom->filter('link[itemprop="availability"]')->attr('href')), provider_url: $productPageUrl, notes: $this->parseNotes($dom), datasheets: $this->parseDatasheets($dom), diff --git a/src/Services/Tools/ExchangeRateUpdater.php b/src/Services/Tools/ExchangeRateUpdater.php index 7c14b16f..6eb7ec13 100644 --- a/src/Services/Tools/ExchangeRateUpdater.php +++ b/src/Services/Tools/ExchangeRateUpdater.php @@ -26,6 +26,8 @@ use App\Entity\PriceInformations\Currency; use App\Settings\SystemSettings\LocalizationSettings; use Brick\Math\BigDecimal; use Brick\Math\RoundingMode; +use Exchanger\Exception\UnsupportedCurrencyPairException; +use Exchanger\Exception\UnsupportedExchangeQueryException; use Swap\Swap; class ExchangeRateUpdater @@ -39,15 +41,21 @@ class ExchangeRateUpdater */ public function update(Currency $currency): Currency { - //Currency pairs are always in the format "BASE/QUOTE" - $rate = $this->swap->latest($this->localizationSettings->baseCurrency.'/'.$currency->getIsoCode()); - //The rate says how many quote units are worth one base unit - //So we need to invert it to get the exchange rate + try { + //Try it in the direction QUOTE/BASE first, as most providers provide rates in this direction + $rate = $this->swap->latest($currency->getIsoCode().'/'.$this->localizationSettings->baseCurrency); + $effective_rate = BigDecimal::of($rate->getValue()); + } catch (UnsupportedCurrencyPairException|UnsupportedExchangeQueryException $exception) { + //Otherwise try to get it inverse and calculate it ourselfes, from the format "BASE/QUOTE" + $rate = $this->swap->latest($this->localizationSettings->baseCurrency.'/'.$currency->getIsoCode()); + //The rate says how many quote units are worth one base unit + //So we need to invert it to get the exchange rate - $rate_bd = BigDecimal::of($rate->getValue()); - $rate_inverted = BigDecimal::one()->dividedBy($rate_bd, Currency::PRICE_SCALE, RoundingMode::HALF_UP); + $rate_bd = BigDecimal::of($rate->getValue()); + $effective_rate = BigDecimal::one()->dividedBy($rate_bd, Currency::PRICE_SCALE, RoundingMode::HALF_UP); + } - $currency->setExchangeRate($rate_inverted); + $currency->setExchangeRate($effective_rate); return $currency; } diff --git a/src/Services/UserSystem/VoterHelper.php b/src/Services/UserSystem/VoterHelper.php index 644351f4..d3c5368c 100644 --- a/src/Services/UserSystem/VoterHelper.php +++ b/src/Services/UserSystem/VoterHelper.php @@ -28,6 +28,9 @@ use App\Repository\UserRepository; use App\Security\ApiTokenAuthenticatedToken; use Doctrine\ORM\EntityManagerInterface; use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; +use Symfony\Component\Security\Core\Authorization\Voter\Vote; +use Symfony\Component\Security\Core\Authorization\Voter\Voter; +use Symfony\Contracts\Translation\TranslatorInterface; /** * @see \App\Tests\Services\UserSystem\VoterHelperTest @@ -35,10 +38,14 @@ use Symfony\Component\Security\Core\Authentication\Token\TokenInterface; final class VoterHelper { private readonly UserRepository $userRepository; + private readonly array $permissionStructure; - public function __construct(private readonly PermissionManager $permissionManager, private readonly EntityManagerInterface $entityManager) + public function __construct(private readonly PermissionManager $permissionManager, + private readonly TranslatorInterface $translator, + private readonly EntityManagerInterface $entityManager) { $this->userRepository = $this->entityManager->getRepository(User::class); + $this->permissionStructure = $this->permissionManager->getPermissionStructure(); } /** @@ -47,11 +54,16 @@ final class VoterHelper * @param TokenInterface $token The token to check * @param string $permission The permission to check * @param string $operation The operation to check + * @param Vote|null $vote The vote object to add reasons to (optional). If null, no reasons are added. * @return bool */ - public function isGranted(TokenInterface $token, string $permission, string $operation): bool + public function isGranted(TokenInterface $token, string $permission, string $operation, ?Vote $vote = null): bool { - return $this->isGrantedTrinary($token, $permission, $operation) ?? false; + $tmp = $this->isGrantedTrinary($token, $permission, $operation) ?? false; + if ($tmp === false) { + $this->addReason($vote, $permission, $operation); + } + return $tmp; } /** @@ -124,4 +136,17 @@ final class VoterHelper { return $this->permissionManager->isValidOperation($permission, $operation); } -} \ No newline at end of file + + public function addReason(?Vote $voter, string $permission, $operation): void + { + if ($voter !== null) { + $voter->addReason(sprintf("User does not have permission %s -> %s -> %s (%s.%s).", + $this->translator->trans('perm.group.'.($this->permissionStructure['perms'][$permission]['group'] ?? 'unknown') ), + $this->translator->trans($this->permissionStructure['perms'][$permission]['label'] ?? $permission), + $this->translator->trans($this->permissionStructure['perms'][$permission]['operations'][$operation]['label'] ?? $operation), + $permission, + $operation + )); + } + } +} diff --git a/src/Settings/BehaviorSettings/PartInfoSettings.php b/src/Settings/BehaviorSettings/PartInfoSettings.php index 4c44b9bb..f017c846 100644 --- a/src/Settings/BehaviorSettings/PartInfoSettings.php +++ b/src/Settings/BehaviorSettings/PartInfoSettings.php @@ -40,4 +40,10 @@ class PartInfoSettings #[SettingsParameter(label: new TM("settings.behavior.part_info.show_part_image_overlay"), description: new TM("settings.behavior.part_info.show_part_image_overlay.help"), envVar: "bool:SHOW_PART_IMAGE_OVERLAY", envVarMode: EnvVarMode::OVERWRITE)] public bool $showPartImageOverlay = true; -} \ No newline at end of file + + #[SettingsParameter(label: new TM("settings.behavior.part_info.extract_params_from_description"))] + public bool $extractParamsFromDescription = true; + + #[SettingsParameter(label: new TM("settings.behavior.part_info.extract_params_from_notes"))] + public bool $extractParamsFromNotes = true; +} diff --git a/src/Settings/BehaviorSettings/TableSettings.php b/src/Settings/BehaviorSettings/TableSettings.php index 7b4e7912..b6964876 100644 --- a/src/Settings/BehaviorSettings/TableSettings.php +++ b/src/Settings/BehaviorSettings/TableSettings.php @@ -70,6 +70,20 @@ class TableSettings PartTableColumns::CATEGORY, PartTableColumns::FOOTPRINT, PartTableColumns::MANUFACTURER, PartTableColumns::LOCATION, PartTableColumns::AMOUNT]; + #[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 + )] + #[Assert\Range(min: 1, max: 100)] + public int $previewImageMinWidth = 20; + + #[SettingsParameter(label: new TM("settings.behavior.table.preview_image_max_width"), + formOptions: ['attr' => ['min' => 1, 'max' => 100]], + envVar: "int:TABLE_IMAGE_PREVIEW_MAX_SIZE", envVarMode: EnvVarMode::OVERWRITE + )] + #[Assert\Range(min: 1, max: 100)] + #[Assert\GreaterThanOrEqual(propertyPath: 'previewImageMinWidth')] + public int $previewImageMaxWidth = 35; public static function mapPartsDefaultColumnsEnv(string $columns): array { @@ -87,4 +101,4 @@ class TableSettings return $ret; } -} \ No newline at end of file +} diff --git a/src/Settings/InfoProviderSystem/InfoProviderGeneralSettings.php b/src/Settings/InfoProviderSystem/InfoProviderGeneralSettings.php new file mode 100644 index 00000000..fac6aae9 --- /dev/null +++ b/src/Settings/InfoProviderSystem/InfoProviderGeneralSettings.php @@ -0,0 +1,45 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\InfoProviderSystem; + +use App\Form\InfoProviderSystem\ProviderSelectType; +use App\Settings\SettingsIcon; +use Jbtronics\SettingsBundle\ParameterTypes\ArrayType; +use Jbtronics\SettingsBundle\ParameterTypes\StringType; +use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; +use Symfony\Component\Translation\TranslatableMessage as TM; + +#[Settings(label: new TM("settings.ips.general"))] +#[SettingsIcon("fa-magnifying-glass")] +class InfoProviderGeneralSettings +{ + /** + * @var string[] + */ + #[SettingsParameter(type: ArrayType::class, label: new TM("settings.ips.default_providers"), + description: new TM("settings.ips.default_providers.help"), options: ['type' => StringType::class], + formType: ProviderSelectType::class, formOptions: ['input' => 'string', 'required' => false, 'empty_data' => []])] + public array $defaultSearchProviders = []; +} diff --git a/src/Settings/InfoProviderSystem/InfoProviderSettings.php b/src/Settings/InfoProviderSystem/InfoProviderSettings.php index 3c7159cb..c223bd88 100644 --- a/src/Settings/InfoProviderSystem/InfoProviderSettings.php +++ b/src/Settings/InfoProviderSystem/InfoProviderSettings.php @@ -25,6 +25,7 @@ namespace App\Settings\InfoProviderSystem; use Jbtronics\SettingsBundle\Settings\EmbeddedSettings; use Jbtronics\SettingsBundle\Settings\Settings; +use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Jbtronics\SettingsBundle\Settings\SettingsTrait; #[Settings()] @@ -32,6 +33,9 @@ class InfoProviderSettings { use SettingsTrait; + #[EmbeddedSettings] + public ?InfoProviderGeneralSettings $general = null; + #[EmbeddedSettings] public ?DigikeySettings $digikey = null; @@ -58,4 +62,4 @@ class InfoProviderSettings #[EmbeddedSettings] public ?PollinSettings $pollin = null; -} \ No newline at end of file +} diff --git a/src/Settings/SystemSettings/CustomizationSettings.php b/src/Settings/SystemSettings/CustomizationSettings.php index d7e92a51..623e6187 100644 --- a/src/Settings/SystemSettings/CustomizationSettings.php +++ b/src/Settings/SystemSettings/CustomizationSettings.php @@ -28,10 +28,13 @@ use App\Form\Type\ThemeChoiceType; use App\Settings\SettingsIcon; use App\Validator\Constraints\ValidTheme; use Jbtronics\SettingsBundle\Metadata\EnvVarMode; +use Jbtronics\SettingsBundle\ParameterTypes\ArrayType; +use Jbtronics\SettingsBundle\ParameterTypes\EnumType; use Jbtronics\SettingsBundle\Settings\Settings; use Jbtronics\SettingsBundle\Settings\SettingsParameter; use Jbtronics\SettingsBundle\Settings\SettingsTrait; use Symfony\Component\Translation\TranslatableMessage as TM; +use Symfony\Component\Validator\Constraints as Assert; #[Settings(name: "customization", label: new TM("settings.system.customization"))] #[SettingsIcon("fa-paint-roller")] @@ -46,6 +49,13 @@ class CustomizationSettings )] public string $instanceName = "Part-DB"; + #[SettingsParameter( + label: new TM("settings.system.customization.theme"), + formType: ThemeChoiceType::class, formOptions: ['placeholder' => false] + )] + #[ValidTheme] + public string $theme = 'bootstrap'; + #[SettingsParameter( label: new TM("settings.system.customization.banner"), formType: RichTextEditorType::class, formOptions: ['mode' => 'markdown-full'], @@ -53,10 +63,22 @@ class CustomizationSettings )] public ?string $banner = null; - #[SettingsParameter( - label: new TM("settings.system.customization.theme"), - formType: ThemeChoiceType::class, formOptions: ['placeholder' => false] + /** + * @var HomepageItems[] The items to show in the sidebar. + */ + #[SettingsParameter(ArrayType::class, + label: new TM("settings.behavior.hompepage.items"), + description: new TM("settings.behavior.homepage.items.help"), + options: ['type' => EnumType::class, 'options' => ['class' => HomepageItems::class]], + formType: \Symfony\Component\Form\Extension\Core\Type\EnumType::class, + formOptions: ['class' => HomepageItems::class, 'multiple' => true, 'ordered' => true] )] - #[ValidTheme] - public string $theme = 'bootstrap'; + #[Assert\NotBlank()] + #[Assert\Unique()] + public array $homepageitems = [HomepageItems::SEARCH, HomepageItems::BANNER, HomepageItems::FIRST_STEPS, HomepageItems::LICENSE, HomepageItems::LAST_ACTIVITY]; + + #[SettingsParameter( + label: new TM("settings.system.customization.showVersionOnHomepage") + )] + public bool $showVersionOnHomepage = true; } diff --git a/src/Settings/SystemSettings/HomepageItems.php b/src/Settings/SystemSettings/HomepageItems.php new file mode 100644 index 00000000..7366dfa2 --- /dev/null +++ b/src/Settings/SystemSettings/HomepageItems.php @@ -0,0 +1,51 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Settings\SystemSettings; + +use Symfony\Contracts\Translation\TranslatableInterface; +use Symfony\Contracts\Translation\TranslatorInterface; + +use function Symfony\Component\Translation\t; + +enum HomepageItems: string implements TranslatableInterface +{ + case SEARCH = 'search'; + case BANNER = 'banner'; + case LICENSE = 'license'; + case FIRST_STEPS = 'first_steps'; + case LAST_ACTIVITY = 'last_activity'; + + public function trans(TranslatorInterface $translator, ?string $locale = null): string + { + $key = match($this) { + self::SEARCH => 'search.placeholder', + self::BANNER => 'settings.system.customization.banner', + self::LICENSE => 'homepage.license', + self::FIRST_STEPS => 'homepage.first_steps.title', + self::LAST_ACTIVITY => 'homepage.last_activity', + }; + + return $translator->trans($key, locale: $locale); + } +} diff --git a/symfony.lock b/symfony.lock index d301c269..7c136b4b 100644 --- a/symfony.lock +++ b/symfony.lock @@ -133,15 +133,6 @@ "ekino/phpstan-banned-code": { "version": "v0.3.1" }, - "florianv/exchanger": { - "version": "1.4.1" - }, - "florianv/swap": { - "version": "3.5.0" - }, - "florianv/swap-bundle": { - "version": "5.0.x-dev" - }, "gregwar/captcha": { "version": "v1.1.7" }, @@ -254,6 +245,9 @@ "./config/packages/datatables.yaml" ] }, + "part-db/swap-bundle": { + "version": "v6.0.0" + }, "php-http/discovery": { "version": "1.18", "recipe": { diff --git a/templates/base.html.twig b/templates/base.html.twig index 48e45ab0..ee79549b 100644 --- a/templates/base.html.twig +++ b/templates/base.html.twig @@ -53,6 +53,14 @@ {% endif %} {{ encore_entry_link_tags('app') }} + + {% set table_settings = settings_instance('table') %} + {% endblock %} {% block javascripts %} diff --git a/templates/bundles/TwigBundle/Exception/error403.html.twig b/templates/bundles/TwigBundle/Exception/error403.html.twig index f5987179..334670fc 100644 --- a/templates/bundles/TwigBundle/Exception/error403.html.twig +++ b/templates/bundles/TwigBundle/Exception/error403.html.twig @@ -1,6 +1,9 @@ {% extends "bundles/TwigBundle/Exception/error.html.twig" %} {% block status_comment %} - Nice try! But you are not allowed to do this! + Nice try! But you are not allowed to do this!
+ {{ exception.message }}
If you think you should have access to this ressource, contact the adminstrator. -{% endblock %} \ No newline at end of file + + +{% endblock %} diff --git a/templates/components/datatables.macro.html.twig b/templates/components/datatables.macro.html.twig index 5ce0f23f..009f815e 100644 --- a/templates/components/datatables.macro.html.twig +++ b/templates/components/datatables.macro.html.twig @@ -29,7 +29,7 @@ -
+
{# #}
@@ -95,4 +95,4 @@
-{% endmacro %} \ No newline at end of file +{% endmacro %} diff --git a/templates/homepage.html.twig b/templates/homepage.html.twig index 3f820a53..6e7aa360 100644 --- a/templates/homepage.html.twig +++ b/templates/homepage.html.twig @@ -4,26 +4,23 @@ {% import "components/search.macro.html.twig" as search %} {% import "vars.macro.twig" as vars %} -{% block content %} - - {% if is_granted('@system.show_updates') %} - {{ nv.new_version_alert(new_version_available, new_version, new_version_url) }} - {% endif %} - +{% block item_search %} {% if is_granted('@parts.read') %} {{ search.search_form("standalone") }} -
{% endif %} +{% endblock %} - +{% block item_banner %}

{{ vars.partdb_title() }}

-

- {% trans %}version.caption{% endtrans %}: {{ shivas_app_version }} - {% if git_branch is not empty or git_commit is not empty %} - ({{ git_branch ?? '' }}/{{ git_commit ?? '' }}) - {% endif %} -

+ {% if settings_instance('customization').showVersionOnHomepage %} +

+ {% trans %}version.caption{% endtrans %}: {{ shivas_app_version }} + {% if git_branch is not empty or git_commit is not empty %} + ({{ git_branch ?? '' }}/{{ git_commit ?? '' }}) + {% endif %} +

+ {% endif %} {% if banner is not empty %}
@@ -31,9 +28,11 @@
{% endif %}
+{% endblock %} +{% block item_first_steps %} {% if show_first_steps %} -
+

{% trans %}homepage.first_steps.title{% endtrans %}

@@ -51,8 +50,10 @@
{% endif %} +{% endblock %} -
+{% block item_license %} +

{% trans %}homepage.license{% endtrans %}

@@ -68,9 +69,11 @@ {% trans %}homepage.forum.caption{% endtrans %}: {% trans with {'%href%': 'https://github.com/Part-DB/Part-DB-server/discussions'}%}homepage.forum.text{% endtrans %}
+{% endblock %} +{% block item_last_activity %} {% if datatable is not null %} -
+
{% trans %}homepage.last_activity{% endtrans %}
{% import "components/history_log_macros.html.twig" as log %} @@ -78,4 +81,23 @@
{% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} + +{% block content %} + + {% if is_granted('@system.show_updates') %} + {{ nv.new_version_alert(new_version_available, new_version, new_version_url) }} + {% endif %} + + {% for item in settings_instance('customization').homepageitems %} + {% if block('item_' ~ item.value) is defined %} + {{ block('item_' ~ item.value) }} +
+ {% else %} + + {% endif %} + {% endfor %} + +{% endblock %} diff --git a/templates/info_providers/providers.macro.html.twig b/templates/info_providers/providers.macro.html.twig index 827a95fd..bf530ebd 100644 --- a/templates/info_providers/providers.macro.html.twig +++ b/templates/info_providers/providers.macro.html.twig @@ -23,7 +23,7 @@
{% if provider.providerInfo.settings_class is defined %} - {% endif %} diff --git a/templates/label_system/dialog.html.twig b/templates/label_system/dialog.html.twig index 50db99e7..037b549e 100644 --- a/templates/label_system/dialog.html.twig +++ b/templates/label_system/dialog.html.twig @@ -100,6 +100,10 @@
{% endif %} + {% if form.update_profile is defined %} + {{ form_row(form.update_profile) }} + {% endif %} +
@@ -133,4 +137,4 @@
{% endif %} -{% endblock %} \ No newline at end of file +{% endblock %} diff --git a/templates/projects/_bom_validation_results.html.twig b/templates/projects/_bom_validation_results.html.twig new file mode 100644 index 00000000..68f1b827 --- /dev/null +++ b/templates/projects/_bom_validation_results.html.twig @@ -0,0 +1,186 @@ +{# BOM Validation Results Component #} +{# + Usage: + {% include 'projects/_bom_validation_results.html.twig' with { + validation_result: validation_result, + show_summary: true, + show_details: true + } %} +#} + +{% if validation_result is defined and validation_result is not empty %} + {% set stats = validation_result %} + + {# Validation Summary #} + {% if show_summary is defined and show_summary %} +
+
+
+
+
+ + {% trans %}project.bom_import.validation.summary{% endtrans %} +
+
+
+
+
+
+
{{ stats.total_entries }}
+ {% trans %}project.bom_import.validation.total_entries{% endtrans %} +
+
+
+
+
{{ stats.valid_entries }}
+ {% trans %}project.bom_import.validation.valid_entries{% endtrans %} +
+
+
+
+
{{ stats.invalid_entries }}
+ {% trans %}project.bom_import.validation.invalid_entries{% endtrans %} +
+
+
+
+
+ {% if stats.total_entries > 0 %} + {{ ((stats.valid_entries / stats.total_entries) * 100) | round(1) }}% + {% else %} + 0% + {% endif %} +
+ {% trans %}project.bom_import.validation.success_rate{% endtrans %} +
+
+
+
+
+
+
+ {% endif %} + + {# Validation Messages #} + {% if validation_result.errors is defined and validation_result.errors is not empty %} +
+

{% trans %}project.bom_import.validation.errors.title{% endtrans %}

+

{% trans %}project.bom_import.validation.errors.description{% endtrans %}

+
    + {% for error in validation_result.errors %} +
  • {{ error|raw }}
  • + {% endfor %} +
+
+ {% endif %} + + {% if validation_result.warnings is defined and validation_result.warnings is not empty %} +
+

{% trans %}project.bom_import.validation.warnings.title{% endtrans %}

+

{% trans %}project.bom_import.validation.warnings.description{% endtrans %}

+
    + {% for warning in validation_result.warnings %} +
  • {{ warning|raw }}
  • + {% endfor %} +
+
+ {% endif %} + + {% if validation_result.info is defined and validation_result.info is not empty %} +
+

{% trans %}project.bom_import.validation.info.title{% endtrans %}

+
    + {% for info in validation_result.info %} +
  • {{ info|raw }}
  • + {% endfor %} +
+
+ {% endif %} + + {# Detailed Line-by-Line Results #} + {% if show_details is defined and show_details and validation_result.line_results is defined %} +
+
+
+ + {% trans %}project.bom_import.validation.details.title{% endtrans %} +
+
+
+
+ + + + + + + + + + {% for line_result in validation_result.line_results %} + + + + + + {% endfor %} + +
{% trans %}project.bom_import.validation.details.line{% endtrans %}{% trans %}project.bom_import.validation.details.status{% endtrans %}{% trans %}project.bom_import.validation.details.messages{% endtrans %}
+ {{ line_result.line_number }} + + {% if line_result.is_valid %} + + + {% trans %}project.bom_import.validation.details.valid{% endtrans %} + + {% else %} + + + {% trans %}project.bom_import.validation.details.invalid{% endtrans %} + + {% endif %} + + {% if line_result.errors is not empty %} +
+ {% for error in line_result.errors %} +
{{ error|raw }}
+ {% endfor %} +
+ {% endif %} + {% if line_result.warnings is not empty %} +
+ {% for warning in line_result.warnings %} +
{{ warning|raw }}
+ {% endfor %} +
+ {% endif %} + {% if line_result.info is not empty %} +
+ {% for info in line_result.info %} +
{{ info|raw }}
+ {% endfor %} +
+ {% endif %} +
+
+
+
+ {% endif %} + + {# Action Buttons #} + {% if validation_result.is_valid is defined %} +
+ {% if validation_result.is_valid %} +
+ + {% trans %}project.bom_import.validation.all_valid{% endtrans %} +
+ {% else %} +
+ + {% trans %}project.bom_import.validation.fix_errors{% endtrans %} +
+ {% endif %} +
+ {% endif %} +{% endif %} \ No newline at end of file diff --git a/templates/projects/import_bom_map_fields.html.twig b/templates/projects/import_bom_map_fields.html.twig new file mode 100644 index 00000000..4e45eb08 --- /dev/null +++ b/templates/projects/import_bom_map_fields.html.twig @@ -0,0 +1,204 @@ +{% extends "main_card.html.twig" %} + +{% block title %}{% trans %}project.bom_import.map_fields{% endtrans %}{% endblock %} + +{% block card_title %} + + {% trans %}project.bom_import.map_fields{% endtrans %}{% if project %}: {{ project.name }}{% endif %} +{% endblock %} + +{% block card_content %} + {% if validation_result is defined %} + {% include 'projects/_bom_validation_results.html.twig' with { + validation_result: validation_result, + show_summary: true, + show_details: false + } %} + {% endif %} + +
+
+
+ + {% trans %}project.bom_import.map_fields.help{% endtrans %} +
+
+ + {% trans %}project.bom_import.field_mapping.priority_note{% endtrans %} +
+
+
+ + {{ form_start(form) }} + +
+
+ {{ form_row(form.delimiter) }} +
+
+ +
+
+
+ + {% trans %}project.bom_import.field_mapping.title{% endtrans %} +
+
+
+
+ + + + + + + + + + + {% for field in detected_fields %} + + + + + + + {% endfor %} + +
{% trans %}project.bom_import.field_mapping.csv_field{% endtrans %}{% trans %}project.bom_import.field_mapping.maps_to{% endtrans %}{% trans %}project.bom_import.field_mapping.suggestion{% endtrans %}{% trans %}project.bom_import.field_mapping.priority{% endtrans %}
+ {{ field }} + + {{ form_widget(form['mapping_' ~ field_name_mapping[field]], { + 'attr': { + 'class': 'form-select field-mapping-select', + 'data-field': field + } + }) }} + + {% if suggested_mapping[field] is defined %} + + + {{ suggested_mapping[field] }} + + {% else %} + + + {% trans %}project.bom_import.field_mapping.no_suggestion{% endtrans %} + + {% endif %} + + +
+
+ +
+
{% trans %}project.bom_import.field_mapping.summary{% endtrans %}:
+
+ + {% trans %}project.bom_import.field_mapping.select_to_see_summary{% endtrans %} +
+
+
+
+ +
+ {{ form_widget(form.submit, { + 'attr': { + 'class': 'btn btn-primary' + } + }) }} + + + {% trans %}common.back{% endtrans %} + +
+ + {{ form_end(form) }} + + +{% endblock %} diff --git a/tests/API/Endpoints/CurrencyEndpointTest.php b/tests/API/Endpoints/CurrencyEndpointTest.php index 78434ea3..a463daeb 100644 --- a/tests/API/Endpoints/CurrencyEndpointTest.php +++ b/tests/API/Endpoints/CurrencyEndpointTest.php @@ -36,7 +36,7 @@ class CurrencyEndpointTest extends CrudEndpointTestCase { $this->_testGetCollection(); self::assertJsonContains([ - 'hydra:totalItems' => 0, + 'hydra:totalItems' => 4, //The 4 currencies from our fixtures ]); } @@ -45,7 +45,7 @@ class CurrencyEndpointTest extends CrudEndpointTestCase { $this->_testPostItem([ 'name' => 'Test API', - 'iso_code' => 'USD', + 'iso_code' => 'CAD', ]); } @@ -61,4 +61,4 @@ class CurrencyEndpointTest extends CrudEndpointTestCase { $this->_testDeleteItem(5); }*/ -} \ No newline at end of file +} diff --git a/tests/Controller/AdminPages/CurrencyController.php b/tests/Controller/AdminPages/CurrencyController.php new file mode 100644 index 00000000..21f94a29 --- /dev/null +++ b/tests/Controller/AdminPages/CurrencyController.php @@ -0,0 +1,35 @@ +. + */ + +declare(strict_types=1); + +namespace App\Tests\Controller\AdminPages; + +use App\Entity\PriceInformations\Currency; +use PHPUnit\Framework\Attributes\Group; +use App\Entity\Parts\Manufacturer; + +#[Group('slow')] +#[Group('DB')] +class CurrencyController extends AbstractAdminController +{ + protected static string $base_path = '/en/currency'; + protected static string $entity_class = Currency::class; +} diff --git a/tests/Services/ImportExportSystem/BOMImporterTest.php b/tests/Services/ImportExportSystem/BOMImporterTest.php index b9aba1d4..52c633d0 100644 --- a/tests/Services/ImportExportSystem/BOMImporterTest.php +++ b/tests/Services/ImportExportSystem/BOMImporterTest.php @@ -22,9 +22,12 @@ declare(strict_types=1); */ namespace App\Tests\Services\ImportExportSystem; +use App\Entity\Parts\Part; +use App\Entity\Parts\Supplier; use App\Entity\ProjectSystem\Project; use App\Entity\ProjectSystem\ProjectBOMEntry; use App\Services\ImportExportSystem\BOMImporter; +use Doctrine\ORM\EntityManagerInterface; use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; use Symfony\Component\HttpFoundation\File\File; @@ -36,11 +39,17 @@ class BOMImporterTest extends WebTestCase */ protected $service; + /** + * @var EntityManagerInterface + */ + protected $entityManager; + protected function setUp(): void { //Get a service instance. self::bootKernel(); $this->service = self::getContainer()->get(BOMImporter::class); + $this->entityManager = self::getContainer()->get(EntityManagerInterface::class); } public function testImportFileIntoProject(): void @@ -119,4 +128,489 @@ class BOMImporterTest extends WebTestCase $this->service->stringToBOMEntries($input, ['type' => 'kicad_pcbnew']); } + + public function testDetectFields(): void + { + $input = <<service->detectFields($input); + + $this->assertIsArray($fields); + $this->assertCount(8, $fields); + $this->assertContains('Reference', $fields); + $this->assertContains('Value', $fields); + $this->assertContains('Footprint', $fields); + $this->assertContains('Quantity', $fields); + $this->assertContains('MPN', $fields); + $this->assertContains('Manufacturer', $fields); + $this->assertContains('LCSC SPN', $fields); + $this->assertContains('Mouser SPN', $fields); + } + + public function testDetectFieldsWithQuotes(): void + { + $input = <<service->detectFields($input); + + $this->assertIsArray($fields); + $this->assertCount(8, $fields); + $this->assertEquals('Reference', $fields[0]); + $this->assertEquals('Value', $fields[1]); + } + + public function testDetectFieldsWithSemicolon(): void + { + $input = <<service->detectFields($input, ';'); + + $this->assertIsArray($fields); + $this->assertCount(8, $fields); + $this->assertEquals('Reference', $fields[0]); + $this->assertEquals('Value', $fields[1]); + } + + public function testGetAvailableFieldTargets(): void + { + $targets = $this->service->getAvailableFieldTargets(); + + $this->assertIsArray($targets); + $this->assertArrayHasKey('Designator', $targets); + $this->assertArrayHasKey('Quantity', $targets); + $this->assertArrayHasKey('Value', $targets); + $this->assertArrayHasKey('Package', $targets); + $this->assertArrayHasKey('MPN', $targets); + $this->assertArrayHasKey('Manufacturer', $targets); + $this->assertArrayHasKey('Part-DB ID', $targets); + $this->assertArrayHasKey('Comment', $targets); + + // Check structure of a target + $this->assertArrayHasKey('label', $targets['Designator']); + $this->assertArrayHasKey('description', $targets['Designator']); + $this->assertArrayHasKey('required', $targets['Designator']); + $this->assertArrayHasKey('multiple', $targets['Designator']); + + $this->assertTrue($targets['Designator']['required']); + $this->assertTrue($targets['Quantity']['required']); + $this->assertFalse($targets['Value']['required']); + } + + public function testGetAvailableFieldTargetsWithSuppliers(): void + { + // Create test suppliers + $supplier1 = new Supplier(); + $supplier1->setName('LCSC'); + $supplier2 = new Supplier(); + $supplier2->setName('Mouser'); + + $this->entityManager->persist($supplier1); + $this->entityManager->persist($supplier2); + $this->entityManager->flush(); + + $targets = $this->service->getAvailableFieldTargets(); + + $this->assertArrayHasKey('LCSC SPN', $targets); + $this->assertArrayHasKey('Mouser SPN', $targets); + + $this->assertEquals('LCSC SPN', $targets['LCSC SPN']['label']); + $this->assertEquals('Mouser SPN', $targets['Mouser SPN']['label']); + $this->assertFalse($targets['LCSC SPN']['required']); + $this->assertTrue($targets['LCSC SPN']['multiple']); + + // Clean up + $this->entityManager->remove($supplier1); + $this->entityManager->remove($supplier2); + $this->entityManager->flush(); + } + + public function testGetSuggestedFieldMapping(): void + { + $detected_fields = [ + 'Reference', + 'Value', + 'Footprint', + 'Quantity', + 'MPN', + 'Manufacturer', + 'LCSC', + 'Mouser', + 'Part-DB ID', + 'Comment' + ]; + + $suggestions = $this->service->getSuggestedFieldMapping($detected_fields); + + $this->assertIsArray($suggestions); + $this->assertEquals('Designator', $suggestions['Reference']); + $this->assertEquals('Value', $suggestions['Value']); + $this->assertEquals('Package', $suggestions['Footprint']); + $this->assertEquals('Quantity', $suggestions['Quantity']); + $this->assertEquals('MPN', $suggestions['MPN']); + $this->assertEquals('Manufacturer', $suggestions['Manufacturer']); + $this->assertEquals('Part-DB ID', $suggestions['Part-DB ID']); + $this->assertEquals('Comment', $suggestions['Comment']); + } + + public function testGetSuggestedFieldMappingWithSuppliers(): void + { + // Create test suppliers + $supplier1 = new Supplier(); + $supplier1->setName('LCSC'); + $supplier2 = new Supplier(); + $supplier2->setName('Mouser'); + + $this->entityManager->persist($supplier1); + $this->entityManager->persist($supplier2); + $this->entityManager->flush(); + + $detected_fields = [ + 'Reference', + 'LCSC', + 'Mouser', + 'lcsc_part', + 'mouser_spn' + ]; + + $suggestions = $this->service->getSuggestedFieldMapping($detected_fields); + + $this->assertIsArray($suggestions); + $this->assertEquals('Designator', $suggestions['Reference']); + // Note: The exact mapping depends on the pattern matching logic + // We just check that supplier fields are mapped to something + $this->assertArrayHasKey('LCSC', $suggestions); + $this->assertArrayHasKey('Mouser', $suggestions); + $this->assertArrayHasKey('lcsc_part', $suggestions); + $this->assertArrayHasKey('mouser_spn', $suggestions); + + // Clean up + $this->entityManager->remove($supplier1); + $this->entityManager->remove($supplier2); + $this->entityManager->flush(); + } + + public function testValidateFieldMappingValid(): void + { + $field_mapping = [ + 'Reference' => 'Designator', + 'Quantity' => 'Quantity', + 'Value' => 'Value' + ]; + + $detected_fields = ['Reference', 'Quantity', 'Value', 'MPN']; + + $result = $this->service->validateFieldMapping($field_mapping, $detected_fields); + + $this->assertIsArray($result); + $this->assertArrayHasKey('errors', $result); + $this->assertArrayHasKey('warnings', $result); + $this->assertArrayHasKey('is_valid', $result); + + $this->assertTrue($result['is_valid']); + $this->assertEmpty($result['errors']); + $this->assertNotEmpty($result['warnings']); // Should warn about unmapped MPN + } + + public function testValidateFieldMappingMissingRequired(): void + { + $field_mapping = [ + 'Value' => 'Value', + 'MPN' => 'MPN' + ]; + + $detected_fields = ['Value', 'MPN']; + + $result = $this->service->validateFieldMapping($field_mapping, $detected_fields); + + $this->assertFalse($result['is_valid']); + $this->assertNotEmpty($result['errors']); + $this->assertContains("Required field 'Designator' is not mapped from any CSV column.", $result['errors']); + $this->assertContains("Required field 'Quantity' is not mapped from any CSV column.", $result['errors']); + } + + public function testValidateFieldMappingInvalidTarget(): void + { + $field_mapping = [ + 'Reference' => 'Designator', + 'Quantity' => 'Quantity', + 'Value' => 'InvalidTarget' + ]; + + $detected_fields = ['Reference', 'Quantity', 'Value']; + + $result = $this->service->validateFieldMapping($field_mapping, $detected_fields); + + $this->assertFalse($result['is_valid']); + $this->assertNotEmpty($result['errors']); + $this->assertContains("Invalid target field 'InvalidTarget' for CSV field 'Value'.", $result['errors']); + } + + public function testStringToBOMEntriesKiCADSchematic(): void + { + $input = << 'Designator', + 'Value' => 'Value', + 'Footprint' => 'Package', + 'Quantity' => 'Quantity', + 'MPN' => 'MPN', + 'Manufacturer' => 'Manufacturer', + 'LCSC SPN' => 'LCSC SPN', + 'Mouser SPN' => 'Mouser SPN' + ]; + + $bom_entries = $this->service->stringToBOMEntries($input, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'delimiter' => ',' + ]); + + $this->assertContainsOnlyInstancesOf(ProjectBOMEntry::class, $bom_entries); + $this->assertCount(2, $bom_entries); + + // Check first entry + $this->assertEquals('R1,R2', $bom_entries[0]->getMountnames()); + $this->assertEquals(2.0, $bom_entries[0]->getQuantity()); + $this->assertEquals('CRCW080510K0FKEA (R_0805_2012Metric)', $bom_entries[0]->getName()); + $this->assertStringContainsString('Value: 10k', $bom_entries[0]->getComment()); + $this->assertStringContainsString('MPN: CRCW080510K0FKEA', $bom_entries[0]->getComment()); + $this->assertStringContainsString('Manf: Vishay', $bom_entries[0]->getComment()); + + // Check second entry + $this->assertEquals('C1', $bom_entries[1]->getMountnames()); + $this->assertEquals(1.0, $bom_entries[1]->getQuantity()); + } + + public function testStringToBOMEntriesKiCADSchematicWithPriority(): void + { + $input = << 'Designator', + 'Value' => 'Value', + 'MPN1' => 'MPN', + 'MPN2' => 'MPN', + 'Quantity' => 'Quantity' + ]; + + $field_priorities = [ + 'MPN1' => 1, + 'MPN2' => 2 + ]; + + $bom_entries = $this->service->stringToBOMEntries($input, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'field_priorities' => $field_priorities, + 'delimiter' => ',' + ]); + + $this->assertContainsOnlyInstancesOf(ProjectBOMEntry::class, $bom_entries); + $this->assertCount(2, $bom_entries); + + // First entry should use MPN1 (higher priority) + $this->assertEquals('CRCW080510K0FKEA', $bom_entries[0]->getName()); + + // Second entry should use MPN2 (MPN1 is empty) + $this->assertEquals('CL21A104KOCLRNC', $bom_entries[1]->getName()); + } + + public function testStringToBOMEntriesKiCADSchematicWithPartDBID(): void + { + // Create a test part with required fields + $part = new Part(); + $part->setName('Test Part'); + $part->setCategory($this->getDefaultCategory($this->entityManager)); + $this->entityManager->persist($part); + $this->entityManager->flush(); + + $input = <<getID()}","2" + CSV; + + $field_mapping = [ + 'Reference' => 'Designator', + 'Value' => 'Value', + 'Part-DB ID' => 'Part-DB ID', + 'Quantity' => 'Quantity' + ]; + + $bom_entries = $this->service->stringToBOMEntries($input, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'delimiter' => ',' + ]); + + $this->assertContainsOnlyInstancesOf(ProjectBOMEntry::class, $bom_entries); + $this->assertCount(1, $bom_entries); + + $this->assertEquals('Test Part', $bom_entries[0]->getName()); + $this->assertSame($part, $bom_entries[0]->getPart()); + $this->assertStringContainsString("Part-DB ID: {$part->getID()}", $bom_entries[0]->getComment()); + + // Clean up + $this->entityManager->remove($part); + $this->entityManager->flush(); + } + + public function testStringToBOMEntriesKiCADSchematicWithInvalidPartDBID(): void + { + $input = << 'Designator', + 'Value' => 'Value', + 'Part-DB ID' => 'Part-DB ID', + 'Quantity' => 'Quantity' + ]; + + $bom_entries = $this->service->stringToBOMEntries($input, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'delimiter' => ',' + ]); + + $this->assertContainsOnlyInstancesOf(ProjectBOMEntry::class, $bom_entries); + $this->assertCount(1, $bom_entries); + + $this->assertEquals('10k', $bom_entries[0]->getName()); // Should use Value as name + $this->assertNull($bom_entries[0]->getPart()); // Should not link to part + $this->assertStringContainsString("Part-DB ID: 99999 (NOT FOUND)", $bom_entries[0]->getComment()); + } + + public function testStringToBOMEntriesKiCADSchematicMergeDuplicates(): void + { + $input = << 'Designator', + 'Value' => 'Value', + 'MPN' => 'MPN', + 'Quantity' => 'Quantity' + ]; + + $bom_entries = $this->service->stringToBOMEntries($input, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'delimiter' => ',' + ]); + + $this->assertContainsOnlyInstancesOf(ProjectBOMEntry::class, $bom_entries); + $this->assertCount(1, $bom_entries); // Should merge into one entry + + $this->assertEquals('R1,R2', $bom_entries[0]->getMountnames()); + $this->assertEquals(2.0, $bom_entries[0]->getQuantity()); + $this->assertEquals('CRCW080510K0FKEA', $bom_entries[0]->getName()); + } + + public function testStringToBOMEntriesKiCADSchematicMissingRequired(): void + { + $input = << 'Value', + 'MPN' => 'MPN' + ]; + + $this->expectException(\UnexpectedValueException::class); + $this->expectExceptionMessage('Required field "Designator" is missing or empty'); + + $this->service->stringToBOMEntries($input, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'delimiter' => ',' + ]); + } + + public function testStringToBOMEntriesKiCADSchematicQuantityMismatch(): void + { + $input = << 'Designator', + 'Value' => 'Value', + 'Quantity' => 'Quantity' + ]; + + $this->expectException(\UnexpectedValueException::class); + $this->expectExceptionMessage('Mismatch between quantity and component references'); + + $this->service->stringToBOMEntries($input, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'delimiter' => ',' + ]); + } + + public function testStringToBOMEntriesKiCADSchematicWithBOM(): void + { + // Test with BOM (Byte Order Mark) + $input = "\xEF\xBB\xBF" . << 'Designator', + 'Value' => 'Value', + 'Quantity' => 'Quantity' + ]; + + $bom_entries = $this->service->stringToBOMEntries($input, [ + 'type' => 'kicad_schematic', + 'field_mapping' => $field_mapping, + 'delimiter' => ',' + ]); + + $this->assertContainsOnlyInstancesOf(ProjectBOMEntry::class, $bom_entries); + $this->assertCount(1, $bom_entries); + $this->assertEquals('R1,R2', $bom_entries[0]->getMountnames()); + } + + private function getDefaultCategory(EntityManagerInterface $entityManager) + { + // Get the first available category or create a default one + $categoryRepo = $entityManager->getRepository(\App\Entity\Parts\Category::class); + $categories = $categoryRepo->findAll(); + + if (empty($categories)) { + // Create a default category if none exists + $category = new \App\Entity\Parts\Category(); + $category->setName('Default Category'); + $entityManager->persist($category); + $entityManager->flush(); + return $category; + } + + return $categories[0]; + } } diff --git a/tests/Services/ImportExportSystem/BOMValidationServiceTest.php b/tests/Services/ImportExportSystem/BOMValidationServiceTest.php new file mode 100644 index 00000000..055db8b4 --- /dev/null +++ b/tests/Services/ImportExportSystem/BOMValidationServiceTest.php @@ -0,0 +1,349 @@ +. + */ +namespace App\Tests\Services\ImportExportSystem; + +use App\Entity\Parts\Part; +use App\Services\ImportExportSystem\BOMValidationService; +use Doctrine\ORM\EntityManagerInterface; +use PHPUnit\Framework\TestCase; +use Symfony\Bundle\FrameworkBundle\Test\WebTestCase; +use Symfony\Contracts\Translation\TranslatorInterface; + +/** + * @see \App\Services\ImportExportSystem\BOMValidationService + */ +class BOMValidationServiceTest extends WebTestCase +{ + private BOMValidationService $validationService; + private EntityManagerInterface $entityManager; + private TranslatorInterface $translator; + + protected function setUp(): void + { + self::bootKernel(); + $this->entityManager = self::getContainer()->get(EntityManagerInterface::class); + $this->translator = self::getContainer()->get(TranslatorInterface::class); + $this->validationService = new BOMValidationService($this->entityManager, $this->translator); + } + + public function testValidateBOMEntryWithValidData(): void + { + $entry = [ + 'Designator' => 'R1,C2,R3', + 'Quantity' => '3', + 'MPN' => 'RES-10K', + 'Package' => '0603', + 'Value' => '10k', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertTrue($result['is_valid']); + $this->assertEmpty($result['errors']); + $this->assertEquals(1, $result['line_number']); + } + + public function testValidateBOMEntryWithMissingRequiredFields(): void + { + $entry = [ + 'MPN' => 'RES-10K', + 'Package' => '0603', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertFalse($result['is_valid']); + $this->assertCount(2, $result['errors']); + $this->assertStringContainsString('Designator', (string) $result['errors'][0]); + $this->assertStringContainsString('Quantity', (string) $result['errors'][1]); + } + + public function testValidateBOMEntryWithQuantityMismatch(): void + { + $entry = [ + 'Designator' => 'R1,C2,R3,C4', + 'Quantity' => '3', + 'MPN' => 'RES-10K', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertFalse($result['is_valid']); + $this->assertCount(1, $result['errors']); + $this->assertStringContainsString('Mismatch between quantity and component references', (string) $result['errors'][0]); + } + + public function testValidateBOMEntryWithInvalidQuantity(): void + { + $entry = [ + 'Designator' => 'R1', + 'Quantity' => 'abc', + 'MPN' => 'RES-10K', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertFalse($result['is_valid']); + $this->assertGreaterThanOrEqual(1, count($result['errors'])); + $this->assertStringContainsString('not a valid number', implode(' ', array_map('strval', $result['errors']))); + } + + public function testValidateBOMEntryWithZeroQuantity(): void + { + $entry = [ + 'Designator' => 'R1', + 'Quantity' => '0', + 'MPN' => 'RES-10K', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertFalse($result['is_valid']); + $this->assertGreaterThanOrEqual(1, count($result['errors'])); + $this->assertStringContainsString('must be greater than 0', implode(' ', array_map('strval', $result['errors']))); + } + + public function testValidateBOMEntryWithDuplicateDesignators(): void + { + $entry = [ + 'Designator' => 'R1,R1,C2', + 'Quantity' => '3', + 'MPN' => 'RES-10K', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertFalse($result['is_valid']); + $this->assertCount(1, $result['errors']); + $this->assertStringContainsString('Duplicate component references', (string) $result['errors'][0]); + } + + public function testValidateBOMEntryWithInvalidDesignatorFormat(): void + { + $entry = [ + 'Designator' => 'R1,invalid,C2', + 'Quantity' => '3', + 'MPN' => 'RES-10K', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertTrue($result['is_valid']); // Warnings don't make it invalid + $this->assertCount(1, $result['warnings']); + $this->assertStringContainsString('unusual format', (string) $result['warnings'][0]); + } + + public function testValidateBOMEntryWithEmptyDesignator(): void + { + $entry = [ + 'Designator' => '', + 'Quantity' => '1', + 'MPN' => 'RES-10K', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertFalse($result['is_valid']); + $this->assertGreaterThanOrEqual(1, count($result['errors'])); + $this->assertStringContainsString('Required field "Designator" is missing or empty', implode(' ', array_map('strval', $result['errors']))); + } + + public function testValidateBOMEntryWithInvalidPartDBID(): void + { + $entry = [ + 'Designator' => 'R1', + 'Quantity' => '1', + 'MPN' => 'RES-10K', + 'Part-DB ID' => 'abc', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertFalse($result['is_valid']); + $this->assertGreaterThanOrEqual(1, count($result['errors'])); + $this->assertStringContainsString('not a valid number', implode(' ', array_map('strval', $result['errors']))); + } + + public function testValidateBOMEntryWithNonExistentPartDBID(): void + { + $entry = [ + 'Designator' => 'R1', + 'Quantity' => '1', + 'MPN' => 'RES-10K', + 'Part-DB ID' => '999999', // Use very high ID that doesn't exist + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertTrue($result['is_valid']); // Warnings don't make it invalid + $this->assertCount(1, $result['warnings']); + $this->assertStringContainsString('not found in database', (string) $result['warnings'][0]); + } + + public function testValidateBOMEntryWithNoComponentName(): void + { + $entry = [ + 'Designator' => 'R1', + 'Quantity' => '1', + 'Package' => '0603', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertTrue($result['is_valid']); // Warnings don't make it invalid + $this->assertCount(1, $result['warnings']); + $this->assertStringContainsString('No component name/designation', (string) $result['warnings'][0]); + } + + public function testValidateBOMEntryWithLongPackageName(): void + { + $entry = [ + 'Designator' => 'R1', + 'Quantity' => '1', + 'MPN' => 'RES-10K', + 'Package' => str_repeat('A', 150), // Very long package name + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertTrue($result['is_valid']); // Warnings don't make it invalid + $this->assertCount(1, $result['warnings']); + $this->assertStringContainsString('unusually long', (string) $result['warnings'][0]); + } + + public function testValidateBOMEntryWithLibraryPrefix(): void + { + $entry = [ + 'Designator' => 'R1', + 'Quantity' => '1', + 'MPN' => 'RES-10K', + 'Package' => 'Resistor_SMD:R_0603_1608Metric', + ]; + + $result = $this->validationService->validateBOMEntry($entry, 1); + + $this->assertTrue($result['is_valid']); + $this->assertCount(1, $result['info']); + $this->assertStringContainsString('library prefix', $result['info'][0]); + } + + public function testValidateBOMEntriesWithMultipleEntries(): void + { + $entries = [ + [ + 'Designator' => 'R1', + 'Quantity' => '1', + 'MPN' => 'RES-10K', + ], + [ + 'Designator' => 'C1,C2', + 'Quantity' => '2', + 'MPN' => 'CAP-100nF', + ], + ]; + + $result = $this->validationService->validateBOMEntries($entries); + + $this->assertTrue($result['is_valid']); + $this->assertEquals(2, $result['total_entries']); + $this->assertEquals(2, $result['valid_entries']); + $this->assertEquals(0, $result['invalid_entries']); + $this->assertCount(2, $result['line_results']); + } + + public function testValidateBOMEntriesWithMixedResults(): void + { + $entries = [ + [ + 'Designator' => 'R1', + 'Quantity' => '1', + 'MPN' => 'RES-10K', + ], + [ + 'Designator' => 'C1,C2', + 'Quantity' => '1', // Mismatch + 'MPN' => 'CAP-100nF', + ], + ]; + + $result = $this->validationService->validateBOMEntries($entries); + + $this->assertFalse($result['is_valid']); + $this->assertEquals(2, $result['total_entries']); + $this->assertEquals(1, $result['valid_entries']); + $this->assertEquals(1, $result['invalid_entries']); + $this->assertCount(1, $result['errors']); + } + + public function testGetValidationStats(): void + { + $validation_result = [ + 'total_entries' => 10, + 'valid_entries' => 8, + 'invalid_entries' => 2, + 'errors' => ['Error 1', 'Error 2'], + 'warnings' => ['Warning 1'], + 'info' => ['Info 1', 'Info 2'], + ]; + + $stats = $this->validationService->getValidationStats($validation_result); + + $this->assertEquals(10, $stats['total_entries']); + $this->assertEquals(8, $stats['valid_entries']); + $this->assertEquals(2, $stats['invalid_entries']); + $this->assertEquals(2, $stats['error_count']); + $this->assertEquals(1, $stats['warning_count']); + $this->assertEquals(2, $stats['info_count']); + $this->assertEquals(80.0, $stats['success_rate']); + } + + public function testGetErrorMessage(): void + { + $validation_result = [ + 'is_valid' => false, + 'errors' => ['Error 1', 'Error 2'], + 'warnings' => ['Warning 1'], + ]; + + $message = $this->validationService->getErrorMessage($validation_result); + + $this->assertStringContainsString('Errors:', $message); + $this->assertStringContainsString('• Error 1', $message); + $this->assertStringContainsString('• Error 2', $message); + $this->assertStringContainsString('Warnings:', $message); + $this->assertStringContainsString('• Warning 1', $message); + } + + public function testGetErrorMessageWithValidResult(): void + { + $validation_result = [ + 'is_valid' => true, + 'errors' => [], + 'warnings' => [], + ]; + + $message = $this->validationService->getErrorMessage($validation_result); + + $this->assertEquals('', $message); + } +} \ No newline at end of file diff --git a/tests/Services/LabelSystem/PlaceholderProviders/TimestampableElementProviderTest.php b/tests/Services/LabelSystem/PlaceholderProviders/TimestampableElementProviderTest.php index a72f06df..6aa152b9 100644 --- a/tests/Services/LabelSystem/PlaceholderProviders/TimestampableElementProviderTest.php +++ b/tests/Services/LabelSystem/PlaceholderProviders/TimestampableElementProviderTest.php @@ -60,26 +60,29 @@ class TimestampableElementProviderTest extends WebTestCase protected function setUp(): void { self::bootKernel(); - \Locale::setDefault('en'); + \Locale::setDefault('en_US'); $this->service = self::getContainer()->get(TimestampableElementProvider::class); - $this->target = new class() implements TimeStampableInterface { + $this->target = new class () implements TimeStampableInterface { public function getLastModified(): ?DateTime { - return new \DateTime('2000-01-01'); + return new DateTime('2000-01-01'); } public function getAddedDate(): ?DateTime { - return new \DateTime('2000-01-01'); + return new DateTime('2000-01-01'); } }; } public static function dataProvider(): \Iterator { - \Locale::setDefault('en'); - yield ['1/1/00, 12:00 AM', '[[LAST_MODIFIED]]']; - yield ['1/1/00, 12:00 AM', '[[CREATION_DATE]]']; + \Locale::setDefault('en_US'); + // Use IntlDateFormatter like the actual service does + $formatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::SHORT, \IntlDateFormatter::SHORT); + $expectedFormat = $formatter->format(new DateTime('2000-01-01')); + yield [$expectedFormat, '[[LAST_MODIFIED]]']; + yield [$expectedFormat, '[[CREATION_DATE]]']; } #[DataProvider('dataProvider')] @@ -87,4 +90,4 @@ class TimestampableElementProviderTest extends WebTestCase { $this->assertSame($expected, $this->service->replace($placeholder, $this->target)); } -} +} \ No newline at end of file diff --git a/translations/messages.cs.xlf b/translations/messages.cs.xlf index c70ad2af..1f234450 100644 --- a/translations/messages.cs.xlf +++ b/translations/messages.cs.xlf @@ -580,7 +580,7 @@ storelocation.new - Nové místo skladování + Nové umístění @@ -913,7 +913,7 @@ Související prvky budou přesunuty nahoru. edit.log_comment - Změnit komentář + Komentář ke změně @@ -2502,7 +2502,7 @@ Související prvky budou přesunuty nahoru. part.needs_review.badge - Potřeba revize + Vyžaduje kontrolu @@ -4019,7 +4019,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn search.regexmatching - RegEx. shoda + Reg.Ex. shoda @@ -4858,7 +4858,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn part.table.needsReview - Potřeba revize + Vyžaduje kontrolu @@ -5662,7 +5662,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn part.edit.needs_review - Potřeba revize + Vyžaduje kontrolu @@ -6357,7 +6357,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn user.theme.label - Téma + Vzhled @@ -6368,7 +6368,7 @@ Pokud jste to provedli nesprávně nebo pokud počítač již není důvěryhodn user_settings.theme.placeholder - Serverové téma + Vzhled pro celý server @@ -8551,16 +8551,6 @@ Element 3 Authenticator app - - - obsolete - obsolete - - - Login successful - Přihlášení bylo úspěšné - - obsolete @@ -8686,15 +8676,6 @@ Element 3 Bezpečnostní klíč byl úspěšně přidán. - - - obsolete - - - Username - Uživatelské jméno - - obsolete @@ -9010,7 +8991,7 @@ Element 3 part_list.action.part_count - %count% dílů vybráno! + %count% dílů vybráno @@ -9718,7 +9699,7 @@ Element 3 part_list.action.action.group.needs_review - Potřeba revize + Vyžaduje kontrolu @@ -10678,7 +10659,7 @@ Element 3 log.element_edited.changed_fields.theme - Téma + Vzhled @@ -10774,7 +10755,7 @@ Element 3 log.element_edited.changed_fields.needs_review - Potřeba revize + Vyžaduje kontrolu @@ -10984,7 +10965,7 @@ Element 3 parts.import.help - Pomocí tohoto nástroje můžete importovat díly z existujících souborů. Díly budou zapsány přímo do databáze, proto před nahráním souboru sem zkontrolujte, zda je jeho obsah správný. + Pomocí tohoto nástroje můžete importovat součásti z existujících souborů. Součásti budou přímo zapsány do databáze, proto před nahráním souboru zkontrolujte jeho správný obsah. @@ -11014,7 +10995,7 @@ Element 3 parts.import.part_needs_review.help - Pokud je tato možnost vybrána, budou všechny díly označeny jako "Potřeba revize" bez ohledu na to, co bylo nastaveno v údajích. + Pokud je tato možnost vybrána, budou všechny díly označeny jako "Vyžaduje kontrolu" bez ohledu na to, co bylo nastaveno v údajích. @@ -12060,7 +12041,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz part.info.withdraw_modal.delete_lot_if_empty - Vymazat tento inventář, až se vyprázdní + Smazat tuto položku, pokud se vyprázdní @@ -12516,7 +12497,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz settings.system.attachments.downloadByDefault - Ve výchozím nastavení stahovat nové adresy URL příloh + Ve výchozím nastavení stahovat URL adresu pro nové přílohy @@ -12528,7 +12509,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz settings.system.customization.instanceName - Instance name + Název instance @@ -12576,7 +12557,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz settings.system.customization.theme - Globální téma + Globální vzhed @@ -12642,7 +12623,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz settings.system.privacy.useGravatar.description - Pokud uživatel nemá nastavený avatar, použijte avatar z Gravataru na základě e-mailové adresy uživatele. To způsobí, že prohlížeč načte obrázky od třetí strany! + Pokud uživatel nemá zadaný obrázek avatara, použije se avatar z Gravataru na základě e-mailu uživatele. To způsobí, že prohlížeč načte obrázky ze třetí strany! @@ -12691,7 +12672,7 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz settings.system.privacy - Ochrana osobních údajů + Soukromí @@ -13054,5 +13035,449 @@ Vezměte prosím na vědomí, že se nemůžete vydávat za uživatele se zakáz Z bezpečnostních důvodů redigováno + + + project.bom_import.map_fields + Mapa polí + + + + + project.bom_import.map_fields.help + Nakonfigurujte, jak se sloupce CSV mapují na pole kusovníku + + + + + project.bom_import.delimiter + Oddělovač + + + + + project.bom_import.delimiter.comma + Čárka (,) + + + + + project.bom_import.delimiter.semicolon + Středník (;) + + + + + project.bom_import.delimiter.tab + Tabulátor + + + + + project.bom_import.field_mapping.title + Mapování pole + + + + + project.bom_import.field_mapping.csv_field + CSV pole + + + + + project.bom_import.field_mapping.maps_to + Mapy do + + + + + project.bom_import.field_mapping.suggestion + Návrh + + + + + project.bom_import.field_mapping.priority + Priorita + + + + + project.bom_import.field_mapping.priority_help + Priorita (nižší číslo = vyšší priorita) + + + + + project.bom_import.field_mapping.priority_short + P + + + + + project.bom_import.field_mapping.priority_note + Tip k prioritám: Čím nižší číslo, tím vyšší priorita. Výchozí priorita je 10. Pro nejdůležitější pole použijte priority 1-9, pro normální prioritu 10+. + + + + + project.bom_import.field_mapping.summary + Shrnutí mapování polí + + + + + project.bom_import.field_mapping.select_to_see_summary + Vyberte mapování polí, abyste viděli souhrn + + + + + project.bom_import.field_mapping.no_suggestion + Žádný návrh + + + + + project.bom_import.preview + Náhled + + + + + project.bom_import.flash.session_expired + Importní relace vypršela. Nahrajte soubor znovu. + + + + + project.bom_import.field_mapping.ignore + Ignorovat + + + + + project.bom_import.type.kicad_schematic + KiCAD schéma BOM (soubor CSV) + + + + + common.back + Zpět + + + + + project.bom_import.validation.errors.required_field_missing + Řádek %line%: Povinné pole "%field%" chybí nebo je prázdné. Ujistěte se, že je toto pole namapováno a obsahuje data. + + + + + project.bom_import.validation.errors.no_valid_designators + Řádek %line%: Pole označení neobsahuje žádné platné odkazy na komponenty. Očekávaný formát: „R1,C2,U3“ nebo „R1, C2, U3“. + + + + + project.bom_import.validation.warnings.unusual_designator_format + Řádek %line%: Některé odkazy na komponenty mohou mít neobvyklý formát: %designators%. Očekávaný formát: "R1", "C2", "U3" atd. + + + + + project.bom_import.validation.errors.duplicate_designators + Řádek %line%: Nalezeny duplicitní odkazy na komponenty: %designators%. Každá komponenta by měla být v každém řádku uvedena pouze jednou. + + + + + project.bom_import.validation.errors.invalid_quantity + Řádek %line%: Množství „%quantity%“ není platné číslo. Zadejte číselnou hodnotu (např. 1, 2.5, 10). + + + + + project.bom_import.validation.errors.quantity_zero_or_negative + Řádek %line%: Množství musí být větší než 0, máte %quantity%. + + + + + project.bom_import.validation.warnings.quantity_unusually_high + Řádek %line%: Množství %quantity% se jeví jako neobvykle vysoké. Ověřte prosím, zda je správné. + + + + + project.bom_import.validation.warnings.quantity_not_whole_number + Řádek %line%: Množství %quantity% není celé číslo, ale máte %count% odkazů na komponenty. To může znamenat nesoulad. + + + + + project.bom_import.validation.errors.quantity_designator_mismatch + Řádek %line%: Nesoulad mezi množstvím a odkazy na součásti. Množství: %quantity%, odkazy: %count% (%designators%). Tyto hodnoty by se měly shodovat. Upravte množství nebo zkontrolujte odkazy na součásti. + + + + + project.bom_import.validation.errors.invalid_partdb_id + Řádek %line%: ID části databáze „%id%“ není platné číslo. Zadejte číselné ID. + + + + + project.bom_import.validation.errors.partdb_id_zero_or_negative + Řádek %line%: ID části DB musí být větší než 0, nalezeno %id%. + + + + + project.bom_import.validation.warnings.partdb_id_not_found + Řádek %line%: ID dílu %id% nebylo nalezeno v databázi. Díl bude importována bez propojení s existujícím dílem. + + + + + project.bom_import.validation.info.partdb_link_success + Řádek %line%: Úspěšně propojeno s částí Part-DB „%name%“ (ID: %id%). + + + + + project.bom_import.validation.warnings.no_component_name + Řádek %line%: Není uvedeno žádné jméno/označení komponenty (MPN, označení nebo hodnota). Komponenta bude pojmenována "Neznámá komponenta". + + + + + project.bom_import.validation.warnings.package_name_too_long + Řádek %line%: Název balíčku „%package%“ je neobvykle dlouhý. Zkontrolujte, zda je správný. + + + + + project.bom_import.validation.info.library_prefix_detected + Řádek %line%: Balíček „%package%“ obsahuje předponu knihovny. Ta bude během importu automaticky odstraněna. + + + + + project.bom_import.validation.errors.non_numeric_field + Řádek %line%: Pole "%field%" obsahuje nečíselnou hodnotu "%value%". Zadejte platné číslo. + + + + + project.bom_import.validation.info.import_summary + Souhrn importu: %total% celkový počet záznamů, %valid% platných, %invalid% s problémy. + + + + + project.bom_import.validation.errors.summary + Bylo nalezeno %count% chyb ověření, které je nutné opravit, než bude možné pokračovat v importu. + + + + + project.bom_import.validation.warnings.summary + Nalezeno %count% varování. Před pokračováním prosím zkontrolujte tyto problémy. + + + + + project.bom_import.validation.info.all_valid + Všechny záznamy úspěšně prošly validací! + + + + + project.bom_import.validation.summary + Souhrn validace + + + + + project.bom_import.validation.total_entries + Celkový počet záznamů + + + + + project.bom_import.validation.valid_entries + Platné záznamy + + + + + project.bom_import.validation.invalid_entries + Neplatné záznamy + + + + + project.bom_import.validation.success_rate + Success Rate + + + + + project.bom_import.validation.errors.title + Úspěšnost + + + + + project.bom_import.validation.errors.description + Před pokračováním v importu je nutné opravit následující chyby: + + + + + project.bom_import.validation.warnings.title + Výstrahy validace + + + + + project.bom_import.validation.warnings.description + Před pokračováním si přečtěte následující varování: + + + + + project.bom_import.validation.info.title + Informace + + + + + project.bom_import.validation.details.title + Podrobné výsledky ověření + + + + + project.bom_import.validation.details.line + Řádek + + + + + project.bom_import.validation.details.status + Stav + + + + + project.bom_import.validation.details.messages + Zprávy + + + + + project.bom_import.validation.details.valid + Platný + + + + + project.bom_import.validation.details.invalid + Neplatný + + + + + project.bom_import.validation.all_valid + Všechny položky jsou platné a připravené k importu! + + + + + project.bom_import.validation.fix_errors + Před pokračováním v importu opravte chyby ověření. + + + + + project.bom_import.type.generic_csv + Obecný CSV + + + + + label_generator.update_profile + Aktualizovat profil s aktuálním nastavením + + + + + label_generator.profile_updated + Profil štítku byl úspěšně aktualizován. + + + + + settings.behavior.hompepage.items + Položky na domovské stránce + + + + + settings.behavior.homepage.items.help + Položky, které se mají zobrazit na domovské stránce. Pořadí lze změnit pomocí funkce drag & drop. + + + + + settings.system.customization.showVersionOnHomepage + Zobrazit verzi Part-DB na domovské stránce + + + + + settings.behavior.part_info.extract_params_from_description + Extrahovat parametry z popisu dílu + + + + + settings.behavior.part_info.extract_params_from_notes + Extrahovat parametry z poznámek k dílům + + + + + settings.ips.default_providers + Výchozí poskytovatelé vyhledávání + + + + + settings.ips.general + Obecná nastavení + + + + + settings.ips.default_providers.help + Tito poskytovatelé budou předem vybráni pro vyhledávání v části poskytovatelé. + + + + + settings.behavior.table.preview_image_max_width + Maximální šířka náhledu (px) + + + + + settings.behavior.table.preview_image_min_width + Minimální šířka náhledu (px) + + diff --git a/translations/messages.de.xlf b/translations/messages.de.xlf index a5c18cdd..9fb3f6ef 100644 --- a/translations/messages.de.xlf +++ b/translations/messages.de.xlf @@ -6504,7 +6504,7 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr flash.password_change_needed - Ihr Password muss geändert werden! + Ihr Passwort muss geändert werden! @@ -7157,8 +7157,14 @@ Wenn Sie dies fehlerhafterweise gemacht haben oder ein Computer nicht mehr vertr mass_creation.lines.placeholder Element 1 + Element 1.1 + Element 1.1.1 + Element 1.2 Element 2 -Element 3 +Element 3 + +Element 1 -> Element 1.1 +Element 1 -> Element 1.2 @@ -8547,16 +8553,6 @@ Element 3 Authenticator App - - - obsolete - obsolete - - - Login successful - Login erfolgreich. - - obsolete @@ -8682,15 +8678,6 @@ Element 3 Sicherheitsschlüssel erfolgreich hinzugefügt. - - - obsolete - - - Username - Benutzername - - obsolete @@ -9006,7 +8993,7 @@ Element 3 part_list.action.part_count - %count% Bauteile ausgewählt! + %count% Bauteile ausgewählt @@ -12921,7 +12908,7 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön settings.behavior.sidebar.rootNodeRedirectsToNewEntity - Wurzelknoten leitet zur Erstellung eines neuen Elements weiter + Stammknoten leitet zur Erstellung eines neuen Elements weiter @@ -13050,5 +13037,449 @@ Bitte beachten Sie, dass Sie sich nicht als deaktivierter Benutzer ausgeben kön Aus Sicherheitsgründen ausgeblendet + + + project.bom_import.map_fields + Spalten zuordnen + + + + + project.bom_import.map_fields.help + Wählen Sie aus, wie CSV Spalten auf BOM Felder gemappt werden + + + + + project.bom_import.delimiter + Trennzeichen + + + + + project.bom_import.delimiter.comma + Komma (,) + + + + + project.bom_import.delimiter.semicolon + Semikolon (;) + + + + + project.bom_import.delimiter.tab + Tab + + + + + project.bom_import.field_mapping.title + Spaltenzuordnung + + + + + project.bom_import.field_mapping.csv_field + CSV Spalte + + + + + project.bom_import.field_mapping.maps_to + Mappt auf + + + + + project.bom_import.field_mapping.suggestion + Vorschlag + + + + + project.bom_import.field_mapping.priority + Priorität + + + + + project.bom_import.field_mapping.priority_help + Priorität (kleinere Nummer = höhere Priorität) + + + + + project.bom_import.field_mapping.priority_short + P + + + + + project.bom_import.field_mapping.priority_note + Prioritätstipp: Niedrigere Zahlen = höhere Priorität. Die Standardpriorität ist 10. Verwenden Sie die Prioritäten 1–9 für die wichtigsten Felder und 10+ für normale Priorität. + + + + + project.bom_import.field_mapping.summary + Zusammenfassung der Zuordnung + + + + + project.bom_import.field_mapping.select_to_see_summary + Wählen Sie Zuordnungen aus, um eine Zusammenfassung anzuzeigen. + + + + + project.bom_import.field_mapping.no_suggestion + Kein Vorschlag + + + + + project.bom_import.preview + Vorschau + + + + + project.bom_import.flash.session_expired + Die Import-Sitzung ist abgelaufen. Bitte laden Sie Ihre Datei erneut hoch. + + + + + project.bom_import.field_mapping.ignore + Ignorieren + + + + + project.bom_import.type.kicad_schematic + KiCAD Schaltplaneditor BOM (CSV Datei) + + + + + common.back + Zurück + + + + + project.bom_import.validation.errors.required_field_missing + Zeile %line%: Das Pflichtfeld „%field%“ fehlt oder ist leer. Bitte stellen Sie sicher, dass dieses Feld zugeordnet ist und Daten enthält. + + + + + project.bom_import.validation.errors.no_valid_designators + Zeile %line%: Das Bezeichnungsfeld enthält keine gültigen Komponentenreferenzen. Erwartetes Format: „R1,C2,U3“ oder „R1, C2, U3“. + + + + + project.bom_import.validation.warnings.unusual_designator_format + Zeile %line%: Einige Komponentenreferenzen haben möglicherweise ein ungewöhnliches Format: %designators%. Erwartetes Format: „R1“, „C2“, „U3“ usw. + + + + + project.bom_import.validation.errors.duplicate_designators + Zeile %line%: Doppelte Komponentenreferenzen gefunden: %designators%. Jede Komponente sollte nur einmal pro Zeile referenziert werden. + + + + + project.bom_import.validation.errors.invalid_quantity + Zeile %line%: Die Menge „%quantity%“ ist keine gültige Zahl. Bitte geben Sie einen numerischen Wert ein (z. B. 1, 2,5, 10). + + + + + project.bom_import.validation.errors.quantity_zero_or_negative + Zeile %line%: Die Menge muss größer als 0 sein, erhaltene Menge %quantity%. + + + + + project.bom_import.validation.warnings.quantity_unusually_high + Zeile %line%: Die Menge %quantity% erscheint ungewöhnlich hoch. Bitte überprüfen Sie, ob dies korrekt ist. + + + + + project.bom_import.validation.warnings.quantity_not_whole_number + Zeile %line%: Die Menge %quantity% ist keine ganze Zahl, aber Sie haben %count% Komponentenreferenzen. Dies kann auf eine Nichtübereinstimmung hindeuten. + + + + + project.bom_import.validation.errors.quantity_designator_mismatch + Zeile %line%: Diskrepanz zwischen Menge und Komponentenreferenzen. Menge: %quantity%, Referenzen: %count% (%designators%). Diese sollten übereinstimmen. Passen Sie entweder die Menge an oder überprüfen Sie Ihre Komponentenreferenzen. + + + + + project.bom_import.validation.errors.invalid_partdb_id + Zeile %line%: Part-DB ID „%id%“ ist keine gültige Zahl. Bitte geben Sie eine numerische ID ein. + + + + + project.bom_import.validation.errors.partdb_id_zero_or_negative + Zeile %line%: Die Part-DB ID muss größer als 0 sein, erhaltene ID lautet %id%. + + + + + project.bom_import.validation.warnings.partdb_id_not_found + Zeile %line%: Teil-DB-ID %id% nicht in der Datenbank gefunden. Die Komponente wird ohne Verknüpfung mit einem vorhandenen Teil importiert. + + + + + project.bom_import.validation.info.partdb_link_success + Zeile %line%: Erfolgreich mit dem Bauteil „%name%“ (ID: %id%) verknüpft. + + + + + project.bom_import.validation.warnings.no_component_name + Zeile %line%: Kein Komponentenname/keine Komponentenbezeichnung angegeben (MPN, Bezeichnung oder Wert). Die Komponente wird als „Unbekanntes Bauteil” bezeichnet. + + + + + project.bom_import.validation.warnings.package_name_too_long + Zeile %line%: Der Footprintname „%package%“ ist ungewöhnlich lang. Bitte überprüfen Sie, ob er korrekt ist. + + + + + project.bom_import.validation.info.library_prefix_detected + Zeile %line%: Das Footprint „%package%“ enthält ein Bibliothekspräfix. Dieses wird beim Import automatisch entfernt. + + + + + project.bom_import.validation.errors.non_numeric_field + Zeile %line%: Das Feld „%field%“ enthält den nicht numerischen Wert „%value%“. Bitte geben Sie eine gültige Zahl ein. + + + + + project.bom_import.validation.info.import_summary + Importübersicht: %total% Einträge insgesamt, %valid% gültig, %invalid% mit Problemen. + + + + + project.bom_import.validation.errors.summary + Es wurden %count% Validierungsfehler gefunden, die behoben werden müssen, bevor der Import fortgesetzt werden kann. + + + + + project.bom_import.validation.warnings.summary + Es wurden %count% Warnungen gefunden. Bitte überprüfen Sie diese Probleme, bevor Sie fortfahren. + + + + + project.bom_import.validation.info.all_valid + Alle Einträge haben die Validierung erfolgreich bestanden! + + + + + project.bom_import.validation.summary + Validierungsübersicht + + + + + project.bom_import.validation.total_entries + Gesamtzahl der Einträge + + + + + project.bom_import.validation.valid_entries + Gültige Einträge + + + + + project.bom_import.validation.invalid_entries + Ungültige Einträge + + + + + project.bom_import.validation.success_rate + Erfolgsquote + + + + + project.bom_import.validation.errors.title + Validierungsfehler + + + + + project.bom_import.validation.errors.description + Die folgenden Fehler müssen behoben werden, bevor der Import fortgesetzt werden kann: + + + + + project.bom_import.validation.warnings.title + Validierungswarnungen + + + + + project.bom_import.validation.warnings.description + Die folgenden Warnhinweise sollten vor dem Fortfahren gelesen werden: + + + + + project.bom_import.validation.info.title + Informationen + + + + + project.bom_import.validation.details.title + Detaillierte Validierungsergebnisse + + + + + project.bom_import.validation.details.line + Zeile + + + + + project.bom_import.validation.details.status + Status + + + + + project.bom_import.validation.details.messages + Meldungen + + + + + project.bom_import.validation.details.valid + Gültig + + + + + project.bom_import.validation.details.invalid + Ungültig + + + + + project.bom_import.validation.all_valid + Alle Einträge sind gültig und bereit zum Import! + + + + + project.bom_import.validation.fix_errors + Bitte beheben Sie die Validierungsfehler, bevor Sie mit dem Import fortfahren. + + + + + project.bom_import.type.generic_csv + Generische CSV-Datei + + + + + label_generator.update_profile + Profil mit aktuellen Einstellungen aktualisieren + + + + + label_generator.profile_updated + Labelprofil aktualisiert + + + + + settings.behavior.hompepage.items + Startseiten-Elemente + + + + + settings.behavior.homepage.items.help + Die Elemente, die auf der Startseite angezeigt werden sollen. Die Reihenfolge kann per Drag & Drop geändert werden. + + + + + settings.system.customization.showVersionOnHomepage + Part-DB-Version auf der Startseite anzeigen + + + + + settings.behavior.part_info.extract_params_from_description + Parameter aus der Bauteilebeschreibung extrahieren + + + + + settings.behavior.part_info.extract_params_from_notes + Parameter aus der Bauteilenotiz extrahieren + + + + + settings.ips.default_providers + Standard-Suchquellen + + + + + settings.ips.general + Allgemeine Einstellungen + + + + + settings.ips.default_providers.help + Diese Anbieter werden für die Suche in Informationsquellen vorausgewählt. + + + + + settings.behavior.table.preview_image_max_width + Max. Vorschaubilde-Breite (px) + + + + + settings.behavior.table.preview_image_min_width + Min. Vorschaubilde-Breite (px) + + diff --git a/translations/messages.en.xlf b/translations/messages.en.xlf index e65445ce..be1e6348 100644 --- a/translations/messages.en.xlf +++ b/translations/messages.en.xlf @@ -242,7 +242,7 @@ part.info.timetravel_hint - Please note that this feature is experimental, so the info may not be correct.]]> + This is how the part appeared before %timestamp%. <i>Please note that this feature is experimental, so the info may not be correct.</i> @@ -731,10 +731,10 @@ user.edit.tfa.disable_tfa_message - all active two-factor authentication methods of the user and delete the backup codes! -
-The user will have to set up all two-factor authentication methods again and print new backup codes!

-Only do this if you are absolutely sure about the identity of the user (seeking help), otherwise the account could be compromised by an attacker!]]>
+ This will disable <b>all active two-factor authentication methods of the user</b> and delete the <b>backup codes</b>! +<br> +The user will have to set up all two-factor authentication methods again and print new backup codes! <br><br> +<b>Only do this if you are absolutely sure about the identity of the user (seeking help), otherwise the account could be compromised by an attacker!</b>
@@ -885,9 +885,9 @@ The user will have to set up all two-factor authentication methods again and pri entity.delete.message - -Sub elements will be moved upwards.]]> + This can not be undone! +<br> +Sub elements will be moved upwards. @@ -1441,7 +1441,7 @@ Sub elements will be moved upwards.]]> homepage.github.text - GitHub project page]]> + Source, downloads, bug reports, to-do-list etc. can be found on <a href="%href%" class="link-external" target="_blank">GitHub project page</a> @@ -1463,7 +1463,7 @@ Sub elements will be moved upwards.]]> homepage.help.text - GitHub page]]> + Help and tips can be found in Wiki the <a href="%href%" class="link-external" target="_blank">GitHub page</a> @@ -1705,7 +1705,7 @@ Sub elements will be moved upwards.]]> email.pw_reset.fallback - %url% and enter the following info]]> + If this does not work for you, go to <a href="%url%">%url%</a> and enter the following info @@ -1735,7 +1735,7 @@ Sub elements will be moved upwards.]]> email.pw_reset.valid_unit %date% - %date%.]]> + The reset token will be valid until <i>%date%</i>. @@ -3578,8 +3578,8 @@ Sub elements will be moved upwards.]]> tfa_google.disable.confirm_message - -Also note that without two-factor authentication, your account is no longer as well protected against attackers!]]> + If you disable the Authenticator App, all backup codes will be deleted, so you may need to reprint them.<br> +Also note that without two-factor authentication, your account is no longer as well protected against attackers! @@ -3599,7 +3599,7 @@ Also note that without two-factor authentication, your account is no longer as w tfa_google.step.download - Google Authenticator oder FreeOTP Authenticator)]]> + Download an authenticator app (e.g. <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Google Authenticator</a> oder <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">FreeOTP Authenticator</a>) @@ -3841,8 +3841,8 @@ Also note that without two-factor authentication, your account is no longer as w tfa_trustedDevices.explanation - all computers here.]]> + When checking the second factor, the current computer can be marked as trustworthy, so no more two-factor checks on this computer are needed. +If you have done this incorrectly or if a computer is no longer trusted, you can reset the status of <i>all </i>computers here. @@ -5313,7 +5313,7 @@ If you have done this incorrectly or if a computer is no longer trusted, you can label_options.lines_mode.help - Twig documentation and Wiki for more information.]]> + If you select Twig here, the content field is interpreted as Twig template. See <a href="https://twig.symfony.com/doc/3.x/templates.html">Twig documentation</a> and <a href="https://docs.part-db.de/usage/labels.html#twig-mode">Wiki</a> for more information. @@ -7157,7 +7157,7 @@ Exampletown mass_creation.lines.placeholder - Element 1 Element 1.1 Element 1.1.1 Element 1.2 @@ -7165,7 +7165,7 @@ Element 2 Element 3 Element 1 -> Element 1.1 -Element 1 -> Element 1.2]]> +Element 1 -> Element 1.2 @@ -8554,16 +8554,6 @@ Element 1 -> Element 1.2]]> Authenticator app - - - obsolete - obsolete - - - Login successful - Login successful - - obsolete @@ -8689,15 +8679,6 @@ Element 1 -> Element 1.2]]> Security key added successfully. - - - obsolete - - - Username - Username - - obsolete @@ -9013,7 +8994,7 @@ Element 1 -> Element 1.2]]> part_list.action.part_count - %count% parts selected! + %count% parts selected @@ -9391,25 +9372,25 @@ Element 1 -> Element 1.2]]> filter.parameter_value_constraint.operator.< - + Typ. Value < filter.parameter_value_constraint.operator.> - ]]> + Typ. Value > filter.parameter_value_constraint.operator.<= - + Typ. Value <= filter.parameter_value_constraint.operator.>= - =]]> + Typ. Value >= @@ -9517,7 +9498,7 @@ Element 1 -> Element 1.2]]> parts_list.search.searching_for - %keyword%]]> + Searching parts with keyword <b>%keyword%</b> @@ -10177,13 +10158,13 @@ Element 1 -> Element 1.2]]> project.builds.number_of_builds_possible - %max_builds% builds of this project.]]> + You have enough stocked to build <b>%max_builds%</b> builds of this project. project.builds.check_project_status - "%project_status%". You should check if you really want to build the project with this status!]]> + The current project status is <b>"%project_status%"</b>. You should check if you really want to build the project with this status! @@ -10285,7 +10266,7 @@ Element 1 -> Element 1.2]]> entity.select.add_hint - to create nested structures, e.g. "Node 1->Node 1.1"]]> + Use -> to create nested structures, e.g. "Node 1->Node 1.1" @@ -10309,13 +10290,13 @@ Element 1 -> Element 1.2]]> homepage.first_steps.introduction - documentation or start to creating the following data structures:]]> + Your database is still empty. You might want to read the <a href="%url%">documentation</a> or start to creating the following data structures: homepage.first_steps.create_part - create a new part.]]> + Or you can directly <a href="%url%">create a new part</a>. @@ -10327,7 +10308,7 @@ Element 1 -> Element 1.2]]> homepage.forum.text - discussion forum]]> + For questions about Part-DB use the <a href="%href%" class="link-external" target="_blank">discussion forum</a> @@ -10981,7 +10962,7 @@ Element 1 -> Element 1.2]]> parts.import.help_documentation - documentation for more information on the file format.]]> + See the <a href="%link%">documentation</a> for more information on the file format. @@ -11161,7 +11142,7 @@ Element 1 -> Element 1.2]]> part.filter.lessThanDesired - + In stock less than desired (total amount < min. amount) @@ -11973,13 +11954,13 @@ Please note, that you can not impersonate a disabled user. If you try you will g part.merge.confirm.title - %other% into %target%?]]> + Do you really want to merge <b>%other%</b> into <b>%target%</b>? part.merge.confirm.message - %other% will be deleted, and the part will be saved with the shown information.]]> + <b>%other%</b> will be deleted, and the part will be saved with the shown information. @@ -13057,5 +13038,449 @@ Please note, that you can not impersonate a disabled user. If you try you will g Redacted for security reasons + + + project.bom_import.map_fields + Map Fields + + + + + project.bom_import.map_fields.help + Configure how CSV columns map to BOM fields + + + + + project.bom_import.delimiter + Delimiter + + + + + project.bom_import.delimiter.comma + Comma (,) + + + + + project.bom_import.delimiter.semicolon + Semicolon (;) + + + + + project.bom_import.delimiter.tab + Tab + + + + + project.bom_import.field_mapping.title + Field Mapping + + + + + project.bom_import.field_mapping.csv_field + CSV Field + + + + + project.bom_import.field_mapping.maps_to + Maps To + + + + + project.bom_import.field_mapping.suggestion + Suggestion + + + + + project.bom_import.field_mapping.priority + Priority + + + + + project.bom_import.field_mapping.priority_help + Priority (lower number = higher priority) + + + + + project.bom_import.field_mapping.priority_short + P + + + + + project.bom_import.field_mapping.priority_note + Priority Tip: Lower numbers = higher priority. Default priority is 10. Use priorities 1-9 for most important fields, 10+ for normal priority. + + + + + project.bom_import.field_mapping.summary + Field Mapping Summary + + + + + project.bom_import.field_mapping.select_to_see_summary + Select field mappings to see summary + + + + + project.bom_import.field_mapping.no_suggestion + No suggestion + + + + + project.bom_import.preview + Preview + + + + + project.bom_import.flash.session_expired + Import session has expired. Please upload your file again. + + + + + project.bom_import.field_mapping.ignore + Ignore + + + + + project.bom_import.type.kicad_schematic + KiCAD Schematic BOM (CSV file) + + + + + common.back + Back + + + + + project.bom_import.validation.errors.required_field_missing + Line %line%: Required field "%field%" is missing or empty. Please ensure this field is mapped and contains data. + + + + + project.bom_import.validation.errors.no_valid_designators + Line %line%: Designator field contains no valid component references. Expected format: "R1,C2,U3" or "R1, C2, U3". + + + + + project.bom_import.validation.warnings.unusual_designator_format + Line %line%: Some component references may have unusual format: %designators%. Expected format: "R1", "C2", "U3", etc. + + + + + project.bom_import.validation.errors.duplicate_designators + Line %line%: Duplicate component references found: %designators%. Each component should be referenced only once per line. + + + + + project.bom_import.validation.errors.invalid_quantity + Line %line%: Quantity "%quantity%" is not a valid number. Please enter a numeric value (e.g., 1, 2.5, 10). + + + + + project.bom_import.validation.errors.quantity_zero_or_negative + Line %line%: Quantity must be greater than 0, got %quantity%. + + + + + project.bom_import.validation.warnings.quantity_unusually_high + Line %line%: Quantity %quantity% seems unusually high. Please verify this is correct. + + + + + project.bom_import.validation.warnings.quantity_not_whole_number + Line %line%: Quantity %quantity% is not a whole number, but you have %count% component references. This may indicate a mismatch. + + + + + project.bom_import.validation.errors.quantity_designator_mismatch + Line %line%: Mismatch between quantity and component references. Quantity: %quantity%, References: %count% (%designators%). These should match. Either adjust the quantity or check your component references. + + + + + project.bom_import.validation.errors.invalid_partdb_id + Line %line%: Part-DB ID "%id%" is not a valid number. Please enter a numeric ID. + + + + + project.bom_import.validation.errors.partdb_id_zero_or_negative + Line %line%: Part-DB ID must be greater than 0, got %id%. + + + + + project.bom_import.validation.warnings.partdb_id_not_found + Line %line%: Part-DB ID %id% not found in database. The component will be imported without linking to an existing part. + + + + + project.bom_import.validation.info.partdb_link_success + Line %line%: Successfully linked to Part-DB part "%name%" (ID: %id%). + + + + + project.bom_import.validation.warnings.no_component_name + Line %line%: No component name/designation provided (MPN, Designation, or Value). Component will be named "Unknown Component". + + + + + project.bom_import.validation.warnings.package_name_too_long + Line %line%: Package name "%package%" is unusually long. Please verify this is correct. + + + + + project.bom_import.validation.info.library_prefix_detected + Line %line%: Package "%package%" contains library prefix. This will be automatically removed during import. + + + + + project.bom_import.validation.errors.non_numeric_field + Line %line%: Field "%field%" contains non-numeric value "%value%". Please enter a valid number. + + + + + project.bom_import.validation.info.import_summary + Import summary: %total% total entries, %valid% valid, %invalid% with issues. + + + + + project.bom_import.validation.errors.summary + Found %count% validation error(s) that must be fixed before import can proceed. + + + + + project.bom_import.validation.warnings.summary + Found %count% warning(s). Please review these issues before proceeding. + + + + + project.bom_import.validation.info.all_valid + All entries passed validation successfully! + + + + + project.bom_import.validation.summary + Validation Summary + + + + + project.bom_import.validation.total_entries + Total Entries + + + + + project.bom_import.validation.valid_entries + Valid Entries + + + + + project.bom_import.validation.invalid_entries + Invalid Entries + + + + + project.bom_import.validation.success_rate + Success Rate + + + + + project.bom_import.validation.errors.title + Validation Errors + + + + + project.bom_import.validation.errors.description + The following errors must be fixed before the import can proceed: + + + + + project.bom_import.validation.warnings.title + Validation Warnings + + + + + project.bom_import.validation.warnings.description + The following warnings should be reviewed before proceeding: + + + + + project.bom_import.validation.info.title + Information + + + + + project.bom_import.validation.details.title + Detailed Validation Results + + + + + project.bom_import.validation.details.line + Line + + + + + project.bom_import.validation.details.status + Status + + + + + project.bom_import.validation.details.messages + Messages + + + + + project.bom_import.validation.details.valid + Valid + + + + + project.bom_import.validation.details.invalid + Invalid + + + + + project.bom_import.validation.all_valid + All entries are valid and ready for import! + + + + + project.bom_import.validation.fix_errors + Please fix the validation errors before proceeding with the import. + + + + + project.bom_import.type.generic_csv + Generic CSV + + + + + label_generator.update_profile + Update profile with current settings + + + + + label_generator.profile_updated + Label profile updated successfully. + + + + + settings.behavior.hompepage.items + Homepage items + + + + + settings.behavior.homepage.items.help + The items to show at the homepage. Order can be changed via drag & drop. + + + + + settings.system.customization.showVersionOnHomepage + Show Part-DB version on homepage + + + + + settings.behavior.part_info.extract_params_from_description + Extract parameters from part description + + + + + settings.behavior.part_info.extract_params_from_notes + Extract parameters from part notes + + + + + settings.ips.default_providers + Default search providers + + + + + settings.ips.general + General settings + + + + + settings.ips.default_providers.help + These providers will be preselected for searches in part providers. + + + + + settings.behavior.table.preview_image_max_width + Preview image max width (px) + + + + + settings.behavior.table.preview_image_min_width + Preview image min width (px) + + diff --git a/translations/messages.es.xlf b/translations/messages.es.xlf index f1fd8263..fce38e52 100644 --- a/translations/messages.es.xlf +++ b/translations/messages.es.xlf @@ -9009,7 +9009,7 @@ Elemento 3 part_list.action.part_count - ¡%count% componentes seleccionadas! + ¡%count% componentes seleccionadas diff --git a/translations/messages.fr.xlf b/translations/messages.fr.xlf index 120fee51..292dbafa 100644 --- a/translations/messages.fr.xlf +++ b/translations/messages.fr.xlf @@ -1,9101 +1,9101 @@ - - - - - - Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4 - Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4 - templates\AdminPages\AttachmentTypeAdmin.html.twig:4 - - - attachment_type.caption - Types pour fichiers joints - - - - - Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:12 - new - - - attachment_type.edit - Modifier le type de pièce jointe - - - - - Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:16 - new - - - attachment_type.new - Nouveau type de pièce jointe - - - - - Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4 - Part-DB1\templates\_sidebar.html.twig:22 - Part-DB1\templates\_sidebar.html.twig:7 - Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4 - Part-DB1\templates\_sidebar.html.twig:22 - Part-DB1\templates\_sidebar.html.twig:7 - templates\AdminPages\CategoryAdmin.html.twig:4 - templates\base.html.twig:163 - templates\base.html.twig:170 - templates\base.html.twig:197 - templates\base.html.twig:225 - - - category.labelp - Catégories - - - - - Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8 - Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:19 - Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8 - Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:11 - templates\AdminPages\CategoryAdmin.html.twig:8 - - - admin.options - Options - - - - - Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9 - Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15 - Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9 - Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15 - templates\AdminPages\CategoryAdmin.html.twig:9 - - - admin.advanced - Avancé - - - - - Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:13 - new - - - category.edit - Éditer la catégorie - - - - - Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:17 - new - - - category.new - Nouvelle catégorie - - - - - Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4 - Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4 - - - currency.caption - Devise - - - - - Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12 - Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12 - - - currency.iso_code.caption - Code ISO - - - - - Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15 - Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15 - - - currency.symbol.caption - Symbole de la devise - - - - - Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:29 - new - - - currency.edit - Editer la devise - - - - - Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:33 - new - - - currency.new - Nouvelle devise - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19 - Part-DB1\templates\_navbar_search.html.twig:67 - Part-DB1\templates\_sidebar.html.twig:27 - Part-DB1\templates\_sidebar.html.twig:43 - Part-DB1\templates\_sidebar.html.twig:63 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19 - Part-DB1\templates\_navbar_search.html.twig:61 - Part-DB1\templates\_sidebar.html.twig:27 - Part-DB1\templates\_sidebar.html.twig:43 - Part-DB1\templates\_sidebar.html.twig:63 - templates\AdminPages\EntityAdminBase.html.twig:9 - templates\base.html.twig:80 - templates\base.html.twig:179 - templates\base.html.twig:206 - templates\base.html.twig:237 - - - search.placeholder - Recherche - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23 - Part-DB1\templates\_sidebar.html.twig:3 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23 - Part-DB1\templates\_sidebar.html.twig:3 - templates\AdminPages\EntityAdminBase.html.twig:13 - templates\base.html.twig:166 - templates\base.html.twig:193 - templates\base.html.twig:221 - - - expandAll - Agrandir tout - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27 - Part-DB1\templates\_sidebar.html.twig:4 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27 - Part-DB1\templates\_sidebar.html.twig:4 - templates\AdminPages\EntityAdminBase.html.twig:17 - templates\base.html.twig:167 - templates\base.html.twig:194 - templates\base.html.twig:222 - - - reduceAll - Réduire tout - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54 - Part-DB1\templates\Parts\info\_sidebar.html.twig:4 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54 - Part-DB1\templates\Parts\info\_sidebar.html.twig:4 - - - part.info.timetravel_hint - C'est ainsi que le composant apparaissait avant le %timestamp%. <i>Veuillez noter que cette fonctionnalité est expérimentale, donc les infos ne sont peut-être pas correctes. </i> - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60 - templates\AdminPages\EntityAdminBase.html.twig:42 - - - standard.label - Propriétés - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61 - templates\AdminPages\EntityAdminBase.html.twig:43 - - - infos.label - Informations - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63 - new - - - history.label - Historique - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66 - templates\AdminPages\EntityAdminBase.html.twig:45 - - - export.label - Exporter - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68 - templates\AdminPages\EntityAdminBase.html.twig:47 - - - import_export.label - Importer exporter - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69 - - - mass_creation.label - Création multiple - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82 - templates\AdminPages\EntityAdminBase.html.twig:59 - - - admin.common - Commun - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86 - - - admin.attachments - Fichiers joints - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:90 - - - admin.parameters - Paramètres - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:179 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:167 - templates\AdminPages\EntityAdminBase.html.twig:142 - - - export_all.label - Exporter tous les éléments - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:185 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:173 - - - mass_creation.help - Chaque ligne sera interprétée comme le nom d'un élément qui sera créé. - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45 - templates\AdminPages\EntityAdminBase.html.twig:35 - - - edit.caption - Éditer l'élément "%name" - - - - - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50 - Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50 - templates\AdminPages\EntityAdminBase.html.twig:37 - - - new.caption - Nouvel élément - - - - - Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4 - Part-DB1\templates\_sidebar.html.twig:9 - Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4 - Part-DB1\templates\_sidebar.html.twig:9 - templates\base.html.twig:172 - templates\base.html.twig:199 - templates\base.html.twig:227 - - - footprint.labelp - Empreintes - - - - - Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:13 - new - - - footprint.edit - Editer l'empreinte - - - - - Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:17 - new - - - footprint.new - Nouvelle empreinte - - - - - Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4 - Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4 - - - group.edit.caption - Groupes - - - - - Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:16 - Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:16 - - - user.edit.permissions - Permissions - - - - - Part-DB1\templates\AdminPages\GroupAdmin.html.twig:24 - new - - - group.edit - Editer le groupe - - - - - Part-DB1\templates\AdminPages\GroupAdmin.html.twig:28 - new - - - group.new - Nouveau groupe - - - - - Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:4 - - - label_profile.caption - Profil des étiquettes - - - - - Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:8 - - - label_profile.advanced - Avancé - - - - - Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:9 - - - label_profile.comment - Commentaire - - - - - Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:55 - new - - - label_profile.edit - Editer profil d'étiquette - - - - - Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:59 - new - - - label_profile.new - Nouveau profil d'étiquette - - - - - Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4 - Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4 - templates\AdminPages\ManufacturerAdmin.html.twig:4 - - - manufacturer.caption - Fabricants - - - - - Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:8 - new - - - manufacturer.edit - Modifiez le fabricant - - - - - Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:12 - new - - - manufacturer.new - Nouveau fabricant - - - - - Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4 - Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4 - - - measurement_unit.caption - Unité de mesure - - - - - Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 - Part-DB1\templates\_sidebar.html.twig:8 - Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:4 - Part-DB1\templates\_sidebar.html.twig:8 - templates\base.html.twig:171 - templates\base.html.twig:198 - templates\base.html.twig:226 - - - storelocation.labelp - Emplacement de stockage - - - - - Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:32 - new - - - storelocation.edit - Modifier l'emplacement de stockage - - - - - Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:36 - new - - - storelocation.new - Nouvel emplacement de stockage - - - - - Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:4 - Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:4 - templates\AdminPages\SupplierAdmin.html.twig:4 - - - supplier.caption - Fournisseurs - - - - - Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:16 - new - - - supplier.edit - Modifier le fournisseur - - - - - Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:20 - new - - - supplier.new - Nouveau fournisseur - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:8 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:8 - - - user.edit.caption - Utilisateurs - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:14 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:14 - - - user.edit.configuration - Configuration - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:15 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:15 - - - user.edit.password - Mot de passe - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:45 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:45 - - - user.edit.tfa.caption - Authentification à deux facteurs - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:47 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:47 - - - user.edit.tfa.google_active - Application d'authentification active - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:48 - Part-DB1\templates\Users\backup_codes.html.twig:15 - Part-DB1\templates\Users\_2fa_settings.html.twig:95 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:48 - Part-DB1\templates\Users\backup_codes.html.twig:15 - Part-DB1\templates\Users\_2fa_settings.html.twig:95 - - - tfa_backup.remaining_tokens - Nombre de codes de secours restant - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:49 - Part-DB1\templates\Users\backup_codes.html.twig:17 - Part-DB1\templates\Users\_2fa_settings.html.twig:96 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:49 - Part-DB1\templates\Users\backup_codes.html.twig:17 - Part-DB1\templates\Users\_2fa_settings.html.twig:96 - - - tfa_backup.generation_date - Date de génération des codes de secours - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:53 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:60 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:53 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:60 - - - user.edit.tfa.disabled - Méthode désactivée - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:56 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:56 - - - user.edit.tfa.u2f_keys_count - Clés de sécurité actives - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 - - - user.edit.tfa.disable_tfa_title - Voulez vous vraiment poursuivre ? - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 - - - user.edit.tfa.disable_tfa_message - Cela désactivera <b> toutes les méthodes d'authentification à deux facteurs de l'utilisateur</b> et supprimera <b>les codes de secours</b>! -<br> -L'utilisateur devra configurer à nouveau toutes les méthodes d'authentification à deux facteurs et créer de nouveaux codes de secours!<br><br> -<b>Ne faites ceci qu'en étant sûr de l'identité de l'utilisateur (ayant besoin d'aide),autrement le compte pourrai être compromis!</b> - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:73 - Part-DB1\templates\AdminPages\UserAdmin.html.twig:73 - - - user.edit.tfa.disable_tfa.btn - Désactiver toutes les méthodes d'authentification à deux facteurs - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:85 - new - - - user.edit - Modifier l'utilisateur - - - - - Part-DB1\templates\AdminPages\UserAdmin.html.twig:89 - new - - - user.new - Nouvel utilisateur - - - - - Part-DB1\templates\AdminPages\_attachments.html.twig:4 - Part-DB1\templates\Parts\edit\_attachments.html.twig:4 - Part-DB1\templates\AdminPages\_attachments.html.twig:4 - Part-DB1\templates\Parts\edit\_attachments.html.twig:4 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:63 - - - attachment.delete - Supprimer - - - - - Part-DB1\templates\AdminPages\_attachments.html.twig:41 - Part-DB1\templates\Parts\edit\_attachments.html.twig:38 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:35 - Part-DB1\src\DataTables\AttachmentDataTable.php:159 - Part-DB1\templates\Parts\edit\_attachments.html.twig:38 - Part-DB1\src\DataTables\AttachmentDataTable.php:159 - - - attachment.external - Externe - - - - - Part-DB1\templates\AdminPages\_attachments.html.twig:49 - Part-DB1\templates\Parts\edit\_attachments.html.twig:47 - Part-DB1\templates\AdminPages\_attachments.html.twig:47 - Part-DB1\templates\Parts\edit\_attachments.html.twig:45 - - - attachment.preview.alt - Miniature du fichier joint - - - - - Part-DB1\templates\AdminPages\_attachments.html.twig:52 - Part-DB1\templates\Parts\edit\_attachments.html.twig:50 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:62 - Part-DB1\templates\AdminPages\_attachments.html.twig:50 - Part-DB1\templates\Parts\edit\_attachments.html.twig:48 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:45 - - - attachment.view - Afficher - - - - - Part-DB1\templates\AdminPages\_attachments.html.twig:58 - Part-DB1\templates\Parts\edit\_attachments.html.twig:56 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:43 - Part-DB1\src\DataTables\AttachmentDataTable.php:166 - Part-DB1\templates\AdminPages\_attachments.html.twig:56 - Part-DB1\templates\Parts\edit\_attachments.html.twig:54 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:38 - Part-DB1\src\DataTables\AttachmentDataTable.php:166 - - - attachment.file_not_found - Fichier introuvable - - - - - Part-DB1\templates\AdminPages\_attachments.html.twig:66 - Part-DB1\templates\Parts\edit\_attachments.html.twig:64 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:48 - Part-DB1\templates\Parts\edit\_attachments.html.twig:62 - - - attachment.secure - Fichier joint privé - - - - - Part-DB1\templates\AdminPages\_attachments.html.twig:79 - Part-DB1\templates\Parts\edit\_attachments.html.twig:77 - Part-DB1\templates\AdminPages\_attachments.html.twig:77 - Part-DB1\templates\Parts\edit\_attachments.html.twig:75 - - - attachment.create - Ajouter un fichier joint - - - - - Part-DB1\templates\AdminPages\_attachments.html.twig:84 - Part-DB1\templates\Parts\edit\_attachments.html.twig:82 - Part-DB1\templates\Parts\edit\_lots.html.twig:33 - Part-DB1\templates\AdminPages\_attachments.html.twig:82 - Part-DB1\templates\Parts\edit\_attachments.html.twig:80 - Part-DB1\templates\Parts\edit\_lots.html.twig:33 - - - part_lot.edit.delete.confirm - Voulez vous vraiment supprimer ce stock ? Cette action ne pourra pas être annulée! - - - - - Part-DB1\templates\AdminPages\_delete_form.html.twig:2 - Part-DB1\templates\AdminPages\_delete_form.html.twig:2 - templates\AdminPages\_delete_form.html.twig:2 - - - entity.delete.confirm_title - Voulez vous vraiment supprimer %name%? - - - - - Part-DB1\templates\AdminPages\_delete_form.html.twig:3 - Part-DB1\templates\AdminPages\_delete_form.html.twig:3 - templates\AdminPages\_delete_form.html.twig:3 - - - entity.delete.message - Cette action ne pourra pas être annulée! -<br> -Les sous éléments seront déplacés vers le haut. - - - - - Part-DB1\templates\AdminPages\_delete_form.html.twig:11 - Part-DB1\templates\AdminPages\_delete_form.html.twig:11 - templates\AdminPages\_delete_form.html.twig:9 - - - entity.delete - Supprimer l'élément - - - - - Part-DB1\templates\AdminPages\_delete_form.html.twig:16 - Part-DB1\templates\Parts\info\_tools.html.twig:45 - Part-DB1\src\Form\Part\PartBaseType.php:286 - Part-DB1\templates\AdminPages\_delete_form.html.twig:16 - Part-DB1\templates\Parts\info\_tools.html.twig:43 - Part-DB1\src\Form\Part\PartBaseType.php:267 - new - - - edit.log_comment - Éditer le commentaire - - - - - Part-DB1\templates\AdminPages\_delete_form.html.twig:24 - Part-DB1\templates\AdminPages\_delete_form.html.twig:24 - templates\AdminPages\_delete_form.html.twig:12 - - - entity.delete.recursive - Suppression récursive (tous les sous éléments) - - - - - Part-DB1\templates\AdminPages\_duplicate.html.twig:3 - - - entity.duplicate - Dupliquer l’élément - - - - - Part-DB1\templates\AdminPages\_export_form.html.twig:4 - Part-DB1\src\Form\AdminPages\ImportType.php:76 - Part-DB1\templates\AdminPages\_export_form.html.twig:4 - Part-DB1\src\Form\AdminPages\ImportType.php:76 - templates\AdminPages\_export_form.html.twig:4 - src\Form\ImportType.php:67 - - - export.format - Format de fichier - - - - - Part-DB1\templates\AdminPages\_export_form.html.twig:16 - Part-DB1\templates\AdminPages\_export_form.html.twig:16 - templates\AdminPages\_export_form.html.twig:16 - - - export.level - Niveau de verbosité - - - - - Part-DB1\templates\AdminPages\_export_form.html.twig:19 - Part-DB1\templates\AdminPages\_export_form.html.twig:19 - templates\AdminPages\_export_form.html.twig:19 - - - export.level.simple - Simple - - - - - Part-DB1\templates\AdminPages\_export_form.html.twig:20 - Part-DB1\templates\AdminPages\_export_form.html.twig:20 - templates\AdminPages\_export_form.html.twig:20 - - - export.level.extended - Étendu - - - - - Part-DB1\templates\AdminPages\_export_form.html.twig:21 - Part-DB1\templates\AdminPages\_export_form.html.twig:21 - templates\AdminPages\_export_form.html.twig:21 - - - export.level.full - Complet - - - - - Part-DB1\templates\AdminPages\_export_form.html.twig:31 - Part-DB1\templates\AdminPages\_export_form.html.twig:31 - templates\AdminPages\_export_form.html.twig:31 - - - export.include_children - Exporter également les sous éléments - - - - - Part-DB1\templates\AdminPages\_export_form.html.twig:39 - Part-DB1\templates\AdminPages\_export_form.html.twig:39 - templates\AdminPages\_export_form.html.twig:39 - - - export.btn - Exporter - - - - - Part-DB1\templates\AdminPages\_info.html.twig:4 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12 - Part-DB1\templates\Parts\info\show_part_info.html.twig:24 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:36 - Part-DB1\templates\AdminPages\_info.html.twig:4 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12 - Part-DB1\templates\Parts\info\show_part_info.html.twig:24 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:36 - templates\AdminPages\EntityAdminBase.html.twig:94 - templates\Parts\edit_part_info.html.twig:12 - templates\Parts\show_part_info.html.twig:11 - - - id.label - ID - - - - - Part-DB1\templates\AdminPages\_info.html.twig:11 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:76 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:77 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:6 - Part-DB1\templates\Parts\info\_order_infos.html.twig:69 - Part-DB1\templates\Parts\info\_sidebar.html.twig:12 - Part-DB1\templates\Parts\lists\_info_card.html.twig:77 - Part-DB1\templates\AdminPages\_info.html.twig:11 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:59 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:60 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:6 - Part-DB1\templates\Parts\info\_order_infos.html.twig:69 - Part-DB1\templates\Parts\info\_sidebar.html.twig:12 - Part-DB1\templates\Parts\lists\_info_card.html.twig:53 - templates\AdminPages\EntityAdminBase.html.twig:101 - templates\Parts\show_part_info.html.twig:248 - - - createdAt - Créé le - - - - - Part-DB1\templates\AdminPages\_info.html.twig:25 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:21 - Part-DB1\templates\Parts\info\_sidebar.html.twig:8 - Part-DB1\templates\Parts\lists\_info_card.html.twig:73 - Part-DB1\templates\AdminPages\_info.html.twig:25 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:21 - Part-DB1\templates\Parts\info\_sidebar.html.twig:8 - Part-DB1\templates\Parts\lists\_info_card.html.twig:49 - templates\AdminPages\EntityAdminBase.html.twig:114 - templates\Parts\show_part_info.html.twig:263 - - - lastModified - Dernière modification - - - - - Part-DB1\templates\AdminPages\_info.html.twig:38 - Part-DB1\templates\AdminPages\_info.html.twig:38 - - - entity.info.parts_count - Nombre de composants avec cet élément - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:6 - Part-DB1\templates\helper.twig:125 - Part-DB1\templates\Parts\edit\_specifications.html.twig:6 - - - specifications.property - Paramètre - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:7 - Part-DB1\templates\Parts\edit\_specifications.html.twig:7 - - - specifications.symbol - Symbole - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:8 - Part-DB1\templates\Parts\edit\_specifications.html.twig:8 - - - specifications.value_min - Min. - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:9 - Part-DB1\templates\Parts\edit\_specifications.html.twig:9 - - - specifications.value_typ - Typ. - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:10 - Part-DB1\templates\Parts\edit\_specifications.html.twig:10 - - - specifications.value_max - Max. - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:11 - Part-DB1\templates\Parts\edit\_specifications.html.twig:11 - - - specifications.unit - Unité - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:12 - Part-DB1\templates\Parts\edit\_specifications.html.twig:12 - - - specifications.text - Texte - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:13 - Part-DB1\templates\Parts\edit\_specifications.html.twig:13 - - - specifications.group - Groupe - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:26 - Part-DB1\templates\Parts\edit\_specifications.html.twig:26 - - - specification.create - Nouveau paramètre - - - - - Part-DB1\templates\AdminPages\_parameters.html.twig:31 - Part-DB1\templates\Parts\edit\_specifications.html.twig:31 - - - parameter.delete.confirm - Souhaitez-vous vraiment supprimer ce paramètre ? - - - - - Part-DB1\templates\attachment_list.html.twig:3 - Part-DB1\templates\attachment_list.html.twig:3 - - - attachment.list.title - Liste des fichiers joints - - - - - Part-DB1\templates\attachment_list.html.twig:10 - Part-DB1\templates\LogSystem\_log_table.html.twig:8 - Part-DB1\templates\Parts\lists\_parts_list.html.twig:6 - Part-DB1\templates\attachment_list.html.twig:10 - Part-DB1\templates\LogSystem\_log_table.html.twig:8 - Part-DB1\templates\Parts\lists\_parts_list.html.twig:6 - - - part_list.loading.caption - Chargement - - - - - Part-DB1\templates\attachment_list.html.twig:11 - Part-DB1\templates\LogSystem\_log_table.html.twig:9 - Part-DB1\templates\Parts\lists\_parts_list.html.twig:7 - Part-DB1\templates\attachment_list.html.twig:11 - Part-DB1\templates\LogSystem\_log_table.html.twig:9 - Part-DB1\templates\Parts\lists\_parts_list.html.twig:7 - - - part_list.loading.message - Cela peut prendre un moment.Si ce message ne disparaît pas, essayez de recharger la page. - - - - - Part-DB1\templates\base.html.twig:68 - Part-DB1\templates\base.html.twig:68 - templates\base.html.twig:246 - - - vendor.base.javascript_hint - Activez Javascipt pour profiter de toutes les fonctionnalités! - - - - - Part-DB1\templates\base.html.twig:73 - Part-DB1\templates\base.html.twig:73 - - - sidebar.big.toggle - Afficher/Cacher le panneau latéral -Show/Hide sidebar - - - - - Part-DB1\templates\base.html.twig:95 - Part-DB1\templates\base.html.twig:95 - templates\base.html.twig:271 - - - loading.caption - Chargement: - - - - - Part-DB1\templates\base.html.twig:96 - Part-DB1\templates\base.html.twig:96 - templates\base.html.twig:272 - - - loading.message - Cela peut prendre un moment.Si ce message ne disparaît pas, essayez de recharger la page. - - - - - Part-DB1\templates\base.html.twig:101 - Part-DB1\templates\base.html.twig:101 - templates\base.html.twig:277 - - - loading.bar - Chargement... - - - - - Part-DB1\templates\base.html.twig:112 - Part-DB1\templates\base.html.twig:112 - templates\base.html.twig:288 - - - back_to_top - Retour en haut de page - - - - - Part-DB1\templates\Form\permissionLayout.html.twig:35 - Part-DB1\templates\Form\permissionLayout.html.twig:35 - - - permission.edit.permission - Permissions - - - - - Part-DB1\templates\Form\permissionLayout.html.twig:36 - Part-DB1\templates\Form\permissionLayout.html.twig:36 - - - permission.edit.value - Valeur - - - - - Part-DB1\templates\Form\permissionLayout.html.twig:53 - Part-DB1\templates\Form\permissionLayout.html.twig:53 - - - permission.legend.title - Explication des états: - - - - - Part-DB1\templates\Form\permissionLayout.html.twig:57 - Part-DB1\templates\Form\permissionLayout.html.twig:57 - - - permission.legend.disallow - Interdire - - - - - Part-DB1\templates\Form\permissionLayout.html.twig:61 - Part-DB1\templates\Form\permissionLayout.html.twig:61 - - - permission.legend.allow - Autoriser - - - - - Part-DB1\templates\Form\permissionLayout.html.twig:65 - Part-DB1\templates\Form\permissionLayout.html.twig:65 - - - permission.legend.inherit - Hériter du groupe (parent) - - - - - Part-DB1\templates\helper.twig:3 - Part-DB1\templates\helper.twig:3 - - - bool.true - Vrai - - - - - Part-DB1\templates\helper.twig:5 - Part-DB1\templates\helper.twig:5 - - - bool.false - Faux - - - - - Part-DB1\templates\helper.twig:92 - Part-DB1\templates\helper.twig:87 - - - Yes - Oui - - - - - Part-DB1\templates\helper.twig:94 - Part-DB1\templates\helper.twig:89 - - - No - Non - - - - - Part-DB1\templates\helper.twig:126 - - - specifications.value - Valeur - - - - - Part-DB1\templates\homepage.html.twig:7 - Part-DB1\templates\homepage.html.twig:7 - templates\homepage.html.twig:7 - - - version.caption - Version - - - - - Part-DB1\templates\homepage.html.twig:22 - Part-DB1\templates\homepage.html.twig:22 - templates\homepage.html.twig:19 - - - homepage.license - Information de license - - - - - Part-DB1\templates\homepage.html.twig:31 - Part-DB1\templates\homepage.html.twig:31 - templates\homepage.html.twig:28 - - - homepage.github.caption - Page du projet - - - - - Part-DB1\templates\homepage.html.twig:31 - Part-DB1\templates\homepage.html.twig:31 - templates\homepage.html.twig:28 - - - homepage.github.text - Retrouvez les téléchargements, report de bugs, to-do-list etc. sur <a href="%href%" class="link-external" target="_blank">la page du projet GitHub</a> - - - - - Part-DB1\templates\homepage.html.twig:32 - Part-DB1\templates\homepage.html.twig:32 - templates\homepage.html.twig:29 - - - homepage.help.caption - Aide - - - - - Part-DB1\templates\homepage.html.twig:32 - Part-DB1\templates\homepage.html.twig:32 - templates\homepage.html.twig:29 - - - homepage.help.text - De l'aide et des conseils sont disponibles sur le Wiki de la <a href="%href%" class="link-external" target="_blank">page GitHub</a> - - - - - Part-DB1\templates\homepage.html.twig:33 - Part-DB1\templates\homepage.html.twig:33 - templates\homepage.html.twig:30 - - - homepage.forum.caption - Forum - - - - - Part-DB1\templates\homepage.html.twig:45 - Part-DB1\templates\homepage.html.twig:45 - new - - - homepage.last_activity - Activité récente - - - - - Part-DB1\templates\LabelSystem\dialog.html.twig:3 - Part-DB1\templates\LabelSystem\dialog.html.twig:6 - - - label_generator.title - Générateur d'étiquettes - - - - - Part-DB1\templates\LabelSystem\dialog.html.twig:16 - - - label_generator.common - Commun - - - - - Part-DB1\templates\LabelSystem\dialog.html.twig:20 - - - label_generator.advanced - Avancé - - - - - Part-DB1\templates\LabelSystem\dialog.html.twig:24 - - - label_generator.profiles - Profils - - - - - Part-DB1\templates\LabelSystem\dialog.html.twig:58 - - - label_generator.selected_profile - Profil actuellement sélectionné - - - - - Part-DB1\templates\LabelSystem\dialog.html.twig:62 - - - label_generator.edit_profile - Modifier le profil - - - - - Part-DB1\templates\LabelSystem\dialog.html.twig:75 - - - label_generator.load_profile - Charger le profil - - - - - Part-DB1\templates\LabelSystem\dialog.html.twig:102 - - - label_generator.download - Télécharger - - - - - Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:3 - Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:5 - - - label_generator.label_btn - Générer une étiquette - - - - - Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:20 - - - label_generator.label_empty - Nouvelle étiquette vide - - - - - Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:3 - - - label_scanner.title - Lecteur d'étiquettes - - - - - Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7 - - - label_scanner.no_cam_found.title - Aucune webcam trouvée - - - - - Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7 - - - label_scanner.no_cam_found.text - Vous devez disposer d'une webcam et donner l'autorisation d'utiliser la fonction de scanner. Vous pouvez entrer le code à barres manuellement ci-dessous. - - - - - Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:27 - - - label_scanner.source_select - Sélectionnez une source - - - - - Part-DB1\templates\LogSystem\log_list.html.twig:3 - Part-DB1\templates\LogSystem\log_list.html.twig:3 - - - log.list.title - Journal système - - - - - Part-DB1\templates\LogSystem\_log_table.html.twig:1 - Part-DB1\templates\LogSystem\_log_table.html.twig:1 - new - - - log.undo.confirm_title - Annuler le changement / revenir à une date antérieure ? - - - - - Part-DB1\templates\LogSystem\_log_table.html.twig:2 - Part-DB1\templates\LogSystem\_log_table.html.twig:2 - new - - - log.undo.confirm_message - Voulez-vous annuler la modification donnée / réinitialiser l'élément à une date donnée ? - - - - - Part-DB1\templates\mail\base.html.twig:24 - Part-DB1\templates\mail\base.html.twig:24 - - - mail.footer.email_sent_by - Cet email a été envoyé automatiquement par - - - - - Part-DB1\templates\mail\base.html.twig:24 - Part-DB1\templates\mail\base.html.twig:24 - - - mail.footer.dont_reply - Ne répondez pas à cet email. - - - - - Part-DB1\templates\mail\pw_reset.html.twig:6 - Part-DB1\templates\mail\pw_reset.html.twig:6 - - - email.hi %name% - Bonjour %name% - - - - - Part-DB1\templates\mail\pw_reset.html.twig:7 - Part-DB1\templates\mail\pw_reset.html.twig:7 - - - email.pw_reset.message - Quelqu’un (surement vous) a demandé une réinitialisation de votre mot de passe.Si ce n'est pas le cas, ignorez simplement cet email. - - - - - Part-DB1\templates\mail\pw_reset.html.twig:9 - Part-DB1\templates\mail\pw_reset.html.twig:9 - - - email.pw_reset.button - Cliquez ici pour réinitialiser votre mot de passe - - - - - Part-DB1\templates\mail\pw_reset.html.twig:11 - Part-DB1\templates\mail\pw_reset.html.twig:11 - - - email.pw_reset.fallback - Si cela ne fonctionne pas pour vous, allez à <a href="%url%">%url%</a> et entrez les informations suivantes - - - - - Part-DB1\templates\mail\pw_reset.html.twig:16 - Part-DB1\templates\mail\pw_reset.html.twig:16 - - - email.pw_reset.username - Nom d'utilisateur - - - - - Part-DB1\templates\mail\pw_reset.html.twig:19 - Part-DB1\templates\mail\pw_reset.html.twig:19 - - - email.pw_reset.token - Jeton - - - - - Part-DB1\templates\mail\pw_reset.html.twig:24 - Part-DB1\templates\mail\pw_reset.html.twig:24 - - - email.pw_reset.valid_unit %date% - Le jeton de réinitialisation sera valable jusqu'au <i>%date%</i>. - - - - - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:18 - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58 - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:78 - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58 - - - orderdetail.delete - Supprimer - - - - - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39 - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39 - - - pricedetails.edit.min_qty - Quantité minimale de commande - - - - - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40 - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40 - - - pricedetails.edit.price - Prix - - - - - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41 - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41 - - - pricedetails.edit.price_qty - Pour la quantité - - - - - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54 - Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54 - - - pricedetail.create - Ajouter prix - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4 - templates\Parts\edit_part_info.html.twig:4 - - - part.edit.title - Éditer le composant - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9 - templates\Parts\edit_part_info.html.twig:9 - - - part.edit.card_title - Éditer le composant - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22 - - - part.edit.tab.common - Général - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28 - - - part.edit.tab.manufacturer - Fabricant - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34 - - - part.edit.tab.advanced - Avancé - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 - - - part.edit.tab.part_lots - Stocks - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46 - - - part.edit.tab.attachments - Fichiers joints - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52 - - - part.edit.tab.orderdetails - Informations pour la commande - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58 - - - part.edit.tab.specifications - Caractéristiques - - - - - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:64 - Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58 - - - part.edit.tab.comment - Commentaire - - - - - Part-DB1\templates\Parts\edit\new_part.html.twig:8 - Part-DB1\templates\Parts\edit\new_part.html.twig:8 - templates\Parts\new_part.html.twig:8 - - - part.new.card_title - Créer un nouveau composant - - - - - Part-DB1\templates\Parts\edit\_lots.html.twig:5 - Part-DB1\templates\Parts\edit\_lots.html.twig:5 - - - part_lot.delete - Supprimer - - - - - Part-DB1\templates\Parts\edit\_lots.html.twig:28 - Part-DB1\templates\Parts\edit\_lots.html.twig:28 - - - part_lot.create - Créer un inventaire - - - - - Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13 - Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13 - - - orderdetail.create - Ajouter un fournisseur - - - - - Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18 - Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18 - - - pricedetails.edit.delete.confirm - Voulez-vous vraiment supprimer ce prix ? Cela ne peut pas être défait ! - - - - - Part-DB1\templates\Parts\edit\_orderdetails.html.twig:62 - Part-DB1\templates\Parts\edit\_orderdetails.html.twig:61 - - - orderdetails.edit.delete.confirm - Voulez-vous vraiment supprimer ce fournisseur ? Cela ne peut pas être défait ! - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:4 - Part-DB1\templates\Parts\info\show_part_info.html.twig:19 - Part-DB1\templates\Parts\info\show_part_info.html.twig:4 - Part-DB1\templates\Parts\info\show_part_info.html.twig:19 - templates\Parts\show_part_info.html.twig:4 - templates\Parts\show_part_info.html.twig:9 - - - part.info.title - Informations détaillées pour - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:47 - Part-DB1\templates\Parts\info\show_part_info.html.twig:47 - - - part.part_lots.label - Stocks - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:56 - Part-DB1\templates\Parts\lists\_info_card.html.twig:43 - Part-DB1\templates\_navbar_search.html.twig:31 - Part-DB1\templates\_navbar_search.html.twig:26 - templates\base.html.twig:62 - templates\Parts\show_part_info.html.twig:74 - src\Form\PartType.php:86 - - - comment.label - Commentaire - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:64 - - - part.info.specifications - Caractéristiques - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:74 - Part-DB1\templates\Parts\info\show_part_info.html.twig:64 - templates\Parts\show_part_info.html.twig:82 - - - attachment.labelp - Fichiers joints - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:83 - Part-DB1\templates\Parts\info\show_part_info.html.twig:71 - templates\Parts\show_part_info.html.twig:88 - - - vendor.partinfo.shopping_infos - Informations de commande - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:91 - Part-DB1\templates\Parts\info\show_part_info.html.twig:78 - templates\Parts\show_part_info.html.twig:94 - - - vendor.partinfo.history - Historique - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:97 - Part-DB1\templates\_sidebar.html.twig:54 - Part-DB1\templates\_sidebar.html.twig:13 - Part-DB1\templates\Parts\info\show_part_info.html.twig:84 - Part-DB1\templates\_sidebar.html.twig:54 - Part-DB1\templates\_sidebar.html.twig:13 - templates\base.html.twig:176 - templates\base.html.twig:203 - templates\base.html.twig:217 - templates\base.html.twig:231 - templates\Parts\show_part_info.html.twig:100 - - - tools.label - Outils - - - - - Part-DB1\templates\Parts\info\show_part_info.html.twig:103 - Part-DB1\templates\Parts\info\show_part_info.html.twig:90 - - - extended_info.label - Informations complémentaires - - - - - Part-DB1\templates\Parts\info\_attachments_info.html.twig:7 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:7 - - - attachment.name - Nom - - - - - Part-DB1\templates\Parts\info\_attachments_info.html.twig:8 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:8 - - - attachment.attachment_type - Type de fichier joint - - - - - Part-DB1\templates\Parts\info\_attachments_info.html.twig:9 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:9 - - - attachment.file_name - Nom du fichier - - - - - Part-DB1\templates\Parts\info\_attachments_info.html.twig:10 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:10 - - - attachment.file_size - Taille du fichier - - - - - Part-DB1\templates\Parts\info\_attachments_info.html.twig:54 - - - attachment.preview - Aperçu de l'image - - - - - Part-DB1\templates\Parts\info\_attachments_info.html.twig:67 - Part-DB1\templates\Parts\info\_attachments_info.html.twig:50 - - - attachment.download - Téléchargement - - - - - Part-DB1\templates\Parts\info\_extended_infos.html.twig:11 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:11 - new - - - user.creating_user - Utilisateur qui a créé ce composant - - - - - Part-DB1\templates\Parts\info\_extended_infos.html.twig:13 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:28 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:50 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:13 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:28 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:50 - - - Unknown - Inconnu - - - - - Part-DB1\templates\Parts\info\_extended_infos.html.twig:15 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:30 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:15 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:30 - new - - - accessDenied - Accès refusé - - - - - Part-DB1\templates\Parts\info\_extended_infos.html.twig:26 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:26 - new - - - user.last_editing_user - Utilisateur qui a édité ce composant en dernier - - - - - Part-DB1\templates\Parts\info\_extended_infos.html.twig:41 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:41 - - - part.isFavorite - Favoris - - - - - Part-DB1\templates\Parts\info\_extended_infos.html.twig:46 - Part-DB1\templates\Parts\info\_extended_infos.html.twig:46 - - - part.minOrderAmount - Quantité minimale de commande - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:8 - Part-DB1\templates\_navbar_search.html.twig:46 - Part-DB1\src\Services\ElementTypeNameGenerator.php:84 - Part-DB1\templates\Parts\info\_main_infos.html.twig:8 - Part-DB1\templates\_navbar_search.html.twig:41 - Part-DB1\src\Services\ElementTypeNameGenerator.php:84 - templates\base.html.twig:70 - templates\Parts\show_part_info.html.twig:24 - src\Form\PartType.php:80 - - - manufacturer.label - Fabricant - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:24 - Part-DB1\templates\_navbar_search.html.twig:11 - templates\base.html.twig:54 - src\Form\PartType.php:62 - - - name.label - Nom - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:27 - Part-DB1\templates\Parts\info\_main_infos.html.twig:27 - new - - - part.back_to_info - Retour à la version actuelle - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:32 - Part-DB1\templates\_navbar_search.html.twig:19 - Part-DB1\templates\Parts\info\_main_infos.html.twig:32 - Part-DB1\templates\_navbar_search.html.twig:18 - templates\base.html.twig:58 - templates\Parts\show_part_info.html.twig:31 - src\Form\PartType.php:65 - - - description.label - Description - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:34 - Part-DB1\templates\_navbar_search.html.twig:15 - Part-DB1\src\Services\ElementTypeNameGenerator.php:80 - Part-DB1\templates\Parts\info\_main_infos.html.twig:34 - Part-DB1\templates\_navbar_search.html.twig:14 - Part-DB1\src\Services\ElementTypeNameGenerator.php:80 - templates\base.html.twig:56 - templates\Parts\show_part_info.html.twig:32 - src\Form\PartType.php:74 - - - category.label - Catégorie - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:39 - Part-DB1\templates\Parts\info\_main_infos.html.twig:39 - templates\Parts\show_part_info.html.twig:42 - src\Form\PartType.php:69 - - - instock.label - En stock - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:41 - Part-DB1\templates\Parts\info\_main_infos.html.twig:41 - templates\Parts\show_part_info.html.twig:44 - src\Form\PartType.php:72 - - - mininstock.label - Stock minimum - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:45 - Part-DB1\templates\_navbar_search.html.twig:52 - Part-DB1\src\Services\ElementTypeNameGenerator.php:83 - Part-DB1\templates\Parts\info\_main_infos.html.twig:45 - Part-DB1\templates\_navbar_search.html.twig:47 - Part-DB1\src\Services\ElementTypeNameGenerator.php:83 - templates\base.html.twig:73 - templates\Parts\show_part_info.html.twig:47 - - - footprint.label - Empreinte - - - - - Part-DB1\templates\Parts\info\_main_infos.html.twig:56 - Part-DB1\templates\Parts\info\_main_infos.html.twig:59 - Part-DB1\templates\Parts\info\_main_infos.html.twig:57 - Part-DB1\templates\Parts\info\_main_infos.html.twig:60 - templates\Parts\show_part_info.html.twig:51 - - - part.avg_price.label - Prix moyen - - - - - Part-DB1\templates\Parts\info\_order_infos.html.twig:5 - Part-DB1\templates\Parts\info\_order_infos.html.twig:5 - - - part.supplier.name - Nom - - - - - Part-DB1\templates\Parts\info\_order_infos.html.twig:6 - Part-DB1\templates\Parts\info\_order_infos.html.twig:6 - - - part.supplier.partnr - Lien/Code cmd. - - - - - Part-DB1\templates\Parts\info\_order_infos.html.twig:28 - Part-DB1\templates\Parts\info\_order_infos.html.twig:28 - - - part.order.minamount - Nombre minimum - - - - - Part-DB1\templates\Parts\info\_order_infos.html.twig:29 - Part-DB1\templates\Parts\info\_order_infos.html.twig:29 - - - part.order.price - Prix - - - - - Part-DB1\templates\Parts\info\_order_infos.html.twig:31 - Part-DB1\templates\Parts\info\_order_infos.html.twig:31 - - - part.order.single_price - Prix unitaire - - - - - Part-DB1\templates\Parts\info\_order_infos.html.twig:71 - Part-DB1\templates\Parts\info\_order_infos.html.twig:71 - - - edit.caption_short - Éditer - - - - - Part-DB1\templates\Parts\info\_order_infos.html.twig:72 - Part-DB1\templates\Parts\info\_order_infos.html.twig:72 - - - delete.caption - Supprimer - - - - - Part-DB1\templates\Parts\info\_part_lots.html.twig:7 - Part-DB1\templates\Parts\info\_part_lots.html.twig:6 - - - part_lots.description - Description - - - - - Part-DB1\templates\Parts\info\_part_lots.html.twig:8 - Part-DB1\templates\Parts\info\_part_lots.html.twig:7 - - - part_lots.storage_location - Emplacement de stockage - - - - - Part-DB1\templates\Parts\info\_part_lots.html.twig:9 - Part-DB1\templates\Parts\info\_part_lots.html.twig:8 - - - part_lots.amount - Quantité - - - - - Part-DB1\templates\Parts\info\_part_lots.html.twig:24 - Part-DB1\templates\Parts\info\_part_lots.html.twig:22 - - - part_lots.location_unknown - Emplacement de stockage inconnu - - - - - Part-DB1\templates\Parts\info\_part_lots.html.twig:31 - Part-DB1\templates\Parts\info\_part_lots.html.twig:29 - - - part_lots.instock_unknown - Quantité inconnue - - - - - Part-DB1\templates\Parts\info\_part_lots.html.twig:40 - Part-DB1\templates\Parts\info\_part_lots.html.twig:38 - - - part_lots.expiration_date - Date d'expiration - - - - - Part-DB1\templates\Parts\info\_part_lots.html.twig:48 - Part-DB1\templates\Parts\info\_part_lots.html.twig:46 - - - part_lots.is_expired - Expiré - - - - - Part-DB1\templates\Parts\info\_part_lots.html.twig:55 - Part-DB1\templates\Parts\info\_part_lots.html.twig:53 - - - part_lots.need_refill - Doit être rempli à nouveau - - - - - Part-DB1\templates\Parts\info\_picture.html.twig:15 - Part-DB1\templates\Parts\info\_picture.html.twig:15 - - - part.info.prev_picture - Image précédente - - - - - Part-DB1\templates\Parts\info\_picture.html.twig:19 - Part-DB1\templates\Parts\info\_picture.html.twig:19 - - - part.info.next_picture - Image suivante - - - - - Part-DB1\templates\Parts\info\_sidebar.html.twig:21 - Part-DB1\templates\Parts\info\_sidebar.html.twig:21 - - - part.mass.tooltip - Poids - - - - - Part-DB1\templates\Parts\info\_sidebar.html.twig:30 - Part-DB1\templates\Parts\info\_sidebar.html.twig:30 - - - part.needs_review.badge - Révision nécessaire - - - - - Part-DB1\templates\Parts\info\_sidebar.html.twig:39 - Part-DB1\templates\Parts\info\_sidebar.html.twig:39 - - - part.favorite.badge - Favoris - - - - - Part-DB1\templates\Parts\info\_sidebar.html.twig:47 - Part-DB1\templates\Parts\info\_sidebar.html.twig:47 - - - part.obsolete.badge - N'est plus disponible - - - - - Part-DB1\templates\Parts\info\_specifications.html.twig:10 - - - parameters.extracted_from_description - Automatiquement extrait de la description - - - - - Part-DB1\templates\Parts\info\_specifications.html.twig:15 - - - parameters.auto_extracted_from_comment - Automatiquement extrait du commentaire - - - - - Part-DB1\templates\Parts\info\_tools.html.twig:6 - Part-DB1\templates\Parts\info\_tools.html.twig:4 - templates\Parts\show_part_info.html.twig:125 - - - part.edit.btn - Éditer - - - - - Part-DB1\templates\Parts\info\_tools.html.twig:16 - Part-DB1\templates\Parts\info\_tools.html.twig:14 - templates\Parts\show_part_info.html.twig:135 - - - part.clone.btn - Duplication - - - - - Part-DB1\templates\Parts\info\_tools.html.twig:24 - Part-DB1\templates\Parts\lists\_action_bar.html.twig:4 - templates\Parts\show_part_info.html.twig:143 - - - part.create.btn - Créer un nouveau composant - - - - - Part-DB1\templates\Parts\info\_tools.html.twig:31 - Part-DB1\templates\Parts\info\_tools.html.twig:29 - - - part.delete.confirm_title - Voulez-vous vraiment supprimer ce composant ? - - - - - Part-DB1\templates\Parts\info\_tools.html.twig:32 - Part-DB1\templates\Parts\info\_tools.html.twig:30 - - - part.delete.message - Le composant et toutes les informations associées (stocks, fichiers joints, etc.) sont supprimés. Cela ne pourra pas être annulé. - - - - - Part-DB1\templates\Parts\info\_tools.html.twig:39 - Part-DB1\templates\Parts\info\_tools.html.twig:37 - - - part.delete - Supprimer le composant - - - - - Part-DB1\templates\Parts\lists\all_list.html.twig:4 - Part-DB1\templates\Parts\lists\all_list.html.twig:4 - - - parts_list.all.title - Tous les composants - - - - - Part-DB1\templates\Parts\lists\category_list.html.twig:4 - Part-DB1\templates\Parts\lists\category_list.html.twig:4 - - - parts_list.category.title - Composants avec catégorie - - - - - Part-DB1\templates\Parts\lists\footprint_list.html.twig:4 - Part-DB1\templates\Parts\lists\footprint_list.html.twig:4 - - - parts_list.footprint.title - Composants avec empreinte - - - - - Part-DB1\templates\Parts\lists\manufacturer_list.html.twig:4 - Part-DB1\templates\Parts\lists\manufacturer_list.html.twig:4 - - - parts_list.manufacturer.title - Composants avec fabricant - - - - - Part-DB1\templates\Parts\lists\search_list.html.twig:4 - Part-DB1\templates\Parts\lists\search_list.html.twig:4 - - - parts_list.search.title - Recherche de composants - - - - - Part-DB1\templates\Parts\lists\store_location_list.html.twig:4 - Part-DB1\templates\Parts\lists\store_location_list.html.twig:4 - - - parts_list.storelocation.title - Composants avec lieu de stockage - - - - - Part-DB1\templates\Parts\lists\supplier_list.html.twig:4 - Part-DB1\templates\Parts\lists\supplier_list.html.twig:4 - - - parts_list.supplier.title - Composants avec fournisseur - - - - - Part-DB1\templates\Parts\lists\tags_list.html.twig:4 - Part-DB1\templates\Parts\lists\tags_list.html.twig:4 - - - parts_list.tags.title - Composants avec tag - - - - - Part-DB1\templates\Parts\lists\_info_card.html.twig:22 - Part-DB1\templates\Parts\lists\_info_card.html.twig:17 - - - entity.info.common.tab - Général - - - - - Part-DB1\templates\Parts\lists\_info_card.html.twig:26 - Part-DB1\templates\Parts\lists\_info_card.html.twig:20 - - - entity.info.statistics.tab - Statistiques - - - - - Part-DB1\templates\Parts\lists\_info_card.html.twig:31 - - - entity.info.attachments.tab - Pièces jointes - - - - - Part-DB1\templates\Parts\lists\_info_card.html.twig:37 - - - entity.info.parameters.tab - Caractéristiques - - - - - Part-DB1\templates\Parts\lists\_info_card.html.twig:54 - Part-DB1\templates\Parts\lists\_info_card.html.twig:30 - - - entity.info.name - Nom - - - - - Part-DB1\templates\Parts\lists\_info_card.html.twig:58 - Part-DB1\templates\Parts\lists\_info_card.html.twig:96 - Part-DB1\templates\Parts\lists\_info_card.html.twig:34 - Part-DB1\templates\Parts\lists\_info_card.html.twig:67 - - - entity.info.parent - Parent - - - - - Part-DB1\templates\Parts\lists\_info_card.html.twig:70 - Part-DB1\templates\Parts\lists\_info_card.html.twig:46 - - - entity.edit.btn - Éditer - - - - - Part-DB1\templates\Parts\lists\_info_card.html.twig:92 - Part-DB1\templates\Parts\lists\_info_card.html.twig:63 - - - entity.info.children_count - Nombre de sous-éléments - - - - - Part-DB1\templates\security\2fa_base_form.html.twig:3 - Part-DB1\templates\security\2fa_base_form.html.twig:5 - Part-DB1\templates\security\2fa_base_form.html.twig:3 - Part-DB1\templates\security\2fa_base_form.html.twig:5 - - - tfa.check.title - Authentification à deux facteurs requise - - - - - Part-DB1\templates\security\2fa_base_form.html.twig:39 - Part-DB1\templates\security\2fa_base_form.html.twig:39 - - - tfa.code.trusted_pc - Il s'agit d'un ordinateur de confiance (si cette fonction est activée, aucune autre requête à deux facteurs n'est effectuée sur cet ordinateur) - - - - - Part-DB1\templates\security\2fa_base_form.html.twig:52 - Part-DB1\templates\security\login.html.twig:58 - Part-DB1\templates\security\2fa_base_form.html.twig:52 - Part-DB1\templates\security\login.html.twig:58 - - - login.btn - Connexion - - - - - Part-DB1\templates\security\2fa_base_form.html.twig:53 - Part-DB1\templates\security\U2F\u2f_login.html.twig:13 - Part-DB1\templates\_navbar.html.twig:42 - Part-DB1\templates\security\2fa_base_form.html.twig:53 - Part-DB1\templates\security\U2F\u2f_login.html.twig:13 - Part-DB1\templates\_navbar.html.twig:40 - - - user.logout - Déconnexion - - - - - Part-DB1\templates\security\2fa_form.html.twig:6 - Part-DB1\templates\security\2fa_form.html.twig:6 - - - tfa.check.code.label - Code d'application de l'authentificateur - - - - - Part-DB1\templates\security\2fa_form.html.twig:10 - Part-DB1\templates\security\2fa_form.html.twig:10 - - - tfa.check.code.help - Entrez le code à 6 chiffres de votre application d'authentification ou l'un de vos codes de secours si l'authentificateur n'est pas disponible. - - - - - Part-DB1\templates\security\login.html.twig:3 - Part-DB1\templates\security\login.html.twig:3 - templates\security\login.html.twig:3 - - - login.title - Connexion - - - - - Part-DB1\templates\security\login.html.twig:7 - Part-DB1\templates\security\login.html.twig:7 - templates\security\login.html.twig:7 - - - login.card_title - Connexion - - - - - Part-DB1\templates\security\login.html.twig:31 - Part-DB1\templates\security\login.html.twig:31 - templates\security\login.html.twig:31 - - - login.username.label - Nom d'utilisateur - - - - - Part-DB1\templates\security\login.html.twig:34 - Part-DB1\templates\security\login.html.twig:34 - templates\security\login.html.twig:34 - - - login.username.placeholder - Nom d'utilisateur - - - - - Part-DB1\templates\security\login.html.twig:38 - Part-DB1\templates\security\login.html.twig:38 - templates\security\login.html.twig:38 - - - login.password.label - Mot de passe - - - - - Part-DB1\templates\security\login.html.twig:40 - Part-DB1\templates\security\login.html.twig:40 - templates\security\login.html.twig:40 - - - login.password.placeholder - Mot de passe - - - - - Part-DB1\templates\security\login.html.twig:50 - Part-DB1\templates\security\login.html.twig:50 - templates\security\login.html.twig:50 - - - login.rememberme - Rester connecté (non recommandé sur les ordinateurs publics) - - - - - Part-DB1\templates\security\login.html.twig:64 - Part-DB1\templates\security\login.html.twig:64 - - - pw_reset.password_forget - Nom d'utilisateur/mot de passe oublié ? - - - - - Part-DB1\templates\security\pw_reset_new_pw.html.twig:5 - Part-DB1\templates\security\pw_reset_new_pw.html.twig:5 - - - pw_reset.new_pw.header.title - Définir un nouveau mot de passe - - - - - Part-DB1\templates\security\pw_reset_request.html.twig:5 - Part-DB1\templates\security\pw_reset_request.html.twig:5 - - - pw_reset.request.header.title - Demander un nouveau mot de passe - - - - - Part-DB1\templates\security\U2F\u2f_login.html.twig:7 - Part-DB1\templates\security\U2F\u2f_register.html.twig:10 - Part-DB1\templates\security\U2F\u2f_login.html.twig:7 - Part-DB1\templates\security\U2F\u2f_register.html.twig:10 - - - tfa_u2f.http_warning - Vous accédez à cette page en utilisant la méthode HTTP non sécurisée, donc U2F ne fonctionnera probablement pas (message d'erreur "Bad Request"). Demandez à un administrateur de mettre en place la méthode HTTPS sécurisée si vous souhaitez utiliser des clés de sécurité. - - - - - Part-DB1\templates\security\U2F\u2f_login.html.twig:10 - Part-DB1\templates\security\U2F\u2f_register.html.twig:22 - Part-DB1\templates\security\U2F\u2f_login.html.twig:10 - Part-DB1\templates\security\U2F\u2f_register.html.twig:22 - - - r_u2f_two_factor.pressbutton - Veuillez insérer la clé de sécurité et appuyer sur le bouton ! - - - - - Part-DB1\templates\security\U2F\u2f_register.html.twig:3 - Part-DB1\templates\security\U2F\u2f_register.html.twig:3 - - - tfa_u2f.add_key.title - Ajouter une clé de sécurité - - - - - Part-DB1\templates\security\U2F\u2f_register.html.twig:6 - Part-DB1\templates\Users\_2fa_settings.html.twig:111 - Part-DB1\templates\security\U2F\u2f_register.html.twig:6 - Part-DB1\templates\Users\_2fa_settings.html.twig:111 - - - tfa_u2f.explanation - À l'aide d'une clé de sécurité compatible U2F/FIDO (par exemple YubiKey ou NitroKey), une authentification à deux facteurs sûre et pratique peut être obtenue. Les clés de sécurité peuvent être enregistrées ici, et si une vérification à deux facteurs est nécessaire, il suffit d'insérer la clé via USB ou de la taper sur le dispositif via NFC. - - - - - Part-DB1\templates\security\U2F\u2f_register.html.twig:7 - Part-DB1\templates\security\U2F\u2f_register.html.twig:7 - - - tfa_u2f.add_key.backup_hint - Pour garantir l'accès même en cas de perte de la clé, il est recommandé d'enregistrer une deuxième clé en guise de sauvegarde et de la conserver dans un endroit sûr ! - - - - - Part-DB1\templates\security\U2F\u2f_register.html.twig:16 - Part-DB1\templates\security\U2F\u2f_register.html.twig:16 - - - r_u2f_two_factor.name - Afficher le nom de la clé (par exemple, sauvegarde) - - - - - Part-DB1\templates\security\U2F\u2f_register.html.twig:19 - Part-DB1\templates\security\U2F\u2f_register.html.twig:19 - - - tfa_u2f.add_key.add_button - Ajouter une clé de sécurité - - - - - Part-DB1\templates\security\U2F\u2f_register.html.twig:27 - Part-DB1\templates\security\U2F\u2f_register.html.twig:27 - - - tfa_u2f.add_key.back_to_settings - Retour aux paramètres - - - - - Part-DB1\templates\Statistics\statistics.html.twig:5 - Part-DB1\templates\Statistics\statistics.html.twig:8 - Part-DB1\templates\Statistics\statistics.html.twig:5 - Part-DB1\templates\Statistics\statistics.html.twig:8 - new - - - statistics.title - Statistiques - - - - - Part-DB1\templates\Statistics\statistics.html.twig:14 - Part-DB1\templates\Statistics\statistics.html.twig:14 - new - - - statistics.parts - Composants - - - - - Part-DB1\templates\Statistics\statistics.html.twig:19 - Part-DB1\templates\Statistics\statistics.html.twig:19 - new - - - statistics.data_structures - Structures des données - - - - - Part-DB1\templates\Statistics\statistics.html.twig:24 - Part-DB1\templates\Statistics\statistics.html.twig:24 - new - - - statistics.attachments - Fichiers joints - - - - - Part-DB1\templates\Statistics\statistics.html.twig:34 - Part-DB1\templates\Statistics\statistics.html.twig:59 - Part-DB1\templates\Statistics\statistics.html.twig:104 - Part-DB1\templates\Statistics\statistics.html.twig:34 - Part-DB1\templates\Statistics\statistics.html.twig:59 - Part-DB1\templates\Statistics\statistics.html.twig:104 - new - - - statistics.property - Propriété - - - - - Part-DB1\templates\Statistics\statistics.html.twig:35 - Part-DB1\templates\Statistics\statistics.html.twig:60 - Part-DB1\templates\Statistics\statistics.html.twig:105 - Part-DB1\templates\Statistics\statistics.html.twig:35 - Part-DB1\templates\Statistics\statistics.html.twig:60 - Part-DB1\templates\Statistics\statistics.html.twig:105 - new - - - statistics.value - Valeur - - - - - Part-DB1\templates\Statistics\statistics.html.twig:40 - Part-DB1\templates\Statistics\statistics.html.twig:40 - new - - - statistics.distinct_parts_count - Nombre de composants distincts - - - - - Part-DB1\templates\Statistics\statistics.html.twig:44 - Part-DB1\templates\Statistics\statistics.html.twig:44 - new - - - statistics.parts_instock_sum - Somme de tout les composants en stock - - - - - Part-DB1\templates\Statistics\statistics.html.twig:48 - Part-DB1\templates\Statistics\statistics.html.twig:48 - new - - - statistics.parts_with_price - Nombre de composants avec information de prix - - - - - Part-DB1\templates\Statistics\statistics.html.twig:65 - Part-DB1\templates\Statistics\statistics.html.twig:65 - new - - - statistics.categories_count - Nombre de catégories - - - - - Part-DB1\templates\Statistics\statistics.html.twig:69 - Part-DB1\templates\Statistics\statistics.html.twig:69 - new - - - statistics.footprints_count - Nombre d'empreintes - - - - - Part-DB1\templates\Statistics\statistics.html.twig:73 - Part-DB1\templates\Statistics\statistics.html.twig:73 - new - - - statistics.manufacturers_count - Nombre de fabricants - - - - - Part-DB1\templates\Statistics\statistics.html.twig:77 - Part-DB1\templates\Statistics\statistics.html.twig:77 - new - - - statistics.storelocations_count - Nombre d'emplacements de stockage - - - - - Part-DB1\templates\Statistics\statistics.html.twig:81 - Part-DB1\templates\Statistics\statistics.html.twig:81 - new - - - statistics.suppliers_count - Nombre de fournisseurs - - - - - Part-DB1\templates\Statistics\statistics.html.twig:85 - Part-DB1\templates\Statistics\statistics.html.twig:85 - new - - - statistics.currencies_count - Nombre de devises - - - - - Part-DB1\templates\Statistics\statistics.html.twig:89 - Part-DB1\templates\Statistics\statistics.html.twig:89 - new - - - statistics.measurement_units_count - Nombre d'unités de mesure - - - - - Part-DB1\templates\Statistics\statistics.html.twig:93 - Part-DB1\templates\Statistics\statistics.html.twig:93 - new - - - statistics.devices_count - Nombre de projets - - - - - Part-DB1\templates\Statistics\statistics.html.twig:110 - Part-DB1\templates\Statistics\statistics.html.twig:110 - new - - - statistics.attachment_types_count - Nombre de types de fichiers joints - - - - - Part-DB1\templates\Statistics\statistics.html.twig:114 - Part-DB1\templates\Statistics\statistics.html.twig:114 - new - - - statistics.all_attachments_count - Total des pièces jointes - - - - - Part-DB1\templates\Statistics\statistics.html.twig:118 - Part-DB1\templates\Statistics\statistics.html.twig:118 - new - - - statistics.user_uploaded_attachments_count - Nombre de fichiers joints envoyées - - - - - Part-DB1\templates\Statistics\statistics.html.twig:122 - Part-DB1\templates\Statistics\statistics.html.twig:122 - new - - - statistics.private_attachments_count - Nombre de fichiers joints privés - - - - - Part-DB1\templates\Statistics\statistics.html.twig:126 - Part-DB1\templates\Statistics\statistics.html.twig:126 - new - - - statistics.external_attachments_count - Nombre de fichiers joints externes - - - - - Part-DB1\templates\Users\backup_codes.html.twig:3 - Part-DB1\templates\Users\backup_codes.html.twig:9 - Part-DB1\templates\Users\backup_codes.html.twig:3 - Part-DB1\templates\Users\backup_codes.html.twig:9 - - - tfa_backup.codes.title - Codes de secours - - - - - Part-DB1\templates\Users\backup_codes.html.twig:12 - Part-DB1\templates\Users\backup_codes.html.twig:12 - - - tfa_backup.codes.explanation - Imprimez ces codes et conservez-les dans un endroit sûr ! - - - - - Part-DB1\templates\Users\backup_codes.html.twig:13 - Part-DB1\templates\Users\backup_codes.html.twig:13 - - - tfa_backup.codes.help - Si vous n'avez plus accès à votre appareil avec l'application d'authentification (smartphone perdu, perte de données, etc.), vous pouvez utiliser un de ces codes pour accéder à votre compte et éventuellement configurer une nouvelle application d'authentification. Chacun de ces codes peut être utilisé une fois, il est recommandé de supprimer les codes utilisés. Toute personne ayant accès à ces codes peut potentiellement accéder à votre compte, alors gardez-les en lieu sûr. - - - - - Part-DB1\templates\Users\backup_codes.html.twig:16 - Part-DB1\templates\Users\backup_codes.html.twig:16 - - - tfa_backup.username - Nom d'utilisateur - - - - - Part-DB1\templates\Users\backup_codes.html.twig:29 - Part-DB1\templates\Users\backup_codes.html.twig:29 - - - tfa_backup.codes.page_generated_on - Page générée le %date% - - - - - Part-DB1\templates\Users\backup_codes.html.twig:32 - Part-DB1\templates\Users\backup_codes.html.twig:32 - - - tfa_backup.codes.print - Imprimer - - - - - Part-DB1\templates\Users\backup_codes.html.twig:35 - Part-DB1\templates\Users\backup_codes.html.twig:35 - - - tfa_backup.codes.copy_clipboard - Copier dans le presse-papier - - - - - Part-DB1\templates\Users\user_info.html.twig:3 - Part-DB1\templates\Users\user_info.html.twig:6 - Part-DB1\templates\_navbar.html.twig:40 - Part-DB1\templates\Users\user_info.html.twig:3 - Part-DB1\templates\Users\user_info.html.twig:6 - Part-DB1\templates\_navbar.html.twig:38 - templates\base.html.twig:99 - templates\Users\user_info.html.twig:3 - templates\Users\user_info.html.twig:6 - - - user.info.label - Informations sur l'utilisateur - - - - - Part-DB1\templates\Users\user_info.html.twig:18 - Part-DB1\src\Form\UserSettingsType.php:77 - Part-DB1\templates\Users\user_info.html.twig:18 - Part-DB1\src\Form\UserSettingsType.php:77 - templates\Users\user_info.html.twig:18 - src\Form\UserSettingsType.php:32 - - - user.firstName.label - Prénom - - - - - Part-DB1\templates\Users\user_info.html.twig:24 - Part-DB1\src\Form\UserSettingsType.php:82 - Part-DB1\templates\Users\user_info.html.twig:24 - Part-DB1\src\Form\UserSettingsType.php:82 - templates\Users\user_info.html.twig:24 - src\Form\UserSettingsType.php:35 - - - user.lastName.label - Nom - - - - - Part-DB1\templates\Users\user_info.html.twig:30 - Part-DB1\src\Form\UserSettingsType.php:92 - Part-DB1\templates\Users\user_info.html.twig:30 - Part-DB1\src\Form\UserSettingsType.php:92 - templates\Users\user_info.html.twig:30 - src\Form\UserSettingsType.php:41 - - - user.email.label - Email - - - - - Part-DB1\templates\Users\user_info.html.twig:37 - Part-DB1\src\Form\UserSettingsType.php:87 - Part-DB1\templates\Users\user_info.html.twig:37 - Part-DB1\src\Form\UserSettingsType.php:87 - templates\Users\user_info.html.twig:37 - src\Form\UserSettingsType.php:38 - - - user.department.label - Département - - - - - Part-DB1\templates\Users\user_info.html.twig:47 - Part-DB1\src\Form\UserSettingsType.php:73 - Part-DB1\templates\Users\user_info.html.twig:47 - Part-DB1\src\Form\UserSettingsType.php:73 - templates\Users\user_info.html.twig:47 - src\Form\UserSettingsType.php:30 - - - user.username.label - Nom d'utilisateur - - - - - Part-DB1\templates\Users\user_info.html.twig:53 - Part-DB1\src\Services\ElementTypeNameGenerator.php:93 - Part-DB1\templates\Users\user_info.html.twig:53 - Part-DB1\src\Services\ElementTypeNameGenerator.php:93 - templates\Users\user_info.html.twig:53 - - - group.label - Groupe - - - - - Part-DB1\templates\Users\user_info.html.twig:67 - Part-DB1\templates\Users\user_info.html.twig:67 - - - user.permissions - Autorisations - - - - - Part-DB1\templates\Users\user_settings.html.twig:3 - Part-DB1\templates\Users\user_settings.html.twig:6 - Part-DB1\templates\_navbar.html.twig:39 - Part-DB1\templates\Users\user_settings.html.twig:3 - Part-DB1\templates\Users\user_settings.html.twig:6 - Part-DB1\templates\_navbar.html.twig:37 - templates\base.html.twig:98 - templates\Users\user_settings.html.twig:3 - templates\Users\user_settings.html.twig:6 - - - user.settings.label - Paramètres utilisateur - - - - - Part-DB1\templates\Users\user_settings.html.twig:18 - Part-DB1\templates\Users\user_settings.html.twig:18 - templates\Users\user_settings.html.twig:14 - - - user_settings.data.label - Données personnelles - - - - - Part-DB1\templates\Users\user_settings.html.twig:22 - Part-DB1\templates\Users\user_settings.html.twig:22 - templates\Users\user_settings.html.twig:18 - - - user_settings.configuration.label - Configuration - - - - - Part-DB1\templates\Users\user_settings.html.twig:55 - Part-DB1\templates\Users\user_settings.html.twig:55 - templates\Users\user_settings.html.twig:48 - - - user.settings.change_pw - Changer de mot de passe - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:6 - Part-DB1\templates\Users\_2fa_settings.html.twig:6 - - - user.settings.2fa_settings - Authentification à deux facteurs - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:13 - Part-DB1\templates\Users\_2fa_settings.html.twig:13 - - - tfa.settings.google.tab - Application d'authentification - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:17 - Part-DB1\templates\Users\_2fa_settings.html.twig:17 - - - tfa.settings.bakup.tab - Codes de secours - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:21 - Part-DB1\templates\Users\_2fa_settings.html.twig:21 - - - tfa.settings.u2f.tab - Clés de sécurité (U2F) - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:25 - Part-DB1\templates\Users\_2fa_settings.html.twig:25 - - - tfa.settings.trustedDevices.tab - Appareils de confiance - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:33 - Part-DB1\templates\Users\_2fa_settings.html.twig:33 - - - tfa_google.disable.confirm_title - Voulez-vous vraiment désactiver l'application d'authentification ? - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:33 - Part-DB1\templates\Users\_2fa_settings.html.twig:33 - - - tfa_google.disable.confirm_message - Si vous désactivez l'application d'authentification, tous les codes de sauvegarde seront supprimés, vous devrez donc peut-être les réimprimer.<br> -Notez également que sans authentification à deux facteurs, votre compte n'est pas aussi bien protégé ! - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:39 - Part-DB1\templates\Users\_2fa_settings.html.twig:39 - - - tfa_google.disabled_message - Application d'authentification désactivée - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:48 - Part-DB1\templates\Users\_2fa_settings.html.twig:48 - - - tfa_google.step.download - Télécharger une application d'authentification (par exemple <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Authentificateur Google</a> ou <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">Authentificateur FreeOTP</a>) - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:49 - Part-DB1\templates\Users\_2fa_settings.html.twig:49 - - - tfa_google.step.scan - Scannez le QR code adjacent avec l'application ou saisissez les données manuellement - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:50 - Part-DB1\templates\Users\_2fa_settings.html.twig:50 - - - tfa_google.step.input_code - Entrez le code généré dans le champ ci-dessous et confirmez - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:51 - Part-DB1\templates\Users\_2fa_settings.html.twig:51 - - - tfa_google.step.download_backup - Imprimez vos codes de secours et conservez-les dans un endroit sûr - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:58 - Part-DB1\templates\Users\_2fa_settings.html.twig:58 - - - tfa_google.manual_setup - Configuration manuelle - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:62 - Part-DB1\templates\Users\_2fa_settings.html.twig:62 - - - tfa_google.manual_setup.type - Type - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:63 - Part-DB1\templates\Users\_2fa_settings.html.twig:63 - - - tfa_google.manual_setup.username - Nom d'utilisateur - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:64 - Part-DB1\templates\Users\_2fa_settings.html.twig:64 - - - tfa_google.manual_setup.secret - Secret - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:65 - Part-DB1\templates\Users\_2fa_settings.html.twig:65 - - - tfa_google.manual_setup.digit_count - Nombre de caractères - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:74 - Part-DB1\templates\Users\_2fa_settings.html.twig:74 - - - tfa_google.enabled_message - Application d'authentification activée - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:83 - Part-DB1\templates\Users\_2fa_settings.html.twig:83 - - - tfa_backup.disabled - Codes de secours désactivés. Configurez l'application d'authentification pour activer les codes de secours. - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:84 - Part-DB1\templates\Users\_2fa_settings.html.twig:92 - Part-DB1\templates\Users\_2fa_settings.html.twig:84 - Part-DB1\templates\Users\_2fa_settings.html.twig:92 - - - tfa_backup.explanation - Grâce à ces codes de secours, vous pouvez accéder à votre compte même si vous perdez l'appareil avec l'application d'authentification. Imprimez les codes et conservez-les dans un endroit sûr. - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:88 - Part-DB1\templates\Users\_2fa_settings.html.twig:88 - - - tfa_backup.reset_codes.confirm_title - Etes vous sûr de vouloir réinitialiser les codes ? - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:88 - Part-DB1\templates\Users\_2fa_settings.html.twig:88 - - - tfa_backup.reset_codes.confirm_message - Cela permettra de supprimer tous les codes précédents et de générer un ensemble de nouveaux codes. Cela ne peut pas être annulé. N'oubliez pas d'imprimer les nouveaux codes et de les conserver dans un endroit sûr ! - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:91 - Part-DB1\templates\Users\_2fa_settings.html.twig:91 - - - tfa_backup.enabled - Codes de secours activés - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:99 - Part-DB1\templates\Users\_2fa_settings.html.twig:99 - - - tfa_backup.show_codes - Afficher les codes de secours - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:114 - Part-DB1\templates\Users\_2fa_settings.html.twig:114 - - - tfa_u2f.table_caption - Clés de sécurité enregistrées - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:115 - Part-DB1\templates\Users\_2fa_settings.html.twig:115 - - - tfa_u2f.delete_u2f.confirm_title - Etes vous sûr de vouloir supprimer cette clé de sécurité ? - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:116 - Part-DB1\templates\Users\_2fa_settings.html.twig:116 - - - tfa_u2f.delete_u2f.confirm_message - Si vous supprimez cette clé, il ne sera plus possible de se connecter avec cette clé. S'il ne reste aucune clé de sécurité, l'authentification à deux facteurs sera désactivée. - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:123 - Part-DB1\templates\Users\_2fa_settings.html.twig:123 - - - tfa_u2f.keys.name - Nom de la clé - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:124 - Part-DB1\templates\Users\_2fa_settings.html.twig:124 - - - tfa_u2f.keys.added_date - Date d'enregistrement - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:134 - Part-DB1\templates\Users\_2fa_settings.html.twig:134 - - - tfa_u2f.key_delete - Supprimer la clé - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:141 - Part-DB1\templates\Users\_2fa_settings.html.twig:141 - - - tfa_u2f.no_keys_registered - Aucune clé de sécurité enregistrée - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:144 - Part-DB1\templates\Users\_2fa_settings.html.twig:144 - - - tfa_u2f.add_new_key - Enregistrer une nouvelle clé de sécurité - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:148 - Part-DB1\templates\Users\_2fa_settings.html.twig:148 - - - tfa_trustedDevices.explanation - Lors de la vérification du deuxième facteur, l'ordinateur actuel peut être marqué comme étant digne de confiance, de sorte qu'il n'est plus nécessaire de procéder à des vérifications à deux facteurs sur cet ordinateur. -Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fiable, vous pouvez réinitialiser le statut de <i>tous</i> les ordinateurs ici. - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:149 - Part-DB1\templates\Users\_2fa_settings.html.twig:149 - - - tfa_trustedDevices.invalidate.confirm_title - Etes vous sûr de vouloir supprimer tous les ordinateurs de confiance ? - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:150 - Part-DB1\templates\Users\_2fa_settings.html.twig:150 - - - tfa_trustedDevices.invalidate.confirm_message - Vous devrez à nouveau procéder à une authentification à deux facteurs sur tous les ordinateurs. Assurez-vous d'avoir votre appareil à deux facteurs à portée de main. - - - - - Part-DB1\templates\Users\_2fa_settings.html.twig:154 - Part-DB1\templates\Users\_2fa_settings.html.twig:154 - - - tfa_trustedDevices.invalidate.btn - Supprimer tous les dispositifs de confiance - - - - - Part-DB1\templates\_navbar.html.twig:4 - Part-DB1\templates\_navbar.html.twig:4 - templates\base.html.twig:29 - - - sidebar.toggle - Activer/désactiver la barre latérale - - - - - Part-DB1\templates\_navbar.html.twig:22 - - - navbar.scanner.link - Scanner - - - - - Part-DB1\templates\_navbar.html.twig:38 - Part-DB1\templates\_navbar.html.twig:36 - templates\base.html.twig:97 - - - user.loggedin.label - Connecté en tant que - - - - - Part-DB1\templates\_navbar.html.twig:44 - Part-DB1\templates\_navbar.html.twig:42 - templates\base.html.twig:103 - - - user.login - Connexion - - - - - Part-DB1\templates\_navbar.html.twig:50 - Part-DB1\templates\_navbar.html.twig:48 - - - ui.toggle_darkmode - Darkmode - - - - - Part-DB1\templates\_navbar.html.twig:54 - Part-DB1\src\Form\UserSettingsType.php:97 - Part-DB1\templates\_navbar.html.twig:52 - Part-DB1\src\Form\UserSettingsType.php:97 - templates\base.html.twig:106 - src\Form\UserSettingsType.php:44 - - - user.language_select - Langue - - - - - Part-DB1\templates\_navbar_search.html.twig:4 - Part-DB1\templates\_navbar_search.html.twig:4 - templates\base.html.twig:49 - - - search.options.label - Options de recherche - - - - - Part-DB1\templates\_navbar_search.html.twig:23 - - - tags.label - Tags - - - - - Part-DB1\templates\_navbar_search.html.twig:27 - Part-DB1\src\Form\LabelOptionsType.php:68 - Part-DB1\src\Services\ElementTypeNameGenerator.php:88 - Part-DB1\src\Services\ElementTypeNameGenerator.php:88 - templates\base.html.twig:60 - templates\Parts\show_part_info.html.twig:36 - src\Form\PartType.php:77 - - - storelocation.label - Emplacement de stockage - - - - - Part-DB1\templates\_navbar_search.html.twig:36 - Part-DB1\templates\_navbar_search.html.twig:31 - templates\base.html.twig:65 - - - ordernumber.label.short - Codecmd. - - - - - Part-DB1\templates\_navbar_search.html.twig:40 - Part-DB1\src\Services\ElementTypeNameGenerator.php:89 - Part-DB1\templates\_navbar_search.html.twig:35 - Part-DB1\src\Services\ElementTypeNameGenerator.php:89 - templates\base.html.twig:67 - - - supplier.label - Fournisseur - - - - - Part-DB1\templates\_navbar_search.html.twig:57 - Part-DB1\templates\_navbar_search.html.twig:52 - templates\base.html.twig:75 - - - search.deactivateBarcode - Désa. Code barres - - - - - Part-DB1\templates\_navbar_search.html.twig:61 - Part-DB1\templates\_navbar_search.html.twig:56 - templates\base.html.twig:77 - - - search.regexmatching - Reg.Ex. Correspondance - - - - - Part-DB1\templates\_navbar_search.html.twig:68 - Part-DB1\templates\_navbar_search.html.twig:62 - - - search.submit - Rechercher! - - - - - Part-DB1\templates\_sidebar.html.twig:2 - Part-DB1\templates\_sidebar.html.twig:2 - templates\base.html.twig:165 - templates\base.html.twig:192 - templates\base.html.twig:220 - - - actions - Actions - - - - - Part-DB1\templates\_sidebar.html.twig:6 - Part-DB1\templates\_sidebar.html.twig:6 - templates\base.html.twig:169 - templates\base.html.twig:196 - templates\base.html.twig:224 - - - datasource - Source de données - - - - - Part-DB1\templates\_sidebar.html.twig:10 - Part-DB1\templates\_sidebar.html.twig:10 - templates\base.html.twig:173 - templates\base.html.twig:200 - templates\base.html.twig:228 - - - manufacturer.labelp - Fabricants - - - - - Part-DB1\templates\_sidebar.html.twig:11 - Part-DB1\templates\_sidebar.html.twig:11 - templates\base.html.twig:174 - templates\base.html.twig:201 - templates\base.html.twig:229 - - - supplier.labelp - Fournisseurs - - - - - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:213 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:293 - Part-DB1\src\Controller\PartController.php:173 - Part-DB1\src\Controller\PartController.php:293 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:181 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:243 - Part-DB1\src\Controller\PartController.php:173 - Part-DB1\src\Controller\PartController.php:268 - - - attachment.download_failed - Le téléchargement du fichier joint a échoué ! - - - - - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:222 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:190 - - - entity.edit_flash - Changements sauvegardés avec succès. - - - - - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:231 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:196 - - - entity.edit_flash.invalid - Les changements n'ont pas pu être sauvegardés ! Veuillez vérifier vos données ! - - - - - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:302 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:252 - - - entity.created_flash - Élément créé avec succès ! - - - - - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:308 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:258 - - - entity.created_flash.invalid - L'élément n'a pas pu être créé ! Vérifiez vos données ! - - - - - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:399 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:352 - src\Controller\BaseAdminController.php:154 - - - attachment_type.deleted - Élément supprimé ! - - - - - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:401 - Part-DB1\src\Controller\UserController.php:109 - Part-DB1\src\Controller\UserSettingsController.php:159 - Part-DB1\src\Controller\UserSettingsController.php:193 - Part-DB1\src\Controller\AdminPages\BaseAdminController.php:354 - Part-DB1\src\Controller\UserController.php:101 - Part-DB1\src\Controller\UserSettingsController.php:150 - Part-DB1\src\Controller\UserSettingsController.php:182 - - - csfr_invalid - Le jeton RFTS n'est pas valable ! Rechargez cette page ou contactez un administrateur si le problème persiste ! - - - - - Part-DB1\src\Controller\LabelController.php:125 - - - label_generator.no_entities_found - Aucune entité correspondant à la gamme trouvée. - - - - - Part-DB1\src\Controller\LogController.php:149 - Part-DB1\src\Controller\LogController.php:154 - new - - - log.undo.target_not_found - L'élément ciblé n'a pas pu être trouvé dans la base de données ! - - - - - Part-DB1\src\Controller\LogController.php:156 - Part-DB1\src\Controller\LogController.php:160 - new - - - log.undo.revert_success - Rétablissement réussi. - - - - - Part-DB1\src\Controller\LogController.php:176 - Part-DB1\src\Controller\LogController.php:180 - new - - - log.undo.element_undelete_success - Élément restauré avec succès. - - - - - Part-DB1\src\Controller\LogController.php:178 - Part-DB1\src\Controller\LogController.php:182 - new - - - log.undo.element_element_already_undeleted - L'élément a déjà été restauré ! - - - - - Part-DB1\src\Controller\LogController.php:185 - Part-DB1\src\Controller\LogController.php:189 - new - - - log.undo.element_delete_success - L'élément a été supprimé avec succès. - - - - - Part-DB1\src\Controller\LogController.php:187 - Part-DB1\src\Controller\LogController.php:191 - new - - - log.undo.element.element_already_delted - L'élément a déjà été supprimé ! - - - - - Part-DB1\src\Controller\LogController.php:194 - Part-DB1\src\Controller\LogController.php:198 - new - - - log.undo.element_change_undone - Annulation de la modification de l'élément - - - - - Part-DB1\src\Controller\LogController.php:196 - Part-DB1\src\Controller\LogController.php:200 - new - - - log.undo.do_undelete_before - Vous devez supprimer l'élément avant de pouvoir annuler ce changement ! - - - - - Part-DB1\src\Controller\LogController.php:199 - Part-DB1\src\Controller\LogController.php:203 - new - - - log.undo.log_type_invalid - Cette entrée de journal ne peut pas être annulée ! - - - - - Part-DB1\src\Controller\PartController.php:182 - Part-DB1\src\Controller\PartController.php:182 - src\Controller\PartController.php:80 - - - part.edited_flash - Changements sauvegardés ! - - - - - Part-DB1\src\Controller\PartController.php:186 - Part-DB1\src\Controller\PartController.php:186 - - - part.edited_flash.invalid - Erreur lors de l'enregistrement : Vérifiez vos données ! - - - - - Part-DB1\src\Controller\PartController.php:216 - Part-DB1\src\Controller\PartController.php:219 - - - part.deleted - Composant supprimé avec succès. - - - - - Part-DB1\src\Controller\PartController.php:302 - Part-DB1\src\Controller\PartController.php:277 - Part-DB1\src\Controller\PartController.php:317 - src\Controller\PartController.php:113 - src\Controller\PartController.php:142 - - - part.created_flash - Composants créés avec succès ! - - - - - Part-DB1\src\Controller\PartController.php:308 - Part-DB1\src\Controller\PartController.php:283 - - - part.created_flash.invalid - Erreur lors de la création : Vérifiez vos données ! - - - - - Part-DB1\src\Controller\ScanController.php:68 - Part-DB1\src\Controller\ScanController.php:90 - - - scan.qr_not_found - Aucun élément trouvé pour le code-barres donné. - - - - - Part-DB1\src\Controller\ScanController.php:71 - - - scan.format_unknown - Format inconnu ! - - - - - Part-DB1\src\Controller\ScanController.php:86 - - - scan.qr_success - Élément trouvé. - - - - - Part-DB1\src\Controller\SecurityController.php:114 - Part-DB1\src\Controller\SecurityController.php:109 - - - pw_reset.user_or_email - Nom d'utilisateur / Email - - - - - Part-DB1\src\Controller\SecurityController.php:131 - Part-DB1\src\Controller\SecurityController.php:126 - - - pw_reset.request.success - Demande de mot de passe réussie ! Consultez vos e-mails pour plus d'informations. - - - - - Part-DB1\src\Controller\SecurityController.php:162 - Part-DB1\src\Controller\SecurityController.php:160 - - - pw_reset.username - Nom d'utilisateur - - - - - Part-DB1\src\Controller\SecurityController.php:165 - Part-DB1\src\Controller\SecurityController.php:163 - - - pw_reset.token - Jeton - - - - - Part-DB1\src\Controller\SecurityController.php:194 - Part-DB1\src\Controller\SecurityController.php:192 - - - pw_reset.new_pw.error - Nom d'utilisateur ou jeton invalide ! Veuillez vérifier vos données. - - - - - Part-DB1\src\Controller\SecurityController.php:196 - Part-DB1\src\Controller\SecurityController.php:194 - - - pw_reset.new_pw.success - Le mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter avec le nouveau mot de passe. - - - - - Part-DB1\src\Controller\UserController.php:107 - Part-DB1\src\Controller\UserController.php:99 - - - user.edit.reset_success - Toutes les méthodes d'authentification à deux facteurs ont été désactivées avec succès. - - - - - Part-DB1\src\Controller\UserSettingsController.php:101 - Part-DB1\src\Controller\UserSettingsController.php:92 - - - tfa_backup.no_codes_enabled - Aucun code de secours n'est activé ! - - - - - Part-DB1\src\Controller\UserSettingsController.php:138 - Part-DB1\src\Controller\UserSettingsController.php:132 - - - tfa_u2f.u2f_delete.not_existing - Il n'y a pas de clé de sécurité avec cet ID ! - - - - - Part-DB1\src\Controller\UserSettingsController.php:145 - Part-DB1\src\Controller\UserSettingsController.php:139 - - - tfa_u2f.u2f_delete.access_denied - Vous ne pouvez pas supprimer les clés de sécurité des autres utilisateurs ! - - - - - Part-DB1\src\Controller\UserSettingsController.php:153 - Part-DB1\src\Controller\UserSettingsController.php:147 - - - tfa.u2f.u2f_delete.success - Clé de sécurité retirée avec succès. - - - - - Part-DB1\src\Controller\UserSettingsController.php:188 - Part-DB1\src\Controller\UserSettingsController.php:180 - - - tfa_trustedDevice.invalidate.success - Les appareils de confiance ont été réinitialisés avec succès. - - - - - Part-DB1\src\Controller\UserSettingsController.php:235 - Part-DB1\src\Controller\UserSettingsController.php:226 - src\Controller\UserController.php:98 - - - user.settings.saved_flash - Paramètres sauvegardés ! - - - - - Part-DB1\src\Controller\UserSettingsController.php:297 - Part-DB1\src\Controller\UserSettingsController.php:288 - src\Controller\UserController.php:130 - - - user.settings.pw_changed_flash - Mot de passe changé ! - - - - - Part-DB1\src\Controller\UserSettingsController.php:317 - Part-DB1\src\Controller\UserSettingsController.php:306 - - - user.settings.2fa.google.activated - L'application d'authentification a été activée avec succès. - - - - - Part-DB1\src\Controller\UserSettingsController.php:328 - Part-DB1\src\Controller\UserSettingsController.php:315 - - - user.settings.2fa.google.disabled - L'application d'authentification a été désactivée avec succès. - - - - - Part-DB1\src\Controller\UserSettingsController.php:346 - Part-DB1\src\Controller\UserSettingsController.php:332 - - - user.settings.2fa.backup_codes.regenerated - De nouveaux codes de secours ont été générés avec succès. - - - - - Part-DB1\src\DataTables\AttachmentDataTable.php:148 - Part-DB1\src\DataTables\AttachmentDataTable.php:148 - - - attachment.table.filename - Nom du fichier - - - - - Part-DB1\src\DataTables\AttachmentDataTable.php:153 - Part-DB1\src\DataTables\AttachmentDataTable.php:153 - - - attachment.table.filesize - Taille du fichier - - - - - Part-DB1\src\DataTables\AttachmentDataTable.php:183 - Part-DB1\src\DataTables\AttachmentDataTable.php:191 - Part-DB1\src\DataTables\AttachmentDataTable.php:200 - Part-DB1\src\DataTables\AttachmentDataTable.php:209 - Part-DB1\src\DataTables\PartsDataTable.php:245 - Part-DB1\src\DataTables\PartsDataTable.php:252 - Part-DB1\src\DataTables\AttachmentDataTable.php:183 - Part-DB1\src\DataTables\AttachmentDataTable.php:191 - Part-DB1\src\DataTables\AttachmentDataTable.php:200 - Part-DB1\src\DataTables\AttachmentDataTable.php:209 - Part-DB1\src\DataTables\PartsDataTable.php:193 - Part-DB1\src\DataTables\PartsDataTable.php:200 - - - true - Vrai - - - - - Part-DB1\src\DataTables\AttachmentDataTable.php:184 - Part-DB1\src\DataTables\AttachmentDataTable.php:192 - Part-DB1\src\DataTables\AttachmentDataTable.php:201 - Part-DB1\src\DataTables\AttachmentDataTable.php:210 - Part-DB1\src\DataTables\PartsDataTable.php:246 - Part-DB1\src\DataTables\PartsDataTable.php:253 - Part-DB1\src\Form\Type\SIUnitType.php:139 - Part-DB1\src\DataTables\AttachmentDataTable.php:184 - Part-DB1\src\DataTables\AttachmentDataTable.php:192 - Part-DB1\src\DataTables\AttachmentDataTable.php:201 - Part-DB1\src\DataTables\AttachmentDataTable.php:210 - Part-DB1\src\DataTables\PartsDataTable.php:194 - Part-DB1\src\DataTables\PartsDataTable.php:201 - Part-DB1\src\Form\Type\SIUnitType.php:139 - - - false - Faux - - - - - Part-DB1\src\DataTables\Column\LogEntryTargetColumn.php:128 - Part-DB1\src\DataTables\Column\LogEntryTargetColumn.php:119 - - - log.target_deleted - Cible supprimée. - - - - - Part-DB1\src\DataTables\Column\RevertLogColumn.php:57 - Part-DB1\src\DataTables\Column\RevertLogColumn.php:60 - new - - - log.undo.undelete - Annuler la suppression - - - - - Part-DB1\src\DataTables\Column\RevertLogColumn.php:63 - Part-DB1\src\DataTables\Column\RevertLogColumn.php:66 - new - - - log.undo.undo - Annuler la modification - - - - - Part-DB1\src\DataTables\Column\RevertLogColumn.php:83 - Part-DB1\src\DataTables\Column\RevertLogColumn.php:86 - new - - - log.undo.revert - Restaurer à cette date - - - - - Part-DB1\src\DataTables\LogDataTable.php:173 - Part-DB1\src\DataTables\LogDataTable.php:161 - - - log.id - ID - - - - - Part-DB1\src\DataTables\LogDataTable.php:178 - Part-DB1\src\DataTables\LogDataTable.php:166 - - - log.timestamp - Horodatage - - - - - Part-DB1\src\DataTables\LogDataTable.php:183 - Part-DB1\src\DataTables\LogDataTable.php:171 - - - log.type - Type - - - - - Part-DB1\src\DataTables\LogDataTable.php:191 - Part-DB1\src\DataTables\LogDataTable.php:179 - - - log.level - Niveau - - - - - Part-DB1\src\DataTables\LogDataTable.php:200 - Part-DB1\src\DataTables\LogDataTable.php:188 - - - log.user - Utilisateur - - - - - Part-DB1\src\DataTables\LogDataTable.php:213 - Part-DB1\src\DataTables\LogDataTable.php:201 - - - log.target_type - Type de cible - - - - - Part-DB1\src\DataTables\LogDataTable.php:226 - Part-DB1\src\DataTables\LogDataTable.php:214 - - - log.target - Cible - - - - - Part-DB1\src\DataTables\LogDataTable.php:231 - Part-DB1\src\DataTables\LogDataTable.php:218 - new - - - log.extra - Extra - - - - - Part-DB1\src\DataTables\PartsDataTable.php:168 - Part-DB1\src\DataTables\PartsDataTable.php:116 - - - part.table.name - Nom - - - - - Part-DB1\src\DataTables\PartsDataTable.php:178 - Part-DB1\src\DataTables\PartsDataTable.php:126 - - - part.table.id - ID - - - - - Part-DB1\src\DataTables\PartsDataTable.php:182 - Part-DB1\src\DataTables\PartsDataTable.php:130 - - - part.table.description - Description - - - - - Part-DB1\src\DataTables\PartsDataTable.php:185 - Part-DB1\src\DataTables\PartsDataTable.php:133 - - - part.table.category - Catégorie - - - - - Part-DB1\src\DataTables\PartsDataTable.php:190 - Part-DB1\src\DataTables\PartsDataTable.php:138 - - - part.table.footprint - Empreinte - - - - - Part-DB1\src\DataTables\PartsDataTable.php:194 - Part-DB1\src\DataTables\PartsDataTable.php:142 - - - part.table.manufacturer - Fabricant - - - - - Part-DB1\src\DataTables\PartsDataTable.php:197 - Part-DB1\src\DataTables\PartsDataTable.php:145 - - - part.table.storeLocations - Emplacement de stockage - - - - - Part-DB1\src\DataTables\PartsDataTable.php:216 - Part-DB1\src\DataTables\PartsDataTable.php:164 - - - part.table.amount - Quantité - - - - - Part-DB1\src\DataTables\PartsDataTable.php:224 - Part-DB1\src\DataTables\PartsDataTable.php:172 - - - part.table.minamount - Quantité min. - - - - - Part-DB1\src\DataTables\PartsDataTable.php:232 - Part-DB1\src\DataTables\PartsDataTable.php:180 - - - part.table.partUnit - Unité de mesure - - - - - Part-DB1\src\DataTables\PartsDataTable.php:236 - Part-DB1\src\DataTables\PartsDataTable.php:184 - - - part.table.addedDate - Créé le - - - - - Part-DB1\src\DataTables\PartsDataTable.php:240 - Part-DB1\src\DataTables\PartsDataTable.php:188 - - - part.table.lastModified - Dernière modification - - - - - Part-DB1\src\DataTables\PartsDataTable.php:244 - Part-DB1\src\DataTables\PartsDataTable.php:192 - - - part.table.needsReview - Révision nécessaire - - - - - Part-DB1\src\DataTables\PartsDataTable.php:251 - Part-DB1\src\DataTables\PartsDataTable.php:199 - - - part.table.favorite - Favoris - - - - - Part-DB1\src\DataTables\PartsDataTable.php:258 - Part-DB1\src\DataTables\PartsDataTable.php:206 - - - part.table.manufacturingStatus - État - - - - - Part-DB1\src\DataTables\PartsDataTable.php:260 - Part-DB1\src\DataTables\PartsDataTable.php:262 - Part-DB1\src\Form\Part\PartBaseType.php:90 - Part-DB1\src\DataTables\PartsDataTable.php:208 - Part-DB1\src\DataTables\PartsDataTable.php:210 - Part-DB1\src\Form\Part\PartBaseType.php:88 - - - m_status.unknown - Inconnu - - - - - Part-DB1\src\DataTables\PartsDataTable.php:263 - Part-DB1\src\Form\Part\PartBaseType.php:90 - Part-DB1\src\DataTables\PartsDataTable.php:211 - Part-DB1\src\Form\Part\PartBaseType.php:88 - - - m_status.announced - Annoncé - - - - - Part-DB1\src\DataTables\PartsDataTable.php:264 - Part-DB1\src\Form\Part\PartBaseType.php:90 - Part-DB1\src\DataTables\PartsDataTable.php:212 - Part-DB1\src\Form\Part\PartBaseType.php:88 - - - m_status.active - Actif - - - - - Part-DB1\src\DataTables\PartsDataTable.php:265 - Part-DB1\src\Form\Part\PartBaseType.php:90 - Part-DB1\src\DataTables\PartsDataTable.php:213 - Part-DB1\src\Form\Part\PartBaseType.php:88 - - - m_status.nrfnd - Non recommandé pour les nouvelles conceptions - - - - - Part-DB1\src\DataTables\PartsDataTable.php:266 - Part-DB1\src\Form\Part\PartBaseType.php:90 - Part-DB1\src\DataTables\PartsDataTable.php:214 - Part-DB1\src\Form\Part\PartBaseType.php:88 - - - m_status.eol - Fin de vie - - - - - Part-DB1\src\DataTables\PartsDataTable.php:267 - Part-DB1\src\Form\Part\PartBaseType.php:90 - Part-DB1\src\DataTables\PartsDataTable.php:215 - Part-DB1\src\Form\Part\PartBaseType.php:88 - - - m_status.discontinued - Arrêtés - - - - - Part-DB1\src\DataTables\PartsDataTable.php:271 - Part-DB1\src\DataTables\PartsDataTable.php:219 - - - part.table.mpn - MPN - - - - - Part-DB1\src\DataTables\PartsDataTable.php:275 - Part-DB1\src\DataTables\PartsDataTable.php:223 - - - part.table.mass - Poids - - - - - Part-DB1\src\DataTables\PartsDataTable.php:279 - Part-DB1\src\DataTables\PartsDataTable.php:227 - - - part.table.tags - Tags - - - - - Part-DB1\src\DataTables\PartsDataTable.php:283 - Part-DB1\src\DataTables\PartsDataTable.php:231 - - - part.table.attachments - Fichiers joints - - - - - Part-DB1\src\EventSubscriber\UserSystem\LoginSuccessSubscriber.php:82 - Part-DB1\src\EventSubscriber\LoginSuccessListener.php:82 - - - flash.login_successful - Connexion réussie. - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:77 - Part-DB1\src\Form\AdminPages\ImportType.php:77 - src\Form\ImportType.php:68 - - - JSON - JSON - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:77 - Part-DB1\src\Form\AdminPages\ImportType.php:77 - src\Form\ImportType.php:68 - - - XML - XML - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:77 - Part-DB1\src\Form\AdminPages\ImportType.php:77 - src\Form\ImportType.php:68 - - - CSV - CSV - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:77 - Part-DB1\src\Form\AdminPages\ImportType.php:77 - src\Form\ImportType.php:68 - - - YAML - YAML - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:124 - Part-DB1\src\Form\AdminPages\ImportType.php:124 - - - import.abort_on_validation.help - Si cette option est activée, l'ensemble du processus est interrompu si des données non valides sont détectées. Si cette option n'est pas active, les entrées non valides sont ignorées et une tentative est faite pour importer les autres entrées. - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:86 - Part-DB1\src\Form\AdminPages\ImportType.php:86 - src\Form\ImportType.php:70 - - - import.csv_separator - Séparateur CSV - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:93 - Part-DB1\src\Form\AdminPages\ImportType.php:93 - src\Form\ImportType.php:72 - - - parent.label - Élément parent - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:101 - Part-DB1\src\Form\AdminPages\ImportType.php:101 - src\Form\ImportType.php:75 - - - import.file - Fichier - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:111 - Part-DB1\src\Form\AdminPages\ImportType.php:111 - src\Form\ImportType.php:78 - - - import.preserve_children - Importer également des sous-éléments - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:120 - Part-DB1\src\Form\AdminPages\ImportType.php:120 - src\Form\ImportType.php:80 - - - import.abort_on_validation - Interrompre sur donnée invalide - - - - - Part-DB1\src\Form\AdminPages\ImportType.php:132 - Part-DB1\src\Form\AdminPages\ImportType.php:132 - src\Form\ImportType.php:85 - - - import.btn - Importer - - - - - Part-DB1\src\Form\AttachmentFormType.php:113 - Part-DB1\src\Form\AttachmentFormType.php:109 - - - attachment.edit.secure_file.help - Un fichier joint marqué comme étant privé ne peut être consulté que par un utilisateur connecté qui a l'autorisation appropriée. Si cette option est activée, aucune miniature n'est générée et l'accès au fichier est plus lent. - - - - - Part-DB1\src\Form\AttachmentFormType.php:127 - Part-DB1\src\Form\AttachmentFormType.php:123 - - - attachment.edit.url.help - Il est possible de saisir ici soit l'URL d'un fichier externe, soit un mot clé pour rechercher les ressources intégrées (par exemple les empreintes). - - - - - Part-DB1\src\Form\AttachmentFormType.php:82 - Part-DB1\src\Form\AttachmentFormType.php:79 - - - attachment.edit.name - Nom - - - - - Part-DB1\src\Form\AttachmentFormType.php:85 - Part-DB1\src\Form\AttachmentFormType.php:82 - - - attachment.edit.attachment_type - Type de fichier joint - - - - - Part-DB1\src\Form\AttachmentFormType.php:94 - Part-DB1\src\Form\AttachmentFormType.php:91 - - - attachment.edit.show_in_table - Voir dans le tableau - - - - - Part-DB1\src\Form\AttachmentFormType.php:105 - Part-DB1\src\Form\AttachmentFormType.php:102 - - - attachment.edit.secure_file - Fichier joint privé - - - - - Part-DB1\src\Form\AttachmentFormType.php:119 - Part-DB1\src\Form\AttachmentFormType.php:115 - - - attachment.edit.url - URL - - - - - Part-DB1\src\Form\AttachmentFormType.php:133 - Part-DB1\src\Form\AttachmentFormType.php:129 - - - attachment.edit.download_url - Télécharger un fichier externe - - - - - Part-DB1\src\Form\AttachmentFormType.php:146 - Part-DB1\src\Form\AttachmentFormType.php:142 - - - attachment.edit.file - Télécharger le fichier - - - - - Part-DB1\src\Form\LabelOptionsType.php:68 - Part-DB1\src\Services\ElementTypeNameGenerator.php:86 - - - part.label - Composant - - - - - Part-DB1\src\Form\LabelOptionsType.php:68 - Part-DB1\src\Services\ElementTypeNameGenerator.php:87 - - - part_lot.label - Lot de composant - - - - - Part-DB1\src\Form\LabelOptionsType.php:78 - - - label_options.barcode_type.none - Aucun - - - - - Part-DB1\src\Form\LabelOptionsType.php:78 - - - label_options.barcode_type.qr - QR Code (recommandé) - - - - - Part-DB1\src\Form\LabelOptionsType.php:78 - - - label_options.barcode_type.code128 - Code 128 (recommandé) - - - - - Part-DB1\src\Form\LabelOptionsType.php:78 - - - label_options.barcode_type.code39 - Code 39 (recommandé) - - - - - Part-DB1\src\Form\LabelOptionsType.php:78 - - - label_options.barcode_type.code93 - Code 93 - - - - - Part-DB1\src\Form\LabelOptionsType.php:78 - - - label_options.barcode_type.datamatrix - Datamatrix - - - - - Part-DB1\src\Form\LabelOptionsType.php:122 - - - label_options.lines_mode.html - Placeholders - - - - - Part-DB1\src\Form\LabelOptionsType.php:122 - - - label.options.lines_mode.twig - Twig - - - - - Part-DB1\src\Form\LabelOptionsType.php:126 - - - label_options.lines_mode.help - Si vous sélectionnez Twig ici, le champ de contenu est interprété comme un modèle Twig. Voir <a href="https://twig.symfony.com/doc/3.x/templates.html">Documentation de Twig</a> et <a href="https://github.com/Part-DB/Part-DB-symfony/wiki/Labels#twig-mode">Wiki</a> pour plus d'informations. - - - - - Part-DB1\src\Form\LabelOptionsType.php:47 - - - label_options.page_size.label - Taille de l'étiquette - - - - - Part-DB1\src\Form\LabelOptionsType.php:66 - - - label_options.supported_elements.label - Type de cible - - - - - Part-DB1\src\Form\LabelOptionsType.php:75 - - - label_options.barcode_type.label - Code barre - - - - - Part-DB1\src\Form\LabelOptionsType.php:102 - - - label_profile.lines.label - Contenu - - - - - Part-DB1\src\Form\LabelOptionsType.php:111 - - - label_options.additional_css.label - Styles supplémentaires (CSS) - - - - - Part-DB1\src\Form\LabelOptionsType.php:120 - - - label_options.lines_mode.label - Parser mode - - - - - Part-DB1\src\Form\LabelOptionsType.php:51 - - - label_options.width.placeholder - Largeur - - - - - Part-DB1\src\Form\LabelOptionsType.php:60 - - - label_options.height.placeholder - Hauteur - - - - - Part-DB1\src\Form\LabelSystem\LabelDialogType.php:49 - - - label_generator.target_id.range_hint - Vous pouvez spécifier ici plusieurs ID (par exemple 1,2,3) et/ou une plage (1-3) pour générer des étiquettes pour plusieurs éléments à la fois. - - - - - Part-DB1\src\Form\LabelSystem\LabelDialogType.php:46 - - - label_generator.target_id.label - ID des cibles - - - - - Part-DB1\src\Form\LabelSystem\LabelDialogType.php:59 - - - label_generator.update - Actualisation - - - - - Part-DB1\src\Form\LabelSystem\ScanDialogType.php:36 - - - scan_dialog.input - Saisie - - - - - Part-DB1\src\Form\LabelSystem\ScanDialogType.php:44 - - - scan_dialog.submit - Soumettre - - - - - Part-DB1\src\Form\ParameterType.php:41 - - - parameters.name.placeholder - ex. Gain de courant DC - - - - - Part-DB1\src\Form\ParameterType.php:50 - - - parameters.symbol.placeholder - ex. h_{FE} - - - - - Part-DB1\src\Form\ParameterType.php:60 - - - parameters.text.placeholder - ex. Test conditions - - - - - Part-DB1\src\Form\ParameterType.php:71 - - - parameters.max.placeholder - ex. 350 - - - - - Part-DB1\src\Form\ParameterType.php:82 - - - parameters.min.placeholder - ex. 100 - - - - - Part-DB1\src\Form\ParameterType.php:93 - - - parameters.typical.placeholder - ex. 200 - - - - - Part-DB1\src\Form\ParameterType.php:103 - - - parameters.unit.placeholder - ex. V - - - - - Part-DB1\src\Form\ParameterType.php:114 - - - parameter.group.placeholder - ex. Spécifications techniques - - - - - Part-DB1\src\Form\Part\OrderdetailType.php:72 - Part-DB1\src\Form\Part\OrderdetailType.php:75 - - - orderdetails.edit.supplierpartnr - Numéro de commande - - - - - Part-DB1\src\Form\Part\OrderdetailType.php:81 - Part-DB1\src\Form\Part\OrderdetailType.php:84 - - - orderdetails.edit.supplier - Fournisseur - - - - - Part-DB1\src\Form\Part\OrderdetailType.php:87 - Part-DB1\src\Form\Part\OrderdetailType.php:90 - - - orderdetails.edit.url - Lien vers l'offre - - - - - Part-DB1\src\Form\Part\OrderdetailType.php:93 - Part-DB1\src\Form\Part\OrderdetailType.php:96 - - - orderdetails.edit.obsolete - Plus disponible - - - - - Part-DB1\src\Form\Part\OrderdetailType.php:75 - Part-DB1\src\Form\Part\OrderdetailType.php:78 - - - orderdetails.edit.supplierpartnr.placeholder - Ex. BC 547C - - - - - Part-DB1\src\Form\Part\PartBaseType.php:101 - Part-DB1\src\Form\Part\PartBaseType.php:99 - - - part.edit.name - Nom - - - - - Part-DB1\src\Form\Part\PartBaseType.php:109 - Part-DB1\src\Form\Part\PartBaseType.php:107 - - - part.edit.description - Description - - - - - Part-DB1\src\Form\Part\PartBaseType.php:120 - Part-DB1\src\Form\Part\PartBaseType.php:118 - - - part.edit.mininstock - Stock minimum - - - - - Part-DB1\src\Form\Part\PartBaseType.php:129 - Part-DB1\src\Form\Part\PartBaseType.php:127 - - - part.edit.category - Catégories - - - - - Part-DB1\src\Form\Part\PartBaseType.php:135 - Part-DB1\src\Form\Part\PartBaseType.php:133 - - - part.edit.footprint - Empreinte - - - - - Part-DB1\src\Form\Part\PartBaseType.php:142 - Part-DB1\src\Form\Part\PartBaseType.php:140 - - - part.edit.tags - Tags - - - - - Part-DB1\src\Form\Part\PartBaseType.php:154 - Part-DB1\src\Form\Part\PartBaseType.php:152 - - - part.edit.manufacturer.label - Fabricant - - - - - Part-DB1\src\Form\Part\PartBaseType.php:161 - Part-DB1\src\Form\Part\PartBaseType.php:159 - - - part.edit.manufacturer_url.label - Lien vers la page du produit - - - - - Part-DB1\src\Form\Part\PartBaseType.php:167 - Part-DB1\src\Form\Part\PartBaseType.php:165 - - - part.edit.mpn - Numéro de pièce du fabricant - - - - - Part-DB1\src\Form\Part\PartBaseType.php:173 - Part-DB1\src\Form\Part\PartBaseType.php:171 - - - part.edit.manufacturing_status - État de la fabrication - - - - - Part-DB1\src\Form\Part\PartBaseType.php:181 - Part-DB1\src\Form\Part\PartBaseType.php:179 - - - part.edit.needs_review - Révision nécessaire - - - - - Part-DB1\src\Form\Part\PartBaseType.php:189 - Part-DB1\src\Form\Part\PartBaseType.php:187 - - - part.edit.is_favorite - Favoris - - - - - Part-DB1\src\Form\Part\PartBaseType.php:197 - Part-DB1\src\Form\Part\PartBaseType.php:195 - - - part.edit.mass - Poids - - - - - Part-DB1\src\Form\Part\PartBaseType.php:203 - Part-DB1\src\Form\Part\PartBaseType.php:201 - - - part.edit.partUnit - Unité de mesure - - - - - Part-DB1\src\Form\Part\PartBaseType.php:212 - Part-DB1\src\Form\Part\PartBaseType.php:210 - - - part.edit.comment - Commentaire - - - - - Part-DB1\src\Form\Part\PartBaseType.php:250 - Part-DB1\src\Form\Part\PartBaseType.php:246 - - - part.edit.master_attachment - Miniature - - - - - Part-DB1\src\Form\Part\PartBaseType.php:295 - Part-DB1\src\Form\Part\PartBaseType.php:276 - src\Form\PartType.php:91 - - - part.edit.save - Sauvegarder les modifications - - - - - Part-DB1\src\Form\Part\PartBaseType.php:296 - Part-DB1\src\Form\Part\PartBaseType.php:277 - src\Form\PartType.php:92 - - - part.edit.reset - rejeter les modifications - - - - - Part-DB1\src\Form\Part\PartBaseType.php:105 - Part-DB1\src\Form\Part\PartBaseType.php:103 - - - part.edit.name.placeholder - Ex. BC547 - - - - - Part-DB1\src\Form\Part\PartBaseType.php:115 - Part-DB1\src\Form\Part\PartBaseType.php:113 - - - part.edit.description.placeholder - Ex. NPN 45V, 0,1A, 0,5W - - - - - Part-DB1\src\Form\Part\PartBaseType.php:123 - Part-DB1\src\Form\Part\PartBaseType.php:121 - - - part.editmininstock.placeholder - Ex. 1 - - - - - Part-DB1\src\Form\Part\PartLotType.php:69 - Part-DB1\src\Form\Part\PartLotType.php:69 - - - part_lot.edit.description - Description - - - - - Part-DB1\src\Form\Part\PartLotType.php:78 - Part-DB1\src\Form\Part\PartLotType.php:78 - - - part_lot.edit.location - Emplacement de stockage - - - - - Part-DB1\src\Form\Part\PartLotType.php:89 - Part-DB1\src\Form\Part\PartLotType.php:89 - - - part_lot.edit.amount - Quantité - - - - - Part-DB1\src\Form\Part\PartLotType.php:98 - Part-DB1\src\Form\Part\PartLotType.php:97 - - - part_lot.edit.instock_unknown - Quantité inconnue - - - - - Part-DB1\src\Form\Part\PartLotType.php:109 - Part-DB1\src\Form\Part\PartLotType.php:108 - - - part_lot.edit.needs_refill - Doit être rempli - - - - - Part-DB1\src\Form\Part\PartLotType.php:120 - Part-DB1\src\Form\Part\PartLotType.php:119 - - - part_lot.edit.expiration_date - Date d'expiration - - - - - Part-DB1\src\Form\Part\PartLotType.php:128 - Part-DB1\src\Form\Part\PartLotType.php:125 - - - part_lot.edit.comment - Commentaire - - - - - Part-DB1\src\Form\Permissions\PermissionsType.php:99 - Part-DB1\src\Form\Permissions\PermissionsType.php:99 - - - perm.group.other - Divers - - - - - Part-DB1\src\Form\TFAGoogleSettingsType.php:97 - Part-DB1\src\Form\TFAGoogleSettingsType.php:97 - - - tfa_google.enable - Activer l'application d'authentification - - - - - Part-DB1\src\Form\TFAGoogleSettingsType.php:101 - Part-DB1\src\Form\TFAGoogleSettingsType.php:101 - - - tfa_google.disable - Désactiver l'application d'authentification - - - - - Part-DB1\src\Form\TFAGoogleSettingsType.php:74 - Part-DB1\src\Form\TFAGoogleSettingsType.php:74 - - - google_confirmation - Code de confirmation - - - - - Part-DB1\src\Form\UserSettingsType.php:108 - Part-DB1\src\Form\UserSettingsType.php:108 - src\Form\UserSettingsType.php:46 - - - user.timezone.label - Fuseau horaire - - - - - Part-DB1\src\Form\UserSettingsType.php:133 - Part-DB1\src\Form\UserSettingsType.php:132 - - - user.currency.label - Devise préférée - - - - - Part-DB1\src\Form\UserSettingsType.php:140 - Part-DB1\src\Form\UserSettingsType.php:139 - src\Form\UserSettingsType.php:53 - - - save - Appliquer les modifications - - - - - Part-DB1\src\Form\UserSettingsType.php:141 - Part-DB1\src\Form\UserSettingsType.php:140 - src\Form\UserSettingsType.php:54 - - - reset - Rejeter les modifications - - - - - Part-DB1\src\Form\UserSettingsType.php:104 - Part-DB1\src\Form\UserSettingsType.php:104 - src\Form\UserSettingsType.php:45 - - - user_settings.language.placeholder - Langue du serveur - - - - - Part-DB1\src\Form\UserSettingsType.php:115 - Part-DB1\src\Form\UserSettingsType.php:115 - src\Form\UserSettingsType.php:48 - - - user_settings.timezone.placeholder - Fuseau horaire du serveur - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:79 - Part-DB1\src\Services\ElementTypeNameGenerator.php:79 - - - attachment.label - Fichier joint - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:81 - Part-DB1\src\Services\ElementTypeNameGenerator.php:81 - - - attachment_type.label - Type de fichier joint - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:85 - Part-DB1\src\Services\ElementTypeNameGenerator.php:85 - - - measurement_unit.label - Unité de mesure - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:90 - Part-DB1\src\Services\ElementTypeNameGenerator.php:90 - - - currency.label - Devise - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:91 - Part-DB1\src\Services\ElementTypeNameGenerator.php:91 - - - orderdetail.label - Informations de commande - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:92 - Part-DB1\src\Services\ElementTypeNameGenerator.php:92 - - - pricedetail.label - Informations sur les prix - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:94 - Part-DB1\src\Services\ElementTypeNameGenerator.php:94 - - - user.label - Utilisateur - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:95 - - - parameter.label - Caractéristique - - - - - Part-DB1\src\Services\ElementTypeNameGenerator.php:96 - - - label_profile.label - Profil d'étiquette - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:176 - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:161 - new - - - log.element_deleted.old_name.unknown - Inconnu - - - - - Part-DB1\src\Services\MarkdownParser.php:73 - Part-DB1\src\Services\MarkdownParser.php:73 - - - markdown.loading - Chargement de la remise. Si ce message ne disparaît pas, essayez de recharger la page. - - - - - Part-DB1\src\Services\PasswordResetManager.php:98 - Part-DB1\src\Services\PasswordResetManager.php:98 - - - pw_reset.email.subject - Réinitialisation du mot de passe de votre compte Part-DB - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:108 - - - tree.tools.tools - Outils - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:109 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:107 - src\Services\ToolsTreeBuilder.php:74 - - - tree.tools.edit - Éditer - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:110 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:108 - src\Services\ToolsTreeBuilder.php:81 - - - tree.tools.show - Afficher - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:111 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:109 - - - tree.tools.system - Système - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:123 - - - tree.tools.tools.label_dialog - Générateur d'étiquettes - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:130 - - - tree.tools.tools.label_scanner - Scanner - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:149 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:126 - src\Services\ToolsTreeBuilder.php:62 - - - tree.tools.edit.attachment_types - Types de fichier joint - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:155 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:132 - src\Services\ToolsTreeBuilder.php:64 - - - tree.tools.edit.categories - Catégories - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:167 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:144 - src\Services\ToolsTreeBuilder.php:68 - - - tree.tools.edit.suppliers - Fournisseurs - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:173 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:150 - src\Services\ToolsTreeBuilder.php:70 - - - tree.tools.edit.manufacturer - Fabricants - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:179 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:156 - - - tree.tools.edit.storelocation - Emplacements de stockage - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:185 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:162 - - - tree.tools.edit.footprint - Empreintes - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:191 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:168 - - - tree.tools.edit.currency - Devises - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:197 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:174 - - - tree.tools.edit.measurement_unit - Unité de mesure - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 - - - tree.tools.edit.label_profile - Profils d'étiquettes - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:209 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:180 - - - tree.tools.edit.part - Composant - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:226 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:197 - src\Services\ToolsTreeBuilder.php:77 - - - tree.tools.show.all_parts - Voir tous les composants - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:232 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 - - - tree.tools.show.all_attachments - Fichiers joints - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:239 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:210 - new - - - tree.tools.show.statistics - Statistiques - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:258 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:229 - - - tree.tools.system.users - Utilisateurs - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:264 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:235 - - - tree.tools.system.groups - Groupes - - - - - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:271 - Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:242 - new - - - tree.tools.system.event_log - Système d'événements - - - - - Part-DB1\src\Services\Trees\TreeViewGenerator.php:95 - Part-DB1\src\Services\Trees\TreeViewGenerator.php:95 - src\Services\TreeBuilder.php:124 - - - entity.tree.new - Nouvel élément - - - - - Part-DB1\templates\Parts\info\_attachments_info.html.twig:34 - obsolete - - - attachment.external_file - Fichier extérieur - - - - - Part-DB1\templates\Parts\info\_attachments_info.html.twig:62 - obsolete - - - attachment.edit - Éditer - - - - - Part-DB1\templates\_navbar.html.twig:27 - templates\base.html.twig:88 - obsolete - - - barcode.scan - Scanner un code-barres - - - - - Part-DB1\src\Form\UserSettingsType.php:119 - src\Form\UserSettingsType.php:49 - obsolete - - - user.theme.label - Thème - - - - - Part-DB1\src\Form\UserSettingsType.php:129 - src\Form\UserSettingsType.php:50 - obsolete - - - user_settings.theme.placeholder - Thème du serveur - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:100 - new - obsolete - - - log.user_login.ip - IP - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:128 - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:150 - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:169 - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:207 - new - obsolete - - - log.undo_mode.undo - Modification annulée - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:130 - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:152 - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:171 - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:209 - new - obsolete - - - log.undo_mode.revert - Élément restauré - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:139 - new - obsolete - - - log.element_created.original_instock - Ancien stock - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:160 - new - obsolete - - - log.element_deleted.old_name - Ancien nom - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:184 - new - obsolete - - - log.element_edited.changed_fields - Champs modifiés - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:198 - new - obsolete - - - log.instock_changed.comment - Commentaire - - - - - Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:214 - new - obsolete - - - log.collection_deleted.deleted - Élément supprimé : - - - - - templates\base.html.twig:81 - obsolete - obsolete - - - go.exclamation - Allez! - - - - - templates\base.html.twig:109 - obsolete - obsolete - - - language.english - Anglais - - - - - templates\base.html.twig:112 - obsolete - obsolete - - - language.german - Allemand - - - - - obsolete - obsolete - - - flash.password_change_needed - Votre mot de passe doit être changé ! - - - - - obsolete - obsolete - - - attachment.table.type - Type de fichier joint - - - - - obsolete - obsolete - - - attachment.table.element - élément lié - - - - - obsolete - obsolete - - - attachment.edit.isPicture - Image? - - - - - obsolete - obsolete - - - attachment.edit.is3DModel - Modèle 3D? - - - - - obsolete - obsolete - - - attachment.edit.isBuiltin - Intégré? - - - - - obsolete - obsolete - - - category.edit.default_comment.placeholder - Ex. utilisé pour les alimentations à découpage - - - - - obsolete - obsolete - - - tfa_backup.regenerate_codes - Créer de nouveaux codes de secours - - - - - obsolete - obsolete - - - validator.noneofitschild.self - Un élément ne peut pas être son propre parent. - - - - - obsolete - obsolete - - - validator.noneofitschild.children - Le parent ne peut pas être un de ses propres enfants. - - - - - obsolete - obsolete - - - validator.part_lot.location_full.no_increasment - Le lieu de stockage utilisé a été marqué comme étant plein, le stock ne peut donc pas être augmenté. (Nouveau stock maximum {{old_amount}}) - - - - - obsolete - obsolete - - - validator.part_lot.location_full - L'emplacement de stockage est plein, c'est pourquoi aucun nouveau composant ne peut être ajouté. - - - - - obsolete - obsolete - - - validator.part_lot.only_existing - L'emplacement de stockage a été marqué comme "uniquement existant", donc aucun nouveau composant ne peut être ajouté. - - - - - obsolete - obsolete - - - validator.part_lot.single_part - L'emplacement de stockage a été marqué comme "Composant seul", par conséquent aucun nouveau composant ne peut être ajouté. - - - - - obsolete - obsolete - - - m_status.active.help - Le composant est actuellement en cours de production et sera produit dans un avenir proche. - - - - - obsolete - obsolete - - - m_status.announced.help - Le composant a été annoncé, mais n'est pas encore disponible. - - - - - obsolete - obsolete - - - m_status.discontinued.help - Le composant n'est plus fabriqué. - - - - - obsolete - obsolete - - - m_status.eol.help - La production de ce composant sera bientôt arrêtée. - - - - - obsolete - obsolete - - - m_status.nrfnd.help - Ce composant est actuellement en production mais n'est pas recommandé pour les nouvelles conceptions. - - - - - obsolete - obsolete - - - m_status.unknown.help - L'état de la production n'est pas connu. - - - - - obsolete - obsolete - - - flash.success - Succès - - - - - obsolete - obsolete - - - flash.error - Erreur - - - - - obsolete - obsolete - - - flash.warning - Attention - - - - - obsolete - obsolete - - - flash.notice - Remarque - - - - - obsolete - obsolete - - - flash.info - Info - - - - - obsolete - obsolete - - - validator.noLockout - Vous ne pouvez pas révoquer vous-même l'autorisation de "modifier les autorisations" pour éviter de vous verrouiller accidentellement ! - - - - - obsolete - obsolete - - - attachment_type.edit.filetype_filter - Types de fichiers autorisés - - - - - obsolete - obsolete - - - attachment_type.edit.filetype_filter.help - Vous pouvez spécifier ici une liste, séparée par des virgules, des extensions de fichiers ou des mimétapes qu'un fichier téléchargé avec ce type de pièce jointe doit avoir. Pour autoriser tous les fichiers d'images pris en charge, utilisez image/*. - - - - - obsolete - obsolete - - - attachment_type.edit.filetype_filter.placeholder - Ex. .txt, application/pdf, image/* - - - - - src\Form\PartType.php:63 - obsolete - obsolete - - - part.name.placeholder - Ex. BC547 - - - - - obsolete - obsolete - - - entity.edit.not_selectable - Non sélectionnable - - - - - obsolete - obsolete - - - entity.edit.not_selectable.help - Si cette option est activée, alors cet élément ne peut être attribué à aucun composant en tant que propriété. Utile, par exemple si cet élément doit être utilisé uniquement pour le tri. - - - - - obsolete - obsolete - - - bbcode.hint - Le BBCode peut être utilisé ici (par exemple [b]Bold[/b]) - - - - - obsolete - obsolete - - - entity.create - Créer un élément - - - - - obsolete - obsolete - - - entity.edit.save - Sauvegarder - - - - - obsolete - obsolete - - - category.edit.disable_footprints - Désactiver les empreintes - - - - - obsolete - obsolete - - - category.edit.disable_footprints.help - Si cette option est activée, la propriété Empreinte est désactivée pour tous les composants de cette catégorie. - - - - - obsolete - obsolete - - - category.edit.disable_manufacturers - Désactiver les fabricants - - - - - obsolete - obsolete - - - category.edit.disable_manufacturers.help - Si cette option est activée, la propriété fabricant est désactivée pour tous les composants de cette catégorie. - - - - - obsolete - obsolete - - - category.edit.disable_autodatasheets - Désactiver les liens automatiques des fiches techniques - - - - - obsolete - obsolete - - - category.edit.disable_autodatasheets.help - Si cette option est activée, aucun lien automatique avec la fiche technique n'est généré pour les pièces de cette catégorie. - - - - - obsolete - obsolete - - - category.edit.disable_properties - Désactiver les propriétés - - - - - obsolete - obsolete - - - category.edit.disable_properties.help - Si cette option est activée, les propriétés des composants pour tous les composants de cette catégorie sont désactivées. - - - - - obsolete - obsolete - - - category.edit.partname_hint - Indication du nom du composant - - - - - obsolete - obsolete - - - category.edit.partname_hint.placeholder - Ex. 100nF - - - - - obsolete - obsolete - - - category.edit.partname_regex - Filtre de nom - - - - - obsolete - obsolete - - - category.edit.default_description - Description par défaut - - - - - obsolete - obsolete - - - category.edit.default_description.placeholder - Ex. Condensateur, 10mmx10mm, CMS - - - - - obsolete - obsolete - - - category.edit.default_comment - Commentaire par défaut - - - - - obsolete - obsolete - - - company.edit.address - Adresse - - - - - obsolete - obsolete - - - company.edit.address.placeholder - Ex. 99 exemple de rue -exemple de ville - - - - - obsolete - obsolete - - - company.edit.phone_number - Numéro de téléphone - - - - - obsolete - obsolete - - - company.edit.phone_number.placeholder - +33 1 23 45 67 89 - - - - - obsolete - obsolete - - - company.edit.fax_number - Numéro de fax - - - - - obsolete - obsolete - - - company.edit.email - Email - - - - - obsolete - obsolete - - - company.edit.email.placeholder - Ex. contact@foo.bar - - - - - obsolete - obsolete - - - company.edit.website - Site internet - - - - - obsolete - obsolete - - - company.edit.website.placeholder - https://www.foo.bar - - - - - obsolete - obsolete - - - company.edit.auto_product_url - URL du produit - - - - - obsolete - obsolete - - - company.edit.auto_product_url.help - Si cette URL est définie, elle est utilisée pour générer l'URL d'un composant sur le site web du fabricant. Dans ce cas, %PARTNUMBER% sera remplacé par le numéro de commande. - - - - - obsolete - obsolete - - - company.edit.auto_product_url.placeholder - https://foo.bar/product/%PARTNUMBER% - - - - - obsolete - obsolete - - - currency.edit.iso_code - Code ISO - - - - - obsolete - obsolete - - - currency.edit.exchange_rate - Taux de change - - - - - obsolete - obsolete - - - footprint.edit.3d_model - Modèle 3D - - - - - obsolete - obsolete - - - mass_creation.lines - Saisie - - - - - obsolete - obsolete - - - mass_creation.lines.placeholder - Élément 1 -Élément 2 -Élément 3 - - - - - obsolete - obsolete - - - entity.mass_creation.btn - Créer - - - - - obsolete - obsolete - - - measurement_unit.edit.is_integer - Nombre entier - - - - - obsolete - obsolete - - - measurement_unit.edit.is_integer.help - Si cette option est activée, toutes les quantités dans cette unité sont arrondies à des nombres entiers. - - - - - obsolete - obsolete - - - measurement_unit.edit.use_si_prefix - Utiliser les préfixes SI - - - - - obsolete - obsolete - - - measurement_unit.edit.use_si_prefix.help - Si cette option est activée, les préfixes SI sont utilisés lors de la génération des nombres (par exemple 1,2 kg au lieu de 1200 g) - - - - - obsolete - obsolete - - - measurement_unit.edit.unit_symbol - Symbole de l'unité - - - - - obsolete - obsolete - - - measurement_unit.edit.unit_symbol.placeholder - Ex. m - - - - - obsolete - obsolete - - - storelocation.edit.is_full.label - Emplacement de stockage plein - - - - - obsolete - obsolete - - - storelocation.edit.is_full.help - Si cette option est activée, il n'est pas possible d'ajouter de nouveaux composants à ce lieu de stockage ni d'augmenter le nombre de composants existants. - - - - - obsolete - obsolete - - - storelocation.limit_to_existing.label - Limiter aux composants existants - - - - - obsolete - obsolete - - - storelocation.limit_to_existing.help - Si cette option est active, il n'est pas possible d'ajouter de nouveaux composants à ce lieu de stockage, mais il est possible d'augmenter le nombre de composants existants. - - - - - obsolete - obsolete - - - storelocation.only_single_part.label - Seulement un composant - - - - - obsolete - obsolete - - - storelocation.only_single_part.help - Si cette option est activée, cet emplacement de stockage ne peut contenir qu'un seul composant (mais une quantité quelconque). Utile pour les petits compartiments ou les distributeurs de CMS. - - - - - obsolete - obsolete - - - storelocation.storage_type.label - Type de stockage - - - - - obsolete - obsolete - - - storelocation.storage_type.help - Ici, vous pouvez sélectionner une unité de mesure qu'un composant doit avoir pour être stocké dans ce lieu de stockage. - - - - - obsolete - obsolete - - - supplier.edit.default_currency - Devise par défaut - - - - - obsolete - obsolete - - - supplier.shipping_costs.label - Frais de port - - - - - obsolete - obsolete - - - user.username.placeholder - Ex. j.doe - - - - - obsolete - obsolete - - - user.firstName.placeholder - Ex. John - - - - - obsolete - obsolete - - - user.lastName.placeholder - Ex. Doe - - - - - obsolete - obsolete - - - user.email.placeholder - j.doe@ecorp.com - - - - - obsolete - obsolete - - - user.department.placeholder - Ex. Development - - - - - obsolete - obsolete - - - user.settings.pw_new.label - Nouveau mot de passe - - - - - obsolete - obsolete - - - user.settings.pw_confirm.label - Confirmer le nouveau mot de passe - - - - - obsolete - obsolete - - - user.edit.needs_pw_change - L'utilisateur doit changer de mot de passe - - - - - obsolete - obsolete - - - user.edit.user_disabled - Utilisateur désactivé (connexion impossible) - - - - - obsolete - obsolete - - - user.create - Créer l'utilisateur - - - - - obsolete - obsolete - - - user.edit.save - Enregistrer - - - - - obsolete - obsolete - - - entity.edit.reset - Rejeter les modifications - - - - - templates\Parts\show_part_info.html.twig:166 - obsolete - obsolete - - - part.withdraw.btn - Retrait - - - - - templates\Parts\show_part_info.html.twig:171 - obsolete - obsolete - - - part.withdraw.comment: - Commentaire/objet - - - - - templates\Parts\show_part_info.html.twig:189 - obsolete - obsolete - - - part.add.caption - Ajouter composants - - - - - templates\Parts\show_part_info.html.twig:194 - obsolete - obsolete - - - part.add.btn - Ajouter - - - - - templates\Parts\show_part_info.html.twig:199 - obsolete - obsolete - - - part.add.comment - Commentaire/objet - - - - - templates\AdminPages\CompanyAdminBase.html.twig:15 - obsolete - obsolete - - - admin.comment - Commentaire - - - - - src\Form\PartType.php:83 - obsolete - obsolete - - - manufacturer_url.label - Lien vers le site du fabricant - - - - - src\Form\PartType.php:66 - obsolete - obsolete - - - part.description.placeholder - Ex. NPN 45V 0,1A 0,5W - - - - - src\Form\PartType.php:69 - obsolete - obsolete - - - part.instock.placeholder - Ex. 10 - - - - - src\Form\PartType.php:72 - obsolete - obsolete - - - part.mininstock.placeholder - Ex. 10 - - - - - obsolete - obsolete - - - part.order.price_per - Prix par - - - - - obsolete - obsolete - - - part.withdraw.caption - Retrait de composants - - - - - obsolete - obsolete - - - datatable.datatable.lengthMenu - _MENU_ - - - - - obsolete - obsolete - - - perm.group.parts - Composants - - - - - obsolete - obsolete - - - perm.group.structures - Structures des données - - - - - obsolete - obsolete - - - perm.group.system - Système - - - - - obsolete - obsolete - - - perm.parts - Général - - - - - obsolete - obsolete - - - perm.read - Afficher - - - - - obsolete - obsolete - - - perm.edit - Éditer - - - - - obsolete - obsolete - - - perm.create - Créer - - - - - obsolete - obsolete - - - perm.part.move - Changer de catégorie - - - - - obsolete - obsolete - - - perm.delete - Supprimer - - - - - obsolete - obsolete - - - perm.part.search - Rechercher - - - - - obsolete - obsolete - - - perm.part.all_parts - Liste de tous les composants - - - - - obsolete - obsolete - - - perm.part.no_price_parts - Liste des composants sans prix - - - - - obsolete - obsolete - - - perm.part.obsolete_parts - Liste des composants obsolètes - - - - - obsolete - obsolete - - - perm.part.unknown_instock_parts - Liste des composants dont le stock est inconnu - - - - - obsolete - obsolete - - - perm.part.change_favorite - Changer le statut de favori - - - - - obsolete - obsolete - - - perm.part.show_favorite - Afficher les favoris - - - - - obsolete - obsolete - - - perm.part.show_last_edit_parts - Afficher les derniers composants modifiés/ajoutés - - - - - obsolete - obsolete - - - perm.part.show_users - Afficher le dernier utilisateur ayant apporté des modifications - - - - - obsolete - obsolete - - - perm.part.show_history - Afficher l'historique - - - - - obsolete - obsolete - - - perm.part.name - Nom - - - - - obsolete - obsolete - - - perm.part.description - Description - - - - - obsolete - obsolete - - - perm.part.instock - En stock - - - - - obsolete - obsolete - - - perm.part.mininstock - Stock minimum - - - - - obsolete - obsolete - - - perm.part.comment - Commentaire - - - - - obsolete - obsolete - - - perm.part.storelocation - Emplacement de stockage - - - - - obsolete - obsolete - - - perm.part.manufacturer - Fabricant - - - - - obsolete - obsolete - - - perm.part.orderdetails - Informations pour la commande - - - - - obsolete - obsolete - - - perm.part.prices - Prix - - - - - obsolete - obsolete - - - perm.part.attachments - Fichiers joints - - - - - obsolete - obsolete - - - perm.part.order - Commandes - - - - - obsolete - obsolete - - - perm.storelocations - Emplacements de stockage - - - - - obsolete - obsolete - - - perm.move - Déplacer - - - - - obsolete - obsolete - - - perm.list_parts - Liste des composants - - - - - obsolete - obsolete - - - perm.part.footprints - Empreintes - - - - - obsolete - obsolete - - - perm.part.categories - Catégories - - - - - obsolete - obsolete - - - perm.part.supplier - Fournisseurs - - - - - obsolete - obsolete - - - perm.part.manufacturers - Fabricants - - - - - obsolete - obsolete - - - perm.part.attachment_types - Types de fichiers joints - - - - - obsolete - obsolete - - - perm.tools.import - Importer - - - - - obsolete - obsolete - - - perm.tools.labels - Étiquettes - - - - - obsolete - obsolete - - - perm.tools.calculator - Calculateur de résistance - - - - - obsolete - obsolete - - - perm.tools.footprints - Empreintes - - - - - obsolete - obsolete - - - perm.tools.ic_logos - Logos CI - - - - - obsolete - obsolete - - - perm.tools.statistics - Statistiques - - - - - obsolete - obsolete - - - perm.edit_permissions - Éditer les autorisations - - - - - obsolete - obsolete - - - perm.users.edit_user_name - Modifier le nom d'utilisateur - - - - - obsolete - obsolete - - - perm.users.edit_change_group - Modifier le groupe - - - - - obsolete - obsolete - - - perm.users.edit_infos - Editer les informations - - - - - obsolete - obsolete - - - perm.users.edit_permissions - Modifier les autorisations - - - - - obsolete - obsolete - - - perm.users.set_password - Définir le mot de passe - - - - - obsolete - obsolete - - - perm.users.change_user_settings - Changer les paramètres utilisateur - - - - - obsolete - obsolete - - - perm.database.see_status - Afficher l’état - - - - - obsolete - obsolete - - - perm.database.update_db - Actualiser la base de données - - - - - obsolete - obsolete - - - perm.database.read_db_settings - Lecture des paramètres de la base de donnée - - - - - obsolete - obsolete - - - perm.database.write_db_settings - Modifier les paramètres de la base de données - - - - - obsolete - obsolete - - - perm.config.read_config - Lecture de la configuration - - - - - obsolete - obsolete - - - perm.config.edit_config - Modifier la configuration - - - - - obsolete - obsolete - - - perm.config.server_info - Informations sur le serveur - - - - - obsolete - obsolete - - - perm.config.use_debug - Utiliser les outils de débogage - - - - - obsolete - obsolete - - - perm.show_logs - Afficher les logs - - - - - obsolete - obsolete - - - perm.delete_logs - Supprimer les logs - - - - - obsolete - obsolete - - - perm.self.edit_infos - Modifier les informations - - - - - obsolete - obsolete - - - perm.self.edit_username - Modifier le nom d'utilisateur - - - - - obsolete - obsolete - - - perm.self.show_permissions - Voir les autorisations - - - - - obsolete - obsolete - - - perm.self.show_logs - Afficher ses propres logs - - - - - obsolete - obsolete - - - perm.self.create_labels - Créer des étiquettes - - - - - obsolete - obsolete - - - perm.self.edit_options - Modifier les options - - - - - obsolete - obsolete - - - perm.self.delete_profiles - Supprimer les profils - - - - - obsolete - obsolete - - - perm.self.edit_profiles - Modifier les profils - - - - - obsolete - obsolete - - - perm.part.tools - Outils - - - - - obsolete - obsolete - - - perm.groups - Groupes - - - - - obsolete - obsolete - - - perm.users - Utilisateurs - - - - - obsolete - obsolete - - - perm.database - Base de données - - - - - obsolete - obsolete - - - perm.config - Configuration - - - - - obsolete - obsolete - - - perm.system - Système - - - - - obsolete - obsolete - - - perm.self - Propre utilisateur - - - - - obsolete - obsolete - - - perm.labels - Étiquettes - - - - - obsolete - obsolete - - - perm.part.category - Catégorie - - - - - obsolete - obsolete - - - perm.part.minamount - Quantité minimum - - - - - obsolete - obsolete - - - perm.part.footprint - Empreinte - - - - - obsolete - obsolete - - - perm.part.mpn - MPN - - - - - obsolete - obsolete - - - perm.part.status - État de la fabrication - - - - - obsolete - obsolete - - - perm.part.tags - Tags - - - - - obsolete - obsolete - - - perm.part.unit - Unité - - - - - obsolete - obsolete - - - perm.part.mass - Poids - - - - - obsolete - obsolete - - - perm.part.lots - Lots de composants - - - - - obsolete - obsolete - - - perm.show_users - Afficher le dernier utilisateur ayant apporté des modifications - - - - - obsolete - obsolete - - - perm.currencies - Devises - - - - - obsolete - obsolete - - - perm.measurement_units - Unités de mesure - - - - - obsolete - obsolete - - - user.settings.pw_old.label - Ancien mot de passe - - - - - obsolete - obsolete - - - pw_reset.submit - Réinitialiser le mot de passe - - - - - obsolete - obsolete - - - u2f_two_factor - Clé de sécurité (U2F) - - - - - obsolete - obsolete - - - google - google - - - - - obsolete - obsolete - - - tfa.provider.google - Application d'authentification - - - - - obsolete - obsolete - - - Login successful - Connexion réussie - - - - - obsolete - obsolete - - - log.type.exception - Exception - - - - - obsolete - obsolete - - - log.type.user_login - Connexion utilisateur - - - - - obsolete - obsolete - - - log.type.user_logout - Déconnexion de l’utilisateur - - - - - obsolete - obsolete - - - log.type.unknown - Inconnu - - - - - obsolete - obsolete - - - log.type.element_created - Élément créé - - - - - obsolete - obsolete - - - log.type.element_edited - Élément modifié - - - - - obsolete - obsolete - - - log.type.element_deleted - Élément supprimé - - - - - obsolete - obsolete - - - log.type.database_updated - Base de données mise à jour - - - - - obsolete - - - perm.revert_elements - Restaurer les éléments - - - - - obsolete - - - perm.show_history - Afficher l'historique - - - - - obsolete - - - perm.tools.lastActivity - Afficher l'activité récente - - - - - obsolete - - - perm.tools.timeTravel - Afficher les anciennes versions des éléments (Time travel) - - - - - obsolete - - - tfa_u2f.key_added_successful - Clé de sécurité ajoutée avec succès. - - - - - obsolete - - - Username - Nom d'utilisateur - - - - - obsolete - - - log.type.security.google_disabled - Application d'authentification désactivée - - - - - obsolete - - - log.type.security.u2f_removed - Clé de sécurité enlevée - - - - - obsolete - - - log.type.security.u2f_added - Clé de sécurité ajoutée - - - - - obsolete - - - log.type.security.backup_keys_reset - Clés de sauvegarde régénérées - - - - - obsolete - - - log.type.security.google_enabled - Application Authenticator activée - - - - - obsolete - - - log.type.security.password_changed - Mot de passe modifié - - - - - obsolete - - - log.type.security.trusted_device_reset - Appareils de confiance réinitialisés - - - - - obsolete - - - log.type.collection_element_deleted - Élément de collecte supprimé - - - - - obsolete - - - log.type.security.password_reset - Réinitialisation du mot de passe - - - - - obsolete - - - log.type.security.2fa_admin_reset - Réinitialisation à deux facteurs par l'administrateur - - - - - obsolete - - - log.type.user_not_allowed - Tentative d'accès non autorisé - - - - - obsolete - - - log.database_updated.success - Succès - - - - - obsolete - - - label_options.barcode_type.2D - 2D - - - - - obsolete - - - label_options.barcode_type.1D - 1D - - - - - obsolete - - - perm.part.parameters - Caractéristiques - - - - - obsolete - - - perm.attachment_show_private - Voir les pièces jointes privées - - - - - obsolete - - - perm.tools.label_scanner - Lecteur d'étiquettes - - - - - obsolete - - - perm.self.read_profiles - Lire les profils - - - - - obsolete - - - perm.self.create_profiles - Créer des profils - - - - - obsolete - - - perm.labels.use_twig - Utiliser le mode twig - - - - - label_profile.showInDropdown - Afficher en sélection rapide - - - - - group.edit.enforce_2fa - Imposer l'authentification à deux facteurs (2FA) - - - - - group.edit.enforce_2fa.help - Si cette option est activée, chaque membre direct de ce groupe doit configurer au moins un deuxième facteur d'authentification. Recommandé pour les groupes administratifs ayant beaucoup de permissions. - - - - - selectpicker.empty - Rien n'est sélectionné - - - - - selectpicker.nothing_selected - Rien n'est sélectionné - - - - - entity.delete.must_not_contain_parts - L'élement contient encore des parties ! Vous devez déplacer les parties pour pouvoir supprimer cet élément. - - - - - entity.delete.must_not_contain_attachments - Le type de pièce jointe contient toujours des pièces jointes. Changez leur type, pour pouvoir supprimer ce type de pièce jointe. - - - - - entity.delete.must_not_contain_prices - La devise contient encore des prix. Vous devez changer leur devise pour pouvoir supprimer cet élément. - - - - - entity.delete.must_not_contain_users - Des utilisateurs utilisent toujours ce groupe ! Changez les de groupe pour pouvoir supprimer ce groupe. - - - - - part.table.edit - Modifier - - - - - part.table.edit.title - Modifier composant - - - - - part_list.action.action.title - Sélectionnez une action - - - - - part_list.action.action.group.favorite - Statut favori - - - - - part_list.action.action.favorite - Favorable - - - - - part_list.action.action.unfavorite - Défavorable - - - - - part_list.action.action.group.change_field - Modifier le champ - - - - - part_list.action.action.change_category - Modifier la catégorie - - - - - part_list.action.action.change_footprint - Modifier l'empreinte - - - - - part_list.action.action.change_manufacturer - Modifier le fabricant - - - - - part_list.action.action.change_unit - Modifier l'unité - - - - - part_list.action.action.delete - Supprimer - - - - - part_list.action.submit - Soumettre - - - - - part_list.action.part_count - %count% composants sélectionnés ! - - - - - company.edit.quick.website - Ouvrir le site web - - - - - company.edit.quick.email - Envoyer un e-mail - - - - - company.edit.quick.phone - Téléphoner - - - - - company.edit.quick.fax - Envoyer une télécopie - - - - - company.fax_number.placeholder - ex. +33 12 34 56 78 90 - - - - - part.edit.save_and_clone - Sauvegarder et dupliquer - - - - - validator.file_ext_not_allowed - L'extension de fichier n'est pas autorisée pour ce type de pièce jointe. - - - - - tools.reel_calc.title - Calculateur de bobines CMS - - - - - tools.reel_calc.inner_dia - Diamètre intérieur - - - - - tools.reel_calc.outer_dia - Diamètre extérieur - - - - - tools.reel_calc.tape_thick - Épaisseur du ruban - - - - - tools.reel_calc.part_distance - Distance entre les composants - - - - - tools.reel_calc.update - Actualiser - - - - - tools.reel_calc.parts_per_meter - Composants par mètre - - - - - tools.reel_calc.result_length - Longueur de la bande - - - - - tools.reel_calc.result_amount - Nbre approximatif de composants - - - - - tools.reel_calc.outer_greater_inner_error - Erreur : Le diamètre extérieur doit être supérieur au diamètre intérieur ! - - - - - tools.reel_calc.missing_values.error - Veuillez remplir toutes les valeurs ! - - - - - tools.reel_calc.load_preset - Charger la présélection - - - - - tools.reel_calc.explanation - Ce calculateur vous donne une estimation du nombre de pièces qui restent sur une bobine de CMS. Mesurez les dimensions notées sur la bobine (ou utilisez certains des préréglages) et cliquez sur "Actualiser" pour obtenir un résultat. - - - - - perm.tools.reel_calculator - Calculateur de bobines CMS - - - - - tree.tools.tools.reel_calculator - Calculateur de bobines CMS - - - - - currency.edit.update_rate - Taux de rafraîchissement - - - - - currency.edit.exchange_rate_update.unsupported_currency - Devise non prise en charge - - - - - currency.edit.exchange_rate_update.generic_error - Erreur générique - - - - - currency.edit.exchange_rate_updated.success - Succès - - - - - homepage.forum.text - Si vous avez des questions à propos de Part-DB , rendez vous sur <a href="%href%" class="link-external" target="_blank">Github</a> - - - - + + + + + + Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4 + Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:4 + templates\AdminPages\AttachmentTypeAdmin.html.twig:4 + + + attachment_type.caption + Types pour fichiers joints + + + + + Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:12 + new + + + attachment_type.edit + Modifier le type de pièce jointe + + + + + Part-DB1\templates\AdminPages\AttachmentTypeAdmin.html.twig:16 + new + + + attachment_type.new + Nouveau type de pièce jointe + + + + + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4 + Part-DB1\templates\_sidebar.html.twig:22 + Part-DB1\templates\_sidebar.html.twig:7 + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:4 + Part-DB1\templates\_sidebar.html.twig:22 + Part-DB1\templates\_sidebar.html.twig:7 + templates\AdminPages\CategoryAdmin.html.twig:4 + templates\base.html.twig:163 + templates\base.html.twig:170 + templates\base.html.twig:197 + templates\base.html.twig:225 + + + category.labelp + Catégories + + + + + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8 + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:19 + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:8 + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:11 + templates\AdminPages\CategoryAdmin.html.twig:8 + + + admin.options + Options + + + + + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9 + Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15 + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:9 + Part-DB1\templates\AdminPages\CompanyAdminBase.html.twig:15 + templates\AdminPages\CategoryAdmin.html.twig:9 + + + admin.advanced + Avancé + + + + + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:13 + new + + + category.edit + Éditer la catégorie + + + + + Part-DB1\templates\AdminPages\CategoryAdmin.html.twig:17 + new + + + category.new + Nouvelle catégorie + + + + + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4 + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:4 + + + currency.caption + Devise + + + + + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12 + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:12 + + + currency.iso_code.caption + Code ISO + + + + + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15 + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:15 + + + currency.symbol.caption + Symbole de la devise + + + + + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:29 + new + + + currency.edit + Editer la devise + + + + + Part-DB1\templates\AdminPages\CurrencyAdmin.html.twig:33 + new + + + currency.new + Nouvelle devise + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19 + Part-DB1\templates\_navbar_search.html.twig:67 + Part-DB1\templates\_sidebar.html.twig:27 + Part-DB1\templates\_sidebar.html.twig:43 + Part-DB1\templates\_sidebar.html.twig:63 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:19 + Part-DB1\templates\_navbar_search.html.twig:61 + Part-DB1\templates\_sidebar.html.twig:27 + Part-DB1\templates\_sidebar.html.twig:43 + Part-DB1\templates\_sidebar.html.twig:63 + templates\AdminPages\EntityAdminBase.html.twig:9 + templates\base.html.twig:80 + templates\base.html.twig:179 + templates\base.html.twig:206 + templates\base.html.twig:237 + + + search.placeholder + Recherche + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23 + Part-DB1\templates\_sidebar.html.twig:3 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:23 + Part-DB1\templates\_sidebar.html.twig:3 + templates\AdminPages\EntityAdminBase.html.twig:13 + templates\base.html.twig:166 + templates\base.html.twig:193 + templates\base.html.twig:221 + + + expandAll + Agrandir tout + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27 + Part-DB1\templates\_sidebar.html.twig:4 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:27 + Part-DB1\templates\_sidebar.html.twig:4 + templates\AdminPages\EntityAdminBase.html.twig:17 + templates\base.html.twig:167 + templates\base.html.twig:194 + templates\base.html.twig:222 + + + reduceAll + Réduire tout + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54 + Part-DB1\templates\Parts\info\_sidebar.html.twig:4 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:54 + Part-DB1\templates\Parts\info\_sidebar.html.twig:4 + + + part.info.timetravel_hint + C'est ainsi que le composant apparaissait avant le %timestamp%. <i>Veuillez noter que cette fonctionnalité est expérimentale, donc les infos ne sont peut-être pas correctes. </i> + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:60 + templates\AdminPages\EntityAdminBase.html.twig:42 + + + standard.label + Propriétés + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:61 + templates\AdminPages\EntityAdminBase.html.twig:43 + + + infos.label + Informations + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:63 + new + + + history.label + Historique + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:66 + templates\AdminPages\EntityAdminBase.html.twig:45 + + + export.label + Exporter + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:68 + templates\AdminPages\EntityAdminBase.html.twig:47 + + + import_export.label + Importer exporter + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:69 + + + mass_creation.label + Création multiple + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:82 + templates\AdminPages\EntityAdminBase.html.twig:59 + + + admin.common + Commun + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:86 + + + admin.attachments + Fichiers joints + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:90 + + + admin.parameters + Paramètres + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:179 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:167 + templates\AdminPages\EntityAdminBase.html.twig:142 + + + export_all.label + Exporter tous les éléments + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:185 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:173 + + + mass_creation.help + Chaque ligne sera interprétée comme le nom d'un élément qui sera créé. + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:45 + templates\AdminPages\EntityAdminBase.html.twig:35 + + + edit.caption + Éditer l'élément "%name" + + + + + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50 + Part-DB1\templates\AdminPages\EntityAdminBase.html.twig:50 + templates\AdminPages\EntityAdminBase.html.twig:37 + + + new.caption + Nouvel élément + + + + + Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4 + Part-DB1\templates\_sidebar.html.twig:9 + Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:4 + Part-DB1\templates\_sidebar.html.twig:9 + templates\base.html.twig:172 + templates\base.html.twig:199 + templates\base.html.twig:227 + + + footprint.labelp + Empreintes + + + + + Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:13 + new + + + footprint.edit + Editer l'empreinte + + + + + Part-DB1\templates\AdminPages\FootprintAdmin.html.twig:17 + new + + + footprint.new + Nouvelle empreinte + + + + + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4 + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:4 + + + group.edit.caption + Groupes + + + + + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:16 + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:9 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:16 + + + user.edit.permissions + Permissions + + + + + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:24 + new + + + group.edit + Editer le groupe + + + + + Part-DB1\templates\AdminPages\GroupAdmin.html.twig:28 + new + + + group.new + Nouveau groupe + + + + + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:4 + + + label_profile.caption + Profil des étiquettes + + + + + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:8 + + + label_profile.advanced + Avancé + + + + + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:9 + + + label_profile.comment + Commentaire + + + + + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:55 + new + + + label_profile.edit + Editer profil d'étiquette + + + + + Part-DB1\templates\AdminPages\LabelProfileAdmin.html.twig:59 + new + + + label_profile.new + Nouveau profil d'étiquette + + + + + Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4 + Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:4 + templates\AdminPages\ManufacturerAdmin.html.twig:4 + + + manufacturer.caption + Fabricants + + + + + Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:8 + new + + + manufacturer.edit + Modifiez le fabricant + + + + + Part-DB1\templates\AdminPages\ManufacturerAdmin.html.twig:12 + new + + + manufacturer.new + Nouveau fabricant + + + + + Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4 + Part-DB1\templates\AdminPages\MeasurementUnitAdmin.html.twig:4 + + + measurement_unit.caption + Unité de mesure + + + + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:5 + Part-DB1\templates\_sidebar.html.twig:8 + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:4 + Part-DB1\templates\_sidebar.html.twig:8 + templates\base.html.twig:171 + templates\base.html.twig:198 + templates\base.html.twig:226 + + + storelocation.labelp + Emplacement de stockage + + + + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:32 + new + + + storelocation.edit + Modifier l'emplacement de stockage + + + + + Part-DB1\templates\AdminPages\StorelocationAdmin.html.twig:36 + new + + + storelocation.new + Nouvel emplacement de stockage + + + + + Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:4 + Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:4 + templates\AdminPages\SupplierAdmin.html.twig:4 + + + supplier.caption + Fournisseurs + + + + + Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:16 + new + + + supplier.edit + Modifier le fournisseur + + + + + Part-DB1\templates\AdminPages\SupplierAdmin.html.twig:20 + new + + + supplier.new + Nouveau fournisseur + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:8 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:8 + + + user.edit.caption + Utilisateurs + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:14 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:14 + + + user.edit.configuration + Configuration + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:15 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:15 + + + user.edit.password + Mot de passe + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:45 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:45 + + + user.edit.tfa.caption + Authentification à deux facteurs + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:47 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:47 + + + user.edit.tfa.google_active + Application d'authentification active + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:48 + Part-DB1\templates\Users\backup_codes.html.twig:15 + Part-DB1\templates\Users\_2fa_settings.html.twig:95 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:48 + Part-DB1\templates\Users\backup_codes.html.twig:15 + Part-DB1\templates\Users\_2fa_settings.html.twig:95 + + + tfa_backup.remaining_tokens + Nombre de codes de secours restant + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:49 + Part-DB1\templates\Users\backup_codes.html.twig:17 + Part-DB1\templates\Users\_2fa_settings.html.twig:96 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:49 + Part-DB1\templates\Users\backup_codes.html.twig:17 + Part-DB1\templates\Users\_2fa_settings.html.twig:96 + + + tfa_backup.generation_date + Date de génération des codes de secours + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:53 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:60 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:53 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:60 + + + user.edit.tfa.disabled + Méthode désactivée + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:56 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:56 + + + user.edit.tfa.u2f_keys_count + Clés de sécurité actives + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 + + + user.edit.tfa.disable_tfa_title + Voulez vous vraiment poursuivre ? + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:72 + + + user.edit.tfa.disable_tfa_message + Cela désactivera <b> toutes les méthodes d'authentification à deux facteurs de l'utilisateur</b> et supprimera <b>les codes de secours</b>! +<br> +L'utilisateur devra configurer à nouveau toutes les méthodes d'authentification à deux facteurs et créer de nouveaux codes de secours!<br><br> +<b>Ne faites ceci qu'en étant sûr de l'identité de l'utilisateur (ayant besoin d'aide),autrement le compte pourrai être compromis!</b> + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:73 + Part-DB1\templates\AdminPages\UserAdmin.html.twig:73 + + + user.edit.tfa.disable_tfa.btn + Désactiver toutes les méthodes d'authentification à deux facteurs + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:85 + new + + + user.edit + Modifier l'utilisateur + + + + + Part-DB1\templates\AdminPages\UserAdmin.html.twig:89 + new + + + user.new + Nouvel utilisateur + + + + + Part-DB1\templates\AdminPages\_attachments.html.twig:4 + Part-DB1\templates\Parts\edit\_attachments.html.twig:4 + Part-DB1\templates\AdminPages\_attachments.html.twig:4 + Part-DB1\templates\Parts\edit\_attachments.html.twig:4 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:63 + + + attachment.delete + Supprimer + + + + + Part-DB1\templates\AdminPages\_attachments.html.twig:41 + Part-DB1\templates\Parts\edit\_attachments.html.twig:38 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:35 + Part-DB1\src\DataTables\AttachmentDataTable.php:159 + Part-DB1\templates\Parts\edit\_attachments.html.twig:38 + Part-DB1\src\DataTables\AttachmentDataTable.php:159 + + + attachment.external + Externe + + + + + Part-DB1\templates\AdminPages\_attachments.html.twig:49 + Part-DB1\templates\Parts\edit\_attachments.html.twig:47 + Part-DB1\templates\AdminPages\_attachments.html.twig:47 + Part-DB1\templates\Parts\edit\_attachments.html.twig:45 + + + attachment.preview.alt + Miniature du fichier joint + + + + + Part-DB1\templates\AdminPages\_attachments.html.twig:52 + Part-DB1\templates\Parts\edit\_attachments.html.twig:50 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:62 + Part-DB1\templates\AdminPages\_attachments.html.twig:50 + Part-DB1\templates\Parts\edit\_attachments.html.twig:48 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:45 + + + attachment.view + Afficher + + + + + Part-DB1\templates\AdminPages\_attachments.html.twig:58 + Part-DB1\templates\Parts\edit\_attachments.html.twig:56 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:43 + Part-DB1\src\DataTables\AttachmentDataTable.php:166 + Part-DB1\templates\AdminPages\_attachments.html.twig:56 + Part-DB1\templates\Parts\edit\_attachments.html.twig:54 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:38 + Part-DB1\src\DataTables\AttachmentDataTable.php:166 + + + attachment.file_not_found + Fichier introuvable + + + + + Part-DB1\templates\AdminPages\_attachments.html.twig:66 + Part-DB1\templates\Parts\edit\_attachments.html.twig:64 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:48 + Part-DB1\templates\Parts\edit\_attachments.html.twig:62 + + + attachment.secure + Fichier joint privé + + + + + Part-DB1\templates\AdminPages\_attachments.html.twig:79 + Part-DB1\templates\Parts\edit\_attachments.html.twig:77 + Part-DB1\templates\AdminPages\_attachments.html.twig:77 + Part-DB1\templates\Parts\edit\_attachments.html.twig:75 + + + attachment.create + Ajouter un fichier joint + + + + + Part-DB1\templates\AdminPages\_attachments.html.twig:84 + Part-DB1\templates\Parts\edit\_attachments.html.twig:82 + Part-DB1\templates\Parts\edit\_lots.html.twig:33 + Part-DB1\templates\AdminPages\_attachments.html.twig:82 + Part-DB1\templates\Parts\edit\_attachments.html.twig:80 + Part-DB1\templates\Parts\edit\_lots.html.twig:33 + + + part_lot.edit.delete.confirm + Voulez vous vraiment supprimer ce stock ? Cette action ne pourra pas être annulée! + + + + + Part-DB1\templates\AdminPages\_delete_form.html.twig:2 + Part-DB1\templates\AdminPages\_delete_form.html.twig:2 + templates\AdminPages\_delete_form.html.twig:2 + + + entity.delete.confirm_title + Voulez vous vraiment supprimer %name%? + + + + + Part-DB1\templates\AdminPages\_delete_form.html.twig:3 + Part-DB1\templates\AdminPages\_delete_form.html.twig:3 + templates\AdminPages\_delete_form.html.twig:3 + + + entity.delete.message + Cette action ne pourra pas être annulée! +<br> +Les sous éléments seront déplacés vers le haut. + + + + + Part-DB1\templates\AdminPages\_delete_form.html.twig:11 + Part-DB1\templates\AdminPages\_delete_form.html.twig:11 + templates\AdminPages\_delete_form.html.twig:9 + + + entity.delete + Supprimer l'élément + + + + + Part-DB1\templates\AdminPages\_delete_form.html.twig:16 + Part-DB1\templates\Parts\info\_tools.html.twig:45 + Part-DB1\src\Form\Part\PartBaseType.php:286 + Part-DB1\templates\AdminPages\_delete_form.html.twig:16 + Part-DB1\templates\Parts\info\_tools.html.twig:43 + Part-DB1\src\Form\Part\PartBaseType.php:267 + new + + + edit.log_comment + Éditer le commentaire + + + + + Part-DB1\templates\AdminPages\_delete_form.html.twig:24 + Part-DB1\templates\AdminPages\_delete_form.html.twig:24 + templates\AdminPages\_delete_form.html.twig:12 + + + entity.delete.recursive + Suppression récursive (tous les sous éléments) + + + + + Part-DB1\templates\AdminPages\_duplicate.html.twig:3 + + + entity.duplicate + Dupliquer l’élément + + + + + Part-DB1\templates\AdminPages\_export_form.html.twig:4 + Part-DB1\src\Form\AdminPages\ImportType.php:76 + Part-DB1\templates\AdminPages\_export_form.html.twig:4 + Part-DB1\src\Form\AdminPages\ImportType.php:76 + templates\AdminPages\_export_form.html.twig:4 + src\Form\ImportType.php:67 + + + export.format + Format de fichier + + + + + Part-DB1\templates\AdminPages\_export_form.html.twig:16 + Part-DB1\templates\AdminPages\_export_form.html.twig:16 + templates\AdminPages\_export_form.html.twig:16 + + + export.level + Niveau de verbosité + + + + + Part-DB1\templates\AdminPages\_export_form.html.twig:19 + Part-DB1\templates\AdminPages\_export_form.html.twig:19 + templates\AdminPages\_export_form.html.twig:19 + + + export.level.simple + Simple + + + + + Part-DB1\templates\AdminPages\_export_form.html.twig:20 + Part-DB1\templates\AdminPages\_export_form.html.twig:20 + templates\AdminPages\_export_form.html.twig:20 + + + export.level.extended + Étendu + + + + + Part-DB1\templates\AdminPages\_export_form.html.twig:21 + Part-DB1\templates\AdminPages\_export_form.html.twig:21 + templates\AdminPages\_export_form.html.twig:21 + + + export.level.full + Complet + + + + + Part-DB1\templates\AdminPages\_export_form.html.twig:31 + Part-DB1\templates\AdminPages\_export_form.html.twig:31 + templates\AdminPages\_export_form.html.twig:31 + + + export.include_children + Exporter également les sous éléments + + + + + Part-DB1\templates\AdminPages\_export_form.html.twig:39 + Part-DB1\templates\AdminPages\_export_form.html.twig:39 + templates\AdminPages\_export_form.html.twig:39 + + + export.btn + Exporter + + + + + Part-DB1\templates\AdminPages\_info.html.twig:4 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12 + Part-DB1\templates\Parts\info\show_part_info.html.twig:24 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:36 + Part-DB1\templates\AdminPages\_info.html.twig:4 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:12 + Part-DB1\templates\Parts\info\show_part_info.html.twig:24 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:36 + templates\AdminPages\EntityAdminBase.html.twig:94 + templates\Parts\edit_part_info.html.twig:12 + templates\Parts\show_part_info.html.twig:11 + + + id.label + ID + + + + + Part-DB1\templates\AdminPages\_info.html.twig:11 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:76 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:77 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:6 + Part-DB1\templates\Parts\info\_order_infos.html.twig:69 + Part-DB1\templates\Parts\info\_sidebar.html.twig:12 + Part-DB1\templates\Parts\lists\_info_card.html.twig:77 + Part-DB1\templates\AdminPages\_info.html.twig:11 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:59 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:60 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:6 + Part-DB1\templates\Parts\info\_order_infos.html.twig:69 + Part-DB1\templates\Parts\info\_sidebar.html.twig:12 + Part-DB1\templates\Parts\lists\_info_card.html.twig:53 + templates\AdminPages\EntityAdminBase.html.twig:101 + templates\Parts\show_part_info.html.twig:248 + + + createdAt + Créé le + + + + + Part-DB1\templates\AdminPages\_info.html.twig:25 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:21 + Part-DB1\templates\Parts\info\_sidebar.html.twig:8 + Part-DB1\templates\Parts\lists\_info_card.html.twig:73 + Part-DB1\templates\AdminPages\_info.html.twig:25 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:21 + Part-DB1\templates\Parts\info\_sidebar.html.twig:8 + Part-DB1\templates\Parts\lists\_info_card.html.twig:49 + templates\AdminPages\EntityAdminBase.html.twig:114 + templates\Parts\show_part_info.html.twig:263 + + + lastModified + Dernière modification + + + + + Part-DB1\templates\AdminPages\_info.html.twig:38 + Part-DB1\templates\AdminPages\_info.html.twig:38 + + + entity.info.parts_count + Nombre de composants avec cet élément + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:6 + Part-DB1\templates\helper.twig:125 + Part-DB1\templates\Parts\edit\_specifications.html.twig:6 + + + specifications.property + Paramètre + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:7 + Part-DB1\templates\Parts\edit\_specifications.html.twig:7 + + + specifications.symbol + Symbole + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:8 + Part-DB1\templates\Parts\edit\_specifications.html.twig:8 + + + specifications.value_min + Min. + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:9 + Part-DB1\templates\Parts\edit\_specifications.html.twig:9 + + + specifications.value_typ + Typ. + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:10 + Part-DB1\templates\Parts\edit\_specifications.html.twig:10 + + + specifications.value_max + Max. + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:11 + Part-DB1\templates\Parts\edit\_specifications.html.twig:11 + + + specifications.unit + Unité + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:12 + Part-DB1\templates\Parts\edit\_specifications.html.twig:12 + + + specifications.text + Texte + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:13 + Part-DB1\templates\Parts\edit\_specifications.html.twig:13 + + + specifications.group + Groupe + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:26 + Part-DB1\templates\Parts\edit\_specifications.html.twig:26 + + + specification.create + Nouveau paramètre + + + + + Part-DB1\templates\AdminPages\_parameters.html.twig:31 + Part-DB1\templates\Parts\edit\_specifications.html.twig:31 + + + parameter.delete.confirm + Souhaitez-vous vraiment supprimer ce paramètre ? + + + + + Part-DB1\templates\attachment_list.html.twig:3 + Part-DB1\templates\attachment_list.html.twig:3 + + + attachment.list.title + Liste des fichiers joints + + + + + Part-DB1\templates\attachment_list.html.twig:10 + Part-DB1\templates\LogSystem\_log_table.html.twig:8 + Part-DB1\templates\Parts\lists\_parts_list.html.twig:6 + Part-DB1\templates\attachment_list.html.twig:10 + Part-DB1\templates\LogSystem\_log_table.html.twig:8 + Part-DB1\templates\Parts\lists\_parts_list.html.twig:6 + + + part_list.loading.caption + Chargement + + + + + Part-DB1\templates\attachment_list.html.twig:11 + Part-DB1\templates\LogSystem\_log_table.html.twig:9 + Part-DB1\templates\Parts\lists\_parts_list.html.twig:7 + Part-DB1\templates\attachment_list.html.twig:11 + Part-DB1\templates\LogSystem\_log_table.html.twig:9 + Part-DB1\templates\Parts\lists\_parts_list.html.twig:7 + + + part_list.loading.message + Cela peut prendre un moment.Si ce message ne disparaît pas, essayez de recharger la page. + + + + + Part-DB1\templates\base.html.twig:68 + Part-DB1\templates\base.html.twig:68 + templates\base.html.twig:246 + + + vendor.base.javascript_hint + Activez Javascipt pour profiter de toutes les fonctionnalités! + + + + + Part-DB1\templates\base.html.twig:73 + Part-DB1\templates\base.html.twig:73 + + + sidebar.big.toggle + Afficher/Cacher le panneau latéral +Show/Hide sidebar + + + + + Part-DB1\templates\base.html.twig:95 + Part-DB1\templates\base.html.twig:95 + templates\base.html.twig:271 + + + loading.caption + Chargement: + + + + + Part-DB1\templates\base.html.twig:96 + Part-DB1\templates\base.html.twig:96 + templates\base.html.twig:272 + + + loading.message + Cela peut prendre un moment.Si ce message ne disparaît pas, essayez de recharger la page. + + + + + Part-DB1\templates\base.html.twig:101 + Part-DB1\templates\base.html.twig:101 + templates\base.html.twig:277 + + + loading.bar + Chargement... + + + + + Part-DB1\templates\base.html.twig:112 + Part-DB1\templates\base.html.twig:112 + templates\base.html.twig:288 + + + back_to_top + Retour en haut de page + + + + + Part-DB1\templates\Form\permissionLayout.html.twig:35 + Part-DB1\templates\Form\permissionLayout.html.twig:35 + + + permission.edit.permission + Permissions + + + + + Part-DB1\templates\Form\permissionLayout.html.twig:36 + Part-DB1\templates\Form\permissionLayout.html.twig:36 + + + permission.edit.value + Valeur + + + + + Part-DB1\templates\Form\permissionLayout.html.twig:53 + Part-DB1\templates\Form\permissionLayout.html.twig:53 + + + permission.legend.title + Explication des états: + + + + + Part-DB1\templates\Form\permissionLayout.html.twig:57 + Part-DB1\templates\Form\permissionLayout.html.twig:57 + + + permission.legend.disallow + Interdire + + + + + Part-DB1\templates\Form\permissionLayout.html.twig:61 + Part-DB1\templates\Form\permissionLayout.html.twig:61 + + + permission.legend.allow + Autoriser + + + + + Part-DB1\templates\Form\permissionLayout.html.twig:65 + Part-DB1\templates\Form\permissionLayout.html.twig:65 + + + permission.legend.inherit + Hériter du groupe (parent) + + + + + Part-DB1\templates\helper.twig:3 + Part-DB1\templates\helper.twig:3 + + + bool.true + Vrai + + + + + Part-DB1\templates\helper.twig:5 + Part-DB1\templates\helper.twig:5 + + + bool.false + Faux + + + + + Part-DB1\templates\helper.twig:92 + Part-DB1\templates\helper.twig:87 + + + Yes + Oui + + + + + Part-DB1\templates\helper.twig:94 + Part-DB1\templates\helper.twig:89 + + + No + Non + + + + + Part-DB1\templates\helper.twig:126 + + + specifications.value + Valeur + + + + + Part-DB1\templates\homepage.html.twig:7 + Part-DB1\templates\homepage.html.twig:7 + templates\homepage.html.twig:7 + + + version.caption + Version + + + + + Part-DB1\templates\homepage.html.twig:22 + Part-DB1\templates\homepage.html.twig:22 + templates\homepage.html.twig:19 + + + homepage.license + Information de license + + + + + Part-DB1\templates\homepage.html.twig:31 + Part-DB1\templates\homepage.html.twig:31 + templates\homepage.html.twig:28 + + + homepage.github.caption + Page du projet + + + + + Part-DB1\templates\homepage.html.twig:31 + Part-DB1\templates\homepage.html.twig:31 + templates\homepage.html.twig:28 + + + homepage.github.text + Retrouvez les téléchargements, report de bugs, to-do-list etc. sur <a href="%href%" class="link-external" target="_blank">la page du projet GitHub</a> + + + + + Part-DB1\templates\homepage.html.twig:32 + Part-DB1\templates\homepage.html.twig:32 + templates\homepage.html.twig:29 + + + homepage.help.caption + Aide + + + + + Part-DB1\templates\homepage.html.twig:32 + Part-DB1\templates\homepage.html.twig:32 + templates\homepage.html.twig:29 + + + homepage.help.text + De l'aide et des conseils sont disponibles sur le Wiki de la <a href="%href%" class="link-external" target="_blank">page GitHub</a> + + + + + Part-DB1\templates\homepage.html.twig:33 + Part-DB1\templates\homepage.html.twig:33 + templates\homepage.html.twig:30 + + + homepage.forum.caption + Forum + + + + + Part-DB1\templates\homepage.html.twig:45 + Part-DB1\templates\homepage.html.twig:45 + new + + + homepage.last_activity + Activité récente + + + + + Part-DB1\templates\LabelSystem\dialog.html.twig:3 + Part-DB1\templates\LabelSystem\dialog.html.twig:6 + + + label_generator.title + Générateur d'étiquettes + + + + + Part-DB1\templates\LabelSystem\dialog.html.twig:16 + + + label_generator.common + Commun + + + + + Part-DB1\templates\LabelSystem\dialog.html.twig:20 + + + label_generator.advanced + Avancé + + + + + Part-DB1\templates\LabelSystem\dialog.html.twig:24 + + + label_generator.profiles + Profils + + + + + Part-DB1\templates\LabelSystem\dialog.html.twig:58 + + + label_generator.selected_profile + Profil actuellement sélectionné + + + + + Part-DB1\templates\LabelSystem\dialog.html.twig:62 + + + label_generator.edit_profile + Modifier le profil + + + + + Part-DB1\templates\LabelSystem\dialog.html.twig:75 + + + label_generator.load_profile + Charger le profil + + + + + Part-DB1\templates\LabelSystem\dialog.html.twig:102 + + + label_generator.download + Télécharger + + + + + Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:3 + Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:5 + + + label_generator.label_btn + Générer une étiquette + + + + + Part-DB1\templates\LabelSystem\dropdown_macro.html.twig:20 + + + label_generator.label_empty + Nouvelle étiquette vide + + + + + Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:3 + + + label_scanner.title + Lecteur d'étiquettes + + + + + Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7 + + + label_scanner.no_cam_found.title + Aucune webcam trouvée + + + + + Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:7 + + + label_scanner.no_cam_found.text + Vous devez disposer d'une webcam et donner l'autorisation d'utiliser la fonction de scanner. Vous pouvez entrer le code à barres manuellement ci-dessous. + + + + + Part-DB1\templates\LabelSystem\Scanner\dialog.html.twig:27 + + + label_scanner.source_select + Sélectionnez une source + + + + + Part-DB1\templates\LogSystem\log_list.html.twig:3 + Part-DB1\templates\LogSystem\log_list.html.twig:3 + + + log.list.title + Journal système + + + + + Part-DB1\templates\LogSystem\_log_table.html.twig:1 + Part-DB1\templates\LogSystem\_log_table.html.twig:1 + new + + + log.undo.confirm_title + Annuler le changement / revenir à une date antérieure ? + + + + + Part-DB1\templates\LogSystem\_log_table.html.twig:2 + Part-DB1\templates\LogSystem\_log_table.html.twig:2 + new + + + log.undo.confirm_message + Voulez-vous annuler la modification donnée / réinitialiser l'élément à une date donnée ? + + + + + Part-DB1\templates\mail\base.html.twig:24 + Part-DB1\templates\mail\base.html.twig:24 + + + mail.footer.email_sent_by + Cet email a été envoyé automatiquement par + + + + + Part-DB1\templates\mail\base.html.twig:24 + Part-DB1\templates\mail\base.html.twig:24 + + + mail.footer.dont_reply + Ne répondez pas à cet email. + + + + + Part-DB1\templates\mail\pw_reset.html.twig:6 + Part-DB1\templates\mail\pw_reset.html.twig:6 + + + email.hi %name% + Bonjour %name% + + + + + Part-DB1\templates\mail\pw_reset.html.twig:7 + Part-DB1\templates\mail\pw_reset.html.twig:7 + + + email.pw_reset.message + Quelqu’un (surement vous) a demandé une réinitialisation de votre mot de passe.Si ce n'est pas le cas, ignorez simplement cet email. + + + + + Part-DB1\templates\mail\pw_reset.html.twig:9 + Part-DB1\templates\mail\pw_reset.html.twig:9 + + + email.pw_reset.button + Cliquez ici pour réinitialiser votre mot de passe + + + + + Part-DB1\templates\mail\pw_reset.html.twig:11 + Part-DB1\templates\mail\pw_reset.html.twig:11 + + + email.pw_reset.fallback + Si cela ne fonctionne pas pour vous, allez à <a href="%url%">%url%</a> et entrez les informations suivantes + + + + + Part-DB1\templates\mail\pw_reset.html.twig:16 + Part-DB1\templates\mail\pw_reset.html.twig:16 + + + email.pw_reset.username + Nom d'utilisateur + + + + + Part-DB1\templates\mail\pw_reset.html.twig:19 + Part-DB1\templates\mail\pw_reset.html.twig:19 + + + email.pw_reset.token + Jeton + + + + + Part-DB1\templates\mail\pw_reset.html.twig:24 + Part-DB1\templates\mail\pw_reset.html.twig:24 + + + email.pw_reset.valid_unit %date% + Le jeton de réinitialisation sera valable jusqu'au <i>%date%</i>. + + + + + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:18 + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58 + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:78 + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:58 + + + orderdetail.delete + Supprimer + + + + + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39 + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:39 + + + pricedetails.edit.min_qty + Quantité minimale de commande + + + + + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40 + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:40 + + + pricedetails.edit.price + Prix + + + + + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41 + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:41 + + + pricedetails.edit.price_qty + Pour la quantité + + + + + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54 + Part-DB1\templates\Parts\edit\edit_form_styles.html.twig:54 + + + pricedetail.create + Ajouter prix + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:4 + templates\Parts\edit_part_info.html.twig:4 + + + part.edit.title + Éditer le composant + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:9 + templates\Parts\edit_part_info.html.twig:9 + + + part.edit.card_title + Éditer le composant + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:22 + + + part.edit.tab.common + Général + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:28 + + + part.edit.tab.manufacturer + Fabricant + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:34 + + + part.edit.tab.advanced + Avancé + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:40 + + + part.edit.tab.part_lots + Stocks + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:46 + + + part.edit.tab.attachments + Fichiers joints + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:52 + + + part.edit.tab.orderdetails + Informations pour la commande + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58 + + + part.edit.tab.specifications + Caractéristiques + + + + + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:64 + Part-DB1\templates\Parts\edit\edit_part_info.html.twig:58 + + + part.edit.tab.comment + Commentaire + + + + + Part-DB1\templates\Parts\edit\new_part.html.twig:8 + Part-DB1\templates\Parts\edit\new_part.html.twig:8 + templates\Parts\new_part.html.twig:8 + + + part.new.card_title + Créer un nouveau composant + + + + + Part-DB1\templates\Parts\edit\_lots.html.twig:5 + Part-DB1\templates\Parts\edit\_lots.html.twig:5 + + + part_lot.delete + Supprimer + + + + + Part-DB1\templates\Parts\edit\_lots.html.twig:28 + Part-DB1\templates\Parts\edit\_lots.html.twig:28 + + + part_lot.create + Créer un inventaire + + + + + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13 + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:13 + + + orderdetail.create + Ajouter un fournisseur + + + + + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18 + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:18 + + + pricedetails.edit.delete.confirm + Voulez-vous vraiment supprimer ce prix ? Cela ne peut pas être défait ! + + + + + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:62 + Part-DB1\templates\Parts\edit\_orderdetails.html.twig:61 + + + orderdetails.edit.delete.confirm + Voulez-vous vraiment supprimer ce fournisseur ? Cela ne peut pas être défait ! + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:4 + Part-DB1\templates\Parts\info\show_part_info.html.twig:19 + Part-DB1\templates\Parts\info\show_part_info.html.twig:4 + Part-DB1\templates\Parts\info\show_part_info.html.twig:19 + templates\Parts\show_part_info.html.twig:4 + templates\Parts\show_part_info.html.twig:9 + + + part.info.title + Informations détaillées pour + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:47 + Part-DB1\templates\Parts\info\show_part_info.html.twig:47 + + + part.part_lots.label + Stocks + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:56 + Part-DB1\templates\Parts\lists\_info_card.html.twig:43 + Part-DB1\templates\_navbar_search.html.twig:31 + Part-DB1\templates\_navbar_search.html.twig:26 + templates\base.html.twig:62 + templates\Parts\show_part_info.html.twig:74 + src\Form\PartType.php:86 + + + comment.label + Commentaire + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:64 + + + part.info.specifications + Caractéristiques + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:74 + Part-DB1\templates\Parts\info\show_part_info.html.twig:64 + templates\Parts\show_part_info.html.twig:82 + + + attachment.labelp + Fichiers joints + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:83 + Part-DB1\templates\Parts\info\show_part_info.html.twig:71 + templates\Parts\show_part_info.html.twig:88 + + + vendor.partinfo.shopping_infos + Informations de commande + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:91 + Part-DB1\templates\Parts\info\show_part_info.html.twig:78 + templates\Parts\show_part_info.html.twig:94 + + + vendor.partinfo.history + Historique + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:97 + Part-DB1\templates\_sidebar.html.twig:54 + Part-DB1\templates\_sidebar.html.twig:13 + Part-DB1\templates\Parts\info\show_part_info.html.twig:84 + Part-DB1\templates\_sidebar.html.twig:54 + Part-DB1\templates\_sidebar.html.twig:13 + templates\base.html.twig:176 + templates\base.html.twig:203 + templates\base.html.twig:217 + templates\base.html.twig:231 + templates\Parts\show_part_info.html.twig:100 + + + tools.label + Outils + + + + + Part-DB1\templates\Parts\info\show_part_info.html.twig:103 + Part-DB1\templates\Parts\info\show_part_info.html.twig:90 + + + extended_info.label + Informations complémentaires + + + + + Part-DB1\templates\Parts\info\_attachments_info.html.twig:7 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:7 + + + attachment.name + Nom + + + + + Part-DB1\templates\Parts\info\_attachments_info.html.twig:8 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:8 + + + attachment.attachment_type + Type de fichier joint + + + + + Part-DB1\templates\Parts\info\_attachments_info.html.twig:9 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:9 + + + attachment.file_name + Nom du fichier + + + + + Part-DB1\templates\Parts\info\_attachments_info.html.twig:10 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:10 + + + attachment.file_size + Taille du fichier + + + + + Part-DB1\templates\Parts\info\_attachments_info.html.twig:54 + + + attachment.preview + Aperçu de l'image + + + + + Part-DB1\templates\Parts\info\_attachments_info.html.twig:67 + Part-DB1\templates\Parts\info\_attachments_info.html.twig:50 + + + attachment.download + Téléchargement + + + + + Part-DB1\templates\Parts\info\_extended_infos.html.twig:11 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:11 + new + + + user.creating_user + Utilisateur qui a créé ce composant + + + + + Part-DB1\templates\Parts\info\_extended_infos.html.twig:13 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:28 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:50 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:13 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:28 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:50 + + + Unknown + Inconnu + + + + + Part-DB1\templates\Parts\info\_extended_infos.html.twig:15 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:30 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:15 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:30 + new + + + accessDenied + Accès refusé + + + + + Part-DB1\templates\Parts\info\_extended_infos.html.twig:26 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:26 + new + + + user.last_editing_user + Utilisateur qui a édité ce composant en dernier + + + + + Part-DB1\templates\Parts\info\_extended_infos.html.twig:41 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:41 + + + part.isFavorite + Favoris + + + + + Part-DB1\templates\Parts\info\_extended_infos.html.twig:46 + Part-DB1\templates\Parts\info\_extended_infos.html.twig:46 + + + part.minOrderAmount + Quantité minimale de commande + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:8 + Part-DB1\templates\_navbar_search.html.twig:46 + Part-DB1\src\Services\ElementTypeNameGenerator.php:84 + Part-DB1\templates\Parts\info\_main_infos.html.twig:8 + Part-DB1\templates\_navbar_search.html.twig:41 + Part-DB1\src\Services\ElementTypeNameGenerator.php:84 + templates\base.html.twig:70 + templates\Parts\show_part_info.html.twig:24 + src\Form\PartType.php:80 + + + manufacturer.label + Fabricant + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:24 + Part-DB1\templates\_navbar_search.html.twig:11 + templates\base.html.twig:54 + src\Form\PartType.php:62 + + + name.label + Nom + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:27 + Part-DB1\templates\Parts\info\_main_infos.html.twig:27 + new + + + part.back_to_info + Retour à la version actuelle + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:32 + Part-DB1\templates\_navbar_search.html.twig:19 + Part-DB1\templates\Parts\info\_main_infos.html.twig:32 + Part-DB1\templates\_navbar_search.html.twig:18 + templates\base.html.twig:58 + templates\Parts\show_part_info.html.twig:31 + src\Form\PartType.php:65 + + + description.label + Description + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:34 + Part-DB1\templates\_navbar_search.html.twig:15 + Part-DB1\src\Services\ElementTypeNameGenerator.php:80 + Part-DB1\templates\Parts\info\_main_infos.html.twig:34 + Part-DB1\templates\_navbar_search.html.twig:14 + Part-DB1\src\Services\ElementTypeNameGenerator.php:80 + templates\base.html.twig:56 + templates\Parts\show_part_info.html.twig:32 + src\Form\PartType.php:74 + + + category.label + Catégorie + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:39 + Part-DB1\templates\Parts\info\_main_infos.html.twig:39 + templates\Parts\show_part_info.html.twig:42 + src\Form\PartType.php:69 + + + instock.label + En stock + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:41 + Part-DB1\templates\Parts\info\_main_infos.html.twig:41 + templates\Parts\show_part_info.html.twig:44 + src\Form\PartType.php:72 + + + mininstock.label + Stock minimum + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:45 + Part-DB1\templates\_navbar_search.html.twig:52 + Part-DB1\src\Services\ElementTypeNameGenerator.php:83 + Part-DB1\templates\Parts\info\_main_infos.html.twig:45 + Part-DB1\templates\_navbar_search.html.twig:47 + Part-DB1\src\Services\ElementTypeNameGenerator.php:83 + templates\base.html.twig:73 + templates\Parts\show_part_info.html.twig:47 + + + footprint.label + Empreinte + + + + + Part-DB1\templates\Parts\info\_main_infos.html.twig:56 + Part-DB1\templates\Parts\info\_main_infos.html.twig:59 + Part-DB1\templates\Parts\info\_main_infos.html.twig:57 + Part-DB1\templates\Parts\info\_main_infos.html.twig:60 + templates\Parts\show_part_info.html.twig:51 + + + part.avg_price.label + Prix moyen + + + + + Part-DB1\templates\Parts\info\_order_infos.html.twig:5 + Part-DB1\templates\Parts\info\_order_infos.html.twig:5 + + + part.supplier.name + Nom + + + + + Part-DB1\templates\Parts\info\_order_infos.html.twig:6 + Part-DB1\templates\Parts\info\_order_infos.html.twig:6 + + + part.supplier.partnr + Lien/Code cmd. + + + + + Part-DB1\templates\Parts\info\_order_infos.html.twig:28 + Part-DB1\templates\Parts\info\_order_infos.html.twig:28 + + + part.order.minamount + Nombre minimum + + + + + Part-DB1\templates\Parts\info\_order_infos.html.twig:29 + Part-DB1\templates\Parts\info\_order_infos.html.twig:29 + + + part.order.price + Prix + + + + + Part-DB1\templates\Parts\info\_order_infos.html.twig:31 + Part-DB1\templates\Parts\info\_order_infos.html.twig:31 + + + part.order.single_price + Prix unitaire + + + + + Part-DB1\templates\Parts\info\_order_infos.html.twig:71 + Part-DB1\templates\Parts\info\_order_infos.html.twig:71 + + + edit.caption_short + Éditer + + + + + Part-DB1\templates\Parts\info\_order_infos.html.twig:72 + Part-DB1\templates\Parts\info\_order_infos.html.twig:72 + + + delete.caption + Supprimer + + + + + Part-DB1\templates\Parts\info\_part_lots.html.twig:7 + Part-DB1\templates\Parts\info\_part_lots.html.twig:6 + + + part_lots.description + Description + + + + + Part-DB1\templates\Parts\info\_part_lots.html.twig:8 + Part-DB1\templates\Parts\info\_part_lots.html.twig:7 + + + part_lots.storage_location + Emplacement de stockage + + + + + Part-DB1\templates\Parts\info\_part_lots.html.twig:9 + Part-DB1\templates\Parts\info\_part_lots.html.twig:8 + + + part_lots.amount + Quantité + + + + + Part-DB1\templates\Parts\info\_part_lots.html.twig:24 + Part-DB1\templates\Parts\info\_part_lots.html.twig:22 + + + part_lots.location_unknown + Emplacement de stockage inconnu + + + + + Part-DB1\templates\Parts\info\_part_lots.html.twig:31 + Part-DB1\templates\Parts\info\_part_lots.html.twig:29 + + + part_lots.instock_unknown + Quantité inconnue + + + + + Part-DB1\templates\Parts\info\_part_lots.html.twig:40 + Part-DB1\templates\Parts\info\_part_lots.html.twig:38 + + + part_lots.expiration_date + Date d'expiration + + + + + Part-DB1\templates\Parts\info\_part_lots.html.twig:48 + Part-DB1\templates\Parts\info\_part_lots.html.twig:46 + + + part_lots.is_expired + Expiré + + + + + Part-DB1\templates\Parts\info\_part_lots.html.twig:55 + Part-DB1\templates\Parts\info\_part_lots.html.twig:53 + + + part_lots.need_refill + Doit être rempli à nouveau + + + + + Part-DB1\templates\Parts\info\_picture.html.twig:15 + Part-DB1\templates\Parts\info\_picture.html.twig:15 + + + part.info.prev_picture + Image précédente + + + + + Part-DB1\templates\Parts\info\_picture.html.twig:19 + Part-DB1\templates\Parts\info\_picture.html.twig:19 + + + part.info.next_picture + Image suivante + + + + + Part-DB1\templates\Parts\info\_sidebar.html.twig:21 + Part-DB1\templates\Parts\info\_sidebar.html.twig:21 + + + part.mass.tooltip + Poids + + + + + Part-DB1\templates\Parts\info\_sidebar.html.twig:30 + Part-DB1\templates\Parts\info\_sidebar.html.twig:30 + + + part.needs_review.badge + Révision nécessaire + + + + + Part-DB1\templates\Parts\info\_sidebar.html.twig:39 + Part-DB1\templates\Parts\info\_sidebar.html.twig:39 + + + part.favorite.badge + Favoris + + + + + Part-DB1\templates\Parts\info\_sidebar.html.twig:47 + Part-DB1\templates\Parts\info\_sidebar.html.twig:47 + + + part.obsolete.badge + N'est plus disponible + + + + + Part-DB1\templates\Parts\info\_specifications.html.twig:10 + + + parameters.extracted_from_description + Automatiquement extrait de la description + + + + + Part-DB1\templates\Parts\info\_specifications.html.twig:15 + + + parameters.auto_extracted_from_comment + Automatiquement extrait du commentaire + + + + + Part-DB1\templates\Parts\info\_tools.html.twig:6 + Part-DB1\templates\Parts\info\_tools.html.twig:4 + templates\Parts\show_part_info.html.twig:125 + + + part.edit.btn + Éditer + + + + + Part-DB1\templates\Parts\info\_tools.html.twig:16 + Part-DB1\templates\Parts\info\_tools.html.twig:14 + templates\Parts\show_part_info.html.twig:135 + + + part.clone.btn + Duplication + + + + + Part-DB1\templates\Parts\info\_tools.html.twig:24 + Part-DB1\templates\Parts\lists\_action_bar.html.twig:4 + templates\Parts\show_part_info.html.twig:143 + + + part.create.btn + Créer un nouveau composant + + + + + Part-DB1\templates\Parts\info\_tools.html.twig:31 + Part-DB1\templates\Parts\info\_tools.html.twig:29 + + + part.delete.confirm_title + Voulez-vous vraiment supprimer ce composant ? + + + + + Part-DB1\templates\Parts\info\_tools.html.twig:32 + Part-DB1\templates\Parts\info\_tools.html.twig:30 + + + part.delete.message + Le composant et toutes les informations associées (stocks, fichiers joints, etc.) sont supprimés. Cela ne pourra pas être annulé. + + + + + Part-DB1\templates\Parts\info\_tools.html.twig:39 + Part-DB1\templates\Parts\info\_tools.html.twig:37 + + + part.delete + Supprimer le composant + + + + + Part-DB1\templates\Parts\lists\all_list.html.twig:4 + Part-DB1\templates\Parts\lists\all_list.html.twig:4 + + + parts_list.all.title + Tous les composants + + + + + Part-DB1\templates\Parts\lists\category_list.html.twig:4 + Part-DB1\templates\Parts\lists\category_list.html.twig:4 + + + parts_list.category.title + Composants avec catégorie + + + + + Part-DB1\templates\Parts\lists\footprint_list.html.twig:4 + Part-DB1\templates\Parts\lists\footprint_list.html.twig:4 + + + parts_list.footprint.title + Composants avec empreinte + + + + + Part-DB1\templates\Parts\lists\manufacturer_list.html.twig:4 + Part-DB1\templates\Parts\lists\manufacturer_list.html.twig:4 + + + parts_list.manufacturer.title + Composants avec fabricant + + + + + Part-DB1\templates\Parts\lists\search_list.html.twig:4 + Part-DB1\templates\Parts\lists\search_list.html.twig:4 + + + parts_list.search.title + Recherche de composants + + + + + Part-DB1\templates\Parts\lists\store_location_list.html.twig:4 + Part-DB1\templates\Parts\lists\store_location_list.html.twig:4 + + + parts_list.storelocation.title + Composants avec lieu de stockage + + + + + Part-DB1\templates\Parts\lists\supplier_list.html.twig:4 + Part-DB1\templates\Parts\lists\supplier_list.html.twig:4 + + + parts_list.supplier.title + Composants avec fournisseur + + + + + Part-DB1\templates\Parts\lists\tags_list.html.twig:4 + Part-DB1\templates\Parts\lists\tags_list.html.twig:4 + + + parts_list.tags.title + Composants avec tag + + + + + Part-DB1\templates\Parts\lists\_info_card.html.twig:22 + Part-DB1\templates\Parts\lists\_info_card.html.twig:17 + + + entity.info.common.tab + Général + + + + + Part-DB1\templates\Parts\lists\_info_card.html.twig:26 + Part-DB1\templates\Parts\lists\_info_card.html.twig:20 + + + entity.info.statistics.tab + Statistiques + + + + + Part-DB1\templates\Parts\lists\_info_card.html.twig:31 + + + entity.info.attachments.tab + Pièces jointes + + + + + Part-DB1\templates\Parts\lists\_info_card.html.twig:37 + + + entity.info.parameters.tab + Caractéristiques + + + + + Part-DB1\templates\Parts\lists\_info_card.html.twig:54 + Part-DB1\templates\Parts\lists\_info_card.html.twig:30 + + + entity.info.name + Nom + + + + + Part-DB1\templates\Parts\lists\_info_card.html.twig:58 + Part-DB1\templates\Parts\lists\_info_card.html.twig:96 + Part-DB1\templates\Parts\lists\_info_card.html.twig:34 + Part-DB1\templates\Parts\lists\_info_card.html.twig:67 + + + entity.info.parent + Parent + + + + + Part-DB1\templates\Parts\lists\_info_card.html.twig:70 + Part-DB1\templates\Parts\lists\_info_card.html.twig:46 + + + entity.edit.btn + Éditer + + + + + Part-DB1\templates\Parts\lists\_info_card.html.twig:92 + Part-DB1\templates\Parts\lists\_info_card.html.twig:63 + + + entity.info.children_count + Nombre de sous-éléments + + + + + Part-DB1\templates\security\2fa_base_form.html.twig:3 + Part-DB1\templates\security\2fa_base_form.html.twig:5 + Part-DB1\templates\security\2fa_base_form.html.twig:3 + Part-DB1\templates\security\2fa_base_form.html.twig:5 + + + tfa.check.title + Authentification à deux facteurs requise + + + + + Part-DB1\templates\security\2fa_base_form.html.twig:39 + Part-DB1\templates\security\2fa_base_form.html.twig:39 + + + tfa.code.trusted_pc + Il s'agit d'un ordinateur de confiance (si cette fonction est activée, aucune autre requête à deux facteurs n'est effectuée sur cet ordinateur) + + + + + Part-DB1\templates\security\2fa_base_form.html.twig:52 + Part-DB1\templates\security\login.html.twig:58 + Part-DB1\templates\security\2fa_base_form.html.twig:52 + Part-DB1\templates\security\login.html.twig:58 + + + login.btn + Connexion + + + + + Part-DB1\templates\security\2fa_base_form.html.twig:53 + Part-DB1\templates\security\U2F\u2f_login.html.twig:13 + Part-DB1\templates\_navbar.html.twig:42 + Part-DB1\templates\security\2fa_base_form.html.twig:53 + Part-DB1\templates\security\U2F\u2f_login.html.twig:13 + Part-DB1\templates\_navbar.html.twig:40 + + + user.logout + Déconnexion + + + + + Part-DB1\templates\security\2fa_form.html.twig:6 + Part-DB1\templates\security\2fa_form.html.twig:6 + + + tfa.check.code.label + Code d'application de l'authentificateur + + + + + Part-DB1\templates\security\2fa_form.html.twig:10 + Part-DB1\templates\security\2fa_form.html.twig:10 + + + tfa.check.code.help + Entrez le code à 6 chiffres de votre application d'authentification ou l'un de vos codes de secours si l'authentificateur n'est pas disponible. + + + + + Part-DB1\templates\security\login.html.twig:3 + Part-DB1\templates\security\login.html.twig:3 + templates\security\login.html.twig:3 + + + login.title + Connexion + + + + + Part-DB1\templates\security\login.html.twig:7 + Part-DB1\templates\security\login.html.twig:7 + templates\security\login.html.twig:7 + + + login.card_title + Connexion + + + + + Part-DB1\templates\security\login.html.twig:31 + Part-DB1\templates\security\login.html.twig:31 + templates\security\login.html.twig:31 + + + login.username.label + Nom d'utilisateur + + + + + Part-DB1\templates\security\login.html.twig:34 + Part-DB1\templates\security\login.html.twig:34 + templates\security\login.html.twig:34 + + + login.username.placeholder + Nom d'utilisateur + + + + + Part-DB1\templates\security\login.html.twig:38 + Part-DB1\templates\security\login.html.twig:38 + templates\security\login.html.twig:38 + + + login.password.label + Mot de passe + + + + + Part-DB1\templates\security\login.html.twig:40 + Part-DB1\templates\security\login.html.twig:40 + templates\security\login.html.twig:40 + + + login.password.placeholder + Mot de passe + + + + + Part-DB1\templates\security\login.html.twig:50 + Part-DB1\templates\security\login.html.twig:50 + templates\security\login.html.twig:50 + + + login.rememberme + Rester connecté (non recommandé sur les ordinateurs publics) + + + + + Part-DB1\templates\security\login.html.twig:64 + Part-DB1\templates\security\login.html.twig:64 + + + pw_reset.password_forget + Nom d'utilisateur/mot de passe oublié ? + + + + + Part-DB1\templates\security\pw_reset_new_pw.html.twig:5 + Part-DB1\templates\security\pw_reset_new_pw.html.twig:5 + + + pw_reset.new_pw.header.title + Définir un nouveau mot de passe + + + + + Part-DB1\templates\security\pw_reset_request.html.twig:5 + Part-DB1\templates\security\pw_reset_request.html.twig:5 + + + pw_reset.request.header.title + Demander un nouveau mot de passe + + + + + Part-DB1\templates\security\U2F\u2f_login.html.twig:7 + Part-DB1\templates\security\U2F\u2f_register.html.twig:10 + Part-DB1\templates\security\U2F\u2f_login.html.twig:7 + Part-DB1\templates\security\U2F\u2f_register.html.twig:10 + + + tfa_u2f.http_warning + Vous accédez à cette page en utilisant la méthode HTTP non sécurisée, donc U2F ne fonctionnera probablement pas (message d'erreur "Bad Request"). Demandez à un administrateur de mettre en place la méthode HTTPS sécurisée si vous souhaitez utiliser des clés de sécurité. + + + + + Part-DB1\templates\security\U2F\u2f_login.html.twig:10 + Part-DB1\templates\security\U2F\u2f_register.html.twig:22 + Part-DB1\templates\security\U2F\u2f_login.html.twig:10 + Part-DB1\templates\security\U2F\u2f_register.html.twig:22 + + + r_u2f_two_factor.pressbutton + Veuillez insérer la clé de sécurité et appuyer sur le bouton ! + + + + + Part-DB1\templates\security\U2F\u2f_register.html.twig:3 + Part-DB1\templates\security\U2F\u2f_register.html.twig:3 + + + tfa_u2f.add_key.title + Ajouter une clé de sécurité + + + + + Part-DB1\templates\security\U2F\u2f_register.html.twig:6 + Part-DB1\templates\Users\_2fa_settings.html.twig:111 + Part-DB1\templates\security\U2F\u2f_register.html.twig:6 + Part-DB1\templates\Users\_2fa_settings.html.twig:111 + + + tfa_u2f.explanation + À l'aide d'une clé de sécurité compatible U2F/FIDO (par exemple YubiKey ou NitroKey), une authentification à deux facteurs sûre et pratique peut être obtenue. Les clés de sécurité peuvent être enregistrées ici, et si une vérification à deux facteurs est nécessaire, il suffit d'insérer la clé via USB ou de la taper sur le dispositif via NFC. + + + + + Part-DB1\templates\security\U2F\u2f_register.html.twig:7 + Part-DB1\templates\security\U2F\u2f_register.html.twig:7 + + + tfa_u2f.add_key.backup_hint + Pour garantir l'accès même en cas de perte de la clé, il est recommandé d'enregistrer une deuxième clé en guise de sauvegarde et de la conserver dans un endroit sûr ! + + + + + Part-DB1\templates\security\U2F\u2f_register.html.twig:16 + Part-DB1\templates\security\U2F\u2f_register.html.twig:16 + + + r_u2f_two_factor.name + Afficher le nom de la clé (par exemple, sauvegarde) + + + + + Part-DB1\templates\security\U2F\u2f_register.html.twig:19 + Part-DB1\templates\security\U2F\u2f_register.html.twig:19 + + + tfa_u2f.add_key.add_button + Ajouter une clé de sécurité + + + + + Part-DB1\templates\security\U2F\u2f_register.html.twig:27 + Part-DB1\templates\security\U2F\u2f_register.html.twig:27 + + + tfa_u2f.add_key.back_to_settings + Retour aux paramètres + + + + + Part-DB1\templates\Statistics\statistics.html.twig:5 + Part-DB1\templates\Statistics\statistics.html.twig:8 + Part-DB1\templates\Statistics\statistics.html.twig:5 + Part-DB1\templates\Statistics\statistics.html.twig:8 + new + + + statistics.title + Statistiques + + + + + Part-DB1\templates\Statistics\statistics.html.twig:14 + Part-DB1\templates\Statistics\statistics.html.twig:14 + new + + + statistics.parts + Composants + + + + + Part-DB1\templates\Statistics\statistics.html.twig:19 + Part-DB1\templates\Statistics\statistics.html.twig:19 + new + + + statistics.data_structures + Structures des données + + + + + Part-DB1\templates\Statistics\statistics.html.twig:24 + Part-DB1\templates\Statistics\statistics.html.twig:24 + new + + + statistics.attachments + Fichiers joints + + + + + Part-DB1\templates\Statistics\statistics.html.twig:34 + Part-DB1\templates\Statistics\statistics.html.twig:59 + Part-DB1\templates\Statistics\statistics.html.twig:104 + Part-DB1\templates\Statistics\statistics.html.twig:34 + Part-DB1\templates\Statistics\statistics.html.twig:59 + Part-DB1\templates\Statistics\statistics.html.twig:104 + new + + + statistics.property + Propriété + + + + + Part-DB1\templates\Statistics\statistics.html.twig:35 + Part-DB1\templates\Statistics\statistics.html.twig:60 + Part-DB1\templates\Statistics\statistics.html.twig:105 + Part-DB1\templates\Statistics\statistics.html.twig:35 + Part-DB1\templates\Statistics\statistics.html.twig:60 + Part-DB1\templates\Statistics\statistics.html.twig:105 + new + + + statistics.value + Valeur + + + + + Part-DB1\templates\Statistics\statistics.html.twig:40 + Part-DB1\templates\Statistics\statistics.html.twig:40 + new + + + statistics.distinct_parts_count + Nombre de composants distincts + + + + + Part-DB1\templates\Statistics\statistics.html.twig:44 + Part-DB1\templates\Statistics\statistics.html.twig:44 + new + + + statistics.parts_instock_sum + Somme de tout les composants en stock + + + + + Part-DB1\templates\Statistics\statistics.html.twig:48 + Part-DB1\templates\Statistics\statistics.html.twig:48 + new + + + statistics.parts_with_price + Nombre de composants avec information de prix + + + + + Part-DB1\templates\Statistics\statistics.html.twig:65 + Part-DB1\templates\Statistics\statistics.html.twig:65 + new + + + statistics.categories_count + Nombre de catégories + + + + + Part-DB1\templates\Statistics\statistics.html.twig:69 + Part-DB1\templates\Statistics\statistics.html.twig:69 + new + + + statistics.footprints_count + Nombre d'empreintes + + + + + Part-DB1\templates\Statistics\statistics.html.twig:73 + Part-DB1\templates\Statistics\statistics.html.twig:73 + new + + + statistics.manufacturers_count + Nombre de fabricants + + + + + Part-DB1\templates\Statistics\statistics.html.twig:77 + Part-DB1\templates\Statistics\statistics.html.twig:77 + new + + + statistics.storelocations_count + Nombre d'emplacements de stockage + + + + + Part-DB1\templates\Statistics\statistics.html.twig:81 + Part-DB1\templates\Statistics\statistics.html.twig:81 + new + + + statistics.suppliers_count + Nombre de fournisseurs + + + + + Part-DB1\templates\Statistics\statistics.html.twig:85 + Part-DB1\templates\Statistics\statistics.html.twig:85 + new + + + statistics.currencies_count + Nombre de devises + + + + + Part-DB1\templates\Statistics\statistics.html.twig:89 + Part-DB1\templates\Statistics\statistics.html.twig:89 + new + + + statistics.measurement_units_count + Nombre d'unités de mesure + + + + + Part-DB1\templates\Statistics\statistics.html.twig:93 + Part-DB1\templates\Statistics\statistics.html.twig:93 + new + + + statistics.devices_count + Nombre de projets + + + + + Part-DB1\templates\Statistics\statistics.html.twig:110 + Part-DB1\templates\Statistics\statistics.html.twig:110 + new + + + statistics.attachment_types_count + Nombre de types de fichiers joints + + + + + Part-DB1\templates\Statistics\statistics.html.twig:114 + Part-DB1\templates\Statistics\statistics.html.twig:114 + new + + + statistics.all_attachments_count + Total des pièces jointes + + + + + Part-DB1\templates\Statistics\statistics.html.twig:118 + Part-DB1\templates\Statistics\statistics.html.twig:118 + new + + + statistics.user_uploaded_attachments_count + Nombre de fichiers joints envoyées + + + + + Part-DB1\templates\Statistics\statistics.html.twig:122 + Part-DB1\templates\Statistics\statistics.html.twig:122 + new + + + statistics.private_attachments_count + Nombre de fichiers joints privés + + + + + Part-DB1\templates\Statistics\statistics.html.twig:126 + Part-DB1\templates\Statistics\statistics.html.twig:126 + new + + + statistics.external_attachments_count + Nombre de fichiers joints externes + + + + + Part-DB1\templates\Users\backup_codes.html.twig:3 + Part-DB1\templates\Users\backup_codes.html.twig:9 + Part-DB1\templates\Users\backup_codes.html.twig:3 + Part-DB1\templates\Users\backup_codes.html.twig:9 + + + tfa_backup.codes.title + Codes de secours + + + + + Part-DB1\templates\Users\backup_codes.html.twig:12 + Part-DB1\templates\Users\backup_codes.html.twig:12 + + + tfa_backup.codes.explanation + Imprimez ces codes et conservez-les dans un endroit sûr ! + + + + + Part-DB1\templates\Users\backup_codes.html.twig:13 + Part-DB1\templates\Users\backup_codes.html.twig:13 + + + tfa_backup.codes.help + Si vous n'avez plus accès à votre appareil avec l'application d'authentification (smartphone perdu, perte de données, etc.), vous pouvez utiliser un de ces codes pour accéder à votre compte et éventuellement configurer une nouvelle application d'authentification. Chacun de ces codes peut être utilisé une fois, il est recommandé de supprimer les codes utilisés. Toute personne ayant accès à ces codes peut potentiellement accéder à votre compte, alors gardez-les en lieu sûr. + + + + + Part-DB1\templates\Users\backup_codes.html.twig:16 + Part-DB1\templates\Users\backup_codes.html.twig:16 + + + tfa_backup.username + Nom d'utilisateur + + + + + Part-DB1\templates\Users\backup_codes.html.twig:29 + Part-DB1\templates\Users\backup_codes.html.twig:29 + + + tfa_backup.codes.page_generated_on + Page générée le %date% + + + + + Part-DB1\templates\Users\backup_codes.html.twig:32 + Part-DB1\templates\Users\backup_codes.html.twig:32 + + + tfa_backup.codes.print + Imprimer + + + + + Part-DB1\templates\Users\backup_codes.html.twig:35 + Part-DB1\templates\Users\backup_codes.html.twig:35 + + + tfa_backup.codes.copy_clipboard + Copier dans le presse-papier + + + + + Part-DB1\templates\Users\user_info.html.twig:3 + Part-DB1\templates\Users\user_info.html.twig:6 + Part-DB1\templates\_navbar.html.twig:40 + Part-DB1\templates\Users\user_info.html.twig:3 + Part-DB1\templates\Users\user_info.html.twig:6 + Part-DB1\templates\_navbar.html.twig:38 + templates\base.html.twig:99 + templates\Users\user_info.html.twig:3 + templates\Users\user_info.html.twig:6 + + + user.info.label + Informations sur l'utilisateur + + + + + Part-DB1\templates\Users\user_info.html.twig:18 + Part-DB1\src\Form\UserSettingsType.php:77 + Part-DB1\templates\Users\user_info.html.twig:18 + Part-DB1\src\Form\UserSettingsType.php:77 + templates\Users\user_info.html.twig:18 + src\Form\UserSettingsType.php:32 + + + user.firstName.label + Prénom + + + + + Part-DB1\templates\Users\user_info.html.twig:24 + Part-DB1\src\Form\UserSettingsType.php:82 + Part-DB1\templates\Users\user_info.html.twig:24 + Part-DB1\src\Form\UserSettingsType.php:82 + templates\Users\user_info.html.twig:24 + src\Form\UserSettingsType.php:35 + + + user.lastName.label + Nom + + + + + Part-DB1\templates\Users\user_info.html.twig:30 + Part-DB1\src\Form\UserSettingsType.php:92 + Part-DB1\templates\Users\user_info.html.twig:30 + Part-DB1\src\Form\UserSettingsType.php:92 + templates\Users\user_info.html.twig:30 + src\Form\UserSettingsType.php:41 + + + user.email.label + Email + + + + + Part-DB1\templates\Users\user_info.html.twig:37 + Part-DB1\src\Form\UserSettingsType.php:87 + Part-DB1\templates\Users\user_info.html.twig:37 + Part-DB1\src\Form\UserSettingsType.php:87 + templates\Users\user_info.html.twig:37 + src\Form\UserSettingsType.php:38 + + + user.department.label + Département + + + + + Part-DB1\templates\Users\user_info.html.twig:47 + Part-DB1\src\Form\UserSettingsType.php:73 + Part-DB1\templates\Users\user_info.html.twig:47 + Part-DB1\src\Form\UserSettingsType.php:73 + templates\Users\user_info.html.twig:47 + src\Form\UserSettingsType.php:30 + + + user.username.label + Nom d'utilisateur + + + + + Part-DB1\templates\Users\user_info.html.twig:53 + Part-DB1\src\Services\ElementTypeNameGenerator.php:93 + Part-DB1\templates\Users\user_info.html.twig:53 + Part-DB1\src\Services\ElementTypeNameGenerator.php:93 + templates\Users\user_info.html.twig:53 + + + group.label + Groupe + + + + + Part-DB1\templates\Users\user_info.html.twig:67 + Part-DB1\templates\Users\user_info.html.twig:67 + + + user.permissions + Autorisations + + + + + Part-DB1\templates\Users\user_settings.html.twig:3 + Part-DB1\templates\Users\user_settings.html.twig:6 + Part-DB1\templates\_navbar.html.twig:39 + Part-DB1\templates\Users\user_settings.html.twig:3 + Part-DB1\templates\Users\user_settings.html.twig:6 + Part-DB1\templates\_navbar.html.twig:37 + templates\base.html.twig:98 + templates\Users\user_settings.html.twig:3 + templates\Users\user_settings.html.twig:6 + + + user.settings.label + Paramètres utilisateur + + + + + Part-DB1\templates\Users\user_settings.html.twig:18 + Part-DB1\templates\Users\user_settings.html.twig:18 + templates\Users\user_settings.html.twig:14 + + + user_settings.data.label + Données personnelles + + + + + Part-DB1\templates\Users\user_settings.html.twig:22 + Part-DB1\templates\Users\user_settings.html.twig:22 + templates\Users\user_settings.html.twig:18 + + + user_settings.configuration.label + Configuration + + + + + Part-DB1\templates\Users\user_settings.html.twig:55 + Part-DB1\templates\Users\user_settings.html.twig:55 + templates\Users\user_settings.html.twig:48 + + + user.settings.change_pw + Changer de mot de passe + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:6 + Part-DB1\templates\Users\_2fa_settings.html.twig:6 + + + user.settings.2fa_settings + Authentification à deux facteurs + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:13 + Part-DB1\templates\Users\_2fa_settings.html.twig:13 + + + tfa.settings.google.tab + Application d'authentification + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:17 + Part-DB1\templates\Users\_2fa_settings.html.twig:17 + + + tfa.settings.bakup.tab + Codes de secours + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:21 + Part-DB1\templates\Users\_2fa_settings.html.twig:21 + + + tfa.settings.u2f.tab + Clés de sécurité (U2F) + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:25 + Part-DB1\templates\Users\_2fa_settings.html.twig:25 + + + tfa.settings.trustedDevices.tab + Appareils de confiance + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:33 + Part-DB1\templates\Users\_2fa_settings.html.twig:33 + + + tfa_google.disable.confirm_title + Voulez-vous vraiment désactiver l'application d'authentification ? + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:33 + Part-DB1\templates\Users\_2fa_settings.html.twig:33 + + + tfa_google.disable.confirm_message + Si vous désactivez l'application d'authentification, tous les codes de sauvegarde seront supprimés, vous devrez donc peut-être les réimprimer.<br> +Notez également que sans authentification à deux facteurs, votre compte n'est pas aussi bien protégé ! + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:39 + Part-DB1\templates\Users\_2fa_settings.html.twig:39 + + + tfa_google.disabled_message + Application d'authentification désactivée + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:48 + Part-DB1\templates\Users\_2fa_settings.html.twig:48 + + + tfa_google.step.download + Télécharger une application d'authentification (par exemple <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=com.google.android.apps.authenticator2">Authentificateur Google</a> ou <a class="link-external" target="_blank" href="https://play.google.com/store/apps/details?id=org.fedorahosted.freeotp">Authentificateur FreeOTP</a>) + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:49 + Part-DB1\templates\Users\_2fa_settings.html.twig:49 + + + tfa_google.step.scan + Scannez le QR code adjacent avec l'application ou saisissez les données manuellement + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:50 + Part-DB1\templates\Users\_2fa_settings.html.twig:50 + + + tfa_google.step.input_code + Entrez le code généré dans le champ ci-dessous et confirmez + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:51 + Part-DB1\templates\Users\_2fa_settings.html.twig:51 + + + tfa_google.step.download_backup + Imprimez vos codes de secours et conservez-les dans un endroit sûr + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:58 + Part-DB1\templates\Users\_2fa_settings.html.twig:58 + + + tfa_google.manual_setup + Configuration manuelle + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:62 + Part-DB1\templates\Users\_2fa_settings.html.twig:62 + + + tfa_google.manual_setup.type + Type + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:63 + Part-DB1\templates\Users\_2fa_settings.html.twig:63 + + + tfa_google.manual_setup.username + Nom d'utilisateur + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:64 + Part-DB1\templates\Users\_2fa_settings.html.twig:64 + + + tfa_google.manual_setup.secret + Secret + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:65 + Part-DB1\templates\Users\_2fa_settings.html.twig:65 + + + tfa_google.manual_setup.digit_count + Nombre de caractères + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:74 + Part-DB1\templates\Users\_2fa_settings.html.twig:74 + + + tfa_google.enabled_message + Application d'authentification activée + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:83 + Part-DB1\templates\Users\_2fa_settings.html.twig:83 + + + tfa_backup.disabled + Codes de secours désactivés. Configurez l'application d'authentification pour activer les codes de secours. + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:84 + Part-DB1\templates\Users\_2fa_settings.html.twig:92 + Part-DB1\templates\Users\_2fa_settings.html.twig:84 + Part-DB1\templates\Users\_2fa_settings.html.twig:92 + + + tfa_backup.explanation + Grâce à ces codes de secours, vous pouvez accéder à votre compte même si vous perdez l'appareil avec l'application d'authentification. Imprimez les codes et conservez-les dans un endroit sûr. + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:88 + Part-DB1\templates\Users\_2fa_settings.html.twig:88 + + + tfa_backup.reset_codes.confirm_title + Etes vous sûr de vouloir réinitialiser les codes ? + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:88 + Part-DB1\templates\Users\_2fa_settings.html.twig:88 + + + tfa_backup.reset_codes.confirm_message + Cela permettra de supprimer tous les codes précédents et de générer un ensemble de nouveaux codes. Cela ne peut pas être annulé. N'oubliez pas d'imprimer les nouveaux codes et de les conserver dans un endroit sûr ! + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:91 + Part-DB1\templates\Users\_2fa_settings.html.twig:91 + + + tfa_backup.enabled + Codes de secours activés + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:99 + Part-DB1\templates\Users\_2fa_settings.html.twig:99 + + + tfa_backup.show_codes + Afficher les codes de secours + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:114 + Part-DB1\templates\Users\_2fa_settings.html.twig:114 + + + tfa_u2f.table_caption + Clés de sécurité enregistrées + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:115 + Part-DB1\templates\Users\_2fa_settings.html.twig:115 + + + tfa_u2f.delete_u2f.confirm_title + Etes vous sûr de vouloir supprimer cette clé de sécurité ? + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:116 + Part-DB1\templates\Users\_2fa_settings.html.twig:116 + + + tfa_u2f.delete_u2f.confirm_message + Si vous supprimez cette clé, il ne sera plus possible de se connecter avec cette clé. S'il ne reste aucune clé de sécurité, l'authentification à deux facteurs sera désactivée. + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:123 + Part-DB1\templates\Users\_2fa_settings.html.twig:123 + + + tfa_u2f.keys.name + Nom de la clé + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:124 + Part-DB1\templates\Users\_2fa_settings.html.twig:124 + + + tfa_u2f.keys.added_date + Date d'enregistrement + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:134 + Part-DB1\templates\Users\_2fa_settings.html.twig:134 + + + tfa_u2f.key_delete + Supprimer la clé + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:141 + Part-DB1\templates\Users\_2fa_settings.html.twig:141 + + + tfa_u2f.no_keys_registered + Aucune clé de sécurité enregistrée + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:144 + Part-DB1\templates\Users\_2fa_settings.html.twig:144 + + + tfa_u2f.add_new_key + Enregistrer une nouvelle clé de sécurité + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:148 + Part-DB1\templates\Users\_2fa_settings.html.twig:148 + + + tfa_trustedDevices.explanation + Lors de la vérification du deuxième facteur, l'ordinateur actuel peut être marqué comme étant digne de confiance, de sorte qu'il n'est plus nécessaire de procéder à des vérifications à deux facteurs sur cet ordinateur. +Si vous avez fait cela de manière incorrecte ou si un ordinateur n'est plus fiable, vous pouvez réinitialiser le statut de <i>tous</i> les ordinateurs ici. + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:149 + Part-DB1\templates\Users\_2fa_settings.html.twig:149 + + + tfa_trustedDevices.invalidate.confirm_title + Etes vous sûr de vouloir supprimer tous les ordinateurs de confiance ? + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:150 + Part-DB1\templates\Users\_2fa_settings.html.twig:150 + + + tfa_trustedDevices.invalidate.confirm_message + Vous devrez à nouveau procéder à une authentification à deux facteurs sur tous les ordinateurs. Assurez-vous d'avoir votre appareil à deux facteurs à portée de main. + + + + + Part-DB1\templates\Users\_2fa_settings.html.twig:154 + Part-DB1\templates\Users\_2fa_settings.html.twig:154 + + + tfa_trustedDevices.invalidate.btn + Supprimer tous les dispositifs de confiance + + + + + Part-DB1\templates\_navbar.html.twig:4 + Part-DB1\templates\_navbar.html.twig:4 + templates\base.html.twig:29 + + + sidebar.toggle + Activer/désactiver la barre latérale + + + + + Part-DB1\templates\_navbar.html.twig:22 + + + navbar.scanner.link + Scanner + + + + + Part-DB1\templates\_navbar.html.twig:38 + Part-DB1\templates\_navbar.html.twig:36 + templates\base.html.twig:97 + + + user.loggedin.label + Connecté en tant que + + + + + Part-DB1\templates\_navbar.html.twig:44 + Part-DB1\templates\_navbar.html.twig:42 + templates\base.html.twig:103 + + + user.login + Connexion + + + + + Part-DB1\templates\_navbar.html.twig:50 + Part-DB1\templates\_navbar.html.twig:48 + + + ui.toggle_darkmode + Darkmode + + + + + Part-DB1\templates\_navbar.html.twig:54 + Part-DB1\src\Form\UserSettingsType.php:97 + Part-DB1\templates\_navbar.html.twig:52 + Part-DB1\src\Form\UserSettingsType.php:97 + templates\base.html.twig:106 + src\Form\UserSettingsType.php:44 + + + user.language_select + Langue + + + + + Part-DB1\templates\_navbar_search.html.twig:4 + Part-DB1\templates\_navbar_search.html.twig:4 + templates\base.html.twig:49 + + + search.options.label + Options de recherche + + + + + Part-DB1\templates\_navbar_search.html.twig:23 + + + tags.label + Tags + + + + + Part-DB1\templates\_navbar_search.html.twig:27 + Part-DB1\src\Form\LabelOptionsType.php:68 + Part-DB1\src\Services\ElementTypeNameGenerator.php:88 + Part-DB1\src\Services\ElementTypeNameGenerator.php:88 + templates\base.html.twig:60 + templates\Parts\show_part_info.html.twig:36 + src\Form\PartType.php:77 + + + storelocation.label + Emplacement de stockage + + + + + Part-DB1\templates\_navbar_search.html.twig:36 + Part-DB1\templates\_navbar_search.html.twig:31 + templates\base.html.twig:65 + + + ordernumber.label.short + Codecmd. + + + + + Part-DB1\templates\_navbar_search.html.twig:40 + Part-DB1\src\Services\ElementTypeNameGenerator.php:89 + Part-DB1\templates\_navbar_search.html.twig:35 + Part-DB1\src\Services\ElementTypeNameGenerator.php:89 + templates\base.html.twig:67 + + + supplier.label + Fournisseur + + + + + Part-DB1\templates\_navbar_search.html.twig:57 + Part-DB1\templates\_navbar_search.html.twig:52 + templates\base.html.twig:75 + + + search.deactivateBarcode + Désa. Code barres + + + + + Part-DB1\templates\_navbar_search.html.twig:61 + Part-DB1\templates\_navbar_search.html.twig:56 + templates\base.html.twig:77 + + + search.regexmatching + Reg.Ex. Correspondance + + + + + Part-DB1\templates\_navbar_search.html.twig:68 + Part-DB1\templates\_navbar_search.html.twig:62 + + + search.submit + Rechercher! + + + + + Part-DB1\templates\_sidebar.html.twig:2 + Part-DB1\templates\_sidebar.html.twig:2 + templates\base.html.twig:165 + templates\base.html.twig:192 + templates\base.html.twig:220 + + + actions + Actions + + + + + Part-DB1\templates\_sidebar.html.twig:6 + Part-DB1\templates\_sidebar.html.twig:6 + templates\base.html.twig:169 + templates\base.html.twig:196 + templates\base.html.twig:224 + + + datasource + Source de données + + + + + Part-DB1\templates\_sidebar.html.twig:10 + Part-DB1\templates\_sidebar.html.twig:10 + templates\base.html.twig:173 + templates\base.html.twig:200 + templates\base.html.twig:228 + + + manufacturer.labelp + Fabricants + + + + + Part-DB1\templates\_sidebar.html.twig:11 + Part-DB1\templates\_sidebar.html.twig:11 + templates\base.html.twig:174 + templates\base.html.twig:201 + templates\base.html.twig:229 + + + supplier.labelp + Fournisseurs + + + + + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:213 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:293 + Part-DB1\src\Controller\PartController.php:173 + Part-DB1\src\Controller\PartController.php:293 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:181 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:243 + Part-DB1\src\Controller\PartController.php:173 + Part-DB1\src\Controller\PartController.php:268 + + + attachment.download_failed + Le téléchargement du fichier joint a échoué ! + + + + + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:222 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:190 + + + entity.edit_flash + Changements sauvegardés avec succès. + + + + + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:231 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:196 + + + entity.edit_flash.invalid + Les changements n'ont pas pu être sauvegardés ! Veuillez vérifier vos données ! + + + + + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:302 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:252 + + + entity.created_flash + Élément créé avec succès ! + + + + + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:308 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:258 + + + entity.created_flash.invalid + L'élément n'a pas pu être créé ! Vérifiez vos données ! + + + + + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:399 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:352 + src\Controller\BaseAdminController.php:154 + + + attachment_type.deleted + Élément supprimé ! + + + + + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:401 + Part-DB1\src\Controller\UserController.php:109 + Part-DB1\src\Controller\UserSettingsController.php:159 + Part-DB1\src\Controller\UserSettingsController.php:193 + Part-DB1\src\Controller\AdminPages\BaseAdminController.php:354 + Part-DB1\src\Controller\UserController.php:101 + Part-DB1\src\Controller\UserSettingsController.php:150 + Part-DB1\src\Controller\UserSettingsController.php:182 + + + csfr_invalid + Le jeton RFTS n'est pas valable ! Rechargez cette page ou contactez un administrateur si le problème persiste ! + + + + + Part-DB1\src\Controller\LabelController.php:125 + + + label_generator.no_entities_found + Aucune entité correspondant à la gamme trouvée. + + + + + Part-DB1\src\Controller\LogController.php:149 + Part-DB1\src\Controller\LogController.php:154 + new + + + log.undo.target_not_found + L'élément ciblé n'a pas pu être trouvé dans la base de données ! + + + + + Part-DB1\src\Controller\LogController.php:156 + Part-DB1\src\Controller\LogController.php:160 + new + + + log.undo.revert_success + Rétablissement réussi. + + + + + Part-DB1\src\Controller\LogController.php:176 + Part-DB1\src\Controller\LogController.php:180 + new + + + log.undo.element_undelete_success + Élément restauré avec succès. + + + + + Part-DB1\src\Controller\LogController.php:178 + Part-DB1\src\Controller\LogController.php:182 + new + + + log.undo.element_element_already_undeleted + L'élément a déjà été restauré ! + + + + + Part-DB1\src\Controller\LogController.php:185 + Part-DB1\src\Controller\LogController.php:189 + new + + + log.undo.element_delete_success + L'élément a été supprimé avec succès. + + + + + Part-DB1\src\Controller\LogController.php:187 + Part-DB1\src\Controller\LogController.php:191 + new + + + log.undo.element.element_already_delted + L'élément a déjà été supprimé ! + + + + + Part-DB1\src\Controller\LogController.php:194 + Part-DB1\src\Controller\LogController.php:198 + new + + + log.undo.element_change_undone + Annulation de la modification de l'élément + + + + + Part-DB1\src\Controller\LogController.php:196 + Part-DB1\src\Controller\LogController.php:200 + new + + + log.undo.do_undelete_before + Vous devez supprimer l'élément avant de pouvoir annuler ce changement ! + + + + + Part-DB1\src\Controller\LogController.php:199 + Part-DB1\src\Controller\LogController.php:203 + new + + + log.undo.log_type_invalid + Cette entrée de journal ne peut pas être annulée ! + + + + + Part-DB1\src\Controller\PartController.php:182 + Part-DB1\src\Controller\PartController.php:182 + src\Controller\PartController.php:80 + + + part.edited_flash + Changements sauvegardés ! + + + + + Part-DB1\src\Controller\PartController.php:186 + Part-DB1\src\Controller\PartController.php:186 + + + part.edited_flash.invalid + Erreur lors de l'enregistrement : Vérifiez vos données ! + + + + + Part-DB1\src\Controller\PartController.php:216 + Part-DB1\src\Controller\PartController.php:219 + + + part.deleted + Composant supprimé avec succès. + + + + + Part-DB1\src\Controller\PartController.php:302 + Part-DB1\src\Controller\PartController.php:277 + Part-DB1\src\Controller\PartController.php:317 + src\Controller\PartController.php:113 + src\Controller\PartController.php:142 + + + part.created_flash + Composants créés avec succès ! + + + + + Part-DB1\src\Controller\PartController.php:308 + Part-DB1\src\Controller\PartController.php:283 + + + part.created_flash.invalid + Erreur lors de la création : Vérifiez vos données ! + + + + + Part-DB1\src\Controller\ScanController.php:68 + Part-DB1\src\Controller\ScanController.php:90 + + + scan.qr_not_found + Aucun élément trouvé pour le code-barres donné. + + + + + Part-DB1\src\Controller\ScanController.php:71 + + + scan.format_unknown + Format inconnu ! + + + + + Part-DB1\src\Controller\ScanController.php:86 + + + scan.qr_success + Élément trouvé. + + + + + Part-DB1\src\Controller\SecurityController.php:114 + Part-DB1\src\Controller\SecurityController.php:109 + + + pw_reset.user_or_email + Nom d'utilisateur / Email + + + + + Part-DB1\src\Controller\SecurityController.php:131 + Part-DB1\src\Controller\SecurityController.php:126 + + + pw_reset.request.success + Demande de mot de passe réussie ! Consultez vos e-mails pour plus d'informations. + + + + + Part-DB1\src\Controller\SecurityController.php:162 + Part-DB1\src\Controller\SecurityController.php:160 + + + pw_reset.username + Nom d'utilisateur + + + + + Part-DB1\src\Controller\SecurityController.php:165 + Part-DB1\src\Controller\SecurityController.php:163 + + + pw_reset.token + Jeton + + + + + Part-DB1\src\Controller\SecurityController.php:194 + Part-DB1\src\Controller\SecurityController.php:192 + + + pw_reset.new_pw.error + Nom d'utilisateur ou jeton invalide ! Veuillez vérifier vos données. + + + + + Part-DB1\src\Controller\SecurityController.php:196 + Part-DB1\src\Controller\SecurityController.php:194 + + + pw_reset.new_pw.success + Le mot de passe a été réinitialisé avec succès. Vous pouvez maintenant vous connecter avec le nouveau mot de passe. + + + + + Part-DB1\src\Controller\UserController.php:107 + Part-DB1\src\Controller\UserController.php:99 + + + user.edit.reset_success + Toutes les méthodes d'authentification à deux facteurs ont été désactivées avec succès. + + + + + Part-DB1\src\Controller\UserSettingsController.php:101 + Part-DB1\src\Controller\UserSettingsController.php:92 + + + tfa_backup.no_codes_enabled + Aucun code de secours n'est activé ! + + + + + Part-DB1\src\Controller\UserSettingsController.php:138 + Part-DB1\src\Controller\UserSettingsController.php:132 + + + tfa_u2f.u2f_delete.not_existing + Il n'y a pas de clé de sécurité avec cet ID ! + + + + + Part-DB1\src\Controller\UserSettingsController.php:145 + Part-DB1\src\Controller\UserSettingsController.php:139 + + + tfa_u2f.u2f_delete.access_denied + Vous ne pouvez pas supprimer les clés de sécurité des autres utilisateurs ! + + + + + Part-DB1\src\Controller\UserSettingsController.php:153 + Part-DB1\src\Controller\UserSettingsController.php:147 + + + tfa.u2f.u2f_delete.success + Clé de sécurité retirée avec succès. + + + + + Part-DB1\src\Controller\UserSettingsController.php:188 + Part-DB1\src\Controller\UserSettingsController.php:180 + + + tfa_trustedDevice.invalidate.success + Les appareils de confiance ont été réinitialisés avec succès. + + + + + Part-DB1\src\Controller\UserSettingsController.php:235 + Part-DB1\src\Controller\UserSettingsController.php:226 + src\Controller\UserController.php:98 + + + user.settings.saved_flash + Paramètres sauvegardés ! + + + + + Part-DB1\src\Controller\UserSettingsController.php:297 + Part-DB1\src\Controller\UserSettingsController.php:288 + src\Controller\UserController.php:130 + + + user.settings.pw_changed_flash + Mot de passe changé ! + + + + + Part-DB1\src\Controller\UserSettingsController.php:317 + Part-DB1\src\Controller\UserSettingsController.php:306 + + + user.settings.2fa.google.activated + L'application d'authentification a été activée avec succès. + + + + + Part-DB1\src\Controller\UserSettingsController.php:328 + Part-DB1\src\Controller\UserSettingsController.php:315 + + + user.settings.2fa.google.disabled + L'application d'authentification a été désactivée avec succès. + + + + + Part-DB1\src\Controller\UserSettingsController.php:346 + Part-DB1\src\Controller\UserSettingsController.php:332 + + + user.settings.2fa.backup_codes.regenerated + De nouveaux codes de secours ont été générés avec succès. + + + + + Part-DB1\src\DataTables\AttachmentDataTable.php:148 + Part-DB1\src\DataTables\AttachmentDataTable.php:148 + + + attachment.table.filename + Nom du fichier + + + + + Part-DB1\src\DataTables\AttachmentDataTable.php:153 + Part-DB1\src\DataTables\AttachmentDataTable.php:153 + + + attachment.table.filesize + Taille du fichier + + + + + Part-DB1\src\DataTables\AttachmentDataTable.php:183 + Part-DB1\src\DataTables\AttachmentDataTable.php:191 + Part-DB1\src\DataTables\AttachmentDataTable.php:200 + Part-DB1\src\DataTables\AttachmentDataTable.php:209 + Part-DB1\src\DataTables\PartsDataTable.php:245 + Part-DB1\src\DataTables\PartsDataTable.php:252 + Part-DB1\src\DataTables\AttachmentDataTable.php:183 + Part-DB1\src\DataTables\AttachmentDataTable.php:191 + Part-DB1\src\DataTables\AttachmentDataTable.php:200 + Part-DB1\src\DataTables\AttachmentDataTable.php:209 + Part-DB1\src\DataTables\PartsDataTable.php:193 + Part-DB1\src\DataTables\PartsDataTable.php:200 + + + true + Vrai + + + + + Part-DB1\src\DataTables\AttachmentDataTable.php:184 + Part-DB1\src\DataTables\AttachmentDataTable.php:192 + Part-DB1\src\DataTables\AttachmentDataTable.php:201 + Part-DB1\src\DataTables\AttachmentDataTable.php:210 + Part-DB1\src\DataTables\PartsDataTable.php:246 + Part-DB1\src\DataTables\PartsDataTable.php:253 + Part-DB1\src\Form\Type\SIUnitType.php:139 + Part-DB1\src\DataTables\AttachmentDataTable.php:184 + Part-DB1\src\DataTables\AttachmentDataTable.php:192 + Part-DB1\src\DataTables\AttachmentDataTable.php:201 + Part-DB1\src\DataTables\AttachmentDataTable.php:210 + Part-DB1\src\DataTables\PartsDataTable.php:194 + Part-DB1\src\DataTables\PartsDataTable.php:201 + Part-DB1\src\Form\Type\SIUnitType.php:139 + + + false + Faux + + + + + Part-DB1\src\DataTables\Column\LogEntryTargetColumn.php:128 + Part-DB1\src\DataTables\Column\LogEntryTargetColumn.php:119 + + + log.target_deleted + Cible supprimée. + + + + + Part-DB1\src\DataTables\Column\RevertLogColumn.php:57 + Part-DB1\src\DataTables\Column\RevertLogColumn.php:60 + new + + + log.undo.undelete + Annuler la suppression + + + + + Part-DB1\src\DataTables\Column\RevertLogColumn.php:63 + Part-DB1\src\DataTables\Column\RevertLogColumn.php:66 + new + + + log.undo.undo + Annuler la modification + + + + + Part-DB1\src\DataTables\Column\RevertLogColumn.php:83 + Part-DB1\src\DataTables\Column\RevertLogColumn.php:86 + new + + + log.undo.revert + Restaurer à cette date + + + + + Part-DB1\src\DataTables\LogDataTable.php:173 + Part-DB1\src\DataTables\LogDataTable.php:161 + + + log.id + ID + + + + + Part-DB1\src\DataTables\LogDataTable.php:178 + Part-DB1\src\DataTables\LogDataTable.php:166 + + + log.timestamp + Horodatage + + + + + Part-DB1\src\DataTables\LogDataTable.php:183 + Part-DB1\src\DataTables\LogDataTable.php:171 + + + log.type + Type + + + + + Part-DB1\src\DataTables\LogDataTable.php:191 + Part-DB1\src\DataTables\LogDataTable.php:179 + + + log.level + Niveau + + + + + Part-DB1\src\DataTables\LogDataTable.php:200 + Part-DB1\src\DataTables\LogDataTable.php:188 + + + log.user + Utilisateur + + + + + Part-DB1\src\DataTables\LogDataTable.php:213 + Part-DB1\src\DataTables\LogDataTable.php:201 + + + log.target_type + Type de cible + + + + + Part-DB1\src\DataTables\LogDataTable.php:226 + Part-DB1\src\DataTables\LogDataTable.php:214 + + + log.target + Cible + + + + + Part-DB1\src\DataTables\LogDataTable.php:231 + Part-DB1\src\DataTables\LogDataTable.php:218 + new + + + log.extra + Extra + + + + + Part-DB1\src\DataTables\PartsDataTable.php:168 + Part-DB1\src\DataTables\PartsDataTable.php:116 + + + part.table.name + Nom + + + + + Part-DB1\src\DataTables\PartsDataTable.php:178 + Part-DB1\src\DataTables\PartsDataTable.php:126 + + + part.table.id + ID + + + + + Part-DB1\src\DataTables\PartsDataTable.php:182 + Part-DB1\src\DataTables\PartsDataTable.php:130 + + + part.table.description + Description + + + + + Part-DB1\src\DataTables\PartsDataTable.php:185 + Part-DB1\src\DataTables\PartsDataTable.php:133 + + + part.table.category + Catégorie + + + + + Part-DB1\src\DataTables\PartsDataTable.php:190 + Part-DB1\src\DataTables\PartsDataTable.php:138 + + + part.table.footprint + Empreinte + + + + + Part-DB1\src\DataTables\PartsDataTable.php:194 + Part-DB1\src\DataTables\PartsDataTable.php:142 + + + part.table.manufacturer + Fabricant + + + + + Part-DB1\src\DataTables\PartsDataTable.php:197 + Part-DB1\src\DataTables\PartsDataTable.php:145 + + + part.table.storeLocations + Emplacement de stockage + + + + + Part-DB1\src\DataTables\PartsDataTable.php:216 + Part-DB1\src\DataTables\PartsDataTable.php:164 + + + part.table.amount + Quantité + + + + + Part-DB1\src\DataTables\PartsDataTable.php:224 + Part-DB1\src\DataTables\PartsDataTable.php:172 + + + part.table.minamount + Quantité min. + + + + + Part-DB1\src\DataTables\PartsDataTable.php:232 + Part-DB1\src\DataTables\PartsDataTable.php:180 + + + part.table.partUnit + Unité de mesure + + + + + Part-DB1\src\DataTables\PartsDataTable.php:236 + Part-DB1\src\DataTables\PartsDataTable.php:184 + + + part.table.addedDate + Créé le + + + + + Part-DB1\src\DataTables\PartsDataTable.php:240 + Part-DB1\src\DataTables\PartsDataTable.php:188 + + + part.table.lastModified + Dernière modification + + + + + Part-DB1\src\DataTables\PartsDataTable.php:244 + Part-DB1\src\DataTables\PartsDataTable.php:192 + + + part.table.needsReview + Révision nécessaire + + + + + Part-DB1\src\DataTables\PartsDataTable.php:251 + Part-DB1\src\DataTables\PartsDataTable.php:199 + + + part.table.favorite + Favoris + + + + + Part-DB1\src\DataTables\PartsDataTable.php:258 + Part-DB1\src\DataTables\PartsDataTable.php:206 + + + part.table.manufacturingStatus + État + + + + + Part-DB1\src\DataTables\PartsDataTable.php:260 + Part-DB1\src\DataTables\PartsDataTable.php:262 + Part-DB1\src\Form\Part\PartBaseType.php:90 + Part-DB1\src\DataTables\PartsDataTable.php:208 + Part-DB1\src\DataTables\PartsDataTable.php:210 + Part-DB1\src\Form\Part\PartBaseType.php:88 + + + m_status.unknown + Inconnu + + + + + Part-DB1\src\DataTables\PartsDataTable.php:263 + Part-DB1\src\Form\Part\PartBaseType.php:90 + Part-DB1\src\DataTables\PartsDataTable.php:211 + Part-DB1\src\Form\Part\PartBaseType.php:88 + + + m_status.announced + Annoncé + + + + + Part-DB1\src\DataTables\PartsDataTable.php:264 + Part-DB1\src\Form\Part\PartBaseType.php:90 + Part-DB1\src\DataTables\PartsDataTable.php:212 + Part-DB1\src\Form\Part\PartBaseType.php:88 + + + m_status.active + Actif + + + + + Part-DB1\src\DataTables\PartsDataTable.php:265 + Part-DB1\src\Form\Part\PartBaseType.php:90 + Part-DB1\src\DataTables\PartsDataTable.php:213 + Part-DB1\src\Form\Part\PartBaseType.php:88 + + + m_status.nrfnd + Non recommandé pour les nouvelles conceptions + + + + + Part-DB1\src\DataTables\PartsDataTable.php:266 + Part-DB1\src\Form\Part\PartBaseType.php:90 + Part-DB1\src\DataTables\PartsDataTable.php:214 + Part-DB1\src\Form\Part\PartBaseType.php:88 + + + m_status.eol + Fin de vie + + + + + Part-DB1\src\DataTables\PartsDataTable.php:267 + Part-DB1\src\Form\Part\PartBaseType.php:90 + Part-DB1\src\DataTables\PartsDataTable.php:215 + Part-DB1\src\Form\Part\PartBaseType.php:88 + + + m_status.discontinued + Arrêtés + + + + + Part-DB1\src\DataTables\PartsDataTable.php:271 + Part-DB1\src\DataTables\PartsDataTable.php:219 + + + part.table.mpn + MPN + + + + + Part-DB1\src\DataTables\PartsDataTable.php:275 + Part-DB1\src\DataTables\PartsDataTable.php:223 + + + part.table.mass + Poids + + + + + Part-DB1\src\DataTables\PartsDataTable.php:279 + Part-DB1\src\DataTables\PartsDataTable.php:227 + + + part.table.tags + Tags + + + + + Part-DB1\src\DataTables\PartsDataTable.php:283 + Part-DB1\src\DataTables\PartsDataTable.php:231 + + + part.table.attachments + Fichiers joints + + + + + Part-DB1\src\EventSubscriber\UserSystem\LoginSuccessSubscriber.php:82 + Part-DB1\src\EventSubscriber\LoginSuccessListener.php:82 + + + flash.login_successful + Connexion réussie. + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:77 + Part-DB1\src\Form\AdminPages\ImportType.php:77 + src\Form\ImportType.php:68 + + + JSON + JSON + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:77 + Part-DB1\src\Form\AdminPages\ImportType.php:77 + src\Form\ImportType.php:68 + + + XML + XML + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:77 + Part-DB1\src\Form\AdminPages\ImportType.php:77 + src\Form\ImportType.php:68 + + + CSV + CSV + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:77 + Part-DB1\src\Form\AdminPages\ImportType.php:77 + src\Form\ImportType.php:68 + + + YAML + YAML + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:124 + Part-DB1\src\Form\AdminPages\ImportType.php:124 + + + import.abort_on_validation.help + Si cette option est activée, l'ensemble du processus est interrompu si des données non valides sont détectées. Si cette option n'est pas active, les entrées non valides sont ignorées et une tentative est faite pour importer les autres entrées. + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:86 + Part-DB1\src\Form\AdminPages\ImportType.php:86 + src\Form\ImportType.php:70 + + + import.csv_separator + Séparateur CSV + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:93 + Part-DB1\src\Form\AdminPages\ImportType.php:93 + src\Form\ImportType.php:72 + + + parent.label + Élément parent + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:101 + Part-DB1\src\Form\AdminPages\ImportType.php:101 + src\Form\ImportType.php:75 + + + import.file + Fichier + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:111 + Part-DB1\src\Form\AdminPages\ImportType.php:111 + src\Form\ImportType.php:78 + + + import.preserve_children + Importer également des sous-éléments + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:120 + Part-DB1\src\Form\AdminPages\ImportType.php:120 + src\Form\ImportType.php:80 + + + import.abort_on_validation + Interrompre sur donnée invalide + + + + + Part-DB1\src\Form\AdminPages\ImportType.php:132 + Part-DB1\src\Form\AdminPages\ImportType.php:132 + src\Form\ImportType.php:85 + + + import.btn + Importer + + + + + Part-DB1\src\Form\AttachmentFormType.php:113 + Part-DB1\src\Form\AttachmentFormType.php:109 + + + attachment.edit.secure_file.help + Un fichier joint marqué comme étant privé ne peut être consulté que par un utilisateur connecté qui a l'autorisation appropriée. Si cette option est activée, aucune miniature n'est générée et l'accès au fichier est plus lent. + + + + + Part-DB1\src\Form\AttachmentFormType.php:127 + Part-DB1\src\Form\AttachmentFormType.php:123 + + + attachment.edit.url.help + Il est possible de saisir ici soit l'URL d'un fichier externe, soit un mot clé pour rechercher les ressources intégrées (par exemple les empreintes). + + + + + Part-DB1\src\Form\AttachmentFormType.php:82 + Part-DB1\src\Form\AttachmentFormType.php:79 + + + attachment.edit.name + Nom + + + + + Part-DB1\src\Form\AttachmentFormType.php:85 + Part-DB1\src\Form\AttachmentFormType.php:82 + + + attachment.edit.attachment_type + Type de fichier joint + + + + + Part-DB1\src\Form\AttachmentFormType.php:94 + Part-DB1\src\Form\AttachmentFormType.php:91 + + + attachment.edit.show_in_table + Voir dans le tableau + + + + + Part-DB1\src\Form\AttachmentFormType.php:105 + Part-DB1\src\Form\AttachmentFormType.php:102 + + + attachment.edit.secure_file + Fichier joint privé + + + + + Part-DB1\src\Form\AttachmentFormType.php:119 + Part-DB1\src\Form\AttachmentFormType.php:115 + + + attachment.edit.url + URL + + + + + Part-DB1\src\Form\AttachmentFormType.php:133 + Part-DB1\src\Form\AttachmentFormType.php:129 + + + attachment.edit.download_url + Télécharger un fichier externe + + + + + Part-DB1\src\Form\AttachmentFormType.php:146 + Part-DB1\src\Form\AttachmentFormType.php:142 + + + attachment.edit.file + Télécharger le fichier + + + + + Part-DB1\src\Form\LabelOptionsType.php:68 + Part-DB1\src\Services\ElementTypeNameGenerator.php:86 + + + part.label + Composant + + + + + Part-DB1\src\Form\LabelOptionsType.php:68 + Part-DB1\src\Services\ElementTypeNameGenerator.php:87 + + + part_lot.label + Lot de composant + + + + + Part-DB1\src\Form\LabelOptionsType.php:78 + + + label_options.barcode_type.none + Aucun + + + + + Part-DB1\src\Form\LabelOptionsType.php:78 + + + label_options.barcode_type.qr + QR Code (recommandé) + + + + + Part-DB1\src\Form\LabelOptionsType.php:78 + + + label_options.barcode_type.code128 + Code 128 (recommandé) + + + + + Part-DB1\src\Form\LabelOptionsType.php:78 + + + label_options.barcode_type.code39 + Code 39 (recommandé) + + + + + Part-DB1\src\Form\LabelOptionsType.php:78 + + + label_options.barcode_type.code93 + Code 93 + + + + + Part-DB1\src\Form\LabelOptionsType.php:78 + + + label_options.barcode_type.datamatrix + Datamatrix + + + + + Part-DB1\src\Form\LabelOptionsType.php:122 + + + label_options.lines_mode.html + Placeholders + + + + + Part-DB1\src\Form\LabelOptionsType.php:122 + + + label.options.lines_mode.twig + Twig + + + + + Part-DB1\src\Form\LabelOptionsType.php:126 + + + label_options.lines_mode.help + Si vous sélectionnez Twig ici, le champ de contenu est interprété comme un modèle Twig. Voir <a href="https://twig.symfony.com/doc/3.x/templates.html">Documentation de Twig</a> et <a href="https://github.com/Part-DB/Part-DB-symfony/wiki/Labels#twig-mode">Wiki</a> pour plus d'informations. + + + + + Part-DB1\src\Form\LabelOptionsType.php:47 + + + label_options.page_size.label + Taille de l'étiquette + + + + + Part-DB1\src\Form\LabelOptionsType.php:66 + + + label_options.supported_elements.label + Type de cible + + + + + Part-DB1\src\Form\LabelOptionsType.php:75 + + + label_options.barcode_type.label + Code barre + + + + + Part-DB1\src\Form\LabelOptionsType.php:102 + + + label_profile.lines.label + Contenu + + + + + Part-DB1\src\Form\LabelOptionsType.php:111 + + + label_options.additional_css.label + Styles supplémentaires (CSS) + + + + + Part-DB1\src\Form\LabelOptionsType.php:120 + + + label_options.lines_mode.label + Parser mode + + + + + Part-DB1\src\Form\LabelOptionsType.php:51 + + + label_options.width.placeholder + Largeur + + + + + Part-DB1\src\Form\LabelOptionsType.php:60 + + + label_options.height.placeholder + Hauteur + + + + + Part-DB1\src\Form\LabelSystem\LabelDialogType.php:49 + + + label_generator.target_id.range_hint + Vous pouvez spécifier ici plusieurs ID (par exemple 1,2,3) et/ou une plage (1-3) pour générer des étiquettes pour plusieurs éléments à la fois. + + + + + Part-DB1\src\Form\LabelSystem\LabelDialogType.php:46 + + + label_generator.target_id.label + ID des cibles + + + + + Part-DB1\src\Form\LabelSystem\LabelDialogType.php:59 + + + label_generator.update + Actualisation + + + + + Part-DB1\src\Form\LabelSystem\ScanDialogType.php:36 + + + scan_dialog.input + Saisie + + + + + Part-DB1\src\Form\LabelSystem\ScanDialogType.php:44 + + + scan_dialog.submit + Soumettre + + + + + Part-DB1\src\Form\ParameterType.php:41 + + + parameters.name.placeholder + ex. Gain de courant DC + + + + + Part-DB1\src\Form\ParameterType.php:50 + + + parameters.symbol.placeholder + ex. h_{FE} + + + + + Part-DB1\src\Form\ParameterType.php:60 + + + parameters.text.placeholder + ex. Test conditions + + + + + Part-DB1\src\Form\ParameterType.php:71 + + + parameters.max.placeholder + ex. 350 + + + + + Part-DB1\src\Form\ParameterType.php:82 + + + parameters.min.placeholder + ex. 100 + + + + + Part-DB1\src\Form\ParameterType.php:93 + + + parameters.typical.placeholder + ex. 200 + + + + + Part-DB1\src\Form\ParameterType.php:103 + + + parameters.unit.placeholder + ex. V + + + + + Part-DB1\src\Form\ParameterType.php:114 + + + parameter.group.placeholder + ex. Spécifications techniques + + + + + Part-DB1\src\Form\Part\OrderdetailType.php:72 + Part-DB1\src\Form\Part\OrderdetailType.php:75 + + + orderdetails.edit.supplierpartnr + Numéro de commande + + + + + Part-DB1\src\Form\Part\OrderdetailType.php:81 + Part-DB1\src\Form\Part\OrderdetailType.php:84 + + + orderdetails.edit.supplier + Fournisseur + + + + + Part-DB1\src\Form\Part\OrderdetailType.php:87 + Part-DB1\src\Form\Part\OrderdetailType.php:90 + + + orderdetails.edit.url + Lien vers l'offre + + + + + Part-DB1\src\Form\Part\OrderdetailType.php:93 + Part-DB1\src\Form\Part\OrderdetailType.php:96 + + + orderdetails.edit.obsolete + Plus disponible + + + + + Part-DB1\src\Form\Part\OrderdetailType.php:75 + Part-DB1\src\Form\Part\OrderdetailType.php:78 + + + orderdetails.edit.supplierpartnr.placeholder + Ex. BC 547C + + + + + Part-DB1\src\Form\Part\PartBaseType.php:101 + Part-DB1\src\Form\Part\PartBaseType.php:99 + + + part.edit.name + Nom + + + + + Part-DB1\src\Form\Part\PartBaseType.php:109 + Part-DB1\src\Form\Part\PartBaseType.php:107 + + + part.edit.description + Description + + + + + Part-DB1\src\Form\Part\PartBaseType.php:120 + Part-DB1\src\Form\Part\PartBaseType.php:118 + + + part.edit.mininstock + Stock minimum + + + + + Part-DB1\src\Form\Part\PartBaseType.php:129 + Part-DB1\src\Form\Part\PartBaseType.php:127 + + + part.edit.category + Catégories + + + + + Part-DB1\src\Form\Part\PartBaseType.php:135 + Part-DB1\src\Form\Part\PartBaseType.php:133 + + + part.edit.footprint + Empreinte + + + + + Part-DB1\src\Form\Part\PartBaseType.php:142 + Part-DB1\src\Form\Part\PartBaseType.php:140 + + + part.edit.tags + Tags + + + + + Part-DB1\src\Form\Part\PartBaseType.php:154 + Part-DB1\src\Form\Part\PartBaseType.php:152 + + + part.edit.manufacturer.label + Fabricant + + + + + Part-DB1\src\Form\Part\PartBaseType.php:161 + Part-DB1\src\Form\Part\PartBaseType.php:159 + + + part.edit.manufacturer_url.label + Lien vers la page du produit + + + + + Part-DB1\src\Form\Part\PartBaseType.php:167 + Part-DB1\src\Form\Part\PartBaseType.php:165 + + + part.edit.mpn + Numéro de pièce du fabricant + + + + + Part-DB1\src\Form\Part\PartBaseType.php:173 + Part-DB1\src\Form\Part\PartBaseType.php:171 + + + part.edit.manufacturing_status + État de la fabrication + + + + + Part-DB1\src\Form\Part\PartBaseType.php:181 + Part-DB1\src\Form\Part\PartBaseType.php:179 + + + part.edit.needs_review + Révision nécessaire + + + + + Part-DB1\src\Form\Part\PartBaseType.php:189 + Part-DB1\src\Form\Part\PartBaseType.php:187 + + + part.edit.is_favorite + Favoris + + + + + Part-DB1\src\Form\Part\PartBaseType.php:197 + Part-DB1\src\Form\Part\PartBaseType.php:195 + + + part.edit.mass + Poids + + + + + Part-DB1\src\Form\Part\PartBaseType.php:203 + Part-DB1\src\Form\Part\PartBaseType.php:201 + + + part.edit.partUnit + Unité de mesure + + + + + Part-DB1\src\Form\Part\PartBaseType.php:212 + Part-DB1\src\Form\Part\PartBaseType.php:210 + + + part.edit.comment + Commentaire + + + + + Part-DB1\src\Form\Part\PartBaseType.php:250 + Part-DB1\src\Form\Part\PartBaseType.php:246 + + + part.edit.master_attachment + Miniature + + + + + Part-DB1\src\Form\Part\PartBaseType.php:295 + Part-DB1\src\Form\Part\PartBaseType.php:276 + src\Form\PartType.php:91 + + + part.edit.save + Sauvegarder les modifications + + + + + Part-DB1\src\Form\Part\PartBaseType.php:296 + Part-DB1\src\Form\Part\PartBaseType.php:277 + src\Form\PartType.php:92 + + + part.edit.reset + rejeter les modifications + + + + + Part-DB1\src\Form\Part\PartBaseType.php:105 + Part-DB1\src\Form\Part\PartBaseType.php:103 + + + part.edit.name.placeholder + Ex. BC547 + + + + + Part-DB1\src\Form\Part\PartBaseType.php:115 + Part-DB1\src\Form\Part\PartBaseType.php:113 + + + part.edit.description.placeholder + Ex. NPN 45V, 0,1A, 0,5W + + + + + Part-DB1\src\Form\Part\PartBaseType.php:123 + Part-DB1\src\Form\Part\PartBaseType.php:121 + + + part.editmininstock.placeholder + Ex. 1 + + + + + Part-DB1\src\Form\Part\PartLotType.php:69 + Part-DB1\src\Form\Part\PartLotType.php:69 + + + part_lot.edit.description + Description + + + + + Part-DB1\src\Form\Part\PartLotType.php:78 + Part-DB1\src\Form\Part\PartLotType.php:78 + + + part_lot.edit.location + Emplacement de stockage + + + + + Part-DB1\src\Form\Part\PartLotType.php:89 + Part-DB1\src\Form\Part\PartLotType.php:89 + + + part_lot.edit.amount + Quantité + + + + + Part-DB1\src\Form\Part\PartLotType.php:98 + Part-DB1\src\Form\Part\PartLotType.php:97 + + + part_lot.edit.instock_unknown + Quantité inconnue + + + + + Part-DB1\src\Form\Part\PartLotType.php:109 + Part-DB1\src\Form\Part\PartLotType.php:108 + + + part_lot.edit.needs_refill + Doit être rempli + + + + + Part-DB1\src\Form\Part\PartLotType.php:120 + Part-DB1\src\Form\Part\PartLotType.php:119 + + + part_lot.edit.expiration_date + Date d'expiration + + + + + Part-DB1\src\Form\Part\PartLotType.php:128 + Part-DB1\src\Form\Part\PartLotType.php:125 + + + part_lot.edit.comment + Commentaire + + + + + Part-DB1\src\Form\Permissions\PermissionsType.php:99 + Part-DB1\src\Form\Permissions\PermissionsType.php:99 + + + perm.group.other + Divers + + + + + Part-DB1\src\Form\TFAGoogleSettingsType.php:97 + Part-DB1\src\Form\TFAGoogleSettingsType.php:97 + + + tfa_google.enable + Activer l'application d'authentification + + + + + Part-DB1\src\Form\TFAGoogleSettingsType.php:101 + Part-DB1\src\Form\TFAGoogleSettingsType.php:101 + + + tfa_google.disable + Désactiver l'application d'authentification + + + + + Part-DB1\src\Form\TFAGoogleSettingsType.php:74 + Part-DB1\src\Form\TFAGoogleSettingsType.php:74 + + + google_confirmation + Code de confirmation + + + + + Part-DB1\src\Form\UserSettingsType.php:108 + Part-DB1\src\Form\UserSettingsType.php:108 + src\Form\UserSettingsType.php:46 + + + user.timezone.label + Fuseau horaire + + + + + Part-DB1\src\Form\UserSettingsType.php:133 + Part-DB1\src\Form\UserSettingsType.php:132 + + + user.currency.label + Devise préférée + + + + + Part-DB1\src\Form\UserSettingsType.php:140 + Part-DB1\src\Form\UserSettingsType.php:139 + src\Form\UserSettingsType.php:53 + + + save + Appliquer les modifications + + + + + Part-DB1\src\Form\UserSettingsType.php:141 + Part-DB1\src\Form\UserSettingsType.php:140 + src\Form\UserSettingsType.php:54 + + + reset + Rejeter les modifications + + + + + Part-DB1\src\Form\UserSettingsType.php:104 + Part-DB1\src\Form\UserSettingsType.php:104 + src\Form\UserSettingsType.php:45 + + + user_settings.language.placeholder + Langue du serveur + + + + + Part-DB1\src\Form\UserSettingsType.php:115 + Part-DB1\src\Form\UserSettingsType.php:115 + src\Form\UserSettingsType.php:48 + + + user_settings.timezone.placeholder + Fuseau horaire du serveur + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:79 + Part-DB1\src\Services\ElementTypeNameGenerator.php:79 + + + attachment.label + Fichier joint + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:81 + Part-DB1\src\Services\ElementTypeNameGenerator.php:81 + + + attachment_type.label + Type de fichier joint + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:85 + Part-DB1\src\Services\ElementTypeNameGenerator.php:85 + + + measurement_unit.label + Unité de mesure + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 + Part-DB1\src\Services\ElementTypeNameGenerator.php:90 + + + currency.label + Devise + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:91 + Part-DB1\src\Services\ElementTypeNameGenerator.php:91 + + + orderdetail.label + Informations de commande + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:92 + Part-DB1\src\Services\ElementTypeNameGenerator.php:92 + + + pricedetail.label + Informations sur les prix + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:94 + Part-DB1\src\Services\ElementTypeNameGenerator.php:94 + + + user.label + Utilisateur + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:95 + + + parameter.label + Caractéristique + + + + + Part-DB1\src\Services\ElementTypeNameGenerator.php:96 + + + label_profile.label + Profil d'étiquette + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:176 + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:161 + new + + + log.element_deleted.old_name.unknown + Inconnu + + + + + Part-DB1\src\Services\MarkdownParser.php:73 + Part-DB1\src\Services\MarkdownParser.php:73 + + + markdown.loading + Chargement de la remise. Si ce message ne disparaît pas, essayez de recharger la page. + + + + + Part-DB1\src\Services\PasswordResetManager.php:98 + Part-DB1\src\Services\PasswordResetManager.php:98 + + + pw_reset.email.subject + Réinitialisation du mot de passe de votre compte Part-DB + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:108 + + + tree.tools.tools + Outils + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:109 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:107 + src\Services\ToolsTreeBuilder.php:74 + + + tree.tools.edit + Éditer + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:110 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:108 + src\Services\ToolsTreeBuilder.php:81 + + + tree.tools.show + Afficher + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:111 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:109 + + + tree.tools.system + Système + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:123 + + + tree.tools.tools.label_dialog + Générateur d'étiquettes + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:130 + + + tree.tools.tools.label_scanner + Scanner + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:149 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:126 + src\Services\ToolsTreeBuilder.php:62 + + + tree.tools.edit.attachment_types + Types de fichier joint + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:155 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:132 + src\Services\ToolsTreeBuilder.php:64 + + + tree.tools.edit.categories + Catégories + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:167 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:144 + src\Services\ToolsTreeBuilder.php:68 + + + tree.tools.edit.suppliers + Fournisseurs + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:173 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:150 + src\Services\ToolsTreeBuilder.php:70 + + + tree.tools.edit.manufacturer + Fabricants + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:179 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:156 + + + tree.tools.edit.storelocation + Emplacements de stockage + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:185 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:162 + + + tree.tools.edit.footprint + Empreintes + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:191 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:168 + + + tree.tools.edit.currency + Devises + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:197 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:174 + + + tree.tools.edit.measurement_unit + Unité de mesure + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 + + + tree.tools.edit.label_profile + Profils d'étiquettes + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:209 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:180 + + + tree.tools.edit.part + Composant + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:226 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:197 + src\Services\ToolsTreeBuilder.php:77 + + + tree.tools.show.all_parts + Voir tous les composants + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:232 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:203 + + + tree.tools.show.all_attachments + Fichiers joints + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:239 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:210 + new + + + tree.tools.show.statistics + Statistiques + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:258 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:229 + + + tree.tools.system.users + Utilisateurs + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:264 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:235 + + + tree.tools.system.groups + Groupes + + + + + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:271 + Part-DB1\src\Services\Trees\ToolsTreeBuilder.php:242 + new + + + tree.tools.system.event_log + Système d'événements + + + + + Part-DB1\src\Services\Trees\TreeViewGenerator.php:95 + Part-DB1\src\Services\Trees\TreeViewGenerator.php:95 + src\Services\TreeBuilder.php:124 + + + entity.tree.new + Nouvel élément + + + + + Part-DB1\templates\Parts\info\_attachments_info.html.twig:34 + obsolete + + + attachment.external_file + Fichier extérieur + + + + + Part-DB1\templates\Parts\info\_attachments_info.html.twig:62 + obsolete + + + attachment.edit + Éditer + + + + + Part-DB1\templates\_navbar.html.twig:27 + templates\base.html.twig:88 + obsolete + + + barcode.scan + Scanner un code-barres + + + + + Part-DB1\src\Form\UserSettingsType.php:119 + src\Form\UserSettingsType.php:49 + obsolete + + + user.theme.label + Thème + + + + + Part-DB1\src\Form\UserSettingsType.php:129 + src\Form\UserSettingsType.php:50 + obsolete + + + user_settings.theme.placeholder + Thème du serveur + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:100 + new + obsolete + + + log.user_login.ip + IP + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:128 + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:150 + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:169 + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:207 + new + obsolete + + + log.undo_mode.undo + Modification annulée + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:130 + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:152 + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:171 + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:209 + new + obsolete + + + log.undo_mode.revert + Élément restauré + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:139 + new + obsolete + + + log.element_created.original_instock + Ancien stock + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:160 + new + obsolete + + + log.element_deleted.old_name + Ancien nom + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:184 + new + obsolete + + + log.element_edited.changed_fields + Champs modifiés + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:198 + new + obsolete + + + log.instock_changed.comment + Commentaire + + + + + Part-DB1\src\Services\LogSystem\LogEntryExtraFormatter.php:214 + new + obsolete + + + log.collection_deleted.deleted + Élément supprimé : + + + + + templates\base.html.twig:81 + obsolete + obsolete + + + go.exclamation + Allez! + + + + + templates\base.html.twig:109 + obsolete + obsolete + + + language.english + Anglais + + + + + templates\base.html.twig:112 + obsolete + obsolete + + + language.german + Allemand + + + + + obsolete + obsolete + + + flash.password_change_needed + Votre mot de passe doit être changé ! + + + + + obsolete + obsolete + + + attachment.table.type + Type de fichier joint + + + + + obsolete + obsolete + + + attachment.table.element + élément lié + + + + + obsolete + obsolete + + + attachment.edit.isPicture + Image? + + + + + obsolete + obsolete + + + attachment.edit.is3DModel + Modèle 3D? + + + + + obsolete + obsolete + + + attachment.edit.isBuiltin + Intégré? + + + + + obsolete + obsolete + + + category.edit.default_comment.placeholder + Ex. utilisé pour les alimentations à découpage + + + + + obsolete + obsolete + + + tfa_backup.regenerate_codes + Créer de nouveaux codes de secours + + + + + obsolete + obsolete + + + validator.noneofitschild.self + Un élément ne peut pas être son propre parent. + + + + + obsolete + obsolete + + + validator.noneofitschild.children + Le parent ne peut pas être un de ses propres enfants. + + + + + obsolete + obsolete + + + validator.part_lot.location_full.no_increasment + Le lieu de stockage utilisé a été marqué comme étant plein, le stock ne peut donc pas être augmenté. (Nouveau stock maximum {{old_amount}}) + + + + + obsolete + obsolete + + + validator.part_lot.location_full + L'emplacement de stockage est plein, c'est pourquoi aucun nouveau composant ne peut être ajouté. + + + + + obsolete + obsolete + + + validator.part_lot.only_existing + L'emplacement de stockage a été marqué comme "uniquement existant", donc aucun nouveau composant ne peut être ajouté. + + + + + obsolete + obsolete + + + validator.part_lot.single_part + L'emplacement de stockage a été marqué comme "Composant seul", par conséquent aucun nouveau composant ne peut être ajouté. + + + + + obsolete + obsolete + + + m_status.active.help + Le composant est actuellement en cours de production et sera produit dans un avenir proche. + + + + + obsolete + obsolete + + + m_status.announced.help + Le composant a été annoncé, mais n'est pas encore disponible. + + + + + obsolete + obsolete + + + m_status.discontinued.help + Le composant n'est plus fabriqué. + + + + + obsolete + obsolete + + + m_status.eol.help + La production de ce composant sera bientôt arrêtée. + + + + + obsolete + obsolete + + + m_status.nrfnd.help + Ce composant est actuellement en production mais n'est pas recommandé pour les nouvelles conceptions. + + + + + obsolete + obsolete + + + m_status.unknown.help + L'état de la production n'est pas connu. + + + + + obsolete + obsolete + + + flash.success + Succès + + + + + obsolete + obsolete + + + flash.error + Erreur + + + + + obsolete + obsolete + + + flash.warning + Attention + + + + + obsolete + obsolete + + + flash.notice + Remarque + + + + + obsolete + obsolete + + + flash.info + Info + + + + + obsolete + obsolete + + + validator.noLockout + Vous ne pouvez pas révoquer vous-même l'autorisation de "modifier les autorisations" pour éviter de vous verrouiller accidentellement ! + + + + + obsolete + obsolete + + + attachment_type.edit.filetype_filter + Types de fichiers autorisés + + + + + obsolete + obsolete + + + attachment_type.edit.filetype_filter.help + Vous pouvez spécifier ici une liste, séparée par des virgules, des extensions de fichiers ou des mimétapes qu'un fichier téléchargé avec ce type de pièce jointe doit avoir. Pour autoriser tous les fichiers d'images pris en charge, utilisez image/*. + + + + + obsolete + obsolete + + + attachment_type.edit.filetype_filter.placeholder + Ex. .txt, application/pdf, image/* + + + + + src\Form\PartType.php:63 + obsolete + obsolete + + + part.name.placeholder + Ex. BC547 + + + + + obsolete + obsolete + + + entity.edit.not_selectable + Non sélectionnable + + + + + obsolete + obsolete + + + entity.edit.not_selectable.help + Si cette option est activée, alors cet élément ne peut être attribué à aucun composant en tant que propriété. Utile, par exemple si cet élément doit être utilisé uniquement pour le tri. + + + + + obsolete + obsolete + + + bbcode.hint + Le BBCode peut être utilisé ici (par exemple [b]Bold[/b]) + + + + + obsolete + obsolete + + + entity.create + Créer un élément + + + + + obsolete + obsolete + + + entity.edit.save + Sauvegarder + + + + + obsolete + obsolete + + + category.edit.disable_footprints + Désactiver les empreintes + + + + + obsolete + obsolete + + + category.edit.disable_footprints.help + Si cette option est activée, la propriété Empreinte est désactivée pour tous les composants de cette catégorie. + + + + + obsolete + obsolete + + + category.edit.disable_manufacturers + Désactiver les fabricants + + + + + obsolete + obsolete + + + category.edit.disable_manufacturers.help + Si cette option est activée, la propriété fabricant est désactivée pour tous les composants de cette catégorie. + + + + + obsolete + obsolete + + + category.edit.disable_autodatasheets + Désactiver les liens automatiques des fiches techniques + + + + + obsolete + obsolete + + + category.edit.disable_autodatasheets.help + Si cette option est activée, aucun lien automatique avec la fiche technique n'est généré pour les pièces de cette catégorie. + + + + + obsolete + obsolete + + + category.edit.disable_properties + Désactiver les propriétés + + + + + obsolete + obsolete + + + category.edit.disable_properties.help + Si cette option est activée, les propriétés des composants pour tous les composants de cette catégorie sont désactivées. + + + + + obsolete + obsolete + + + category.edit.partname_hint + Indication du nom du composant + + + + + obsolete + obsolete + + + category.edit.partname_hint.placeholder + Ex. 100nF + + + + + obsolete + obsolete + + + category.edit.partname_regex + Filtre de nom + + + + + obsolete + obsolete + + + category.edit.default_description + Description par défaut + + + + + obsolete + obsolete + + + category.edit.default_description.placeholder + Ex. Condensateur, 10mmx10mm, CMS + + + + + obsolete + obsolete + + + category.edit.default_comment + Commentaire par défaut + + + + + obsolete + obsolete + + + company.edit.address + Adresse + + + + + obsolete + obsolete + + + company.edit.address.placeholder + Ex. 99 exemple de rue +exemple de ville + + + + + obsolete + obsolete + + + company.edit.phone_number + Numéro de téléphone + + + + + obsolete + obsolete + + + company.edit.phone_number.placeholder + +33 1 23 45 67 89 + + + + + obsolete + obsolete + + + company.edit.fax_number + Numéro de fax + + + + + obsolete + obsolete + + + company.edit.email + Email + + + + + obsolete + obsolete + + + company.edit.email.placeholder + Ex. contact@foo.bar + + + + + obsolete + obsolete + + + company.edit.website + Site internet + + + + + obsolete + obsolete + + + company.edit.website.placeholder + https://www.foo.bar + + + + + obsolete + obsolete + + + company.edit.auto_product_url + URL du produit + + + + + obsolete + obsolete + + + company.edit.auto_product_url.help + Si cette URL est définie, elle est utilisée pour générer l'URL d'un composant sur le site web du fabricant. Dans ce cas, %PARTNUMBER% sera remplacé par le numéro de commande. + + + + + obsolete + obsolete + + + company.edit.auto_product_url.placeholder + https://foo.bar/product/%PARTNUMBER% + + + + + obsolete + obsolete + + + currency.edit.iso_code + Code ISO + + + + + obsolete + obsolete + + + currency.edit.exchange_rate + Taux de change + + + + + obsolete + obsolete + + + footprint.edit.3d_model + Modèle 3D + + + + + obsolete + obsolete + + + mass_creation.lines + Saisie + + + + + obsolete + obsolete + + + mass_creation.lines.placeholder + Élément 1 +Élément 2 +Élément 3 + + + + + obsolete + obsolete + + + entity.mass_creation.btn + Créer + + + + + obsolete + obsolete + + + measurement_unit.edit.is_integer + Nombre entier + + + + + obsolete + obsolete + + + measurement_unit.edit.is_integer.help + Si cette option est activée, toutes les quantités dans cette unité sont arrondies à des nombres entiers. + + + + + obsolete + obsolete + + + measurement_unit.edit.use_si_prefix + Utiliser les préfixes SI + + + + + obsolete + obsolete + + + measurement_unit.edit.use_si_prefix.help + Si cette option est activée, les préfixes SI sont utilisés lors de la génération des nombres (par exemple 1,2 kg au lieu de 1200 g) + + + + + obsolete + obsolete + + + measurement_unit.edit.unit_symbol + Symbole de l'unité + + + + + obsolete + obsolete + + + measurement_unit.edit.unit_symbol.placeholder + Ex. m + + + + + obsolete + obsolete + + + storelocation.edit.is_full.label + Emplacement de stockage plein + + + + + obsolete + obsolete + + + storelocation.edit.is_full.help + Si cette option est activée, il n'est pas possible d'ajouter de nouveaux composants à ce lieu de stockage ni d'augmenter le nombre de composants existants. + + + + + obsolete + obsolete + + + storelocation.limit_to_existing.label + Limiter aux composants existants + + + + + obsolete + obsolete + + + storelocation.limit_to_existing.help + Si cette option est active, il n'est pas possible d'ajouter de nouveaux composants à ce lieu de stockage, mais il est possible d'augmenter le nombre de composants existants. + + + + + obsolete + obsolete + + + storelocation.only_single_part.label + Seulement un composant + + + + + obsolete + obsolete + + + storelocation.only_single_part.help + Si cette option est activée, cet emplacement de stockage ne peut contenir qu'un seul composant (mais une quantité quelconque). Utile pour les petits compartiments ou les distributeurs de CMS. + + + + + obsolete + obsolete + + + storelocation.storage_type.label + Type de stockage + + + + + obsolete + obsolete + + + storelocation.storage_type.help + Ici, vous pouvez sélectionner une unité de mesure qu'un composant doit avoir pour être stocké dans ce lieu de stockage. + + + + + obsolete + obsolete + + + supplier.edit.default_currency + Devise par défaut + + + + + obsolete + obsolete + + + supplier.shipping_costs.label + Frais de port + + + + + obsolete + obsolete + + + user.username.placeholder + Ex. j.doe + + + + + obsolete + obsolete + + + user.firstName.placeholder + Ex. John + + + + + obsolete + obsolete + + + user.lastName.placeholder + Ex. Doe + + + + + obsolete + obsolete + + + user.email.placeholder + j.doe@ecorp.com + + + + + obsolete + obsolete + + + user.department.placeholder + Ex. Development + + + + + obsolete + obsolete + + + user.settings.pw_new.label + Nouveau mot de passe + + + + + obsolete + obsolete + + + user.settings.pw_confirm.label + Confirmer le nouveau mot de passe + + + + + obsolete + obsolete + + + user.edit.needs_pw_change + L'utilisateur doit changer de mot de passe + + + + + obsolete + obsolete + + + user.edit.user_disabled + Utilisateur désactivé (connexion impossible) + + + + + obsolete + obsolete + + + user.create + Créer l'utilisateur + + + + + obsolete + obsolete + + + user.edit.save + Enregistrer + + + + + obsolete + obsolete + + + entity.edit.reset + Rejeter les modifications + + + + + templates\Parts\show_part_info.html.twig:166 + obsolete + obsolete + + + part.withdraw.btn + Retrait + + + + + templates\Parts\show_part_info.html.twig:171 + obsolete + obsolete + + + part.withdraw.comment: + Commentaire/objet + + + + + templates\Parts\show_part_info.html.twig:189 + obsolete + obsolete + + + part.add.caption + Ajouter composants + + + + + templates\Parts\show_part_info.html.twig:194 + obsolete + obsolete + + + part.add.btn + Ajouter + + + + + templates\Parts\show_part_info.html.twig:199 + obsolete + obsolete + + + part.add.comment + Commentaire/objet + + + + + templates\AdminPages\CompanyAdminBase.html.twig:15 + obsolete + obsolete + + + admin.comment + Commentaire + + + + + src\Form\PartType.php:83 + obsolete + obsolete + + + manufacturer_url.label + Lien vers le site du fabricant + + + + + src\Form\PartType.php:66 + obsolete + obsolete + + + part.description.placeholder + Ex. NPN 45V 0,1A 0,5W + + + + + src\Form\PartType.php:69 + obsolete + obsolete + + + part.instock.placeholder + Ex. 10 + + + + + src\Form\PartType.php:72 + obsolete + obsolete + + + part.mininstock.placeholder + Ex. 10 + + + + + obsolete + obsolete + + + part.order.price_per + Prix par + + + + + obsolete + obsolete + + + part.withdraw.caption + Retrait de composants + + + + + obsolete + obsolete + + + datatable.datatable.lengthMenu + _MENU_ + + + + + obsolete + obsolete + + + perm.group.parts + Composants + + + + + obsolete + obsolete + + + perm.group.structures + Structures des données + + + + + obsolete + obsolete + + + perm.group.system + Système + + + + + obsolete + obsolete + + + perm.parts + Général + + + + + obsolete + obsolete + + + perm.read + Afficher + + + + + obsolete + obsolete + + + perm.edit + Éditer + + + + + obsolete + obsolete + + + perm.create + Créer + + + + + obsolete + obsolete + + + perm.part.move + Changer de catégorie + + + + + obsolete + obsolete + + + perm.delete + Supprimer + + + + + obsolete + obsolete + + + perm.part.search + Rechercher + + + + + obsolete + obsolete + + + perm.part.all_parts + Liste de tous les composants + + + + + obsolete + obsolete + + + perm.part.no_price_parts + Liste des composants sans prix + + + + + obsolete + obsolete + + + perm.part.obsolete_parts + Liste des composants obsolètes + + + + + obsolete + obsolete + + + perm.part.unknown_instock_parts + Liste des composants dont le stock est inconnu + + + + + obsolete + obsolete + + + perm.part.change_favorite + Changer le statut de favori + + + + + obsolete + obsolete + + + perm.part.show_favorite + Afficher les favoris + + + + + obsolete + obsolete + + + perm.part.show_last_edit_parts + Afficher les derniers composants modifiés/ajoutés + + + + + obsolete + obsolete + + + perm.part.show_users + Afficher le dernier utilisateur ayant apporté des modifications + + + + + obsolete + obsolete + + + perm.part.show_history + Afficher l'historique + + + + + obsolete + obsolete + + + perm.part.name + Nom + + + + + obsolete + obsolete + + + perm.part.description + Description + + + + + obsolete + obsolete + + + perm.part.instock + En stock + + + + + obsolete + obsolete + + + perm.part.mininstock + Stock minimum + + + + + obsolete + obsolete + + + perm.part.comment + Commentaire + + + + + obsolete + obsolete + + + perm.part.storelocation + Emplacement de stockage + + + + + obsolete + obsolete + + + perm.part.manufacturer + Fabricant + + + + + obsolete + obsolete + + + perm.part.orderdetails + Informations pour la commande + + + + + obsolete + obsolete + + + perm.part.prices + Prix + + + + + obsolete + obsolete + + + perm.part.attachments + Fichiers joints + + + + + obsolete + obsolete + + + perm.part.order + Commandes + + + + + obsolete + obsolete + + + perm.storelocations + Emplacements de stockage + + + + + obsolete + obsolete + + + perm.move + Déplacer + + + + + obsolete + obsolete + + + perm.list_parts + Liste des composants + + + + + obsolete + obsolete + + + perm.part.footprints + Empreintes + + + + + obsolete + obsolete + + + perm.part.categories + Catégories + + + + + obsolete + obsolete + + + perm.part.supplier + Fournisseurs + + + + + obsolete + obsolete + + + perm.part.manufacturers + Fabricants + + + + + obsolete + obsolete + + + perm.part.attachment_types + Types de fichiers joints + + + + + obsolete + obsolete + + + perm.tools.import + Importer + + + + + obsolete + obsolete + + + perm.tools.labels + Étiquettes + + + + + obsolete + obsolete + + + perm.tools.calculator + Calculateur de résistance + + + + + obsolete + obsolete + + + perm.tools.footprints + Empreintes + + + + + obsolete + obsolete + + + perm.tools.ic_logos + Logos CI + + + + + obsolete + obsolete + + + perm.tools.statistics + Statistiques + + + + + obsolete + obsolete + + + perm.edit_permissions + Éditer les autorisations + + + + + obsolete + obsolete + + + perm.users.edit_user_name + Modifier le nom d'utilisateur + + + + + obsolete + obsolete + + + perm.users.edit_change_group + Modifier le groupe + + + + + obsolete + obsolete + + + perm.users.edit_infos + Editer les informations + + + + + obsolete + obsolete + + + perm.users.edit_permissions + Modifier les autorisations + + + + + obsolete + obsolete + + + perm.users.set_password + Définir le mot de passe + + + + + obsolete + obsolete + + + perm.users.change_user_settings + Changer les paramètres utilisateur + + + + + obsolete + obsolete + + + perm.database.see_status + Afficher l’état + + + + + obsolete + obsolete + + + perm.database.update_db + Actualiser la base de données + + + + + obsolete + obsolete + + + perm.database.read_db_settings + Lecture des paramètres de la base de donnée + + + + + obsolete + obsolete + + + perm.database.write_db_settings + Modifier les paramètres de la base de données + + + + + obsolete + obsolete + + + perm.config.read_config + Lecture de la configuration + + + + + obsolete + obsolete + + + perm.config.edit_config + Modifier la configuration + + + + + obsolete + obsolete + + + perm.config.server_info + Informations sur le serveur + + + + + obsolete + obsolete + + + perm.config.use_debug + Utiliser les outils de débogage + + + + + obsolete + obsolete + + + perm.show_logs + Afficher les logs + + + + + obsolete + obsolete + + + perm.delete_logs + Supprimer les logs + + + + + obsolete + obsolete + + + perm.self.edit_infos + Modifier les informations + + + + + obsolete + obsolete + + + perm.self.edit_username + Modifier le nom d'utilisateur + + + + + obsolete + obsolete + + + perm.self.show_permissions + Voir les autorisations + + + + + obsolete + obsolete + + + perm.self.show_logs + Afficher ses propres logs + + + + + obsolete + obsolete + + + perm.self.create_labels + Créer des étiquettes + + + + + obsolete + obsolete + + + perm.self.edit_options + Modifier les options + + + + + obsolete + obsolete + + + perm.self.delete_profiles + Supprimer les profils + + + + + obsolete + obsolete + + + perm.self.edit_profiles + Modifier les profils + + + + + obsolete + obsolete + + + perm.part.tools + Outils + + + + + obsolete + obsolete + + + perm.groups + Groupes + + + + + obsolete + obsolete + + + perm.users + Utilisateurs + + + + + obsolete + obsolete + + + perm.database + Base de données + + + + + obsolete + obsolete + + + perm.config + Configuration + + + + + obsolete + obsolete + + + perm.system + Système + + + + + obsolete + obsolete + + + perm.self + Propre utilisateur + + + + + obsolete + obsolete + + + perm.labels + Étiquettes + + + + + obsolete + obsolete + + + perm.part.category + Catégorie + + + + + obsolete + obsolete + + + perm.part.minamount + Quantité minimum + + + + + obsolete + obsolete + + + perm.part.footprint + Empreinte + + + + + obsolete + obsolete + + + perm.part.mpn + MPN + + + + + obsolete + obsolete + + + perm.part.status + État de la fabrication + + + + + obsolete + obsolete + + + perm.part.tags + Tags + + + + + obsolete + obsolete + + + perm.part.unit + Unité + + + + + obsolete + obsolete + + + perm.part.mass + Poids + + + + + obsolete + obsolete + + + perm.part.lots + Lots de composants + + + + + obsolete + obsolete + + + perm.show_users + Afficher le dernier utilisateur ayant apporté des modifications + + + + + obsolete + obsolete + + + perm.currencies + Devises + + + + + obsolete + obsolete + + + perm.measurement_units + Unités de mesure + + + + + obsolete + obsolete + + + user.settings.pw_old.label + Ancien mot de passe + + + + + obsolete + obsolete + + + pw_reset.submit + Réinitialiser le mot de passe + + + + + obsolete + obsolete + + + u2f_two_factor + Clé de sécurité (U2F) + + + + + obsolete + obsolete + + + google + google + + + + + obsolete + obsolete + + + tfa.provider.google + Application d'authentification + + + + + obsolete + obsolete + + + Login successful + Connexion réussie + + + + + obsolete + obsolete + + + log.type.exception + Exception + + + + + obsolete + obsolete + + + log.type.user_login + Connexion utilisateur + + + + + obsolete + obsolete + + + log.type.user_logout + Déconnexion de l’utilisateur + + + + + obsolete + obsolete + + + log.type.unknown + Inconnu + + + + + obsolete + obsolete + + + log.type.element_created + Élément créé + + + + + obsolete + obsolete + + + log.type.element_edited + Élément modifié + + + + + obsolete + obsolete + + + log.type.element_deleted + Élément supprimé + + + + + obsolete + obsolete + + + log.type.database_updated + Base de données mise à jour + + + + + obsolete + + + perm.revert_elements + Restaurer les éléments + + + + + obsolete + + + perm.show_history + Afficher l'historique + + + + + obsolete + + + perm.tools.lastActivity + Afficher l'activité récente + + + + + obsolete + + + perm.tools.timeTravel + Afficher les anciennes versions des éléments (Time travel) + + + + + obsolete + + + tfa_u2f.key_added_successful + Clé de sécurité ajoutée avec succès. + + + + + obsolete + + + Username + Nom d'utilisateur + + + + + obsolete + + + log.type.security.google_disabled + Application d'authentification désactivée + + + + + obsolete + + + log.type.security.u2f_removed + Clé de sécurité enlevée + + + + + obsolete + + + log.type.security.u2f_added + Clé de sécurité ajoutée + + + + + obsolete + + + log.type.security.backup_keys_reset + Clés de sauvegarde régénérées + + + + + obsolete + + + log.type.security.google_enabled + Application Authenticator activée + + + + + obsolete + + + log.type.security.password_changed + Mot de passe modifié + + + + + obsolete + + + log.type.security.trusted_device_reset + Appareils de confiance réinitialisés + + + + + obsolete + + + log.type.collection_element_deleted + Élément de collecte supprimé + + + + + obsolete + + + log.type.security.password_reset + Réinitialisation du mot de passe + + + + + obsolete + + + log.type.security.2fa_admin_reset + Réinitialisation à deux facteurs par l'administrateur + + + + + obsolete + + + log.type.user_not_allowed + Tentative d'accès non autorisé + + + + + obsolete + + + log.database_updated.success + Succès + + + + + obsolete + + + label_options.barcode_type.2D + 2D + + + + + obsolete + + + label_options.barcode_type.1D + 1D + + + + + obsolete + + + perm.part.parameters + Caractéristiques + + + + + obsolete + + + perm.attachment_show_private + Voir les pièces jointes privées + + + + + obsolete + + + perm.tools.label_scanner + Lecteur d'étiquettes + + + + + obsolete + + + perm.self.read_profiles + Lire les profils + + + + + obsolete + + + perm.self.create_profiles + Créer des profils + + + + + obsolete + + + perm.labels.use_twig + Utiliser le mode twig + + + + + label_profile.showInDropdown + Afficher en sélection rapide + + + + + group.edit.enforce_2fa + Imposer l'authentification à deux facteurs (2FA) + + + + + group.edit.enforce_2fa.help + Si cette option est activée, chaque membre direct de ce groupe doit configurer au moins un deuxième facteur d'authentification. Recommandé pour les groupes administratifs ayant beaucoup de permissions. + + + + + selectpicker.empty + Rien n'est sélectionné + + + + + selectpicker.nothing_selected + Rien n'est sélectionné + + + + + entity.delete.must_not_contain_parts + L'élement contient encore des parties ! Vous devez déplacer les parties pour pouvoir supprimer cet élément. + + + + + entity.delete.must_not_contain_attachments + Le type de pièce jointe contient toujours des pièces jointes. Changez leur type, pour pouvoir supprimer ce type de pièce jointe. + + + + + entity.delete.must_not_contain_prices + La devise contient encore des prix. Vous devez changer leur devise pour pouvoir supprimer cet élément. + + + + + entity.delete.must_not_contain_users + Des utilisateurs utilisent toujours ce groupe ! Changez les de groupe pour pouvoir supprimer ce groupe. + + + + + part.table.edit + Modifier + + + + + part.table.edit.title + Modifier composant + + + + + part_list.action.action.title + Sélectionnez une action + + + + + part_list.action.action.group.favorite + Statut favori + + + + + part_list.action.action.favorite + Favorable + + + + + part_list.action.action.unfavorite + Défavorable + + + + + part_list.action.action.group.change_field + Modifier le champ + + + + + part_list.action.action.change_category + Modifier la catégorie + + + + + part_list.action.action.change_footprint + Modifier l'empreinte + + + + + part_list.action.action.change_manufacturer + Modifier le fabricant + + + + + part_list.action.action.change_unit + Modifier l'unité + + + + + part_list.action.action.delete + Supprimer + + + + + part_list.action.submit + Soumettre + + + + + part_list.action.part_count + %count% composants sélectionnés + + + + + company.edit.quick.website + Ouvrir le site web + + + + + company.edit.quick.email + Envoyer un e-mail + + + + + company.edit.quick.phone + Téléphoner + + + + + company.edit.quick.fax + Envoyer une télécopie + + + + + company.fax_number.placeholder + ex. +33 12 34 56 78 90 + + + + + part.edit.save_and_clone + Sauvegarder et dupliquer + + + + + validator.file_ext_not_allowed + L'extension de fichier n'est pas autorisée pour ce type de pièce jointe. + + + + + tools.reel_calc.title + Calculateur de bobines CMS + + + + + tools.reel_calc.inner_dia + Diamètre intérieur + + + + + tools.reel_calc.outer_dia + Diamètre extérieur + + + + + tools.reel_calc.tape_thick + Épaisseur du ruban + + + + + tools.reel_calc.part_distance + Distance entre les composants + + + + + tools.reel_calc.update + Actualiser + + + + + tools.reel_calc.parts_per_meter + Composants par mètre + + + + + tools.reel_calc.result_length + Longueur de la bande + + + + + tools.reel_calc.result_amount + Nbre approximatif de composants + + + + + tools.reel_calc.outer_greater_inner_error + Erreur : Le diamètre extérieur doit être supérieur au diamètre intérieur ! + + + + + tools.reel_calc.missing_values.error + Veuillez remplir toutes les valeurs ! + + + + + tools.reel_calc.load_preset + Charger la présélection + + + + + tools.reel_calc.explanation + Ce calculateur vous donne une estimation du nombre de pièces qui restent sur une bobine de CMS. Mesurez les dimensions notées sur la bobine (ou utilisez certains des préréglages) et cliquez sur "Actualiser" pour obtenir un résultat. + + + + + perm.tools.reel_calculator + Calculateur de bobines CMS + + + + + tree.tools.tools.reel_calculator + Calculateur de bobines CMS + + + + + currency.edit.update_rate + Taux de rafraîchissement + + + + + currency.edit.exchange_rate_update.unsupported_currency + Devise non prise en charge + + + + + currency.edit.exchange_rate_update.generic_error + Erreur générique + + + + + currency.edit.exchange_rate_updated.success + Succès + + + + + homepage.forum.text + Si vous avez des questions à propos de Part-DB , rendez vous sur <a href="%href%" class="link-external" target="_blank">Github</a> + + + + diff --git a/translations/messages.it.xlf b/translations/messages.it.xlf index 7e05a6f2..828304eb 100644 --- a/translations/messages.it.xlf +++ b/translations/messages.it.xlf @@ -9011,7 +9011,7 @@ Element 3 part_list.action.part_count - %count% componenti selezionati ! + %count% componenti selezionati diff --git a/translations/messages.pl.xlf b/translations/messages.pl.xlf index 5b038410..b769e273 100644 --- a/translations/messages.pl.xlf +++ b/translations/messages.pl.xlf @@ -9014,7 +9014,7 @@ Element 3 part_list.action.part_count - Wybrano %count% części! + Wybrano %count% części diff --git a/translations/messages.ru.xlf b/translations/messages.ru.xlf index 2b4a5f70..62570acb 100644 --- a/translations/messages.ru.xlf +++ b/translations/messages.ru.xlf @@ -9018,7 +9018,7 @@ part_list.action.part_count - %count% компонентов выбрано! + %count% компонентов выбрано diff --git a/yarn.lock b/yarn.lock index 307692f2..3289c949 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2,66 +2,58 @@ # yarn lockfile v1 -"@algolia/autocomplete-core@1.19.2": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.2.tgz#702df67a08cb3cfe8c33ee1111ef136ec1a9e232" - integrity sha512-mKv7RyuAzXvwmq+0XRK8HqZXt9iZ5Kkm2huLjgn5JoCPtDy+oh9yxUMfDDaVCw0oyzZ1isdJBc7l9nuCyyR7Nw== +"@algolia/autocomplete-core@1.19.3": + version "1.19.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-core/-/autocomplete-core-1.19.3.tgz#f480d638d2b4218f8161f313186db7a5aac99c90" + integrity sha512-45CVTxtd3PwVux5G3WLUA3So5tRKRXu+amupW0dg3KTaTeydt+KzvH1mrZhs3hUne7VQ+g8+ZRGWHbuL/Rb5mw== dependencies: - "@algolia/autocomplete-plugin-algolia-insights" "1.19.2" - "@algolia/autocomplete-shared" "1.19.2" + "@algolia/autocomplete-plugin-algolia-insights" "1.19.3" + "@algolia/autocomplete-shared" "1.19.3" -"@algolia/autocomplete-js@1.19.2", "@algolia/autocomplete-js@^1.17.0": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-js/-/autocomplete-js-1.19.2.tgz#3768a501671b43923aee8c111680d3738c432215" - integrity sha512-pUElPLQypSGwewihADgV/g57EWepn/jHoArnbtyJNvn4onJCDwmJGelCm5+dN/3dAYZq7QO2ExFEjGsoiG/nUg== +"@algolia/autocomplete-js@1.19.3", "@algolia/autocomplete-js@^1.17.0": + version "1.19.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-js/-/autocomplete-js-1.19.3.tgz#a3f733ac654201beb18c29e83b61653e5037c04c" + integrity sha512-uJPElcGy1jqi8WAzTBgX4xufu+cRYSaDfAZW3ed4AVTOu8oDwUkMgrKgpKxp5u8d6BhugSm47vGkYoj87jZQ/Q== dependencies: - "@algolia/autocomplete-core" "1.19.2" - "@algolia/autocomplete-preset-algolia" "1.19.2" - "@algolia/autocomplete-shared" "1.19.2" + "@algolia/autocomplete-core" "1.19.3" + "@algolia/autocomplete-preset-algolia" "1.19.3" + "@algolia/autocomplete-shared" "1.19.3" htm "^3.1.1" preact "^10.13.2" -"@algolia/autocomplete-plugin-algolia-insights@1.19.2": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.2.tgz#3584b625b9317e333d1ae43664d02358e175c52d" - integrity sha512-TjxbcC/r4vwmnZaPwrHtkXNeqvlpdyR+oR9Wi2XyfORkiGkLTVhX2j+O9SaCCINbKoDfc+c2PB8NjfOnz7+oKg== +"@algolia/autocomplete-plugin-algolia-insights@1.19.3": + version "1.19.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-algolia-insights/-/autocomplete-plugin-algolia-insights-1.19.3.tgz#04e6e8150cd0964f7521acbb1eb1a3d650e9f60d" + integrity sha512-Oy6t0Ws99xWKCzrp7pFWncLqFA3MoBAv1DDbDrn2XN9NBE9GviXw2hZsBi6CFReR/9wK72xq4vT96LBshOxhaQ== dependencies: - "@algolia/autocomplete-shared" "1.19.2" + "@algolia/autocomplete-shared" "1.19.3" "@algolia/autocomplete-plugin-recent-searches@^1.17.0": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-recent-searches/-/autocomplete-plugin-recent-searches-1.19.2.tgz#59341b2b6e121fedd1ab3e1652d86630f4c37fc4" - integrity sha512-V4VYzv0wvsBYsGxDcicpY17YRvayiFnMl24/kNAEBdIsxtF555Yfg0CHAmR55JdZRs9er/op1SOBpcc5+3V76g== + version "1.19.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-plugin-recent-searches/-/autocomplete-plugin-recent-searches-1.19.3.tgz#f6a98362dc7d7fcf080b17202dd8b6207fe447d2" + integrity sha512-RfY6TyolCa2gV655EKsz5sMp7E19C59ENJ3LBe5lRyq3o6sO5jNAMMyEBAp7y8M7uGRdepa6Y7Tch1zSLlCEEw== dependencies: - "@algolia/autocomplete-core" "1.19.2" - "@algolia/autocomplete-js" "1.19.2" - "@algolia/autocomplete-preset-algolia" "1.19.2" - "@algolia/autocomplete-shared" "1.19.2" + "@algolia/autocomplete-core" "1.19.3" + "@algolia/autocomplete-js" "1.19.3" + "@algolia/autocomplete-preset-algolia" "1.19.3" + "@algolia/autocomplete-shared" "1.19.3" -"@algolia/autocomplete-preset-algolia@1.19.2": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.19.2.tgz#c6c1e1ff7b011090a70e66b02e6db4ebade4535e" - integrity sha512-/Z9tDn84fnyUyjajvWRskOX7p/BDKK5PidEA4Y/aAl0c6VfHu5dMkTDG090CIiskLUgpkHacLbz+A10gMBP++Q== +"@algolia/autocomplete-preset-algolia@1.19.3": + version "1.19.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-preset-algolia/-/autocomplete-preset-algolia-1.19.3.tgz#027fd0937bc22b72c3eecf56053ab55f79e4b423" + integrity sha512-NIvRLWFnX5MclQVyRKPwNDxjNg214qXCTZ/jLLVXw17VmPsEYfgeSYEMWEGFapA8KKKMz+Kwb+nBOc4je6DXfg== dependencies: - "@algolia/autocomplete-shared" "1.19.2" + "@algolia/autocomplete-shared" "1.19.3" -"@algolia/autocomplete-shared@1.19.2": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.2.tgz#c0b7b8dc30a5c65b70501640e62b009535e4578f" - integrity sha512-jEazxZTVD2nLrC+wYlVHQgpBoBB5KPStrJxLzsIFl6Kqd1AlG9sIAGl39V5tECLpIQzB3Qa2T6ZPJ1ChkwMK/w== +"@algolia/autocomplete-shared@1.19.3": + version "1.19.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-shared/-/autocomplete-shared-1.19.3.tgz#9bd9dfd80fa3e320461682e917f0f94404f60eba" + integrity sha512-zzpqoVm/I4eRFT5Mcempwa5SVKox83eVIsZyLAYQdV+7tmtEYayx225Kl7nwhGrJ7NCozE9YWMwuFFN2g5dSBg== "@algolia/autocomplete-theme-classic@^1.17.0": - version "1.19.2" - resolved "https://registry.yarnpkg.com/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.19.2.tgz#7c2a7d8f74988536f0a2f6ae806b18f915523266" - integrity sha512-UapO6bGuT5NkRK8VWxSg8AOLRhIcxBZ/OYg7ao//WHBo/yyiDybxy+K/xeY1RcHQVgimqlWfXj8IWAyQxxZP6A== - -"@ampproject/remapping@^2.2.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@ampproject/remapping/-/remapping-2.3.0.tgz#ed441b6fa600072520ce18b43d2c8cc8caecc7f4" - integrity sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw== - dependencies: - "@jridgewell/gen-mapping" "^0.3.5" - "@jridgewell/trace-mapping" "^0.3.24" + version "1.19.3" + resolved "https://registry.yarnpkg.com/@algolia/autocomplete-theme-classic/-/autocomplete-theme-classic-1.19.3.tgz#b4442911e3dc38bfb40c25f56b71f099a321f9c7" + integrity sha512-f0s9AxiqWTrv+etLcVXqzBTX5QbnR6JXJPmWu5mgkch7VY4AIqIuNB8ToDkSl1Hp9prkKir7/J9xEf7BDePHww== "@babel/code-frame@^7.0.0", "@babel/code-frame@^7.27.1": version "7.27.1" @@ -73,25 +65,25 @@ picocolors "^1.1.1" "@babel/compat-data@^7.27.2", "@babel/compat-data@^7.27.7", "@babel/compat-data@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.0.tgz#9fc6fd58c2a6a15243cd13983224968392070790" - integrity sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw== + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.28.4.tgz#96fdf1af1b8859c8474ab39c295312bfb7c24b04" + integrity sha512-YsmSKC29MJwf0gF8Rjjrg5LQCmyh+j/nD8/eP7f+BeoQTKYqs9RoWbjGOdy0+1Ekr68RJZMUOPVQaQisnIo4Rw== "@babel/core@^7.19.6": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.3.tgz#aceddde69c5d1def69b839d09efa3e3ff59c97cb" - integrity sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ== + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/core/-/core-7.28.4.tgz#12a550b8794452df4c8b084f95003bce1742d496" + integrity sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA== dependencies: - "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.27.1" "@babel/generator" "^7.28.3" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-module-transforms" "^7.28.3" - "@babel/helpers" "^7.28.3" - "@babel/parser" "^7.28.3" + "@babel/helpers" "^7.28.4" + "@babel/parser" "^7.28.4" "@babel/template" "^7.27.2" - "@babel/traverse" "^7.28.3" - "@babel/types" "^7.28.2" + "@babel/traverse" "^7.28.4" + "@babel/types" "^7.28.4" + "@jridgewell/remapping" "^2.3.5" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" @@ -252,20 +244,20 @@ "@babel/traverse" "^7.28.3" "@babel/types" "^7.28.2" -"@babel/helpers@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.3.tgz#b83156c0a2232c133d1b535dd5d3452119c7e441" - integrity sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw== +"@babel/helpers@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.28.4.tgz#fe07274742e95bdf7cf1443593eeb8926ab63827" + integrity sha512-HFN59MmQXGHVyYadKLVumYsA9dBFun/ldYxipEjzA4196jpLZd8UjEEBLkbEkvfYreDqJhZxYAWFPtrfhNpj4w== dependencies: "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.4" -"@babel/parser@^7.18.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.3.tgz#d2d25b814621bca5fe9d172bc93792547e7a2a71" - integrity sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA== +"@babel/parser@^7.18.9", "@babel/parser@^7.27.2", "@babel/parser@^7.28.3", "@babel/parser@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.28.4.tgz#da25d4643532890932cc03f7705fe19637e03fa8" + integrity sha512-yZbBqeM6TkpP9du/I2pUZnJsRMGGvOuIrhjzC1AwHwW+6he4mni6Bp/m8ijn0iOuZuPI2BfkCoSRunpyjnrQKg== dependencies: - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.4" "@babel/plugin-bugfix-firefox-class-in-computed-class-key@^7.27.1": version "7.27.1" @@ -366,9 +358,9 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-block-scoping@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.0.tgz#e7c50cbacc18034f210b93defa89638666099451" - integrity sha512-gKKnwjpdx5sER/wl0WN0efUBFzF/56YZO0RJrSYP4CljXnP31ByY7fol89AzomdlLNzI36AvOTmYHsnZTCkq8Q== + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.28.4.tgz#e19ac4ddb8b7858bac1fd5c1be98a994d9726410" + integrity sha512-1yxmvN0MJHOhPVmAsmoW5liWwoILobu/d/ShymZmj867bAdxGbehIrew1DuLpw2Ukv+qDSSPQdYW1dLNE7t11A== dependencies: "@babel/helper-plugin-utils" "^7.27.1" @@ -389,16 +381,16 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-classes@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.3.tgz#598297260343d0edbd51cb5f5075e07dee91963a" - integrity sha512-DoEWC5SuxuARF2KdKmGUq3ghfPMO6ZzR12Dnp5gubwbeWJo4dbNWXJPVlwvh4Zlq6Z7YVvL8VFxeSOJgjsx4Sg== + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.28.4.tgz#75d66175486788c56728a73424d67cbc7473495c" + integrity sha512-cFOlhIYPBv/iBoc+KS3M6et2XPtbT2HiCRfBXWtfpc9OAyostldxIf9YAYB6ypURBBbx+Qv6nyrLzASfJe+hBA== dependencies: "@babel/helper-annotate-as-pure" "^7.27.3" "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-globals" "^7.28.0" "@babel/helper-plugin-utils" "^7.27.1" "@babel/helper-replace-supers" "^7.27.1" - "@babel/traverse" "^7.28.3" + "@babel/traverse" "^7.28.4" "@babel/plugin-transform-computed-properties@^7.27.1": version "7.27.1" @@ -577,15 +569,15 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-object-rest-spread@^7.28.0": - version "7.28.0" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.0.tgz#d23021857ffd7cd809f54d624299b8086402ed8d" - integrity sha512-9VNGikXxzu5eCiQjdE4IZn8sb9q7Xsk5EXLDBKUYg1e/Tve8/05+KJEtcxGxAgCY5t/BpKQM+JEL/yT4tvgiUA== + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-object-rest-spread/-/plugin-transform-object-rest-spread-7.28.4.tgz#9ee1ceca80b3e6c4bac9247b2149e36958f7f98d" + integrity sha512-373KA2HQzKhQCYiRVIRr+3MjpCObqzDlyrM6u4I201wL8Mp2wHf7uB8GhDwis03k2ti8Zr65Zyyqs1xOxUF/Ew== dependencies: "@babel/helper-compilation-targets" "^7.27.2" "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-destructuring" "^7.28.0" "@babel/plugin-transform-parameters" "^7.27.7" - "@babel/traverse" "^7.28.0" + "@babel/traverse" "^7.28.4" "@babel/plugin-transform-object-super@^7.27.1": version "7.27.1" @@ -642,9 +634,9 @@ "@babel/helper-plugin-utils" "^7.27.1" "@babel/plugin-transform-regenerator@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.3.tgz#b8eee0f8aed37704bbcc932fd0b1a0a34d0b7344" - integrity sha512-K3/M/a4+ESb5LEldjQb+XSrpY0nF+ZBFlTCbSnKaYAMfD8v33O6PMs4uYnOk19HlcsI8WMu3McdFPTiQHF/1/A== + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.28.4.tgz#9d3fa3bebb48ddd0091ce5729139cd99c67cea51" + integrity sha512-+ZEdQlBoRg9m2NnzvEeLgtvBMO4tkFBw5SQIUgLICgTrumLoU7lr+Oghi6km2PFj+dbUt2u1oby2w3BDO9YQnA== dependencies: "@babel/helper-plugin-utils" "^7.27.1" @@ -824,180 +816,180 @@ "@babel/parser" "^7.27.2" "@babel/types" "^7.27.1" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3": - version "7.28.3" - resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.3.tgz#6911a10795d2cce43ec6a28cffc440cca2593434" - integrity sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ== +"@babel/traverse@^7.18.9", "@babel/traverse@^7.27.1", "@babel/traverse@^7.28.0", "@babel/traverse@^7.28.3", "@babel/traverse@^7.28.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.28.4.tgz#8d456101b96ab175d487249f60680221692b958b" + integrity sha512-YEzuboP2qvQavAcjgQNVgsvHIDv6ZpwXvcvjmyySP2DIMuByS/6ioU5G9pYrWHM6T2YDfc7xga9iNzYOs12CFQ== dependencies: "@babel/code-frame" "^7.27.1" "@babel/generator" "^7.28.3" "@babel/helper-globals" "^7.28.0" - "@babel/parser" "^7.28.3" + "@babel/parser" "^7.28.4" "@babel/template" "^7.27.2" - "@babel/types" "^7.28.2" + "@babel/types" "^7.28.4" debug "^4.3.1" -"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.4.4": - version "7.28.2" - resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.2.tgz#da9db0856a9a88e0a13b019881d7513588cf712b" - integrity sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ== +"@babel/types@^7.27.1", "@babel/types@^7.27.3", "@babel/types@^7.28.2", "@babel/types@^7.28.4", "@babel/types@^7.4.4": + version "7.28.4" + resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.28.4.tgz#0a4e618f4c60a7cd6c11cb2d48060e4dbe38ac3a" + integrity sha512-bkFqkLhh3pMBUQQkpVgWDWq/lqzc2678eUyDlTBhRqhCHFguYYGM0Efga7tYk4TogG/3x0EEl66/OQ+WGbWB/Q== dependencies: "@babel/helper-string-parser" "^7.27.1" "@babel/helper-validator-identifier" "^7.27.1" -"@ckeditor/ckeditor5-adapter-ckfinder@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-46.0.2.tgz#a165fc259e91189d4f13cc83fc11f7f7e0c6a1b7" - integrity sha512-S4VO8l+WS8yVGpu9vB00rWNdFIR4NTAkuCP7iLlodB45KFgMobP1GTqF8EqNFIJEU2PHJz24R0kcsOyvfU6V/A== +"@ckeditor/ckeditor5-adapter-ckfinder@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-adapter-ckfinder/-/ckeditor5-adapter-ckfinder-46.0.3.tgz#f19f9fa1a0a33aa2fa502f0f7c779c027f4f78bd" + integrity sha512-xebONgXYuF8Fuhr6C+lpwRSfpChSrJKTy5S0i7vuBY+EeuXLRED7AuCOvPwV9oed1/CqbzDWWH1IefgkLwZwvQ== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-upload" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-upload" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-alignment@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-46.0.2.tgz#68ce011f01e4bed205e8ee3cd2599a54b89af19a" - integrity sha512-iCVJIkmJ+DT2Podmc0gH8Ntj7rYr9kziYLup1VHo/k8mKPfqC3a6o6ngT8ZtPdr1nZ4h4kozVjF+ge2BqnxzmQ== +"@ckeditor/ckeditor5-alignment@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-alignment/-/ckeditor5-alignment-46.0.3.tgz#34cb75002fefc79dbffc94b08c0a0a34e722adb5" + integrity sha512-P0qegTFO9u5gbR7Ig/JI0vGdWFtxzM08KPCbeYTpQtdI9+DrKdvWFo0LVB7LJjR6OKuUPCtnulGgCyhuzNT7lw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-autoformat@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-46.0.2.tgz#9153d5186a4e5ddcb27b04a181fd21c18625e830" - integrity sha512-IMEWvgRCYw4PkUsshIb7V54fqJvLLohFLH+CQ0RtjzGE8ZYDkuusu7cHDz8hgQwlDWH5X7VOvTdEdPzb0uRhjA== +"@ckeditor/ckeditor5-autoformat@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-autoformat/-/ckeditor5-autoformat-46.0.3.tgz#ac2390550211aa71b7065559d4d9c135e3296ad0" + integrity sha512-E3bjlf8HbTD9FiGHPQyrbRXniA7W06CecmlKXwHDisGC8lLLF8ZpuRX4oGAH5QLpSVFyGuj0C1GJtVY0+PEjOw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-heading" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-heading" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-autosave@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-autosave/-/ckeditor5-autosave-46.0.2.tgz#bcf3f2c44a5341c196343ace454992a3f36468d8" - integrity sha512-DKUCaGzbpwJC4FdWLVQivjJAkOkNqAaCv4+xNESPQvq8pGzBqHPFTZl0ZBvGUxEUj7S1dypIHkVWqRywSNsKJg== +"@ckeditor/ckeditor5-autosave@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-autosave/-/ckeditor5-autosave-46.0.3.tgz#d26d0157ebf4005fac8f802de16ce65188e64c92" + integrity sha512-SStt6opEniy0i5N5QMsAttpxhPvlmQ5UgmfvVmkyBnvOGwFwSmIFjxAXdTsAhvKdDaKrsjeCpv/j6L6llYk7dw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-basic-styles@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-46.0.2.tgz#cc38af0cfb968911ee3ce302f1ae6a2e3dd5c57e" - integrity sha512-KFMNihlxg7LG7wKhG9OgAOqY621qkdz9clzLPmaoZzFydDfoVlnumFlC3cLnhIK1HOJvDnUec3u9te49pbqllQ== +"@ckeditor/ckeditor5-basic-styles@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-basic-styles/-/ckeditor5-basic-styles-46.0.3.tgz#563cb4ef19ecfd763745cb0bd79940fd03b7a81c" + integrity sha512-THmEPEbYopSfq8NTAugPLk+QW8/vuRkJfg/NpESzeugqCkBG2to3thOHdetbpye4IJBokLFhLsGFfKVYfVF81A== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-block-quote@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-46.0.2.tgz#c7498ac1b588160703a14ccdfc2fe46aba187060" - integrity sha512-QWfqWPFQ4xFSzVgX8L3XqYYnUZE8/p3K23a2S35jwUJRrJl7PzyDNtzqbqohVWn5mGRXlO66qHdbyayrHTx0Lw== +"@ckeditor/ckeditor5-block-quote@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-block-quote/-/ckeditor5-block-quote-46.0.3.tgz#79a783d36ad4f9163cc31fb608ac6213c040a145" + integrity sha512-8bI7GoxOPrIExt/32gxLDQJB5VdSp3Oi6fqA+GH0Lqj+ri8HKfl3S147GymTUfBh01IOymQNL7xX04Dq1Nbl6A== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-enter" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-enter" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-bookmark@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-bookmark/-/ckeditor5-bookmark-46.0.2.tgz#21fc328e4da97b8a72cd9e9bf13b1cc78e381273" - integrity sha512-qtWBf55fyogvgwR/ftHPT6paMtqWKs1nKMxFkJI2ZAYkd7R1E8YYDmZGNjzbYTCRf8NLxJn6bBc9FCwZUfSxeA== +"@ckeditor/ckeditor5-bookmark@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-bookmark/-/ckeditor5-bookmark-46.0.3.tgz#f597408d87746105ba5d7a80ce8a7f4fa32a7cb6" + integrity sha512-f1usHplw2Ndhm1AiyjWfOWoaSQehMqBaXTa94OXlvO6ci1RIijdFm+DKn4Lgh/vSjv4vo25eQReTmEM0KaysvA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-link" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-link" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-ckbox@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ckbox/-/ckeditor5-ckbox-46.0.2.tgz#9edef4293edc19dc7317ce9d378fa7fab633daf4" - integrity sha512-Q2oqIktjDFi8X2fCE9oELZH02USd4QDcPUShUPRnr/FWcUllx3nXDhz/O+i4bvSh6ckSQKyneRlDtIx11bDbuQ== +"@ckeditor/ckeditor5-ckbox@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ckbox/-/ckeditor5-ckbox-46.0.3.tgz#e0999969662c56bc768ac0ee7a4b09a3f6fefb82" + integrity sha512-UnmCqOU/iyYDef/OVsWbixeXwo+0pb3YGNWgmd2YsCFUUerbpOkDwwGuvCZPE7Hs34lNz8ybbhjR9KmGu8WcAw== dependencies: - "@ckeditor/ckeditor5-cloud-services" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-image" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-upload" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-cloud-services" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-image" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-upload" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" blurhash "2.0.5" - ckeditor5 "46.0.2" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-ckfinder@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-46.0.2.tgz#658d361a64460927681e18360f8b10bd6b3df7ae" - integrity sha512-TC2ZIm1klZ6ZGP1aSbgqiQ6E4fx74pCGqtX5zj+Uk3E3yD48Yr7Wg4dO3eeKcVanIM2MRzg2kr2pGJVlTPcjUw== +"@ckeditor/ckeditor5-ckfinder@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ckfinder/-/ckeditor5-ckfinder-46.0.3.tgz#f7a0c234be03f71229461668dc8a659f608ecdca" + integrity sha512-VXggqo2w0TgFPyu6z+uH3aTWQMhbq2F2iPUi8SreYCL0JclczbU4HDKqzQU+RKhrzp+yhK1n7ztX5aN1H9EVAw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-image" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-image" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-clipboard@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-46.0.2.tgz#04b87859a599afe2204dd208d4e43d0cc2205e7a" - integrity sha512-FL1Dy3CWRmdMrk31oCpYi9FZew3okXlfgkfLyjbXIgAdUiJ+b/9Tu2ZzR6fNjpAN6BYTiOjx5cDq8h8yMLUgwg== +"@ckeditor/ckeditor5-clipboard@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-clipboard/-/ckeditor5-clipboard-46.0.3.tgz#5a42799228875a8112c98fc61ad1ca050f42fca0" + integrity sha512-ECz2goSbYZSlhRT2HszIPCMWFfThA0uIuXpI5PjYj7rDJUoip/Y3/UZjyMo47IUFf66Y4VdvJoq0fv/Z86HYIg== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-cloud-services@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-46.0.2.tgz#edfca0c1c1661d3c0e6421a4aafcbbcb86a6c3f8" - integrity sha512-auY6i4FCrdUiRCOGPUnIEcISKQad7rUm2fkjWHtS89v9sWabDq6BWLyuAFH8HNGjb81csrwb6b2bzMAL7M1rng== +"@ckeditor/ckeditor5-cloud-services@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-cloud-services/-/ckeditor5-cloud-services-46.0.3.tgz#7c02822ed77a1b4d3e80c0f70b4b250c5e946945" + integrity sha512-eKmtcygKoAoba6LGKdsFQyU50yZeeFgD9k05HYnN4BZCqZjrmlTbo3mQrTREgM/w2yxQ4AkDVj162S9NOyibWA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-code-block@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-code-block/-/ckeditor5-code-block-46.0.2.tgz#c5018d9041228197d3796b558bf3e61827f506fe" - integrity sha512-ADNMDWSmlvrle0j9vNR5WMNyWjVn8t1TVILmLOab2T0/LTZcTzFXdz5i6I/oKhoxKty7soB8lmCUfJqrXNIhTw== +"@ckeditor/ckeditor5-code-block@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-code-block/-/ckeditor5-code-block-46.0.3.tgz#a8595063ce34da2a2095e89cf79be8b0532de056" + integrity sha512-5Bny1t2jb+Fruy4Tf0Es6YGPe24eWUiCskTv7QZkebEUtectUhZXjrbAPXkn9GQH9E+jU/ywhYkkCKwDgg+Vnw== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-enter" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-enter" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-core@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-core/-/ckeditor5-core-46.0.2.tgz#73b20ff36d4900605f4855fcd4cd0a5769027894" - integrity sha512-nXFO2hlmz6gkGzt2/C1yqxwxNqmHxvHy3npIiIuVHWE+e+Zx1BzJjjNEUoZ/K9+6IW0uybhidzGdpdwS6apfpg== +"@ckeditor/ckeditor5-core@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-core/-/ckeditor5-core-46.0.3.tgz#e9d294b517f646d6efdccecc8b3dc030feac7641" + integrity sha512-J03+XnTDL+Ex43ttT4fBxfJGRQxDor0zJc3TxlX44g0q7xD1l7T2CIkorry+817e3By3Qe3DfiMSleHKuDnmvQ== dependencies: - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-watchdog" "46.0.2" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-watchdog" "46.0.3" es-toolkit "1.39.5" "@ckeditor/ckeditor5-dev-translations@^43.0.1", "@ckeditor/ckeditor5-dev-translations@^43.1.0": @@ -1041,316 +1033,316 @@ terser-webpack-plugin "^4.2.3" through2 "^3.0.1" -"@ckeditor/ckeditor5-easy-image@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-46.0.2.tgz#2900e18d8a193fda3a6f7698e3db5d9438c1fc46" - integrity sha512-TjSbCEd8x31k4IlZZmEXA76LW9l1IGzq/bIBX4lLjSF+X30XYVqn9jYzJnPzZ73dNZ1mbzL4gzWO20TaCNyTuA== +"@ckeditor/ckeditor5-easy-image@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-easy-image/-/ckeditor5-easy-image-46.0.3.tgz#fbf72ea4524ded6b5aceacc41fa6f5e08672f7f3" + integrity sha512-UZs1G2wZaUr4lJSUsECBpM5ntr0UIXhGYG6lhE4Lf1TBaOypzxusR0H3txNtWIX1rq6hCeFH1P7meijfvJRgbw== dependencies: - "@ckeditor/ckeditor5-cloud-services" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-upload" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-cloud-services" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-upload" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-editor-balloon@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-balloon/-/ckeditor5-editor-balloon-46.0.2.tgz#dc0b0785aeb6e9266a205d255668aa0269a28207" - integrity sha512-ZZMFkZ1xP+O3JDFP03fsWZXrPbbzzV0ut2cyHvmTbvxsL8nWkByArbAyc4qs7ceF6wQ68PqLk1o+sPkEWHdVnw== +"@ckeditor/ckeditor5-editor-balloon@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-balloon/-/ckeditor5-editor-balloon-46.0.3.tgz#35382c0393babc1a5f3ec8acd9a0f68ebb56a291" + integrity sha512-NXqmQK45DybJmgWFUln2uTvWqg77BuTp/R/4F33K6fgA4QGmnlWZ+l96Z5Rpmq6Rxc7suBNIKKWRFihquHw1hw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-editor-classic@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-46.0.2.tgz#5bdb980fd5b1cf995c467279e1779307e5c1f52a" - integrity sha512-LTgCEyKapUURBZHZ2y5Z5nmPrl1zl8+kTiTgtpUOgZMQURq/G5BLxx5fdSyF2P0pZAoDYbrDR4uc2ngMH+6lgg== +"@ckeditor/ckeditor5-editor-classic@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-classic/-/ckeditor5-editor-classic-46.0.3.tgz#f872b541014dc24b3a3ff62331a785348ea3ae40" + integrity sha512-fw4pdBqT1UpVYkBBpACQn9w5iR2Y62AvGW7ANt6b1nv55+FIN0uEAHsuChvZdFra8iJQR1qyilT24LVOTtk5mg== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-editor-decoupled@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-decoupled/-/ckeditor5-editor-decoupled-46.0.2.tgz#2d3a3a0b0a831ac03a7a1969a9cbdc2a80597439" - integrity sha512-eunAH7bAC7Y0FkxK9ukecG2a7Jxm0NAXlaDIWBRBYmNOycUDnMjeD54Ax4udJ7SxJXiTFYYF6fUIZ/mQy/DHbQ== +"@ckeditor/ckeditor5-editor-decoupled@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-decoupled/-/ckeditor5-editor-decoupled-46.0.3.tgz#dae17ccb2d3fc3461fbe174b45590f9cde8748be" + integrity sha512-svrTpgGCi9YLhzit97i+A+lVStnQ4fNbGj6O1HlRG676BA20zqUkUWbNDPlBQT5sbq4N2oLKPwBmAqtUsF9ivQ== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-editor-inline@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-inline/-/ckeditor5-editor-inline-46.0.2.tgz#7fb1c9b1b5aad15612c56b179b91ad4564600e89" - integrity sha512-XYERPRnt/KNSje/AXpT0aCr6BLpSDAXaGil7edmuPL09oC+gGfjEzvCJDyDHbPCEwOTu684AHVvjiJNKJiJOTQ== +"@ckeditor/ckeditor5-editor-inline@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-inline/-/ckeditor5-editor-inline-46.0.3.tgz#31342902ec3ad3185cfaf8097d55f1086f8f63a6" + integrity sha512-VfsD95gALQrUMHRJ5f2KKIPgtRb5flAqug85GSWy+wJZXOv7dC953tc1v8PYtUOHV6R3k2SWOUAGUClRu2ijOQ== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-editor-multi-root@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-multi-root/-/ckeditor5-editor-multi-root-46.0.2.tgz#03f8d2bf50037c66cddb0ac52b18f4fe3be59c38" - integrity sha512-QUHS10vQ+9XqRfe/djzD6P4Q8rFav3ewXldW2D5trMpQ+d9HzpyyGnYOOHzM5P8VSpgXm1ma8lTuXtqeLnIhnw== +"@ckeditor/ckeditor5-editor-multi-root@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-editor-multi-root/-/ckeditor5-editor-multi-root-46.0.3.tgz#b9d9b4f62d5396e3597c24f6183ab92ea0512d52" + integrity sha512-mS9gd8zTCclstU5DROT5L3sVq6HSDk0jw/7d7bgKEvWbGvQ6iPiqcgZ+bzpyrtvXMQKnmgfytZpU9qfODLpwFA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-emoji@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-emoji/-/ckeditor5-emoji-46.0.2.tgz#e71825e85411b1de6d88503e12b6084d41adbdaa" - integrity sha512-ZxjWu2JxnvX8ZyMQpmJ5VpaoXXtWWJxiO6MNeWjL/tcZ2DhD6/lQye7CLuAOvW4P5WBwrGKDdnk+vx7GLO6NIA== +"@ckeditor/ckeditor5-emoji@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-emoji/-/ckeditor5-emoji-46.0.3.tgz#e129445b3a078b19268482b55dd769449922d636" + integrity sha512-XiQsDeIZdSRDuFz/eoH16L21+Ucxykt+qHvqHSXB6bnVE8A3+65fxXYXicXnlb8st6UYhVBGwd53cpRz1ljMww== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-mention" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-mention" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" fuzzysort "3.1.0" -"@ckeditor/ckeditor5-engine@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-46.0.2.tgz#4f215a5f729f6c43b7dca0c8034ae7e9e30036a3" - integrity sha512-KrOmMtfLON/5EFS7x8GgCTRfVE4rFniPCRfBPzNL6rA/eWOclLYvwUGHpI6+JAymZ5XzyPLb8ftn6KjG8vvC+w== +"@ckeditor/ckeditor5-engine@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-engine/-/ckeditor5-engine-46.0.3.tgz#a4d740ad4cd87aa5c2dedbf45bc60f8cad8f4823" + integrity sha512-U5BMV3pZTViU2ArsmmvfzqG1dt03laxgWtX8y2TtoEhaL+cNnT4N2cxj0StioeTbGAP3imkNKvVfRpRBhJIp/Q== dependencies: - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-utils" "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-enter@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-46.0.2.tgz#db3383f5310b8f2a22689abb96e882f2bd8b24a6" - integrity sha512-AZ+WhDEWDH4Ss6i7zd/YcuszlF5QKfkbGPQVsymsUziDvD/IuIQ1WtTDvLfdXbxGKI7amp9e1HCoilOJfv5uDw== +"@ckeditor/ckeditor5-enter@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-enter/-/ckeditor5-enter-46.0.3.tgz#d511f822b98644c8c3d614930184c7df845083c3" + integrity sha512-Z/IVe2Bn/PXamXxTlG9Pf/4K1OoGsNpwBfdywiqSYxdlF5E/4e5xArCKuFVkLGPO2YPSXShPhucBorqHlGQI2Q== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" -"@ckeditor/ckeditor5-essentials@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-46.0.2.tgz#f21b2b2033e71ddd28519c69d89b983bb5c02701" - integrity sha512-ckcjNJiT1KDfllMr6eiBO9t1GlQUELXotjvUW1H93+g87qvl2yFJa/WB7PCpFOc5Derq45/OQWGL5hjySAqGUA== +"@ckeditor/ckeditor5-essentials@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-essentials/-/ckeditor5-essentials-46.0.3.tgz#56a0b982fe52c8ba605773cfb2c3f0f901849bb3" + integrity sha512-lUk+AkDVXb0YXEbyw+14sA5vFtXoWA4i6026tyN8I9uShMIyyjzkVUtTX9a0AWp5j//sJ5Ke+wMS0QUFRDtj+Q== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-enter" "46.0.2" - "@ckeditor/ckeditor5-select-all" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-undo" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-enter" "46.0.3" + "@ckeditor/ckeditor5-select-all" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-undo" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-find-and-replace@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-find-and-replace/-/ckeditor5-find-and-replace-46.0.2.tgz#dbd32fd4f65e085f000631569911f83eb2d9502a" - integrity sha512-k/gAR69CxdjeBf7mrGKWswdsVrdXoHRjCR7RbnTJH+tgzPpbn1sZydD2UacqqC5hON088whTokDY3KFd6zdbXA== +"@ckeditor/ckeditor5-find-and-replace@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-find-and-replace/-/ckeditor5-find-and-replace-46.0.3.tgz#c2b4b617ea0c5009d5bbf5366865c52ed7721eab" + integrity sha512-WKJ32slfJKPE2xnOWtk8/kqaDlUE3AKXChmRw6fPXM9pRpBRItLrbMO4Lhic9F1V8UzzY88/6VMuTMUlVg7/pQ== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-font@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-font/-/ckeditor5-font-46.0.2.tgz#874dd5102cc0c6e9152e9d27d4895806bfea644c" - integrity sha512-dKkjRE8+GU6+LtQP45nQSEJkvnW1xltdpHZQrZCKXlf/51b2gBg408JtSBhqc1NOT5t1ZxaJCKHnf91dd6g4Hg== +"@ckeditor/ckeditor5-font@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-font/-/ckeditor5-font-46.0.3.tgz#2d7e6d27f6cc0841029fca64224ebeebd46963f7" + integrity sha512-4A0F3ShSn5QE0aQVus45EiIpFntJdXQnlf/kCLbQstYBUof915vReCa/c0cRu8q+1GOB9DmTarSPfb2jxDKhaA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-fullscreen@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-fullscreen/-/ckeditor5-fullscreen-46.0.2.tgz#86813dfebb92a2ed6fbc8e266adeb3d3aa247f22" - integrity sha512-G+w2c5PpKRa9e5mZKR333FKkS1BH5bwKnkc0Xw4p2fowdIaytyv73fmUk2oQMTWEEe8sMMNfXCe69sfRSm4FmA== +"@ckeditor/ckeditor5-fullscreen@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-fullscreen/-/ckeditor5-fullscreen-46.0.3.tgz#aaca7671cd65864924a23ac25a41990d1a0d5f31" + integrity sha512-+AjKdmknSeihgVytx2CZPvqJ8Iv0sQd8kP1AvTMsp7JWr9kP3eMZEWJ3IwUP7GaH9O+cSDqeW2pFY4rW1ajYlQ== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-editor-classic" "46.0.2" - "@ckeditor/ckeditor5-editor-decoupled" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-editor-classic" "46.0.3" + "@ckeditor/ckeditor5-editor-decoupled" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-heading@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-46.0.2.tgz#fdaf00bfc56f792a66060c7df9c0455486e4a5dd" - integrity sha512-AdvE53zuBGyuiBitaLPztWL/OyT3hG9F2kcdf1yG+RYovLXS6lG2Ut1tEL3jzmTNOoObWLQQ9Jpthj7gawXlQw== +"@ckeditor/ckeditor5-heading@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-heading/-/ckeditor5-heading-46.0.3.tgz#5d90467e9e4f082d8c8ec1dc3b31474b74e0c320" + integrity sha512-FKTgc1I9nDvnoDJ6RzkmPX7knhU3k6iH8IGUngH78TIOmhcWPVzv7Sftszos/LdX+kTc1ZoWWaHo5vrk90waZg== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-paragraph" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-paragraph" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-highlight@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-highlight/-/ckeditor5-highlight-46.0.2.tgz#71a95009de63164babe51df704a3bbaa8cd15130" - integrity sha512-wOLa7exXWaIObdFmXIWchgfDEUyk4+j2/B25NLXyYFhk+EVDOIA0le48Tq+nAM7cusA6PP4skwkUZCBOP31UIA== +"@ckeditor/ckeditor5-highlight@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-highlight/-/ckeditor5-highlight-46.0.3.tgz#c75991f017a039a500bec66e17e8a07ed8a44533" + integrity sha512-woO40tvOomrE7PHV/LAIOuNDb6sm2xiRQpT3r6TU1bvHZWSdt+hBCVRbnPxMNY2b/+0FGeV6cIOP8jlZ6JXF2g== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-horizontal-line@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-horizontal-line/-/ckeditor5-horizontal-line-46.0.2.tgz#65a6ed55eeee429c4f80377c38bc02a15c2b2ac3" - integrity sha512-TWpcU7xDQnqyKvvv30cYHy+57FTLEuNgUbKRs+ziP1Ywogd6X3jFVnmJk/WMCNc315v1IfDFiuaPbZn04zrmjA== +"@ckeditor/ckeditor5-horizontal-line@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-horizontal-line/-/ckeditor5-horizontal-line-46.0.3.tgz#c57556048fbb22221a347993e2ead695f05f730a" + integrity sha512-mct0XA6XxSk9BXorR5HA6jiDmf40Wm2HbwSEL8RcCQ4s/ak+3c85loUQZtV5Enaro8ejUkQ30nbqUnrO21Z8ZA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-html-embed@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-html-embed/-/ckeditor5-html-embed-46.0.2.tgz#cafad91a0f935ce83262c189f7b425decc6b8a3c" - integrity sha512-GJouBoKYKEP1NYrMSeu+vadP5vHsJgUBb/9yvx+kup/50u+HOylenBfVc+IdMMzZyU8ZoNw3wND5mgOpyQPLdQ== +"@ckeditor/ckeditor5-html-embed@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-html-embed/-/ckeditor5-html-embed-46.0.3.tgz#8153337107ea4ebd6cf98e8a67f57bcf5814272a" + integrity sha512-8Cf0L1REllrVffu4BrnNiga0mQgFcQ0V/L4ARMGR3vmafTvS2cOvMyrGJy/69oCGM0NigyU1eSzkGv04o+599w== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-html-support@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-html-support/-/ckeditor5-html-support-46.0.2.tgz#c07a5de1f2307e716606a6b2e89e72c986f880bb" - integrity sha512-DZAMx55Qxz7YQMy4qOCiNKf9oUp/FkAxqJRAG+102nweLQePq86w//oE6pc/mRo3q6U3/za8NLz6JP4L2duztw== +"@ckeditor/ckeditor5-html-support@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-html-support/-/ckeditor5-html-support-46.0.3.tgz#65164419632b679de09dd8040bf1d8ba837e7a51" + integrity sha512-zBRJ1aBIi/UKKRhCUvK0mTDu9c43GOINKscGJ4ZRAD8WmKdlpxO+xUfCfZouDMGwd67lD9e37LI3xZc+hGCXGA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-enter" "46.0.2" - "@ckeditor/ckeditor5-heading" "46.0.2" - "@ckeditor/ckeditor5-image" "46.0.2" - "@ckeditor/ckeditor5-list" "46.0.2" - "@ckeditor/ckeditor5-remove-format" "46.0.2" - "@ckeditor/ckeditor5-table" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-enter" "46.0.3" + "@ckeditor/ckeditor5-heading" "46.0.3" + "@ckeditor/ckeditor5-image" "46.0.3" + "@ckeditor/ckeditor5-list" "46.0.3" + "@ckeditor/ckeditor5-remove-format" "46.0.3" + "@ckeditor/ckeditor5-table" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-icons@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-icons/-/ckeditor5-icons-46.0.2.tgz#ef8994441f13c2d9bf33d8760e7093049d8ab0cc" - integrity sha512-QNLncoTeHgv4fU7Q/jv/qWH1nQMQ1JreWVQLysu1nEDlm4KiVLzP+8ng51BquY+wxw4rIVJTwZv1FYdyc6xlQw== +"@ckeditor/ckeditor5-icons@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-icons/-/ckeditor5-icons-46.0.3.tgz#fae5dec3826f5f4a6649fa01152d1aaa234a1d30" + integrity sha512-ztmFx8ujcdIMTWeIQ8Hxixlexfhx8vcclV/+maDzjVHhqRNi9eZ1b/nQ7gnS4/X5Fnh6cPQuCM+3lTUR4jQscA== -"@ckeditor/ckeditor5-image@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-image/-/ckeditor5-image-46.0.2.tgz#57d2d7e6118cf7eae5a535da0ffe9816d27fc2a3" - integrity sha512-1b72bijZ4lhysL6K9ZZBQZPldMUZwoAar4DFHmCnM/WN6psf/MEyFce+hr5Qq/LFOvCiOeevuNz6DTDKO7eXSg== +"@ckeditor/ckeditor5-image@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-image/-/ckeditor5-image-46.0.3.tgz#51814618fdb9ffe29217746cb28730dbf83911ab" + integrity sha512-9XcJVJxG+fqzwTupf7EATKeVZ+tXqeWiHLip4w/vMejjX026CPjiB3rKA2K5/H25TKDrvsMBBm22RqpK25dzCw== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-undo" "46.0.2" - "@ckeditor/ckeditor5-upload" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-undo" "46.0.3" + "@ckeditor/ckeditor5-upload" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-indent@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-46.0.2.tgz#b36f7ecaeec9be0ebdc2f2fef68fd4dc468a6034" - integrity sha512-EKA4kM3uZexI6j7GzQyDuYNwY0ULRet0+AZTYbr4rEaB+Mo2zaJCJxuJw1RPTNBwE/9fVJyqYsPzb0UmSRqsGQ== +"@ckeditor/ckeditor5-indent@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-indent/-/ckeditor5-indent-46.0.3.tgz#ee6a0279c9a09d2a8be0b43d3fb3aa48ec074417" + integrity sha512-XLdlp94Bitkki027adnOqL642kCSJphMoZZDYYpTNHQkKhJq6TDp8u66EFlo2/q1quVDgb1qlezDuShouYd1tQ== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-heading" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-list" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-heading" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-list" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-language@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-language/-/ckeditor5-language-46.0.2.tgz#518488ca4195a62809ac8945540ac46291892743" - integrity sha512-eYwRnEkoWGabEZ4PVtSobORa+vnUQFuRetInuhDrkBwyMv9IjVUukS46AWHEjkPBO/rlI++O9SK1oOFyzOARCg== +"@ckeditor/ckeditor5-language@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-language/-/ckeditor5-language-46.0.3.tgz#dad8aa2fa391c247001f2812a603234992c74dfa" + integrity sha512-JLkDnhZxP9J/Dw7uxJtBHYrdR1q2xpkIsi+Y0fhG0cejo6Lhfnv2F/1L76EO6JxhfhrkHWrDgLwr860PYvRztA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-link@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-link/-/ckeditor5-link-46.0.2.tgz#8b4a6f5fe3cd3028534116b1fb8fb2f00ea42bd5" - integrity sha512-5uliK3QCIOcEsq2bgZF5Qz88cmN0E1YXUrYc5uoqC8LF0lzOimE+EA+7/dJhBZCya8/+Y/rvvpJ8SHsjhd++kg== +"@ckeditor/ckeditor5-link@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-link/-/ckeditor5-link-46.0.3.tgz#383c13c5bfa08c36f7305abc17e6129174806cc2" + integrity sha512-s2wBD0QQ2Pz8wzTbh3YN83QbYRVbGp3qLwgN+8x7Y/bOuFE4AxR+JhDo14ekdXelXYxIeGJAqG2Z4SQj8v2rXQ== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-image" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-image" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-list@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-list/-/ckeditor5-list-46.0.2.tgz#5eae9c0376e50eeb8b6bdb9c16614d71922a13c9" - integrity sha512-0Pq5UU4SP9UOlcRhxpjCoGXfDxHeqdumn8qtNbL5X5yRGqRE4GsVgJ4CkOmtZNTy1JVv1clZ37NPKh5miqTP4A== +"@ckeditor/ckeditor5-list@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-list/-/ckeditor5-list-46.0.3.tgz#342a50f272b7079a3c0bc863d70855721d4c44bc" + integrity sha512-KEAnyhUO6hWWa3GO6NGS7Entn2OXutCQ2+od8l5MrqeGxmpnqj0OpPX6qn+RZTVWf1RnqwErCYQhhPoQM/mlZg== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-enter" "46.0.2" - "@ckeditor/ckeditor5-font" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-enter" "46.0.3" + "@ckeditor/ckeditor5-font" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-markdown-gfm@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-markdown-gfm/-/ckeditor5-markdown-gfm-46.0.2.tgz#a6e3312bbd7066f1d96e8f8a8f6eb8946c0f1542" - integrity sha512-+PaA5D10LnxqrsdW+UI45vqjR7C0l6vWAHFR+M99v7bxHEW+hQiLS6af8FhL/yv9Sno9AL4Oqdsee1HUU7hjHA== +"@ckeditor/ckeditor5-markdown-gfm@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-markdown-gfm/-/ckeditor5-markdown-gfm-46.0.3.tgz#f3c17385d7e6489e525632bff3d59166c5e6cf94" + integrity sha512-ROOQsKcb03UdzyWZOD4p6vPWUpjgBRf4VXgbxKds2z19dm3fOdUwFbolpVrmYuYzdHrI/0xWM/+waD7TEOatuQ== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" "@types/hast" "3.0.4" - ckeditor5 "46.0.2" + ckeditor5 "46.0.3" hast-util-from-dom "5.0.1" hast-util-to-html "9.0.5" hast-util-to-mdast "10.1.2" @@ -1366,271 +1358,271 @@ unified "11.0.5" unist-util-visit "5.0.0" -"@ckeditor/ckeditor5-media-embed@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-46.0.2.tgz#4b700713621a02ff6abaa9e84fa1b36438be57ec" - integrity sha512-HQqtmuZPGvMKvshVIkz9GQvnSxuvsuw1o99zHvkr73H2OpL2uRRgCwVLufKZpIsn6CMtNbWq9PlZxk6ZME6Nyg== +"@ckeditor/ckeditor5-media-embed@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-media-embed/-/ckeditor5-media-embed-46.0.3.tgz#5efb29e50888bae4b38a1fdb79572bad2bed930a" + integrity sha512-aozP4L8WQuPOHBA5qXTQnH3kQrhFJd6/J5KjKl5EicR6MUqeDkvzSLxYnltUBPByoDvkNxHD/GIL8nevgeWCrQ== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-undo" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-undo" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-mention@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-mention/-/ckeditor5-mention-46.0.2.tgz#1ced5689dd81b3b3d9d5f64da895cd540c636aa6" - integrity sha512-/2FT0TmXyxgO5CWg841Yy5PF0uGT4mmp8NQYPpamfgP6E236L/aOTJP4kHtZV5uOSEnt6P48N59MTXswXA3Glg== +"@ckeditor/ckeditor5-mention@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-mention/-/ckeditor5-mention-46.0.3.tgz#42f2e38b6404650f2d8a09392d8069832269ccf4" + integrity sha512-a7sHtN8M5Glh20SbsB0KWlFxoothUwkq6cqNJKKAI6MrOYsOJX1WaMG2mUfhGr4VTrUieuJYxVtqMFuagbhBgQ== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-minimap@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-minimap/-/ckeditor5-minimap-46.0.2.tgz#0eee763bcf39b475db97abf09fcf66378e2a0342" - integrity sha512-Hi0qLjWLgGSwT1u3BlDc5tXMA5eHsDm6L9Sv+LiyxPFPBgX/HQhWT6L6x4jIexHQLlDhBO5o/Hp3tnlW57K5Kg== +"@ckeditor/ckeditor5-minimap@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-minimap/-/ckeditor5-minimap-46.0.3.tgz#ba170968a44a87557319ea6efcf97eb3d8923e3a" + integrity sha512-gsac1z96MaJMFzapfzqLtEqETpI3JVXMfdQV3N0+kRbFSlUeJmrR/aHLC/+GDQAttkfOuL9i4FlWQKiDeSN15w== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-page-break@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-page-break/-/ckeditor5-page-break-46.0.2.tgz#8a7303490fe884a69a3026852671b37a046d5f84" - integrity sha512-8wSzQU0lwoqzMPFyZHYVJJRTc1GA5gwgtz7XVKKHtKRF9FsKmHYASHsEsjjX3TkU0dPTGnaqsttZ7mBGU9K9Ww== +"@ckeditor/ckeditor5-page-break@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-page-break/-/ckeditor5-page-break-46.0.3.tgz#c0fece6af88c11cddfc600e849ec04b11390c872" + integrity sha512-6V0O0sqgZMh47knEhhj0htWK3Oxm6jfHLWA4vi9vColwJMv9imuP72vYgrClmKHfN/QtyZ+DGmaufmhaXS2ffw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-paragraph@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-46.0.2.tgz#760280a3596a08466186021a60632c931821c2ba" - integrity sha512-Mg4BxYvIzonlLe9zzFZTyiiMbW40NLue9G26lWaCUz+O2z8ms5CShNc065t4alJiihJis5Dtuho8tvPDiRgCNg== +"@ckeditor/ckeditor5-paragraph@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paragraph/-/ckeditor5-paragraph-46.0.3.tgz#c6ee4808048c0c2a23450ab7438bc9dc5d140f4a" + integrity sha512-3OlCeyykkhcueXmo+p/LppeCvC2TtEpljLpC042EbIOCJEbSMlYEGx/AJQGetn2JV8q9L3UKfgnltpOriXAeyg== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" -"@ckeditor/ckeditor5-paste-from-office@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-46.0.2.tgz#26534e6b080f00c1305e293411ea674e60dfd07d" - integrity sha512-eI08nXazXzdIBxKjiU7tANFAdqz1cb5+xRdzn6dmZj0QBLHdEMWZVLLng5XC2gPqB7V3gSA0XbuYeSLF6fTfQg== +"@ckeditor/ckeditor5-paste-from-office@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-paste-from-office/-/ckeditor5-paste-from-office-46.0.3.tgz#79de54d4cdec9531f254256d8e4d251aa02f6d38" + integrity sha512-pgqBTqP3oIFbmHvk1ddICDmyvBvFE9d+jO0busPXl5oWIqTLaaumwWaredEEUJpYmu02POSrK+WPGS0Qis6mdg== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-remove-format@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-remove-format/-/ckeditor5-remove-format-46.0.2.tgz#804850404632c21ef63b3c75007309e5959e8c5c" - integrity sha512-/Ez72jjpnvDqFtP4afNimyrqbt3xJn/ab7p4DoByqyuBJ/Wy7mkaRcw9dDO0oJB+GVWdcGeRWeYoFUYj3Yw0NQ== +"@ckeditor/ckeditor5-remove-format@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-remove-format/-/ckeditor5-remove-format-46.0.3.tgz#9f73003093a2958f32baffda6024f07b557f28ef" + integrity sha512-rrGeK1NGE5o04/wuyMq10BD7bJ7qkVZq74dDXb7G6l1IkFWU/lY5SLt1K4FgVunY+oBcsena+hktwqgEsmEqdg== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-restricted-editing@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-restricted-editing/-/ckeditor5-restricted-editing-46.0.2.tgz#0e23d6aa6978ff9c554ab109975608b26518b0db" - integrity sha512-WR8HciP0DcD1TB+i8zRVwroPMiCy9Z7m0kfirCSLmwWP8bn792XwU+kId9DrOWalNzfNh4BXoviaPpi0vtRcmA== +"@ckeditor/ckeditor5-restricted-editing@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-restricted-editing/-/ckeditor5-restricted-editing-46.0.3.tgz#52b32ac9c9ecfcfa12266e313b62936dcb75a1bc" + integrity sha512-b1NUb7nEKdb0R5UOukXRXOeweOIE3Dsa64uwV/H6ZnRfdOmH37TVSKFJ2lWVvPUUljsT3SVdSZbl1aP4aA1SBA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-select-all@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-46.0.2.tgz#d7c3ebcfe0a3e4f8e181f26a26cc21b48cfe1167" - integrity sha512-qC+HAZ0BWO4daXkZ84dAu7ynMRJfhtcnUP8pR/o2D6VxJO7Cu+5MwtwfoLmSiJAUGYwcxVd/iFq3RP7ZxS4Rew== +"@ckeditor/ckeditor5-select-all@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-select-all/-/ckeditor5-select-all-46.0.3.tgz#a785a8cf89ddefb07e9cc9adc02844667bc02bd6" + integrity sha512-Uxr3/+TRLUIOGubXo/86yzqLGgoEdPV2rGqz40ulrVhG1Q7hOYerJPDs67ULPq6DLukoFFARRTah+UN9EOYRRw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" -"@ckeditor/ckeditor5-show-blocks@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-show-blocks/-/ckeditor5-show-blocks-46.0.2.tgz#d3e0ffd6a9184519b711d0b469a53f3f552b5fdb" - integrity sha512-J+C59BMbnAH4gPrkUlu/dccKR2NBUqrRIFa01hnDHk+ECYeJsBNlsENNPImxeay4hiF+p4cujhQnI8Xq1NkzQQ== +"@ckeditor/ckeditor5-show-blocks@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-show-blocks/-/ckeditor5-show-blocks-46.0.3.tgz#a912926c7102797426040a1bc36b73dcd380fbe5" + integrity sha512-YSa+Q49hQe4oRxIFsnUjzIFRG1M5+2vWjzYwS84hQAR0xDMZDD0SqIS6poC3QewuIS/525bcnmASBwXZUrRdIA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-source-editing@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-source-editing/-/ckeditor5-source-editing-46.0.2.tgz#7164812ce5b24c92cde99e0ffb1bec171fd66c44" - integrity sha512-UdQELANPxAMhbbKTBCOfm/dMtqgQpMcU0D58LKjvvOT35ZGyjlrvZCKmXweFtfLPK5SmQhlS9z5/yy9JIH3pVQ== +"@ckeditor/ckeditor5-source-editing@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-source-editing/-/ckeditor5-source-editing-46.0.3.tgz#ea664512ecd36ec5a32f5ee7f7bbd48e69e279c1" + integrity sha512-zJMa7ekyaeQAqAysFZDRwPRyJ7+ejaP2twYvRJQARf/BgZ6YZdSDvSoW1gGIKN/c/f0XWOSTDBdRCciPZu9vCg== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-theme-lark" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-theme-lark" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-special-characters@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-special-characters/-/ckeditor5-special-characters-46.0.2.tgz#0b490d77bda1f8e1c8f3da87699c154cd4de1c40" - integrity sha512-X3XuIAchgFxmKcWcc513vzzsMcN6eOPOzQlQtVr9NKgUd/Zvw7YTyxCP1Wj2w9usgLn57p2ame/7GlBt/P1quw== +"@ckeditor/ckeditor5-special-characters@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-special-characters/-/ckeditor5-special-characters-46.0.3.tgz#94b62a510608b47247c243fe12762fdfcdb1d4b4" + integrity sha512-PihS9/nmrGXaycsI3TSqVK0qGlc2ZSE3XzL7dEKTCyUta7vvI7hCC/jDaTtfch2d0fZhnIXovlgqlj35u2PjDw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" -"@ckeditor/ckeditor5-style@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-style/-/ckeditor5-style-46.0.2.tgz#23c964ede8de1715b942bc4399173100958f416c" - integrity sha512-LeP6kV0AeY1mrv6hbuQ2s10AEoJ64Vgv7XMAieg/fYE2/CIH0GAXE9/4Xt1+X8zCEddZ0HcbKCyCJG2l20xzyQ== +"@ckeditor/ckeditor5-style@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-style/-/ckeditor5-style-46.0.3.tgz#d1c75502c27cfd717a93f238b702432e48a5b02b" + integrity sha512-/4kOCM0/s4O65AA6tHdTK9joPFaTs/Uk14RHlyGP6+QJQ5FcNx9g2yJ1HxhRAdkMLy3AsVol9lqqFXC00+W7BA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-html-support" "46.0.2" - "@ckeditor/ckeditor5-list" "46.0.2" - "@ckeditor/ckeditor5-table" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-html-support" "46.0.3" + "@ckeditor/ckeditor5-list" "46.0.3" + "@ckeditor/ckeditor5-table" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-table@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-table/-/ckeditor5-table-46.0.2.tgz#a941a45394b3b8d5472861f98ce37dc2e67528b2" - integrity sha512-dGkTe1vEk7iDEmoRCTQszyerXvO5hrJH702kwHV5md2dlXyyJBteAJ9qHiSxf1euC2mOMMUhq7n5DlqpFAFb8A== +"@ckeditor/ckeditor5-table@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-table/-/ckeditor5-table-46.0.3.tgz#39bf048644c3fcc6a9747233b54803bcd86925fe" + integrity sha512-Bt7d02s96cv28Xc+LxNRYBNrqlG7gI5xB8gjQWCuoIYHVikxtDUSBowu7q1UOkBmX/TEHuUpnYjUdBKD5M2n5w== dependencies: - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-theme-lark@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-46.0.2.tgz#b87718cc592dbaf4063319ef7fd2b080df42dbe0" - integrity sha512-sHhwOZVg0e3SHm6caeHP67VlKojtoqxiu6oCwFduC+hK4s3OhQ3J/v+FIs7wGeFPz4ReBMAp63LNJVVcllRw+g== +"@ckeditor/ckeditor5-theme-lark@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-theme-lark/-/ckeditor5-theme-lark-46.0.3.tgz#3707200acb4da4a8ba2a2afadb20a8b1bc0a9edb" + integrity sha512-0w4fwXFExlcsDsPXgNrQz86WJWCUwIYJkcRbjL+K3fMRYBPGVoBO25OHL7tPy2rYvrnZindCJXW9w8FzKSsKhA== dependencies: - "@ckeditor/ckeditor5-ui" "46.0.2" + "@ckeditor/ckeditor5-ui" "46.0.3" -"@ckeditor/ckeditor5-typing@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-46.0.2.tgz#4fb72c79f084ab96c297898857289823f3c7707b" - integrity sha512-jYrsRmE1rZ6c8jtOWVm6Q3FpIT9HWdJg6fK453w4upkjWM7lH3kXxtPgSLmEATUyO/ON91VNXEGA+LGml2MHnw== +"@ckeditor/ckeditor5-typing@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-typing/-/ckeditor5-typing-46.0.3.tgz#449eb12d2916b8d6ffe026ee19a823cbeda1b460" + integrity sha512-iyxTTWIJ1/DpjCk+Uca9bE8P+Q7nvMssustEoMd6b3n39McCxnnonW7hrLUjFsRf/lPuvcAhpvFApoy2cbBRZA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-ui@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-46.0.2.tgz#d2bc6a2cbf8f557749ced031239db1f35a5f0867" - integrity sha512-c0Emy60YDY0EZl8nLPNaFoEA60cxQvfz8cD9uK7MYw9L5s4xSi+m0Nd0P2BR8gK/dfRnwiBnUyLDcu4yPMN1hw== +"@ckeditor/ckeditor5-ui@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-ui/-/ckeditor5-ui-46.0.3.tgz#58d03f07402245ee92a9e6caad84f8a36e7770d4" + integrity sha512-5sRd7/IxWI+jL8N8CO5n35AwM5ofMieFLjvhtdzmkZsHl2hNHMHyfjERlOynp6tkX3TlelJBokqpAO7Yu+DrHA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-editor-multi-root" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-editor-multi-root" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" "@types/color-convert" "2.0.4" color-convert "3.1.0" color-parse "2.0.2" es-toolkit "1.39.5" vanilla-colorful "0.7.2" -"@ckeditor/ckeditor5-undo@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-46.0.2.tgz#94dddf6887e2d0b931aa739a52a015446b73a8d2" - integrity sha512-IOFL9rrYvk2KcNyFK9YPOENM3H7RRqtBNNmj9A9zntpqsoq+8QKqcY5BpcDeODrkOtmbrhwDwcwcek7uqI3S5g== +"@ckeditor/ckeditor5-undo@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-undo/-/ckeditor5-undo-46.0.3.tgz#0aa086fb2df862451e525dd9f24bfd34410a2bfc" + integrity sha512-DnSBUIVOpARMDOtMrwvAOYAMZK263ubGLp48N4Yb4bpbE9VwH9KUaTNP1aRRE36wQ46KaPYiROqhnnq+RaemLQ== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" -"@ckeditor/ckeditor5-upload@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-46.0.2.tgz#3b1ab782e15b960df563daa4d5eb77a0ebb03df5" - integrity sha512-34lQ7Cx+/hiHAsY3yL+mwbD2Y1QPsqdr9VdgQU8McfwQNSh/PHBa5WplIMsdMRym8pEicj50nsli/hVl58FsZg== +"@ckeditor/ckeditor5-upload@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-upload/-/ckeditor5-upload-46.0.3.tgz#8437e5d17db98a2c2e646f0b06e5c8941dba2b57" + integrity sha512-VfC3KG1fIaXQkzQRjIlt3b+G44DPj39jD9I5cepLN/xXsHU/EAUcJWXScsd/GlViSDR0DUDCygWyhIIbF/Vobw== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" -"@ckeditor/ckeditor5-utils@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-46.0.2.tgz#de4dff172d999b5cff5764092839f15e813ea03a" - integrity sha512-7t9PAZurES75Nz7ICadfRoGT5SbXnbxu6L5PoAxmyIGFPKICdZ6I4mVILVraPSNwgFDm/Zg2RxmiCOMWFTlxMg== +"@ckeditor/ckeditor5-utils@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-utils/-/ckeditor5-utils-46.0.3.tgz#58831c99d3834b17146ea2a3d06d93fab932a1e2" + integrity sha512-z+4EI8IOSJpDzKdRSw0KHmLK3LMwYeZ9R207oQzswqlbvhYcUib3HhfMlwhE6pyAGYTofpZQ2btHEOaLPRCTDQ== dependencies: - "@ckeditor/ckeditor5-ui" "46.0.2" + "@ckeditor/ckeditor5-ui" "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-watchdog@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-46.0.2.tgz#ad14a7a2afe04d2e80f8ff294ade8951d1fd1815" - integrity sha512-QaXczfT5WgyteNVzbYWhZ0SBLQj/qXXRefMq0v1mpI9Iro44iMV7XmvOWhTVsskwTuNq32a1C5zMzfW0Ax69rQ== +"@ckeditor/ckeditor5-watchdog@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-watchdog/-/ckeditor5-watchdog-46.0.3.tgz#78a6430ce6b9db0c8c0fcf5d5a2a539869ed7b29" + integrity sha512-TcSM3n9bsJ+Rpzc7NFN2BdobxXAnRJ52n0XY8CeVYZ0VA61GtG/zINH+OdEUORcpqKylH4F1ftyNEwf6cdUbPA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-editor-multi-root" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-editor-multi-root" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-widget@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-46.0.2.tgz#e84edc5f2bc477d31b6eb639949511656fba8647" - integrity sha512-uBcYwT7vTKCyuMXZIi0Qbs3neBQQp1sFFb/ClsX0elbh3UZEoVyr13uZIgl1+TrnVZa0scICJfWLbaiRHjVTXg== +"@ckeditor/ckeditor5-widget@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-widget/-/ckeditor5-widget-46.0.3.tgz#4fda5f828f7a35e6d8b80b186d053b140cd1b5da" + integrity sha512-h5+KbQslzDVWntJQYCkSIj0huJSvE/lkjWTVCsbo2wmbKg6jusP+1oQ5ENtd7Nz4bpJlT83UkKDslSrF23xKlA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-enter" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-enter" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" es-toolkit "1.39.5" -"@ckeditor/ckeditor5-word-count@46.0.2": - version "46.0.2" - resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-word-count/-/ckeditor5-word-count-46.0.2.tgz#5ad88e49ea96294dbd3dcc3ed9e19023c433dd49" - integrity sha512-U2b1DTchEE75ndHmDMmV3y/NXFFx9yIoSYzupsPJywKVTdBFdDZvSnulEocuP/YCgWTA1VWTiAirRTmccII/Qw== +"@ckeditor/ckeditor5-word-count@46.0.3": + version "46.0.3" + resolved "https://registry.yarnpkg.com/@ckeditor/ckeditor5-word-count/-/ckeditor5-word-count-46.0.3.tgz#d0ffdb77e907f2eb913dade822a3b32b06194065" + integrity sha512-Qobva/b/79t4hD6ZgWsBT3PgGIFXU2dZW62kFDJNVkGpq1pkKboIdq7Iu57OffLDJaV+xkAmEvV6cIDWc4KADA== dependencies: - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - ckeditor5 "46.0.2" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + ckeditor5 "46.0.3" es-toolkit "1.39.5" "@csstools/selector-resolve-nested@^3.1.0": @@ -1838,9 +1830,9 @@ tslib "^2.8.0" "@fortawesome/fontawesome-free@^7.0.0": - version "7.0.0" - resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.0.0.tgz#e4a6788a2d395ea97e7812a096e29bf9c95b944c" - integrity sha512-X48nISrSOa89zu2VMljC4XaRf8NmgTwQBVHfS2Nu5G00ZwM31oOVrAtGxZF3b6wDYf9lJsf/Eq4cCSFKIkOWPQ== + version "7.0.1" + resolved "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-7.0.1.tgz#c1ac7f07ba2df47d1de7b7236fad25c4e6ca5076" + integrity sha512-RLmb9U6H2rJDnGxEqXxzy7ANPrQz7WK2/eTjdZqyU9uRU5W+FkAec9uU5gTYzFBH7aoXIw2WTJSCJR4KPlReQw== "@gar/promisify@^1.0.1": version "1.1.3" @@ -1906,6 +1898,14 @@ "@jridgewell/sourcemap-codec" "^1.5.0" "@jridgewell/trace-mapping" "^0.3.24" +"@jridgewell/remapping@^2.3.5": + version "2.3.5" + resolved "https://registry.yarnpkg.com/@jridgewell/remapping/-/remapping-2.3.5.tgz#375c476d1972947851ba1e15ae8f123047445aa1" + integrity sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ== + dependencies: + "@jridgewell/gen-mapping" "^0.3.5" + "@jridgewell/trace-mapping" "^0.3.24" + "@jridgewell/resolve-uri@^3.1.0": version "3.1.2" resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6" @@ -2076,9 +2076,9 @@ "@types/ms" "*" "@types/emscripten@^1.40.1": - version "1.40.1" - resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.40.1.tgz#4c34102d7cd1503979d4e6652082c23fd805805e" - integrity sha512-sr53lnYkQNhjHNN0oJDdUm5564biioI5DuOpycufDVK7D3y+GR3oUswe2rlwY1nPNyusHbrJ9WoTyIHl4/Bpwg== + version "1.41.1" + resolved "https://registry.yarnpkg.com/@types/emscripten/-/emscripten-1.41.1.tgz#318cc5f22c0108f62fe0ede8ef8c7aee38d6b43a" + integrity sha512-vW2aEgBUU1c2CB+qVMislA98amRVPszdALjqNCuUIJaEFZsNaFaM4g5IMXIs+6oHbmmb7q6zeXYubhtObJ9ZLg== "@types/eslint-scope@^3.7.7": version "3.7.7" @@ -2160,9 +2160,9 @@ integrity sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA== "@types/node@*": - version "24.3.0" - resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.0.tgz#89b09f45cb9a8ee69466f18ee5864e4c3eb84dec" - integrity sha512-aPTXCrfwnDLj4VvXrm+UUCQjNEvJgNA8s5F1cvwQU+3KNltTOkBm1j30uNLyqqPNe7gE3KFzImYoZEfLhp4Yow== + version "24.3.1" + resolved "https://registry.yarnpkg.com/@types/node/-/node-24.3.1.tgz#b0a3fb2afed0ef98e8d7f06d46ef6349047709f3" + integrity sha512-3vXmQDXy+woz+gnrTvuvNrPzekOi+Ds0ReMxw0LzBiK3a+1k0kQn9f2NWk+lgD4rJehFUmYy2gMhJ2ZI+7YP9g== dependencies: undici-types "~7.10.0" @@ -2393,7 +2393,7 @@ acorn-walk@^8.0.0: dependencies: acorn "^8.11.0" -acorn@^8.0.4, acorn@^8.11.0, acorn@^8.14.0, acorn@^8.15.0: +acorn@^8.0.4, acorn@^8.11.0, acorn@^8.15.0: version "8.15.0" resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.15.0.tgz#a360898bc415edaac46c8241f6383975b930b816" integrity sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg== @@ -2770,9 +2770,9 @@ caniuse-api@^3.0.0: lodash.uniq "^4.5.0" caniuse-lite@^1.0.0, caniuse-lite@^1.0.30001737: - version "1.0.30001737" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001737.tgz#8292bb7591932ff09e9a765f12fdf5629a241ccc" - integrity sha512-BiloLiXtQNrY5UyF0+1nSJLXUENuhka2pzy2Fx5pGxqavdrxSCW4U6Pn/PoG3Efspi2frRbHpBV2XsrPE6EDlw== + version "1.0.30001741" + resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001741.tgz#67fb92953edc536442f3c9da74320774aa523143" + integrity sha512-QGUGitqsc8ARjLdgAfxETDhRbJ0REsP6O3I96TAth/mVjh2cYzN2u+3AzPP3aVSm2FehEItaJw1xd+IGBXWeSw== ccount@^2.0.0: version "2.0.1" @@ -2849,72 +2849,72 @@ ci-info@^3.2.0: resolved "https://registry.yarnpkg.com/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -ckeditor5@46.0.2, ckeditor5@^46.0.0: - version "46.0.2" - resolved "https://registry.yarnpkg.com/ckeditor5/-/ckeditor5-46.0.2.tgz#da85d11dc56a3cbac8599ae334f05854cedfbe8f" - integrity sha512-Ly+pG/OkF+9P7DaaaCp+VYJOm0+flxLR3Ue1thm10JnMvOW52XXYaRyoasAXoiGz6CC4lh0ZN7AtQSWu85oj3g== +ckeditor5@46.0.3, ckeditor5@^46.0.0: + version "46.0.3" + resolved "https://registry.yarnpkg.com/ckeditor5/-/ckeditor5-46.0.3.tgz#aa1f52ad6542e90aa4b720e592012c979e8b8194" + integrity sha512-BGadZ1td6emWnNVbX40nygpxZMAYQvtC/wRhdhedJpjqmwXQmwLte9Y9RZg+lnomrEiLiaxzFsz1j4I6u2fBnA== dependencies: - "@ckeditor/ckeditor5-adapter-ckfinder" "46.0.2" - "@ckeditor/ckeditor5-alignment" "46.0.2" - "@ckeditor/ckeditor5-autoformat" "46.0.2" - "@ckeditor/ckeditor5-autosave" "46.0.2" - "@ckeditor/ckeditor5-basic-styles" "46.0.2" - "@ckeditor/ckeditor5-block-quote" "46.0.2" - "@ckeditor/ckeditor5-bookmark" "46.0.2" - "@ckeditor/ckeditor5-ckbox" "46.0.2" - "@ckeditor/ckeditor5-ckfinder" "46.0.2" - "@ckeditor/ckeditor5-clipboard" "46.0.2" - "@ckeditor/ckeditor5-cloud-services" "46.0.2" - "@ckeditor/ckeditor5-code-block" "46.0.2" - "@ckeditor/ckeditor5-core" "46.0.2" - "@ckeditor/ckeditor5-easy-image" "46.0.2" - "@ckeditor/ckeditor5-editor-balloon" "46.0.2" - "@ckeditor/ckeditor5-editor-classic" "46.0.2" - "@ckeditor/ckeditor5-editor-decoupled" "46.0.2" - "@ckeditor/ckeditor5-editor-inline" "46.0.2" - "@ckeditor/ckeditor5-editor-multi-root" "46.0.2" - "@ckeditor/ckeditor5-emoji" "46.0.2" - "@ckeditor/ckeditor5-engine" "46.0.2" - "@ckeditor/ckeditor5-enter" "46.0.2" - "@ckeditor/ckeditor5-essentials" "46.0.2" - "@ckeditor/ckeditor5-find-and-replace" "46.0.2" - "@ckeditor/ckeditor5-font" "46.0.2" - "@ckeditor/ckeditor5-fullscreen" "46.0.2" - "@ckeditor/ckeditor5-heading" "46.0.2" - "@ckeditor/ckeditor5-highlight" "46.0.2" - "@ckeditor/ckeditor5-horizontal-line" "46.0.2" - "@ckeditor/ckeditor5-html-embed" "46.0.2" - "@ckeditor/ckeditor5-html-support" "46.0.2" - "@ckeditor/ckeditor5-icons" "46.0.2" - "@ckeditor/ckeditor5-image" "46.0.2" - "@ckeditor/ckeditor5-indent" "46.0.2" - "@ckeditor/ckeditor5-language" "46.0.2" - "@ckeditor/ckeditor5-link" "46.0.2" - "@ckeditor/ckeditor5-list" "46.0.2" - "@ckeditor/ckeditor5-markdown-gfm" "46.0.2" - "@ckeditor/ckeditor5-media-embed" "46.0.2" - "@ckeditor/ckeditor5-mention" "46.0.2" - "@ckeditor/ckeditor5-minimap" "46.0.2" - "@ckeditor/ckeditor5-page-break" "46.0.2" - "@ckeditor/ckeditor5-paragraph" "46.0.2" - "@ckeditor/ckeditor5-paste-from-office" "46.0.2" - "@ckeditor/ckeditor5-remove-format" "46.0.2" - "@ckeditor/ckeditor5-restricted-editing" "46.0.2" - "@ckeditor/ckeditor5-select-all" "46.0.2" - "@ckeditor/ckeditor5-show-blocks" "46.0.2" - "@ckeditor/ckeditor5-source-editing" "46.0.2" - "@ckeditor/ckeditor5-special-characters" "46.0.2" - "@ckeditor/ckeditor5-style" "46.0.2" - "@ckeditor/ckeditor5-table" "46.0.2" - "@ckeditor/ckeditor5-theme-lark" "46.0.2" - "@ckeditor/ckeditor5-typing" "46.0.2" - "@ckeditor/ckeditor5-ui" "46.0.2" - "@ckeditor/ckeditor5-undo" "46.0.2" - "@ckeditor/ckeditor5-upload" "46.0.2" - "@ckeditor/ckeditor5-utils" "46.0.2" - "@ckeditor/ckeditor5-watchdog" "46.0.2" - "@ckeditor/ckeditor5-widget" "46.0.2" - "@ckeditor/ckeditor5-word-count" "46.0.2" + "@ckeditor/ckeditor5-adapter-ckfinder" "46.0.3" + "@ckeditor/ckeditor5-alignment" "46.0.3" + "@ckeditor/ckeditor5-autoformat" "46.0.3" + "@ckeditor/ckeditor5-autosave" "46.0.3" + "@ckeditor/ckeditor5-basic-styles" "46.0.3" + "@ckeditor/ckeditor5-block-quote" "46.0.3" + "@ckeditor/ckeditor5-bookmark" "46.0.3" + "@ckeditor/ckeditor5-ckbox" "46.0.3" + "@ckeditor/ckeditor5-ckfinder" "46.0.3" + "@ckeditor/ckeditor5-clipboard" "46.0.3" + "@ckeditor/ckeditor5-cloud-services" "46.0.3" + "@ckeditor/ckeditor5-code-block" "46.0.3" + "@ckeditor/ckeditor5-core" "46.0.3" + "@ckeditor/ckeditor5-easy-image" "46.0.3" + "@ckeditor/ckeditor5-editor-balloon" "46.0.3" + "@ckeditor/ckeditor5-editor-classic" "46.0.3" + "@ckeditor/ckeditor5-editor-decoupled" "46.0.3" + "@ckeditor/ckeditor5-editor-inline" "46.0.3" + "@ckeditor/ckeditor5-editor-multi-root" "46.0.3" + "@ckeditor/ckeditor5-emoji" "46.0.3" + "@ckeditor/ckeditor5-engine" "46.0.3" + "@ckeditor/ckeditor5-enter" "46.0.3" + "@ckeditor/ckeditor5-essentials" "46.0.3" + "@ckeditor/ckeditor5-find-and-replace" "46.0.3" + "@ckeditor/ckeditor5-font" "46.0.3" + "@ckeditor/ckeditor5-fullscreen" "46.0.3" + "@ckeditor/ckeditor5-heading" "46.0.3" + "@ckeditor/ckeditor5-highlight" "46.0.3" + "@ckeditor/ckeditor5-horizontal-line" "46.0.3" + "@ckeditor/ckeditor5-html-embed" "46.0.3" + "@ckeditor/ckeditor5-html-support" "46.0.3" + "@ckeditor/ckeditor5-icons" "46.0.3" + "@ckeditor/ckeditor5-image" "46.0.3" + "@ckeditor/ckeditor5-indent" "46.0.3" + "@ckeditor/ckeditor5-language" "46.0.3" + "@ckeditor/ckeditor5-link" "46.0.3" + "@ckeditor/ckeditor5-list" "46.0.3" + "@ckeditor/ckeditor5-markdown-gfm" "46.0.3" + "@ckeditor/ckeditor5-media-embed" "46.0.3" + "@ckeditor/ckeditor5-mention" "46.0.3" + "@ckeditor/ckeditor5-minimap" "46.0.3" + "@ckeditor/ckeditor5-page-break" "46.0.3" + "@ckeditor/ckeditor5-paragraph" "46.0.3" + "@ckeditor/ckeditor5-paste-from-office" "46.0.3" + "@ckeditor/ckeditor5-remove-format" "46.0.3" + "@ckeditor/ckeditor5-restricted-editing" "46.0.3" + "@ckeditor/ckeditor5-select-all" "46.0.3" + "@ckeditor/ckeditor5-show-blocks" "46.0.3" + "@ckeditor/ckeditor5-source-editing" "46.0.3" + "@ckeditor/ckeditor5-special-characters" "46.0.3" + "@ckeditor/ckeditor5-style" "46.0.3" + "@ckeditor/ckeditor5-table" "46.0.3" + "@ckeditor/ckeditor5-theme-lark" "46.0.3" + "@ckeditor/ckeditor5-typing" "46.0.3" + "@ckeditor/ckeditor5-ui" "46.0.3" + "@ckeditor/ckeditor5-undo" "46.0.3" + "@ckeditor/ckeditor5-upload" "46.0.3" + "@ckeditor/ckeditor5-utils" "46.0.3" + "@ckeditor/ckeditor5-watchdog" "46.0.3" + "@ckeditor/ckeditor5-widget" "46.0.3" + "@ckeditor/ckeditor5-word-count" "46.0.3" clean-stack@^2.0.0: version "2.2.0" @@ -3656,9 +3656,9 @@ duplexer@^0.1.2: integrity sha512-jtD6YG370ZCIi/9GTaJKQxWTZD045+4R4hTk/x1UyoqadyJ9x9CgSi1RlVDQF8U2sxLLSnFkCaMihqljHIWgMg== electron-to-chromium@^1.5.211: - version "1.5.211" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.211.tgz#749317bf9cf894c06f67980940cf8074e5eb08ca" - integrity sha512-IGBvimJkotaLzFnwIVgW9/UD/AOJ2tByUmeOrtqBfACSbAw5b1G0XpvdaieKyc7ULmbwXVx+4e4Be8pOPBrYkw== + version "1.5.214" + resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.5.214.tgz#f7bbdc0796124292d4b8a34a49e968c5e6430763" + integrity sha512-TpvUNdha+X3ybfU78NoQatKvQEm1oq3lf2QbnmCEdw+Bd9RuIAY+hJTvq1avzHM0f7EJfnH3vbCnbzKzisc/9Q== emoji-regex@^7.0.1: version "7.0.3" @@ -5728,9 +5728,9 @@ node-notifier@^9.0.0: which "^2.0.2" node-releases@^2.0.19: - version "2.0.19" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.19.tgz#9e445a52950951ec4d177d843af370b411caf314" - integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== + version "2.0.20" + resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.20.tgz#e26bb79dbdd1e64a146df389c699014c611cbc27" + integrity sha512-7gK6zSXEH6neM212JgfYFXe+GmZQM+fia5SsusuBIUgnPheLFBmIPhtFoAQRj8/7wASYQnbDlHPVwY0BefoFgA== normalize-path@^3.0.0, normalize-path@~3.0.0: version "3.0.0" @@ -7390,12 +7390,12 @@ terser-webpack-plugin@^5.3.0, terser-webpack-plugin@^5.3.11: terser "^5.31.1" terser@^5.3.4, terser@^5.31.1: - version "5.43.1" - resolved "https://registry.yarnpkg.com/terser/-/terser-5.43.1.tgz#88387f4f9794ff1a29e7ad61fb2932e25b4fdb6d" - integrity sha512-+6erLbBm0+LROX2sPXlUYx/ux5PyE9K/a92Wrt6oA+WDAoFTdpHE5tCYCI5PNzq2y8df4rA+QgHLJuR4jNymsg== + version "5.44.0" + resolved "https://registry.yarnpkg.com/terser/-/terser-5.44.0.tgz#ebefb8e5b8579d93111bfdfc39d2cf63879f4a82" + integrity sha512-nIVck8DK+GM/0Frwd+nIhZ84pR/BX7rmXMfYwyg+Sri5oGVE99/E3KvXqpC2xHFxyqXyGHTKBSioxxplrO4I4w== dependencies: "@jridgewell/source-map" "^0.3.3" - acorn "^8.14.0" + acorn "^8.15.0" commander "^2.20.0" source-map-support "~0.5.20"