-
-
Notifications
You must be signed in to change notification settings - Fork 9
New Crowdin updates #1196
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: develop
Are you sure you want to change the base?
New Crowdin updates #1196
Conversation
WalkthroughAdded 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
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)
✅ Passed checks (1 passed)
Poem
Pre-merge checks and finishing touches❌ Failed checks (1 inconclusive)
✅ Passed checks (2 passed)
✨ Finishing touches🧪 Generate unit tests
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.
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. Comment |
There was a problem hiding this 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
📒 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.
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.
"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.
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.
"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.
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.
"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.
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.
There was a problem hiding this 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 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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
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.
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 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.
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 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%)."
Summary by CodeRabbit