fix(ui): harden RTL sidebar and desktop window controls

Keep custom Windows/Linux controls available during platform detection, preserve RTL table order while aligning filenames left, and persist sidebar placement overrides.

Refs #17
This commit is contained in:
NimBold
2026-07-19 02:34:32 +03:30
parent 2668f0b722
commit 60f13f756c
15 changed files with 225 additions and 50 deletions
+5
View File
@@ -532,6 +532,11 @@ const common = {
lookAndFeel: {
language: 'Language',
languageDescription: 'Choose the Firelink interface language.',
sidebarPosition: 'Sidebar position',
sidebarPositionDescription: 'Choose where the sidebar appears. Automatic follows the interface direction.',
sidebarPositionAutomatic: 'Automatic (recommended)',
sidebarPositionLeft: 'Left',
sidebarPositionRight: 'Right',
languageSystem: 'System default',
languageEnglish: 'English',
languageChinese: 'Simplified Chinese',
+42 -37
View File
@@ -8,7 +8,7 @@ const fa = {
unfinished: 'ناتمام',
},
categories: {
musics: 'موسیقی‌ها',
musics: 'موسیقی',
movies: 'فیلم‌ها',
compressed: 'فشرده',
documents: 'اسناد',
@@ -19,8 +19,8 @@ const fa = {
folders: 'پوشه‌ها',
queues: 'صف‌ها',
tools: 'ابزارها',
scheduler: 'زمان‌بند',
speedLimiter: 'محدودکننده سرعت',
scheduler: 'زمان‌بندی',
speedLimiter: 'محدودکنندهٔ سرعت',
logs: 'گزارش‌ها',
settings: 'تنظیمات',
},
@@ -63,8 +63,8 @@ const fa = {
window: {
controls: 'کنترل‌های پنجره',
close: 'بستن',
minimize: وچک کردن',
maximize: زرگ کردن',
minimize: مینه کردن',
maximize: یشینه کردن',
},
downloads: {
actions: {
@@ -86,7 +86,7 @@ const fa = {
downloading: 'در حال دانلود',
processing: 'در حال پردازش',
paused: 'متوقف شده',
completed: 'تکمیل شده',
completed: 'تکمیلشده',
failed: 'ناموفق',
retrying: 'در حال تلاش مجدد',
},
@@ -96,9 +96,9 @@ const fa = {
},
},
speedLimiter: {
title: 'محدودکننده سرعت',
title: 'محدودکنندهٔ سرعت',
unlimited: 'نامحدود',
saveLimit: 'ذخیره محدودیت',
saveLimit: 'ذخیره محدودیت سرعت',
globalSpeedLimit: 'محدودیت سرعت کلی',
description: 'در مورد انتقال‌های جدید و فعال aria2 و دانلودهای رسانه جدید yt-dlp اعمال می‌شود. محدودیت‌های خاص هر دانلود برای آن انتقال‌ها به قوت خود باقی می‌ماند.',
quickPresets: 'پیش‌تنظیم‌های سریع',
@@ -215,7 +215,7 @@ const fa = {
speedCap: 'سقف سرعت',
category: 'دسته',
lastTry: 'آخرین تلاش',
dateAdded: 'تاریخ اضافه شدن',
dateAdded: 'تاریخ افزودن',
destination: 'مقصد',
lastError: 'آخرین خطا',
saved: ' (ذخیره شده)',
@@ -260,9 +260,9 @@ const fa = {
title: 'نیاز به دسترسی ذخیره‌سازی اعتبارنامه',
stores: {
portable: 'پوشه داده‌های قابل‌حمل Firelink',
windows: 'Windows Credential Manager',
linux: 'مخزن اعتبارنامه‌های Linux شما',
macos: 'macOS Keychain',
windows: 'مدیر اعتبارنامه Windows',
linux: 'مخزن اعتبارنامه Linux شما',
macos: 'Keychain macOS',
system: "مخزن اعتبارنامه‌های این سیستم",
siteCredentials: "مخزن اعتبارنامه‌های سیستم",
},
@@ -307,7 +307,7 @@ const fa = {
updateAvailable: 'Firelink {{version}} در دسترس است.',
viewRelease: 'مشاهده انتشار',
sleepPreventionFailed: 'جلوگیری از خواب سیستم به‌روزرسانی نشد: {{detail}}',
schedulerNoQueues: 'زمان‌بند هیچ صف معتبری انتخاب نکرده است. تنظیمات زمان‌بند را به‌روزرسانی کنید.',
schedulerNoQueues: 'زمان‌بند هیچ صف معتبری انتخاب نکرده است. تنظیمات زمان‌بندی را به‌روزرسانی کنید.',
schedulerPauseOneFailed: 'زمان‌بند نتوانست ۱ دانلود را متوقف کند.',
schedulerPauseManyFailed: 'زمان‌بند نتوانست {{count}} دانلود را متوقف کند.',
scheduledIncomplete: 'همه دانلودهای زمان‌بندی‌شده تکمیل نشدند. اقدام سیستم پس از صف رد شد.',
@@ -335,7 +335,7 @@ const fa = {
status: 'وضعیت',
speed: 'سرعت',
eta: 'زمان تخمینی',
dateAdded: 'تاریخ اضافه شدن',
dateAdded: 'تاریخ افزودن',
},
addDownload: 'افزودن دانلود',
resumeAll: 'ادامه همه',
@@ -351,8 +351,8 @@ const fa = {
nonResumableOne: '۱ دانلود از ادامه پشتیبانی نمی‌کند. اگر آن را متوقف کنید، بعداً باید دوباره شروع کنید. آیا مطمئن هستید که می‌خواهید متوقف کنید؟',
nonResumableMany: '{{count}} دانلود از ادامه پشتیبانی نمی‌کنند. اگر آنها را متوقف کنید، بعداً باید دوباره شروع کنید. آیا مطمئن هستید که می‌خواهید متوقف کنید؟',
interactionError: '{{message}}: {{detail}}',
openFileFailed: 'فایل دانلود شده باز نشد',
revealFileFailed: 'نمایش دانلود در Finder ناموفق بود',
openFileFailed: 'باز کردن فایل دانلودشده ناموفق بود',
revealFileFailed: 'نمایش فایل دانلودشده در پوشه ناموفق بود',
pauseFailed: 'توقف دانلود ناموفق بود',
resumeFailed: 'ادامه {{fileName}} ناموفق بود',
moveManyFailed: 'انتقال دانلودها به صف ناموفق بود',
@@ -373,9 +373,9 @@ const fa = {
resume: 'ادامه',
redownload: 'دانلود مجدد',
copyFilePath: 'کپی مسیر فایل',
properties: 'خصوصیات',
properties: 'ویژگی‌ها',
backendRejectedStart: 'درخواست شروع/ادامه توسط موتور دانلود رد شد.',
transferActive: 'نمی‌توانید خصوصیات را در حالی که انتقال فعال است تغییر دهید. ابتدا آن را متوقف کنید.',
transferActive: 'نمی‌توانید ویژگی‌ها را هنگام فعال بودن انتقال تغییر دهید. ابتدا آن را متوقف کنید.',
redownloadNotFound: 'دانلود مجدد ناموفق: دانلود پیدا نشد.',
redownloadActive: 'نمی‌توانید یک دانلود {{status}} را دوباره دانلود کنید. ابتدا آن را متوقف کنید یا منتظر بمانید تا تمام شود.',
originalUrlMissing: 'دانلود مجدد ناموفق: URL اصلی وجود ندارد.',
@@ -433,14 +433,14 @@ const fa = {
availableMediaStreams: 'جریان‌های رسانه موجود',
metadataUnavailable: 'متادیتا در دسترس نیست. پیش از افزودن این رسانه، متادیتا را تازه‌سازی کنید.',
saveLocation: 'محل ذخیره',
browse: 'مرور',
browse: 'انتخاب',
categoryFolders: 'فایل‌ها در پوشه‌های دسته سازماندهی خواهند شد.',
sharedFolder: 'تمام دانلودهای انتخاب‌شده از این پوشه استفاده خواهند کرد.',
transferSettings: 'تنظیمات انتقال',
connectionsPerFile: 'اتصالات در هر فایل',
connectionsPerFileAria: 'اتصالات در هر فایل',
limitSpeedPerFile: 'محدودیت سرعت در هر فایل',
speedLimitPerFileAria: 'محدودیت سرعت در هر فایل',
speedLimitPerFileAria: 'محدودیت سرعت برای هر فایل',
authorization: 'احراز هویت',
useAuthorization: 'استفاده از احراز هویت',
username: 'نام کاربری',
@@ -448,7 +448,7 @@ const fa = {
advancedTransfer: 'انتقال پیشرفته',
verifyChecksum: 'تأیید چک‌سام',
checksumAlgorithm: 'الگوریتم چک‌سام',
expectedDigest: 'هش موردانتظار',
expectedDigest: 'هش مورد انتظار',
headers: 'هدرها',
requestHeaders: 'هدرهای درخواست',
cookies: 'کوکی‌ها',
@@ -495,11 +495,11 @@ const fa = {
thisOs: 'این سیستم‌عامل',
checking: 'در حال بررسی...',
ready: 'آماده',
errorMissing: 'خطا / ناموجود',
errorMissing: 'خطا / یافت نشد',
hideTechnicalDetails: 'پنهان کردن جزئیات فنی',
showTechnicalDetails: 'نمایش جزئیات فنی',
binary: 'باینری',
expected: 'موردانتظار',
expected: قدار مورد انتظار',
error: 'خطا',
tip: 'نکته',
stderr: 'stderr',
@@ -532,6 +532,11 @@ const fa = {
lookAndFeel: {
language: 'زبان',
languageDescription: 'زبان رابط Firelink را انتخاب کنید.',
sidebarPosition: 'جایگاه نوار کناری',
sidebarPositionDescription: 'مشخص کنید نوار کناری کجا نمایش داده شود. حالت خودکار از جهت رابط کاربری پیروی می‌کند.',
sidebarPositionAutomatic: 'خودکار (پیشنهادشده)',
sidebarPositionLeft: 'چپ',
sidebarPositionRight: 'راست',
languageSystem: 'زبان سیستم',
languageEnglish: 'انگلیسی',
languageChinese: 'چینی ساده‌شده',
@@ -539,32 +544,32 @@ const fa = {
languagePersian: 'فارسی',
languageUkrainian: 'اوکراینی',
languageRussian: 'روسی',
appTheme: 'پوسته برنامه',
theme: 'پوسته',
ariaLabel: 'پوسته برنامه',
appTheme: 'ظاهر برنامه',
theme: 'ظاهر',
ariaLabel: 'ظاهر برنامه',
system: 'سیستم',
light: 'روشن',
dark: 'تاریک',
dracula: 'Dracula',
nord: 'Nord',
systemAppearance: 'سیستم از ظاهر روشن یا تاریک فعلی {{platform}} پیروی می‌کند.',
systemAppearance: 'برنامه از حالت روشن یا تاریک فعلی {{platform}} پیروی می‌کند.',
display: 'نمایش',
fontSize: 'اندازه قلم',
fontSizeDescription: 'لیست دانلودها و کنترل‌های فشرده را تغییر مقیاس می‌دهد.',
fontSizeDescription: 'اندازه فهرست دانلود و کنترل‌های فشرده را تغییر می‌دهد.',
small: 'کوچک',
standard: 'استاندارد',
large: 'بزرگ',
listDensity: 'تراکم لیست',
listDensity: 'تراکم فهرست',
listDensityDescription: 'ارتفاع سطر، فاصله‌گذاری و مقیاس نوار پیشرفت را تغییر می‌دهد.',
compact: 'فشرده',
comfortable: 'راحت',
comfortable: 'معمولی',
relaxed: 'بسیار راحت',
osIntegration: 'یکپارچه‌سازی سیستم‌عامل',
dockBadge: 'نمایش نشان روی آیکون Dock',
dockBadgeDescription: 'تعداد دانلودهای فعال را روی آیکون Firelink در Dock نشان می‌دهد.',
menuBarIcon: 'نمایش آیکون نوار منو',
statusIndicatorIcon: 'نمایش آیکون نشانگر وضعیت',
systemTrayIcon: 'نمایش آیکون System Tray',
systemTrayIcon: 'نمایش آیکون سینی سیستم',
macosTrayDescription: 'دسترسی سریع از نوار منوی macOS فراهم می‌کند.',
windowsTrayDescription: 'دسترسی سریع از ناحیه اعلان‌های Windows فراهم می‌کند.',
linuxTrayDescription: 'در صورت وجود، دسترسی سریع از سینی دسکتاپ یا ناحیه وضعیت فراهم می‌کند.',
@@ -602,15 +607,15 @@ const fa = {
firefoxWindows: 'Firefox (Windows)',
firefoxMacos: 'Firefox (macOS)',
safariMacos: 'Safari (macOS)',
windowsDesktop: 'Windows دسکتاپ',
macosDesktop: 'macOS دسکتاپ',
windowsDesktop: 'دسکتاپ Windows',
macosDesktop: 'دسکتاپ macOS',
},
locations: {
baseDownloadFolder: 'پوشه پایه دانلود',
baseDownloadFolder: 'پوشه اصلی دانلود',
baseDownloadFolderDescription: 'پوشه‌های دسته خودکار در داخل این پوشه ایجاد می‌شوند.',
browse: 'مرور',
baseFolderCreateFailed: 'پوشه پایه ذخیره شد، اما ایجاد پوشه‌های دسته ناموفق بود: {{detail}}',
baseFolderUpdated: 'پوشه پایه دانلود به‌روزرسانی شد',
browse: 'انتخاب',
baseFolderCreateFailed: 'پوشه اصلی ذخیره شد، اما ایجاد پوشه‌های دسته ناموفق بود: {{detail}}',
baseFolderUpdated: 'پوشه اصلی دانلود به‌روزرسانی شد',
askWhereToSave: 'هنگام افزودن دانلود بپرس کجا ذخیره شود',
rememberLastUsedDownloadDirectory: 'پوشه دانلود اخیراً استفاده‌شده را به خاطر بسپار',
rememberLastUsedDownloadDirectoryDescription: 'از آخرین پوشه انتخاب‌شده در پنجره افزودن برای دانلود بعدی تا زمان راه‌اندازی مجدد برنامه استفاده کنید.',
+5
View File
@@ -532,6 +532,11 @@ const he = {
lookAndFeel: {
language: 'שפה',
languageDescription: 'בחר את שפת הממשק של Firelink.',
sidebarPosition: 'מיקום סרגל הצד',
sidebarPositionDescription: 'בחר היכן יופיע סרגל הצד. מצב אוטומטי עוקב אחר כיוון הממשק.',
sidebarPositionAutomatic: 'אוטומטי (מומלץ)',
sidebarPositionLeft: 'שמאל',
sidebarPositionRight: 'ימין',
languageSystem: 'שפת המערכת',
languageEnglish: 'אנגלית',
languageChinese: 'סינית מפושטת',
+5
View File
@@ -532,6 +532,11 @@ const ru = {
lookAndFeel: {
language: 'Язык',
languageDescription: 'Выберите язык интерфейса Firelink.',
sidebarPosition: 'Положение боковой панели',
sidebarPositionDescription: 'Выберите, где отображать боковую панель. Автоматический режим учитывает направление интерфейса.',
sidebarPositionAutomatic: 'Автоматически (рекомендуется)',
sidebarPositionLeft: 'Слева',
sidebarPositionRight: 'Справа',
languageSystem: 'Язык системы',
languageEnglish: 'Английский',
languageChinese: 'Упрощённый китайский',
+5
View File
@@ -532,6 +532,11 @@ const uk = {
lookAndFeel: {
language: 'Мова',
languageDescription: 'Виберіть мову інтерфейсу Firelink.',
sidebarPosition: 'Положення бічної панелі',
sidebarPositionDescription: 'Виберіть, де відображати бічну панель. Автоматичний режим враховує напрямок інтерфейсу.',
sidebarPositionAutomatic: 'Автоматично (рекомендовано)',
sidebarPositionLeft: 'Ліворуч',
sidebarPositionRight: 'Праворуч',
languageSystem: 'Мова системи',
languageEnglish: 'Англійська',
languageChinese: 'Спрощена китайська',
+5
View File
@@ -532,6 +532,11 @@ const zhCN = {
lookAndFeel: {
language: '语言',
languageDescription: '选择 Firelink 的界面语言。',
sidebarPosition: '侧边栏位置',
sidebarPositionDescription: '选择侧边栏显示的位置。“自动”会跟随界面文字方向。',
sidebarPositionAutomatic: '自动(推荐)',
sidebarPositionLeft: '左侧',
sidebarPositionRight: '右侧',
languageSystem: '系统默认',
languageEnglish: '英语',
languageChinese: '简体中文',