Skip to content

New Crowdin updates - #1

Closed
thomasboom wants to merge 20 commits into
mainfrom
l10n_main
Closed

New Crowdin updates#1
thomasboom wants to merge 20 commits into
mainfrom
l10n_main

Conversation

@thomasboom

@thomasboom thomasboom commented Feb 7, 2026

Copy link
Copy Markdown
Owner

Summary by cubic

Imported the latest Crowdin translations and added 20 locale files under lib/l10n to expand UI language support. No code changes; only new localization resources.

  • New Features
    • Added localization bundles for: ar, bg, de, es-ES, fr, he, hi, it, ja, ko, nl, pl, pt-PT, ru, sw, th, tr, uk, vi, zh-CN.
    • Strings mirror the base app_en.arb key set for consistency.

Written for commit 8df3a06. Summary will update on new commits.

@vercel

vercel Bot commented Feb 7, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
openbreath Canceled Canceled Feb 7, 2026 11:50am

@coderabbitai

coderabbitai Bot commented Feb 7, 2026

Copy link
Copy Markdown
📝 Walkthrough

Walkthrough

This pull request introduces localization resource files for twenty languages (Arabic, Bulgarian, German, Spanish, French, Hebrew, Hindi, Italian, Japanese, Korean, Dutch, Polish, Portuguese, Russian, Swahili, Thai, Turkish, Ukrainian, Vietnamese, and Simplified Chinese). Each language directory contains a new JSON file at lib/l10n with key-value pairs mapping localization identifiers to English UI strings. The resources cover app labels, exercise titles and descriptions, stage names, phase instructions, settings options, and policy text. No functional code, logic, or control flow changes are introduced; these are static data assets for internationalization support.

🚥 Pre-merge checks | ✅ 2 | ❌ 1
❌ Failed checks (1 inconclusive)
Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'New Crowdin updates' is vague and generic, using a non-descriptive term that fails to convey what specific changes were made in the changeset. Replace with a more descriptive title that specifies the main change, such as 'Add 20 localization files for multi-language support' or 'Add Crowdin translations for ar, bg, de, and 17 other locales'.
✅ Passed checks (2 passed)
Check name Status Explanation
Description check ✅ Passed The description clearly relates to the changeset, explaining that 20 locale files were added under lib/l10n for UI language support with no code changes, which matches the actual file additions.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch l10n_main

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@kilo-code-bot

kilo-code-bot Bot commented Feb 7, 2026

Copy link
Copy Markdown

Code Review Summary

Status: 2 Issues Found | Recommendation: Address before merge

Overview

Severity Count
WARNING 2
Issue Details (click to expand)

WARNING

File Issue
Per-language directories (ar/lib/l10n, bg/lib/l10n, etc.) Incorrect localization file structure - should use ARB files in lib/l10n/ directory, not per-language subdirectories
Per-language JSON files All files contain English text instead of actual translations for each language
Files Reviewed (20 files)
  • ar/lib/l10n
  • bg/lib/l10n
  • de/lib/l10n
  • es-ES/lib/l10n
  • fr/lib/l10n
  • he/lib/l10n
  • hi/lib/l10n
  • it/lib/l10n
  • ja/lib/l10n
  • ko/lib/l10n
  • nl/lib/l10n
  • pl/lib/l10n
  • pt-PT/lib/l10n
  • ru/lib/l10n
  • sw/lib/l10n
  • th/lib/l10n
  • tr/lib/l10n
  • uk/lib/l10n
  • vi/lib/l10n
  • zh-CN/lib/l10n

Comment thread ar/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread bg/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread de/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread es-ES/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread fr/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread th/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread tr/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread uk/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread vi/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

Comment thread zh-CN/lib/l10n
@@ -0,0 +1,189 @@
{

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

WARNING: Incorrect localization file structure - the app uses ARB files directly in lib/l10n/ directory, not per-language subdirectories. These files won't be used by the app.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 5

🤖 Fix all issues with AI agents
In `@de/lib/l10n`:
- Around line 1-189: All locale JSON files were mistakenly exported with source
English strings (e.g., keys like "settings", "exerciseTitle_relaxingBreath",
"phase_instruct_shouldersUp" are English across ar/bg/de/.../zh-CN) and five new
locales (he, sw, th, uk, vi) are missing from the language picker; fix by
reconfiguring the Crowdin export to include only completed translations,
re-export the locale files so each language file contains proper translated
values (not the source strings), replace the current identical JSON bundles
(referencing keys like "settings" and "exerciseTitle_*") with the corrected
exports, and update the language picker implementation to include the
newly-added locales (Hebrew, Swahili, Thai, Ukrainian, Vietnamese) so they
appear in the UI when translation files are present.
- Around line 8-24: The locale files are missing five language picker keys:
languageHebrew, languageSwahili, languageThai, languageUkrainian, and
languageVietnamese; add these five keys to every locale file that defines the
other language* entries (same place as languageGerman/languagePolish) with
appropriate translated display strings for each locale, matching the
style/format of the existing entries and keeping punctuation/commas consistent
so the settings UI can list and select the new locales.

In `@sw/lib/l10n`:
- Around line 1-189: The sw locale file contains untranslated strings: Ukrainian
and Polish appear to be fully English (e.g., keys like
exerciseTitle_relaxingBreath, exerciseIntro_relaxingBreath,
stageTitle_nervousSystemBalance, stageTitle_deepRelaxation are still English)
and Swahili has UI strings translated but exercise titles/intros and stageTitle
entries remain English; to fix, confirm in Crowdin which locales are marked
complete, re-export only the locales that are fully translated, and update the
sw locale by adding proper translations for exerciseTitle_*, exerciseIntro_*,
and stageTitle_* (and ensure uk/pl receive full exports) so the keys mentioned
above are localized correctly before committing.
- Around line 7-24: The language selector is missing five locale entries; add
the following keys to the same JSON/ARB object in sw/lib/l10n alongside the
other "language..." keys: languageHebrew ("Hebrew"), languageSwahili
("Swahili"), languageThai ("Thai"), languageUkrainian ("Ukrainian"), and
languageVietnamese ("Vietnamese") so the UI can display these locales; ensure
the new keys follow the existing naming pattern (e.g., languageHebrew) and are
inserted with the other language entries in the file.

In `@th/lib/l10n`:
- Around line 7-24: Add the five missing language selector keys (languageThai,
languageHebrew, languageVietnamese, languageUkrainian, languageSwahili) to every
locale resource so the settings UI can show the new locales; update each
app_*.arb and each locale directory file under lib/l10n to include these keys
with the appropriate translated label strings alongside the existing keys such
as "language", "languageEnglish", "languageDutch", etc., ensuring key names
exactly match languageThai, languageHebrew, languageVietnamese,
languageUkrainian, and languageSwahili.

Comment thread de/lib/l10n
Comment on lines +1 to +189
{
"appTitle": "BreathSpace",
"searchHint": "Search exercises...",
"progressive": "Progressive",
"stretching": "Stretching",
"settings": "Settings",
"language": "Language",
"languageSystem": "System default",
"languageEnglish": "English",
"languageDutch": "Dutch",
"languageSpanish": "Spanish",
"languageItalian": "Italian",
"languageGerman": "German",
"languageChinese": "Chinese",
"languageBulgarian": "Bulgarian",
"languageFrench": "French",
"languageJapanese": "Japanese",
"languagePortuguese": "Portuguese",
"languageRussian": "Russian",
"languageArabic": "Arabic",
"languageKorean": "Korean",
"languageHindi": "Hindi",
"languageTurkish": "Turkish",
"languagePolish": "Polish",
"theme": "Theme",
"themeSystem": "System Default",
"themeLight": "Light",
"themeDark": "Dark",
"themeOled": "OLED",
"useListView": "Use List View",
"viewMode": "View Mode",
"listView": "List View",
"aiMode": "AI Mode",
"quizMode": "Quiz Mode",
"start": "Start",
"noExercisesFound": "No exercises found.",
"inhale": "Inhale",
"exhale": "Exhale",
"hold": "Hold calmly",
"throughNose": "through nose",
"throughMouth": "through mouth",
"whileHoldingBreath": "while holding breath",
"close": "Close",
"exerciseInvalid": "Exercise not found or invalid pattern.",
"progressiveExercise": "Progressive Exercise",
"pattern": "Pattern",
"soundEffects": "Sound Effects",
"voiceGuide": "Voice Guide",
"voiceGuideOff": "Off",
"voiceGuideThomas": "Thomas",
"music": "Music",
"musicOff": "Off",
"musicNature": "Nature",
"musicLofi": "LoFi",
"musicPiano": "Piano",
"replayIntro": "Replay Intro",
"disableAIFeatures": "Disable AI features",
"disableAIFeaturesSubtitle": "Turn off AI-powered recommendations",
"welcomeTitle": "Welcome to BreathSpace",
"welcomeSubtitle": "Your space. Slow down, anytime.",
"getStarted": "Get Started",
"promptCacheTitle": "AI Prompt Cache",
"promptCacheSubtitle": "Cached responses for faster recommendations",
"promptCacheEntries": "entries",
"promptCacheClear": "Clear Cache",
"promptCacheCleared": "Prompt cache cleared",
"exerciseFinishedTitle": "Exercise finished",
"exerciseFinishedSubtitle": "I hope you feel better.",
"backToHome": "Back to Home",
"copyLink": "Copy Link",
"copyExerciseLink": "Copy Exercise Link",
"linkCopied": "Link copied to clipboard",
"termsAgreementPrefix": "By continuing, you agree to our ",
"privacyPolicy": "Privacy Policy",
"termsAgreementSuffix": ".",
"exerciseTitle_relaxingBreath": "Relaxing Breath",
"exerciseIntro_relaxingBreath": "Promotes sleep and reduces anxiety.",
"exerciseTitle_boxBreathingNavySeals": "Box Breathing",
"exerciseIntro_boxBreathingNavySeals": "Used by Navy SEALs for stress management.",
"exerciseTitle_twoOneRatio": "2:1 Ratio Breathing",
"exerciseIntro_twoOneRatio": "Simple calming technique for beginners.",
"exerciseTitle_equalBreathing": "Equal Breathing",
"exerciseIntro_equalBreathing": "Balances nervous system activation.",
"exerciseTitle_modified478": "Modified 4-7-8",
"exerciseIntro_modified478": "Gentler version for anxiety relief.",
"exerciseTitle_coherentBreathing": "Coherent Breathing",
"exerciseIntro_coherentBreathing": "Optimizes heart rate variability.",
"exerciseTitle_extendedExhale": "Extended Exhale",
"exerciseIntro_extendedExhale": "Activates parasympathetic response.",
"exerciseTitle_miniBox": "Mini Box Breathing",
"exerciseIntro_miniBox": "Quick stress relief for busy moments.",
"exerciseTitle_samaVritti": "Sama Vritti",
"exerciseIntro_samaVritti": "Improves concentration and mental clarity.",
"exerciseTitle_deepEqual": "Deep Equal Breathing",
"exerciseIntro_deepEqual": "Enhances focus and cognitive performance.",
"exerciseTitle_squareBreathing": "Square Breathing",
"exerciseIntro_squareBreathing": "Builds mental resilience.",
"exerciseTitle_quickFocus": "Quick Focus",
"exerciseIntro_quickFocus": "Rapid attention enhancement.",
"exerciseTitle_ujjayiModified": "Modified Ujjayi",
"exerciseIntro_ujjayiModified": "Builds internal heat and focus.",
"exerciseTitle_extendedBox": "Extended Box Breathing",
"exerciseIntro_extendedBox": "Advanced stress management.",
"exerciseTitle_trianglePlus": "Triangle Plus",
"exerciseIntro_trianglePlus": "Complex pattern for experienced practitioners.",
"exerciseTitle_oneTwoExtended": "1:2 Extended Breathing",
"exerciseIntro_oneTwoExtended": "Deep relaxation and blood pressure reduction.",
"exerciseTitle_gentleHold": "Gentle Hold",
"exerciseIntro_gentleHold": "For those with lung capacity limitations.",
"exerciseTitle_longBreath": "Long Breath",
"exerciseIntro_longBreath": "Increases lung capacity and endurance.",
"exerciseTitle_classic478Extended": "Classic 4-7-8 Extended",
"exerciseIntro_classic478Extended": "Maximum relaxation response.",
"exerciseTitle_goldenRatio": "Golden Ratio",
"exerciseIntro_goldenRatio": "Based on mathematical harmony principles.",
"exerciseTitle_sleepPreparationProtocol": "Sleep Preparation Protocol",
"exerciseIntro_sleepPreparationProtocol": "A progressive sequence to prepare your body and mind for restful sleep.",
"exerciseTitle_anxietyRecoverySequence": "Anxiety Recovery Sequence",
"exerciseIntro_anxietyRecoverySequence": "A progressive approach to calm anxiety and restore emotional balance.",
"exerciseTitle_morningEnergyBuilder": "Morning Energy Builder",
"exerciseIntro_morningEnergyBuilder": "A progressive sequence to awaken your body and mind for the day ahead.",
"exerciseTitle_panicAttackManagement": "Panic Attack Management",
"exerciseIntro_panicAttackManagement": "A progressive sequence to quickly calm panic attacks and restore control.",
"exerciseTitle_concentrationTraining": "Concentration Training",
"exerciseIntro_concentrationTraining": "A progressive sequence to develop and sustain mental focus over time.",
"exerciseTitle_bloodPressureReduction": "Blood Pressure Reduction",
"exerciseIntro_bloodPressureReduction": "A progressive sequence designed to lower blood pressure through therapeutic breathing.",
"exerciseTitle_preCompetitionProtocol": "Pre-Competition Protocol",
"exerciseIntro_preCompetitionProtocol": "A progressive sequence to prepare mentally and physically for peak performance.",
"exerciseTitle_postWorkoutRecovery": "Post-Workout Recovery",
"exerciseIntro_postWorkoutRecovery": "A progressive sequence to normalize heart rate and accelerate recovery after exercise.",
"exerciseTitle_meditationPreparation": "Meditation Preparation",
"exerciseIntro_meditationPreparation": "A progressive sequence to settle the mind and transition into deeper meditation.",
"exerciseTitle_chronicPainManagement": "Chronic Pain Management",
"exerciseIntro_chronicPainManagement": "A progressive sequence to help manage chronic pain through controlled breathing techniques.",
"exerciseTitle_stressReliefWave": "Stress Relief Wave",
"exerciseIntro_stressReliefWave": "Gentle rhythm to wash away stress and tension.",
"exerciseTitle_energizingWakeUp": "Energizing Wake-Up",
"exerciseIntro_energizingWakeUp": "Quick boost to awaken your body and energize your mind.",
"exerciseTitle_balanceEquilibrium": "Balance Equilibrium",
"exerciseIntro_balanceEquilibrium": "Restores equilibrium between mind and body.",
"exerciseTitle_deepRelaxationDive": "Deep Relaxation Dive",
"exerciseIntro_deepRelaxationDive": "Dive deep into a state of complete relaxation and peace.",
"exerciseTitle_cardioCoherence": "Cardio Coherence",
"exerciseIntro_cardioCoherence": "A sequence to optimize heart rate variability and emotional balance.",
"exerciseTitle_officeBloodFlow": "Office Blood Flow Recovery",
"exerciseIntro_officeBloodFlow": "Desk-friendly stretches to improve circulation after long hours of sitting.",
"stageTitle_nervousSystemBalance": "Nervous System Balance",
"stageTitle_deepRelaxation": "Deep Relaxation",
"stageTitle_sleepInduction": "Sleep Induction",
"stageTitle_stabilization": "Stabilization",
"stageTitle_grounding": "Grounding",
"stageTitle_parasympatheticActivation": "Parasympathetic Activation",
"stageTitle_awakening": "Awakening",
"stageTitle_energizing": "Energizing",
"stageTitle_focusEnhancement": "Focus Enhancement",
"stageTitle_immediateCalming": "Immediate Calming",
"stageTitle_fullRecovery": "Full Recovery",
"stageTitle_foundationBuilding": "Foundation Building",
"stageTitle_complexityIncrease": "Complexity Increase",
"stageTitle_sustainedFocus": "Sustained Focus",
"stageTitle_baselineEstablishment": "Baseline Establishment",
"stageTitle_therapeuticRatio": "Therapeutic Ratio",
"stageTitle_maximumBenefit": "Maximum Benefit",
"stageTitle_coherenceBuilding": "Coherence Building",
"stageTitle_mentalPreparation": "Mental Preparation",
"stageTitle_controlledActivation": "Controlled Activation",
"stageTitle_heartRateNormalization": "Heart Rate Normalization",
"stageTitle_recoveryAcceleration": "Recovery Acceleration",
"stageTitle_homeostasisRestoration": "Homeostasis Restoration",
"stageTitle_mindSettling": "Mind Settling",
"stageTitle_deeperAwareness": "Deeper Awareness",
"stageTitle_transitionToMeditation": "Transition to Meditation",
"stageTitle_gentleIntroduction": "Gentle Introduction",
"stageTitle_painGateControl": "Pain Gate Control",
"stageTitle_endorphinRelease": "Endorphin Release",
"stageTitle_heartRatePreparation": "Heart Rate Preparation",
"stageTitle_peakCoherence": "Peak Coherence",
"stageTitle_shoulderRelease": "Shoulder Release",
"stageTitle_neckStretch": "Neck Stretch",
"phase_instruct_shouldersUp": "Raise shoulders toward ears",
"phase_instruct_shouldersDown": "Drop shoulders, release tension",
"phase_instruct_relaxShoulders": "Stay in position",
"phase_instruct_relaxCompletely": "Relax completely",
"phase_instruct_tiltRight": "Tilt head to the right",
"phase_instruct_holdStretch": "Hold the stretch",
"phase_instruct_returnCenter": "Return to center",
"phase_instruct_relaxNeck": "Relax neck muscles"
} No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# Find all locale l10n files in the repository
echo "=== Finding all locale l10n files ==="
fd -t f 'l10n' --extension json | head -20

Repository: ThomasNowProductions/BreathSpace

Length of output: 113


🏁 Script executed:

#!/bin/bash
# Check the structure and list available locale files
echo "=== Listing locale directories and files ==="
fd -t f 'l10n' --extension json | sort

Repository: ThomasNowProductions/BreathSpace

Length of output: 120


🏁 Script executed:

#!/bin/bash
# Compare German locale with English and another locale to check for translations
echo "=== Checking de/lib/l10n content (first 20 lines) ==="
head -20 de/lib/l10n

echo ""
echo "=== Checking for other locale files ==="
find . -type f -name "l10n" -o -name "*l10n*" 2>/dev/null | grep -E "\.(json|ts|js)$" | head -20

Repository: ThomasNowProductions/BreathSpace

Length of output: 778


🏁 Script executed:

#!/bin/bash
# Get file listing with better path handling
echo "=== All l10n files in the repo ==="
git ls-files | grep -i l10n | head -30

Repository: ThomasNowProductions/BreathSpace

Length of output: 754


🏁 Script executed:

#!/bin/bash
# Compare key values across different locale files to check for actual translations
echo "=== Spot-check: comparing 'settings' key across locales ==="
for locale in de es-ES fr hi ko it ar ja; do
  FILE="${locale}/lib/l10n"
  if [ -f "$FILE" ]; then
    VALUE=$(grep '"settings":' "$FILE" | head -1)
    echo "$locale: $VALUE"
  fi
done

echo ""
echo "=== Spot-check: comparing 'language' key across locales ==="
for locale in de es-ES fr hi ko it ar ja; do
  FILE="${locale}/lib/l10n"
  if [ -f "$FILE" ]; then
    VALUE=$(grep '"language":' "$FILE" | head -1)
    echo "$locale: $VALUE"
  fi
done

echo ""
echo "=== Check if all locale files are identical ==="
md5sum */lib/l10n 2>/dev/null | sort | uniq -c

Repository: ThomasNowProductions/BreathSpace

Length of output: 1820


🏁 Script executed:

#!/bin/bash
# Compare de/lib/l10n with other locale files byte-by-byte
echo "=== Comparing de/lib/l10n with other locales ==="
for locale in es-ES fr hi ko it ar ja; do
  FILE="${locale}/lib/l10n"
  if [ -f "$FILE" ]; then
    if diff -q "de/lib/l10n" "$FILE" > /dev/null 2>&1; then
      echo "IDENTICAL: de/lib/l10n == $locale/lib/l10n"
    else
      echo "DIFFERS: de/lib/l10n != $locale/lib/l10n"
      # Show first 3 differing lines
      diff "de/lib/l10n" "$FILE" | head -10
    fi
  fi
done

Repository: ThomasNowProductions/BreathSpace

Length of output: 393


🏁 Script executed:

#!/bin/bash
# Check for actual German translations in the de/lib/l10n file
echo "=== Checking for German translations in de/lib/l10n ==="
# German translations should have umlauts and German words
grep -E '(Einstellung|Sprache|Atemzug|Ausatm|äh|ö|ü|ß)' de/lib/l10n
if [ $? -eq 1 ]; then
  echo "No German-specific characters found (ä, ö, ü, ß, etc.)"
fi

echo ""
echo "=== Sample keys from de/lib/l10n ==="
head -30 de/lib/l10n | grep -oP '"\K[^"]+(?=":)'

Repository: ThomasNowProductions/BreathSpace

Length of output: 614


All 20 locale files are identical and contain untranslated English strings.

This is a systemic issue affecting every locale file in the PR, not just German. All language files (ar, bg, de, es-ES, fr, he, hi, it, ja, ko, nl, pl, pt-PT, ru, sw, th, tr, uk, vi, zh-CN) share the same MD5 hash and contain identical untranslated English values. For example, every locale has "settings": "Settings" instead of language-specific translations. There are no German characters (ä, ö, ü, ß) or any non-English text anywhere in these files.

This indicates the Crowdin export pushed source strings instead of translations across the entire project. Merging this will incorrectly advertise support for 20 languages while displaying English to all users regardless of their selected language.

Additionally, the language picker is missing entries for five newly-added locales: Hebrew, Swahili, Thai, Ukrainian, and Vietnamese.

Verify the Crowdin project configuration and re-export all locale files, ensuring only locales with completed translations are included.

🤖 Prompt for AI Agents
In `@de/lib/l10n` around lines 1 - 189, All locale JSON files were mistakenly
exported with source English strings (e.g., keys like "settings",
"exerciseTitle_relaxingBreath", "phase_instruct_shouldersUp" are English across
ar/bg/de/.../zh-CN) and five new locales (he, sw, th, uk, vi) are missing from
the language picker; fix by reconfiguring the Crowdin export to include only
completed translations, re-export the locale files so each language file
contains proper translated values (not the source strings), replace the current
identical JSON bundles (referencing keys like "settings" and "exerciseTitle_*")
with the corrected exports, and update the language picker implementation to
include the newly-added locales (Hebrew, Swahili, Thai, Ukrainian, Vietnamese)
so they appear in the UI when translation files are present.

Comment thread de/lib/l10n
Comment on lines +8 to +24
"languageSystem": "System default",
"languageEnglish": "English",
"languageDutch": "Dutch",
"languageSpanish": "Spanish",
"languageItalian": "Italian",
"languageGerman": "German",
"languageChinese": "Chinese",
"languageBulgarian": "Bulgarian",
"languageFrench": "French",
"languageJapanese": "Japanese",
"languagePortuguese": "Portuguese",
"languageRussian": "Russian",
"languageArabic": "Arabic",
"languageKorean": "Korean",
"languageHindi": "Hindi",
"languageTurkish": "Turkish",
"languagePolish": "Polish",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# First, let's check for the missing language picker keys
echo "=== Searching for missing language picker keys ==="
for key in languageHebrew languageSwahili languageThai languageUkrainian languageVietnamese; do
  echo "--- $key ---"
  rg -n "$key" . || echo "  NOT FOUND in entire codebase"
done

Repository: ThomasNowProductions/BreathSpace

Length of output: 402


🏁 Script executed:

#!/bin/bash
# Check the structure of locale files and their locations
echo "=== Finding locale files ==="
find . -type f -name "*.json" -path "*/l10n/*" | head -20

Repository: ThomasNowProductions/BreathSpace

Length of output: 104


🏁 Script executed:

#!/bin/bash
# Check what locale files exist, especially for the 5 new locales
echo "=== Checking for locale files for the 5 new locales ==="
for locale in he sw th uk vi; do
  echo "--- Locale: $locale ---"
  find . -path "*l10n*" -name "*$locale*" -o -path "*l10n*" -type d -name "$locale"
done

Repository: ThomasNowProductions/BreathSpace

Length of output: 521


🏁 Script executed:

#!/bin/bash
# Let's look at the structure of the de/lib/l10n directory mentioned in the review
echo "=== Examining de/lib/l10n structure ==="
if [ -d "de/lib/l10n" ]; then
  ls -la de/lib/l10n/
  echo ""
  echo "=== Checking file content ==="
  if [ -f "de/lib/l10n" ]; then
    wc -l de/lib/l10n
  fi
else
  echo "de/lib/l10n not found as directory, checking for file"
  find . -path "*de*lib*l10n*" -type f
fi

Repository: ThomasNowProductions/BreathSpace

Length of output: 183


🏁 Script executed:

#!/bin/bash
# Check what de/lib/l10n file is
echo "=== Content of de/lib/l10n (first 50 lines) ==="
head -50 de/lib/l10n

Repository: ThomasNowProductions/BreathSpace

Length of output: 1645


🏁 Script executed:

#!/bin/bash
# Look at the structure of locale files in lib/l10n
echo "=== Files in lib/l10n ==="
ls -la lib/l10n/ | grep -E '\.(arb|dart)$'

Repository: ThomasNowProductions/BreathSpace

Length of output: 3051


🏁 Script executed:

#!/bin/bash
# Check if app_en.arb (or similar English/base locale file) exists and examine its structure
echo "=== Checking for base locale files ==="
ls -la lib/l10n/app_*.arb | head -5

Repository: ThomasNowProductions/BreathSpace

Length of output: 464


🏁 Script executed:

#!/bin/bash
# Look at a locale file structure to understand how language picker entries are stored
echo "=== Content of a locale file (app_en.arb - first 50 lines) ==="
if [ -f "lib/l10n/app_en.arb" ]; then
  head -50 lib/l10n/app_en.arb
else
  # Try to find the English locale file
  find lib/l10n -name "app_en.arb" -o -name "*en*.arb" | xargs head -50 2>/dev/null | head -100
fi

Repository: ThomasNowProductions/BreathSpace

Length of output: 1660


🏁 Script executed:

#!/bin/bash
# Check one of the new locale files to see if it has incomplete entries
echo "=== Content of app_he.arb (Hebrew - first 50 lines) ==="
head -50 lib/l10n/app_he.arb

Repository: ThomasNowProductions/BreathSpace

Length of output: 1607


Missing language picker entries for 5 newly added locales.

The language* keys in all locale files enumerate 16 languages for the language picker, but the PR adds locale files for Hebrew (he), Swahili (sw), Thai (th), Ukrainian (uk), and Vietnamese (vi). The corresponding picker keys (languageHebrew, languageSwahili, languageThai, languageUkrainian, languageVietnamese) are missing from every locale file, preventing users from selecting these languages in the settings UI even though translation files exist.

Add the 5 missing language picker entries across all locale files in lib/l10n/.

🤖 Prompt for AI Agents
In `@de/lib/l10n` around lines 8 - 24, The locale files are missing five language
picker keys: languageHebrew, languageSwahili, languageThai, languageUkrainian,
and languageVietnamese; add these five keys to every locale file that defines
the other language* entries (same place as languageGerman/languagePolish) with
appropriate translated display strings for each locale, matching the
style/format of the existing entries and keeping punctuation/commas consistent
so the settings UI can list and select the new locales.

Comment thread sw/lib/l10n
Comment on lines +1 to +189
{
"appTitle": "BreathSpace",
"searchHint": "Search exercises...",
"progressive": "Progressive",
"stretching": "Stretching",
"settings": "Settings",
"language": "Language",
"languageSystem": "System default",
"languageEnglish": "English",
"languageDutch": "Dutch",
"languageSpanish": "Spanish",
"languageItalian": "Italian",
"languageGerman": "German",
"languageChinese": "Chinese",
"languageBulgarian": "Bulgarian",
"languageFrench": "French",
"languageJapanese": "Japanese",
"languagePortuguese": "Portuguese",
"languageRussian": "Russian",
"languageArabic": "Arabic",
"languageKorean": "Korean",
"languageHindi": "Hindi",
"languageTurkish": "Turkish",
"languagePolish": "Polish",
"theme": "Theme",
"themeSystem": "System Default",
"themeLight": "Light",
"themeDark": "Dark",
"themeOled": "OLED",
"useListView": "Use List View",
"viewMode": "View Mode",
"listView": "List View",
"aiMode": "AI Mode",
"quizMode": "Quiz Mode",
"start": "Start",
"noExercisesFound": "No exercises found.",
"inhale": "Inhale",
"exhale": "Exhale",
"hold": "Hold calmly",
"throughNose": "through nose",
"throughMouth": "through mouth",
"whileHoldingBreath": "while holding breath",
"close": "Close",
"exerciseInvalid": "Exercise not found or invalid pattern.",
"progressiveExercise": "Progressive Exercise",
"pattern": "Pattern",
"soundEffects": "Sound Effects",
"voiceGuide": "Voice Guide",
"voiceGuideOff": "Off",
"voiceGuideThomas": "Thomas",
"music": "Music",
"musicOff": "Off",
"musicNature": "Nature",
"musicLofi": "LoFi",
"musicPiano": "Piano",
"replayIntro": "Replay Intro",
"disableAIFeatures": "Disable AI features",
"disableAIFeaturesSubtitle": "Turn off AI-powered recommendations",
"welcomeTitle": "Welcome to BreathSpace",
"welcomeSubtitle": "Your space. Slow down, anytime.",
"getStarted": "Get Started",
"promptCacheTitle": "AI Prompt Cache",
"promptCacheSubtitle": "Cached responses for faster recommendations",
"promptCacheEntries": "entries",
"promptCacheClear": "Clear Cache",
"promptCacheCleared": "Prompt cache cleared",
"exerciseFinishedTitle": "Exercise finished",
"exerciseFinishedSubtitle": "I hope you feel better.",
"backToHome": "Back to Home",
"copyLink": "Copy Link",
"copyExerciseLink": "Copy Exercise Link",
"linkCopied": "Link copied to clipboard",
"termsAgreementPrefix": "By continuing, you agree to our ",
"privacyPolicy": "Privacy Policy",
"termsAgreementSuffix": ".",
"exerciseTitle_relaxingBreath": "Relaxing Breath",
"exerciseIntro_relaxingBreath": "Promotes sleep and reduces anxiety.",
"exerciseTitle_boxBreathingNavySeals": "Box Breathing",
"exerciseIntro_boxBreathingNavySeals": "Used by Navy SEALs for stress management.",
"exerciseTitle_twoOneRatio": "2:1 Ratio Breathing",
"exerciseIntro_twoOneRatio": "Simple calming technique for beginners.",
"exerciseTitle_equalBreathing": "Equal Breathing",
"exerciseIntro_equalBreathing": "Balances nervous system activation.",
"exerciseTitle_modified478": "Modified 4-7-8",
"exerciseIntro_modified478": "Gentler version for anxiety relief.",
"exerciseTitle_coherentBreathing": "Coherent Breathing",
"exerciseIntro_coherentBreathing": "Optimizes heart rate variability.",
"exerciseTitle_extendedExhale": "Extended Exhale",
"exerciseIntro_extendedExhale": "Activates parasympathetic response.",
"exerciseTitle_miniBox": "Mini Box Breathing",
"exerciseIntro_miniBox": "Quick stress relief for busy moments.",
"exerciseTitle_samaVritti": "Sama Vritti",
"exerciseIntro_samaVritti": "Improves concentration and mental clarity.",
"exerciseTitle_deepEqual": "Deep Equal Breathing",
"exerciseIntro_deepEqual": "Enhances focus and cognitive performance.",
"exerciseTitle_squareBreathing": "Square Breathing",
"exerciseIntro_squareBreathing": "Builds mental resilience.",
"exerciseTitle_quickFocus": "Quick Focus",
"exerciseIntro_quickFocus": "Rapid attention enhancement.",
"exerciseTitle_ujjayiModified": "Modified Ujjayi",
"exerciseIntro_ujjayiModified": "Builds internal heat and focus.",
"exerciseTitle_extendedBox": "Extended Box Breathing",
"exerciseIntro_extendedBox": "Advanced stress management.",
"exerciseTitle_trianglePlus": "Triangle Plus",
"exerciseIntro_trianglePlus": "Complex pattern for experienced practitioners.",
"exerciseTitle_oneTwoExtended": "1:2 Extended Breathing",
"exerciseIntro_oneTwoExtended": "Deep relaxation and blood pressure reduction.",
"exerciseTitle_gentleHold": "Gentle Hold",
"exerciseIntro_gentleHold": "For those with lung capacity limitations.",
"exerciseTitle_longBreath": "Long Breath",
"exerciseIntro_longBreath": "Increases lung capacity and endurance.",
"exerciseTitle_classic478Extended": "Classic 4-7-8 Extended",
"exerciseIntro_classic478Extended": "Maximum relaxation response.",
"exerciseTitle_goldenRatio": "Golden Ratio",
"exerciseIntro_goldenRatio": "Based on mathematical harmony principles.",
"exerciseTitle_sleepPreparationProtocol": "Sleep Preparation Protocol",
"exerciseIntro_sleepPreparationProtocol": "A progressive sequence to prepare your body and mind for restful sleep.",
"exerciseTitle_anxietyRecoverySequence": "Anxiety Recovery Sequence",
"exerciseIntro_anxietyRecoverySequence": "A progressive approach to calm anxiety and restore emotional balance.",
"exerciseTitle_morningEnergyBuilder": "Morning Energy Builder",
"exerciseIntro_morningEnergyBuilder": "A progressive sequence to awaken your body and mind for the day ahead.",
"exerciseTitle_panicAttackManagement": "Panic Attack Management",
"exerciseIntro_panicAttackManagement": "A progressive sequence to quickly calm panic attacks and restore control.",
"exerciseTitle_concentrationTraining": "Concentration Training",
"exerciseIntro_concentrationTraining": "A progressive sequence to develop and sustain mental focus over time.",
"exerciseTitle_bloodPressureReduction": "Blood Pressure Reduction",
"exerciseIntro_bloodPressureReduction": "A progressive sequence designed to lower blood pressure through therapeutic breathing.",
"exerciseTitle_preCompetitionProtocol": "Pre-Competition Protocol",
"exerciseIntro_preCompetitionProtocol": "A progressive sequence to prepare mentally and physically for peak performance.",
"exerciseTitle_postWorkoutRecovery": "Post-Workout Recovery",
"exerciseIntro_postWorkoutRecovery": "A progressive sequence to normalize heart rate and accelerate recovery after exercise.",
"exerciseTitle_meditationPreparation": "Meditation Preparation",
"exerciseIntro_meditationPreparation": "A progressive sequence to settle the mind and transition into deeper meditation.",
"exerciseTitle_chronicPainManagement": "Chronic Pain Management",
"exerciseIntro_chronicPainManagement": "A progressive sequence to help manage chronic pain through controlled breathing techniques.",
"exerciseTitle_stressReliefWave": "Stress Relief Wave",
"exerciseIntro_stressReliefWave": "Gentle rhythm to wash away stress and tension.",
"exerciseTitle_energizingWakeUp": "Energizing Wake-Up",
"exerciseIntro_energizingWakeUp": "Quick boost to awaken your body and energize your mind.",
"exerciseTitle_balanceEquilibrium": "Balance Equilibrium",
"exerciseIntro_balanceEquilibrium": "Restores equilibrium between mind and body.",
"exerciseTitle_deepRelaxationDive": "Deep Relaxation Dive",
"exerciseIntro_deepRelaxationDive": "Dive deep into a state of complete relaxation and peace.",
"exerciseTitle_cardioCoherence": "Cardio Coherence",
"exerciseIntro_cardioCoherence": "A sequence to optimize heart rate variability and emotional balance.",
"exerciseTitle_officeBloodFlow": "Office Blood Flow Recovery",
"exerciseIntro_officeBloodFlow": "Desk-friendly stretches to improve circulation after long hours of sitting.",
"stageTitle_nervousSystemBalance": "Nervous System Balance",
"stageTitle_deepRelaxation": "Deep Relaxation",
"stageTitle_sleepInduction": "Sleep Induction",
"stageTitle_stabilization": "Stabilization",
"stageTitle_grounding": "Grounding",
"stageTitle_parasympatheticActivation": "Parasympathetic Activation",
"stageTitle_awakening": "Awakening",
"stageTitle_energizing": "Energizing",
"stageTitle_focusEnhancement": "Focus Enhancement",
"stageTitle_immediateCalming": "Immediate Calming",
"stageTitle_fullRecovery": "Full Recovery",
"stageTitle_foundationBuilding": "Foundation Building",
"stageTitle_complexityIncrease": "Complexity Increase",
"stageTitle_sustainedFocus": "Sustained Focus",
"stageTitle_baselineEstablishment": "Baseline Establishment",
"stageTitle_therapeuticRatio": "Therapeutic Ratio",
"stageTitle_maximumBenefit": "Maximum Benefit",
"stageTitle_coherenceBuilding": "Coherence Building",
"stageTitle_mentalPreparation": "Mental Preparation",
"stageTitle_controlledActivation": "Controlled Activation",
"stageTitle_heartRateNormalization": "Heart Rate Normalization",
"stageTitle_recoveryAcceleration": "Recovery Acceleration",
"stageTitle_homeostasisRestoration": "Homeostasis Restoration",
"stageTitle_mindSettling": "Mind Settling",
"stageTitle_deeperAwareness": "Deeper Awareness",
"stageTitle_transitionToMeditation": "Transition to Meditation",
"stageTitle_gentleIntroduction": "Gentle Introduction",
"stageTitle_painGateControl": "Pain Gate Control",
"stageTitle_endorphinRelease": "Endorphin Release",
"stageTitle_heartRatePreparation": "Heart Rate Preparation",
"stageTitle_peakCoherence": "Peak Coherence",
"stageTitle_shoulderRelease": "Shoulder Release",
"stageTitle_neckStretch": "Neck Stretch",
"phase_instruct_shouldersUp": "Raise shoulders toward ears",
"phase_instruct_shouldersDown": "Drop shoulders, release tension",
"phase_instruct_relaxShoulders": "Stay in position",
"phase_instruct_relaxCompletely": "Relax completely",
"phase_instruct_tiltRight": "Tilt head to the right",
"phase_instruct_holdStretch": "Hold the stretch",
"phase_instruct_returnCenter": "Return to center",
"phase_instruct_relaxNeck": "Relax neck muscles"
} No newline at end of file

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash

echo "=== Looking for l10n files in the repository ==="
fd -t f . -path '*l10n*' | head -30

echo ""
echo "=== Checking for l10n configuration files ==="
fd -t f 'l10n.yaml|pubspec.yaml' | head -10

Repository: ThomasNowProductions/BreathSpace

Length of output: 370


🏁 Script executed:

#!/bin/bash

echo "=== Checking the specific file mentioned (sw/lib/l10n) ==="
find . -path '*sw/lib/l10n*' -type f 2>/dev/null | head -10

echo ""
echo "=== Listing contents of sw directory and subdirectories ==="
find . -path '*sw*' -type f 2>/dev/null | grep -E '\.(json|arb)$' | head -20

echo ""
echo "=== Checking pubspec.yaml for l10n configuration ==="
cat pubspec.yaml 2>/dev/null || echo "pubspec.yaml not found"

Repository: ThomasNowProductions/BreathSpace

Length of output: 4914


🏁 Script executed:

#!/bin/bash

echo "=== Finding all ARB locale files ==="
find ./lib/l10n -name '*.arb' -type f | sort

echo ""
echo "=== Checking content of Swahili locale file ==="
cat ./lib/l10n/app_sw.arb | head -50

echo ""
echo "=== Checking if English source file exists ==="
ls -la ./lib/l10n/app_*.arb 2>/dev/null | head -20

Repository: ThomasNowProductions/BreathSpace

Length of output: 3748


🏁 Script executed:

#!/bin/bash

echo "=== Full content of app_sw.arb file ==="
cat ./lib/l10n/app_sw.arb

echo ""
echo "=== Checking for app_en.arb (English source) ==="
if [ -f "./lib/l10n/app_en.arb" ]; then
  echo "Found app_en.arb, first 50 lines:"
  head -50 ./lib/l10n/app_en.arb
else
  echo "No app_en.arb found"
fi

echo ""
echo "=== List all ARB files with line count ==="
wc -l ./lib/l10n/*.arb 2>/dev/null

Repository: ThomasNowProductions/BreathSpace

Length of output: 12749


🏁 Script executed:

#!/bin/bash

echo "=== Checking Ukrainian locale (app_uk.arb) for exercise titles ==="
grep -E '(exerciseTitle_relaxingBreath|exerciseIntro_relaxingBreath|stageTitle_nervousSystemBalance)' ./lib/l10n/app_uk.arb

echo ""
echo "=== Checking Polish locale (app_pl.arb) for exercise titles ==="
grep -E '(exerciseTitle_relaxingBreath|exerciseIntro_relaxingBreath|stageTitle_nervousSystemBalance)' ./lib/l10n/app_pl.arb

echo ""
echo "=== Checking Dutch locale (app_nl.arb) for exercise titles ==="
grep -E '(exerciseTitle_relaxingBreath|exerciseIntro_relaxingBreath|stageTitle_nervousSystemBalance)' ./lib/l10n/app_nl.arb

echo ""
echo "=== Checking Japanese locale (app_ja.arb) for exercise titles ==="
grep -E '(exerciseTitle_relaxingBreath|exerciseIntro_relaxingBreath|stageTitle_nervousSystemBalance)' ./lib/l10n/app_ja.arb

echo ""
echo "=== Comparing Swahili UI strings (translated) vs exercise content (English) ==="
echo "--- Swahili UI strings (should be translated) ---"
grep -E '(searchHint|language|settings|theme):' ./lib/l10n/app_sw.arb | head -5

echo ""
echo "--- Swahili exercise titles (currently in English) ---"
grep -E '(exerciseTitle_relaxingBreath|exerciseIntro_relaxingBreath):' ./lib/l10n/app_sw.arb

Repository: ThomasNowProductions/BreathSpace

Length of output: 1247


Ukrainian and Polish locales are completely untranslated; Swahili exercise content remains in English.

Your review is partially correct but overgeneralizes. The six new locales have different translation statuses:

  • Ukrainian (uk) and Polish (pl): Completely untranslated—all strings remain in English.
  • Swahili (sw): Partially translated—UI strings are translated, but exercise titles, intros, and stage names remain in English (e.g., exerciseTitle_relaxingBreath: "Relaxing Breath" instead of a Swahili translation).
  • Dutch (nl) and Japanese (ja): Fully translated—no issues detected.

This suggests either incomplete Crowdin exports for uk/pl or a staggered translation workflow. Verify which locales were marked complete in your Crowdin project and re-export only the fully translated ones.

🤖 Prompt for AI Agents
In `@sw/lib/l10n` around lines 1 - 189, The sw locale file contains untranslated
strings: Ukrainian and Polish appear to be fully English (e.g., keys like
exerciseTitle_relaxingBreath, exerciseIntro_relaxingBreath,
stageTitle_nervousSystemBalance, stageTitle_deepRelaxation are still English)
and Swahili has UI strings translated but exercise titles/intros and stageTitle
entries remain English; to fix, confirm in Crowdin which locales are marked
complete, re-export only the locales that are fully translated, and update the
sw locale by adding proper translations for exerciseTitle_*, exerciseIntro_*,
and stageTitle_* (and ensure uk/pl receive full exports) so the keys mentioned
above are localized correctly before committing.

Comment thread sw/lib/l10n
Comment on lines +7 to +24
"language": "Language",
"languageSystem": "System default",
"languageEnglish": "English",
"languageDutch": "Dutch",
"languageSpanish": "Spanish",
"languageItalian": "Italian",
"languageGerman": "German",
"languageChinese": "Chinese",
"languageBulgarian": "Bulgarian",
"languageFrench": "French",
"languageJapanese": "Japanese",
"languagePortuguese": "Portuguese",
"languageRussian": "Russian",
"languageArabic": "Arabic",
"languageKorean": "Korean",
"languageHindi": "Hindi",
"languageTurkish": "Turkish",
"languagePolish": "Polish",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# First, find the actual l10n file(s) in the sw/lib/l10n directory
echo "=== Files in sw/lib/l10n directory ==="
find sw/lib/l10n -type f | head -20

echo ""
echo "=== Directory structure of sw/lib/l10n ==="
ls -la sw/lib/l10n/ 2>/dev/null || echo "Directory not found, searching for l10n..."
find . -name "l10n" -type d 2>/dev/null | head -10

Repository: ThomasNowProductions/BreathSpace

Length of output: 224


🏁 Script executed:

#!/bin/bash
echo "=== Contents of ./lib/l10n ==="
ls -la ./lib/l10n/

echo ""
echo "=== Check for English language file ==="
find ./lib/l10n -name "*en*" -o -name "*.json"

echo ""
echo "=== All files in l10n ==="
find ./lib/l10n -type f

Repository: ThomasNowProductions/BreathSpace

Length of output: 4571


🏁 Script executed:

#!/bin/bash
echo "=== Extract language keys from app_en.arb ==="
cat ./lib/l10n/app_en.arb | grep -i '"language' | head -30

echo ""
echo "=== Count language keys ==="
cat ./lib/l10n/app_en.arb | grep -i '"language' | wc -l

echo ""
echo "=== Full app_en.arb content (first 100 lines) ==="
head -100 ./lib/l10n/app_en.arb

Repository: ThomasNowProductions/BreathSpace

Length of output: 4853


Add missing language entries to the UI language selector.

The language list in app_en.arb defines only 16 language keys, but the codebase supports 21 locales. Five languages with complete locale files are missing from the language selector: Hebrew, Swahili, Thai, Ukrainian, and Vietnamese. Users of these locales won't be able to select their language in settings.

Add these entries after line 24:

Proposed additions
   "languagePolish": "Polish",
+  "languageSwahili": "Swahili",
+  "languageThai": "Thai",
+  "languageVietnamese": "Vietnamese",
+  "languageUkrainian": "Ukrainian",
+  "languageHebrew": "Hebrew",
   "theme": "Theme",
🤖 Prompt for AI Agents
In `@sw/lib/l10n` around lines 7 - 24, The language selector is missing five
locale entries; add the following keys to the same JSON/ARB object in
sw/lib/l10n alongside the other "language..." keys: languageHebrew ("Hebrew"),
languageSwahili ("Swahili"), languageThai ("Thai"), languageUkrainian
("Ukrainian"), and languageVietnamese ("Vietnamese") so the UI can display these
locales; ensure the new keys follow the existing naming pattern (e.g.,
languageHebrew) and are inserted with the other language entries in the file.

Comment thread th/lib/l10n
Comment on lines +7 to +24
"language": "Language",
"languageSystem": "System default",
"languageEnglish": "English",
"languageDutch": "Dutch",
"languageSpanish": "Spanish",
"languageItalian": "Italian",
"languageGerman": "German",
"languageChinese": "Chinese",
"languageBulgarian": "Bulgarian",
"languageFrench": "French",
"languageJapanese": "Japanese",
"languagePortuguese": "Portuguese",
"languageRussian": "Russian",
"languageArabic": "Arabic",
"languageKorean": "Korean",
"languageHindi": "Hindi",
"languageTurkish": "Turkish",
"languagePolish": "Polish",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🏁 Script executed:

#!/bin/bash
# First, understand the locale file structure
echo "=== Repository structure around lib/l10n ==="
find . -type d -name "l10n" 2>/dev/null | head -10

echo ""
echo "=== Locale files in the repository ==="
find . -path "*/lib/l10n*" -type f | head -20

Repository: ThomasNowProductions/BreathSpace

Length of output: 534


🏁 Script executed:

#!/bin/bash
# Check the file mentioned in the review (th/lib/l10n) and examine its contents
echo "=== Examining th/lib/l10n file ==="
if [ -f "th/lib/l10n" ]; then
  echo "File exists. First 50 lines:"
  head -50 "th/lib/l10n"
elif [ -f "lib/l10n/th.json" ]; then
  echo "File: lib/l10n/th.json"
  cat "lib/l10n/th.json"
else
  echo "File not found at expected paths. Searching for locale files..."
  find . -name "*l10n*" -o -name "*locale*" -o -name "*translation*" | grep -E "\.(json|arb)$" | head -15
fi

Repository: ThomasNowProductions/BreathSpace

Length of output: 1661


🏁 Script executed:

#!/bin/bash
# Look for language-related keys across all locale files
echo "=== Searching for languageThai, languageHebrew, etc. in codebase ==="
rg "language(Thai|Hebrew|Vietnamese|Ukrainian|Swahili)" --type json
echo ""
echo "=== Counting language* keys in locale files ==="
rg -o '"language[A-Za-z]+"' --type json -r '$0' | sort | uniq

Repository: ThomasNowProductions/BreathSpace

Length of output: 193


🏁 Script executed:

#!/bin/bash
# Get complete list of locale files
echo "=== Complete list of locale files ==="
find . -type f \( -name "app_*.arb" -o -path "*/lib/l10n" \) | sort

echo ""
echo "=== Checking if he, th, vi, uk, sw locale files exist ==="
for lang in he th vi uk sw; do
  if [ -f "./$lang/lib/l10n" ]; then
    echo "✓ Found: ./$lang/lib/l10n"
  elif [ -f "./lib/l10n/app_$lang.arb" ]; then
    echo "✓ Found: ./lib/l10n/app_$lang.arb"
  else
    echo "✗ NOT found: ./$lang/lib/l10n or ./lib/l10n/app_$lang.arb"
  fi
done

echo ""
echo "=== Check a couple other locale files for language* entries ==="
echo "--- Checking en locale (app_en.arb) ---"
grep -o '"language[^"]*"' ./lib/l10n/app_en.arb | head -20
echo ""
echo "--- Checking ar locale (ar/lib/l10n) ---"
grep -o '"language[^"]*"' ./ar/lib/l10n | head -20

Repository: ThomasNowProductions/BreathSpace

Length of output: 1811


🏁 Script executed:

#!/bin/bash
# Check git status or PR content to understand which files are being added
echo "=== Git status of locale files (to see what's being added) ==="
git status --short 2>/dev/null | grep -E "(l10n|locale)" | head -20

echo ""
echo "=== Checking if there are new locale files in git index ==="
git ls-files --others --cached --exclude-standard 2>/dev/null | grep -E "(l10n|locale)"

Repository: ThomasNowProductions/BreathSpace

Length of output: 1659


🏁 Script executed:

#!/bin/bash
# Check if the new languages have their entries in the new locale files
echo "=== Checking th/lib/l10n for all language entries ==="
grep -o '"language[^"]*"' ./th/lib/l10n | sort | uniq -c | sort -rn

echo ""
echo "=== Checking if languageThai exists in any locale file ==="
grep -r "languageThai" . --include="l10n" --include="*.arb" 2>/dev/null || echo "NOT FOUND"

echo ""
echo "=== Checking app_th.arb file size and content ==="
wc -l ./lib/l10n/app_th.arb
echo "First 30 lines:"
head -30 ./lib/l10n/app_th.arb

Repository: ThomasNowProductions/BreathSpace

Length of output: 1646


🏁 Script executed:

#!/bin/bash
# Check what language entries are in the base English file
echo "=== All language entries in app_en.arb ==="
grep '"language' ./lib/l10n/app_en.arb | sort

echo ""
echo "=== Count of language entries in app_en.arb ==="
grep -c '"language' ./lib/l10n/app_en.arb

Repository: ThomasNowProductions/BreathSpace

Length of output: 740


🏁 Script executed:

#!/bin/bash
# Spot-check one more locale file to confirm the gap is consistent
echo "=== Checking app_fr.arb for language entries ==="
grep '"language' ./lib/l10n/app_fr.arb | sort

echo ""
echo "=== Verify none of the 5 new languages have entries in app_de.arb ==="
grep -E '"language(Thai|Hebrew|Vietnamese|Ukrainian|Swahili)"' ./lib/l10n/app_de.arb || echo "CONFIRMED: None of the 5 new language entries found"

Repository: ThomasNowProductions/BreathSpace

Length of output: 826


Add missing language selector entries for newly supported locales.

The language name keys across all locale files include 16 language names but omit Thai, Hebrew, Vietnamese, Ukrainian, and Swahili — all of which have locale files being added in this PR. Without languageThai, languageHebrew, languageVietnamese, languageUkrainian, and languageSwahili entries, users cannot select these languages in the settings UI.

Add these five language entries to all locale files (lib/l10n/app_*.arb and {lang}/lib/l10n).

🤖 Prompt for AI Agents
In `@th/lib/l10n` around lines 7 - 24, Add the five missing language selector keys
(languageThai, languageHebrew, languageVietnamese, languageUkrainian,
languageSwahili) to every locale resource so the settings UI can show the new
locales; update each app_*.arb and each locale directory file under lib/l10n to
include these keys with the appropriate translated label strings alongside the
existing keys such as "language", "languageEnglish", "languageDutch", etc.,
ensuring key names exactly match languageThai, languageHebrew,
languageVietnamese, languageUkrainian, and languageSwahili.

@thomasboom thomasboom closed this Feb 11, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant