New Crowdin updates - #1
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
📝 WalkthroughWalkthroughThis 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 🚥 Pre-merge checks | ✅ 2 | ❌ 1❌ Failed checks (1 inconclusive)
✅ Passed checks (2 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 |
Code Review SummaryStatus: 2 Issues Found | Recommendation: Address before merge Overview
Issue Details (click to expand)WARNING
Files Reviewed (20 files)
|
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
| @@ -0,0 +1,189 @@ | |||
| { | |||
There was a problem hiding this comment.
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.
There was a problem hiding this comment.
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.
| { | ||
| "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 |
There was a problem hiding this comment.
🧩 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 -20Repository: 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 | sortRepository: 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 -20Repository: 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 -30Repository: 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 -cRepository: 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
doneRepository: 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.
| "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", |
There was a problem hiding this comment.
🧩 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"
doneRepository: 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 -20Repository: 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"
doneRepository: 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
fiRepository: 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/l10nRepository: 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 -5Repository: 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
fiRepository: 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.arbRepository: 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.
| { | ||
| "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 |
There was a problem hiding this comment.
🧩 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 -10Repository: 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 -20Repository: 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/nullRepository: 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.arbRepository: 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.
| "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", |
There was a problem hiding this comment.
🧩 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 -10Repository: 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 fRepository: 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.arbRepository: 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.
| "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", |
There was a problem hiding this comment.
🧩 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 -20Repository: 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
fiRepository: 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 | uniqRepository: 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 -20Repository: 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.arbRepository: 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.arbRepository: 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.
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.
Written for commit 8df3a06. Summary will update on new commits.