From de4332de620121e2a060dd1983a6ef08b87e624d Mon Sep 17 00:00:00 2001 From: am6256670-debug Date: Thu, 22 Oct 2026 00:25:16 +0300 Subject: [PATCH 01/10] Add Arabic language option and translations --- WtProgram/Shared/Localization.fs | 336 ++++++++++++++++++++++++++++++- 1 file changed, 334 insertions(+), 2 deletions(-) diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index fa013a33..826205a0 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -9,7 +9,338 @@ type LocalizedText = { en:string; zh:string; ja:string } /// assemblies cannot be statically linked, so a .resx translation would not ship.) module Localization = /// Supported languages: code, name shown in the language menu, compact label. - let languages = [| "en","English","EN"; "zh","中文","中"; "ja","日本語","日" |] + /// Arabic translations keyed by the source English text. + /// Untranslated dynamic messages fall back to English rather than hiding content. + let private arabicTranslations = + dict [ + ("", ""); + ("OK", "موافق"); + ("Cancel", "إلغاء"); + ("Save", "حفظ"); + ("Refresh", "تحديث"); + ("Name", "الاسم"); + ("Title", "العنوان"); + ("Left", "يسار"); + ("Top", "أعلى"); + ("Bottom", "أسفل"); + ("Center", "توسيط"); + ("Right", "يمين"); + ("Never", "أبدًا"); + ("When maximized", "عند التكبير"); + ("Always", "دائمًا"); + ("Operation failed", "فشلت العملية"); + ("WindowTabs is already running.", "برنامج WindowTabs قيد التشغيل بالفعل."); + ("WindowTabs could not continue", "تعذّر على WindowTabs المتابعة"); + ("Settings save failed", "فشل حفظ الإعدادات"); + ("Settings error", "خطأ في الإعدادات"); + ("Exit WindowTabs", "إنهاء WindowTabs"); + ("WindowTabs ran into a problem", "واجه WindowTabs مشكلة"); + ("It kept running. The details are in the crash log; click to show it.", "استمر البرنامج في العمل. التفاصيل موجودة في سجل الأعطال؛ انقر لعرضه."); + ("Tab position", "موضع علامات التبويب"); + ("Show tab titles", "إظهار عناوين علامات التبويب"); + ("Show icons only", "إظهار الأيقونات فقط"); + ("New tab", "علامة تبويب جديدة"); + ("Rename", "إعادة تسمية"); + ("Reset name", "إعادة تعيين الاسم"); + ("Sort by app and title", "ترتيب حسب التطبيق والعنوان"); + ("Combine taskbar icons", "دمج أيقونات شريط المهام"); + ("Change taskbar icon…", "تغيير أيقونة شريط المهام…"); + ("Restore taskbar icon", "استعادة أيقونة شريط المهام"); + ("Switch by number", "التبديل باستخدام الرقم"); + ("Enable tabs", "تمكين علامات التبويب"); + ("Auto-group windows", "تجميع النوافذ تلقائيًا"); + ("Close", "إغلاق"); + ("Close others", "إغلاق علامات التبويب الأخرى"); + ("Close all", "إغلاق الكل"); + ("Settings...", "الإعدادات..."); + ("Copy", "نسخ"); + ("Move", "نقل"); + ("Move to %1", "نقل إلى %1"); + ("Copy to %1", "نسخ إلى %1"); + ("WindowTabs Settings", "إعدادات WindowTabs"); + ("Search", "بحث"); + ("Search settings", "البحث في الإعدادات"); + ("Search suggestions", "اقتراحات البحث"); + ("Sidebar", "الشريط الجانبي"); + ("Search results", "نتائج البحث"); + ("No matching settings.", "لا توجد إعدادات مطابقة."); + ("Follow Windows", "اتباع إعدادات Windows"); + ("How to use", "طريقة الاستخدام"); + ("Page scroll", "تمرير الصفحة"); + ("General", "عام"); + ("Appearance", "المظهر"); + ("Shortcuts", "اختصارات"); + ("App rules", "قواعد التطبيقات"); + ("Workspaces", "مساحات العمل"); + ("Support", "الدعم"); + ("color colour", "اللون الألوان"); + ("size", "الحجم"); + ("hotkey", "مفتاح الاختصار"); + ("Theme", "السمة"); + ("System follows your Windows app mode.", "يتبع خيار النظام وضع التطبيقات في Windows."); + ("dark mode", "الوضع الداكن"); + ("Language", "اللغة"); + ("Follow Windows uses your Windows display language.", "يستخدم خيار اتباع Windows لغة العرض المحددة في Windows."); + ("locale", "الإعدادات المحلية"); + ("Start with Windows", "التشغيل مع Windows"); + ("Runs in the system tray after you sign in.", "يعمل في منطقة الإعلام بعد تسجيل الدخول."); + ("startup autostart", "بدء التشغيل التشغيل التلقائي"); + ("Use tabs for new apps", "استخدام علامات التبويب للتطبيقات الجديدة"); + ("Only apps first discovered after this change. Existing apps keep their tab setting.", "ينطبق ذلك على التطبيقات التي يكتشفها البرنامج لأول مرة بعد هذا التغيير فقط. وتحتفظ التطبيقات الموجودة بإعداد علامات التبويب الحالي."); + ("Dim tabs in inactive groups", "تخفيف لون علامات التبويب في المجموعات غير النشطة"); + ("Make the active group easier to spot.", "لتسهيل تمييز المجموعة النشطة."); + ("fade", "تلاشي"); + ("Auto-hide tabs", "إخفاء علامات التبويب تلقائيًا"); + ("Show a thin strip until hover.", "إظهار شريط رفيع حتى تمرير المؤشر فوقه."); + ("collapse", "طيّ"); + ("Show tabs briefly after switching", "إظهار علامات التبويب لفترة وجيزة بعد التبديل"); + ("For about a second, so you can see where you are.", "لمدة ثانية تقريبًا لتتمكن من معرفة موضعك."); + ("peek", "معاينة"); + ("Position tabs", "موضع علامات التبويب"); + ("vertical horizontal sidebar left right", "رأسي أفقي شريط جانبي يسار يمين"); + ("For left/right tabs. Drag a column edge to resize one group, down to an icon rail.", "للعلامات الجانبية اليمنى أو اليسرى. اسحب حافة العمود لتغيير عرض مجموعة واحدة، حتى يصبح شريطًا للأيقونات فقط."); + ("Vertical tab width", "عرض علامات التبويب الرأسية"); + ("vertical sidebar width size", "رأسي شريط جانبي عرض حجم"); + ("Align tabs", "محاذاة علامات التبويب"); + ("alignment position", "محاذاة موضع"); + ("Combine taskbar icons per group", "دمج أيقونات شريط المهام لكل مجموعة"); + ("merge", "دمج"); + ("Use WindowTabs for Alt+Tab", "استخدام WindowTabs عند الضغط على Alt+Tab"); + ("Replaces the Windows switcher.", "يستبدل أداة التبديل بين النوافذ في Windows."); + ("task switcher", "مبدّل المهام"); + ("Switcher style", "نمط أداة التبديل"); + ("Large icons in a row, or a list with full window titles.", "أيقونات كبيرة في صف، أو قائمة تعرض عناوين النوافذ كاملة."); + ("layout", "التخطيط"); + ("Group windows in Alt+Tab", "تجميع النوافذ في Alt+Tab"); + ("Each group appears as one item.", "تظهر كل مجموعة كعنصر واحد."); + ("switcher", "أداة التبديل"); + ("Switch to next tab", "الانتقال إلى علامة التبويب التالية"); + ("Switch to previous tab", "الانتقال إلى علامة التبويب السابقة"); + ("Switch windows", "تبديل النوافذ"); + ("Switch to a window by title or app name.", "الانتقال إلى نافذة باستخدام عنوانها أو اسم التطبيق."); + ("find", "بحث"); + ("Starts the current tab's app again.", "يشغّل التطبيق الخاص بعلامة التبويب الحالية مرة أخرى."); + ("new window", "نافذة جديدة"); + ("Close tab", "إغلاق علامة التبويب"); + ("Closes the window of the tab in front.", "يغلق النافذة الخاصة بعلامة التبويب الحالية."); + ("close window", "إغلاق النافذة"); + ("Switch tabs by number", "التبديل بين علامات التبويب باستخدام الأرقام"); + ("Hold a modifier key and press 1–9.", "اضغط باستمرار على مفتاح تعديل ثم اضغط على رقم من 1 إلى 9."); + ("digit", "رقم"); + ("Modifier key for 1–9", "مفتاح التعديل للأرقام من 1 إلى 9"); + ("number", "رقم"); + ("Switch tabs with a leader key", "التبديل باستخدام مفتاح تمهيدي"); + ("Press the leader, then a selection key. Esc cancels.", "اضغط المفتاح التمهيدي ثم مفتاح الاختيار. يلغي Esc العملية."); + ("Selection keys", "مفاتيح الاختيار"); + ("Use unique letters or digits, in tab order.", "استخدم أحرفًا أو أرقامًا غير مكررة حسب ترتيب علامات التبويب."); + ("leader keys letters home row", "مفتاح تمهيدي أحرف الصف الأوسط"); + ("Use at least one unique letter, digit or unshifted punctuation key.", "استخدم حرفًا أو رقمًا أو مفتاح ترقيم غير مكرر واحدًا على الأقل دون Shift."); + ("Tab selection leader", "المفتاح التمهيدي لاختيار علامة التبويب"); + ("Color", "اللون"); + ("Custom…", "مخصص…"); + ("Clear color", "مسح اللون"); + ("Remember color for current app", "تذكّر لون التطبيق الحالي"); + ("Grey", "رمادي"); + ("Blue", "أزرق"); + ("Red", "أحمر"); + ("Yellow", "أصفر"); + ("Green", "أخضر"); + ("Pink", "وردي"); + ("Purple", "أرجواني"); + ("Cyan", "سماوي"); + ("Orange", "برتقالي"); + ("Lavender", "لافندر"); + ("Olive", "زيتي"); + ("Rose", "وردي داكن"); + ("Lime", "ليموني"); + ("Navy", "كحلي"); + ("Teal", "أزرق مخضر"); + ("Coral", "مرجاني"); + ("Tab color coding", "ترميز علامات التبويب بالألوان"); + ("Auto-assign colors by window or app.", "تعيين الألوان تلقائيًا حسب النافذة أو التطبيق."); + ("colorize rainbow", "تلوين قوس قزح"); + ("Off", "إيقاف"); + ("By window", "حسب النافذة"); + ("By app", "حسب التطبيق"); + ("Change it for one tab from the tab menu. That color comes first, and shows even when this is off.", "غيّر لون علامة تبويب واحدة من قائمتها. تكون الأولوية لهذا اللون ويظهر حتى عند إيقاف هذا الخيار."); + ("Show colors as", "عرض الألوان على شكل"); + ("stripe fill", "شريط تعبئة"); + ("Stripe", "شريط"); + ("Fill", "تعبئة"); + ("Enable or disable it for one app from the tab menu.", "يمكن تمكينه أو تعطيله لتطبيق واحد من قائمة علامة التبويب."); + ("Ctrl", "Ctrl"); + ("Alt", "Alt"); + ("Switch tabs on hover", "التبديل بين علامات التبويب عند تمرير المؤشر"); + ("Rest the pointer on a tab instead of clicking.", "ضع المؤشر فوق علامة تبويب بدلًا من النقر عليها."); + ("mouse over", "تمرير المؤشر"); + ("Switch tabs with Shift + scroll", "التبديل بين علامات التبويب باستخدام Shift والتمرير"); + ("Works anywhere over a grouped window. Over the tab bar, Shift isn't needed.", "يعمل في أي مكان فوق نافذة مجمّعة. لا تحتاج إلى Shift فوق شريط علامات التبويب."); + ("wheel", "عجلة التمرير"); + ("Move tabs with Ctrl + scroll", "تحريك علامات التبويب باستخدام Ctrl والتمرير"); + ("Over the tab bar, moves the current tab left or right.", "فوق شريط علامات التبويب، ينقل علامة التبويب الحالية إلى اليسار أو اليمين."); + ("wheel reorder", "عجلة التمرير لإعادة الترتيب"); + ("Middle-click closes a tab", "النقر الأوسط يغلق علامة تبويب"); + ("Press the wheel on a tab to close its window.", "اضغط بعجلة الفأرة على علامة التبويب لإغلاق نافذتها."); + ("wheel click", "النقر بعجلة الفأرة"); + ("Text and close button", "النص وزر الإغلاق"); + ("Inactive tab", "علامة تبويب غير نشطة"); + ("Active tab", "علامة تبويب نشطة"); + ("Hovered tab", "علامة التبويب التي يشير إليها المؤشر"); + ("Tab style", "نمط علامة التبويب"); + ("How the active tab stands out from the rest.", "كيفية تمييز علامة التبويب النشطة عن البقية."); + ("shape folder pill", "الشكل مجلد كبسولة"); + ("Left/right tabs have a minimum height of 32 px.", "يبلغ الحد الأدنى لارتفاع علامات التبويب الجانبية 32 بكسل."); + ("Tab height", "ارتفاع علامة التبويب"); + ("Maximum tab width", "أقصى عرض لعلامة التبويب"); + ("Tab spacing", "المسافة بين علامات التبويب"); + ("gap", "فجوة"); + ("Side margin", "الهامش الجانبي"); + ("Distance from the window edges.", "المسافة من حواف النافذة."); + ("indent padding", "مسافة بادئة حشو"); + ("Choose apps for tabs and automatic grouping.", "اختر التطبيقات التي تستخدم علامات التبويب والتجميع التلقائي."); + ("process program", "عملية برنامج"); + ("Save and restore window layouts.", "حفظ تخطيطات النوافذ واستعادتها."); + ("session", "جلسة"); + ("Troubleshooting report and where to get help.", "تقرير استكشاف الأخطاء وإصلاحها ومكان الحصول على المساعدة."); + ("about version log", "حول الإصدار السجل"); + ("Location", "الموقع"); + ("folder path portable", "مجلد مسار محمول"); + ("Back up and restore", "النسخ الاحتياطي والاستعادة"); + ("Export all settings to a file, or import them and restart.", "تصدير جميع الإعدادات إلى ملف، أو استيرادها ثم إعادة التشغيل."); + ("export import", "تصدير استيراد"); + ("Reset to defaults", "إعادة التعيين إلى الإعدادات الافتراضية"); + ("Then restarts. App rules and workspaces can be kept.", "ثم يعاد التشغيل. يمكن الاحتفاظ بقواعد التطبيقات ومساحات العمل."); + ("factory", "إعدادات المصنع"); + ("Settings file", "ملف الإعدادات"); + ("Open folder", "فتح المجلد"); + ("Export…", "تصدير…"); + ("Import…", "استيراد…"); + ("Settings exported.", "تم تصدير الإعدادات."); + ("Reset…", "إعادة تعيين…"); + ("Reset", "إعادة تعيين"); + ("Reset settings", "إعادة تعيين الإعدادات"); + ("Also clear:", "مسح أيضًا:"); + ("Import settings", "استيراد الإعدادات"); + ("This file does not contain WindowTabs settings.", "لا يحتوي هذا الملف على إعدادات WindowTabs."); + ("Startup", "بدء التشغيل"); + ("Tab behavior", "سلوك علامات التبويب"); + ("Taskbar", "شريط المهام"); + ("Window switcher", "مبدّل النوافذ"); + ("System", "النظام"); + ("Light", "فاتح"); + ("Dark", "داكن"); + ("File Explorer theme preview", "معاينة سمة مستكشف الملفات"); + ("Tab colors", "ألوان علامات التبويب"); + ("Color preset", "مجموعة ألوان جاهزة"); + ("Custom", "مخصص"); + ("Horizontal", "أفقي"); + ("Vertical", "رأسي"); + ("Joined", "متصل"); + ("Folder", "مجلد"); + ("Floating", "عائم"); + ("Before", "قبل"); + ("After", "بعد"); + ("Set automatically while Tab color coding is By window or By app with Fill.", "يُضبط تلقائيًا عندما يكون ترميز الألوان حسب النافذة أو التطبيق مع خيار التعبئة."); + ("Text color is adjusted on some tabs to stay readable.", "يُعدّل لون النص في بعض علامات التبويب ليظل مقروءًا."); + ("Reset colors", "إعادة تعيين الألوان"); + ("Tab layout", "تخطيط علامات التبويب"); + ("Reset tab layout", "إعادة تعيين تخطيط علامات التبويب"); + ("Default", "افتراضي"); + ("Slate", "رمادي أردوازي"); + ("Sand", "رملي"); + ("Amber", "كهرماني"); + ("Black", "أسود"); + ("White", "أبيض"); + ("Gray", "رمادي"); + ("Color picker: arrow keys adjust saturation and brightness; Shift + arrow keys adjust hue", "منتقي الألوان: تعدّل مفاتيح الأسهم التشبع والسطوع؛ وتعدّل الأسهم مع Shift درجة اللون"); + ("Choose color", "اختيار اللون"); + ("Decrease", "تقليل"); + ("Increase", "زيادة"); + ("Keyboard", "لوحة المفاتيح"); + ("Mouse", "الفأرة"); + ("Click a shortcut, then press the new combination. Esc cancels.", "انقر فوق اختصار ثم اضغط مجموعة المفاتيح الجديدة. يلغي Esc العملية."); + ("Restore default shortcuts", "استعادة الاختصارات الافتراضية"); + ("Shortcut already in use", "الاختصار مستخدم بالفعل"); + ("Already set", "تم تعيينه بالفعل"); + ("Include Ctrl or Alt", "يجب أن يتضمن Ctrl أو Alt"); + ("Press a shortcut…", "اضغط اختصارًا…"); + ("Not set", "غير معيّن"); + ("Type a title or app name to switch windows", "اكتب عنوانًا أو اسم تطبيق للتبديل بين النوافذ"); + ("No matching windows.", "لا توجد نوافذ مطابقة."); + ("Another desktop", "سطح مكتب آخر"); + ("Add application", "إضافة تطبيق"); + ("Delete", "حذف"); + ("This application already has a grouping rule.", "لدى هذا التطبيق قاعدة تجميع بالفعل."); + ("Groups across apps", "مجموعات تضم تطبيقات مختلفة"); + ("Applications", "التطبيقات"); + ("Add group", "إضافة مجموعة"); + ("Select a group or rule to edit here. Changes save automatically.", "حدد مجموعة أو قاعدة لتحريرها هنا. تُحفظ التغييرات تلقائيًا."); + ("New rule", "قاعدة جديدة"); + ("Enter a group name.", "أدخل اسم المجموعة."); + ("A group with this name already exists.", "توجد مجموعة بهذا الاسم بالفعل."); + ("Application", "التطبيق"); + ("Add an app", "إضافة تطبيق"); + ("Ungroup", "إلغاء التجميع"); + ("Remove from group", "إزالة من المجموعة"); + ("Browse…", "استعراض…"); + ("Applications (*.exe)|*.exe", "التطبيقات (*.exe)|*.exe"); + ("Application only", "التطبيق فقط"); + ("Target group", "المجموعة المستهدفة"); + ("Existing group", "مجموعة موجودة"); + ("Enabled", "ممكّن"); + ("Add rule", "إضافة قاعدة"); + ("Invalid grouping rule", "قاعدة التجميع غير صالحة"); + ("Choose an application and enter a target group.", "اختر تطبيقًا وأدخل المجموعة المستهدفة."); + ("Enter a title pattern, or choose Application only.", "أدخل نمطًا للعنوان أو اختر «التطبيق فقط»."); + ("Tabs", "علامات التبويب"); + ("Auto-group", "التجميع التلقائي"); + ("Windows apps", "تطبيقات Windows"); + ("Windows grouped by dragging", "النوافذ المجمّعة بالسحب"); + ("Scanning…", "جارٍ الفحص…"); + ("Scan failed: ", "فشل الفحص: "); + ("Save and restore window groups and positions.", "حفظ مجموعات النوافذ ومواضعها واستعادتها."); + ("Save layout", "حفظ التخطيط"); + ("Restore selected", "استعادة المحدد"); + ("Match method", "طريقة المطابقة"); + ("Exact match", "مطابقة تامة"); + ("Starts with", "يبدأ بـ"); + ("Ends with", "ينتهي بـ"); + ("Contains", "يحتوي على"); + ("Regular expression", "تعبير نمطي"); + ("Workspace restore", "استعادة مساحة العمل"); + ("Restored", "تمت الاستعادة"); + ("Not found", "لم يتم العثور عليه"); + ("Failed", "فشل"); + ("These windows are closed, or their app is not running.", "هذه النوافذ مغلقة أو أن التطبيق الخاص بها لا يعمل."); + ("Invalid workspace setting", "إعداد مساحة العمل غير صالح"); + ("Workspace data", "بيانات مساحة العمل"); + ("Window title is missing or exceeds 4,096 characters.", "عنوان النافذة مفقود أو يتجاوز 4096 حرفًا."); + ("Unknown title match method.", "طريقة مطابقة العنوان غير معروفة."); + ("Expected an object.", "كان متوقعًا وجود كائن."); + (": expected a list.", ": كان متوقعًا وجود قائمة."); + ("Missing placement.", "موضع النافذة مفقود."); + ("Invalid saved tab layout; the group will use current defaults.", "تخطيط علامات التبويب المحفوظ غير صالح؛ ستستخدم المجموعة الإعدادات الافتراضية الحالية."); + ("No valid windows in this group.", "لا توجد نوافذ صالحة في هذه المجموعة."); + ("Unsupported workspace version; saved workspaces will not be modified.", "إصدار مساحة العمل غير مدعوم؛ لن يتم تعديل مساحات العمل المحفوظة."); + ("Safe to share: no window titles, file paths or other personal information.", "آمن للمشاركة: لا يحتوي على عناوين النوافذ أو مسارات الملفات أو معلومات شخصية أخرى."); + ("Copy the report, to paste into an issue", "نسخ التقرير للصقه في بلاغ مشكلة"); + ("Include window details: each window's program, class and whether it gets tabs. Never titles.", "تضمين تفاصيل النوافذ: برنامج كل نافذة وفئتها وما إذا كانت تستخدم علامات تبويب. لا يتضمن العناوين أبدًا."); + ("Refresh the report", "تحديث التقرير"); + ("Report copied.", "تم نسخ التقرير."); + ("Report refreshed.", "تم تحديث التقرير."); + ("Troubleshooting report", "تقرير استكشاف الأخطاء وإصلاحها"); + ("Project page", "صفحة المشروع"); + ("Report an issue", "الإبلاغ عن مشكلة"); + ("Check Releases", "التحقق من الإصدارات"); + ("Check Releases ↗", "التحقق من الإصدارات ↗"); + ("Crash log", "سجل الأعطال") + ] + let private translateArabic (text:string) = + match arabicTranslations.TryGetValue text with + | true, translated -> translated + | _ -> text + + let languages = [| "en","English","EN"; "zh","中文","中"; "ja","日本語","日"; "ar","العربية","ع" |] /// Values of the language setting: "system" follows the Windows display language. let preferences = "system" :: [for code,_,_ in languages -> code] let mutable private preference = "system" @@ -22,9 +353,10 @@ module Localization = match current() with | "zh" -> text.zh | "ja" -> text.ja + | "ar" -> translateArabic text.en | _ -> text.en /// Every translation of a text, for search. - let all (text:LocalizedText) = [text.en; text.zh; text.ja] + let all (text:LocalizedText) = [text.en; text.zh; text.ja; translateArabic text.en] [] module LocalizationOperators = From f79fb9d2ad5d9bc32a340b0c08bb7c0e3e4d4c7e Mon Sep 17 00:00:00 2001 From: am6256670-debug Date: Thu, 22 Oct 2026 00:25:46 +0300 Subject: [PATCH 02/10] Complete Arabic interface strings and dynamic labels --- WtProgram/Shared/Localization.fs | 33 +++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index 826205a0..df61939f 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -335,10 +335,41 @@ module Localization = ("Check Releases ↗", "التحقق من الإصدارات ↗"); ("Crash log", "سجل الأعطال") ] + /// Additional longer strings whose English versions are used by settings pages. + let private extraArabicTranslations = + dict [ + ("Icon files (*.ico, *.png, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|All files (*.*)|*.*", "ملفات الأيقونات (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|كل الملفات (*.*)|*.*"); + ("123456789", "123456789"); + ("QWERTYUIOP", "QWERTYUIOP"); + ("ASDFGHJKL;", "ASDFGHJKL;"); + ("If the WindowTabs.exe folder has a settings file, WindowTabs uses it (portable mode); otherwise it uses the one in AppData. Older versions named it WindowTabsSettings.txt; it is now WindowTabsSettings.json, and an old .txt file is still read until the .json one exists.", "إذا وُجد ملف إعدادات بجوار WindowTabs.exe فسيستخدمه البرنامج (الوضع المحمول)، وإلا فسيستخدم الملف الموجود في AppData. كان اسمه في الإصدارات القديمة WindowTabsSettings.txt، وأصبح الآن WindowTabsSettings.json، وسيظل ملف .txt القديم يُقرأ حتى إنشاء ملف .json."); + ("Restore every setting to its default and restart WindowTabs? The current settings are saved first, so you can import them back.", "هل تريد استعادة جميع الإعدادات الافتراضية وإعادة تشغيل WindowTabs؟ سيتم حفظ الإعدادات الحالية أولًا، حتى تتمكن من استيرادها مرة أخرى."); + ("Change it for one group from the tab menu.", "غيّره لمجموعة واحدة من قائمة علامة التبويب."); + ("Add a group to put several apps together, or drag tabs onto each other: the groups show here", "أضف مجموعة لضم عدة تطبيقات معًا، أو اسحب علامات التبويب فوق بعضها؛ ستظهر المجموعات هنا"); + ("Put windows of different apps into one named group. Apps added here always have tabs, leave the list above and don't use Auto-group. Windows you group by dragging tabs together show here too.", "ضع نوافذ تطبيقات مختلفة في مجموعة واحدة ذات اسم. التطبيقات المضافة هنا تستخدم علامات التبويب دائمًا، وتُزال من القائمة أعلاه ولا تستخدم التجميع التلقائي. كما تظهر هنا النوافذ التي تجمعها بسحب علامات التبويب فوق بعضها."); + ("Choose which apps get tabs. Auto-group puts the windows of an app into one group. Expand an app to see its windows.", "اختر التطبيقات التي تستخدم علامات التبويب. يجمع التجميع التلقائي نوافذ التطبيق الواحد في مجموعة واحدة. وسّع التطبيق لرؤية نوافذه."); + ("How to use\\n1 Group and position your windows, then click Save layout.\\n2 Select a workspace and click Restore selected.\\n3 To change an item's name or window title matching, double-click it, or point at it and click its edit button.\\nA window whose title has changed since it was saved is still matched by its app.\\nRestore uses open windows. If an app is not running, the result offers to launch it.", "طريقة الاستخدام\\n١ جمّع النوافذ واضبط مواضعها، ثم انقر «حفظ التخطيط».\\n٢ حدد مساحة عمل وانقر «استعادة المحدد».\\n٣ لتغيير اسم عنصر أو طريقة مطابقة عنوان نافذة، انقر عليه مرتين أو أشر إليه ثم انقر زر التحرير.\\nتظل النافذة التي تغير عنوانها منذ الحفظ مطابقةً باستخدام التطبيق الخاص بها.\\nتستخدم الاستعادة النوافذ المفتوحة. إذا لم يكن التطبيق قيد التشغيل، فستتيح لك النتيجة تشغيله."); + + ] + let private translateArabic (text:string) = match arabicTranslations.TryGetValue text with | true, translated -> translated - | _ -> text + | _ -> + match extraArabicTranslations.TryGetValue text with + | true, translated -> translated + | _ when text.StartsWith("Close all '") && text.EndsWith("' windows") -> + "إغلاق جميع نوافذ «" + text.Substring(11, text.Length - 19) + "»" + | _ when text.StartsWith("Used by ") -> "يستخدمه " + text.Substring(8) + | _ when text.StartsWith("Desktop ") -> "سطح المكتب " + text.Substring(8) + | _ when text.StartsWith("Group ") && text.Length > 6 -> "المجموعة " + text.Substring(6) + | _ when text.StartsWith("This group · ") -> "هذه المجموعة · " + text.Substring(13) + | _ when text.StartsWith("All windows · ") -> "كل النوافذ · " + text.Substring(14) + | _ when text.StartsWith("Launch ") && text.EndsWith(" apps and retry") -> + "تشغيل " + text.Substring(7, text.Length - 21) + " تطبيقات وإعادة المحاولة" + | _ when text.StartsWith("Launching ") && text.EndsWith(" apps…") -> + "جارٍ تشغيل " + text.Substring(10, text.Length - 16) + " تطبيقات…" + | _ -> text let languages = [| "en","English","EN"; "zh","中文","中"; "ja","日本語","日"; "ar","العربية","ع" |] /// Values of the language setting: "system" follows the Windows display language. From 0ce3479e79a8b4ad55529bc41a35a7b87e347c8e Mon Sep 17 00:00:00 2001 From: am6256670-debug Date: Thu, 22 Oct 2026 00:26:06 +0300 Subject: [PATCH 03/10] Fix Arabic file filter and dynamic label translations --- WtProgram/Shared/Localization.fs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index df61939f..9cc6dd3b 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -338,7 +338,7 @@ module Localization = /// Additional longer strings whose English versions are used by settings pages. let private extraArabicTranslations = dict [ - ("Icon files (*.ico, *.png, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|All files (*.*)|*.*", "ملفات الأيقونات (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|كل الملفات (*.*)|*.*"); + ("Icon files (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|All files (*.*)|*.*", "ملفات الأيقونات (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|كل الملفات (*.*)|*.*"); ("123456789", "123456789"); ("QWERTYUIOP", "QWERTYUIOP"); ("ASDFGHJKL;", "ASDFGHJKL;"); @@ -359,14 +359,14 @@ module Localization = match extraArabicTranslations.TryGetValue text with | true, translated -> translated | _ when text.StartsWith("Close all '") && text.EndsWith("' windows") -> - "إغلاق جميع نوافذ «" + text.Substring(11, text.Length - 19) + "»" + "إغلاق جميع نوافذ «" + text.Substring(11, text.Length - 20) + "»" | _ when text.StartsWith("Used by ") -> "يستخدمه " + text.Substring(8) | _ when text.StartsWith("Desktop ") -> "سطح المكتب " + text.Substring(8) | _ when text.StartsWith("Group ") && text.Length > 6 -> "المجموعة " + text.Substring(6) | _ when text.StartsWith("This group · ") -> "هذه المجموعة · " + text.Substring(13) | _ when text.StartsWith("All windows · ") -> "كل النوافذ · " + text.Substring(14) | _ when text.StartsWith("Launch ") && text.EndsWith(" apps and retry") -> - "تشغيل " + text.Substring(7, text.Length - 21) + " تطبيقات وإعادة المحاولة" + "تشغيل " + text.Substring(7, text.Length - 22) + " تطبيقات وإعادة المحاولة" | _ when text.StartsWith("Launching ") && text.EndsWith(" apps…") -> "جارٍ تشغيل " + text.Substring(10, text.Length - 16) + " تطبيقات…" | _ -> text From 9e482c304f90c3c9d3748bfe89ecc3f48b00701c Mon Sep 17 00:00:00 2001 From: am6256670-debug Date: Thu, 22 Oct 2026 00:26:27 +0300 Subject: [PATCH 04/10] Translate additional dynamic Arabic interface labels --- WtProgram/Shared/Localization.fs | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index 9cc6dd3b..fc680ecf 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -361,6 +361,20 @@ module Localization = | _ when text.StartsWith("Close all '") && text.EndsWith("' windows") -> "إغلاق جميع نوافذ «" + text.Substring(11, text.Length - 20) + "»" | _ when text.StartsWith("Used by ") -> "يستخدمه " + text.Substring(8) + | _ when text.StartsWith("Edit ") -> "تحرير " + text.Substring(5) + | _ when text.StartsWith("Switch tabs by number in ") -> + "التبديل بين علامات التبويب بالأرقام في " + text.Substring("Switch tabs by number in ".Length) + | _ when text.StartsWith("Scan failed: ") -> "فشل الفحص: " + text.Substring("Scan failed: ".Length) + | _ when text.EndsWith(" ✓") -> + let baseText = text.Substring(0, text.Length - 3) + match arabicTranslations.TryGetValue baseText with + | true, translated -> translated + " ✓" + | _ -> text + | _ when text.EndsWith("*") -> + let baseText = text.Substring(0, text.Length - 1) + match arabicTranslations.TryGetValue baseText with + | true, translated -> translated + "*" + | _ -> text | _ when text.StartsWith("Desktop ") -> "سطح المكتب " + text.Substring(8) | _ when text.StartsWith("Group ") && text.Length > 6 -> "المجموعة " + text.Substring(6) | _ when text.StartsWith("This group · ") -> "هذه المجموعة · " + text.Substring(13) From c9e41f13a20664c563ce67a7083b9bfe14dcbe50 Mon Sep 17 00:00:00 2001 From: am6256670-debug Date: Thu, 22 Oct 2026 00:26:49 +0300 Subject: [PATCH 05/10] Translate dynamic settings and error messages --- WtProgram/Shared/Localization.fs | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index fc680ecf..38f10f2f 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -360,6 +360,19 @@ module Localization = | true, translated -> translated | _ when text.StartsWith("Close all '") && text.EndsWith("' windows") -> "إغلاق جميع نوافذ «" + text.Substring(11, text.Length - 20) + "»" + | _ when text.StartsWith("Unable to save settings to ") -> + text.Replace("Unable to save settings to ", "تعذّر حفظ الإعدادات في ") + .Replace("Your changes remain in memory and will be retried on the next edit or exit.", "ستظل تغييراتك في الذاكرة وستتم إعادة المحاولة عند التعديل التالي أو عند الخروج.") + | _ when text.StartsWith("Error loading settings.") -> + text.Replace("Error loading settings.", "حدث خطأ أثناء تحميل الإعدادات.") + .Replace("Fix or remove the file ", "أصلح الملف أو احذفه ") + .Replace("Details: ", "التفاصيل: ") + | _ when text.StartsWith("Settings were reset. WindowTabs will now restart.") -> + text.Replace("Settings were reset. WindowTabs will now restart.", "تمت إعادة تعيين الإعدادات. سيُعاد تشغيل WindowTabs الآن.") + .Replace("Your previous settings were saved to:", "تم حفظ الإعدادات السابقة في:") + | _ when text.StartsWith("Settings imported. WindowTabs will now restart to apply them.") -> + text.Replace("Settings imported. WindowTabs will now restart to apply them.", "تم استيراد الإعدادات. سيُعاد تشغيل WindowTabs لتطبيقها.") + .Replace("Your previous settings were saved to:", "تم حفظ الإعدادات السابقة في:") | _ when text.StartsWith("Used by ") -> "يستخدمه " + text.Substring(8) | _ when text.StartsWith("Edit ") -> "تحرير " + text.Substring(5) | _ when text.StartsWith("Switch tabs by number in ") -> From 0a80e7adf18265c0afc517228f39464c1dd9a2d7 Mon Sep 17 00:00:00 2001 From: am6256670-debug Date: Thu, 22 Oct 2026 00:27:00 +0300 Subject: [PATCH 06/10] Translate single-app workspace launch prompts --- WtProgram/Shared/Localization.fs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index 38f10f2f..e2c39f7c 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -326,6 +326,8 @@ module Localization = ("Copy the report, to paste into an issue", "نسخ التقرير للصقه في بلاغ مشكلة"); ("Include window details: each window's program, class and whether it gets tabs. Never titles.", "تضمين تفاصيل النوافذ: برنامج كل نافذة وفئتها وما إذا كانت تستخدم علامات تبويب. لا يتضمن العناوين أبدًا."); ("Refresh the report", "تحديث التقرير"); + ("Launch the app and retry", "تشغيل التطبيق وإعادة المحاولة"); + ("Launching the app…", "جارٍ تشغيل التطبيق…"); ("Report copied.", "تم نسخ التقرير."); ("Report refreshed.", "تم تحديث التقرير."); ("Troubleshooting report", "تقرير استكشاف الأخطاء وإصلاحها"); From 6c6a1c0259255edd8663b5fa449bf293e5ac4b55 Mon Sep 17 00:00:00 2001 From: am6256670-debug Date: Thu, 22 Oct 2026 00:27:36 +0300 Subject: [PATCH 07/10] Correct multiline Arabic translation escape sequences --- WtProgram/Shared/Localization.fs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index e2c39f7c..96bf665c 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -350,7 +350,7 @@ module Localization = ("Add a group to put several apps together, or drag tabs onto each other: the groups show here", "أضف مجموعة لضم عدة تطبيقات معًا، أو اسحب علامات التبويب فوق بعضها؛ ستظهر المجموعات هنا"); ("Put windows of different apps into one named group. Apps added here always have tabs, leave the list above and don't use Auto-group. Windows you group by dragging tabs together show here too.", "ضع نوافذ تطبيقات مختلفة في مجموعة واحدة ذات اسم. التطبيقات المضافة هنا تستخدم علامات التبويب دائمًا، وتُزال من القائمة أعلاه ولا تستخدم التجميع التلقائي. كما تظهر هنا النوافذ التي تجمعها بسحب علامات التبويب فوق بعضها."); ("Choose which apps get tabs. Auto-group puts the windows of an app into one group. Expand an app to see its windows.", "اختر التطبيقات التي تستخدم علامات التبويب. يجمع التجميع التلقائي نوافذ التطبيق الواحد في مجموعة واحدة. وسّع التطبيق لرؤية نوافذه."); - ("How to use\\n1 Group and position your windows, then click Save layout.\\n2 Select a workspace and click Restore selected.\\n3 To change an item's name or window title matching, double-click it, or point at it and click its edit button.\\nA window whose title has changed since it was saved is still matched by its app.\\nRestore uses open windows. If an app is not running, the result offers to launch it.", "طريقة الاستخدام\\n١ جمّع النوافذ واضبط مواضعها، ثم انقر «حفظ التخطيط».\\n٢ حدد مساحة عمل وانقر «استعادة المحدد».\\n٣ لتغيير اسم عنصر أو طريقة مطابقة عنوان نافذة، انقر عليه مرتين أو أشر إليه ثم انقر زر التحرير.\\nتظل النافذة التي تغير عنوانها منذ الحفظ مطابقةً باستخدام التطبيق الخاص بها.\\nتستخدم الاستعادة النوافذ المفتوحة. إذا لم يكن التطبيق قيد التشغيل، فستتيح لك النتيجة تشغيله."); + ("How to use\n1 Group and position your windows, then click Save layout.\n2 Select a workspace and click Restore selected.\n3 To change an item's name or window title matching, double-click it, or point at it and click its edit button.\nA window whose title has changed since it was saved is still matched by its app.\nRestore uses open windows. If an app is not running, the result offers to launch it.", "طريقة الاستخدام\n١ جمّع النوافذ واضبط مواضعها، ثم انقر «حفظ التخطيط».\n٢ حدد مساحة عمل وانقر «استعادة المحدد».\n٣ لتغيير اسم عنصر أو طريقة مطابقة عنوان نافذة، انقر عليه مرتين أو أشر إليه ثم انقر زر التحرير.\nتظل النافذة التي تغير عنوانها منذ الحفظ مطابقةً باستخدام التطبيق الخاص بها.\nتستخدم الاستعادة النوافذ المفتوحة. إذا لم يكن التطبيق قيد التشغيل، فستتيح لك النتيجة تشغيله."); ] From fe52743bed9c34c86800538e08705d56ca78e8f9 Mon Sep 17 00:00:00 2001 From: leafOfTree Date: Thu, 22 Oct 2026 20:04:52 +0800 Subject: [PATCH 08/10] Store Arabic text with every other translation Arabic is now a field of LocalizedText like English, Chinese and Japanese, so a missing Arabic translation fails the build. This replaces the English-keyed lookup table and its prefix rules, which could translate part of a sentence and silently fell back to English whenever an English string changed. --- WtProgram/Shared/Localization.fs | 397 +---------------- WtProgram/Shared/Strings.fs | 718 ++++++++++++++++--------------- tests/Reliability.fsx | 3 +- tests/SettingsEditors.fsx | 2 +- 4 files changed, 379 insertions(+), 741 deletions(-) diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index 96bf665c..b30de462 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -3,403 +3,12 @@ open System.Globalization /// One piece of user-visible text in every supported language. Every field is required, so a /// missing translation is a compile error. All instances live in Strings. -type LocalizedText = { en:string; zh:string; ja:string } +type LocalizedText = { en:string; zh:string; ja:string; ar:string } /// All user-visible text is compiled into the single WindowTabs.exe. (Satellite resource /// assemblies cannot be statically linked, so a .resx translation would not ship.) module Localization = /// Supported languages: code, name shown in the language menu, compact label. - /// Arabic translations keyed by the source English text. - /// Untranslated dynamic messages fall back to English rather than hiding content. - let private arabicTranslations = - dict [ - ("", ""); - ("OK", "موافق"); - ("Cancel", "إلغاء"); - ("Save", "حفظ"); - ("Refresh", "تحديث"); - ("Name", "الاسم"); - ("Title", "العنوان"); - ("Left", "يسار"); - ("Top", "أعلى"); - ("Bottom", "أسفل"); - ("Center", "توسيط"); - ("Right", "يمين"); - ("Never", "أبدًا"); - ("When maximized", "عند التكبير"); - ("Always", "دائمًا"); - ("Operation failed", "فشلت العملية"); - ("WindowTabs is already running.", "برنامج WindowTabs قيد التشغيل بالفعل."); - ("WindowTabs could not continue", "تعذّر على WindowTabs المتابعة"); - ("Settings save failed", "فشل حفظ الإعدادات"); - ("Settings error", "خطأ في الإعدادات"); - ("Exit WindowTabs", "إنهاء WindowTabs"); - ("WindowTabs ran into a problem", "واجه WindowTabs مشكلة"); - ("It kept running. The details are in the crash log; click to show it.", "استمر البرنامج في العمل. التفاصيل موجودة في سجل الأعطال؛ انقر لعرضه."); - ("Tab position", "موضع علامات التبويب"); - ("Show tab titles", "إظهار عناوين علامات التبويب"); - ("Show icons only", "إظهار الأيقونات فقط"); - ("New tab", "علامة تبويب جديدة"); - ("Rename", "إعادة تسمية"); - ("Reset name", "إعادة تعيين الاسم"); - ("Sort by app and title", "ترتيب حسب التطبيق والعنوان"); - ("Combine taskbar icons", "دمج أيقونات شريط المهام"); - ("Change taskbar icon…", "تغيير أيقونة شريط المهام…"); - ("Restore taskbar icon", "استعادة أيقونة شريط المهام"); - ("Switch by number", "التبديل باستخدام الرقم"); - ("Enable tabs", "تمكين علامات التبويب"); - ("Auto-group windows", "تجميع النوافذ تلقائيًا"); - ("Close", "إغلاق"); - ("Close others", "إغلاق علامات التبويب الأخرى"); - ("Close all", "إغلاق الكل"); - ("Settings...", "الإعدادات..."); - ("Copy", "نسخ"); - ("Move", "نقل"); - ("Move to %1", "نقل إلى %1"); - ("Copy to %1", "نسخ إلى %1"); - ("WindowTabs Settings", "إعدادات WindowTabs"); - ("Search", "بحث"); - ("Search settings", "البحث في الإعدادات"); - ("Search suggestions", "اقتراحات البحث"); - ("Sidebar", "الشريط الجانبي"); - ("Search results", "نتائج البحث"); - ("No matching settings.", "لا توجد إعدادات مطابقة."); - ("Follow Windows", "اتباع إعدادات Windows"); - ("How to use", "طريقة الاستخدام"); - ("Page scroll", "تمرير الصفحة"); - ("General", "عام"); - ("Appearance", "المظهر"); - ("Shortcuts", "اختصارات"); - ("App rules", "قواعد التطبيقات"); - ("Workspaces", "مساحات العمل"); - ("Support", "الدعم"); - ("color colour", "اللون الألوان"); - ("size", "الحجم"); - ("hotkey", "مفتاح الاختصار"); - ("Theme", "السمة"); - ("System follows your Windows app mode.", "يتبع خيار النظام وضع التطبيقات في Windows."); - ("dark mode", "الوضع الداكن"); - ("Language", "اللغة"); - ("Follow Windows uses your Windows display language.", "يستخدم خيار اتباع Windows لغة العرض المحددة في Windows."); - ("locale", "الإعدادات المحلية"); - ("Start with Windows", "التشغيل مع Windows"); - ("Runs in the system tray after you sign in.", "يعمل في منطقة الإعلام بعد تسجيل الدخول."); - ("startup autostart", "بدء التشغيل التشغيل التلقائي"); - ("Use tabs for new apps", "استخدام علامات التبويب للتطبيقات الجديدة"); - ("Only apps first discovered after this change. Existing apps keep their tab setting.", "ينطبق ذلك على التطبيقات التي يكتشفها البرنامج لأول مرة بعد هذا التغيير فقط. وتحتفظ التطبيقات الموجودة بإعداد علامات التبويب الحالي."); - ("Dim tabs in inactive groups", "تخفيف لون علامات التبويب في المجموعات غير النشطة"); - ("Make the active group easier to spot.", "لتسهيل تمييز المجموعة النشطة."); - ("fade", "تلاشي"); - ("Auto-hide tabs", "إخفاء علامات التبويب تلقائيًا"); - ("Show a thin strip until hover.", "إظهار شريط رفيع حتى تمرير المؤشر فوقه."); - ("collapse", "طيّ"); - ("Show tabs briefly after switching", "إظهار علامات التبويب لفترة وجيزة بعد التبديل"); - ("For about a second, so you can see where you are.", "لمدة ثانية تقريبًا لتتمكن من معرفة موضعك."); - ("peek", "معاينة"); - ("Position tabs", "موضع علامات التبويب"); - ("vertical horizontal sidebar left right", "رأسي أفقي شريط جانبي يسار يمين"); - ("For left/right tabs. Drag a column edge to resize one group, down to an icon rail.", "للعلامات الجانبية اليمنى أو اليسرى. اسحب حافة العمود لتغيير عرض مجموعة واحدة، حتى يصبح شريطًا للأيقونات فقط."); - ("Vertical tab width", "عرض علامات التبويب الرأسية"); - ("vertical sidebar width size", "رأسي شريط جانبي عرض حجم"); - ("Align tabs", "محاذاة علامات التبويب"); - ("alignment position", "محاذاة موضع"); - ("Combine taskbar icons per group", "دمج أيقونات شريط المهام لكل مجموعة"); - ("merge", "دمج"); - ("Use WindowTabs for Alt+Tab", "استخدام WindowTabs عند الضغط على Alt+Tab"); - ("Replaces the Windows switcher.", "يستبدل أداة التبديل بين النوافذ في Windows."); - ("task switcher", "مبدّل المهام"); - ("Switcher style", "نمط أداة التبديل"); - ("Large icons in a row, or a list with full window titles.", "أيقونات كبيرة في صف، أو قائمة تعرض عناوين النوافذ كاملة."); - ("layout", "التخطيط"); - ("Group windows in Alt+Tab", "تجميع النوافذ في Alt+Tab"); - ("Each group appears as one item.", "تظهر كل مجموعة كعنصر واحد."); - ("switcher", "أداة التبديل"); - ("Switch to next tab", "الانتقال إلى علامة التبويب التالية"); - ("Switch to previous tab", "الانتقال إلى علامة التبويب السابقة"); - ("Switch windows", "تبديل النوافذ"); - ("Switch to a window by title or app name.", "الانتقال إلى نافذة باستخدام عنوانها أو اسم التطبيق."); - ("find", "بحث"); - ("Starts the current tab's app again.", "يشغّل التطبيق الخاص بعلامة التبويب الحالية مرة أخرى."); - ("new window", "نافذة جديدة"); - ("Close tab", "إغلاق علامة التبويب"); - ("Closes the window of the tab in front.", "يغلق النافذة الخاصة بعلامة التبويب الحالية."); - ("close window", "إغلاق النافذة"); - ("Switch tabs by number", "التبديل بين علامات التبويب باستخدام الأرقام"); - ("Hold a modifier key and press 1–9.", "اضغط باستمرار على مفتاح تعديل ثم اضغط على رقم من 1 إلى 9."); - ("digit", "رقم"); - ("Modifier key for 1–9", "مفتاح التعديل للأرقام من 1 إلى 9"); - ("number", "رقم"); - ("Switch tabs with a leader key", "التبديل باستخدام مفتاح تمهيدي"); - ("Press the leader, then a selection key. Esc cancels.", "اضغط المفتاح التمهيدي ثم مفتاح الاختيار. يلغي Esc العملية."); - ("Selection keys", "مفاتيح الاختيار"); - ("Use unique letters or digits, in tab order.", "استخدم أحرفًا أو أرقامًا غير مكررة حسب ترتيب علامات التبويب."); - ("leader keys letters home row", "مفتاح تمهيدي أحرف الصف الأوسط"); - ("Use at least one unique letter, digit or unshifted punctuation key.", "استخدم حرفًا أو رقمًا أو مفتاح ترقيم غير مكرر واحدًا على الأقل دون Shift."); - ("Tab selection leader", "المفتاح التمهيدي لاختيار علامة التبويب"); - ("Color", "اللون"); - ("Custom…", "مخصص…"); - ("Clear color", "مسح اللون"); - ("Remember color for current app", "تذكّر لون التطبيق الحالي"); - ("Grey", "رمادي"); - ("Blue", "أزرق"); - ("Red", "أحمر"); - ("Yellow", "أصفر"); - ("Green", "أخضر"); - ("Pink", "وردي"); - ("Purple", "أرجواني"); - ("Cyan", "سماوي"); - ("Orange", "برتقالي"); - ("Lavender", "لافندر"); - ("Olive", "زيتي"); - ("Rose", "وردي داكن"); - ("Lime", "ليموني"); - ("Navy", "كحلي"); - ("Teal", "أزرق مخضر"); - ("Coral", "مرجاني"); - ("Tab color coding", "ترميز علامات التبويب بالألوان"); - ("Auto-assign colors by window or app.", "تعيين الألوان تلقائيًا حسب النافذة أو التطبيق."); - ("colorize rainbow", "تلوين قوس قزح"); - ("Off", "إيقاف"); - ("By window", "حسب النافذة"); - ("By app", "حسب التطبيق"); - ("Change it for one tab from the tab menu. That color comes first, and shows even when this is off.", "غيّر لون علامة تبويب واحدة من قائمتها. تكون الأولوية لهذا اللون ويظهر حتى عند إيقاف هذا الخيار."); - ("Show colors as", "عرض الألوان على شكل"); - ("stripe fill", "شريط تعبئة"); - ("Stripe", "شريط"); - ("Fill", "تعبئة"); - ("Enable or disable it for one app from the tab menu.", "يمكن تمكينه أو تعطيله لتطبيق واحد من قائمة علامة التبويب."); - ("Ctrl", "Ctrl"); - ("Alt", "Alt"); - ("Switch tabs on hover", "التبديل بين علامات التبويب عند تمرير المؤشر"); - ("Rest the pointer on a tab instead of clicking.", "ضع المؤشر فوق علامة تبويب بدلًا من النقر عليها."); - ("mouse over", "تمرير المؤشر"); - ("Switch tabs with Shift + scroll", "التبديل بين علامات التبويب باستخدام Shift والتمرير"); - ("Works anywhere over a grouped window. Over the tab bar, Shift isn't needed.", "يعمل في أي مكان فوق نافذة مجمّعة. لا تحتاج إلى Shift فوق شريط علامات التبويب."); - ("wheel", "عجلة التمرير"); - ("Move tabs with Ctrl + scroll", "تحريك علامات التبويب باستخدام Ctrl والتمرير"); - ("Over the tab bar, moves the current tab left or right.", "فوق شريط علامات التبويب، ينقل علامة التبويب الحالية إلى اليسار أو اليمين."); - ("wheel reorder", "عجلة التمرير لإعادة الترتيب"); - ("Middle-click closes a tab", "النقر الأوسط يغلق علامة تبويب"); - ("Press the wheel on a tab to close its window.", "اضغط بعجلة الفأرة على علامة التبويب لإغلاق نافذتها."); - ("wheel click", "النقر بعجلة الفأرة"); - ("Text and close button", "النص وزر الإغلاق"); - ("Inactive tab", "علامة تبويب غير نشطة"); - ("Active tab", "علامة تبويب نشطة"); - ("Hovered tab", "علامة التبويب التي يشير إليها المؤشر"); - ("Tab style", "نمط علامة التبويب"); - ("How the active tab stands out from the rest.", "كيفية تمييز علامة التبويب النشطة عن البقية."); - ("shape folder pill", "الشكل مجلد كبسولة"); - ("Left/right tabs have a minimum height of 32 px.", "يبلغ الحد الأدنى لارتفاع علامات التبويب الجانبية 32 بكسل."); - ("Tab height", "ارتفاع علامة التبويب"); - ("Maximum tab width", "أقصى عرض لعلامة التبويب"); - ("Tab spacing", "المسافة بين علامات التبويب"); - ("gap", "فجوة"); - ("Side margin", "الهامش الجانبي"); - ("Distance from the window edges.", "المسافة من حواف النافذة."); - ("indent padding", "مسافة بادئة حشو"); - ("Choose apps for tabs and automatic grouping.", "اختر التطبيقات التي تستخدم علامات التبويب والتجميع التلقائي."); - ("process program", "عملية برنامج"); - ("Save and restore window layouts.", "حفظ تخطيطات النوافذ واستعادتها."); - ("session", "جلسة"); - ("Troubleshooting report and where to get help.", "تقرير استكشاف الأخطاء وإصلاحها ومكان الحصول على المساعدة."); - ("about version log", "حول الإصدار السجل"); - ("Location", "الموقع"); - ("folder path portable", "مجلد مسار محمول"); - ("Back up and restore", "النسخ الاحتياطي والاستعادة"); - ("Export all settings to a file, or import them and restart.", "تصدير جميع الإعدادات إلى ملف، أو استيرادها ثم إعادة التشغيل."); - ("export import", "تصدير استيراد"); - ("Reset to defaults", "إعادة التعيين إلى الإعدادات الافتراضية"); - ("Then restarts. App rules and workspaces can be kept.", "ثم يعاد التشغيل. يمكن الاحتفاظ بقواعد التطبيقات ومساحات العمل."); - ("factory", "إعدادات المصنع"); - ("Settings file", "ملف الإعدادات"); - ("Open folder", "فتح المجلد"); - ("Export…", "تصدير…"); - ("Import…", "استيراد…"); - ("Settings exported.", "تم تصدير الإعدادات."); - ("Reset…", "إعادة تعيين…"); - ("Reset", "إعادة تعيين"); - ("Reset settings", "إعادة تعيين الإعدادات"); - ("Also clear:", "مسح أيضًا:"); - ("Import settings", "استيراد الإعدادات"); - ("This file does not contain WindowTabs settings.", "لا يحتوي هذا الملف على إعدادات WindowTabs."); - ("Startup", "بدء التشغيل"); - ("Tab behavior", "سلوك علامات التبويب"); - ("Taskbar", "شريط المهام"); - ("Window switcher", "مبدّل النوافذ"); - ("System", "النظام"); - ("Light", "فاتح"); - ("Dark", "داكن"); - ("File Explorer theme preview", "معاينة سمة مستكشف الملفات"); - ("Tab colors", "ألوان علامات التبويب"); - ("Color preset", "مجموعة ألوان جاهزة"); - ("Custom", "مخصص"); - ("Horizontal", "أفقي"); - ("Vertical", "رأسي"); - ("Joined", "متصل"); - ("Folder", "مجلد"); - ("Floating", "عائم"); - ("Before", "قبل"); - ("After", "بعد"); - ("Set automatically while Tab color coding is By window or By app with Fill.", "يُضبط تلقائيًا عندما يكون ترميز الألوان حسب النافذة أو التطبيق مع خيار التعبئة."); - ("Text color is adjusted on some tabs to stay readable.", "يُعدّل لون النص في بعض علامات التبويب ليظل مقروءًا."); - ("Reset colors", "إعادة تعيين الألوان"); - ("Tab layout", "تخطيط علامات التبويب"); - ("Reset tab layout", "إعادة تعيين تخطيط علامات التبويب"); - ("Default", "افتراضي"); - ("Slate", "رمادي أردوازي"); - ("Sand", "رملي"); - ("Amber", "كهرماني"); - ("Black", "أسود"); - ("White", "أبيض"); - ("Gray", "رمادي"); - ("Color picker: arrow keys adjust saturation and brightness; Shift + arrow keys adjust hue", "منتقي الألوان: تعدّل مفاتيح الأسهم التشبع والسطوع؛ وتعدّل الأسهم مع Shift درجة اللون"); - ("Choose color", "اختيار اللون"); - ("Decrease", "تقليل"); - ("Increase", "زيادة"); - ("Keyboard", "لوحة المفاتيح"); - ("Mouse", "الفأرة"); - ("Click a shortcut, then press the new combination. Esc cancels.", "انقر فوق اختصار ثم اضغط مجموعة المفاتيح الجديدة. يلغي Esc العملية."); - ("Restore default shortcuts", "استعادة الاختصارات الافتراضية"); - ("Shortcut already in use", "الاختصار مستخدم بالفعل"); - ("Already set", "تم تعيينه بالفعل"); - ("Include Ctrl or Alt", "يجب أن يتضمن Ctrl أو Alt"); - ("Press a shortcut…", "اضغط اختصارًا…"); - ("Not set", "غير معيّن"); - ("Type a title or app name to switch windows", "اكتب عنوانًا أو اسم تطبيق للتبديل بين النوافذ"); - ("No matching windows.", "لا توجد نوافذ مطابقة."); - ("Another desktop", "سطح مكتب آخر"); - ("Add application", "إضافة تطبيق"); - ("Delete", "حذف"); - ("This application already has a grouping rule.", "لدى هذا التطبيق قاعدة تجميع بالفعل."); - ("Groups across apps", "مجموعات تضم تطبيقات مختلفة"); - ("Applications", "التطبيقات"); - ("Add group", "إضافة مجموعة"); - ("Select a group or rule to edit here. Changes save automatically.", "حدد مجموعة أو قاعدة لتحريرها هنا. تُحفظ التغييرات تلقائيًا."); - ("New rule", "قاعدة جديدة"); - ("Enter a group name.", "أدخل اسم المجموعة."); - ("A group with this name already exists.", "توجد مجموعة بهذا الاسم بالفعل."); - ("Application", "التطبيق"); - ("Add an app", "إضافة تطبيق"); - ("Ungroup", "إلغاء التجميع"); - ("Remove from group", "إزالة من المجموعة"); - ("Browse…", "استعراض…"); - ("Applications (*.exe)|*.exe", "التطبيقات (*.exe)|*.exe"); - ("Application only", "التطبيق فقط"); - ("Target group", "المجموعة المستهدفة"); - ("Existing group", "مجموعة موجودة"); - ("Enabled", "ممكّن"); - ("Add rule", "إضافة قاعدة"); - ("Invalid grouping rule", "قاعدة التجميع غير صالحة"); - ("Choose an application and enter a target group.", "اختر تطبيقًا وأدخل المجموعة المستهدفة."); - ("Enter a title pattern, or choose Application only.", "أدخل نمطًا للعنوان أو اختر «التطبيق فقط»."); - ("Tabs", "علامات التبويب"); - ("Auto-group", "التجميع التلقائي"); - ("Windows apps", "تطبيقات Windows"); - ("Windows grouped by dragging", "النوافذ المجمّعة بالسحب"); - ("Scanning…", "جارٍ الفحص…"); - ("Scan failed: ", "فشل الفحص: "); - ("Save and restore window groups and positions.", "حفظ مجموعات النوافذ ومواضعها واستعادتها."); - ("Save layout", "حفظ التخطيط"); - ("Restore selected", "استعادة المحدد"); - ("Match method", "طريقة المطابقة"); - ("Exact match", "مطابقة تامة"); - ("Starts with", "يبدأ بـ"); - ("Ends with", "ينتهي بـ"); - ("Contains", "يحتوي على"); - ("Regular expression", "تعبير نمطي"); - ("Workspace restore", "استعادة مساحة العمل"); - ("Restored", "تمت الاستعادة"); - ("Not found", "لم يتم العثور عليه"); - ("Failed", "فشل"); - ("These windows are closed, or their app is not running.", "هذه النوافذ مغلقة أو أن التطبيق الخاص بها لا يعمل."); - ("Invalid workspace setting", "إعداد مساحة العمل غير صالح"); - ("Workspace data", "بيانات مساحة العمل"); - ("Window title is missing or exceeds 4,096 characters.", "عنوان النافذة مفقود أو يتجاوز 4096 حرفًا."); - ("Unknown title match method.", "طريقة مطابقة العنوان غير معروفة."); - ("Expected an object.", "كان متوقعًا وجود كائن."); - (": expected a list.", ": كان متوقعًا وجود قائمة."); - ("Missing placement.", "موضع النافذة مفقود."); - ("Invalid saved tab layout; the group will use current defaults.", "تخطيط علامات التبويب المحفوظ غير صالح؛ ستستخدم المجموعة الإعدادات الافتراضية الحالية."); - ("No valid windows in this group.", "لا توجد نوافذ صالحة في هذه المجموعة."); - ("Unsupported workspace version; saved workspaces will not be modified.", "إصدار مساحة العمل غير مدعوم؛ لن يتم تعديل مساحات العمل المحفوظة."); - ("Safe to share: no window titles, file paths or other personal information.", "آمن للمشاركة: لا يحتوي على عناوين النوافذ أو مسارات الملفات أو معلومات شخصية أخرى."); - ("Copy the report, to paste into an issue", "نسخ التقرير للصقه في بلاغ مشكلة"); - ("Include window details: each window's program, class and whether it gets tabs. Never titles.", "تضمين تفاصيل النوافذ: برنامج كل نافذة وفئتها وما إذا كانت تستخدم علامات تبويب. لا يتضمن العناوين أبدًا."); - ("Refresh the report", "تحديث التقرير"); - ("Launch the app and retry", "تشغيل التطبيق وإعادة المحاولة"); - ("Launching the app…", "جارٍ تشغيل التطبيق…"); - ("Report copied.", "تم نسخ التقرير."); - ("Report refreshed.", "تم تحديث التقرير."); - ("Troubleshooting report", "تقرير استكشاف الأخطاء وإصلاحها"); - ("Project page", "صفحة المشروع"); - ("Report an issue", "الإبلاغ عن مشكلة"); - ("Check Releases", "التحقق من الإصدارات"); - ("Check Releases ↗", "التحقق من الإصدارات ↗"); - ("Crash log", "سجل الأعطال") - ] - /// Additional longer strings whose English versions are used by settings pages. - let private extraArabicTranslations = - dict [ - ("Icon files (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|All files (*.*)|*.*", "ملفات الأيقونات (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|كل الملفات (*.*)|*.*"); - ("123456789", "123456789"); - ("QWERTYUIOP", "QWERTYUIOP"); - ("ASDFGHJKL;", "ASDFGHJKL;"); - ("If the WindowTabs.exe folder has a settings file, WindowTabs uses it (portable mode); otherwise it uses the one in AppData. Older versions named it WindowTabsSettings.txt; it is now WindowTabsSettings.json, and an old .txt file is still read until the .json one exists.", "إذا وُجد ملف إعدادات بجوار WindowTabs.exe فسيستخدمه البرنامج (الوضع المحمول)، وإلا فسيستخدم الملف الموجود في AppData. كان اسمه في الإصدارات القديمة WindowTabsSettings.txt، وأصبح الآن WindowTabsSettings.json، وسيظل ملف .txt القديم يُقرأ حتى إنشاء ملف .json."); - ("Restore every setting to its default and restart WindowTabs? The current settings are saved first, so you can import them back.", "هل تريد استعادة جميع الإعدادات الافتراضية وإعادة تشغيل WindowTabs؟ سيتم حفظ الإعدادات الحالية أولًا، حتى تتمكن من استيرادها مرة أخرى."); - ("Change it for one group from the tab menu.", "غيّره لمجموعة واحدة من قائمة علامة التبويب."); - ("Add a group to put several apps together, or drag tabs onto each other: the groups show here", "أضف مجموعة لضم عدة تطبيقات معًا، أو اسحب علامات التبويب فوق بعضها؛ ستظهر المجموعات هنا"); - ("Put windows of different apps into one named group. Apps added here always have tabs, leave the list above and don't use Auto-group. Windows you group by dragging tabs together show here too.", "ضع نوافذ تطبيقات مختلفة في مجموعة واحدة ذات اسم. التطبيقات المضافة هنا تستخدم علامات التبويب دائمًا، وتُزال من القائمة أعلاه ولا تستخدم التجميع التلقائي. كما تظهر هنا النوافذ التي تجمعها بسحب علامات التبويب فوق بعضها."); - ("Choose which apps get tabs. Auto-group puts the windows of an app into one group. Expand an app to see its windows.", "اختر التطبيقات التي تستخدم علامات التبويب. يجمع التجميع التلقائي نوافذ التطبيق الواحد في مجموعة واحدة. وسّع التطبيق لرؤية نوافذه."); - ("How to use\n1 Group and position your windows, then click Save layout.\n2 Select a workspace and click Restore selected.\n3 To change an item's name or window title matching, double-click it, or point at it and click its edit button.\nA window whose title has changed since it was saved is still matched by its app.\nRestore uses open windows. If an app is not running, the result offers to launch it.", "طريقة الاستخدام\n١ جمّع النوافذ واضبط مواضعها، ثم انقر «حفظ التخطيط».\n٢ حدد مساحة عمل وانقر «استعادة المحدد».\n٣ لتغيير اسم عنصر أو طريقة مطابقة عنوان نافذة، انقر عليه مرتين أو أشر إليه ثم انقر زر التحرير.\nتظل النافذة التي تغير عنوانها منذ الحفظ مطابقةً باستخدام التطبيق الخاص بها.\nتستخدم الاستعادة النوافذ المفتوحة. إذا لم يكن التطبيق قيد التشغيل، فستتيح لك النتيجة تشغيله."); - - ] - - let private translateArabic (text:string) = - match arabicTranslations.TryGetValue text with - | true, translated -> translated - | _ -> - match extraArabicTranslations.TryGetValue text with - | true, translated -> translated - | _ when text.StartsWith("Close all '") && text.EndsWith("' windows") -> - "إغلاق جميع نوافذ «" + text.Substring(11, text.Length - 20) + "»" - | _ when text.StartsWith("Unable to save settings to ") -> - text.Replace("Unable to save settings to ", "تعذّر حفظ الإعدادات في ") - .Replace("Your changes remain in memory and will be retried on the next edit or exit.", "ستظل تغييراتك في الذاكرة وستتم إعادة المحاولة عند التعديل التالي أو عند الخروج.") - | _ when text.StartsWith("Error loading settings.") -> - text.Replace("Error loading settings.", "حدث خطأ أثناء تحميل الإعدادات.") - .Replace("Fix or remove the file ", "أصلح الملف أو احذفه ") - .Replace("Details: ", "التفاصيل: ") - | _ when text.StartsWith("Settings were reset. WindowTabs will now restart.") -> - text.Replace("Settings were reset. WindowTabs will now restart.", "تمت إعادة تعيين الإعدادات. سيُعاد تشغيل WindowTabs الآن.") - .Replace("Your previous settings were saved to:", "تم حفظ الإعدادات السابقة في:") - | _ when text.StartsWith("Settings imported. WindowTabs will now restart to apply them.") -> - text.Replace("Settings imported. WindowTabs will now restart to apply them.", "تم استيراد الإعدادات. سيُعاد تشغيل WindowTabs لتطبيقها.") - .Replace("Your previous settings were saved to:", "تم حفظ الإعدادات السابقة في:") - | _ when text.StartsWith("Used by ") -> "يستخدمه " + text.Substring(8) - | _ when text.StartsWith("Edit ") -> "تحرير " + text.Substring(5) - | _ when text.StartsWith("Switch tabs by number in ") -> - "التبديل بين علامات التبويب بالأرقام في " + text.Substring("Switch tabs by number in ".Length) - | _ when text.StartsWith("Scan failed: ") -> "فشل الفحص: " + text.Substring("Scan failed: ".Length) - | _ when text.EndsWith(" ✓") -> - let baseText = text.Substring(0, text.Length - 3) - match arabicTranslations.TryGetValue baseText with - | true, translated -> translated + " ✓" - | _ -> text - | _ when text.EndsWith("*") -> - let baseText = text.Substring(0, text.Length - 1) - match arabicTranslations.TryGetValue baseText with - | true, translated -> translated + "*" - | _ -> text - | _ when text.StartsWith("Desktop ") -> "سطح المكتب " + text.Substring(8) - | _ when text.StartsWith("Group ") && text.Length > 6 -> "المجموعة " + text.Substring(6) - | _ when text.StartsWith("This group · ") -> "هذه المجموعة · " + text.Substring(13) - | _ when text.StartsWith("All windows · ") -> "كل النوافذ · " + text.Substring(14) - | _ when text.StartsWith("Launch ") && text.EndsWith(" apps and retry") -> - "تشغيل " + text.Substring(7, text.Length - 22) + " تطبيقات وإعادة المحاولة" - | _ when text.StartsWith("Launching ") && text.EndsWith(" apps…") -> - "جارٍ تشغيل " + text.Substring(10, text.Length - 16) + " تطبيقات…" - | _ -> text - let languages = [| "en","English","EN"; "zh","中文","中"; "ja","日本語","日"; "ar","العربية","ع" |] /// Values of the language setting: "system" follows the Windows display language. let preferences = "system" :: [for code,_,_ in languages -> code] @@ -413,10 +22,10 @@ module Localization = match current() with | "zh" -> text.zh | "ja" -> text.ja - | "ar" -> translateArabic text.en + | "ar" -> text.ar | _ -> text.en /// Every translation of a text, for search. - let all (text:LocalizedText) = [text.en; text.zh; text.ja; translateArabic text.en] + let all (text:LocalizedText) = [text.en; text.zh; text.ja; text.ar] [] module LocalizationOperators = diff --git a/WtProgram/Shared/Strings.fs b/WtProgram/Shared/Strings.fs index 4d88e90a..a4505757 100644 --- a/WtProgram/Shared/Strings.fs +++ b/WtProgram/Shared/Strings.fs @@ -7,104 +7,108 @@ type SettingText = { caption:LocalizedText; description:LocalizedText; keywords: /// Every user-visible text, in every supported language. Show one with `tr`. /// Text with values filled in is a function, so the format is written once per language. module Strings = - let private none = { en=""; zh=""; ja="" } + let private none = { en=""; zh=""; ja=""; ar="" } module Common = - let ok = { en="OK"; zh="确定"; ja="OK" } - let cancel = { en="Cancel"; zh="取消"; ja="キャンセル" } - let save = { en="Save"; zh="保存"; ja="保存" } - let refresh = { en="Refresh"; zh="刷新"; ja="更新" } - let name = { en="Name"; zh="名称"; ja="名称" } - let title = { en="Title"; zh="标题"; ja="タイトル" } - let left = { en="Left"; zh="左侧"; ja="左" } - let top = { en="Top"; zh="靠上"; ja="上" } - let bottom = { en="Bottom"; zh="靠下"; ja="下" } - let center = { en="Center"; zh="居中"; ja="中央" } - let right = { en="Right"; zh="右侧"; ja="右" } - let never = { en="Never"; zh="从不"; ja="しない" } - let whenMaximized = { en="When maximized"; zh="最大化时"; ja="最大化時" } - let always = { en="Always"; zh="始终"; ja="常に" } - let selectedChoice (name:LocalizedText) = { en=name.en+" ✓"; zh=name.zh+" ✓"; ja=name.ja+" ✓" } - let operationFailed = { en="Operation failed"; zh="操作失败"; ja="操作に失敗しました" } + let ok = { en="OK"; zh="确定"; ja="OK"; ar="موافق" } + let cancel = { en="Cancel"; zh="取消"; ja="キャンセル"; ar="إلغاء" } + let save = { en="Save"; zh="保存"; ja="保存"; ar="حفظ" } + let refresh = { en="Refresh"; zh="刷新"; ja="更新"; ar="تحديث" } + let name = { en="Name"; zh="名称"; ja="名称"; ar="الاسم" } + let title = { en="Title"; zh="标题"; ja="タイトル"; ar="العنوان" } + let left = { en="Left"; zh="左侧"; ja="左"; ar="يسار" } + let top = { en="Top"; zh="靠上"; ja="上"; ar="أعلى" } + let bottom = { en="Bottom"; zh="靠下"; ja="下"; ar="أسفل" } + let center = { en="Center"; zh="居中"; ja="中央"; ar="توسيط" } + let right = { en="Right"; zh="右侧"; ja="右"; ar="يمين" } + let never = { en="Never"; zh="从不"; ja="しない"; ar="أبدًا" } + let whenMaximized = { en="When maximized"; zh="最大化时"; ja="最大化時"; ar="عند التكبير" } + let always = { en="Always"; zh="始终"; ja="常に"; ar="دائمًا" } + let selectedChoice (name:LocalizedText) = { en=name.en+" ✓"; zh=name.zh+" ✓"; ja=name.ja+" ✓"; ar=name.ar+" ✓" } + let operationFailed = { en="Operation failed"; zh="操作失败"; ja="操作に失敗しました"; ar="فشلت العملية" } module Messages = - let alreadyRunning = { en="WindowTabs is already running."; zh="WindowTabs 已在运行。"; ja="WindowTabs は既に実行中です。" } - let couldNotContinue = { en="WindowTabs could not continue"; zh="WindowTabs 无法继续运行"; ja="WindowTabs を続行できません" } - let settingsSaveFailed = { en="Settings save failed"; zh="设置保存失败"; ja="設定を保存できませんでした" } + let alreadyRunning = { en="WindowTabs is already running."; zh="WindowTabs 已在运行。"; ja="WindowTabs は既に実行中です。"; ar="برنامج WindowTabs قيد التشغيل بالفعل." } + let couldNotContinue = { en="WindowTabs could not continue"; zh="WindowTabs 无法继续运行"; ja="WindowTabs を続行できません"; ar="تعذّر على WindowTabs المتابعة" } + let settingsSaveFailed = { en="Settings save failed"; zh="设置保存失败"; ja="設定を保存できませんでした"; ar="فشل حفظ الإعدادات" } let unableToSaveSettings path details = { en=sprintf "Unable to save settings to %s.\nYour changes remain in memory and will be retried on the next edit or exit.\n\n%s" path details zh=sprintf "无法保存设置到 %s。\n更改仍保留在内存中,下次修改或退出时会重试。\n\n%s" path details - ja=sprintf "設定を %s に保存できませんでした。\n変更はメモリに保持され、次の編集時または終了時に再試行されます。\n\n%s" path details } - let settingsError = { en="Settings error"; zh="设置错误"; ja="設定エラー" } + ja=sprintf "設定を %s に保存できませんでした。\n変更はメモリに保持され、次の編集時または終了時に再試行されます。\n\n%s" path details + ar=sprintf "تعذّر حفظ الإعدادات في %s.\nستظل تغييراتك في الذاكرة وستتم إعادة المحاولة عند التعديل التالي أو عند الخروج.\n\n%s" path details } + let settingsError = { en="Settings error"; zh="设置错误"; ja="設定エラー"; ar="خطأ في الإعدادات" } let errorLoadingSettings path details = { en=sprintf "Error loading settings.\n\nFix or remove the file %s.\n\nDetails: %s" path details zh=sprintf "读取设置出错。\n\n请修复或删除文件 %s。\n\n详细信息:%s" path details - ja=sprintf "設定の読み込み中にエラーが発生しました。\n\nファイル %s を修正または削除してください。\n\n詳細: %s" path details } + ja=sprintf "設定の読み込み中にエラーが発生しました。\n\nファイル %s を修正または削除してください。\n\n詳細: %s" path details + ar=sprintf "حدث خطأ أثناء تحميل الإعدادات.\n\nأصلح الملف %s أو احذفه.\n\nالتفاصيل: %s" path details } /// Tray icon menu. module Tray = - let exit = { en="Exit WindowTabs"; zh="退出 WindowTabs"; ja="WindowTabs を終了" } - let errorTitle = { en="WindowTabs ran into a problem"; zh="WindowTabs 遇到了问题"; ja="WindowTabs で問題が発生しました" } + let exit = { en="Exit WindowTabs"; zh="退出 WindowTabs"; ja="WindowTabs を終了"; ar="إنهاء WindowTabs" } + let errorTitle = { en="WindowTabs ran into a problem"; zh="WindowTabs 遇到了问题"; ja="WindowTabs で問題が発生しました"; ar="واجه WindowTabs مشكلة" } let errorText = { en="It kept running. The details are in the crash log; click to show it." zh="程序仍在运行。详细信息已写入崩溃日志,点击查看。" - ja="動作は続いています。詳細はクラッシュログにあります。クリックすると表示します。" } + ja="動作は続いています。詳細はクラッシュログにあります。クリックすると表示します。" + ar="استمر البرنامج في العمل. التفاصيل موجودة في سجل الأعطال؛ انقر لعرضه." } /// Tab context menu. module TabMenu = - let position = { en="Tab position"; zh="标签位置"; ja="タブの位置" } - let top = { en="Top"; zh="顶部"; ja="上部" } - let showTabTitles = { en="Show tab titles"; zh="显示标签标题"; ja="タブのタイトルを表示" } - let showIconsOnly = { en="Show icons only"; zh="仅显示图标"; ja="アイコンのみ表示" } - let newTab = { en="New tab"; zh="新建标签"; ja="新しいタブ" } - let renameTab = { en="Rename"; zh="重命名"; ja="名前を変更" } - let restoreTabName = { en="Reset name"; zh="重置名称"; ja="名前をリセット" } - let sortTabs = { en="Sort by app and title"; zh="按应用和标题排序"; ja="アプリとタイトル順に並べ替え" } - let combineTaskbarIcons = { en="Combine taskbar icons"; zh="合并任务栏图标"; ja="タスクバーアイコンをまとめる" } + let position = { en="Tab position"; zh="标签位置"; ja="タブの位置"; ar="موضع علامات التبويب" } + let top = { en="Top"; zh="顶部"; ja="上部"; ar="أعلى" } + let showTabTitles = { en="Show tab titles"; zh="显示标签标题"; ja="タブのタイトルを表示"; ar="إظهار عناوين علامات التبويب" } + let showIconsOnly = { en="Show icons only"; zh="仅显示图标"; ja="アイコンのみ表示"; ar="إظهار الأيقونات فقط" } + let newTab = { en="New tab"; zh="新建标签"; ja="新しいタブ"; ar="علامة تبويب جديدة" } + let renameTab = { en="Rename"; zh="重命名"; ja="名前を変更"; ar="إعادة تسمية" } + let restoreTabName = { en="Reset name"; zh="重置名称"; ja="名前をリセット"; ar="إعادة تعيين الاسم" } + let sortTabs = { en="Sort by app and title"; zh="按应用和标题排序"; ja="アプリとタイトル順に並べ替え"; ar="ترتيب حسب التطبيق والعنوان" } + let combineTaskbarIcons = { en="Combine taskbar icons"; zh="合并任务栏图标"; ja="タスクバーアイコンをまとめる"; ar="دمج أيقونات شريط المهام" } /// For the group's own taskbar button, shown while its icons are combined. - let changeTaskbarIcon = { en="Change taskbar icon…"; zh="更换任务栏图标…"; ja="タスクバーアイコンを変更…" } - let restoreTaskbarIcon = { en="Restore taskbar icon"; zh="恢复默认任务栏图标"; ja="タスクバーアイコンを元に戻す" } + let changeTaskbarIcon = { en="Change taskbar icon…"; zh="更换任务栏图标…"; ja="タスクバーアイコンを変更…"; ar="تغيير أيقونة شريط المهام…" } + let restoreTaskbarIcon = { en="Restore taskbar icon"; zh="恢复默认任务栏图标"; ja="タスクバーアイコンを元に戻す"; ar="استعادة أيقونة شريط المهام" } /// The kinds named with their extensions, so programs are seen to be taken too. let taskbarIconFiles = { en="Icon files (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|All files (*.*)|*.*" zh="图标文件 (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|所有文件 (*.*)|*.*" - ja="アイコン ファイル (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|すべてのファイル (*.*)|*.*" } - let numberShortcut = { en="Switch by number"; zh="数字键切换"; ja="番号で切り替え" } - let enableTabs = { en="Enable tabs"; zh="启用标签"; ja="タブを有効にする" } - let autoGroupWindows = { en="Auto-group windows"; zh="自动分组"; ja="ウィンドウを自動グループ化" } - let close = { en="Close"; zh="关闭"; ja="閉じる" } - let closeOthers = { en="Close others"; zh="关闭其他"; ja="他を閉じる" } - let closeAllOf exe = { en=sprintf "Close all '%s' windows" exe; zh=sprintf "关闭所有“%s”窗口" exe; ja=sprintf "「%s」のウィンドウをすべて閉じる" exe } - let closeAll = { en="Close all"; zh="关闭全部"; ja="すべて閉じる" } - let settings = { en="Settings..."; zh="设置..."; ja="設定..." } + ja="アイコン ファイル (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|すべてのファイル (*.*)|*.*" + ar="ملفات الأيقونات (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|كل الملفات (*.*)|*.*" } + let numberShortcut = { en="Switch by number"; zh="数字键切换"; ja="番号で切り替え"; ar="التبديل باستخدام الرقم" } + let enableTabs = { en="Enable tabs"; zh="启用标签"; ja="タブを有効にする"; ar="تمكين علامات التبويب" } + let autoGroupWindows = { en="Auto-group windows"; zh="自动分组"; ja="ウィンドウを自動グループ化"; ar="تجميع النوافذ تلقائيًا" } + let close = { en="Close"; zh="关闭"; ja="閉じる"; ar="إغلاق" } + let closeOthers = { en="Close others"; zh="关闭其他"; ja="他を閉じる"; ar="إغلاق علامات التبويب الأخرى" } + let closeAllOf exe = { en=sprintf "Close all '%s' windows" exe; zh=sprintf "关闭所有“%s”窗口" exe; ja=sprintf "「%s」のウィンドウをすべて閉じる" exe; ar=sprintf "إغلاق جميع نوافذ «%s»" exe } + let closeAll = { en="Close all"; zh="关闭全部"; ja="すべて閉じる"; ar="إغلاق الكل" } + let settings = { en="Settings..."; zh="设置..."; ja="設定..."; ar="الإعدادات..." } /// Menu shown when a tab is dropped with the right mouse button. module DropMenu = - let copy = { en="Copy"; zh="复制"; ja="コピー" } - let move = { en="Move"; zh="移动"; ja="移動" } + let copy = { en="Copy"; zh="复制"; ja="コピー"; ar="نسخ" } + let move = { en="Move"; zh="移动"; ja="移動"; ar="نقل" } /// Under the strip while files are dragged over an Explorer tab; %1 is the folder's name. - let moveTo = { en="Move to %1"; zh="移动到 %1"; ja="%1 へ移動" } - let copyTo = { en="Copy to %1"; zh="复制到 %1"; ja="%1 へコピー" } + let moveTo = { en="Move to %1"; zh="移动到 %1"; ja="%1 へ移動"; ar="نقل إلى %1" } + let copyTo = { en="Copy to %1"; zh="复制到 %1"; ja="%1 へコピー"; ar="نسخ إلى %1" } /// Settings window chrome and page titles. module SettingsWindow = - let title = { en="WindowTabs Settings"; zh="WindowTabs 设置"; ja="WindowTabs の設定" } - let search = { en="Search"; zh="搜索"; ja="検索" } - let searchSettings = { en="Search settings"; zh="搜索设置"; ja="設定を検索" } - let searchSuggestions = { en="Search suggestions"; zh="搜索建议"; ja="検索候補" } + let title = { en="WindowTabs Settings"; zh="WindowTabs 设置"; ja="WindowTabs の設定"; ar="إعدادات WindowTabs" } + let search = { en="Search"; zh="搜索"; ja="検索"; ar="بحث" } + let searchSettings = { en="Search settings"; zh="搜索设置"; ja="設定を検索"; ar="البحث في الإعدادات" } + let searchSuggestions = { en="Search suggestions"; zh="搜索建议"; ja="検索候補"; ar="اقتراحات البحث" } /// Where a search result lives when it is on no page: the language picker. - let sidebar = { en="Sidebar"; zh="侧边栏"; ja="サイドバー" } - let searchResults = { en="Search results"; zh="搜索结果"; ja="検索結果" } - let noMatches = { en="No matching settings."; zh="没有找到匹配的设置。"; ja="一致する設定はありません。" } - let followWindows = { en="Follow Windows"; zh="跟随系统"; ja="Windows に従う" } - let howToUse = { en="How to use"; zh="使用说明"; ja="使い方" } - let pageScroll = { en="Page scroll"; zh="页面滚动条"; ja="ページのスクロールバー" } + let sidebar = { en="Sidebar"; zh="侧边栏"; ja="サイドバー"; ar="الشريط الجانبي" } + let searchResults = { en="Search results"; zh="搜索结果"; ja="検索結果"; ar="نتائج البحث" } + let noMatches = { en="No matching settings."; zh="没有找到匹配的设置。"; ja="一致する設定はありません。"; ar="لا توجد إعدادات مطابقة." } + let followWindows = { en="Follow Windows"; zh="跟随系统"; ja="Windows に従う"; ar="اتباع إعدادات Windows" } + let howToUse = { en="How to use"; zh="使用说明"; ja="使い方"; ar="طريقة الاستخدام" } + let pageScroll = { en="Page scroll"; zh="页面滚动条"; ja="ページのスクロールバー"; ar="تمرير الصفحة" } module Pages = - let general = { en="General"; zh="常规"; ja="全般" } - let appearance = { en="Appearance"; zh="外观"; ja="外観" } - let shortcuts = { en="Shortcuts"; zh="快捷键"; ja="ショートカット" } - let appRules = { en="App rules"; zh="应用规则"; ja="アプリのルール" } - let workspaces = { en="Workspaces"; zh="工作区"; ja="ワークスペース" } - let diagnostics = { en="Support"; zh="支持"; ja="サポート" } + let general = { en="General"; zh="常规"; ja="全般"; ar="عام" } + let appearance = { en="Appearance"; zh="外观"; ja="外観"; ar="المظهر" } + let shortcuts = { en="Shortcuts"; zh="快捷键"; ja="ショートカット"; ar="اختصارات" } + let appRules = { en="App rules"; zh="应用规则"; ja="アプリのルール"; ar="قواعد التطبيقات" } + let workspaces = { en="Workspaces"; zh="工作区"; ja="ワークスペース"; ar="مساحات العمل" } + let diagnostics = { en="Support"; zh="支持"; ja="サポート"; ar="الدعم" } let title page = match page with | GeneralSettings -> general @@ -116,393 +120,417 @@ module Strings = /// Captions, descriptions and search keywords of SettingsCatalog entries. module Settings = - let private colorWords = { en="color colour"; zh="颜色 配色"; ja="色 カラー" } - let private sizeWords = { en="size"; zh="尺寸 大小"; ja="サイズ 大きさ" } - let private hotkeyWords = { en="hotkey"; zh="热键"; ja="ホットキー" } - let theme = { caption={ en="Theme"; zh="主题"; ja="テーマ" } - description={ en="System follows your Windows app mode."; zh="“跟随系统”与 Windows 的应用模式保持一致。"; ja="「システム」は Windows のアプリ モードに合わせます。" } - keywords={ en="dark mode"; zh="暗色 深色模式"; ja="ダークモード" } } - let language = { caption={ en="Language"; zh="语言"; ja="言語" } - description={ en="Follow Windows uses your Windows display language."; zh="“跟随系统”使用 Windows 的显示语言。"; ja="「Windows に従う」では Windows の表示言語を使います。" } - keywords={ en="locale"; zh="界面语言"; ja="表示言語" } } - let launchAtSignIn = { caption={ en="Start with Windows"; zh="随 Windows 启动"; ja="Windows と同時に起動" } - description={ en="Runs in the system tray after you sign in."; zh="登录后在系统托盘中运行。"; ja="サインイン後にシステムトレイで実行します。" } - keywords={ en="startup autostart"; zh="开机启动 自启动"; ja="スタートアップ 自動起動" } } - let enableTabsByDefault = { caption={ en="Use tabs for new apps"; zh="新应用自动启用标签"; ja="新しいアプリでタブを使う" } - description={ en="Only apps first discovered after this change. Existing apps keep their tab setting."; zh="只影响此后首次出现的应用。已有应用保留原来的标签设置。"; ja="変更後に初めて検出するアプリに適用します。既存のアプリのタブ設定は維持します。" } - keywords={ en=""; zh=""; ja="" } } - let dimInactiveGroups = { caption={ en="Dim tabs in inactive groups"; zh="淡化非活动分组的标签"; ja="非アクティブなグループのタブの色を薄くする" } - description={ en="Make the active group easier to spot."; zh="让当前活动的分组更容易辨认。"; ja="アクティブなグループを見分けやすくします。" } - keywords={ en="fade"; zh="变暗"; ja="薄く 暗く" } } - let autoHide = { caption={ en="Auto-hide tabs"; zh="自动隐藏标签"; ja="タブを自動的に隠す" } - description={ en="Show a thin strip until hover."; zh="只显示细栏,悬停展开。"; ja="細いバーだけ表示し、ホバーで展開します。" } - keywords={ en="collapse"; zh="收起"; ja="折りたたみ" } } - let showTabsOnSwitch = { caption={ en="Show tabs briefly after switching"; zh="切换后短暂显示标签"; ja="切り替え後にタブを一時的に表示" } - description={ en="For about a second, so you can see where you are."; zh="显示约一秒,方便确认当前位置。"; ja="約 1 秒間表示して、今いる位置を確認できます。" } - keywords={ en="peek"; zh="短暂显示"; ja="一時表示" } } - let tabPosition = { caption={ en="Position tabs"; zh="放置标签"; ja="タブを配置" } + let private colorWords = { en="color colour"; zh="颜色 配色"; ja="色 カラー"; ar="اللون الألوان" } + let private sizeWords = { en="size"; zh="尺寸 大小"; ja="サイズ 大きさ"; ar="الحجم" } + let private hotkeyWords = { en="hotkey"; zh="热键"; ja="ホットキー"; ar="مفتاح الاختصار" } + let theme = { caption={ en="Theme"; zh="主题"; ja="テーマ"; ar="السمة" } + description={ en="System follows your Windows app mode."; zh="“跟随系统”与 Windows 的应用模式保持一致。"; ja="「システム」は Windows のアプリ モードに合わせます。"; ar="يتبع خيار النظام وضع التطبيقات في Windows." } + keywords={ en="dark mode"; zh="暗色 深色模式"; ja="ダークモード"; ar="الوضع الداكن" } } + let language = { caption={ en="Language"; zh="语言"; ja="言語"; ar="اللغة" } + description={ en="Follow Windows uses your Windows display language."; zh="“跟随系统”使用 Windows 的显示语言。"; ja="「Windows に従う」では Windows の表示言語を使います。"; ar="يستخدم خيار اتباع Windows لغة العرض المحددة في Windows." } + keywords={ en="locale"; zh="界面语言"; ja="表示言語"; ar="الإعدادات المحلية" } } + let launchAtSignIn = { caption={ en="Start with Windows"; zh="随 Windows 启动"; ja="Windows と同時に起動"; ar="التشغيل مع Windows" } + description={ en="Runs in the system tray after you sign in."; zh="登录后在系统托盘中运行。"; ja="サインイン後にシステムトレイで実行します。"; ar="يعمل في منطقة الإعلام بعد تسجيل الدخول." } + keywords={ en="startup autostart"; zh="开机启动 自启动"; ja="スタートアップ 自動起動"; ar="بدء التشغيل التشغيل التلقائي" } } + let enableTabsByDefault = { caption={ en="Use tabs for new apps"; zh="新应用自动启用标签"; ja="新しいアプリでタブを使う"; ar="استخدام علامات التبويب للتطبيقات الجديدة" } + description={ en="Only apps first discovered after this change. Existing apps keep their tab setting."; zh="只影响此后首次出现的应用。已有应用保留原来的标签设置。"; ja="変更後に初めて検出するアプリに適用します。既存のアプリのタブ設定は維持します。"; ar="ينطبق ذلك على التطبيقات التي يكتشفها البرنامج لأول مرة بعد هذا التغيير فقط. وتحتفظ التطبيقات الموجودة بإعداد علامات التبويب الحالي." } + keywords={ en=""; zh=""; ja=""; ar="" } } + let dimInactiveGroups = { caption={ en="Dim tabs in inactive groups"; zh="淡化非活动分组的标签"; ja="非アクティブなグループのタブの色を薄くする"; ar="تخفيف لون علامات التبويب في المجموعات غير النشطة" } + description={ en="Make the active group easier to spot."; zh="让当前活动的分组更容易辨认。"; ja="アクティブなグループを見分けやすくします。"; ar="لتسهيل تمييز المجموعة النشطة." } + keywords={ en="fade"; zh="变暗"; ja="薄く 暗く"; ar="تلاشي" } } + let autoHide = { caption={ en="Auto-hide tabs"; zh="自动隐藏标签"; ja="タブを自動的に隠す"; ar="إخفاء علامات التبويب تلقائيًا" } + description={ en="Show a thin strip until hover."; zh="只显示细栏,悬停展开。"; ja="細いバーだけ表示し、ホバーで展開します。"; ar="إظهار شريط رفيع حتى تمرير المؤشر فوقه." } + keywords={ en="collapse"; zh="收起"; ja="折りたたみ"; ar="طيّ" } } + let showTabsOnSwitch = { caption={ en="Show tabs briefly after switching"; zh="切换后短暂显示标签"; ja="切り替え後にタブを一時的に表示"; ar="إظهار علامات التبويب لفترة وجيزة بعد التبديل" } + description={ en="For about a second, so you can see where you are."; zh="显示约一秒,方便确认当前位置。"; ja="約 1 秒間表示して、今いる位置を確認できます。"; ar="لمدة ثانية تقريبًا لتتمكن من معرفة موضعك." } + keywords={ en="peek"; zh="短暂显示"; ja="一時表示"; ar="معاينة" } } + let tabPosition = { caption={ en="Position tabs"; zh="放置标签"; ja="タブを配置"; ar="موضع علامات التبويب" } description=none - keywords={ en="vertical horizontal sidebar left right"; zh="垂直 横向 侧栏 左 右"; ja="縦 横 サイドバー 左 右" } } - let tabColumnWidthHint = { en="For left/right tabs. Drag a column edge to resize one group, down to an icon rail."; zh="用于左/右标签。拖动侧栏边缘可单独调整分组宽度,最窄可只显示图标。"; ja="左・右のタブ用です。列の端をドラッグしてグループの幅を変更できます。最小幅ではアイコンのみを表示します。" } - let tabColumnWidth = { caption={ en="Vertical tab width"; zh="垂直标签宽度"; ja="縦タブ幅" } + keywords={ en="vertical horizontal sidebar left right"; zh="垂直 横向 侧栏 左 右"; ja="縦 横 サイドバー 左 右"; ar="رأسي أفقي شريط جانبي يسار يمين" } } + let tabColumnWidthHint = { en="For left/right tabs. Drag a column edge to resize one group, down to an icon rail."; zh="用于左/右标签。拖动侧栏边缘可单独调整分组宽度,最窄可只显示图标。"; ja="左・右のタブ用です。列の端をドラッグしてグループの幅を変更できます。最小幅ではアイコンのみを表示します。"; ar="للعلامات الجانبية اليمنى أو اليسرى. اسحب حافة العمود لتغيير عرض مجموعة واحدة، حتى يصبح شريطًا للأيقونات فقط." } + let tabColumnWidth = { caption={ en="Vertical tab width"; zh="垂直标签宽度"; ja="縦タブ幅"; ar="عرض علامات التبويب الرأسية" } description=none - keywords={ en="vertical sidebar width size"; zh="垂直 侧栏 宽度 大小"; ja="縦 サイドバー 幅 サイズ" } } - let tabAlignment = { caption={ en="Align tabs"; zh="对齐标签"; ja="タブを揃える" } + keywords={ en="vertical sidebar width size"; zh="垂直 侧栏 宽度 大小"; ja="縦 サイドバー 幅 サイズ"; ar="رأسي شريط جانبي عرض حجم" } } + let tabAlignment = { caption={ en="Align tabs"; zh="对齐标签"; ja="タブを揃える"; ar="محاذاة علامات التبويب" } description=none - keywords={ en="alignment position"; zh="对齐 位置"; ja="配置 位置" } } - let combineTaskbarIcons = { caption={ en="Combine taskbar icons per group"; zh="合并每个分组的任务栏图标"; ja="グループのタスクバーアイコンをまとめる" } + keywords={ en="alignment position"; zh="对齐 位置"; ja="配置 位置"; ar="محاذاة موضع" } } + let combineTaskbarIcons = { caption={ en="Combine taskbar icons per group"; zh="合并每个分组的任务栏图标"; ja="グループのタスクバーアイコンをまとめる"; ar="دمج أيقونات شريط المهام لكل مجموعة" } description=none - keywords={ en="merge"; zh="合并"; ja="結合" } } - let replaceAltTab = { caption={ en="Use WindowTabs for Alt+Tab"; zh="使用 WindowTabs 窗口切换器"; ja="Alt+Tab に WindowTabs を使う" } - description={ en="Replaces the Windows switcher."; zh="替换 Windows 自带的窗口切换器。"; ja="Windows 標準のウィンドウ切り替えを置き換えます。" } - keywords={ en="task switcher"; zh="任务切换"; ja="タスク切り替え" } } - let switcherStyle = { caption={ en="Switcher style"; zh="切换器样式"; ja="スイッチャーの表示" } - description={ en="Large icons in a row, or a list with full window titles."; zh="一排大图标,或显示完整窗口标题的列表。"; ja="大きなアイコンを横に並べるか、ウィンドウ タイトルを一覧で表示します。" } - keywords={ en="layout"; zh="布局"; ja="レイアウト" } } - let groupWindowsInSwitcher = { caption={ en="Group windows in Alt+Tab"; zh="在 Alt+Tab 中按分组显示"; ja="Alt+Tab でグループをまとめる" } - description={ en="Each group appears as one item."; zh="每个分组只显示一项。"; ja="各グループを 1 項目として表示します。" } - keywords={ en="switcher"; zh="切换器"; ja="切り替え" } } - let nextTab = { caption={ en="Switch to next tab"; zh="切换到下一个标签"; ja="次のタブに切り替え" } + keywords={ en="merge"; zh="合并"; ja="結合"; ar="دمج" } } + let replaceAltTab = { caption={ en="Use WindowTabs for Alt+Tab"; zh="使用 WindowTabs 窗口切换器"; ja="Alt+Tab に WindowTabs を使う"; ar="استخدام WindowTabs عند الضغط على Alt+Tab" } + description={ en="Replaces the Windows switcher."; zh="替换 Windows 自带的窗口切换器。"; ja="Windows 標準のウィンドウ切り替えを置き換えます。"; ar="يستبدل أداة التبديل بين النوافذ في Windows." } + keywords={ en="task switcher"; zh="任务切换"; ja="タスク切り替え"; ar="مبدّل المهام" } } + let switcherStyle = { caption={ en="Switcher style"; zh="切换器样式"; ja="スイッチャーの表示"; ar="نمط أداة التبديل" } + description={ en="Large icons in a row, or a list with full window titles."; zh="一排大图标,或显示完整窗口标题的列表。"; ja="大きなアイコンを横に並べるか、ウィンドウ タイトルを一覧で表示します。"; ar="أيقونات كبيرة في صف، أو قائمة تعرض عناوين النوافذ كاملة." } + keywords={ en="layout"; zh="布局"; ja="レイアウト"; ar="التخطيط" } } + let groupWindowsInSwitcher = { caption={ en="Group windows in Alt+Tab"; zh="在 Alt+Tab 中按分组显示"; ja="Alt+Tab でグループをまとめる"; ar="تجميع النوافذ في Alt+Tab" } + description={ en="Each group appears as one item."; zh="每个分组只显示一项。"; ja="各グループを 1 項目として表示します。"; ar="تظهر كل مجموعة كعنصر واحد." } + keywords={ en="switcher"; zh="切换器"; ja="切り替え"; ar="أداة التبديل" } } + let nextTab = { caption={ en="Switch to next tab"; zh="切换到下一个标签"; ja="次のタブに切り替え"; ar="الانتقال إلى علامة التبويب التالية" } description=none keywords=hotkeyWords } - let previousTab = { caption={ en="Switch to previous tab"; zh="切换到上一个标签"; ja="前のタブに切り替え" } + let previousTab = { caption={ en="Switch to previous tab"; zh="切换到上一个标签"; ja="前のタブに切り替え"; ar="الانتقال إلى علامة التبويب السابقة" } description=none keywords=hotkeyWords } - let searchTabs = { caption={ en="Switch windows"; zh="切换窗口"; ja="ウィンドウを切り替え" } - description={ en="Switch to a window by title or app name."; zh="按标题或应用名查找并切换窗口。"; ja="タイトルやアプリ名でウィンドウを探して切り替えます。" } - keywords={ en="find"; zh="查找"; ja="検索" } } - let newTab = { caption={ en="New tab"; zh="新建标签"; ja="新しいタブ" } + let searchTabs = { caption={ en="Switch windows"; zh="切换窗口"; ja="ウィンドウを切り替え"; ar="تبديل النوافذ" } + description={ en="Switch to a window by title or app name."; zh="按标题或应用名查找并切换窗口。"; ja="タイトルやアプリ名でウィンドウを探して切り替えます。"; ar="الانتقال إلى نافذة باستخدام عنوانها أو اسم التطبيق." } + keywords={ en="find"; zh="查找"; ja="検索"; ar="بحث" } } + let newTab = { caption={ en="New tab"; zh="新建标签"; ja="新しいタブ"; ar="علامة تبويب جديدة" } description={ en="Starts the current tab's app again." zh="再次启动当前标签的应用。" - ja="現在のタブのアプリをもう一度起動します。" } - keywords={ en="new window"; zh="新建窗口"; ja="新しいウィンドウ" } } - let closeTab = { caption={ en="Close tab"; zh="关闭标签"; ja="タブを閉じる" } + ja="現在のタブのアプリをもう一度起動します。" + ar="يشغّل التطبيق الخاص بعلامة التبويب الحالية مرة أخرى." } + keywords={ en="new window"; zh="新建窗口"; ja="新しいウィンドウ"; ar="نافذة جديدة" } } + let closeTab = { caption={ en="Close tab"; zh="关闭标签"; ja="タブを閉じる"; ar="إغلاق علامة التبويب" } description={ en="Closes the window of the tab in front." zh="关闭当前标签的窗口。" - ja="前面のタブのウィンドウを閉じます。" } - keywords={ en="close window"; zh="关闭窗口"; ja="ウィンドウを閉じる" } } - let switchTabsByNumber = { caption={ en="Switch tabs by number"; zh="按数字切换标签"; ja="番号でタブを切り替え" } - description={ en="Hold a modifier key and press 1–9."; zh="按住修饰键再按 1–9。"; ja="修飾キーを押しながら 1~9 を押します。" } - keywords={ en="digit"; zh="数字"; ja="数字" } } - let numberShortcut = { caption={ en="Modifier key for 1–9"; zh="数字键搭配的修饰键"; ja="1~9 と組み合わせるキー" } + ja="前面のタブのウィンドウを閉じます。" + ar="يغلق النافذة الخاصة بعلامة التبويب الحالية." } + keywords={ en="close window"; zh="关闭窗口"; ja="ウィンドウを閉じる"; ar="إغلاق النافذة" } } + let switchTabsByNumber = { caption={ en="Switch tabs by number"; zh="按数字切换标签"; ja="番号でタブを切り替え"; ar="التبديل بين علامات التبويب باستخدام الأرقام" } + description={ en="Hold a modifier key and press 1–9."; zh="按住修饰键再按 1–9。"; ja="修飾キーを押しながら 1~9 を押します。"; ar="اضغط باستمرار على مفتاح تعديل ثم اضغط على رقم من 1 إلى 9." } + keywords={ en="digit"; zh="数字"; ja="数字"; ar="رقم" } } + let numberShortcut = { caption={ en="Modifier key for 1–9"; zh="数字键搭配的修饰键"; ja="1~9 と組み合わせるキー"; ar="مفتاح التعديل للأرقام من 1 إلى 9" } description=none - keywords={ en="number"; zh="数字"; ja="番号" } } - let enableNumberLeader = { caption={ en="Switch tabs with a leader key"; zh="用引导键切换标签"; ja="リーダーキーでタブを切り替え" }; description={ en="Press the leader, then a selection key. Esc cancels."; zh="先按引导键,再按选择键。Esc 取消。"; ja="リーダーキーの後、選択キーを押します。Esc で解除。" }; keywords=none } - let leaderKeys = { caption={en="Selection keys";zh="选择键";ja="選択キー"}; description={en="Use unique letters or digits, in tab order.";zh="按标签顺序,使用不重复的字母或数字。";ja="タブ順に、重複しない英字または数字を指定します。"}; keywords={en="leader keys letters home row";zh="引导键 字母 主键区";ja="リーダーキー 英字 ホームポジション"} } - let leaderKeyPresets = [| {en="123456789";zh="123456789";ja="123456789"}; {en="QWERTYUIOP";zh="QWERTYUIOP";ja="QWERTYUIOP"}; {en="ASDFGHJKL;";zh="ASDFGHJKL;";ja="ASDFGHJKL;"} |] - let invalidLeaderKeys = {en="Use at least one unique letter, digit or unshifted punctuation key.";zh="请使用至少一个不重复的字母、数字或无需 Shift 的标点键。";ja="重複しない英字、数字、Shift 不要の記号を 1 つ以上指定してください。"} - let numberLeader = { caption={ en="Tab selection leader"; zh="标签选择引导键"; ja="タブ選択のリーダーキー" }; description=none; keywords=none } - let tabColors = { en="Color"; zh="颜色"; ja="色" } - let customTabColor = { en="Custom…"; zh="自定义…"; ja="カスタム…" } - let clearTabColor = { en="Clear color"; zh="清除颜色"; ja="色を解除" } - let rememberTabColor = { en="Remember color for current app"; zh="为当前应用记住颜色"; ja="現在のアプリの色を記憶" } + keywords={ en="number"; zh="数字"; ja="番号"; ar="رقم" } } + let enableNumberLeader = { caption={ en="Switch tabs with a leader key"; zh="用引导键切换标签"; ja="リーダーキーでタブを切り替え"; ar="التبديل باستخدام مفتاح تمهيدي" }; description={ en="Press the leader, then a selection key. Esc cancels."; zh="先按引导键,再按选择键。Esc 取消。"; ja="リーダーキーの後、選択キーを押します。Esc で解除。"; ar="اضغط المفتاح التمهيدي ثم مفتاح الاختيار. يلغي Esc العملية." }; keywords=none } + let leaderKeys = { caption={en="Selection keys";zh="选择键";ja="選択キー";ar="مفاتيح الاختيار"}; description={en="Use unique letters or digits, in tab order.";zh="按标签顺序,使用不重复的字母或数字。";ja="タブ順に、重複しない英字または数字を指定します。";ar="استخدم أحرفًا أو أرقامًا غير مكررة حسب ترتيب علامات التبويب."}; keywords={en="leader keys letters home row";zh="引导键 字母 主键区";ja="リーダーキー 英字 ホームポジション";ar="مفتاح تمهيدي أحرف الصف الأوسط"} } + let leaderKeyPresets = [| {en="123456789";zh="123456789";ja="123456789";ar="123456789"}; {en="QWERTYUIOP";zh="QWERTYUIOP";ja="QWERTYUIOP";ar="QWERTYUIOP"}; {en="ASDFGHJKL;";zh="ASDFGHJKL;";ja="ASDFGHJKL;";ar="ASDFGHJKL;"} |] + let invalidLeaderKeys = {en="Use at least one unique letter, digit or unshifted punctuation key.";zh="请使用至少一个不重复的字母、数字或无需 Shift 的标点键。";ja="重複しない英字、数字、Shift 不要の記号を 1 つ以上指定してください。";ar="استخدم حرفًا أو رقمًا أو مفتاح ترقيم غير مكرر واحدًا على الأقل دون Shift."} + let numberLeader = { caption={ en="Tab selection leader"; zh="标签选择引导键"; ja="タブ選択のリーダーキー"; ar="المفتاح التمهيدي لاختيار علامة التبويب" }; description=none; keywords=none } + let tabColors = { en="Color"; zh="颜色"; ja="色"; ar="اللون" } + let customTabColor = { en="Custom…"; zh="自定义…"; ja="カスタム…"; ar="مخصص…" } + let clearTabColor = { en="Clear color"; zh="清除颜色"; ja="色を解除"; ar="مسح اللون" } + let rememberTabColor = { en="Remember color for current app"; zh="为当前应用记住颜色"; ja="現在のアプリの色を記憶"; ar="تذكّر لون التطبيق الحالي" } let tabColorNames = [| - { en="Grey";zh="灰色";ja="グレー" }; { en="Blue";zh="蓝色";ja="青" } - { en="Red";zh="红色";ja="赤" }; { en="Yellow";zh="黄色";ja="黄" } - { en="Green";zh="绿色";ja="緑" }; { en="Pink";zh="粉色";ja="ピンク" } - { en="Purple";zh="紫色";ja="紫" }; { en="Cyan";zh="青色";ja="シアン" } - { en="Orange";zh="橙色";ja="オレンジ" }; { en="Lavender";zh="薰衣草色";ja="ラベンダー" } - { en="Olive";zh="橄榄色";ja="オリーブ" }; { en="Rose";zh="玫红色";ja="ローズ" } - { en="Lime";zh="青柠色";ja="ライム" }; { en="Navy";zh="藏青色";ja="ネイビー" } - { en="Teal";zh="蓝绿色";ja="ティール" }; { en="Coral";zh="珊瑚色";ja="コーラル" } |] - let tabColorMode = { caption={ en="Tab color coding"; zh="标签着色"; ja="タブの色分け" } + { en="Grey";zh="灰色";ja="グレー";ar="رمادي" }; { en="Blue";zh="蓝色";ja="青";ar="أزرق" } + { en="Red";zh="红色";ja="赤";ar="أحمر" }; { en="Yellow";zh="黄色";ja="黄";ar="أصفر" } + { en="Green";zh="绿色";ja="緑";ar="أخضر" }; { en="Pink";zh="粉色";ja="ピンク";ar="وردي" } + { en="Purple";zh="紫色";ja="紫";ar="أرجواني" }; { en="Cyan";zh="青色";ja="シアン";ar="سماوي" } + { en="Orange";zh="橙色";ja="オレンジ";ar="برتقالي" }; { en="Lavender";zh="薰衣草色";ja="ラベンダー";ar="لافندر" } + { en="Olive";zh="橄榄色";ja="オリーブ";ar="زيتي" }; { en="Rose";zh="玫红色";ja="ローズ";ar="وردي داكن" } + { en="Lime";zh="青柠色";ja="ライム";ar="ليموني" }; { en="Navy";zh="藏青色";ja="ネイビー";ar="كحلي" } + { en="Teal";zh="蓝绿色";ja="ティール";ar="أزرق مخضر" }; { en="Coral";zh="珊瑚色";ja="コーラル";ar="مرجاني" } |] + let tabColorMode = { caption={ en="Tab color coding"; zh="标签着色"; ja="タブの色分け"; ar="ترميز علامات التبويب بالألوان" } description={ en="Auto-assign colors by window or app." zh="按窗口或应用自动分配颜色。" - ja="ウィンドウ・アプリ別に色を自動で割り当てます。" } - keywords={ en="colorize rainbow"; zh="着色 彩虹"; ja="色分け" } } - let colorsOff = { en="Off"; zh="关闭"; ja="オフ" } - let byWindow = { en="By window"; zh="按窗口"; ja="ウィンドウ別" } - let byApp = { en="By app"; zh="按应用"; ja="アプリ別" } + ja="ウィンドウ・アプリ別に色を自動で割り当てます。" + ar="تعيين الألوان تلقائيًا حسب النافذة أو التطبيق." } + keywords={ en="colorize rainbow"; zh="着色 彩虹"; ja="色分け"; ar="تلوين قوس قزح" } } + let colorsOff = { en="Off"; zh="关闭"; ja="オフ"; ar="إيقاف" } + let byWindow = { en="By window"; zh="按窗口"; ja="ウィンドウ別"; ar="حسب النافذة" } + let byApp = { en="By app"; zh="按应用"; ja="アプリ別"; ar="حسب التطبيق" } let tabColorMenuHint = { en="Change it for one tab from the tab menu. That color comes first, and shows even when this is off." zh="可在标签菜单中为单个标签选色。它优先于这里的设置,关闭时也有效。" - ja="タブメニューでタブごとに色を選べます。こちらの設定より優先され、オフでも表示されます。" } - let tabColorStyle = { caption={ en="Show colors as"; zh="着色方式"; ja="色の付け方" } + ja="タブメニューでタブごとに色を選べます。こちらの設定より優先され、オフでも表示されます。" + ar="غيّر لون علامة تبويب واحدة من قائمتها. تكون الأولوية لهذا اللون ويظهر حتى عند إيقاف هذا الخيار." } + let tabColorStyle = { caption={ en="Show colors as"; zh="着色方式"; ja="色の付け方"; ar="عرض الألوان على شكل" } description=none - keywords={ en="stripe fill"; zh="色条 填充"; ja="ライン 塗りつぶし" } } - let stripe = { en="Stripe"; zh="色条"; ja="色のライン" } - let fill = { en="Fill"; zh="填充"; ja="塗りつぶし" } - let numberShortcutMenuHint = { en="Enable or disable it for one app from the tab menu."; zh="可在标签右键菜单中为单个应用启用或禁用数字快捷键。"; ja="タブメニューでアプリごとに番号ショートカットを有効・無効にできます。" } - let numberShortcutFor name = { en=sprintf "Switch tabs by number in %s" name; zh=sprintf "在 %s 中按数字切换标签" name; ja=sprintf "%s のタブを番号で切り替え" name } + keywords={ en="stripe fill"; zh="色条 填充"; ja="ライン 塗りつぶし"; ar="شريط تعبئة" } } + let stripe = { en="Stripe"; zh="色条"; ja="色のライン"; ar="شريط" } + let fill = { en="Fill"; zh="填充"; ja="塗りつぶし"; ar="تعبئة" } + let numberShortcutMenuHint = { en="Enable or disable it for one app from the tab menu."; zh="可在标签右键菜单中为单个应用启用或禁用数字快捷键。"; ja="タブメニューでアプリごとに番号ショートカットを有効・無効にできます。"; ar="يمكن تمكينه أو تعطيله لتطبيق واحد من قائمة علامة التبويب." } + let numberShortcutFor name = { en=sprintf "Switch tabs by number in %s" name; zh=sprintf "在 %s 中按数字切换标签" name; ja=sprintf "%s のタブを番号で切り替え" name; ar=sprintf "التبديل بين علامات التبويب بالأرقام في %s" name } /// The choices of Switch tabs by number: off, or the key held with 1–9. - let numberShortcutOff = { en="Off"; zh="关闭"; ja="オフ" } - let numberShortcutWith key = { en=sprintf "%s + 1–9" key; zh=sprintf "%s + 1–9" key; ja=sprintf "%s + 1~9" key } - let numberShortcutCtrl = { en="Ctrl"; zh="Ctrl"; ja="Ctrl" } - let numberShortcutAlt = { en="Alt"; zh="Alt"; ja="Alt" } - let activateOnHover = { caption={ en="Switch tabs on hover"; zh="悬停切换标签"; ja="ホバーでタブを切り替え" } - description={ en="Rest the pointer on a tab instead of clicking."; zh="鼠标停在标签上即可,无需点击。"; ja="クリックしなくても、タブにポインターを置くだけで済みます。" } - keywords={ en="mouse over"; zh="悬停"; ja="マウスオーバー" } } - let shiftScroll = { caption={ en="Switch tabs with Shift + scroll"; zh="用 Shift + 滚轮切换标签"; ja="Shift + スクロールでタブを切り替え" } + let numberShortcutOff = { en="Off"; zh="关闭"; ja="オフ"; ar="إيقاف" } + let numberShortcutWith key = { en=sprintf "%s + 1–9" key; zh=sprintf "%s + 1–9" key; ja=sprintf "%s + 1~9" key; ar=sprintf "%s + 1–9" key } + let numberShortcutCtrl = { en="Ctrl"; zh="Ctrl"; ja="Ctrl"; ar="Ctrl" } + let numberShortcutAlt = { en="Alt"; zh="Alt"; ja="Alt"; ar="Alt" } + let activateOnHover = { caption={ en="Switch tabs on hover"; zh="悬停切换标签"; ja="ホバーでタブを切り替え"; ar="التبديل بين علامات التبويب عند تمرير المؤشر" } + description={ en="Rest the pointer on a tab instead of clicking."; zh="鼠标停在标签上即可,无需点击。"; ja="クリックしなくても、タブにポインターを置くだけで済みます。"; ar="ضع المؤشر فوق علامة تبويب بدلًا من النقر عليها." } + keywords={ en="mouse over"; zh="悬停"; ja="マウスオーバー"; ar="تمرير المؤشر" } } + let shiftScroll = { caption={ en="Switch tabs with Shift + scroll"; zh="用 Shift + 滚轮切换标签"; ja="Shift + スクロールでタブを切り替え"; ar="التبديل بين علامات التبويب باستخدام Shift والتمرير" } description={ en="Works anywhere over a grouped window. Over the tab bar, Shift isn't needed." zh="在分组窗口的任意位置均可使用;在标签栏上滚动时无需按 Shift。" - ja="グループ化されたウィンドウ上ならどこでも使えます。タブバー上では Shift は不要です。" } - keywords={ en="wheel"; zh="滚轮"; ja="ホイール" } } - let ctrlScroll = { caption={ en="Move tabs with Ctrl + scroll"; zh="用 Ctrl + 滚轮移动标签"; ja="Ctrl + スクロールでタブを移動" } + ja="グループ化されたウィンドウ上ならどこでも使えます。タブバー上では Shift は不要です。" + ar="يعمل في أي مكان فوق نافذة مجمّعة. لا تحتاج إلى Shift فوق شريط علامات التبويب." } + keywords={ en="wheel"; zh="滚轮"; ja="ホイール"; ar="عجلة التمرير" } } + let ctrlScroll = { caption={ en="Move tabs with Ctrl + scroll"; zh="用 Ctrl + 滚轮移动标签"; ja="Ctrl + スクロールでタブを移動"; ar="تحريك علامات التبويب باستخدام Ctrl والتمرير" } description={ en="Over the tab bar, moves the current tab left or right." zh="在标签栏上滚动,将当前标签向左或向右移动。" - ja="タブバー上で、現在のタブを左右に移動します。" } - keywords={ en="wheel reorder"; zh="滚轮 排序"; ja="ホイール 並べ替え" } } - let middleClickClose = { caption={ en="Middle-click closes a tab"; zh="按下滚轮关闭标签"; ja="中クリックでタブを閉じる" } + ja="タブバー上で、現在のタブを左右に移動します。" + ar="فوق شريط علامات التبويب، ينقل علامة التبويب الحالية إلى اليسار أو اليمين." } + keywords={ en="wheel reorder"; zh="滚轮 排序"; ja="ホイール 並べ替え"; ar="عجلة التمرير لإعادة الترتيب" } } + let middleClickClose = { caption={ en="Middle-click closes a tab"; zh="按下滚轮关闭标签"; ja="中クリックでタブを閉じる"; ar="النقر الأوسط يغلق علامة تبويب" } description={ en="Press the wheel on a tab to close its window." zh="在标签上按下滚轮,关闭它的窗口。" - ja="タブ上でホイールを押すと、そのウィンドウを閉じます。" } - keywords={ en="wheel click"; zh="中键 滚轮"; ja="ホイール クリック" } } - let tabTextColor = { caption={ en="Text and close button"; zh="文字与关闭按钮"; ja="文字と閉じるボタン" }; description=none; keywords=colorWords } - let tabNormalBgColor = { caption={ en="Inactive tab"; zh="非活动标签"; ja="非アクティブなタブ" }; description=none; keywords=colorWords } - let tabActiveBgColor = { caption={ en="Active tab"; zh="活动标签"; ja="アクティブなタブ" }; description=none; keywords=colorWords } - let tabHighlightBgColor = { caption={ en="Hovered tab"; zh="悬停标签"; ja="ホバー中のタブ" }; description=none; keywords=colorWords } - let tabStyle = { caption={ en="Tab style"; zh="标签样式"; ja="タブのスタイル" } - description={ en="How the active tab stands out from the rest."; zh="活动标签以何种方式与其他标签区分。"; ja="アクティブなタブをほかのタブとどう見分けるかを選びます。" } - keywords={ en="shape folder pill"; zh="形状 文件夹 胶囊"; ja="形 フォルダー ピル" } } - let tabHeightHint = { en="Left/right tabs have a minimum height of 32 px."; zh="左/右标签的实际高度最低为 32px。"; ja="左・右のタブの最小高さは 32px です。" } - let tabHeight = { caption={ en="Tab height"; zh="标签高度"; ja="タブの高さ" }; description=none; keywords=sizeWords } - let tabMaxWidth = { caption={ en="Maximum tab width"; zh="标签最大宽度"; ja="タブの最大幅" }; description=none; keywords=sizeWords } - let tabOverlap = { caption={ en="Tab spacing"; zh="标签间距"; ja="タブの間隔" } + ja="タブ上でホイールを押すと、そのウィンドウを閉じます。" + ar="اضغط بعجلة الفأرة على علامة التبويب لإغلاق نافذتها." } + keywords={ en="wheel click"; zh="中键 滚轮"; ja="ホイール クリック"; ar="النقر بعجلة الفأرة" } } + let tabTextColor = { caption={ en="Text and close button"; zh="文字与关闭按钮"; ja="文字と閉じるボタン"; ar="النص وزر الإغلاق" }; description=none; keywords=colorWords } + let tabNormalBgColor = { caption={ en="Inactive tab"; zh="非活动标签"; ja="非アクティブなタブ"; ar="علامة تبويب غير نشطة" }; description=none; keywords=colorWords } + let tabActiveBgColor = { caption={ en="Active tab"; zh="活动标签"; ja="アクティブなタブ"; ar="علامة تبويب نشطة" }; description=none; keywords=colorWords } + let tabHighlightBgColor = { caption={ en="Hovered tab"; zh="悬停标签"; ja="ホバー中のタブ"; ar="علامة التبويب التي يشير إليها المؤشر" }; description=none; keywords=colorWords } + let tabStyle = { caption={ en="Tab style"; zh="标签样式"; ja="タブのスタイル"; ar="نمط علامة التبويب" } + description={ en="How the active tab stands out from the rest."; zh="活动标签以何种方式与其他标签区分。"; ja="アクティブなタブをほかのタブとどう見分けるかを選びます。"; ar="كيفية تمييز علامة التبويب النشطة عن البقية." } + keywords={ en="shape folder pill"; zh="形状 文件夹 胶囊"; ja="形 フォルダー ピル"; ar="الشكل مجلد كبسولة" } } + let tabHeightHint = { en="Left/right tabs have a minimum height of 32 px."; zh="左/右标签的实际高度最低为 32px。"; ja="左・右のタブの最小高さは 32px です。"; ar="يبلغ الحد الأدنى لارتفاع علامات التبويب الجانبية 32 بكسل." } + let tabHeight = { caption={ en="Tab height"; zh="标签高度"; ja="タブの高さ"; ar="ارتفاع علامة التبويب" }; description=none; keywords=sizeWords } + let tabMaxWidth = { caption={ en="Maximum tab width"; zh="标签最大宽度"; ja="タブの最大幅"; ar="أقصى عرض لعلامة التبويب" }; description=none; keywords=sizeWords } + let tabOverlap = { caption={ en="Tab spacing"; zh="标签间距"; ja="タブの間隔"; ar="المسافة بين علامات التبويب" } description=none - keywords={ en="gap"; zh="间隙"; ja="隙間" } } - let tabIndent = { caption={ en="Side margin"; zh="两侧边距"; ja="左右の余白" } + keywords={ en="gap"; zh="间隙"; ja="隙間"; ar="فجوة" } } + let tabIndent = { caption={ en="Side margin"; zh="两侧边距"; ja="左右の余白"; ar="الهامش الجانبي" } description={ en="Distance from the window edges." zh="与窗口两侧的距离。" - ja="ウィンドウの左右端からの距離です。" } - keywords={ en="indent padding"; zh="缩进 边距"; ja="インデント 余白" } } + ja="ウィンドウの左右端からの距離です。" + ar="المسافة من حواف النافذة." } + keywords={ en="indent padding"; zh="缩进 边距"; ja="インデント 余白"; ar="مسافة بادئة حشو" } } let appRules = { caption=Pages.appRules - description={ en="Choose apps for tabs and automatic grouping."; zh="选择启用标签和自动分组的应用。"; ja="タブと自動グループ化を使うアプリを選択します。" } - keywords={ en="process program"; zh="程序 进程"; ja="プロセス プログラム" } } + description={ en="Choose apps for tabs and automatic grouping."; zh="选择启用标签和自动分组的应用。"; ja="タブと自動グループ化を使うアプリを選択します。"; ar="اختر التطبيقات التي تستخدم علامات التبويب والتجميع التلقائي." } + keywords={ en="process program"; zh="程序 进程"; ja="プロセス プログラム"; ar="عملية برنامج" } } let workspaces = { caption=Pages.workspaces - description={ en="Save and restore window layouts."; zh="保存和恢复窗口布局。"; ja="ウィンドウの配置を保存して復元します。" } - keywords={ en="session"; zh="会话"; ja="セッション" } } + description={ en="Save and restore window layouts."; zh="保存和恢复窗口布局。"; ja="ウィンドウの配置を保存して復元します。"; ar="حفظ تخطيطات النوافذ واستعادتها." } + keywords={ en="session"; zh="会话"; ja="セッション"; ar="جلسة" } } let diagnostics = { caption=Pages.diagnostics - description={ en="Troubleshooting report and where to get help."; zh="故障排查报告与获取帮助的途径。"; ja="トラブルシューティング用のレポートとヘルプの入手先。" } - keywords={ en="about version log"; zh="关于 版本 日志"; ja="バージョン ログ" } } - let settingsLocation = { caption={ en="Location"; zh="位置"; ja="場所" } + description={ en="Troubleshooting report and where to get help."; zh="故障排查报告与获取帮助的途径。"; ja="トラブルシューティング用のレポートとヘルプの入手先。"; ar="تقرير استكشاف الأخطاء وإصلاحها ومكان الحصول على المساعدة." } + keywords={ en="about version log"; zh="关于 版本 日志"; ja="バージョン ログ"; ar="حول الإصدار السجل" } } + let settingsLocation = { caption={ en="Location"; zh="位置"; ja="場所"; ar="الموقع" } description=none - keywords={ en="folder path portable"; zh="文件夹 路径 便携"; ja="フォルダー パス ポータブル" } } - let settingsBackup = { caption={ en="Back up and restore"; zh="备份与恢复"; ja="バックアップと復元" } - description={ en="Export all settings to a file, or import them and restart."; zh="将所有设置导出为文件,或从文件导入并重新启动。"; ja="すべての設定をファイルにエクスポートするか、インポートして再起動します。" } - keywords={ en="export import"; zh="导出 导入"; ja="エクスポート インポート" } } - let settingsReset = { caption={ en="Reset to defaults"; zh="恢复默认设置"; ja="既定値に戻す" } - description={ en="Then restarts. App rules and workspaces can be kept."; zh="完成后重新启动,可保留应用规则和工作区。"; ja="その後再起動します。アプリのルールとワークスペースは残せます。" } - keywords={ en="factory"; zh="恢复默认 出厂"; ja="初期化" } } + keywords={ en="folder path portable"; zh="文件夹 路径 便携"; ja="フォルダー パス ポータブル"; ar="مجلد مسار محمول" } } + let settingsBackup = { caption={ en="Back up and restore"; zh="备份与恢复"; ja="バックアップと復元"; ar="النسخ الاحتياطي والاستعادة" } + description={ en="Export all settings to a file, or import them and restart."; zh="将所有设置导出为文件,或从文件导入并重新启动。"; ja="すべての設定をファイルにエクスポートするか、インポートして再起動します。"; ar="تصدير جميع الإعدادات إلى ملف، أو استيرادها ثم إعادة التشغيل." } + keywords={ en="export import"; zh="导出 导入"; ja="エクスポート インポート"; ar="تصدير استيراد" } } + let settingsReset = { caption={ en="Reset to defaults"; zh="恢复默认设置"; ja="既定値に戻す"; ar="إعادة التعيين إلى الإعدادات الافتراضية" } + description={ en="Then restarts. App rules and workspaces can be kept."; zh="完成后重新启动,可保留应用规则和工作区。"; ja="その後再起動します。アプリのルールとワークスペースは残せます。"; ar="ثم يعاد التشغيل. يمكن الاحتفاظ بقواعد التطبيقات ومساحات العمل." } + keywords={ en="factory"; zh="恢复默认 出厂"; ja="初期化"; ar="إعدادات المصنع" } } module General = - let settingsFile = { en="Settings file"; zh="设置文件"; ja="設定ファイル" } - let openFolder = { en="Open folder"; zh="打开文件夹"; ja="フォルダーを開く" } - let export = { en="Export…"; zh="导出…"; ja="エクスポート…" } - let import = { en="Import…"; zh="导入…"; ja="インポート…" } + let settingsFile = { en="Settings file"; zh="设置文件"; ja="設定ファイル"; ar="ملف الإعدادات" } + let openFolder = { en="Open folder"; zh="打开文件夹"; ja="フォルダーを開く"; ar="فتح المجلد" } + let export = { en="Export…"; zh="导出…"; ja="エクスポート…"; ar="تصدير…" } + let import = { en="Import…"; zh="导入…"; ja="インポート…"; ar="استيراد…" } let settingsFileHelp = { en="If the WindowTabs.exe folder has a settings file, WindowTabs uses it (portable mode); otherwise it uses the one in AppData. Older versions named it WindowTabsSettings.txt; it is now WindowTabsSettings.json, and an old .txt file is still read until the .json one exists." zh="如果 WindowTabs.exe 所在文件夹里有设置文件,WindowTabs 就使用它(便携模式);否则使用 AppData 中的。旧版本的设置文件名为 WindowTabsSettings.txt,现在改为 WindowTabsSettings.json;在 .json 文件生成之前,仍会读取旧的 .txt 文件。" - ja="WindowTabs.exe のフォルダーに設定ファイルがあれば、WindowTabs はそれを使います(ポータブル モード)。なければ AppData のものを使います。以前のバージョンでは WindowTabsSettings.txt という名前でしたが、現在は WindowTabsSettings.json です。.json ファイルができるまでは、古い .txt ファイルも読み込まれます。" } - let exported = { en="Settings exported."; zh="设置已导出。"; ja="設定をエクスポートしました。" } - let reset = { en="Reset…"; zh="重置…"; ja="リセット…" } - let resetConfirm = { en="Reset"; zh="重置"; ja="リセット" } - let resetTitle = { en="Reset settings"; zh="重置设置"; ja="設定のリセット" } + ja="WindowTabs.exe のフォルダーに設定ファイルがあれば、WindowTabs はそれを使います(ポータブル モード)。なければ AppData のものを使います。以前のバージョンでは WindowTabsSettings.txt という名前でしたが、現在は WindowTabsSettings.json です。.json ファイルができるまでは、古い .txt ファイルも読み込まれます。" + ar="إذا وُجد ملف إعدادات بجوار WindowTabs.exe فسيستخدمه البرنامج (الوضع المحمول)، وإلا فسيستخدم الملف الموجود في AppData. كان اسمه في الإصدارات القديمة WindowTabsSettings.txt، وأصبح الآن WindowTabsSettings.json، وسيظل ملف .txt القديم يُقرأ حتى إنشاء ملف .json." } + let exported = { en="Settings exported."; zh="设置已导出。"; ja="設定をエクスポートしました。"; ar="تم تصدير الإعدادات." } + let reset = { en="Reset…"; zh="重置…"; ja="リセット…"; ar="إعادة تعيين…" } + let resetConfirm = { en="Reset"; zh="重置"; ja="リセット"; ar="إعادة تعيين" } + let resetTitle = { en="Reset settings"; zh="重置设置"; ja="設定のリセット"; ar="إعادة تعيين الإعدادات" } let resetMessage = { en="Restore every setting to its default and restart WindowTabs? The current settings are saved first, so you can import them back." zh="将所有设置恢复为默认值并重新启动 WindowTabs?当前设置会先保存下来,之后可以再导入。" - ja="すべての設定を既定値に戻して WindowTabs を再起動しますか?現在の設定は先に保存されるので、後でインポートして戻せます。" } - let resetAlsoClear = { en="Also clear:"; zh="同时清除:"; ja="次も消去する:"} + ja="すべての設定を既定値に戻して WindowTabs を再起動しますか?現在の設定は先に保存されるので、後でインポートして戻せます。" + ar="هل تريد استعادة جميع الإعدادات الافتراضية وإعادة تشغيل WindowTabs؟ سيتم حفظ الإعدادات الحالية أولًا، حتى تتمكن من استيرادها مرة أخرى." } + let resetAlsoClear = { en="Also clear:"; zh="同时清除:"; ja="次も消去する:"; ar="مسح أيضًا:"} let resetRestarting path = { en=sprintf "Settings were reset. WindowTabs will now restart.\n\nYour previous settings were saved to:\n%s" path zh=sprintf "设置已重置。WindowTabs 将重新启动。\n\n原来的设置已保存到:\n%s" path - ja=sprintf "設定をリセットしました。WindowTabs を再起動します。\n\n以前の設定の保存先:\n%s" path } - let importTitle = { en="Import settings"; zh="导入设置"; ja="設定のインポート" } - let notSettingsFile = { en="This file does not contain WindowTabs settings."; zh="此文件不包含 WindowTabs 设置。"; ja="このファイルには WindowTabs の設定が含まれていません。" } + ja=sprintf "設定をリセットしました。WindowTabs を再起動します。\n\n以前の設定の保存先:\n%s" path + ar=sprintf "تمت إعادة تعيين الإعدادات. سيُعاد تشغيل WindowTabs الآن.\n\nتم حفظ الإعدادات السابقة في:\n%s" path } + let importTitle = { en="Import settings"; zh="导入设置"; ja="設定のインポート"; ar="استيراد الإعدادات" } + let notSettingsFile = { en="This file does not contain WindowTabs settings."; zh="此文件不包含 WindowTabs 设置。"; ja="このファイルには WindowTabs の設定が含まれていません。"; ar="لا يحتوي هذا الملف على إعدادات WindowTabs." } let importedRestarting path = { en=sprintf "Settings imported. WindowTabs will now restart to apply them.\n\nYour previous settings were saved to:\n%s" path zh=sprintf "设置已导入。WindowTabs 将重新启动以应用这些设置。\n\n原来的设置已保存到:\n%s" path - ja=sprintf "設定をインポートしました。適用するために WindowTabs を再起動します。\n\n以前の設定の保存先:\n%s" path } - let tabMenuHint = { en="Change it for one group from the tab menu."; zh="可在标签菜单中为单个分组修改。"; ja="タブメニューでグループごとに変更できます。" } - let startup = { en="Startup"; zh="启动"; ja="起動" } - let tabBehavior = { en="Tab behavior"; zh="标签行为"; ja="タブの動作" } - let taskbar = { en="Taskbar"; zh="任务栏"; ja="タスクバー" } - let windowSwitcher = { en="Window switcher"; zh="窗口切换器"; ja="ウィンドウ切り替え" } + ja=sprintf "設定をインポートしました。適用するために WindowTabs を再起動します。\n\n以前の設定の保存先:\n%s" path + ar=sprintf "تم استيراد الإعدادات. سيُعاد تشغيل WindowTabs لتطبيقها.\n\nتم حفظ الإعدادات السابقة في:\n%s" path } + let tabMenuHint = { en="Change it for one group from the tab menu."; zh="可在标签菜单中为单个分组修改。"; ja="タブメニューでグループごとに変更できます。"; ar="غيّره لمجموعة واحدة من قائمة علامة التبويب." } + let startup = { en="Startup"; zh="启动"; ja="起動"; ar="بدء التشغيل" } + let tabBehavior = { en="Tab behavior"; zh="标签行为"; ja="タブの動作"; ar="سلوك علامات التبويب" } + let taskbar = { en="Taskbar"; zh="任务栏"; ja="タスクバー"; ar="شريط المهام" } + let windowSwitcher = { en="Window switcher"; zh="窗口切换器"; ja="ウィンドウ切り替え"; ar="مبدّل النوافذ" } module Appearance = - let system = { en="System"; zh="跟随系统"; ja="システム" } - let light = { en="Light"; zh="浅色"; ja="ライト" } - let dark = { en="Dark"; zh="深色"; ja="ダーク" } - let explorerPreview = { en="File Explorer theme preview"; zh="文件资源管理器主题预览"; ja="エクスプローラーのテーマのプレビュー" } - let tabColors = { en="Tab colors"; zh="标签配色"; ja="タブの色" } - let colorPreset = { en="Color preset"; zh="配色预设"; ja="配色プリセット" } - let custom = { en="Custom"; zh="自定义"; ja="カスタム" } + let system = { en="System"; zh="跟随系统"; ja="システム"; ar="النظام" } + let light = { en="Light"; zh="浅色"; ja="ライト"; ar="فاتح" } + let dark = { en="Dark"; zh="深色"; ja="ダーク"; ar="داكن" } + let explorerPreview = { en="File Explorer theme preview"; zh="文件资源管理器主题预览"; ja="エクスプローラーのテーマのプレビュー"; ar="معاينة سمة مستكشف الملفات" } + let tabColors = { en="Tab colors"; zh="标签配色"; ja="タブの色"; ar="ألوان علامات التبويب" } + let colorPreset = { en="Color preset"; zh="配色预设"; ja="配色プリセット"; ar="مجموعة ألوان جاهزة" } + let custom = { en="Custom"; zh="自定义"; ja="カスタム"; ar="مخصص" } /// Switcher styles: large icons in a row, or window titles in a column. - let switcherHorizontal = { en="Horizontal"; zh="横向"; ja="横" } - let switcherVertical = { en="Vertical"; zh="纵向"; ja="縦" } + let switcherHorizontal = { en="Horizontal"; zh="横向"; ja="横"; ar="أفقي" } + let switcherVertical = { en="Vertical"; zh="纵向"; ja="縦"; ar="رأسي" } /// Tab styles, in TabStyle.names order. let tabStyles = - [| { en="Joined"; zh="连贯"; ja="連結" } - { en="Folder"; zh="文件夹"; ja="フォルダー型" } - { en="Floating"; zh="悬浮"; ja="フローティング" } |] + [| { en="Joined"; zh="连贯"; ja="連結"; ar="متصل" } + { en="Folder"; zh="文件夹"; ja="フォルダー型"; ar="مجلد" } + { en="Floating"; zh="悬浮"; ja="フローティング"; ar="عائم" } |] /// The tab colours on which the text is shown darker or lighter than chosen. /// Samples of the tab text as chosen and as shown, side by side. - let textBefore = { en="Before"; zh="调整前"; ja="調整前" } - let textAfter = { en="After"; zh="调整后"; ja="調整後" } + let textBefore = { en="Before"; zh="调整前"; ja="調整前"; ar="قبل" } + let textAfter = { en="After"; zh="调整后"; ja="調整後"; ar="بعد" } let colorsByCoding = { en="Set automatically while Tab color coding is By window or By app with Fill." zh="标签着色为“按窗口”或“按应用”且选择“填充”时,这里自动配置。" - ja="タブの色分けが「ウィンドウ別」または「アプリ別」で「塗りつぶし」のときは、ここは自動で設定されます。" } - let textAdjusted = { en="Text color is adjusted on some tabs to stay readable."; zh="部分标签上的文字颜色已调整,以保持清晰。"; ja="一部のタブでは、読みやすさのため文字の色を調整しています。" } + ja="タブの色分けが「ウィンドウ別」または「アプリ別」で「塗りつぶし」のときは、ここは自動で設定されます。" + ar="يُضبط تلقائيًا عندما يكون ترميز الألوان حسب النافذة أو التطبيق مع خيار التعبئة." } + let textAdjusted = { en="Text color is adjusted on some tabs to stay readable."; zh="部分标签上的文字颜色已调整,以保持清晰。"; ja="一部のタブでは、読みやすさのため文字の色を調整しています。"; ar="يُعدّل لون النص في بعض علامات التبويب ليظل مقروءًا." } /// A colour preset whose colours the user has changed. - let editedPreset name = { en=sprintf "%s*" name; zh=sprintf "%s*" name; ja=sprintf "%s*" name } - let resetColors = { en="Reset colors"; zh="重置配色"; ja="配色をリセット" } - let tabLayout = { en="Tab layout"; zh="标签布局"; ja="タブのレイアウト" } - let resetTabLayout = { en="Reset tab layout"; zh="重置标签布局"; ja="タブのレイアウトをリセット" } + let editedPreset name = { en=sprintf "%s*" name; zh=sprintf "%s*" name; ja=sprintf "%s*" name; ar=sprintf "%s*" name } + let resetColors = { en="Reset colors"; zh="重置配色"; ja="配色をリセット"; ar="إعادة تعيين الألوان" } + let tabLayout = { en="Tab layout"; zh="标签布局"; ja="タブのレイアウト"; ar="تخطيط علامات التبويب" } + let resetTabLayout = { en="Reset tab layout"; zh="重置标签布局"; ja="タブのレイアウトをリセット"; ar="إعادة تعيين تخطيط علامات التبويب" } /// Stable source order; ThemePresets arranges the displayed colour families. let presets = - [| { en="Default"; zh="默认"; ja="既定" } + [| { en="Default"; zh="默认"; ja="既定"; ar="افتراضي" } Settings.tabColorNames.[1] Settings.tabColorNames.[4] - { en="Slate"; zh="石板灰"; ja="スレート" } + { en="Slate"; zh="石板灰"; ja="スレート"; ar="رمادي أردوازي" } Settings.tabColorNames.[14] - { en="Sand"; zh="沙色"; ja="サンド" } - { en="Amber"; zh="琥珀橙"; ja="アンバー" } + { en="Sand"; zh="沙色"; ja="サンド"; ar="رملي" } + { en="Amber"; zh="琥珀橙"; ja="アンバー"; ar="كهرماني" } Settings.tabColorNames.[11] Settings.tabColorNames.[6] |] let quickColorNames = [| - { en="Black"; zh="黑色"; ja="黒" } - { en="White"; zh="白色"; ja="白" } - { en="Gray"; zh="灰色"; ja="グレー" } - { en="Red"; zh="红色"; ja="赤" } - { en="Orange"; zh="橙色"; ja="オレンジ" } - { en="Yellow"; zh="黄色"; ja="黄" } - { en="Green"; zh="绿色"; ja="緑" } - { en="Blue"; zh="蓝色"; ja="青" } |] + { en="Black"; zh="黑色"; ja="黒"; ar="أسود" } + { en="White"; zh="白色"; ja="白"; ar="أبيض" } + { en="Gray"; zh="灰色"; ja="グレー"; ar="رمادي" } + { en="Red"; zh="红色"; ja="赤"; ar="أحمر" } + { en="Orange"; zh="橙色"; ja="オレンジ"; ar="برتقالي" } + { en="Yellow"; zh="黄色"; ja="黄"; ar="أصفر" } + { en="Green"; zh="绿色"; ja="緑"; ar="أخضر" } + { en="Blue"; zh="蓝色"; ja="青"; ar="أزرق" } |] let pickerHelp = { en="Color picker: arrow keys adjust saturation and brightness; Shift + arrow keys adjust hue" zh="颜色选择器:方向键调整饱和度和亮度;Shift + 方向键调整色相" - ja="色の選択:方向キーで彩度と明るさを調整し、Shift + 方向キーで色相を調整します" } - let chooseColor = { en="Choose color"; zh="选择颜色"; ja="色を選択" } - let decrease = { en="Decrease"; zh="减小"; ja="減らす" } - let increase = { en="Increase"; zh="增大"; ja="増やす" } + ja="色の選択:方向キーで彩度と明るさを調整し、Shift + 方向キーで色相を調整します" + ar="منتقي الألوان: تعدّل مفاتيح الأسهم التشبع والسطوع؛ وتعدّل الأسهم مع Shift درجة اللون" } + let chooseColor = { en="Choose color"; zh="选择颜色"; ja="色を選択"; ar="اختيار اللون" } + let decrease = { en="Decrease"; zh="减小"; ja="減らす"; ar="تقليل" } + let increase = { en="Increase"; zh="增大"; ja="増やす"; ar="زيادة" } module Shortcuts = - let keyboard = { en="Keyboard"; zh="键盘"; ja="キーボード" } - let mouse = { en="Mouse"; zh="鼠标"; ja="マウス" } + let keyboard = { en="Keyboard"; zh="键盘"; ja="キーボード"; ar="لوحة المفاتيح" } + let mouse = { en="Mouse"; zh="鼠标"; ja="マウス"; ar="الفأرة" } let keyboardNote = { en="Click a shortcut, then press the new combination. Esc cancels." zh="点击快捷键后按下新的组合键。按 Esc 取消。" - ja="ショートカットをクリックして、新しいキーの組み合わせを押します。Esc でキャンセルします。" } - let restoreDefaults = { en="Restore default shortcuts"; zh="恢复默认快捷键"; ja="既定のショートカットに戻す" } - let inUse = { en="Shortcut already in use"; zh="快捷键已被占用"; ja="ショートカットは使用中です" } - let usedBy name = { en=sprintf "Used by %s" name; zh=sprintf "已用于“%s”" name; ja=sprintf "「%s」で使用中" name } + ja="ショートカットをクリックして、新しいキーの組み合わせを押します。Esc でキャンセルします。" + ar="انقر فوق اختصار ثم اضغط مجموعة المفاتيح الجديدة. يلغي Esc العملية." } + let restoreDefaults = { en="Restore default shortcuts"; zh="恢复默认快捷键"; ja="既定のショートカットに戻す"; ar="استعادة الاختصارات الافتراضية" } + let inUse = { en="Shortcut already in use"; zh="快捷键已被占用"; ja="ショートカットは使用中です"; ar="الاختصار مستخدم بالفعل" } + let usedBy name = { en=sprintf "Used by %s" name; zh=sprintf "已用于“%s”" name; ja=sprintf "「%s」で使用中" name; ar=sprintf "يستخدمه «%s»" name } // Shortcut field messages are kept short to fit. - let alreadySet = { en="Already set"; zh="已是当前快捷键"; ja="設定済み" } - let includeCtrlOrAlt = { en="Include Ctrl or Alt"; zh="需要包含 Ctrl 或 Alt"; ja="Ctrl か Alt が必要です" } - let pressShortcut = { en="Press a shortcut…"; zh="按下组合键…"; ja="キーを押してください…" } - let notSet = { en="Not set"; zh="未设置"; ja="未設定" } + let alreadySet = { en="Already set"; zh="已是当前快捷键"; ja="設定済み"; ar="تم تعيينه بالفعل" } + let includeCtrlOrAlt = { en="Include Ctrl or Alt"; zh="需要包含 Ctrl 或 Alt"; ja="Ctrl か Alt が必要です"; ar="يجب أن يتضمن Ctrl أو Alt" } + let pressShortcut = { en="Press a shortcut…"; zh="按下组合键…"; ja="キーを押してください…"; ar="اضغط اختصارًا…" } + let notSet = { en="Not set"; zh="未设置"; ja="未設定"; ar="غير معيّن" } /// The tab search box. module TabSearch = - let prompt = { en="Type a title or app name to switch windows"; zh="输入标题或应用名,切换窗口"; ja="タイトルやアプリ名を入力してウィンドウを切り替え" } - let noMatches = { en="No matching windows."; zh="没有匹配的窗口。"; ja="一致するウィンドウはありません。" } + let prompt = { en="Type a title or app name to switch windows"; zh="输入标题或应用名,切换窗口"; ja="タイトルやアプリ名を入力してウィンドウを切り替え"; ar="اكتب عنوانًا أو اسم تطبيق للتبديل بين النوافذ" } + let noMatches = { en="No matching windows."; zh="没有匹配的窗口。"; ja="一致するウィンドウはありません。"; ar="لا توجد نوافذ مطابقة." } /// Beside a window on another virtual desktop that has no name of its own. - let desktop number = { en=sprintf "Desktop %d" number; zh=sprintf "桌面 %d" number; ja=sprintf "デスクトップ %d" number } - let otherDesktop = { en="Another desktop"; zh="其他桌面"; ja="別のデスクトップ" } - let groupTabs count = { en=sprintf "This group · %d" count; zh=sprintf "当前分组 · %d" count; ja=sprintf "このグループ · %d" count } - let allTabs count = { en=sprintf "All windows · %d" count; zh=sprintf "全局窗口 · %d" count; ja=sprintf "すべてのウィンドウ · %d" count } + let desktop number = { en=sprintf "Desktop %d" number; zh=sprintf "桌面 %d" number; ja=sprintf "デスクトップ %d" number; ar=sprintf "سطح المكتب %d" number } + let otherDesktop = { en="Another desktop"; zh="其他桌面"; ja="別のデスクトップ"; ar="سطح مكتب آخر" } + let groupTabs count = { en=sprintf "This group · %d" count; zh=sprintf "当前分组 · %d" count; ja=sprintf "このグループ · %d" count; ar=sprintf "هذه المجموعة · %d" count } + let allTabs count = { en=sprintf "All windows · %d" count; zh=sprintf "全局窗口 · %d" count; ja=sprintf "すべてのウィンドウ · %d" count; ar=sprintf "كل النوافذ · %d" count } module AppRules = - let addApplication = { en="Add application"; zh="添加应用"; ja="アプリを追加" } - let deleteRule = { en="Delete"; zh="删除"; ja="削除" } - let applicationRuleExists = { en="This application already has a grouping rule."; zh="这个应用已有分组规则,请编辑已有行。"; ja="このアプリには既にグループ化ルールがあります。既存の行を編集してください。" } + let addApplication = { en="Add application"; zh="添加应用"; ja="アプリを追加"; ar="إضافة تطبيق" } + let deleteRule = { en="Delete"; zh="删除"; ja="削除"; ar="حذف" } + let applicationRuleExists = { en="This application already has a grouping rule."; zh="这个应用已有分组规则,请编辑已有行。"; ja="このアプリには既にグループ化ルールがあります。既存の行を編集してください。"; ar="لدى هذا التطبيق قاعدة تجميع بالفعل." } /// Several apps sharing one named group, as opposed to each app's windows grouping by themselves. - let groupingRules = { en="Groups across apps"; zh="跨应用分组"; ja="アプリをまたぐグループ" } - let applications = { en="Applications"; zh="应用"; ja="アプリ" } - let addGroup = { en="Add group"; zh="添加组"; ja="グループを追加" } + let groupingRules = { en="Groups across apps"; zh="跨应用分组"; ja="アプリをまたぐグループ"; ar="مجموعات تضم تطبيقات مختلفة" } + let applications = { en="Applications"; zh="应用"; ja="アプリ"; ar="التطبيقات" } + let addGroup = { en="Add group"; zh="添加组"; ja="グループを追加"; ar="إضافة مجموعة" } /// Shown while Groups across apps is empty. let noGroups = { en="Add a group to put several apps together, or drag tabs onto each other: the groups show here" zh="点“添加组”把多个应用放在一起,或拖拽标签合并窗口,分组会显示在这里" - ja="「グループを追加」で複数のアプリをまとめるか、タブをドラッグして重ねると、ここに表示されます" } + ja="「グループを追加」で複数のアプリをまとめるか、タブをドラッグして重ねると、ここに表示されます" + ar="أضف مجموعة لضم عدة تطبيقات معًا، أو اسحب علامات التبويب فوق بعضها؛ ستظهر المجموعات هنا" } /// The name a new group starts with. - let newGroup number = { en=sprintf "Group %d" number; zh=sprintf "组 %d" number; ja=sprintf "グループ %d" number } - let selectRule = { en="Select a group or rule to edit here. Changes save automatically."; zh="选中组或规则即可在此编辑,修改会自动保存。"; ja="グループかルールを選択して編集します。変更は自動保存されます。" } - let newRule = { en="New rule"; zh="新规则"; ja="新しいルール" } - let groupNameRequired = { en="Enter a group name."; zh="请填写组名。"; ja="グループ名を入力してください。" } - let groupNameExists = { en="A group with this name already exists."; zh="已有同名组,请使用其他名称。"; ja="同じ名前のグループが存在します。" } + let newGroup number = { en=sprintf "Group %d" number; zh=sprintf "组 %d" number; ja=sprintf "グループ %d" number; ar=sprintf "المجموعة %d" number } + let selectRule = { en="Select a group or rule to edit here. Changes save automatically."; zh="选中组或规则即可在此编辑,修改会自动保存。"; ja="グループかルールを選択して編集します。変更は自動保存されます。"; ar="حدد مجموعة أو قاعدة لتحريرها هنا. تُحفظ التغييرات تلقائيًا." } + let newRule = { en="New rule"; zh="新规则"; ja="新しいルール"; ar="قاعدة جديدة" } + let groupNameRequired = { en="Enter a group name."; zh="请填写组名。"; ja="グループ名を入力してください。"; ar="أدخل اسم المجموعة." } + let groupNameExists = { en="A group with this name already exists."; zh="已有同名组,请使用其他名称。"; ja="同じ名前のグループが存在します。"; ar="توجد مجموعة بهذا الاسم بالفعل." } let groupRulesHelp = { en="Put windows of different apps into one named group. Apps added here always have tabs, leave the list above and don't use Auto-group. Windows you group by dragging tabs together show here too." zh="把不同应用的窗口放进同一个命名组。加入这里的应用会始终启用标签,不再出现在上面的列表里,也不再使用“自动分组”。拖拽标签合并形成的窗口分组也会显示在这里。" - ja="異なるアプリのウィンドウを名前付きの一つのグループにまとめます。ここに追加したアプリは常にタブを使い、上の一覧からは外れ、「自動グループ化」も使われません。タブをドラッグしてまとめたウィンドウのグループもここに表示されます。" } - let application = { en="Application"; zh="应用"; ja="アプリ" } - let chooseApplication = { en="Add an app"; zh="添加应用"; ja="アプリを追加" } + ja="異なるアプリのウィンドウを名前付きの一つのグループにまとめます。ここに追加したアプリは常にタブを使い、上の一覧からは外れ、「自動グループ化」も使われません。タブをドラッグしてまとめたウィンドウのグループもここに表示されます。" + ar="ضع نوافذ تطبيقات مختلفة في مجموعة واحدة ذات اسم. التطبيقات المضافة هنا تستخدم علامات التبويب دائمًا، وتُزال من القائمة أعلاه ولا تستخدم التجميع التلقائي. كما تظهر هنا النوافذ التي تجمعها بسحب علامات التبويب فوق بعضها." } + let application = { en="Application"; zh="应用"; ja="アプリ"; ar="التطبيق" } + let chooseApplication = { en="Add an app"; zh="添加应用"; ja="アプリを追加"; ar="إضافة تطبيق" } /// Hover tips on a group's buttons. - let ungroup = { en="Ungroup"; zh="解除分组"; ja="グループを解除" } - let removeFromGroup = { en="Remove from group"; zh="从分组中移除"; ja="グループから外す" } - let browseApplication = { en="Browse…"; zh="浏览…"; ja="参照…" } - let applicationFiles = { en="Applications (*.exe)|*.exe"; zh="应用程序 (*.exe)|*.exe"; ja="アプリ (*.exe)|*.exe" } - let applicationOnly = { en="Application only"; zh="仅按应用"; ja="アプリのみ" } - let targetGroup = { en="Target group"; zh="目标组"; ja="宛先グループ" } - let chooseGroup = { en="Existing group"; zh="选择已有组"; ja="既存のグループ" } - let enabled = { en="Enabled"; zh="启用"; ja="有効" } - let addRule = { en="Add rule"; zh="添加规则"; ja="ルールを追加" } - let invalidRule = { en="Invalid grouping rule"; zh="分组规则无效"; ja="無効なグループ化ルール" } - let requiredFields = { en="Choose an application and enter a target group."; zh="请选择应用并填写目标组。"; ja="アプリを選択して宛先グループを入力してください。" } - let requiredTitle = { en="Enter a title pattern, or choose Application only."; zh="请填写标题条件,或选择“仅按应用”。"; ja="タイトル条件を入力するか「アプリのみ」を選択してください。" } + let ungroup = { en="Ungroup"; zh="解除分组"; ja="グループを解除"; ar="إلغاء التجميع" } + let removeFromGroup = { en="Remove from group"; zh="从分组中移除"; ja="グループから外す"; ar="إزالة من المجموعة" } + let browseApplication = { en="Browse…"; zh="浏览…"; ja="参照…"; ar="استعراض…" } + let applicationFiles = { en="Applications (*.exe)|*.exe"; zh="应用程序 (*.exe)|*.exe"; ja="アプリ (*.exe)|*.exe"; ar="التطبيقات (*.exe)|*.exe" } + let applicationOnly = { en="Application only"; zh="仅按应用"; ja="アプリのみ"; ar="التطبيق فقط" } + let targetGroup = { en="Target group"; zh="目标组"; ja="宛先グループ"; ar="المجموعة المستهدفة" } + let chooseGroup = { en="Existing group"; zh="选择已有组"; ja="既存のグループ"; ar="مجموعة موجودة" } + let enabled = { en="Enabled"; zh="启用"; ja="有効"; ar="ممكّن" } + let addRule = { en="Add rule"; zh="添加规则"; ja="ルールを追加"; ar="إضافة قاعدة" } + let invalidRule = { en="Invalid grouping rule"; zh="分组规则无效"; ja="無効なグループ化ルール"; ar="قاعدة التجميع غير صالحة" } + let requiredFields = { en="Choose an application and enter a target group."; zh="请选择应用并填写目标组。"; ja="アプリを選択して宛先グループを入力してください。"; ar="اختر تطبيقًا وأدخل المجموعة المستهدفة." } + let requiredTitle = { en="Enter a title pattern, or choose Application only."; zh="请填写标题条件,或选择“仅按应用”。"; ja="タイトル条件を入力するか「アプリのみ」を選択してください。"; ar="أدخل نمطًا للعنوان أو اختر «التطبيق فقط»." } let description = { en="Choose which apps get tabs. Auto-group puts the windows of an app into one group. Expand an app to see its windows." zh="选择哪些应用使用标签。勾选“自动分组”后,同一应用的窗口会合在一个组里。展开应用可查看它的窗口。" - ja="タブを使うアプリを選びます。「自動グループ化」をオンにすると、同じアプリのウィンドウが一つのグループに入ります。展開するとウィンドウを表示します。" } - let tabs = { en="Tabs"; zh="标签"; ja="タブ" } + ja="タブを使うアプリを選びます。「自動グループ化」をオンにすると、同じアプリのウィンドウが一つのグループに入ります。展開するとウィンドウを表示します。" + ar="اختر التطبيقات التي تستخدم علامات التبويب. يجمع التجميع التلقائي نوافذ التطبيق الواحد في مجموعة واحدة. وسّع التطبيق لرؤية نوافذه." } + let tabs = { en="Tabs"; zh="标签"; ja="タブ"; ar="علامات التبويب" } /// Each app's windows join one group of their own; named as in the tab menu. - let autoGroup = { en="Auto-group"; zh="自动分组"; ja="自動グループ化" } + let autoGroup = { en="Auto-group"; zh="自动分组"; ja="自動グループ化"; ar="التجميع التلقائي" } /// ApplicationFrameHost.exe, which hosts every Store (UWP) app: Settings, Calculator, Photos. - let windowsApps = { en="Windows apps"; zh="Windows 应用"; ja="Windows アプリ" } + let windowsApps = { en="Windows apps"; zh="Windows 应用"; ja="Windows アプリ"; ar="تطبيقات Windows" } /// Said on hover over the icon of a group made by dragging tabs together, shown read-only /// after the named groups. - let handMadeGroups = { en="Windows grouped by dragging"; zh="拖拽形成的窗口分组"; ja="ドラッグでまとめたウィンドウのグループ" } - let scanning = { en="Scanning…"; zh="正在扫描…"; ja="スキャン中…" } - let scanFailed details = { en="Scan failed: " + details; zh="扫描失败:" + details; ja="スキャンに失敗しました: " + details } + let handMadeGroups = { en="Windows grouped by dragging"; zh="拖拽形成的窗口分组"; ja="ドラッグでまとめたウィンドウのグループ"; ar="النوافذ المجمّعة بالسحب" } + let scanning = { en="Scanning…"; zh="正在扫描…"; ja="スキャン中…"; ar="جارٍ الفحص…" } + let scanFailed details = { en="Scan failed: " + details; zh="扫描失败:" + details; ja="スキャンに失敗しました: " + details; ar="فشل الفحص: " + details } module Workspaces = - let description = { en="Save and restore window groups and positions."; zh="保存和恢复窗口分组与位置。"; ja="ウィンドウのグループと位置を保存・復元します。" } + let description = { en="Save and restore window groups and positions."; zh="保存和恢复窗口分组与位置。"; ja="ウィンドウのグループと位置を保存・復元します。"; ar="حفظ مجموعات النوافذ ومواضعها واستعادتها." } let help = { en="How to use\n1 Group and position your windows, then click Save layout.\n2 Select a workspace and click Restore selected.\n3 To change an item's name or window title matching, double-click it, or point at it and click its edit button.\nA window whose title has changed since it was saved is still matched by its app.\nRestore uses open windows. If an app is not running, the result offers to launch it." zh="使用说明\n1 将窗口分组并调整位置,然后点击“保存布局”。\n2 选中工作区,点击“恢复所选”。\n3 双击任意项,或将鼠标移到该项上点击编辑按钮,可修改名称或窗口标题的匹配方式。\n保存后标题发生变化的窗口,仍会按其所属应用匹配。\n恢复使用已打开的窗口;应用未运行时,可在结果中启动它。" - ja="使い方\n1 ウィンドウをグループ化して配置し、「配置を保存」をクリックします。\n2 ワークスペースを選び、「選択したものを復元」をクリックします。\n3 項目をダブルクリックするか、項目にポインターを合わせて編集ボタンをクリックすると、名前やタイトルの一致方法を変更できます。\n保存後にタイトルが変わったウィンドウも、アプリで照合されます。\n復元は開いているウィンドウを使います。アプリが起動していない場合は、結果から起動できます。" } + ja="使い方\n1 ウィンドウをグループ化して配置し、「配置を保存」をクリックします。\n2 ワークスペースを選び、「選択したものを復元」をクリックします。\n3 項目をダブルクリックするか、項目にポインターを合わせて編集ボタンをクリックすると、名前やタイトルの一致方法を変更できます。\n保存後にタイトルが変わったウィンドウも、アプリで照合されます。\n復元は開いているウィンドウを使います。アプリが起動していない場合は、結果から起動できます。" + ar="طريقة الاستخدام\n١ جمّع النوافذ واضبط مواضعها، ثم انقر «حفظ التخطيط».\n٢ حدد مساحة عمل وانقر «استعادة المحدد».\n٣ لتغيير اسم عنصر أو طريقة مطابقة عنوان نافذة، انقر عليه مرتين أو أشر إليه ثم انقر زر التحرير.\nتظل النافذة التي تغير عنوانها منذ الحفظ مطابقةً باستخدام التطبيق الخاص بها.\nتستخدم الاستعادة النوافذ المفتوحة. إذا لم يكن التطبيق قيد التشغيل، فستتيح لك النتيجة تشغيله." } /// Saving makes a new workspace of the windows as they are; restoring acts on the selected one. - let saveCurrent = { en="Save layout"; zh="保存布局"; ja="配置を保存" } - let restoreSelected = { en="Restore selected"; zh="恢复所选"; ja="選択したものを復元" } - let editTitle name = { en=sprintf "Edit %s" name; zh=sprintf "编辑 %s" name; ja=sprintf "%s を編集" name } - let matchMethod = { en="Match method"; zh="匹配方式"; ja="一致方法" } - let exactMatch = { en="Exact match"; zh="完全匹配"; ja="完全一致" } - let startsWith = { en="Starts with"; zh="开头匹配"; ja="前方一致" } - let endsWith = { en="Ends with"; zh="结尾匹配"; ja="後方一致" } - let contains = { en="Contains"; zh="包含"; ja="部分一致" } - let regularExpression = { en="Regular expression"; zh="正则表达式"; ja="正規表現" } - let restoreTitle = { en="Workspace restore"; zh="恢复工作区"; ja="ワークスペースの復元" } + let saveCurrent = { en="Save layout"; zh="保存布局"; ja="配置を保存"; ar="حفظ التخطيط" } + let restoreSelected = { en="Restore selected"; zh="恢复所选"; ja="選択したものを復元"; ar="استعادة المحدد" } + let editTitle name = { en=sprintf "Edit %s" name; zh=sprintf "编辑 %s" name; ja=sprintf "%s を編集" name; ar=sprintf "تحرير %s" name } + let matchMethod = { en="Match method"; zh="匹配方式"; ja="一致方法"; ar="طريقة المطابقة" } + let exactMatch = { en="Exact match"; zh="完全匹配"; ja="完全一致"; ar="مطابقة تامة" } + let startsWith = { en="Starts with"; zh="开头匹配"; ja="前方一致"; ar="يبدأ بـ" } + let endsWith = { en="Ends with"; zh="结尾匹配"; ja="後方一致"; ar="ينتهي بـ" } + let contains = { en="Contains"; zh="包含"; ja="部分一致"; ar="يحتوي على" } + let regularExpression = { en="Regular expression"; zh="正则表达式"; ja="正規表現"; ar="تعبير نمطي" } + let restoreTitle = { en="Workspace restore"; zh="恢复工作区"; ja="ワークスペースの復元"; ar="استعادة مساحة العمل" } /// The result counts windows in three states, each with its mark. - let restoredState = { en="Restored"; zh="已恢复"; ja="復元済み" } - let notFoundState = { en="Not found"; zh="未找到"; ja="見つからない" } - let failedState = { en="Failed"; zh="失败"; ja="失敗" } + let restoredState = { en="Restored"; zh="已恢复"; ja="復元済み"; ar="تمت الاستعادة" } + let notFoundState = { en="Not found"; zh="未找到"; ja="見つからない"; ar="لم يتم العثور عليه" } + let failedState = { en="Failed"; zh="失败"; ja="失敗"; ar="فشل" } /// Windows are matched by app when their title changed, so one not found is closed. - let notFoundHint = { en="These windows are closed, or their app is not running."; zh="这些窗口已关闭,或其应用未运行。"; ja="これらのウィンドウは閉じられているか、アプリが起動していません。" } + let notFoundHint = { en="These windows are closed, or their app is not running."; zh="这些窗口已关闭,或其应用未运行。"; ja="これらのウィンドウは閉じられているか、アプリが起動していません。"; ar="هذه النوافذ مغلقة أو أن التطبيق الخاص بها لا يعمل." } let launchApps count = { en=(if count=1 then "Launch the app and retry" else sprintf "Launch %d apps and retry" count) zh=sprintf "启动 %d 个应用并重试" count - ja=sprintf "%d 個のアプリを起動して再試行" count } + ja=sprintf "%d 個のアプリを起動して再試行" count + ar=(if count=1 then "تشغيل التطبيق وإعادة المحاولة" else sprintf "تشغيل التطبيقات (%d) وإعادة المحاولة" count) } let launchingApps count = { en=(if count=1 then "Launching the app…" else sprintf "Launching %d apps…" count) zh=sprintf "正在启动 %d 个应用…" count - ja=sprintf "%d 個のアプリを起動中…" count } - let invalidSetting = { en="Invalid workspace setting"; zh="工作区设置无效"; ja="ワークスペースの設定が無効です" } - let dataWarnings = { en="Workspace data"; zh="工作区数据"; ja="ワークスペースのデータ" } - let titleInvalid = { en="Window title is missing or exceeds 4,096 characters."; zh="窗口标题缺失或超过 4,096 个字符。"; ja="ウィンドウのタイトルがないか、4,096 文字を超えています。" } - let unknownMatchMethod = { en="Unknown title match method."; zh="未知的标题匹配方式。"; ja="タイトルの一致方法が不明です。" } - let expectedObject = { en="Expected an object."; zh="应为对象。"; ja="オブジェクトが必要です。" } - let expectedList = { en=": expected a list."; zh=":应为列表。"; ja=":リストが必要です。" } - let missingPlacement = { en="Missing placement."; zh="缺少窗口位置。"; ja="ウィンドウの配置がありません。" } - let invalidTabLayout = { en="Invalid saved tab layout; the group will use current defaults."; zh="保存的标签布局无效;该分组将使用当前默认设置。"; ja="保存されたタブ配置が無効です。グループには現在の既定値を使用します。" } - let noValidWindows = { en="No valid windows in this group."; zh="此分组中没有有效窗口。"; ja="このグループに有効なウィンドウがありません。" } + ja=sprintf "%d 個のアプリを起動中…" count + ar=(if count=1 then "جارٍ تشغيل التطبيق…" else sprintf "جارٍ تشغيل التطبيقات (%d)…" count) } + let invalidSetting = { en="Invalid workspace setting"; zh="工作区设置无效"; ja="ワークスペースの設定が無効です"; ar="إعداد مساحة العمل غير صالح" } + let dataWarnings = { en="Workspace data"; zh="工作区数据"; ja="ワークスペースのデータ"; ar="بيانات مساحة العمل" } + let titleInvalid = { en="Window title is missing or exceeds 4,096 characters."; zh="窗口标题缺失或超过 4,096 个字符。"; ja="ウィンドウのタイトルがないか、4,096 文字を超えています。"; ar="عنوان النافذة مفقود أو يتجاوز 4096 حرفًا." } + let unknownMatchMethod = { en="Unknown title match method."; zh="未知的标题匹配方式。"; ja="タイトルの一致方法が不明です。"; ar="طريقة مطابقة العنوان غير معروفة." } + let expectedObject = { en="Expected an object."; zh="应为对象。"; ja="オブジェクトが必要です。"; ar="كان متوقعًا وجود كائن." } + let expectedList = { en=": expected a list."; zh=":应为列表。"; ja=":リストが必要です。"; ar=": كان متوقعًا وجود قائمة." } + let missingPlacement = { en="Missing placement."; zh="缺少窗口位置。"; ja="ウィンドウの配置がありません。"; ar="موضع النافذة مفقود." } + let invalidTabLayout = { en="Invalid saved tab layout; the group will use current defaults."; zh="保存的标签布局无效;该分组将使用当前默认设置。"; ja="保存されたタブ配置が無効です。グループには現在の既定値を使用します。"; ar="تخطيط علامات التبويب المحفوظ غير صالح؛ ستستخدم المجموعة الإعدادات الافتراضية الحالية." } + let noValidWindows = { en="No valid windows in this group."; zh="此分组中没有有效窗口。"; ja="このグループに有効なウィンドウがありません。"; ar="لا توجد نوافذ صالحة في هذه المجموعة." } let unsupportedVersion = { en="Unsupported workspace version; saved workspaces will not be modified." zh="不支持此工作区版本;已保存的工作区不会被修改。" - ja="このワークスペースのバージョンには対応していません。保存済みのワークスペースは変更されません。" } + ja="このワークスペースのバージョンには対応していません。保存済みのワークスペースは変更されません。" + ar="إصدار مساحة العمل غير مدعوم؛ لن يتم تعديل مساحات العمل المحفوظة." } module Diagnostics = let description = { en="Safe to share: no window titles, file paths or other personal information." zh="可放心分享:不含窗口标题、文件路径等任何个人信息。" - ja="安心して共有できます:ウィンドウのタイトルやファイルのパスなどの個人情報は含まれません。" } - let copyReport = { en="Copy the report, to paste into an issue"; zh="复制报告,以便粘贴到问题报告中"; ja="レポートをコピー(問題の報告に貼り付け)" } + ja="安心して共有できます:ウィンドウのタイトルやファイルのパスなどの個人情報は含まれません。" + ar="آمن للمشاركة: لا يحتوي على عناوين النوافذ أو مسارات الملفات أو معلومات شخصية أخرى." } + let copyReport = { en="Copy the report, to paste into an issue"; zh="复制报告,以便粘贴到问题报告中"; ja="レポートをコピー(問題の報告に貼り付け)"; ar="نسخ التقرير للصقه في بلاغ مشكلة" } let includeWindowsHelp = { en="Include window details: each window's program, class and whether it gets tabs. Never titles." zh="包含窗口详情:每个窗口的程序、窗口类,以及是否会加上标签。不含标题。" - ja="ウィンドウの詳細を含める:各ウィンドウのプログラム、クラス、タブが付くかどうか。タイトルは含みません。" } - let refreshReport = { en="Refresh the report"; zh="刷新报告"; ja="レポートを更新" } - let reportCopied = { en="Report copied."; zh="报告已复制。"; ja="レポートをコピーしました。" } - let reportRefreshed = { en="Report refreshed."; zh="报告已刷新。"; ja="レポートを更新しました。" } - let reportTitle = { en="Troubleshooting report"; zh="故障排查报告"; ja="トラブルシューティング レポート" } - let projectPage = { en="Project page"; zh="项目主页"; ja="プロジェクトページ" } - let reportIssue = { en="Report an issue"; zh="报告问题"; ja="問題を報告" } - let releases = { en="Check Releases"; zh="查看发布版本"; ja="リリースを確認" } - let releasesHint = { en="Check Releases ↗"; zh="查看发布版本 ↗"; ja="リリースを確認 ↗" } - let openCrashLog = { en="Crash log"; zh="崩溃日志"; ja="クラッシュログ" } + ja="ウィンドウの詳細を含める:各ウィンドウのプログラム、クラス、タブが付くかどうか。タイトルは含みません。" + ar="تضمين تفاصيل النوافذ: برنامج كل نافذة وفئتها وما إذا كانت تستخدم علامات تبويب. لا يتضمن العناوين أبدًا." } + let refreshReport = { en="Refresh the report"; zh="刷新报告"; ja="レポートを更新"; ar="تحديث التقرير" } + let reportCopied = { en="Report copied."; zh="报告已复制。"; ja="レポートをコピーしました。"; ar="تم نسخ التقرير." } + let reportRefreshed = { en="Report refreshed."; zh="报告已刷新。"; ja="レポートを更新しました。"; ar="تم تحديث التقرير." } + let reportTitle = { en="Troubleshooting report"; zh="故障排查报告"; ja="トラブルシューティング レポート"; ar="تقرير استكشاف الأخطاء وإصلاحها" } + let projectPage = { en="Project page"; zh="项目主页"; ja="プロジェクトページ"; ar="صفحة المشروع" } + let reportIssue = { en="Report an issue"; zh="报告问题"; ja="問題を報告"; ar="الإبلاغ عن مشكلة" } + let releases = { en="Check Releases"; zh="查看发布版本"; ja="リリースを確認"; ar="التحقق من الإصدارات" } + let releasesHint = { en="Check Releases ↗"; zh="查看发布版本 ↗"; ja="リリースを確認 ↗"; ar="التحقق من الإصدارات ↗" } + let openCrashLog = { en="Crash log"; zh="崩溃日志"; ja="クラッシュログ"; ar="سجل الأعطال" } diff --git a/tests/Reliability.fsx b/tests/Reliability.fsx index e6d9608a..4f9036c9 100644 --- a/tests/Reliability.fsx +++ b/tests/Reliability.fsx @@ -443,7 +443,7 @@ let main() = let fileIcon = Win32Helper.GetFileIcon(unicodeExe) check (AppIcons.HasOwnIcon unicodeExe && not (AppIcons.IsGenericIcon fileIcon)) "File icon lost for a non-ASCII path" WinUserApi.DestroyIcon(fileIcon) |> ignore - for code,expected in ["en","Close";"zh","关闭";"ja","閉じる"] do + for code,expected in ["en","Close";"zh","关闭";"ja","閉じる";"ar","إغلاق"] do Localization.setPreference code check (tr Strings.TabMenu.close=expected) ("Language override ignored: "+code) Localization.setPreference "fr" @@ -458,6 +458,7 @@ let main() = check partial.IsEmpty ("Settings text with a missing translation: " + String.concat " | " partial) check (SettingsCatalog.all |> List.forall(fun item -> item.text.caption.en<>"")) "Setting without a caption" check (SettingsCatalog.all |> List.exists(fun item -> SettingsCatalog.matches "テーマ" item)) "Settings search ignores Japanese" + check (SettingsCatalog.all |> List.exists(fun item -> SettingsCatalog.matches "السمة" item)) "Settings search ignores Arabic" let found query = SettingsCatalog.all |> List.filter (SettingsCatalog.matches query) |> List.map(fun item -> item.id) for query in ["autostart";"自启动";"スタートアップ";"runAtStartup"] do check (List.contains "launch-at-sign-in" (found query)) ("Search keyword missed: "+query) diff --git a/tests/SettingsEditors.fsx b/tests/SettingsEditors.fsx index ab66441e..9ac8296a 100644 --- a/tests/SettingsEditors.fsx +++ b/tests/SettingsEditors.fsx @@ -134,7 +134,7 @@ let main() = assertTrue (SettingsCatalog.searchEvidence "runatstartup" startup = ["runAtStartup"]) "A settings-file key match is not shown" assertTrue (SettingsCatalog.searchEvidence "system" startup = [tr startup.text.description]) "A short description match is not shown whole" let margin = SettingsCatalog.find "tabIndentNormal" - let longDescription = {en="Distance from the window edges. Centered tabs use it only once they fill the row.";zh="";ja=""} + let longDescription = {en="Distance from the window edges. Centered tabs use it only once they fill the row.";zh="";ja="";ar=""} let margin = {margin with text={margin.text with description=longDescription}} match SettingsCatalog.searchEvidence "row" margin with | [part] -> assertTrue (part.StartsWith("…") && part.EndsWith("they fill the row.") && part.Length Date: Thu, 22 Oct 2026 20:04:52 +0800 Subject: [PATCH 09/10] Keep Arabic text in reading order Arabic text is drawn inside a right-to-left embedding, so a sentence that contains a Latin word or ends with a full stop reads in the right order in labels, menus and custom-drawn controls. The layout is not mirrored. File dialog filters and saved group names use the text without direction marks. --- .../ManagerViewService/Views/AppGroupingRulesView.fs | 4 ++-- WtProgram/Shared/Localization.fs | 9 ++++++++- WtProgram/TabStripDecorator.fs | 2 +- tests/Reliability.fsx | 5 ++++- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/WtProgram/ManagerViewService/Views/AppGroupingRulesView.fs b/WtProgram/ManagerViewService/Views/AppGroupingRulesView.fs index 34fb8afd..1cbbb083 100644 --- a/WtProgram/ManagerViewService/Views/AppGroupingRulesView.fs +++ b/WtProgram/ManagerViewService/Views/AppGroupingRulesView.fs @@ -160,7 +160,7 @@ type GroupingApplicationMenu() as this = if index>=0 && index Option.map(fun window -> @@ -449,7 +449,7 @@ type AppGroupingRulesView() as this = tree.Focus() |> ignore) addGroup.Click.Add(fun _ -> // Short and numbered from the start: Group 1, Group 2, the first number not taken. - let named number = tr (Strings.AppRules.newGroup number) + let named number = Localization.plain (Strings.AppRules.newGroup number) let taken number = groups |> List.exists(fun group -> String.Equals(group.name,named number,StringComparison.OrdinalIgnoreCase)) let target = Seq.initInfinite ((+) 1) |> Seq.find(taken >> not) |> named let group : AppGroupingTarget = {id=Guid.NewGuid().ToString("N");name=target} diff --git a/WtProgram/Shared/Localization.fs b/WtProgram/Shared/Localization.fs index b30de462..f02ac45d 100644 --- a/WtProgram/Shared/Localization.fs +++ b/WtProgram/Shared/Localization.fs @@ -18,12 +18,19 @@ module Localization = let current() = let code = if preference="system" then CultureInfo.CurrentUICulture.TwoLetterISOLanguageName else preference if languages |> Array.exists (fun (c,_,_) -> c=code) then code else "en" - let tr (text:LocalizedText) = + /// The text in the current language as written, for values that are parsed or saved. + let plain (text:LocalizedText) = match current() with | "zh" -> text.zh | "ja" -> text.ja | "ar" -> text.ar | _ -> text.en + /// GDI and the standard controls read text left to right unless told otherwise, which puts the + /// words of an Arabic sentence around a Latin word, and its final full stop, in the wrong order. + /// A right-to-left embedding keeps each text in reading order without mirroring the layout. + let tr (text:LocalizedText) = + let value = plain text + if current()="ar" && value<>"" then "\u202B"+value+"\u202C" else value /// Every translation of a text, for search. let all (text:LocalizedText) = [text.en; text.zh; text.ja; text.ar] diff --git a/WtProgram/TabStripDecorator.fs b/WtProgram/TabStripDecorator.fs index 3ce47d9e..6deec3cf 100755 --- a/WtProgram/TabStripDecorator.fs +++ b/WtProgram/TabStripDecorator.fs @@ -333,7 +333,7 @@ type TabStripDecorator(group:WindowGroup) as this = image = None flags = List2() click = fun() -> - use dialog = new OpenFileDialog(Title=tr Strings.TabMenu.changeTaskbarIcon,Filter=tr Strings.TabMenu.taskbarIconFiles,CheckFileExists=true) + use dialog = new OpenFileDialog(Title=tr Strings.TabMenu.changeTaskbarIcon,Filter=Localization.plain Strings.TabMenu.taskbarIconFiles,CheckFileExists=true) let owner = {new IWin32Window with member _.Handle=group.hwnd} if dialog.ShowDialog(owner)=DialogResult.OK then Services.program.setGroupIcon(hwnd,Some dialog.FileName) }) diff --git a/tests/Reliability.fsx b/tests/Reliability.fsx index 4f9036c9..31e2d4ec 100644 --- a/tests/Reliability.fsx +++ b/tests/Reliability.fsx @@ -445,7 +445,10 @@ let main() = WinUserApi.DestroyIcon(fileIcon) |> ignore for code,expected in ["en","Close";"zh","关闭";"ja","閉じる";"ar","إغلاق"] do Localization.setPreference code - check (tr Strings.TabMenu.close=expected) ("Language override ignored: "+code) + check (Localization.plain Strings.TabMenu.close=expected) ("Language override ignored: "+code) + // Arabic is shown inside a right-to-left embedding; parsed and saved values stay unmarked. + check (tr Strings.TabMenu.close="\u202Bإغلاق\u202C") "Arabic text must read right to left" + check ((Localization.plain Strings.TabMenu.taskbarIconFiles).EndsWith("|*.*")) "File filter must not carry direction marks" Localization.setPreference "fr" check (tr Strings.TabMenu.close="Close") "Unsupported language must fall back to English" Localization.setPreference "system" From be45311600bde75527214a3c0302b716335cc920 Mon Sep 17 00:00:00 2001 From: leafOfTree Date: Thu, 22 Oct 2026 20:04:52 +0800 Subject: [PATCH 10/10] Make the Arabic wording more natural Use consistent terms for the window switcher and shortcuts, write descriptions as full sentences, and show Esc as an instruction instead of keeping English word order. --- WtProgram/Shared/Strings.fs | 62 ++++++++++++++++++------------------- 1 file changed, 31 insertions(+), 31 deletions(-) diff --git a/WtProgram/Shared/Strings.fs b/WtProgram/Shared/Strings.fs index a4505757..b5d5a7e7 100644 --- a/WtProgram/Shared/Strings.fs +++ b/WtProgram/Shared/Strings.fs @@ -19,7 +19,7 @@ module Strings = let left = { en="Left"; zh="左侧"; ja="左"; ar="يسار" } let top = { en="Top"; zh="靠上"; ja="上"; ar="أعلى" } let bottom = { en="Bottom"; zh="靠下"; ja="下"; ar="أسفل" } - let center = { en="Center"; zh="居中"; ja="中央"; ar="توسيط" } + let center = { en="Center"; zh="居中"; ja="中央"; ar="الوسط" } let right = { en="Right"; zh="右侧"; ja="右"; ar="يمين" } let never = { en="Never"; zh="从不"; ja="しない"; ar="أبدًا" } let whenMaximized = { en="When maximized"; zh="最大化时"; ja="最大化時"; ar="عند التكبير" } @@ -71,7 +71,7 @@ module Strings = zh="图标文件 (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|所有文件 (*.*)|*.*" ja="アイコン ファイル (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|すべてのファイル (*.*)|*.*" ar="ملفات الأيقونات (*.ico, *.png, *.jpg, *.bmp, *.gif, *.exe, *.dll)|*.ico;*.png;*.jpg;*.jpeg;*.bmp;*.gif;*.exe;*.dll|كل الملفات (*.*)|*.*" } - let numberShortcut = { en="Switch by number"; zh="数字键切换"; ja="番号で切り替え"; ar="التبديل باستخدام الرقم" } + let numberShortcut = { en="Switch by number"; zh="数字键切换"; ja="番号で切り替え"; ar="التبديل بالأرقام" } let enableTabs = { en="Enable tabs"; zh="启用标签"; ja="タブを有効にする"; ar="تمكين علامات التبويب" } let autoGroupWindows = { en="Auto-group windows"; zh="自动分组"; ja="ウィンドウを自動グループ化"; ar="تجميع النوافذ تلقائيًا" } let close = { en="Close"; zh="关闭"; ja="閉じる"; ar="إغلاق" } @@ -98,14 +98,14 @@ module Strings = let sidebar = { en="Sidebar"; zh="侧边栏"; ja="サイドバー"; ar="الشريط الجانبي" } let searchResults = { en="Search results"; zh="搜索结果"; ja="検索結果"; ar="نتائج البحث" } let noMatches = { en="No matching settings."; zh="没有找到匹配的设置。"; ja="一致する設定はありません。"; ar="لا توجد إعدادات مطابقة." } - let followWindows = { en="Follow Windows"; zh="跟随系统"; ja="Windows に従う"; ar="اتباع إعدادات Windows" } + let followWindows = { en="Follow Windows"; zh="跟随系统"; ja="Windows に従う"; ar="حسب Windows" } let howToUse = { en="How to use"; zh="使用说明"; ja="使い方"; ar="طريقة الاستخدام" } - let pageScroll = { en="Page scroll"; zh="页面滚动条"; ja="ページのスクロールバー"; ar="تمرير الصفحة" } + let pageScroll = { en="Page scroll"; zh="页面滚动条"; ja="ページのスクロールバー"; ar="شريط تمرير الصفحة" } module Pages = let general = { en="General"; zh="常规"; ja="全般"; ar="عام" } let appearance = { en="Appearance"; zh="外观"; ja="外観"; ar="المظهر" } - let shortcuts = { en="Shortcuts"; zh="快捷键"; ja="ショートカット"; ar="اختصارات" } + let shortcuts = { en="Shortcuts"; zh="快捷键"; ja="ショートカット"; ar="الاختصارات" } let appRules = { en="App rules"; zh="应用规则"; ja="アプリのルール"; ar="قواعد التطبيقات" } let workspaces = { en="Workspaces"; zh="工作区"; ja="ワークスペース"; ar="مساحات العمل" } let diagnostics = { en="Support"; zh="支持"; ja="サポート"; ar="الدعم" } @@ -127,7 +127,7 @@ module Strings = description={ en="System follows your Windows app mode."; zh="“跟随系统”与 Windows 的应用模式保持一致。"; ja="「システム」は Windows のアプリ モードに合わせます。"; ar="يتبع خيار النظام وضع التطبيقات في Windows." } keywords={ en="dark mode"; zh="暗色 深色模式"; ja="ダークモード"; ar="الوضع الداكن" } } let language = { caption={ en="Language"; zh="语言"; ja="言語"; ar="اللغة" } - description={ en="Follow Windows uses your Windows display language."; zh="“跟随系统”使用 Windows 的显示语言。"; ja="「Windows に従う」では Windows の表示言語を使います。"; ar="يستخدم خيار اتباع Windows لغة العرض المحددة في Windows." } + description={ en="Follow Windows uses your Windows display language."; zh="“跟随系统”使用 Windows 的显示语言。"; ja="「Windows に従う」では Windows の表示言語を使います。"; ar="يستخدم خيار «حسب Windows» لغة العرض في Windows." } keywords={ en="locale"; zh="界面语言"; ja="表示言語"; ar="الإعدادات المحلية" } } let launchAtSignIn = { caption={ en="Start with Windows"; zh="随 Windows 启动"; ja="Windows と同時に起動"; ar="التشغيل مع Windows" } description={ en="Runs in the system tray after you sign in."; zh="登录后在系统托盘中运行。"; ja="サインイン後にシステムトレイで実行します。"; ar="يعمل في منطقة الإعلام بعد تسجيل الدخول." } @@ -136,10 +136,10 @@ module Strings = description={ en="Only apps first discovered after this change. Existing apps keep their tab setting."; zh="只影响此后首次出现的应用。已有应用保留原来的标签设置。"; ja="変更後に初めて検出するアプリに適用します。既存のアプリのタブ設定は維持します。"; ar="ينطبق ذلك على التطبيقات التي يكتشفها البرنامج لأول مرة بعد هذا التغيير فقط. وتحتفظ التطبيقات الموجودة بإعداد علامات التبويب الحالي." } keywords={ en=""; zh=""; ja=""; ar="" } } let dimInactiveGroups = { caption={ en="Dim tabs in inactive groups"; zh="淡化非活动分组的标签"; ja="非アクティブなグループのタブの色を薄くする"; ar="تخفيف لون علامات التبويب في المجموعات غير النشطة" } - description={ en="Make the active group easier to spot."; zh="让当前活动的分组更容易辨认。"; ja="アクティブなグループを見分けやすくします。"; ar="لتسهيل تمييز المجموعة النشطة." } - keywords={ en="fade"; zh="变暗"; ja="薄く 暗く"; ar="تلاشي" } } + description={ en="Make the active group easier to spot."; zh="让当前活动的分组更容易辨认。"; ja="アクティブなグループを見分けやすくします。"; ar="يسهّل تمييز المجموعة النشطة." } + keywords={ en="fade"; zh="变暗"; ja="薄く 暗く"; ar="تعتيم" } } let autoHide = { caption={ en="Auto-hide tabs"; zh="自动隐藏标签"; ja="タブを自動的に隠す"; ar="إخفاء علامات التبويب تلقائيًا" } - description={ en="Show a thin strip until hover."; zh="只显示细栏,悬停展开。"; ja="細いバーだけ表示し、ホバーで展開します。"; ar="إظهار شريط رفيع حتى تمرير المؤشر فوقه." } + description={ en="Show a thin strip until hover."; zh="只显示细栏,悬停展开。"; ja="細いバーだけ表示し、ホバーで展開します。"; ar="يبقى شريط رفيع فقط حتى تمرّر المؤشر فوقه." } keywords={ en="collapse"; zh="收起"; ja="折りたたみ"; ar="طيّ" } } let showTabsOnSwitch = { caption={ en="Show tabs briefly after switching"; zh="切换后短暂显示标签"; ja="切り替え後にタブを一時的に表示"; ar="إظهار علامات التبويب لفترة وجيزة بعد التبديل" } description={ en="For about a second, so you can see where you are."; zh="显示约一秒,方便确认当前位置。"; ja="約 1 秒間表示して、今いる位置を確認できます。"; ar="لمدة ثانية تقريبًا لتتمكن من معرفة موضعك." } @@ -147,7 +147,7 @@ module Strings = let tabPosition = { caption={ en="Position tabs"; zh="放置标签"; ja="タブを配置"; ar="موضع علامات التبويب" } description=none keywords={ en="vertical horizontal sidebar left right"; zh="垂直 横向 侧栏 左 右"; ja="縦 横 サイドバー 左 右"; ar="رأسي أفقي شريط جانبي يسار يمين" } } - let tabColumnWidthHint = { en="For left/right tabs. Drag a column edge to resize one group, down to an icon rail."; zh="用于左/右标签。拖动侧栏边缘可单独调整分组宽度,最窄可只显示图标。"; ja="左・右のタブ用です。列の端をドラッグしてグループの幅を変更できます。最小幅ではアイコンのみを表示します。"; ar="للعلامات الجانبية اليمنى أو اليسرى. اسحب حافة العمود لتغيير عرض مجموعة واحدة، حتى يصبح شريطًا للأيقونات فقط." } + let tabColumnWidthHint = { en="For left/right tabs. Drag a column edge to resize one group, down to an icon rail."; zh="用于左/右标签。拖动侧栏边缘可单独调整分组宽度,最窄可只显示图标。"; ja="左・右のタブ用です。列の端をドラッグしてグループの幅を変更できます。最小幅ではアイコンのみを表示します。"; ar="لعلامات التبويب على اليسار أو اليمين. اسحب حافة العمود لتغيير عرض مجموعة واحدة، حتى لا يبقى منها إلا شريط أيقونات." } let tabColumnWidth = { caption={ en="Vertical tab width"; zh="垂直标签宽度"; ja="縦タブ幅"; ar="عرض علامات التبويب الرأسية" } description=none keywords={ en="vertical sidebar width size"; zh="垂直 侧栏 宽度 大小"; ja="縦 サイドバー 幅 サイズ"; ar="رأسي شريط جانبي عرض حجم" } } @@ -158,34 +158,34 @@ module Strings = description=none keywords={ en="merge"; zh="合并"; ja="結合"; ar="دمج" } } let replaceAltTab = { caption={ en="Use WindowTabs for Alt+Tab"; zh="使用 WindowTabs 窗口切换器"; ja="Alt+Tab に WindowTabs を使う"; ar="استخدام WindowTabs عند الضغط على Alt+Tab" } - description={ en="Replaces the Windows switcher."; zh="替换 Windows 自带的窗口切换器。"; ja="Windows 標準のウィンドウ切り替えを置き換えます。"; ar="يستبدل أداة التبديل بين النوافذ في Windows." } + description={ en="Replaces the Windows switcher."; zh="替换 Windows 自带的窗口切换器。"; ja="Windows 標準のウィンドウ切り替えを置き換えます。"; ar="يحل محل مبدّل النوافذ في Windows." } keywords={ en="task switcher"; zh="任务切换"; ja="タスク切り替え"; ar="مبدّل المهام" } } - let switcherStyle = { caption={ en="Switcher style"; zh="切换器样式"; ja="スイッチャーの表示"; ar="نمط أداة التبديل" } + let switcherStyle = { caption={ en="Switcher style"; zh="切换器样式"; ja="スイッチャーの表示"; ar="نمط المبدّل" } description={ en="Large icons in a row, or a list with full window titles."; zh="一排大图标,或显示完整窗口标题的列表。"; ja="大きなアイコンを横に並べるか、ウィンドウ タイトルを一覧で表示します。"; ar="أيقونات كبيرة في صف، أو قائمة تعرض عناوين النوافذ كاملة." } keywords={ en="layout"; zh="布局"; ja="レイアウト"; ar="التخطيط" } } let groupWindowsInSwitcher = { caption={ en="Group windows in Alt+Tab"; zh="在 Alt+Tab 中按分组显示"; ja="Alt+Tab でグループをまとめる"; ar="تجميع النوافذ في Alt+Tab" } description={ en="Each group appears as one item."; zh="每个分组只显示一项。"; ja="各グループを 1 項目として表示します。"; ar="تظهر كل مجموعة كعنصر واحد." } - keywords={ en="switcher"; zh="切换器"; ja="切り替え"; ar="أداة التبديل" } } + keywords={ en="switcher"; zh="切换器"; ja="切り替え"; ar="المبدّل" } } let nextTab = { caption={ en="Switch to next tab"; zh="切换到下一个标签"; ja="次のタブに切り替え"; ar="الانتقال إلى علامة التبويب التالية" } description=none keywords=hotkeyWords } let previousTab = { caption={ en="Switch to previous tab"; zh="切换到上一个标签"; ja="前のタブに切り替え"; ar="الانتقال إلى علامة التبويب السابقة" } description=none keywords=hotkeyWords } - let searchTabs = { caption={ en="Switch windows"; zh="切换窗口"; ja="ウィンドウを切り替え"; ar="تبديل النوافذ" } + let searchTabs = { caption={ en="Switch windows"; zh="切换窗口"; ja="ウィンドウを切り替え"; ar="التبديل بين النوافذ" } description={ en="Switch to a window by title or app name."; zh="按标题或应用名查找并切换窗口。"; ja="タイトルやアプリ名でウィンドウを探して切り替えます。"; ar="الانتقال إلى نافذة باستخدام عنوانها أو اسم التطبيق." } keywords={ en="find"; zh="查找"; ja="検索"; ar="بحث" } } let newTab = { caption={ en="New tab"; zh="新建标签"; ja="新しいタブ"; ar="علامة تبويب جديدة" } description={ en="Starts the current tab's app again." zh="再次启动当前标签的应用。" ja="現在のタブのアプリをもう一度起動します。" - ar="يشغّل التطبيق الخاص بعلامة التبويب الحالية مرة أخرى." } + ar="يشغّل نسخة جديدة من تطبيق علامة التبويب الحالية." } keywords={ en="new window"; zh="新建窗口"; ja="新しいウィンドウ"; ar="نافذة جديدة" } } let closeTab = { caption={ en="Close tab"; zh="关闭标签"; ja="タブを閉じる"; ar="إغلاق علامة التبويب" } description={ en="Closes the window of the tab in front." zh="关闭当前标签的窗口。" ja="前面のタブのウィンドウを閉じます。" - ar="يغلق النافذة الخاصة بعلامة التبويب الحالية." } + ar="يغلق نافذة علامة التبويب الأمامية." } keywords={ en="close window"; zh="关闭窗口"; ja="ウィンドウを閉じる"; ar="إغلاق النافذة" } } let switchTabsByNumber = { caption={ en="Switch tabs by number"; zh="按数字切换标签"; ja="番号でタブを切り替え"; ar="التبديل بين علامات التبويب باستخدام الأرقام" } description={ en="Hold a modifier key and press 1–9."; zh="按住修饰键再按 1–9。"; ja="修飾キーを押しながら 1~9 を押します。"; ar="اضغط باستمرار على مفتاح تعديل ثم اضغط على رقم من 1 إلى 9." } @@ -193,25 +193,25 @@ module Strings = let numberShortcut = { caption={ en="Modifier key for 1–9"; zh="数字键搭配的修饰键"; ja="1~9 と組み合わせるキー"; ar="مفتاح التعديل للأرقام من 1 إلى 9" } description=none keywords={ en="number"; zh="数字"; ja="番号"; ar="رقم" } } - let enableNumberLeader = { caption={ en="Switch tabs with a leader key"; zh="用引导键切换标签"; ja="リーダーキーでタブを切り替え"; ar="التبديل باستخدام مفتاح تمهيدي" }; description={ en="Press the leader, then a selection key. Esc cancels."; zh="先按引导键,再按选择键。Esc 取消。"; ja="リーダーキーの後、選択キーを押します。Esc で解除。"; ar="اضغط المفتاح التمهيدي ثم مفتاح الاختيار. يلغي Esc العملية." }; keywords=none } + let enableNumberLeader = { caption={ en="Switch tabs with a leader key"; zh="用引导键切换标签"; ja="リーダーキーでタブを切り替え"; ar="التبديل بين علامات التبويب بمفتاح تمهيدي" }; description={ en="Press the leader, then a selection key. Esc cancels."; zh="先按引导键,再按选择键。Esc 取消。"; ja="リーダーキーの後、選択キーを押します。Esc で解除。"; ar="اضغط المفتاح التمهيدي ثم مفتاح الاختيار. اضغط Esc للإلغاء." }; keywords=none } let leaderKeys = { caption={en="Selection keys";zh="选择键";ja="選択キー";ar="مفاتيح الاختيار"}; description={en="Use unique letters or digits, in tab order.";zh="按标签顺序,使用不重复的字母或数字。";ja="タブ順に、重複しない英字または数字を指定します。";ar="استخدم أحرفًا أو أرقامًا غير مكررة حسب ترتيب علامات التبويب."}; keywords={en="leader keys letters home row";zh="引导键 字母 主键区";ja="リーダーキー 英字 ホームポジション";ar="مفتاح تمهيدي أحرف الصف الأوسط"} } let leaderKeyPresets = [| {en="123456789";zh="123456789";ja="123456789";ar="123456789"}; {en="QWERTYUIOP";zh="QWERTYUIOP";ja="QWERTYUIOP";ar="QWERTYUIOP"}; {en="ASDFGHJKL;";zh="ASDFGHJKL;";ja="ASDFGHJKL;";ar="ASDFGHJKL;"} |] - let invalidLeaderKeys = {en="Use at least one unique letter, digit or unshifted punctuation key.";zh="请使用至少一个不重复的字母、数字或无需 Shift 的标点键。";ja="重複しない英字、数字、Shift 不要の記号を 1 つ以上指定してください。";ar="استخدم حرفًا أو رقمًا أو مفتاح ترقيم غير مكرر واحدًا على الأقل دون Shift."} + let invalidLeaderKeys = {en="Use at least one unique letter, digit or unshifted punctuation key.";zh="请使用至少一个不重复的字母、数字或无需 Shift 的标点键。";ja="重複しない英字、数字、Shift 不要の記号を 1 つ以上指定してください。";ar="استخدم حرفًا أو رقمًا أو علامة ترقيم واحدة على الأقل، غير مكررة ولا تحتاج إلى Shift."} let numberLeader = { caption={ en="Tab selection leader"; zh="标签选择引导键"; ja="タブ選択のリーダーキー"; ar="المفتاح التمهيدي لاختيار علامة التبويب" }; description=none; keywords=none } let tabColors = { en="Color"; zh="颜色"; ja="色"; ar="اللون" } let customTabColor = { en="Custom…"; zh="自定义…"; ja="カスタム…"; ar="مخصص…" } let clearTabColor = { en="Clear color"; zh="清除颜色"; ja="色を解除"; ar="مسح اللون" } - let rememberTabColor = { en="Remember color for current app"; zh="为当前应用记住颜色"; ja="現在のアプリの色を記憶"; ar="تذكّر لون التطبيق الحالي" } + let rememberTabColor = { en="Remember color for current app"; zh="为当前应用记住颜色"; ja="現在のアプリの色を記憶"; ar="تذكّر اللون للتطبيق الحالي" } let tabColorNames = [| { en="Grey";zh="灰色";ja="グレー";ar="رمادي" }; { en="Blue";zh="蓝色";ja="青";ar="أزرق" } { en="Red";zh="红色";ja="赤";ar="أحمر" }; { en="Yellow";zh="黄色";ja="黄";ar="أصفر" } { en="Green";zh="绿色";ja="緑";ar="أخضر" }; { en="Pink";zh="粉色";ja="ピンク";ar="وردي" } { en="Purple";zh="紫色";ja="紫";ar="أرجواني" }; { en="Cyan";zh="青色";ja="シアン";ar="سماوي" } - { en="Orange";zh="橙色";ja="オレンジ";ar="برتقالي" }; { en="Lavender";zh="薰衣草色";ja="ラベンダー";ar="لافندر" } + { en="Orange";zh="橙色";ja="オレンジ";ar="برتقالي" }; { en="Lavender";zh="薰衣草色";ja="ラベンダー";ar="خزامي" } { en="Olive";zh="橄榄色";ja="オリーブ";ar="زيتي" }; { en="Rose";zh="玫红色";ja="ローズ";ar="وردي داكن" } { en="Lime";zh="青柠色";ja="ライム";ar="ليموني" }; { en="Navy";zh="藏青色";ja="ネイビー";ar="كحلي" } { en="Teal";zh="蓝绿色";ja="ティール";ar="أزرق مخضر" }; { en="Coral";zh="珊瑚色";ja="コーラル";ar="مرجاني" } |] - let tabColorMode = { caption={ en="Tab color coding"; zh="标签着色"; ja="タブの色分け"; ar="ترميز علامات التبويب بالألوان" } + let tabColorMode = { caption={ en="Tab color coding"; zh="标签着色"; ja="タブの色分け"; ar="تلوين علامات التبويب" } description={ en="Auto-assign colors by window or app." zh="按窗口或应用自动分配颜色。" ja="ウィンドウ・アプリ別に色を自動で割り当てます。" @@ -224,7 +224,7 @@ module Strings = zh="可在标签菜单中为单个标签选色。它优先于这里的设置,关闭时也有效。" ja="タブメニューでタブごとに色を選べます。こちらの設定より優先され、オフでも表示されます。" ar="غيّر لون علامة تبويب واحدة من قائمتها. تكون الأولوية لهذا اللون ويظهر حتى عند إيقاف هذا الخيار." } - let tabColorStyle = { caption={ en="Show colors as"; zh="着色方式"; ja="色の付け方"; ar="عرض الألوان على شكل" } + let tabColorStyle = { caption={ en="Show colors as"; zh="着色方式"; ja="色の付け方"; ar="طريقة عرض الألوان" } description=none keywords={ en="stripe fill"; zh="色条 填充"; ja="ライン 塗りつぶし"; ar="شريط تعبئة" } } let stripe = { en="Stripe"; zh="色条"; ja="色のライン"; ar="شريط" } @@ -243,7 +243,7 @@ module Strings = description={ en="Works anywhere over a grouped window. Over the tab bar, Shift isn't needed." zh="在分组窗口的任意位置均可使用;在标签栏上滚动时无需按 Shift。" ja="グループ化されたウィンドウ上ならどこでも使えます。タブバー上では Shift は不要です。" - ar="يعمل في أي مكان فوق نافذة مجمّعة. لا تحتاج إلى Shift فوق شريط علامات التبويب." } + ar="يعمل في أي مكان فوق نافذة مجمّعة. وفوق شريط علامات التبويب لا حاجة إلى Shift." } keywords={ en="wheel"; zh="滚轮"; ja="ホイール"; ar="عجلة التمرير" } } let ctrlScroll = { caption={ en="Move tabs with Ctrl + scroll"; zh="用 Ctrl + 滚轮移动标签"; ja="Ctrl + スクロールでタブを移動"; ar="تحريك علامات التبويب باستخدام Ctrl والتمرير" } description={ en="Over the tab bar, moves the current tab left or right." @@ -251,7 +251,7 @@ module Strings = ja="タブバー上で、現在のタブを左右に移動します。" ar="فوق شريط علامات التبويب، ينقل علامة التبويب الحالية إلى اليسار أو اليمين." } keywords={ en="wheel reorder"; zh="滚轮 排序"; ja="ホイール 並べ替え"; ar="عجلة التمرير لإعادة الترتيب" } } - let middleClickClose = { caption={ en="Middle-click closes a tab"; zh="按下滚轮关闭标签"; ja="中クリックでタブを閉じる"; ar="النقر الأوسط يغلق علامة تبويب" } + let middleClickClose = { caption={ en="Middle-click closes a tab"; zh="按下滚轮关闭标签"; ja="中クリックでタブを閉じる"; ar="الإغلاق بالنقر الأوسط" } description={ en="Press the wheel on a tab to close its window." zh="在标签上按下滚轮,关闭它的窗口。" ja="タブ上でホイールを押すと、そのウィンドウを閉じます。" @@ -263,7 +263,7 @@ module Strings = let tabHighlightBgColor = { caption={ en="Hovered tab"; zh="悬停标签"; ja="ホバー中のタブ"; ar="علامة التبويب التي يشير إليها المؤشر" }; description=none; keywords=colorWords } let tabStyle = { caption={ en="Tab style"; zh="标签样式"; ja="タブのスタイル"; ar="نمط علامة التبويب" } description={ en="How the active tab stands out from the rest."; zh="活动标签以何种方式与其他标签区分。"; ja="アクティブなタブをほかのタブとどう見分けるかを選びます。"; ar="كيفية تمييز علامة التبويب النشطة عن البقية." } - keywords={ en="shape folder pill"; zh="形状 文件夹 胶囊"; ja="形 フォルダー ピル"; ar="الشكل مجلد كبسولة" } } + keywords={ en="shape folder pill"; zh="形状 文件夹 胶囊"; ja="形 フォルダー ピル"; ar="شكل مجلد كبسولة" } } let tabHeightHint = { en="Left/right tabs have a minimum height of 32 px."; zh="左/右标签的实际高度最低为 32px。"; ja="左・右のタブの最小高さは 32px です。"; ar="يبلغ الحد الأدنى لارتفاع علامات التبويب الجانبية 32 بكسل." } let tabHeight = { caption={ en="Tab height"; zh="标签高度"; ja="タブの高さ"; ar="ارتفاع علامة التبويب" }; description=none; keywords=sizeWords } let tabMaxWidth = { caption={ en="Maximum tab width"; zh="标签最大宽度"; ja="タブの最大幅"; ar="أقصى عرض لعلامة التبويب" }; description=none; keywords=sizeWords } @@ -292,7 +292,7 @@ module Strings = description={ en="Export all settings to a file, or import them and restart."; zh="将所有设置导出为文件,或从文件导入并重新启动。"; ja="すべての設定をファイルにエクスポートするか、インポートして再起動します。"; ar="تصدير جميع الإعدادات إلى ملف، أو استيرادها ثم إعادة التشغيل." } keywords={ en="export import"; zh="导出 导入"; ja="エクスポート インポート"; ar="تصدير استيراد" } } let settingsReset = { caption={ en="Reset to defaults"; zh="恢复默认设置"; ja="既定値に戻す"; ar="إعادة التعيين إلى الإعدادات الافتراضية" } - description={ en="Then restarts. App rules and workspaces can be kept."; zh="完成后重新启动,可保留应用规则和工作区。"; ja="その後再起動します。アプリのルールとワークスペースは残せます。"; ar="ثم يعاد التشغيل. يمكن الاحتفاظ بقواعد التطبيقات ومساحات العمل." } + description={ en="Then restarts. App rules and workspaces can be kept."; zh="完成后重新启动,可保留应用规则和工作区。"; ja="その後再起動します。アプリのルールとワークスペースは残せます。"; ar="ثم يُعاد تشغيل البرنامج. يمكن الاحتفاظ بقواعد التطبيقات ومساحات العمل." } keywords={ en="factory"; zh="恢复默认 出厂"; ja="初期化"; ar="إعدادات المصنع" } } module General = @@ -311,7 +311,7 @@ module Strings = let resetMessage = { en="Restore every setting to its default and restart WindowTabs? The current settings are saved first, so you can import them back." zh="将所有设置恢复为默认值并重新启动 WindowTabs?当前设置会先保存下来,之后可以再导入。" ja="すべての設定を既定値に戻して WindowTabs を再起動しますか?現在の設定は先に保存されるので、後でインポートして戻せます。" - ar="هل تريد استعادة جميع الإعدادات الافتراضية وإعادة تشغيل WindowTabs؟ سيتم حفظ الإعدادات الحالية أولًا، حتى تتمكن من استيرادها مرة أخرى." } + ar="هل تريد إعادة جميع الإعدادات إلى قيمها الافتراضية وإعادة تشغيل WindowTabs؟ ستُحفظ الإعدادات الحالية أولًا لتتمكن من استيرادها لاحقًا." } let resetAlsoClear = { en="Also clear:"; zh="同时清除:"; ja="次も消去する:"; ar="مسح أيضًا:"} let resetRestarting path = { en=sprintf "Settings were reset. WindowTabs will now restart.\n\nYour previous settings were saved to:\n%s" path @@ -354,7 +354,7 @@ module Strings = let colorsByCoding = { en="Set automatically while Tab color coding is By window or By app with Fill." zh="标签着色为“按窗口”或“按应用”且选择“填充”时,这里自动配置。" ja="タブの色分けが「ウィンドウ別」または「アプリ別」で「塗りつぶし」のときは、ここは自動で設定されます。" - ar="يُضبط تلقائيًا عندما يكون ترميز الألوان حسب النافذة أو التطبيق مع خيار التعبئة." } + ar="يُضبط تلقائيًا عندما يكون «تلوين علامات التبويب» على «حسب النافذة» أو «حسب التطبيق» مع «تعبئة»." } let textAdjusted = { en="Text color is adjusted on some tabs to stay readable."; zh="部分标签上的文字颜色已调整,以保持清晰。"; ja="一部のタブでは、読みやすさのため文字の色を調整しています。"; ar="يُعدّل لون النص في بعض علامات التبويب ليظل مقروءًا." } /// A colour preset whose colours the user has changed. let editedPreset name = { en=sprintf "%s*" name; zh=sprintf "%s*" name; ja=sprintf "%s*" name; ar=sprintf "%s*" name } @@ -395,12 +395,12 @@ module Strings = let keyboardNote = { en="Click a shortcut, then press the new combination. Esc cancels." zh="点击快捷键后按下新的组合键。按 Esc 取消。" ja="ショートカットをクリックして、新しいキーの組み合わせを押します。Esc でキャンセルします。" - ar="انقر فوق اختصار ثم اضغط مجموعة المفاتيح الجديدة. يلغي Esc العملية." } + ar="انقر اختصارًا ثم اضغط مجموعة المفاتيح الجديدة. اضغط Esc للإلغاء." } let restoreDefaults = { en="Restore default shortcuts"; zh="恢复默认快捷键"; ja="既定のショートカットに戻す"; ar="استعادة الاختصارات الافتراضية" } let inUse = { en="Shortcut already in use"; zh="快捷键已被占用"; ja="ショートカットは使用中です"; ar="الاختصار مستخدم بالفعل" } let usedBy name = { en=sprintf "Used by %s" name; zh=sprintf "已用于“%s”" name; ja=sprintf "「%s」で使用中" name; ar=sprintf "يستخدمه «%s»" name } // Shortcut field messages are kept short to fit. - let alreadySet = { en="Already set"; zh="已是当前快捷键"; ja="設定済み"; ar="تم تعيينه بالفعل" } + let alreadySet = { en="Already set"; zh="已是当前快捷键"; ja="設定済み"; ar="هذا هو الاختصار الحالي" } let includeCtrlOrAlt = { en="Include Ctrl or Alt"; zh="需要包含 Ctrl 或 Alt"; ja="Ctrl か Alt が必要です"; ar="يجب أن يتضمن Ctrl أو Alt" } let pressShortcut = { en="Press a shortcut…"; zh="按下组合键…"; ja="キーを押してください…"; ar="اضغط اختصارًا…" } let notSet = { en="Not set"; zh="未设置"; ja="未設定"; ar="غير معيّن" } @@ -487,7 +487,7 @@ module Strings = let restoreTitle = { en="Workspace restore"; zh="恢复工作区"; ja="ワークスペースの復元"; ar="استعادة مساحة العمل" } /// The result counts windows in three states, each with its mark. let restoredState = { en="Restored"; zh="已恢复"; ja="復元済み"; ar="تمت الاستعادة" } - let notFoundState = { en="Not found"; zh="未找到"; ja="見つからない"; ar="لم يتم العثور عليه" } + let notFoundState = { en="Not found"; zh="未找到"; ja="見つからない"; ar="غير موجود" } let failedState = { en="Failed"; zh="失败"; ja="失敗"; ar="فشل" } /// Windows are matched by app when their title changed, so one not found is closed. let notFoundHint = { en="These windows are closed, or their app is not running."; zh="这些窗口已关闭,或其应用未运行。"; ja="これらのウィンドウは閉じられているか、アプリが起動していません。"; ar="هذه النوافذ مغلقة أو أن التطبيق الخاص بها لا يعمل." }