Add refresh-keys command and update all language packs - #74
Conversation
|
Warning Review limit reached
More reviews will be available in 20 minutes and 40 seconds. Learn how PR review limits work. Your organization has run out of usage credits. Purchase more in the billing tab. ⌛ How to resolve this issue?After more reviews become available, 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 include higher PR review limits than trial, open-source, and free plans. In all cases, reviews become available again over time. During sustained high-volume PR review activity, CodeRabbit may temporarily slow when the next review becomes available. Please see our Fair Usage Limits Policy for further information. ℹ️ Review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (4)
📝 WalkthroughWalkthroughThis PR introduces a ChangesRefresh Keys Without Translation
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~25 minutes Poem
✨ Finishing Touches🧪 Generate unit tests (beta)
|
There was a problem hiding this comment.
Actionable comments posted: 5
🧹 Nitpick comments (4)
translations/italian.json (1)
1096-1096: 💤 Low valueConsider translating "Maintainer".
The term "Maintainer" appears untranslated. While it's commonly used in open-source contexts, for consistency with other role/user-related terms in Italian (e.g., "Amministratore" for Administrator), consider translating it to "Manutentore" or "Responsabile".
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@translations/italian.json` at line 1096, The "Maintainer" translation key in translations/italian.json currently keeps the English value; update the value for the "Maintainer" key to an Italian equivalent (e.g., "Manutentore" or "Responsabile") to match other role translations and maintain consistency across the locale file.translations/korean.json (1)
1315-1319: ⚡ Quick winPasskey terminology is mixed (English/Korean) across related strings.
Some entries transliterate/retain “Passkey” while surrounding Korean text is localized; this can feel inconsistent in the same flow. Recommend deciding one style (keep “Passkey” brand-like term everywhere, or use a Korean equivalent consistently).
Also applies to: 1557-1561, 2031-2031, 2450-2450
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@translations/korean.json` around lines 1315 - 1319, Translation strings for passkey-related keys ("Passkey", "Passkey (Sign in with Passkey)", "Passkey name (e.g., MacBook Touch ID)", "Passkeys", and the long description) mix English "Passkey"/"Passkeys" with Korean text; pick a consistent style (either keep the English brand "Passkey" everywhere or fully localize to a Korean equivalent) and update all related keys mentioned (also at the other occurrences noted) to use that chosen term consistently and adjust surrounding Korean phrasing accordingly so the flow reads uniformly.translations/portuguese (brazil).json (1)
19-19: ⚡ Quick winPossible missing translation for "Labels".
The term "Labels" appears untranslated in this entry, but elsewhere in the file (line 1034, line 38, line 1214) "Labels"/"Label" is consistently translated as "Etiquetas"/"Etiqueta". Consider translating to maintain terminology consistency:
- "{0} Labels": "{0} Labels", + "{0} Labels": "{0} Etiquetas",🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@translations/portuguese` (brazil).json at line 19, The translation entry for the key "{0} Labels" is still in English; update its value to the Portuguese equivalent used elsewhere ("{0} Etiquetas") to keep terminology consistent with other keys like "Label"/"Etiqueta" and occurrences on lines referenced (e.g., the same "{0} Labels" key).translations/serbian.json (1)
1-2540: ⚡ Quick winMachine-generated translations require native-speaker review.
As noted in the PR description, these translations are machine-generated and need review by native Serbian speakers. While the technical structure (JSON format, placeholders like
{0}, HTML tags like<strong>) is correctly preserved, the quality and accuracy of the Serbian translations should be validated by someone fluent in Serbian to ensure:
- Correct grammar and natural phrasing
- Appropriate terminology for technical concepts (passkeys, multisig, LNURL, etc.)
- Cultural and linguistic appropriateness
- Consistency with existing translations
The technical implementation is sound, but human linguistic validation is recommended before relying on these translations in production.
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@translations/serbian.json` around lines 1 - 2540, Summary: The JSON contains machine-generated Serbian translations that require native-speaker linguistic review. Fix: Have a native Serbian reviewer proofread all values in translations/serbian.json (including keys like "_maintainer" and entries such as "Passkeys", "LNURL", "Lightning", "BIP39 Seed", "PSBT", "xpub", and others), ensuring grammar, natural phrasing, consistent technical terminology, and cultural appropriateness; do not alter placeholders or HTML tags (e.g. {0}, {1}, <strong>, <code>), keep JSON structure intact, and update any mistranslated strings for consistency with existing translations and UI context before merging and testing in the running UI.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@translations/italian.json`:
- Line 78: The "Abort" key in the translations JSON is still in English; update
the value for the "Abort" key to the appropriate Italian translation (e.g.,
replace "Abort" : "Abort" with "Abort" : "Annulla" to match other action labels)
so the Italian localization uses the translated string.
In `@translations/korean.json`:
- Line 1057: The translation for the key "Lightning" is inconsistent with nearby
entries; change its value from "Lightning" to the Korean equivalent "라이트닝" in
the translations JSON (update the "Lightning" key's value) so the UI matches
surrounding translations.
- Line 1096: The translation key "Maintainer" currently mapped to "관리자" is
ambiguous with "Administrator"; update the Korean value for the "Maintainer"
JSON key to a distinct, accurate term such as "유지보수 담당자" (or "유지 관리자") to
clearly differentiate it from the Administrator translation, ensuring the change
is applied to the "Maintainer" entry in translations/korean.json.
In `@translations/romanian.json`:
- Line 1808: Replace the untranslated value for the JSON key "Signer" with the
Romanian translation "Semnatar" to match the existing translations for
signer/semnatar used elsewhere (e.g., "Signer key submitted successfully.",
"Submit signer key"); update the value for the key "Signer" from "Signer" to
"Semnatar" ensuring the capitalization matches other top-level labels.
In `@Translator/Services/TranslationOrchestrator.cs`:
- Around line 584-611: The code treats an empty languageCodes as an active
filter, causing all files to be skipped; change the creation of filterCodes so
an empty languageCodes is treated as "no filter" (null) — e.g., set filterCodes
to null when languageCodes is null or has no elements and only call
ToHashSet(StringComparer.OrdinalIgnoreCase) when languageCodes.Any() is true;
this will make the later check (filterCodes != null &&
!filterCodes.Contains(code)) behave correctly and allow the translationFiles
foreach to process all files when no languages were specified.
---
Nitpick comments:
In `@translations/italian.json`:
- Line 1096: The "Maintainer" translation key in translations/italian.json
currently keeps the English value; update the value for the "Maintainer" key to
an Italian equivalent (e.g., "Manutentore" or "Responsabile") to match other
role translations and maintain consistency across the locale file.
In `@translations/korean.json`:
- Around line 1315-1319: Translation strings for passkey-related keys
("Passkey", "Passkey (Sign in with Passkey)", "Passkey name (e.g., MacBook Touch
ID)", "Passkeys", and the long description) mix English "Passkey"/"Passkeys"
with Korean text; pick a consistent style (either keep the English brand
"Passkey" everywhere or fully localize to a Korean equivalent) and update all
related keys mentioned (also at the other occurrences noted) to use that chosen
term consistently and adjust surrounding Korean phrasing accordingly so the flow
reads uniformly.
In `@translations/portuguese` (brazil).json:
- Line 19: The translation entry for the key "{0} Labels" is still in English;
update its value to the Portuguese equivalent used elsewhere ("{0} Etiquetas")
to keep terminology consistent with other keys like "Label"/"Etiqueta" and
occurrences on lines referenced (e.g., the same "{0} Labels" key).
In `@translations/serbian.json`:
- Around line 1-2540: Summary: The JSON contains machine-generated Serbian
translations that require native-speaker linguistic review. Fix: Have a native
Serbian reviewer proofread all values in translations/serbian.json (including
keys like "_maintainer" and entries such as "Passkeys", "LNURL", "Lightning",
"BIP39 Seed", "PSBT", "xpub", and others), ensuring grammar, natural phrasing,
consistent technical terminology, and cultural appropriateness; do not alter
placeholders or HTML tags (e.g. {0}, {1}, <strong>, <code>), keep JSON structure
intact, and update any mistranslated strings for consistency with existing
translations and UI context before merging and testing in the running UI.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 035ffa81-1bd8-421c-8199-31b470dca5aa
📒 Files selected for processing (25)
README.mdTranslator.Tests/CLI/CliTests.csTranslator.Tests/Services/FileWriterRefreshTests.csTranslator.Tests/Services/TranslationOrchestratorTests.csTranslator/Program.csTranslator/Services/BaseTranslationService.csTranslator/Services/FileWriter.csTranslator/Services/TranslationOrchestrator.csmanifest.jsontranslations/dutch.jsontranslations/french.jsontranslations/german.jsontranslations/hindi.jsontranslations/indonesian.jsontranslations/italian.jsontranslations/japanese.jsontranslations/korean.jsontranslations/norwegian.jsontranslations/portuguese (brazil).jsontranslations/romanian.jsontranslations/russian.jsontranslations/serbian.jsontranslations/spanish.jsontranslations/thai.jsontranslations/turkish.json
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com>
| "All Directions": "Todas las direcciones", | ||
| "All Labels": "Todas las Etiquetas", | ||
| "All Plugins": "Todos los plugins", | ||
| "All signer keys submitted": "Todas las claves de firmantes enviadas", |
There was a problem hiding this comment.
Todas las claves de los firmantes enviadas
| "Combine filters:": "Combinar filtros:", | ||
| "Comma-separated list of currencies (eg. USD,EUR,JPY)": "Lista separada por comas de monedas (ej. USD,EUR,JPY)", | ||
| "Compatible wallets": "Wallets compatibles", | ||
| "Complete signer collection before creating the multisig wallet.": "Completa la recopilación de firmantes antes de crear la billetera multisig.", |
There was a problem hiding this comment.
Completa la recopilación de los firmantes antes de crear la billetera multisig.
| "Contact Us": "Contáctanos", | ||
| "Container Name": "Nombre del contenedor", | ||
| "Continue": "Continuar", | ||
| "Continue multisig setup in progress": "Continuar la configuración multisig en curso", |
There was a problem hiding this comment.
Continuar la configuración de multisig en curso
| "Logout": "Cerrar sesión", | ||
| "Logs": "Registros", | ||
| "Mails": "Correos", | ||
| "Maintainer": "Maintainer", |
| "On-Chain Payout Processor": "Procesador de pagos On-Chain", | ||
| "On-chain wallets": "Billeteras on-chain", | ||
| "One or more selected users are invalid.": "Uno o más usuarios seleccionados no son válidos.", | ||
| "One or more signers no longer have wallet signing permission.": "Uno o más firmantes ya no tienen permiso de firma de billetera.", |
There was a problem hiding this comment.
"Uno o más firmantes ya no tienen permiso de firma de en la billetera."
| "Overpaid amount": "Cantidad pagada en exceso", | ||
| "Overpaid amount cannot be calculated": "No se puede calcular el monto pagado en exceso", | ||
| "Override the block explorers used": "Anular los exploradores de bloques utilizados", | ||
| "Override the server default maximum number of stores for this user. Leave empty to use the server default.": "Anular el número máximo de tiendas predeterminado del servidor para este usuario. Dejar vacío para usar el valor predeterminado del servidor.", |
There was a problem hiding this comment.
"Anular el número máximo de tiendas predeterminadas del servidor para este usuario. Dejar vacío para usar el valor predeterminado del servidor."
| "Reference Id": "ID de referencia", | ||
| "Refund": "Reembolso", | ||
| "Refund {0}": "Reembolsar {0}", | ||
| "Refund pull payment created.": "Reembolso de pago pull creado.", |
There was a problem hiding this comment.
Se ha creado el pago de reembolso.
| "Request {0} - {1}/{2} ({3}).": "Solicitud {0} - {1}/{2} ({3}).", | ||
| "Request Pairing": "Solicitar Emparejamiento", | ||
| "Request signer keys from store users": "Solicitar claves de firmantes a los usuarios de la tienda", | ||
| "Request signer keys, collect account keys, and create the multisig wallet": "Solicita las claves de firmantes, recopila las claves de cuenta y crea la billetera multisig", |
There was a problem hiding this comment.
"Solicita las claves de los firmantes, recopila las claves de cuenta y crea la billetera multisig"

Two changes here.
refresh-keyscommandPulls the current English strings and inserts any that are missing into the translation files as placeholders. Unlike
update, it doesn't use OpenRouter (no API key needed), it's insert-only (never deletes keys, so DI-registered strings stay), and it leaves existing lines untouched. Pass--source-fileto read a local Translations.Default.cs instead of downloading from GitHub.Added the ~250 new strings (passkeys, multisig signing, subscriptions/monetization, store quotas, translation management) and translated them for each language, following each file's existing tone and terminology. Only the
new strings changed - existing translations and key ordering are untouched. manifest.json regenerated to match.
Tests: added unit + CLI coverage for refresh-keys; validate-packs reports no new issues.
Note: the new translations are machine-generated, so native-speaker review will be needed.