Skip to content

Conversation

chrisvire
Copy link
Member

@chrisvire chrisvire commented Aug 7, 2025

Summary by CodeRabbit

  • New Features
    • Added full Spanish (Latin America & Caribbean) and French translations across the app UI.
    • Added Spanish and French localization for all email notifications, including subjects and message bodies for workflows, invites, and system notices.
    • Includes pluralization rules, contextual variants, and dynamic placeholders for accurate, context-aware UI text and email messaging.

Copy link
Contributor

coderabbitai bot commented Aug 7, 2025

Walkthrough

Added Spanish (es-419) and French (fr-FR) locale JSON files for the application and the email service, providing full UI and email-template translations with pluralization and dynamic placeholders.

Changes

Cohort / File(s) Change Summary
App locale files
src/lib/locales/es-419.json, src/lib/locales/fr-FR.json
Added two new application locale JSON files (es-419, fr-FR) containing comprehensive translations, pluralization rules, and placeholders for UI strings, prompts, errors, notifications, and dynamic content.
Email service locale files
src/lib/server/email-service/locales/es-419.json, src/lib/server/email-service/locales/fr-FR.json
Added two new email-service locale JSON files (es-419, fr-FR) with translated subjects, bodies, short notifications, and templated messages for project/build/product/release/review/invite workflows and related scenarios.

Sequence Diagram(s)

(omitted — changes are static locale additions without control-flow modifications)

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Pre-merge checks (1 passed, 2 inconclusive)

❌ Failed checks (2 inconclusive)
Check name Status Explanation Resolution
Title Check ❓ Inconclusive The title “New Crowdin updates” is related to the pull request in that it references localization changes imported from Crowdin, but it is overly generic and does not clearly summarize the primary change of adding Spanish (es-419) and French (fr-FR) locale files for both the UI and email service. It lacks specificity about what was updated, making it hard for a reviewer scanning history to immediately grasp the main purpose of the PR. Consider updating the title to explicitly mention the addition of Spanish (es-419) and French (fr-FR) localization files for the UI and email service, for example “Add es-419 and fr-FR locale files for UI and email service.”
Description Check ❓ Inconclusive There is no pull request description provided or it is entirely missing from the metadata, leaving the intent and scope of the changes unclear beyond the title; without any description content, it is impossible to assess its relevance or completeness. Please add a brief description summarizing the key changes—namely the addition of Spanish (es-419) and French (fr-FR) locale JSON files for both the UI and email service—so reviewers understand the scope and purpose of this update.
✅ Passed checks (1 passed)
Check name Status Explanation
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.

Poem

I hop and hum with tiny paws,
New words stitched into UI laws.
Español y Français softly sing,
Mail and screens now brightly bring.
A rabbit cheers — locales spring! 🐇🌿

Pre-merge checks and finishing touches

❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title Check ❓ Inconclusive The title "New Crowdin updates" is on-topic because the PR adds localization files imported from Crowdin (notably new UI locale files src/lib/locales/es-419.json and src/lib/locales/fr-FR.json and matching email-service locale files), but it is too generic and does not highlight the primary changes, affected components, or languages, so it does not clearly communicate the main change to a teammate scanning history. Please rename the PR to explicitly state the primary change and languages, for example "Add es-419 and fr-FR localization (UI + email templates) via Crowdin," and update the description to list the added/changed files and any important notes about pluralization or placeholders; after that the title will clearly reflect the changes and this check should pass.
✅ Passed checks (2 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changes. Docstring coverage check skipped.
✨ Finishing touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch crowdin_develop

Tip

👮 Agentic pre-merge checks are now available in preview!

Pro plan users can now enable pre-merge checks in their settings to enforce checklists before merging PRs.

  • Built-in checks – Quickly apply ready-made checks to enforce title conventions, require pull request descriptions that follow templates, validate linked issues for compliance, and more.
  • Custom agentic checks – Define your own rules using CodeRabbit’s advanced agentic capabilities to enforce organization-specific policies and workflows. For example, you can instruct CodeRabbit’s agent to verify that API documentation is updated whenever API schema files are modified in a PR. Note: Upto 5 custom checks are currently allowed during the preview period. Pricing for this feature will be announced in a few weeks.

Please see the documentation for more information.

Example:

reviews:
  pre_merge_checks:
    custom_checks:
      - name: "Undocumented Breaking Changes"
        mode: "warning"
        instructions: |
          Pass/fail criteria: All breaking changes to public APIs, CLI flags, environment variables, configuration keys, database schemas, or HTTP/GraphQL endpoints must be documented in the "Breaking Change" section of the PR description and in CHANGELOG.md. Exclude purely internal or private changes (e.g., code not exported from package entry points or explicitly marked as internal).

Please share your feedback with us on this Discord post.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

🧹 Nitpick comments (2)
src/lib/locales/fr-FR.json (1)

325-327: Typo in verification string

"errors_verifyEmailDescription" contains “… clik the verification link.” – “click” is misspelled.

-      Please log into your email and clik the verification link. 
+      Please log into your email and click the verification link. 
src/lib/locales/es-419.json (1)

325-327: Repeated typo: “clik”

Same misspelling appears here – correct to “click”.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bdbfe3f and 21073f9.

📒 Files selected for processing (4)
  • src/lib/locales/es-419.json (1 hunks)
  • src/lib/locales/fr-FR.json (1 hunks)
  • src/lib/server/email-service/locales/es-419.json (1 hunks)
  • src/lib/server/email-service/locales/fr-FR.json (1 hunks)

Comment on lines +2 to +10
"appName": "Scriptoria",
"welcome": "Welcome to Scriptoria",
"about": "Scriptoria helps you publish your apps and keep them updated every time the App Builder software is improved. You provide the service with your app project data and it will build and publish the app to the Google Play store or a website.",
"contactUs": "Contact Us",
"exampleForm": "Example Form",
"updated": "Updated!",
"opensource": "Open Source",
"home": "Home",
"tabAppName": [
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

❓ Verification inconclusive

Strings still English in the “es-419” locale

Examples: "welcome": "Welcome to Scriptoria", "contactUs": "Contact Us", etc.
End-users selecting Spanish (LatAm) will receive English UI text.

Ensure Crowdin export actually contains Spanish translations before merging.


Translation missing in es-419 locale – please add Spanish strings

Several UI keys in src/lib/locales/es-419.json are still in English, meaning Spanish-Latin American users will see English text. Please update these entries with their Spanish equivalents and verify your Crowdin export includes them before merging.

• File: src/lib/locales/es-419.json (approx. lines 2–10)

  • “welcome”: “Welcome to Scriptoria”
  • “about”: long English description
  • “contactUs”: “Contact Us”
  • “exampleForm”: “Example Form”
  • “updated”: “Updated!”
  • “opensource”: “Open Source”
  • “home”: “Home”

Ensure each value is translated into Spanish (LatAm) and that your translation pipeline (e.g., Crowdin export) correctly updated this file.

🤖 Prompt for AI Agents
In src/lib/locales/es-419.json around lines 2 to 10, several UI text values are
still in English instead of Spanish (Latin American). Replace the English
strings for keys like "welcome", "about", "contactUs", "exampleForm", "updated",
"opensource", and "home" with their appropriate Spanish translations. After
updating, verify that the Crowdin export process correctly includes these
translations before merging.

Comment on lines +2 to +10
"appName": "Scriptoria",
"welcome": "Welcome to Scriptoria",
"about": "Scriptoria helps you publish your apps and keep them updated every time the App Builder software is improved. You provide the service with your app project data and it will build and publish the app to the Google Play store or a website.",
"contactUs": "Contact Us",
"exampleForm": "Example Form",
"updated": "Updated!",
"opensource": "Open Source",
"home": "Home",
"tabAppName": [
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

File is marked “fr-FR” but strings remain English

The vast majority of values (e.g., "welcome": "Welcome to Scriptoria", "contactUs": "Contact Us") are still English. Shipping this file will mis-lead the i18n layer into thinking French content exists when it does not, producing an English UI for users who explicitly select French.

Either finish the translation or do not commit the file until Crowdin export contains French strings; alternatively add a build-time fallback that ignores empty/English-duplicate translations.


🏁 Script executed:

#!/bin/bash
set -euo pipefail
# List all locale files in the directory
find src/lib/locales -maxdepth 1 -type f

# Preview the first 20 lines of the French locale file
sed -n '1,20p' src/lib/locales/fr-FR.json

Length of output: 856


Incomplete French translations in fr-FR.json
The src/lib/locales/fr-FR.json file still contains English strings (e.g., "welcome": "Welcome to Scriptoria", "contactUs": "Contact Us", etc.). Shipping this will make French-selected users see English UI text.

Please address before merge:

  • Translate all keys in src/lib/locales/fr-FR.json into French.
  • Or remove/hold this file until Crowdin (or your i18n pipeline) provides the French strings.
  • Alternatively, implement a build-time fallback that ignores untranslated (English) entries for non-default locales.
🤖 Prompt for AI Agents
In src/lib/locales/fr-FR.json between lines 2 and 10, the translation values are
still in English, which will cause French users to see English text. To fix
this, translate all the English strings into proper French equivalents for each
key. If translations are not yet available, either remove or hold this file
until the French strings are ready from Crowdin or your i18n pipeline.
Alternatively, implement a build-time fallback mechanism to exclude untranslated
English entries for non-default locales.

Comment on lines +4 to +20
"log": "Log",
"userTaskAdded": "<p>Dear {{to}}: </p><p> A new task has been assigned to you by Scriptoria. </p><p> {{activityName}} for {{productName}} - {{project}} by {{originator}}. </p><p> Comment: {{comment}}</p>",
"buildengineDisconnected": "<p>Build Engine URL {{url}} disconnected for {{minutes}} minutes</p>",
"projectFailedBuildEngine": "<p>Failed to create project {{projectName}}. Could not connect to build engine for organization {{orgName}}.</p>",
"projectFailedUnableToCreate": "<p>Failed to create project {{projectName}} at build engine.</p>",
"projectCreatedSuccessfully": "<p>Project {{projectName}} creation completed successfully</p>",
"projectCreationFailedOwner": "<p>Project {{projectName}} creation failed.</p><p> Status: {{projectStatus}} </p><p> The organization administrator has been notified of this issue</p>",
"projectCreationFailedAdmin": "<p>Project {{projectName}} creation failed.</p><p> Status: {{projectStatus}} </p>",
"projectRecordNotFound": "<p>Project Create Failed: Unable to find project record with id: {{projectId}}</p>",
"projectUpdateComplete": "<p>Update of project {{projectName}} completed successfully</p>",
"projectUpdateFailed": "<p>Update of project {{projectName}} failed.<br> Build engine project id: {{buildEngineProjectId}}<br> Status: {{status}} <br> Result: {{result}}</p>",
"projectUpdateFailedBuildEngine": "<p>Failed to update project {{projectName}}. Could not connect to build engine for organization {{orgName}}</p>",
"buildFailedUnableToConnect": "<p>Failed to create build for product: {{productName}} project: {{projectName}}.</p><p>Unable to connect to build engine.</p>",
"buildFailedUnableToCreate": "<p>Failed to create build for product: {{productName}} project: {{projectName}}.</p><p>Retries exceeded for attempt to create build on build machine.</p>",
"buildCompletedSuccessfully": "<p>Build for product: {{productName}} project: {{projectName}} completed successfully</p>",
"buildFailedOwner": "<p>Build for product: {{productName}} project {{projectName}} failed.</p><p>Project URL: {{projectUrl}}</p><p>The organization administrator has been notified of this issue</p>",
"buildFailedAdmin": "<p>Build for product: {{productName}} project {{projectName}} failed.</p><p>Project URL: {{projectUrl}}</p><p>Diagnostic information for Super Admins:</p><ul><li>BuildEngineUrl: {{buildEngineUrl}}</li><li>ProjectId: {{projectId}} </li><li>JobId: {{jobId}} </li><li> BuildId: {{buildId}}</li></ul>",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Email templates remain English

Despite being an es-419 resource, bodies and subjects are entirely English. Recipients may receive mixed-locale emails, defeating the purpose of localisation.

Block merge until proper translations are provided or the file is excluded.


🏁 Script executed:

#!/bin/bash
# List all JSON locale files in the email-service locales directory
fd -e json src/lib/server/email-service/locales

# Show the first 30 lines of the Spanish (es-419) locale file
sed -n '1,30p' src/lib/server/email-service/locales/es-419.json

Length of output: 4709


Translate Spanish locale file before merging
The es-419.json resource under src/lib/server/email-service/locales still contains English strings for all notification templates, so Spanish-locale recipients will get English emails. Please provide proper Spanish (Latin America) translations for each entry (or remove the file if this locale isn’t supported).

• Affected file:

  • src/lib/server/email-service/locales/es-419.json
    • Keys needing translation (not exhaustive):
  • notifications.body.log
  • notifications.body.userTaskAdded
  • notifications.body.buildengineDisconnected
  • notifications.body.projectFailedBuildEngine
  • …and all subsequent entries in this file.
🤖 Prompt for AI Agents
In src/lib/server/email-service/locales/es-419.json from lines 4 to 20, the
notification message strings are still in English, which will cause Spanish
(Latin America) users to receive emails in the wrong language. Translate all the
English notification template strings into proper Spanish (Latin America)
equivalents, ensuring the placeholders remain intact and the meaning is
preserved. If this locale is not supported, consider removing the file instead.

Comment on lines +4 to +20
"log": "Log",
"userTaskAdded": "<p>Dear {{to}}: </p><p> A new task has been assigned to you by Scriptoria. </p><p> {{activityName}} for {{productName}} - {{project}} by {{originator}}. </p><p> Comment: {{comment}}</p>",
"buildengineDisconnected": "<p>Build Engine URL {{url}} disconnected for {{minutes}} minutes</p>",
"projectFailedBuildEngine": "<p>Failed to create project {{projectName}}. Could not connect to build engine for organization {{orgName}}.</p>",
"projectFailedUnableToCreate": "<p>Failed to create project {{projectName}} at build engine.</p>",
"projectCreatedSuccessfully": "<p>Project {{projectName}} creation completed successfully</p>",
"projectCreationFailedOwner": "<p>Project {{projectName}} creation failed.</p><p> Status: {{projectStatus}} </p><p> The organization administrator has been notified of this issue</p>",
"projectCreationFailedAdmin": "<p>Project {{projectName}} creation failed.</p><p> Status: {{projectStatus}} </p>",
"projectRecordNotFound": "<p>Project Create Failed: Unable to find project record with id: {{projectId}}</p>",
"projectUpdateComplete": "<p>Update of project {{projectName}} completed successfully</p>",
"projectUpdateFailed": "<p>Update of project {{projectName}} failed.<br> Build engine project id: {{buildEngineProjectId}}<br> Status: {{status}} <br> Result: {{result}}</p>",
"projectUpdateFailedBuildEngine": "<p>Failed to update project {{projectName}}. Could not connect to build engine for organization {{orgName}}</p>",
"buildFailedUnableToConnect": "<p>Failed to create build for product: {{productName}} project: {{projectName}}.</p><p>Unable to connect to build engine.</p>",
"buildFailedUnableToCreate": "<p>Failed to create build for product: {{productName}} project: {{projectName}}.</p><p>Retries exceeded for attempt to create build on build machine.</p>",
"buildCompletedSuccessfully": "<p>Build for product: {{productName}} project: {{projectName}} completed successfully</p>",
"buildFailedOwner": "<p>Build for product: {{productName}} project {{projectName}} failed.</p><p>Project URL: {{projectUrl}}</p><p>The organization administrator has been notified of this issue</p>",
"buildFailedAdmin": "<p>Build for product: {{productName}} project {{projectName}} failed.</p><p>Project URL: {{projectUrl}}</p><p>Diagnostic information for Super Admins:</p><ul><li>BuildEngineUrl: {{buildEngineUrl}}</li><li>ProjectId: {{projectId}} </li><li>JobId: {{jobId}} </li><li> BuildId: {{buildId}}</li></ul>",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

❓ Verification inconclusive

Email templates not translated to French

All content is English; see "userTaskAdded", "buildengineDisconnected", etc.
Delivering untranslated templates under a French locale will confuse users.

Provide actual French translations or postpone adding the file.


Provide French translations or postpone the French locale file

File: src/lib/server/email-service/locales/fr-FR.json
The entire file is still in English—for example, keys like userTaskAdded, buildengineDisconnected, projectCreatedSuccessfully, etc., all contain English text. Shipping untranslated templates under a French locale will confuse end users.

Please either:

  • Replace each English string with its French equivalent, or
  • Remove or defer the inclusion of this locale file until the translations are ready.
🤖 Prompt for AI Agents
In src/lib/server/email-service/locales/fr-FR.json from lines 4 to 20, the
content is still in English instead of French, which will confuse users
expecting French translations. To fix this, replace each English string with its
correct French translation for all keys, or if translations are not yet
available, remove or postpone including this locale file until the French
versions are ready.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

♻️ Duplicate comments (1)
src/lib/locales/es-419.json (1)

3-9: es-419 contains English strings at the top — translate before merge

These keys are still English and will surface to Spanish (LatAm) users.

Apply sample translations (Crowdin source of truth preferred):

-  "welcome": "Welcome to Scriptoria",
-  "about": "Scriptoria helps you publish your apps and keep them updated every time the App Builder software is improved. You provide the service with your app project data and it will build and publish the app to the Google Play store or a website.",
-  "contactUs": "Contact Us",
-  "exampleForm": "Example Form",
-  "updated": "Updated!",
-  "opensource": "Open Source",
-  "home": "Home",
+  "welcome": "Te damos la bienvenida a Scriptoria",
+  "about": "Scriptoria te ayuda a publicar tus aplicaciones y mantenerlas actualizadas cada vez que se mejora el software de App Builder. Proporcionas los datos del proyecto de tu aplicación y el servicio compilará y publicará la app en Google Play o en un sitio web.",
+  "contactUs": "Contáctanos",
+  "exampleForm": "Formulario de ejemplo",
+  "updated": "¡Actualizado!",
+  "opensource": "Código abierto",
+  "home": "Inicio",
🧹 Nitpick comments (1)
src/lib/locales/es-419.json (1)

110-110: Minor copy/style polish (consistency and capitalization)

Optional, but improves UI consistency.

-  "common_close": "close",
+  "common_close": "Close",
-  "publications_url": "Publish Url",
+  "publications_url": "Publish URL",
-  "users_acts_unlock_error": "there was an error activating the user",
+  "users_acts_unlock_error": "There was an error activating the user",

Also applies to: 232-232, 462-462

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these sources in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 21073f9 and be237c0.

📒 Files selected for processing (2)
  • src/lib/locales/es-419.json (1 hunks)
  • src/lib/locales/fr-FR.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/locales/fr-FR.json
🔇 Additional comments (1)
src/lib/locales/es-419.json (1)

1-576: Ensure base English locale is referenced and correct Spanish typos

  • No en-*.json file in src/lib/locales – confirm the source of the base English locale (e.g. source/SIL.AppBuilder.Portal.Frontend/src/translations/locales/en-us.json) and update the CI detection script or consolidate all locale files under src/lib/locales so untranslated‐coverage checks can run.
  • Fix typos in src/lib/locales/es-419.json:
    • errors_verifyEmailDescription: “clik” → “click”
    • project_claimSuccess: “Succesfully” → “Successfully”
    • orgMembership_unexpected & orgMembership_error: “occured” → “occurred”

Comment on lines +269 to +281
"declarations": [
"local countPlural = amount: plural"
],
"selectors": [
"countPlural"
],
"match": {
"amount=0": "No Product Files",
"countPlural=one": "{amount} Product File",
"countPlural=other": "{amount} Product Files"
}
}
],
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Pluralization block likely broken — missing “input amount” declaration

Your other plural blocks declare the input first; this one does not. Many message compilers will fail to resolve “amount”.

   "products_numArtifacts": [
     {
       "declarations": [
-        "local countPlural = amount: plural"
+        "input amount",
+        "local countPlural = amount: plural"
       ],
       "selectors": [
         "countPlural"
       ],
       "match": {
         "amount=0": "No Product Files",
         "countPlural=one": "{amount} Product File",
         "countPlural=other": "{amount} Product Files"
       }
     }
   ],
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
"declarations": [
"local countPlural = amount: plural"
],
"selectors": [
"countPlural"
],
"match": {
"amount=0": "No Product Files",
"countPlural=one": "{amount} Product File",
"countPlural=other": "{amount} Product Files"
}
}
],
"products_numArtifacts": [
{
"declarations": [
"input amount",
"local countPlural = amount: plural"
],
"selectors": [
"countPlural"
],
"match": {
"amount=0": "No Product Files",
"countPlural=one": "{amount} Product File",
"countPlural=other": "{amount} Product Files"
}
}
],
🤖 Prompt for AI Agents
In src/lib/locales/es-419.json around lines 269 to 281, the pluralization block
uses "amount" in the plural selector but never declares the input variable; add
a declaration for amount before using it (for example add a declaration such as
"local amount = amount: number" immediately above the existing "local
countPlural = amount: plural" so the plural selector has a defined input),
keeping the selector and match entries unchanged.

Comment on lines +325 to +327
"errors_verifyEmailTitle": "Please verify your email address",
"errors_verifyEmailDescription": "\n In order to use Scriptoria, we need you to verify your email address.\n <br />\n Please log into your email and clik the verification link. ",
"errors_invalidProjectSelection": "No valid products available for selected project(s)",
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue

Fix typos in user-facing strings

Spelling errors ship to production.

-  "errors_verifyEmailDescription": "\n      In order to use Scriptoria, we need you to verify your email address.\n      <br />\n      Please log into your email and clik the verification link. ",
+  "errors_verifyEmailDescription": "\n      In order to use Scriptoria, we need you to verify your email address.\n      <br />\n      Please log into your email and click the verification link. ",
-  "project_claimSuccess": "Succesfully Claimed",
+  "project_claimSuccess": "Successfully Claimed",
-  "orgMembership_unexpected": "Unexpected error occured: {response}",
+  "orgMembership_unexpected": "Unexpected error occurred: {response}",
-  "orgMembership_error": "Error occured while trying to invite user.",
+  "orgMembership_error": "Error occurred while trying to invite user.",

Also applies to: 368-368, 562-562, 565-565

🤖 Prompt for AI Agents
In src/lib/locales/es-419.json around lines 325-327 (and also review lines 368,
562, 565), fix spelling/typo errors in the user-facing strings: change "clik" to
"click" and correct any other misspellings found at the referenced lines so the
translated strings are grammatically correct and free of typos; update the JSON
values in-place preserving spacing/formatting and run a quick lint or
message-lookup to ensure no keys or punctuation were broken.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

♻️ Duplicate comments (2)
src/lib/locales/es-419.json (2)

3-9: Spanish locale still contains English strings — replace with es‑419 translations

Keys here (and many elsewhere in this file) are English, so Spanish (LatAm) users will see English UI. Ensure Crowdin export included Spanish or replace with proper translations before merge.

If helpful, run this to spot obviously English phrases remaining:

#!/bin/bash
# List likely-untranslated strings (heuristic: common English UI words)
rg -n '"(welcome|about|contact|home|project|error|save|delete|updated|success|failed|cancel|login)"\s*:\s*"' src/lib/locales/es-419.json
# Compare against any English locale to gauge drift
fd -a --full-path 'src/lib/locales/.*en.*\.json' | while read en; do
  echo "Diff vs $en"
  diff -u "$en" src/lib/locales/es-419.json | sed -n '1,200p'
done

267-279: Pluralization block missing input declaration for “amount”

Compiler will not know what “amount” refers to. Declare the input before deriving the plural form.

   "products_numArtifacts": [
     {
       "declarations": [
-        "local countPlural = amount: plural"
+        "input amount",
+        "local countPlural = amount: plural"
       ],
       "selectors": [
         "countPlural"
       ],
       "match": {
         "amount=0": "No Product Files",
         "countPlural=one": "{amount} Product File",
         "countPlural=other": "{amount} Product Files"
       }
     }
   ],
🧹 Nitpick comments (5)
src/lib/locales/es-419.json (5)

230-230: Fix typos and casing in user‑facing text

These ship to production if not corrected.

-  "publications_url": "Publish Url",
+  "publications_url": "Publish URL",

-  "errors_verifyEmailDescription": "\n      In order to use Scriptoria, we need you to verify your email address.\n      <br />\n      Please log into your email and clik the verification link. ",
+  "errors_verifyEmailDescription": "\n      In order to use Scriptoria, we need you to verify your email address.\n      <br />\n      Please log into your email and click the verification link. ",

-  "project_claimSuccess": "Succesfully Claimed",
+  "project_claimSuccess": "Successfully Claimed",

-  "users_acts_unlock_success": "User is active. The user will now be able to log in to Scriptoria.",
-  "users_acts_unlock_error": "there was an error activating the user",
+  "users_acts_unlock_success": "User is active. The user will now be able to log in to Scriptoria.",
+  "users_acts_unlock_error": "There was an error activating the user",

-  "orgMembership_unexpected": "Unexpected error occured: {response}",
+  "orgMembership_unexpected": "Unexpected error occurred: {response}",

-  "orgMembership_error": "Error occured while trying to invite user.",
+  "orgMembership_error": "Error occurred while trying to invite user.",

Also applies to: 324-324, 365-365, 459-460, 559-562


110-110: Inconsistent casing: “close” vs Title Case elsewhere

Most actions are Title Case (“Save”, “Cancel”). Consider “Close” for consistency, unless UI intentionally uses sentence case.


186-187: Key/text mismatch: “makePrivate” key shows “Public by Default” text

The key suggests a “Make Private” action, but the copy says “Public by Default”. Either rename the key for clarity or adjust the copy to match intent.


297-297: Option label conflicts with key name

Key implies opt‑out (“optOutOfEmailOption”) but text reads opt‑in (“I want to receive email notifications”). Align wording with behavior to avoid user confusion.


234-235: Casing drift within action/options

“update”, “publish”, and “rebuild” are lowercase, but similar items use Title Case (“Rebuild”, “Republish”). Normalize per UI style guide.

Also applies to: 280-280

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 8bcf102 and 91d00f8.

📒 Files selected for processing (2)
  • src/lib/locales/es-419.json (1 hunks)
  • src/lib/locales/fr-FR.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/locales/fr-FR.json

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
src/lib/locales/fr-FR.json (4)

231-231: User‑visible copy nits (safe to fix even before FR translation)

Minor correctness/consistency fixes to current English strings; keeps placeholders intact.

Apply these diffs:

-  "publications_url": "Publish Url",
+  "publications_url": "Publish URL",
-  "errors_verifyEmailDescription": "\n      In order to use Scriptoria, we need you to verify your email address.\n      <br />\n      Please log into your email and clik the verification link. ",
+  "errors_verifyEmailDescription": "\n      In order to use Scriptoria, we need you to verify your email address.\n      <br />\n      Please log into your email and click the verification link. ",
-  "project_claimSuccess": "Succesfully Claimed",
+  "project_claimSuccess": "Successfully Claimed",
-  "users_acts_unlock_error": "there was an error activating the user",
+  "users_acts_unlock_error": "There was an error activating the user",
-  "orgMembership_unexpected": "Unexpected error occured: {response}",
+  "orgMembership_unexpected": "Unexpected error occurred: {response}",
-  "orgMembership_error": "Error occured while trying to invite user.",
+  "orgMembership_error": "Error occurred while trying to invite user.",
-  "common_close": "close",
+  "common_close": "Close",

Also applies to: 324-324, 367-367, 461-462, 561-561, 564-564, 110-110


186-187: Key/value mismatch likely to confuse translators

Key suggests “makePrivate” but value says “Make Projects Public by Default.” Confirm intended meaning before translation to avoid propagating a semantic mismatch.


118-121: HTML and placeholders inside translations — ensure safe rendering

These strings contain HTML tags and interpolations (e.g., {product}, {project}, {sentinel}). Verify your i18n renderer escapes variables by default and only allows intended tags to avoid XSS. Document for translators not to alter placeholders.

Also applies to: 317-321, 324-325


265-279: Pluralization rules — confirm CLDR behavior for fr-FR

You’re using “one/other” categories with custom declarations (count: plural). CLDR for fr has “one” for 1 and “other” for 0 and others. Your special “amount=0” branch is fine; just confirm your runtime pluralization uses CLDR fr rules.

Also applies to: 492-500, 503-511

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 91d00f8 and 0b255cc.

📒 Files selected for processing (2)
  • src/lib/locales/es-419.json (1 hunks)
  • src/lib/locales/fr-FR.json (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/lib/locales/es-419.json
🔇 Additional comments (1)
src/lib/locales/fr-FR.json (1)

2-575: Blocker: fr-FR file is still English — don’t ship untranslated locale

Almost all values are English (e.g., Lines 3–9, 84–91, 123–131, etc.). This will mislead the i18n layer into thinking French is available and show English to French‑selected users.

Options:

  • Complete French translations before merge.
  • Or exclude/remove fr-FR.json from the build until Crowdin provides translations.
  • Or add a build‑time check to drop entries identical to the source locale for non‑default locales.

Run this script to quantify untranslated coverage by comparing fr-FR.json to the default English file and reporting identical values:

#!/bin/bash
set -euo pipefail

FR="src/lib/locales/fr-FR.json"
if [[ ! -f "$FR" ]]; then
  echo "Missing $FR"; exit 1
fi

# Try to locate an English source locale file
EN=$(fd -a -t f -d1 -g 'en*.json' src/lib/locales | head -n1 || true)
if [[ -z "${EN:-}" ]]; then
  echo "No English locale file found under src/lib/locales (pattern en*.json)."; exit 2
fi
echo "Using English source: $EN"

# Flatten to key -> value maps and compare
jq -r 'paths(scalars) as $p | [$p|map(tostring)|join("."), (getpath($p)|tostring)] | @tsv' "$EN" | sort > /tmp/en.tsv
jq -r 'paths(scalars) as $p | [$p|map(tostring)|join("."), (getpath($p)|tostring)] | @tsv' "$FR" | sort > /tmp/fr.tsv

# Join on key and count identical values
join -t $'\t' -j1 /tmp/en.tsv /tmp/fr.tsv > /tmp/join.tsv || true

total=$(wc -l < /tmp/join.tsv | tr -d ' ')
identical=$(awk -F'\t' '$2==$3 {c++} END {print c+0}' /tmp/join.tsv)
percent=$(python - <<PY
t=$total;i=$identical
print(f"{(i/t*100):.1f}" if t>0 else "0.0")
PY
)
echo "Identical translations: $identical / $total (${percent}%)"
echo "Recommendation: gate merge if identical% is high (e.g., >20%)."

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant