{ "title": "Influence links", "back": "← Back to gallery", "openMovementLinks": "Movement links →", "tabList": "List", "tabImport": "Import", "tabGraph": "Graph", "loadFailed": "Failed to load influences", "searchPlaceholder": "Search artist, painting, source…", "refresh": "Refresh", "loading": "Loading…", "loadingParse": "Reading file…", "loadingPreview": "Validating influence links…", "loadingCommit": "Importing links into the database…", "loadingSave": "Saving link…", "addEdge": "Add link", "cancelAdd": "Cancel", "total": "{{count}} links", "filtered": "filtered by artist", "clearFilter": "Clear artist filter", "subjectPainting": "Subject painting", "searchPainting": "Search painting…", "sourceType": "Source type", "typeArtist": "Artist", "typePainting": "Painting", "typeMovement": "Movement", "sourceEntity": "Source entity", "searchSource": "Search source…", "notes": "Notes", "saveEdge": "Save link", "addRequiresIds": "Pick a subject painting and a source entity", "colSubject": "Subject", "colSource": "Source", "colType": "Type", "colNotes": "Notes", "colActions": "Actions", "colAction": "Action", "colDirection": "Direction", "delete": "Delete", "confirmDelete": "Delete this influence link?", "noEdges": "No influence links match.", "stepUpload": "1. Upload", "stepMapping": "2. Map columns", "stepPreview": "3. Validate", "stepDone": "4. Done", "uploadHelp": "Choose a CSV, JSON, or XLSX file with influence rows (e.g. Inputs/artist_influences_web_sources.xlsx).", "parseFailed": "Failed to parse file", "previewFailed": "Failed to build preview", "commitFailed": "Failed to commit import", "rowsMissing": "File rows were not returned (too large). Use a smaller file (≤2000 rows).", "fileInfo": "{{name}} · {{rows}} rows · {{format}}", "sheet": "Sheet", "preset": "Mapping preset", "column": "Column", "role": "Role", "sample": "Sample", "backStep": "Back", "runPreview": "Validate & preview", "previewCounts": "Will create {{create}} · skip {{skip}} · row errors {{errors}} · proposals {{proposals}}", "warnings": "{{count}} warnings", "commitImport": "Import {{count}} links", "commitSummary": "Imported {{inserted}} links ({{skipped}} already present or skipped).", "alreadyImportedWarn": "Already imported {{when}} by {{who}} ({{match}}: {{file}}). Commit is blocked unless you force re-import.", "alreadyImportedBlock": "This file or identical data was already imported. Enable “Import anyway” to force, or cancel.", "forceImport": "Import anyway (force — may recreate skipped edges only; existing edges stay unique)", "matchFile": "same file bytes", "matchData": "same mapped data", "searchArtist": "Search artist for neighborhood graph…", "graphEmpty": "Select an artist to visualize influence neighbors.", "graphStats": "{{nodes}} nodes · {{edges}} edges" }