{
  "common": {
    "home": "Home",
    "tools": "Tools",
    "blog": "Blog",
    "about": "About",
    "contact": "Contact",
    "privacy": "Privacy Policy",
    "terms": "Terms of Service",
    "search": "Search tools…",
    "footer_text": "All rights reserved. Made with ❤️ for creators.",
    "sponsor": "Sponsor",
    "support_project": "Support this project",
    "support_description": "Building free tools takes time and passion. Your support helps keep this project alive!",
    "all_rights_reserved": "All rights reserved.",
    "progress": "Progress",
    "groups": "Groups",
    "sample": "Sample",
    "reset_sample": "Reset sample",
    "showing_first_n": "Showing first {{count}} matches to keep things speedy.",
    "no_capture_groups": "No capture groups in this match.",
    "group": "Group",
    "empty": "Empty",
    "swap_directions": "Swap input and output directions",
    "upload_error_type": "Unsupported file type: {{name}}.",
    "upload_error_size": "{{name}} exceeds the {{size}} MB file limit."
  },
  "tool_page": {
    "share_tool": "Share this tool:",
    "copy_link": "Copy Link",
    "link_copied": "Copied!",
    "share_qr": "Share QR",
    "generating_qr": "Generating QR…",
    "share_by_scanning": "Scan to share",
    "scan_on_mobile": "Scan with mobile or save image",
    "failed_qr": "Failed to generate QR",
    "close": "Close",
    "loading": "Loading",
    "preparing": "Loading tool… Large PDF or media libraries may take a moment.",
    "coming_soon": "Coming Soon",
    "roadmap_message": "This tool is on the roadmap. Follow the project or check back after the next release.",
    "why_use": "Why use it",
    "faq": "FAQ",
    "faq_subtitle": "Useful answers you can reuse.",
    "tool_details": "Tool Details",
    "category": "Category",
    "tags": "Tags",
    "referral": "Referral",
    "recommended": "Recommended",
    "get_deal": "Get Deal",
    "more_tools": "More Tools",
    "related_guides": "Related Guides",
    "browse_directory": "Browse full directory"
  },
  "seo": {
    "free_prefix": "Free",
    "high_quality_suffix": " (High Quality)",
    "tool_not_found": "Tool not found",
    "description_suffix": "Free, browser-based, no sign-up.",
    "unavailable_description": "The requested tool is not available inside JW Tool Box.",
    "keywords_free_online": "free online tool",
    "keywords_no_signup": "no sign-up required",
    "keywords_web": "web tool",
    "no_signup_required": "No account or sign-up is required.",
    "free_online_tool": "Free Online {{name}}"
  },
  "faq_content": {
    "is_free_question": "Is this tool free to use?",
    "is_free_answer": "Yes. JW Tool Box is free to use, with no account or sign-up required."
  },
  "image_watermark": {
    "title": "Batch Image Watermark (Local)",
    "description": "Add text watermarks and export JPG/PNG ZIP in your browser without uploading—perfect for photos, screenshots, or invoices.",
    "drag_drop": "Click or Drop Images (JPG/PNG/WebP)",
    "processed_locally": "Processed locally; export as ZIP.",
    "watermark_text": "Watermark Text",
    "sample_watermark": "Sample Watermark",
    "position": "Position",
    "center": "Center",
    "top_left": "Top Left",
    "top_right": "Top Right",
    "bottom_left": "Bottom Left",
    "bottom_right": "Bottom Right",
    "opacity": "Opacity",
    "text_size": "Text Size (% of short edge)",
    "output_format": "Output Format",
    "format_hint": "PNG keeps fidelity; JPG is smaller & adjustable.",
    "jpg_quality": "JPG Quality",
    "download_zip": "Download ZIP",
    "processing": "Processing…",
    "clear_all": "Clear All",
    "please_choose_images": "Please choose image files.",
    "msg_add_images": "Please add some images first.",
    "msg_enter_text": "Please enter watermark text.",
    "msg_processing": "Processing…",
    "msg_done": "Done! {{count}} images processed.",
    "msg_failed": "Something went wrong during processing."
  },
  "qr_code": {
    "generator_label": "Generator",
    "generator_title": "Convert any link into a scan-friendly QR code.",
    "error_create": "Could not create a QR code right now. Please try again.",
    "error_url": "Please enter a valid URL before generating.",
    "error_generate_first": "Generate a QR code before downloading.",
    "error_prepare_download": "Unable to prepare the QR code for download.",
    "enter_url": "Enter URL here…",
    "generate_button": "Generate QR Code",
    "download_button": "Download QR Code (PNG)"
  },
  "password_generator": {
    "error_select_charset": "Select at least one character set.",
    "error_generate_first": "Generate a password first.",
    "error_clipboard": "Clipboard access is not available.",
    "length": "Length",
    "include_lowercase": "Include Lowercase (a-z)",
    "include_uppercase": "Include Uppercase (A-Z)",
    "include_numbers": "Include Numbers (0-9)",
    "include_symbols": "Include Symbols (!@#$)",
    "avoid_ambiguous": "Avoid Ambiguous (I, l, 1, O, 0)",
    "generate_button": "Generate New Password",
    "copy_button": "Copy",
    "copied": "Copied!"
  },
  "calculator": {
    "expression": "Expression",
    "history": "History",
    "empty_history": "No history yet.",
    "shortcuts": "Keyboard shortcuts: Enter to evaluate, Backspace to delete, Esc to clear.",
    "error_invalid": "Invalid expression",
    "mode_scientific": "Scientific",
    "mode_standard": "Standard",
    "switch_to_scientific": "Switch to Scientific",
    "switch_to_basic": "Switch to Basic"
  },
  "home": {
    "hero_title": "Free Developer Tools",
    "hero_subtitle": "Free browser tools. No account or sign-up required."
  },
  "blog_page": {
    "all_guides": "All guides",
    "meta_title": "Blog",
    "meta_description": "Practical guides and workflow notes tied to JW Tool Box tools, including PDFs, images, text utilities, and browser-based productivity tasks.",
    "eyebrow": "Blog",
    "title": "Practical guides for browser-based tools and workflows",
    "description": "Step-by-step articles, tested workflows, and reference guides that support the tools published on JW Tool Box.",
    "post_eyebrow": "Blog post",
    "read_more": "Read more",
    "prev": "← Prev",
    "next": "Next →",
    "page_info": "Page {{current}} of {{total}}",
    "page_description": "Browse {{total}} practical guides on PDF, image, text and developer workflows — step-by-step tutorials you can follow without installing anything. Page {{current}} of {{pages}}."
  },
  "blog_post": {
    "share_prompt": "Like this post? Share it:",
    "back_to_blog": "Back to blog",
    "last_updated": "Last updated {{date}}",
    "related_guides": "Related guides",
    "related_tools": "Recommended tools"
  },
  "about_page": {
    "meta_title": "About Us - Our Mission & Story",
    "meta_description": "Learn about the mission behind JW Tool Box: to provide fast, privacy-focused, and free browser-based utilities for developers and creators worldwide.",
    "eyebrow": "Our Mission",
    "title": "Empowering Creators with Privacy-First Tools",
    "description": "JW Tool Box exists to publish fast, privacy-aware browser tools and the practical guides that help people use them well. The site is maintained as a long-term product: keep the workflows simple, document the tradeoffs clearly, and avoid unnecessary uploads or account walls whenever possible.",
    "values": [
      {
        "title": "Privacy by Design",
        "body": "Many tools process supported files and text directly in your browser."
      },
      {
        "title": "Free to Use, No Sign-ups",
        "body": "Use the tools for free without an account or subscription."
      },
      {
        "title": "Built for Professionals",
        "body": "Whether you are a developer debugging JSON, a designer converting vectors, or a writer checking word counts, our tools are built to handle real-world workflows with precision."
      }
    ],
    "explore_tools": "Explore the tools",
    "privacy_commitments": "Privacy commitments",
    "card_text": "Free browser tools for everyday tasks, without registration."
  },
  "contact_page": {
    "meta_title": "Contact",
    "meta_description": "Reach out about JW Tool Box. Messages are sent via your email client—no data is stored.",
    "eyebrow": "Contact",
    "title": "Get in touch",
    "description": "Messages open in your own email client, so the site does not store form submissions. Use this page for bug reports, corrections, feature requests, or partnership inquiries.",
    "form": {
      "name": "Your name (optional)",
      "email": "Your email (reply-to)",
      "subject": "Subject",
      "message": "Message",
      "send": "Send message"
    },
    "placeholders": {
      "name": "Jane Doe",
      "email": "you@example.com",
      "subject": "Feature request / Bug report",
      "message": "How can I help you?"
    },
    "status": {
      "error": "Please provide your email, subject, and a short message.",
      "success": "Opening your email client… If nothing opens, please send the email manually."
    }
  },
  "heic_to_image": {
    "title": "HEIC to JPG/PNG Converter",
    "description": "Convert Apple HEIC/HEIF photos to standard JPG or PNG formats locally in your browser.",
    "msg_add_photos": "Please add some HEIC photos first.",
    "msg_add_first": "Add files first!",
    "msg_converting": "Converting…",
    "msg_done": "Done! Processed {{count}} files.",
    "msg_failed": "Something went wrong during conversion.",
    "add_more": "Add more photos",
    "drag_drop": "Drag & drop HEIC files here",
    "no_uploads": "Photos are processed locally; the site separately records usage information as described in the Privacy Policy.",
    "output_format": "Output Format",
    "format_hint": "Choose between JPG (smaller) or PNG (lossless).",
    "jpg_quality": "JPG Quality",
    "convert_title": "Ready to Convert?",
    "convert_desc": "We will create a ZIP archive with your converted images.",
    "export_zip": "Export as {{format}} ZIP",
    "steps": "1. Add files -> 2. Choose format -> 3. Export",
    "photos_selected": "{{count}} photo selected",
    "photos_selected_plural": "{{count}} photos selected",
    "clear": "Clear",
    "png_hint": "PNG keeps transparency; ideal for icons/screenshots.",
    "converting_btn": "Converting…",
    "msg_partial": "Converted {count} of {total} files. The rest could not be decoded and were skipped."
  },
  "url_encoder": {
    "error_encode": "Failed to encode text.",
    "error_decode": "Failed to decode text.",
    "error_swap": "Failed to swap text.",
    "error_clipboard": "Failed to copy to clipboard.",
    "swap": "Swap",
    "clear": "Clear",
    "tip": "Type in either box to convert instantly.",
    "layout": "Layout",
    "split": "Split",
    "full_width": "Full Width",
    "original_text": "Original Text",
    "encoded_output": "Encoded Output",
    "copy": "Copy",
    "copied": "Copied!",
    "placeholder_encode": "Enter text to encode…",
    "placeholder_decode": "Enter text to decode…",
    "char_count": "{{count}} characters"
  },
  "unit_converter": {
    "categories": {
      "length": "Length",
      "weight": "Weight",
      "temperature": "Temperature",
      "volume": "Volume"
    },
    "descriptions": {
      "length": "Convert between meters, feet, miles, and more.",
      "weight": "Convert between kilograms, pounds, stones, etc.",
      "temperature": "Convert Celsius, Fahrenheit, and Kelvin.",
      "volume": "Convert liters, gallons, cups, and other volumes."
    },
    "labels": {
      "value": "Value",
      "unit": "Unit"
    },
    "units": {
      "meters": "Meters",
      "kilometers": "Kilometers",
      "centimeters": "Centimeters",
      "miles": "Miles",
      "yards": "Yards",
      "feet": "Feet",
      "inches": "Inches",
      "kilograms": "Kilograms",
      "grams": "Grams",
      "pounds": "Pounds",
      "ounces": "Ounces",
      "stone": "Stone",
      "celsius": "Celsius",
      "fahrenheit": "Fahrenheit",
      "kelvin": "Kelvin",
      "liters": "Liters",
      "milliliters": "Milliliters",
      "cups_us": "Cups (US)",
      "tablespoons": "Tablespoons",
      "teaspoons": "Teaspoons",
      "fluid_ounces": "Fluid Ounces",
      "gallons_us": "Gallons (US)"
    }
  },
  "base64": {
    "default_text": "Base64 keeps UTF-8 text readable and shareable.",
    "error_encode": "Unable to encode this text.",
    "error_decode": "Encoded value looks invalid. Check characters or padding.",
    "error_swap": "Cannot swap because the encoded value is invalid.",
    "error_clipboard": "Clipboard is not available in this browser.",
    "swap": "Swap values",
    "clear": "Clear",
    "mode": "Mode:",
    "standard": "Standard",
    "url_safe": "URL-safe",
    "keep_padding": "Keep padding",
    "hint_url": "URL-safe mode swaps +/ for -_ . Padding is optional.",
    "hint_standard": "Standard Base64 preserves + and /. Padding keeps browsers happy.",
    "original_text": "Original text",
    "base64_output": "Base64 output",
    "copy": "Copy",
    "copied": "Copied!",
    "placeholder_encode": "Paste UTF-8 text here to encode…",
    "placeholder_decode": "Paste Base64 or Base64url to decode…",
    "stats_original": "Characters: {{count}} • UTF-8 safe",
    "stats_encoded": "Length: {{count}} • Whitespace ignored on decode"
  },
  "bmi_calculator": {
    "categories": {
      "underweight": "Underweight",
      "normal_weight": "Normal weight",
      "overweight": "Overweight",
      "obesity_1": "Obesity class I",
      "obesity_2": "Obesity class II",
      "obesity_3": "Obesity class III"
    },
    "labels": {
      "units": "Units",
      "reset": "Reset values",
      "height_cm": "Height (cm)",
      "weight_kg": "Weight (kg)",
      "height_ft": "Height (feet)",
      "height_in": "Height (inches)",
      "weight_lb": "Weight (lb)"
    },
    "options": {
      "metric": "Metric (cm / kg)",
      "imperial": "Imperial (ft / in / lb)"
    },
    "headings": {
      "bmi": "Body mass index",
      "categories": "BMI categories"
    },
    "disclaimer": "This calculator uses World Health Organization ranges. Always consult a medical professional for personalized guidance."
  },
  "case_converter": {
    "uppercase": "UPPERCASE",
    "lowercase": "lowercase",
    "title_case": "Title Case",
    "sentence_case": "Sentence case",
    "camel_case": "camelCase",
    "pascal_case": "PascalCase",
    "snake_case": "snake_case",
    "kebab_case": "kebab-case",
    "alternating_case": "aLtErNaTiNg",
    "inverse_case": "InVeRsE CaSe",
    "text_content": "Text Content",
    "clear": "Clear",
    "copy_result": "Copy Result",
    "copied": "Copied!",
    "placeholder": "Type or paste your text here…"
  },
  "code_formatter": {
    "language": "Language",
    "format_code": "Format code",
    "load_sample": "Load sample",
    "clear": "Clear",
    "layout": "Layout:",
    "split": "Split",
    "full_width": "Full-width",
    "source_code": "Source code",
    "formatted_output": "Formatted output",
    "copy": "Copy",
    "copied": "Copied!",
    "error_clipboard": "Clipboard access was blocked by this browser.",
    "error_format": "Unable to format this snippet. {{message}}",
    "hint": "Use Prettier formatting in your browser without installing npm packages.",
    "chars": "Characters: {{count}}",
    "placeholder_input": "<!-- Paste your {{lang}} code here -->",
    "placeholder_output": "Run format to see the prettified version."
  },
  "color_converter": {
    "hex_label": "HEX",
    "hex_desc": "Supports #RGB, #RRGGBB, and #RRGGBBAA.",
    "rgb_label": "RGB",
    "rgb_desc": "rgb() or rgba() values accepted.",
    "hsl_label": "HSL",
    "hsl_desc": "hsl() or hsla() values accepted.",
    "swatch_hint": "Edit any format on the right and click Convert to update this swatch.",
    "convert": "Convert",
    "copy": "Copy",
    "copied": "Copied!",
    "css_var_label": "Pasteable CSS Variables:",
    "error_parse": "Could not parse that value. Check the format.",
    "invalid_hex": "Invalid HEX color.",
    "invalid_rgb": "Invalid RGB color.",
    "error_clipboard": "Clipboard access unavailable."
  },
  "countdown_timer": {
    "presets": {
      "5_min": "5 min",
      "15_min": "15 min",
      "25_min": "25 min",
      "45_min": "45 min"
    },
    "error_duration": "Please set a duration greater than zero.",
    "hours": "Hours",
    "minutes": "Minutes",
    "seconds": "Seconds",
    "remaining": "Remaining",
    "times_up_msg": "Time's up! Take a break or set another session.",
    "pause": "Pause",
    "start": "Start",
    "reset": "Reset",
    "local_hint": "Timer runs locally even if your connection drops.",
    "demo": "Live demo — tap any button to take over",
    "finished": "Finished",
    "times_up_title": "Time is up!",
    "times_up_desc": "Step away, stretch, or start another block when you're ready.",
    "reset_timer": "Reset timer",
    "dismiss": "Dismiss",
    "resume": "Resume",
    "sound_enabled": "Sound reminder",
    "test_sound": "Test sound",
    "fullscreen": "Full screen",
    "exit_fullscreen": "Exit full screen",
    "audio_unavailable": "Sound is unavailable or blocked. Check your browser and device volume; the visual reminder still works.",
    "background_hint": "Keep this tab open. The countdown catches up when you return from another tab. A locked phone or suspended browser may delay the alarm."
  },
  "csv_json_converter": {
    "error_json_array": "JSON must be an array of objects.",
    "error_unsupported": "Unsupported conversion path.",
    "error_convert": "Unable to convert. Check your data.",
    "error_clipboard": "Clipboard is not available.",
    "input": "Input",
    "output": "Output",
    "swap": "Swap",
    "clear": "Clear",
    "convert": "Convert",
    "header_hint": "Header row is required when converting CSV/TSV to JSON.",
    "copied": "Copied!",
    "copy": "Copy",
    "placeholder_output": "Converted output will appear here…"
  },
  "date_calculator": {
    "mode_difference": "Date Difference",
    "mode_add_subtract": "Add / Subtract Days",
    "start_date": "Start Date",
    "end_date": "End Date",
    "difference": "Difference",
    "days": "days",
    "years": "years",
    "months": "months",
    "breakdown": "or {{years}} years, {{months}} months, {{days}} days",
    "add": "Add (+)",
    "subtract": "Subtract (-)",
    "unit_days": "Days",
    "unit_weeks": "Weeks",
    "unit_months": "Months",
    "unit_years": "Years",
    "result_date": "Result Date",
    "preset_years_days": "Try: 2 years and 320 days from today",
    "unit_years_days": "Years + days",
    "extra_days": "Additional days",
    "years_days_hint": "Years are applied first, then calendar days. Month-end dates are clamped to the last valid day.",
    "invalid_date": "Enter a valid date within years 100–9999.",
    "operation": "Operation",
    "quantity": "Quantity",
    "unit": "Unit",
    "include_end": "Count both dates (add one day)",
    "calculate": "Calculate days",
    "inclusive_hint": "Both dates are included. Weekends and holidays count.",
    "exclusive_hint": "The start date is excluded. Weekends and holidays count."
  },
  "favicon_generator": {
    "error_canvas": "Canvas not supported",
    "error_render": "Unable to render icon",
    "error_select_size": "Select at least one icon size.",
    "success_msg": "Icons generated! The ZIP download has started.",
    "error_generate": "Failed to generate favicon files. Please try again.",
    "letters_emoji": "Letters or emoji",
    "bg_color": "Background color",
    "text_color": "Text color",
    "font_size": "Font size",
    "padding": "Padding",
    "preview": "Preview",
    "format_hint": "Output formats: PNG inside a ZIP file.",
    "usage_hint": "Use up to two letters or an emoji for best results.",
    "include_sizes": "Include sizes",
    "download_zip": "Download favicon ZIP"
  },
  "hash_generator": {
    "input_label": "Input text",
    "uppercase": "Uppercase output",
    "generate": "Generate hashes",
    "copy": "Copy",
    "placeholder_result": "Run the generator to view this hash.",
    "error_unsupported": "Unsupported in this browser."
  },
  "image_compressor": {
    "target_mode": "Try under 200 KB per image",
    "target_hint": "Optional: reduces width and quality, down to 320 px and 40%. 200 KB means 200,000 bytes; results are not guaranteed.",
    "prepare_target": "Prepare images under 200 KB",
    "results_title": "Export results",
    "result_details": "{{bytes}} bytes · {{width}} × {{height}} px · {{quality}}% quality",
    "target_met": "Below 200,000 bytes",
    "target_missed": "Target not met. Try a smaller crop or another format.",
    "review_hint": "Open the downloaded image, or extract the ZIP for a batch, and check text and detail before submitting.",
    "download_results": "Download results ZIP",
    "title": "Compress & Convert Images",
    "description": "Compress JPG/PNG/WebP locally. Download one image directly, or multiple images together as a ZIP.",
    "max_width": "Max width (px)",
    "quality": "Quality",
    "output_format": "Output format",
    "drag_drop": "Click or drag files to upload",
    "supports_hint": "Supports JPG / PNG / WebP; keep each file under ~10 MB for best performance.",
    "selected_files": "Selected {{count}} image(s) - {{size}} total",
    "clear": "Clear",
    "remove": "Remove",
    "tip_multiple": "One image downloads directly; multiple images download as a ZIP.",
    "compress_zip_btn": "Compress & download ZIP",
    "processing": "Processing…",
    "msg_done": "Done! {{count}} image(s) processed. Original total: {{size}}.",
    "error_failed": "Compression failed. Please make sure the files are valid and try again.",
    "error_files_limit": "Choose JPG/PNG/WebP files up to 20 MiB each.",
    "error_skipped": "Some files were skipped because they exceed 20 MiB.",
    "error_select_one": "Please select at least one image.",
    "compress_image_btn": "Compress & download image",
    "download_image": "Download image",
    "size_comparison": "Original: {{original}} → Output: {{output}}"
  },
  "image_resizer": {
    "title": "Image Resizer",
    "description": "Resize images to specific dimensions and convert formats.",
    "upload_btn": "Upload image",
    "selected": "Selected: {{name}} ({{size}} KB)",
    "supported": "Supported: PNG, JPG, WebP, HEIC (if supported)",
    "settings_title": "Resize settings",
    "max_width": "Max width (px)",
    "max_height": "Max height (px)",
    "keep_aspect": "Keep aspect ratio",
    "output_format": "Output format",
    "format_webp": "WebP (smallest)",
    "format_jpeg": "JPEG",
    "format_png": "PNG (lossless)",
    "quality": "Quality ({{value}}%)",
    "original_dims": "Original: {{width}} × {{height}}px",
    "target_dims": "Target: {{width}} × {{height}}px",
    "resize_btn": "Resize & convert",
    "download_btn": "Download result",
    "preview_title": "Preview",
    "output_title": "Resized output",
    "output_info": "{{width}} × {{height}}px · {{format}} · {{size}} KB",
    "error_upload_first": "Please upload an image first.",
    "error_read": "Failed to read the image.",
    "error_canvas": "Canvas not supported in this browser.",
    "error_encode": "Could not encode the image.",
    "error_load": "Could not load this image."
  },
  "images_to_pdf": {
    "title": "Turn images into a single PDF",
    "description": "Combine multiple JPG/PNG files into a clean PDF—perfect for receipts, scans, or sharing a quick bundle.",
    "add_more": "Add more images (JPG/PNG)",
    "drag_drop": "Click or drag JPG/PNG images",
    "limit_hint": "Up to 40 images. Order follows the list below.",
    "selected": "{{count}} image selected",
    "selected_plural": "{{count}} images selected",
    "clear": "Clear",
    "max_page_width": "Max page width",
    "width_hint": "Images larger than this width are scaled down.",
    "create_pdf": "Create PDF",
    "create_hint": "Images stay in order. Everything runs in your browser.",
    "building": "Building…",
    "export_pdf": "Export PDF",
    "steps": "Step 1: Add images. Step 2: Set max width. Step 3: Export PDF.",
    "msg_choose_images": "Choose JPG or PNG images.",
    "msg_add_one": "Add at least one image.",
    "msg_building": "Building PDF locally. Keep this tab open.",
    "msg_ready": "PDF ready. Download started automatically.",
    "msg_failed": "Conversion failed. Try fewer images or reduce max width."
  },
  "json_formatter": {
    "title": "JSON Formatter",
    "description": "Format, validate, and minify JSON data.",
    "format_btn": "Format JSON",
    "minify_btn": "Minify",
    "load_sample": "Load sample",
    "clear": "Clear",
    "paste_hint": "Paste JSON on the left, then copy the formatted output on the right.",
    "layout": "Layout:",
    "split": "Split",
    "full_width": "Full-width",
    "input_label": "Input",
    "output_label": "Formatted output",
    "copy": "Copy",
    "copied": "Copied!",
    "chars": "Characters: {{count}}",
    "error_invalid": "JSON is invalid. {{reason}}",
    "error_clipboard": "Clipboard access was blocked by this browser.",
    "placeholder_input": "{ \"name\": \"JW Tool Box\" }",
    "placeholder_output": "Your pretty JSON will appear here."
  },
  "jwt_decoder": {
    "title": "JWT Decoder",
    "description": "Decode JSON Web Tokens (JWT) to view their header and payload.",
    "token_label": "JWT token",
    "placeholder": "Paste your JWT here (header.payload.signature)",
    "decode_btn": "Decode",
    "clear_btn": "Clear",
    "header_label": "Header",
    "payload_label": "Payload",
    "copy": "Copy",
    "copied": "Copied!",
    "common_claims": "Common claims",
    "signature_label": "Signature (base64url):",
    "verification_hint": "Verification is not performed here. Validate signatures server-side with the correct key and algorithm.",
    "error_invalid": "JWT must have at least a header and payload.",
    "error_decode": "Unable to decode this token.",
    "error_clipboard": "Clipboard is not available."
  },
  "keep_screen_on": {
    "title_active": "Screen wake lock is active",
    "title_inactive": "Keep your screen awake",
    "desc_unsupported": "Your browser does not support the Wake Lock API, but you can use the manual tips below.",
    "desc_supported": "Start the wake lock and keep this tab in the foreground. We will try to reapply it if the browser suspends it.",
    "btn_running": "Running…",
    "btn_start": "Start keep-awake",
    "btn_stop": "Stop",
    "error_unsupported": "Wake Lock API is not supported in this browser.",
    "error_request": "Unable to keep the screen awake. Try interacting with the page again.",
    "local_time": "Local time",
    "session_timer": "Session timer",
    "timer_hint_active": "Time since wake lock started",
    "timer_hint_inactive": "Start the wake lock to begin tracking",
    "tips": {
      "ios_title": "iOS / Safari",
      "ios_body": "Open Settings → Display & Brightness → Auto-Lock → pick “Never”. Alternatively, enable Guided Access for the current app.",
      "android_title": "Android (no wake lock support)",
      "android_body": "Use Settings → Display → Screen timeout, or enable Developer Options → Stay awake while charging.",
      "desktop_title": "Desktop",
      "desktop_body": "Adjust your OS power settings to prevent the display from sleeping during long demos or recordings."
    }
  },
  "lorem_ipsum": {
    "count": "Count",
    "unit": "Unit",
    "unit_paragraphs": "Paragraphs",
    "unit_sentences": "Sentences",
    "unit_words": "Words",
    "classic_opening": "Classic opening",
    "copy_output": "Copy output",
    "copied": "Copied!",
    "output": "Generated text"
  },
  "markdown_converter": {
    "md_to_html": "Markdown → HTML",
    "html_to_md": "HTML → Markdown",
    "copy_output": "Copy output",
    "copied": "Copied!",
    "layout": "Layout:",
    "split": "Split",
    "full_width": "Full-width",
    "description": "Select a direction above, paste your content in the left panel, and copy the converted result on the right. HTML rendering is powered by markdown-it; reverse conversion uses Turndown.",
    "md_input": "Markdown input",
    "html_input": "HTML input",
    "md_output": "Markdown output",
    "html_output": "HTML output"
  },
  "money_to_words": {
    "title": "Money to Words Converter",
    "description": "Convert numeric amounts into written English words for checks, legal documents, or clarity.",
    "enter_amount": "Enter Amount",
    "placeholder": "e.g. 1234.56",
    "quick_history": "Quick History",
    "history_empty": "No history yet.",
    "convert_btn": "Convert to Words",
    "error_invalid": "Please enter a valid number.",
    "label_sentence": "Sentence Case",
    "label_uppercase": "Uppercase",
    "label_check": "Check Line",
    "label_memo": "Memo Line",
    "label_currency": "Currency Format",
    "copied": "Copied!",
    "copy": "Copy",
    "check_guide_title": "How to write a US check",
    "check_guide_step1": "Write today’s date in the top-right box.",
    "check_guide_step2": "Fill the “Pay to the Order of” line with the recipient’s name.",
    "check_guide_step3": "Enter the numeric amount (e.g., {{amount}}) in the box, aligned to the left.",
    "check_guide_step4": "Use the <strong>CHECK LINE</strong> output from this tool on the amount-in-words line, ending with “DOLLARS”.",
    "check_guide_step5": "Optionally add a memo/purpose (bill number, gift, etc.).",
    "check_guide_step6": "Sign the check—ink only—and keep a photo or stub for your records.",
    "check_guide_tip": "Bonus tip: add “***” or “#” before and after the written amount to prevent tampering.",
    "error_copy": "Copy was unavailable. Select the result and copy it manually."
  },
  "mortgage_calculator": {
    "cta_label": "Calculate Mortgage",
    "summary_title": "Mortgage Summary",
    "notes": "This calculator provides estimates for informational purposes only. Actual payments may vary."
  },
  "auto_loan_calculator": {
    "cta_label": "Plan this auto loan",
    "summary_title": "Total cost of ownership",
    "notes": "Add taxes, dealer fees, or warranties to the purchase price if you want them factored into the loan.",
    "vehicle_price": "Vehicle Price",
    "down_payment": "Down Payment",
    "interest_rate": "Interest Rate (%)",
    "term_years": "Loan Term",
    "term_input_mode": "Term Input Mode",
    "months": "Months",
    "years": "Years",
    "monthly_payment": "Monthly Payment",
    "total_interest": "Total Interest",
    "payment_breakdown": "Payment Breakdown",
    "total_paid": "Total Paid",
    "principal_loan_amount": "Principal Loan Amount"
  },
  "pdf_compressor": {
    "title": "Compress PDF",
    "description": "Reduce PDF file size locally in your browser.",
    "drag_drop": "Click or Drop PDF",
    "presets": {
      "balanced_label": "Balanced",
      "balanced_desc": "Keep text sharp and cut image weight ~40%.",
      "small_label": "Smaller",
      "small_desc": "Great for email uploads and sharing portals.",
      "tiny_label": "Smallest",
      "tiny_desc": "Flatten aggressively for the smallest file."
    },
    "scale": "Scale",
    "quality": "Quality",
    "compress_btn": "Compress PDF",
    "download_btn": "Download Compressed PDF",
    "processing": "Compressing…",
    "error_file_type": "Please upload a PDF file.",
    "error_file_size": "Try a PDF under 30 MB to keep things responsive.",
    "error_no_file": "Add a PDF first.",
    "msg_rendering": "Rendering pages locally. Keep this tab open.",
    "progress": "Progress",
    "msg_failed": "Compression failed. Please try again.",
    "msg_done": "Compression complete! Reduced by {{percent}}%.",
    "original_size": "Original size",
    "compressed_size": "Compressed size",
    "change_file": "Change PDF file",
    "preset_title": "Preset",
    "preset_description": "Pick how much to shrink pages. Scale reduces page dimensions, Quality sets JPEG clarity. Lower numbers = smaller file.",
    "download_title": "Download compressed PDF",
    "download_description": "Use the selected preset and current file to create a smaller PDF.",
    "steps": "Step 1: Upload PDF. Step 2: Pick a preset. Step 3: Compress & download.",
    "heads_up": "Heads up",
    "heads_up_list": {
      "local": "Compression is 100% local; sensitive PDFs never leave your browser.",
      "flatten": "Pages are flattened into images. Keep originals if you need selectable text.",
      "quality": "Lower quality presets trade clarity for smaller files.",
      "loses_text": "Every page is re-rendered as an image, so selectable/searchable text is flattened. For files where you need to keep text, skip this tool."
    },
    "msg_no_savings": "This file did not get smaller with this preset. The original file has been kept — try the Smallest preset for maximum reduction."
  },
  "pdf_lock_unlock": {
    "title_unlock": "Unlock a passworded PDF (local)",
    "description_unlock": "Remove password security from a PDF file.",
    "drag_drop": "Click or Drop PDF",
    "password_label": "PDF Password",
    "unlock_btn": "Unlock PDF",
    "unlocking": "Unlocking…",
    "error_file_type": "Please upload a PDF file.",
    "error_file_size": "Try a PDF under ~60 MB for smoother processing.",
    "error_no_file": "Upload a PDF first.",
    "error_no_password": "Enter the correct PDF password.",
    "msg_unlocking": "Unlocking locally. Pages will be rebuilt without password.",
    "msg_password_required": "Password required to open this PDF.",
    "msg_incorrect_password": "Incorrect password. Please try again.",
    "msg_success": "Unlocked copy created. Download started.",
    "msg_failed": "Unlock failed. Check the password or try a smaller PDF.",
    "change_file": "Change PDF file",
    "drag_drop_hint": "Click or drag a passworded PDF (recommended < 60 MB)",
    "local_hint": "Password operations happen locally; keep the tab open while processing.",
    "password_title": "Password",
    "password_description": "Enter the current PDF password to unlock and rebuild.",
    "password_placeholder": "Existing password",
    "unlock_title": "Unlock PDF",
    "unlock_description": "Renders pages to remove the password; keep originals if you need selectable text or forms.",
    "steps": "Step 1: Upload passworded PDF. Step 2: enter password. Step 3: Unlock & download.",
    "progress_hint": "Keep this tab open until the file download starts.",
    "heads_up": "Heads up",
    "heads_up_list": {
      "local": "PDF contents are processed locally and not uploaded to JW Tool Box. The site separately records usage information as described in the Privacy Policy.",
      "rebuild": "Unlocking rebuilds pages as images; keep originals if you need selectable text or form fields.",
      "security": "Use strong passwords and store them safely. Lost passwords cannot be recovered."
    }
  },
  "pdf_merge": {
    "title": "Merge PDFs",
    "description": "Combine multiple PDF files into one.",
    "drag_drop": "Click or Drop PDFs",
    "add_more": "Add more PDFs",
    "merge_btn": "Merge PDFs",
    "merging": "Merging…",
    "clear_all": "Clear All",
    "error_file_type": "Please upload PDF files.",
    "error_file_size": "Please upload PDF files smaller than 15 MB each.",
    "error_some_skipped": "Some PDFs were skipped because they exceed the 15 MB limit.",
    "msg_success": "Merged PDF created! Download started.",
    "msg_failed": "Merge failed. Please try again.",
    "total_size": "Total size: {{size}}",
    "drag_drop_hint": "Click or drag to add PDFs",
    "drag_drop_subhint": "Select multiple files at once for quicker workflows.",
    "selected_files": "Selected {{count}} files (total {{size}})",
    "clear_list": "Clear list",
    "move_up": "Up",
    "move_down": "Down",
    "remove": "X",
    "tip": "Tip: hold Shift or Cmd/Ctrl to select multiple PDFs in your file picker.",
    "merge_download": "Merge & download",
    "processing": "Processing…"
  },
  "pdf_page_organizer": {
    "title": "Organize PDF Pages",
    "description": "Reorder, rotate, or delete pages from a PDF.",
    "drag_drop": "Click or Drop PDF",
    "save_btn": "Save & Download",
    "saving": "Saving…",
    "rotate_left": "Rotate Left",
    "rotate_right": "Rotate Right",
    "delete_page": "Delete Page",
    "error_file_type": "Please upload a PDF file.",
    "error_file_size": "Try a PDF under ~50 MB for smoother reordering.",
    "error_read_failed": "Failed to read the PDF. Try another file.",
    "msg_saved": "New PDF created! Download started.",
    "msg_failed": "Failed to save the PDF.",
    "change_file": "Change PDF file",
    "drag_drop_hint": "Click or drag a PDF up to ~50 MB",
    "local_hint": "Pages stay on your device—no uploads.",
    "pages_count": "Pages: {{count}}",
    "order_rotation_title": "Page order & rotation",
    "order_rotation_desc": "Move pages up/down; rotate in 90° steps.",
    "page_label": "Page {{index}}",
    "preview_unavailable": "Preview unavailable",
    "move_up": "↑ Up",
    "move_down": "↓ Down",
    "rotate_left_btn": "↺ Rotate -90°",
    "rotate_right_btn": "↻ Rotate +90°",
    "export_title": "Export ordered PDF",
    "export_desc": "Keeps your order and rotations. Stays local.",
    "export_btn": "Export PDF",
    "exporting": "Exporting…",
    "steps": "Step 1: Upload PDF. Step 2: reorder/rotate. Step 3: Export.",
    "msg_upload_first": "Upload a PDF and arrange pages first.",
    "msg_rebuilding": "Rebuilding PDF locally. Keep this tab open.",
    "msg_done": "Done. Download started automatically.",
    "msg_failed_export": "Export failed. Try a smaller PDF or fewer edits."
  },
  "salary_tax_calculator": {
    "title": "Salary Tax Calculator (US)",
    "description": "Estimate federal tax liability using filing status, 2025 brackets, and the standard deduction.",
    "income_label": "Annual Income",
    "status_label": "Filing Status",
    "status_single": "Single",
    "status_married": "Married Filing Jointly",
    "status_separate": "Married Filing Separately",
    "status_head": "Head of Household",
    "calculate_btn": "Calculate Tax",
    "summary_title": "Estimated Tax Summary",
    "total_tax": "Total Federal Tax",
    "effective_rate": "Effective Tax Rate",
    "take_home": "Annual Take Home",
    "bracket_breakdown": "Tax Bracket Breakdown",
    "bracket_header": "Bracket",
    "rate_header": "Rate",
    "tax_header": "Tax Amount",
    "disclaimer": "Estimate uses 2025 federal brackets and the standard deduction only. Excludes FICA, state taxes, local taxes, credits, and itemized deductions."
  },
  "text_diff": {
    "title": "Text Diff Tool",
    "description": "Compare two text blocks to find differences.",
    "original_label": "Original Text",
    "modified_label": "Modified Text",
    "diff_result": "Diff Result",
    "legend_removed": "Removed",
    "legend_added": "Added",
    "no_changes": "No changes found. Texts are identical.",
    "clear_btn": "Clear All",
    "original_placeholder": "Paste original text…",
    "modified_placeholder": "Paste modified text…",
    "copied": "Diff copied!",
    "copy_summary": "Copy diff summary",
    "layout": "Layout:",
    "split": "Split",
    "full_width": "Full-width",
    "legend_green": "Insertions = green",
    "legend_red": "Deletions = red",
    "legend_whitespace": "Whitespace preserved"
  },
  "uuid_generator": {
    "title": "UUID Generator",
    "description": "Generate random UUIDs (v4) locally in your browser.",
    "generate_button": "Generate UUIDs",
    "result_title": "Generated UUIDs",
    "copy_all": "Copy All",
    "count_label": "How many?",
    "uppercase_label": "Uppercase",
    "hyphens_label": "Remove Hyphens",
    "copied": "Copied!",
    "copy_tooltip": "Click to copy"
  },
  "word_counter": {
    "title": "Word Counter",
    "description": "Count words, characters, sentences, and estimate reading time.",
    "placeholder": "Type or paste your text here…",
    "stat_words": "Words",
    "stat_chars": "Characters",
    "stat_no_spaces": "No Spaces",
    "stat_paragraphs": "Paragraphs",
    "stat_sentences": "Sentences",
    "stat_read_time": "Read Time",
    "copy_text": "Copy Text",
    "clear_text": "Clear Text",
    "min": "min"
  },
  "world_time": {
    "title": "World Time Converter",
    "description": "Check time across multiple time zones.",
    "search_placeholder": "Search city or time zone…",
    "base_time": "Base Time",
    "auto_update": "Auto-update current time",
    "remove_zone": "Remove",
    "add_btn": "Add",
    "copy_timestamp": "Copy time"
  },
  "pdf_split": {
    "title": "Split PDF",
    "description": "Extract pages or split a PDF into multiple files.",
    "drag_drop": "Click or drag PDF",
    "range_mode": "Extract Range",
    "extract_all": "Split Every Page",
    "start_page": "Start Page",
    "end_page": "End Page",
    "split_btn": "Split PDF",
    "processing": "Processing…",
    "error_file_type": "Please upload a PDF file.",
    "error_file_size": "This PDF is larger than 50 MB.",
    "msg_success": "Split complete! Download started.",
    "msg_failed": "Split failed."
  },
  "pdf_to_image": {
    "title": "PDF to Image",
    "description": "Convert PDF pages to JPG or PNG images.",
    "drag_drop": "Click or drag PDF",
    "format_label": "Output Format",
    "quality_label": "Quality",
    "convert_btn": "Convert to Images",
    "processing": "Rendering pages…",
    "error_file_type": "Please upload a PDF file.",
    "error_file_size": "Try a PDF under 40 MB.",
    "msg_success": "Conversion complete! Download started.",
    "current_file": "Current file: {{name}}",
    "size_mb": "Size: {{size}} MB",
    "remove": "Remove",
    "format_hint_text": "Pick format and quality for the exported pages.",
    "quality_hint": "Higher quality = larger files.",
    "png_hint": "PNG keeps transparency; best for graphics and scans.",
    "download_title": "Download images",
    "download_desc": "Exports a ZIP with one image per page using the selected format.",
    "steps": "Step 1: Upload PDF. Step 2: Choose format. Step 3: Export ZIP.",
    "progress": "Progress",
    "keep_open": "Keep this tab open until the ZIP download starts.",
    "heads_up": "Heads up",
    "note_privacy": "Processing stays on your device; PDFs are never uploaded.",
    "note_large": "Large PDFs can take time—try JPEG for smaller downloads or lower quality if needed.",
    "note_scale": "Pages render at 2× scale for sharper images. Resize after download if needed."
  },
  "pinyin_converter": {
    "title": "Chinese Pinyin Converter",
    "description": "Convert Chinese characters to Pinyin with tones.",
    "input_placeholder": "Paste Chinese text here…",
    "mode_tone_mark": "Tone Marks (mā)",
    "mode_tone_number": "Tone Numbers (ma1)",
    "mode_initials": "Initials Only (m)",
    "copy": "Copy Pinyin",
    "copied": "Copied!"
  },
  "random_generator": {
    "title": "Random Number & Picker",
    "description": "Generate random numbers or pick items from a list.",
    "mode_number": "Number Generator",
    "mode_picker": "List Picker",
    "min": "Min",
    "max": "Max",
    "quantity": "Quantity",
    "allow_duplicates": "Allow Duplicates",
    "generate_btn": "Generate Numbers",
    "list_placeholder": "Enter items, one per line…",
    "pick_count": "How many to pick?",
    "pick_btn": "Pick Random Item",
    "result_label": "Result",
    "error_range": "Quantity exceeds range size."
  },
  "regex_tester": {
    "title": "Regex Tester",
    "description": "Test regular expressions against text in real-time.",
    "pattern_label": "Regex Pattern",
    "flags_label": "Flags",
    "text_label": "Test String",
    "matches_label": "Matches",
    "match_count_result": "{{count}} found",
    "no_matches": "No matches found",
    "error_invalid": "Invalid regular expression.",
    "suggestions": "Common Patterns",
    "patterns": {
      "email": "Email",
      "us_phone": "US phone",
      "ipv4": "IPv4",
      "hex": "Hex color",
      "invoice": "Invoice ID"
    },
    "flags": {
      "global": "Global",
      "ignore_case": "Ignore case",
      "multiline": "Multiline",
      "dot_all": "DotAll",
      "unicode": "Unicode"
    },
    "group_label": "Group {{index}}",
    "empty_input": "Enter a regex pattern and test string to see matches."
  },
  "loan_calculator": {
    "purchase_price": "Purchase price",
    "down_payment": "Down payment",
    "apr": "APR (%)",
    "term": "Term",
    "months": "months",
    "years": "years",
    "property_tax": "Property tax (annual $)",
    "annual_insurance": "Annual insurance ($)",
    "hoa_monthly_fee": "HOA monthly fee ($)",
    "monthly_payment": "Monthly payment",
    "principal_interest": "Principal & interest",
    "estimated_taxes": "Estimated taxes",
    "insurance": "Insurance",
    "hoa": "HOA",
    "total_paid_over": "Total paid over",
    "interest": "Interest:",
    "principal": "Principal:",
    "loan_amount": "Loan amount",
    "after_down_payment": "After down payment",
    "payment_breakdown": "Payment Breakdown",
    "total_paid": "Total Paid"
  },
  "privacy_page": {
    "meta_title": "Privacy Policy",
    "meta_description": "See what tool inputs stay on your device and what data analytics, hosting, and advertising services may receive.",
    "eyebrow": "Privacy policy",
    "title": "How JW Tool Box handles data.",
    "subtitle": "Updated September 30, 2026. A summary of site and tool data practices.",
    "sections": [
      {
        "title": "Tool processing",
        "body": "Most tools process the text or files you provide in your browser. JW Tool Box does not intentionally upload or store the contents you enter or files you process. Some pages and embedded previews may contact other sites; the Markdown converter renders raw HTML, and remote resources in that HTML may be requested by your browser. Loading the site itself also sends normal requests to our hosting and content delivery providers."
      },
      {
        "title": "Site and tool activity",
        "body": "When you visit, Google Analytics and Microsoft Clarity load through Google Tag Manager to report page and tool activity. Events may include page URLs and titles, language, browser or device details, referrer, tool actions, and limited settings. For example, the salary calculator currently reports an income band and filing status; timer events report the chosen duration; and the amount-to-words tool reports whether cents were entered and the number of integer digits. We do not intentionally send the full salary, entered text, or uploaded file contents in these custom events. Microsoft Clarity also provides session and interaction analytics; Microsoft says input-box content is masked by default. Cloudflare hosting receives ordinary page requests and may process technical information needed to serve them. Separately, Cloudflare Web Analytics collects page-load timing metrics; Cloudflare says this service does not collect or use visitors' personal data and does not log query strings. The Markdown converter renders pasted raw HTML; embedded remote resources can cause the browser to contact their hosts, so do not preview sensitive markup that references outside sites."
      },
      {
        "title": "Cookies, analytics, and advertising",
        "body": "Google Analytics and Microsoft Clarity are loaded as described above. The cookie notice only acknowledges this disclosure; it does not turn analytics off. Google AdSense may use cookies or identifiers when ad requests are made for ad delivery, reporting, frequency capping, and—depending on applicable settings and choices—personalization based on prior visits. Ads may still appear when analytics is not used. Use Google Ads Settings to review Google's personalized-ad controls."
      },
      {
        "title": "Third-party services",
        "body": "Google Analytics, Microsoft Clarity, Google AdSense, and Cloudflare process information under their own terms and privacy notices. JW Tool Box does not control their retention periods or every data use."
      }
    ],
    "controls": "To review advertising choices or opt out of personalized ads, use Google Ads Settings. You can also use the industry opt-out page for participating advertising companies.",
    "google_ads_settings": "Google Ads Settings",
    "industry_optout": "Industry opt-out choices",
    "ad_controls_title": "Advertising choices"
  },
  "terms_page": {
    "meta_title": "Terms of Service",
    "meta_description": "Read the Terms of Service for using JW Tool Box.",
    "eyebrow": "Terms of Service",
    "title": "Terms of Service",
    "subtitle": "Last updated: September 30, 2026",
    "sections": [
      {
        "title": "Acceptance of Terms",
        "body": "By accessing and using JW Tool Box, you agree to be bound by these Terms of Service. If you do not agree to these terms, please do not use the website."
      },
      {
        "title": "Use of Service",
        "body": "JW Tool Box currently offers browser-based tools for personal and commercial use without requiring an account or subscription. Many tools process inputs in your browser; site analytics, hosting, and advertising are described in the Privacy Policy. The site is supported by advertising. You may not use the service for any illegal or unauthorized purpose."
      },
      {
        "title": "Disclaimer",
        "body": "The tools are provided 'as is' without warranty of any kind. We are not responsible for any loss of data or damages resulting from the use of this website."
      },
      {
        "title": "Intellectual Property",
        "body": "The content, design, and code of JW Tool Box are protected by copyright. You may not copy, modify, or distribute the website without permission."
      },
      {
        "title": "Changes to Terms",
        "body": "We reserve the right to modify these terms at any time. Continued use of the website after changes constitutes acceptance of the new terms."
      }
    ]
  },
  "not_found_page": {
    "meta_title": "Page not found",
    "meta_description": "The page you are looking for does not exist or has moved.",
    "eyebrow": "404",
    "title": "Page not found",
    "message": "The page you are looking for does not exist or has moved.",
    "go_home": "Go home",
    "view_tools": "View tools"
  },
  "tools": {
    "svgToPng": {
      "upload": "Upload SVG",
      "uploadPrompt": "Click to upload SVG file or drag and drop",
      "svgCode": "SVG Code",
      "svgPlaceholder": "Paste your SVG code here…",
      "scale": "Scale",
      "convert": "Convert to PNG",
      "preview": "Preview",
      "error": "Conversion failed. Please check your SVG code."
    },
    "barcodeGenerator": {
      "settings": "Settings",
      "barcodeText": "Barcode Text",
      "textPlaceholder": "Enter text or numbers…",
      "format": "Format",
      "width": "Width",
      "height": "Height",
      "showText": "Show text below barcode",
      "preview": "Preview",
      "download": "Download",
      "invalidInput": "Invalid input for selected format",
      "useExample": "Use example: {{example}}",
      "errors": {
        "empty": "Enter the value you want to encode.",
        "ascii": "CODE128 supports ASCII characters. Use Latin letters, numbers or ASCII punctuation.",
        "code39": "CODE39 supports A–Z, digits, spaces and - . $ / + %.",
        "digits": "{{format}} accepts digits only. Remove spaces, letters and punctuation.",
        "length": "{{format}} needs {{count}} digits without a check digit, or {{full}} digits with it.",
        "checksum": "The final check digit should be {{expected}}. Correct it, or omit it to calculate it automatically.",
        "range": "Pharmacode must be a whole number from 3 to 131070.",
        "unexpected": "This value could not be encoded. Check the format rules or try the example."
      },
      "hints": {
        "CODE128": "For general labels: ASCII text and numbers.",
        "EAN13": "12 digits, or 13 including the check digit. A missing check digit is calculated automatically.",
        "UPC": "11 digits, or 12 including the check digit. A missing check digit is calculated automatically.",
        "CODE39": "Letters A–Z, digits, spaces and - . $ / + %. Lowercase letters are converted to uppercase.",
        "ITF14": "13 digits, or 14 including the check digit. A missing check digit is calculated automatically.",
        "MSI": "Digits only; this format has no fixed input length.",
        "pharmacode": "A whole number between 3 and 131070."
      }
    },
    "xmlJsonConverter": {
      "input": "Input",
      "output": "Output",
      "convert": "Convert",
      "copy": "Copy",
      "clear": "Clear",
      "xmlPlaceholder": "Paste your XML here…",
      "jsonPlaceholder": "Paste your JSON here…",
      "outputPlaceholder": "Converted output will appear here…",
      "emptyInput": "Please enter some content to convert",
      "conversionError": "Conversion failed. Please check your input syntax."
    },
    "yamlJsonConverter": {
      "input": "Input",
      "output": "Output",
      "convert": "Convert",
      "copy": "Copy",
      "clear": "Clear",
      "yamlPlaceholder": "Paste your YAML here…",
      "jsonPlaceholder": "Paste your JSON here…",
      "outputPlaceholder": "Converted output will appear here…",
      "emptyInput": "Please enter some content to convert",
      "conversionError": "Conversion failed. Please check your input syntax."
    },
    "sqlFormatter": {
      "settings": "Settings",
      "sqlDialect": "SQL Dialect",
      "input": "Input",
      "output": "Output",
      "format": "Format SQL",
      "copy": "Copy",
      "clear": "Clear",
      "inputPlaceholder": "Paste your SQL query here…",
      "outputPlaceholder": "Formatted SQL will appear here…",
      "emptyInput": "Please enter some SQL to format",
      "formatError": "Format failed. Please check your SQL syntax."
    }
  },
  "referrals": {
    "us_mobile": {
      "title": "Save on Phone Bill with US Mobile",
      "description": "Start your 30-day free trial! Unlimited data plans from $17.50/mo, plus build your own custom 5G plan."
    },
    "vultr": {
      "title": "Deploy Globally with Vultr",
      "description": "Experience high-performance cloud compute, GPUs, and bare metal. Deploy in seconds across 32+ global locations."
    }
  },
  "exif_eraser": {
    "title": "EXIF & Metadata Eraser",
    "description": "Remove hidden GPS and camera metadata from photos in your browser. Photo files are not uploaded to JW Tool Box; the site separately collects usage information as described in the Privacy Policy.",
    "drag_drop": "Drag & Drop images here",
    "add_more": "Add More Images",
    "no_uploads": "Photos are processed locally; the site separately records usage information as described in the Privacy Policy.",
    "photos_selected": "{{count}} Photos queued",
    "clear": "Clear All",
    "clean_title": "Sanitize & Download",
    "clean_desc": "We will copy the physical pixels and destroy all hidden metadata.",
    "export_zip": "Export Clean ZIP",
    "processing_btn": "Scrubbing Data…",
    "steps": "Photo contents stay on your device. Site usage information is described in the Privacy Policy.",
    "msg_add_photos": "Please add some valid image files first.",
    "msg_add_first": "Queue is empty.",
    "msg_processing": "Scrubbing metadata… Please wait.",
    "msg_done": "Successfully cleaned {{count}} images!",
    "msg_failed": "An error occurred during processing."
  },
  "csv_diff": {
    "has_header": "First row is header",
    "compare_by": "Compare By",
    "entire_row": "Entire Row (Exact Match)",
    "swap_lists": "Swap Lists",
    "list_a": "List A (Base)",
    "list_b": "List B (Compare)",
    "upload_csv": "Upload CSV",
    "paste_placeholder": "Paste emails, IDs, or CSV data here…",
    "paste_placeholder_b": "Paste second list against which to compare…",
    "op_intersection": "A ∩ B (In Both)",
    "op_intersection_desc": "Find common items",
    "op_a_only": "A - B (Only in A)",
    "op_a_only_desc": "Removes B from A",
    "op_b_only": "B - A (Only in B)",
    "op_b_only_desc": "Removes A from B",
    "op_union": "A ∪ B (Union / Dedupe)",
    "op_union_desc": "Merge and deduplicate",
    "result_title": "Result",
    "rows_found": "rows found",
    "copied": "Copied!",
    "copy": "Copy",
    "download": "Download CSV",
    "result_placeholder": "Result will appear here…",
    "clear_a": "Clear list A",
    "clear_b": "Clear list B"
  },
  "password_strength": {
    "score_0": "Very Weak",
    "score_1": "Weak",
    "score_2": "Fair",
    "score_3": "Strong",
    "score_4": "Very Strong",
    "input_label": "Enter a password to test",
    "input_placeholder": "p@ssw0rd123…",
    "waiting": "Waiting for input…",
    "entropy_label": "Entropy",
    "online_attacks": "Online Attacks",
    "throttled": "Throttled (100 / hr)",
    "unthrottled": "Unthrottled (10 / sec)",
    "offline_attacks": "Offline Attacks",
    "slow_hash": "Slow Hash (10k / sec)",
    "fast_hash": "Fast Hash (10B / sec)",
    "need_stronger": "Need a stronger password?",
    "generator_prompt": "Our local password generator can create cryptographically secure passwords instantly.",
    "go_to_generator": "Open Password Generator",
    "show_password": "Show password",
    "hide_password": "Hide password"
  },
  "cookie_consent": {
    "message": "This site uses cookies and similar technologies. See the Privacy Policy for details about data processing and available choices.",
    "learn_more": "Privacy Policy",
    "accept": "Understood"
  },
  "zxcvbn": {
    "use_a_few_words__avoid_common_phrases": "Use a few words, avoid common phrases",
    "no_need_for_symbols__digits__or_uppercase_letters": "No need for symbols, digits, or uppercase letters",
    "add_another_word_or_two__uncommon_words_are_better_": "Add another word or two. Uncommon words are better.",
    "straight_rows_of_keys_are_easy_to_guess": "Straight rows of keys are easy to guess",
    "short_keyboard_patterns_are_easy_to_guess": "Short keyboard patterns are easy to guess",
    "use_a_longer_keyboard_pattern_with_more_turns": "Use a longer keyboard pattern with more turns",
    "repeats_like__aaa__are_easy_to_guess": "Repeats like \"aaa\" are easy to guess",
    "repeats_like__abcabcabc__are_only_slightly_harder_to_guess_than__abc_": "Repeats like \"abcabcabc\" are only slightly harder to guess than \"abc\"",
    "avoid_repeated_words_and_characters": "Avoid repeated words and characters",
    "sequences_like_abc_or_6543_are_easy_to_guess": "Sequences like abc or 6543 are easy to guess",
    "avoid_sequences": "Avoid sequences",
    "recent_years_are_easy_to_guess": "Recent years are easy to guess",
    "avoid_recent_years": "Avoid recent years",
    "avoid_years_that_are_associated_with_you": "Avoid years that are associated with you",
    "dates_are_often_easy_to_guess": "Dates are often easy to guess",
    "avoid_dates_and_years_that_are_associated_with_you": "Avoid dates and years that are associated with you",
    "this_is_a_top_10_common_password": "This is a top-10 common password",
    "this_is_a_top_100_common_password": "This is a top-100 common password",
    "this_is_a_very_common_password": "This is a very common password",
    "this_is_similar_to_a_commonly_used_password": "This is similar to a commonly used password",
    "a_word_by_itself_is_easy_to_guess": "A word by itself is easy to guess",
    "names_and_surnames_by_themselves_are_easy_to_guess": "Names and surnames by themselves are easy to guess",
    "common_names_and_surnames_are_easy_to_guess": "Common names and surnames are easy to guess",
    "capitalization_doesn_t_help_very_much": "Capitalization doesn't help very much",
    "all_uppercase_is_almost_as_easy_to_guess_as_all_lowercase": "All-uppercase is almost as easy to guess as all-lowercase",
    "reversed_words_aren_t_much_harder_to_guess": "Reversed words aren't much harder to guess",
    "predictable_substitutions_like_____instead_of__a__don_t_help_very_much": "Predictable substitutions like '@' instead of 'a' don't help very much"
  },
  "author_page": {
    "eyebrow": "Author profile",
    "credentials": "Credentials",
    "coverage": "Coverage areas",
    "read_policy": "Read editorial policy",
    "contact_site": "Contact the site",
    "published": "Published guides",
    "article_count": "{{count}} article{{plural}} currently indexed",
    "browse_guides": "Browse all guides"
  },
  "editorial_policy_page": {
    "eyebrow": "Trust and standards",
    "title": "Editorial Policy",
    "intro": "JW Tool Box is maintained as a product, not as a bulk content farm. This page explains how we review tool pages, how guides are written, how corrections are handled, and how we keep finance or health content within clear, defensible boundaries.",
    "report_heading": "How to report an issue",
    "report_body": "If you spot a factual error, outdated workflow, or misleading claim, contact us and include the page URL, what looks wrong, and what changed. We would rather correct or de-index a weak page than leave it live.",
    "contact_site": "Contact the site"
  }
}
