Conversation
- Updated localization files to include Ukrainian (uk-UA) translations. - Enhanced language picker and configuration to support Ukrainian. - Integrated Ukrainian language into date formatting and participant onboarding flows. - Added relevant onboarding cards and verification instructions in Ukrainian. This update improves accessibility for Ukrainian-speaking users and ensures a more inclusive experience across the platform.
…al components - Changed the label for Ukrainian from "Українська" to "Ukrainian" in the LanguagePicker. - Added Ukrainian language support to the CustomTopicModal with the code "uk-UA".
WalkthroughAdds Ukrainian (uk / uk‑UA) localization across frontend and backend: i18n config, locale messages, UI language options, date locale, onboarding/verification content, translation catalogs, backend seeds/allowed languages, and 10 new Ukrainian Jinja prompt templates. No API signatures changed. Changes
Estimated code review effort🎯 4 (Complex) | ⏱️ ~45 minutes Possibly related PRs
🚥 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
Caution
Some comments are outside the diff and can’t be posted inline due to platform limitations.
⚠️ Outside diff range comments (3)
echo/frontend/src/components/conversation/VerifiedArtefactsSection.tsx (1)
36-44: 🧹 Nitpick | 🔵 TrivialRefactor opportunity — centralize locale mapping into one shared constant.
LGTM on
uk, but this map is duplicated across multiple components; extract it to a shared i18n util to prevent locale drift.🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@echo/frontend/src/components/conversation/VerifiedArtefactsSection.tsx` around lines 36 - 44, The LANGUAGE_TO_LOCALE map in VerifiedArtefactsSection.tsx is duplicated across components; extract the constant into a shared i18n utility and import it everywhere to avoid drift. Create a single exported constant (e.g., LANGUAGE_TO_LOCALE) in a new or existing i18n module, move the mapping (including the "uk": "uk-UA" entry) there, update VerifiedArtefactsSection to import that constant instead of declaring it inline, and update other components that used their own copies to import the shared constant as well.echo/frontend/src/components/project/CustomTopicModal.tsx (1)
26-34: 🧹 Nitpick | 🔵 TrivialLGTM on the addition, but this duplicates
config.ts.The
uk-UAentry is correct. However, this localSUPPORTED_LANGUAGESduplicates the canonical list inconfig.ts. If someone adds a language to one but not the other, things drift. Consider deriving this from the centralized config.♻️ Optional: derive from centralized config
import { SUPPORTED_LANGUAGES as LOCALES } from "@/config"; const SUPPORTED_LANGUAGES = LOCALES.map((code) => ({ code, label: { "en-US": "English", "nl-NL": "Nederlands", "de-DE": "Deutsch", "fr-FR": "Français", "es-ES": "Español", "it-IT": "Italiano", "uk-UA": "Ukrainian", }[code] ?? code, }));🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@echo/frontend/src/components/project/CustomTopicModal.tsx` around lines 26 - 34, The SUPPORTED_LANGUAGES array in CustomTopicModal.tsx duplicates the canonical list in config.ts; remove the local constant and import/derive it from the centralized config (import SUPPORTED_LANGUAGES or SUPPORTED_LOCALES from "@/config"), then map those codes to the existing labels in CustomTopicModal (use the same label mapping currently used) so the component uses the single source of truth; update references to the local SUPPORTED_LANGUAGES symbol to the imported/derived value.echo/frontend/src/components/project/ProjectPortalEditor.tsx (1)
241-246:⚠️ Potential issue | 🟡 MinorType cast is stale — missing
"uk"and"it".The cast explicitly lists
"en" | "nl" | "de" | "fr" | "es"but omits"it"and the new"uk". If a project haslanguage: "uk", TypeScript won't catch it but the runtime will be fine. Still, keeping types tight prevents future footguns.🔧 Proposed fix
const projectLanguageCode = (project.language ?? "en") as | "en" | "nl" | "de" | "fr" - | "es"; + | "es" + | "it" + | "uk";🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed. In `@echo/frontend/src/components/project/ProjectPortalEditor.tsx` around lines 241 - 246, The explicit union cast for projectLanguageCode is missing the new "uk" and "it" options, so update the cast on projectLanguageCode (and any related handling of project.language) to include "uk" and "it" alongside "en"|"nl"|"de"|"fr"|"es" (e.g., "en" | "nl" | "de" | "fr" | "es" | "it" | "uk") so TypeScript correctly reflects allowed language values and prevents type mismatches at compile time.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@echo/frontend/src/components/language/LanguagePicker.tsx`:
- Around line 54-59: The Ukrainian entry in the language list uses the English
label "Ukrainian"; update the label property of that object (the entry with flag
"🇺🇦", iso639_1 "uk", language "uk-UA") to the native name "Українська" so it
matches the other native-language labels used by LanguagePicker.tsx.
In `@echo/frontend/src/locales/es-ES.po`:
- Around line 6403-6406: The Spanish translation in the msgstr for the string
referenced by ProjectPortalEditor
(src/components/project/ProjectPortalEditor.tsx) contains a gender/article
mistake: change "el descarga de audio" to the correct "la descarga de audio" in
the msgstr so it reads "...la reproducción de audio, la descarga de audio y la
retranscripción...".
- Around line 6411-6414: Update the Spanish translation for the msgid "When
finishing the conversation, participants who haven't verified yet will be
prompted to verify or skip" (referenced in ProjectPortalEditor.tsx:1269) to use
more natural UX phrasing; replace the current msgstr with a clearer sentence
such as "Cuando finalices la conversación, se les pedirá a los participantes que
no hayan verificado que verifiquen o que omitan" to improve readability and
consistency.
In `@echo/server/prompt_templates/system_report.uk.jinja`:
- Around line 16-23: The Ukrainian system report template contains an English
sentence inside the user_instructions block ("The report creator has provided
the following guidance..."); update that string in system_report.uk.jinja to its
proper Ukrainian translation so the entire prompt is written in Ukrainian,
preserving the surrounding Jinja block and the variable interpolation
(user_instructions and the replace filters) and keeping the tag markers
<user_instructions>...</user_instructions> intact.
---
Outside diff comments:
In `@echo/frontend/src/components/conversation/VerifiedArtefactsSection.tsx`:
- Around line 36-44: The LANGUAGE_TO_LOCALE map in VerifiedArtefactsSection.tsx
is duplicated across components; extract the constant into a shared i18n utility
and import it everywhere to avoid drift. Create a single exported constant
(e.g., LANGUAGE_TO_LOCALE) in a new or existing i18n module, move the mapping
(including the "uk": "uk-UA" entry) there, update VerifiedArtefactsSection to
import that constant instead of declaring it inline, and update other components
that used their own copies to import the shared constant as well.
In `@echo/frontend/src/components/project/CustomTopicModal.tsx`:
- Around line 26-34: The SUPPORTED_LANGUAGES array in CustomTopicModal.tsx
duplicates the canonical list in config.ts; remove the local constant and
import/derive it from the centralized config (import SUPPORTED_LANGUAGES or
SUPPORTED_LOCALES from "@/config"), then map those codes to the existing labels
in CustomTopicModal (use the same label mapping currently used) so the component
uses the single source of truth; update references to the local
SUPPORTED_LANGUAGES symbol to the imported/derived value.
In `@echo/frontend/src/components/project/ProjectPortalEditor.tsx`:
- Around line 241-246: The explicit union cast for projectLanguageCode is
missing the new "uk" and "it" options, so update the cast on projectLanguageCode
(and any related handling of project.language) to include "uk" and "it"
alongside "en"|"nl"|"de"|"fr"|"es" (e.g., "en" | "nl" | "de" | "fr" | "es" |
"it" | "uk") so TypeScript correctly reflects allowed language values and
prevents type mismatches at compile time.
🪄 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: ASSERTIVE
Plan: Pro
Run ID: 74b040f3-ecb7-42f4-934a-be16d90cbb26
📒 Files selected for processing (40)
echo/frontend/lingui.config.tsecho/frontend/src/components/announcement/utils/dateUtils.tsecho/frontend/src/components/conversation/VerifiedArtefactsSection.tsxecho/frontend/src/components/language/LanguagePicker.tsxecho/frontend/src/components/participant/ParticipantOnboardingCards.tsxecho/frontend/src/components/participant/hooks/useOnboardingCards.tsecho/frontend/src/components/participant/verify/VerifiedArtefactsList.tsxecho/frontend/src/components/participant/verify/VerifySelection.tsxecho/frontend/src/components/project/CustomTopicModal.tsxecho/frontend/src/components/project/ProjectPortalEditor.tsxecho/frontend/src/components/project/ProjectQRCode.tsxecho/frontend/src/config.tsecho/frontend/src/hooks/useLanguage.tsecho/frontend/src/locales/de-DE.poecho/frontend/src/locales/de-DE.tsecho/frontend/src/locales/en-US.poecho/frontend/src/locales/en-US.tsecho/frontend/src/locales/es-ES.poecho/frontend/src/locales/es-ES.tsecho/frontend/src/locales/fr-FR.poecho/frontend/src/locales/fr-FR.tsecho/frontend/src/locales/it-IT.poecho/frontend/src/locales/it-IT.tsecho/frontend/src/locales/nl-NL.poecho/frontend/src/locales/nl-NL.tsecho/frontend/src/locales/uk-UA.poecho/frontend/src/locales/uk-UA.tsecho/server/dembrane/prompts.pyecho/server/dembrane/seed.pyecho/server/dembrane/service/project.pyecho/server/prompt_templates/context_conversations.uk.jinjaecho/server/prompt_templates/default_whisper_prompt.uk.jinjaecho/server/prompt_templates/generate_conversation_summary.uk.jinjaecho/server/prompt_templates/get_reply_brainstorm.uk.jinjaecho/server/prompt_templates/get_reply_summarize.uk.jinjaecho/server/prompt_templates/get_reply_system.uk.jinjaecho/server/prompt_templates/summary.uk.jinjaecho/server/prompt_templates/system_chat.uk.jinjaecho/server/prompt_templates/system_report.uk.jinjaecho/server/prompt_templates/translate_transcription.uk.jinja
| #: src/components/project/ProjectPortalEditor.tsx:1480 | ||
| msgid "When enabled, all new transcripts will have personal information (names, emails, phone numbers, addresses) replaced with placeholders. Anonymized conversations also disable audio playback, audio download, and retranscription to protect participant privacy. This cannot be undone for already-processed conversations." | ||
| msgstr "Cuando esté activado, todas las nuevas transcripciones tendrán información personal (nombres, emails, números de teléfono, direcciones) reemplazadas por marcadores de posición. Las conversaciones anónimas también desactivan la reproducción de audio, el descarga de audio y la retranscripción para proteger la privacidad de los participantes. Esto no se puede deshacer para conversaciones ya procesadas." | ||
|
|
There was a problem hiding this comment.
Minor grammar issue in Spanish translation.
Line 6405 uses "el descarga de audio"; it should be "la descarga de audio".
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@echo/frontend/src/locales/es-ES.po` around lines 6403 - 6406, The Spanish
translation in the msgstr for the string referenced by ProjectPortalEditor
(src/components/project/ProjectPortalEditor.tsx) contains a gender/article
mistake: change "el descarga de audio" to the correct "la descarga de audio" in
the msgstr so it reads "...la reproducción de audio, la descarga de audio y la
retranscripción...".
| #: src/components/project/ProjectPortalEditor.tsx:1269 | ||
| msgid "When finishing the conversation, participants who haven't verified yet will be prompted to verify or skip" | ||
| msgstr "Cuando finalices la conversación, los participantes que no han verificado aún serán solicitados para verificar o saltar" | ||
|
|
There was a problem hiding this comment.
Spanish copy is understandable but unnatural; improve phrasing for clarity.
Line 6413 ("serán solicitados para verificar o saltar") reads awkwardly. Consider standard Spanish UX phrasing like “se les pedirá verificar u omitir”.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.
In `@echo/frontend/src/locales/es-ES.po` around lines 6411 - 6414, Update the
Spanish translation for the msgid "When finishing the conversation, participants
who haven't verified yet will be prompted to verify or skip" (referenced in
ProjectPortalEditor.tsx:1269) to use more natural UX phrasing; replace the
current msgstr with a clearer sentence such as "Cuando finalices la
conversación, se les pedirá a los participantes que no hayan verificado que
verifiquen o que omitan" to improve readability and consistency.
There was a problem hiding this comment.
Actionable comments posted: 1
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.
Inline comments:
In `@echo/server/prompt_templates/system_report.uk.jinja`:
- Around line 7-10: The template injects raw conversation.name,
conversation.tags and conversation.transcript (and similar user_instructions
fields) into XML-like blocks, allowing injected "<...>" to break boundaries; fix
by escaping or wrapping interpolated fields: apply Jinja escaping (e.g., use {{
conversation.name|e }}, {{ conversation.tags|e }}) for attribute-like fields and
put long free-text fields like {{ conversation.transcript }} and
user_instructions inside a safe container such as a CDATA block (<![CDATA[{{
conversation.transcript }}]]>) or use {{ conversation.transcript|e }} to ensure
any angle brackets/entities are encoded and cannot break the XML-like sections.
🪄 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: ASSERTIVE
Plan: Pro
Run ID: 008ef4df-ecc6-4dba-8bdd-89eefc69ae48
📒 Files selected for processing (1)
echo/server/prompt_templates/system_report.uk.jinja
Summary by CodeRabbit