From 2e4422f541c6bb97625a196fc16a84017ecbaf12 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 19:46:53 -0400
Subject: [PATCH 01/16] fix(copy): say company, not workspace (QA sweep
COPY-01)
Co-Authored-By: Claude Sonnet 5.5
---
app/lib/forms/auth.schema.test.ts | 2 +-
messages/en/auth.json | 6 +++---
messages/en/communication.json | 4 ++--
messages/en/components.json | 6 +++---
messages/en/editor-2.json | 4 ++--
messages/en/helpers.json | 2 +-
messages/en/library.json | 2 +-
messages/en/nav.json | 4 ++--
messages/en/reports.json | 2 +-
messages/en/settings-catalog.json | 2 +-
messages/en/settings-components.json | 4 ++--
messages/en/settings-integrations.json | 12 ++++++------
messages/en/settings.json | 10 +++++-----
messages/en/statutory.json | 6 +++---
messages/en/templates.json | 2 +-
messages/en/validation.json | 4 ++--
messages/es-419/auth.json | 6 +++---
messages/es-419/communication.json | 4 ++--
messages/es-419/components.json | 6 +++---
messages/es-419/editor-2.json | 4 ++--
messages/es-419/helpers.json | 2 +-
messages/es-419/library.json | 2 +-
messages/es-419/nav.json | 4 ++--
messages/es-419/reports.json | 2 +-
messages/es-419/settings-catalog.json | 2 +-
messages/es-419/settings-components.json | 4 ++--
messages/es-419/settings-integrations.json | 12 ++++++------
messages/es-419/settings.json | 10 +++++-----
messages/es-419/statutory.json | 4 ++--
messages/es-419/templates.json | 2 +-
messages/es-419/validation.json | 4 ++--
31 files changed, 70 insertions(+), 70 deletions(-)
diff --git a/app/lib/forms/auth.schema.test.ts b/app/lib/forms/auth.schema.test.ts
index 6451d6d8..f292d679 100644
--- a/app/lib/forms/auth.schema.test.ts
+++ b/app/lib/forms/auth.schema.test.ts
@@ -112,7 +112,7 @@ describe('auth login i18n (Phase C pilot)', () => {
it('resolves login UI messages in en (baseLocale)', () => {
overwriteGetLocale(() => 'en');
- expect(m.auth_login_heading()).toBe('Log in to your workspace');
+ expect(m.auth_login_heading()).toBe('Log in to your company');
expect(m.auth_login_submit()).toBe('Log In');
expect(m.auth_login_email_label()).toBe('Email address');
});
diff --git a/messages/en/auth.json b/messages/en/auth.json
index f917c34a..fffd672c 100644
--- a/messages/en/auth.json
+++ b/messages/en/auth.json
@@ -1,7 +1,7 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"auth_login_meta_title": "Log in — OpenInspection",
- "auth_login_heading": "Log in to your workspace",
+ "auth_login_heading": "Log in to your company",
"auth_login_subtitle": "Enter your credentials to access inspections, reports, and team tools.",
"auth_login_email_label": "Email address",
"auth_login_password_label": "Password",
@@ -18,7 +18,7 @@
"auth_validation_password_uppercase": "Must contain at least one uppercase letter",
"auth_validation_password_number": "Must contain at least one number",
"auth_validation_password_special": "Must contain at least one special character",
- "auth_validation_workspace_name_required": "Workspace name is required",
+ "auth_validation_workspace_name_required": "Company name is required",
"auth_validation_your_name_required": "Your name is required",
"auth_validation_name_too_long": "Name is too long",
"auth_validation_setup_code_min": "Setup code must be at least 6 characters",
@@ -85,7 +85,7 @@
"auth_setup_code_help_suffix": "(type Secret), then refresh this page.",
"auth_setup_code_help_link": "How to add a secret →",
"auth_setup_operator_summary": "For whoever deployed this: the setup code and agent sign-up",
- "auth_setup_agent_terms_note": "One thing this page cannot do: agent sign-up stays closed until the agent terms are published. Until then agents are told sign-up is not available, and no workspace administrator can change it — only whoever operates this deployment can publish them, from the command line:",
+ "auth_setup_agent_terms_note": "One thing this page cannot do: agent sign-up stays closed until the agent terms are published. Until then agents are told sign-up is not available, and no company administrator can change it — only whoever operates this deployment can publish them, from the command line:",
"auth_setup_agent_terms_docs": "See docs/operate/deploy.md. Finish creating your account first — this is a separate step, and nothing here waits on it.",
"auth_setup_submit_pending": "Creating your account…",
"auth_setup_submit": "Create Account",
diff --git a/messages/en/communication.json b/messages/en/communication.json
index d53ae2a2..db777d20 100644
--- a/messages/en/communication.json
+++ b/messages/en/communication.json
@@ -25,8 +25,8 @@
"comm_attach_uploading": "Uploading…",
"comm_reason_no_sms_consent": "Skipped — this person hasn't agreed to receive texts.",
"comm_reason_no_review_url": "Skipped — no review link is set. Add one in Settings → Company.",
- "comm_reason_sms_not_configured": "Skipped — text messaging isn't set up for this workspace.",
- "comm_reason_email_not_configured": "Skipped — email sending isn't set up for this workspace.",
+ "comm_reason_sms_not_configured": "Skipped — text messaging isn't set up for this company.",
+ "comm_reason_email_not_configured": "Skipped — email sending isn't set up for this company.",
"comm_reason_no_sms_template": "Skipped — the rule has no text template.",
"comm_reason_no_email_template": "Skipped — the rule has no email template.",
"comm_reason_managed_not_approved": "Skipped — the sending number is still awaiting carrier approval.",
diff --git a/messages/en/components.json b/messages/en/components.json
index 6486a1c0..ed8cd433 100644
--- a/messages/en/components.json
+++ b/messages/en/components.json
@@ -6,7 +6,7 @@
"modal_invite_title": "Invite",
"modal_edit_member_title": "Edit member",
"modal_edit_member_error_failed": "Could not save the changes.",
- "modal_edit_member_owner_notice": "An owner's role can't be changed here. Changing who owns the workspace isn't something this app can do yet — contact support if you need it.",
+ "modal_edit_member_owner_notice": "An owner's role can't be changed here. Changing who owns the company isn't something this app can do yet — contact support if you need it.",
"modal_edit_member_role_change_note": "Permission changes apply immediately. Changing the role signs this member out, so their new access takes effect on their next sign-in.",
"modal_invite_send": "Send invite",
"modal_invite_email_label": "Email",
@@ -32,7 +32,7 @@
"email_list_group_client": "Client",
"email_list_group_agent": "Agent",
"email_list_group_concierge": "Concierge",
- "email_list_group_system": "Workspace",
+ "email_list_group_system": "Company",
"email_list_customized": "Customized",
"email_list_alwayson": "Always on",
"email_list_active": "Active",
@@ -94,7 +94,7 @@
"newinsp_conflict_suffix": "in this time slot. You can still schedule it.",
"newinsp_schedule_date_label": "Date",
"newinsp_schedule_time_label": "Time",
- "newinsp_schedule_time_zone_hint": "Times are in {zone}, the workspace timezone.",
+ "newinsp_schedule_time_zone_hint": "Times are in {zone}, the company timezone.",
"newinsp_schedule_holiday_advisory": "Scheduling on {name}. You can still save this inspection.",
"newinsp_schedule_holiday_block": "Cannot schedule on {name} — company holidays are blocked.",
"newinsp_schedule_holiday_block_generic": "Cannot schedule on a company closed day.",
diff --git a/messages/en/editor-2.json b/messages/en/editor-2.json
index e9c00609..59fa9775 100644
--- a/messages/en/editor-2.json
+++ b/messages/en/editor-2.json
@@ -76,7 +76,7 @@
"editor_settings_required_location": "Location required",
"editor_settings_required_trade": "Recommended trade required",
"editor_settings_required_both": "Location + trade required",
- "editor_settings_required_defect_help": "Overrides the workspace default for this inspection only.",
+ "editor_settings_required_defect_help": "Overrides the company default for this inspection only.",
"editor_settings_legend_cover": "Report cover photo",
"editor_settings_cover_empty": "No photos yet — upload one below, or add photos to an inspection item and pick one here.",
"editor_settings_cover_current": "Current cover — click to clear",
@@ -182,7 +182,7 @@
"editor_property_autofill_filled": "Filled {count} field(s) from public records: {fields}",
"editor_property_autofill_none": "No new fields to fill — the details already look complete.",
"editor_property_autofill_not_found": "No public records found for this address.",
- "editor_property_autofill_unconfigured": "Property auto-fill isn't configured on this workspace.",
+ "editor_property_autofill_unconfigured": "Property auto-fill is not set up for your company.",
"editor_property_autofill_failed": "Couldn't fetch property details. Please try again.",
"editor_gate_missing": "Missing: ",
"editor_gate_none": "(none)",
diff --git a/messages/en/helpers.json b/messages/en/helpers.json
index c906e243..1e31cdaf 100644
--- a/messages/en/helpers.json
+++ b/messages/en/helpers.json
@@ -26,7 +26,7 @@
"helper_caloauth_login_required": "Google sign-in session expired. Please try connecting again.",
"helper_caloauth_consent_required": "Google needs permission confirmation. Please try connecting again.",
"helper_caloauth_session_expired": "The connection session expired. Please try again.",
- "helper_caloauth_not_configured": "Google Calendar is not configured for this workspace. Contact your administrator.",
+ "helper_caloauth_not_configured": "Google Calendar is not configured for this company. Contact your administrator.",
"helper_caloauth_no_refresh_token": "Google did not grant ongoing access. Try connecting again and approve all permissions.",
"helper_caloauth_exchange_failed": "Could not complete Google Calendar authorization. Please try again.",
"helper_caloauth_generic": "Could not connect Google Calendar. Please try again.",
diff --git a/messages/en/library.json b/messages/en/library.json
index 737bc974..db113049 100644
--- a/messages/en/library.json
+++ b/messages/en/library.json
@@ -174,7 +174,7 @@
"misc_not_found_home": "Go Home",
"misc_feature_disabled_meta_title": "Feature Disabled - OpenInspection",
"misc_feature_disabled_heading": "Feature Not Available",
- "misc_feature_disabled_desc": "This feature is not enabled for your workspace. Contact your administrator or upgrade your plan.",
+ "misc_feature_disabled_desc": "This feature is not enabled for your company. Contact your administrator or upgrade your plan.",
"misc_feature_disabled_back": "Back to Dashboard",
"misc_version_diff_meta_title": "Version Diff - OpenInspection",
"misc_version_diff_err_not_found": "Version not found",
diff --git a/messages/en/nav.json b/messages/en/nav.json
index d1ae365a..8a32bb34 100644
--- a/messages/en/nav.json
+++ b/messages/en/nav.json
@@ -8,7 +8,7 @@
"nav_item_team": "Team",
"nav_item_library": "Library",
"nav_item_settings": "Settings",
- "nav_section_workspace": "Workspace",
+ "nav_section_workspace": "Company",
"nav_action_notifications": "Notifications",
"nav_action_search": "Search…",
"nav_action_command_palette": "Open command palette",
@@ -20,7 +20,7 @@
"nav_action_collapse": "Collapse",
"nav_user_menu_aria": "User menu",
"nav_user_profile": "My profile",
- "nav_user_switch_workspace": "Switch workspace…",
+ "nav_user_switch_workspace": "Switch company…",
"nav_user_privacy": "Privacy Policy",
"nav_user_logout": "Log out",
"nav_theme_label": "Theme",
diff --git a/messages/en/reports.json b/messages/en/reports.json
index b8c27422..2b6f62b8 100644
--- a/messages/en/reports.json
+++ b/messages/en/reports.json
@@ -217,7 +217,7 @@
"report_view_cert_with_company": "{company} · Certified Inspection Report",
"report_view_cert": "Certified Inspection Report",
"report_view_build_repair": "Build repair request",
- "agent_report_actions_workspace_hint": "You already have an agent account for this email — we'll email you a secure link to sign in to your workspace.",
+ "agent_report_actions_workspace_hint": "You already have an agent account for this email — we'll email you a secure link to sign in to your account.",
"agent_report_actions_workspace_cta": "Email me a sign-in link",
"agent_report_actions_workspace_pending": "Sending…",
"agent_report_actions_workspace_sent": "Check your email — we've sent a single-use sign-in link to your inbox. It expires in 15 minutes.",
diff --git a/messages/en/settings-catalog.json b/messages/en/settings-catalog.json
index fa8cc2fe..a77f1c65 100644
--- a/messages/en/settings-catalog.json
+++ b/messages/en/settings-catalog.json
@@ -16,7 +16,7 @@
"settings_inspection_meta_title": "Inspection Workflow Settings - OpenInspection",
"settings_inspection_loading": "Loading...",
"settings_inspection_crumb": "Inspection Workflow",
- "settings_inspection_intro": "Defaults that apply to every inspector on this workspace.",
+ "settings_inspection_intro": "Defaults that apply to every inspector at your company.",
"settings_inspection_clone_heading": "Clone last (R key) default",
"settings_inspection_clone_rating": "Rating only",
"settings_inspection_clone_rating_notes": "Rating + Notes",
diff --git a/messages/en/settings-components.json b/messages/en/settings-components.json
index 6b066d3f..97543995 100644
--- a/messages/en/settings-components.json
+++ b/messages/en/settings-components.json
@@ -380,8 +380,8 @@
"settings_emaildelivery_sender_email_placeholder": "reports@yourdomain.com",
"settings_emaildelivery_sender_verified": "Must be a domain verified in your {provider} account.",
"settings_emaildelivery_from_name_label": "From name",
- "settings_emaildelivery_set_company_link": "Set your company name in Settings › Workspace",
- "settings_emaildelivery_from_workspace": "(from Workspace settings)",
+ "settings_emaildelivery_set_company_link": "Set your company name in Settings › Company",
+ "settings_emaildelivery_from_workspace": "(from company settings)",
"settings_emaildelivery_override_name": "Use a different name for email From",
"settings_emaildelivery_display_name_placeholder": "Acme Inspections",
"settings_emaildelivery_replyto_label": "Reply-to",
diff --git a/messages/en/settings-integrations.json b/messages/en/settings-integrations.json
index c3e794d1..9f2e3cbf 100644
--- a/messages/en/settings-integrations.json
+++ b/messages/en/settings-integrations.json
@@ -158,7 +158,7 @@
"settings_qbo_oauth_error_invalid_state": "That connection attempt expired. Start again from this page.",
"settings_qbo_oauth_error_failed": "QuickBooks refused the connection. Check that the credentials above belong to the same Intuit app and environment, then try again.",
"settings_qbo_oauth_error_access_denied": "You declined the connection at QuickBooks. Nothing was changed.",
- "settings_qbo_oauth_error_realm_already_connected": "That QuickBooks company is already connected to another workspace. Disconnect it there first, then connect it here.",
+ "settings_qbo_oauth_error_realm_already_connected": "That QuickBooks company is already connected to another company. Disconnect it there first, then connect it here.",
"settings_qbo_oauth_error_unknown": "QuickBooks returned an error: {code}",
"settings_qbo_env_provided": "Provided by this deployment",
"settings_qbo_env_provided_badge": "Env",
@@ -226,7 +226,7 @@
"settings_billing_active_members": "Active members",
"settings_billing_permanent": "Permanent",
"settings_billing_view_usage": "View SMS, email & storage usage",
- "settings_billing_capacity_heading": "Workspace capacity",
+ "settings_billing_capacity_heading": "Company capacity",
"settings_billing_capacity_desc": "No quotas in standalone mode — these are informational.",
"settings_billing_cost_heading": "Estimated monthly cost",
"settings_billing_cost_desc": "Stripe issues the canonical invoice — these figures are an estimate based on the per-seat rate.",
@@ -261,7 +261,7 @@
"settings_compliance_pdf_desc": "How long a rendered report PDF is kept before the file and its record are permanently destroyed. Enter 0 to keep them indefinitely.",
"settings_compliance_pdf_note": "Platform default: 7 years. This is a platform-selected default for when you have not chosen a period. It is not a statutory retention period, and not a representation that seven years is the maximum legally required period. The default is informed primarily by defence of legal claims and secondarily by record-retention rules: Illinois requires five years for home-inspection contracts, reports and supporting data, with a longer period where a qualifying judicial proceeding extends two years beyond final disposition; Virginia and Washington identify three-year periods for specified home-inspection records. Your own choice controls wherever the law permits it.",
"settings_compliance_views_heading": "Report open counting",
- "settings_compliance_views_desc": "Whether this workspace records that a recipient opened a report, and how many times.",
+ "settings_compliance_views_desc": "Whether this company records that a recipient opened a report, and how many times.",
"settings_compliance_views_label": "Count report opens",
"settings_compliance_views_note": "Off unless you turn it on. When enabled, we record the first and most recent time each recipient opened a report and how often — no page, scroll or device detail. Counting is suppressed for your own previews, for the PDF renderer, and for browser prefetches, so the number reflects people rather than machines. It is a signal, not proof of receipt: a link checker that behaves like a browser is indistinguishable from a reader. Any recipient can object to being counted, and that objection is honoured for them alone.",
"settings_compliance_pdf_range_error": "Enter a whole number of years between 0 and 99. Use 0 to keep report PDFs indefinitely.",
@@ -279,11 +279,11 @@
"settings_compliance_status_refused": "Refused",
"settings_compliance_status_held": "Preserved (legal hold)",
"settings_compliance_ai_heading": "AI assurance record",
- "settings_compliance_ai_desc": "Every AI call this workspace made, the prompt version and model that produced the text, and who reviewed the result. Read-only.",
- "settings_compliance_ai_empty": "No AI calls recorded. Nothing in this workspace has been drafted with model assistance.",
+ "settings_compliance_ai_desc": "Every AI call this company made, the prompt version and model that produced the text, and who reviewed the result. Read-only.",
+ "settings_compliance_ai_empty": "No AI calls recorded. Nothing in this company has been drafted with model assistance.",
"settings_compliance_ai_empty_page": "No calls older than this point.",
"settings_compliance_ai_unreviewed": "No recorded review for {count} of the {total} calls shown.",
- "settings_compliance_ai_unresolved": "Reviews citing a call this workspace has no record of: {count}.",
+ "settings_compliance_ai_unresolved": "Reviews citing a call this company has no record of: {count}.",
"settings_compliance_ai_col_when": "Called",
"settings_compliance_ai_col_model": "Model",
"settings_compliance_ai_col_prompt": "Prompt version",
diff --git a/messages/en/settings.json b/messages/en/settings.json
index 71777bbd..5fa11723 100644
--- a/messages/en/settings.json
+++ b/messages/en/settings.json
@@ -64,8 +64,8 @@
"settings_timezone_browser_hint": "Your browser timezone is {zone}.",
"settings_timezone_browser_use": "Use this",
"settings_profile_locale_label": "Your language / locale",
- "settings_profile_locale_hint": "Overrides how dates, times, and numbers are formatted for you only. Leave on the workspace default to inherit the company setting.",
- "settings_profile_locale_inherit_option": "Use workspace default",
+ "settings_profile_locale_hint": "Overrides how dates, times, and numbers are formatted for you only. Leave on the company default to use the company setting.",
+ "settings_profile_locale_inherit_option": "Use company default",
"settings_profile_photo_heading": "Profile photo",
"settings_profile_photo_subtitle": "Your avatar on the public company booking page.",
"settings_profile_photo_none": "No photo",
@@ -192,13 +192,13 @@
"settings_data_import_choose_file": "Choose CSV file",
"settings_data_import_file_hint": "Max 5 MB, UTF-8 encoded",
"settings_data_bundled_heading": "Install what's new",
- "settings_data_bundled_subtitle": "Adds the templates, comments, repair items and other starter content this release ships that this workspace does not have yet. Nothing you already have is changed.",
+ "settings_data_bundled_subtitle": "Adds the templates, comments, repair items and other starter content this release ships that this company does not have yet. Nothing you already have is changed.",
"settings_data_bundled_rename_note": "Items are matched by name. A template you renamed no longer matches, so it comes back as a second copy under its original name.",
"settings_data_bundled_button": "Install what's new",
"settings_data_bundled_button_busy": "Installing…",
"settings_data_bundled_result_added_one": "Added 1 new item.",
"settings_data_bundled_result_added_other": "Added {count} new items.",
- "settings_data_bundled_result_none": "Nothing to add — this workspace already has everything this release ships.",
+ "settings_data_bundled_result_none": "Nothing to add — this company already has everything this release ships.",
"settings_data_bundled_result_error": "Couldn't install the bundled content. Please try again.",
"settings_hub_meta_title": "Settings - OpenInspection",
"settings_profile_meta_title": "Profile - Settings - OpenInspection",
@@ -227,7 +227,7 @@
"settings_usage_byo": "via your own account: {count}",
"settings_team_meta_title": "Team - OpenInspection",
"settings_team_crumb": "Team",
- "settings_team_heading": "Workspace Team",
+ "settings_team_heading": "Company team",
"settings_team_member_singular": "member",
"settings_team_member_plural": "members",
"settings_team_import_button": "Import members",
diff --git a/messages/en/statutory.json b/messages/en/statutory.json
index 8667a851..6d46f510 100644
--- a/messages/en/statutory.json
+++ b/messages/en/statutory.json
@@ -24,8 +24,8 @@
"statutory_revision_withdrawn_field_map_replacement": "Revision {version} was withdrawn on {date}: a defect was found in this software's map of where each answer prints on that form. Revision {replacement} governs this inspection, dated {inspectionDate} — ask an administrator to update the template, then start this inspection again on the updated one. Every copy already produced from revision {version} should be produced again.",
"statutory_revision_withdrawn_authority": "The authority withdrew revision {version} on {date}, so this form is no longer produced from it. No software update will bring it back, so there is nothing to wait for. This deployment publishes no other revision covering {inspectionDate}: the form now required has to be obtained from the authority.",
"statutory_revision_withdrawn_authority_replacement": "The authority withdrew revision {version} on {date}, so this form is no longer produced from it. No software update will bring it back: revision {replacement} is the one in force for this inspection, dated {inspectionDate}. Ask an administrator to update the template, then start this inspection again on the updated one.",
- "statutory_update_withdrawn_field_map": "Revision {version}, the one this workspace's template still produces, was withdrawn: a defect was found in this software's map of where each answer prints on that form. Updating is the right move. Inspections still on the withdrawn revision have to be started again on the updated template, and copies already produced from revision {version} should be produced again.",
- "statutory_update_withdrawn_authority": "Revision {version}, the one this workspace's template still produces, was withdrawn by the authority. No software update will bring it back, so updating is the only way forward. Inspections still on the withdrawn revision have to be started again on the updated template.",
+ "statutory_update_withdrawn_field_map": "Revision {version}, the one this company's template still produces, was withdrawn: a defect was found in this software's map of where each answer prints on that form. Updating is the right move. Inspections still on the withdrawn revision have to be started again on the updated template, and copies already produced from revision {version} should be produced again.",
+ "statutory_update_withdrawn_authority": "Revision {version}, the one this company's template still produces, was withdrawn by the authority. No software update will bring it back, so updating is the only way forward. Inspections still on the withdrawn revision have to be started again on the updated template.",
"statutory_update_withdrawn_inflight_one": "1 inspection in progress is still on revision {version} and can no longer produce its form.",
"statutory_update_withdrawn_inflight_many": "{count} inspections in progress are still on revision {version} and can no longer produce their form.",
"statutory_readiness_unavailable": "This check could not run just now, so nothing here is claimed either way. The revisions below are unaffected — reload to try again.",
@@ -85,7 +85,7 @@
"statutory_coverage_complete": "Every required box on this form has an answer.",
"statutory_coverage_missing": "{count} of {total} required field(s) have no answer yet.",
"statutory_coverage_profile_group": "Still to set on a profile — once, not per inspection",
- "statutory_coverage_profile_hint": "These come from the inspector's profile and the workspace, so they are the same on every job. Fix them under Settings and every future inspection is covered.",
+ "statutory_coverage_profile_hint": "These come from the inspector's profile and the company, so they are the same on every job. Fix them under Settings and every future inspection is covered.",
"statutory_coverage_inspection_group": "Still to answer on this inspection",
"statutory_coverage_preview": "Preview the form",
"statutory_coverage_preview_hint": "Opens the authority's page with today's answers, watermarked. Nothing is filed."
diff --git a/messages/en/templates.json b/messages/en/templates.json
index cef4409b..a99c876e 100644
--- a/messages/en/templates.json
+++ b/messages/en/templates.json
@@ -27,7 +27,7 @@
"templates_delete_body": "Are you sure you want to delete this template? This cannot be undone.",
"templates_empty_search": "No templates match your search.",
"templates_empty_title": "Start with a template",
- "templates_empty_body": "Your workspace ships with starter templates — but if you're migrating, bring your own.",
+ "templates_empty_body": "Starter templates come with your account — but if you are migrating, bring your own.",
"templates_empty_new": "+ New template",
"templates_col_name": "Name",
"templates_col_version": "Version",
diff --git a/messages/en/validation.json b/messages/en/validation.json
index 0f9a9f40..75bc18f9 100644
--- a/messages/en/validation.json
+++ b/messages/en/validation.json
@@ -17,8 +17,8 @@
"validation_profile_name_too_long": "Name is too long",
"validation_profile_phone_too_long": "Phone is too long",
"validation_profile_license_too_long": "License number is too long",
- "validation_workspace_name_required": "Workspace name is required",
- "validation_workspace_name_too_long": "Workspace name is too long",
+ "validation_workspace_name_required": "Company name is required",
+ "validation_workspace_name_too_long": "Company name is too long",
"validation_workspace_color_invalid": "Invalid hex color",
"validation_workspace_company_address_too_long": "Company address is too long",
"validation_service_name_required": "Service name is required",
diff --git a/messages/es-419/auth.json b/messages/es-419/auth.json
index e9f6e17f..96e0d895 100644
--- a/messages/es-419/auth.json
+++ b/messages/es-419/auth.json
@@ -1,7 +1,7 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"auth_login_meta_title": "Iniciar sesión — OpenInspection",
- "auth_login_heading": "Inicie sesión en su espacio de trabajo",
+ "auth_login_heading": "Inicie sesión en su empresa",
"auth_login_subtitle": "Ingrese sus credenciales para acceder a inspecciones, informes y herramientas de equipo.",
"auth_login_email_label": "Correo electrónico",
"auth_login_password_label": "Contraseña",
@@ -18,7 +18,7 @@
"auth_validation_password_uppercase": "Debe contener al menos una letra mayúscula",
"auth_validation_password_number": "Debe contener al menos un número",
"auth_validation_password_special": "Debe contener al menos un carácter especial",
- "auth_validation_workspace_name_required": "El nombre del espacio de trabajo es obligatorio",
+ "auth_validation_workspace_name_required": "El nombre de la empresa es obligatorio",
"auth_validation_your_name_required": "Su nombre es obligatorio",
"auth_validation_name_too_long": "El nombre es demasiado largo",
"auth_validation_setup_code_min": "El código de configuración debe tener al menos 6 caracteres",
@@ -83,7 +83,7 @@
"auth_setup_code_help_suffix": "(tipo Secret), y luego actualice esta página.",
"auth_setup_code_help_link": "Cómo agregar un secreto →",
"auth_setup_operator_summary": "Para quien desplegó esto: el código de configuración y el registro de agentes",
- "auth_setup_agent_terms_note": "Algo que esta página no puede hacer: el registro de agentes permanece cerrado hasta que se publiquen los términos para agentes. Hasta entonces, a los agentes se les indica que el registro no está disponible, y ningún administrador del espacio de trabajo puede cambiarlo: solo quien opera esta instalación puede publicarlos, desde la línea de comandos:",
+ "auth_setup_agent_terms_note": "Algo que esta página no puede hacer: el registro de agentes permanece cerrado hasta que se publiquen los términos para agentes. Hasta entonces, a los agentes se les indica que el registro no está disponible, y ningún administrador de la empresa puede cambiarlo: solo quien opera esta instalación puede publicarlos, desde la línea de comandos:",
"auth_setup_agent_terms_docs": "Consulte docs/operate/deploy.md. Termine de crear su cuenta primero: este es un paso aparte y nada de esto depende de él.",
"auth_setup_submit_pending": "Creando su cuenta…",
"auth_setup_submit": "Crear cuenta",
diff --git a/messages/es-419/communication.json b/messages/es-419/communication.json
index dc3fb81c..d09c541c 100644
--- a/messages/es-419/communication.json
+++ b/messages/es-419/communication.json
@@ -25,8 +25,8 @@
"comm_attach_uploading": "Subiendo…",
"comm_reason_no_sms_consent": "Omitido: esta persona no aceptó recibir mensajes de texto.",
"comm_reason_no_review_url": "Omitido: no hay un enlace de reseñas configurado. Agregue uno en Configuración → Empresa.",
- "comm_reason_sms_not_configured": "Omitido: los mensajes de texto no están configurados para este espacio de trabajo.",
- "comm_reason_email_not_configured": "Omitido: el envío de correos electrónicos no está configurado para este espacio de trabajo.",
+ "comm_reason_sms_not_configured": "Omitido: los mensajes de texto no están configurados para esta empresa.",
+ "comm_reason_email_not_configured": "Omitido: el envío de correos electrónicos no está configurado para esta empresa.",
"comm_reason_no_sms_template": "Omitido: la regla no tiene una plantilla de texto.",
"comm_reason_no_email_template": "Omitido: la regla no tiene una plantilla de correo electrónico.",
"comm_reason_managed_not_approved": "Omitido: el número remitente todavía está en espera de la aprobación del operador.",
diff --git a/messages/es-419/components.json b/messages/es-419/components.json
index 0f259baa..b1e12582 100644
--- a/messages/es-419/components.json
+++ b/messages/es-419/components.json
@@ -6,7 +6,7 @@
"modal_invite_title": "Invitar",
"modal_edit_member_title": "Editar miembro",
"modal_edit_member_error_failed": "No se pudieron guardar los cambios.",
- "modal_edit_member_owner_notice": "El rol de un titular no se puede cambiar aquí. Cambiar quién es el titular del espacio de trabajo todavía no es algo que esta aplicación pueda hacer — comuníquese con soporte si lo necesita.",
+ "modal_edit_member_owner_notice": "El rol de un titular no se puede cambiar aquí. Cambiar quién es el titular de la empresa todavía no es algo que esta aplicación pueda hacer — comuníquese con soporte si lo necesita.",
"modal_edit_member_role_change_note": "Los cambios de permisos se aplican de inmediato. Cambiar el rol cierra la sesión de este miembro, así que su nuevo acceso empieza a regir en el siguiente inicio de sesión.",
"modal_invite_send": "Enviar la invitación",
"modal_invite_email_label": "Correo electrónico",
@@ -32,7 +32,7 @@
"email_list_group_client": "Cliente",
"email_list_group_agent": "Agente",
"email_list_group_concierge": "Revisión previa",
- "email_list_group_system": "Espacio de trabajo",
+ "email_list_group_system": "Empresa",
"email_list_customized": "Personalizado",
"email_list_alwayson": "Siempre activo",
"email_list_active": "Activo",
@@ -94,7 +94,7 @@
"newinsp_conflict_suffix": "en este horario. Aun así, usted puede programarla.",
"newinsp_schedule_date_label": "Fecha",
"newinsp_schedule_time_label": "Hora",
- "newinsp_schedule_time_zone_hint": "Los horarios están en {zone}, la zona horaria del espacio de trabajo.",
+ "newinsp_schedule_time_zone_hint": "Los horarios están en {zone}, la zona horaria de la empresa.",
"newinsp_schedule_holiday_advisory": "Está programando en {name}. Aun así, puede guardar esta inspección.",
"newinsp_schedule_holiday_block": "No se puede programar en {name} — los feriados de la empresa están bloqueados.",
"newinsp_schedule_holiday_block_generic": "No se puede programar en un día de cierre de la empresa.",
diff --git a/messages/es-419/editor-2.json b/messages/es-419/editor-2.json
index ad752f75..4cc53da6 100644
--- a/messages/es-419/editor-2.json
+++ b/messages/es-419/editor-2.json
@@ -76,7 +76,7 @@
"editor_settings_required_location": "Ubicación obligatoria",
"editor_settings_required_trade": "Oficio recomendado obligatorio",
"editor_settings_required_both": "Ubicación + oficio obligatorios",
- "editor_settings_required_defect_help": "Anula el valor predeterminado del espacio de trabajo solo para esta inspección.",
+ "editor_settings_required_defect_help": "Anula el valor predeterminado de la empresa solo para esta inspección.",
"editor_settings_legend_cover": "Foto de portada del informe",
"editor_settings_cover_empty": "Aún no hay fotos — suba una abajo, o agregue fotos a un elemento de la inspección y elija una aquí.",
"editor_settings_cover_current": "Portada actual — haga clic para borrarla",
@@ -182,7 +182,7 @@
"editor_property_autofill_filled": "Se completaron {count} campo(s) desde los registros públicos: {fields}",
"editor_property_autofill_none": "No hay campos nuevos que completar — los datos ya parecen completos.",
"editor_property_autofill_not_found": "No se encontraron registros públicos para esta dirección.",
- "editor_property_autofill_unconfigured": "El autocompletado de propiedades no está configurado en este espacio de trabajo.",
+ "editor_property_autofill_unconfigured": "El autocompletado de propiedades no está configurado para su empresa.",
"editor_property_autofill_failed": "No se pudieron obtener los datos de la propiedad. Inténtelo de nuevo.",
"editor_gate_missing": "Faltan: ",
"editor_gate_none": "(ninguno)",
diff --git a/messages/es-419/helpers.json b/messages/es-419/helpers.json
index 1018e26f..22bc7d10 100644
--- a/messages/es-419/helpers.json
+++ b/messages/es-419/helpers.json
@@ -26,7 +26,7 @@
"helper_caloauth_login_required": "La sesión de inicio de sesión de Google venció. Intente conectarse de nuevo.",
"helper_caloauth_consent_required": "Google necesita que se confirmen los permisos. Intente conectarse de nuevo.",
"helper_caloauth_session_expired": "La sesión de conexión venció. Inténtelo de nuevo.",
- "helper_caloauth_not_configured": "Google Calendar no está configurado para este espacio de trabajo. Comuníquese con su administrador.",
+ "helper_caloauth_not_configured": "Google Calendar no está configurado para esta empresa. Comuníquese con su administrador.",
"helper_caloauth_no_refresh_token": "Google no otorgó acceso continuo. Intente conectarse de nuevo y apruebe todos los permisos.",
"helper_caloauth_exchange_failed": "No se pudo completar la autorización de Google Calendar. Inténtelo de nuevo.",
"helper_caloauth_generic": "No se pudo conectar Google Calendar. Inténtelo de nuevo.",
diff --git a/messages/es-419/library.json b/messages/es-419/library.json
index 9afa4e34..67bd7d1c 100644
--- a/messages/es-419/library.json
+++ b/messages/es-419/library.json
@@ -174,7 +174,7 @@
"misc_not_found_home": "Ir al inicio",
"misc_feature_disabled_meta_title": "Función deshabilitada - OpenInspection",
"misc_feature_disabled_heading": "Función no disponible",
- "misc_feature_disabled_desc": "Esta función no está habilitada en su espacio de trabajo. Comuníquese con su administrador o mejore su plan.",
+ "misc_feature_disabled_desc": "Esta función no está habilitada en su empresa. Comuníquese con su administrador o mejore su plan.",
"misc_feature_disabled_back": "Volver al panel",
"misc_version_diff_meta_title": "Comparación de versiones - OpenInspection",
"misc_version_diff_err_not_found": "Versión no encontrada",
diff --git a/messages/es-419/nav.json b/messages/es-419/nav.json
index e12f14cf..c74c0123 100644
--- a/messages/es-419/nav.json
+++ b/messages/es-419/nav.json
@@ -8,7 +8,7 @@
"nav_item_team": "Equipo",
"nav_item_library": "Biblioteca",
"nav_item_settings": "Configuración",
- "nav_section_workspace": "Espacio de trabajo",
+ "nav_section_workspace": "Empresa",
"nav_action_notifications": "Notificaciones",
"nav_action_search": "Buscar…",
"nav_action_command_palette": "Abrir la paleta de comandos",
@@ -20,7 +20,7 @@
"nav_action_collapse": "Contraer",
"nav_user_menu_aria": "Menú de usuario",
"nav_user_profile": "Mi perfil",
- "nav_user_switch_workspace": "Cambiar de espacio de trabajo…",
+ "nav_user_switch_workspace": "Cambiar de empresa…",
"nav_user_privacy": "Política de privacidad",
"nav_user_logout": "Cerrar sesión",
"nav_theme_label": "Tema",
diff --git a/messages/es-419/reports.json b/messages/es-419/reports.json
index d58b2675..099bb0b7 100644
--- a/messages/es-419/reports.json
+++ b/messages/es-419/reports.json
@@ -217,7 +217,7 @@
"report_view_cert_with_company": "{company} · Informe de inspección certificado",
"report_view_cert": "Informe de inspección certificado",
"report_view_build_repair": "Crear una solicitud de reparación",
- "agent_report_actions_workspace_hint": "Ya tiene una cuenta de agente con este correo — le enviaremos un enlace seguro para iniciar sesión en su espacio de trabajo.",
+ "agent_report_actions_workspace_hint": "Ya tiene una cuenta de agente con este correo — le enviaremos un enlace seguro para iniciar sesión en su cuenta.",
"agent_report_actions_workspace_cta": "Envíenme un enlace de inicio de sesión",
"agent_report_actions_workspace_pending": "Enviando…",
"agent_report_actions_workspace_sent": "Revise su correo — le enviamos un enlace de inicio de sesión de un solo uso a su bandeja de entrada. Vence en 15 minutos.",
diff --git a/messages/es-419/settings-catalog.json b/messages/es-419/settings-catalog.json
index 8783f1b6..f195e3f4 100644
--- a/messages/es-419/settings-catalog.json
+++ b/messages/es-419/settings-catalog.json
@@ -16,7 +16,7 @@
"settings_inspection_meta_title": "Configuración del flujo de trabajo de inspección - OpenInspection",
"settings_inspection_loading": "Cargando...",
"settings_inspection_crumb": "Flujo de trabajo de inspección",
- "settings_inspection_intro": "Valores predeterminados que se aplican a todos los inspectores de este espacio de trabajo.",
+ "settings_inspection_intro": "Valores predeterminados que se aplican a todos los inspectores de esta empresa.",
"settings_inspection_clone_heading": "Valor predeterminado de Clonar último (tecla R)",
"settings_inspection_clone_rating": "Solo calificación",
"settings_inspection_clone_rating_notes": "Calificación + notas",
diff --git a/messages/es-419/settings-components.json b/messages/es-419/settings-components.json
index cc5cc80e..83a70324 100644
--- a/messages/es-419/settings-components.json
+++ b/messages/es-419/settings-components.json
@@ -380,8 +380,8 @@
"settings_emaildelivery_sender_email_placeholder": "reports@yourdomain.com",
"settings_emaildelivery_sender_verified": "Debe ser un dominio verificado en su cuenta de {provider}.",
"settings_emaildelivery_from_name_label": "Nombre del remitente",
- "settings_emaildelivery_set_company_link": "Defina el nombre de su empresa en Configuración › Espacio de trabajo",
- "settings_emaildelivery_from_workspace": "(de la configuración del espacio de trabajo)",
+ "settings_emaildelivery_set_company_link": "Defina el nombre de su empresa en Configuración › Empresa",
+ "settings_emaildelivery_from_workspace": "(de la configuración de la empresa)",
"settings_emaildelivery_override_name": "Usar un nombre distinto en el campo De del correo electrónico",
"settings_emaildelivery_display_name_placeholder": "Acme Inspections",
"settings_emaildelivery_replyto_label": "Responder a",
diff --git a/messages/es-419/settings-integrations.json b/messages/es-419/settings-integrations.json
index 7e48fdcc..78bac113 100644
--- a/messages/es-419/settings-integrations.json
+++ b/messages/es-419/settings-integrations.json
@@ -158,7 +158,7 @@
"settings_qbo_oauth_error_invalid_state": "Ese intento de conexión expiró. Vuelva a comenzar desde esta página.",
"settings_qbo_oauth_error_failed": "QuickBooks rechazó la conexión. Verifique que las credenciales de arriba pertenezcan a la misma aplicación y al mismo entorno de Intuit, y vuelva a intentarlo.",
"settings_qbo_oauth_error_access_denied": "Usted rechazó la conexión en QuickBooks. No se cambió nada.",
- "settings_qbo_oauth_error_realm_already_connected": "Esa empresa de QuickBooks ya está conectada a otro espacio de trabajo. Desconéctela allí primero y luego conéctela aquí.",
+ "settings_qbo_oauth_error_realm_already_connected": "Esa empresa de QuickBooks ya está conectada a otra empresa. Desconéctela allí primero y luego conéctela aquí.",
"settings_qbo_oauth_error_unknown": "QuickBooks devolvió un error: {code}",
"settings_qbo_env_provided": "Proporcionado por esta instalación",
"settings_qbo_env_provided_badge": "Entorno",
@@ -226,7 +226,7 @@
"settings_billing_active_members": "Miembros activos",
"settings_billing_permanent": "Permanente",
"settings_billing_view_usage": "Ver el uso de SMS, correo electrónico y almacenamiento",
- "settings_billing_capacity_heading": "Capacidad del espacio de trabajo",
+ "settings_billing_capacity_heading": "Capacidad de la empresa",
"settings_billing_capacity_desc": "No hay cuotas en el modo autónomo — estos datos son informativos.",
"settings_billing_cost_heading": "Costo mensual estimado",
"settings_billing_cost_desc": "Stripe emite la factura oficial — estas cifras son un cálculo aproximado basado en la tarifa por puesto.",
@@ -261,7 +261,7 @@
"settings_compliance_pdf_desc": "Cuánto tiempo se conserva un PDF de informe generado antes de destruir el archivo y su registro de forma permanente. Escriba 0 para conservarlos indefinidamente.",
"settings_compliance_pdf_note": "Valor predeterminado de la plataforma: 7 años. Es un valor que elige la plataforma para cuando usted no ha fijado un periodo. No es un periodo de conservación establecido por ley, ni una afirmación de que siete años sea el máximo exigido legalmente. El valor se basa principalmente en la defensa de reclamaciones legales y, en segundo lugar, en normas de conservación de registros: Illinois exige cinco años para contratos, informes y datos de apoyo de inspecciones de vivienda, con un periodo mayor cuando un procedimiento judicial que cumpla los requisitos se extiende dos años más allá de su resolución final; Virginia y Washington fijan periodos de tres años para determinados registros de inspección de vivienda. Su propia elección prevalece siempre que la ley lo permita.",
"settings_compliance_views_heading": "Recuento de aperturas del informe",
- "settings_compliance_views_desc": "Si este espacio de trabajo registra que un destinatario abrió un informe, y cuántas veces.",
+ "settings_compliance_views_desc": "Si esta empresa registra que un destinatario abrió un informe, y cuántas veces.",
"settings_compliance_views_label": "Contar aperturas del informe",
"settings_compliance_views_note": "Desactivado salvo que lo active. Cuando está activado, registramos la primera y la última vez que cada destinatario abrió un informe y con qué frecuencia; ningún dato de página, desplazamiento o dispositivo. El recuento se omite en sus propias vistas previas, en el generador de PDF y en las precargas del navegador, de modo que la cifra refleja personas y no máquinas. Es un indicio, no una prueba de recepción: un verificador de enlaces que se comporta como un navegador es indistinguible de un lector. Cualquier destinatario puede oponerse a ser contabilizado, y esa oposición se respeta solo para él.",
"settings_compliance_pdf_range_error": "Escriba un número entero de años entre 0 y 99. Use 0 para conservar los PDF de informes indefinidamente.",
@@ -279,11 +279,11 @@
"settings_compliance_status_refused": "Denegado",
"settings_compliance_status_held": "Conservado (retención legal)",
"settings_compliance_ai_heading": "Registro de garantía de IA",
- "settings_compliance_ai_desc": "Cada llamada de IA que hizo este espacio de trabajo, la versión del prompt y el modelo que generaron el texto, y quién revisó el resultado. Solo lectura.",
- "settings_compliance_ai_empty": "No hay llamadas de IA registradas. Nada en este espacio de trabajo se redactó con asistencia de un modelo.",
+ "settings_compliance_ai_desc": "Cada llamada de IA que hizo esta empresa, la versión del prompt y el modelo que generaron el texto, y quién revisó el resultado. Solo lectura.",
+ "settings_compliance_ai_empty": "No hay llamadas de IA registradas. Nada en esta empresa se redactó con asistencia de un modelo.",
"settings_compliance_ai_empty_page": "No hay llamadas anteriores a este punto.",
"settings_compliance_ai_unreviewed": "Sin revisión registrada para {count} de las {total} llamadas mostradas.",
- "settings_compliance_ai_unresolved": "Revisiones que citan una llamada de la que este espacio de trabajo no tiene registro: {count}.",
+ "settings_compliance_ai_unresolved": "Revisiones que citan una llamada de la que esta empresa no tiene registro: {count}.",
"settings_compliance_ai_col_when": "Llamada",
"settings_compliance_ai_col_model": "Modelo",
"settings_compliance_ai_col_prompt": "Versión del prompt",
diff --git a/messages/es-419/settings.json b/messages/es-419/settings.json
index ff882899..cec0ce90 100644
--- a/messages/es-419/settings.json
+++ b/messages/es-419/settings.json
@@ -64,8 +64,8 @@
"settings_timezone_browser_hint": "La zona horaria de su navegador es {zone}.",
"settings_timezone_browser_use": "Usar esta",
"settings_profile_locale_label": "Su idioma / configuración regional",
- "settings_profile_locale_hint": "Cambia el formato de las fechas, las horas y los números solo para usted. Déjelo en el valor predeterminado del espacio de trabajo para heredar la configuración de la empresa.",
- "settings_profile_locale_inherit_option": "Usar el valor predeterminado del espacio de trabajo",
+ "settings_profile_locale_hint": "Cambia el formato de las fechas, las horas y los números solo para usted. Déjelo en el valor predeterminado de la empresa para heredar la configuración de la empresa.",
+ "settings_profile_locale_inherit_option": "Usar el valor predeterminado de la empresa",
"settings_profile_photo_heading": "Foto de perfil",
"settings_profile_photo_subtitle": "Su imagen en la página pública de reservas de la empresa.",
"settings_profile_photo_none": "Sin foto",
@@ -192,13 +192,13 @@
"settings_data_import_choose_file": "Elegir archivo CSV",
"settings_data_import_file_hint": "Máximo 5 MB, codificación UTF-8",
"settings_data_bundled_heading": "Instalar lo nuevo",
- "settings_data_bundled_subtitle": "Agrega las plantillas, los comentarios, los elementos de reparación y demás contenido inicial que incluye esta versión y que este espacio de trabajo aún no tiene. No se modifica nada de lo que ya tiene.",
+ "settings_data_bundled_subtitle": "Agrega las plantillas, los comentarios, los elementos de reparación y demás contenido inicial que incluye esta versión y que esta empresa aún no tiene. No se modifica nada de lo que ya tiene.",
"settings_data_bundled_rename_note": "Los elementos se comparan por nombre. Una plantilla que usted renombró ya no coincide, así que vuelve como una segunda copia con su nombre original.",
"settings_data_bundled_button": "Instalar lo nuevo",
"settings_data_bundled_button_busy": "Instalando…",
"settings_data_bundled_result_added_one": "Se agregó 1 elemento nuevo.",
"settings_data_bundled_result_added_other": "Se agregaron {count} elementos nuevos.",
- "settings_data_bundled_result_none": "No hay nada que agregar: este espacio de trabajo ya tiene todo lo que incluye esta versión.",
+ "settings_data_bundled_result_none": "No hay nada que agregar: esta empresa ya tiene todo lo que incluye esta versión.",
"settings_data_bundled_result_error": "No se pudo instalar el contenido incluido. Inténtelo de nuevo.",
"settings_hub_meta_title": "Configuración - OpenInspection",
"settings_profile_meta_title": "Perfil - Configuración - OpenInspection",
@@ -227,7 +227,7 @@
"settings_usage_byo": "a través de su propia cuenta: {count}",
"settings_team_meta_title": "Equipo - OpenInspection",
"settings_team_crumb": "Equipo",
- "settings_team_heading": "Equipo del espacio de trabajo",
+ "settings_team_heading": "Equipo de la empresa",
"settings_team_member_singular": "miembro",
"settings_team_member_plural": "miembros",
"settings_team_import_button": "Importar miembros",
diff --git a/messages/es-419/statutory.json b/messages/es-419/statutory.json
index 1a69b696..def37418 100644
--- a/messages/es-419/statutory.json
+++ b/messages/es-419/statutory.json
@@ -24,8 +24,8 @@
"statutory_revision_withdrawn_field_map_replacement": "La revisión {version} se retiró el {date}: se encontró un defecto en el mapa de este software que indica dónde se imprime cada respuesta en ese formulario. La revisión {replacement} rige esta inspección, con fecha {inspectionDate}: pida a un administrador que actualice la plantilla y vuelva a iniciar esta inspección sobre la plantilla actualizada. Toda copia ya producida con la revisión {version} deberá producirse de nuevo.",
"statutory_revision_withdrawn_authority": "La autoridad retiró la revisión {version} el {date}, así que este formulario ya no se produce con ella. Ninguna actualización del software la devolverá, de modo que no hay nada que esperar. Esta instalación no publica ninguna otra revisión que cubra el {inspectionDate}: el formulario ahora exigido debe obtenerse de la autoridad.",
"statutory_revision_withdrawn_authority_replacement": "La autoridad retiró la revisión {version} el {date}, así que este formulario ya no se produce con ella. Ninguna actualización del software la devolverá: la revisión {replacement} es la vigente para esta inspección, con fecha {inspectionDate}. Pida a un administrador que actualice la plantilla y vuelva a iniciar esta inspección sobre la plantilla actualizada.",
- "statutory_update_withdrawn_field_map": "La revisión {version}, la que aún produce la plantilla de este espacio de trabajo, fue retirada: se encontró un defecto en el mapa de este software que indica dónde se imprime cada respuesta en ese formulario. Actualizar es lo correcto. Las inspecciones que sigan en la revisión retirada habrá que volver a iniciarlas sobre la plantilla actualizada, y las copias ya producidas con la revisión {version} deberán producirse de nuevo.",
- "statutory_update_withdrawn_authority": "La revisión {version}, la que aún produce la plantilla de este espacio de trabajo, fue retirada por la autoridad. Ninguna actualización del software la devolverá, así que actualizar es el único camino. Las inspecciones que sigan en la revisión retirada habrá que volver a iniciarlas sobre la plantilla actualizada.",
+ "statutory_update_withdrawn_field_map": "La revisión {version}, la que aún produce la plantilla de esta empresa, fue retirada: se encontró un defecto en el mapa de este software que indica dónde se imprime cada respuesta en ese formulario. Actualizar es lo correcto. Las inspecciones que sigan en la revisión retirada habrá que volver a iniciarlas sobre la plantilla actualizada, y las copias ya producidas con la revisión {version} deberán producirse de nuevo.",
+ "statutory_update_withdrawn_authority": "La revisión {version}, la que aún produce la plantilla de esta empresa, fue retirada por la autoridad. Ninguna actualización del software la devolverá, así que actualizar es el único camino. Las inspecciones que sigan en la revisión retirada habrá que volver a iniciarlas sobre la plantilla actualizada.",
"statutory_update_withdrawn_inflight_one": "1 inspección en curso sigue en la revisión {version} y ya no puede producir su formulario.",
"statutory_update_withdrawn_inflight_many": "{count} inspecciones en curso siguen en la revisión {version} y ya no pueden producir su formulario.",
"statutory_readiness_unavailable": "Esta comprobación no pudo ejecutarse ahora, así que no se afirma nada en ningún sentido. Las revisiones de abajo no se ven afectadas: recarga para reintentar.",
diff --git a/messages/es-419/templates.json b/messages/es-419/templates.json
index 6483fc9a..4384f3d5 100644
--- a/messages/es-419/templates.json
+++ b/messages/es-419/templates.json
@@ -27,7 +27,7 @@
"templates_delete_body": "¿Seguro que desea eliminar esta plantilla? Esta acción no se puede deshacer.",
"templates_empty_search": "Ninguna plantilla coincide con su búsqueda.",
"templates_empty_title": "Comience con una plantilla",
- "templates_empty_body": "Su espacio de trabajo incluye plantillas iniciales — pero si está migrando, traiga las suyas.",
+ "templates_empty_body": "Las plantillas iniciales vienen con su cuenta — pero si está migrando, traiga las suyas.",
"templates_empty_new": "+ Nueva plantilla",
"templates_col_name": "Nombre",
"templates_col_version": "Versión",
diff --git a/messages/es-419/validation.json b/messages/es-419/validation.json
index 6f56489e..bcc42676 100644
--- a/messages/es-419/validation.json
+++ b/messages/es-419/validation.json
@@ -17,8 +17,8 @@
"validation_profile_name_too_long": "El nombre es demasiado largo",
"validation_profile_phone_too_long": "El teléfono es demasiado largo",
"validation_profile_license_too_long": "El número de licencia es demasiado largo",
- "validation_workspace_name_required": "El nombre del espacio de trabajo es obligatorio",
- "validation_workspace_name_too_long": "El nombre del espacio de trabajo es demasiado largo",
+ "validation_workspace_name_required": "El nombre de la empresa es obligatorio",
+ "validation_workspace_name_too_long": "El nombre de la empresa es demasiado largo",
"validation_workspace_color_invalid": "Color hexadecimal no válido",
"validation_workspace_company_address_too_long": "La dirección de la empresa es demasiado larga",
"validation_service_name_required": "El nombre del servicio es obligatorio",
From 4c9bb07bccbddaed8b5552162c7810b32da088a6 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:01:46 -0400
Subject: [PATCH 02/16] fix(copy): login network error no longer asks about the
API server (QA sweep COPY-02)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/auth.json | 2 +-
messages/es-419/auth.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/messages/en/auth.json b/messages/en/auth.json
index fffd672c..8d3d5390 100644
--- a/messages/en/auth.json
+++ b/messages/en/auth.json
@@ -10,7 +10,7 @@
"auth_login_submit_pending": "Logging in…",
"auth_login_error_failed_with_status": "Login failed ({status})",
"auth_login_error_no_token": "Authentication succeeded but no token received",
- "auth_login_error_network": "Network error — is the API server running?",
+ "auth_login_error_network": "We could not reach the server. Check your connection and try again.",
"auth_validation_email_required": "Email is required",
"auth_validation_email_invalid": "Invalid email address",
"auth_validation_password_required": "Password is required",
diff --git a/messages/es-419/auth.json b/messages/es-419/auth.json
index 96e0d895..cc1c675d 100644
--- a/messages/es-419/auth.json
+++ b/messages/es-419/auth.json
@@ -10,7 +10,7 @@
"auth_login_submit_pending": "Iniciando sesión…",
"auth_login_error_failed_with_status": "Error al iniciar sesión ({status})",
"auth_login_error_no_token": "La autenticación se realizó correctamente, pero no se recibió ningún token.",
- "auth_login_error_network": "Error de red: ¿el servidor de la API está en ejecución?",
+ "auth_login_error_network": "No pudimos conectar con el servidor. Revise su conexión e inténtelo de nuevo.",
"auth_validation_email_required": "El correo electrónico es obligatorio",
"auth_validation_email_invalid": "Correo electrónico no válido",
"auth_validation_password_required": "La contraseña es obligatoria",
From fbdb36bdabbcb2d578f13931a3929fa2f01f369d Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:02:13 -0400
Subject: [PATCH 03/16] fix(copy): replace Cross-tenant view with plain wording
(QA sweep COPY-03)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/auth.json | 2 +-
messages/es-419/auth.json | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/messages/en/auth.json b/messages/en/auth.json
index 8d3d5390..671c4da0 100644
--- a/messages/en/auth.json
+++ b/messages/en/auth.json
@@ -99,7 +99,7 @@
"auth_agent_invite_body_rest": "has invited you to be a partner agent. See every inspection your inspectors complete for the clients you refer.",
"auth_agent_invite_prop1_title": "Real-time referrals",
"auth_agent_invite_prop1_sub": "See reports the moment they're ready",
- "auth_agent_invite_prop2_title": "Cross-tenant view",
+ "auth_agent_invite_prop2_title": "Every inspector in one view",
"auth_agent_invite_prop2_sub": "All your inspectors, one dashboard",
"auth_agent_invite_prop3_title": "Free",
"auth_agent_invite_prop3_sub": "No fees, no card on file",
diff --git a/messages/es-419/auth.json b/messages/es-419/auth.json
index cc1c675d..bfac3002 100644
--- a/messages/es-419/auth.json
+++ b/messages/es-419/auth.json
@@ -97,7 +97,7 @@
"auth_agent_invite_body_rest": "le envió una invitación para ser agente asociado. Vea todas las inspecciones que sus inspectores completan para los clientes que usted refiere.",
"auth_agent_invite_prop1_title": "Referencias en tiempo real",
"auth_agent_invite_prop1_sub": "Vea los informes en cuanto estén listos",
- "auth_agent_invite_prop2_title": "Vista entre empresas",
+ "auth_agent_invite_prop2_title": "Todos sus inspectores en una vista",
"auth_agent_invite_prop2_sub": "Todos sus inspectores, un solo panel",
"auth_agent_invite_prop3_title": "Gratis",
"auth_agent_invite_prop3_sub": "Sin comisiones, sin tarjeta guardada",
From f03c9ec252e3f5187f5a075e717788eb227b2ce3 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:02:37 -0400
Subject: [PATCH 04/16] fix(copy): sentence case for the cited button pairs (QA
sweep COPY-04)
Co-Authored-By: Claude Sonnet 5.5
---
app/lib/forms/auth.schema.test.ts | 2 +-
messages/en/auth.json | 6 +++---
messages/en/checkout.json | 2 +-
messages/en/reports.json | 2 +-
messages/en/settings.json | 4 ++--
server/lib/email-templates/catalog/client.ts | 4 ++--
tests/e2e/branding.spec.ts | 2 +-
tests/e2e/timezone-settings.spec.ts | 2 +-
8 files changed, 12 insertions(+), 12 deletions(-)
diff --git a/app/lib/forms/auth.schema.test.ts b/app/lib/forms/auth.schema.test.ts
index f292d679..48a5329a 100644
--- a/app/lib/forms/auth.schema.test.ts
+++ b/app/lib/forms/auth.schema.test.ts
@@ -113,7 +113,7 @@ describe('auth login i18n (Phase C pilot)', () => {
it('resolves login UI messages in en (baseLocale)', () => {
overwriteGetLocale(() => 'en');
expect(m.auth_login_heading()).toBe('Log in to your company');
- expect(m.auth_login_submit()).toBe('Log In');
+ expect(m.auth_login_submit()).toBe('Log in');
expect(m.auth_login_email_label()).toBe('Email address');
});
diff --git a/messages/en/auth.json b/messages/en/auth.json
index 671c4da0..60b615dd 100644
--- a/messages/en/auth.json
+++ b/messages/en/auth.json
@@ -6,7 +6,7 @@
"auth_login_email_label": "Email address",
"auth_login_password_label": "Password",
"auth_login_forgot_link": "Forgot password?",
- "auth_login_submit": "Log In",
+ "auth_login_submit": "Log in",
"auth_login_submit_pending": "Logging in…",
"auth_login_error_failed_with_status": "Login failed ({status})",
"auth_login_error_no_token": "Authentication succeeded but no token received",
@@ -88,7 +88,7 @@
"auth_setup_agent_terms_note": "One thing this page cannot do: agent sign-up stays closed until the agent terms are published. Until then agents are told sign-up is not available, and no company administrator can change it — only whoever operates this deployment can publish them, from the command line:",
"auth_setup_agent_terms_docs": "See docs/operate/deploy.md. Finish creating your account first — this is a separate step, and nothing here waits on it.",
"auth_setup_submit_pending": "Creating your account…",
- "auth_setup_submit": "Create Account",
+ "auth_setup_submit": "Create account",
"auth_agent_invite_meta_title": "You're invited - OpenInspection",
"auth_agent_invite_error_failed": "Could not accept invite",
"auth_agent_invite_unavailable_heading": "Invite unavailable",
@@ -133,7 +133,7 @@
"auth_agent_login_meta_title": "Agent sign in - OpenInspection",
"auth_agent_login_heading": "Agent sign in",
"auth_agent_login_subtitle": "Sign in to see referrals, reports, and inspector availability.",
- "auth_agent_login_submit": "Log In",
+ "auth_agent_login_submit": "Log in",
"auth_agent_login_submit_pending": "Logging in…",
"auth_agent_login_error_invalid": "Invalid email or password",
"auth_agent_login_error_no_session": "Authentication succeeded but no session was created",
diff --git a/messages/en/checkout.json b/messages/en/checkout.json
index 6622de2e..d2b297f7 100644
--- a/messages/en/checkout.json
+++ b/messages/en/checkout.json
@@ -24,7 +24,7 @@
"checkout_sign_draw_prompt": "Draw your signature below:",
"checkout_sign_canvas_aria": "Signature pad — draw your signature here",
"checkout_sign_submit_pending": "Signing...",
- "checkout_sign_submit": "Sign Agreement",
+ "checkout_sign_submit": "Sign agreement",
"checkout_pay_step_label": "Step 2 · Payment",
"checkout_pay_none_required": "No payment is required for this inspection.",
"checkout_pay_received": "Payment received — thank you.",
diff --git a/messages/en/reports.json b/messages/en/reports.json
index 2b6f62b8..4bcd618a 100644
--- a/messages/en/reports.json
+++ b/messages/en/reports.json
@@ -131,7 +131,7 @@
"portal_agreement_verify_hint": "Use this link anytime to confirm this signature hasn't been altered.",
"portal_agreement_draw_prompt": "Draw your signature below:",
"portal_agreement_signing_pending": "Signing...",
- "portal_agreement_sign_submit": "Sign Agreement",
+ "portal_agreement_sign_submit": "Sign agreement",
"portal_agreement_cancel_decline": "Cancel decline",
"portal_agreement_decline_toggle": "Decline this agreement",
"portal_agreement_reason_label": "Reason (optional)",
diff --git a/messages/en/settings.json b/messages/en/settings.json
index 5fa11723..1467e71b 100644
--- a/messages/en/settings.json
+++ b/messages/en/settings.json
@@ -175,7 +175,7 @@
"settings_workspace_pdf_page_numbers_desc": "Adds page numbers to the report PDF.",
"settings_workspace_pdf_license_title": "Show inspector license",
"settings_workspace_pdf_license_desc": "Includes the inspector license number on the report PDF.",
- "settings_workspace_save_button": "Save Company",
+ "settings_workspace_save_button": "Save company",
"settings_workspace_error_no_logo": "No valid logo provided",
"settings_workspace_error_logo_upload": "The logo could not be uploaded. Please try again.",
"settings_data_meta_title": "Data - Settings - OpenInspection",
@@ -231,7 +231,7 @@
"settings_team_member_singular": "member",
"settings_team_member_plural": "members",
"settings_team_import_button": "Import members",
- "settings_team_invite_button": "Invite Member",
+ "settings_team_invite_button": "Invite member",
"settings_team_tab_active": "Active",
"settings_team_tab_pending": "Pending Invites",
"settings_team_empty_pending_title": "No pending invites",
diff --git a/server/lib/email-templates/catalog/client.ts b/server/lib/email-templates/catalog/client.ts
index c69b9fe1..f052e2dd 100644
--- a/server/lib/email-templates/catalog/client.ts
+++ b/server/lib/email-templates/catalog/client.ts
@@ -73,7 +73,7 @@ export const CLIENT_TEMPLATES: EmailTemplateDescriptor[] = [
blocks: [
{ key: 'heading', label: 'Heading', default: 'Inspection Report Shared', multiline: false },
{ key: 'body', label: 'Body', default: 'The inspector has shared the inspection report for {{address}} with you.', multiline: true },
- { key: 'ctaLabel', label: 'Button', default: 'View Report', multiline: false },
+ { key: 'ctaLabel', label: 'Button', default: 'View report', multiline: false },
],
variables: [
{ name: 'address', desc: 'Property address' },
@@ -147,7 +147,7 @@ export const CLIENT_TEMPLATES: EmailTemplateDescriptor[] = [
blocks: [
{ key: 'heading', label: 'Heading', default: 'Document Ready to Sign', multiline: false },
{ key: 'body', label: 'Body', default: 'Hi {{clientName}}, you have been asked to review and sign the following agreement: {{agreementName}}.', multiline: true },
- { key: 'ctaLabel', label: 'Button', default: 'Review & Sign Agreement', multiline: false },
+ { key: 'ctaLabel', label: 'Button', default: 'Review & sign agreement', multiline: false },
],
variables: [
{ name: 'clientName', desc: 'Client name' },
diff --git a/tests/e2e/branding.spec.ts b/tests/e2e/branding.spec.ts
index cfdbbd0c..4551dac9 100644
--- a/tests/e2e/branding.spec.ts
+++ b/tests/e2e/branding.spec.ts
@@ -75,7 +75,7 @@ test.describe.serial('Branding System E2E', () => {
// Live primary-color picker (settings-workspace.tsx:185-192).
await expect(page.locator('input[type="color"][name="primaryColor"]')).toBeVisible();
// Live save affordance (settings-workspace.tsx:366-369).
- await expect(page.getByRole('button', { name: 'Save Company' })).toBeVisible();
+ await expect(page.getByRole('button', { name: 'Save company' })).toBeVisible();
});
test('design-system --ih-primary token is injected on the document root', async ({ page }) => {
diff --git a/tests/e2e/timezone-settings.spec.ts b/tests/e2e/timezone-settings.spec.ts
index faca94be..fe8dff63 100644
--- a/tests/e2e/timezone-settings.spec.ts
+++ b/tests/e2e/timezone-settings.spec.ts
@@ -62,7 +62,7 @@ test.describe.serial('Timezone configuration E2E', () => {
await expect(tz).toBeVisible({ timeout: 10000 });
await tz.selectOption('America/New_York');
- await page.getByRole('button', { name: 'Save Company' }).click();
+ await page.getByRole('button', { name: 'Save company' }).click();
await expect(page.getByText(/company settings saved/i)).toBeVisible({ timeout: 10000 });
// Reload and confirm the saved timezone is the selected value.
From b90592e2effc0155dae0ac66d4b60459c6817c5b Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:04:15 -0400
Subject: [PATCH 05/16] fix(copy): straight apostrophes throughout the catalogs
(QA sweep COPY-05)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/booking.json | 10 +++++-----
messages/en/checkout.json | 6 +++---
messages/en/components.json | 4 ++--
messages/en/misc.json | 2 +-
messages/en/pca-report.json | 2 +-
messages/en/reports.json | 4 ++--
messages/en/settings-components.json | 16 ++++++++--------
messages/en/settings.json | 2 +-
8 files changed, 23 insertions(+), 23 deletions(-)
diff --git a/messages/en/booking.json b/messages/en/booking.json
index b55fa74c..aeb76a03 100644
--- a/messages/en/booking.json
+++ b/messages/en/booking.json
@@ -6,16 +6,16 @@
"booking_error_service_unavailable": "Service unavailable",
"booking_error_state_heading": "Not Available",
"booking_error_state_default": "This booking page is not available.",
- "booking_not_open_heading": "Online booking isn’t open yet",
- "booking_not_open_body": "{company} hasn’t opened online scheduling yet. Please contact them directly to book your inspection.",
- "booking_not_open_body_no_contact": "{company} hasn’t opened online scheduling yet. This page will let you book as soon as they do.",
+ "booking_not_open_heading": "Online booking isn't open yet",
+ "booking_not_open_body": "{company} hasn't opened online scheduling yet. Please contact them directly to book your inspection.",
+ "booking_not_open_body_no_contact": "{company} hasn't opened online scheduling yet. This page will let you book as soon as they do.",
"booking_embed_unavailable": "Booking unavailable.",
"booking_inspector_default_name": "Inspector",
"booking_embed_company_default_name": "Inspection company",
"booking_logo_alt": "Logo",
"booking_embed_book_with_heading": "Book with {name}",
- "booking_embed_confirm_by_email": "Pick a date and we’ll confirm by email.",
- "booking_embed_not_open": "Online booking isn’t open yet — please contact {name} directly to schedule.",
+ "booking_embed_confirm_by_email": "Pick a date and we'll confirm by email.",
+ "booking_embed_not_open": "Online booking isn't open yet — please contact {name} directly to schedule.",
"booking_embed_status_success": "Booking request sent! Check your email.",
"booking_embed_status_could_not_submit": "Could not submit",
"booking_embed_status_network_error": "Network error",
diff --git a/messages/en/checkout.json b/messages/en/checkout.json
index d2b297f7..8efb495a 100644
--- a/messages/en/checkout.json
+++ b/messages/en/checkout.json
@@ -19,7 +19,7 @@
"checkout_sign_step_label": "Step 1 · Agreement",
"checkout_sign_signature_progress": "Signature {current} of {total}",
"checkout_sign_done_heading": "Agreement signed",
- "checkout_sign_waiting_body": "Thank you, {signerName}. We’re waiting on the other signer{plural} to complete this agreement ({signed} of {total} signed).",
+ "checkout_sign_waiting_body": "Thank you, {signerName}. We're waiting on the other signer{plural} to complete this agreement ({signed} of {total} signed).",
"checkout_sign_thankyou": "Thank you, {signerName}.",
"checkout_sign_draw_prompt": "Draw your signature below:",
"checkout_sign_canvas_aria": "Signature pad — draw your signature here",
@@ -28,13 +28,13 @@
"checkout_pay_step_label": "Step 2 · Payment",
"checkout_pay_none_required": "No payment is required for this inspection.",
"checkout_pay_received": "Payment received — thank you.",
- "checkout_pay_finalizing": "We’re finalizing your receipt; it will appear here shortly.",
+ "checkout_pay_finalizing": "We're finalizing your receipt; it will appear here shortly.",
"checkout_pay_heading": "Pay for your inspection",
"checkout_pay_starting": "Starting secure checkout…",
"checkout_pay_button": "Pay {amount}",
"checkout_pay_secured_by_stripe": "Secured by Stripe",
"checkout_pay_already_paid": "This invoice has already been paid. Refresh the page to see your receipt.",
- "checkout_pay_unavailable_before": "Secure online card payment isn’t available right now. Please contact",
+ "checkout_pay_unavailable_before": "Secure online card payment isn't available right now. Please contact",
"checkout_pay_unavailable_after": " to arrange payment.",
"checkout_pay_processing": "Processing…",
"checkout_pay_error_failed": "Payment could not be completed. Please try again.",
diff --git a/messages/en/components.json b/messages/en/components.json
index ed8cd433..291a9520 100644
--- a/messages/en/components.json
+++ b/messages/en/components.json
@@ -1,7 +1,7 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"modal_seatlimit_title": "Seat limit reached",
- "modal_seatlimit_body": "You’ve reached your seat limit ({used}/{max}). Upgrade your plan to invite more team members.",
+ "modal_seatlimit_body": "You've reached your seat limit ({used}/{max}). Upgrade your plan to invite more team members.",
"modal_seatlimit_upgrade": "Upgrade",
"modal_invite_title": "Invite",
"modal_edit_member_title": "Edit member",
@@ -99,7 +99,7 @@
"newinsp_schedule_holiday_block": "Cannot schedule on {name} — company holidays are blocked.",
"newinsp_schedule_holiday_block_generic": "Cannot schedule on a company closed day.",
"newinsp_quota_title": "Free plan limit reached",
- "newinsp_quota_body": "You’ve used all 5 free inspections. Everything you created stays fully usable — subscribe to create new ones.",
+ "newinsp_quota_body": "You've used all 5 free inspections. Everything you created stays fully usable — subscribe to create new ones.",
"newinsp_quota_subscribe": "Subscribe",
"newinsp_services_label": "Services and pricing",
"newinsp_services_template_hint": "The Report template you picked decides what the report contains; services decide what the client is charged — nothing here has to match the template.",
diff --git a/messages/en/misc.json b/messages/en/misc.json
index f1f97578..3a5039d2 100644
--- a/messages/en/misc.json
+++ b/messages/en/misc.json
@@ -168,7 +168,7 @@
"template_combobox_clear": "--- Clear selection ---",
"template_combobox_load_more": "Load more",
"access_denied_title": "Admins only",
- "access_denied_body": "You don’t have permission to view this page.",
+ "access_denied_body": "You don't have permission to view this page.",
"breadcrumb_aria": "Breadcrumb",
"template_menu_template": "Template",
"template_menu_actions_aria": "Template actions",
diff --git a/messages/en/pca-report.json b/messages/en/pca-report.json
index 429a7289..e3b4b1ee 100644
--- a/messages/en/pca-report.json
+++ b/messages/en/pca-report.json
@@ -63,7 +63,7 @@
"pca_skeleton_introduction_limitations": "2.3 Limitations & Exceptions",
"pca_skeleton_introduction_reconnaissance": "2.4 General Property Reconnaissance",
"pca_skeleton_introduction_user_reliance": "2.5 User Reliance",
- "pca_skeleton_reliance_default": "The consultant’s relationship to the client is disclosed in accordance with ASTM E2018 §7.3.",
+ "pca_skeleton_reliance_default": "The consultant's relationship to the client is disclosed in accordance with ASTM E2018 §7.3.",
"pca_skeleton_chapter_property_description": "General Property Description",
"pca_skeleton_document_review": "Document Review & Interviews",
"pca_skeleton_chapter_site": "Site",
diff --git a/messages/en/reports.json b/messages/en/reports.json
index 4bcd618a..07afc778 100644
--- a/messages/en/reports.json
+++ b/messages/en/reports.json
@@ -193,14 +193,14 @@
"portal_invoice_balance": "Balance",
"portal_invoice_balance_due": "Balance due",
"portal_invoice_payment_received": "Payment received — thank you.",
- "portal_invoice_finalizing": "We’re finalizing your receipt; your paid invoice will appear here shortly.",
+ "portal_invoice_finalizing": "We're finalizing your receipt; your paid invoice will appear here shortly.",
"portal_invoice_keep_receipt": "Keep this receipt for your records.",
"portal_pay_this_invoice": "Pay this invoice",
"portal_pay_starting_checkout": "Starting secure checkout…",
"portal_pay_amount": "Pay {amount}",
"portal_pay_secured_no_signature": "Secured by Stripe · No signature required",
"portal_pay_already_paid": "This invoice has already been paid. Refresh the page to see your receipt.",
- "portal_pay_unavailable_before": "Secure online card payment isn’t available right now. Please contact",
+ "portal_pay_unavailable_before": "Secure online card payment isn't available right now. Please contact",
"portal_pay_unavailable_after": "to arrange payment.",
"portal_pay_inspector_fallback": "your inspector",
"portal_pay_error_generic": "Payment could not be completed. Please try again.",
diff --git a/messages/en/settings-components.json b/messages/en/settings-components.json
index 97543995..797110c9 100644
--- a/messages/en/settings-components.json
+++ b/messages/en/settings-components.json
@@ -198,7 +198,7 @@
"settings_slotrules_desc": "Choose how bookable start times are generated from inspector availability windows. Defaults are Fixed time slots / 30 minutes.",
"settings_slotrules_mode_label": "Schedule mode",
"settings_slotrules_mode_aria": "Booking slot mode",
- "settings_slotrules_fixed_desc": "Starts align to each availability window’s start time, then step by the interval.",
+ "settings_slotrules_fixed_desc": "Starts align to each availability window's start time, then step by the interval.",
"settings_slotrules_open_desc": "Starts snap to the clock (e.g. :00 / :30) at every interval inside each window.",
"settings_slotrules_interval_label": "Slot interval",
"settings_slotrules_save": "Save slot rules",
@@ -357,9 +357,9 @@
"settings_ai_key_label": "API key",
"settings_ai_key_hint": "The key for the endpoint above. It is stored encrypted and never shown again.",
"settings_ai_key_valid": "Connected — key is valid",
- "settings_ai_terms_disclosure": "Your AI provider’s terms depend on your provider account and its service tier. Some tiers allow the provider to use submitted content to improve its models and to have it reviewed by people; other tiers do not. The service tier belongs to the billing project behind your key and is not visible to this application.",
+ "settings_ai_terms_disclosure": "Your AI provider's terms depend on your provider account and its service tier. Some tiers allow the provider to use submitted content to improve its models and to have it reviewed by people; other tiers do not. The service tier belongs to the billing project behind your key and is not visible to this application.",
"settings_ai_attest_heading": "Before saving a key, confirm:",
- "settings_ai_attest_reviewed": "I have reviewed my AI provider’s terms.",
+ "settings_ai_attest_reviewed": "I have reviewed my AI provider's terms.",
"settings_ai_attest_tier": "The service tier on my account permits my intended use.",
"settings_ai_attest_processing": "I understand that inspection content will be processed by that provider.",
"settings_ai_attest_required": "Confirm all three statements before saving your AI key.",
@@ -370,7 +370,7 @@
"settings_emaildelivery_heading": "Email delivery",
"settings_emaildelivery_own_missing": "Own provider selected but no sender address / {provider} credentials — emails will fail to send.",
"settings_emaildelivery_platform_missing": "No platform email is configured (SENDER_EMAIL / Resend) — emails cannot be sent.",
- "settings_emaildelivery_inspector_note": "Emails use each inspector’s name & email; inspectors without a name fall back to the company.",
+ "settings_emaildelivery_inspector_note": "Emails use each inspector's name & email; inspectors without a name fall back to the company.",
"settings_emaildelivery_mode_platform": "Platform email",
"settings_emaildelivery_mode_own": "My own provider",
"settings_emaildelivery_mode_platform_desc": "Send from the platform mailbox. You can set the display name and reply-to; the address is fixed.",
@@ -454,8 +454,8 @@
"settings_smssecrets_save": "Save {provider} credentials",
"settings_smssecrets_inbound_label": "Inbound webhook URL",
"settings_smssecrets_inbound_placeholder": "Save your company first to see this URL",
- "settings_smssecrets_inbound_note_telnyx": "Paste this into your Telnyx number’s inbound webhook so STOP/HELP replies sync. Set your Public Key above so we can verify these webhooks.",
- "settings_smssecrets_inbound_note_twilio": "Paste this into your Twilio number’s Messaging webhook so STOP/START replies sync.",
+ "settings_smssecrets_inbound_note_telnyx": "Paste this into your Telnyx number's inbound webhook so STOP/HELP replies sync. Set your Public Key above so we can verify these webhooks.",
+ "settings_smssecrets_inbound_note_twilio": "Paste this into your Twilio number's Messaging webhook so STOP/START replies sync.",
"settings_smssecrets_test_label": "Send test SMS",
"settings_smssecrets_sending": "Sending…",
"settings_smssecrets_send_test": "Send test",
@@ -465,7 +465,7 @@
"settings_smsdelivery_compliance_pending": "Pending",
"settings_smsdelivery_compliance_not_started": "Not started",
"settings_smsdelivery_heading": "SMS delivery",
- "settings_smsdelivery_desc": "Send appointment and report texts by SMS. Clients are texted only after recorded opt-in; agents and other business contacts on a job may receive transactional texts without that client step. STOP replies are honored for everyone. With your own provider you pay the carrier’s per-message rates directly.",
+ "settings_smsdelivery_desc": "Send appointment and report texts by SMS. Clients are texted only after recorded opt-in; agents and other business contacts on a job may receive transactional texts without that client step. STOP replies are honored for everyone. With your own provider you pay the carrier's per-message rates directly.",
"settings_smsdelivery_byo_label": "My own Twilio / Telnyx (BYO)",
"settings_smsdelivery_byo_desc": "Bring your own account. You pay provider rates directly and control your numbers.",
"settings_smsdelivery_shared_label": "Managed — shared number",
@@ -531,7 +531,7 @@
"settings_mcw_resubmitting": "Resubmitting…",
"settings_mcw_fix_resubmit": "Fix & resubmit",
"settings_mcw_managed_carrier": "Managed carrier",
- "settings_mcw_carrier_note": "Which carrier provisions and manages this tenant’s dedicated number.",
+ "settings_mcw_carrier_note": "Which carrier provisions and manages this tenant's dedicated number.",
"settings_mcw_save_carrier": "Save carrier",
"settings_mcw_update_business_info": "Update business information",
"settings_mcw_business_info": "Business information",
diff --git a/messages/en/settings.json b/messages/en/settings.json
index 1467e71b..ca478277 100644
--- a/messages/en/settings.json
+++ b/messages/en/settings.json
@@ -252,7 +252,7 @@
"settings_team_role_inspector_name": "Inspector",
"settings_team_role_inspector_desc": "Conducts inspections; edits and publishes reports.",
"settings_team_role_agent_name": "Agent",
- "settings_team_role_agent_desc": "Not a team member and not a seat. Agents are given access to individual inspections from that inspection’s People section, and read the report through a link that needs no account.",
+ "settings_team_role_agent_desc": "Not a team member and not a seat. Agents are given access to individual inspections from that inspection's People section, and read the report through a link that needs no account.",
"settings_team_cancel_invite": "Cancel invite",
"settings_team_resend_invite": "Resend",
"settings_team_resend_success": "Invitation email sent.",
From 4bebfde423ed540054a7d42a02da870e880ad7b1 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:04:40 -0400
Subject: [PATCH 06/16] fix(copy): use the ellipsis character in place of three
dots (QA sweep COPY-06)
Co-Authored-By: Claude Sonnet 5.5
---
app/components/template/item-comments-panel.test.ts | 4 ++--
messages/en/auth.json | 4 ++--
messages/en/booking.json | 2 +-
messages/en/calendar.json | 4 ++--
messages/en/checkout.json | 4 ++--
messages/en/components.json | 4 ++--
messages/en/editor-2.json | 4 ++--
messages/en/editor-3.json | 2 +-
messages/en/editor-4.json | 6 +++---
messages/en/editor.json | 2 +-
messages/en/library.json | 4 ++--
messages/en/media.json | 4 ++--
messages/en/metrics.json | 2 +-
messages/en/misc.json | 4 ++--
messages/en/public.json | 2 +-
messages/en/reports.json | 12 ++++++------
messages/en/settings-catalog.json | 8 ++++----
messages/en/settings-components.json | 2 +-
messages/en/settings-integrations.json | 4 ++--
messages/en/templates.json | 6 +++---
messages/es-419/auth.json | 4 ++--
messages/es-419/booking.json | 2 +-
messages/es-419/calendar.json | 4 ++--
messages/es-419/checkout.json | 4 ++--
messages/es-419/components.json | 4 ++--
messages/es-419/editor-2.json | 4 ++--
messages/es-419/editor-3.json | 2 +-
messages/es-419/editor-4.json | 6 +++---
messages/es-419/editor.json | 2 +-
messages/es-419/library.json | 4 ++--
messages/es-419/media.json | 4 ++--
messages/es-419/metrics.json | 2 +-
messages/es-419/misc.json | 4 ++--
messages/es-419/public.json | 2 +-
messages/es-419/reports.json | 12 ++++++------
messages/es-419/settings-catalog.json | 8 ++++----
messages/es-419/settings-components.json | 2 +-
messages/es-419/settings-integrations.json | 4 ++--
messages/es-419/templates.json | 6 +++---
39 files changed, 82 insertions(+), 82 deletions(-)
diff --git a/app/components/template/item-comments-panel.test.ts b/app/components/template/item-comments-panel.test.ts
index 9efc9928..572cee1f 100644
--- a/app/components/template/item-comments-panel.test.ts
+++ b/app/components/template/item-comments-panel.test.ts
@@ -43,7 +43,7 @@ describe("ItemCommentsPanel (behavior-preserving swap)", () => {
expect(screen.getByDisplayValue("Shingles lifted")).toBeTruthy();
expect(screen.queryByText("Lifted at ridge.")).toBeNull();
fireEvent.click(screen.getByLabelText("Expand comment"));
- const textarea = screen.getByPlaceholderText("Comment text...") as HTMLTextAreaElement;
+ const textarea = screen.getByPlaceholderText("Comment text…") as HTMLTextAreaElement;
expect(textarea.value).toBe("Lifted at ridge.");
});
@@ -64,7 +64,7 @@ describe("ItemCommentsPanel (behavior-preserving swap)", () => {
// Guard: the CommentTypeahead wiring must not remove the editable textarea.
renderPanel();
fireEvent.click(screen.getByLabelText("Expand comment"));
- const textarea = screen.getByPlaceholderText("Comment text...") as HTMLTextAreaElement;
+ const textarea = screen.getByPlaceholderText("Comment text…") as HTMLTextAreaElement;
expect(textarea.tagName).toBe("TEXTAREA");
expect(textarea.value).toBe("Lifted at ridge.");
});
diff --git a/messages/en/auth.json b/messages/en/auth.json
index 60b615dd..36089f20 100644
--- a/messages/en/auth.json
+++ b/messages/en/auth.json
@@ -108,7 +108,7 @@
"auth_agent_name_placeholder": "Jane Smith",
"auth_agent_invite_password_label": "Create a password",
"auth_agent_password_placeholder": "At least 12 characters",
- "auth_agent_invite_submit_pending": "Setting up your account...",
+ "auth_agent_invite_submit_pending": "Setting up your account…",
"auth_agent_invite_submit": "Accept invitation",
"auth_agent_invite_footer_note": "By accepting you agree to receive notifications when your referrals are inspected. You can unsubscribe at any time.",
"auth_agent_signup_meta_title": "Become a partner agent - OpenInspection",
@@ -126,7 +126,7 @@
"auth_agent_signup_form_subtitle": "Takes about a minute. Already invited? Use the link in your email instead — it pre-fills the right company.",
"auth_agent_signup_email_label": "Work email",
"auth_agent_signup_email_placeholder": "jane@realty.com",
- "auth_agent_signup_submit_pending": "Creating account...",
+ "auth_agent_signup_submit_pending": "Creating account…",
"auth_agent_signup_submit": "Create account",
"auth_agent_signup_have_account": "Already have an account?",
"auth_agent_signup_login_link": "Log in",
diff --git a/messages/en/booking.json b/messages/en/booking.json
index aeb76a03..6b883a39 100644
--- a/messages/en/booking.json
+++ b/messages/en/booking.json
@@ -40,7 +40,7 @@
"booking_prefill_clear": "Not you? Clear",
"booking_agent_on_behalf_heading": "Booking on behalf of a client as {name}",
"booking_agent_on_behalf_body": "Enter your client's contact details below. They will be asked to confirm, and the company will settle the schedule and price.",
- "booking_submitting": "Submitting...",
+ "booking_submitting": "Submitting…",
"booking_powered_by": "Powered by OpenInspection",
"booking_link_privacy_policy": "Privacy Policy",
"booking_link_terms": "Terms",
diff --git a/messages/en/calendar.json b/messages/en/calendar.json
index 7be16faf..0835de46 100644
--- a/messages/en/calendar.json
+++ b/messages/en/calendar.json
@@ -27,7 +27,7 @@
"calendar_all_day": "All day",
"calendar_block_edit_heading": "Edit blocked time",
"calendar_block_time": "Block time",
- "calendar_block_saving": "Saving...",
+ "calendar_block_saving": "Saving…",
"calendar_block_save_changes": "Save changes",
"calendar_block_field_title": "Title",
"calendar_block_title_placeholder": "Personal appointment",
@@ -94,7 +94,7 @@
"find_a_time_inspector": "Inspector",
"find_a_time_anyone": "Anyone available",
"find_a_time_minutes": "{count} min",
- "find_a_time_loading": "Checking availability...",
+ "find_a_time_loading": "Checking availability…",
"find_a_time_none": "No window that long is free on this day.",
"find_a_time_failed": "Availability could not be checked. Try again.",
"find_a_time_free_count": "{count} free",
diff --git a/messages/en/checkout.json b/messages/en/checkout.json
index 8efb495a..60311006 100644
--- a/messages/en/checkout.json
+++ b/messages/en/checkout.json
@@ -23,7 +23,7 @@
"checkout_sign_thankyou": "Thank you, {signerName}.",
"checkout_sign_draw_prompt": "Draw your signature below:",
"checkout_sign_canvas_aria": "Signature pad — draw your signature here",
- "checkout_sign_submit_pending": "Signing...",
+ "checkout_sign_submit_pending": "Signing…",
"checkout_sign_submit": "Sign agreement",
"checkout_pay_step_label": "Step 2 · Payment",
"checkout_pay_none_required": "No payment is required for this inspection.",
@@ -90,7 +90,7 @@
"sms_optin_intro_2": " by text message.",
"sms_optin_privacy_link": "Privacy Policy",
"sms_optin_terms_link": "Terms of Service",
- "sms_optin_submit_pending": "Confirming...",
+ "sms_optin_submit_pending": "Confirming…",
"sms_optin_submit": "Yes, text me updates",
"sms_optin_footer_disclosure": "Message frequency varies by your inspection activity. Message & data rates may apply. Reply STOP to opt out, HELP for help.",
"repair_request_meta_title": "Repair Request - OpenInspection",
diff --git a/messages/en/components.json b/messages/en/components.json
index 291a9520..40e0a4c7 100644
--- a/messages/en/components.json
+++ b/messages/en/components.json
@@ -21,9 +21,9 @@
"modal_invite_error_failed": "Failed",
"modal_invite_role_desc_manager": "Full access to inspections, templates, and team management.",
"modal_invite_role_desc_inspector": "Create and edit inspections they're assigned to.",
- "form_field_select_placeholder": "Select...",
+ "form_field_select_placeholder": "Select…",
"form_field_photo_hint": "Photo capture is available in the inspection editor",
- "form_rich_notes_placeholder": "Notes...",
+ "form_rich_notes_placeholder": "Notes…",
"email_preview_label": "Preview",
"email_preview_updating": "Updating…",
"email_preview_sample": "Sample data",
diff --git a/messages/en/editor-2.json b/messages/en/editor-2.json
index 59fa9775..c4bb42ae 100644
--- a/messages/en/editor-2.json
+++ b/messages/en/editor-2.json
@@ -21,10 +21,10 @@
"editor_defect_deadline_label": "Deadline",
"editor_defect_timeframe_label": "Timeframe",
"editor_header_property_fallback": "Inspection",
- "editor_header_save_saving": "Saving...",
+ "editor_header_save_saving": "Saving…",
"editor_header_save_saved": "Saved",
"editor_header_save_error": "Error",
- "editor_header_search_placeholder": "Search report...",
+ "editor_header_search_placeholder": "Search report…",
"editor_header_version_history": "Version history",
"editor_header_theme_label": "Theme: {scheme}",
"editor_header_theme_field_suffix": " (high-contrast outdoor)",
diff --git a/messages/en/editor-3.json b/messages/en/editor-3.json
index 645b863f..852362b9 100644
--- a/messages/en/editor-3.json
+++ b/messages/en/editor-3.json
@@ -1,7 +1,7 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"editor_sectionpicker_title": "Jump to section",
- "editor_sectionpicker_placeholder": "Jump to section...",
+ "editor_sectionpicker_placeholder": "Jump to section…",
"editor_sectionpicker_item_count": "{count} items",
"editor_sectionpicker_no_match": "No sections match",
"editor_siderail_close_panel": "Close panel",
diff --git a/messages/en/editor-4.json b/messages/en/editor-4.json
index 608d82b9..677e17bf 100644
--- a/messages/en/editor-4.json
+++ b/messages/en/editor-4.json
@@ -67,18 +67,18 @@
"editor_collab_minutes_ago": "{min} minute{s} ago",
"editor_collab_hours_ago": "{hr} hour{s} ago",
"editor_collab_days_ago": "{day} day{s} ago",
- "editor_collab_saving": "Saving...",
+ "editor_collab_saving": "Saving…",
"editor_collab_save_version_now": "Save version now",
"editor_collab_version_history": "Version history",
"editor_collab_history_desc": "Saved versions of this report. Restore replaces the current content with the selected version.",
- "editor_collab_loading_versions": "Loading versions...",
+ "editor_collab_loading_versions": "Loading versions…",
"editor_collab_load_failed": "Could not load version history.",
"editor_collab_try_again": "Try again",
"editor_collab_no_versions": "No saved versions yet",
"editor_collab_compare": "Compare",
"editor_collab_restore": "Restore",
"editor_collab_restore_confirm_title": "Restore this version?",
- "editor_collab_restoring": "Restoring...",
+ "editor_collab_restoring": "Restoring…",
"editor_collab_restore_version": "Restore version",
"editor_collab_restore_confirm_body": "Restoring replaces the current report content with the selected version. The current state is saved as a new version first, so this is reversible.",
"editor_collab_restore_failed": "Restore failed",
diff --git a/messages/en/editor.json b/messages/en/editor.json
index 65e1cb6f..49264925 100644
--- a/messages/en/editor.json
+++ b/messages/en/editor.json
@@ -78,7 +78,7 @@
"editor_comment_library_sev_defect": "Defect",
"editor_comment_library_sev_my_snippets": "My Snippets",
"editor_comment_library_sev_aria": "Comment severity filter",
- "editor_comment_library_search_placeholder": "Search comments...",
+ "editor_comment_library_search_placeholder": "Search comments…",
"editor_comment_library_count": "{count} comments",
"editor_comment_list_empty": "No comments match the current filter.",
"editor_typeahead_kind_defect": "Defect",
diff --git a/messages/en/library.json b/messages/en/library.json
index db113049..1df93cf6 100644
--- a/messages/en/library.json
+++ b/messages/en/library.json
@@ -215,7 +215,7 @@
"dashboard_filters_date_to": "Date to",
"dashboard_filters_agent_id": "Agent ID",
"dashboard_skeleton_loading": "Loading inspections…",
- "dashboard_toolbar_search": "Search...",
+ "dashboard_toolbar_search": "Search…",
"dashboard_toolbar_filters": "Filters",
"dashboard_toolbar_columns": "Columns",
"notifications_load_failed": "Notifications could not be loaded. This list may be incomplete — reload before assuming there is nothing here.",
@@ -241,7 +241,7 @@
"marketplace_update_consequence": "{count} comments will be deleted, struck through above.",
"marketplace_update_submit_keep": "Update and keep my comments",
"marketplace_update_submit_replace": "Replace {count} comments",
- "marketplace_update_submitting": "Updating...",
+ "marketplace_update_submitting": "Updating…",
"marketplace_update_cancel": "Cancel",
"marketplace_update_clean_title": "Nothing you wrote is at stake",
"marketplace_update_clean_desc": "All {total} comments from this library are still exactly as the publisher shipped them. Updating to {semver} replaces them.",
diff --git a/messages/en/media.json b/messages/en/media.json
index dad02511..3212c3ad 100644
--- a/messages/en/media.json
+++ b/messages/en/media.json
@@ -7,7 +7,7 @@
"media_annotate_tool_free": "Draw",
"media_annotate_tool_text": "Label",
"media_annotate_tool_measure": "Measure",
- "media_annotate_caption_placeholder": "Add a caption...",
+ "media_annotate_caption_placeholder": "Add a caption…",
"media_annotate_title": "Photo Studio",
"media_annotate_photo_of": "Photo {index} of {total}",
"media_annotate_arrow_hint": "Drag to draw the arrow",
@@ -25,7 +25,7 @@
"media_annotate_cover_set": "Set as cover",
"media_annotate_close_aria": "Close photo studio",
"media_annotate_undo_title": "Undo last annotation",
- "media_annotate_label_placeholder": "Enter label...",
+ "media_annotate_label_placeholder": "Enter label…",
"media_annotate_empty_title": "No photo selected",
"media_annotate_empty_subtitle": "Take or upload a photo to annotate",
"media_annotate_loading_title": "Loading photo…",
diff --git a/messages/en/metrics.json b/messages/en/metrics.json
index c7827a86..b687040f 100644
--- a/messages/en/metrics.json
+++ b/messages/en/metrics.json
@@ -4,7 +4,7 @@
"metrics_heading": "Metrics",
"metrics_meta_singular": "inspection",
"metrics_meta_plural": "inspections",
- "metrics_loading": "Loading...",
+ "metrics_loading": "Loading…",
"metrics_kpi_revenue": "Total Revenue",
"metrics_kpi_inspections": "Total Inspections",
"metrics_kpi_aov": "Avg Order Value",
diff --git a/messages/en/misc.json b/messages/en/misc.json
index 3a5039d2..cd2b911c 100644
--- a/messages/en/misc.json
+++ b/messages/en/misc.json
@@ -56,7 +56,7 @@
"command_palette_action_hint_create": "create",
"command_palette_action_copy_booking_link": "Copy my booking link",
"command_palette_recent_fallback": "Inspection #{id}",
- "command_palette_search_placeholder": "Type a command or search...",
+ "command_palette_search_placeholder": "Type a command or search…",
"command_palette_prefix_actions": "actions",
"command_palette_prefix_people": "people",
"command_palette_no_results": "No results found",
@@ -162,7 +162,7 @@
"rating_editor_add_level": "+ Add level",
"rating_editor_default_toggle": "Use as the default rating system for new templates",
"template_combobox_placeholder": "--- Select template ---",
- "template_combobox_search_placeholder": "Search templates...",
+ "template_combobox_search_placeholder": "Search templates…",
"template_combobox_no_match": "No templates match your search",
"template_combobox_no_templates": "No templates found",
"template_combobox_clear": "--- Clear selection ---",
diff --git a/messages/en/public.json b/messages/en/public.json
index e2661592..ac6f502e 100644
--- a/messages/en/public.json
+++ b/messages/en/public.json
@@ -119,7 +119,7 @@
"agent_portal_recommendations_item_other": "items",
"agent_portal_repair_empty": "No repair items in your referred reports yet.",
"agent_portal_repair_share_action": "Share with client",
- "agent_portal_repair_share_pending": "Preparing link...",
+ "agent_portal_repair_share_pending": "Preparing link…",
"agent_portal_settings_meta_title": "Agent Settings - OpenInspection",
"agent_portal_settings_title": "Settings",
"agent_portal_settings_subtitle": "Your public referral slug and the emails we send you.",
diff --git a/messages/en/reports.json b/messages/en/reports.json
index 07afc778..3f6401ae 100644
--- a/messages/en/reports.json
+++ b/messages/en/reports.json
@@ -54,7 +54,7 @@
"report_verify_offline_intro_before": "Drop your ",
"report_verify_offline_intro_after": " below. All cryptographic verification runs in your browser using the Web Crypto API — this page does not transmit the zip back to our server.",
"report_verify_offline_dropzone": "Drop evidence.zip here, or click to select",
- "report_verify_offline_verifying": "Verifying...",
+ "report_verify_offline_verifying": "Verifying…",
"report_verify_offline_footer": "To verify offline without trusting this server, View Source on this page, save it locally along with evidence.zip, and open the local HTML file in a fresh browser session. All cryptography uses the browser's built-in Web Crypto API; no external network requests happen during verification.",
"report_verify_offline_error_not_zip": "Please drop an evidence.zip file.",
"report_verify_offline_error_missing_files": "Missing audit-trail.json or public-key.pem in zip.",
@@ -130,19 +130,19 @@
"portal_agreement_verify_link": "Verify this signature",
"portal_agreement_verify_hint": "Use this link anytime to confirm this signature hasn't been altered.",
"portal_agreement_draw_prompt": "Draw your signature below:",
- "portal_agreement_signing_pending": "Signing...",
+ "portal_agreement_signing_pending": "Signing…",
"portal_agreement_sign_submit": "Sign agreement",
"portal_agreement_cancel_decline": "Cancel decline",
"portal_agreement_decline_toggle": "Decline this agreement",
"portal_agreement_reason_label": "Reason (optional)",
- "portal_agreement_reason_placeholder": "Let the inspector know why...",
- "portal_agreement_declining_pending": "Submitting...",
+ "portal_agreement_reason_placeholder": "Let the inspector know why…",
+ "portal_agreement_declining_pending": "Submitting…",
"portal_agreement_decline_submit": "Decline Agreement",
"portal_messages_inspection_label": "Inspection: {address}",
"portal_messages_empty_title": "No messages yet",
"portal_messages_empty_body": "Send the first one below.",
- "portal_messages_compose_placeholder": "Type your message...",
- "portal_messages_send_pending": "Sending...",
+ "portal_messages_compose_placeholder": "Type your message…",
+ "portal_messages_send_pending": "Sending…",
"portal_messages_send": "Send",
"portal_progress_notfound_title": "Inspection Not Found",
"portal_progress_notfound_body": "This observation link is invalid or expired.",
diff --git a/messages/en/settings-catalog.json b/messages/en/settings-catalog.json
index a77f1c65..7af77d01 100644
--- a/messages/en/settings-catalog.json
+++ b/messages/en/settings-catalog.json
@@ -1,6 +1,6 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
- "settings_common_saving": "Saving...",
+ "settings_common_saving": "Saving…",
"settings_services_meta_title": "Services & Catalog - Settings - OpenInspection",
"settings_services_crumb": "Services & catalog",
"settings_services_error_create_failed": "Failed to create service.",
@@ -14,7 +14,7 @@
"settings_services_description_placeholder": "Optional details",
"settings_services_price_label": "Price",
"settings_inspection_meta_title": "Inspection Workflow Settings - OpenInspection",
- "settings_inspection_loading": "Loading...",
+ "settings_inspection_loading": "Loading…",
"settings_inspection_crumb": "Inspection Workflow",
"settings_inspection_intro": "Defaults that apply to every inspector at your company.",
"settings_inspection_clone_heading": "Clone last (R key) default",
@@ -62,9 +62,9 @@
"settings_inspection_types_name_label": "Name",
"settings_inspection_types_name_placeholder": "e.g., Medical Office",
"settings_inspection_types_based_on_label": "Based on",
- "settings_inspection_types_based_on_placeholder": "Select a platform type...",
+ "settings_inspection_types_based_on_placeholder": "Select a platform type…",
"settings_inspection_types_description_label": "Description",
- "settings_inspection_types_description_placeholder": "Optional details...",
+ "settings_inspection_types_description_placeholder": "Optional details…",
"settings_event_types_meta_title": "Event Types - OpenInspection",
"settings_event_types_crumb": "Event types",
"settings_event_types_intro": "Define ancillary inspection events that can be attached to an inspection.",
diff --git a/messages/en/settings-components.json b/messages/en/settings-components.json
index 797110c9..29fe1ff0 100644
--- a/messages/en/settings-components.json
+++ b/messages/en/settings-components.json
@@ -57,7 +57,7 @@
"settings_holiday_custom_date": "Date",
"settings_holiday_custom_name": "Name",
"settings_holiday_custom_name_placeholder": "Company picnic",
- "settings_holiday_save_pending": "Saving...",
+ "settings_holiday_save_pending": "Saving…",
"settings_holiday_save": "Save holiday settings",
"settings_holiday_saved": "Saved.",
"settings_holiday_save_failed": "Save failed. Please try again.",
diff --git a/messages/en/settings-integrations.json b/messages/en/settings-integrations.json
index 9f2e3cbf..17a4144a 100644
--- a/messages/en/settings-integrations.json
+++ b/messages/en/settings-integrations.json
@@ -172,7 +172,7 @@
"settings_qbo_last_synced": "Last synced: {time}",
"settings_qbo_status_active": "Active",
"settings_qbo_status_paused": "Paused",
- "settings_qbo_syncing": "Syncing...",
+ "settings_qbo_syncing": "Syncing…",
"settings_qbo_sync_now": "Sync Now",
"settings_qbo_pause_sync": "Pause Sync",
"settings_qbo_resume_sync": "Resume Sync",
@@ -254,7 +254,7 @@
"settings_compliance_retention_heading": "Agreement retention window",
"settings_compliance_retention_desc": "How long signed agreements and signatures are kept before they are permanently destroyed.",
"settings_compliance_years_label": "Years",
- "settings_compliance_saving": "Saving...",
+ "settings_compliance_saving": "Saving…",
"settings_compliance_save_failed": "Save failed. Please try again.",
"settings_compliance_retention_note": "Retained as a legal obligation under GDPR Art. 17(3)(e) (defence of legal claims). The default of 6 years matches the UK simple-contract limitation period. Note: deleted rows remain restorable from D1 Time-Travel backups for up to 30 days.",
"settings_compliance_pdf_heading": "Report PDF retention window",
diff --git a/messages/en/templates.json b/messages/en/templates.json
index a99c876e..74a4c760 100644
--- a/messages/en/templates.json
+++ b/messages/en/templates.json
@@ -10,7 +10,7 @@
"templates_list_meta_updates": "{count} with updates available",
"templates_action_import": "Import templates",
"templates_action_new_template": "+ New Template",
- "templates_search_placeholder": "Search templates...",
+ "templates_search_placeholder": "Search templates…",
"templates_sort_date": "Last modified",
"templates_sort_usage": "Most used",
"templates_view_cards": "Cards",
@@ -57,7 +57,7 @@
"templates_comments_delete_aria": "Delete comment",
"templates_comments_abbr_placeholder": "abbr",
"templates_comments_abbr_title": "Shortcode — type this in the report to fill this comment",
- "templates_comments_text_placeholder": "Comment text...",
+ "templates_comments_text_placeholder": "Comment text…",
"templates_comments_expand_aria": "Expand comment",
"templates_comments_collapse_aria": "Collapse comment",
"templates_comments_severity_aria": "Category",
@@ -104,7 +104,7 @@
"templates_edit_exit_preview": "Exit Preview",
"templates_edit_preview": "Preview",
"templates_edit_rating_system": "Rating System",
- "templates_edit_saving": "Saving...",
+ "templates_edit_saving": "Saving…",
"templates_edit_saved": "Saved!",
"templates_edit_empty_add_section": "Add a section to get started",
"templates_edit_tab_properties": "Properties",
diff --git a/messages/es-419/auth.json b/messages/es-419/auth.json
index bfac3002..32e522ff 100644
--- a/messages/es-419/auth.json
+++ b/messages/es-419/auth.json
@@ -106,7 +106,7 @@
"auth_agent_name_placeholder": "Ana Pérez",
"auth_agent_invite_password_label": "Cree una contraseña",
"auth_agent_password_placeholder": "Al menos 12 caracteres",
- "auth_agent_invite_submit_pending": "Configurando su cuenta...",
+ "auth_agent_invite_submit_pending": "Configurando su cuenta…",
"auth_agent_invite_submit": "Aceptar la invitación",
"auth_agent_invite_footer_note": "Al aceptar, usted acepta recibir notificaciones cuando se inspeccionen sus referencias. Puede darse de baja en cualquier momento.",
"auth_agent_signup_meta_title": "Conviértase en agente asociado - OpenInspection",
@@ -124,7 +124,7 @@
"auth_agent_signup_form_subtitle": "Toma alrededor de un minuto. ¿Ya recibió una invitación? Use el enlace de su correo electrónico: completa automáticamente la cuenta correcta.",
"auth_agent_signup_email_label": "Correo electrónico del trabajo",
"auth_agent_signup_email_placeholder": "ana@inmobiliaria.com",
- "auth_agent_signup_submit_pending": "Creando la cuenta...",
+ "auth_agent_signup_submit_pending": "Creando la cuenta…",
"auth_agent_signup_submit": "Crear cuenta",
"auth_agent_signup_have_account": "¿Ya tiene una cuenta?",
"auth_agent_signup_login_link": "Iniciar sesión",
diff --git a/messages/es-419/booking.json b/messages/es-419/booking.json
index 76be78a8..da81caf3 100644
--- a/messages/es-419/booking.json
+++ b/messages/es-419/booking.json
@@ -40,7 +40,7 @@
"booking_prefill_clear": "¿No es usted? Borrar",
"booking_agent_on_behalf_heading": "Reservando en nombre de un cliente como {name}",
"booking_agent_on_behalf_body": "Ingrese abajo los datos de contacto de su cliente. Se le pedirá que confirme, y la empresa fijará la fecha y el precio.",
- "booking_submitting": "Enviando...",
+ "booking_submitting": "Enviando…",
"booking_powered_by": "Con la tecnología de OpenInspection",
"booking_link_privacy_policy": "Política de privacidad",
"booking_link_terms": "Términos",
diff --git a/messages/es-419/calendar.json b/messages/es-419/calendar.json
index b9b7e102..9d25b345 100644
--- a/messages/es-419/calendar.json
+++ b/messages/es-419/calendar.json
@@ -27,7 +27,7 @@
"calendar_all_day": "Todo el día",
"calendar_block_edit_heading": "Editar el tiempo bloqueado",
"calendar_block_time": "Bloquear tiempo",
- "calendar_block_saving": "Guardando...",
+ "calendar_block_saving": "Guardando…",
"calendar_block_save_changes": "Guardar cambios",
"calendar_block_field_title": "Título",
"calendar_block_title_placeholder": "Cita personal",
@@ -94,7 +94,7 @@
"find_a_time_inspector": "Inspector",
"find_a_time_anyone": "Cualquiera disponible",
"find_a_time_minutes": "{count} min",
- "find_a_time_loading": "Comprobando disponibilidad...",
+ "find_a_time_loading": "Comprobando disponibilidad…",
"find_a_time_none": "No hay ninguna ventana libre tan larga ese día.",
"find_a_time_failed": "No se pudo comprobar la disponibilidad. Inténtalo de nuevo.",
"find_a_time_free_count": "{count} libres",
diff --git a/messages/es-419/checkout.json b/messages/es-419/checkout.json
index da14d19b..798ca87f 100644
--- a/messages/es-419/checkout.json
+++ b/messages/es-419/checkout.json
@@ -23,7 +23,7 @@
"checkout_sign_thankyou": "Gracias, {signerName}.",
"checkout_sign_draw_prompt": "Dibuje su firma abajo:",
"checkout_sign_canvas_aria": "Panel de firma: dibuje su firma aquí",
- "checkout_sign_submit_pending": "Firmando...",
+ "checkout_sign_submit_pending": "Firmando…",
"checkout_sign_submit": "Firmar el acuerdo",
"checkout_pay_step_label": "Paso 2 · Pago",
"checkout_pay_none_required": "No se requiere ningún pago para esta inspección.",
@@ -90,7 +90,7 @@
"sms_optin_intro_2": " por mensaje de texto.",
"sms_optin_privacy_link": "Política de privacidad",
"sms_optin_terms_link": "Términos del servicio",
- "sms_optin_submit_pending": "Confirmando...",
+ "sms_optin_submit_pending": "Confirmando…",
"sms_optin_submit": "Sí, envíenme novedades por mensaje de texto",
"sms_optin_footer_disclosure": "La frecuencia de los mensajes varía según su actividad de inspección. Pueden aplicarse tarifas de mensajes y datos. Responda STOP para darse de baja y HELP para obtener ayuda.",
"repair_request_meta_title": "Solicitud de reparación - OpenInspection",
diff --git a/messages/es-419/components.json b/messages/es-419/components.json
index b1e12582..da1505b7 100644
--- a/messages/es-419/components.json
+++ b/messages/es-419/components.json
@@ -21,9 +21,9 @@
"modal_invite_error_failed": "Fallido",
"modal_invite_role_desc_manager": "Acceso completo a las inspecciones, las plantillas y la gestión del equipo.",
"modal_invite_role_desc_inspector": "Crear y editar las inspecciones que se le asignen.",
- "form_field_select_placeholder": "Seleccione...",
+ "form_field_select_placeholder": "Seleccione…",
"form_field_photo_hint": "La captura de fotos está disponible en el editor de inspecciones",
- "form_rich_notes_placeholder": "Notas...",
+ "form_rich_notes_placeholder": "Notas…",
"email_preview_label": "Vista previa",
"email_preview_updating": "Actualizando…",
"email_preview_sample": "Datos de ejemplo",
diff --git a/messages/es-419/editor-2.json b/messages/es-419/editor-2.json
index 4cc53da6..44cc3c65 100644
--- a/messages/es-419/editor-2.json
+++ b/messages/es-419/editor-2.json
@@ -21,10 +21,10 @@
"editor_defect_deadline_label": "Fecha límite",
"editor_defect_timeframe_label": "Plazo",
"editor_header_property_fallback": "Inspección",
- "editor_header_save_saving": "Guardando...",
+ "editor_header_save_saving": "Guardando…",
"editor_header_save_saved": "Guardado",
"editor_header_save_error": "Error",
- "editor_header_search_placeholder": "Buscar en el informe...",
+ "editor_header_search_placeholder": "Buscar en el informe…",
"editor_header_version_history": "Historial de versiones",
"editor_header_theme_label": "Tema: {scheme}",
"editor_header_theme_field_suffix": " (exteriores de alto contraste)",
diff --git a/messages/es-419/editor-3.json b/messages/es-419/editor-3.json
index db98652a..230c78e7 100644
--- a/messages/es-419/editor-3.json
+++ b/messages/es-419/editor-3.json
@@ -1,7 +1,7 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
"editor_sectionpicker_title": "Ir a la sección",
- "editor_sectionpicker_placeholder": "Ir a la sección...",
+ "editor_sectionpicker_placeholder": "Ir a la sección…",
"editor_sectionpicker_item_count": "{count} elementos",
"editor_sectionpicker_no_match": "Ninguna sección coincide",
"editor_siderail_close_panel": "Cerrar el panel",
diff --git a/messages/es-419/editor-4.json b/messages/es-419/editor-4.json
index c1b607b4..4d91d91c 100644
--- a/messages/es-419/editor-4.json
+++ b/messages/es-419/editor-4.json
@@ -67,18 +67,18 @@
"editor_collab_minutes_ago": "hace {min} minuto{s}",
"editor_collab_hours_ago": "hace {hr} hora{s}",
"editor_collab_days_ago": "hace {day} día{s}",
- "editor_collab_saving": "Guardando...",
+ "editor_collab_saving": "Guardando…",
"editor_collab_save_version_now": "Guardar la versión ahora",
"editor_collab_version_history": "Historial de versiones",
"editor_collab_history_desc": "Versiones guardadas de este informe. Restaurar reemplaza el contenido actual con la versión seleccionada.",
- "editor_collab_loading_versions": "Cargando versiones...",
+ "editor_collab_loading_versions": "Cargando versiones…",
"editor_collab_load_failed": "No se pudo cargar el historial de versiones.",
"editor_collab_try_again": "Reintentar",
"editor_collab_no_versions": "Aún no hay versiones guardadas",
"editor_collab_compare": "Comparar",
"editor_collab_restore": "Restaurar",
"editor_collab_restore_confirm_title": "¿Restaurar esta versión?",
- "editor_collab_restoring": "Restaurando...",
+ "editor_collab_restoring": "Restaurando…",
"editor_collab_restore_version": "Restaurar la versión",
"editor_collab_restore_confirm_body": "Restaurar reemplaza el contenido actual del informe con la versión seleccionada. El estado actual se guarda primero como una versión nueva, así que esto es reversible.",
"editor_collab_restore_failed": "Error al restaurar",
diff --git a/messages/es-419/editor.json b/messages/es-419/editor.json
index 06fd4b43..ac894b7f 100644
--- a/messages/es-419/editor.json
+++ b/messages/es-419/editor.json
@@ -78,7 +78,7 @@
"editor_comment_library_sev_defect": "Defecto",
"editor_comment_library_sev_my_snippets": "Mis fragmentos",
"editor_comment_library_sev_aria": "Filtro de gravedad de comentarios",
- "editor_comment_library_search_placeholder": "Buscar comentarios...",
+ "editor_comment_library_search_placeholder": "Buscar comentarios…",
"editor_comment_library_count": "{count} comentarios",
"editor_comment_list_empty": "Ningún comentario coincide con el filtro actual.",
"editor_typeahead_kind_defect": "Defecto",
diff --git a/messages/es-419/library.json b/messages/es-419/library.json
index 67bd7d1c..47c4b65b 100644
--- a/messages/es-419/library.json
+++ b/messages/es-419/library.json
@@ -215,7 +215,7 @@
"dashboard_filters_date_to": "Fecha hasta",
"dashboard_filters_agent_id": "ID del agente",
"dashboard_skeleton_loading": "Cargando inspecciones…",
- "dashboard_toolbar_search": "Buscar...",
+ "dashboard_toolbar_search": "Buscar…",
"dashboard_toolbar_filters": "Filtros",
"dashboard_toolbar_columns": "Columnas",
"notifications_load_failed": "No se pudieron cargar las notificaciones. Esta lista puede estar incompleta — vuelva a cargar antes de suponer que no hay nada aquí.",
@@ -241,7 +241,7 @@
"marketplace_update_consequence": "Se eliminarán {count} comentarios, tachados arriba.",
"marketplace_update_submit_keep": "Actualizar y conservar mis comentarios",
"marketplace_update_submit_replace": "Reemplazar {count} comentarios",
- "marketplace_update_submitting": "Actualizando...",
+ "marketplace_update_submitting": "Actualizando…",
"marketplace_update_cancel": "Cancelar",
"marketplace_update_clean_title": "Nada de lo que usted escribió está en juego",
"marketplace_update_clean_desc": "Los {total} comentarios de esta biblioteca siguen exactamente como los publicó el editor. Actualizar a {semver} los reemplaza.",
diff --git a/messages/es-419/media.json b/messages/es-419/media.json
index edbc25c7..d06cb3f9 100644
--- a/messages/es-419/media.json
+++ b/messages/es-419/media.json
@@ -7,7 +7,7 @@
"media_annotate_tool_free": "Dibujar",
"media_annotate_tool_text": "Etiqueta",
"media_annotate_tool_measure": "Medir",
- "media_annotate_caption_placeholder": "Agregue una leyenda...",
+ "media_annotate_caption_placeholder": "Agregue una leyenda…",
"media_annotate_title": "Estudio de fotos",
"media_annotate_photo_of": "Foto {index} de {total}",
"media_annotate_arrow_hint": "Arrastre para dibujar la flecha",
@@ -25,7 +25,7 @@
"media_annotate_cover_set": "Establecer como portada",
"media_annotate_close_aria": "Cerrar el estudio de fotos",
"media_annotate_undo_title": "Deshacer la última anotación",
- "media_annotate_label_placeholder": "Ingrese la etiqueta...",
+ "media_annotate_label_placeholder": "Ingrese la etiqueta…",
"media_annotate_empty_title": "Ninguna foto seleccionada",
"media_annotate_empty_subtitle": "Tome o suba una foto para anotarla",
"media_annotate_loading_title": "Cargando la foto…",
diff --git a/messages/es-419/metrics.json b/messages/es-419/metrics.json
index 14fe1988..a2583858 100644
--- a/messages/es-419/metrics.json
+++ b/messages/es-419/metrics.json
@@ -4,7 +4,7 @@
"metrics_heading": "Métricas",
"metrics_meta_singular": "inspección",
"metrics_meta_plural": "inspecciones",
- "metrics_loading": "Cargando...",
+ "metrics_loading": "Cargando…",
"metrics_kpi_revenue": "Ingresos totales",
"metrics_kpi_inspections": "Inspecciones totales",
"metrics_kpi_aov": "Valor promedio por inspección",
diff --git a/messages/es-419/misc.json b/messages/es-419/misc.json
index 494bc836..d25c837c 100644
--- a/messages/es-419/misc.json
+++ b/messages/es-419/misc.json
@@ -56,7 +56,7 @@
"command_palette_action_hint_create": "crear",
"command_palette_action_copy_booking_link": "Copiar mi enlace de reservas",
"command_palette_recent_fallback": "Inspección n.º {id}",
- "command_palette_search_placeholder": "Escriba un comando o busque...",
+ "command_palette_search_placeholder": "Escriba un comando o busque…",
"command_palette_prefix_actions": "acciones",
"command_palette_prefix_people": "personas",
"command_palette_no_results": "No se encontraron resultados",
@@ -162,7 +162,7 @@
"rating_editor_add_level": "+ Agregar nivel",
"rating_editor_default_toggle": "Usar como el sistema de calificación predeterminado para las plantillas nuevas",
"template_combobox_placeholder": "--- Seleccione una plantilla ---",
- "template_combobox_search_placeholder": "Buscar plantillas...",
+ "template_combobox_search_placeholder": "Buscar plantillas…",
"template_combobox_no_match": "Ninguna plantilla coincide con su búsqueda",
"template_combobox_no_templates": "No se encontraron plantillas",
"template_combobox_clear": "--- Borrar la selección ---",
diff --git a/messages/es-419/public.json b/messages/es-419/public.json
index 6149996e..8cc8b7b6 100644
--- a/messages/es-419/public.json
+++ b/messages/es-419/public.json
@@ -119,7 +119,7 @@
"agent_portal_recommendations_item_other": "elementos",
"agent_portal_repair_empty": "Aún no hay elementos de reparación en los informes que ha referido.",
"agent_portal_repair_share_action": "Compartir con el cliente",
- "agent_portal_repair_share_pending": "Preparando el enlace...",
+ "agent_portal_repair_share_pending": "Preparando el enlace…",
"agent_portal_settings_meta_title": "Configuración del agente - OpenInspection",
"agent_portal_settings_title": "Configuración",
"agent_portal_settings_subtitle": "Su identificador público de referencia y los correos electrónicos que le enviamos.",
diff --git a/messages/es-419/reports.json b/messages/es-419/reports.json
index 099bb0b7..3263f662 100644
--- a/messages/es-419/reports.json
+++ b/messages/es-419/reports.json
@@ -54,7 +54,7 @@
"report_verify_offline_intro_before": "Suelte su ",
"report_verify_offline_intro_after": " abajo. Toda la verificación criptográfica se ejecuta en su navegador con la API Web Crypto — esta página no transmite el zip de vuelta a nuestro servidor.",
"report_verify_offline_dropzone": "Suelte evidence.zip aquí, o haga clic para seleccionarlo",
- "report_verify_offline_verifying": "Verificando...",
+ "report_verify_offline_verifying": "Verificando…",
"report_verify_offline_footer": "Para verificar sin conexión sin confiar en este servidor, use Ver código fuente en esta página, guárdela localmente junto con evidence.zip y abra el archivo HTML local en una sesión nueva del navegador. Toda la criptografía usa la API Web Crypto integrada del navegador; no se realizan solicitudes de red externas durante la verificación.",
"report_verify_offline_error_not_zip": "Suelte un archivo evidence.zip.",
"report_verify_offline_error_missing_files": "Falta audit-trail.json o public-key.pem en el zip.",
@@ -130,19 +130,19 @@
"portal_agreement_verify_link": "Verificar esta firma",
"portal_agreement_verify_hint": "Use este enlace en cualquier momento para confirmar que esta firma no ha sido alterada.",
"portal_agreement_draw_prompt": "Dibuje su firma abajo:",
- "portal_agreement_signing_pending": "Firmando...",
+ "portal_agreement_signing_pending": "Firmando…",
"portal_agreement_sign_submit": "Firmar el acuerdo",
"portal_agreement_cancel_decline": "Cancelar el rechazo",
"portal_agreement_decline_toggle": "Rechazar este acuerdo",
"portal_agreement_reason_label": "Motivo (opcional)",
- "portal_agreement_reason_placeholder": "Explique al inspector el motivo...",
- "portal_agreement_declining_pending": "Enviando...",
+ "portal_agreement_reason_placeholder": "Explique al inspector el motivo…",
+ "portal_agreement_declining_pending": "Enviando…",
"portal_agreement_decline_submit": "Rechazar el acuerdo",
"portal_messages_inspection_label": "Inspección: {address}",
"portal_messages_empty_title": "Aún no hay mensajes",
"portal_messages_empty_body": "Envíe el primero abajo.",
- "portal_messages_compose_placeholder": "Escriba su mensaje...",
- "portal_messages_send_pending": "Enviando...",
+ "portal_messages_compose_placeholder": "Escriba su mensaje…",
+ "portal_messages_send_pending": "Enviando…",
"portal_messages_send": "Enviar",
"portal_progress_notfound_title": "Inspección no encontrada",
"portal_progress_notfound_body": "Este enlace de observación no es válido o ha vencido.",
diff --git a/messages/es-419/settings-catalog.json b/messages/es-419/settings-catalog.json
index f195e3f4..8a89d6e8 100644
--- a/messages/es-419/settings-catalog.json
+++ b/messages/es-419/settings-catalog.json
@@ -1,6 +1,6 @@
{
"$schema": "https://inlang.com/schema/inlang-message-format",
- "settings_common_saving": "Guardando...",
+ "settings_common_saving": "Guardando…",
"settings_services_meta_title": "Servicios y catálogo - Configuración - OpenInspection",
"settings_services_crumb": "Servicios y catálogo",
"settings_services_error_create_failed": "No se pudo crear el servicio.",
@@ -14,7 +14,7 @@
"settings_services_description_placeholder": "Detalles opcionales",
"settings_services_price_label": "Precio",
"settings_inspection_meta_title": "Configuración del flujo de trabajo de inspección - OpenInspection",
- "settings_inspection_loading": "Cargando...",
+ "settings_inspection_loading": "Cargando…",
"settings_inspection_crumb": "Flujo de trabajo de inspección",
"settings_inspection_intro": "Valores predeterminados que se aplican a todos los inspectores de esta empresa.",
"settings_inspection_clone_heading": "Valor predeterminado de Clonar último (tecla R)",
@@ -62,9 +62,9 @@
"settings_inspection_types_name_label": "Nombre",
"settings_inspection_types_name_placeholder": "por ejemplo, Consultorio médico",
"settings_inspection_types_based_on_label": "Basado en",
- "settings_inspection_types_based_on_placeholder": "Seleccione un tipo de la plataforma...",
+ "settings_inspection_types_based_on_placeholder": "Seleccione un tipo de la plataforma…",
"settings_inspection_types_description_label": "Descripción",
- "settings_inspection_types_description_placeholder": "Detalles opcionales...",
+ "settings_inspection_types_description_placeholder": "Detalles opcionales…",
"settings_event_types_meta_title": "Tipos de evento - OpenInspection",
"settings_event_types_crumb": "Tipos de evento",
"settings_event_types_intro": "Defina los eventos complementarios de inspección que se pueden adjuntar a una inspección.",
diff --git a/messages/es-419/settings-components.json b/messages/es-419/settings-components.json
index 83a70324..1b1c0458 100644
--- a/messages/es-419/settings-components.json
+++ b/messages/es-419/settings-components.json
@@ -57,7 +57,7 @@
"settings_holiday_custom_date": "Fecha",
"settings_holiday_custom_name": "Nombre",
"settings_holiday_custom_name_placeholder": "Picnic de la empresa",
- "settings_holiday_save_pending": "Guardando...",
+ "settings_holiday_save_pending": "Guardando…",
"settings_holiday_save": "Guardar la configuración de feriados",
"settings_holiday_saved": "Guardado.",
"settings_holiday_save_failed": "No se pudo guardar. Inténtelo de nuevo.",
diff --git a/messages/es-419/settings-integrations.json b/messages/es-419/settings-integrations.json
index 78bac113..78124ab6 100644
--- a/messages/es-419/settings-integrations.json
+++ b/messages/es-419/settings-integrations.json
@@ -172,7 +172,7 @@
"settings_qbo_last_synced": "Última sincronización: {time}",
"settings_qbo_status_active": "Activo",
"settings_qbo_status_paused": "Pausado",
- "settings_qbo_syncing": "Sincronizando...",
+ "settings_qbo_syncing": "Sincronizando…",
"settings_qbo_sync_now": "Sincronizar ahora",
"settings_qbo_pause_sync": "Pausar la sincronización",
"settings_qbo_resume_sync": "Reanudar la sincronización",
@@ -254,7 +254,7 @@
"settings_compliance_retention_heading": "Período de retención de los acuerdos",
"settings_compliance_retention_desc": "Cuánto tiempo se conservan los acuerdos firmados y las firmas antes de destruirse de forma permanente.",
"settings_compliance_years_label": "Años",
- "settings_compliance_saving": "Guardando...",
+ "settings_compliance_saving": "Guardando…",
"settings_compliance_save_failed": "No se pudo guardar. Inténtelo de nuevo.",
"settings_compliance_retention_note": "Se conserva como obligación legal según el art. 17(3)(e) del RGPD (defensa de reclamaciones legales). El valor predeterminado de 6 años coincide con el plazo de prescripción de los contratos simples del Reino Unido. Nota: las filas eliminadas siguen siendo restaurables desde las copias de seguridad de D1 Time-Travel hasta por 30 días.",
"settings_compliance_pdf_heading": "Periodo de conservación de los PDF de informes",
diff --git a/messages/es-419/templates.json b/messages/es-419/templates.json
index 4384f3d5..665c4ec2 100644
--- a/messages/es-419/templates.json
+++ b/messages/es-419/templates.json
@@ -10,7 +10,7 @@
"templates_list_meta_updates": "{count} con actualizaciones disponibles",
"templates_action_import": "Importar plantillas",
"templates_action_new_template": "+ Nueva plantilla",
- "templates_search_placeholder": "Buscar plantillas...",
+ "templates_search_placeholder": "Buscar plantillas…",
"templates_sort_date": "Última modificación",
"templates_sort_usage": "Más usadas",
"templates_view_cards": "Tarjetas",
@@ -57,7 +57,7 @@
"templates_comments_delete_aria": "Eliminar comentario",
"templates_comments_abbr_placeholder": "abrev",
"templates_comments_abbr_title": "Código corto — escriba esto en el informe para completar este comentario",
- "templates_comments_text_placeholder": "Texto del comentario...",
+ "templates_comments_text_placeholder": "Texto del comentario…",
"templates_comments_expand_aria": "Expandir comentario",
"templates_comments_collapse_aria": "Contraer comentario",
"templates_comments_severity_aria": "Categoría",
@@ -104,7 +104,7 @@
"templates_edit_exit_preview": "Salir de la vista previa",
"templates_edit_preview": "Vista previa",
"templates_edit_rating_system": "Sistema de calificación",
- "templates_edit_saving": "Guardando...",
+ "templates_edit_saving": "Guardando…",
"templates_edit_saved": "¡Guardado!",
"templates_edit_empty_add_section": "Agregue una sección para comenzar",
"templates_edit_tab_properties": "Propiedades",
From 53fd7674889a56b7e687dee78e030ee68d4ba3ed Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:05:25 -0400
Subject: [PATCH 07/16] fix(copy): generic errors say what failed and what to
do (QA sweep COPY-07)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/checkout.json | 4 ++--
messages/en/contacts.json | 2 +-
messages/en/helpers.json | 2 +-
messages/en/inspections.json | 2 +-
messages/en/reports.json | 4 ++--
messages/en/settings-integrations.json | 2 +-
messages/en/templates.json | 2 +-
messages/es-419/checkout.json | 4 ++--
messages/es-419/contacts.json | 2 +-
messages/es-419/helpers.json | 2 +-
messages/es-419/inspections.json | 2 +-
messages/es-419/reports.json | 4 ++--
messages/es-419/settings-integrations.json | 2 +-
messages/es-419/templates.json | 2 +-
14 files changed, 18 insertions(+), 18 deletions(-)
diff --git a/messages/en/checkout.json b/messages/en/checkout.json
index 60311006..c5f5be29 100644
--- a/messages/en/checkout.json
+++ b/messages/en/checkout.json
@@ -134,8 +134,8 @@
"repair_builder_notpublished_body": "The report must be published before you can build a repair request.",
"repair_builder_forbidden_title": "Feature not available",
"repair_builder_forbidden_body": "The repair request builder is not enabled for this inspection company.",
- "repair_builder_error_title": "Something went wrong",
- "repair_builder_error_body": "Unable to load the repair builder. Please try again.",
+ "repair_builder_error_title": "We could not load the repair builder",
+ "repair_builder_error_body": "Check your connection and refresh the page. If it keeps happening, contact your inspector.",
"agreement_progress_signed": "{signed}/{total} signed",
"agreement_row_untitled": "Untitled",
"agreement_template_status_active": "Active",
diff --git a/messages/en/contacts.json b/messages/en/contacts.json
index c0485427..8bf1b039 100644
--- a/messages/en/contacts.json
+++ b/messages/en/contacts.json
@@ -55,7 +55,7 @@
"contacts_detail_untitled_inspection": "Untitled inspection",
"contacts_error_not_found": "This contact could not be found. It may have been deleted.",
"contacts_error_forbidden": "You do not have permission to view this contact.",
- "contacts_error_generic": "Something went wrong while opening the contact.",
+ "contacts_error_generic": "We could not open this contact. Refresh the page to try again. If it keeps happening, contact support.",
"contacts_label_roles": "Roles",
"contacts_roles_action_add": "Add Role",
"contacts_roles_empty_title": "No role profiles yet",
diff --git a/messages/en/helpers.json b/messages/en/helpers.json
index 1e31cdaf..50294dd1 100644
--- a/messages/en/helpers.json
+++ b/messages/en/helpers.json
@@ -3,7 +3,7 @@
"helper_booking_inspector_first_available": "First available",
"helper_booking_inspector_default": "Inspector",
"helper_booking_submit_success": "Booking request submitted! You will receive a confirmation email shortly.",
- "helper_booking_submit_error": "Something went wrong. Please try again.",
+ "helper_booking_submit_error": "We could not submit your booking. Check your connection and try again. If it keeps failing, contact the inspector directly.",
"helper_booking_network_error": "Network error. Please check your connection.",
"helper_rating_desc_satisfactory": "Item is functioning as intended; no concerns observed.",
"helper_rating_desc_monitor": "Item is functional but shows wear; recommend periodic re-inspection.",
diff --git a/messages/en/inspections.json b/messages/en/inspections.json
index 04a9047a..72e3fd64 100644
--- a/messages/en/inspections.json
+++ b/messages/en/inspections.json
@@ -242,7 +242,7 @@
"inspections_hub_copy_link": "Copy link",
"inspections_hub_eb_not_found": "This inspection could not be found. It may have been deleted.",
"inspections_hub_eb_forbidden": "You do not have permission to view this inspection.",
- "inspections_hub_eb_generic": "Something went wrong while opening the inspection.",
+ "inspections_hub_eb_generic": "We could not open this inspection. Refresh the page to try again. If it keeps happening, contact support.",
"inspections_hub_eb_back": "Back to Dashboard",
"inspections_hub_error_send_report": "Could not send the report. Please try again.",
"inspections_hub_error_send_sms": "Could not send the text. Please try again.",
diff --git a/messages/en/reports.json b/messages/en/reports.json
index 3f6401ae..42db8e14 100644
--- a/messages/en/reports.json
+++ b/messages/en/reports.json
@@ -153,8 +153,8 @@
"portal_repair_gate_not_published_body": "The report must be published before you can build a repair request.",
"portal_repair_gate_forbidden_title": "Feature Not Available",
"portal_repair_gate_forbidden_body": "The repair request builder is not enabled for this inspection company.",
- "portal_repair_gate_error_title": "Something went wrong",
- "portal_repair_gate_error_body": "Unable to load the repair builder. Please try again.",
+ "portal_repair_gate_error_title": "We could not load the repair builder",
+ "portal_repair_gate_error_body": "Check your connection and refresh the page. If it keeps happening, contact your inspector.",
"portal_repair_eyebrow": "Repair Request Builder",
"portal_repair_heading": "Select items to include",
"portal_repair_subtitle": "Check the defects you want to request repair or credit for. Add amounts and notes for each.",
diff --git a/messages/en/settings-integrations.json b/messages/en/settings-integrations.json
index 17a4144a..7f555d59 100644
--- a/messages/en/settings-integrations.json
+++ b/messages/en/settings-integrations.json
@@ -12,7 +12,7 @@
"settings_channel_in_app": "In-app",
"settings_connection_test_failed": "Connection test failed.",
"settings_unknown_action": "Unknown action",
- "settings_error_generic": "An error occurred.",
+ "settings_error_generic": "That did not work. Check your connection and try again.",
"settings_comms_meta_title": "Communication - Settings - OpenInspection",
"settings_comms_intro": "Configure email delivery, templates, and calendar sync.",
"settings_comms_nav_managed": "Managed SMS",
diff --git a/messages/en/templates.json b/messages/en/templates.json
index 74a4c760..a5d0289b 100644
--- a/messages/en/templates.json
+++ b/messages/en/templates.json
@@ -111,7 +111,7 @@
"templates_edit_tab_comments": "Comments",
"templates_edit_error_not_found": "This template could not be found. It may have been deleted.",
"templates_edit_error_forbidden": "You do not have permission to edit this template.",
- "templates_edit_error_generic": "Something went wrong while opening the template editor.",
+ "templates_edit_error_generic": "We could not open the template editor. Refresh the page to try again. If it keeps happening, contact support.",
"templates_edit_error_back": "Back to Templates",
"templates_edit_phone_preview_label": "Phone preview · {width}px"
}
diff --git a/messages/es-419/checkout.json b/messages/es-419/checkout.json
index 798ca87f..b0166bae 100644
--- a/messages/es-419/checkout.json
+++ b/messages/es-419/checkout.json
@@ -134,8 +134,8 @@
"repair_builder_notpublished_body": "El informe debe estar publicado antes de que pueda crear una solicitud de reparación.",
"repair_builder_forbidden_title": "Función no disponible",
"repair_builder_forbidden_body": "El generador de solicitudes de reparación no está habilitado para esta empresa de inspección.",
- "repair_builder_error_title": "Algo salió mal",
- "repair_builder_error_body": "No se pudo cargar el generador de solicitudes de reparación. Inténtelo de nuevo.",
+ "repair_builder_error_title": "No pudimos cargar el generador de reparaciones",
+ "repair_builder_error_body": "Revise su conexión y actualice la página. Si sigue ocurriendo, comuníquese con su inspector.",
"agreement_progress_signed": "{signed}/{total} firmaron",
"agreement_row_untitled": "Sin título",
"agreement_template_status_active": "Activo",
diff --git a/messages/es-419/contacts.json b/messages/es-419/contacts.json
index 1f4dc87d..b6c172f1 100644
--- a/messages/es-419/contacts.json
+++ b/messages/es-419/contacts.json
@@ -55,7 +55,7 @@
"contacts_detail_untitled_inspection": "Inspección sin título",
"contacts_error_not_found": "No se pudo encontrar este contacto. Es posible que se haya eliminado.",
"contacts_error_forbidden": "No tiene permiso para ver este contacto.",
- "contacts_error_generic": "Algo salió mal al abrir el contacto.",
+ "contacts_error_generic": "No pudimos abrir este contacto. Actualice la página para volver a intentarlo. Si sigue ocurriendo, comuníquese con soporte.",
"contacts_label_roles": "Roles",
"contacts_roles_action_add": "Agregar rol",
"contacts_roles_empty_title": "Aún no hay perfiles de rol",
diff --git a/messages/es-419/helpers.json b/messages/es-419/helpers.json
index 22bc7d10..3782e9ce 100644
--- a/messages/es-419/helpers.json
+++ b/messages/es-419/helpers.json
@@ -3,7 +3,7 @@
"helper_booking_inspector_first_available": "El primero disponible",
"helper_booking_inspector_default": "Inspector",
"helper_booking_submit_success": "¡Se envió la solicitud de reserva! Usted recibirá en breve un correo electrónico de confirmación.",
- "helper_booking_submit_error": "Algo salió mal. Inténtelo de nuevo.",
+ "helper_booking_submit_error": "No pudimos enviar su reserva. Revise su conexión e inténtelo de nuevo. Si sigue fallando, comuníquese directamente con el inspector.",
"helper_booking_network_error": "Error de red. Revise su conexión.",
"helper_rating_desc_satisfactory": "El elemento funciona como corresponde; no se observaron inconvenientes.",
"helper_rating_desc_monitor": "El elemento es funcional pero muestra desgaste; se recomienda una reinspección periódica.",
diff --git a/messages/es-419/inspections.json b/messages/es-419/inspections.json
index ed29d147..95b08fd5 100644
--- a/messages/es-419/inspections.json
+++ b/messages/es-419/inspections.json
@@ -242,7 +242,7 @@
"inspections_hub_copy_link": "Copiar enlace",
"inspections_hub_eb_not_found": "No se pudo encontrar esta inspección. Es posible que se haya eliminado.",
"inspections_hub_eb_forbidden": "No tiene permiso para ver esta inspección.",
- "inspections_hub_eb_generic": "Algo salió mal al abrir la inspección.",
+ "inspections_hub_eb_generic": "No pudimos abrir esta inspección. Actualice la página para volver a intentarlo. Si sigue ocurriendo, comuníquese con soporte.",
"inspections_hub_eb_back": "Volver al panel",
"inspections_hub_error_send_report": "No se pudo enviar el informe. Inténtelo de nuevo.",
"inspections_hub_error_send_sms": "No se pudo enviar el mensaje de texto. Inténtelo de nuevo.",
diff --git a/messages/es-419/reports.json b/messages/es-419/reports.json
index 3263f662..d85752aa 100644
--- a/messages/es-419/reports.json
+++ b/messages/es-419/reports.json
@@ -153,8 +153,8 @@
"portal_repair_gate_not_published_body": "El informe debe estar publicado antes de que pueda crear una solicitud de reparación.",
"portal_repair_gate_forbidden_title": "Función no disponible",
"portal_repair_gate_forbidden_body": "El generador de solicitudes de reparación no está habilitado para esta empresa de inspección.",
- "portal_repair_gate_error_title": "Algo salió mal",
- "portal_repair_gate_error_body": "No se pudo cargar el generador de solicitudes de reparación. Inténtelo de nuevo.",
+ "portal_repair_gate_error_title": "No pudimos cargar el generador de reparaciones",
+ "portal_repair_gate_error_body": "Revise su conexión y actualice la página. Si sigue ocurriendo, comuníquese con su inspector.",
"portal_repair_eyebrow": "Generador de solicitudes de reparación",
"portal_repair_heading": "Seleccione los elementos que quiere incluir",
"portal_repair_subtitle": "Marque los defectos por los que quiere solicitar reparación o crédito. Agregue montos y notas para cada uno.",
diff --git a/messages/es-419/settings-integrations.json b/messages/es-419/settings-integrations.json
index 78124ab6..2af892ff 100644
--- a/messages/es-419/settings-integrations.json
+++ b/messages/es-419/settings-integrations.json
@@ -12,7 +12,7 @@
"settings_channel_in_app": "En la aplicación",
"settings_connection_test_failed": "Falló la prueba de conexión.",
"settings_unknown_action": "Acción desconocida",
- "settings_error_generic": "Ocurrió un error.",
+ "settings_error_generic": "No funcionó. Revise su conexión e inténtelo de nuevo.",
"settings_comms_meta_title": "Comunicación - Configuración - OpenInspection",
"settings_comms_intro": "Configure el envío de correo electrónico, las plantillas y la sincronización del calendario.",
"settings_comms_nav_managed": "SMS gestionados",
diff --git a/messages/es-419/templates.json b/messages/es-419/templates.json
index 665c4ec2..7c1e9dee 100644
--- a/messages/es-419/templates.json
+++ b/messages/es-419/templates.json
@@ -111,7 +111,7 @@
"templates_edit_tab_comments": "Comentarios",
"templates_edit_error_not_found": "No se encontró esta plantilla. Es posible que se haya eliminado.",
"templates_edit_error_forbidden": "No tiene permiso para editar esta plantilla.",
- "templates_edit_error_generic": "Se produjo un error al abrir el editor de plantillas.",
+ "templates_edit_error_generic": "No pudimos abrir el editor de plantillas. Actualice la página para volver a intentarlo. Si sigue ocurriendo, comuníquese con soporte.",
"templates_edit_error_back": "Volver a Plantillas",
"templates_edit_phone_preview_label": "Vista de teléfono · {width}px"
}
From d2f0b44a29b1ca92eccf0cf3bf9ab27aaafb03ed Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:05:49 -0400
Subject: [PATCH 08/16] fix(copy): drop tenant, D1, SaaS and payload jargon
from user-facing strings (QA sweep COPY-08)
Co-Authored-By: Claude Sonnet 5.5
---
app/lib/settings-integrations.test.ts | 2 +-
messages/en/editor-2.json | 2 +-
messages/en/library.json | 2 +-
messages/en/public.json | 2 +-
messages/en/settings-components.json | 6 +++---
messages/en/settings-integrations.json | 12 ++++++------
messages/es-419/library.json | 2 +-
messages/es-419/settings-components.json | 2 +-
messages/es-419/settings-integrations.json | 8 ++++----
9 files changed, 19 insertions(+), 19 deletions(-)
diff --git a/app/lib/settings-integrations.test.ts b/app/lib/settings-integrations.test.ts
index 95fbd323..7a288f3d 100644
--- a/app/lib/settings-integrations.test.ts
+++ b/app/lib/settings-integrations.test.ts
@@ -232,7 +232,7 @@ describe('settings-integrations action — save-video intent', () => {
expect(patchTenantConfig).not.toHaveBeenCalled();
expect(postAdminConfig).not.toHaveBeenCalled();
expect(res).toMatchObject({ intent: 'save-video', success: false });
- expect((res as { error: string }).error).toMatch(/plan-managed/);
+ expect((res as { error: string }).error).toMatch(/managed by your plan/);
});
});
diff --git a/messages/en/editor-2.json b/messages/en/editor-2.json
index c4bb42ae..37aa6d28 100644
--- a/messages/en/editor-2.json
+++ b/messages/en/editor-2.json
@@ -68,7 +68,7 @@
"editor_settings_legend_report_rules": "Report rules",
"editor_settings_legend_appearance": "Report appearance",
"editor_settings_required_defect_fields": "Required defect fields at publish",
- "editor_settings_required_inherit": "Inherit (tenant default)",
+ "editor_settings_required_inherit": "Inherit (company default)",
"editor_settings_appearance_summary": "Use a different style preset",
"editor_settings_appearance_help": "Overrides the company or template default for this report only.",
"editor_settings_appearance_inherit": "Inherit default",
diff --git a/messages/en/library.json b/messages/en/library.json
index 1df93cf6..2066f90d 100644
--- a/messages/en/library.json
+++ b/messages/en/library.json
@@ -91,7 +91,7 @@
"library_agreements_err_remind_throttled": "Reminded within the last hour. Try again later.",
"library_agreements_err_signer_not_awaiting": "This signer is no longer awaiting signature.",
"library_agreements_err_remind_failed": "Could not send reminder ({status}).",
- "library_agreements_err_malformed_signers": "Malformed signers payload.",
+ "library_agreements_err_malformed_signers": "The signer list is not valid. Check each signer's name and email.",
"library_agreements_err_pick_template": "Pick an agreement template.",
"library_agreements_err_pick_inspection": "Pick an inspection.",
"library_agreements_err_no_signers": "Add at least one signer.",
diff --git a/messages/en/public.json b/messages/en/public.json
index ac6f502e..9ea125c5 100644
--- a/messages/en/public.json
+++ b/messages/en/public.json
@@ -41,7 +41,7 @@
"public_verify_token_download_audit": "Download audit-trail.json",
"public_verify_token_download_key": "Download public-key.pem",
"public_verify_token_offline": "Offline self-verify (advanced)",
- "public_verify_token_footer": "This page verifies the signed document against the tenant's Ed25519 public key. For an audit independent of this server, download the evidence pack and use the offline self-verify page (above).",
+ "public_verify_token_footer": "This page verifies the signed document against the company's Ed25519 public key. For an audit independent of this server, download the evidence pack and use the offline self-verify page (above).",
"public_viewer_tz_label": "Times shown in",
"public_viewer_tz_select_aria": "Timezone for dates and times on this page",
"public_viewer_tz_detected_note": "Detected from your browser. Pick another if this isn't your zone.",
diff --git a/messages/en/settings-components.json b/messages/en/settings-components.json
index 29fe1ff0..11badee1 100644
--- a/messages/en/settings-components.json
+++ b/messages/en/settings-components.json
@@ -14,7 +14,7 @@
"settings_webhook_processed": "✓ Processed",
"settings_webhook_received": "✓ Received (no action)",
"settings_webhook_signature_failed": "✗ Signature failed — check your signing secret",
- "settings_webhook_tenant_mismatch": "✗ Tenant mismatch",
+ "settings_webhook_tenant_mismatch": "✗ Company mismatch: this webhook belongs to a different company.",
"settings_closed_policy_blocked": "Blocked",
"settings_closed_policy_advisory": "Allowed with notice",
"settings_closed_policy_allowed": "Allowed",
@@ -299,7 +299,7 @@
"settings_stripe_send_test_event": "Send test event",
"settings_stripe_no_deliveries_suffix": ", then hit Refresh.",
"settings_video_heading": "Video",
- "settings_video_subtitle": "Choose the video storage backend for this instance.",
+ "settings_video_subtitle": "Choose where videos are stored for this instance.",
"settings_video_default_label": "Default: R2 (free).",
"settings_video_r2_desc": "Videos are stored in your Cloudflare R2 bucket — no extra cost beyond R2 storage rates.",
"settings_video_stream_label": "Cloudflare Stream",
@@ -531,7 +531,7 @@
"settings_mcw_resubmitting": "Resubmitting…",
"settings_mcw_fix_resubmit": "Fix & resubmit",
"settings_mcw_managed_carrier": "Managed carrier",
- "settings_mcw_carrier_note": "Which carrier provisions and manages this tenant's dedicated number.",
+ "settings_mcw_carrier_note": "Which carrier provisions and manages this company's dedicated number.",
"settings_mcw_save_carrier": "Save carrier",
"settings_mcw_update_business_info": "Update business information",
"settings_mcw_business_info": "Business information",
diff --git a/messages/en/settings-integrations.json b/messages/en/settings-integrations.json
index 7f555d59..1f6570a6 100644
--- a/messages/en/settings-integrations.json
+++ b/messages/en/settings-integrations.json
@@ -27,7 +27,7 @@
"settings_comms_sms_settings_save_error": "Failed to save SMS settings.",
"settings_comms_sms_credentials_save_error": "Failed to save SMS credentials.",
"settings_comms_test_sms_failed": "Test SMS failed.",
- "settings_comms_managed_saas_only": "Managed SMS is only available on the SaaS platform.",
+ "settings_comms_managed_saas_only": "Managed SMS is only available on the hosted platform.",
"settings_comms_legal_name_required": "Legal name is required.",
"settings_comms_business_address_required": "Business address is required.",
"settings_comms_rep_name_required": "Representative name is required.",
@@ -107,13 +107,13 @@
"settings_msgtpl_optin_heading": "Opt-in disclosure",
"settings_msgtpl_optin_desc_before": "Your opt-in disclosure text is configured in",
"settings_msgtpl_optin_link": "Communication settings",
- "settings_msgtpl_optin_desc_after": "under SMS delivery. Tenants using BYO Twilio manage disclosure copy there.",
+ "settings_msgtpl_optin_desc_after": "under SMS delivery. Companies using their own Twilio account manage disclosure copy there.",
"settings_msgtpl_stopstart_heading": "STOP / START / HELP",
"settings_msgtpl_stopstart_desc": "Inbound opt-out (STOP), opt-in (START), and help (HELP) keywords are handled automatically by your SMS provider. When a recipient texts STOP, future messages are suppressed at the provider level. You do not need to handle these replies manually — they are recorded in the compliance log in Communication settings.",
"settings_integrations_meta_title": "Integrations - Settings - OpenInspection",
"settings_integrations_intro": "Connect OpenInspection to your other business tools.",
"settings_integrations_stripe_save_error": "Failed to save Stripe keys.",
- "settings_integrations_video_plan_managed": "Video backend is plan-managed in hosted mode.",
+ "settings_integrations_video_plan_managed": "Video storage is managed by your plan in hosted mode.",
"settings_integrations_video_invalid": "Invalid video settings.",
"settings_integrations_video_read_error": "Failed to read current configuration. No changes were saved.",
"settings_integrations_video_mode_save_error": "Failed to save video mode.",
@@ -209,7 +209,7 @@
"settings_apps_your_heading": "Your applications",
"settings_apps_none_title": "No authorized applications yet.",
"settings_apps_none_desc": "When you authorize an MCP client (e.g. Claude) it will appear here.",
- "settings_apps_tenant_heading": "Tenant-wide authorized applications",
+ "settings_apps_tenant_heading": "Company-wide authorized applications",
"settings_apps_tenant_desc": "All MCP client authorizations across your team. You can revoke any member's access.",
"settings_apps_tenant_none": "No team members have authorized any applications.",
"settings_apps_revoke_title": "Revoke access",
@@ -239,7 +239,7 @@
"settings_billing_manage_portal": "Manage in Stripe portal",
"settings_billing_no_portal": "Billing portal is not configured on this deployment.",
"settings_billing_need_hosted": "Need hosted instead?",
- "settings_billing_hosted_pitch": "InspectorHub.io offers the same OpenInspection codebase as a managed service — no Cloudflare account, no D1 quota worries.",
+ "settings_billing_hosted_pitch": "InspectorHub.io offers the same OpenInspection codebase as a managed service — no Cloudflare account to set up and no database limits to watch.",
"settings_billing_try_hosted": "Try the hosted version",
"settings_billing_want_selfhost": "Want to self-host?",
"settings_billing_selfhost_pitch": "Every collaboration feature is free on the open-source build. The per-seat subscription only exists on the hosted shared plan.",
@@ -256,7 +256,7 @@
"settings_compliance_years_label": "Years",
"settings_compliance_saving": "Saving…",
"settings_compliance_save_failed": "Save failed. Please try again.",
- "settings_compliance_retention_note": "Retained as a legal obligation under GDPR Art. 17(3)(e) (defence of legal claims). The default of 6 years matches the UK simple-contract limitation period. Note: deleted rows remain restorable from D1 Time-Travel backups for up to 30 days.",
+ "settings_compliance_retention_note": "Retained as a legal obligation under GDPR Art. 17(3)(e) (defence of legal claims). The default of 6 years matches the UK simple-contract limitation period. Note: deleted records can still be restored from backups for up to 30 days.",
"settings_compliance_pdf_heading": "Report PDF retention window",
"settings_compliance_pdf_desc": "How long a rendered report PDF is kept before the file and its record are permanently destroyed. Enter 0 to keep them indefinitely.",
"settings_compliance_pdf_note": "Platform default: 7 years. This is a platform-selected default for when you have not chosen a period. It is not a statutory retention period, and not a representation that seven years is the maximum legally required period. The default is informed primarily by defence of legal claims and secondarily by record-retention rules: Illinois requires five years for home-inspection contracts, reports and supporting data, with a longer period where a qualifying judicial proceeding extends two years beyond final disposition; Virginia and Washington identify three-year periods for specified home-inspection records. Your own choice controls wherever the law permits it.",
diff --git a/messages/es-419/library.json b/messages/es-419/library.json
index 47c4b65b..5f6d28af 100644
--- a/messages/es-419/library.json
+++ b/messages/es-419/library.json
@@ -91,7 +91,7 @@
"library_agreements_err_remind_throttled": "Ya se envió un recordatorio en la última hora. Inténtelo de nuevo más tarde.",
"library_agreements_err_signer_not_awaiting": "Este firmante ya no está en espera de firma.",
"library_agreements_err_remind_failed": "No se pudo enviar el recordatorio ({status}).",
- "library_agreements_err_malformed_signers": "Los datos de los firmantes tienen un formato incorrecto.",
+ "library_agreements_err_malformed_signers": "La lista de firmantes no es válida. Revise el nombre y el correo de cada firmante.",
"library_agreements_err_pick_template": "Elija una plantilla de acuerdo.",
"library_agreements_err_pick_inspection": "Elija una inspección.",
"library_agreements_err_no_signers": "Agregue al menos un firmante.",
diff --git a/messages/es-419/settings-components.json b/messages/es-419/settings-components.json
index 1b1c0458..229109e2 100644
--- a/messages/es-419/settings-components.json
+++ b/messages/es-419/settings-components.json
@@ -299,7 +299,7 @@
"settings_stripe_send_test_event": "Send test event",
"settings_stripe_no_deliveries_suffix": ", y luego presione Actualizar.",
"settings_video_heading": "Video",
- "settings_video_subtitle": "Elija el backend de almacenamiento de video para esta instancia.",
+ "settings_video_subtitle": "Elija dónde se almacenan los videos de esta instancia.",
"settings_video_default_label": "Predeterminado: R2 (gratis).",
"settings_video_r2_desc": "Los videos se almacenan en su bucket de Cloudflare R2 — sin costo adicional más allá de las tarifas de almacenamiento de R2.",
"settings_video_stream_label": "Cloudflare Stream",
diff --git a/messages/es-419/settings-integrations.json b/messages/es-419/settings-integrations.json
index 2af892ff..dc536431 100644
--- a/messages/es-419/settings-integrations.json
+++ b/messages/es-419/settings-integrations.json
@@ -27,7 +27,7 @@
"settings_comms_sms_settings_save_error": "No se pudo guardar la configuración de SMS.",
"settings_comms_sms_credentials_save_error": "No se pudieron guardar las credenciales de SMS.",
"settings_comms_test_sms_failed": "Falló el SMS de prueba.",
- "settings_comms_managed_saas_only": "Los SMS gestionados solo están disponibles en la plataforma SaaS.",
+ "settings_comms_managed_saas_only": "Los SMS gestionados solo están disponibles en la plataforma alojada.",
"settings_comms_legal_name_required": "La razón social es obligatoria.",
"settings_comms_business_address_required": "La dirección comercial es obligatoria.",
"settings_comms_rep_name_required": "El nombre del representante es obligatorio.",
@@ -113,7 +113,7 @@
"settings_integrations_meta_title": "Integraciones - Configuración - OpenInspection",
"settings_integrations_intro": "Conecte OpenInspection con sus otras herramientas de negocio.",
"settings_integrations_stripe_save_error": "No se pudieron guardar las claves de Stripe.",
- "settings_integrations_video_plan_managed": "En el modo alojado, el backend de video lo gestiona el plan.",
+ "settings_integrations_video_plan_managed": "En el modo alojado, el almacenamiento de video lo gestiona el plan.",
"settings_integrations_video_invalid": "Configuración de video no válida.",
"settings_integrations_video_read_error": "No se pudo leer la configuración actual. No se guardó ningún cambio.",
"settings_integrations_video_mode_save_error": "No se pudo guardar el modo de video.",
@@ -239,7 +239,7 @@
"settings_billing_manage_portal": "Administrar en el portal de Stripe",
"settings_billing_no_portal": "El portal de facturación no está configurado en esta instalación.",
"settings_billing_need_hosted": "¿Prefiere la versión alojada?",
- "settings_billing_hosted_pitch": "InspectorHub.io ofrece el mismo código de OpenInspection como servicio gestionado — sin cuenta de Cloudflare, sin preocuparse por las cuotas de D1.",
+ "settings_billing_hosted_pitch": "InspectorHub.io ofrece el mismo código de OpenInspection como servicio gestionado — sin cuenta de Cloudflare que configurar y sin límites de base de datos que vigilar.",
"settings_billing_try_hosted": "Pruebe la versión alojada",
"settings_billing_want_selfhost": "¿Quiere alojarlo usted mismo?",
"settings_billing_selfhost_pitch": "Todas las funciones de colaboración son gratuitas en la versión de código abierto. La suscripción por puesto solo existe en el plan compartido alojado.",
@@ -256,7 +256,7 @@
"settings_compliance_years_label": "Años",
"settings_compliance_saving": "Guardando…",
"settings_compliance_save_failed": "No se pudo guardar. Inténtelo de nuevo.",
- "settings_compliance_retention_note": "Se conserva como obligación legal según el art. 17(3)(e) del RGPD (defensa de reclamaciones legales). El valor predeterminado de 6 años coincide con el plazo de prescripción de los contratos simples del Reino Unido. Nota: las filas eliminadas siguen siendo restaurables desde las copias de seguridad de D1 Time-Travel hasta por 30 días.",
+ "settings_compliance_retention_note": "Se conserva como obligación legal según el art. 17(3)(e) del RGPD (defensa de reclamaciones legales). El valor predeterminado de 6 años coincide con el plazo de prescripción de los contratos simples del Reino Unido. Nota: los registros eliminados siguen siendo restaurables desde las copias de seguridad hasta por 30 días.",
"settings_compliance_pdf_heading": "Periodo de conservación de los PDF de informes",
"settings_compliance_pdf_desc": "Cuánto tiempo se conserva un PDF de informe generado antes de destruir el archivo y su registro de forma permanente. Escriba 0 para conservarlos indefinidamente.",
"settings_compliance_pdf_note": "Valor predeterminado de la plataforma: 7 años. Es un valor que elige la plataforma para cuando usted no ha fijado un periodo. No es un periodo de conservación establecido por ley, ni una afirmación de que siete años sea el máximo exigido legalmente. El valor se basa principalmente en la defensa de reclamaciones legales y, en segundo lugar, en normas de conservación de registros: Illinois exige cinco años para contratos, informes y datos de apoyo de inspecciones de vivienda, con un periodo mayor cuando un procedimiento judicial que cumpla los requisitos se extiende dos años más allá de su resolución final; Virginia y Washington fijan periodos de tres años para determinados registros de inspección de vivienda. Su propia elección prevalece siempre que la ley lo permita.",
From 89a22bcf26d41bd9272cbfce13c59794b90865d3 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:06:34 -0400
Subject: [PATCH 09/16] fix(copy): link ID instead of slug (QA sweep COPY-09)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/misc.json | 2 +-
messages/en/public.json | 16 ++++++++--------
messages/en/settings-catalog.json | 4 ++--
messages/en/settings-components.json | 4 ++--
4 files changed, 13 insertions(+), 13 deletions(-)
diff --git a/messages/en/misc.json b/messages/en/misc.json
index cd2b911c..44bcf555 100644
--- a/messages/en/misc.json
+++ b/messages/en/misc.json
@@ -133,7 +133,7 @@
"new_inspection_create_failed": "This inspection could not be created. Nothing was saved — check the details and try again.",
"new_inspection_offline": "No connection, so this inspection was not created. Everything you entered is still here — press Create Inspection again once you are back online.",
"rating_editor_error_name_required": "Name is required",
- "rating_editor_error_slug": "Name must produce a 2+ character slug",
+ "rating_editor_error_slug": "Name must contain at least 2 letters or numbers.",
"rating_editor_error_min_levels": "Add at least 2 levels",
"rating_editor_error_level_fields": "Every level needs an abbreviation and a label",
"rating_editor_title_edit": "Edit rating system",
diff --git a/messages/en/public.json b/messages/en/public.json
index 9ea125c5..77e509e6 100644
--- a/messages/en/public.json
+++ b/messages/en/public.json
@@ -70,7 +70,7 @@
"agent_portal_dashboard_tap_open": "Tap a row below to open",
"agent_portal_dashboard_empty_title": "No referrals yet",
"agent_portal_dashboard_empty_body": "Inspectors invite agents from their contacts list. Once you are linked, every inspection you refer lands here.",
- "agent_portal_dashboard_setup_slug": "Set up your referral slug",
+ "agent_portal_dashboard_setup_slug": "Set up your referral link ID",
"agent_portal_dashboard_referral_one": "referral",
"agent_portal_dashboard_referral_other": "referrals",
"agent_portal_dashboard_all_companies": "All companies",
@@ -87,7 +87,7 @@
"agent_portal_inspectors_empty_body": "Inspectors who invite you, or whose contact list already has your email, will appear here automatically.",
"agent_portal_inspectors_photo_alt": "Inspector",
"agent_portal_inspectors_copy_link": "Copy Booking Link",
- "agent_portal_inspectors_no_slug": "This inspector has not published a booking slug yet.",
+ "agent_portal_inspectors_no_slug": "This inspector has not published a booking link yet.",
"agent_portal_invite_expired_meta_title": "Invite expired - OpenInspection",
"agent_portal_invite_expired_headline_used": "This invite has already been used",
"agent_portal_invite_expired_headline_no_token": "No invite token in this link",
@@ -122,13 +122,13 @@
"agent_portal_repair_share_pending": "Preparing link…",
"agent_portal_settings_meta_title": "Agent Settings - OpenInspection",
"agent_portal_settings_title": "Settings",
- "agent_portal_settings_subtitle": "Your public referral slug and the emails we send you.",
- "agent_portal_settings_slug_eyebrow": "Referral slug",
+ "agent_portal_settings_subtitle": "Your public referral link ID and the emails we send you.",
+ "agent_portal_settings_slug_eyebrow": "Referral link ID",
"agent_portal_settings_slug_heading": "Your referral link",
- "agent_portal_settings_slug_desc": "When you share a booking link with a client, this slug attributes the referral to you so the inspector knows where the client came from.",
- "agent_portal_settings_slug_label": "Slug",
+ "agent_portal_settings_slug_desc": "When you share a booking link with a client, this ID attributes the referral to you so the inspector knows where the client came from.",
+ "agent_portal_settings_slug_label": "Link ID",
"agent_portal_settings_slug_placeholder": "jane",
- "agent_portal_settings_slug_save": "Save slug",
+ "agent_portal_settings_slug_save": "Save link ID",
"agent_portal_settings_slug_hint": "Lowercase letters, numbers, and hyphens (3-32 chars).",
"agent_portal_settings_notifications_eyebrow": "Notifications",
"agent_portal_settings_notifications_heading": "What each company sends you",
@@ -137,7 +137,7 @@
"agent_portal_settings_notify_apply_all": "Apply my next change to all {count} companies",
"agent_portal_settings_notify_applied_all": "Applied to all {count} companies.",
"agent_portal_settings_notify_no_companies": "No companies yet. Once an inspection company adds you as an agent, their notification settings appear here.",
- "agent_portal_settings_slug_error_generic": "Couldn't save your slug. Please try again.",
+ "agent_portal_settings_slug_error_generic": "Could not save your link ID. Please try again.",
"agent_portal_settings_notify_error_generic": "Couldn't save your notification preferences. Please try again.",
"agent_portal_settings_timezone_eyebrow": "Display",
"agent_portal_settings_timezone_heading": "Timezone",
diff --git a/messages/en/settings-catalog.json b/messages/en/settings-catalog.json
index 7af77d01..7d07fe9b 100644
--- a/messages/en/settings-catalog.json
+++ b/messages/en/settings-catalog.json
@@ -72,7 +72,7 @@
"settings_event_types_empty_title": "No event types yet.",
"settings_event_types_empty_desc": "Click “+ Add type” to define your first event type.",
"settings_event_types_col_name": "Name",
- "settings_event_types_col_slug": "Slug",
+ "settings_event_types_col_slug": "Link name",
"settings_event_types_col_duration": "Duration",
"settings_event_types_col_price": "Price",
"settings_event_types_col_color": "Color",
@@ -83,7 +83,7 @@
"settings_event_types_modal_new_title": "New event type",
"settings_event_types_name_label": "Name",
"settings_event_types_name_placeholder": "e.g., Radon Test - Pickup",
- "settings_event_types_slug_label": "Slug",
+ "settings_event_types_slug_label": "Link name",
"settings_event_types_slug_placeholder": "radon_pickup",
"settings_event_types_duration_label": "Duration (min)",
"settings_event_types_price_label": "Price",
diff --git a/messages/en/settings-components.json b/messages/en/settings-components.json
index 11badee1..6e5c15e1 100644
--- a/messages/en/settings-components.json
+++ b/messages/en/settings-components.json
@@ -100,7 +100,7 @@
"settings_schedlinks_heading": "Your links",
"settings_schedlinks_personal_label": "Personal booking link",
"settings_schedlinks_deeplink_hint": "This link pre-selects you on the company booking page.",
- "settings_schedlinks_not_ready": "Your personal booking link appears after your company and user slugs are configured.",
+ "settings_schedlinks_not_ready": "Your personal booking link appears after your company and user link names are set up.",
"settings_schedlinks_ics_label": "ICS calendar subscriptions",
"settings_schedlinks_ics_desc": "The current ICS subscription uses a company token and shows scheduled inspections. It is not a per-inspector busy feed, does not import busy time, and does not update Google Calendar; use the connection above for availability sync.",
"settings_schedlinks_ics_learn": "Learn how to subscribe",
@@ -602,7 +602,7 @@
"settings_deposit_error_save": "Could not save the deposit.",
"settings_icsfeeds_heading": "Calendar subscriptions",
"settings_icsfeeds_intro": "Subscribe any calendar app to these links and it stays up to date on its own. Each feed shows a different amount of detail — pick the one that matches who will see it.",
- "settings_icsfeeds_none": "Your subscription links appear once your company and user slugs are configured.",
+ "settings_icsfeeds_none": "Your subscription links appear once your company and user link names are set up.",
"settings_icsfeeds_private_badge": "Private link",
"settings_icsfeeds_privacy_note": "Anyone holding a link marked private can read that calendar without signing in. Share those only with people already allowed to see the work.",
"settings_icsfeeds_company_label": "Company inspections",
From e46be65d9d3f9ad88b445c707aa4235619ac5e40 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:07:01 -0400
Subject: [PATCH 10/16] fix(copy): Repair Items instead of Recommendations (QA
sweep COPY-10)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/public.json | 4 ++--
messages/es-419/public.json | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/messages/en/public.json b/messages/en/public.json
index 77e509e6..54f8cdd0 100644
--- a/messages/en/public.json
+++ b/messages/en/public.json
@@ -109,8 +109,8 @@
"agent_portal_repair_group_recommendation": "Recommendation",
"agent_portal_repair_group_maintenance": "Maintenance",
"agent_portal_repair_inspector_added": "inspector-added",
- "agent_portal_repair_custom_note_one": "1 finding has a custom category and is grouped under Recommendations.",
- "agent_portal_repair_custom_note_other": "{count} findings have a custom category and are grouped under Recommendations.",
+ "agent_portal_repair_custom_note_one": "1 finding has a custom category and is grouped under Repair Items.",
+ "agent_portal_repair_custom_note_other": "{count} findings have a custom category and are grouped under Repair Items.",
"agent_portal_repair_items": "Repair Items",
"agent_portal_recommendations_meta": "Every defect flagged in delivered inspection reports, grouped by category.",
"agent_portal_recommendations_total": " {count} total items.",
diff --git a/messages/es-419/public.json b/messages/es-419/public.json
index 8cc8b7b6..5470485c 100644
--- a/messages/es-419/public.json
+++ b/messages/es-419/public.json
@@ -109,8 +109,8 @@
"agent_portal_repair_group_recommendation": "Recomendación",
"agent_portal_repair_group_maintenance": "Mantenimiento",
"agent_portal_repair_inspector_added": "agregado por el inspector",
- "agent_portal_repair_custom_note_one": "1 hallazgo tiene una categoría personalizada y se agrupa en Recomendaciones.",
- "agent_portal_repair_custom_note_other": "{count} hallazgos tienen una categoría personalizada y se agrupan en Recomendaciones.",
+ "agent_portal_repair_custom_note_one": "1 hallazgo tiene una categoría personalizada y se agrupa en Elementos de reparación.",
+ "agent_portal_repair_custom_note_other": "{count} hallazgos tienen una categoría personalizada y se agrupan en Elementos de reparación.",
"agent_portal_repair_items": "Elementos de reparación",
"agent_portal_recommendations_meta": "Todos los defectos señalados en los informes de inspección entregados, agrupados por categoría.",
"agent_portal_recommendations_total": " {count} elementos en total.",
From df04ff181c0e07b7722d9f17b71d1beb08d13496 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:07:23 -0400
Subject: [PATCH 11/16] fix(copy): Inspection instead of Order (QA sweep
COPY-11)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/inspections.json | 2 +-
messages/en/metrics.json | 2 +-
messages/es-419/inspections.json | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/messages/en/inspections.json b/messages/en/inspections.json
index 72e3fd64..d910fa64 100644
--- a/messages/en/inspections.json
+++ b/messages/en/inspections.json
@@ -132,7 +132,7 @@
"inspections_hub_reports_blocked_primary": "The primary report cannot be deleted — every order keeps one, and without it the order cannot be edited.",
"inspections_hub_reports_blocked_published": "A published report cannot be deleted — it has been delivered, and its signed versions are what let a client verify the document they hold.",
"inspections_hub_error_report_delete": "Could not delete the report.",
- "inspections_hub_block_details": "Order details",
+ "inspections_hub_block_details": "Inspection details",
"inspections_hub_details_edit": "Edit details",
"inspections_hub_details_reference": "Reference number",
"inspections_hub_details_referral": "Referral source",
diff --git a/messages/en/metrics.json b/messages/en/metrics.json
index b687040f..2e6a0942 100644
--- a/messages/en/metrics.json
+++ b/messages/en/metrics.json
@@ -7,7 +7,7 @@
"metrics_loading": "Loading…",
"metrics_kpi_revenue": "Total Revenue",
"metrics_kpi_inspections": "Total Inspections",
- "metrics_kpi_aov": "Avg Order Value",
+ "metrics_kpi_aov": "Avg Inspection Value",
"metrics_chart_inspections": "Inspections per Month",
"metrics_no_data": "No data in this date range.",
"metrics_chart_revenue": "Revenue per Month",
diff --git a/messages/es-419/inspections.json b/messages/es-419/inspections.json
index 95b08fd5..214443e8 100644
--- a/messages/es-419/inspections.json
+++ b/messages/es-419/inspections.json
@@ -132,7 +132,7 @@
"inspections_hub_reports_blocked_primary": "El informe principal no se puede eliminar: cada orden conserva uno y, sin él, la orden no se puede editar.",
"inspections_hub_reports_blocked_published": "Un informe publicado no se puede eliminar: ya fue entregado, y sus versiones firmadas son lo que le permite al cliente verificar el documento que tiene en su poder.",
"inspections_hub_error_report_delete": "No se pudo eliminar el informe.",
- "inspections_hub_block_details": "Detalles de la orden",
+ "inspections_hub_block_details": "Detalles de la inspección",
"inspections_hub_details_edit": "Editar detalles",
"inspections_hub_details_reference": "Número de referencia",
"inspections_hub_details_referral": "Fuente de referencia",
From a0079f822cd589512d96c8ac523a643fa05dcacd Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:07:42 -0400
Subject: [PATCH 12/16] fix(copy): Clients instead of Customers (QA sweep
COPY-12)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/settings-components.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/messages/en/settings-components.json b/messages/en/settings-components.json
index 6e5c15e1..0f5db7d0 100644
--- a/messages/en/settings-components.json
+++ b/messages/en/settings-components.json
@@ -49,7 +49,7 @@
"settings_holiday_region_off": "Off (no holiday catalog)",
"settings_holiday_public_heading": "Public booking",
"settings_holiday_public_aria": "Public holiday policy",
- "settings_holiday_open_warning": "Customers can still book on listed holidays (e.g. Thanksgiving). Use Block or Allow with notice if that is not intended.",
+ "settings_holiday_open_warning": "Clients can still book on listed holidays (e.g. Thanksgiving). Use Block or Allow with notice if that is not intended.",
"settings_holiday_internal_heading": "Internal scheduling",
"settings_holiday_internal_aria": "Internal holiday policy",
"settings_holiday_custom_heading": "Custom closed days",
@@ -67,7 +67,7 @@
"settings_holiday_concierge_desc": "Bookings on holiday dates stay pending until someone on your team confirms.",
"settings_holiday_concierge_warn": "Bookings may confirm without review on holiday dates.",
"settings_holiday_confirm_title": "Allow bookings on holidays?",
- "settings_holiday_confirm_message": "Customers can still book on listed holidays. Confirm only if that is intentional.",
+ "settings_holiday_confirm_message": "Clients can still book on listed holidays. Confirm only if that is intentional.",
"settings_holiday_coverage_warn": "Built-in holiday dates cover {minYear} through {maxYear}. Bookings outside that range won't be flagged as holidays automatically — add them below as custom dates, or update the app for newer years.",
"settings_teamsched_heading": "Team schedules",
"settings_teamsched_desc": "Weekly hours and time off live under My Schedule",
From a16ff260999ccc9dd4aca1d113b27dc6212ac749 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:07:57 -0400
Subject: [PATCH 13/16] fix(copy): Document ID instead of Envelope ID (QA sweep
COPY-13)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/checkout.json | 2 +-
messages/es-419/checkout.json | 2 +-
server/api/agreements-render.ts | 2 +-
3 files changed, 3 insertions(+), 3 deletions(-)
diff --git a/messages/en/checkout.json b/messages/en/checkout.json
index c5f5be29..ea57cc02 100644
--- a/messages/en/checkout.json
+++ b/messages/en/checkout.json
@@ -47,7 +47,7 @@
"invoice_from_party": "Issued by {entity}",
"agreement_printable_meta_title": "Signed Agreement - OpenInspection",
"agreement_printable_not_found": "Agreement not found.",
- "agreement_printable_envelope_id": "Envelope ID: {envelopeId}",
+ "agreement_printable_envelope_id": "Document ID: {envelopeId}",
"agreement_printable_signed_by": "Signed by",
"agreement_printable_signature_alt": "Signature",
"agreement_printable_date_signed": "Date signed (UTC)",
diff --git a/messages/es-419/checkout.json b/messages/es-419/checkout.json
index b0166bae..cc5cf87f 100644
--- a/messages/es-419/checkout.json
+++ b/messages/es-419/checkout.json
@@ -47,7 +47,7 @@
"invoice_from_party": "Emitida por {entity}",
"agreement_printable_meta_title": "Acuerdo firmado - OpenInspection",
"agreement_printable_not_found": "Acuerdo no encontrado.",
- "agreement_printable_envelope_id": "ID del sobre: {envelopeId}",
+ "agreement_printable_envelope_id": "ID del documento: {envelopeId}",
"agreement_printable_signed_by": "Firmado por",
"agreement_printable_signature_alt": "Firma",
"agreement_printable_date_signed": "Fecha de firma (UTC)",
diff --git a/server/api/agreements-render.ts b/server/api/agreements-render.ts
index e1cfd869..426925dd 100644
--- a/server/api/agreements-render.ts
+++ b/server/api/agreements-render.ts
@@ -340,7 +340,7 @@ export async function certRenderHandler(
: 'not recorded — this envelope predates identity capture'
}
` +
`Document: Signed agreement for ${escapeHtml(clientLabel)}
` +
- `Envelope ID: ${escapeHtml(reqRow.id)}
` +
+ `Document ID: ${escapeHtml(reqRow.id)}
` +
`Signed by:
` +
`` +
`Audit chain: ${auditRows.length} events · key ${escapeHtml(keyFingerprint)}
` +
From 8e032fd3f7225973c53cf3198d16ba34ba835bcf Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:08:59 -0400
Subject: [PATCH 14/16] fix(copy): settle on Accept invitation (QA sweep
COPY-14)
Co-Authored-By: Claude Sonnet 5.5
---
messages/en/auth.json | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/messages/en/auth.json b/messages/en/auth.json
index 36089f20..72c388c2 100644
--- a/messages/en/auth.json
+++ b/messages/en/auth.json
@@ -51,11 +51,11 @@
"auth_reset_password_label": "New password",
"auth_reset_submit_pending": "Updating…",
"auth_reset_submit": "Update password",
- "auth_join_meta_title": "Accept Invite - OpenInspection",
+ "auth_join_meta_title": "Accept invitation - OpenInspection",
"auth_join_error_missing_token": "Missing invite token",
"auth_join_error_invalid": "Invalid or expired invite link",
"auth_join_error_unavailable": "Service unavailable",
- "auth_join_error_accept_failed": "Could not accept invite. The link may have expired.",
+ "auth_join_error_accept_failed": "Could not accept the invitation. The link may have expired.",
"auth_join_invalid_heading": "Invalid Invite",
"auth_join_heading": "Join {name}",
"auth_join_heading_fallback_name": "the team",
@@ -63,7 +63,7 @@
"auth_join_subtitle_invited": "You have been invited. Set your name and password to get started.",
"auth_join_name_label": "Full name",
"auth_join_submit_pending": "Accepting…",
- "auth_join_submit": "Accept Invite",
+ "auth_join_submit": "Accept invitation",
"auth_setup_meta_title": "Setup - OpenInspection",
"auth_setup_error_failed": "Setup failed. Please check your inputs.",
"auth_setup_error_no_session": "Setup succeeded but no session was created",
@@ -90,7 +90,7 @@
"auth_setup_submit_pending": "Creating your account…",
"auth_setup_submit": "Create account",
"auth_agent_invite_meta_title": "You're invited - OpenInspection",
- "auth_agent_invite_error_failed": "Could not accept invite",
+ "auth_agent_invite_error_failed": "Could not accept the invitation",
"auth_agent_invite_unavailable_heading": "Invite unavailable",
"auth_agent_invite_unavailable_body": "This invite link is expired, already used, or invalid.",
"auth_agent_invite_signup_link": "Sign up directly instead",
From 51bc69e7efa71a9834790144ed9a95c86176acbc Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:09:12 -0400
Subject: [PATCH 15/16] docs(fork-log): row for the COPY pass
Co-Authored-By: Claude Sonnet 5.5
---
docs/develop/fork-log.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/docs/develop/fork-log.md b/docs/develop/fork-log.md
index 8dce5892..2b8761dd 100644
--- a/docs/develop/fork-log.md
+++ b/docs/develop/fork-log.md
@@ -335,3 +335,4 @@ deliberate departure rather than work upstream simply has not done yet.
| `ContactModal` closes after a save (2026-10-13 QA sweep FORM-01, Major; no upstream fix) | `app/components/contacts/ContactModal.tsx` closes on the fetcher's busy to idle transition with `ok:true`, in an effect, instead of reading `fetcherOk` inside `onSubmit`. Spec: `ContactModal.test.tsx` (proven red without the change) | The finding: the 200 created the contact but the dialog sat open with the form refilled. The old handler read the PREVIOUS result at click time, so it could only close on a second save. `upstream/main` (`435b24ec`) still has that line: its `793a4161` added the busy latch around it and left it. The transition (not the value) is the trigger because the modal stays mounted and an earlier `ok:true` is still in `fetcher.data`. No "Contact added" toast: the new row in the list is the confirmation, and a toast is a new string in both locales for this fork alone |
| `/templates` create dialog stays open until the action answers (2026-10-13 QA sweep FORM-06, Major; no upstream fix) | `handleCreate` in `app/routes/templates.tsx` no longer closes the dialog and clears the name on click; success navigates to the editor, failure renders `error` in the dialog (it was already wired, to a dialog that had been closed). `CreateTemplateModal` gets `maxLength={100}`, the API's limit. Spec: `app/routes/templates.test.tsx` | The finding: a ~330-character name did nothing visible, because the API refused it after the dialog had closed. Checked `upstream/main` for the route and the modal: same close-on-click. **Known ceilings:** no character counter (a new string in both locales), so a typed name just stops at 100; the server's 400 for an over-long name is the generic "could not create" text if it ever gets past `maxLength` (the zod message is not read) |
| Public links choose `http` only for exact loopback hosts (2026-10-13 QA sweep DELIV-02, Major; no upstream fix) | `scheme()` in `server/lib/public-urls.ts` matched `host.startsWith('localhost')`, so a real domain that merely begins with `localhost` or `127.0.0.1` got `http://` on token-bearing agreement, invoice and checkout links. It now compares the hostname exactly (`localhost`, `*.localhost`, `127.0.0.1`, `[::1]`). Spec: `tests/unit/reports/public-urls.spec.ts` (proven red without the change) | The sweep saw `http://127.0.0.1:8791/...` in the emails and the `/v/` QR. That was the local dev host, which is loopback on purpose, and the QR base is `APP_BASE_URL`, which the sweep had set to an `http` address; neither is a production defect. **Known ceiling:** `getBookingHost` still returns a bare host, so the scheme is guessed from the hostname, not read from the request or `APP_BASE_URL`; an operator who sets `APP_BASE_URL` to `http://` on a non-loopback host still gets `https` links from these builders. Threading the scheme through the ~20 callers was not worth it for a loopback-only discrepancy. |
+| Copy pass over the English and es-419 catalogs (2026-10-13 QA sweep COPY-01 to COPY-15; no upstream fix, `upstream/main` `435b24ec` only adds feature copy) | Catalog values only, keys unchanged. COPY-01 "workspace" becomes "company" (login heading, validation, nav, settings, notices; the es-419 equivalents become "empresa"); COPY-02 the login network error no longer asks whether the API server is running; COPY-03 "Cross-tenant view" becomes "Every inspector in one view"; COPY-04 the cited button pairs go to sentence case (Create account, Log in, Sign agreement, Save company, Invite member, plus two email CTA defaults); COPY-05 curly apostrophes become straight (the 138 to 23 majority); COPY-06 `...` becomes `…` except the `https://g.page/r/...` placeholder; COPY-07 the seven generic errors say what failed and what to do; COPY-08 tenant, D1, SaaS, payload and backend leave user-facing strings; COPY-09 "slug" becomes "link ID" or "link name"; COPY-10 "Recommendations" becomes "Repair Items" in the agent custom-category note; COPY-11 "Order" becomes "Inspection"; COPY-12 "Customers" becomes "Clients"; COPY-13 "Envelope ID" becomes "Document ID" (catalog and the hard-coded line in `server/api/agreements-render.ts`); COPY-14 "Accept invite" and "Accept invitation" settle on "Accept invitation" | **Known ceilings:** COPY-04 fixes the pairs the finding names, not every Title Case label in the 30 files; a lint rule would be the durable fix and is not written. COPY-15 needed no change: ONB-02 already moved the Cloudflare steps into the collapsed "For whoever deployed this" note. The generic route error boundary in `app/root.tsx` is hard-coded "Something went wrong" and untouched. Message keys keep their old names (`settings_workspace_*`, `agent_report_actions_workspace_*`, `auth_validation_workspace_name_required`, `metrics_kpi_aov`) to keep the diff to values; the es-419 values were edited by the same rule, not re-reviewed by a Spanish speaker |
From f24010a4f2039771c66b704064b5c8693e828c65 Mon Sep 17 00:00:00 2001
From: NCHILLC
Date: Tue, 13 Oct 2026 20:19:34 -0400
Subject: [PATCH 16/16] test(copy): update assertions to the new catalog
strings (QA sweep COPY)
Co-Authored-By: Claude Sonnet 5.5
---
app/components/editor/property-info-form.test.tsx | 2 +-
app/components/settings/AiAssurancePanel.test.tsx | 4 ++--
app/lib/connected-apps.test.ts | 4 ++--
app/lib/forms/auth.schema.test.ts | 2 +-
tests/e2e/address-autofill.spec.ts | 2 +-
5 files changed, 7 insertions(+), 7 deletions(-)
diff --git a/app/components/editor/property-info-form.test.tsx b/app/components/editor/property-info-form.test.tsx
index 7f6ed68e..56c86157 100644
--- a/app/components/editor/property-info-form.test.tsx
+++ b/app/components/editor/property-info-form.test.tsx
@@ -309,7 +309,7 @@ describe("PropertyInfoForm — Fetch property details (#200)", () => {
fireEvent.click(screen.getByRole("button", { name: /fetch property details/i }));
- await waitFor(() => expect(screen.getByText(/isn.t configured/i)).toBeTruthy());
+ await waitFor(() => expect(screen.getByText(/is not set up for your company/i)).toBeTruthy());
expect(onCommit).not.toHaveBeenCalled();
});
});
diff --git a/app/components/settings/AiAssurancePanel.test.tsx b/app/components/settings/AiAssurancePanel.test.tsx
index 27fe1817..83ed4e9a 100644
--- a/app/components/settings/AiAssurancePanel.test.tsx
+++ b/app/components/settings/AiAssurancePanel.test.tsx
@@ -123,9 +123,9 @@ describe("AiAssurancePanel", () => {
expect(screen.getByText("u1")).toBeTruthy();
});
- it("reports reviews that cite a call this workspace has no record of", () => {
+ it("reports reviews that cite a call this company has no record of", () => {
renderPanel(base({ calls: [reviewedCall()], unresolvedReviewCount: 3 }));
- expect(screen.getByText(/reviews citing a call this workspace has no record of: 3/i)).toBeTruthy();
+ expect(screen.getByText(/reviews citing a call this company has no record of: 3/i)).toBeTruthy();
});
it("stays silent when every review resolves", () => {
diff --git a/app/lib/connected-apps.test.ts b/app/lib/connected-apps.test.ts
index 2047dafb..9348b1ec 100644
--- a/app/lib/connected-apps.test.ts
+++ b/app/lib/connected-apps.test.ts
@@ -289,7 +289,7 @@ describe('SettingsConnectedApps component render', () => {
isSaas: false,
} as never);
const html = renderToStaticMarkup(createElement(SettingsConnectedApps));
- expect(html).not.toContain('Tenant-wide');
+ expect(html).not.toContain('Company-wide');
});
it('renders the tenant-wide section for an owner with all-grants data', () => {
@@ -311,7 +311,7 @@ describe('SettingsConnectedApps component render', () => {
seatUsage: null, outboundCoolingWindow: null,
});
const html = renderToStaticMarkup(createElement(SettingsConnectedApps));
- expect(html).toContain('Tenant-wide');
+ expect(html).toContain('Company-wide');
expect(html).toContain('bob@example.com');
});
diff --git a/app/lib/forms/auth.schema.test.ts b/app/lib/forms/auth.schema.test.ts
index 48a5329a..82f21da7 100644
--- a/app/lib/forms/auth.schema.test.ts
+++ b/app/lib/forms/auth.schema.test.ts
@@ -120,7 +120,7 @@ describe('auth login i18n (Phase C pilot)', () => {
it('resolves login UI + interpolation messages in es-419', () => {
overwriteGetLocale(() => 'es-419');
// Formal `usted` register — see docs/develop/conventions/i18n-glossary.md.
- expect(m.auth_login_heading()).toBe('Inicie sesión en su espacio de trabajo');
+ expect(m.auth_login_heading()).toBe('Inicie sesión en su empresa');
expect(m.auth_login_submit()).toBe('Iniciar sesión');
// category 2 — server-side interpolation message
expect(m.auth_login_error_failed_with_status({ status: 500 })).toBe(
diff --git a/tests/e2e/address-autofill.spec.ts b/tests/e2e/address-autofill.spec.ts
index 1565aafb..e6e248ef 100644
--- a/tests/e2e/address-autofill.spec.ts
+++ b/tests/e2e/address-autofill.spec.ts
@@ -61,6 +61,6 @@ test.describe.serial('Address autocomplete + property auto-fill (#198/#200)', ()
await expect(btn).toBeEnabled();
await btn.click();
- await expect(page.getByText(/isn.t configured/i)).toBeVisible();
+ await expect(page.getByText(/is not set up for your company/i)).toBeVisible();
});
});