{
  "_meta": {
    "code": "en",
    "name": "English",
    "direction": "ltr",
    "author": "STL Gallery Team",
    "version": "1.0.0"
  },
  "welcome.subtitle": "Your 3D model library. Visually manage, tag and browse thousands of STL files — lightning fast.",
  "welcome.status.connecting": "Starting server…",
  "welcome.status.loading": "Loading…",
  "welcome.status.database": "Database",
  "welcome.status.renderer": "Renderer",
  "welcome.status.slicer": "Slicer",
  "welcome.status.thumbnails": "Thumbnails",
  "welcome.status.db_files": "{count} files",
  "welcome.status.db_init": "Initialized",
  "welcome.status.renderer_c": "stl_thumb (C) ⚡",
  "welcome.status.renderer_python": "Python/Pillow",
  "welcome.status.slicer_detected": "{count} detected: {names}",
  "welcome.status.slicer_none": "None detected",
  "welcome.status.thumbs_count": "{count} available",
  "welcome.btn.open_folder": "Select folder",
  "welcome.btn.open_folder_sub": "Browse file system",
  "welcome.btn.manual_path": "Enter path",
  "welcome.btn.manual_path_sub": "Network drives & special paths",
  "welcome.btn.open_gallery": "Open gallery",
  "welcome.btn.open_gallery_sub": "Browse all indexed files",
  "welcome.folders_header": "Library Folders",
  "welcome.add_folder": "Add folder",
  "welcome.recent_files": "{count} Files",
  "welcome.recent_remove": "Remove",
  "welcome.folder_missing": "Folder not found",
  "welcome.folder_missing_confirm": "The folder \"{path}\" no longer exists. Remove from library?",
  "welcome.folder_removed": "Folder removed",
  "welcome.cleaning": "Cleaning up...",
  "welcome.theme_toggle": "Toggle theme",
  "modal.add_category.title": "➕ Add category",
  "modal.add_category.edit_title": "✏️ Edit category",
  "modal.add_category.name_placeholder": "Category name",
  "modal.add_category.icon_btn_title": "Choose icon",
  "modal.add_category.tab_tech": "🔧 Technical",
  "modal.add_category.tab_emoji": "😀 Emoji",
  "modal.add_category.search_placeholder": "Search...",
  "modal.add_category.no_results": "No results",
  "modal.add_category.iconify_search_placeholder": "Search icons...",
  "modal.add_category.iconify_searching": "Searching...",
  "modal.add_category.iconify_offline": "No internet connection",
  "modal.add_category.iconify_error": "Search failed",
  "modal.add_category.emoji_fallback_link": "Choose emoji →",
  "modal.add_category.iconify_back_link": "← Online search",
  "modal.add_category.keywords_label": "Search terms (for auto-scan)",
  "modal.add_category.keyword_placeholder": "Enter search term...",
  "modal.add_category.keyword_hint": "Enter to add · × to remove",
  "modal.add_tag.title": "🏷 Add tag",
  "modal.add_tag.edit_title": "🏷 Rename tag",
  "modal.add_tag.name_placeholder": "Tag name",
  "modal.file_browser.title": "📁 Select folder",
  "modal.file_browser.quick_access": "Quick access",
  "modal.file_browser.browse_label": "Browse folders",
  "modal.file_browser.loading": "Loading...",
  "modal.file_browser.no_subfolders": "No subfolders",
  "modal.file_browser.path_placeholder": "Enter path or navigate above...",
  "modal.file_browser.add_btn": "Add",
  "modal.file_browser.add_count_btn": "Add {count} folders",
  "modal.file_browser.already_added": "✓ Added",
  "modal.file_browser.breadcrumb_root": "Computer",
  "modal.manual_path.title": "⌨ Enter path",
  "modal.manual_path.description": "Enter the full path to your STL folder.<br>This can also be a network drive.",
  "modal.manual_path.placeholder": "/home/user/3D-Models or network path",
  "modal.missing_folder.title": "⚠️ Folder not found",
  "modal.missing_folder.intro": "The following folder could not be found:",
  "modal.missing_folder.info": "The indexed files and thumbnails are still available, but the folder no longer exists or has been moved.",
  "modal.missing_folder.retry": "🔄 Retry",
  "modal.missing_folder.ignore": "Ignore",
  "modal.missing_folder.remove_folder": "🗑 Remove folder",
  "modal.missing_folder.remove_files": "🗑 Clean up files",
  "modal.missing_folder.checking": "Checking...",
  "modal.missing_folder.removing": "Removing...",
  "modal.missing_folder.not_found_again": "The folder still could not be found. Please check if the path is correct and accessible.",
  "modal.missing_folder.scan_error": "Error scanning: HTTP {status}",
  "modal.scan_wait.title": "⏳ Scanning",
  "modal.scan_wait.text": "The initial scan may take a while for large folders. Files will appear gradually in the gallery.",
  "modal.scan_wait.discovering": "{count} files found…",
  "modal.scan_wait.progress": "{done} / {total} files processed",
  "modal.server_down.title": "Server unreachable",
  "modal.server_down.text": "The connection to the server was lost. The server (server.py) is no longer running.",
  "modal.server_down.reload": "Reload page",
  "modal.server_down.close": "Close window",
  "toast.scan_complete": "Scan complete — ready to use",
  "toast.regen_thumbs_started": "{count} files queued for regeneration…",
  "print.more_pending": "more prints",
  "print.just_now": "just now",
  "print.minutes_ago": "{n} min ago",
  "print.hours_ago": "{n} hrs ago",
  "print.default_title": "Log print job",
  "print.discard": "Discard",
  "print.prints": "prints",
  "print.history_title": "Print history",
  "viewer.loading_metadata": "Loading…",
  "modal.settings.title": "⚙️ Settings",
  "modal.duplicate_finder.title": "🔍 Find duplicates",
  "modal.duplicate_finder.refresh": "🔄 Refresh",
  "modal.duplicate_finder.refresh_title": "Check again",
  "modal.duplicate_finder.loading": "Searching for duplicates...",
  "modal.duplicate_finder.no_duplicates_title": "No duplicates found",
  "modal.duplicate_finder.no_duplicates_msg": "All files in your library are unique! 🎉",
  "modal.duplicate_finder.all_cleaned_title": "All duplicates cleaned up!",
  "modal.duplicate_finder.all_cleaned_msg": "Well done! 🎉",
  "modal.duplicate_finder.groups": "Groups",
  "modal.duplicate_finder.duplicate_files": "duplicate files",
  "modal.duplicate_finder.wasted_space": "~ {size} wasted space",
  "modal.duplicate_finder.sort_count": "Count",
  "modal.duplicate_finder.sort_size": "Size",
  "modal.duplicate_finder.sort_date": "Date (oldest)",
  "modal.duplicate_finder.sort_name": "Name",
  "modal.duplicate_finder.trash_btn": "🗑️ Trash",
  "modal.duplicate_finder.move_to_trash": "Move to trash",
  "modal.duplicate_finder.error": "Error loading duplicates.",
  "modal.duplicate_trash.title": "🗑️ Deleted duplicates",
  "modal.duplicate_trash.loading": "Loading...",
  "modal.duplicate_trash.empty_title": "Trash is empty",
  "modal.duplicate_trash.empty_msg": "No deleted duplicates found.",
  "modal.duplicate_trash.files": "Files",
  "modal.duplicate_trash.space_used": "{size} used",
  "modal.duplicate_trash.delete_all": "🗑️ Delete all permanently",
  "modal.duplicate_trash.moved_at": "Moved: {date} · {size}",
  "modal.duplicate_trash.restore": "Restore",
  "modal.duplicate_trash.delete_permanent": "Delete permanently",
  "modal.duplicate_trash.confirm_empty": "⚠️ Permanently delete all files in trash?",
  "modal.duplicate_trash.error": "Error loading.",
  "modal.delete_confirm.title": "Delete file",
  "modal.delete_confirm.msg": "Do you want to move this file to the trash?",
  "modal.delete_confirm.checkbox": "Don't show this message again",
  "modal.delete_confirm.cancel": "Cancel",
  "modal.delete_confirm.delete": "Delete",
  "modal.trash.title": "🗑 Trash",
  "modal.trash.loading": "Loading...",
  "modal.trash.empty_title": "Trash is empty",
  "modal.trash.empty_msg": "No deleted files.",
  "modal.trash.files": "files",
  "modal.trash.space_used": "{size} used",
  "modal.trash.delete_all": "🗑 Delete all permanently",
  "modal.trash.moved_at": "Deleted: {date} · {size}",
  "modal.trash.restore": "Restore",
  "modal.trash.delete_permanent": "Delete permanently",
  "modal.trash.confirm_empty": "⚠️ Permanently delete all files in trash?",
  "modal.trash.error": "Error loading.",
  "toast.file_trashed": "File moved to trash",
  "toast.file_restored": "File restored",
  "trash.restored_with_meta": "Restored (+{tags} tags, +{categories} categories)",
  "toast.auto_scan_done": "{count} new files assigned to category '{name}'",
  "toast.auto_scan_added": "{count} added",
  "toast.auto_scan_removed": "{count} removed",
  "toast.auto_scan_error": "Auto-scan failed",
  "toast.bulk_cat_success": "{count} models updated",
  "toast.bulk_fav_success": "{count} models favorite updated",
  "toast.bulk_cat_error": "Error: {message}",
  "bulk.count": "{count} models selected",
  "bulk.count_one": "1 model selected",
  "bulk.categories": "Categories",
  "bulk.select_visible": "Select visible",
  "bulk.clear_selection": "Clear selection",
  "bulk.favorite": "★ Favorite",
  "bulk.unfavorite": "☆ Unfavorite",
  "bulk.cancel": "Cancel",
  "bulk.no_selection": "No models selected",
  "bulk.cat_dialog.title": "Assign categories",
  "bulk.cat_dialog.title_n": "Categories for {count} models",
  "bulk.cat_dialog.mode_add": "Add",
  "bulk.cat_dialog.mode_remove": "Remove",
  "bulk.cat_dialog.mode_replace": "Replace",
  "bulk.cat_dialog.clear_all": "Remove all categories",
  "bulk.cat_dialog.clear_confirm": "Really remove all categories from {count} models?",
  "bulk.cat_dialog.apply": "Apply",
  "header.home": "Go to home",
  "header.dashboard": "Dashboard",
  "header.debug_monitor": "Debug Monitor",
  "header.rescan": "Rescan",
  "header.settings": "Settings",
  "header.theme_toggle": "Toggle theme",
  "header.to_gallery": "Go to gallery",
  "header.refresh": "Refresh",
  "header.file_count": "{count} files",
  "renderer_warn.message": "Indexing is approx. 20–100× slower without <code>stl_thumb</code>. Please run <code>build.bat</code> (Windows) or <code>build.sh</code> (Linux) and restart the server.",
  "renderer_warn.dismiss": "✕ Got it",
  "sidebar.library_header": "Library",
  "sidebar.all_files": "All files",
  "sidebar.folders_header": "Folders",
  "sidebar.add_folder": "Add folder",
  "sidebar.filter_header": "Filter",
  "sidebar.favorites": "Favorites",
  "sidebar.new": "New",
  "sidebar.rating_header": "Rating",
  "sidebar.categories_header": "Categories",
  "sidebar.add_category": "Add category",
  "sidebar.tags_header": "Tags",
  "sidebar.add_tag": "Add tag",
  "sidebar.printer_header": "Printer",
  "sidebar.material_header": "Filament",
  "sidebar.nozzle_header": "Nozzle Size",
  "sidebar.trash": "Trash",
  "sidebar.pinned_header": "Pinned Folders",
  "sidebar.quick_access": "Quick Access",
  "sidebar.imported_objects": "Imported Objects",
  "sidebar.unpin_folder": "Unpin",
  "sidebar.no_prints_yet": "No prints recorded yet",
  "sidebar.no_folders": "No folders",
  "sidebar.toggle_tooltip": "Toggle sidebar",
  "sidebar.folder_not_found": "Folder not found",
  "sidebar.new_files": "{count} new files",
  "sidebar.right_click_delete_cat": "{name} — Right-click to delete",
  "sidebar.right_click_delete_tag": "{name} — Right-click to delete",
  "toolbar.sidebar_toggle": "Sidebar",
  "toolbar.search_placeholder": "🔍 Search...",
  "toolbar.sort.name": "Name",
  "toolbar.sort.date": "Date",
  "toolbar.sort.size": "Size",
  "toolbar.sort.triangles": "Triangles",
  "toolbar.sort.rating": "Rating",
  "toolbar.sort_reverse": "Reverse sort order",
  "toolbar.view.grid": "Grid",
  "toolbar.view.list": "List",
  "toolbar.view.detail": "Detail",
  "toolbar.group_btn": "Group",
  "toolbar.group_title": "Toggle folder grouping",
  "toolbar.duplicates_btn": "Duplicates",
  "toolbar.trash_title": "Trash",
  "toolbar.trash_btn": "Trash",
  "toolbar.select_btn": "Select",
  "toolbar.select_title": "Select files",
  "toolbar.duplicates_title": "Find duplicates",
  "gallery.loading": "Loading files...",
  "gallery.empty": "No STL files found.",
  "gallery.scroll_top": "Scroll to top",
  "gallery.jump_to_singles": "⬇ Jump to single files",
  "gallery.file_count": "{count} files",
  "gallery.corrupt_file": "⚠ corrupt",
  "gallery.indexing": "Indexing...",
  "gallery.all_objects": "All ({count} objects)",
  "gallery.object_nav_prev": "Previous object",
  "gallery.object_nav_next": "Next object",
  "gallery.new_ribbon": "NEW",
  "card.analyze_tooltip": "Analyze",
  "viewer.nav.prev_file": "Previous file (←)",
  "viewer.nav.next_file": "Next file (→)",
  "viewer.nav.prev_object": "Previous object",
  "viewer.nav.next_object": "Next object",
  "viewer.object_label": "Object {n}",
  "viewer.ctrl.wireframe": "Wireframe",
  "viewer.ctrl.cycle_orient": "Cycle orientation",
  "viewer.ctrl.auto_orient": "Auto-orient (largest flat surface down)",
  "viewer.ctrl.reset_camera": "Reset camera",
  "viewer.label.notes": "Notes",
  "viewer.label.notes_placeholder": "Notes...",
  "viewer.label.print_history": "Print history",
  "viewer.btn.open_slicer": "🖨 Open in Slicer ▾",
  "viewer.tmf.title_label": "Title:",
  "viewer.tmf.author_label": "Author:",
  "viewer.tmf.objects_label": "Objects:",
  "viewer.tmf.slicer_profile": "Slicer profile:",
  "viewer.tmf.and_more": "...and {count} more",
  "viewer.3mf.preview_label": "Preview — Click › for 3D view",
  "viewer.3mf.preview_cached": "Preview (from cache)",
  "viewer.3mf.image_label": "Image {current}/{total} — Click for 3D view",
  "viewer.3mf.loading_model": "Loading 3D model …",
  "viewer.3mf.no_objects": "No 3D objects found in this file",
  "viewer.3mf.object_label": "{name}  ({current} / {total})",
  "viewer.mismatch.warning": "⚠ File mismatch! Expected: △{expected} hash={expected_hash} — Received: △{received} hash={received_hash} path={path}",
  "viewer.tag.new_placeholder": "New tag...",
  "viewer.tag.create_new": "+ Create \"{name}\"",
  "viewer.newx.path_trigger": "📍 Path",
  "viewer.newx.path_hide": "✕ Hide path",
  "viewer.newx.btn_explorer": "📁 Explorer",
  "viewer.newx.btn_favorite": "☆ Favorite",
  "viewer.newx.btn_favorite_active": "🔖 Favorite",
  "viewer.newx.btn_printed": "✅ Printed",
  "viewer.newx.btn_delete": "🗑 Delete",
  "viewer.newx.rate_label": "Rate",
  "viewer.newx.stat.size": "Size",
  "viewer.newx.stat.printed": "Printed",
  "viewer.newx.stat.triangles": "Triangles",
  "viewer.newx.stat.dimensions": "Dimensions (mm)",
  "viewer.newx.stat.objects": "Objects",
  "viewer.newx.stat.format": "Format",
  "viewer.newx.stat.modified": "Modified",
  "viewer.newx.badge.printed": "🖨 {count}× printed",
  "viewer.newx.badge.favorite": "🔖 Favorite",
  "viewer.newx.image_label": "Image {index}",
  "print_popup.title": "🖨 Printed?",
  "print_popup.status.printed": "✅ Printed",
  "print_popup.status.failed": "❌ Failed",
  "print_popup.status.cancelled": "⏹ Cancelled",
  "print_popup.material_placeholder": "Material (PLA, PETG...)",
  "print_popup.hours_placeholder": "Hrs",
  "print_popup.minutes_placeholder": "Min",
  "print_popup.hours_unit": "h",
  "print_popup.minutes_unit": "m",
  "print_popup.notes_placeholder": "Print notes...",
  "print_popup.save": "Save",
  "print_popup.dismiss": "Later",
  "print_popup.saving": "Saving...",
  "print_overlay.title": "🖨️ Log Print Job",
  "print_overlay.tile.plate": "Plate Preview",
  "print_overlay.tile.settings": "Print Settings",
  "print_overlay.tile.filament": "Filament",
  "print_overlay.tile.speed": "Speed",
  "print_overlay.tile.platform": "Platform & Hardware",
  "print_overlay.tile.log": "Log Print",
  "print_overlay.upload_hint": "Drop .gcode.3mf here<br>or click to upload",
  "print_overlay.uploading": "Uploading GCode...",
  "print_overlay.uploaded": "GCode analyzed & archived",
  "print_overlay.gcode_version": "GCode Version",
  "print_overlay.gcode_version_label": "v{version}",
  "print_overlay.gcode_version_latest": "(current)",
  "print_overlay.gcode_version_legacy": "Legacy",
  "print_overlay.saved": "Print job saved",
  "print_overlay.kpi.time": "Print Time",
  "print_overlay.kpi.weight": "Weight",
  "print_overlay.kpi.length": "Filament",
  "print_overlay.kpi.layers": "Layers",
  "print_overlay.kpi.height": "Height",
  "print_overlay.layer_height": "Layer Height",
  "print_overlay.first_layer": "First Layer",
  "print_overlay.walls": "Walls",
  "print_overlay.top_bottom": "Top / Bottom",
  "print_overlay.infill": "Infill",
  "print_overlay.support": "Support",
  "print_overlay.brim": "Brim",
  "print_overlay.ironing": "Ironing",
  "print_overlay.fil_type": "Type",
  "print_overlay.fil_profile": "Profile",
  "print_overlay.fil_color": "Color",
  "print_overlay.fil_used": "Used",
  "print_overlay.fil_weight": "Weight",
  "print_overlay.fil_cost": "Cost",
  "print_overlay.fil_diameter": "Diameter",
  "print_overlay.outer_wall": "Outer Wall",
  "print_overlay.inner_wall": "Inner Wall",
  "print_overlay.printer": "Printer",
  "print_overlay.bed": "Bed",
  "print_overlay.nozzle": "Nozzle",
  "print_overlay.nozzle_temp": "Nozzle Temp",
  "print_overlay.print_profile": "Print Profile",
  "print_overlay.notes_placeholder": "Print notes... (quality, issues, post-processing, improvements)",
  "print_overlay.btn.save": "💾 Archive GCode & Save",
  "print_overlay.btn.update": "💾 Update",
  "print_overlay.btn.reprint": "🔄 Reprint",
  "print_overlay.btn.later": "Later",
  "print_overlay.btn.discard": "Don't save",
  "print_overlay.status.printed": "✅ Printed successfully",
  "print_overlay.status.failed": "❌ Failed",
  "print_overlay.status.cancelled": "⏹ Cancelled",
  "welcome.cc.kpi.files": "Files",
  "welcome.cc.kpi.tmf": "3MF",
  "welcome.cc.kpi.prints": "Prints",
  "welcome.cc.kpi.size": "Library",
  "welcome.cc.kpi.folders": "Folders",
  "welcome.cc.actions_header": "⚡ Quick Actions",
  "welcome.cc.action.add_folder": "Add folder",
  "welcome.cc.action.duplicates": "Find duplicates",
  "welcome.cc.action.dashboard": "Dashboard",
  "welcome.cc.action.settings": "Settings",
  "welcome.cc.action.reprint": "Reprint jobs",
  "welcome.cc.action.trash": "Trash",
  "welcome.cc.activity_header": "🕐 Recent Activity",
  "welcome.cc.activity_empty": "No activity yet",
  "sidebar.printed_header": "Printed",
  "sidebar.printed": "Printed",
  "sidebar.has_gcode": "With GCode archive",
  "sidebar.gcode_files": "GCode files",
  "gcode_archive.title": "🖨 Reprint Jobs",
  "gcode_archive.empty": "No archived prints yet. Send a file to the slicer and upload the .gcode.3mf in the print log overlay.",
  "gcode_archive.reprint": "🔄 Reprint",
  "gcode_archive.details": "Details",
  "dashboard.chart.week_short": "W {nr}",
  "dashboard.dup.duplicate_files": "Duplicate files ({size} wasted)",
  "dashboard.dup.groups": "Duplicate groups",
  "dashboard.dup.none_found": "No duplicates found",
  "dashboard.dup.open_manager": "Open duplicate manager →",
  "dashboard.empty.chartjs_unavailable": "Chart.js not available",
  "dashboard.empty.loading": "Loading…",
  "dashboard.empty.no_categories": "No categories assigned",
  "dashboard.empty.no_prints": "No prints yet",
  "dashboard.empty.no_tags": "No tags available",
  "dashboard.empty.no_time_data": "No time data yet",
  "dashboard.fmt.billion": "B",
  "dashboard.fmt.million": "M",
  "dashboard.fmt.million_short": "M",
  "dashboard.fmt.thousand_short": "K",
  "dashboard.header": "📊 Dashboard",
  "dashboard.kpi.favorites": "Favorites",
  "dashboard.kpi.favorites_pct": "Favorites ({pct}%)",
  "dashboard.kpi.files": "Files",
  "dashboard.kpi.format_ratio": "STL / 3MF / OBJ",
  "dashboard.kpi.total_size": "Total size",
  "dashboard.kpi.total_triangles": "Total triangles",
  "dashboard.rating.no_files": "No files",
  "dashboard.rating.unrated": "{count} files without rating",
  "dashboard.tile.categories": "📂 Categories",
  "dashboard.tile.duplicates": "🔍 Duplicates",
  "dashboard.tile.format_distribution": "🍩 Format distribution",
  "dashboard.tile.material_ranking": "🧵 Material ranking",
  "dashboard.tile.most_printed": "🏆 Top 5 most printed",
  "dashboard.tile.print_timeline": "🖨️ Print timeline (months)",
  "dashboard.tile.ratings": "⭐ Ratings",
  "dashboard.tile.recently_added": "📈 Recently added (weeks)",
  "dashboard.tile.tag_cloud": "🏷️ Tag cloud",
  "dashboard.tile.triangle_details": "🔺 Triangle details",
  "dashboard.tile.triangle_histogram": "📊 Triangle histogram",
  "dashboard.tri.average": "Average",
  "dashboard.tri.fewest": "Fewest",
  "dashboard.tri.most": "Most",
  "dashboard.tri.total": "Total",
  "settings.slicer.title": "🖨 Slicer configuration",
  "settings.slicer.count": "{count} slicers configured",
  "settings.slicer.add_btn": "+ Add slicer",
  "settings.slicer.detect_btn": "🔍 Detect slicers",
  "settings.slicer.detecting": "🔍 Searching...",
  "settings.slicer.name_placeholder": "Name (e.g. BambuStudio)",
  "settings.slicer.path_placeholder": "Path to .exe",
  "settings.slicer.args_hint": "Args: <code>{file}</code> will be replaced with the STL path",
  "settings.slicer.all_added": "All detected slicers already added ✓",
  "settings.slicer.none_found": "No slicers found. Please add manually.",
  "settings.slicer.detect_error": "Detection error",
  "settings.slicer.delete_title": "Delete",
  "settings.language.label": "🌐 Language",
  "settings.language.desc": "Auto-detect from browser or choose manually",
  "settings.language.auto": "Auto (Browser)",
  "settings.gallery.title": "🖼 Gallery & display",
  "settings.ui_scale.label": "UI size",
  "settings.gallery.ui_scale": "UI size",
  "settings.gallery.ui_scale.small": "Small",
  "settings.gallery.ui_scale.standard": "Standard",
  "settings.gallery.ui_scale.medium": "Medium",
  "settings.gallery.ui_scale.large": "Large",
  "settings.gallery.ui_scale.xlarge": "Extra large",
  "settings.gallery.group_default": "Auto-group objects",
  "settings.gallery.default_sort.label": "Default sorting",
  "settings.gallery.default_sort.desc": "Sort criterion when gallery starts",
  "settings.gallery.default_sort_order.label": "Sort direction",
  "settings.gallery.default_sort_order.name.asc": "A → Z",
  "settings.gallery.default_sort_order.name.desc": "Z → A",
  "settings.gallery.default_sort_order.date.asc": "Oldest first",
  "settings.gallery.default_sort_order.date.desc": "Newest first",
  "settings.gallery.default_sort_order.size.asc": "Smallest first",
  "settings.gallery.default_sort_order.size.desc": "Largest first",
  "settings.gallery.default_sort_order.triangles.asc": "Fewest first",
  "settings.gallery.default_sort_order.triangles.desc": "Most first",
  "settings.gallery.default_sort_order.rating.asc": "Lowest first",
  "settings.gallery.default_sort_order.rating.desc": "Highest first",
  "settings.info.language": "Changes the language of the entire interface. 'Auto' detects the browser language.",
  "settings.info.default_sort": "Defines how files are sorted by default in the gallery.",
  "settings.info.default_sort_order": "Ascending or descending sort order.",
  "settings.info.ui_scale": "Enlarges or shrinks all UI elements (cards, text, buttons).",
  "settings.info.model_light": "Color of the 3D model in the viewer with light theme.",
  "settings.info.model_dark": "Color of the 3D model in the viewer with dark theme.",
  "settings.info.badge_color": "Color of the file format badge in the gallery overview.",
  "settings.info.hidden_folders": "Folders starting with a dot or underscore are skipped during scanning.",
  "settings.info.watcher_enabled": "Automatically monitors library folders for new, changed, or deleted files.",
  "settings.info.watcher_interval": "Time between checks. Shorter intervals detect changes faster but use more resources.",
  "settings.info.watcher_notify": "Shows a browser notification when new files are found during automatic scanning.",
  "settings.info.print_delay": "After sending to the slicer, a print log popup appears after this delay.",
  "settings.info.invert_rot_h": "Reverses the horizontal rotation direction in the 3D viewer.",
  "settings.info.invert_rot_v": "Reverses the vertical rotation direction in the 3D viewer.",
  "settings.info.invert_pan_h": "Reverses the horizontal panning direction in the 3D viewer.",
  "settings.info.invert_pan_v": "Reverses the vertical panning direction in the 3D viewer.",
  "settings.info.bed_toggle": "Displays a scaled print bed underneath the 3D model in the viewer.",
  "settings.info.bed_preset": "Selects a preconfigured print bed with matching dimensions for your printer.",
  "settings.info.group_default": "When enabled, files are automatically grouped by folder on every view change. The toolbar group button can still be toggled temporarily.",
  "settings.info.ratings": "Enables the 5-star rating system in the gallery and viewer.",
  "settings.info.delete_no_confirm": "Files are moved to trash immediately without confirmation dialog.",
  "settings.info.workers": "Number of parallel processes for thumbnail generation. More workers = faster scan, but higher CPU usage.",
  "settings.info.debug": "Opens a live monitor with scanner, server, and watcher logs in the browser.",
  "settings.info.full_3mf": "Analyzes all 3MF files immediately instead of lazy-loading. Significantly slows down scanning.",
  "settings.info.auto_tag_overwrite": "When enabled, existing tags are replaced by auto-generated ones. Otherwise only new tags are added.",
  "settings.thumbnails.title": "📷 Thumbnails & scanner",
  "settings.thumbnails.hidden_folders": "📂 Ignore hidden folders",
  "settings.thumbnails.hidden_folders_hint": "Skip folders with . or _ prefix",
  "settings.thumbnails.scan_hint": "Change takes effect on next scan. You may need to regenerate thumbnails.",
  "settings.scanner.exclude_title": "Excluded Folders",
  "settings.scanner.exclude_hint": "These folders will be ignored during scanning and file watching.",
  "settings.scanner.exclude_add": "Add Folder",
  "settings.scanner.exclude_manage": "Manage Folders",
  "settings.scanner.exclude_modal_title": "Exclude Folders",
  "settings.scanner.exclude_modal_done": "Done",
  "settings.scanner.exclude_empty": "No folders excluded",
  "settings.scanner.exclude_remove_title": "Click to remove",
  "settings.watcher.title": "👁 Monitoring",
  "settings.watcher.enabled_label": "Watch folders",
  "settings.watcher.enabled_hint": "Automatically detect new/changed files",
  "settings.watcher.interval_label": "Auto-scan interval",
  "settings.watcher.interval_hint": "How often the watcher checks",
  "settings.watcher.interval.5s": "5 seconds",
  "settings.watcher.interval.30s": "30 seconds",
  "settings.watcher.interval.1m": "1 minute",
  "settings.watcher.interval.5m": "5 minutes",
  "settings.watcher.notify_label": "🔔 Desktop notification",
  "settings.watcher.notify_hint": "Browser notification when scan completes",
  "settings.watcher.print_delay_label": "Popup delay (print)",
  "settings.watcher.print_delay_unit": "Min",
  "settings.gcode_watch.title": "GCode Watch",
  "settings.gcode_watch.enabled": "Auto-detect GCode files",
  "settings.gcode_watch.folders_label": "Watched folders",
  "settings.gcode_watch.default_tag": "Default",
  "settings.gcode_watch.add_folder": "+ Add folder",
  "gcode.toast.detected": "GCode detected",
  "gcode.toast.pending_match": "Queue",
  "gcode.toast.library_match": "matches",
  "gcode.toast.no_match": "No matching file found",
  "gcode.toast.import_button": "Import",
  "gcode.toast.ignore_button": "Ignore",
  "gcode.toast.assign_button": "Assign manually",
  "gcode.toast.import_success": "GCode imported",
  "gcode.toast.import_error": "GCode import failed",
  "gcode.toast.converting_stl": "STL converted",
  "gcode.match.title": "GCode detected",
  "gcode.match.target": "Target file",
  "gcode.match.confirm": "Link",
  "gcode.match.cancel": "Cancel",
  "gcode.match.only_3mf_tooltip": "Only 3MF models can embed GCode — save as 3MF in your slicer",
  "gcode.picker.title": "Assign file",
  "gcode.picker.search_placeholder": "Search filename...",
  "gcode.link.title": "Link GCode",
  "gcode.link.default_folders": "Default folders",
  "gcode.link.folder": "Folder",
  "gcode.link.no_gcode": "No GCode files found",
  "gcode.link.importing": "Importing GCode...",
  "gcode.link.search_ph": "Search…",
  "gcode.link.suggestions": "Suggestions",
  "gcode.link.all": "All (newest first)",
  "gcode.link.count": "{n} entries",
  "gcode.link.type_gcode": "GCODE",
  "gcode.link.type_gcode3mf": "GCODE·3MF",
  "gcode.link.type_3mf": "3MF",
  "gcode.link.title_reverse": "Link model",
  "gcode.link.empty_hint_reverse": "No 3MF files in library.",
  "gcode.link.empty_hint": "No GCode files indexed. Put GCodes in a library folder or use 'From file…'",
  "gcode.link.no_search_match": "No matches",
  "gcode.link.delete_source": "Move original files to trash",
  "gcode.link.browse_fallback": "From file…",
  "gcode.link.browse_title": "Select GCode file",
  "gcode.link.back": "Back to library",
  "gcode.link.cancel": "Cancel",
  "gcode.link.submit": "Link",
  "gcode.link.toast_success": "GCode linked: {name}",
  "gcode.link.toast_error": "Link failed",
  "gcode.link.loading": "Loading…",
  "gcode.link.today": "today",
  "gcode.link.yesterday": "yesterday",
  "settings.colors.title": "🎨 Colors",
  "settings.colors.model_light": "Model (Light)",
  "settings.colors.model_dark": "Model (Dark)",
  "settings.colors.badge_stl": "STL badge",
  "settings.colors.badge_3mf": "3MF badge",
  "settings.colors.badge_obj": "OBJ badge",
  "settings.controls.title": "🔄 3D Viewer controls",
  "settings.controls.invert_rot_h": "Invert rotation H",
  "settings.controls.invert_rot_v": "Invert rotation V",
  "settings.controls.invert_pan_h": "Invert pan H",
  "settings.controls.invert_pan_v": "Invert pan V",
  "settings.sidebar.title": "📋 Sidebar & features",
  "settings.sidebar.ratings_label": "⭐ Rating system",
  "settings.sidebar.ratings_hint": "Show star ratings in gallery and viewer",
  "settings.sidebar.manage_tags": "🏷 Manage tags",
  "settings.sidebar.manage_categories": "📁 Manage categories",
  "settings.sidebar.add_new": "+ New",
  "settings.sidebar.no_tags": "No tags available",
  "settings.sidebar.no_categories": "No categories available",
  "settings.sidebar.click_to_rename": "Click to rename",
  "settings.sidebar.edit_title": "Edit (name & icon)",
  "settings.sidebar.edit_label": "Edit",
  "settings.performance.title": "⚡ Advanced performance settings",
  "settings.performance.expert_badge": "EXPERT",
  "settings.performance.warning_title": "For experienced users only!",
  "settings.performance.warning_msg": "Incorrect settings can severely impact performance.",
  "settings.performance.debug_label": "Debug Monitor",
  "settings.performance.debug_hint": "Live consoles for scanner, server and watcher in the browser",
  "settings.performance.full_3mf_label": "Full 3MF Analysis",
  "settings.performance.full_3mf_hint": "⚠ Massively slows down scanning! Analyzes all 3MF files immediately instead of lazy-loading. Useful for similarity detection.",
  "settings.performance.workers_label": "Scan Workers",
  "settings.performance.workers_hint": "Number of parallel C renderer processes during scan (1–4)",
  "settings.performance.restart_btn": "⟳ Restart server",
  "settings.performance.restart_hint": "Only needed for instability",
  "settings.shortcut.title": "Desktop shortcut",
  "settings.shortcut.description": "Creates a shortcut on the desktop to launch STL Gallery directly.",
  "settings.shortcut.create_btn": "Create shortcut",
  "settings.dup_trash.title": "🗑️ Duplicate trash",
  "settings.dup_trash.description": "Duplicates moved here can be restored or permanently deleted.",
  "settings.dup_trash.view_btn": "📂 View deleted duplicates",
  "settings.delete.title": "🗑 Delete files",
  "settings.delete.no_confirm_label": "Delete without confirmation",
  "settings.delete.no_confirm_hint": "Move files directly to trash without confirmation dialog",
  "settings.delete.view_trash_btn": "📂 View trash",
  "settings.btn.cancel": "Cancel",
  "settings.btn.save": "Save",
  "ctx.set_favorite": "☆ Set favorite",
  "ctx.remove_favorite": "★ Remove favorite",
  "ctx.rating_label": "Rating:",
  "ctx.tags_header": "TAGS",
  "ctx.categories_header": "CATEGORIES",
  "ctx.new_tag": "+ New tag...",
  "ctx.tag_cat.edit": "✏️ Edit",
  "ctx.tag_cat.regen_thumbs": "🔄 Regenerate thumbnails",
  "ctx.tag_cat.untag_all": "🏷 Remove all files",
  "ctx.tag_cat.delete": "🗑 Delete",
  "ctx.tag_cat.keywords_label": "Search terms:",
  "ctx.tag_cat.no_keywords": "No search terms defined",
  "ctx.tag_cat.auto_scan": "🔍 Run auto-scan",
  "ctx.clear_all_tags": "🏷 Remove all tags",
  "ctx.clear_all_categories": "📂 Remove all categories",
  "ctx.bulk_categories": "Assign categories…",
  "ctx.bulk_clear_cats": "Remove all categories",
  "ctx.bulk_deselect": "Deselect all",
  "ctx.open_explorer": "📂 Open in Explorer",
  "ctx.download": "📥 Download",
  "ctx.regen_thumb": "🔄 Regenerate thumbnail",
  "ctx.mark_seen": "✓ Mark as seen",
  "ctx.delete_file": "🗑 Delete",
  "ctx.send_to_slicer": "🖨 Send to slicer",
  "ctx.configure_slicer": "⚙️ Configure slicer",
  "ctx.complete_3mf": "📦 Complete 3MF",
  "ctx.selection": "🔹 Selection: {name}",
  "ctx.send_to": "Send to {name}",
  "ctx.folder.reindex": "🔄 Reindex",
  "ctx.folder.regen_thumbs": "🖼 Regenerate thumbnails",
  "ctx.folder.remove_from_list": "🗑 Remove from list",
  "ctx.folder.rescan": "🔄 Rescan",
  "ctx.folder.remove_files": "🗑 Remove files",
  "ctx.folder.pin": "Pin folder",
  "ctx.folder.unpin": "Unpin",
  "ctx.group.pin": "Pin folder",
  "ctx.group.unpin": "Unpin",
  "ctx.group.rescan": "🔄 Rescan",
  "ctx.group.regen_thumbs": "🖼 Regenerate thumbnails",
  "ctx.group.open_explorer": "📂 Open in file manager",
  "ctx.new_files.mark_all_seen": "✓ Mark all as seen",
  "confirm.remove_folder": "Remove folder from library?\n\n{path}\n\nAll indexed files and thumbnails will be deleted.",
  "confirm.remove_folder_title": "Remove folder",
  "confirm.remove_folder_msg": "{path}\n\nAll indexed files and thumbnails will be deleted.",
  "confirm.remove_subfolder": "Remove all files from subfolder?\n\n{name}\n\nThe indexed files and thumbnails will be deleted. The folder will remain.",
  "confirm.remove_subfolder_title": "Remove subfolder",
  "confirm.remove_subfolder_msg": "{name}\n\nThe indexed files and thumbnails will be deleted. The folder will remain.",
  "confirm.remove_btn": "Remove",
  "confirm.cancel": "Cancel",
  "confirm.non_mesh_title": "{ext} File",
  "confirm.non_mesh_msg": "STL Gallery cannot display this file directly. Would you like to open it in the associated software?",
  "confirm.non_mesh_open": "Open Software",
  "confirm.delete_category": "Delete category \"{name}\"?",
  "confirm.delete_tag": "Delete tag \"{name}\"?",
  "confirm.delete_tag_full": "Really delete tag \"{name}\"?\n\nThe tag will be removed from all files.",
  "confirm.delete_category_full": "Really delete category \"{name}\"?\n\nThe category will be removed from all files.",
  "confirm.untag_all_category": "Remove all files from category \"{name}\"?\n\nThe category itself will remain.",
  "confirm.untag_all_tag": "Remove all files from tag \"{name}\"?\n\nThe tag itself will remain.",
  "toast.untag_all_done": "All files removed from \"{name}\"",
  "confirm.restart_server": "Really restart the server?\n\nThe page will automatically reload after the restart.",
  "error.generic": "Error: {message}",
  "error.http": "Error {status}",
  "error.slicer_failed": "Slicer failed to start",
  "error.folder_not_found": "Parent folder not found",
  "error.scan_failed": "Error indexing: {status}",
  "error.subfolder_scan_failed": "Error scanning: {status}",
  "error.tag_exists": "Tag already exists",
  "alert.new_tag_prompt": "New tag name:",
  "scan.status": "Indexing: {file} ({done}/{total})",
  "scan.status_queue": "Indexing: {file} ({done}/{total}) (Folder {queue_done}/{queue_total})",
  "scan.phase_discovery": "Discovering files...",
  "scan.thumbnail_progress": "Thumbnails: {done}/{total}",
  "scan.loading_thumbnails": "Loading thumbnails...",
  "scan.complete_notification": "Scan complete!",
  "scan.eta_calculating": "Calculating ETA…",
  "restart.title": "Server is restarting…",
  "restart.waiting": "Waiting for server…",
  "restart.waiting_count": "Waiting for server… ({seconds}s)",
  "restart.reconnected": "Server is back! Reloading page…",
  "restart.failed": "Server not responding. Please restart manually.",
  "format.objects": "Objects",
  "format.object_single": "Object {index}",
  "welcome.update_available": "New version {version} available — download now",
  "welcome.update_current": "Version is up to date",
  "welcome.update_error": "Update check failed",
  "update.confirm_title": "Install update",
  "update.confirm_message": "Install update to v{version}? The app will restart.",
  "update.confirm_button": "Update now",
  "update.cancel_button": "Cancel",
  "update.downloading": "Downloading update…",
  "update.preparing": "Preparing update…",
  "update.restarting": "App is restarting…",
  "update.error": "Update failed. Please download manually.",
  "update.check_button": "Check for updates",
  "welcome.shortcut_prompt": "Create a desktop shortcut for STL Gallery?",
  "welcome.shortcut_yes": "Yes, please",
  "welcome.shortcut_no": "No thanks",
  "welcome.shortcut_created": "Desktop shortcut created",
  "viewer.similar.title": "Similar Models",
  "viewer.similar.loading": "Searching similar…",
  "viewer.similar.none": "No similar models found",
  "viewer.similar.score": "{score}% similar",
  "ctx.find_similar": "Find similar",
  "settings.viewer.bed_title": "Print Bed",
  "settings.viewer.bed_toggle": "Show print bed in viewer",
  "settings.viewer.bed_x": "Width (X) mm",
  "settings.viewer.bed_y": "Depth (Y) mm",
  "settings.viewer.bed_z": "Height (Z) mm",
  "settings.viewer.bed_preset": "Printer preset",
  "settings.viewer.bed_preset_pick": "— Select printer —",
  "viewer.bed.too_large": "Model exceeds print bed!",
  "gallery.mesh_warning": "Mesh issues detected",
  "viewer.mesh.title": "Mesh Quality",
  "viewer.mesh.non_manifold": "Non-manifold edges",
  "viewer.mesh.flipped": "Flipped normals",
  "viewer.mesh.degenerate": "Degenerate triangles",
  "viewer.mesh.ok": "No issues",
  "auto_tag.title": "Auto-Tagging",
  "auto_tag.loading": "Analyzing files…",
  "auto_tag.no_suggestions": "No suggestions — all files are already tagged or could not be recognized.",
  "auto_tag.error": "Error loading suggestions.",
  "auto_tag.count": "{count} suggestions",
  "auto_tag.select_all": "All",
  "auto_tag.select_none": "None",
  "auto_tag.cancel": "Cancel",
  "auto_tag.apply": "Apply",
  "auto_tag.applied": "{count} files tagged",
  "auto_tag.none_selected": "No suggestions selected.",
  "auto_tag.sidebar_categories": "Categories",
  "auto_tag.sidebar_confidence": "Confidence",
  "auto_tag.filter_all": "All",
  "auto_tag.selected_label": "selected",
  "auto_tag.click_remove": "Click to remove",
  "auto_tag.add_category": "Add category/tag",
  "ctx.auto_tag": "Suggest auto-tag",
  "ctx.link_gcode": "Link GCode",
  "ctx.link_gcode_reverse": "Link to model",
  "gcode.match.detected": "GCode detected",
  "settings.auto_tag.title": "Auto-Tagging",
  "settings.auto_tag.overwrite": "Include already tagged files",
  "settings.auto_tag.run": "Run now",
  "settings.auto_tag.keywords_title": "Keyword Mapping",
  "settings.auto_tag.keywords_desc": "Define keywords per category. Confirm with Enter, × to remove, double-click to edit. Files with these terms in their name or path will be automatically assigned.",
  "settings.auto_tag.keywords_placeholder": "e.g. gear, bracket, mount...",
  "settings.auto_tag.keywords_save": "Save keywords",
  "settings.auto_tag.keywords_saved": "Keywords saved",
  "settings.auto_tag.keywords_remove": "Remove",
  "settings.auto_tag.auto_run_result": "{count} files received an AutoTag",
  "settings.auto_tag.auto_run_none": "No changes made",
  "settings.auto_tag.cleanup_result": "{count} files removed from category",
  "settings.auto_tag.suggestions_title": "Suggestions from filenames",
  "settings.auto_tag.suggestions_desc": "Common terms in your library. Click + to assign a word to a category.",
  "settings.auto_tag.suggestions_loading": "Loading...",
  "settings.auto_tag.suggestions_empty": "No suggestions found",
  "settings.auto_tag.suggestions_add": "Assign to category",
  "gallery.plugin.open_slicer": "Open Slicer",
  "gallery.plugin.open_app": "Open {app}",
  "settings.cat.import_suggestions": "📦 Import suggestions",
  "settings.cat.import_suggestions_title": "Imports 30 predefined 3D-printing categories with keywords (existing are skipped)",
  "settings.cat.import_confirm": "{count} of {total} suggested categories will be imported. Continue?",
  "settings.cat.import_result": "{count} categories imported",
  "settings.cat.import_none": "All {total} suggested categories already exist",
  "dnd.conflict.title": "Move Conflicts",
  "dnd.conflict.summary": "{count} of {total} files already exist in target",
  "dnd.conflict.target_label": "in »{target}«",
  "dnd.conflict.existing": "Existing",
  "dnd.conflict.incoming": "Incoming",
  "dnd.conflict.question": "How do you want to proceed?",
  "dnd.conflict.skip": "Skip",
  "dnd.conflict.rename": "Keep both (rename)",
  "dnd.cancel": "Cancel",
  "toast.move.success": "Moved {count} file(s) to '{folder}'",
  "toast.move.partial": "{done} moved, {skipped} skipped",
  "toast.move.trash": "Moved {count} file(s) to trash",
  "toast.move.error": "Move failed: {reason}",
  "toast.move.same_folder": "File(s) already in target folder",
  "toast.move.outside_library": "Target is outside registered library",
  "toast.move.cancelled": "Cancelled",
  "toast.move.db_failed": "{count} file(s) moved, but database update failed",
  "toast.move.inconsistent": "Warning: inconsistent state, see log",
  "toast.select.incomplete": "Selection incomplete — not all pages could be loaded"
}
