- Drop unused 'from src.i18n import t' from pages 1-9 (the swap to render_tool_header(tool_id) means no page calls t() directly anymore). Pages 10, 11 and the underscore-prefixed pages were already clean or legitimately use t(). - Rewrite PDF Extractor help_md (en + es). The original prose described features the tool does NOT have — template drawing, per-source saved templates, automatic reuse. The actual tool is a heuristic batch scanner (per its own docstring: "No templates, no per-bank configuration"). New copy: scan → uncheck → pick date format → enable OCR if needed → download. Spanish version tagged with '<!-- TODO: review Spanish -->' since the prose is best-effort. - Document why both stSidebarNavSectionHeader (legacy, streamlit~=1.35) and stNavSectionHeader (current, 1.57) testids appear in the chrome CSS — requirements floor is streamlit>=1.35,<2 so dropping the legacy selector would silently break the lower bound. - Pin the t()-returns-key-on-miss contract that render_tool_header's fallback path depends on, with a comment at the call site. - Pin the demo's intentional skip of hide_streamlit_chrome (so the +/- sidebar swap JS doesn't ever try to load there) with a load- bearing comment in app_demo.py. - Confirmed i18n parity: every tool id has page_title / page_caption / description / name / help_md in BOTH packs; help.button_label and help.missing_body in both. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
222 lines
17 KiB
JSON
222 lines
17 KiB
JSON
{
|
||
"chrome": {
|
||
"language_label": "Language",
|
||
"footer": "Runs locally. Your data never leaves this computer. | DataTools v3.0"
|
||
},
|
||
"home": {
|
||
"page_title": "UNALOGIX DataTools",
|
||
"title": "UNALOGIX DataTools",
|
||
"caption": "Clean. Normalize. Transform.",
|
||
"privacy_pill": "Runs 100% locally",
|
||
"findings_badge_one": "{n} finding",
|
||
"findings_badge_other": "{n} findings"
|
||
},
|
||
"status": {
|
||
"ready": "Ready",
|
||
"coming_soon": "Coming Soon"
|
||
},
|
||
"help": {
|
||
"button_label": "Help",
|
||
"missing_body": "No help written yet for this tool."
|
||
},
|
||
"upload": {
|
||
"heading": "Import one or more files to start",
|
||
"intro": "Optional: scan an imported file for data quality issues and see which tools can fix each one. Skip if you already know what you need.",
|
||
"limits": "**Up to 1.5 GB.** Formats: CSV, TSV, XLSX, XLS. Delimiters auto-detected: comma, tab, semicolon, pipe. Encodings auto-detected: UTF-8 (with/without BOM), UTF-16, cp1252, Latin-1/9, cp1250, ISO-8859-2, cp1251, KOI8-R, Mac Roman, Shift_JIS, GB18030, Big5, EUC-KR — and override on the Review page.",
|
||
"uploader_label": "Import CSV or Excel",
|
||
"uploader_help": "Up to 1.5 GB. Comma / tab / semicolon / pipe delimiters all auto-detected. Encoding auto-detected with override on the Review page if needed.",
|
||
"run_button": "Run analysis",
|
||
"skip_button": "Skip",
|
||
"scanning": "Scanning…",
|
||
"skipped_notice": "Analysis skipped. Open any tool below to start working.",
|
||
"using_session_file": "Using **{name}** from the import screen.",
|
||
"use_different_file": "Use a different file",
|
||
"switch_back": "Switch back to import-screen file",
|
||
"pickup_caption": "Up to 1.5 GB. Delimiters auto-detected: comma, tab, semicolon, pipe. Encoding auto-detected (UTF-8 / UTF-16 / cp1252 / Latin-1 family / cp1250 / cp1251 / KOI8-R / Mac Roman / Shift_JIS / GB18030 / Big5 / EUC-KR), with override on the Review page.",
|
||
"intro_multi": "Drop files below. Each one is analyzed locally — nothing leaves this computer.",
|
||
"uploader_label_multi": "Import CSV, TSV, or Excel files",
|
||
"clear_results": "Clear results",
|
||
"empty_state": "Import one or more files to begin. Your data never leaves this computer."
|
||
},
|
||
"findings": {
|
||
"header": "Detected issues",
|
||
"none": "No issues detected. Open any tool below to start working.",
|
||
"severity_summary_segment": "{icon} {n} {severity}",
|
||
"tool_section_label": "{tool} — {n} finding(s)",
|
||
"other_section_label": "Other / file-level — {n} finding(s)",
|
||
"open_tool": "Open {tool} →",
|
||
"untargeted_label": "Informational"
|
||
},
|
||
"gate": {
|
||
"warning": "**{name}** must pass the CSV-normalization gate before you can use this tool. Open the Review page to apply the fixes our analyzer recommends.",
|
||
"default_name": "the imported file",
|
||
"open_review": "Go to Review & Normalize"
|
||
},
|
||
"quit": {
|
||
"button": "Quit app",
|
||
"shutting_down": "Shutting down… you can close this window.",
|
||
"farewell_title": "DataTools has shut down",
|
||
"farewell_subtitle": "You can close this window.",
|
||
"close_window_button": "Close this window",
|
||
"close_hint": "Browsers don't let JavaScript close a tab you opened yourself — and they don't let it send Ctrl+W or Alt+F4 either (those keystrokes are intercepted by the OS, not the page). Launch DataTools with `python -m src.gui` to get a Chrome/Edge --app window that DOES close cleanly. In the meantime, this tab will fall back to a blank page in a moment — close it manually with Ctrl+W (or ⌘W on Mac)."
|
||
},
|
||
"close_page": {
|
||
"page_title": "DataTools — Close",
|
||
"title": "Close DataTools",
|
||
"caption": "Shut down the local app and free the terminal.",
|
||
"body": "Clicking the button below will terminate the DataTools server. Any unsaved work in other tools will be lost. Once the app shuts down you can close this window.",
|
||
"button": "Close the app"
|
||
},
|
||
"activation": {
|
||
"page_title": "DataTools — Activate",
|
||
"title": "Activate DataTools",
|
||
"intro": "DataTools needs to be activated before any tools unlock. Enter the name and email tied to your purchase, then paste the license blob from your delivery email.",
|
||
"name_label": "Full name",
|
||
"name_help": "Must match the name on your purchase receipt.",
|
||
"email_label": "Email",
|
||
"email_help": "Must match the email on your purchase receipt.",
|
||
"blob_label": "License blob",
|
||
"blob_help": "Begins with `DTLIC1:` — paste the entire string.",
|
||
"activate_button": "Activate",
|
||
"renew_button": "Apply renewal",
|
||
"or_separator": "— or —",
|
||
"success": "Activated! Welcome, {name}. Your license is valid until {expires}.",
|
||
"renewed": "License renewed. New expiry: {expires}.",
|
||
"errors_heading": "Activation problem",
|
||
"deactivate_button": "Deactivate this device",
|
||
"deactivate_help": "Removes the local license file. You'll need to re-paste your blob to reactivate."
|
||
},
|
||
"license": {
|
||
"status_active": "{tier} · {days} days left",
|
||
"status_trial": "Trial · {days} days left",
|
||
"status_expired": "Expired",
|
||
"status_not_activated": "Not activated",
|
||
"status_invalid": "License invalid",
|
||
"renewal_warning_30": "⚠️ License expires in {days} days. Renew soon to avoid interruption.",
|
||
"renewal_warning_expired": "🛑 License expired on {date}. Renew to continue using DataTools.",
|
||
"tier_trial": "Trial",
|
||
"tier_lite": "Lite",
|
||
"tier_core": "Core",
|
||
"tier_pro": "Pro",
|
||
"tier_enterprise": "Enterprise",
|
||
"registered_to": "Registered to {name} · {email}",
|
||
"expires_on": "Expires on {date}",
|
||
"issued_on": "Issued on {date}",
|
||
"view_details": "License details",
|
||
"feature_locked_title": "🔒 This tool isn't on your {tier} license",
|
||
"feature_locked_body": "Your current license unlocks: {features}. Upgrade to access this tool.",
|
||
"upgrade_link": "Manage license",
|
||
"status_locked": "Locked"
|
||
},
|
||
"tools": {
|
||
"01_deduplicator": {
|
||
"name": "Find Duplicates",
|
||
"description": "Find rows that repeat — exact and similar — and remove the extras.",
|
||
"page_title": "Find Duplicates",
|
||
"page_caption": "Find rows that repeat, then keep one and remove the extras.",
|
||
"help_md": "**When to use**\n- Customer or contact lists\n- Mailing lists from multiple sources\n- Product catalogs that may overlap\n\n**Steps**\n1. Upload your file\n2. Pick the column(s) that identify a row (email, phone, name+zip)\n3. Choose **Exact** or **Similar** matching\n4. Pick which row to keep (newest, longest, first)\n5. Preview, then export\n\n**Examples**\n- `John Smith` + `JOHN SMITH` → same person\n- `jane@co.com` + `jane@co.com ` → same email (trailing space)\n- `555-1234` + `(555) 1234` → same phone\n\n**Tip** Start with Exact; add Similar if you suspect typos."
|
||
},
|
||
"02_text_cleaner": {
|
||
"name": "Clean Text",
|
||
"description": "Trim extra spaces and strip out odd characters that copy-paste leaves behind.",
|
||
"page_title": "Clean Text",
|
||
"page_caption": "Trim extra spaces and strip out odd characters.",
|
||
"help_md": "**When to use**\n- Text copied from web pages, PDFs, or older systems\n- Files with inconsistent spacing\n- Data with hidden or special characters\n\n**Steps**\n1. Upload your file\n2. Pick the text columns to clean\n3. Choose options: trim spaces, remove invisible characters, normalize quotes\n4. Preview the changes\n5. Export\n\n**Examples**\n- ` hello world ` → `hello world`\n- `“smart quotes”` → `\"normal quotes\"`\n- `datawithhidden` → `datawithhidden`\n\n**Tip** Always preview — text changes can affect later steps like duplicate detection."
|
||
},
|
||
"03_format_standardizer": {
|
||
"name": "Standardize Formats",
|
||
"description": "Make dates, phone numbers, currency, names, and addresses look the same throughout.",
|
||
"page_title": "Standardize Formats",
|
||
"page_caption": "Make dates, phones, currency, and names look the same throughout.",
|
||
"help_md": "**When to use**\n- Data from multiple sources that wrote dates/phones differently\n- Before sending to a system that wants one format\n- Preparing data for analysis or charts\n\n**Steps**\n1. Upload your file\n2. Pick a column (date, phone, currency, etc.)\n3. Choose the target format\n4. Preview\n5. Repeat for other columns, then export\n\n**Examples**\n- `Jan 5, 2025` / `01/05/2025` / `5-Jan-25` → `2025-01-05`\n- `(555) 123-4567` / `555.123.4567` → `+1 555-123-4567`\n- `$1,234.50` / `1234.5 USD` → `1234.50`\n\n**Tip** Run on several columns in one session — each column remembers its chosen format."
|
||
},
|
||
"04_missing_handler": {
|
||
"name": "Fix Missing Values",
|
||
"description": "Find blank cells (even ones written as 'N/A' or '?') and fill them in or remove them.",
|
||
"page_title": "Fix Missing Values",
|
||
"page_caption": "Find blank cells (even hidden ones) and fill them in or remove them.",
|
||
"help_md": "**When to use**\n- Spreadsheets with gaps\n- Files where someone typed `N/A` or `-` instead of leaving a cell blank\n- Before importing into a system that rejects blanks\n\n**Steps**\n1. Upload your file\n2. Review which columns have blanks\n3. Pick a strategy per column: **fill**, **drop the row**, or **leave alone**\n4. For numbers, pick a fill value: average, median, zero, or your own\n5. Preview, then export\n\n**Examples**\n- `N/A`, `-`, ` ` → treated as blank\n- Blank salary → filled with the column average\n- Row with no email → dropped\n\n**Tip** Don't fill the row's identifier (email, ID) — drop the row instead."
|
||
},
|
||
"05_column_mapper": {
|
||
"name": "Map Columns",
|
||
"description": "Rename columns, change their order, and set each one as text, number, or date.",
|
||
"page_title": "Map Columns",
|
||
"page_caption": "Rename columns, change their order, and set each one as text, number, or date.",
|
||
"help_md": "**When to use**\n- Combining files from vendors with different column names\n- Forcing the layout your system expects\n- Cleaning up exports with extra or weirdly-named columns\n\n**Steps**\n1. Upload your file\n2. Match each incoming column to your standard name\n3. Set each column's type: text, number, or date\n4. Reorder or drop columns\n5. Export with the new layout\n\n**Examples**\n- `cust_email` → `Customer Email`\n- `amt` → `Amount` (set as number)\n- `notes_internal` → drop\n\n**Tip** Save the mapping if you'll get the same file format again next month."
|
||
},
|
||
"06_outlier_detector": {
|
||
"name": "Find Unusual Values",
|
||
"description": "Spot values that look wrong — way too high, way too low, or breaking your rules.",
|
||
"page_title": "Find Unusual Values",
|
||
"page_caption": "Spot values that look wrong — way too high, too low, or breaking your rules.",
|
||
"help_md": "**When to use**\n- Spotting typos, fraud, or bad imports in numeric data\n- Cleaning sensor or transaction data\n- Before reporting numbers to leadership\n\n**Steps**\n1. Upload your file\n2. Pick the numeric column to check\n3. Set a normal range (or use auto-detect)\n4. Review the flagged rows\n5. Choose: keep, remove, or cap to the limit\n\n**Examples**\n- Salary column with one row at `$9,999,999` → flagged\n- Age column with `250` → flagged\n- Rule: `price must be > 0` → flags negatives\n\n**Tip** Review flagged rows by hand — a real outlier is sometimes the most important data point."
|
||
},
|
||
"07_multi_file_merger": {
|
||
"name": "Combine Files",
|
||
"description": "Combine several CSV or Excel files into one — even if their columns don't match.",
|
||
"page_title": "Combine Files",
|
||
"page_caption": "Combine several CSV or Excel files into one — even if columns differ.",
|
||
"help_md": "**When to use**\n- Monthly reports across the year\n- Exports from different stores or branches\n- Multi-system data that needs to be in one file\n\n**Steps**\n1. Upload two or more files\n2. Confirm column matches (auto-detected; override if needed)\n3. Pick how to handle missing columns (skip, blank, default value)\n4. Preview the combined result\n5. Export the single file\n\n**Examples**\n- `January.csv` + `February.csv` → `2025.csv`\n- `NY-store.xlsx` + `LA-store.xlsx` → `all-stores.csv`\n- File A has `Email`, file B has `email_addr` → matched automatically\n\n**Tip** Add a `source` column so you can tell which file each row came from."
|
||
},
|
||
"08_validator_reporter": {
|
||
"name": "Quality Check",
|
||
"description": "Check your file against rules you set, and export a PDF or Excel report.",
|
||
"page_title": "Quality Check",
|
||
"page_caption": "Check your file against rules and export a PDF or Excel report.",
|
||
"help_md": "**When to use**\n- Before handing data off to a client or partner\n- Before a strict system import\n- Routine quality audits\n\n**Steps**\n1. Upload your file\n2. Pick the rules to check (required columns, valid emails, no duplicates)\n3. Run the check\n4. Review the score and findings\n5. Export the report as PDF or Excel\n\n**Examples**\n- Rule: `email column must look like an email` → 12 rows fail\n- Rule: `amount must be > 0` → 3 rows fail\n- Rule: `no duplicate customer IDs` → 5 duplicates found\n\n**Tip** Run this last in your cleanup, then keep the PDF as proof of quality."
|
||
},
|
||
"09_pipeline_runner": {
|
||
"name": "Automated Workflows",
|
||
"description": "Run several tools in a row — save the steps once, reuse them anytime.",
|
||
"page_title": "Automated Workflows",
|
||
"page_caption": "Run several tools in a row — save the steps and reuse them anytime.",
|
||
"help_md": "**When to use**\n- A cleanup you do every week or month\n- Multi-step processes you keep repeating\n- Onboarding teammates to your data routine\n\n**Steps**\n1. Pick the tools you want to run, in order\n2. Configure each step\n3. Save the workflow as a JSON file\n4. Next time, load the workflow and upload a fresh file\n5. Get the cleaned output in one click\n\n**Examples**\n- `Clean Text` → `Standardize Formats` → `Find Duplicates` → export\n- Saved as `weekly-customer-cleanup.json`\n- Shared with a teammate so they get the same result\n\n**Tip** Start with two or three tools. You can always edit and add more later."
|
||
},
|
||
"10_pdf_extractor": {
|
||
"name": "PDF to CSV",
|
||
"description": "Pull transactions out of bank-statement PDFs into a clean CSV file.",
|
||
"page_title": "PDF to CSV",
|
||
"page_caption": "Pull transactions out of bank-statement PDFs into a clean CSV file.",
|
||
"help_md": "**When to use**\n- Bank or credit-card statements\n- Vendor invoices with line-item tables\n- Any PDF with a transaction table\n\n**Steps**\n1. Upload one or more PDFs (batch is fine)\n2. Click **Scan** — rows that look like transactions are pulled out automatically\n3. Uncheck any rows you don't want\n4. Pick your date format (and turn on OCR if the PDF is a scanned image)\n5. Download the CSV\n\n**Examples**\n- Chase March statement → 87 transactions found\n- Drop in 12 months at once and get one combined CSV\n- Image-only scan + OCR → still works if Tesseract is installed\n\n**Tip** If a withdrawal shows as `(4.50)`, leave **Treat (4.50) as negative** on. Turn it off only if your statements use a different convention."
|
||
},
|
||
"11_reconciler": {
|
||
"name": "Reconcile Two Files",
|
||
"description": "Compare two lists of transactions (e.g. bank vs. ledger) and flag what doesn't match.",
|
||
"page_title": "Reconcile Two Files",
|
||
"page_caption": "Compare two lists of transactions (e.g. bank vs. ledger) and flag what doesn't match.",
|
||
"help_md": "**When to use**\n- Matching your bank statement to your books\n- Vendor invoices vs. payments sent\n- Inventory receipts vs. orders placed\n\n**Steps**\n1. Upload both files (e.g. bank export + accounting export)\n2. Pick the columns to match on (date, amount, reference)\n3. Set tolerances (e.g. date ±2 days, amount exact)\n4. Review four buckets: **matched**, **only in left**, **only in right**, **needs review**\n5. Export the results\n\n**Examples**\n- Bank `2025-03-15 $99.50` ↔ Books `2025-03-16 $99.50` → matched\n- Bank charge with no books entry → only in left\n- Same amount on the same day twice → flagged for review\n\n**Tip** Tighten the date tolerance once you trust the match — fewer ambiguous cases to review."
|
||
}
|
||
},
|
||
"nav": {
|
||
"section_review": "Data Review",
|
||
"section_analysis": "Analysis",
|
||
"section_cleaners": "Data Cleaners",
|
||
"section_transformations": "Transformations",
|
||
"section_automations": "Automations",
|
||
"review_page_title": "Review",
|
||
"home_page_title": "Home",
|
||
"file_analysis_title": "File Analysis",
|
||
"section_account": "Account",
|
||
"activate_title": "Activate",
|
||
"close_title": "Close",
|
||
"section_close": "Close",
|
||
"back_to_home": "← Back to Home"
|
||
},
|
||
"footer": {
|
||
"close": "Close",
|
||
"help": "Help",
|
||
"help_title": "DataTools",
|
||
"help_version": "Version {version}",
|
||
"help_support": "Support: {email}",
|
||
"help_license_label": "License",
|
||
"help_license_inactive": "Not activated",
|
||
"help_license_active": "{name}",
|
||
"help_license_expires": "Expires {date} ({days} days)",
|
||
"help_activate_link": "Activate now →",
|
||
"help_manage_link": "Manage license →",
|
||
"help_logs_label": "Log file",
|
||
"help_logs_link": "View all logs →",
|
||
"help_dismiss": "Close"
|
||
}
|
||
}
|