|
1 | 1 | using System; |
| 2 | +using System.Collections.Generic; |
2 | 3 | using System.ComponentModel; |
3 | 4 | using System.Diagnostics; |
4 | 5 | using System.Globalization; |
| 6 | +using System.Linq; |
5 | 7 | using System.Runtime.InteropServices; |
6 | 8 | using System.Windows; |
7 | 9 | using System.Windows.Interop; |
| 10 | +using System.Windows.Markup; |
8 | 11 | using System.Windows.Media; |
9 | 12 | using Flow.Launcher.Infrastructure.UserSettings; |
10 | 13 | using Microsoft.Win32; |
|
14 | 17 | using Windows.Win32.UI.Input.KeyboardAndMouse; |
15 | 18 | using Windows.Win32.UI.WindowsAndMessaging; |
16 | 19 | using Point = System.Windows.Point; |
| 20 | +using SystemFonts = System.Windows.SystemFonts; |
17 | 21 |
|
18 | 22 | namespace Flow.Launcher.Infrastructure |
19 | 23 | { |
@@ -595,5 +599,73 @@ public static void OpenImeSettings() |
595 | 599 | } |
596 | 600 |
|
597 | 601 | #endregion |
| 602 | + |
| 603 | + #region System Font |
| 604 | + |
| 605 | + private static readonly Dictionary<string, string> _languageToNotoSans = new() |
| 606 | + { |
| 607 | + { "ko", "Noto Sans KR" }, |
| 608 | + { "ja", "Noto Sans JP" }, |
| 609 | + { "zh-CN", "Noto Sans SC" }, |
| 610 | + { "zh-SG", "Noto Sans SC" }, |
| 611 | + { "zh-Hans", "Noto Sans SC" }, |
| 612 | + { "zh-TW", "Noto Sans TC" }, |
| 613 | + { "zh-HK", "Noto Sans TC" }, |
| 614 | + { "zh-MO", "Noto Sans TC" }, |
| 615 | + { "zh-Hant", "Noto Sans TC" }, |
| 616 | + { "th", "Noto Sans Thai" }, |
| 617 | + { "ar", "Noto Sans Arabic" }, |
| 618 | + { "he", "Noto Sans Hebrew" }, |
| 619 | + { "hi", "Noto Sans Devanagari" }, |
| 620 | + { "bn", "Noto Sans Bengali" }, |
| 621 | + { "ta", "Noto Sans Tamil" }, |
| 622 | + { "el", "Noto Sans Greek" }, |
| 623 | + { "ru", "Noto Sans" }, |
| 624 | + { "en", "Noto Sans" }, |
| 625 | + { "fr", "Noto Sans" }, |
| 626 | + { "de", "Noto Sans" }, |
| 627 | + { "es", "Noto Sans" }, |
| 628 | + { "pt", "Noto Sans" } |
| 629 | + }; |
| 630 | + |
| 631 | + public static string GetSystemDefaultFont() |
| 632 | + { |
| 633 | + try |
| 634 | + { |
| 635 | + var culture = CultureInfo.CurrentCulture; |
| 636 | + var language = culture.Name; // e.g., "zh-TW" |
| 637 | + var langPrefix = language.Split('-')[0]; // e.g., "zh" |
| 638 | + |
| 639 | + // First, try to find by full name, and if not found, fallback to prefix |
| 640 | + if (TryGetNotoFont(language, out var notoFont) || TryGetNotoFont(langPrefix, out notoFont)) |
| 641 | + { |
| 642 | + // If the font is installed, return it |
| 643 | + if (Fonts.SystemFontFamilies.Any(f => f.Source.Equals(notoFont))) |
| 644 | + { |
| 645 | + return notoFont; |
| 646 | + } |
| 647 | + } |
| 648 | + |
| 649 | + // If Noto font is not found, fallback to the system default font |
| 650 | + var font = SystemFonts.MessageFontFamily; |
| 651 | + if (font.FamilyNames.TryGetValue(XmlLanguage.GetLanguage("en-US"), out var englishName)) |
| 652 | + { |
| 653 | + return englishName; |
| 654 | + } |
| 655 | + |
| 656 | + return font.Source ?? "Segoe UI"; |
| 657 | + } |
| 658 | + catch |
| 659 | + { |
| 660 | + return "Segoe UI"; |
| 661 | + } |
| 662 | + } |
| 663 | + |
| 664 | + private static bool TryGetNotoFont(string langKey, out string notoFont) |
| 665 | + { |
| 666 | + return _languageToNotoSans.TryGetValue(langKey, out notoFont); |
| 667 | + } |
| 668 | + |
| 669 | + #endregion |
598 | 670 | } |
599 | 671 | } |
0 commit comments