From f441f3e6d182ec573477e123b0f8ba2ddd05b1a4 Mon Sep 17 00:00:00 2001
From: Linus Rath <139418639+rathlinus@users.noreply.github.com>
Date: Wed, 28 Oct 2026 12:58:10 +0100
Subject: [PATCH] fix: show calendar, subscription and account addresses in
settings left to right in arabic
---
.../calendar-management-settings.test.tsx | 15 +++++++++++++-
.../__tests__/settings-ltr-addresses.test.tsx | 20 +++++++++++++++++++
.../settings/account-security-settings.tsx | 2 +-
components/settings/account-settings.tsx | 6 +++---
.../settings/calendar-management-settings.tsx | 5 +++--
components/settings/multi-account-push.tsx | 4 ++--
.../settings/share-collection-dialog.tsx | 2 +-
components/settings/sidebar-apps-settings.tsx | 4 ++--
8 files changed, 46 insertions(+), 12 deletions(-)
create mode 100644 components/settings/__tests__/settings-ltr-addresses.test.tsx
diff --git a/components/settings/__tests__/calendar-management-settings.test.tsx b/components/settings/__tests__/calendar-management-settings.test.tsx
index 439eb43d6..4f2b4bdce 100644
--- a/components/settings/__tests__/calendar-management-settings.test.tsx
+++ b/components/settings/__tests__/calendar-management-settings.test.tsx
@@ -68,9 +68,22 @@ describe('CalendarManagementSettings CalDAV fallback address', () => {
render();
- expect(await screen.findByText('https://host.example/stalwart/.well-known/caldav')).toBeInTheDocument();
+ const url = await screen.findByText('https://host.example/stalwart/.well-known/caldav');
+ // Left to right in Arabic too: the start of the address stays in view.
+ expect(url).toHaveAttribute('dir', 'ltr');
vi.restoreAllMocks();
});
+
+ it('shows a subscription address left to right', () => {
+ useAuthStore.setState({ client: { getAccountId: () => 'acct-1' }, serverUrl: null, username: null } as never);
+ useCalendarStore.setState({
+ calendars: [appleColored],
+ icalSubscriptions: [{ id: 's', name: 'Holidays', url: 'https://example.com/holidays.ics', color: '#ff0000', calendarId: 'x' }],
+ updateCalendar: vi.fn(),
+ } as never);
+ render();
+ expect(screen.getByText('https://example.com/holidays.ics')).toHaveAttribute('dir', 'ltr');
+ });
});
// Phone: seven icons in a row hid the calendar names. The row actions are
diff --git a/components/settings/__tests__/settings-ltr-addresses.test.tsx b/components/settings/__tests__/settings-ltr-addresses.test.tsx
new file mode 100644
index 000000000..6fcaf9ea0
--- /dev/null
+++ b/components/settings/__tests__/settings-ltr-addresses.test.tsx
@@ -0,0 +1,20 @@
+import { render, screen } from '@testing-library/react';
+import { afterEach, describe, expect, it } from 'vitest';
+import { useSettingsStore } from '@/stores/settings-store';
+import { SidebarAppsSettings } from '../sidebar-apps-settings';
+
+// Addresses read left to right in an Arabic layout too; in a right-to-left
+// box a cut address lost its start ("https://") instead of its end.
+
+const initial = useSettingsStore.getState();
+afterEach(() => { useSettingsStore.setState(initial, true); });
+
+describe('addresses in Settings', () => {
+ it('shows a sidebar app address left to right', () => {
+ useSettingsStore.setState({
+ sidebarApps: [{ id: 'a', name: 'Wiki', url: 'https://wiki.example.com/start', icon: 'globe', openMode: 'inline' }],
+ } as never);
+ render();
+ expect(screen.getByText('https://wiki.example.com/start')).toHaveAttribute('dir', 'ltr');
+ });
+});
diff --git a/components/settings/account-security-settings.tsx b/components/settings/account-security-settings.tsx
index 11697c9b6..3050067d8 100644
--- a/components/settings/account-security-settings.tsx
+++ b/components/settings/account-security-settings.tsx
@@ -334,7 +334,7 @@ function TotpSection() {
)}
- {setupUrl}
+ {setupUrl}
diff --git a/components/settings/account-settings.tsx b/components/settings/account-settings.tsx
index 22a954062..51ad26d32 100644
--- a/components/settings/account-settings.tsx
+++ b/components/settings/account-settings.tsx
@@ -155,13 +155,13 @@ export function AccountSettings() {
{/* Email Address */}
- {email ? toUnicodeEmail(email) : tCommon('unknown')}
+ {email ? toUnicodeEmail(email) : tCommon('unknown')}
{/* Username / Login (show when it differs from email) */}
{username && username !== email && (
- {toUnicodeEmail(username)}
+ {toUnicodeEmail(username)}
)}
@@ -410,7 +410,7 @@ function AccountRow({
)}
-
+
{toUnicodeEmail(account.email || account.username)}
diff --git a/components/settings/calendar-management-settings.tsx b/components/settings/calendar-management-settings.tsx
index 00d901eef..bc41bf66a 100644
--- a/components/settings/calendar-management-settings.tsx
+++ b/components/settings/calendar-management-settings.tsx
@@ -727,7 +727,8 @@ export function CalendarManagementSettings() {
return (
-
+ {/* An address reads left to right in Arabic too, cut at its end. */}
+
{caldavUrl}
{
const safeUrl = redactUrlCredentials(sub.url);
return (
-
+
{safeUrl}
);
diff --git a/components/settings/multi-account-push.tsx b/components/settings/multi-account-push.tsx
index 532313745..97377b34b 100644
--- a/components/settings/multi-account-push.tsx
+++ b/components/settings/multi-account-push.tsx
@@ -125,7 +125,7 @@ export function MultiAccountPushSettings({ relayBaseUrl }: { relayBaseUrl?: stri
{account.displayName || account.label || account.username}
- {account.email || account.username} · {enabled[account.id] ? t('state_on') : t('state_off')}
+ {account.email || account.username} · {enabled[account.id] ? t('state_on') : t('state_off')}
@@ -143,7 +143,7 @@ export function MultiAccountPushSettings({ relayBaseUrl }: { relayBaseUrl?: stri
{failures.length > 0 &&
{failures.map(f => -
{f.name}
- {f.email && f.email !== f.name && ({f.email})}
+ {f.email && f.email !== f.name && ({f.email})}
: {f.reason}
)}
}
diff --git a/components/settings/share-collection-dialog.tsx b/components/settings/share-collection-dialog.tsx
index a9412dc62..cd42ea6f6 100644
--- a/components/settings/share-collection-dialog.tsx
+++ b/components/settings/share-collection-dialog.tsx
@@ -401,7 +401,7 @@ export function ShareCollectionDialog({
)}
{p.email && p.email !== p.name && (
-
{p.email}
+
{p.email}
)}
{savingId === p.id && }
diff --git a/components/settings/sidebar-apps-settings.tsx b/components/settings/sidebar-apps-settings.tsx
index cf3a99214..ccabe35fb 100644
--- a/components/settings/sidebar-apps-settings.tsx
+++ b/components/settings/sidebar-apps-settings.tsx
@@ -206,7 +206,7 @@ function ManagedAppsSection() {
{app.name}
-
{app.url}
+
{app.url}
@@ -332,7 +332,7 @@ export function SidebarAppsSettings() {
{app.name}
-
{app.url}
+
{app.url}