Conversation
|
Warning Rate limit exceeded
⌛ How to resolve this issue?After the wait time has elapsed, a review can be triggered using the We recommend that you space out your commits to avoid hitting the rate limit. 🚦 How do rate limits work?CodeRabbit enforces hourly rate limits for each developer per organization. Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout. Please see our FAQ for further information. 📝 WalkthroughWalkthroughAdded Spanish (es-419) and French (fr-FR) localization JSON files for the UI and the server email service, providing translated UI strings, pluralization rules, match/context variants, dynamic placeholders, and templated email subjects/bodies for notifications, projects, builds, products, invites, reviews, errors, and system messages. Changes
Estimated code review effort🎯 2 (Simple) | ⏱️ ~10 minutes Poem
🚥 Pre-merge checks | ✅ 3✅ Passed checks (3 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing touches🧪 Generate unit tests (beta)
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. Comment |
There was a problem hiding this comment.
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
📒 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)
| "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": [ |
There was a problem hiding this comment.
💡 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.
| "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": [ |
There was a problem hiding this comment.
💡 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.jsonLength 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.jsoninto 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.
| "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>", |
There was a problem hiding this comment.
💡 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.jsonLength 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.
| "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>", |
There was a problem hiding this comment.
💡 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.
There was a problem hiding this comment.
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 mergeThese 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.
📒 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”
| "declarations": [ | ||
| "local countPlural = amount: plural" | ||
| ], | ||
| "selectors": [ | ||
| "countPlural" | ||
| ], | ||
| "match": { | ||
| "amount=0": "No Product Files", | ||
| "countPlural=one": "{amount} Product File", | ||
| "countPlural=other": "{amount} Product Files" | ||
| } | ||
| } | ||
| ], |
There was a problem hiding this comment.
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.
| "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.
| "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)", |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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 translationsKeys 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 textThese 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 elsewhereMost 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” textThe 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 nameKey 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
📒 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
There was a problem hiding this comment.
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 translatorsKey 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 renderingThese 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-FRYou’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
📒 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 localeAlmost 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%)."
There was a problem hiding this comment.
Actionable comments posted: 2
♻️ Duplicate comments (1)
src/lib/locales/es-419.json (1)
3-9: Spanish strings missingThese 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
📒 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
| "declarations": [ | ||
| "local countPlural = amount: plural" | ||
| ], | ||
| "selectors": [ | ||
| "countPlural" | ||
| ], | ||
| "match": { | ||
| "amount=0": "No Product Files", | ||
| "countPlural=one": "{amount} Product File", | ||
| "countPlural=other": "{amount} Product Files" | ||
| } |
There was a problem hiding this comment.
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.
| "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", |
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Fix all issues with AI agents
In `@src/lib/locales/es-419.json`:
- Line 118: The localized string for "deletePrompt_warning" contains a double
space after the comma ("deleted, all"); update the value for the
"deletePrompt_warning" key to replace the double space with a single space so it
reads "deleted, all" while preserving the rest of the string and HTML tags.
♻️ Duplicate comments (5)
src/lib/locales/es-419.json (5)
2-9: Strings remain in English for Spanish (LatAm) localeThese UI strings are still in English. Spanish-speaking users selecting
es-419will see English text for "Welcome to Scriptoria", "Contact Us", etc. Ensure the Crowdin export contains actual Spanish translations before merging.
326-328: Typo: "clik" → "click"User-facing string contains spelling error that will ship to production.
368-369: Typo: "Succesfully" → "Successfully"
571-574: Typo: "occured" → "occurred" (two occurrences)Both
orgMembership_unexpectedandorgMembership_errorcontain the same spelling error.
268-282: Missinginput amountdeclaration in plural blockThis pluralization block uses
amountin the plural selector but lacks the requiredinput amountdeclaration that other blocks have (compare to lines 25-27). Most message compilers will fail to resolve the variable.Suggested fix
"products_numArtifacts": [ { "declarations": [ + "input amount", "local countPlural = amount: plural" ],
📜 Review details
Configuration used: defaults
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (2)
src/lib/locales/es-419.jsonsrc/lib/locales/fr-FR.json
🚧 Files skipped from review as they are similar to previous changes (1)
- src/lib/locales/fr-FR.json
🔇 Additional comments (3)
src/lib/locales/es-419.json (3)
23-82: Pluralization structure is correct, but values are untranslatedThe pluralization blocks for
localePicker_region,localePicker_name,localePicker_tag, andlocalePicker_varianthave properly structured declarations withinput countand plural transformations. However, the actual values remain in English (e.g., "Region"/"Regions" instead of "Región"/"Regiones").
125-145: Simple match patterns look correctThe
directory_titleandsidebar_myTasksblocks use straightforward value matching (e.g.,numProjects=0,count=*) rather than plural transformations, so they don't require explicit input declarations. This pattern is consistent throughout the file.
1-585: Overall: File appears to be an incomplete Crowdin exportThe
es-419.jsonfile is structurally valid but nearly all strings remain in English. For a Spanish (Latin America) locale file, this suggests the Crowdin export either failed to pull in translations or the source strings were exported without their translated counterparts.Before merging, verify that:
- Spanish translations exist in Crowdin for these keys
- The export process correctly mapped translations to this file
✏️ Tip: You can disable this entire section by setting review_details to false in your review settings.
| "models_delete": "Delete {name}", | ||
| "models_createSuccess": "{name} was successfully created!", | ||
| "models_updateSuccess": "{name} was successfully updated!", | ||
| "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>", |
There was a problem hiding this comment.
Minor: Double space in string
There's an extra space after the comma in "deleted, all".
Suggested fix
- "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>",
+ "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>",📝 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.
| "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>", | |
| "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>", |
🤖 Prompt for AI Agents
In `@src/lib/locales/es-419.json` at line 118, The localized string for
"deletePrompt_warning" contains a double space after the comma ("deleted,
all"); update the value for the "deletePrompt_warning" key to replace the double
space with a single space so it reads "deleted, all" while preserving the rest
of the string and HTML tags.
There was a problem hiding this comment.
Actionable comments posted: 3
🤖 Fix all issues with AI agents
In `@src/lib/locales/fr-FR.json`:
- Around line 341-343: The file contains user-facing typos: change "clik" to
"click" inside the errors_verifyEmailDescription value, change "Succesfully" to
"Successfully" where that key/value exists, and change "occured" to "occurred"
where that typo appears (check the other locale keys mentioned around the same
region). Update each JSON string value accordingly (preserve capitalization and
surrounding punctuation) so the three misspellings are corrected across the
fr-FR.json entries.
- Line 121: The JSON value for the localization key "deletePrompt_warning"
contains an unintended double space after the comma ("deleted, all"); update
the string for "deletePrompt_warning" to use a single space there (i.e.,
"deleted, all related information...") and save the fr-FR.json file ensuring the
JSON string and HTML tags remain unchanged otherwise.
- Around line 271-275: The plural selector references amount but it isn't
declared; inside the "products_numArtifacts" message declarations add a
declaration for the amount input (for example: "local amount = 0") alongside the
existing "local countPlural = amount: plural" so the plural input is defined
before use.
| "models_delete": "Delete {name}", | ||
| "models_createSuccess": "{name} was successfully created!", | ||
| "models_updateSuccess": "{name} was successfully updated!", | ||
| "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>", |
There was a problem hiding this comment.
Remove the double space in deletePrompt_warning.
User-facing formatting issue.
Suggested fix
- "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>",
+ "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>",📝 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.
| "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>", | |
| "deletePrompt_warning": "• If a product is deleted, all related information about it, including the latest version code and paths to published files, will also be deleted.<br />• Deleting the specified product <b>can't be undone.</b>", |
🤖 Prompt for AI Agents
In `@src/lib/locales/fr-FR.json` at line 121, The JSON value for the localization
key "deletePrompt_warning" contains an unintended double space after the comma
("deleted, all"); update the string for "deletePrompt_warning" to use a single
space there (i.e., "deleted, all related information...") and save the
fr-FR.json file ensuring the JSON string and HTML tags remain unchanged
otherwise.
| "products_numArtifacts": [ | ||
| { | ||
| "declarations": [ | ||
| "local countPlural = amount: plural" | ||
| ], |
There was a problem hiding this comment.
Declare the plural input for {amount}.
The plural selector references amount but doesn’t declare the input, which can break message compilation.
Suggested fix
"products_numArtifacts": [
{
"declarations": [
+ "input amount",
"local countPlural = amount: plural"
],🤖 Prompt for AI Agents
In `@src/lib/locales/fr-FR.json` around lines 271 - 275, The plural selector
references amount but it isn't declared; inside the "products_numArtifacts"
message declarations add a declaration for the amount input (for example: "local
amount = 0") alongside the existing "local countPlural = amount: plural" so the
plural input is defined before use.
| "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)", |
There was a problem hiding this comment.
Fix typos in user-facing strings.
Typos (“clik”, “Succesfully”, “occured”) will ship to users.
Suggested fix
- "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: 384-384, 583-586
🤖 Prompt for AI Agents
In `@src/lib/locales/fr-FR.json` around lines 341 - 343, The file contains
user-facing typos: change "clik" to "click" inside the
errors_verifyEmailDescription value, change "Succesfully" to "Successfully"
where that key/value exists, and change "occured" to "occurred" where that typo
appears (check the other locale keys mentioned around the same region). Update
each JSON string value accordingly (preserve capitalization and surrounding
punctuation) so the three misspellings are corrected across the fr-FR.json
entries.
Summary by CodeRabbit
✏️ Tip: You can customize this high-level summary in your review settings.