feat(i18n): Hebrew locale + full RTL support

This commit is contained in:
Shuki Vaknin
2026-07-08 00:07:34 +02:00
committed by Linus Rath
parent 8904d724bb
commit 22418c17cf
113 changed files with 3958 additions and 494 deletions
+2 -2
View File
@@ -155,7 +155,7 @@ export function AccountSwitcher({ variant = "rail", className }: AccountSwitcher
"flex items-center gap-2 rounded-md transition-colors",
variant === "rail"
? "justify-center w-10 h-10 hover:bg-muted"
: "w-full px-2 py-1.5 hover:bg-muted text-left min-w-0",
: "w-full px-2 py-1.5 hover:bg-muted text-start min-w-0",
className
)}
title={variant === "rail" ? (displayName || displayEmail) : undefined}
@@ -214,7 +214,7 @@ export function AccountSwitcher({ variant = "rail", className }: AccountSwitcher
<button
onClick={() => handleSwitch(account.id)}
className={cn(
"w-full flex items-start gap-3 px-3 py-2.5 text-left transition-colors",
"w-full flex items-start gap-3 px-3 py-2.5 text-start transition-colors",
isActive ? "bg-accent/50" : "hover:bg-muted",
isDraggable && "pe-7"
)}
+1 -1
View File
@@ -95,7 +95,7 @@ export function IconPicker({ value, onChange, className }: IconPickerProps) {
value={search}
onChange={(e) => setSearch(e.target.value)}
placeholder={t('search_icons')}
className="pl-8 h-8 text-xs"
className="ps-8 h-8 text-xs"
/>
{search && (
<button
+2 -2
View File
@@ -154,7 +154,7 @@ function SidebarAppForm({
<label className="block text-sm font-medium mb-2">
{t('icon_label')} <span className="text-destructive">*</span>
{SelectedIcon && (
<span className="inline-flex items-center gap-1.5 ml-2 text-muted-foreground font-normal">
<span className="inline-flex items-center gap-1.5 ms-2 text-muted-foreground font-normal">
- <SelectedIcon className="w-4 h-4" /> {formData.icon}
</span>
)}
@@ -275,7 +275,7 @@ export function SidebarAppsModal({ isOpen, onClose }: SidebarAppsModalProps) {
onClick={() => setIsCreating(true)}
className="mb-6 w-full sm:w-auto"
>
<Plus className="w-4 h-4 mr-2" />
<Plus className="w-4 h-4 me-2" />
{t('add_new')}
</Button>
)}
+11 -10
View File
@@ -220,7 +220,8 @@ function SidebarRowCounts({
) : null;
return (
<span className="ml-2 flex-shrink-0 flex items-baseline gap-1" title={totalCount > 0 ? `${unreadCount} unread / ${totalCount} total` : `${unreadCount} unread`}>
<span className="ms-2 flex-shrink-0 flex items-baseline gap-1" title={totalCount > 0 ? `${unreadCount} unread / ${totalCount} total` : `${unreadCount} unread`}>
{unreadNode}
{unreadCount > 0 && totalCount > 0 && (
<span className="text-xs text-muted-foreground/60">/</span>
@@ -279,12 +280,12 @@ function SidebarRow({
style={{ paddingBlock: 'var(--density-sidebar-py)' }}
className={cn(
"group w-full flex items-center max-lg:min-h-[44px] text-sm transition-colors duration-150",
isCollapsed ? "justify-center px-1" : "pr-2",
isCollapsed ? "justify-center px-1" : "pe-2",
isVirtual
? "text-muted-foreground"
: isSelected
? "bg-accent text-accent-foreground font-semibold border-l-2 border-primary"
: "hover:bg-muted/50 text-foreground border-l-2 border-transparent",
? "bg-accent text-accent-foreground font-semibold border-s-2 border-primary"
: "hover:bg-muted/50 text-foreground border-s-2 border-transparent",
isValidDropTarget && "bg-primary/20 ring-2 ring-primary ring-inset",
isInvalidDropTarget && "bg-destructive/10 ring-2 ring-destructive/30 ring-inset opacity-50"
)}
@@ -321,7 +322,7 @@ function SidebarRow({
disabled={isVirtual}
className={cn(
"flex items-center gap-2 min-w-0 transition-colors",
isCollapsed ? "justify-center" : "flex-1 text-left",
isCollapsed ? "justify-center" : "flex-1 text-start",
isVirtual && "cursor-default select-none"
)}
title={isCollapsed ? label : undefined}
@@ -390,8 +391,8 @@ function SidebarSectionHeader({
) : (
<ChevronRight className="w-3.5 h-3.5 text-muted-foreground flex-shrink-0" />
)}
{icon && <span className="ml-1.5 flex-shrink-0">{icon}</span>}
<span className={cn(textClass, icon ? "ml-1.5" : "ml-1.5")}>
{icon && <span className="ms-1.5 flex-shrink-0">{icon}</span>}
<span className={cn(textClass, icon ? "ms-1.5" : "ms-1.5")}>
{label}
</span>
{onSettings && (
@@ -409,7 +410,7 @@ function SidebarSectionHeader({
onSettings();
}
}}
className="ml-auto p-1 rounded text-muted-foreground/70 hover:text-foreground hover:bg-muted transition-colors cursor-pointer"
className="ms-auto p-1 rounded text-muted-foreground/70 hover:text-foreground hover:bg-muted transition-colors cursor-pointer"
title={settingsTitle}
>
<Settings className="w-3.5 h-3.5" />
@@ -665,7 +666,7 @@ function VacationBanner() {
>
<Palmtree className="w-3.5 h-3.5 flex-shrink-0" />
<span className="truncate font-medium">{t("vacation_active")}</span>
<Settings className="w-3 h-3 ml-auto flex-shrink-0 opacity-60" />
<Settings className="w-3 h-3 ms-auto flex-shrink-0 opacity-60" />
</button>
);
}
@@ -970,7 +971,7 @@ export function Sidebar({
return (
<div
className={cn(
"relative flex flex-col h-full border-r transition-all duration-300 overflow-hidden",
"relative flex flex-col h-full border-e transition-all duration-300 overflow-hidden",
"bg-secondary border-border",
"max-lg:w-full",
isCollapsed ? "lg:w-12" : "lg:w-full",