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 (subjects and message bodies) covering workflows, invites, project/product events, and system notices.
    • Includes pluralization rules, contextual variants, and dynamic placeholders for accurate, context-aware UI text and emails.

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 7, 2025

Walkthrough

Added Spanish (es-419) and French (fr-FR) locale JSON files for the application UI and the server email service, providing translations, pluralization rules, placeholders, and templated notification messages across UI and email contexts (projects, builds, products, invites, reviews, errors, and system messages).

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, context variants, 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, project-import reports, and related notification scenarios.

Sequence Diagram(s)

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~10 minutes

Poem

I hop through keys and stitch each thread,
Two new tongues for inboxes and web.
Español and Français, letters bright,
Carrots of text in morning light.
A rabbit cheers — translations take flight! 🐇✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning, 1 inconclusive)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
Title Check ❓ Inconclusive The pull request title "New Crowdin updates" is related to the changeset's core purpose—these are indeed translation/localization updates from Crowdin, a translation management platform. However, the title is vague and overly broad, failing to communicate what specifically was changed: the addition of Spanish (Latin America/Caribbean) and French locale files for both the main UI and email service. While the title is technically accurate, a teammate reviewing the commit history would not understand the specific scope of these changes without examining the details, making it unclear whether this is a minor translation tweak or a substantial localization addition. Consider revising the title to be more specific about what was added, such as "Add Spanish and French locale files" or "Add es-419 and fr-FR localization files from Crowdin." This would provide clarity about which languages were introduced and give reviewers a better understanding of the change scope at a glance.
✅ Passed checks (1 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch crowdin_develop

📜 Recent review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 2a5c9c6 and ca378f3.

📒 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

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%)."

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: Spanish strings missing

These top-level entries remain in English (“Welcome to Scriptoria”, “Contact Us”, etc.), so the es-419 locale still serves English UI text. Please ensure the Crowdin export actually delivers Spanish (LatAm) translations before merging.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 0b255cc and 127c24e.

📒 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

Comment on lines +267 to +277
"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 | 🟠 Major

Declare the plural input

The plural block references {amount} but never declares input amount, so most message compilers will fail. Add the input declaration ahead of the plural transform.

🤖 Prompt for AI Agents
In src/lib/locales/es-419.json around lines 267 to 277, the plural block uses
the variable {amount} but does not declare the plural input; add an input
declaration for amount before the plural transform (i.e., declare "input amount"
in the declarations list) so the message compiler recognizes the amount
parameter and the plural rules can be applied correctly.

Comment on lines +323 to +366
"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)",
"errors_appUnavailable": "Scriptoria is currently unavailable",
"tasks_title": "My Tasks",
"tasks_project": "Project",
"tasks_product": "Product",
"tasks_assignedTo": "Assigned To",
"tasks_status": "Status",
"tasks_waitTime": "Wait Time",
"tasks_unclaimed": "[unclaimed]",
"tasks_noTasksTitle": "No tasks are assigned to you.",
"tasks_noTasksDescription": "Tasks that require your attention will appear here.",
"tasks_reassign": "Reassign",
"tasks_waiting": "Waiting {waitTime}",
"tasks_forNames": "for {allowedNames} to <b>{activityName}</b>",
"tasks_archivedAt": "Archived at <b>{activityName}</b>",
"tasks_scriptoria": "Scriptoria",
"tasks_storeLanguage": "Store Listing Language",
"tasks_appProjectURL": "App Project URL",
"tasks_downloadURL": "Download URL",
"tasks_submitted": "<b>{action}</b> submitted",
"tasks_reloaded": "Task updated by Scriptoria",
"projects_noBuilds": "No Builds Yet",
"projects_latestBuild": "Latest Build ({version})",
"projects_buildPending": "Build Pending",
"projects_buildFailed": "Build Failed",
"projects_filter_org": "Organization Projects",
"projects_filter_own": "My Projects",
"projects_filter_active": "Active Projects",
"projects_filter_archived": "Archived Projects",
"projects_filter_all": "All Projects",
"projects_bulk_buildModal_title": "Perform Bulk Rebuild/Republish",
"filters_allProdDefs": "All projects that contain...",
"filters_dateRange": "Last Updated Date Between",
"projectImport_title": "Import Projects",
"projectImport_help": "Import Projects Help",
"projectImport_file": "Import JSON File",
"projectImport_success": "Project Import successfully created. You will receive an email when the import is completed.",
"project_title": "Project",
"project_orgContact": "Organization Contact",
"project_owner": "Project Owner",
"project_claimOwnership": "Claim Ownership",
"project_claimSuccess": "Succesfully Claimed",
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 | 🟡 Minor

Fix user-facing typos

Strings still contain typos (“clik”, “Succesfully”, “occured”), which would ship to users. Please correct these spellings.

Also applies to: 560-564

🤖 Prompt for AI Agents
In src/lib/locales/es-419.json around lines 323 to 366 (also check lines
560-564), there are user-facing typos: change "clik" to "click" and
"Succesfully" to "Successfully" (and fix any other misspellings like "occured"
-> "occurred" where present); update the corresponding JSON string values
accordingly, preserve existing punctuation and spacing, and run a quick JSON
syntax check after editing to ensure no accidental formatting changes.

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