# 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>
91 lines
5.5 KiB
TypeScript
91 lines
5.5 KiB
TypeScript
export const sessionMessages = {
|
|
"sessionPicker.title": "OpenCode • {folder}",
|
|
"sessionPicker.empty.noPrevious": "אין סשנים קודמים",
|
|
"sessionPicker.resume.title": "המשך סשן ({count}):",
|
|
"sessionPicker.session.untitled": "ללא שם",
|
|
"sessionPicker.divider.or": "או",
|
|
"sessionPicker.new.title": "התחל סשן חדש:",
|
|
"sessionPicker.agents.loading": "טוען סוכנים...",
|
|
"sessionPicker.actions.creating": "יוצר...",
|
|
"sessionPicker.actions.createSession": "צור סשן",
|
|
"sessionPicker.actions.cancel": "ביטול",
|
|
|
|
"sessionList.header.title": "סשנים",
|
|
"sessionList.session.untitled": "ללא שם",
|
|
"sessionList.status.working": "עובד",
|
|
"sessionList.status.compacting": "מסכם",
|
|
"sessionList.status.idle": "מוכן",
|
|
"sessionList.status.needsPermission": "נדרש אישור",
|
|
"sessionList.status.needsInput": "נדרש קלט",
|
|
"sessionList.expand.collapseAriaLabel": "כווץ סשן",
|
|
"sessionList.expand.expandAriaLabel": "פרוס סשן",
|
|
"sessionList.expand.collapseTitle": "כווץ",
|
|
"sessionList.expand.expandTitle": "פרוס",
|
|
"sessionList.actions.newSession.ariaLabel": "סשן חדש",
|
|
"sessionList.actions.newSession.title": "סשן חדש",
|
|
"sessionList.actions.copyId.ariaLabel": "העתק מזהה סשן",
|
|
"sessionList.actions.copyId.title": "העתק מזהה סשן",
|
|
"sessionList.actions.rename.ariaLabel": "שנה שם סשן",
|
|
"sessionList.actions.rename.title": "שנה שם סשן",
|
|
"sessionList.actions.delete.ariaLabel": "מחק סשן",
|
|
"sessionList.actions.delete.title": "מחק סשן",
|
|
"sessionList.copyId.success": "מזהה סשן הועתק",
|
|
"sessionList.copyId.error": "לא ניתן להעתיק מזהה סשן",
|
|
"sessionList.delete.error": "לא ניתן למחוק סשן",
|
|
"sessionList.delete.title": "מחק סשן",
|
|
"sessionList.delete.confirmMessage": "למחוק את \"{label}\"? לא ניתן לבטל פעולה זו.",
|
|
"sessionList.delete.confirmLabel": "מחק",
|
|
"sessionList.delete.cancelLabel": "ביטול",
|
|
"sessionList.rename.error": "לא ניתן לשנות שם הסשן",
|
|
|
|
"sessionList.filter.placeholder": "חפש סשנים…",
|
|
"sessionList.filter.ariaLabel": "חפש סשנים",
|
|
"sessionList.selection.selectAllLabel": "בחר הכל",
|
|
"sessionList.selection.selectAllAriaLabel": "בחר את כל הסשנים",
|
|
"sessionList.selection.clearLabel": "נקה",
|
|
"sessionList.selection.clearAriaLabel": "נקה בחירה",
|
|
"sessionList.selection.checkboxAriaLabel": "בחר סשן",
|
|
"sessionList.bulkDelete.button": "מחק {count}",
|
|
"sessionList.bulkDelete.ariaLabel": "מחק {count} סשנים נבחרים",
|
|
"sessionList.bulkDelete.title": "מחק סשנים",
|
|
"sessionList.bulkDelete.confirmMessage": "למחוק {count} סשנים נבחרים? לא ניתן לבטל פעולה זו.",
|
|
"sessionList.bulkDelete.confirmLabel": "מחק",
|
|
"sessionList.bulkDelete.cancelLabel": "ביטול",
|
|
"sessionList.bulkDelete.error": "לא ניתן למחוק {count} סשנים",
|
|
|
|
"sessionRenameDialog.title": "שנה שם סשן",
|
|
"sessionRenameDialog.description.withLabel": "עדכן את הכותרת עבור \"{label}\".",
|
|
"sessionRenameDialog.description.default": "הגדר כותרת חדשה לסשן זה.",
|
|
"sessionRenameDialog.input.label": "שם סשן",
|
|
"sessionRenameDialog.input.placeholder": "הזן שם סשן",
|
|
"sessionRenameDialog.actions.cancel": "ביטול",
|
|
"sessionRenameDialog.actions.rename": "שנה שם",
|
|
"sessionRenameDialog.actions.renaming": "משנה שם…",
|
|
|
|
"sessionView.fallback.sessionNotFound": "הסשן לא נמצא",
|
|
"sessionView.alerts.abortFailed.message": "עצירת הסשן נכשלה",
|
|
"sessionView.alerts.abortFailed.title": "העצירה נכשלה",
|
|
"sessionView.alerts.revertFailed.message": "החזרה להודעה נכשלה",
|
|
"sessionView.alerts.revertFailed.title": "החזרה נכשלה",
|
|
"sessionView.alerts.deleteUpToFailed.message": "מחיקת הודעות נכשלה",
|
|
"sessionView.alerts.deleteUpToFailed.title": "המחיקה נכשלה",
|
|
"sessionView.alerts.forkFailed.message": "פיצול הסשן נכשל",
|
|
"sessionView.alerts.forkFailed.title": "הפיצול נכשל",
|
|
"sessionView.attachments.expandPastedTextAriaLabel": "פרוס טקסט שהודבק",
|
|
"sessionView.attachments.insertPastedTextTitle": "הכנס טקסט שהודבק",
|
|
"sessionView.attachments.removeAriaLabel": "הסר קובץ מצורף",
|
|
|
|
"sessionEvents.sessionCompactedToast": "הסשן {label} סוכם",
|
|
"sessionEvents.sessionError.unknown": "שגיאה לא ידועה",
|
|
"sessionEvents.sessionError.title": "שגיאת סשן",
|
|
"sessionEvents.sessionError.message": "שגיאה: {message}",
|
|
|
|
"sessionState.cleanup.deepConfirm.message": "ניקוי עמוק זה עשוי להיות איטי, ועלול למחוק סשנים שלא התכוונת למחוק. האם אתה בטוח?",
|
|
"sessionState.cleanup.deepConfirm.title": "ניקוי עמוק של סשנים",
|
|
"sessionState.cleanup.deepConfirm.detail": "ניקוי עמוק של סשנים ימחק את כל הסשנים ללא הודעות, יסיר סשני תת-סוכן שסיימו, וינקה פיצולים לא בשימוש של סשן.",
|
|
"sessionState.cleanup.deepConfirm.confirmLabel": "המשך",
|
|
"sessionState.cleanup.deepConfirm.cancelLabel": "ביטול",
|
|
"sessionState.cleanup.toast.one": "נוקה {count} סשן ריק",
|
|
"sessionState.cleanup.toast.other": "נוקו {count} סשנים ריקים",
|
|
} as const
|