Added generic CSV type option, to highlight the universal nature of the importer

This commit is contained in:
Jan Böhmer 2025-09-06 23:20:07 +02:00
parent 1d33d95c57
commit 76f3c379b5
2 changed files with 386 additions and 379 deletions

View file

@ -149,6 +149,7 @@ class ProjectController extends AbstractController
'choices' => [ 'choices' => [
'project.bom_import.type.kicad_pcbnew' => 'kicad_pcbnew', 'project.bom_import.type.kicad_pcbnew' => 'kicad_pcbnew',
'project.bom_import.type.kicad_schematic' => 'kicad_schematic', 'project.bom_import.type.kicad_schematic' => 'kicad_schematic',
'project.bom_import.type.generic_csv' => 'generic_csv',
] ]
]); ]);
$builder->add('clear_existing_bom', CheckboxType::class, [ $builder->add('clear_existing_bom', CheckboxType::class, [
@ -176,7 +177,7 @@ class ProjectController extends AbstractController
try { try {
// For schematic imports, redirect to field mapping step // For schematic imports, redirect to field mapping step
if ($import_type === 'kicad_schematic') { if (in_array($import_type, ['kicad_schematic', 'generic_csv'], true)) {
// Store file content and options in session for field mapping step // Store file content and options in session for field mapping step
$file_content = $form->get('file')->getData()->getContent(); $file_content = $form->get('file')->getData()->getContent();
$clear_existing = $form->get('clear_existing_bom')->getData(); $clear_existing = $form->get('clear_existing_bom')->getData();

View file

@ -12333,7 +12333,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="p7LGAIX" name="settings.ips.element14.apiKey.help"> <unit id="p7LGAIX" name="settings.ips.element14.apiKey.help">
<segment state="translated"> <segment state="translated">
<source>settings.ips.element14.apiKey.help</source> <source>settings.ips.element14.apiKey.help</source>
<target>You can register for an API key on &lt;a href="https://partner.element14.com/"&gt;https://partner.element14.com/&lt;/a&gt;.</target> <target><![CDATA[You can register for an API key on <a href="https://partner.element14.com/">https://partner.element14.com/</a>.]]></target>
</segment> </segment>
</unit> </unit>
<unit id="ZdUHpZc" name="settings.ips.element14.storeId"> <unit id="ZdUHpZc" name="settings.ips.element14.storeId">
@ -12345,7 +12345,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="XXGUxF6" name="settings.ips.element14.storeId.help"> <unit id="XXGUxF6" name="settings.ips.element14.storeId.help">
<segment state="translated"> <segment state="translated">
<source>settings.ips.element14.storeId.help</source> <source>settings.ips.element14.storeId.help</source>
<target>The store domain to retrieve the data from. This decides the language and currency of results. See &lt;a href="https://partner.element14.com/docs/Product_Search_API_REST__Description"&gt;here&lt;/a&gt; for a list of valid domains.</target> <target><![CDATA[The store domain to retrieve the data from. This decides the language and currency of results. See <a href="https://partner.element14.com/docs/Product_Search_API_REST__Description">here</a> for a list of valid domains.]]></target>
</segment> </segment>
</unit> </unit>
<unit id="WKWZIm2" name="settings.ips.tme"> <unit id="WKWZIm2" name="settings.ips.tme">
@ -12363,7 +12363,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="_pYLrPT" name="settings.ips.tme.token.help"> <unit id="_pYLrPT" name="settings.ips.tme.token.help">
<segment state="translated"> <segment state="translated">
<source>settings.ips.tme.token.help</source> <source>settings.ips.tme.token.help</source>
<target>You can get an API token and secret on &lt;a href="https://developers.tme.eu/en/"&gt;https://developers.tme.eu/en/&lt;/a&gt;.</target> <target><![CDATA[You can get an API token and secret on <a href="https://developers.tme.eu/en/">https://developers.tme.eu/en/</a>.]]></target>
</segment> </segment>
</unit> </unit>
<unit id="yswx4bq" name="settings.ips.tme.secret"> <unit id="yswx4bq" name="settings.ips.tme.secret">
@ -12411,7 +12411,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="gu.JlpT" name="settings.ips.mouser.apiKey.help"> <unit id="gu.JlpT" name="settings.ips.mouser.apiKey.help">
<segment state="translated"> <segment state="translated">
<source>settings.ips.mouser.apiKey.help</source> <source>settings.ips.mouser.apiKey.help</source>
<target>You can register for an API key on &lt;a href="https://eu.mouser.com/api-hub/"&gt;https://eu.mouser.com/api-hub/&lt;/a&gt;.</target> <target><![CDATA[You can register for an API key on <a href="https://eu.mouser.com/api-hub/">https://eu.mouser.com/api-hub/</a>.]]></target>
</segment> </segment>
</unit> </unit>
<unit id="Q66CNjw" name="settings.ips.mouser.searchLimit"> <unit id="Q66CNjw" name="settings.ips.mouser.searchLimit">
@ -12489,7 +12489,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="kKv0J3." name="settings.system.attachments"> <unit id="kKv0J3." name="settings.system.attachments">
<segment state="translated"> <segment state="translated">
<source>settings.system.attachments</source> <source>settings.system.attachments</source>
<target>Attachments &amp; Files</target> <target><![CDATA[Attachments & Files]]></target>
</segment> </segment>
</unit> </unit>
<unit id="dsRff8T" name="settings.system.attachments.maxFileSize"> <unit id="dsRff8T" name="settings.system.attachments.maxFileSize">
@ -12513,7 +12513,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="T.PBu5P" name="settings.system.attachments.allowDownloads.help"> <unit id="T.PBu5P" name="settings.system.attachments.allowDownloads.help">
<segment state="translated"> <segment state="translated">
<source>settings.system.attachments.allowDownloads.help</source> <source>settings.system.attachments.allowDownloads.help</source>
<target>With this option users can download external files into Part-DB by providing an URL. &lt;b&gt;Attention: This can be a security issue, as it might allow users to access intranet ressources via Part-DB!&lt;/b&gt;</target> <target><![CDATA[With this option users can download external files into Part-DB by providing an URL. <b>Attention: This can be a security issue, as it might allow users to access intranet ressources via Part-DB!</b>]]></target>
</segment> </segment>
</unit> </unit>
<unit id=".OyihML" name="settings.system.attachments.downloadByDefault"> <unit id=".OyihML" name="settings.system.attachments.downloadByDefault">
@ -12687,8 +12687,8 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="0GRlEe5" name="settings.system.localization.base_currency_description"> <unit id="0GRlEe5" name="settings.system.localization.base_currency_description">
<segment state="translated"> <segment state="translated">
<source>settings.system.localization.base_currency_description</source> <source>settings.system.localization.base_currency_description</source>
<target>The currency that is used to store price information and exchange rates in. This currency is assumed, when no currency is set for a price information. <target><![CDATA[The currency that is used to store price information and exchange rates in. This currency is assumed, when no currency is set for a price information.
&lt;b&gt;Please note that the currencies are not converted, when changing this value. So changing the default currency after you already added price information, will result in wrong prices!&lt;/b&gt;</target> <b>Please note that the currencies are not converted, when changing this value. So changing the default currency after you already added price information, will result in wrong prices!</b>]]></target>
</segment> </segment>
</unit> </unit>
<unit id="cvpTUeY" name="settings.system.privacy"> <unit id="cvpTUeY" name="settings.system.privacy">
@ -12718,7 +12718,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="w07P3Dt" name="settings.misc.kicad_eda.category_depth.help"> <unit id="w07P3Dt" name="settings.misc.kicad_eda.category_depth.help">
<segment state="translated"> <segment state="translated">
<source>settings.misc.kicad_eda.category_depth.help</source> <source>settings.misc.kicad_eda.category_depth.help</source>
<target>This value determines the depth of the category tree, that is visible inside KiCad. 0 means that only the top level categories are visible. Set to a value &gt; 0 to show more levels. Set to -1, to show all parts of Part-DB inside a sigle cnategory in KiCad.</target> <target><![CDATA[This value determines the depth of the category tree, that is visible inside KiCad. 0 means that only the top level categories are visible. Set to a value > 0 to show more levels. Set to -1, to show all parts of Part-DB inside a sigle cnategory in KiCad.]]></target>
</segment> </segment>
</unit> </unit>
<unit id="VwvmcWE" name="settings.behavior.sidebar"> <unit id="VwvmcWE" name="settings.behavior.sidebar">
@ -12736,7 +12736,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="jc0JTvL" name="settings.behavior.sidebar.items.help"> <unit id="jc0JTvL" name="settings.behavior.sidebar.items.help">
<segment state="translated"> <segment state="translated">
<source>settings.behavior.sidebar.items.help</source> <source>settings.behavior.sidebar.items.help</source>
<target>The menus which appear at the sidebar by default. Order of items can be changed via drag &amp; drop.</target> <target><![CDATA[The menus which appear at the sidebar by default. Order of items can be changed via drag & drop.]]></target>
</segment> </segment>
</unit> </unit>
<unit id="gVSWDkE" name="settings.behavior.sidebar.rootNodeEnabled"> <unit id="gVSWDkE" name="settings.behavior.sidebar.rootNodeEnabled">
@ -12784,7 +12784,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="SUD8H3b" name="settings.behavior.table.parts_default_columns.help"> <unit id="SUD8H3b" name="settings.behavior.table.parts_default_columns.help">
<segment state="translated"> <segment state="translated">
<source>settings.behavior.table.parts_default_columns.help</source> <source>settings.behavior.table.parts_default_columns.help</source>
<target>The columns to show by default in part tables. Order of items can be changed via drag &amp; drop.</target> <target><![CDATA[The columns to show by default in part tables. Order of items can be changed via drag & drop.]]></target>
</segment> </segment>
</unit> </unit>
<unit id="hazr_g5" name="settings.ips.oemsecrets"> <unit id="hazr_g5" name="settings.ips.oemsecrets">
@ -12838,7 +12838,7 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<unit id="KLJYfJ0" name="settings.ips.oemsecrets.sortMode.M"> <unit id="KLJYfJ0" name="settings.ips.oemsecrets.sortMode.M">
<segment state="translated"> <segment state="translated">
<source>settings.ips.oemsecrets.sortMode.M</source> <source>settings.ips.oemsecrets.sortMode.M</source>
<target>Completeness &amp; Manufacturer name</target> <target><![CDATA[Completeness & Manufacturer name]]></target>
</segment> </segment>
</unit> </unit>
<unit id="8C9ijHM" name="entity.export.flash.error.no_entities"> <unit id="8C9ijHM" name="entity.export.flash.error.no_entities">
@ -13057,371 +13057,377 @@ Please note, that you can not impersonate a disabled user. If you try you will g
<target>Redacted for security reasons</target> <target>Redacted for security reasons</target>
</segment> </segment>
</unit> </unit>
<unit id="J716Oh4" name="project.bom_import.map_fields"> <unit id="J716Oh4" name="project.bom_import.map_fields">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.map_fields</source> <source>project.bom_import.map_fields</source>
<target>Map Fields</target> <target>Map Fields</target>
</segment> </segment>
</unit> </unit>
<unit id="wvT5Xvn" name="project.bom_import.map_fields.help"> <unit id="wvT5Xvn" name="project.bom_import.map_fields.help">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.map_fields.help</source> <source>project.bom_import.map_fields.help</source>
<target>Configure how CSV columns map to BOM fields</target> <target>Configure how CSV columns map to BOM fields</target>
</segment> </segment>
</unit> </unit>
<unit id="nh7uLPe" name="project.bom_import.delimiter"> <unit id="nh7uLPe" name="project.bom_import.delimiter">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.delimiter</source> <source>project.bom_import.delimiter</source>
<target>Delimiter</target> <target>Delimiter</target>
</segment> </segment>
</unit> </unit>
<unit id="MSlSeE4" name="project.bom_import.delimiter.comma"> <unit id="MSlSeE4" name="project.bom_import.delimiter.comma">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.delimiter.comma</source> <source>project.bom_import.delimiter.comma</source>
<target>Comma (,)</target> <target>Comma (,)</target>
</segment> </segment>
</unit> </unit>
<unit id="UdDSB0h" name="project.bom_import.delimiter.semicolon"> <unit id="UdDSB0h" name="project.bom_import.delimiter.semicolon">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.delimiter.semicolon</source> <source>project.bom_import.delimiter.semicolon</source>
<target>Semicolon (;)</target> <target>Semicolon (;)</target>
</segment> </segment>
</unit> </unit>
<unit id="Wpa4Gmf" name="project.bom_import.delimiter.tab"> <unit id="Wpa4Gmf" name="project.bom_import.delimiter.tab">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.delimiter.tab</source> <source>project.bom_import.delimiter.tab</source>
<target>Tab</target> <target>Tab</target>
</segment> </segment>
</unit> </unit>
<unit id="tjrG_vU" name="project.bom_import.field_mapping.title"> <unit id="tjrG_vU" name="project.bom_import.field_mapping.title">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.title</source> <source>project.bom_import.field_mapping.title</source>
<target>Field Mapping</target> <target>Field Mapping</target>
</segment> </segment>
</unit> </unit>
<unit id="nWu8B7R" name="project.bom_import.field_mapping.csv_field"> <unit id="nWu8B7R" name="project.bom_import.field_mapping.csv_field">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.csv_field</source> <source>project.bom_import.field_mapping.csv_field</source>
<target>CSV Field</target> <target>CSV Field</target>
</segment> </segment>
</unit> </unit>
<unit id="D0KlFqm" name="project.bom_import.field_mapping.maps_to"> <unit id="D0KlFqm" name="project.bom_import.field_mapping.maps_to">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.maps_to</source> <source>project.bom_import.field_mapping.maps_to</source>
<target>Maps To</target> <target>Maps To</target>
</segment> </segment>
</unit> </unit>
<unit id="rhUpmxC" name="project.bom_import.field_mapping.suggestion"> <unit id="rhUpmxC" name="project.bom_import.field_mapping.suggestion">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.suggestion</source> <source>project.bom_import.field_mapping.suggestion</source>
<target>Suggestion</target> <target>Suggestion</target>
</segment> </segment>
</unit> </unit>
<unit id="TM0mgKr" name="project.bom_import.field_mapping.priority"> <unit id="TM0mgKr" name="project.bom_import.field_mapping.priority">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.priority</source> <source>project.bom_import.field_mapping.priority</source>
<target>Priority</target> <target>Priority</target>
</segment> </segment>
</unit> </unit>
<unit id="xY8NSRr" name="project.bom_import.field_mapping.priority_help"> <unit id="xY8NSRr" name="project.bom_import.field_mapping.priority_help">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.priority_help</source> <source>project.bom_import.field_mapping.priority_help</source>
<target>Priority (lower number = higher priority)</target> <target>Priority (lower number = higher priority)</target>
</segment> </segment>
</unit> </unit>
<unit id="CuXg8WU" name="project.bom_import.field_mapping.priority_short"> <unit id="CuXg8WU" name="project.bom_import.field_mapping.priority_short">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.priority_short</source> <source>project.bom_import.field_mapping.priority_short</source>
<target>P</target> <target>P</target>
</segment> </segment>
</unit> </unit>
<unit id="jOHOShN" name="project.bom_import.field_mapping.priority_note"> <unit id="jOHOShN" name="project.bom_import.field_mapping.priority_note">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.priority_note</source> <source>project.bom_import.field_mapping.priority_note</source>
<target>Priority Tip: Lower numbers = higher priority. Default priority is 10. Use priorities 1-9 for most important fields, 10+ for normal priority.</target> <target>Priority Tip: Lower numbers = higher priority. Default priority is 10. Use priorities 1-9 for most important fields, 10+ for normal priority.</target>
</segment> </segment>
</unit> </unit>
<unit id="pvmv3OT" name="project.bom_import.field_mapping.summary"> <unit id="pvmv3OT" name="project.bom_import.field_mapping.summary">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.summary</source> <source>project.bom_import.field_mapping.summary</source>
<target>Field Mapping Summary</target> <target>Field Mapping Summary</target>
</segment> </segment>
</unit> </unit>
<unit id="VjLf1Pf" name="project.bom_import.field_mapping.select_to_see_summary"> <unit id="VjLf1Pf" name="project.bom_import.field_mapping.select_to_see_summary">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.select_to_see_summary</source> <source>project.bom_import.field_mapping.select_to_see_summary</source>
<target>Select field mappings to see summary</target> <target>Select field mappings to see summary</target>
</segment> </segment>
</unit> </unit>
<unit id="JOPny6T" name="project.bom_import.field_mapping.no_suggestion"> <unit id="JOPny6T" name="project.bom_import.field_mapping.no_suggestion">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.no_suggestion</source> <source>project.bom_import.field_mapping.no_suggestion</source>
<target>No suggestion</target> <target>No suggestion</target>
</segment> </segment>
</unit> </unit>
<unit id="1LWEtqL" name="project.bom_import.preview"> <unit id="1LWEtqL" name="project.bom_import.preview">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.preview</source> <source>project.bom_import.preview</source>
<target>Preview</target> <target>Preview</target>
</segment> </segment>
</unit> </unit>
<unit id="1CJA0aY" name="project.bom_import.flash.session_expired"> <unit id="1CJA0aY" name="project.bom_import.flash.session_expired">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.flash.session_expired</source> <source>project.bom_import.flash.session_expired</source>
<target>Import session has expired. Please upload your file again.</target> <target>Import session has expired. Please upload your file again.</target>
</segment> </segment>
</unit> </unit>
<unit id="BLN7XRN" name="project.bom_import.field_mapping.ignore"> <unit id="BLN7XRN" name="project.bom_import.field_mapping.ignore">
<segment state="translated"> <segment state="translated">
<source>project.bom_import.field_mapping.ignore</source> <source>project.bom_import.field_mapping.ignore</source>
<target>Ignore</target> <target>Ignore</target>
</segment> </segment>
</unit> </unit>
<unit id="yiIB3yV" name="project.bom_import.type.kicad_schematic"> <unit id="yiIB3yV" name="project.bom_import.type.kicad_schematic">
<segment> <segment>
<source>project.bom_import.type.kicad_schematic</source> <source>project.bom_import.type.kicad_schematic</source>
<target>KiCAD Schematic BOM (CSV file)</target> <target>KiCAD Schematic BOM (CSV file)</target>
</segment> </segment>
</unit> </unit>
<unit id="ltE6xPP" name="common.back"> <unit id="ltE6xPP" name="common.back">
<segment> <segment>
<source>common.back</source> <source>common.back</source>
<target>Back</target> <target>Back</target>
</segment> </segment>
</unit> </unit>
<unit id="HCTqjZO" name="project.bom_import.validation.errors.required_field_missing"> <unit id="HCTqjZO" name="project.bom_import.validation.errors.required_field_missing">
<segment> <segment>
<source>project.bom_import.validation.errors.required_field_missing</source> <source>project.bom_import.validation.errors.required_field_missing</source>
<target>Line %line%: Required field "%field%" is missing or empty. Please ensure this field is mapped and contains data.</target> <target>Line %line%: Required field "%field%" is missing or empty. Please ensure this field is mapped and contains data.</target>
</segment> </segment>
</unit> </unit>
<unit id="_ua5YM7" name="project.bom_import.validation.errors.no_valid_designators"> <unit id="_ua5YM7" name="project.bom_import.validation.errors.no_valid_designators">
<segment> <segment>
<source>project.bom_import.validation.errors.no_valid_designators</source> <source>project.bom_import.validation.errors.no_valid_designators</source>
<target>Line %line%: Designator field contains no valid component references. Expected format: "R1,C2,U3" or "R1, C2, U3".</target> <target>Line %line%: Designator field contains no valid component references. Expected format: "R1,C2,U3" or "R1, C2, U3".</target>
</segment> </segment>
</unit> </unit>
<unit id="xpkq3rW" name="project.bom_import.validation.warnings.unusual_designator_format"> <unit id="xpkq3rW" name="project.bom_import.validation.warnings.unusual_designator_format">
<segment> <segment>
<source>project.bom_import.validation.warnings.unusual_designator_format</source> <source>project.bom_import.validation.warnings.unusual_designator_format</source>
<target>Line %line%: Some component references may have unusual format: %designators%. Expected format: "R1", "C2", "U3", etc.</target> <target>Line %line%: Some component references may have unusual format: %designators%. Expected format: "R1", "C2", "U3", etc.</target>
</segment> </segment>
</unit> </unit>
<unit id="M54Ud5d" name="project.bom_import.validation.errors.duplicate_designators"> <unit id="M54Ud5d" name="project.bom_import.validation.errors.duplicate_designators">
<segment> <segment>
<source>project.bom_import.validation.errors.duplicate_designators</source> <source>project.bom_import.validation.errors.duplicate_designators</source>
<target>Line %line%: Duplicate component references found: %designators%. Each component should be referenced only once per line.</target> <target>Line %line%: Duplicate component references found: %designators%. Each component should be referenced only once per line.</target>
</segment> </segment>
</unit> </unit>
<unit id="ZULFZh2" name="project.bom_import.validation.errors.invalid_quantity"> <unit id="ZULFZh2" name="project.bom_import.validation.errors.invalid_quantity">
<segment> <segment>
<source>project.bom_import.validation.errors.invalid_quantity</source> <source>project.bom_import.validation.errors.invalid_quantity</source>
<target>Line %line%: Quantity "%quantity%" is not a valid number. Please enter a numeric value (e.g., 1, 2.5, 10).</target> <target>Line %line%: Quantity "%quantity%" is not a valid number. Please enter a numeric value (e.g., 1, 2.5, 10).</target>
</segment> </segment>
</unit> </unit>
<unit id="3WbRgsl" name="project.bom_import.validation.errors.quantity_zero_or_negative"> <unit id="3WbRgsl" name="project.bom_import.validation.errors.quantity_zero_or_negative">
<segment> <segment>
<source>project.bom_import.validation.errors.quantity_zero_or_negative</source> <source>project.bom_import.validation.errors.quantity_zero_or_negative</source>
<target>Line %line%: Quantity must be greater than 0, got %quantity%.</target> <target>Line %line%: Quantity must be greater than 0, got %quantity%.</target>
</segment> </segment>
</unit> </unit>
<unit id="_nWGsSU" name="project.bom_import.validation.warnings.quantity_unusually_high"> <unit id="_nWGsSU" name="project.bom_import.validation.warnings.quantity_unusually_high">
<segment> <segment>
<source>project.bom_import.validation.warnings.quantity_unusually_high</source> <source>project.bom_import.validation.warnings.quantity_unusually_high</source>
<target>Line %line%: Quantity %quantity% seems unusually high. Please verify this is correct.</target> <target>Line %line%: Quantity %quantity% seems unusually high. Please verify this is correct.</target>
</segment> </segment>
</unit> </unit>
<unit id="iJWw39f" name="project.bom_import.validation.warnings.quantity_not_whole_number"> <unit id="iJWw39f" name="project.bom_import.validation.warnings.quantity_not_whole_number">
<segment> <segment>
<source>project.bom_import.validation.warnings.quantity_not_whole_number</source> <source>project.bom_import.validation.warnings.quantity_not_whole_number</source>
<target>Line %line%: Quantity %quantity% is not a whole number, but you have %count% component references. This may indicate a mismatch.</target> <target>Line %line%: Quantity %quantity% is not a whole number, but you have %count% component references. This may indicate a mismatch.</target>
</segment> </segment>
</unit> </unit>
<unit id="Zffmgvv" name="project.bom_import.validation.errors.quantity_designator_mismatch"> <unit id="Zffmgvv" name="project.bom_import.validation.errors.quantity_designator_mismatch">
<segment> <segment>
<source>project.bom_import.validation.errors.quantity_designator_mismatch</source> <source>project.bom_import.validation.errors.quantity_designator_mismatch</source>
<target>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.</target> <target>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.</target>
</segment> </segment>
</unit> </unit>
<unit id="JqHpDIo" name="project.bom_import.validation.errors.invalid_partdb_id"> <unit id="JqHpDIo" name="project.bom_import.validation.errors.invalid_partdb_id">
<segment> <segment>
<source>project.bom_import.validation.errors.invalid_partdb_id</source> <source>project.bom_import.validation.errors.invalid_partdb_id</source>
<target>Line %line%: Part-DB ID "%id%" is not a valid number. Please enter a numeric ID.</target> <target>Line %line%: Part-DB ID "%id%" is not a valid number. Please enter a numeric ID.</target>
</segment> </segment>
</unit> </unit>
<unit id="Mr7W6r0" name="project.bom_import.validation.errors.partdb_id_zero_or_negative"> <unit id="Mr7W6r0" name="project.bom_import.validation.errors.partdb_id_zero_or_negative">
<segment> <segment>
<source>project.bom_import.validation.errors.partdb_id_zero_or_negative</source> <source>project.bom_import.validation.errors.partdb_id_zero_or_negative</source>
<target>Line %line%: Part-DB ID must be greater than 0, got %id%.</target> <target>Line %line%: Part-DB ID must be greater than 0, got %id%.</target>
</segment> </segment>
</unit> </unit>
<unit id="gRH6IeR" name="project.bom_import.validation.warnings.partdb_id_not_found"> <unit id="gRH6IeR" name="project.bom_import.validation.warnings.partdb_id_not_found">
<segment> <segment>
<source>project.bom_import.validation.warnings.partdb_id_not_found</source> <source>project.bom_import.validation.warnings.partdb_id_not_found</source>
<target>Line %line%: Part-DB ID %id% not found in database. The component will be imported without linking to an existing part.</target> <target>Line %line%: Part-DB ID %id% not found in database. The component will be imported without linking to an existing part.</target>
</segment> </segment>
</unit> </unit>
<unit id="eMfaBYo" name="project.bom_import.validation.info.partdb_link_success"> <unit id="eMfaBYo" name="project.bom_import.validation.info.partdb_link_success">
<segment> <segment>
<source>project.bom_import.validation.info.partdb_link_success</source> <source>project.bom_import.validation.info.partdb_link_success</source>
<target>Line %line%: Successfully linked to Part-DB part "%name%" (ID: %id%).</target> <target>Line %line%: Successfully linked to Part-DB part "%name%" (ID: %id%).</target>
</segment> </segment>
</unit> </unit>
<unit id="b_m9p.f" name="project.bom_import.validation.warnings.no_component_name"> <unit id="b_m9p.f" name="project.bom_import.validation.warnings.no_component_name">
<segment> <segment>
<source>project.bom_import.validation.warnings.no_component_name</source> <source>project.bom_import.validation.warnings.no_component_name</source>
<target>Line %line%: No component name/designation provided (MPN, Designation, or Value). Component will be named "Unknown Component".</target> <target>Line %line%: No component name/designation provided (MPN, Designation, or Value). Component will be named "Unknown Component".</target>
</segment> </segment>
</unit> </unit>
<unit id=".LAGdMe" name="project.bom_import.validation.warnings.package_name_too_long"> <unit id=".LAGdMe" name="project.bom_import.validation.warnings.package_name_too_long">
<segment> <segment>
<source>project.bom_import.validation.warnings.package_name_too_long</source> <source>project.bom_import.validation.warnings.package_name_too_long</source>
<target>Line %line%: Package name "%package%" is unusually long. Please verify this is correct.</target> <target>Line %line%: Package name "%package%" is unusually long. Please verify this is correct.</target>
</segment> </segment>
</unit> </unit>
<unit id="wFF49kl" name="project.bom_import.validation.info.library_prefix_detected"> <unit id="wFF49kl" name="project.bom_import.validation.info.library_prefix_detected">
<segment> <segment>
<source>project.bom_import.validation.info.library_prefix_detected</source> <source>project.bom_import.validation.info.library_prefix_detected</source>
<target>Line %line%: Package "%package%" contains library prefix. This will be automatically removed during import.</target> <target>Line %line%: Package "%package%" contains library prefix. This will be automatically removed during import.</target>
</segment> </segment>
</unit> </unit>
<unit id="hEO2sxC" name="project.bom_import.validation.errors.non_numeric_field"> <unit id="hEO2sxC" name="project.bom_import.validation.errors.non_numeric_field">
<segment> <segment>
<source>project.bom_import.validation.errors.non_numeric_field</source> <source>project.bom_import.validation.errors.non_numeric_field</source>
<target>Line %line%: Field "%field%" contains non-numeric value "%value%". Please enter a valid number.</target> <target>Line %line%: Field "%field%" contains non-numeric value "%value%". Please enter a valid number.</target>
</segment> </segment>
</unit> </unit>
<unit id="Ear_sUX" name="project.bom_import.validation.info.import_summary"> <unit id="Ear_sUX" name="project.bom_import.validation.info.import_summary">
<segment> <segment>
<source>project.bom_import.validation.info.import_summary</source> <source>project.bom_import.validation.info.import_summary</source>
<target>Import summary: %total% total entries, %valid% valid, %invalid% with issues.</target> <target>Import summary: %total% total entries, %valid% valid, %invalid% with issues.</target>
</segment> </segment>
</unit> </unit>
<unit id="SqJZ97A" name="project.bom_import.validation.errors.summary"> <unit id="SqJZ97A" name="project.bom_import.validation.errors.summary">
<segment> <segment>
<source>project.bom_import.validation.errors.summary</source> <source>project.bom_import.validation.errors.summary</source>
<target>Found %count% validation error(s) that must be fixed before import can proceed.</target> <target>Found %count% validation error(s) that must be fixed before import can proceed.</target>
</segment> </segment>
</unit> </unit>
<unit id="s7dzFnp" name="project.bom_import.validation.warnings.summary"> <unit id="s7dzFnp" name="project.bom_import.validation.warnings.summary">
<segment> <segment>
<source>project.bom_import.validation.warnings.summary</source> <source>project.bom_import.validation.warnings.summary</source>
<target>Found %count% warning(s). Please review these issues before proceeding.</target> <target>Found %count% warning(s). Please review these issues before proceeding.</target>
</segment> </segment>
</unit> </unit>
<unit id="2KaAHmS" name="project.bom_import.validation.info.all_valid"> <unit id="2KaAHmS" name="project.bom_import.validation.info.all_valid">
<segment> <segment>
<source>project.bom_import.validation.info.all_valid</source> <source>project.bom_import.validation.info.all_valid</source>
<target>All entries passed validation successfully!</target> <target>All entries passed validation successfully!</target>
</segment> </segment>
</unit> </unit>
<unit id="Lyb3BjK" name="project.bom_import.validation.summary"> <unit id="Lyb3BjK" name="project.bom_import.validation.summary">
<segment> <segment>
<source>project.bom_import.validation.summary</source> <source>project.bom_import.validation.summary</source>
<target>Validation Summary</target> <target>Validation Summary</target>
</segment> </segment>
</unit> </unit>
<unit id="DUM8GoE" name="project.bom_import.validation.total_entries"> <unit id="DUM8GoE" name="project.bom_import.validation.total_entries">
<segment> <segment>
<source>project.bom_import.validation.total_entries</source> <source>project.bom_import.validation.total_entries</source>
<target>Total Entries</target> <target>Total Entries</target>
</segment> </segment>
</unit> </unit>
<unit id="AtLGGU2" name="project.bom_import.validation.valid_entries"> <unit id="AtLGGU2" name="project.bom_import.validation.valid_entries">
<segment> <segment>
<source>project.bom_import.validation.valid_entries</source> <source>project.bom_import.validation.valid_entries</source>
<target>Valid Entries</target> <target>Valid Entries</target>
</segment> </segment>
</unit> </unit>
<unit id="mgdn5v3" name="project.bom_import.validation.invalid_entries"> <unit id="mgdn5v3" name="project.bom_import.validation.invalid_entries">
<segment> <segment>
<source>project.bom_import.validation.invalid_entries</source> <source>project.bom_import.validation.invalid_entries</source>
<target>Invalid Entries</target> <target>Invalid Entries</target>
</segment> </segment>
</unit> </unit>
<unit id="qmJ5BfF" name="project.bom_import.validation.success_rate"> <unit id="qmJ5BfF" name="project.bom_import.validation.success_rate">
<segment> <segment>
<source>project.bom_import.validation.success_rate</source> <source>project.bom_import.validation.success_rate</source>
<target>Success Rate</target> <target>Success Rate</target>
</segment> </segment>
</unit> </unit>
<unit id="QyDsrFV" name="project.bom_import.validation.errors.title"> <unit id="QyDsrFV" name="project.bom_import.validation.errors.title">
<segment> <segment>
<source>project.bom_import.validation.errors.title</source> <source>project.bom_import.validation.errors.title</source>
<target>Validation Errors</target> <target>Validation Errors</target>
</segment> </segment>
</unit> </unit>
<unit id="d.Mvu0a" name="project.bom_import.validation.errors.description"> <unit id="d.Mvu0a" name="project.bom_import.validation.errors.description">
<segment> <segment>
<source>project.bom_import.validation.errors.description</source> <source>project.bom_import.validation.errors.description</source>
<target>The following errors must be fixed before the import can proceed:</target> <target>The following errors must be fixed before the import can proceed:</target>
</segment> </segment>
</unit> </unit>
<unit id="MGFfKr." name="project.bom_import.validation.warnings.title"> <unit id="MGFfKr." name="project.bom_import.validation.warnings.title">
<segment> <segment>
<source>project.bom_import.validation.warnings.title</source> <source>project.bom_import.validation.warnings.title</source>
<target>Validation Warnings</target> <target>Validation Warnings</target>
</segment> </segment>
</unit> </unit>
<unit id="tt4VxY6" name="project.bom_import.validation.warnings.description"> <unit id="tt4VxY6" name="project.bom_import.validation.warnings.description">
<segment> <segment>
<source>project.bom_import.validation.warnings.description</source> <source>project.bom_import.validation.warnings.description</source>
<target>The following warnings should be reviewed before proceeding:</target> <target>The following warnings should be reviewed before proceeding:</target>
</segment> </segment>
</unit> </unit>
<unit id="YuAdYeh" name="project.bom_import.validation.info.title"> <unit id="YuAdYeh" name="project.bom_import.validation.info.title">
<segment> <segment>
<source>project.bom_import.validation.info.title</source> <source>project.bom_import.validation.info.title</source>
<target>Information</target> <target>Information</target>
</segment> </segment>
</unit> </unit>
<unit id="1pUfi7Q" name="project.bom_import.validation.details.title"> <unit id="1pUfi7Q" name="project.bom_import.validation.details.title">
<segment> <segment>
<source>project.bom_import.validation.details.title</source> <source>project.bom_import.validation.details.title</source>
<target>Detailed Validation Results</target> <target>Detailed Validation Results</target>
</segment> </segment>
</unit> </unit>
<unit id="4Vv0Xns" name="project.bom_import.validation.details.line"> <unit id="4Vv0Xns" name="project.bom_import.validation.details.line">
<segment> <segment>
<source>project.bom_import.validation.details.line</source> <source>project.bom_import.validation.details.line</source>
<target>Line</target> <target>Line</target>
</segment> </segment>
</unit> </unit>
<unit id="RbvD2zF" name="project.bom_import.validation.details.status"> <unit id="RbvD2zF" name="project.bom_import.validation.details.status">
<segment> <segment>
<source>project.bom_import.validation.details.status</source> <source>project.bom_import.validation.details.status</source>
<target>Status</target> <target>Status</target>
</segment> </segment>
</unit> </unit>
<unit id="iGtKkH_" name="project.bom_import.validation.details.messages"> <unit id="iGtKkH_" name="project.bom_import.validation.details.messages">
<segment> <segment>
<source>project.bom_import.validation.details.messages</source> <source>project.bom_import.validation.details.messages</source>
<target>Messages</target> <target>Messages</target>
</segment> </segment>
</unit> </unit>
<unit id="IgdgZd8" name="project.bom_import.validation.details.valid"> <unit id="IgdgZd8" name="project.bom_import.validation.details.valid">
<segment> <segment>
<source>project.bom_import.validation.details.valid</source> <source>project.bom_import.validation.details.valid</source>
<target>Valid</target> <target>Valid</target>
</segment> </segment>
</unit> </unit>
<unit id="lWQEtkq" name="project.bom_import.validation.details.invalid"> <unit id="lWQEtkq" name="project.bom_import.validation.details.invalid">
<segment> <segment>
<source>project.bom_import.validation.details.invalid</source> <source>project.bom_import.validation.details.invalid</source>
<target>Invalid</target> <target>Invalid</target>
</segment> </segment>
</unit> </unit>
<unit id="tPn6Ind" name="project.bom_import.validation.all_valid"> <unit id="tPn6Ind" name="project.bom_import.validation.all_valid">
<segment> <segment>
<source>project.bom_import.validation.all_valid</source> <source>project.bom_import.validation.all_valid</source>
<target>All entries are valid and ready for import!</target> <target>All entries are valid and ready for import!</target>
</segment> </segment>
</unit> </unit>
<unit id="fzoGCaf" name="project.bom_import.validation.fix_errors"> <unit id="fzoGCaf" name="project.bom_import.validation.fix_errors">
<segment> <segment>
<source>project.bom_import.validation.fix_errors</source> <source>project.bom_import.validation.fix_errors</source>
<target>Please fix the validation errors before proceeding with the import.</target> <target>Please fix the validation errors before proceeding with the import.</target>
</segment> </segment>
</unit> </unit>
<unit id="nc9MqUc" name="project.bom_import.type.generic_csv">
<segment>
<source>project.bom_import.type.generic_csv</source>
<target>Generic CSV</target>
</segment>
</unit>
</file> </file>
</xliff> </xliff>