# feat(i18n): Hebrew locale + full RTL support ## Summary This PR adds full Hebrew (he) locale support to the UI, including a complete translation of all user-facing strings and comprehensive RTL layout support across all components. ## What was done ### Hebrew translation - Full translation of all i18n message files for the `he` locale (17 translation files) - Registered the language in the i18n system and the language picker ### RTL support - Automatic direction detection (`dir="rtl"`) when Hebrew is selected - Replaced physical CSS properties (`left`/`right`) with logical equivalents (`inline-start`/`inline-end`) across the project - Fixed resize direction, file path alignment, and textarea padding - Fixed navigation button positioning in textarea for RTL - Fixed scrollbar direction in RTL - Fixed code block direction and selector alignment - Fixed Monaco editor direction in the file viewer - Auto-detect text direction in reasoning block (`dir="auto"` + `unicode-bidi: plaintext`) ### Adapted components - `session-layout` — sidebar and resize handle - `prompt-input` — text direction and buttons - `message-base` — message blocks and reasoning - `message-timeline` — timeline bar - `right-panel` — right side panel - `tool-call` — tool call display - `settings-screen` — settings page - `selector` — selection component - `instance-shell` — main shell ## New files ``` packages/ui/src/lib/i18n/messages/he/ advancedSettings.ts app.ts commands.ts dialogs.ts filesystem.ts folderSelection.ts index.ts instance.ts loadingScreen.ts logs.ts markdown.ts messaging.ts remoteAccess.ts session.ts settings.ts time.ts toolCall.ts ``` ## Suggested testing - Switch language to Hebrew and verify all strings are translated - Verify RTL layout is correct across all screens (session, settings, file viewer) - Verify that English text inside a reasoning block is displayed LTR - Switch back to English and verify everything returns to LTR --------- Co-authored-by: Claude Sonnet 4.6 <noreply@anthropic.com> Co-authored-by: Shantur Rathore <i@shantur.com>
52 lines
3.8 KiB
TypeScript
52 lines
3.8 KiB
TypeScript
export const remoteAccessMessages = {
|
||
"remoteAccess.eyebrow": "גישה מרוחקת",
|
||
"remoteAccess.title": "התחבר ל-CodeNomad מרחוק",
|
||
"remoteAccess.subtitle": "השתמש בכתובות למטה כדי לפתוח את CodeNomad ממכשיר אחר.",
|
||
"remoteAccess.close": "סגור גישה מרוחקת",
|
||
"remoteAccess.refresh": "רענן",
|
||
|
||
"remoteAccess.sections.listeningMode.label": "מצב האזנה",
|
||
"remoteAccess.sections.listeningMode.help": "אפשר או הגבל גישה מרוחקת על ידי קישור לכל הממשקים או רק ל-localhost.",
|
||
"remoteAccess.toggle.on": "פועל",
|
||
"remoteAccess.toggle.off": "כבוי",
|
||
"remoteAccess.toggle.title": "אפשר חיבורים מכתובות IP אחרות",
|
||
"remoteAccess.toggle.caption.all": "מקושר ל-0.0.0.0",
|
||
"remoteAccess.toggle.caption.local": "מקושר ל-127.0.0.1",
|
||
"remoteAccess.toggle.note": "שינוי זה דורש הפעלה מחדש ועוצר זמנית את כל המופעים הפעילים. שתף את הכתובות למטה לאחר שהשרת יופעל מחדש.",
|
||
"remoteAccess.listeningMode.restartConfirm.message": "להפעיל מחדש כדי להחיל מצב האזנה? פעולה זו תעצור את כל המופעים הפעילים.",
|
||
"remoteAccess.listeningMode.restartConfirm.title.all": "פתוח למכשירים אחרים",
|
||
"remoteAccess.listeningMode.restartConfirm.title.local": "מוגבל למכשיר זה",
|
||
"remoteAccess.listeningMode.restartConfirm.confirmLabel": "הפעל מחדש עכשיו",
|
||
"remoteAccess.listeningMode.restartConfirm.cancelLabel": "ביטול",
|
||
"remoteAccess.restart.errorManual": "לא ניתן להפעיל מחדש אוטומטית. אנא הפעל מחדש את האפליקציה כדי להחיל את השינוי.",
|
||
|
||
"remoteAccess.sections.serverPassword.label": "סיסמת שרת",
|
||
"remoteAccess.sections.serverPassword.help": "גישה מרוחקת דורשת סיסמה. הגדר סיסמה קלה לזכירה כדי לאפשר כניסות ממכשירים אחרים.",
|
||
"remoteAccess.authStatus.unavailable": "סטטוס האימות אינו זמין.",
|
||
"remoteAccess.username": "שם משתמש: {username}",
|
||
"remoteAccess.password.status.set": "סיסמה מוגדרת לגישה מרוחקת.",
|
||
"remoteAccess.password.status.unset": "לא הוגדרה סיסמה קלה לזכירה. הגדר סיסמה כדי לאפשר כניסות גישה מרוחקת.",
|
||
"remoteAccess.password.actions.cancel": "ביטול",
|
||
"remoteAccess.password.actions.change": "שנה סיסמה",
|
||
"remoteAccess.password.actions.set": "הגדר סיסמה",
|
||
"remoteAccess.password.form.newPassword": "סיסמה חדשה",
|
||
"remoteAccess.password.form.confirmPassword": "אשר סיסמה",
|
||
"remoteAccess.password.form.placeholder": "לפחות 8 תווים",
|
||
"remoteAccess.password.error.tooShort": "הסיסמה חייבת להכיל לפחות 8 תווים.",
|
||
"remoteAccess.password.error.mismatch": "הסיסמאות אינן תואמות.",
|
||
"remoteAccess.password.save.saving": "שומר…",
|
||
"remoteAccess.password.save.label": "שמור סיסמה",
|
||
|
||
"remoteAccess.sections.addresses.label": "כתובות נגישות",
|
||
"remoteAccess.sections.addresses.help": "הפעל או סרוק ממכונה אחרת להעברת שליטה.",
|
||
"remoteAccess.addresses.loading": "טוען כתובות…",
|
||
"remoteAccess.addresses.none": "אין כתובות זמינות עדיין.",
|
||
"remoteAccess.address.scope.network": "רשת",
|
||
"remoteAccess.address.scope.loopback": "לולאה מקומית",
|
||
"remoteAccess.address.scope.internal": "פנימי",
|
||
"remoteAccess.address.open": "פתח",
|
||
"remoteAccess.address.showQr": "הצג QR",
|
||
"remoteAccess.address.hideQr": "הסתר QR",
|
||
"remoteAccess.address.qrAlt": "QR עבור {url}",
|
||
} as const
|