From 3abd05f6b3a687e73fc9e6ab0f09ec2af2f6c06a Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 18 Nov 2023 14:58:16 +0800 Subject: [PATCH 01/75] Implement double pinyin --- .../DoublePinAlphabet.cs | 193 ++++++++++++++++++ .../UserSettings/Settings.cs | 2 + 2 files changed, 195 insertions(+) create mode 100644 Flow.Launcher.Infrastructure/DoublePinAlphabet.cs diff --git a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs new file mode 100644 index 000000000..607582097 --- /dev/null +++ b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs @@ -0,0 +1,193 @@ +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using System.Diagnostics.CodeAnalysis; +using System.Linq; +using System.Text; +using Flow.Launcher.Infrastructure.UserSettings; +using ToolGood.Words.Pinyin; + +namespace Flow.Launcher.Infrastructure +{ + public class DoublePinAlphabet : IAlphabet + { + private ConcurrentDictionary _doublePinCache = + new ConcurrentDictionary(); + + private Settings _settings; + + public void Initialize([NotNull] Settings settings) + { + _settings = settings ?? throw new ArgumentNullException(nameof(settings)); + } + + public bool CanBeTranslated(string stringToTranslate) + { + return WordsHelper.HasChinese(stringToTranslate); + } + + public (string translation, TranslationMapping map) Translate(string content) + { + if (_settings.ShouldUseDoublePin) + { + if (!_doublePinCache.ContainsKey(content)) + { + return BuildCacheFromContent(content); + } + else + { + return _doublePinCache[content]; + } + } + return (content, null); + } + + private (string translation, TranslationMapping map) BuildCacheFromContent(string content) + { + if (WordsHelper.HasChinese(content)) + { + var resultList = WordsHelper.GetPinyinList(content).Select(ToDoublePin).ToArray(); + StringBuilder resultBuilder = new StringBuilder(); + TranslationMapping map = new TranslationMapping(); + + bool pre = false; + + for (int i = 0; i < resultList.Length; i++) + { + if (content[i] >= 0x3400 && content[i] <= 0x9FD5) + { + map.AddNewIndex(i, resultBuilder.Length, resultList[i].Length + 1); + resultBuilder.Append(' '); + resultBuilder.Append(resultList[i]); + pre = true; + } + else + { + if (pre) + { + pre = false; + resultBuilder.Append(' '); + } + + resultBuilder.Append(resultList[i]); + } + } + + map.endConstruct(); + + var key = resultBuilder.ToString(); + map.setKey(key); + + return _doublePinCache[content] = (key, map); + } + else + { + return (content, null); + } + } + + private static readonly ReadOnlyDictionary special = new(new Dictionary(){ + {"a", "aa"}, + {"ai", "ai"}, + {"an", "an"}, + {"ang", "ah"}, + {"ao", "ao"}, + {"e", "ee"}, + {"ei", "ei"}, + {"en", "en"}, + {"er", "er"}, + {"o", "oo"}, + {"ou", "ou"} + }); + + + private static readonly ReadOnlyDictionary first = new(new Dictionary(){ + {"ch", "i"}, + {"sh", "u"}, + {"zh", "v"} + }); + + + private static readonly ReadOnlyDictionary second = new(new Dictionary() + { + {"ua", "x"}, + {"ei", "w"}, + {"e", "e"}, + {"ou", "z"}, + {"iu", "q"}, + {"ve", "t"}, + {"ue", "t"}, + {"u", "u"}, + {"i", "i"}, + {"o", "o"}, + {"uo", "o"}, + {"ie", "p"}, + {"a", "a"}, + {"ong", "s"}, + {"iong", "s"}, + {"ai", "d"}, + {"ing", "k"}, + {"uai", "k"}, + {"ang", "h"}, + {"uan", "r"}, + {"an", "j"}, + {"en", "f"}, + {"ia", "x"}, + {"iang", "l"}, + {"uang", "l"}, + {"eng", "g"}, + {"in", "b"}, + {"ao", "c"}, + {"v", "v"}, + {"ui", "v"}, + {"un", "y"}, + {"iao", "n"}, + {"ian", "m"} + }); + + private static string ToDoublePin(string fullPinyin) + { + // Assuming s is valid + StringBuilder doublePin = new StringBuilder(); + + if (fullPinyin.Length <= 3 && (fullPinyin[0] == 'a' || fullPinyin[0] == 'e' || fullPinyin[0] == 'o')) + { + if (special.ContainsKey(fullPinyin)) + { + return special[fullPinyin]; + } + } + + // zh, ch, sh + if (fullPinyin.Length >= 2 && first.ContainsKey(fullPinyin[..2])) + { + doublePin.Append(first[fullPinyin[..2]]); + + if (second.TryGetValue(fullPinyin[2..], out string tmp)) + { + doublePin.Append(tmp); + } + else + { + doublePin.Append(fullPinyin[2..]); + } + } + else + { + doublePin.Append(fullPinyin[0]); + + if (second.TryGetValue(fullPinyin[1..], out string tmp)) + { + doublePin.Append(tmp); + } + else + { + doublePin.Append(fullPinyin[1..]); + } + } + + return doublePin.ToString(); + } + } +} diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 458846665..8d94cdba5 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -185,6 +185,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings /// when false Alphabet static service will always return empty results /// public bool ShouldUsePinyin { get; set; } = false; + + public bool ShouldUseDoublePin { get; set; } = false; public bool AlwaysPreview { get; set; } = false; public bool AlwaysStartEn { get; set; } = false; From fb6635344b8e5ecae06aadd31a3b112471b48ae2 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 18 Nov 2023 14:58:23 +0800 Subject: [PATCH 02/75] Test double pinyin --- Flow.Launcher/App.xaml.cs | 2 +- Flow.Launcher/PublicAPIInstance.cs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index 765a1a559..d74ea62fb 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -30,7 +30,7 @@ namespace Flow.Launcher private SettingWindowViewModel _settingsVM; private readonly Updater _updater = new Updater(Flow.Launcher.Properties.Settings.Default.GithubRepo); private readonly Portable _portable = new Portable(); - private readonly PinyinAlphabet _alphabet = new PinyinAlphabet(); + private readonly DoublePinAlphabet _alphabet = new DoublePinAlphabet(); private StringMatcher _stringMatcher; [STAThread] diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index b49bf39d3..952ce0edb 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -32,11 +32,11 @@ namespace Flow.Launcher { private readonly SettingWindowViewModel _settingsVM; private readonly MainViewModel _mainVM; - private readonly PinyinAlphabet _alphabet; + private readonly DoublePinAlphabet _alphabet; #region Constructor - public PublicAPIInstance(SettingWindowViewModel settingsVM, MainViewModel mainVM, PinyinAlphabet alphabet) + public PublicAPIInstance(SettingWindowViewModel settingsVM, MainViewModel mainVM, DoublePinAlphabet alphabet) { _settingsVM = settingsVM; _mainVM = mainVM; From f6ae71a99f838b2237c14c62c6daff5e97e6eec0 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 18 Nov 2023 20:24:13 +0800 Subject: [PATCH 03/75] Only convert to double pinyin when meeting Chinese --- Flow.Launcher.Infrastructure/DoublePinAlphabet.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs index 607582097..e09046410 100644 --- a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs @@ -47,7 +47,7 @@ namespace Flow.Launcher.Infrastructure { if (WordsHelper.HasChinese(content)) { - var resultList = WordsHelper.GetPinyinList(content).Select(ToDoublePin).ToArray(); + var resultList = WordsHelper.GetPinyinList(content); StringBuilder resultBuilder = new StringBuilder(); TranslationMapping map = new TranslationMapping(); @@ -57,9 +57,10 @@ namespace Flow.Launcher.Infrastructure { if (content[i] >= 0x3400 && content[i] <= 0x9FD5) { - map.AddNewIndex(i, resultBuilder.Length, resultList[i].Length + 1); + string dp = ToDoublePin(resultList[i].ToLower()); + map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); resultBuilder.Append(' '); - resultBuilder.Append(resultList[i]); + resultBuilder.Append(dp); pre = true; } else From e5285b19921ae2cc49b6f55ebe5772a77f05cd54 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 19 Nov 2023 12:30:17 +0800 Subject: [PATCH 04/75] Temp: compatibility with full pinyin option --- Flow.Launcher.Infrastructure/DoublePinAlphabet.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs index e09046410..e6930ad93 100644 --- a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs @@ -29,7 +29,7 @@ namespace Flow.Launcher.Infrastructure public (string translation, TranslationMapping map) Translate(string content) { - if (_settings.ShouldUseDoublePin) + if (_settings.ShouldUsePinyin) { if (!_doublePinCache.ContainsKey(content)) { @@ -57,7 +57,7 @@ namespace Flow.Launcher.Infrastructure { if (content[i] >= 0x3400 && content[i] <= 0x9FD5) { - string dp = ToDoublePin(resultList[i].ToLower()); + string dp = _settings.ShouldUseDoublePin ? resultList[i] : ToDoublePin(resultList[i].ToLower()); map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); resultBuilder.Append(' '); resultBuilder.Append(dp); From 99ff3b2ec5c9a4d8b4f136735a866f52914c246e Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Mon, 20 Nov 2023 22:49:39 +0800 Subject: [PATCH 05/75] Fix wrong condition --- Flow.Launcher.Infrastructure/DoublePinAlphabet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs index e6930ad93..a1eb788d7 100644 --- a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs @@ -57,7 +57,7 @@ namespace Flow.Launcher.Infrastructure { if (content[i] >= 0x3400 && content[i] <= 0x9FD5) { - string dp = _settings.ShouldUseDoublePin ? resultList[i] : ToDoublePin(resultList[i].ToLower()); + string dp = _settings.ShouldUseDoublePin ? ToDoublePin(resultList[i].ToLower()) : resultList[i]; map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); resultBuilder.Append(' '); resultBuilder.Append(dp); From 46d49d8fdf373e020481b111cbd23bf8ee09538d Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 25 May 2024 15:02:37 +0800 Subject: [PATCH 06/75] Only translate when string is double pinyin --- Flow.Launcher.Infrastructure/DoublePinAlphabet.cs | 4 ++-- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 4 ++-- Flow.Launcher.Infrastructure/StringMatcher.cs | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs index a1eb788d7..945f47a56 100644 --- a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs @@ -22,9 +22,9 @@ namespace Flow.Launcher.Infrastructure _settings = settings ?? throw new ArgumentNullException(nameof(settings)); } - public bool CanBeTranslated(string stringToTranslate) + public bool ShouldTranslate(string stringToTranslate) { - return WordsHelper.HasChinese(stringToTranslate); + return stringToTranslate.Length % 2 == 0 && !WordsHelper.HasChinese(stringToTranslate); } public (string translation, TranslationMapping map) Translate(string content) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 7d7235968..961af1d32 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -119,7 +119,7 @@ namespace Flow.Launcher.Infrastructure /// /// String to translate. /// - public bool CanBeTranslated(string stringToTranslate); + public bool ShouldTranslate(string stringToTranslate); } public class PinyinAlphabet : IAlphabet @@ -134,7 +134,7 @@ namespace Flow.Launcher.Infrastructure _settings = settings ?? throw new ArgumentNullException(nameof(settings)); } - public bool CanBeTranslated(string stringToTranslate) + public bool ShouldTranslate(string stringToTranslate) { return WordsHelper.HasChinese(stringToTranslate); } diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs index bd5dbdda9..4929e4cd2 100644 --- a/Flow.Launcher.Infrastructure/StringMatcher.cs +++ b/Flow.Launcher.Infrastructure/StringMatcher.cs @@ -61,7 +61,7 @@ namespace Flow.Launcher.Infrastructure query = query.Trim(); TranslationMapping translationMapping = null; - if (_alphabet is not null && !_alphabet.CanBeTranslated(query)) + if (_alphabet is not null && _alphabet.ShouldTranslate(query)) { // We assume that if a query can be translated (containing characters of a language, like Chinese) // it actually means user doesn't want it to be translated to English letters. From b1cb852673005e955b1d4bd0bb2ed692e44308c9 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:18:57 +0800 Subject: [PATCH 07/75] Extract classes --- Flow.Launcher.Infrastructure/IAlphabet.cs | 22 ++++ .../PinyinAlphabet.cs | 113 ------------------ .../TranslationMapping.cs | 99 +++++++++++++++ 3 files changed, 121 insertions(+), 113 deletions(-) create mode 100644 Flow.Launcher.Infrastructure/IAlphabet.cs create mode 100644 Flow.Launcher.Infrastructure/TranslationMapping.cs diff --git a/Flow.Launcher.Infrastructure/IAlphabet.cs b/Flow.Launcher.Infrastructure/IAlphabet.cs new file mode 100644 index 000000000..e79ec0c6d --- /dev/null +++ b/Flow.Launcher.Infrastructure/IAlphabet.cs @@ -0,0 +1,22 @@ +namespace Flow.Launcher.Infrastructure +{ + /// + /// Translate a language to English letters using a given rule. + /// + public interface IAlphabet + { + /// + /// Translate a string to English letters, using a given rule. + /// + /// String to translate. + /// + public (string translation, TranslationMapping map) Translate(string stringToTranslate); + + /// + /// Determine if a string can be translated to English letter with this Alphabet. + /// + /// String to translate. + /// + public bool ShouldTranslate(string stringToTranslate); + } +} diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 961af1d32..d98d823d7 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -9,119 +9,6 @@ using ToolGood.Words.Pinyin; namespace Flow.Launcher.Infrastructure { - public class TranslationMapping - { - private bool constructed; - - private List originalIndexs = new List(); - private List translatedIndexs = new List(); - private int translatedLength = 0; - - public string key { get; private set; } - - public void setKey(string key) - { - this.key = key; - } - - public void AddNewIndex(int originalIndex, int translatedIndex, int length) - { - if (constructed) - throw new InvalidOperationException("Mapping shouldn't be changed after constructed"); - - originalIndexs.Add(originalIndex); - translatedIndexs.Add(translatedIndex); - translatedIndexs.Add(translatedIndex + length); - translatedLength += length - 1; - } - - public int MapToOriginalIndex(int translatedIndex) - { - if (translatedIndex > translatedIndexs.Last()) - return translatedIndex - translatedLength - 1; - - int lowerBound = 0; - int upperBound = originalIndexs.Count - 1; - - int count = 0; - - // Corner case handle - if (translatedIndex < translatedIndexs[0]) - return translatedIndex; - if (translatedIndex > translatedIndexs.Last()) - { - int indexDef = 0; - for (int k = 0; k < originalIndexs.Count; k++) - { - indexDef += translatedIndexs[k * 2 + 1] - translatedIndexs[k * 2]; - } - - return translatedIndex - indexDef - 1; - } - - // Binary Search with Range - for (int i = originalIndexs.Count / 2;; count++) - { - if (translatedIndex < translatedIndexs[i * 2]) - { - // move to lower middle - upperBound = i; - i = (i + lowerBound) / 2; - } - else if (translatedIndex > translatedIndexs[i * 2 + 1] - 1) - { - lowerBound = i; - // move to upper middle - // due to floor of integer division, move one up on corner case - i = (i + upperBound + 1) / 2; - } - else - return originalIndexs[i]; - - if (upperBound - lowerBound <= 1 && - translatedIndex > translatedIndexs[lowerBound * 2 + 1] && - translatedIndex < translatedIndexs[upperBound * 2]) - { - int indexDef = 0; - - for (int j = 0; j < upperBound; j++) - { - indexDef += translatedIndexs[j * 2 + 1] - translatedIndexs[j * 2]; - } - - return translatedIndex - indexDef - 1; - } - } - } - - public void endConstruct() - { - if (constructed) - throw new InvalidOperationException("Mapping has already been constructed"); - constructed = true; - } - } - - /// - /// Translate a language to English letters using a given rule. - /// - public interface IAlphabet - { - /// - /// Translate a string to English letters, using a given rule. - /// - /// String to translate. - /// - public (string translation, TranslationMapping map) Translate(string stringToTranslate); - - /// - /// Determine if a string can be translated to English letter with this Alphabet. - /// - /// String to translate. - /// - public bool ShouldTranslate(string stringToTranslate); - } - public class PinyinAlphabet : IAlphabet { private ConcurrentDictionary _pinyinCache = diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs new file mode 100644 index 000000000..f288c816a --- /dev/null +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -0,0 +1,99 @@ +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Flow.Launcher.Infrastructure +{ + public class TranslationMapping + { + private bool constructed; + + private List originalIndexs = new List(); + private List translatedIndexs = new List(); + private int translatedLength = 0; + + public string key { get; private set; } + + public void setKey(string key) + { + this.key = key; + } + + public void AddNewIndex(int originalIndex, int translatedIndex, int length) + { + if (constructed) + throw new InvalidOperationException("Mapping shouldn't be changed after constructed"); + + originalIndexs.Add(originalIndex); + translatedIndexs.Add(translatedIndex); + translatedIndexs.Add(translatedIndex + length); + translatedLength += length - 1; + } + + public int MapToOriginalIndex(int translatedIndex) + { + if (translatedIndex > translatedIndexs.Last()) + return translatedIndex - translatedLength - 1; + + int lowerBound = 0; + int upperBound = originalIndexs.Count - 1; + + int count = 0; + + // Corner case handle + if (translatedIndex < translatedIndexs[0]) + return translatedIndex; + if (translatedIndex > translatedIndexs.Last()) + { + int indexDef = 0; + for (int k = 0; k < originalIndexs.Count; k++) + { + indexDef += translatedIndexs[k * 2 + 1] - translatedIndexs[k * 2]; + } + + return translatedIndex - indexDef - 1; + } + + // Binary Search with Range + for (int i = originalIndexs.Count / 2;; count++) + { + if (translatedIndex < translatedIndexs[i * 2]) + { + // move to lower middle + upperBound = i; + i = (i + lowerBound) / 2; + } + else if (translatedIndex > translatedIndexs[i * 2 + 1] - 1) + { + lowerBound = i; + // move to upper middle + // due to floor of integer division, move one up on corner case + i = (i + upperBound + 1) / 2; + } + else + return originalIndexs[i]; + + if (upperBound - lowerBound <= 1 && + translatedIndex > translatedIndexs[lowerBound * 2 + 1] && + translatedIndex < translatedIndexs[upperBound * 2]) + { + int indexDef = 0; + + for (int j = 0; j < upperBound; j++) + { + indexDef += translatedIndexs[j * 2 + 1] - translatedIndexs[j * 2]; + } + + return translatedIndex - indexDef - 1; + } + } + } + + public void endConstruct() + { + if (constructed) + throw new InvalidOperationException("Mapping has already been constructed"); + constructed = true; + } + } +} From 6807afbe6d753eed6984e1b1ab6019e2864767cd Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:03:00 +0800 Subject: [PATCH 08/75] Remove unused alphabet arg in PublicAPIInstance --- Flow.Launcher/App.xaml.cs | 2 +- Flow.Launcher/PublicAPIInstance.cs | 4 +--- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index d74ea62fb..560bb052b 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -74,7 +74,7 @@ namespace Flow.Launcher PluginManager.LoadPlugins(_settings.PluginSettings); _mainVM = new MainViewModel(_settings); - API = new PublicAPIInstance(_settingsVM, _mainVM, _alphabet); + API = new PublicAPIInstance(_settingsVM, _mainVM); Http.API = API; Http.Proxy = _settings.Proxy; diff --git a/Flow.Launcher/PublicAPIInstance.cs b/Flow.Launcher/PublicAPIInstance.cs index 952ce0edb..e14d692cd 100644 --- a/Flow.Launcher/PublicAPIInstance.cs +++ b/Flow.Launcher/PublicAPIInstance.cs @@ -32,15 +32,13 @@ namespace Flow.Launcher { private readonly SettingWindowViewModel _settingsVM; private readonly MainViewModel _mainVM; - private readonly DoublePinAlphabet _alphabet; #region Constructor - public PublicAPIInstance(SettingWindowViewModel settingsVM, MainViewModel mainVM, DoublePinAlphabet alphabet) + public PublicAPIInstance(SettingWindowViewModel settingsVM, MainViewModel mainVM) { _settingsVM = settingsVM; _mainVM = mainVM; - _alphabet = alphabet; GlobalHotkey.hookedKeyboardCallback = KListener_hookedKeyboardCallback; WebRequest.RegisterPrefix("data", new DataWebRequestFactory()); } From a2efa11699fed4b3aac21bdff26555ce57b274aa Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:19:27 +0800 Subject: [PATCH 09/75] Merge DoublePinAlphabet logic --- .../DoublePinAlphabet.cs | 194 ------------------ .../PinyinAlphabet.cs | 127 +++++++++++- .../UserSettings/Settings.cs | 3 +- Flow.Launcher/App.xaml.cs | 2 +- 4 files changed, 121 insertions(+), 205 deletions(-) delete mode 100644 Flow.Launcher.Infrastructure/DoublePinAlphabet.cs diff --git a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs b/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs deleted file mode 100644 index 945f47a56..000000000 --- a/Flow.Launcher.Infrastructure/DoublePinAlphabet.cs +++ /dev/null @@ -1,194 +0,0 @@ -using System; -using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Collections.ObjectModel; -using System.Diagnostics.CodeAnalysis; -using System.Linq; -using System.Text; -using Flow.Launcher.Infrastructure.UserSettings; -using ToolGood.Words.Pinyin; - -namespace Flow.Launcher.Infrastructure -{ - public class DoublePinAlphabet : IAlphabet - { - private ConcurrentDictionary _doublePinCache = - new ConcurrentDictionary(); - - private Settings _settings; - - public void Initialize([NotNull] Settings settings) - { - _settings = settings ?? throw new ArgumentNullException(nameof(settings)); - } - - public bool ShouldTranslate(string stringToTranslate) - { - return stringToTranslate.Length % 2 == 0 && !WordsHelper.HasChinese(stringToTranslate); - } - - public (string translation, TranslationMapping map) Translate(string content) - { - if (_settings.ShouldUsePinyin) - { - if (!_doublePinCache.ContainsKey(content)) - { - return BuildCacheFromContent(content); - } - else - { - return _doublePinCache[content]; - } - } - return (content, null); - } - - private (string translation, TranslationMapping map) BuildCacheFromContent(string content) - { - if (WordsHelper.HasChinese(content)) - { - var resultList = WordsHelper.GetPinyinList(content); - StringBuilder resultBuilder = new StringBuilder(); - TranslationMapping map = new TranslationMapping(); - - bool pre = false; - - for (int i = 0; i < resultList.Length; i++) - { - if (content[i] >= 0x3400 && content[i] <= 0x9FD5) - { - string dp = _settings.ShouldUseDoublePin ? ToDoublePin(resultList[i].ToLower()) : resultList[i]; - map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); - resultBuilder.Append(' '); - resultBuilder.Append(dp); - pre = true; - } - else - { - if (pre) - { - pre = false; - resultBuilder.Append(' '); - } - - resultBuilder.Append(resultList[i]); - } - } - - map.endConstruct(); - - var key = resultBuilder.ToString(); - map.setKey(key); - - return _doublePinCache[content] = (key, map); - } - else - { - return (content, null); - } - } - - private static readonly ReadOnlyDictionary special = new(new Dictionary(){ - {"a", "aa"}, - {"ai", "ai"}, - {"an", "an"}, - {"ang", "ah"}, - {"ao", "ao"}, - {"e", "ee"}, - {"ei", "ei"}, - {"en", "en"}, - {"er", "er"}, - {"o", "oo"}, - {"ou", "ou"} - }); - - - private static readonly ReadOnlyDictionary first = new(new Dictionary(){ - {"ch", "i"}, - {"sh", "u"}, - {"zh", "v"} - }); - - - private static readonly ReadOnlyDictionary second = new(new Dictionary() - { - {"ua", "x"}, - {"ei", "w"}, - {"e", "e"}, - {"ou", "z"}, - {"iu", "q"}, - {"ve", "t"}, - {"ue", "t"}, - {"u", "u"}, - {"i", "i"}, - {"o", "o"}, - {"uo", "o"}, - {"ie", "p"}, - {"a", "a"}, - {"ong", "s"}, - {"iong", "s"}, - {"ai", "d"}, - {"ing", "k"}, - {"uai", "k"}, - {"ang", "h"}, - {"uan", "r"}, - {"an", "j"}, - {"en", "f"}, - {"ia", "x"}, - {"iang", "l"}, - {"uang", "l"}, - {"eng", "g"}, - {"in", "b"}, - {"ao", "c"}, - {"v", "v"}, - {"ui", "v"}, - {"un", "y"}, - {"iao", "n"}, - {"ian", "m"} - }); - - private static string ToDoublePin(string fullPinyin) - { - // Assuming s is valid - StringBuilder doublePin = new StringBuilder(); - - if (fullPinyin.Length <= 3 && (fullPinyin[0] == 'a' || fullPinyin[0] == 'e' || fullPinyin[0] == 'o')) - { - if (special.ContainsKey(fullPinyin)) - { - return special[fullPinyin]; - } - } - - // zh, ch, sh - if (fullPinyin.Length >= 2 && first.ContainsKey(fullPinyin[..2])) - { - doublePin.Append(first[fullPinyin[..2]]); - - if (second.TryGetValue(fullPinyin[2..], out string tmp)) - { - doublePin.Append(tmp); - } - else - { - doublePin.Append(fullPinyin[2..]); - } - } - else - { - doublePin.Append(fullPinyin[0]); - - if (second.TryGetValue(fullPinyin[1..], out string tmp)) - { - doublePin.Append(tmp); - } - else - { - doublePin.Append(fullPinyin[1..]); - } - } - - return doublePin.ToString(); - } - } -} diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index d98d823d7..37e4f93d2 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -1,18 +1,18 @@ using System; using System.Collections.Concurrent; -using System.Collections.Generic; -using System.Linq; using System.Text; using JetBrains.Annotations; using Flow.Launcher.Infrastructure.UserSettings; using ToolGood.Words.Pinyin; +using System.Collections.Generic; +using System.Collections.ObjectModel; namespace Flow.Launcher.Infrastructure { public class PinyinAlphabet : IAlphabet { - private ConcurrentDictionary _pinyinCache = - new ConcurrentDictionary(); + private readonly ConcurrentDictionary _pinyinCache = + new(); private Settings _settings; @@ -23,20 +23,22 @@ namespace Flow.Launcher.Infrastructure public bool ShouldTranslate(string stringToTranslate) { - return WordsHelper.HasChinese(stringToTranslate); + return _settings.UseDoublePinyin ? + (WordsHelper.HasChinese(stringToTranslate) && stringToTranslate.Length % 2 == 0) : + WordsHelper.HasChinese(stringToTranslate); } public (string translation, TranslationMapping map) Translate(string content) { if (_settings.ShouldUsePinyin) { - if (!_pinyinCache.ContainsKey(content)) + if (!_pinyinCache.TryGetValue(content, out var value)) { return BuildCacheFromContent(content); } else { - return _pinyinCache[content]; + return value; } } return (content, null); @@ -57,9 +59,10 @@ namespace Flow.Launcher.Infrastructure { if (content[i] >= 0x3400 && content[i] <= 0x9FD5) { - map.AddNewIndex(i, resultBuilder.Length, resultList[i].Length + 1); + string dp = _settings.UseDoublePinyin ? ToDoublePin(resultList[i].ToLower()) : resultList[i]; + map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); resultBuilder.Append(' '); - resultBuilder.Append(resultList[i]); + resultBuilder.Append(dp); pre = true; } else @@ -86,5 +89,111 @@ namespace Flow.Launcher.Infrastructure return (content, null); } } + + #region Double Pinyin + + private static readonly ReadOnlyDictionary special = new(new Dictionary(){ + {"a", "aa"}, + {"ai", "ai"}, + {"an", "an"}, + {"ang", "ah"}, + {"ao", "ao"}, + {"e", "ee"}, + {"ei", "ei"}, + {"en", "en"}, + {"er", "er"}, + {"o", "oo"}, + {"ou", "ou"} + }); + + + private static readonly ReadOnlyDictionary first = new(new Dictionary(){ + {"ch", "i"}, + {"sh", "u"}, + {"zh", "v"} + }); + + + private static readonly ReadOnlyDictionary second = new(new Dictionary() + { + {"ua", "x"}, + {"ei", "w"}, + {"e", "e"}, + {"ou", "z"}, + {"iu", "q"}, + {"ve", "t"}, + {"ue", "t"}, + {"u", "u"}, + {"i", "i"}, + {"o", "o"}, + {"uo", "o"}, + {"ie", "p"}, + {"a", "a"}, + {"ong", "s"}, + {"iong", "s"}, + {"ai", "d"}, + {"ing", "k"}, + {"uai", "k"}, + {"ang", "h"}, + {"uan", "r"}, + {"an", "j"}, + {"en", "f"}, + {"ia", "x"}, + {"iang", "l"}, + {"uang", "l"}, + {"eng", "g"}, + {"in", "b"}, + {"ao", "c"}, + {"v", "v"}, + {"ui", "v"}, + {"un", "y"}, + {"iao", "n"}, + {"ian", "m"} + }); + + private static string ToDoublePin(string fullPinyin) + { + // Assuming s is valid + StringBuilder doublePin = new StringBuilder(); + + if (fullPinyin.Length <= 3 && (fullPinyin[0] == 'a' || fullPinyin[0] == 'e' || fullPinyin[0] == 'o')) + { + if (special.TryGetValue(fullPinyin, out var value)) + { + return value; + } + } + + // zh, ch, sh + if (fullPinyin.Length >= 2 && first.ContainsKey(fullPinyin[..2])) + { + doublePin.Append(first[fullPinyin[..2]]); + + if (second.TryGetValue(fullPinyin[2..], out string tmp)) + { + doublePin.Append(tmp); + } + else + { + doublePin.Append(fullPinyin[2..]); + } + } + else + { + doublePin.Append(fullPinyin[0]); + + if (second.TryGetValue(fullPinyin[1..], out string tmp)) + { + doublePin.Append(tmp); + } + else + { + doublePin.Append(fullPinyin[1..]); + } + } + + return doublePin.ToString(); + } + #endregion } } diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 8d94cdba5..e79c3f52d 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -186,7 +186,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings /// public bool ShouldUsePinyin { get; set; } = false; - public bool ShouldUseDoublePin { get; set; } = false; + public bool UseDoublePinyin { get; set; } = false; + public bool AlwaysPreview { get; set; } = false; public bool AlwaysStartEn { get; set; } = false; diff --git a/Flow.Launcher/App.xaml.cs b/Flow.Launcher/App.xaml.cs index 560bb052b..83870837a 100644 --- a/Flow.Launcher/App.xaml.cs +++ b/Flow.Launcher/App.xaml.cs @@ -30,7 +30,7 @@ namespace Flow.Launcher private SettingWindowViewModel _settingsVM; private readonly Updater _updater = new Updater(Flow.Launcher.Properties.Settings.Default.GithubRepo); private readonly Portable _portable = new Portable(); - private readonly DoublePinAlphabet _alphabet = new DoublePinAlphabet(); + private readonly PinyinAlphabet _alphabet = new PinyinAlphabet(); private StringMatcher _stringMatcher; [STAThread] From 12c4e37a95df44fc968a6459e7a3cbf6de4063e6 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:33:49 +0800 Subject: [PATCH 10/75] Developing --- Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index e79c3f52d..30e3b77be 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -186,7 +186,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings /// public bool ShouldUsePinyin { get; set; } = false; - public bool UseDoublePinyin { get; set; } = false; + public bool UseDoublePinyin { get; set; } = true; //For developing public bool AlwaysPreview { get; set; } = false; public bool AlwaysStartEn { get; set; } = false; From f673000d67e4ff1180e6d2856bf85f1640433a7c Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 2 Jun 2024 14:37:15 +0800 Subject: [PATCH 11/75] Fix ShouldTranslate() --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 37e4f93d2..b48a61090 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -23,9 +23,9 @@ namespace Flow.Launcher.Infrastructure public bool ShouldTranslate(string stringToTranslate) { - return _settings.UseDoublePinyin ? - (WordsHelper.HasChinese(stringToTranslate) && stringToTranslate.Length % 2 == 0) : - WordsHelper.HasChinese(stringToTranslate); + return _settings.UseDoublePinyin ? + (!WordsHelper.HasChinese(stringToTranslate) && stringToTranslate.Length % 2 == 0) : + !WordsHelper.HasChinese(stringToTranslate); } public (string translation, TranslationMapping map) Translate(string content) From b10a6e19df5afcbd13ca612f6e6952f19a3b9dde Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 2 Jun 2024 15:18:24 +0800 Subject: [PATCH 12/75] Capitalize first letter --- .../PinyinAlphabet.cs | 104 +++++++++--------- 1 file changed, 51 insertions(+), 53 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index b48a61090..cbec7feae 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -46,71 +46,69 @@ namespace Flow.Launcher.Infrastructure private (string translation, TranslationMapping map) BuildCacheFromContent(string content) { - if (WordsHelper.HasChinese(content)) - { - var resultList = WordsHelper.GetPinyinList(content); - - StringBuilder resultBuilder = new StringBuilder(); - TranslationMapping map = new TranslationMapping(); - - bool pre = false; - - for (int i = 0; i < resultList.Length; i++) - { - if (content[i] >= 0x3400 && content[i] <= 0x9FD5) - { - string dp = _settings.UseDoublePinyin ? ToDoublePin(resultList[i].ToLower()) : resultList[i]; - map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); - resultBuilder.Append(' '); - resultBuilder.Append(dp); - pre = true; - } - else - { - if (pre) - { - pre = false; - resultBuilder.Append(' '); - } - - resultBuilder.Append(resultList[i]); - } - } - - map.endConstruct(); - - var key = resultBuilder.ToString(); - map.setKey(key); - - return _pinyinCache[content] = (key, map); - } - else + if (!WordsHelper.HasChinese(content)) { return (content, null); } + + var resultList = WordsHelper.GetPinyinList(content); + + StringBuilder resultBuilder = new StringBuilder(); + TranslationMapping map = new TranslationMapping(); + + bool pre = false; + + for (int i = 0; i < resultList.Length; i++) + { + if (content[i] >= 0x3400 && content[i] <= 0x9FD5) + { + string dp = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i]; + map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); + resultBuilder.Append(' '); + resultBuilder.Append(dp); + pre = true; + } + else + { + if (pre) + { + pre = false; + resultBuilder.Append(' '); + } + + resultBuilder.Append(resultList[i]); + } + } + + map.endConstruct(); + + var key = resultBuilder.ToString(); + map.setKey(key); + + return _pinyinCache[content] = (key, map); } #region Double Pinyin private static readonly ReadOnlyDictionary special = new(new Dictionary(){ - {"a", "aa"}, - {"ai", "ai"}, - {"an", "an"}, - {"ang", "ah"}, - {"ao", "ao"}, - {"e", "ee"}, - {"ei", "ei"}, - {"en", "en"}, - {"er", "er"}, - {"o", "oo"}, - {"ou", "ou"} + {"A", "aa"}, + {"Ai", "ai"}, + {"An", "an"}, + {"Ang", "ah"}, + {"Ao", "ao"}, + {"E", "ee"}, + {"Ei", "ei"}, + {"En", "en"}, + {"Er", "er"}, + {"O", "oo"}, + {"Ou", "ou"} }); private static readonly ReadOnlyDictionary first = new(new Dictionary(){ - {"ch", "i"}, - {"sh", "u"}, - {"zh", "v"} + {"Ch", "i"}, + {"Sh", "u"}, + {"Zh", "v"} }); From b816d1b866aa93b6d8f2da9f5cef334bda64748b Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 2 Jun 2024 15:21:04 +0800 Subject: [PATCH 13/75] Remove unused key in pinyin alphabet --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 1 - Flow.Launcher.Infrastructure/TranslationMapping.cs | 7 ------- 2 files changed, 8 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index cbec7feae..10799c676 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -83,7 +83,6 @@ namespace Flow.Launcher.Infrastructure map.endConstruct(); var key = resultBuilder.ToString(); - map.setKey(key); return _pinyinCache[content] = (key, map); } diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs index f288c816a..c976fc522 100644 --- a/Flow.Launcher.Infrastructure/TranslationMapping.cs +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -12,13 +12,6 @@ namespace Flow.Launcher.Infrastructure private List translatedIndexs = new List(); private int translatedLength = 0; - public string key { get; private set; } - - public void setKey(string key) - { - this.key = key; - } - public void AddNewIndex(int originalIndex, int translatedIndex, int length) { if (constructed) From 9e8a950580becfb5f232df40c2a73e65a5e30200 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 5 Apr 2025 23:01:09 +0800 Subject: [PATCH 14/75] Fix build issue & Improve code quality --- .../PinyinAlphabet.cs | 21 +++++-------------- 1 file changed, 5 insertions(+), 16 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index e12764ed3..a63dd99d9 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -1,7 +1,5 @@ -using System; -using System.Collections.Concurrent; +using System.Collections.Concurrent; using System.Text; -using JetBrains.Annotations; using Flow.Launcher.Infrastructure.UserSettings; using ToolGood.Words.Pinyin; using System.Collections.Generic; @@ -15,11 +13,11 @@ namespace Flow.Launcher.Infrastructure private readonly ConcurrentDictionary _pinyinCache = new(); - private Settings _settings; + private readonly Settings _settings; - public void Initialize([NotNull] Settings settings) + public PinyinAlphabet() { - _settings = settings ?? throw new ArgumentNullException(nameof(settings)); + _settings = Ioc.Default.GetRequiredService(); } public bool ShouldTranslate(string stringToTranslate) @@ -109,16 +107,6 @@ namespace Flow.Launcher.Infrastructure {"Sh", "u"}, {"Zh", "v"} }); - - public PinyinAlphabet() - { - Initialize(Ioc.Default.GetRequiredService()); - } - - private void Initialize([NotNull] Settings settings) - { - _settings = settings ?? throw new ArgumentNullException(nameof(settings)); - } private static readonly ReadOnlyDictionary second = new(new Dictionary() { @@ -200,6 +188,7 @@ namespace Flow.Launcher.Infrastructure return doublePin.ToString(); } + #endregion } } From a8a305fce08c19f9e64fd450c94974d5cca17e4d Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 5 Apr 2025 23:02:28 +0800 Subject: [PATCH 15/75] Improve code quality --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index a63dd99d9..3b24ecc2b 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -1,10 +1,10 @@ using System.Collections.Concurrent; -using System.Text; -using Flow.Launcher.Infrastructure.UserSettings; -using ToolGood.Words.Pinyin; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.Text; using CommunityToolkit.Mvvm.DependencyInjection; +using Flow.Launcher.Infrastructure.UserSettings; +using ToolGood.Words.Pinyin; namespace Flow.Launcher.Infrastructure { @@ -52,12 +52,12 @@ namespace Flow.Launcher.Infrastructure var resultList = WordsHelper.GetPinyinList(content); - StringBuilder resultBuilder = new StringBuilder(); - TranslationMapping map = new TranslationMapping(); + var resultBuilder = new StringBuilder(); + var map = new TranslationMapping(); - bool pre = false; + var pre = false; - for (int i = 0; i < resultList.Length; i++) + for (var i = 0; i < resultList.Length; i++) { if (content[i] >= 0x3400 && content[i] <= 0x9FD5) { @@ -148,7 +148,7 @@ namespace Flow.Launcher.Infrastructure private static string ToDoublePin(string fullPinyin) { // Assuming s is valid - StringBuilder doublePin = new StringBuilder(); + var doublePin = new StringBuilder(); if (fullPinyin.Length <= 3 && (fullPinyin[0] == 'a' || fullPinyin[0] == 'e' || fullPinyin[0] == 'o')) { From 5be732d533278ab7ce897fd69c3cd6245741af84 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sat, 5 Apr 2025 23:04:12 +0800 Subject: [PATCH 16/75] Use var when neccessary --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 3b24ecc2b..7bcc70251 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -163,7 +163,7 @@ namespace Flow.Launcher.Infrastructure { doublePin.Append(first[fullPinyin[..2]]); - if (second.TryGetValue(fullPinyin[2..], out string tmp)) + if (second.TryGetValue(fullPinyin[2..], out var tmp)) { doublePin.Append(tmp); } @@ -176,7 +176,7 @@ namespace Flow.Launcher.Infrastructure { doublePin.Append(fullPinyin[0]); - if (second.TryGetValue(fullPinyin[1..], out string tmp)) + if (second.TryGetValue(fullPinyin[1..], out var tmp)) { doublePin.Append(tmp); } From 1f458d3b564a37944a7a10183fc9be5696cf2e95 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Wed, 9 Apr 2025 20:06:17 +0800 Subject: [PATCH 17/75] Fix typos & Code quality --- .../TranslationMapping.cs | 40 ++++++++++--------- 1 file changed, 22 insertions(+), 18 deletions(-) diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs index c976fc522..b33a094db 100644 --- a/Flow.Launcher.Infrastructure/TranslationMapping.cs +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -8,8 +8,9 @@ namespace Flow.Launcher.Infrastructure { private bool constructed; - private List originalIndexs = new List(); - private List translatedIndexs = new List(); + private readonly List originalIndexes = new(); + private readonly List translatedIndexes = new(); + private int translatedLength = 0; public void AddNewIndex(int originalIndex, int translatedIndex, int length) @@ -17,46 +18,47 @@ namespace Flow.Launcher.Infrastructure if (constructed) throw new InvalidOperationException("Mapping shouldn't be changed after constructed"); - originalIndexs.Add(originalIndex); - translatedIndexs.Add(translatedIndex); - translatedIndexs.Add(translatedIndex + length); + originalIndexes.Add(originalIndex); + translatedIndexes.Add(translatedIndex); + translatedIndexes.Add(translatedIndex + length); translatedLength += length - 1; } public int MapToOriginalIndex(int translatedIndex) { - if (translatedIndex > translatedIndexs.Last()) + if (translatedIndex > translatedIndexes.Last()) return translatedIndex - translatedLength - 1; int lowerBound = 0; - int upperBound = originalIndexs.Count - 1; + int upperBound = originalIndexes.Count - 1; int count = 0; // Corner case handle - if (translatedIndex < translatedIndexs[0]) + if (translatedIndex < translatedIndexes[0]) return translatedIndex; - if (translatedIndex > translatedIndexs.Last()) + + if (translatedIndex > translatedIndexes.Last()) { int indexDef = 0; - for (int k = 0; k < originalIndexs.Count; k++) + for (int k = 0; k < originalIndexes.Count; k++) { - indexDef += translatedIndexs[k * 2 + 1] - translatedIndexs[k * 2]; + indexDef += translatedIndexes[k * 2 + 1] - translatedIndexes[k * 2]; } return translatedIndex - indexDef - 1; } // Binary Search with Range - for (int i = originalIndexs.Count / 2;; count++) + for (int i = originalIndexes.Count / 2;; count++) { - if (translatedIndex < translatedIndexs[i * 2]) + if (translatedIndex < translatedIndexes[i * 2]) { // move to lower middle upperBound = i; i = (i + lowerBound) / 2; } - else if (translatedIndex > translatedIndexs[i * 2 + 1] - 1) + else if (translatedIndex > translatedIndexes[i * 2 + 1] - 1) { lowerBound = i; // move to upper middle @@ -64,17 +66,19 @@ namespace Flow.Launcher.Infrastructure i = (i + upperBound + 1) / 2; } else - return originalIndexs[i]; + { + return originalIndexes[i]; + } if (upperBound - lowerBound <= 1 && - translatedIndex > translatedIndexs[lowerBound * 2 + 1] && - translatedIndex < translatedIndexs[upperBound * 2]) + translatedIndex > translatedIndexes[lowerBound * 2 + 1] && + translatedIndex < translatedIndexes[upperBound * 2]) { int indexDef = 0; for (int j = 0; j < upperBound; j++) { - indexDef += translatedIndexs[j * 2 + 1] - translatedIndexs[j * 2]; + indexDef += translatedIndexes[j * 2 + 1] - translatedIndexes[j * 2]; } return translatedIndex - indexDef - 1; From 4b7db3cbd62233323bccfdd2188f28e8b6434a43 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 10 Apr 2025 09:36:47 +0800 Subject: [PATCH 18/75] Make function static --- Flow.Launcher.Infrastructure/StringMatcher.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/StringMatcher.cs b/Flow.Launcher.Infrastructure/StringMatcher.cs index 7045517f5..2882cb8f0 100644 --- a/Flow.Launcher.Infrastructure/StringMatcher.cs +++ b/Flow.Launcher.Infrastructure/StringMatcher.cs @@ -228,7 +228,7 @@ namespace Flow.Launcher.Infrastructure return new MatchResult(false, UserSettingSearchPrecision); } - private bool IsAcronym(string stringToCompare, int compareStringIndex) + private static bool IsAcronym(string stringToCompare, int compareStringIndex) { if (IsAcronymChar(stringToCompare, compareStringIndex) || IsAcronymNumber(stringToCompare, compareStringIndex)) return true; @@ -237,7 +237,7 @@ namespace Flow.Launcher.Infrastructure } // When counting acronyms, treat a set of numbers as one acronym ie. Visual 2019 as 2 acronyms instead of 5 - private bool IsAcronymCount(string stringToCompare, int compareStringIndex) + private static bool IsAcronymCount(string stringToCompare, int compareStringIndex) { if (IsAcronymChar(stringToCompare, compareStringIndex)) return true; From f5fd6b569ca8466fe4922aa1bd975622217c81ee Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 10 Apr 2025 09:56:27 +0800 Subject: [PATCH 19/75] Use ReadOnlySpan instead --- .../PinyinAlphabet.cs | 43 ++++++++++++------- 1 file changed, 28 insertions(+), 15 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 7bcc70251..1637a285c 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -1,4 +1,5 @@ -using System.Collections.Concurrent; +using System; +using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; using System.Text; @@ -148,9 +149,11 @@ namespace Flow.Launcher.Infrastructure private static string ToDoublePin(string fullPinyin) { // Assuming s is valid + var fullPinyinSpan = fullPinyin.AsSpan(); var doublePin = new StringBuilder(); - if (fullPinyin.Length <= 3 && (fullPinyin[0] == 'a' || fullPinyin[0] == 'e' || fullPinyin[0] == 'o')) + // Handle special cases (a, o, e) + if (fullPinyin.Length <= 3 && (fullPinyinSpan[0] == 'a' || fullPinyinSpan[0] == 'e' || fullPinyinSpan[0] == 'o')) { if (special.TryGetValue(fullPinyin, out var value)) { @@ -158,31 +161,41 @@ namespace Flow.Launcher.Infrastructure } } - // zh, ch, sh - if (fullPinyin.Length >= 2 && first.ContainsKey(fullPinyin[..2])) + // Check for initials that are two characters long (zh, ch, sh) + if (fullPinyin.Length >= 2) { - doublePin.Append(first[fullPinyin[..2]]); + var firstTwo = fullPinyinSpan[..2]; + var firstTwoString = firstTwo.ToString(); + if (first.ContainsKey(firstTwoString)) + { + doublePin.Append(firstTwoString); - if (second.TryGetValue(fullPinyin[2..], out var tmp)) - { - doublePin.Append(tmp); - } - else - { - doublePin.Append(fullPinyin[2..]); + var lastTwo = fullPinyinSpan[2..]; + var lastTwoString = lastTwo.ToString(); + if (second.TryGetValue(lastTwoString, out var tmp)) + { + doublePin.Append(tmp); + } + else + { + doublePin.Append(lastTwo); + } } } + // Handle single-character initials else { - doublePin.Append(fullPinyin[0]); + doublePin.Append(fullPinyinSpan[0]); - if (second.TryGetValue(fullPinyin[1..], out var tmp)) + var lastOne = fullPinyinSpan[1..]; + var lastOneString = lastOne.ToString(); + if (second.TryGetValue(lastOneString, out var tmp)) { doublePin.Append(tmp); } else { - doublePin.Append(fullPinyin[1..]); + doublePin.Append(lastOne); } } From 74d54990c913cb6ebfaf07cec97fa1128a09812b Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 13 Jun 2025 00:21:49 +0800 Subject: [PATCH 20/75] Delete Flow.Launcher/Properties/Resources.fr-FR.resx --- Flow.Launcher/Properties/Resources.fr-FR.resx | 130 ------------------ 1 file changed, 130 deletions(-) delete mode 100644 Flow.Launcher/Properties/Resources.fr-FR.resx diff --git a/Flow.Launcher/Properties/Resources.fr-FR.resx b/Flow.Launcher/Properties/Resources.fr-FR.resx deleted file mode 100644 index ca0f66f53..000000000 --- a/Flow.Launcher/Properties/Resources.fr-FR.resx +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file From 78ffeb8cf2508c56eb40bb027ca3ce73c551fe24 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 13 Jun 2025 00:24:40 +0800 Subject: [PATCH 21/75] Delete Flow.Launcher/Properties/Resources.he-IL.resx --- Flow.Launcher/Properties/Resources.he-IL.resx | 130 ------------------ 1 file changed, 130 deletions(-) delete mode 100644 Flow.Launcher/Properties/Resources.he-IL.resx diff --git a/Flow.Launcher/Properties/Resources.he-IL.resx b/Flow.Launcher/Properties/Resources.he-IL.resx deleted file mode 100644 index ca0f66f53..000000000 --- a/Flow.Launcher/Properties/Resources.he-IL.resx +++ /dev/null @@ -1,130 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - - ..\Resources\app.ico;System.Drawing.Icon, System.Drawing, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\dev.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - - ..\Images\gamemode.ico;System.Drawing.Icon, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a - - \ No newline at end of file From 3eb5fead1f790120729f740a97cf9959a39a417a Mon Sep 17 00:00:00 2001 From: Jeremy Date: Wed, 11 Jun 2025 21:10:56 +1000 Subject: [PATCH 22/75] remove on tag deployment & change NuGet publish to on master push --- appveyor.yml | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/appveyor.yml b/appveyor.yml index fa0b5956b..8fba05252 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -62,7 +62,7 @@ deploy: api_key: secure: sCSd5JWgdzJWDa9kpqECut5ACPKZqcoxKU8ERKC00k7VIjig3/+nFV5zzTcGb0w3 on: - APPVEYOR_REPO_TAG: true + branch: master - provider: GitHub repository: Flow-Launcher/Prereleases @@ -84,12 +84,3 @@ deploy: force_update: true on: branch: master - - - provider: GitHub - release: v$(flowVersion) - auth_token: - secure: ij4UeXUYQBDJxn2YRAAhUOjklOGVKDB87Hn5J8tKIzj13yatoI7sLM666QDQFEgv - artifact: Squirrel Installer, Portable Version, Squirrel nupkg, Squirrel RELEASES - force_update: true - on: - APPVEYOR_REPO_TAG: true From 8f43de696731c7bb535d77a96e9f843de16e20b4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 6 Jun 2025 13:12:40 +0800 Subject: [PATCH 23/75] Support Msix FireFox bookmarks --- .../FirefoxBookmarkLoader.cs | 165 +++++++++++------- 1 file changed, 98 insertions(+), 67 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs index acace2506..42a288e3a 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs @@ -264,84 +264,115 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase /// public override List GetBookmarks() { - return GetBookmarksFromPath(PlacesPath); + var bookmarks1 = GetBookmarksFromPath(PlacesPath); + var bookmarks2 = GetBookmarksFromPath(MsixPlacesPath); + return bookmarks1.Concat(bookmarks2).ToList(); } /// - /// Path to places.sqlite + /// Path to places.sqlite of Msi installer + /// E.g. C:\Users\{UserName}\AppData\Roaming\Mozilla\Firefox + /// /// - /// private static string PlacesPath { get { var profileFolderPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"Mozilla\Firefox"); - var profileIni = Path.Combine(profileFolderPath, @"profiles.ini"); - - if (!File.Exists(profileIni)) - return string.Empty; - - // get firefox default profile directory from profiles.ini - using var sReader = new StreamReader(profileIni); - var ini = sReader.ReadToEnd(); - - var lines = ini.Split("\r\n").ToList(); - - var defaultProfileFolderNameRaw = lines.FirstOrDefault(x => x.Contains("Default=") && x != "Default=1") ?? string.Empty; - - if (string.IsNullOrEmpty(defaultProfileFolderNameRaw)) - return string.Empty; - - var defaultProfileFolderName = defaultProfileFolderNameRaw.Split('=').Last(); - - var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName); - - /* - Current profiles.ini structure example as of Firefox version 69.0.1 - - [Install736426B0AF4A39CB] - Default=Profiles/7789f565.default-release <== this is the default profile this plugin will get the bookmarks from. When opened Firefox will load the default profile - Locked=1 - - [Profile2] - Name=newblahprofile - IsRelative=0 - Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code. - - [Profile1] - Name=default - IsRelative=1 - Path=Profiles/cydum7q4.default - Default=1 - - [Profile0] - Name=default-release - IsRelative=1 - Path=Profiles/7789f565.default-release - - [General] - StartWithLastProfile=1 - Version=2 - */ - // Seen in the example above, the IsRelative attribute is always above the Path attribute - - var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite"); - var absoluePath = Path.Combine(profileFolderPath, relativePath); - - // If the index is out of range, it means that the default profile is in a custom location or the file is malformed - // If the profile is in a custom location, we need to check - if (indexOfDefaultProfileAttributePath - 1 < 0 || - indexOfDefaultProfileAttributePath - 1 >= lines.Count) - { - return Directory.Exists(absoluePath) ? absoluePath : relativePath; - } - - var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1]; - - return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0 - ? relativePath : absoluePath; + return GetProfileIniPath(profileFolderPath); } } + + /// + /// Path to places.sqlite of MSIX installer + /// E.g. C:\Users\{UserName}\AppData\Local\Packages\Mozilla.Firefox_n80bbvh6b1yt2\LocalCache\Roaming\Mozilla\Firefox + /// + /// + public static string MsixPlacesPath + { + get + { + var platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); + var packagesPath = Path.Combine(platformPath, "Packages"); + + // Search for folder with Mozilla.Firefox prefix + var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*", + SearchOption.TopDirectoryOnly).FirstOrDefault(); + + // Msix FireFox not installed + if (firefoxPackageFolder == null) return string.Empty; + + var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox"); + return GetProfileIniPath(profileFolderPath); + } + } + + private static string GetProfileIniPath(string profileFolderPath) + { + var profileIni = Path.Combine(profileFolderPath, @"profiles.ini"); + if (!File.Exists(profileIni)) + return string.Empty; + + // get firefox default profile directory from profiles.ini + using var sReader = new StreamReader(profileIni); + var ini = sReader.ReadToEnd(); + + var lines = ini.Split("\r\n").ToList(); + + var defaultProfileFolderNameRaw = lines.FirstOrDefault(x => x.Contains("Default=") && x != "Default=1") ?? string.Empty; + + if (string.IsNullOrEmpty(defaultProfileFolderNameRaw)) + return string.Empty; + + var defaultProfileFolderName = defaultProfileFolderNameRaw.Split('=').Last(); + + var indexOfDefaultProfileAttributePath = lines.IndexOf("Path=" + defaultProfileFolderName); + + /* + Current profiles.ini structure example as of Firefox version 69.0.1 + + [Install736426B0AF4A39CB] + Default=Profiles/7789f565.default-release <== this is the default profile this plugin will get the bookmarks from. When opened Firefox will load the default profile + Locked=1 + + [Profile2] + Name=newblahprofile + IsRelative=0 + Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code. + + [Profile1] + Name=default + IsRelative=1 + Path=Profiles/cydum7q4.default + Default=1 + + [Profile0] + Name=default-release + IsRelative=1 + Path=Profiles/7789f565.default-release + + [General] + StartWithLastProfile=1 + Version=2 + */ + // Seen in the example above, the IsRelative attribute is always above the Path attribute + + var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite"); + var absoluePath = Path.Combine(profileFolderPath, relativePath); + + // If the index is out of range, it means that the default profile is in a custom location or the file is malformed + // If the profile is in a custom location, we need to check + if (indexOfDefaultProfileAttributePath - 1 < 0 || + indexOfDefaultProfileAttributePath - 1 >= lines.Count) + { + return Directory.Exists(absoluePath) ? absoluePath : relativePath; + } + + var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1]; + + return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0 + ? relativePath : absoluePath; + } } public static class Extensions From 281e042ab7016621c649defcca942cf854cd6129 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 6 Jun 2025 13:21:51 +0800 Subject: [PATCH 24/75] Fix IsRelative logic. --- .../FirefoxBookmarkLoader.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs index 42a288e3a..61fd05073 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs @@ -370,7 +370,8 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1]; - return relativeAttribute == "0" // See above, the profile is located in a custom location, path is not relative, so IsRelative=0 + // See above, the profile is located in a custom location, path is not relative, so IsRelative=0 + return (relativeAttribute == "0" || relativeAttribute == "IsRelative=0") ? relativePath : absoluePath; } } From ceb05e8651f847cddf9e2fa00d15a1ef741f56b4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 6 Jun 2025 13:25:43 +0800 Subject: [PATCH 25/75] Add error handling for directory operation --- .../FirefoxBookmarkLoader.cs | 22 ++++++++++++------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs index 61fd05073..ac382275f 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs @@ -294,16 +294,22 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase { var platformPath = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData); var packagesPath = Path.Combine(platformPath, "Packages"); - - // Search for folder with Mozilla.Firefox prefix - var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*", - SearchOption.TopDirectoryOnly).FirstOrDefault(); + try + { + // Search for folder with Mozilla.Firefox prefix + var firefoxPackageFolder = Directory.EnumerateDirectories(packagesPath, "Mozilla.Firefox*", + SearchOption.TopDirectoryOnly).FirstOrDefault(); - // Msix FireFox not installed - if (firefoxPackageFolder == null) return string.Empty; + // Msix FireFox not installed + if (firefoxPackageFolder == null) return string.Empty; - var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox"); - return GetProfileIniPath(profileFolderPath); + var profileFolderPath = Path.Combine(firefoxPackageFolder, @"LocalCache\Roaming\Mozilla\Firefox"); + return GetProfileIniPath(profileFolderPath); + } + catch + { + return string.Empty; + } } } From aaa8e4dc780900ce721555dba06c22fb6dd3de13 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 8 Jun 2025 12:09:07 +0800 Subject: [PATCH 26/75] Use AddRange --- .../FirefoxBookmarkLoader.cs | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs index ac382275f..dcf7763c3 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs @@ -264,9 +264,10 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase /// public override List GetBookmarks() { - var bookmarks1 = GetBookmarksFromPath(PlacesPath); - var bookmarks2 = GetBookmarksFromPath(MsixPlacesPath); - return bookmarks1.Concat(bookmarks2).ToList(); + var bookmarks = new List(); + bookmarks.AddRange(GetBookmarksFromPath(PlacesPath)); + bookmarks.AddRange(GetBookmarksFromPath(MsixPlacesPath)); + return bookmarks; } /// From 44304f25d68de8dd53b9a1ac414cffbffa07f2fb Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Wed, 11 Jun 2025 21:14:05 +0800 Subject: [PATCH 27/75] Change code comments --- .../FirefoxBookmarkLoader.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs index dcf7763c3..f214997c3 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs @@ -343,9 +343,9 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase Locked=1 [Profile2] - Name=newblahprofile + Name=dummyprofile IsRelative=0 - Path=C:\t6h2yuq8.newblahprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code. + Path=C:\t6h2yuq8.dummyprofile <== Note this is a custom location path for the profile user can set, we need to cater for this in code. [Profile1] Name=default From 16fd256fd61873320691acd774c87cf7df4ee8be Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 12 Jun 2025 16:27:48 +0800 Subject: [PATCH 28/75] Fix typos --- .../FirefoxBookmarkLoader.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs index f214997c3..8dffeecdc 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/FirefoxBookmarkLoader.cs @@ -365,21 +365,21 @@ public class FirefoxBookmarkLoader : FirefoxBookmarkLoaderBase // Seen in the example above, the IsRelative attribute is always above the Path attribute var relativePath = Path.Combine(defaultProfileFolderName, "places.sqlite"); - var absoluePath = Path.Combine(profileFolderPath, relativePath); + var absolutePath = Path.Combine(profileFolderPath, relativePath); // If the index is out of range, it means that the default profile is in a custom location or the file is malformed // If the profile is in a custom location, we need to check if (indexOfDefaultProfileAttributePath - 1 < 0 || indexOfDefaultProfileAttributePath - 1 >= lines.Count) { - return Directory.Exists(absoluePath) ? absoluePath : relativePath; + return Directory.Exists(absolutePath) ? absolutePath : relativePath; } var relativeAttribute = lines[indexOfDefaultProfileAttributePath - 1]; // See above, the profile is located in a custom location, path is not relative, so IsRelative=0 return (relativeAttribute == "0" || relativeAttribute == "IsRelative=0") - ? relativePath : absoluePath; + ? relativePath : absolutePath; } } From fba42fff1799f8a2c9e9e68e7ab067a17a4690a2 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 13 Jun 2025 22:31:28 +0800 Subject: [PATCH 29/75] Fix transaltion logic --- .../PinyinAlphabet.cs | 46 +++++++++---------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 1637a285c..090abb490 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -32,14 +32,14 @@ namespace Flow.Launcher.Infrastructure { if (_settings.ShouldUsePinyin) { - if (!_pinyinCache.TryGetValue(content, out var value)) + if (true) { return BuildCacheFromContent(content); } - else - { - return value; - } + //else + //{ + // return value; + //} } return (content, null); } @@ -164,11 +164,10 @@ namespace Flow.Launcher.Infrastructure // Check for initials that are two characters long (zh, ch, sh) if (fullPinyin.Length >= 2) { - var firstTwo = fullPinyinSpan[..2]; - var firstTwoString = firstTwo.ToString(); - if (first.ContainsKey(firstTwoString)) + var firstTwoString = fullPinyinSpan[..2].ToString(); + if (first.TryGetValue(firstTwoString, out var firstTwoDoublePin)) { - doublePin.Append(firstTwoString); + doublePin.Append(firstTwoDoublePin); var lastTwo = fullPinyinSpan[2..]; var lastTwoString = lastTwo.ToString(); @@ -178,27 +177,26 @@ namespace Flow.Launcher.Infrastructure } else { - doublePin.Append(lastTwo); + doublePin.Append(lastTwo); // Todo: original pinyin, remove this line if not needed } } - } - // Handle single-character initials - else - { - doublePin.Append(fullPinyinSpan[0]); - - var lastOne = fullPinyinSpan[1..]; - var lastOneString = lastOne.ToString(); - if (second.TryGetValue(lastOneString, out var tmp)) - { - doublePin.Append(tmp); - } else { - doublePin.Append(lastOne); + // Handle single-character initials + doublePin.Append(fullPinyinSpan[0]); + + var lastOne = fullPinyinSpan[1..]; + var lastOneString = lastOne.ToString(); + if (second.TryGetValue(lastOneString, out var tmp)) + { + doublePin.Append(tmp); + } + else + { + doublePin.Append(lastOne); + } } } - return doublePin.ToString(); } From b31a7408d3c279e92480530fc6a8cd8167b435c2 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Fri, 13 Jun 2025 23:39:14 +0800 Subject: [PATCH 30/75] Simple refactor --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 18 ++++++------------ 1 file changed, 6 insertions(+), 12 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 090abb490..2c548e0a3 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -30,18 +30,12 @@ namespace Flow.Launcher.Infrastructure public (string translation, TranslationMapping map) Translate(string content) { - if (_settings.ShouldUsePinyin) - { - if (true) - { - return BuildCacheFromContent(content); - } - //else - //{ - // return value; - //} - } - return (content, null); + if (!_settings.ShouldUsePinyin) + return (content, null); + + return _pinyinCache.TryGetValue(content, out var value) + ? value + : BuildCacheFromContent(content); } private (string translation, TranslationMapping map) BuildCacheFromContent(string content) From 818aac715e47aa0bcda35b2431dbeda4219bb88d Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:32:00 +0800 Subject: [PATCH 31/75] Use lookup table to translate full pinyin to double pinyin --- .../PinyinAlphabet.cs | 166 +- .../UserSettings/Settings.cs | 2 + Flow.Launcher/Flow.Launcher.csproj | 3 + Flow.Launcher/Resources/double_pinyin.json | 3746 +++++++++++++++++ 4 files changed, 3805 insertions(+), 112 deletions(-) create mode 100644 Flow.Launcher/Resources/double_pinyin.json diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 2c548e0a3..6a2cd1e66 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -2,10 +2,13 @@ using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.ObjectModel; +using System.IO; using System.Text; +using System.Text.Json; using CommunityToolkit.Mvvm.DependencyInjection; using Flow.Launcher.Infrastructure.UserSettings; using ToolGood.Words.Pinyin; +using Flow.Launcher.Infrastructure.Logger; namespace Flow.Launcher.Infrastructure { @@ -16,9 +19,49 @@ namespace Flow.Launcher.Infrastructure private readonly Settings _settings; + private ReadOnlyDictionary currentDoublePinyinTable; + public PinyinAlphabet() { _settings = Ioc.Default.GetRequiredService(); + LoadDoublePinyinTable(); + + _settings.PropertyChanged += (sender, e) => + { + if (e.PropertyName == nameof(Settings.UseDoublePinyin) || + e.PropertyName == nameof(Settings.DoublePinyinSchema)) + { + LoadDoublePinyinTable(); + _pinyinCache.Clear(); + } + }; + } + + private void LoadDoublePinyinTable() + { + if (_settings.UseDoublePinyin) + { + var tablePath = Path.Join(AppContext.BaseDirectory, "Resources", "double_pinyin.json"); + try + { + using var fs = File.OpenRead(tablePath); + Dictionary> table = JsonSerializer.Deserialize>>(fs); + if (!table.TryGetValue(_settings.DoublePinyinSchema, out var value)) + { + throw new InvalidOperationException("DoublePinyinSchema is invalid."); + } + currentDoublePinyinTable = new ReadOnlyDictionary(value); + } + catch (System.Exception e) + { + Log.Exception(nameof(PinyinAlphabet), "Failed to load double pinyin table from file: " + tablePath, e); + currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary()); + } + } + else + { + currentDoublePinyinTable = new ReadOnlyDictionary(new Dictionary()); + } } public bool ShouldTranslate(string stringToTranslate) @@ -50,7 +93,7 @@ namespace Flow.Launcher.Infrastructure var resultBuilder = new StringBuilder(); var map = new TranslationMapping(); - var pre = false; + var previousIsChinese = false; for (var i = 0; i < resultList.Length; i++) { @@ -58,18 +101,19 @@ namespace Flow.Launcher.Infrastructure { string dp = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i]; map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); - resultBuilder.Append(' '); + if (previousIsChinese) + { + resultBuilder.Append(' '); + } resultBuilder.Append(dp); - pre = true; } else { - if (pre) + if (previousIsChinese) { - pre = false; + previousIsChinese = false; resultBuilder.Append(' '); } - resultBuilder.Append(resultList[i]); } } @@ -83,115 +127,13 @@ namespace Flow.Launcher.Infrastructure #region Double Pinyin - private static readonly ReadOnlyDictionary special = new(new Dictionary(){ - {"A", "aa"}, - {"Ai", "ai"}, - {"An", "an"}, - {"Ang", "ah"}, - {"Ao", "ao"}, - {"E", "ee"}, - {"Ei", "ei"}, - {"En", "en"}, - {"Er", "er"}, - {"O", "oo"}, - {"Ou", "ou"} - }); - - private static readonly ReadOnlyDictionary first = new(new Dictionary(){ - {"Ch", "i"}, - {"Sh", "u"}, - {"Zh", "v"} - }); - - private static readonly ReadOnlyDictionary second = new(new Dictionary() + private string ToDoublePin(string fullPinyin) { - {"ua", "x"}, - {"ei", "w"}, - {"e", "e"}, - {"ou", "z"}, - {"iu", "q"}, - {"ve", "t"}, - {"ue", "t"}, - {"u", "u"}, - {"i", "i"}, - {"o", "o"}, - {"uo", "o"}, - {"ie", "p"}, - {"a", "a"}, - {"ong", "s"}, - {"iong", "s"}, - {"ai", "d"}, - {"ing", "k"}, - {"uai", "k"}, - {"ang", "h"}, - {"uan", "r"}, - {"an", "j"}, - {"en", "f"}, - {"ia", "x"}, - {"iang", "l"}, - {"uang", "l"}, - {"eng", "g"}, - {"in", "b"}, - {"ao", "c"}, - {"v", "v"}, - {"ui", "v"}, - {"un", "y"}, - {"iao", "n"}, - {"ian", "m"} - }); - - private static string ToDoublePin(string fullPinyin) - { - // Assuming s is valid - var fullPinyinSpan = fullPinyin.AsSpan(); - var doublePin = new StringBuilder(); - - // Handle special cases (a, o, e) - if (fullPinyin.Length <= 3 && (fullPinyinSpan[0] == 'a' || fullPinyinSpan[0] == 'e' || fullPinyinSpan[0] == 'o')) + if (currentDoublePinyinTable.TryGetValue(fullPinyin, out var doublePinyinValue)) { - if (special.TryGetValue(fullPinyin, out var value)) - { - return value; - } + return doublePinyinValue; } - - // Check for initials that are two characters long (zh, ch, sh) - if (fullPinyin.Length >= 2) - { - var firstTwoString = fullPinyinSpan[..2].ToString(); - if (first.TryGetValue(firstTwoString, out var firstTwoDoublePin)) - { - doublePin.Append(firstTwoDoublePin); - - var lastTwo = fullPinyinSpan[2..]; - var lastTwoString = lastTwo.ToString(); - if (second.TryGetValue(lastTwoString, out var tmp)) - { - doublePin.Append(tmp); - } - else - { - doublePin.Append(lastTwo); // Todo: original pinyin, remove this line if not needed - } - } - else - { - // Handle single-character initials - doublePin.Append(fullPinyinSpan[0]); - - var lastOne = fullPinyinSpan[1..]; - var lastOneString = lastOne.ToString(); - if (second.TryGetValue(lastOneString, out var tmp)) - { - doublePin.Append(tmp); - } - else - { - doublePin.Append(lastOne); - } - } - } - return doublePin.ToString(); + return fullPinyin; } #endregion diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index b10f9502e..e7306e3dd 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -292,6 +292,8 @@ namespace Flow.Launcher.Infrastructure.UserSettings public bool UseDoublePinyin { get; set; } = true; //For developing + public string DoublePinyinSchema { get; set; } = "XiaoHe"; //For developing + public bool AlwaysPreview { get; set; } = false; public bool AlwaysStartEn { get; set; } = false; diff --git a/Flow.Launcher/Flow.Launcher.csproj b/Flow.Launcher/Flow.Launcher.csproj index d75d15a21..37e1f6bcf 100644 --- a/Flow.Launcher/Flow.Launcher.csproj +++ b/Flow.Launcher/Flow.Launcher.csproj @@ -127,6 +127,9 @@ PreserveNewest + + PreserveNewest + diff --git a/Flow.Launcher/Resources/double_pinyin.json b/Flow.Launcher/Resources/double_pinyin.json new file mode 100644 index 000000000..6b8ae06c0 --- /dev/null +++ b/Flow.Launcher/Resources/double_pinyin.json @@ -0,0 +1,3746 @@ +{ + "XiaoHe": { + "Lv": "lv", + "Lve": "lt", + "Lue": "lt", + "Nv": "nv", + "Nve": "nt", + "Nue": "nt", + "A": "aa", + "O": "oo", + "E": "ee", + "Ai": "ai", + "Ei": "ei", + "Ao": "ao", + "Ou": "ou", + "An": "an", + "En": "en", + "Ang": "ah", + "Eng": "eg", + "Er": "er", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "yc", + "You": "yz", + "Yan": "yj", + "Yin": "yb", + "Yang": "yh", + "Ying": "yk", + "Wu": "wu", + "Wa": "wa", + "Wo": "wo", + "Wai": "wd", + "Wei": "ww", + "Wan": "wj", + "Wen": "wf", + "Wang": "wh", + "Weng": "wg", + "Yu": "yu", + "Yue": "yt", + "Yuan": "yr", + "Yun": "yy", + "Yong": "ys", + "Ba": "ba", + "Bai": "bd", + "Ban": "bj", + "Bang": "bh", + "Bao": "bc", + "Bei": "bw", + "Ben": "bf", + "Beng": "bg", + "Bi": "bi", + "Bian": "bm", + "Biang": "bl", + "Biao": "bn", + "Bie": "bp", + "Bin": "bb", + "Bing": "bk", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "cd", + "Can": "cj", + "Cang": "ch", + "Cao": "cc", + "Ce": "ce", + "Cen": "cf", + "Ceng": "cg", + "Cha": "ia", + "Chai": "id", + "Chan": "ij", + "Chang": "ih", + "Chao": "ic", + "Che": "ie", + "Chen": "if", + "Cheng": "ig", + "Chi": "ii", + "Chong": "is", + "Chou": "iz", + "Chu": "iu", + "Chua": "ix", + "Chuai": "ik", + "Chuan": "ir", + "Chuang": "il", + "Chui": "iv", + "Chun": "iy", + "Chuo": "io", + "Ci": "ci", + "Cong": "cs", + "Cou": "cz", + "Cu": "cu", + "Cuan": "cr", + "Cui": "cv", + "Cun": "cy", + "Cuo": "co", + "Da": "da", + "Dai": "dd", + "Dan": "dj", + "Dang": "dh", + "Dao": "dc", + "De": "de", + "Dei": "dw", + "Den": "df", + "Deng": "dg", + "Di": "di", + "Dia": "dx", + "Dian": "dm", + "Diao": "dn", + "Die": "dp", + "Ding": "dk", + "Diu": "dq", + "Dong": "ds", + "Dou": "dz", + "Du": "du", + "Duan": "dr", + "Dui": "dv", + "Dun": "dy", + "Duo": "do", + "Fa": "fa", + "Fan": "fj", + "Fang": "fh", + "Fei": "fw", + "Fen": "ff", + "Feng": "fg", + "Fiao": "fn", + "Fo": "fo", + "Fou": "fz", + "Fu": "fu", + "Ga": "ga", + "Gai": "gd", + "Gan": "gj", + "Gang": "gh", + "Gao": "gc", + "Ge": "ge", + "Gei": "gw", + "Gen": "gf", + "Geng": "gg", + "Gong": "gs", + "Gou": "gz", + "Gu": "gu", + "Gua": "gx", + "Guai": "gk", + "Guan": "gr", + "Guang": "gl", + "Gui": "gv", + "Gun": "gy", + "Guo": "go", + "Ha": "ha", + "Hai": "hd", + "Han": "hj", + "Hang": "hh", + "Hao": "hc", + "He": "he", + "Hei": "hw", + "Hen": "hf", + "Heng": "hg", + "Hong": "hs", + "Hou": "hz", + "Hu": "hu", + "Hua": "hx", + "Huai": "hk", + "Huan": "hr", + "Huang": "hl", + "Hui": "hv", + "Hun": "hy", + "Huo": "ho", + "Ji": "ji", + "Jia": "jx", + "Jian": "jm", + "Jiang": "jl", + "Jiao": "jn", + "Jie": "jp", + "Jin": "jb", + "Jing": "jk", + "Jiong": "js", + "Jiu": "jq", + "Ju": "ju", + "Juan": "jr", + "Jue": "jt", + "Jun": "jy", + "Ka": "ka", + "Kai": "kd", + "Kan": "kj", + "Kang": "kh", + "Kao": "kc", + "Ke": "ke", + "Ken": "kf", + "Keng": "kg", + "Kong": "ks", + "Kou": "kz", + "Ku": "ku", + "Kua": "kx", + "Kuai": "kk", + "Kuan": "kr", + "Kuang": "kl", + "Kui": "kv", + "Kun": "ky", + "Kuo": "ko", + "La": "la", + "Lai": "ld", + "Lan": "lj", + "Lang": "lh", + "Lao": "lc", + "Le": "le", + "Lei": "lw", + "Leng": "lg", + "Li": "li", + "Lia": "lx", + "Lian": "lm", + "Liang": "ll", + "Liao": "ln", + "Lie": "lp", + "Lin": "lb", + "Ling": "lk", + "Liu": "lq", + "Lo": "lo", + "Long": "ls", + "Lou": "lz", + "Lu": "lu", + "Luan": "lr", + "Lun": "ly", + "Luo": "lo", + "Ma": "ma", + "Mai": "md", + "Man": "mj", + "Mang": "mh", + "Mao": "mc", + "Me": "me", + "Mei": "mw", + "Men": "mf", + "Meng": "mg", + "Mi": "mi", + "Mian": "mm", + "Miao": "mn", + "Mie": "mp", + "Min": "mb", + "Ming": "mk", + "Miu": "mq", + "Mo": "mo", + "Mou": "mz", + "Mu": "mu", + "Na": "na", + "Nai": "nd", + "Nan": "nj", + "Nang": "nh", + "Nao": "nc", + "Ne": "ne", + "Nei": "nw", + "Nen": "nf", + "Neng": "ng", + "Ni": "ni", + "Nian": "nm", + "Niang": "nl", + "Niao": "nn", + "Nie": "np", + "Nin": "nb", + "Ning": "nk", + "Niu": "nq", + "Nong": "ns", + "Nou": "nz", + "Nu": "nu", + "Nuan": "nr", + "Nun": "ny", + "Nuo": "no", + "Pa": "pa", + "Pai": "pd", + "Pan": "pj", + "Pang": "ph", + "Pao": "pc", + "Pei": "pw", + "Pen": "pf", + "Peng": "pg", + "Pi": "pi", + "Pian": "pm", + "Piao": "pn", + "Pie": "pp", + "Pin": "pb", + "Ping": "pk", + "Po": "po", + "Pou": "pz", + "Pu": "pu", + "Qi": "qi", + "Qia": "qx", + "Qian": "qm", + "Qiang": "ql", + "Qiao": "qn", + "Qie": "qp", + "Qin": "qb", + "Qing": "qk", + "Qiong": "qs", + "Qiu": "qq", + "Qu": "qu", + "Quan": "qr", + "Que": "qt", + "Qun": "qy", + "Ran": "rj", + "Rang": "rh", + "Rao": "rc", + "Re": "re", + "Ren": "rf", + "Reng": "rg", + "Ri": "ri", + "Rong": "rs", + "Rou": "rz", + "Ru": "ru", + "Rua": "rx", + "Ruan": "rr", + "Rui": "rv", + "Run": "ry", + "Ruo": "ro", + "Sa": "sa", + "Sai": "sd", + "San": "sj", + "Sang": "sh", + "Sao": "sc", + "Se": "se", + "Sen": "sf", + "Seng": "sg", + "Sha": "ua", + "Shai": "ud", + "Shan": "uj", + "Shang": "uh", + "Shao": "uc", + "She": "ue", + "Shei": "uw", + "Shen": "uf", + "Sheng": "ug", + "Shi": "ui", + "Shou": "uz", + "Shu": "uu", + "Shua": "ux", + "Shuai": "uk", + "Shuan": "ur", + "Shuang": "ul", + "Shui": "uv", + "Shun": "uy", + "Shuo": "uo", + "Si": "si", + "Song": "ss", + "Sou": "sz", + "Su": "su", + "Suan": "sr", + "Sui": "sv", + "Sun": "sy", + "Suo": "so", + "Ta": "ta", + "Tai": "td", + "Tan": "tj", + "Tang": "th", + "Tao": "tc", + "Te": "te", + "Tei": "tw", + "Teng": "tg", + "Ti": "ti", + "Tian": "tm", + "Tiao": "tn", + "Tie": "tp", + "Ting": "tk", + "Tong": "ts", + "Tou": "tz", + "Tu": "tu", + "Tuan": "tr", + "Tui": "tv", + "Tun": "ty", + "Tuo": "to", + "Xi": "xi", + "Xia": "xx", + "Xian": "xm", + "Xiang": "xl", + "Xiao": "xn", + "Xie": "xp", + "Xin": "xb", + "Xing": "xk", + "Xiong": "xs", + "Xiu": "xq", + "Xu": "xu", + "Xuan": "xr", + "Xue": "xt", + "Xun": "xy", + "Za": "za", + "Zai": "zd", + "Zan": "zj", + "Zang": "zh", + "Zao": "zc", + "Ze": "ze", + "Zei": "zw", + "Zen": "zf", + "Zeng": "zg", + "Zha": "va", + "Zhai": "vd", + "Zhan": "vj", + "Zhang": "vh", + "Zhao": "vc", + "Zhe": "ve", + "Zhen": "vf", + "Zheng": "vg", + "Zhi": "vi", + "Zhong": "vs", + "Zhou": "vz", + "Zhu": "vu", + "Zhua": "vx", + "Zhuai": "vk", + "Zhuan": "vr", + "Zhuang": "vl", + "Zhui": "vv", + "Zhun": "vy", + "Zhuo": "vo", + "Zi": "zi", + "Zong": "zs", + "Zou": "zz", + "Zu": "zu", + "Zuan": "zr", + "Zui": "zv", + "Zun": "zy", + "Zuo": "zo" + }, + "ZiRanMa": { + "Lv": "lv", + "Lve": "lt", + "Lue": "lt", + "Nv": "nv", + "Nve": "nt", + "Nue": "nt", + "A": "aa", + "O": "oo", + "E": "ee", + "Ai": "ai", + "Ei": "ei", + "Ao": "ao", + "Ou": "ou", + "An": "an", + "En": "en", + "Ang": "ah", + "Eng": "eg", + "Er": "er", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "yk", + "You": "yb", + "Yan": "yj", + "Yin": "yn", + "Yang": "yh", + "Ying": "yy", + "Wu": "wu", + "Wa": "wa", + "Wo": "wo", + "Wai": "wl", + "Wei": "wz", + "Wan": "wj", + "Wen": "wf", + "Wang": "wh", + "Weng": "wg", + "Yu": "yu", + "Yue": "yt", + "Yuan": "yr", + "Yun": "yp", + "Yong": "ys", + "Ba": "ba", + "Bai": "bl", + "Ban": "bj", + "Bang": "bh", + "Bao": "bk", + "Bei": "bz", + "Ben": "bf", + "Beng": "bg", + "Bi": "bi", + "Bian": "bm", + "Biang": "bd", + "Biao": "bc", + "Bie": "bx", + "Bin": "bn", + "Bing": "by", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "cl", + "Can": "cj", + "Cang": "ch", + "Cao": "ck", + "Ce": "ce", + "Cen": "cf", + "Ceng": "cg", + "Cha": "ia", + "Chai": "il", + "Chan": "ij", + "Chang": "ih", + "Chao": "ik", + "Che": "ie", + "Chen": "if", + "Cheng": "ig", + "Chi": "ii", + "Chong": "is", + "Chou": "ib", + "Chu": "iu", + "Chua": "iw", + "Chuai": "iy", + "Chuan": "ir", + "Chuang": "id", + "Chui": "iv", + "Chun": "ip", + "Chuo": "io", + "Ci": "ci", + "Cong": "cs", + "Cou": "cb", + "Cu": "cu", + "Cuan": "cr", + "Cui": "cv", + "Cun": "cp", + "Cuo": "co", + "Da": "da", + "Dai": "dl", + "Dan": "dj", + "Dang": "dh", + "Dao": "dk", + "De": "de", + "Dei": "dz", + "Den": "df", + "Deng": "dg", + "Di": "di", + "Dia": "dw", + "Dian": "dm", + "Diao": "dc", + "Die": "dx", + "Ding": "dy", + "Diu": "dq", + "Dong": "ds", + "Dou": "db", + "Du": "du", + "Duan": "dr", + "Dui": "dv", + "Dun": "dp", + "Duo": "do", + "Fa": "fa", + "Fan": "fj", + "Fang": "fh", + "Fei": "fz", + "Fen": "ff", + "Feng": "fg", + "Fiao": "fc", + "Fo": "fo", + "Fou": "fb", + "Fu": "fu", + "Ga": "ga", + "Gai": "gl", + "Gan": "gj", + "Gang": "gh", + "Gao": "gk", + "Ge": "ge", + "Gei": "gz", + "Gen": "gf", + "Geng": "gg", + "Gong": "gs", + "Gou": "gb", + "Gu": "gu", + "Gua": "gw", + "Guai": "gy", + "Guan": "gr", + "Guang": "gd", + "Gui": "gv", + "Gun": "gp", + "Guo": "go", + "Ha": "ha", + "Hai": "hl", + "Han": "hj", + "Hang": "hh", + "Hao": "hk", + "He": "he", + "Hei": "hz", + "Hen": "hf", + "Heng": "hg", + "Hong": "hs", + "Hou": "hb", + "Hu": "hu", + "Hua": "hw", + "Huai": "hy", + "Huan": "hr", + "Huang": "hd", + "Hui": "hv", + "Hun": "hp", + "Huo": "ho", + "Ji": "ji", + "Jia": "jw", + "Jian": "jm", + "Jiang": "jd", + "Jiao": "jc", + "Jie": "jx", + "Jin": "jn", + "Jing": "jy", + "Jiong": "js", + "Jiu": "jq", + "Ju": "ju", + "Juan": "jr", + "Jue": "jt", + "Jun": "jp", + "Ka": "ka", + "Kai": "kl", + "Kan": "kj", + "Kang": "kh", + "Kao": "kk", + "Ke": "ke", + "Ken": "kf", + "Keng": "kg", + "Kong": "ks", + "Kou": "kb", + "Ku": "ku", + "Kua": "kw", + "Kuai": "ky", + "Kuan": "kr", + "Kuang": "kd", + "Kui": "kv", + "Kun": "kp", + "Kuo": "ko", + "La": "la", + "Lai": "ll", + "Lan": "lj", + "Lang": "lh", + "Lao": "lk", + "Le": "le", + "Lei": "lz", + "Leng": "lg", + "Li": "li", + "Lia": "lw", + "Lian": "lm", + "Liang": "ld", + "Liao": "lc", + "Lie": "lx", + "Lin": "ln", + "Ling": "ly", + "Liu": "lq", + "Lo": "lo", + "Long": "ls", + "Lou": "lb", + "Lu": "lu", + "Luan": "lr", + "Lun": "lp", + "Luo": "lo", + "Ma": "ma", + "Mai": "ml", + "Man": "mj", + "Mang": "mh", + "Mao": "mk", + "Me": "me", + "Mei": "mz", + "Men": "mf", + "Meng": "mg", + "Mi": "mi", + "Mian": "mm", + "Miao": "mc", + "Mie": "mx", + "Min": "mn", + "Ming": "my", + "Miu": "mq", + "Mo": "mo", + "Mou": "mb", + "Mu": "mu", + "Na": "na", + "Nai": "nl", + "Nan": "nj", + "Nang": "nh", + "Nao": "nk", + "Ne": "ne", + "Nei": "nz", + "Nen": "nf", + "Neng": "ng", + "Ni": "ni", + "Nian": "nm", + "Niang": "nd", + "Niao": "nc", + "Nie": "nx", + "Nin": "nn", + "Ning": "ny", + "Niu": "nq", + "Nong": "ns", + "Nou": "nb", + "Nu": "nu", + "Nuan": "nr", + "Nun": "np", + "Nuo": "no", + "Pa": "pa", + "Pai": "pl", + "Pan": "pj", + "Pang": "ph", + "Pao": "pk", + "Pei": "pz", + "Pen": "pf", + "Peng": "pg", + "Pi": "pi", + "Pian": "pm", + "Piao": "pc", + "Pie": "px", + "Pin": "pn", + "Ping": "py", + "Po": "po", + "Pou": "pb", + "Pu": "pu", + "Qi": "qi", + "Qia": "qw", + "Qian": "qm", + "Qiang": "qd", + "Qiao": "qc", + "Qie": "qx", + "Qin": "qn", + "Qing": "qy", + "Qiong": "qs", + "Qiu": "qq", + "Qu": "qu", + "Quan": "qr", + "Que": "qt", + "Qun": "qp", + "Ran": "rj", + "Rang": "rh", + "Rao": "rk", + "Re": "re", + "Ren": "rf", + "Reng": "rg", + "Ri": "ri", + "Rong": "rs", + "Rou": "rb", + "Ru": "ru", + "Rua": "rw", + "Ruan": "rr", + "Rui": "rv", + "Run": "rp", + "Ruo": "ro", + "Sa": "sa", + "Sai": "sl", + "San": "sj", + "Sang": "sh", + "Sao": "sk", + "Se": "se", + "Sen": "sf", + "Seng": "sg", + "Sha": "ua", + "Shai": "ul", + "Shan": "uj", + "Shang": "uh", + "Shao": "uk", + "She": "ue", + "Shei": "uz", + "Shen": "uf", + "Sheng": "ug", + "Shi": "ui", + "Shou": "ub", + "Shu": "uu", + "Shua": "uw", + "Shuai": "uy", + "Shuan": "ur", + "Shuang": "ud", + "Shui": "uv", + "Shun": "up", + "Shuo": "uo", + "Si": "si", + "Song": "ss", + "Sou": "sb", + "Su": "su", + "Suan": "sr", + "Sui": "sv", + "Sun": "sp", + "Suo": "so", + "Ta": "ta", + "Tai": "tl", + "Tan": "tj", + "Tang": "th", + "Tao": "tk", + "Te": "te", + "Tei": "tz", + "Teng": "tg", + "Ti": "ti", + "Tian": "tm", + "Tiao": "tc", + "Tie": "tx", + "Ting": "ty", + "Tong": "ts", + "Tou": "tb", + "Tu": "tu", + "Tuan": "tr", + "Tui": "tv", + "Tun": "tp", + "Tuo": "to", + "Xi": "xi", + "Xia": "xw", + "Xian": "xm", + "Xiang": "xd", + "Xiao": "xc", + "Xie": "xx", + "Xin": "xn", + "Xing": "xy", + "Xiong": "xs", + "Xiu": "xq", + "Xu": "xu", + "Xuan": "xr", + "Xue": "xt", + "Xun": "xp", + "Za": "za", + "Zai": "zl", + "Zan": "zj", + "Zang": "zh", + "Zao": "zk", + "Ze": "ze", + "Zei": "zz", + "Zen": "zf", + "Zeng": "zg", + "Zha": "va", + "Zhai": "vl", + "Zhan": "vj", + "Zhang": "vh", + "Zhao": "vk", + "Zhe": "ve", + "Zhen": "vf", + "Zheng": "vg", + "Zhi": "vi", + "Zhong": "vs", + "Zhou": "vb", + "Zhu": "vu", + "Zhua": "vw", + "Zhuai": "vy", + "Zhuan": "vr", + "Zhuang": "vd", + "Zhui": "vv", + "Zhun": "vp", + "Zhuo": "vo", + "Zi": "zi", + "Zong": "zs", + "Zou": "zb", + "Zu": "zu", + "Zuan": "zr", + "Zui": "zv", + "Zun": "zp", + "Zuo": "zo" + }, + "WeiRuan": { + "Lv": "ly", + "Lve": "lt", + "Lue": "lt", + "Nv": "ny", + "Nve": "nt", + "Nue": "nt", + "A": "oa", + "O": "oo", + "E": "oe", + "Ai": "ol", + "Ei": "oz", + "Ao": "ok", + "Ou": "ob", + "An": "oj", + "En": "of", + "Ang": "oh", + "Eng": "og", + "Er": "or", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "yk", + "You": "yb", + "Yan": "yj", + "Yin": "yn", + "Yang": "yh", + "Ying": "y;", + "Wu": "wu", + "Wa": "wa", + "Wo": "wo", + "Wai": "wl", + "Wei": "wz", + "Wan": "wj", + "Wen": "wf", + "Wang": "wh", + "Weng": "wg", + "Yu": "yu", + "Yue": "yt", + "Yuan": "yr", + "Yun": "yp", + "Yong": "ys", + "Ba": "ba", + "Bai": "bl", + "Ban": "bj", + "Bang": "bh", + "Bao": "bk", + "Bei": "bz", + "Ben": "bf", + "Beng": "bg", + "Bi": "bi", + "Bian": "bm", + "Biang": "bd", + "Biao": "bc", + "Bie": "bx", + "Bin": "bn", + "Bing": "b;", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "cl", + "Can": "cj", + "Cang": "ch", + "Cao": "ck", + "Ce": "ce", + "Cen": "cf", + "Ceng": "cg", + "Cha": "ia", + "Chai": "il", + "Chan": "ij", + "Chang": "ih", + "Chao": "ik", + "Che": "ie", + "Chen": "if", + "Cheng": "ig", + "Chi": "ii", + "Chong": "is", + "Chou": "ib", + "Chu": "iu", + "Chua": "iw", + "Chuai": "iy", + "Chuan": "ir", + "Chuang": "id", + "Chui": "iv", + "Chun": "ip", + "Chuo": "io", + "Ci": "ci", + "Cong": "cs", + "Cou": "cb", + "Cu": "cu", + "Cuan": "cr", + "Cui": "cv", + "Cun": "cp", + "Cuo": "co", + "Da": "da", + "Dai": "dl", + "Dan": "dj", + "Dang": "dh", + "Dao": "dk", + "De": "de", + "Dei": "dz", + "Den": "df", + "Deng": "dg", + "Di": "di", + "Dia": "dw", + "Dian": "dm", + "Diao": "dc", + "Die": "dx", + "Ding": "d;", + "Diu": "dq", + "Dong": "ds", + "Dou": "db", + "Du": "du", + "Duan": "dr", + "Dui": "dv", + "Dun": "dp", + "Duo": "do", + "Fa": "fa", + "Fan": "fj", + "Fang": "fh", + "Fei": "fz", + "Fen": "ff", + "Feng": "fg", + "Fiao": "fc", + "Fo": "fo", + "Fou": "fb", + "Fu": "fu", + "Ga": "ga", + "Gai": "gl", + "Gan": "gj", + "Gang": "gh", + "Gao": "gk", + "Ge": "ge", + "Gei": "gz", + "Gen": "gf", + "Geng": "gg", + "Gong": "gs", + "Gou": "gb", + "Gu": "gu", + "Gua": "gw", + "Guai": "gy", + "Guan": "gr", + "Guang": "gd", + "Gui": "gv", + "Gun": "gp", + "Guo": "go", + "Ha": "ha", + "Hai": "hl", + "Han": "hj", + "Hang": "hh", + "Hao": "hk", + "He": "he", + "Hei": "hz", + "Hen": "hf", + "Heng": "hg", + "Hong": "hs", + "Hou": "hb", + "Hu": "hu", + "Hua": "hw", + "Huai": "hy", + "Huan": "hr", + "Huang": "hd", + "Hui": "hv", + "Hun": "hp", + "Huo": "ho", + "Ji": "ji", + "Jia": "jw", + "Jian": "jm", + "Jiang": "jd", + "Jiao": "jc", + "Jie": "jx", + "Jin": "jn", + "Jing": "j;", + "Jiong": "js", + "Jiu": "jq", + "Ju": "ju", + "Juan": "jr", + "Jue": "jt", + "Jun": "jp", + "Ka": "ka", + "Kai": "kl", + "Kan": "kj", + "Kang": "kh", + "Kao": "kk", + "Ke": "ke", + "Ken": "kf", + "Keng": "kg", + "Kong": "ks", + "Kou": "kb", + "Ku": "ku", + "Kua": "kw", + "Kuai": "ky", + "Kuan": "kr", + "Kuang": "kd", + "Kui": "kv", + "Kun": "kp", + "Kuo": "ko", + "La": "la", + "Lai": "ll", + "Lan": "lj", + "Lang": "lh", + "Lao": "lk", + "Le": "le", + "Lei": "lz", + "Leng": "lg", + "Li": "li", + "Lia": "lw", + "Lian": "lm", + "Liang": "ld", + "Liao": "lc", + "Lie": "lx", + "Lin": "ln", + "Ling": "l;", + "Liu": "lq", + "Lo": "lo", + "Long": "ls", + "Lou": "lb", + "Lu": "lu", + "Luan": "lr", + "Lun": "lp", + "Luo": "lo", + "Ma": "ma", + "Mai": "ml", + "Man": "mj", + "Mang": "mh", + "Mao": "mk", + "Me": "me", + "Mei": "mz", + "Men": "mf", + "Meng": "mg", + "Mi": "mi", + "Mian": "mm", + "Miao": "mc", + "Mie": "mx", + "Min": "mn", + "Ming": "m;", + "Miu": "mq", + "Mo": "mo", + "Mou": "mb", + "Mu": "mu", + "Na": "na", + "Nai": "nl", + "Nan": "nj", + "Nang": "nh", + "Nao": "nk", + "Ne": "ne", + "Nei": "nz", + "Nen": "nf", + "Neng": "ng", + "Ni": "ni", + "Nian": "nm", + "Niang": "nd", + "Niao": "nc", + "Nie": "nx", + "Nin": "nn", + "Ning": "n;", + "Niu": "nq", + "Nong": "ns", + "Nou": "nb", + "Nu": "nu", + "Nuan": "nr", + "Nun": "np", + "Nuo": "no", + "Pa": "pa", + "Pai": "pl", + "Pan": "pj", + "Pang": "ph", + "Pao": "pk", + "Pei": "pz", + "Pen": "pf", + "Peng": "pg", + "Pi": "pi", + "Pian": "pm", + "Piao": "pc", + "Pie": "px", + "Pin": "pn", + "Ping": "p;", + "Po": "po", + "Pou": "pb", + "Pu": "pu", + "Qi": "qi", + "Qia": "qw", + "Qian": "qm", + "Qiang": "qd", + "Qiao": "qc", + "Qie": "qx", + "Qin": "qn", + "Qing": "q;", + "Qiong": "qs", + "Qiu": "qq", + "Qu": "qu", + "Quan": "qr", + "Que": "qt", + "Qun": "qp", + "Ran": "rj", + "Rang": "rh", + "Rao": "rk", + "Re": "re", + "Ren": "rf", + "Reng": "rg", + "Ri": "ri", + "Rong": "rs", + "Rou": "rb", + "Ru": "ru", + "Rua": "rw", + "Ruan": "rr", + "Rui": "rv", + "Run": "rp", + "Ruo": "ro", + "Sa": "sa", + "Sai": "sl", + "San": "sj", + "Sang": "sh", + "Sao": "sk", + "Se": "se", + "Sen": "sf", + "Seng": "sg", + "Sha": "ua", + "Shai": "ul", + "Shan": "uj", + "Shang": "uh", + "Shao": "uk", + "She": "ue", + "Shei": "uz", + "Shen": "uf", + "Sheng": "ug", + "Shi": "ui", + "Shou": "ub", + "Shu": "uu", + "Shua": "uw", + "Shuai": "uy", + "Shuan": "ur", + "Shuang": "ud", + "Shui": "uv", + "Shun": "up", + "Shuo": "uo", + "Si": "si", + "Song": "ss", + "Sou": "sb", + "Su": "su", + "Suan": "sr", + "Sui": "sv", + "Sun": "sp", + "Suo": "so", + "Ta": "ta", + "Tai": "tl", + "Tan": "tj", + "Tang": "th", + "Tao": "tk", + "Te": "te", + "Tei": "tz", + "Teng": "tg", + "Ti": "ti", + "Tian": "tm", + "Tiao": "tc", + "Tie": "tx", + "Ting": "t;", + "Tong": "ts", + "Tou": "tb", + "Tu": "tu", + "Tuan": "tr", + "Tui": "tv", + "Tun": "tp", + "Tuo": "to", + "Xi": "xi", + "Xia": "xw", + "Xian": "xm", + "Xiang": "xd", + "Xiao": "xc", + "Xie": "xx", + "Xin": "xn", + "Xing": "x;", + "Xiong": "xs", + "Xiu": "xq", + "Xu": "xu", + "Xuan": "xr", + "Xue": "xt", + "Xun": "xp", + "Za": "za", + "Zai": "zl", + "Zan": "zj", + "Zang": "zh", + "Zao": "zk", + "Ze": "ze", + "Zei": "zz", + "Zen": "zf", + "Zeng": "zg", + "Zha": "va", + "Zhai": "vl", + "Zhan": "vj", + "Zhang": "vh", + "Zhao": "vk", + "Zhe": "ve", + "Zhen": "vf", + "Zheng": "vg", + "Zhi": "vi", + "Zhong": "vs", + "Zhou": "vb", + "Zhu": "vu", + "Zhua": "vw", + "Zhuai": "vy", + "Zhuan": "vr", + "Zhuang": "vd", + "Zhui": "vv", + "Zhun": "vp", + "Zhuo": "vo", + "Zi": "zi", + "Zong": "zs", + "Zou": "zb", + "Zu": "zu", + "Zuan": "zr", + "Zui": "zv", + "Zun": "zp", + "Zuo": "zo" + }, + "ZhiNengABC": { + "Lv": "lv", + "Lve": "lm", + "Lue": "lm", + "Nv": "nv", + "Nve": "nm", + "Nue": "nm", + "A": "oa", + "O": "oo", + "E": "oe", + "Ai": "ol", + "Ei": "oq", + "Ao": "ok", + "Ou": "ob", + "An": "oj", + "En": "of", + "Ang": "oh", + "Eng": "og", + "Er": "or", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "yk", + "You": "yb", + "Yan": "yj", + "Yin": "yc", + "Yang": "yh", + "Ying": "yy", + "Wu": "wu", + "Wa": "wa", + "Wo": "wo", + "Wai": "wl", + "Wei": "wq", + "Wan": "wj", + "Wen": "wf", + "Wang": "wh", + "Weng": "wg", + "Yu": "yu", + "Yue": "ym", + "Yuan": "yp", + "Yun": "yn", + "Yong": "ys", + "Ba": "ba", + "Bai": "bl", + "Ban": "bj", + "Bang": "bh", + "Bao": "bk", + "Bei": "bq", + "Ben": "bf", + "Beng": "bg", + "Bi": "bi", + "Bian": "bw", + "Biang": "bt", + "Biao": "bz", + "Bie": "bx", + "Bin": "bc", + "Bing": "by", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "cl", + "Can": "cj", + "Cang": "ch", + "Cao": "ck", + "Ce": "ce", + "Cen": "cf", + "Ceng": "cg", + "Cha": "ea", + "Chai": "el", + "Chan": "ej", + "Chang": "eh", + "Chao": "ek", + "Che": "ee", + "Chen": "ef", + "Cheng": "eg", + "Chi": "ei", + "Chong": "es", + "Chou": "eb", + "Chu": "eu", + "Chua": "ed", + "Chuai": "ec", + "Chuan": "ep", + "Chuang": "et", + "Chui": "em", + "Chun": "en", + "Chuo": "eo", + "Ci": "ci", + "Cong": "cs", + "Cou": "cb", + "Cu": "cu", + "Cuan": "cp", + "Cui": "cm", + "Cun": "cn", + "Cuo": "co", + "Da": "da", + "Dai": "dl", + "Dan": "dj", + "Dang": "dh", + "Dao": "dk", + "De": "de", + "Dei": "dq", + "Den": "df", + "Deng": "dg", + "Di": "di", + "Dia": "dd", + "Dian": "dw", + "Diao": "dz", + "Die": "dx", + "Ding": "dy", + "Diu": "dr", + "Dong": "ds", + "Dou": "db", + "Du": "du", + "Duan": "dp", + "Dui": "dm", + "Dun": "dn", + "Duo": "do", + "Fa": "fa", + "Fan": "fj", + "Fang": "fh", + "Fei": "fq", + "Fen": "ff", + "Feng": "fg", + "Fiao": "fz", + "Fo": "fo", + "Fou": "fb", + "Fu": "fu", + "Ga": "ga", + "Gai": "gl", + "Gan": "gj", + "Gang": "gh", + "Gao": "gk", + "Ge": "ge", + "Gei": "gq", + "Gen": "gf", + "Geng": "gg", + "Gong": "gs", + "Gou": "gb", + "Gu": "gu", + "Gua": "gd", + "Guai": "gc", + "Guan": "gp", + "Guang": "gt", + "Gui": "gm", + "Gun": "gn", + "Guo": "go", + "Ha": "ha", + "Hai": "hl", + "Han": "hj", + "Hang": "hh", + "Hao": "hk", + "He": "he", + "Hei": "hq", + "Hen": "hf", + "Heng": "hg", + "Hong": "hs", + "Hou": "hb", + "Hu": "hu", + "Hua": "hd", + "Huai": "hc", + "Huan": "hp", + "Huang": "ht", + "Hui": "hm", + "Hun": "hn", + "Huo": "ho", + "Ji": "ji", + "Jia": "jd", + "Jian": "jw", + "Jiang": "jt", + "Jiao": "jz", + "Jie": "jx", + "Jin": "jc", + "Jing": "jy", + "Jiong": "js", + "Jiu": "jr", + "Ju": "ju", + "Juan": "jp", + "Jue": "jm", + "Jun": "jn", + "Ka": "ka", + "Kai": "kl", + "Kan": "kj", + "Kang": "kh", + "Kao": "kk", + "Ke": "ke", + "Ken": "kf", + "Keng": "kg", + "Kong": "ks", + "Kou": "kb", + "Ku": "ku", + "Kua": "kd", + "Kuai": "kc", + "Kuan": "kp", + "Kuang": "kt", + "Kui": "km", + "Kun": "kn", + "Kuo": "ko", + "La": "la", + "Lai": "ll", + "Lan": "lj", + "Lang": "lh", + "Lao": "lk", + "Le": "le", + "Lei": "lq", + "Leng": "lg", + "Li": "li", + "Lia": "ld", + "Lian": "lw", + "Liang": "lt", + "Liao": "lz", + "Lie": "lx", + "Lin": "lc", + "Ling": "ly", + "Liu": "lr", + "Lo": "lo", + "Long": "ls", + "Lou": "lb", + "Lu": "lu", + "Luan": "lp", + "Lun": "ln", + "Luo": "lo", + "Ma": "ma", + "Mai": "ml", + "Man": "mj", + "Mang": "mh", + "Mao": "mk", + "Me": "me", + "Mei": "mq", + "Men": "mf", + "Meng": "mg", + "Mi": "mi", + "Mian": "mw", + "Miao": "mz", + "Mie": "mx", + "Min": "mc", + "Ming": "my", + "Miu": "mr", + "Mo": "mo", + "Mou": "mb", + "Mu": "mu", + "Na": "na", + "Nai": "nl", + "Nan": "nj", + "Nang": "nh", + "Nao": "nk", + "Ne": "ne", + "Nei": "nq", + "Nen": "nf", + "Neng": "ng", + "Ni": "ni", + "Nian": "nw", + "Niang": "nt", + "Niao": "nz", + "Nie": "nx", + "Nin": "nc", + "Ning": "ny", + "Niu": "nr", + "Nong": "ns", + "Nou": "nb", + "Nu": "nu", + "Nuan": "np", + "Nun": "nn", + "Nuo": "no", + "Pa": "pa", + "Pai": "pl", + "Pan": "pj", + "Pang": "ph", + "Pao": "pk", + "Pei": "pq", + "Pen": "pf", + "Peng": "pg", + "Pi": "pi", + "Pian": "pw", + "Piao": "pz", + "Pie": "px", + "Pin": "pc", + "Ping": "py", + "Po": "po", + "Pou": "pb", + "Pu": "pu", + "Qi": "qi", + "Qia": "qd", + "Qian": "qw", + "Qiang": "qt", + "Qiao": "qz", + "Qie": "qx", + "Qin": "qc", + "Qing": "qy", + "Qiong": "qs", + "Qiu": "qr", + "Qu": "qu", + "Quan": "qp", + "Que": "qm", + "Qun": "qn", + "Ran": "rj", + "Rang": "rh", + "Rao": "rk", + "Re": "re", + "Ren": "rf", + "Reng": "rg", + "Ri": "ri", + "Rong": "rs", + "Rou": "rb", + "Ru": "ru", + "Rua": "rd", + "Ruan": "rp", + "Rui": "rm", + "Run": "rn", + "Ruo": "ro", + "Sa": "sa", + "Sai": "sl", + "San": "sj", + "Sang": "sh", + "Sao": "sk", + "Se": "se", + "Sen": "sf", + "Seng": "sg", + "Sha": "va", + "Shai": "vl", + "Shan": "vj", + "Shang": "vh", + "Shao": "vk", + "She": "ve", + "Shei": "vq", + "Shen": "vf", + "Sheng": "vg", + "Shi": "vi", + "Shou": "vb", + "Shu": "vu", + "Shua": "vd", + "Shuai": "vc", + "Shuan": "vp", + "Shuang": "vt", + "Shui": "vm", + "Shun": "vn", + "Shuo": "vo", + "Si": "si", + "Song": "ss", + "Sou": "sb", + "Su": "su", + "Suan": "sp", + "Sui": "sm", + "Sun": "sn", + "Suo": "so", + "Ta": "ta", + "Tai": "tl", + "Tan": "tj", + "Tang": "th", + "Tao": "tk", + "Te": "te", + "Tei": "tq", + "Teng": "tg", + "Ti": "ti", + "Tian": "tw", + "Tiao": "tz", + "Tie": "tx", + "Ting": "ty", + "Tong": "ts", + "Tou": "tb", + "Tu": "tu", + "Tuan": "tp", + "Tui": "tm", + "Tun": "tn", + "Tuo": "to", + "Xi": "xi", + "Xia": "xd", + "Xian": "xw", + "Xiang": "xt", + "Xiao": "xz", + "Xie": "xx", + "Xin": "xc", + "Xing": "xy", + "Xiong": "xs", + "Xiu": "xr", + "Xu": "xu", + "Xuan": "xp", + "Xue": "xm", + "Xun": "xn", + "Za": "za", + "Zai": "zl", + "Zan": "zj", + "Zang": "zh", + "Zao": "zk", + "Ze": "ze", + "Zei": "zq", + "Zen": "zf", + "Zeng": "zg", + "Zha": "aa", + "Zhai": "al", + "Zhan": "aj", + "Zhang": "ah", + "Zhao": "ak", + "Zhe": "ae", + "Zhen": "af", + "Zheng": "ag", + "Zhi": "ai", + "Zhong": "as", + "Zhou": "ab", + "Zhu": "au", + "Zhua": "ad", + "Zhuai": "ac", + "Zhuan": "ap", + "Zhuang": "at", + "Zhui": "am", + "Zhun": "an", + "Zhuo": "ao", + "Zi": "zi", + "Zong": "zs", + "Zou": "zb", + "Zu": "zu", + "Zuan": "zp", + "Zui": "zm", + "Zun": "zn", + "Zuo": "zo" + }, + "ZiGuangPinYin": { + "Lv": "lv", + "Lve": "ln", + "Lue": "ln", + "Nv": "nv", + "Nve": "nn", + "Nue": "nn", + "A": "oa", + "O": "oo", + "E": "oe", + "Ai": "op", + "Ei": "ok", + "Ao": "oq", + "Ou": "oz", + "An": "or", + "En": "ow", + "Ang": "os", + "Eng": "ot", + "Er": "oj", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "yq", + "You": "yz", + "Yan": "yr", + "Yin": "yy", + "Yang": "ys", + "Ying": "yc", + "Wu": "wu", + "Wa": "wa", + "Wo": "wo", + "Wai": "wp", + "Wei": "wk", + "Wan": "wr", + "Wen": "ww", + "Wang": "ws", + "Weng": "wt", + "Yu": "yu", + "Yue": "yn", + "Yuan": "yl", + "Yun": "ym", + "Yong": "yh", + "Ba": "ba", + "Bai": "bp", + "Ban": "br", + "Bang": "bs", + "Bao": "bq", + "Bei": "bk", + "Ben": "bw", + "Beng": "bt", + "Bi": "bi", + "Bian": "bf", + "Biang": "bg", + "Biao": "bb", + "Bie": "bd", + "Bin": "by", + "Bing": "bc", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "cp", + "Can": "cr", + "Cang": "cs", + "Cao": "cq", + "Ce": "ce", + "Cen": "cw", + "Ceng": "ct", + "Cha": "aa", + "Chai": "ap", + "Chan": "ar", + "Chang": "as", + "Chao": "aq", + "Che": "ae", + "Chen": "aw", + "Cheng": "at", + "Chi": "ai", + "Chong": "ah", + "Chou": "az", + "Chu": "au", + "Chua": "ax", + "Chuai": "ay", + "Chuan": "al", + "Chuang": "ag", + "Chui": "an", + "Chun": "am", + "Chuo": "ao", + "Ci": "ci", + "Cong": "ch", + "Cou": "cz", + "Cu": "cu", + "Cuan": "cl", + "Cui": "cn", + "Cun": "cm", + "Cuo": "co", + "Da": "da", + "Dai": "dp", + "Dan": "dr", + "Dang": "ds", + "Dao": "dq", + "De": "de", + "Dei": "dk", + "Den": "dw", + "Deng": "dt", + "Di": "di", + "Dia": "dx", + "Dian": "df", + "Diao": "db", + "Die": "dd", + "Ding": "dc", + "Diu": "dj", + "Dong": "dh", + "Dou": "dz", + "Du": "du", + "Duan": "dl", + "Dui": "dn", + "Dun": "dm", + "Duo": "do", + "Fa": "fa", + "Fan": "fr", + "Fang": "fs", + "Fei": "fk", + "Fen": "fw", + "Feng": "ft", + "Fiao": "fb", + "Fo": "fo", + "Fou": "fz", + "Fu": "fu", + "Ga": "ga", + "Gai": "gp", + "Gan": "gr", + "Gang": "gs", + "Gao": "gq", + "Ge": "ge", + "Gei": "gk", + "Gen": "gw", + "Geng": "gt", + "Gong": "gh", + "Gou": "gz", + "Gu": "gu", + "Gua": "gx", + "Guai": "gy", + "Guan": "gl", + "Guang": "gg", + "Gui": "gn", + "Gun": "gm", + "Guo": "go", + "Ha": "ha", + "Hai": "hp", + "Han": "hr", + "Hang": "hs", + "Hao": "hq", + "He": "he", + "Hei": "hk", + "Hen": "hw", + "Heng": "ht", + "Hong": "hh", + "Hou": "hz", + "Hu": "hu", + "Hua": "hx", + "Huai": "hy", + "Huan": "hl", + "Huang": "hg", + "Hui": "hn", + "Hun": "hm", + "Huo": "ho", + "Ji": "ji", + "Jia": "jx", + "Jian": "jf", + "Jiang": "jg", + "Jiao": "jb", + "Jie": "jd", + "Jin": "jy", + "Jing": "jc", + "Jiong": "jh", + "Jiu": "jj", + "Ju": "ju", + "Juan": "jl", + "Jue": "jn", + "Jun": "jm", + "Ka": "ka", + "Kai": "kp", + "Kan": "kr", + "Kang": "ks", + "Kao": "kq", + "Ke": "ke", + "Ken": "kw", + "Keng": "kt", + "Kong": "kh", + "Kou": "kz", + "Ku": "ku", + "Kua": "kx", + "Kuai": "ky", + "Kuan": "kl", + "Kuang": "kg", + "Kui": "kn", + "Kun": "km", + "Kuo": "ko", + "La": "la", + "Lai": "lp", + "Lan": "lr", + "Lang": "ls", + "Lao": "lq", + "Le": "le", + "Lei": "lk", + "Leng": "lt", + "Li": "li", + "Lia": "lx", + "Lian": "lf", + "Liang": "lg", + "Liao": "lb", + "Lie": "ld", + "Lin": "ly", + "Ling": "lc", + "Liu": "lj", + "Lo": "lo", + "Long": "lh", + "Lou": "lz", + "Lu": "lu", + "Luan": "ll", + "Lun": "lm", + "Luo": "lo", + "Ma": "ma", + "Mai": "mp", + "Man": "mr", + "Mang": "ms", + "Mao": "mq", + "Me": "me", + "Mei": "mk", + "Men": "mw", + "Meng": "mt", + "Mi": "mi", + "Mian": "mf", + "Miao": "mb", + "Mie": "md", + "Min": "my", + "Ming": "mc", + "Miu": "mj", + "Mo": "mo", + "Mou": "mz", + "Mu": "mu", + "Na": "na", + "Nai": "np", + "Nan": "nr", + "Nang": "ns", + "Nao": "nq", + "Ne": "ne", + "Nei": "nk", + "Nen": "nw", + "Neng": "nt", + "Ni": "ni", + "Nian": "nf", + "Niang": "ng", + "Niao": "nb", + "Nie": "nd", + "Nin": "ny", + "Ning": "nc", + "Niu": "nj", + "Nong": "nh", + "Nou": "nz", + "Nu": "nu", + "Nuan": "nl", + "Nun": "nm", + "Nuo": "no", + "Pa": "pa", + "Pai": "pp", + "Pan": "pr", + "Pang": "ps", + "Pao": "pq", + "Pei": "pk", + "Pen": "pw", + "Peng": "pt", + "Pi": "pi", + "Pian": "pf", + "Piao": "pb", + "Pie": "pd", + "Pin": "py", + "Ping": "pc", + "Po": "po", + "Pou": "pz", + "Pu": "pu", + "Qi": "qi", + "Qia": "qx", + "Qian": "qf", + "Qiang": "qg", + "Qiao": "qb", + "Qie": "qd", + "Qin": "qy", + "Qing": "qc", + "Qiong": "qh", + "Qiu": "qj", + "Qu": "qu", + "Quan": "ql", + "Que": "qn", + "Qun": "qm", + "Ran": "rr", + "Rang": "rs", + "Rao": "rq", + "Re": "re", + "Ren": "rw", + "Reng": "rt", + "Ri": "ri", + "Rong": "rh", + "Rou": "rz", + "Ru": "ru", + "Rua": "rx", + "Ruan": "rl", + "Rui": "rn", + "Run": "rm", + "Ruo": "ro", + "Sa": "sa", + "Sai": "sp", + "San": "sr", + "Sang": "ss", + "Sao": "sq", + "Se": "se", + "Sen": "sw", + "Seng": "st", + "Sha": "ia", + "Shai": "ip", + "Shan": "ir", + "Shang": "is", + "Shao": "iq", + "She": "ie", + "Shei": "ik", + "Shen": "iw", + "Sheng": "it", + "Shi": "ii", + "Shou": "iz", + "Shu": "iu", + "Shua": "ix", + "Shuai": "iy", + "Shuan": "il", + "Shuang": "ig", + "Shui": "in", + "Shun": "im", + "Shuo": "io", + "Si": "si", + "Song": "sh", + "Sou": "sz", + "Su": "su", + "Suan": "sl", + "Sui": "sn", + "Sun": "sm", + "Suo": "so", + "Ta": "ta", + "Tai": "tp", + "Tan": "tr", + "Tang": "ts", + "Tao": "tq", + "Te": "te", + "Tei": "tk", + "Teng": "tt", + "Ti": "ti", + "Tian": "tf", + "Tiao": "tb", + "Tie": "td", + "Ting": "tc", + "Tong": "th", + "Tou": "tz", + "Tu": "tu", + "Tuan": "tl", + "Tui": "tn", + "Tun": "tm", + "Tuo": "to", + "Xi": "xi", + "Xia": "xx", + "Xian": "xf", + "Xiang": "xg", + "Xiao": "xb", + "Xie": "xd", + "Xin": "xy", + "Xing": "xc", + "Xiong": "xh", + "Xiu": "xj", + "Xu": "xu", + "Xuan": "xl", + "Xue": "xn", + "Xun": "xm", + "Za": "za", + "Zai": "zp", + "Zan": "zr", + "Zang": "zs", + "Zao": "zq", + "Ze": "ze", + "Zei": "zk", + "Zen": "zw", + "Zeng": "zt", + "Zha": "ua", + "Zhai": "up", + "Zhan": "ur", + "Zhang": "us", + "Zhao": "uq", + "Zhe": "ue", + "Zhen": "uw", + "Zheng": "ut", + "Zhi": "ui", + "Zhong": "uh", + "Zhou": "uz", + "Zhu": "uu", + "Zhua": "ux", + "Zhuai": "uy", + "Zhuan": "ul", + "Zhuang": "ug", + "Zhui": "un", + "Zhun": "um", + "Zhuo": "uo", + "Zi": "zi", + "Zong": "zh", + "Zou": "zz", + "Zu": "zu", + "Zuan": "zl", + "Zui": "zn", + "Zun": "zm", + "Zuo": "zo" + }, + "PinYinJiaJia": { + "Lv": "lv", + "Lve": "lx", + "Lue": "lx", + "Nv": "nv", + "Nve": "nx", + "Nue": "nx", + "A": "aa", + "O": "oo", + "E": "ee", + "Ai": "as", + "Ei": "ew", + "Ao": "ad", + "Ou": "op", + "An": "af", + "En": "er", + "Ang": "ag", + "Eng": "et", + "Er": "eq", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "yd", + "You": "yp", + "Yan": "yf", + "Yin": "yl", + "Yang": "yg", + "Ying": "yq", + "Wu": "wu", + "Wa": "wa", + "Wo": "wo", + "Wai": "ws", + "Wei": "ww", + "Wan": "wf", + "Wen": "wr", + "Wang": "wg", + "Weng": "wt", + "Yu": "yu", + "Yue": "yx", + "Yuan": "yc", + "Yun": "yz", + "Yong": "yy", + "Ba": "ba", + "Bai": "bs", + "Ban": "bf", + "Bang": "bg", + "Bao": "bd", + "Bei": "bw", + "Ben": "br", + "Beng": "bt", + "Bi": "bi", + "Bian": "bj", + "Biang": "bh", + "Biao": "bk", + "Bie": "bm", + "Bin": "bl", + "Bing": "bq", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "cs", + "Can": "cf", + "Cang": "cg", + "Cao": "cd", + "Ce": "ce", + "Cen": "cr", + "Ceng": "ct", + "Cha": "ua", + "Chai": "us", + "Chan": "uf", + "Chang": "ug", + "Chao": "ud", + "Che": "ue", + "Chen": "ur", + "Cheng": "ut", + "Chi": "ui", + "Chong": "uy", + "Chou": "up", + "Chu": "uu", + "Chua": "ub", + "Chuai": "ux", + "Chuan": "uc", + "Chuang": "uh", + "Chui": "uv", + "Chun": "uz", + "Chuo": "uo", + "Ci": "ci", + "Cong": "cy", + "Cou": "cp", + "Cu": "cu", + "Cuan": "cc", + "Cui": "cv", + "Cun": "cz", + "Cuo": "co", + "Da": "da", + "Dai": "ds", + "Dan": "df", + "Dang": "dg", + "Dao": "dd", + "De": "de", + "Dei": "dw", + "Den": "dr", + "Deng": "dt", + "Di": "di", + "Dia": "db", + "Dian": "dj", + "Diao": "dk", + "Die": "dm", + "Ding": "dq", + "Diu": "dn", + "Dong": "dy", + "Dou": "dp", + "Du": "du", + "Duan": "dc", + "Dui": "dv", + "Dun": "dz", + "Duo": "do", + "Fa": "fa", + "Fan": "ff", + "Fang": "fg", + "Fei": "fw", + "Fen": "fr", + "Feng": "ft", + "Fiao": "fk", + "Fo": "fo", + "Fou": "fp", + "Fu": "fu", + "Ga": "ga", + "Gai": "gs", + "Gan": "gf", + "Gang": "gg", + "Gao": "gd", + "Ge": "ge", + "Gei": "gw", + "Gen": "gr", + "Geng": "gt", + "Gong": "gy", + "Gou": "gp", + "Gu": "gu", + "Gua": "gb", + "Guai": "gx", + "Guan": "gc", + "Guang": "gh", + "Gui": "gv", + "Gun": "gz", + "Guo": "go", + "Ha": "ha", + "Hai": "hs", + "Han": "hf", + "Hang": "hg", + "Hao": "hd", + "He": "he", + "Hei": "hw", + "Hen": "hr", + "Heng": "ht", + "Hong": "hy", + "Hou": "hp", + "Hu": "hu", + "Hua": "hb", + "Huai": "hx", + "Huan": "hc", + "Huang": "hh", + "Hui": "hv", + "Hun": "hz", + "Huo": "ho", + "Ji": "ji", + "Jia": "jb", + "Jian": "jj", + "Jiang": "jh", + "Jiao": "jk", + "Jie": "jm", + "Jin": "jl", + "Jing": "jq", + "Jiong": "jy", + "Jiu": "jn", + "Ju": "ju", + "Juan": "jc", + "Jue": "jx", + "Jun": "jz", + "Ka": "ka", + "Kai": "ks", + "Kan": "kf", + "Kang": "kg", + "Kao": "kd", + "Ke": "ke", + "Ken": "kr", + "Keng": "kt", + "Kong": "ky", + "Kou": "kp", + "Ku": "ku", + "Kua": "kb", + "Kuai": "kx", + "Kuan": "kc", + "Kuang": "kh", + "Kui": "kv", + "Kun": "kz", + "Kuo": "ko", + "La": "la", + "Lai": "ls", + "Lan": "lf", + "Lang": "lg", + "Lao": "ld", + "Le": "le", + "Lei": "lw", + "Leng": "lt", + "Li": "li", + "Lia": "lb", + "Lian": "lj", + "Liang": "lh", + "Liao": "lk", + "Lie": "lm", + "Lin": "ll", + "Ling": "lq", + "Liu": "ln", + "Lo": "lo", + "Long": "ly", + "Lou": "lp", + "Lu": "lu", + "Luan": "lc", + "Lun": "lz", + "Luo": "lo", + "Ma": "ma", + "Mai": "ms", + "Man": "mf", + "Mang": "mg", + "Mao": "md", + "Me": "me", + "Mei": "mw", + "Men": "mr", + "Meng": "mt", + "Mi": "mi", + "Mian": "mj", + "Miao": "mk", + "Mie": "mm", + "Min": "ml", + "Ming": "mq", + "Miu": "mn", + "Mo": "mo", + "Mou": "mp", + "Mu": "mu", + "Na": "na", + "Nai": "ns", + "Nan": "nf", + "Nang": "ng", + "Nao": "nd", + "Ne": "ne", + "Nei": "nw", + "Nen": "nr", + "Neng": "nt", + "Ni": "ni", + "Nian": "nj", + "Niang": "nh", + "Niao": "nk", + "Nie": "nm", + "Nin": "nl", + "Ning": "nq", + "Niu": "nn", + "Nong": "ny", + "Nou": "np", + "Nu": "nu", + "Nuan": "nc", + "Nun": "nz", + "Nuo": "no", + "Pa": "pa", + "Pai": "ps", + "Pan": "pf", + "Pang": "pg", + "Pao": "pd", + "Pei": "pw", + "Pen": "pr", + "Peng": "pt", + "Pi": "pi", + "Pian": "pj", + "Piao": "pk", + "Pie": "pm", + "Pin": "pl", + "Ping": "pq", + "Po": "po", + "Pou": "pp", + "Pu": "pu", + "Qi": "qi", + "Qia": "qb", + "Qian": "qj", + "Qiang": "qh", + "Qiao": "qk", + "Qie": "qm", + "Qin": "ql", + "Qing": "qq", + "Qiong": "qy", + "Qiu": "qn", + "Qu": "qu", + "Quan": "qc", + "Que": "qx", + "Qun": "qz", + "Ran": "rf", + "Rang": "rg", + "Rao": "rd", + "Re": "re", + "Ren": "rr", + "Reng": "rt", + "Ri": "ri", + "Rong": "ry", + "Rou": "rp", + "Ru": "ru", + "Rua": "rb", + "Ruan": "rc", + "Rui": "rv", + "Run": "rz", + "Ruo": "ro", + "Sa": "sa", + "Sai": "ss", + "San": "sf", + "Sang": "sg", + "Sao": "sd", + "Se": "se", + "Sen": "sr", + "Seng": "st", + "Sha": "ia", + "Shai": "is", + "Shan": "if", + "Shang": "ig", + "Shao": "id", + "She": "ie", + "Shei": "iw", + "Shen": "ir", + "Sheng": "it", + "Shi": "ii", + "Shou": "ip", + "Shu": "iu", + "Shua": "ib", + "Shuai": "ix", + "Shuan": "ic", + "Shuang": "ih", + "Shui": "iv", + "Shun": "iz", + "Shuo": "io", + "Si": "si", + "Song": "sy", + "Sou": "sp", + "Su": "su", + "Suan": "sc", + "Sui": "sv", + "Sun": "sz", + "Suo": "so", + "Ta": "ta", + "Tai": "ts", + "Tan": "tf", + "Tang": "tg", + "Tao": "td", + "Te": "te", + "Tei": "tw", + "Teng": "tt", + "Ti": "ti", + "Tian": "tj", + "Tiao": "tk", + "Tie": "tm", + "Ting": "tq", + "Tong": "ty", + "Tou": "tp", + "Tu": "tu", + "Tuan": "tc", + "Tui": "tv", + "Tun": "tz", + "Tuo": "to", + "Xi": "xi", + "Xia": "xb", + "Xian": "xj", + "Xiang": "xh", + "Xiao": "xk", + "Xie": "xm", + "Xin": "xl", + "Xing": "xq", + "Xiong": "xy", + "Xiu": "xn", + "Xu": "xu", + "Xuan": "xc", + "Xue": "xx", + "Xun": "xz", + "Za": "za", + "Zai": "zs", + "Zan": "zf", + "Zang": "zg", + "Zao": "zd", + "Ze": "ze", + "Zei": "zw", + "Zen": "zr", + "Zeng": "zt", + "Zha": "va", + "Zhai": "vs", + "Zhan": "vf", + "Zhang": "vg", + "Zhao": "vd", + "Zhe": "ve", + "Zhen": "vr", + "Zheng": "vt", + "Zhi": "vi", + "Zhong": "vy", + "Zhou": "vp", + "Zhu": "vu", + "Zhua": "vb", + "Zhuai": "vx", + "Zhuan": "vc", + "Zhuang": "vh", + "Zhui": "vv", + "Zhun": "vz", + "Zhuo": "vo", + "Zi": "zi", + "Zong": "zy", + "Zou": "zp", + "Zu": "zu", + "Zuan": "zc", + "Zui": "zv", + "Zun": "zz", + "Zuo": "zo" + }, + "XingKongJianDao": { + "Lv": "lv", + "Lve": "ly", + "Lue": "ly", + "Nv": "nv", + "Nve": "ny", + "Nue": "ny", + "A": "xa", + "O": "xo", + "E": "xe", + "Ai": "xj", + "Ei": "xw", + "Ao": "xs", + "Ou": "xt", + "An": "xd", + "En": "xk", + "Ang": "xf", + "Eng": "xh", + "Er": "xu", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "ys", + "You": "yt", + "Yan": "yd", + "Yin": "yb", + "Yang": "yf", + "Ying": "yg", + "Wu": "wj", + "Wa": "ws", + "Wo": "wo", + "Wai": "wh", + "Wei": "ww", + "Wan": "wf", + "Wen": "wn", + "Wang": "wp", + "Weng": "wr", + "Yu": "yv", + "Yue": "yy", + "Yuan": "yr", + "Yun": "yw", + "Yong": "yl", + "Ba": "ba", + "Bai": "bj", + "Ban": "bd", + "Bang": "bf", + "Bao": "bs", + "Bei": "bw", + "Ben": "bk", + "Beng": "bh", + "Bi": "bi", + "Bian": "bm", + "Biang": "bx", + "Biao": "bp", + "Bie": "bc", + "Bin": "bb", + "Bing": "bg", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "cj", + "Can": "cd", + "Cang": "cf", + "Cao": "cs", + "Ce": "ce", + "Cen": "ck", + "Ceng": "ch", + "Cha": "ja", + "Chai": "jj", + "Chan": "jd", + "Chang": "jf", + "Chao": "js", + "Che": "je", + "Chen": "jk", + "Cheng": "jh", + "Chi": "wi", + "Chong": "wl", + "Chou": "jt", + "Chu": "ju", + "Chua": "wx", + "Chuai": "wg", + "Chuan": "wr", + "Chuang": "wn", + "Chui": "wy", + "Chun": "jz", + "Chuo": "jo", + "Ci": "ci", + "Cong": "cl", + "Cou": "ct", + "Cu": "cu", + "Cuan": "cr", + "Cui": "cy", + "Cun": "cz", + "Cuo": "co", + "Da": "da", + "Dai": "dj", + "Dan": "dd", + "Dang": "df", + "Dao": "ds", + "De": "de", + "Dei": "dw", + "Den": "dk", + "Deng": "dh", + "Di": "di", + "Dia": "dx", + "Dian": "dm", + "Diao": "dp", + "Die": "dc", + "Ding": "dg", + "Diu": "dq", + "Dong": "dl", + "Dou": "dt", + "Du": "du", + "Duan": "dr", + "Dui": "dy", + "Dun": "dz", + "Duo": "do", + "Fa": "fs", + "Fan": "ff", + "Fang": "fp", + "Fei": "fw", + "Fen": "fn", + "Feng": "fr", + "Fiao": "fp", + "Fo": "fl", + "Fou": "fd", + "Fu": "fl", + "Ga": "ga", + "Gai": "gj", + "Gan": "gd", + "Gang": "gf", + "Gao": "gs", + "Ge": "ge", + "Gei": "gw", + "Gen": "gk", + "Geng": "gh", + "Gong": "gl", + "Gou": "gt", + "Gu": "gu", + "Gua": "gx", + "Guai": "gg", + "Guan": "gr", + "Guang": "gn", + "Gui": "gy", + "Gun": "gz", + "Guo": "go", + "Ha": "ha", + "Hai": "hj", + "Han": "hd", + "Hang": "hf", + "Hao": "hs", + "He": "he", + "Hei": "hw", + "Hen": "hk", + "Heng": "hh", + "Hong": "hl", + "Hou": "ht", + "Hu": "hu", + "Hua": "hx", + "Huai": "hg", + "Huan": "hr", + "Huang": "hn", + "Hui": "hy", + "Hun": "hz", + "Huo": "ho", + "Ji": "jk", + "Jia": "js", + "Jian": "jm", + "Jiang": "jn", + "Jiao": "jp", + "Jie": "jc", + "Jin": "jb", + "Jing": "jg", + "Jiong": "jy", + "Jiu": "jq", + "Ju": "jv", + "Juan": "jt", + "Jue": "jh", + "Jun": "jw", + "Ka": "ka", + "Kai": "kj", + "Kan": "kd", + "Kang": "kf", + "Kao": "ks", + "Ke": "ke", + "Ken": "kk", + "Keng": "kh", + "Kong": "kl", + "Kou": "kt", + "Ku": "ku", + "Kua": "kx", + "Kuai": "kg", + "Kuan": "kr", + "Kuang": "kn", + "Kui": "ky", + "Kun": "kz", + "Kuo": "ko", + "La": "la", + "Lai": "lj", + "Lan": "ld", + "Lang": "lf", + "Lao": "ls", + "Le": "le", + "Lei": "lw", + "Leng": "lh", + "Li": "li", + "Lia": "lx", + "Lian": "lm", + "Liang": "ln", + "Liao": "lp", + "Lie": "lc", + "Lin": "lb", + "Ling": "lg", + "Liu": "lq", + "Lo": "ll", + "Long": "ll", + "Lou": "lt", + "Lu": "lu", + "Luan": "lr", + "Lun": "lz", + "Luo": "lo", + "Ma": "ma", + "Mai": "mj", + "Man": "md", + "Mang": "mf", + "Mao": "ms", + "Me": "me", + "Mei": "mw", + "Men": "mk", + "Meng": "mh", + "Mi": "mi", + "Mian": "mm", + "Miao": "mp", + "Mie": "mc", + "Min": "mb", + "Ming": "mg", + "Miu": "mq", + "Mo": "mo", + "Mou": "mt", + "Mu": "mu", + "Na": "na", + "Nai": "nj", + "Nan": "nd", + "Nang": "nf", + "Nao": "ns", + "Ne": "ne", + "Nei": "nw", + "Nen": "nk", + "Neng": "nh", + "Ni": "ni", + "Nian": "nm", + "Niang": "nn", + "Niao": "np", + "Nie": "nc", + "Nin": "nb", + "Ning": "ng", + "Niu": "nq", + "Nong": "nl", + "Nou": "nt", + "Nu": "nu", + "Nuan": "nr", + "Nun": "nz", + "Nuo": "no", + "Pa": "pa", + "Pai": "pj", + "Pan": "pd", + "Pang": "pf", + "Pao": "ps", + "Pei": "pw", + "Pen": "pk", + "Peng": "ph", + "Pi": "pi", + "Pian": "pm", + "Piao": "pp", + "Pie": "pc", + "Pin": "pb", + "Ping": "pg", + "Po": "po", + "Pou": "pt", + "Pu": "pu", + "Qi": "qk", + "Qia": "qs", + "Qian": "qm", + "Qiang": "qx", + "Qiao": "qp", + "Qie": "qc", + "Qin": "qb", + "Qing": "qg", + "Qiong": "qy", + "Qiu": "qq", + "Qu": "qv", + "Quan": "qt", + "Que": "qh", + "Qun": "qw", + "Ran": "rd", + "Rang": "rf", + "Rao": "rs", + "Re": "re", + "Ren": "rk", + "Reng": "rh", + "Ri": "ri", + "Rong": "rl", + "Rou": "rt", + "Ru": "ru", + "Rua": "rx", + "Ruan": "rr", + "Rui": "ry", + "Run": "rz", + "Ruo": "ro", + "Sa": "sa", + "Sai": "sj", + "San": "sd", + "Sang": "sf", + "Sao": "ss", + "Se": "se", + "Sen": "sk", + "Seng": "sh", + "Sha": "ea", + "Shai": "ej", + "Shan": "ed", + "Shang": "ef", + "Shao": "es", + "She": "ee", + "Shei": "ew", + "Shen": "ek", + "Sheng": "eh", + "Shi": "ei", + "Shou": "et", + "Shu": "eu", + "Shua": "ex", + "Shuai": "eg", + "Shuan": "er", + "Shuang": "en", + "Shui": "ey", + "Shun": "ez", + "Shuo": "eo", + "Si": "si", + "Song": "sl", + "Sou": "st", + "Su": "su", + "Suan": "sr", + "Sui": "sy", + "Sun": "sz", + "Suo": "so", + "Ta": "ta", + "Tai": "tj", + "Tan": "td", + "Tang": "tf", + "Tao": "ts", + "Te": "te", + "Tei": "tw", + "Teng": "th", + "Ti": "ti", + "Tian": "tm", + "Tiao": "tp", + "Tie": "tc", + "Ting": "tg", + "Tong": "tl", + "Tou": "tt", + "Tu": "tu", + "Tuan": "tr", + "Tui": "ty", + "Tun": "tz", + "Tuo": "to", + "Xi": "xi", + "Xia": "xx", + "Xian": "xm", + "Xiang": "xn", + "Xiao": "xp", + "Xie": "xc", + "Xin": "xb", + "Xing": "xg", + "Xiong": "xl", + "Xiu": "xq", + "Xu": "xv", + "Xuan": "xr", + "Xue": "xy", + "Xun": "xw", + "Za": "za", + "Zai": "zj", + "Zan": "zd", + "Zang": "zf", + "Zao": "zs", + "Ze": "ze", + "Zei": "zw", + "Zen": "zk", + "Zeng": "zh", + "Zha": "qa", + "Zhai": "fj", + "Zhan": "qd", + "Zhang": "qf", + "Zhao": "fs", + "Zhe": "fe", + "Zhen": "qk", + "Zheng": "qh", + "Zhi": "fi", + "Zhong": "fy", + "Zhou": "qt", + "Zhu": "qu", + "Zhua": "fx", + "Zhuai": "fg", + "Zhuan": "fr", + "Zhuang": "fn", + "Zhui": "fy", + "Zhun": "fz", + "Zhuo": "qo", + "Zi": "zi", + "Zong": "zl", + "Zou": "zt", + "Zu": "zu", + "Zuan": "zr", + "Zui": "zy", + "Zun": "zz", + "Zuo": "zo" + }, + "DaNiu": { + "Lv": "lv", + "Lve": "lx", + "Lue": "lx", + "Nv": "nv", + "Nve": "nx", + "Nue": "nx", + "A": "ea", + "O": "eo", + "E": "ee", + "Ai": "eh", + "Ei": "ew", + "Ao": "es", + "Ou": "er", + "An": "ed", + "En": "ek", + "Ang": "ef", + "Eng": "ej", + "Er": "eu", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "ys", + "You": "yr", + "Yan": "yd", + "Yin": "yb", + "Yang": "yf", + "Ying": "yg", + "Wu": "wu", + "Wa": "wa", + "Wo": "wo", + "Wai": "wh", + "Wei": "ww", + "Wan": "wd", + "Wen": "wk", + "Wang": "wf", + "Weng": "wj", + "Yu": "yu", + "Yue": "yh", + "Yuan": "yj", + "Yun": "yw", + "Yong": "yl", + "Ba": "ba", + "Bai": "bh", + "Ban": "bd", + "Bang": "bf", + "Bao": "bs", + "Bei": "bw", + "Ben": "bk", + "Beng": "bj", + "Bi": "bi", + "Bian": "bc", + "Biang": "bn", + "Biao": "bm", + "Bie": "bp", + "Bin": "bb", + "Bing": "bg", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "ch", + "Can": "cd", + "Cang": "cf", + "Cao": "cs", + "Ce": "ce", + "Cen": "ck", + "Ceng": "cj", + "Cha": "ia", + "Chai": "ih", + "Chan": "id", + "Chang": "if", + "Chao": "is", + "Che": "ie", + "Chen": "ik", + "Cheng": "ij", + "Chi": "ii", + "Chong": "il", + "Chou": "ir", + "Chu": "iu", + "Chua": "iq", + "Chuai": "ig", + "Chuan": "iz", + "Chuang": "ix", + "Chui": "in", + "Chun": "iy", + "Chuo": "io", + "Ci": "ci", + "Cong": "cl", + "Cou": "cr", + "Cu": "cu", + "Cuan": "cz", + "Cui": "cn", + "Cun": "cy", + "Cuo": "co", + "Da": "da", + "Dai": "dh", + "Dan": "dd", + "Dang": "df", + "Dao": "ds", + "De": "de", + "Dei": "dw", + "Den": "dk", + "Deng": "dj", + "Di": "di", + "Dia": "dk", + "Dian": "dc", + "Diao": "dm", + "Die": "dp", + "Ding": "dg", + "Diu": "dt", + "Dong": "dl", + "Dou": "dr", + "Du": "du", + "Duan": "dz", + "Dui": "dn", + "Dun": "dy", + "Duo": "do", + "Fa": "fa", + "Fan": "fd", + "Fang": "ff", + "Fei": "fw", + "Fen": "fk", + "Feng": "fj", + "Fiao": "fm", + "Fo": "fo", + "Fou": "fr", + "Fu": "fu", + "Ga": "ga", + "Gai": "gh", + "Gan": "gd", + "Gang": "gf", + "Gao": "gs", + "Ge": "ge", + "Gei": "gw", + "Gen": "gk", + "Geng": "gj", + "Gong": "gl", + "Gou": "gr", + "Gu": "gu", + "Gua": "gq", + "Guai": "gg", + "Guan": "gz", + "Guang": "gx", + "Gui": "gn", + "Gun": "gy", + "Guo": "go", + "Ha": "ha", + "Hai": "hh", + "Han": "hd", + "Hang": "hf", + "Hao": "hs", + "He": "he", + "Hei": "hw", + "Hen": "hk", + "Heng": "hj", + "Hong": "hl", + "Hou": "hr", + "Hu": "hu", + "Hua": "hq", + "Huai": "hg", + "Huan": "hz", + "Huang": "hx", + "Hui": "hn", + "Hun": "hy", + "Huo": "ho", + "Ji": "ji", + "Jia": "jk", + "Jian": "jc", + "Jiang": "jn", + "Jiao": "jm", + "Jie": "jp", + "Jin": "jb", + "Jing": "jg", + "Jiong": "jl", + "Jiu": "jt", + "Ju": "ju", + "Juan": "jj", + "Jue": "jh", + "Jun": "jw", + "Ka": "ka", + "Kai": "kh", + "Kan": "kd", + "Kang": "kf", + "Kao": "ks", + "Ke": "ke", + "Ken": "kk", + "Keng": "kj", + "Kong": "kl", + "Kou": "kr", + "Ku": "ku", + "Kua": "kq", + "Kuai": "kg", + "Kuan": "kz", + "Kuang": "kx", + "Kui": "kn", + "Kun": "ky", + "Kuo": "ko", + "La": "la", + "Lai": "lh", + "Lan": "ld", + "Lang": "lf", + "Lao": "ls", + "Le": "le", + "Lei": "lw", + "Leng": "lj", + "Li": "li", + "Lia": "lk", + "Lian": "lc", + "Liang": "ln", + "Liao": "lm", + "Lie": "lp", + "Lin": "lb", + "Ling": "lg", + "Liu": "lt", + "Lo": "lo", + "Long": "ll", + "Lou": "lr", + "Lu": "lu", + "Luan": "lz", + "Lun": "ly", + "Luo": "lo", + "Ma": "ma", + "Mai": "mh", + "Man": "md", + "Mang": "mf", + "Mao": "ms", + "Me": "me", + "Mei": "mw", + "Men": "mk", + "Meng": "mj", + "Mi": "mi", + "Mian": "mc", + "Miao": "mm", + "Mie": "mp", + "Min": "mb", + "Ming": "mg", + "Miu": "mt", + "Mo": "mo", + "Mou": "mr", + "Mu": "mu", + "Na": "na", + "Nai": "nh", + "Nan": "nd", + "Nang": "nf", + "Nao": "ns", + "Ne": "ne", + "Nei": "nw", + "Nen": "nk", + "Neng": "nj", + "Ni": "ni", + "Nian": "nc", + "Niang": "nn", + "Niao": "nm", + "Nie": "np", + "Nin": "nb", + "Ning": "ng", + "Niu": "nt", + "Nong": "nl", + "Nou": "nr", + "Nu": "nu", + "Nuan": "nz", + "Nun": "ny", + "Nuo": "no", + "Pa": "pa", + "Pai": "ph", + "Pan": "pd", + "Pang": "pf", + "Pao": "ps", + "Pei": "pw", + "Pen": "pk", + "Peng": "pj", + "Pi": "pi", + "Pian": "pc", + "Piao": "pm", + "Pie": "pp", + "Pin": "pb", + "Ping": "pg", + "Po": "po", + "Pou": "pr", + "Pu": "pu", + "Qi": "qi", + "Qia": "qk", + "Qian": "qc", + "Qiang": "qn", + "Qiao": "qm", + "Qie": "qp", + "Qin": "qb", + "Qing": "qg", + "Qiong": "ql", + "Qiu": "qt", + "Qu": "qu", + "Quan": "qj", + "Que": "qh", + "Qun": "qw", + "Ran": "rd", + "Rang": "rf", + "Rao": "rs", + "Re": "re", + "Ren": "rk", + "Reng": "rj", + "Ri": "ri", + "Rong": "rl", + "Rou": "rr", + "Ru": "ru", + "Rua": "rq", + "Ruan": "rz", + "Rui": "rn", + "Run": "ry", + "Ruo": "ro", + "Sa": "sa", + "Sai": "sh", + "San": "sd", + "Sang": "sf", + "Sao": "ss", + "Se": "se", + "Sen": "sk", + "Seng": "sj", + "Sha": "ua", + "Shai": "uh", + "Shan": "ud", + "Shang": "uf", + "Shao": "us", + "She": "ue", + "Shei": "uw", + "Shen": "uk", + "Sheng": "uj", + "Shi": "ui", + "Shou": "ur", + "Shu": "uu", + "Shua": "uq", + "Shuai": "ug", + "Shuan": "uz", + "Shuang": "ux", + "Shui": "un", + "Shun": "uy", + "Shuo": "uo", + "Si": "si", + "Song": "sl", + "Sou": "sr", + "Su": "su", + "Suan": "sz", + "Sui": "sn", + "Sun": "sy", + "Suo": "so", + "Ta": "ta", + "Tai": "th", + "Tan": "td", + "Tang": "tf", + "Tao": "ts", + "Te": "te", + "Tei": "tw", + "Teng": "tj", + "Ti": "ti", + "Tian": "tc", + "Tiao": "tm", + "Tie": "tp", + "Ting": "tg", + "Tong": "tl", + "Tou": "tr", + "Tu": "tu", + "Tuan": "tz", + "Tui": "tn", + "Tun": "ty", + "Tuo": "to", + "Xi": "xi", + "Xia": "xk", + "Xian": "xc", + "Xiang": "xn", + "Xiao": "xm", + "Xie": "xp", + "Xin": "xb", + "Xing": "xg", + "Xiong": "xl", + "Xiu": "xt", + "Xu": "xu", + "Xuan": "xj", + "Xue": "xh", + "Xun": "xw", + "Za": "za", + "Zai": "zh", + "Zan": "zd", + "Zang": "zf", + "Zao": "zs", + "Ze": "ze", + "Zei": "zw", + "Zen": "zk", + "Zeng": "zj", + "Zha": "aa", + "Zhai": "ah", + "Zhan": "ad", + "Zhang": "af", + "Zhao": "as", + "Zhe": "ae", + "Zhen": "ak", + "Zheng": "aj", + "Zhi": "ai", + "Zhong": "al", + "Zhou": "ar", + "Zhu": "au", + "Zhua": "aq", + "Zhuai": "ag", + "Zhuan": "az", + "Zhuang": "ax", + "Zhui": "an", + "Zhun": "ay", + "Zhuo": "ao", + "Zi": "zi", + "Zong": "zl", + "Zou": "zr", + "Zu": "zu", + "Zuan": "zz", + "Zui": "zn", + "Zun": "zy", + "Zuo": "zo" + }, + "XiaoLang": { + "Lv": "lx", + "Lve": "lb", + "Lue": "lb", + "Nv": "nx", + "Nve": "nb", + "Nue": "nb", + "A": "aa", + "O": "oo", + "E": "uu", + "Ai": "ai", + "Ei": "ui", + "Ao": "ao", + "Ou": "ou", + "An": "an", + "En": "un", + "Ang": "ah", + "Eng": "un", + "Er": "ur", + "Yi": "yi", + "Ya": "ya", + "Yo": "yo", + "Ye": "ye", + "Yao": "ys", + "You": "yr", + "Yan": "yj", + "Yin": "yd", + "Yang": "yh", + "Ying": "yv", + "Wu": "wu", + "Wa": "wa", + "Wo": "wo", + "Wai": "wk", + "Wei": "ww", + "Wan": "wj", + "Wen": "wm", + "Wang": "wh", + "Weng": "wn", + "Yu": "yu", + "Yue": "yb", + "Yuan": "yg", + "Yun": "yy", + "Yong": "yl", + "Ba": "ba", + "Bai": "bk", + "Ban": "bj", + "Bang": "bh", + "Bao": "bs", + "Bei": "bw", + "Ben": "bm", + "Beng": "bn", + "Bi": "bi", + "Bian": "bf", + "Biang": "bm", + "Biao": "bc", + "Bie": "bp", + "Bin": "bd", + "Bing": "bv", + "Bo": "bo", + "Bu": "bu", + "Ca": "ca", + "Cai": "ck", + "Can": "cj", + "Cang": "ch", + "Cao": "cs", + "Ce": "ce", + "Cen": "cm", + "Ceng": "cn", + "Cha": "ia", + "Chai": "ik", + "Chan": "ij", + "Chang": "ih", + "Chao": "is", + "Che": "ie", + "Chen": "im", + "Cheng": "in", + "Chi": "ii", + "Chong": "il", + "Chou": "ir", + "Chu": "iu", + "Chua": "if", + "Chuai": "iv", + "Chuan": "ig", + "Chuang": "iz", + "Chui": "id", + "Chun": "iy", + "Chuo": "io", + "Ci": "ci", + "Cong": "cl", + "Cou": "cr", + "Cu": "cu", + "Cuan": "cg", + "Cui": "cd", + "Cun": "cy", + "Cuo": "co", + "Da": "da", + "Dai": "dk", + "Dan": "dj", + "Dang": "dh", + "Dao": "ds", + "De": "de", + "Dei": "dw", + "Den": "dm", + "Deng": "dn", + "Di": "di", + "Dia": "dk", + "Dian": "df", + "Diao": "dc", + "Die": "dp", + "Ding": "dv", + "Diu": "dt", + "Dong": "dl", + "Dou": "dr", + "Du": "du", + "Duan": "dg", + "Dui": "dd", + "Dun": "dy", + "Duo": "do", + "Fa": "fa", + "Fan": "fj", + "Fang": "fh", + "Fei": "fw", + "Fen": "fm", + "Feng": "fn", + "Fiao": "fc", + "Fo": "fo", + "Fou": "fr", + "Fu": "fu", + "Ga": "ga", + "Gai": "gk", + "Gan": "gj", + "Gang": "gh", + "Gao": "gs", + "Ge": "ge", + "Gei": "gw", + "Gen": "gm", + "Geng": "gn", + "Gong": "gl", + "Gou": "gr", + "Gu": "gu", + "Gua": "gf", + "Guai": "gv", + "Guan": "gg", + "Guang": "gz", + "Gui": "gd", + "Gun": "gy", + "Guo": "go", + "Ha": "ha", + "Hai": "hk", + "Han": "hj", + "Hang": "hh", + "Hao": "hs", + "He": "he", + "Hei": "hw", + "Hen": "hm", + "Heng": "hn", + "Hong": "hl", + "Hou": "hr", + "Hu": "hu", + "Hua": "hf", + "Huai": "hv", + "Huan": "hg", + "Huang": "hz", + "Hui": "hd", + "Hun": "hy", + "Huo": "ho", + "Ji": "ji", + "Jia": "jk", + "Jian": "jf", + "Jiang": "jm", + "Jiao": "jc", + "Jie": "jp", + "Jin": "jd", + "Jing": "jv", + "Jiong": "jj", + "Jiu": "jt", + "Ju": "ju", + "Juan": "jg", + "Jue": "jb", + "Jun": "jy", + "Ka": "ka", + "Kai": "kk", + "Kan": "kj", + "Kang": "kh", + "Kao": "ks", + "Ke": "ke", + "Ken": "km", + "Keng": "kn", + "Kong": "kl", + "Kou": "kr", + "Ku": "ku", + "Kua": "kf", + "Kuai": "kv", + "Kuan": "kg", + "Kuang": "kz", + "Kui": "kd", + "Kun": "ky", + "Kuo": "ko", + "La": "la", + "Lai": "lk", + "Lan": "lj", + "Lang": "lh", + "Lao": "ls", + "Le": "le", + "Lei": "lw", + "Leng": "ln", + "Li": "li", + "Lia": "lk", + "Lian": "lf", + "Liang": "lm", + "Liao": "lc", + "Lie": "lp", + "Lin": "ld", + "Ling": "lv", + "Liu": "lt", + "Lo": "lo", + "Long": "ll", + "Lou": "lr", + "Lu": "lu", + "Luan": "lg", + "Lun": "ly", + "Luo": "lo", + "Ma": "ma", + "Mai": "mk", + "Man": "mj", + "Mang": "mh", + "Mao": "ms", + "Me": "me", + "Mei": "mw", + "Men": "mm", + "Meng": "mn", + "Mi": "mi", + "Mian": "mf", + "Miao": "mc", + "Mie": "mp", + "Min": "md", + "Ming": "mv", + "Miu": "mt", + "Mo": "mo", + "Mou": "mr", + "Mu": "mu", + "Na": "na", + "Nai": "nk", + "Nan": "nj", + "Nang": "nh", + "Nao": "ns", + "Ne": "ne", + "Nei": "nw", + "Nen": "nm", + "Neng": "nn", + "Ni": "ni", + "Nian": "nf", + "Niang": "nm", + "Niao": "nc", + "Nie": "np", + "Nin": "nd", + "Ning": "nv", + "Niu": "nt", + "Nong": "nl", + "Nou": "nr", + "Nu": "nu", + "Nuan": "ng", + "Nun": "ny", + "Nuo": "no", + "Pa": "pa", + "Pai": "pk", + "Pan": "pj", + "Pang": "ph", + "Pao": "ps", + "Pei": "pw", + "Pen": "pm", + "Peng": "pn", + "Pi": "pi", + "Pian": "pf", + "Piao": "pc", + "Pie": "pp", + "Pin": "pd", + "Ping": "pv", + "Po": "po", + "Pou": "pr", + "Pu": "pu", + "Qi": "qi", + "Qia": "qk", + "Qian": "qf", + "Qiang": "qm", + "Qiao": "qc", + "Qie": "qp", + "Qin": "qd", + "Qing": "qv", + "Qiong": "qj", + "Qiu": "qt", + "Qu": "qu", + "Quan": "qg", + "Que": "qb", + "Qun": "qy", + "Ran": "rj", + "Rang": "rh", + "Rao": "rs", + "Re": "re", + "Ren": "rm", + "Reng": "rn", + "Ri": "ri", + "Rong": "rl", + "Rou": "rr", + "Ru": "ru", + "Rua": "rf", + "Ruan": "rg", + "Rui": "rd", + "Run": "ry", + "Ruo": "ro", + "Sa": "sa", + "Sai": "sk", + "San": "sj", + "Sang": "sh", + "Sao": "ss", + "Se": "se", + "Sen": "sm", + "Seng": "sn", + "Sha": "va", + "Shai": "vk", + "Shan": "vj", + "Shang": "vh", + "Shao": "vs", + "She": "ve", + "Shei": "vw", + "Shen": "vm", + "Sheng": "vn", + "Shi": "vi", + "Shou": "vr", + "Shu": "vu", + "Shua": "vf", + "Shuai": "vv", + "Shuan": "vg", + "Shuang": "vz", + "Shui": "vd", + "Shun": "vy", + "Shuo": "vo", + "Si": "si", + "Song": "sl", + "Sou": "sr", + "Su": "su", + "Suan": "sg", + "Sui": "sd", + "Sun": "sy", + "Suo": "so", + "Ta": "ta", + "Tai": "tk", + "Tan": "tj", + "Tang": "th", + "Tao": "ts", + "Te": "te", + "Tei": "tw", + "Teng": "tn", + "Ti": "ti", + "Tian": "tf", + "Tiao": "tc", + "Tie": "tp", + "Ting": "tv", + "Tong": "tl", + "Tou": "tr", + "Tu": "tu", + "Tuan": "tg", + "Tui": "td", + "Tun": "ty", + "Tuo": "to", + "Xi": "xi", + "Xia": "xk", + "Xian": "xf", + "Xiang": "xm", + "Xiao": "xc", + "Xie": "xp", + "Xin": "xd", + "Xing": "xv", + "Xiong": "xj", + "Xiu": "xt", + "Xu": "xu", + "Xuan": "xg", + "Xue": "xb", + "Xun": "xy", + "Za": "za", + "Zai": "zk", + "Zan": "zj", + "Zang": "zh", + "Zao": "zs", + "Ze": "ze", + "Zei": "zw", + "Zen": "zm", + "Zeng": "zn", + "Zha": "ea", + "Zhai": "ek", + "Zhan": "ej", + "Zhang": "eh", + "Zhao": "es", + "Zhe": "ee", + "Zhen": "em", + "Zheng": "en", + "Zhi": "ei", + "Zhong": "el", + "Zhou": "er", + "Zhu": "eu", + "Zhua": "ef", + "Zhuai": "ev", + "Zhuan": "eg", + "Zhuang": "ez", + "Zhui": "ed", + "Zhun": "ey", + "Zhuo": "eo", + "Zi": "zi", + "Zong": "zl", + "Zou": "zr", + "Zu": "zu", + "Zuan": "zg", + "Zui": "zd", + "Zun": "zy", + "Zuo": "zo" + } +} \ No newline at end of file From 31cd8949fee2d156f16aaf45cb6e50cfac150e7c Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 14 Jun 2025 14:39:01 +0800 Subject: [PATCH 32/75] Compress json --- Flow.Launcher/Resources/double_pinyin.json | 3747 +------------------- 1 file changed, 1 insertion(+), 3746 deletions(-) diff --git a/Flow.Launcher/Resources/double_pinyin.json b/Flow.Launcher/Resources/double_pinyin.json index 6b8ae06c0..83972038f 100644 --- a/Flow.Launcher/Resources/double_pinyin.json +++ b/Flow.Launcher/Resources/double_pinyin.json @@ -1,3746 +1 @@ -{ - "XiaoHe": { - "Lv": "lv", - "Lve": "lt", - "Lue": "lt", - "Nv": "nv", - "Nve": "nt", - "Nue": "nt", - "A": "aa", - "O": "oo", - "E": "ee", - "Ai": "ai", - "Ei": "ei", - "Ao": "ao", - "Ou": "ou", - "An": "an", - "En": "en", - "Ang": "ah", - "Eng": "eg", - "Er": "er", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "yc", - "You": "yz", - "Yan": "yj", - "Yin": "yb", - "Yang": "yh", - "Ying": "yk", - "Wu": "wu", - "Wa": "wa", - "Wo": "wo", - "Wai": "wd", - "Wei": "ww", - "Wan": "wj", - "Wen": "wf", - "Wang": "wh", - "Weng": "wg", - "Yu": "yu", - "Yue": "yt", - "Yuan": "yr", - "Yun": "yy", - "Yong": "ys", - "Ba": "ba", - "Bai": "bd", - "Ban": "bj", - "Bang": "bh", - "Bao": "bc", - "Bei": "bw", - "Ben": "bf", - "Beng": "bg", - "Bi": "bi", - "Bian": "bm", - "Biang": "bl", - "Biao": "bn", - "Bie": "bp", - "Bin": "bb", - "Bing": "bk", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "cd", - "Can": "cj", - "Cang": "ch", - "Cao": "cc", - "Ce": "ce", - "Cen": "cf", - "Ceng": "cg", - "Cha": "ia", - "Chai": "id", - "Chan": "ij", - "Chang": "ih", - "Chao": "ic", - "Che": "ie", - "Chen": "if", - "Cheng": "ig", - "Chi": "ii", - "Chong": "is", - "Chou": "iz", - "Chu": "iu", - "Chua": "ix", - "Chuai": "ik", - "Chuan": "ir", - "Chuang": "il", - "Chui": "iv", - "Chun": "iy", - "Chuo": "io", - "Ci": "ci", - "Cong": "cs", - "Cou": "cz", - "Cu": "cu", - "Cuan": "cr", - "Cui": "cv", - "Cun": "cy", - "Cuo": "co", - "Da": "da", - "Dai": "dd", - "Dan": "dj", - "Dang": "dh", - "Dao": "dc", - "De": "de", - "Dei": "dw", - "Den": "df", - "Deng": "dg", - "Di": "di", - "Dia": "dx", - "Dian": "dm", - "Diao": "dn", - "Die": "dp", - "Ding": "dk", - "Diu": "dq", - "Dong": "ds", - "Dou": "dz", - "Du": "du", - "Duan": "dr", - "Dui": "dv", - "Dun": "dy", - "Duo": "do", - "Fa": "fa", - "Fan": "fj", - "Fang": "fh", - "Fei": "fw", - "Fen": "ff", - "Feng": "fg", - "Fiao": "fn", - "Fo": "fo", - "Fou": "fz", - "Fu": "fu", - "Ga": "ga", - "Gai": "gd", - "Gan": "gj", - "Gang": "gh", - "Gao": "gc", - "Ge": "ge", - "Gei": "gw", - "Gen": "gf", - "Geng": "gg", - "Gong": "gs", - "Gou": "gz", - "Gu": "gu", - "Gua": "gx", - "Guai": "gk", - "Guan": "gr", - "Guang": "gl", - "Gui": "gv", - "Gun": "gy", - "Guo": "go", - "Ha": "ha", - "Hai": "hd", - "Han": "hj", - "Hang": "hh", - "Hao": "hc", - "He": "he", - "Hei": "hw", - "Hen": "hf", - "Heng": "hg", - "Hong": "hs", - "Hou": "hz", - "Hu": "hu", - "Hua": "hx", - "Huai": "hk", - "Huan": "hr", - "Huang": "hl", - "Hui": "hv", - "Hun": "hy", - "Huo": "ho", - "Ji": "ji", - "Jia": "jx", - "Jian": "jm", - "Jiang": "jl", - "Jiao": "jn", - "Jie": "jp", - "Jin": "jb", - "Jing": "jk", - "Jiong": "js", - "Jiu": "jq", - "Ju": "ju", - "Juan": "jr", - "Jue": "jt", - "Jun": "jy", - "Ka": "ka", - "Kai": "kd", - "Kan": "kj", - "Kang": "kh", - "Kao": "kc", - "Ke": "ke", - "Ken": "kf", - "Keng": "kg", - "Kong": "ks", - "Kou": "kz", - "Ku": "ku", - "Kua": "kx", - "Kuai": "kk", - "Kuan": "kr", - "Kuang": "kl", - "Kui": "kv", - "Kun": "ky", - "Kuo": "ko", - "La": "la", - "Lai": "ld", - "Lan": "lj", - "Lang": "lh", - "Lao": "lc", - "Le": "le", - "Lei": "lw", - "Leng": "lg", - "Li": "li", - "Lia": "lx", - "Lian": "lm", - "Liang": "ll", - "Liao": "ln", - "Lie": "lp", - "Lin": "lb", - "Ling": "lk", - "Liu": "lq", - "Lo": "lo", - "Long": "ls", - "Lou": "lz", - "Lu": "lu", - "Luan": "lr", - "Lun": "ly", - "Luo": "lo", - "Ma": "ma", - "Mai": "md", - "Man": "mj", - "Mang": "mh", - "Mao": "mc", - "Me": "me", - "Mei": "mw", - "Men": "mf", - "Meng": "mg", - "Mi": "mi", - "Mian": "mm", - "Miao": "mn", - "Mie": "mp", - "Min": "mb", - "Ming": "mk", - "Miu": "mq", - "Mo": "mo", - "Mou": "mz", - "Mu": "mu", - "Na": "na", - "Nai": "nd", - "Nan": "nj", - "Nang": "nh", - "Nao": "nc", - "Ne": "ne", - "Nei": "nw", - "Nen": "nf", - "Neng": "ng", - "Ni": "ni", - "Nian": "nm", - "Niang": "nl", - "Niao": "nn", - "Nie": "np", - "Nin": "nb", - "Ning": "nk", - "Niu": "nq", - "Nong": "ns", - "Nou": "nz", - "Nu": "nu", - "Nuan": "nr", - "Nun": "ny", - "Nuo": "no", - "Pa": "pa", - "Pai": "pd", - "Pan": "pj", - "Pang": "ph", - "Pao": "pc", - "Pei": "pw", - "Pen": "pf", - "Peng": "pg", - "Pi": "pi", - "Pian": "pm", - "Piao": "pn", - "Pie": "pp", - "Pin": "pb", - "Ping": "pk", - "Po": "po", - "Pou": "pz", - "Pu": "pu", - "Qi": "qi", - "Qia": "qx", - "Qian": "qm", - "Qiang": "ql", - "Qiao": "qn", - "Qie": "qp", - "Qin": "qb", - "Qing": "qk", - "Qiong": "qs", - "Qiu": "qq", - "Qu": "qu", - "Quan": "qr", - "Que": "qt", - "Qun": "qy", - "Ran": "rj", - "Rang": "rh", - "Rao": "rc", - "Re": "re", - "Ren": "rf", - "Reng": "rg", - "Ri": "ri", - "Rong": "rs", - "Rou": "rz", - "Ru": "ru", - "Rua": "rx", - "Ruan": "rr", - "Rui": "rv", - "Run": "ry", - "Ruo": "ro", - "Sa": "sa", - "Sai": "sd", - "San": "sj", - "Sang": "sh", - "Sao": "sc", - "Se": "se", - "Sen": "sf", - "Seng": "sg", - "Sha": "ua", - "Shai": "ud", - "Shan": "uj", - "Shang": "uh", - "Shao": "uc", - "She": "ue", - "Shei": "uw", - "Shen": "uf", - "Sheng": "ug", - "Shi": "ui", - "Shou": "uz", - "Shu": "uu", - "Shua": "ux", - "Shuai": "uk", - "Shuan": "ur", - "Shuang": "ul", - "Shui": "uv", - "Shun": "uy", - "Shuo": "uo", - "Si": "si", - "Song": "ss", - "Sou": "sz", - "Su": "su", - "Suan": "sr", - "Sui": "sv", - "Sun": "sy", - "Suo": "so", - "Ta": "ta", - "Tai": "td", - "Tan": "tj", - "Tang": "th", - "Tao": "tc", - "Te": "te", - "Tei": "tw", - "Teng": "tg", - "Ti": "ti", - "Tian": "tm", - "Tiao": "tn", - "Tie": "tp", - "Ting": "tk", - "Tong": "ts", - "Tou": "tz", - "Tu": "tu", - "Tuan": "tr", - "Tui": "tv", - "Tun": "ty", - "Tuo": "to", - "Xi": "xi", - "Xia": "xx", - "Xian": "xm", - "Xiang": "xl", - "Xiao": "xn", - "Xie": "xp", - "Xin": "xb", - "Xing": "xk", - "Xiong": "xs", - "Xiu": "xq", - "Xu": "xu", - "Xuan": "xr", - "Xue": "xt", - "Xun": "xy", - "Za": "za", - "Zai": "zd", - "Zan": "zj", - "Zang": "zh", - "Zao": "zc", - "Ze": "ze", - "Zei": "zw", - "Zen": "zf", - "Zeng": "zg", - "Zha": "va", - "Zhai": "vd", - "Zhan": "vj", - "Zhang": "vh", - "Zhao": "vc", - "Zhe": "ve", - "Zhen": "vf", - "Zheng": "vg", - "Zhi": "vi", - "Zhong": "vs", - "Zhou": "vz", - "Zhu": "vu", - "Zhua": "vx", - "Zhuai": "vk", - "Zhuan": "vr", - "Zhuang": "vl", - "Zhui": "vv", - "Zhun": "vy", - "Zhuo": "vo", - "Zi": "zi", - "Zong": "zs", - "Zou": "zz", - "Zu": "zu", - "Zuan": "zr", - "Zui": "zv", - "Zun": "zy", - "Zuo": "zo" - }, - "ZiRanMa": { - "Lv": "lv", - "Lve": "lt", - "Lue": "lt", - "Nv": "nv", - "Nve": "nt", - "Nue": "nt", - "A": "aa", - "O": "oo", - "E": "ee", - "Ai": "ai", - "Ei": "ei", - "Ao": "ao", - "Ou": "ou", - "An": "an", - "En": "en", - "Ang": "ah", - "Eng": "eg", - "Er": "er", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "yk", - "You": "yb", - "Yan": "yj", - "Yin": "yn", - "Yang": "yh", - "Ying": "yy", - "Wu": "wu", - "Wa": "wa", - "Wo": "wo", - "Wai": "wl", - "Wei": "wz", - "Wan": "wj", - "Wen": "wf", - "Wang": "wh", - "Weng": "wg", - "Yu": "yu", - "Yue": "yt", - "Yuan": "yr", - "Yun": "yp", - "Yong": "ys", - "Ba": "ba", - "Bai": "bl", - "Ban": "bj", - "Bang": "bh", - "Bao": "bk", - "Bei": "bz", - "Ben": "bf", - "Beng": "bg", - "Bi": "bi", - "Bian": "bm", - "Biang": "bd", - "Biao": "bc", - "Bie": "bx", - "Bin": "bn", - "Bing": "by", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "cl", - "Can": "cj", - "Cang": "ch", - "Cao": "ck", - "Ce": "ce", - "Cen": "cf", - "Ceng": "cg", - "Cha": "ia", - "Chai": "il", - "Chan": "ij", - "Chang": "ih", - "Chao": "ik", - "Che": "ie", - "Chen": "if", - "Cheng": "ig", - "Chi": "ii", - "Chong": "is", - "Chou": "ib", - "Chu": "iu", - "Chua": "iw", - "Chuai": "iy", - "Chuan": "ir", - "Chuang": "id", - "Chui": "iv", - "Chun": "ip", - "Chuo": "io", - "Ci": "ci", - "Cong": "cs", - "Cou": "cb", - "Cu": "cu", - "Cuan": "cr", - "Cui": "cv", - "Cun": "cp", - "Cuo": "co", - "Da": "da", - "Dai": "dl", - "Dan": "dj", - "Dang": "dh", - "Dao": "dk", - "De": "de", - "Dei": "dz", - "Den": "df", - "Deng": "dg", - "Di": "di", - "Dia": "dw", - "Dian": "dm", - "Diao": "dc", - "Die": "dx", - "Ding": "dy", - "Diu": "dq", - "Dong": "ds", - "Dou": "db", - "Du": "du", - "Duan": "dr", - "Dui": "dv", - "Dun": "dp", - "Duo": "do", - "Fa": "fa", - "Fan": "fj", - "Fang": "fh", - "Fei": "fz", - "Fen": "ff", - "Feng": "fg", - "Fiao": "fc", - "Fo": "fo", - "Fou": "fb", - "Fu": "fu", - "Ga": "ga", - "Gai": "gl", - "Gan": "gj", - "Gang": "gh", - "Gao": "gk", - "Ge": "ge", - "Gei": "gz", - "Gen": "gf", - "Geng": "gg", - "Gong": "gs", - "Gou": "gb", - "Gu": "gu", - "Gua": "gw", - "Guai": "gy", - "Guan": "gr", - "Guang": "gd", - "Gui": "gv", - "Gun": "gp", - "Guo": "go", - "Ha": "ha", - "Hai": "hl", - "Han": "hj", - "Hang": "hh", - "Hao": "hk", - "He": "he", - "Hei": "hz", - "Hen": "hf", - "Heng": "hg", - "Hong": "hs", - "Hou": "hb", - "Hu": "hu", - "Hua": "hw", - "Huai": "hy", - "Huan": "hr", - "Huang": "hd", - "Hui": "hv", - "Hun": "hp", - "Huo": "ho", - "Ji": "ji", - "Jia": "jw", - "Jian": "jm", - "Jiang": "jd", - "Jiao": "jc", - "Jie": "jx", - "Jin": "jn", - "Jing": "jy", - "Jiong": "js", - "Jiu": "jq", - "Ju": "ju", - "Juan": "jr", - "Jue": "jt", - "Jun": "jp", - "Ka": "ka", - "Kai": "kl", - "Kan": "kj", - "Kang": "kh", - "Kao": "kk", - "Ke": "ke", - "Ken": "kf", - "Keng": "kg", - "Kong": "ks", - "Kou": "kb", - "Ku": "ku", - "Kua": "kw", - "Kuai": "ky", - "Kuan": "kr", - "Kuang": "kd", - "Kui": "kv", - "Kun": "kp", - "Kuo": "ko", - "La": "la", - "Lai": "ll", - "Lan": "lj", - "Lang": "lh", - "Lao": "lk", - "Le": "le", - "Lei": "lz", - "Leng": "lg", - "Li": "li", - "Lia": "lw", - "Lian": "lm", - "Liang": "ld", - "Liao": "lc", - "Lie": "lx", - "Lin": "ln", - "Ling": "ly", - "Liu": "lq", - "Lo": "lo", - "Long": "ls", - "Lou": "lb", - "Lu": "lu", - "Luan": "lr", - "Lun": "lp", - "Luo": "lo", - "Ma": "ma", - "Mai": "ml", - "Man": "mj", - "Mang": "mh", - "Mao": "mk", - "Me": "me", - "Mei": "mz", - "Men": "mf", - "Meng": "mg", - "Mi": "mi", - "Mian": "mm", - "Miao": "mc", - "Mie": "mx", - "Min": "mn", - "Ming": "my", - "Miu": "mq", - "Mo": "mo", - "Mou": "mb", - "Mu": "mu", - "Na": "na", - "Nai": "nl", - "Nan": "nj", - "Nang": "nh", - "Nao": "nk", - "Ne": "ne", - "Nei": "nz", - "Nen": "nf", - "Neng": "ng", - "Ni": "ni", - "Nian": "nm", - "Niang": "nd", - "Niao": "nc", - "Nie": "nx", - "Nin": "nn", - "Ning": "ny", - "Niu": "nq", - "Nong": "ns", - "Nou": "nb", - "Nu": "nu", - "Nuan": "nr", - "Nun": "np", - "Nuo": "no", - "Pa": "pa", - "Pai": "pl", - "Pan": "pj", - "Pang": "ph", - "Pao": "pk", - "Pei": "pz", - "Pen": "pf", - "Peng": "pg", - "Pi": "pi", - "Pian": "pm", - "Piao": "pc", - "Pie": "px", - "Pin": "pn", - "Ping": "py", - "Po": "po", - "Pou": "pb", - "Pu": "pu", - "Qi": "qi", - "Qia": "qw", - "Qian": "qm", - "Qiang": "qd", - "Qiao": "qc", - "Qie": "qx", - "Qin": "qn", - "Qing": "qy", - "Qiong": "qs", - "Qiu": "qq", - "Qu": "qu", - "Quan": "qr", - "Que": "qt", - "Qun": "qp", - "Ran": "rj", - "Rang": "rh", - "Rao": "rk", - "Re": "re", - "Ren": "rf", - "Reng": "rg", - "Ri": "ri", - "Rong": "rs", - "Rou": "rb", - "Ru": "ru", - "Rua": "rw", - "Ruan": "rr", - "Rui": "rv", - "Run": "rp", - "Ruo": "ro", - "Sa": "sa", - "Sai": "sl", - "San": "sj", - "Sang": "sh", - "Sao": "sk", - "Se": "se", - "Sen": "sf", - "Seng": "sg", - "Sha": "ua", - "Shai": "ul", - "Shan": "uj", - "Shang": "uh", - "Shao": "uk", - "She": "ue", - "Shei": "uz", - "Shen": "uf", - "Sheng": "ug", - "Shi": "ui", - "Shou": "ub", - "Shu": "uu", - "Shua": "uw", - "Shuai": "uy", - "Shuan": "ur", - "Shuang": "ud", - "Shui": "uv", - "Shun": "up", - "Shuo": "uo", - "Si": "si", - "Song": "ss", - "Sou": "sb", - "Su": "su", - "Suan": "sr", - "Sui": "sv", - "Sun": "sp", - "Suo": "so", - "Ta": "ta", - "Tai": "tl", - "Tan": "tj", - "Tang": "th", - "Tao": "tk", - "Te": "te", - "Tei": "tz", - "Teng": "tg", - "Ti": "ti", - "Tian": "tm", - "Tiao": "tc", - "Tie": "tx", - "Ting": "ty", - "Tong": "ts", - "Tou": "tb", - "Tu": "tu", - "Tuan": "tr", - "Tui": "tv", - "Tun": "tp", - "Tuo": "to", - "Xi": "xi", - "Xia": "xw", - "Xian": "xm", - "Xiang": "xd", - "Xiao": "xc", - "Xie": "xx", - "Xin": "xn", - "Xing": "xy", - "Xiong": "xs", - "Xiu": "xq", - "Xu": "xu", - "Xuan": "xr", - "Xue": "xt", - "Xun": "xp", - "Za": "za", - "Zai": "zl", - "Zan": "zj", - "Zang": "zh", - "Zao": "zk", - "Ze": "ze", - "Zei": "zz", - "Zen": "zf", - "Zeng": "zg", - "Zha": "va", - "Zhai": "vl", - "Zhan": "vj", - "Zhang": "vh", - "Zhao": "vk", - "Zhe": "ve", - "Zhen": "vf", - "Zheng": "vg", - "Zhi": "vi", - "Zhong": "vs", - "Zhou": "vb", - "Zhu": "vu", - "Zhua": "vw", - "Zhuai": "vy", - "Zhuan": "vr", - "Zhuang": "vd", - "Zhui": "vv", - "Zhun": "vp", - "Zhuo": "vo", - "Zi": "zi", - "Zong": "zs", - "Zou": "zb", - "Zu": "zu", - "Zuan": "zr", - "Zui": "zv", - "Zun": "zp", - "Zuo": "zo" - }, - "WeiRuan": { - "Lv": "ly", - "Lve": "lt", - "Lue": "lt", - "Nv": "ny", - "Nve": "nt", - "Nue": "nt", - "A": "oa", - "O": "oo", - "E": "oe", - "Ai": "ol", - "Ei": "oz", - "Ao": "ok", - "Ou": "ob", - "An": "oj", - "En": "of", - "Ang": "oh", - "Eng": "og", - "Er": "or", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "yk", - "You": "yb", - "Yan": "yj", - "Yin": "yn", - "Yang": "yh", - "Ying": "y;", - "Wu": "wu", - "Wa": "wa", - "Wo": "wo", - "Wai": "wl", - "Wei": "wz", - "Wan": "wj", - "Wen": "wf", - "Wang": "wh", - "Weng": "wg", - "Yu": "yu", - "Yue": "yt", - "Yuan": "yr", - "Yun": "yp", - "Yong": "ys", - "Ba": "ba", - "Bai": "bl", - "Ban": "bj", - "Bang": "bh", - "Bao": "bk", - "Bei": "bz", - "Ben": "bf", - "Beng": "bg", - "Bi": "bi", - "Bian": "bm", - "Biang": "bd", - "Biao": "bc", - "Bie": "bx", - "Bin": "bn", - "Bing": "b;", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "cl", - "Can": "cj", - "Cang": "ch", - "Cao": "ck", - "Ce": "ce", - "Cen": "cf", - "Ceng": "cg", - "Cha": "ia", - "Chai": "il", - "Chan": "ij", - "Chang": "ih", - "Chao": "ik", - "Che": "ie", - "Chen": "if", - "Cheng": "ig", - "Chi": "ii", - "Chong": "is", - "Chou": "ib", - "Chu": "iu", - "Chua": "iw", - "Chuai": "iy", - "Chuan": "ir", - "Chuang": "id", - "Chui": "iv", - "Chun": "ip", - "Chuo": "io", - "Ci": "ci", - "Cong": "cs", - "Cou": "cb", - "Cu": "cu", - "Cuan": "cr", - "Cui": "cv", - "Cun": "cp", - "Cuo": "co", - "Da": "da", - "Dai": "dl", - "Dan": "dj", - "Dang": "dh", - "Dao": "dk", - "De": "de", - "Dei": "dz", - "Den": "df", - "Deng": "dg", - "Di": "di", - "Dia": "dw", - "Dian": "dm", - "Diao": "dc", - "Die": "dx", - "Ding": "d;", - "Diu": "dq", - "Dong": "ds", - "Dou": "db", - "Du": "du", - "Duan": "dr", - "Dui": "dv", - "Dun": "dp", - "Duo": "do", - "Fa": "fa", - "Fan": "fj", - "Fang": "fh", - "Fei": "fz", - "Fen": "ff", - "Feng": "fg", - "Fiao": "fc", - "Fo": "fo", - "Fou": "fb", - "Fu": "fu", - "Ga": "ga", - "Gai": "gl", - "Gan": "gj", - "Gang": "gh", - "Gao": "gk", - "Ge": "ge", - "Gei": "gz", - "Gen": "gf", - "Geng": "gg", - "Gong": "gs", - "Gou": "gb", - "Gu": "gu", - "Gua": "gw", - "Guai": "gy", - "Guan": "gr", - "Guang": "gd", - "Gui": "gv", - "Gun": "gp", - "Guo": "go", - "Ha": "ha", - "Hai": "hl", - "Han": "hj", - "Hang": "hh", - "Hao": "hk", - "He": "he", - "Hei": "hz", - "Hen": "hf", - "Heng": "hg", - "Hong": "hs", - "Hou": "hb", - "Hu": "hu", - "Hua": "hw", - "Huai": "hy", - "Huan": "hr", - "Huang": "hd", - "Hui": "hv", - "Hun": "hp", - "Huo": "ho", - "Ji": "ji", - "Jia": "jw", - "Jian": "jm", - "Jiang": "jd", - "Jiao": "jc", - "Jie": "jx", - "Jin": "jn", - "Jing": "j;", - "Jiong": "js", - "Jiu": "jq", - "Ju": "ju", - "Juan": "jr", - "Jue": "jt", - "Jun": "jp", - "Ka": "ka", - "Kai": "kl", - "Kan": "kj", - "Kang": "kh", - "Kao": "kk", - "Ke": "ke", - "Ken": "kf", - "Keng": "kg", - "Kong": "ks", - "Kou": "kb", - "Ku": "ku", - "Kua": "kw", - "Kuai": "ky", - "Kuan": "kr", - "Kuang": "kd", - "Kui": "kv", - "Kun": "kp", - "Kuo": "ko", - "La": "la", - "Lai": "ll", - "Lan": "lj", - "Lang": "lh", - "Lao": "lk", - "Le": "le", - "Lei": "lz", - "Leng": "lg", - "Li": "li", - "Lia": "lw", - "Lian": "lm", - "Liang": "ld", - "Liao": "lc", - "Lie": "lx", - "Lin": "ln", - "Ling": "l;", - "Liu": "lq", - "Lo": "lo", - "Long": "ls", - "Lou": "lb", - "Lu": "lu", - "Luan": "lr", - "Lun": "lp", - "Luo": "lo", - "Ma": "ma", - "Mai": "ml", - "Man": "mj", - "Mang": "mh", - "Mao": "mk", - "Me": "me", - "Mei": "mz", - "Men": "mf", - "Meng": "mg", - "Mi": "mi", - "Mian": "mm", - "Miao": "mc", - "Mie": "mx", - "Min": "mn", - "Ming": "m;", - "Miu": "mq", - "Mo": "mo", - "Mou": "mb", - "Mu": "mu", - "Na": "na", - "Nai": "nl", - "Nan": "nj", - "Nang": "nh", - "Nao": "nk", - "Ne": "ne", - "Nei": "nz", - "Nen": "nf", - "Neng": "ng", - "Ni": "ni", - "Nian": "nm", - "Niang": "nd", - "Niao": "nc", - "Nie": "nx", - "Nin": "nn", - "Ning": "n;", - "Niu": "nq", - "Nong": "ns", - "Nou": "nb", - "Nu": "nu", - "Nuan": "nr", - "Nun": "np", - "Nuo": "no", - "Pa": "pa", - "Pai": "pl", - "Pan": "pj", - "Pang": "ph", - "Pao": "pk", - "Pei": "pz", - "Pen": "pf", - "Peng": "pg", - "Pi": "pi", - "Pian": "pm", - "Piao": "pc", - "Pie": "px", - "Pin": "pn", - "Ping": "p;", - "Po": "po", - "Pou": "pb", - "Pu": "pu", - "Qi": "qi", - "Qia": "qw", - "Qian": "qm", - "Qiang": "qd", - "Qiao": "qc", - "Qie": "qx", - "Qin": "qn", - "Qing": "q;", - "Qiong": "qs", - "Qiu": "qq", - "Qu": "qu", - "Quan": "qr", - "Que": "qt", - "Qun": "qp", - "Ran": "rj", - "Rang": "rh", - "Rao": "rk", - "Re": "re", - "Ren": "rf", - "Reng": "rg", - "Ri": "ri", - "Rong": "rs", - "Rou": "rb", - "Ru": "ru", - "Rua": "rw", - "Ruan": "rr", - "Rui": "rv", - "Run": "rp", - "Ruo": "ro", - "Sa": "sa", - "Sai": "sl", - "San": "sj", - "Sang": "sh", - "Sao": "sk", - "Se": "se", - "Sen": "sf", - "Seng": "sg", - "Sha": "ua", - "Shai": "ul", - "Shan": "uj", - "Shang": "uh", - "Shao": "uk", - "She": "ue", - "Shei": "uz", - "Shen": "uf", - "Sheng": "ug", - "Shi": "ui", - "Shou": "ub", - "Shu": "uu", - "Shua": "uw", - "Shuai": "uy", - "Shuan": "ur", - "Shuang": "ud", - "Shui": "uv", - "Shun": "up", - "Shuo": "uo", - "Si": "si", - "Song": "ss", - "Sou": "sb", - "Su": "su", - "Suan": "sr", - "Sui": "sv", - "Sun": "sp", - "Suo": "so", - "Ta": "ta", - "Tai": "tl", - "Tan": "tj", - "Tang": "th", - "Tao": "tk", - "Te": "te", - "Tei": "tz", - "Teng": "tg", - "Ti": "ti", - "Tian": "tm", - "Tiao": "tc", - "Tie": "tx", - "Ting": "t;", - "Tong": "ts", - "Tou": "tb", - "Tu": "tu", - "Tuan": "tr", - "Tui": "tv", - "Tun": "tp", - "Tuo": "to", - "Xi": "xi", - "Xia": "xw", - "Xian": "xm", - "Xiang": "xd", - "Xiao": "xc", - "Xie": "xx", - "Xin": "xn", - "Xing": "x;", - "Xiong": "xs", - "Xiu": "xq", - "Xu": "xu", - "Xuan": "xr", - "Xue": "xt", - "Xun": "xp", - "Za": "za", - "Zai": "zl", - "Zan": "zj", - "Zang": "zh", - "Zao": "zk", - "Ze": "ze", - "Zei": "zz", - "Zen": "zf", - "Zeng": "zg", - "Zha": "va", - "Zhai": "vl", - "Zhan": "vj", - "Zhang": "vh", - "Zhao": "vk", - "Zhe": "ve", - "Zhen": "vf", - "Zheng": "vg", - "Zhi": "vi", - "Zhong": "vs", - "Zhou": "vb", - "Zhu": "vu", - "Zhua": "vw", - "Zhuai": "vy", - "Zhuan": "vr", - "Zhuang": "vd", - "Zhui": "vv", - "Zhun": "vp", - "Zhuo": "vo", - "Zi": "zi", - "Zong": "zs", - "Zou": "zb", - "Zu": "zu", - "Zuan": "zr", - "Zui": "zv", - "Zun": "zp", - "Zuo": "zo" - }, - "ZhiNengABC": { - "Lv": "lv", - "Lve": "lm", - "Lue": "lm", - "Nv": "nv", - "Nve": "nm", - "Nue": "nm", - "A": "oa", - "O": "oo", - "E": "oe", - "Ai": "ol", - "Ei": "oq", - "Ao": "ok", - "Ou": "ob", - "An": "oj", - "En": "of", - "Ang": "oh", - "Eng": "og", - "Er": "or", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "yk", - "You": "yb", - "Yan": "yj", - "Yin": "yc", - "Yang": "yh", - "Ying": "yy", - "Wu": "wu", - "Wa": "wa", - "Wo": "wo", - "Wai": "wl", - "Wei": "wq", - "Wan": "wj", - "Wen": "wf", - "Wang": "wh", - "Weng": "wg", - "Yu": "yu", - "Yue": "ym", - "Yuan": "yp", - "Yun": "yn", - "Yong": "ys", - "Ba": "ba", - "Bai": "bl", - "Ban": "bj", - "Bang": "bh", - "Bao": "bk", - "Bei": "bq", - "Ben": "bf", - "Beng": "bg", - "Bi": "bi", - "Bian": "bw", - "Biang": "bt", - "Biao": "bz", - "Bie": "bx", - "Bin": "bc", - "Bing": "by", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "cl", - "Can": "cj", - "Cang": "ch", - "Cao": "ck", - "Ce": "ce", - "Cen": "cf", - "Ceng": "cg", - "Cha": "ea", - "Chai": "el", - "Chan": "ej", - "Chang": "eh", - "Chao": "ek", - "Che": "ee", - "Chen": "ef", - "Cheng": "eg", - "Chi": "ei", - "Chong": "es", - "Chou": "eb", - "Chu": "eu", - "Chua": "ed", - "Chuai": "ec", - "Chuan": "ep", - "Chuang": "et", - "Chui": "em", - "Chun": "en", - "Chuo": "eo", - "Ci": "ci", - "Cong": "cs", - "Cou": "cb", - "Cu": "cu", - "Cuan": "cp", - "Cui": "cm", - "Cun": "cn", - "Cuo": "co", - "Da": "da", - "Dai": "dl", - "Dan": "dj", - "Dang": "dh", - "Dao": "dk", - "De": "de", - "Dei": "dq", - "Den": "df", - "Deng": "dg", - "Di": "di", - "Dia": "dd", - "Dian": "dw", - "Diao": "dz", - "Die": "dx", - "Ding": "dy", - "Diu": "dr", - "Dong": "ds", - "Dou": "db", - "Du": "du", - "Duan": "dp", - "Dui": "dm", - "Dun": "dn", - "Duo": "do", - "Fa": "fa", - "Fan": "fj", - "Fang": "fh", - "Fei": "fq", - "Fen": "ff", - "Feng": "fg", - "Fiao": "fz", - "Fo": "fo", - "Fou": "fb", - "Fu": "fu", - "Ga": "ga", - "Gai": "gl", - "Gan": "gj", - "Gang": "gh", - "Gao": "gk", - "Ge": "ge", - "Gei": "gq", - "Gen": "gf", - "Geng": "gg", - "Gong": "gs", - "Gou": "gb", - "Gu": "gu", - "Gua": "gd", - "Guai": "gc", - "Guan": "gp", - "Guang": "gt", - "Gui": "gm", - "Gun": "gn", - "Guo": "go", - "Ha": "ha", - "Hai": "hl", - "Han": "hj", - "Hang": "hh", - "Hao": "hk", - "He": "he", - "Hei": "hq", - "Hen": "hf", - "Heng": "hg", - "Hong": "hs", - "Hou": "hb", - "Hu": "hu", - "Hua": "hd", - "Huai": "hc", - "Huan": "hp", - "Huang": "ht", - "Hui": "hm", - "Hun": "hn", - "Huo": "ho", - "Ji": "ji", - "Jia": "jd", - "Jian": "jw", - "Jiang": "jt", - "Jiao": "jz", - "Jie": "jx", - "Jin": "jc", - "Jing": "jy", - "Jiong": "js", - "Jiu": "jr", - "Ju": "ju", - "Juan": "jp", - "Jue": "jm", - "Jun": "jn", - "Ka": "ka", - "Kai": "kl", - "Kan": "kj", - "Kang": "kh", - "Kao": "kk", - "Ke": "ke", - "Ken": "kf", - "Keng": "kg", - "Kong": "ks", - "Kou": "kb", - "Ku": "ku", - "Kua": "kd", - "Kuai": "kc", - "Kuan": "kp", - "Kuang": "kt", - "Kui": "km", - "Kun": "kn", - "Kuo": "ko", - "La": "la", - "Lai": "ll", - "Lan": "lj", - "Lang": "lh", - "Lao": "lk", - "Le": "le", - "Lei": "lq", - "Leng": "lg", - "Li": "li", - "Lia": "ld", - "Lian": "lw", - "Liang": "lt", - "Liao": "lz", - "Lie": "lx", - "Lin": "lc", - "Ling": "ly", - "Liu": "lr", - "Lo": "lo", - "Long": "ls", - "Lou": "lb", - "Lu": "lu", - "Luan": "lp", - "Lun": "ln", - "Luo": "lo", - "Ma": "ma", - "Mai": "ml", - "Man": "mj", - "Mang": "mh", - "Mao": "mk", - "Me": "me", - "Mei": "mq", - "Men": "mf", - "Meng": "mg", - "Mi": "mi", - "Mian": "mw", - "Miao": "mz", - "Mie": "mx", - "Min": "mc", - "Ming": "my", - "Miu": "mr", - "Mo": "mo", - "Mou": "mb", - "Mu": "mu", - "Na": "na", - "Nai": "nl", - "Nan": "nj", - "Nang": "nh", - "Nao": "nk", - "Ne": "ne", - "Nei": "nq", - "Nen": "nf", - "Neng": "ng", - "Ni": "ni", - "Nian": "nw", - "Niang": "nt", - "Niao": "nz", - "Nie": "nx", - "Nin": "nc", - "Ning": "ny", - "Niu": "nr", - "Nong": "ns", - "Nou": "nb", - "Nu": "nu", - "Nuan": "np", - "Nun": "nn", - "Nuo": "no", - "Pa": "pa", - "Pai": "pl", - "Pan": "pj", - "Pang": "ph", - "Pao": "pk", - "Pei": "pq", - "Pen": "pf", - "Peng": "pg", - "Pi": "pi", - "Pian": "pw", - "Piao": "pz", - "Pie": "px", - "Pin": "pc", - "Ping": "py", - "Po": "po", - "Pou": "pb", - "Pu": "pu", - "Qi": "qi", - "Qia": "qd", - "Qian": "qw", - "Qiang": "qt", - "Qiao": "qz", - "Qie": "qx", - "Qin": "qc", - "Qing": "qy", - "Qiong": "qs", - "Qiu": "qr", - "Qu": "qu", - "Quan": "qp", - "Que": "qm", - "Qun": "qn", - "Ran": "rj", - "Rang": "rh", - "Rao": "rk", - "Re": "re", - "Ren": "rf", - "Reng": "rg", - "Ri": "ri", - "Rong": "rs", - "Rou": "rb", - "Ru": "ru", - "Rua": "rd", - "Ruan": "rp", - "Rui": "rm", - "Run": "rn", - "Ruo": "ro", - "Sa": "sa", - "Sai": "sl", - "San": "sj", - "Sang": "sh", - "Sao": "sk", - "Se": "se", - "Sen": "sf", - "Seng": "sg", - "Sha": "va", - "Shai": "vl", - "Shan": "vj", - "Shang": "vh", - "Shao": "vk", - "She": "ve", - "Shei": "vq", - "Shen": "vf", - "Sheng": "vg", - "Shi": "vi", - "Shou": "vb", - "Shu": "vu", - "Shua": "vd", - "Shuai": "vc", - "Shuan": "vp", - "Shuang": "vt", - "Shui": "vm", - "Shun": "vn", - "Shuo": "vo", - "Si": "si", - "Song": "ss", - "Sou": "sb", - "Su": "su", - "Suan": "sp", - "Sui": "sm", - "Sun": "sn", - "Suo": "so", - "Ta": "ta", - "Tai": "tl", - "Tan": "tj", - "Tang": "th", - "Tao": "tk", - "Te": "te", - "Tei": "tq", - "Teng": "tg", - "Ti": "ti", - "Tian": "tw", - "Tiao": "tz", - "Tie": "tx", - "Ting": "ty", - "Tong": "ts", - "Tou": "tb", - "Tu": "tu", - "Tuan": "tp", - "Tui": "tm", - "Tun": "tn", - "Tuo": "to", - "Xi": "xi", - "Xia": "xd", - "Xian": "xw", - "Xiang": "xt", - "Xiao": "xz", - "Xie": "xx", - "Xin": "xc", - "Xing": "xy", - "Xiong": "xs", - "Xiu": "xr", - "Xu": "xu", - "Xuan": "xp", - "Xue": "xm", - "Xun": "xn", - "Za": "za", - "Zai": "zl", - "Zan": "zj", - "Zang": "zh", - "Zao": "zk", - "Ze": "ze", - "Zei": "zq", - "Zen": "zf", - "Zeng": "zg", - "Zha": "aa", - "Zhai": "al", - "Zhan": "aj", - "Zhang": "ah", - "Zhao": "ak", - "Zhe": "ae", - "Zhen": "af", - "Zheng": "ag", - "Zhi": "ai", - "Zhong": "as", - "Zhou": "ab", - "Zhu": "au", - "Zhua": "ad", - "Zhuai": "ac", - "Zhuan": "ap", - "Zhuang": "at", - "Zhui": "am", - "Zhun": "an", - "Zhuo": "ao", - "Zi": "zi", - "Zong": "zs", - "Zou": "zb", - "Zu": "zu", - "Zuan": "zp", - "Zui": "zm", - "Zun": "zn", - "Zuo": "zo" - }, - "ZiGuangPinYin": { - "Lv": "lv", - "Lve": "ln", - "Lue": "ln", - "Nv": "nv", - "Nve": "nn", - "Nue": "nn", - "A": "oa", - "O": "oo", - "E": "oe", - "Ai": "op", - "Ei": "ok", - "Ao": "oq", - "Ou": "oz", - "An": "or", - "En": "ow", - "Ang": "os", - "Eng": "ot", - "Er": "oj", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "yq", - "You": "yz", - "Yan": "yr", - "Yin": "yy", - "Yang": "ys", - "Ying": "yc", - "Wu": "wu", - "Wa": "wa", - "Wo": "wo", - "Wai": "wp", - "Wei": "wk", - "Wan": "wr", - "Wen": "ww", - "Wang": "ws", - "Weng": "wt", - "Yu": "yu", - "Yue": "yn", - "Yuan": "yl", - "Yun": "ym", - "Yong": "yh", - "Ba": "ba", - "Bai": "bp", - "Ban": "br", - "Bang": "bs", - "Bao": "bq", - "Bei": "bk", - "Ben": "bw", - "Beng": "bt", - "Bi": "bi", - "Bian": "bf", - "Biang": "bg", - "Biao": "bb", - "Bie": "bd", - "Bin": "by", - "Bing": "bc", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "cp", - "Can": "cr", - "Cang": "cs", - "Cao": "cq", - "Ce": "ce", - "Cen": "cw", - "Ceng": "ct", - "Cha": "aa", - "Chai": "ap", - "Chan": "ar", - "Chang": "as", - "Chao": "aq", - "Che": "ae", - "Chen": "aw", - "Cheng": "at", - "Chi": "ai", - "Chong": "ah", - "Chou": "az", - "Chu": "au", - "Chua": "ax", - "Chuai": "ay", - "Chuan": "al", - "Chuang": "ag", - "Chui": "an", - "Chun": "am", - "Chuo": "ao", - "Ci": "ci", - "Cong": "ch", - "Cou": "cz", - "Cu": "cu", - "Cuan": "cl", - "Cui": "cn", - "Cun": "cm", - "Cuo": "co", - "Da": "da", - "Dai": "dp", - "Dan": "dr", - "Dang": "ds", - "Dao": "dq", - "De": "de", - "Dei": "dk", - "Den": "dw", - "Deng": "dt", - "Di": "di", - "Dia": "dx", - "Dian": "df", - "Diao": "db", - "Die": "dd", - "Ding": "dc", - "Diu": "dj", - "Dong": "dh", - "Dou": "dz", - "Du": "du", - "Duan": "dl", - "Dui": "dn", - "Dun": "dm", - "Duo": "do", - "Fa": "fa", - "Fan": "fr", - "Fang": "fs", - "Fei": "fk", - "Fen": "fw", - "Feng": "ft", - "Fiao": "fb", - "Fo": "fo", - "Fou": "fz", - "Fu": "fu", - "Ga": "ga", - "Gai": "gp", - "Gan": "gr", - "Gang": "gs", - "Gao": "gq", - "Ge": "ge", - "Gei": "gk", - "Gen": "gw", - "Geng": "gt", - "Gong": "gh", - "Gou": "gz", - "Gu": "gu", - "Gua": "gx", - "Guai": "gy", - "Guan": "gl", - "Guang": "gg", - "Gui": "gn", - "Gun": "gm", - "Guo": "go", - "Ha": "ha", - "Hai": "hp", - "Han": "hr", - "Hang": "hs", - "Hao": "hq", - "He": "he", - "Hei": "hk", - "Hen": "hw", - "Heng": "ht", - "Hong": "hh", - "Hou": "hz", - "Hu": "hu", - "Hua": "hx", - "Huai": "hy", - "Huan": "hl", - "Huang": "hg", - "Hui": "hn", - "Hun": "hm", - "Huo": "ho", - "Ji": "ji", - "Jia": "jx", - "Jian": "jf", - "Jiang": "jg", - "Jiao": "jb", - "Jie": "jd", - "Jin": "jy", - "Jing": "jc", - "Jiong": "jh", - "Jiu": "jj", - "Ju": "ju", - "Juan": "jl", - "Jue": "jn", - "Jun": "jm", - "Ka": "ka", - "Kai": "kp", - "Kan": "kr", - "Kang": "ks", - "Kao": "kq", - "Ke": "ke", - "Ken": "kw", - "Keng": "kt", - "Kong": "kh", - "Kou": "kz", - "Ku": "ku", - "Kua": "kx", - "Kuai": "ky", - "Kuan": "kl", - "Kuang": "kg", - "Kui": "kn", - "Kun": "km", - "Kuo": "ko", - "La": "la", - "Lai": "lp", - "Lan": "lr", - "Lang": "ls", - "Lao": "lq", - "Le": "le", - "Lei": "lk", - "Leng": "lt", - "Li": "li", - "Lia": "lx", - "Lian": "lf", - "Liang": "lg", - "Liao": "lb", - "Lie": "ld", - "Lin": "ly", - "Ling": "lc", - "Liu": "lj", - "Lo": "lo", - "Long": "lh", - "Lou": "lz", - "Lu": "lu", - "Luan": "ll", - "Lun": "lm", - "Luo": "lo", - "Ma": "ma", - "Mai": "mp", - "Man": "mr", - "Mang": "ms", - "Mao": "mq", - "Me": "me", - "Mei": "mk", - "Men": "mw", - "Meng": "mt", - "Mi": "mi", - "Mian": "mf", - "Miao": "mb", - "Mie": "md", - "Min": "my", - "Ming": "mc", - "Miu": "mj", - "Mo": "mo", - "Mou": "mz", - "Mu": "mu", - "Na": "na", - "Nai": "np", - "Nan": "nr", - "Nang": "ns", - "Nao": "nq", - "Ne": "ne", - "Nei": "nk", - "Nen": "nw", - "Neng": "nt", - "Ni": "ni", - "Nian": "nf", - "Niang": "ng", - "Niao": "nb", - "Nie": "nd", - "Nin": "ny", - "Ning": "nc", - "Niu": "nj", - "Nong": "nh", - "Nou": "nz", - "Nu": "nu", - "Nuan": "nl", - "Nun": "nm", - "Nuo": "no", - "Pa": "pa", - "Pai": "pp", - "Pan": "pr", - "Pang": "ps", - "Pao": "pq", - "Pei": "pk", - "Pen": "pw", - "Peng": "pt", - "Pi": "pi", - "Pian": "pf", - "Piao": "pb", - "Pie": "pd", - "Pin": "py", - "Ping": "pc", - "Po": "po", - "Pou": "pz", - "Pu": "pu", - "Qi": "qi", - "Qia": "qx", - "Qian": "qf", - "Qiang": "qg", - "Qiao": "qb", - "Qie": "qd", - "Qin": "qy", - "Qing": "qc", - "Qiong": "qh", - "Qiu": "qj", - "Qu": "qu", - "Quan": "ql", - "Que": "qn", - "Qun": "qm", - "Ran": "rr", - "Rang": "rs", - "Rao": "rq", - "Re": "re", - "Ren": "rw", - "Reng": "rt", - "Ri": "ri", - "Rong": "rh", - "Rou": "rz", - "Ru": "ru", - "Rua": "rx", - "Ruan": "rl", - "Rui": "rn", - "Run": "rm", - "Ruo": "ro", - "Sa": "sa", - "Sai": "sp", - "San": "sr", - "Sang": "ss", - "Sao": "sq", - "Se": "se", - "Sen": "sw", - "Seng": "st", - "Sha": "ia", - "Shai": "ip", - "Shan": "ir", - "Shang": "is", - "Shao": "iq", - "She": "ie", - "Shei": "ik", - "Shen": "iw", - "Sheng": "it", - "Shi": "ii", - "Shou": "iz", - "Shu": "iu", - "Shua": "ix", - "Shuai": "iy", - "Shuan": "il", - "Shuang": "ig", - "Shui": "in", - "Shun": "im", - "Shuo": "io", - "Si": "si", - "Song": "sh", - "Sou": "sz", - "Su": "su", - "Suan": "sl", - "Sui": "sn", - "Sun": "sm", - "Suo": "so", - "Ta": "ta", - "Tai": "tp", - "Tan": "tr", - "Tang": "ts", - "Tao": "tq", - "Te": "te", - "Tei": "tk", - "Teng": "tt", - "Ti": "ti", - "Tian": "tf", - "Tiao": "tb", - "Tie": "td", - "Ting": "tc", - "Tong": "th", - "Tou": "tz", - "Tu": "tu", - "Tuan": "tl", - "Tui": "tn", - "Tun": "tm", - "Tuo": "to", - "Xi": "xi", - "Xia": "xx", - "Xian": "xf", - "Xiang": "xg", - "Xiao": "xb", - "Xie": "xd", - "Xin": "xy", - "Xing": "xc", - "Xiong": "xh", - "Xiu": "xj", - "Xu": "xu", - "Xuan": "xl", - "Xue": "xn", - "Xun": "xm", - "Za": "za", - "Zai": "zp", - "Zan": "zr", - "Zang": "zs", - "Zao": "zq", - "Ze": "ze", - "Zei": "zk", - "Zen": "zw", - "Zeng": "zt", - "Zha": "ua", - "Zhai": "up", - "Zhan": "ur", - "Zhang": "us", - "Zhao": "uq", - "Zhe": "ue", - "Zhen": "uw", - "Zheng": "ut", - "Zhi": "ui", - "Zhong": "uh", - "Zhou": "uz", - "Zhu": "uu", - "Zhua": "ux", - "Zhuai": "uy", - "Zhuan": "ul", - "Zhuang": "ug", - "Zhui": "un", - "Zhun": "um", - "Zhuo": "uo", - "Zi": "zi", - "Zong": "zh", - "Zou": "zz", - "Zu": "zu", - "Zuan": "zl", - "Zui": "zn", - "Zun": "zm", - "Zuo": "zo" - }, - "PinYinJiaJia": { - "Lv": "lv", - "Lve": "lx", - "Lue": "lx", - "Nv": "nv", - "Nve": "nx", - "Nue": "nx", - "A": "aa", - "O": "oo", - "E": "ee", - "Ai": "as", - "Ei": "ew", - "Ao": "ad", - "Ou": "op", - "An": "af", - "En": "er", - "Ang": "ag", - "Eng": "et", - "Er": "eq", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "yd", - "You": "yp", - "Yan": "yf", - "Yin": "yl", - "Yang": "yg", - "Ying": "yq", - "Wu": "wu", - "Wa": "wa", - "Wo": "wo", - "Wai": "ws", - "Wei": "ww", - "Wan": "wf", - "Wen": "wr", - "Wang": "wg", - "Weng": "wt", - "Yu": "yu", - "Yue": "yx", - "Yuan": "yc", - "Yun": "yz", - "Yong": "yy", - "Ba": "ba", - "Bai": "bs", - "Ban": "bf", - "Bang": "bg", - "Bao": "bd", - "Bei": "bw", - "Ben": "br", - "Beng": "bt", - "Bi": "bi", - "Bian": "bj", - "Biang": "bh", - "Biao": "bk", - "Bie": "bm", - "Bin": "bl", - "Bing": "bq", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "cs", - "Can": "cf", - "Cang": "cg", - "Cao": "cd", - "Ce": "ce", - "Cen": "cr", - "Ceng": "ct", - "Cha": "ua", - "Chai": "us", - "Chan": "uf", - "Chang": "ug", - "Chao": "ud", - "Che": "ue", - "Chen": "ur", - "Cheng": "ut", - "Chi": "ui", - "Chong": "uy", - "Chou": "up", - "Chu": "uu", - "Chua": "ub", - "Chuai": "ux", - "Chuan": "uc", - "Chuang": "uh", - "Chui": "uv", - "Chun": "uz", - "Chuo": "uo", - "Ci": "ci", - "Cong": "cy", - "Cou": "cp", - "Cu": "cu", - "Cuan": "cc", - "Cui": "cv", - "Cun": "cz", - "Cuo": "co", - "Da": "da", - "Dai": "ds", - "Dan": "df", - "Dang": "dg", - "Dao": "dd", - "De": "de", - "Dei": "dw", - "Den": "dr", - "Deng": "dt", - "Di": "di", - "Dia": "db", - "Dian": "dj", - "Diao": "dk", - "Die": "dm", - "Ding": "dq", - "Diu": "dn", - "Dong": "dy", - "Dou": "dp", - "Du": "du", - "Duan": "dc", - "Dui": "dv", - "Dun": "dz", - "Duo": "do", - "Fa": "fa", - "Fan": "ff", - "Fang": "fg", - "Fei": "fw", - "Fen": "fr", - "Feng": "ft", - "Fiao": "fk", - "Fo": "fo", - "Fou": "fp", - "Fu": "fu", - "Ga": "ga", - "Gai": "gs", - "Gan": "gf", - "Gang": "gg", - "Gao": "gd", - "Ge": "ge", - "Gei": "gw", - "Gen": "gr", - "Geng": "gt", - "Gong": "gy", - "Gou": "gp", - "Gu": "gu", - "Gua": "gb", - "Guai": "gx", - "Guan": "gc", - "Guang": "gh", - "Gui": "gv", - "Gun": "gz", - "Guo": "go", - "Ha": "ha", - "Hai": "hs", - "Han": "hf", - "Hang": "hg", - "Hao": "hd", - "He": "he", - "Hei": "hw", - "Hen": "hr", - "Heng": "ht", - "Hong": "hy", - "Hou": "hp", - "Hu": "hu", - "Hua": "hb", - "Huai": "hx", - "Huan": "hc", - "Huang": "hh", - "Hui": "hv", - "Hun": "hz", - "Huo": "ho", - "Ji": "ji", - "Jia": "jb", - "Jian": "jj", - "Jiang": "jh", - "Jiao": "jk", - "Jie": "jm", - "Jin": "jl", - "Jing": "jq", - "Jiong": "jy", - "Jiu": "jn", - "Ju": "ju", - "Juan": "jc", - "Jue": "jx", - "Jun": "jz", - "Ka": "ka", - "Kai": "ks", - "Kan": "kf", - "Kang": "kg", - "Kao": "kd", - "Ke": "ke", - "Ken": "kr", - "Keng": "kt", - "Kong": "ky", - "Kou": "kp", - "Ku": "ku", - "Kua": "kb", - "Kuai": "kx", - "Kuan": "kc", - "Kuang": "kh", - "Kui": "kv", - "Kun": "kz", - "Kuo": "ko", - "La": "la", - "Lai": "ls", - "Lan": "lf", - "Lang": "lg", - "Lao": "ld", - "Le": "le", - "Lei": "lw", - "Leng": "lt", - "Li": "li", - "Lia": "lb", - "Lian": "lj", - "Liang": "lh", - "Liao": "lk", - "Lie": "lm", - "Lin": "ll", - "Ling": "lq", - "Liu": "ln", - "Lo": "lo", - "Long": "ly", - "Lou": "lp", - "Lu": "lu", - "Luan": "lc", - "Lun": "lz", - "Luo": "lo", - "Ma": "ma", - "Mai": "ms", - "Man": "mf", - "Mang": "mg", - "Mao": "md", - "Me": "me", - "Mei": "mw", - "Men": "mr", - "Meng": "mt", - "Mi": "mi", - "Mian": "mj", - "Miao": "mk", - "Mie": "mm", - "Min": "ml", - "Ming": "mq", - "Miu": "mn", - "Mo": "mo", - "Mou": "mp", - "Mu": "mu", - "Na": "na", - "Nai": "ns", - "Nan": "nf", - "Nang": "ng", - "Nao": "nd", - "Ne": "ne", - "Nei": "nw", - "Nen": "nr", - "Neng": "nt", - "Ni": "ni", - "Nian": "nj", - "Niang": "nh", - "Niao": "nk", - "Nie": "nm", - "Nin": "nl", - "Ning": "nq", - "Niu": "nn", - "Nong": "ny", - "Nou": "np", - "Nu": "nu", - "Nuan": "nc", - "Nun": "nz", - "Nuo": "no", - "Pa": "pa", - "Pai": "ps", - "Pan": "pf", - "Pang": "pg", - "Pao": "pd", - "Pei": "pw", - "Pen": "pr", - "Peng": "pt", - "Pi": "pi", - "Pian": "pj", - "Piao": "pk", - "Pie": "pm", - "Pin": "pl", - "Ping": "pq", - "Po": "po", - "Pou": "pp", - "Pu": "pu", - "Qi": "qi", - "Qia": "qb", - "Qian": "qj", - "Qiang": "qh", - "Qiao": "qk", - "Qie": "qm", - "Qin": "ql", - "Qing": "qq", - "Qiong": "qy", - "Qiu": "qn", - "Qu": "qu", - "Quan": "qc", - "Que": "qx", - "Qun": "qz", - "Ran": "rf", - "Rang": "rg", - "Rao": "rd", - "Re": "re", - "Ren": "rr", - "Reng": "rt", - "Ri": "ri", - "Rong": "ry", - "Rou": "rp", - "Ru": "ru", - "Rua": "rb", - "Ruan": "rc", - "Rui": "rv", - "Run": "rz", - "Ruo": "ro", - "Sa": "sa", - "Sai": "ss", - "San": "sf", - "Sang": "sg", - "Sao": "sd", - "Se": "se", - "Sen": "sr", - "Seng": "st", - "Sha": "ia", - "Shai": "is", - "Shan": "if", - "Shang": "ig", - "Shao": "id", - "She": "ie", - "Shei": "iw", - "Shen": "ir", - "Sheng": "it", - "Shi": "ii", - "Shou": "ip", - "Shu": "iu", - "Shua": "ib", - "Shuai": "ix", - "Shuan": "ic", - "Shuang": "ih", - "Shui": "iv", - "Shun": "iz", - "Shuo": "io", - "Si": "si", - "Song": "sy", - "Sou": "sp", - "Su": "su", - "Suan": "sc", - "Sui": "sv", - "Sun": "sz", - "Suo": "so", - "Ta": "ta", - "Tai": "ts", - "Tan": "tf", - "Tang": "tg", - "Tao": "td", - "Te": "te", - "Tei": "tw", - "Teng": "tt", - "Ti": "ti", - "Tian": "tj", - "Tiao": "tk", - "Tie": "tm", - "Ting": "tq", - "Tong": "ty", - "Tou": "tp", - "Tu": "tu", - "Tuan": "tc", - "Tui": "tv", - "Tun": "tz", - "Tuo": "to", - "Xi": "xi", - "Xia": "xb", - "Xian": "xj", - "Xiang": "xh", - "Xiao": "xk", - "Xie": "xm", - "Xin": "xl", - "Xing": "xq", - "Xiong": "xy", - "Xiu": "xn", - "Xu": "xu", - "Xuan": "xc", - "Xue": "xx", - "Xun": "xz", - "Za": "za", - "Zai": "zs", - "Zan": "zf", - "Zang": "zg", - "Zao": "zd", - "Ze": "ze", - "Zei": "zw", - "Zen": "zr", - "Zeng": "zt", - "Zha": "va", - "Zhai": "vs", - "Zhan": "vf", - "Zhang": "vg", - "Zhao": "vd", - "Zhe": "ve", - "Zhen": "vr", - "Zheng": "vt", - "Zhi": "vi", - "Zhong": "vy", - "Zhou": "vp", - "Zhu": "vu", - "Zhua": "vb", - "Zhuai": "vx", - "Zhuan": "vc", - "Zhuang": "vh", - "Zhui": "vv", - "Zhun": "vz", - "Zhuo": "vo", - "Zi": "zi", - "Zong": "zy", - "Zou": "zp", - "Zu": "zu", - "Zuan": "zc", - "Zui": "zv", - "Zun": "zz", - "Zuo": "zo" - }, - "XingKongJianDao": { - "Lv": "lv", - "Lve": "ly", - "Lue": "ly", - "Nv": "nv", - "Nve": "ny", - "Nue": "ny", - "A": "xa", - "O": "xo", - "E": "xe", - "Ai": "xj", - "Ei": "xw", - "Ao": "xs", - "Ou": "xt", - "An": "xd", - "En": "xk", - "Ang": "xf", - "Eng": "xh", - "Er": "xu", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "ys", - "You": "yt", - "Yan": "yd", - "Yin": "yb", - "Yang": "yf", - "Ying": "yg", - "Wu": "wj", - "Wa": "ws", - "Wo": "wo", - "Wai": "wh", - "Wei": "ww", - "Wan": "wf", - "Wen": "wn", - "Wang": "wp", - "Weng": "wr", - "Yu": "yv", - "Yue": "yy", - "Yuan": "yr", - "Yun": "yw", - "Yong": "yl", - "Ba": "ba", - "Bai": "bj", - "Ban": "bd", - "Bang": "bf", - "Bao": "bs", - "Bei": "bw", - "Ben": "bk", - "Beng": "bh", - "Bi": "bi", - "Bian": "bm", - "Biang": "bx", - "Biao": "bp", - "Bie": "bc", - "Bin": "bb", - "Bing": "bg", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "cj", - "Can": "cd", - "Cang": "cf", - "Cao": "cs", - "Ce": "ce", - "Cen": "ck", - "Ceng": "ch", - "Cha": "ja", - "Chai": "jj", - "Chan": "jd", - "Chang": "jf", - "Chao": "js", - "Che": "je", - "Chen": "jk", - "Cheng": "jh", - "Chi": "wi", - "Chong": "wl", - "Chou": "jt", - "Chu": "ju", - "Chua": "wx", - "Chuai": "wg", - "Chuan": "wr", - "Chuang": "wn", - "Chui": "wy", - "Chun": "jz", - "Chuo": "jo", - "Ci": "ci", - "Cong": "cl", - "Cou": "ct", - "Cu": "cu", - "Cuan": "cr", - "Cui": "cy", - "Cun": "cz", - "Cuo": "co", - "Da": "da", - "Dai": "dj", - "Dan": "dd", - "Dang": "df", - "Dao": "ds", - "De": "de", - "Dei": "dw", - "Den": "dk", - "Deng": "dh", - "Di": "di", - "Dia": "dx", - "Dian": "dm", - "Diao": "dp", - "Die": "dc", - "Ding": "dg", - "Diu": "dq", - "Dong": "dl", - "Dou": "dt", - "Du": "du", - "Duan": "dr", - "Dui": "dy", - "Dun": "dz", - "Duo": "do", - "Fa": "fs", - "Fan": "ff", - "Fang": "fp", - "Fei": "fw", - "Fen": "fn", - "Feng": "fr", - "Fiao": "fp", - "Fo": "fl", - "Fou": "fd", - "Fu": "fl", - "Ga": "ga", - "Gai": "gj", - "Gan": "gd", - "Gang": "gf", - "Gao": "gs", - "Ge": "ge", - "Gei": "gw", - "Gen": "gk", - "Geng": "gh", - "Gong": "gl", - "Gou": "gt", - "Gu": "gu", - "Gua": "gx", - "Guai": "gg", - "Guan": "gr", - "Guang": "gn", - "Gui": "gy", - "Gun": "gz", - "Guo": "go", - "Ha": "ha", - "Hai": "hj", - "Han": "hd", - "Hang": "hf", - "Hao": "hs", - "He": "he", - "Hei": "hw", - "Hen": "hk", - "Heng": "hh", - "Hong": "hl", - "Hou": "ht", - "Hu": "hu", - "Hua": "hx", - "Huai": "hg", - "Huan": "hr", - "Huang": "hn", - "Hui": "hy", - "Hun": "hz", - "Huo": "ho", - "Ji": "jk", - "Jia": "js", - "Jian": "jm", - "Jiang": "jn", - "Jiao": "jp", - "Jie": "jc", - "Jin": "jb", - "Jing": "jg", - "Jiong": "jy", - "Jiu": "jq", - "Ju": "jv", - "Juan": "jt", - "Jue": "jh", - "Jun": "jw", - "Ka": "ka", - "Kai": "kj", - "Kan": "kd", - "Kang": "kf", - "Kao": "ks", - "Ke": "ke", - "Ken": "kk", - "Keng": "kh", - "Kong": "kl", - "Kou": "kt", - "Ku": "ku", - "Kua": "kx", - "Kuai": "kg", - "Kuan": "kr", - "Kuang": "kn", - "Kui": "ky", - "Kun": "kz", - "Kuo": "ko", - "La": "la", - "Lai": "lj", - "Lan": "ld", - "Lang": "lf", - "Lao": "ls", - "Le": "le", - "Lei": "lw", - "Leng": "lh", - "Li": "li", - "Lia": "lx", - "Lian": "lm", - "Liang": "ln", - "Liao": "lp", - "Lie": "lc", - "Lin": "lb", - "Ling": "lg", - "Liu": "lq", - "Lo": "ll", - "Long": "ll", - "Lou": "lt", - "Lu": "lu", - "Luan": "lr", - "Lun": "lz", - "Luo": "lo", - "Ma": "ma", - "Mai": "mj", - "Man": "md", - "Mang": "mf", - "Mao": "ms", - "Me": "me", - "Mei": "mw", - "Men": "mk", - "Meng": "mh", - "Mi": "mi", - "Mian": "mm", - "Miao": "mp", - "Mie": "mc", - "Min": "mb", - "Ming": "mg", - "Miu": "mq", - "Mo": "mo", - "Mou": "mt", - "Mu": "mu", - "Na": "na", - "Nai": "nj", - "Nan": "nd", - "Nang": "nf", - "Nao": "ns", - "Ne": "ne", - "Nei": "nw", - "Nen": "nk", - "Neng": "nh", - "Ni": "ni", - "Nian": "nm", - "Niang": "nn", - "Niao": "np", - "Nie": "nc", - "Nin": "nb", - "Ning": "ng", - "Niu": "nq", - "Nong": "nl", - "Nou": "nt", - "Nu": "nu", - "Nuan": "nr", - "Nun": "nz", - "Nuo": "no", - "Pa": "pa", - "Pai": "pj", - "Pan": "pd", - "Pang": "pf", - "Pao": "ps", - "Pei": "pw", - "Pen": "pk", - "Peng": "ph", - "Pi": "pi", - "Pian": "pm", - "Piao": "pp", - "Pie": "pc", - "Pin": "pb", - "Ping": "pg", - "Po": "po", - "Pou": "pt", - "Pu": "pu", - "Qi": "qk", - "Qia": "qs", - "Qian": "qm", - "Qiang": "qx", - "Qiao": "qp", - "Qie": "qc", - "Qin": "qb", - "Qing": "qg", - "Qiong": "qy", - "Qiu": "qq", - "Qu": "qv", - "Quan": "qt", - "Que": "qh", - "Qun": "qw", - "Ran": "rd", - "Rang": "rf", - "Rao": "rs", - "Re": "re", - "Ren": "rk", - "Reng": "rh", - "Ri": "ri", - "Rong": "rl", - "Rou": "rt", - "Ru": "ru", - "Rua": "rx", - "Ruan": "rr", - "Rui": "ry", - "Run": "rz", - "Ruo": "ro", - "Sa": "sa", - "Sai": "sj", - "San": "sd", - "Sang": "sf", - "Sao": "ss", - "Se": "se", - "Sen": "sk", - "Seng": "sh", - "Sha": "ea", - "Shai": "ej", - "Shan": "ed", - "Shang": "ef", - "Shao": "es", - "She": "ee", - "Shei": "ew", - "Shen": "ek", - "Sheng": "eh", - "Shi": "ei", - "Shou": "et", - "Shu": "eu", - "Shua": "ex", - "Shuai": "eg", - "Shuan": "er", - "Shuang": "en", - "Shui": "ey", - "Shun": "ez", - "Shuo": "eo", - "Si": "si", - "Song": "sl", - "Sou": "st", - "Su": "su", - "Suan": "sr", - "Sui": "sy", - "Sun": "sz", - "Suo": "so", - "Ta": "ta", - "Tai": "tj", - "Tan": "td", - "Tang": "tf", - "Tao": "ts", - "Te": "te", - "Tei": "tw", - "Teng": "th", - "Ti": "ti", - "Tian": "tm", - "Tiao": "tp", - "Tie": "tc", - "Ting": "tg", - "Tong": "tl", - "Tou": "tt", - "Tu": "tu", - "Tuan": "tr", - "Tui": "ty", - "Tun": "tz", - "Tuo": "to", - "Xi": "xi", - "Xia": "xx", - "Xian": "xm", - "Xiang": "xn", - "Xiao": "xp", - "Xie": "xc", - "Xin": "xb", - "Xing": "xg", - "Xiong": "xl", - "Xiu": "xq", - "Xu": "xv", - "Xuan": "xr", - "Xue": "xy", - "Xun": "xw", - "Za": "za", - "Zai": "zj", - "Zan": "zd", - "Zang": "zf", - "Zao": "zs", - "Ze": "ze", - "Zei": "zw", - "Zen": "zk", - "Zeng": "zh", - "Zha": "qa", - "Zhai": "fj", - "Zhan": "qd", - "Zhang": "qf", - "Zhao": "fs", - "Zhe": "fe", - "Zhen": "qk", - "Zheng": "qh", - "Zhi": "fi", - "Zhong": "fy", - "Zhou": "qt", - "Zhu": "qu", - "Zhua": "fx", - "Zhuai": "fg", - "Zhuan": "fr", - "Zhuang": "fn", - "Zhui": "fy", - "Zhun": "fz", - "Zhuo": "qo", - "Zi": "zi", - "Zong": "zl", - "Zou": "zt", - "Zu": "zu", - "Zuan": "zr", - "Zui": "zy", - "Zun": "zz", - "Zuo": "zo" - }, - "DaNiu": { - "Lv": "lv", - "Lve": "lx", - "Lue": "lx", - "Nv": "nv", - "Nve": "nx", - "Nue": "nx", - "A": "ea", - "O": "eo", - "E": "ee", - "Ai": "eh", - "Ei": "ew", - "Ao": "es", - "Ou": "er", - "An": "ed", - "En": "ek", - "Ang": "ef", - "Eng": "ej", - "Er": "eu", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "ys", - "You": "yr", - "Yan": "yd", - "Yin": "yb", - "Yang": "yf", - "Ying": "yg", - "Wu": "wu", - "Wa": "wa", - "Wo": "wo", - "Wai": "wh", - "Wei": "ww", - "Wan": "wd", - "Wen": "wk", - "Wang": "wf", - "Weng": "wj", - "Yu": "yu", - "Yue": "yh", - "Yuan": "yj", - "Yun": "yw", - "Yong": "yl", - "Ba": "ba", - "Bai": "bh", - "Ban": "bd", - "Bang": "bf", - "Bao": "bs", - "Bei": "bw", - "Ben": "bk", - "Beng": "bj", - "Bi": "bi", - "Bian": "bc", - "Biang": "bn", - "Biao": "bm", - "Bie": "bp", - "Bin": "bb", - "Bing": "bg", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "ch", - "Can": "cd", - "Cang": "cf", - "Cao": "cs", - "Ce": "ce", - "Cen": "ck", - "Ceng": "cj", - "Cha": "ia", - "Chai": "ih", - "Chan": "id", - "Chang": "if", - "Chao": "is", - "Che": "ie", - "Chen": "ik", - "Cheng": "ij", - "Chi": "ii", - "Chong": "il", - "Chou": "ir", - "Chu": "iu", - "Chua": "iq", - "Chuai": "ig", - "Chuan": "iz", - "Chuang": "ix", - "Chui": "in", - "Chun": "iy", - "Chuo": "io", - "Ci": "ci", - "Cong": "cl", - "Cou": "cr", - "Cu": "cu", - "Cuan": "cz", - "Cui": "cn", - "Cun": "cy", - "Cuo": "co", - "Da": "da", - "Dai": "dh", - "Dan": "dd", - "Dang": "df", - "Dao": "ds", - "De": "de", - "Dei": "dw", - "Den": "dk", - "Deng": "dj", - "Di": "di", - "Dia": "dk", - "Dian": "dc", - "Diao": "dm", - "Die": "dp", - "Ding": "dg", - "Diu": "dt", - "Dong": "dl", - "Dou": "dr", - "Du": "du", - "Duan": "dz", - "Dui": "dn", - "Dun": "dy", - "Duo": "do", - "Fa": "fa", - "Fan": "fd", - "Fang": "ff", - "Fei": "fw", - "Fen": "fk", - "Feng": "fj", - "Fiao": "fm", - "Fo": "fo", - "Fou": "fr", - "Fu": "fu", - "Ga": "ga", - "Gai": "gh", - "Gan": "gd", - "Gang": "gf", - "Gao": "gs", - "Ge": "ge", - "Gei": "gw", - "Gen": "gk", - "Geng": "gj", - "Gong": "gl", - "Gou": "gr", - "Gu": "gu", - "Gua": "gq", - "Guai": "gg", - "Guan": "gz", - "Guang": "gx", - "Gui": "gn", - "Gun": "gy", - "Guo": "go", - "Ha": "ha", - "Hai": "hh", - "Han": "hd", - "Hang": "hf", - "Hao": "hs", - "He": "he", - "Hei": "hw", - "Hen": "hk", - "Heng": "hj", - "Hong": "hl", - "Hou": "hr", - "Hu": "hu", - "Hua": "hq", - "Huai": "hg", - "Huan": "hz", - "Huang": "hx", - "Hui": "hn", - "Hun": "hy", - "Huo": "ho", - "Ji": "ji", - "Jia": "jk", - "Jian": "jc", - "Jiang": "jn", - "Jiao": "jm", - "Jie": "jp", - "Jin": "jb", - "Jing": "jg", - "Jiong": "jl", - "Jiu": "jt", - "Ju": "ju", - "Juan": "jj", - "Jue": "jh", - "Jun": "jw", - "Ka": "ka", - "Kai": "kh", - "Kan": "kd", - "Kang": "kf", - "Kao": "ks", - "Ke": "ke", - "Ken": "kk", - "Keng": "kj", - "Kong": "kl", - "Kou": "kr", - "Ku": "ku", - "Kua": "kq", - "Kuai": "kg", - "Kuan": "kz", - "Kuang": "kx", - "Kui": "kn", - "Kun": "ky", - "Kuo": "ko", - "La": "la", - "Lai": "lh", - "Lan": "ld", - "Lang": "lf", - "Lao": "ls", - "Le": "le", - "Lei": "lw", - "Leng": "lj", - "Li": "li", - "Lia": "lk", - "Lian": "lc", - "Liang": "ln", - "Liao": "lm", - "Lie": "lp", - "Lin": "lb", - "Ling": "lg", - "Liu": "lt", - "Lo": "lo", - "Long": "ll", - "Lou": "lr", - "Lu": "lu", - "Luan": "lz", - "Lun": "ly", - "Luo": "lo", - "Ma": "ma", - "Mai": "mh", - "Man": "md", - "Mang": "mf", - "Mao": "ms", - "Me": "me", - "Mei": "mw", - "Men": "mk", - "Meng": "mj", - "Mi": "mi", - "Mian": "mc", - "Miao": "mm", - "Mie": "mp", - "Min": "mb", - "Ming": "mg", - "Miu": "mt", - "Mo": "mo", - "Mou": "mr", - "Mu": "mu", - "Na": "na", - "Nai": "nh", - "Nan": "nd", - "Nang": "nf", - "Nao": "ns", - "Ne": "ne", - "Nei": "nw", - "Nen": "nk", - "Neng": "nj", - "Ni": "ni", - "Nian": "nc", - "Niang": "nn", - "Niao": "nm", - "Nie": "np", - "Nin": "nb", - "Ning": "ng", - "Niu": "nt", - "Nong": "nl", - "Nou": "nr", - "Nu": "nu", - "Nuan": "nz", - "Nun": "ny", - "Nuo": "no", - "Pa": "pa", - "Pai": "ph", - "Pan": "pd", - "Pang": "pf", - "Pao": "ps", - "Pei": "pw", - "Pen": "pk", - "Peng": "pj", - "Pi": "pi", - "Pian": "pc", - "Piao": "pm", - "Pie": "pp", - "Pin": "pb", - "Ping": "pg", - "Po": "po", - "Pou": "pr", - "Pu": "pu", - "Qi": "qi", - "Qia": "qk", - "Qian": "qc", - "Qiang": "qn", - "Qiao": "qm", - "Qie": "qp", - "Qin": "qb", - "Qing": "qg", - "Qiong": "ql", - "Qiu": "qt", - "Qu": "qu", - "Quan": "qj", - "Que": "qh", - "Qun": "qw", - "Ran": "rd", - "Rang": "rf", - "Rao": "rs", - "Re": "re", - "Ren": "rk", - "Reng": "rj", - "Ri": "ri", - "Rong": "rl", - "Rou": "rr", - "Ru": "ru", - "Rua": "rq", - "Ruan": "rz", - "Rui": "rn", - "Run": "ry", - "Ruo": "ro", - "Sa": "sa", - "Sai": "sh", - "San": "sd", - "Sang": "sf", - "Sao": "ss", - "Se": "se", - "Sen": "sk", - "Seng": "sj", - "Sha": "ua", - "Shai": "uh", - "Shan": "ud", - "Shang": "uf", - "Shao": "us", - "She": "ue", - "Shei": "uw", - "Shen": "uk", - "Sheng": "uj", - "Shi": "ui", - "Shou": "ur", - "Shu": "uu", - "Shua": "uq", - "Shuai": "ug", - "Shuan": "uz", - "Shuang": "ux", - "Shui": "un", - "Shun": "uy", - "Shuo": "uo", - "Si": "si", - "Song": "sl", - "Sou": "sr", - "Su": "su", - "Suan": "sz", - "Sui": "sn", - "Sun": "sy", - "Suo": "so", - "Ta": "ta", - "Tai": "th", - "Tan": "td", - "Tang": "tf", - "Tao": "ts", - "Te": "te", - "Tei": "tw", - "Teng": "tj", - "Ti": "ti", - "Tian": "tc", - "Tiao": "tm", - "Tie": "tp", - "Ting": "tg", - "Tong": "tl", - "Tou": "tr", - "Tu": "tu", - "Tuan": "tz", - "Tui": "tn", - "Tun": "ty", - "Tuo": "to", - "Xi": "xi", - "Xia": "xk", - "Xian": "xc", - "Xiang": "xn", - "Xiao": "xm", - "Xie": "xp", - "Xin": "xb", - "Xing": "xg", - "Xiong": "xl", - "Xiu": "xt", - "Xu": "xu", - "Xuan": "xj", - "Xue": "xh", - "Xun": "xw", - "Za": "za", - "Zai": "zh", - "Zan": "zd", - "Zang": "zf", - "Zao": "zs", - "Ze": "ze", - "Zei": "zw", - "Zen": "zk", - "Zeng": "zj", - "Zha": "aa", - "Zhai": "ah", - "Zhan": "ad", - "Zhang": "af", - "Zhao": "as", - "Zhe": "ae", - "Zhen": "ak", - "Zheng": "aj", - "Zhi": "ai", - "Zhong": "al", - "Zhou": "ar", - "Zhu": "au", - "Zhua": "aq", - "Zhuai": "ag", - "Zhuan": "az", - "Zhuang": "ax", - "Zhui": "an", - "Zhun": "ay", - "Zhuo": "ao", - "Zi": "zi", - "Zong": "zl", - "Zou": "zr", - "Zu": "zu", - "Zuan": "zz", - "Zui": "zn", - "Zun": "zy", - "Zuo": "zo" - }, - "XiaoLang": { - "Lv": "lx", - "Lve": "lb", - "Lue": "lb", - "Nv": "nx", - "Nve": "nb", - "Nue": "nb", - "A": "aa", - "O": "oo", - "E": "uu", - "Ai": "ai", - "Ei": "ui", - "Ao": "ao", - "Ou": "ou", - "An": "an", - "En": "un", - "Ang": "ah", - "Eng": "un", - "Er": "ur", - "Yi": "yi", - "Ya": "ya", - "Yo": "yo", - "Ye": "ye", - "Yao": "ys", - "You": "yr", - "Yan": "yj", - "Yin": "yd", - "Yang": "yh", - "Ying": "yv", - "Wu": "wu", - "Wa": "wa", - "Wo": "wo", - "Wai": "wk", - "Wei": "ww", - "Wan": "wj", - "Wen": "wm", - "Wang": "wh", - "Weng": "wn", - "Yu": "yu", - "Yue": "yb", - "Yuan": "yg", - "Yun": "yy", - "Yong": "yl", - "Ba": "ba", - "Bai": "bk", - "Ban": "bj", - "Bang": "bh", - "Bao": "bs", - "Bei": "bw", - "Ben": "bm", - "Beng": "bn", - "Bi": "bi", - "Bian": "bf", - "Biang": "bm", - "Biao": "bc", - "Bie": "bp", - "Bin": "bd", - "Bing": "bv", - "Bo": "bo", - "Bu": "bu", - "Ca": "ca", - "Cai": "ck", - "Can": "cj", - "Cang": "ch", - "Cao": "cs", - "Ce": "ce", - "Cen": "cm", - "Ceng": "cn", - "Cha": "ia", - "Chai": "ik", - "Chan": "ij", - "Chang": "ih", - "Chao": "is", - "Che": "ie", - "Chen": "im", - "Cheng": "in", - "Chi": "ii", - "Chong": "il", - "Chou": "ir", - "Chu": "iu", - "Chua": "if", - "Chuai": "iv", - "Chuan": "ig", - "Chuang": "iz", - "Chui": "id", - "Chun": "iy", - "Chuo": "io", - "Ci": "ci", - "Cong": "cl", - "Cou": "cr", - "Cu": "cu", - "Cuan": "cg", - "Cui": "cd", - "Cun": "cy", - "Cuo": "co", - "Da": "da", - "Dai": "dk", - "Dan": "dj", - "Dang": "dh", - "Dao": "ds", - "De": "de", - "Dei": "dw", - "Den": "dm", - "Deng": "dn", - "Di": "di", - "Dia": "dk", - "Dian": "df", - "Diao": "dc", - "Die": "dp", - "Ding": "dv", - "Diu": "dt", - "Dong": "dl", - "Dou": "dr", - "Du": "du", - "Duan": "dg", - "Dui": "dd", - "Dun": "dy", - "Duo": "do", - "Fa": "fa", - "Fan": "fj", - "Fang": "fh", - "Fei": "fw", - "Fen": "fm", - "Feng": "fn", - "Fiao": "fc", - "Fo": "fo", - "Fou": "fr", - "Fu": "fu", - "Ga": "ga", - "Gai": "gk", - "Gan": "gj", - "Gang": "gh", - "Gao": "gs", - "Ge": "ge", - "Gei": "gw", - "Gen": "gm", - "Geng": "gn", - "Gong": "gl", - "Gou": "gr", - "Gu": "gu", - "Gua": "gf", - "Guai": "gv", - "Guan": "gg", - "Guang": "gz", - "Gui": "gd", - "Gun": "gy", - "Guo": "go", - "Ha": "ha", - "Hai": "hk", - "Han": "hj", - "Hang": "hh", - "Hao": "hs", - "He": "he", - "Hei": "hw", - "Hen": "hm", - "Heng": "hn", - "Hong": "hl", - "Hou": "hr", - "Hu": "hu", - "Hua": "hf", - "Huai": "hv", - "Huan": "hg", - "Huang": "hz", - "Hui": "hd", - "Hun": "hy", - "Huo": "ho", - "Ji": "ji", - "Jia": "jk", - "Jian": "jf", - "Jiang": "jm", - "Jiao": "jc", - "Jie": "jp", - "Jin": "jd", - "Jing": "jv", - "Jiong": "jj", - "Jiu": "jt", - "Ju": "ju", - "Juan": "jg", - "Jue": "jb", - "Jun": "jy", - "Ka": "ka", - "Kai": "kk", - "Kan": "kj", - "Kang": "kh", - "Kao": "ks", - "Ke": "ke", - "Ken": "km", - "Keng": "kn", - "Kong": "kl", - "Kou": "kr", - "Ku": "ku", - "Kua": "kf", - "Kuai": "kv", - "Kuan": "kg", - "Kuang": "kz", - "Kui": "kd", - "Kun": "ky", - "Kuo": "ko", - "La": "la", - "Lai": "lk", - "Lan": "lj", - "Lang": "lh", - "Lao": "ls", - "Le": "le", - "Lei": "lw", - "Leng": "ln", - "Li": "li", - "Lia": "lk", - "Lian": "lf", - "Liang": "lm", - "Liao": "lc", - "Lie": "lp", - "Lin": "ld", - "Ling": "lv", - "Liu": "lt", - "Lo": "lo", - "Long": "ll", - "Lou": "lr", - "Lu": "lu", - "Luan": "lg", - "Lun": "ly", - "Luo": "lo", - "Ma": "ma", - "Mai": "mk", - "Man": "mj", - "Mang": "mh", - "Mao": "ms", - "Me": "me", - "Mei": "mw", - "Men": "mm", - "Meng": "mn", - "Mi": "mi", - "Mian": "mf", - "Miao": "mc", - "Mie": "mp", - "Min": "md", - "Ming": "mv", - "Miu": "mt", - "Mo": "mo", - "Mou": "mr", - "Mu": "mu", - "Na": "na", - "Nai": "nk", - "Nan": "nj", - "Nang": "nh", - "Nao": "ns", - "Ne": "ne", - "Nei": "nw", - "Nen": "nm", - "Neng": "nn", - "Ni": "ni", - "Nian": "nf", - "Niang": "nm", - "Niao": "nc", - "Nie": "np", - "Nin": "nd", - "Ning": "nv", - "Niu": "nt", - "Nong": "nl", - "Nou": "nr", - "Nu": "nu", - "Nuan": "ng", - "Nun": "ny", - "Nuo": "no", - "Pa": "pa", - "Pai": "pk", - "Pan": "pj", - "Pang": "ph", - "Pao": "ps", - "Pei": "pw", - "Pen": "pm", - "Peng": "pn", - "Pi": "pi", - "Pian": "pf", - "Piao": "pc", - "Pie": "pp", - "Pin": "pd", - "Ping": "pv", - "Po": "po", - "Pou": "pr", - "Pu": "pu", - "Qi": "qi", - "Qia": "qk", - "Qian": "qf", - "Qiang": "qm", - "Qiao": "qc", - "Qie": "qp", - "Qin": "qd", - "Qing": "qv", - "Qiong": "qj", - "Qiu": "qt", - "Qu": "qu", - "Quan": "qg", - "Que": "qb", - "Qun": "qy", - "Ran": "rj", - "Rang": "rh", - "Rao": "rs", - "Re": "re", - "Ren": "rm", - "Reng": "rn", - "Ri": "ri", - "Rong": "rl", - "Rou": "rr", - "Ru": "ru", - "Rua": "rf", - "Ruan": "rg", - "Rui": "rd", - "Run": "ry", - "Ruo": "ro", - "Sa": "sa", - "Sai": "sk", - "San": "sj", - "Sang": "sh", - "Sao": "ss", - "Se": "se", - "Sen": "sm", - "Seng": "sn", - "Sha": "va", - "Shai": "vk", - "Shan": "vj", - "Shang": "vh", - "Shao": "vs", - "She": "ve", - "Shei": "vw", - "Shen": "vm", - "Sheng": "vn", - "Shi": "vi", - "Shou": "vr", - "Shu": "vu", - "Shua": "vf", - "Shuai": "vv", - "Shuan": "vg", - "Shuang": "vz", - "Shui": "vd", - "Shun": "vy", - "Shuo": "vo", - "Si": "si", - "Song": "sl", - "Sou": "sr", - "Su": "su", - "Suan": "sg", - "Sui": "sd", - "Sun": "sy", - "Suo": "so", - "Ta": "ta", - "Tai": "tk", - "Tan": "tj", - "Tang": "th", - "Tao": "ts", - "Te": "te", - "Tei": "tw", - "Teng": "tn", - "Ti": "ti", - "Tian": "tf", - "Tiao": "tc", - "Tie": "tp", - "Ting": "tv", - "Tong": "tl", - "Tou": "tr", - "Tu": "tu", - "Tuan": "tg", - "Tui": "td", - "Tun": "ty", - "Tuo": "to", - "Xi": "xi", - "Xia": "xk", - "Xian": "xf", - "Xiang": "xm", - "Xiao": "xc", - "Xie": "xp", - "Xin": "xd", - "Xing": "xv", - "Xiong": "xj", - "Xiu": "xt", - "Xu": "xu", - "Xuan": "xg", - "Xue": "xb", - "Xun": "xy", - "Za": "za", - "Zai": "zk", - "Zan": "zj", - "Zang": "zh", - "Zao": "zs", - "Ze": "ze", - "Zei": "zw", - "Zen": "zm", - "Zeng": "zn", - "Zha": "ea", - "Zhai": "ek", - "Zhan": "ej", - "Zhang": "eh", - "Zhao": "es", - "Zhe": "ee", - "Zhen": "em", - "Zheng": "en", - "Zhi": "ei", - "Zhong": "el", - "Zhou": "er", - "Zhu": "eu", - "Zhua": "ef", - "Zhuai": "ev", - "Zhuan": "eg", - "Zhuang": "ez", - "Zhui": "ed", - "Zhun": "ey", - "Zhuo": "eo", - "Zi": "zi", - "Zong": "zl", - "Zou": "zr", - "Zu": "zu", - "Zuan": "zg", - "Zui": "zd", - "Zun": "zy", - "Zuo": "zo" - } -} \ No newline at end of file +{"XiaoHe":{"Lv":"lv","Lve":"lt","Lue":"lt","Nv":"nv","Nve":"nt","Nue":"nt","A":"aa","O":"oo","E":"ee","Ai":"ai","Ei":"ei","Ao":"ao","Ou":"ou","An":"an","En":"en","Ang":"ah","Eng":"eg","Er":"er","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yc","You":"yz","Yan":"yj","Yin":"yb","Yang":"yh","Ying":"yk","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wd","Wei":"ww","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yy","Yong":"ys","Ba":"ba","Bai":"bd","Ban":"bj","Bang":"bh","Bao":"bc","Bei":"bw","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bl","Biao":"bn","Bie":"bp","Bin":"bb","Bing":"bk","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cd","Can":"cj","Cang":"ch","Cao":"cc","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"id","Chan":"ij","Chang":"ih","Chao":"ic","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"iz","Chu":"iu","Chua":"ix","Chuai":"ik","Chuan":"ir","Chuang":"il","Chui":"iv","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cz","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cy","Cuo":"co","Da":"da","Dai":"dd","Dan":"dj","Dang":"dh","Dao":"dc","De":"de","Dei":"dw","Den":"df","Deng":"dg","Di":"di","Dia":"dx","Dian":"dm","Diao":"dn","Die":"dp","Ding":"dk","Diu":"dq","Dong":"ds","Dou":"dz","Du":"du","Duan":"dr","Dui":"dv","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fw","Fen":"ff","Feng":"fg","Fiao":"fn","Fo":"fo","Fou":"fz","Fu":"fu","Ga":"ga","Gai":"gd","Gan":"gj","Gang":"gh","Gao":"gc","Ge":"ge","Gei":"gw","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gz","Gu":"gu","Gua":"gx","Guai":"gk","Guan":"gr","Guang":"gl","Gui":"gv","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hd","Han":"hj","Hang":"hh","Hao":"hc","He":"he","Hei":"hw","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hz","Hu":"hu","Hua":"hx","Huai":"hk","Huan":"hr","Huang":"hl","Hui":"hv","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jx","Jian":"jm","Jiang":"jl","Jiao":"jn","Jie":"jp","Jin":"jb","Jing":"jk","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jy","Ka":"ka","Kai":"kd","Kan":"kj","Kang":"kh","Kao":"kc","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kz","Ku":"ku","Kua":"kx","Kuai":"kk","Kuan":"kr","Kuang":"kl","Kui":"kv","Kun":"ky","Kuo":"ko","La":"la","Lai":"ld","Lan":"lj","Lang":"lh","Lao":"lc","Le":"le","Lei":"lw","Leng":"lg","Li":"li","Lia":"lx","Lian":"lm","Liang":"ll","Liao":"ln","Lie":"lp","Lin":"lb","Ling":"lk","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lz","Lu":"lu","Luan":"lr","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"md","Man":"mj","Mang":"mh","Mao":"mc","Me":"me","Mei":"mw","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mn","Mie":"mp","Min":"mb","Ming":"mk","Miu":"mq","Mo":"mo","Mou":"mz","Mu":"mu","Na":"na","Nai":"nd","Nan":"nj","Nang":"nh","Nao":"nc","Ne":"ne","Nei":"nw","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nl","Niao":"nn","Nie":"np","Nin":"nb","Ning":"nk","Niu":"nq","Nong":"ns","Nou":"nz","Nu":"nu","Nuan":"nr","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"pd","Pan":"pj","Pang":"ph","Pao":"pc","Pei":"pw","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pn","Pie":"pp","Pin":"pb","Ping":"pk","Po":"po","Pou":"pz","Pu":"pu","Qi":"qi","Qia":"qx","Qian":"qm","Qiang":"ql","Qiao":"qn","Qie":"qp","Qin":"qb","Qing":"qk","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qy","Ran":"rj","Rang":"rh","Rao":"rc","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rz","Ru":"ru","Rua":"rx","Ruan":"rr","Rui":"rv","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sd","San":"sj","Sang":"sh","Sao":"sc","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ud","Shan":"uj","Shang":"uh","Shao":"uc","She":"ue","Shei":"uw","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"uz","Shu":"uu","Shua":"ux","Shuai":"uk","Shuan":"ur","Shuang":"ul","Shui":"uv","Shun":"uy","Shuo":"uo","Si":"si","Song":"ss","Sou":"sz","Su":"su","Suan":"sr","Sui":"sv","Sun":"sy","Suo":"so","Ta":"ta","Tai":"td","Tan":"tj","Tang":"th","Tao":"tc","Te":"te","Tei":"tw","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tn","Tie":"tp","Ting":"tk","Tong":"ts","Tou":"tz","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xm","Xiang":"xl","Xiao":"xn","Xie":"xp","Xin":"xb","Xing":"xk","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xy","Za":"za","Zai":"zd","Zan":"zj","Zang":"zh","Zao":"zc","Ze":"ze","Zei":"zw","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vd","Zhan":"vj","Zhang":"vh","Zhao":"vc","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vz","Zhu":"vu","Zhua":"vx","Zhuai":"vk","Zhuan":"vr","Zhuang":"vl","Zhui":"vv","Zhun":"vy","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zz","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zy","Zuo":"zo"},"ZiRanMa":{"Lv":"lv","Lve":"lt","Lue":"lt","Nv":"nv","Nve":"nt","Nue":"nt","A":"aa","O":"oo","E":"ee","Ai":"ai","Ei":"ei","Ao":"ao","Ou":"ou","An":"an","En":"en","Ang":"ah","Eng":"eg","Er":"er","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yn","Yang":"yh","Ying":"yy","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wz","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yp","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bz","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bd","Biao":"bc","Bie":"bx","Bin":"bn","Bing":"by","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"il","Chan":"ij","Chang":"ih","Chao":"ik","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"ib","Chu":"iu","Chua":"iw","Chuai":"iy","Chuan":"ir","Chuang":"id","Chui":"iv","Chun":"ip","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cp","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dz","Den":"df","Deng":"dg","Di":"di","Dia":"dw","Dian":"dm","Diao":"dc","Die":"dx","Ding":"dy","Diu":"dq","Dong":"ds","Dou":"db","Du":"du","Duan":"dr","Dui":"dv","Dun":"dp","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fz","Fen":"ff","Feng":"fg","Fiao":"fc","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gz","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gw","Guai":"gy","Guan":"gr","Guang":"gd","Gui":"gv","Gun":"gp","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hz","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hw","Huai":"hy","Huan":"hr","Huang":"hd","Hui":"hv","Hun":"hp","Huo":"ho","Ji":"ji","Jia":"jw","Jian":"jm","Jiang":"jd","Jiao":"jc","Jie":"jx","Jin":"jn","Jing":"jy","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jp","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kw","Kuai":"ky","Kuan":"kr","Kuang":"kd","Kui":"kv","Kun":"kp","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lz","Leng":"lg","Li":"li","Lia":"lw","Lian":"lm","Liang":"ld","Liao":"lc","Lie":"lx","Lin":"ln","Ling":"ly","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lr","Lun":"lp","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mz","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mc","Mie":"mx","Min":"mn","Ming":"my","Miu":"mq","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nz","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nd","Niao":"nc","Nie":"nx","Nin":"nn","Ning":"ny","Niu":"nq","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"nr","Nun":"np","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pz","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pc","Pie":"px","Pin":"pn","Ping":"py","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qw","Qian":"qm","Qiang":"qd","Qiao":"qc","Qie":"qx","Qin":"qn","Qing":"qy","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qp","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rw","Ruan":"rr","Rui":"rv","Run":"rp","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ul","Shan":"uj","Shang":"uh","Shao":"uk","She":"ue","Shei":"uz","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"ub","Shu":"uu","Shua":"uw","Shuai":"uy","Shuan":"ur","Shuang":"ud","Shui":"uv","Shun":"up","Shuo":"uo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sr","Sui":"sv","Sun":"sp","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tz","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tc","Tie":"tx","Ting":"ty","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"tp","Tuo":"to","Xi":"xi","Xia":"xw","Xian":"xm","Xiang":"xd","Xiao":"xc","Xie":"xx","Xin":"xn","Xing":"xy","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xp","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zz","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vl","Zhan":"vj","Zhang":"vh","Zhao":"vk","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vb","Zhu":"vu","Zhua":"vw","Zhuai":"vy","Zhuan":"vr","Zhuang":"vd","Zhui":"vv","Zhun":"vp","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zp","Zuo":"zo"},"WeiRuan":{"Lv":"ly","Lve":"lt","Lue":"lt","Nv":"ny","Nve":"nt","Nue":"nt","A":"oa","O":"oo","E":"oe","Ai":"ol","Ei":"oz","Ao":"ok","Ou":"ob","An":"oj","En":"of","Ang":"oh","Eng":"og","Er":"or","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yn","Yang":"yh","Ying":"y;","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wz","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"yt","Yuan":"yr","Yun":"yp","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bz","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bm","Biang":"bd","Biao":"bc","Bie":"bx","Bin":"bn","Bing":"b;","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ia","Chai":"il","Chan":"ij","Chang":"ih","Chao":"ik","Che":"ie","Chen":"if","Cheng":"ig","Chi":"ii","Chong":"is","Chou":"ib","Chu":"iu","Chua":"iw","Chuai":"iy","Chuan":"ir","Chuang":"id","Chui":"iv","Chun":"ip","Chuo":"io","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cr","Cui":"cv","Cun":"cp","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dz","Den":"df","Deng":"dg","Di":"di","Dia":"dw","Dian":"dm","Diao":"dc","Die":"dx","Ding":"d;","Diu":"dq","Dong":"ds","Dou":"db","Du":"du","Duan":"dr","Dui":"dv","Dun":"dp","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fz","Fen":"ff","Feng":"fg","Fiao":"fc","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gz","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gw","Guai":"gy","Guan":"gr","Guang":"gd","Gui":"gv","Gun":"gp","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hz","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hw","Huai":"hy","Huan":"hr","Huang":"hd","Hui":"hv","Hun":"hp","Huo":"ho","Ji":"ji","Jia":"jw","Jian":"jm","Jiang":"jd","Jiao":"jc","Jie":"jx","Jin":"jn","Jing":"j;","Jiong":"js","Jiu":"jq","Ju":"ju","Juan":"jr","Jue":"jt","Jun":"jp","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kw","Kuai":"ky","Kuan":"kr","Kuang":"kd","Kui":"kv","Kun":"kp","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lz","Leng":"lg","Li":"li","Lia":"lw","Lian":"lm","Liang":"ld","Liao":"lc","Lie":"lx","Lin":"ln","Ling":"l;","Liu":"lq","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lr","Lun":"lp","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mz","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mm","Miao":"mc","Mie":"mx","Min":"mn","Ming":"m;","Miu":"mq","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nz","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nm","Niang":"nd","Niao":"nc","Nie":"nx","Nin":"nn","Ning":"n;","Niu":"nq","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"nr","Nun":"np","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pz","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pm","Piao":"pc","Pie":"px","Pin":"pn","Ping":"p;","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qw","Qian":"qm","Qiang":"qd","Qiao":"qc","Qie":"qx","Qin":"qn","Qing":"q;","Qiong":"qs","Qiu":"qq","Qu":"qu","Quan":"qr","Que":"qt","Qun":"qp","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rw","Ruan":"rr","Rui":"rv","Run":"rp","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"ua","Shai":"ul","Shan":"uj","Shang":"uh","Shao":"uk","She":"ue","Shei":"uz","Shen":"uf","Sheng":"ug","Shi":"ui","Shou":"ub","Shu":"uu","Shua":"uw","Shuai":"uy","Shuan":"ur","Shuang":"ud","Shui":"uv","Shun":"up","Shuo":"uo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sr","Sui":"sv","Sun":"sp","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tz","Teng":"tg","Ti":"ti","Tian":"tm","Tiao":"tc","Tie":"tx","Ting":"t;","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tr","Tui":"tv","Tun":"tp","Tuo":"to","Xi":"xi","Xia":"xw","Xian":"xm","Xiang":"xd","Xiao":"xc","Xie":"xx","Xin":"xn","Xing":"x;","Xiong":"xs","Xiu":"xq","Xu":"xu","Xuan":"xr","Xue":"xt","Xun":"xp","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zz","Zen":"zf","Zeng":"zg","Zha":"va","Zhai":"vl","Zhan":"vj","Zhang":"vh","Zhao":"vk","Zhe":"ve","Zhen":"vf","Zheng":"vg","Zhi":"vi","Zhong":"vs","Zhou":"vb","Zhu":"vu","Zhua":"vw","Zhuai":"vy","Zhuan":"vr","Zhuang":"vd","Zhui":"vv","Zhun":"vp","Zhuo":"vo","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zr","Zui":"zv","Zun":"zp","Zuo":"zo"},"ZhiNengABC":{"Lv":"lv","Lve":"lm","Lue":"lm","Nv":"nv","Nve":"nm","Nue":"nm","A":"oa","O":"oo","E":"oe","Ai":"ol","Ei":"oq","Ao":"ok","Ou":"ob","An":"oj","En":"of","Ang":"oh","Eng":"og","Er":"or","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yk","You":"yb","Yan":"yj","Yin":"yc","Yang":"yh","Ying":"yy","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wl","Wei":"wq","Wan":"wj","Wen":"wf","Wang":"wh","Weng":"wg","Yu":"yu","Yue":"ym","Yuan":"yp","Yun":"yn","Yong":"ys","Ba":"ba","Bai":"bl","Ban":"bj","Bang":"bh","Bao":"bk","Bei":"bq","Ben":"bf","Beng":"bg","Bi":"bi","Bian":"bw","Biang":"bt","Biao":"bz","Bie":"bx","Bin":"bc","Bing":"by","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cl","Can":"cj","Cang":"ch","Cao":"ck","Ce":"ce","Cen":"cf","Ceng":"cg","Cha":"ea","Chai":"el","Chan":"ej","Chang":"eh","Chao":"ek","Che":"ee","Chen":"ef","Cheng":"eg","Chi":"ei","Chong":"es","Chou":"eb","Chu":"eu","Chua":"ed","Chuai":"ec","Chuan":"ep","Chuang":"et","Chui":"em","Chun":"en","Chuo":"eo","Ci":"ci","Cong":"cs","Cou":"cb","Cu":"cu","Cuan":"cp","Cui":"cm","Cun":"cn","Cuo":"co","Da":"da","Dai":"dl","Dan":"dj","Dang":"dh","Dao":"dk","De":"de","Dei":"dq","Den":"df","Deng":"dg","Di":"di","Dia":"dd","Dian":"dw","Diao":"dz","Die":"dx","Ding":"dy","Diu":"dr","Dong":"ds","Dou":"db","Du":"du","Duan":"dp","Dui":"dm","Dun":"dn","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fq","Fen":"ff","Feng":"fg","Fiao":"fz","Fo":"fo","Fou":"fb","Fu":"fu","Ga":"ga","Gai":"gl","Gan":"gj","Gang":"gh","Gao":"gk","Ge":"ge","Gei":"gq","Gen":"gf","Geng":"gg","Gong":"gs","Gou":"gb","Gu":"gu","Gua":"gd","Guai":"gc","Guan":"gp","Guang":"gt","Gui":"gm","Gun":"gn","Guo":"go","Ha":"ha","Hai":"hl","Han":"hj","Hang":"hh","Hao":"hk","He":"he","Hei":"hq","Hen":"hf","Heng":"hg","Hong":"hs","Hou":"hb","Hu":"hu","Hua":"hd","Huai":"hc","Huan":"hp","Huang":"ht","Hui":"hm","Hun":"hn","Huo":"ho","Ji":"ji","Jia":"jd","Jian":"jw","Jiang":"jt","Jiao":"jz","Jie":"jx","Jin":"jc","Jing":"jy","Jiong":"js","Jiu":"jr","Ju":"ju","Juan":"jp","Jue":"jm","Jun":"jn","Ka":"ka","Kai":"kl","Kan":"kj","Kang":"kh","Kao":"kk","Ke":"ke","Ken":"kf","Keng":"kg","Kong":"ks","Kou":"kb","Ku":"ku","Kua":"kd","Kuai":"kc","Kuan":"kp","Kuang":"kt","Kui":"km","Kun":"kn","Kuo":"ko","La":"la","Lai":"ll","Lan":"lj","Lang":"lh","Lao":"lk","Le":"le","Lei":"lq","Leng":"lg","Li":"li","Lia":"ld","Lian":"lw","Liang":"lt","Liao":"lz","Lie":"lx","Lin":"lc","Ling":"ly","Liu":"lr","Lo":"lo","Long":"ls","Lou":"lb","Lu":"lu","Luan":"lp","Lun":"ln","Luo":"lo","Ma":"ma","Mai":"ml","Man":"mj","Mang":"mh","Mao":"mk","Me":"me","Mei":"mq","Men":"mf","Meng":"mg","Mi":"mi","Mian":"mw","Miao":"mz","Mie":"mx","Min":"mc","Ming":"my","Miu":"mr","Mo":"mo","Mou":"mb","Mu":"mu","Na":"na","Nai":"nl","Nan":"nj","Nang":"nh","Nao":"nk","Ne":"ne","Nei":"nq","Nen":"nf","Neng":"ng","Ni":"ni","Nian":"nw","Niang":"nt","Niao":"nz","Nie":"nx","Nin":"nc","Ning":"ny","Niu":"nr","Nong":"ns","Nou":"nb","Nu":"nu","Nuan":"np","Nun":"nn","Nuo":"no","Pa":"pa","Pai":"pl","Pan":"pj","Pang":"ph","Pao":"pk","Pei":"pq","Pen":"pf","Peng":"pg","Pi":"pi","Pian":"pw","Piao":"pz","Pie":"px","Pin":"pc","Ping":"py","Po":"po","Pou":"pb","Pu":"pu","Qi":"qi","Qia":"qd","Qian":"qw","Qiang":"qt","Qiao":"qz","Qie":"qx","Qin":"qc","Qing":"qy","Qiong":"qs","Qiu":"qr","Qu":"qu","Quan":"qp","Que":"qm","Qun":"qn","Ran":"rj","Rang":"rh","Rao":"rk","Re":"re","Ren":"rf","Reng":"rg","Ri":"ri","Rong":"rs","Rou":"rb","Ru":"ru","Rua":"rd","Ruan":"rp","Rui":"rm","Run":"rn","Ruo":"ro","Sa":"sa","Sai":"sl","San":"sj","Sang":"sh","Sao":"sk","Se":"se","Sen":"sf","Seng":"sg","Sha":"va","Shai":"vl","Shan":"vj","Shang":"vh","Shao":"vk","She":"ve","Shei":"vq","Shen":"vf","Sheng":"vg","Shi":"vi","Shou":"vb","Shu":"vu","Shua":"vd","Shuai":"vc","Shuan":"vp","Shuang":"vt","Shui":"vm","Shun":"vn","Shuo":"vo","Si":"si","Song":"ss","Sou":"sb","Su":"su","Suan":"sp","Sui":"sm","Sun":"sn","Suo":"so","Ta":"ta","Tai":"tl","Tan":"tj","Tang":"th","Tao":"tk","Te":"te","Tei":"tq","Teng":"tg","Ti":"ti","Tian":"tw","Tiao":"tz","Tie":"tx","Ting":"ty","Tong":"ts","Tou":"tb","Tu":"tu","Tuan":"tp","Tui":"tm","Tun":"tn","Tuo":"to","Xi":"xi","Xia":"xd","Xian":"xw","Xiang":"xt","Xiao":"xz","Xie":"xx","Xin":"xc","Xing":"xy","Xiong":"xs","Xiu":"xr","Xu":"xu","Xuan":"xp","Xue":"xm","Xun":"xn","Za":"za","Zai":"zl","Zan":"zj","Zang":"zh","Zao":"zk","Ze":"ze","Zei":"zq","Zen":"zf","Zeng":"zg","Zha":"aa","Zhai":"al","Zhan":"aj","Zhang":"ah","Zhao":"ak","Zhe":"ae","Zhen":"af","Zheng":"ag","Zhi":"ai","Zhong":"as","Zhou":"ab","Zhu":"au","Zhua":"ad","Zhuai":"ac","Zhuan":"ap","Zhuang":"at","Zhui":"am","Zhun":"an","Zhuo":"ao","Zi":"zi","Zong":"zs","Zou":"zb","Zu":"zu","Zuan":"zp","Zui":"zm","Zun":"zn","Zuo":"zo"},"ZiGuangPinYin":{"Lv":"lv","Lve":"ln","Lue":"ln","Nv":"nv","Nve":"nn","Nue":"nn","A":"oa","O":"oo","E":"oe","Ai":"op","Ei":"ok","Ao":"oq","Ou":"oz","An":"or","En":"ow","Ang":"os","Eng":"ot","Er":"oj","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yq","You":"yz","Yan":"yr","Yin":"yy","Yang":"ys","Ying":"yc","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wp","Wei":"wk","Wan":"wr","Wen":"ww","Wang":"ws","Weng":"wt","Yu":"yu","Yue":"yn","Yuan":"yl","Yun":"ym","Yong":"yh","Ba":"ba","Bai":"bp","Ban":"br","Bang":"bs","Bao":"bq","Bei":"bk","Ben":"bw","Beng":"bt","Bi":"bi","Bian":"bf","Biang":"bg","Biao":"bb","Bie":"bd","Bin":"by","Bing":"bc","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cp","Can":"cr","Cang":"cs","Cao":"cq","Ce":"ce","Cen":"cw","Ceng":"ct","Cha":"aa","Chai":"ap","Chan":"ar","Chang":"as","Chao":"aq","Che":"ae","Chen":"aw","Cheng":"at","Chi":"ai","Chong":"ah","Chou":"az","Chu":"au","Chua":"ax","Chuai":"ay","Chuan":"al","Chuang":"ag","Chui":"an","Chun":"am","Chuo":"ao","Ci":"ci","Cong":"ch","Cou":"cz","Cu":"cu","Cuan":"cl","Cui":"cn","Cun":"cm","Cuo":"co","Da":"da","Dai":"dp","Dan":"dr","Dang":"ds","Dao":"dq","De":"de","Dei":"dk","Den":"dw","Deng":"dt","Di":"di","Dia":"dx","Dian":"df","Diao":"db","Die":"dd","Ding":"dc","Diu":"dj","Dong":"dh","Dou":"dz","Du":"du","Duan":"dl","Dui":"dn","Dun":"dm","Duo":"do","Fa":"fa","Fan":"fr","Fang":"fs","Fei":"fk","Fen":"fw","Feng":"ft","Fiao":"fb","Fo":"fo","Fou":"fz","Fu":"fu","Ga":"ga","Gai":"gp","Gan":"gr","Gang":"gs","Gao":"gq","Ge":"ge","Gei":"gk","Gen":"gw","Geng":"gt","Gong":"gh","Gou":"gz","Gu":"gu","Gua":"gx","Guai":"gy","Guan":"gl","Guang":"gg","Gui":"gn","Gun":"gm","Guo":"go","Ha":"ha","Hai":"hp","Han":"hr","Hang":"hs","Hao":"hq","He":"he","Hei":"hk","Hen":"hw","Heng":"ht","Hong":"hh","Hou":"hz","Hu":"hu","Hua":"hx","Huai":"hy","Huan":"hl","Huang":"hg","Hui":"hn","Hun":"hm","Huo":"ho","Ji":"ji","Jia":"jx","Jian":"jf","Jiang":"jg","Jiao":"jb","Jie":"jd","Jin":"jy","Jing":"jc","Jiong":"jh","Jiu":"jj","Ju":"ju","Juan":"jl","Jue":"jn","Jun":"jm","Ka":"ka","Kai":"kp","Kan":"kr","Kang":"ks","Kao":"kq","Ke":"ke","Ken":"kw","Keng":"kt","Kong":"kh","Kou":"kz","Ku":"ku","Kua":"kx","Kuai":"ky","Kuan":"kl","Kuang":"kg","Kui":"kn","Kun":"km","Kuo":"ko","La":"la","Lai":"lp","Lan":"lr","Lang":"ls","Lao":"lq","Le":"le","Lei":"lk","Leng":"lt","Li":"li","Lia":"lx","Lian":"lf","Liang":"lg","Liao":"lb","Lie":"ld","Lin":"ly","Ling":"lc","Liu":"lj","Lo":"lo","Long":"lh","Lou":"lz","Lu":"lu","Luan":"ll","Lun":"lm","Luo":"lo","Ma":"ma","Mai":"mp","Man":"mr","Mang":"ms","Mao":"mq","Me":"me","Mei":"mk","Men":"mw","Meng":"mt","Mi":"mi","Mian":"mf","Miao":"mb","Mie":"md","Min":"my","Ming":"mc","Miu":"mj","Mo":"mo","Mou":"mz","Mu":"mu","Na":"na","Nai":"np","Nan":"nr","Nang":"ns","Nao":"nq","Ne":"ne","Nei":"nk","Nen":"nw","Neng":"nt","Ni":"ni","Nian":"nf","Niang":"ng","Niao":"nb","Nie":"nd","Nin":"ny","Ning":"nc","Niu":"nj","Nong":"nh","Nou":"nz","Nu":"nu","Nuan":"nl","Nun":"nm","Nuo":"no","Pa":"pa","Pai":"pp","Pan":"pr","Pang":"ps","Pao":"pq","Pei":"pk","Pen":"pw","Peng":"pt","Pi":"pi","Pian":"pf","Piao":"pb","Pie":"pd","Pin":"py","Ping":"pc","Po":"po","Pou":"pz","Pu":"pu","Qi":"qi","Qia":"qx","Qian":"qf","Qiang":"qg","Qiao":"qb","Qie":"qd","Qin":"qy","Qing":"qc","Qiong":"qh","Qiu":"qj","Qu":"qu","Quan":"ql","Que":"qn","Qun":"qm","Ran":"rr","Rang":"rs","Rao":"rq","Re":"re","Ren":"rw","Reng":"rt","Ri":"ri","Rong":"rh","Rou":"rz","Ru":"ru","Rua":"rx","Ruan":"rl","Rui":"rn","Run":"rm","Ruo":"ro","Sa":"sa","Sai":"sp","San":"sr","Sang":"ss","Sao":"sq","Se":"se","Sen":"sw","Seng":"st","Sha":"ia","Shai":"ip","Shan":"ir","Shang":"is","Shao":"iq","She":"ie","Shei":"ik","Shen":"iw","Sheng":"it","Shi":"ii","Shou":"iz","Shu":"iu","Shua":"ix","Shuai":"iy","Shuan":"il","Shuang":"ig","Shui":"in","Shun":"im","Shuo":"io","Si":"si","Song":"sh","Sou":"sz","Su":"su","Suan":"sl","Sui":"sn","Sun":"sm","Suo":"so","Ta":"ta","Tai":"tp","Tan":"tr","Tang":"ts","Tao":"tq","Te":"te","Tei":"tk","Teng":"tt","Ti":"ti","Tian":"tf","Tiao":"tb","Tie":"td","Ting":"tc","Tong":"th","Tou":"tz","Tu":"tu","Tuan":"tl","Tui":"tn","Tun":"tm","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xf","Xiang":"xg","Xiao":"xb","Xie":"xd","Xin":"xy","Xing":"xc","Xiong":"xh","Xiu":"xj","Xu":"xu","Xuan":"xl","Xue":"xn","Xun":"xm","Za":"za","Zai":"zp","Zan":"zr","Zang":"zs","Zao":"zq","Ze":"ze","Zei":"zk","Zen":"zw","Zeng":"zt","Zha":"ua","Zhai":"up","Zhan":"ur","Zhang":"us","Zhao":"uq","Zhe":"ue","Zhen":"uw","Zheng":"ut","Zhi":"ui","Zhong":"uh","Zhou":"uz","Zhu":"uu","Zhua":"ux","Zhuai":"uy","Zhuan":"ul","Zhuang":"ug","Zhui":"un","Zhun":"um","Zhuo":"uo","Zi":"zi","Zong":"zh","Zou":"zz","Zu":"zu","Zuan":"zl","Zui":"zn","Zun":"zm","Zuo":"zo"},"PinYinJiaJia":{"Lv":"lv","Lve":"lx","Lue":"lx","Nv":"nv","Nve":"nx","Nue":"nx","A":"aa","O":"oo","E":"ee","Ai":"as","Ei":"ew","Ao":"ad","Ou":"op","An":"af","En":"er","Ang":"ag","Eng":"et","Er":"eq","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"yd","You":"yp","Yan":"yf","Yin":"yl","Yang":"yg","Ying":"yq","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"ws","Wei":"ww","Wan":"wf","Wen":"wr","Wang":"wg","Weng":"wt","Yu":"yu","Yue":"yx","Yuan":"yc","Yun":"yz","Yong":"yy","Ba":"ba","Bai":"bs","Ban":"bf","Bang":"bg","Bao":"bd","Bei":"bw","Ben":"br","Beng":"bt","Bi":"bi","Bian":"bj","Biang":"bh","Biao":"bk","Bie":"bm","Bin":"bl","Bing":"bq","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cs","Can":"cf","Cang":"cg","Cao":"cd","Ce":"ce","Cen":"cr","Ceng":"ct","Cha":"ua","Chai":"us","Chan":"uf","Chang":"ug","Chao":"ud","Che":"ue","Chen":"ur","Cheng":"ut","Chi":"ui","Chong":"uy","Chou":"up","Chu":"uu","Chua":"ub","Chuai":"ux","Chuan":"uc","Chuang":"uh","Chui":"uv","Chun":"uz","Chuo":"uo","Ci":"ci","Cong":"cy","Cou":"cp","Cu":"cu","Cuan":"cc","Cui":"cv","Cun":"cz","Cuo":"co","Da":"da","Dai":"ds","Dan":"df","Dang":"dg","Dao":"dd","De":"de","Dei":"dw","Den":"dr","Deng":"dt","Di":"di","Dia":"db","Dian":"dj","Diao":"dk","Die":"dm","Ding":"dq","Diu":"dn","Dong":"dy","Dou":"dp","Du":"du","Duan":"dc","Dui":"dv","Dun":"dz","Duo":"do","Fa":"fa","Fan":"ff","Fang":"fg","Fei":"fw","Fen":"fr","Feng":"ft","Fiao":"fk","Fo":"fo","Fou":"fp","Fu":"fu","Ga":"ga","Gai":"gs","Gan":"gf","Gang":"gg","Gao":"gd","Ge":"ge","Gei":"gw","Gen":"gr","Geng":"gt","Gong":"gy","Gou":"gp","Gu":"gu","Gua":"gb","Guai":"gx","Guan":"gc","Guang":"gh","Gui":"gv","Gun":"gz","Guo":"go","Ha":"ha","Hai":"hs","Han":"hf","Hang":"hg","Hao":"hd","He":"he","Hei":"hw","Hen":"hr","Heng":"ht","Hong":"hy","Hou":"hp","Hu":"hu","Hua":"hb","Huai":"hx","Huan":"hc","Huang":"hh","Hui":"hv","Hun":"hz","Huo":"ho","Ji":"ji","Jia":"jb","Jian":"jj","Jiang":"jh","Jiao":"jk","Jie":"jm","Jin":"jl","Jing":"jq","Jiong":"jy","Jiu":"jn","Ju":"ju","Juan":"jc","Jue":"jx","Jun":"jz","Ka":"ka","Kai":"ks","Kan":"kf","Kang":"kg","Kao":"kd","Ke":"ke","Ken":"kr","Keng":"kt","Kong":"ky","Kou":"kp","Ku":"ku","Kua":"kb","Kuai":"kx","Kuan":"kc","Kuang":"kh","Kui":"kv","Kun":"kz","Kuo":"ko","La":"la","Lai":"ls","Lan":"lf","Lang":"lg","Lao":"ld","Le":"le","Lei":"lw","Leng":"lt","Li":"li","Lia":"lb","Lian":"lj","Liang":"lh","Liao":"lk","Lie":"lm","Lin":"ll","Ling":"lq","Liu":"ln","Lo":"lo","Long":"ly","Lou":"lp","Lu":"lu","Luan":"lc","Lun":"lz","Luo":"lo","Ma":"ma","Mai":"ms","Man":"mf","Mang":"mg","Mao":"md","Me":"me","Mei":"mw","Men":"mr","Meng":"mt","Mi":"mi","Mian":"mj","Miao":"mk","Mie":"mm","Min":"ml","Ming":"mq","Miu":"mn","Mo":"mo","Mou":"mp","Mu":"mu","Na":"na","Nai":"ns","Nan":"nf","Nang":"ng","Nao":"nd","Ne":"ne","Nei":"nw","Nen":"nr","Neng":"nt","Ni":"ni","Nian":"nj","Niang":"nh","Niao":"nk","Nie":"nm","Nin":"nl","Ning":"nq","Niu":"nn","Nong":"ny","Nou":"np","Nu":"nu","Nuan":"nc","Nun":"nz","Nuo":"no","Pa":"pa","Pai":"ps","Pan":"pf","Pang":"pg","Pao":"pd","Pei":"pw","Pen":"pr","Peng":"pt","Pi":"pi","Pian":"pj","Piao":"pk","Pie":"pm","Pin":"pl","Ping":"pq","Po":"po","Pou":"pp","Pu":"pu","Qi":"qi","Qia":"qb","Qian":"qj","Qiang":"qh","Qiao":"qk","Qie":"qm","Qin":"ql","Qing":"qq","Qiong":"qy","Qiu":"qn","Qu":"qu","Quan":"qc","Que":"qx","Qun":"qz","Ran":"rf","Rang":"rg","Rao":"rd","Re":"re","Ren":"rr","Reng":"rt","Ri":"ri","Rong":"ry","Rou":"rp","Ru":"ru","Rua":"rb","Ruan":"rc","Rui":"rv","Run":"rz","Ruo":"ro","Sa":"sa","Sai":"ss","San":"sf","Sang":"sg","Sao":"sd","Se":"se","Sen":"sr","Seng":"st","Sha":"ia","Shai":"is","Shan":"if","Shang":"ig","Shao":"id","She":"ie","Shei":"iw","Shen":"ir","Sheng":"it","Shi":"ii","Shou":"ip","Shu":"iu","Shua":"ib","Shuai":"ix","Shuan":"ic","Shuang":"ih","Shui":"iv","Shun":"iz","Shuo":"io","Si":"si","Song":"sy","Sou":"sp","Su":"su","Suan":"sc","Sui":"sv","Sun":"sz","Suo":"so","Ta":"ta","Tai":"ts","Tan":"tf","Tang":"tg","Tao":"td","Te":"te","Tei":"tw","Teng":"tt","Ti":"ti","Tian":"tj","Tiao":"tk","Tie":"tm","Ting":"tq","Tong":"ty","Tou":"tp","Tu":"tu","Tuan":"tc","Tui":"tv","Tun":"tz","Tuo":"to","Xi":"xi","Xia":"xb","Xian":"xj","Xiang":"xh","Xiao":"xk","Xie":"xm","Xin":"xl","Xing":"xq","Xiong":"xy","Xiu":"xn","Xu":"xu","Xuan":"xc","Xue":"xx","Xun":"xz","Za":"za","Zai":"zs","Zan":"zf","Zang":"zg","Zao":"zd","Ze":"ze","Zei":"zw","Zen":"zr","Zeng":"zt","Zha":"va","Zhai":"vs","Zhan":"vf","Zhang":"vg","Zhao":"vd","Zhe":"ve","Zhen":"vr","Zheng":"vt","Zhi":"vi","Zhong":"vy","Zhou":"vp","Zhu":"vu","Zhua":"vb","Zhuai":"vx","Zhuan":"vc","Zhuang":"vh","Zhui":"vv","Zhun":"vz","Zhuo":"vo","Zi":"zi","Zong":"zy","Zou":"zp","Zu":"zu","Zuan":"zc","Zui":"zv","Zun":"zz","Zuo":"zo"},"XingKongJianDao":{"Lv":"lv","Lve":"ly","Lue":"ly","Nv":"nv","Nve":"ny","Nue":"ny","A":"xa","O":"xo","E":"xe","Ai":"xj","Ei":"xw","Ao":"xs","Ou":"xt","An":"xd","En":"xk","Ang":"xf","Eng":"xh","Er":"xu","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yt","Yan":"yd","Yin":"yb","Yang":"yf","Ying":"yg","Wu":"wj","Wa":"ws","Wo":"wo","Wai":"wh","Wei":"ww","Wan":"wf","Wen":"wn","Wang":"wp","Weng":"wr","Yu":"yv","Yue":"yy","Yuan":"yr","Yun":"yw","Yong":"yl","Ba":"ba","Bai":"bj","Ban":"bd","Bang":"bf","Bao":"bs","Bei":"bw","Ben":"bk","Beng":"bh","Bi":"bi","Bian":"bm","Biang":"bx","Biao":"bp","Bie":"bc","Bin":"bb","Bing":"bg","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"cj","Can":"cd","Cang":"cf","Cao":"cs","Ce":"ce","Cen":"ck","Ceng":"ch","Cha":"ja","Chai":"jj","Chan":"jd","Chang":"jf","Chao":"js","Che":"je","Chen":"jk","Cheng":"jh","Chi":"wi","Chong":"wl","Chou":"jt","Chu":"ju","Chua":"wx","Chuai":"wg","Chuan":"wr","Chuang":"wn","Chui":"wy","Chun":"jz","Chuo":"jo","Ci":"ci","Cong":"cl","Cou":"ct","Cu":"cu","Cuan":"cr","Cui":"cy","Cun":"cz","Cuo":"co","Da":"da","Dai":"dj","Dan":"dd","Dang":"df","Dao":"ds","De":"de","Dei":"dw","Den":"dk","Deng":"dh","Di":"di","Dia":"dx","Dian":"dm","Diao":"dp","Die":"dc","Ding":"dg","Diu":"dq","Dong":"dl","Dou":"dt","Du":"du","Duan":"dr","Dui":"dy","Dun":"dz","Duo":"do","Fa":"fs","Fan":"ff","Fang":"fp","Fei":"fw","Fen":"fn","Feng":"fr","Fiao":"fp","Fo":"fl","Fou":"fd","Fu":"fl","Ga":"ga","Gai":"gj","Gan":"gd","Gang":"gf","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gk","Geng":"gh","Gong":"gl","Gou":"gt","Gu":"gu","Gua":"gx","Guai":"gg","Guan":"gr","Guang":"gn","Gui":"gy","Gun":"gz","Guo":"go","Ha":"ha","Hai":"hj","Han":"hd","Hang":"hf","Hao":"hs","He":"he","Hei":"hw","Hen":"hk","Heng":"hh","Hong":"hl","Hou":"ht","Hu":"hu","Hua":"hx","Huai":"hg","Huan":"hr","Huang":"hn","Hui":"hy","Hun":"hz","Huo":"ho","Ji":"jk","Jia":"js","Jian":"jm","Jiang":"jn","Jiao":"jp","Jie":"jc","Jin":"jb","Jing":"jg","Jiong":"jy","Jiu":"jq","Ju":"jv","Juan":"jt","Jue":"jh","Jun":"jw","Ka":"ka","Kai":"kj","Kan":"kd","Kang":"kf","Kao":"ks","Ke":"ke","Ken":"kk","Keng":"kh","Kong":"kl","Kou":"kt","Ku":"ku","Kua":"kx","Kuai":"kg","Kuan":"kr","Kuang":"kn","Kui":"ky","Kun":"kz","Kuo":"ko","La":"la","Lai":"lj","Lan":"ld","Lang":"lf","Lao":"ls","Le":"le","Lei":"lw","Leng":"lh","Li":"li","Lia":"lx","Lian":"lm","Liang":"ln","Liao":"lp","Lie":"lc","Lin":"lb","Ling":"lg","Liu":"lq","Lo":"ll","Long":"ll","Lou":"lt","Lu":"lu","Luan":"lr","Lun":"lz","Luo":"lo","Ma":"ma","Mai":"mj","Man":"md","Mang":"mf","Mao":"ms","Me":"me","Mei":"mw","Men":"mk","Meng":"mh","Mi":"mi","Mian":"mm","Miao":"mp","Mie":"mc","Min":"mb","Ming":"mg","Miu":"mq","Mo":"mo","Mou":"mt","Mu":"mu","Na":"na","Nai":"nj","Nan":"nd","Nang":"nf","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nk","Neng":"nh","Ni":"ni","Nian":"nm","Niang":"nn","Niao":"np","Nie":"nc","Nin":"nb","Ning":"ng","Niu":"nq","Nong":"nl","Nou":"nt","Nu":"nu","Nuan":"nr","Nun":"nz","Nuo":"no","Pa":"pa","Pai":"pj","Pan":"pd","Pang":"pf","Pao":"ps","Pei":"pw","Pen":"pk","Peng":"ph","Pi":"pi","Pian":"pm","Piao":"pp","Pie":"pc","Pin":"pb","Ping":"pg","Po":"po","Pou":"pt","Pu":"pu","Qi":"qk","Qia":"qs","Qian":"qm","Qiang":"qx","Qiao":"qp","Qie":"qc","Qin":"qb","Qing":"qg","Qiong":"qy","Qiu":"qq","Qu":"qv","Quan":"qt","Que":"qh","Qun":"qw","Ran":"rd","Rang":"rf","Rao":"rs","Re":"re","Ren":"rk","Reng":"rh","Ri":"ri","Rong":"rl","Rou":"rt","Ru":"ru","Rua":"rx","Ruan":"rr","Rui":"ry","Run":"rz","Ruo":"ro","Sa":"sa","Sai":"sj","San":"sd","Sang":"sf","Sao":"ss","Se":"se","Sen":"sk","Seng":"sh","Sha":"ea","Shai":"ej","Shan":"ed","Shang":"ef","Shao":"es","She":"ee","Shei":"ew","Shen":"ek","Sheng":"eh","Shi":"ei","Shou":"et","Shu":"eu","Shua":"ex","Shuai":"eg","Shuan":"er","Shuang":"en","Shui":"ey","Shun":"ez","Shuo":"eo","Si":"si","Song":"sl","Sou":"st","Su":"su","Suan":"sr","Sui":"sy","Sun":"sz","Suo":"so","Ta":"ta","Tai":"tj","Tan":"td","Tang":"tf","Tao":"ts","Te":"te","Tei":"tw","Teng":"th","Ti":"ti","Tian":"tm","Tiao":"tp","Tie":"tc","Ting":"tg","Tong":"tl","Tou":"tt","Tu":"tu","Tuan":"tr","Tui":"ty","Tun":"tz","Tuo":"to","Xi":"xi","Xia":"xx","Xian":"xm","Xiang":"xn","Xiao":"xp","Xie":"xc","Xin":"xb","Xing":"xg","Xiong":"xl","Xiu":"xq","Xu":"xv","Xuan":"xr","Xue":"xy","Xun":"xw","Za":"za","Zai":"zj","Zan":"zd","Zang":"zf","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zk","Zeng":"zh","Zha":"qa","Zhai":"fj","Zhan":"qd","Zhang":"qf","Zhao":"fs","Zhe":"fe","Zhen":"qk","Zheng":"qh","Zhi":"fi","Zhong":"fy","Zhou":"qt","Zhu":"qu","Zhua":"fx","Zhuai":"fg","Zhuan":"fr","Zhuang":"fn","Zhui":"fy","Zhun":"fz","Zhuo":"qo","Zi":"zi","Zong":"zl","Zou":"zt","Zu":"zu","Zuan":"zr","Zui":"zy","Zun":"zz","Zuo":"zo"},"DaNiu":{"Lv":"lv","Lve":"lx","Lue":"lx","Nv":"nv","Nve":"nx","Nue":"nx","A":"ea","O":"eo","E":"ee","Ai":"eh","Ei":"ew","Ao":"es","Ou":"er","An":"ed","En":"ek","Ang":"ef","Eng":"ej","Er":"eu","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yr","Yan":"yd","Yin":"yb","Yang":"yf","Ying":"yg","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wh","Wei":"ww","Wan":"wd","Wen":"wk","Wang":"wf","Weng":"wj","Yu":"yu","Yue":"yh","Yuan":"yj","Yun":"yw","Yong":"yl","Ba":"ba","Bai":"bh","Ban":"bd","Bang":"bf","Bao":"bs","Bei":"bw","Ben":"bk","Beng":"bj","Bi":"bi","Bian":"bc","Biang":"bn","Biao":"bm","Bie":"bp","Bin":"bb","Bing":"bg","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"ch","Can":"cd","Cang":"cf","Cao":"cs","Ce":"ce","Cen":"ck","Ceng":"cj","Cha":"ia","Chai":"ih","Chan":"id","Chang":"if","Chao":"is","Che":"ie","Chen":"ik","Cheng":"ij","Chi":"ii","Chong":"il","Chou":"ir","Chu":"iu","Chua":"iq","Chuai":"ig","Chuan":"iz","Chuang":"ix","Chui":"in","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cl","Cou":"cr","Cu":"cu","Cuan":"cz","Cui":"cn","Cun":"cy","Cuo":"co","Da":"da","Dai":"dh","Dan":"dd","Dang":"df","Dao":"ds","De":"de","Dei":"dw","Den":"dk","Deng":"dj","Di":"di","Dia":"dk","Dian":"dc","Diao":"dm","Die":"dp","Ding":"dg","Diu":"dt","Dong":"dl","Dou":"dr","Du":"du","Duan":"dz","Dui":"dn","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fd","Fang":"ff","Fei":"fw","Fen":"fk","Feng":"fj","Fiao":"fm","Fo":"fo","Fou":"fr","Fu":"fu","Ga":"ga","Gai":"gh","Gan":"gd","Gang":"gf","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gk","Geng":"gj","Gong":"gl","Gou":"gr","Gu":"gu","Gua":"gq","Guai":"gg","Guan":"gz","Guang":"gx","Gui":"gn","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hh","Han":"hd","Hang":"hf","Hao":"hs","He":"he","Hei":"hw","Hen":"hk","Heng":"hj","Hong":"hl","Hou":"hr","Hu":"hu","Hua":"hq","Huai":"hg","Huan":"hz","Huang":"hx","Hui":"hn","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jk","Jian":"jc","Jiang":"jn","Jiao":"jm","Jie":"jp","Jin":"jb","Jing":"jg","Jiong":"jl","Jiu":"jt","Ju":"ju","Juan":"jj","Jue":"jh","Jun":"jw","Ka":"ka","Kai":"kh","Kan":"kd","Kang":"kf","Kao":"ks","Ke":"ke","Ken":"kk","Keng":"kj","Kong":"kl","Kou":"kr","Ku":"ku","Kua":"kq","Kuai":"kg","Kuan":"kz","Kuang":"kx","Kui":"kn","Kun":"ky","Kuo":"ko","La":"la","Lai":"lh","Lan":"ld","Lang":"lf","Lao":"ls","Le":"le","Lei":"lw","Leng":"lj","Li":"li","Lia":"lk","Lian":"lc","Liang":"ln","Liao":"lm","Lie":"lp","Lin":"lb","Ling":"lg","Liu":"lt","Lo":"lo","Long":"ll","Lou":"lr","Lu":"lu","Luan":"lz","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"mh","Man":"md","Mang":"mf","Mao":"ms","Me":"me","Mei":"mw","Men":"mk","Meng":"mj","Mi":"mi","Mian":"mc","Miao":"mm","Mie":"mp","Min":"mb","Ming":"mg","Miu":"mt","Mo":"mo","Mou":"mr","Mu":"mu","Na":"na","Nai":"nh","Nan":"nd","Nang":"nf","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nk","Neng":"nj","Ni":"ni","Nian":"nc","Niang":"nn","Niao":"nm","Nie":"np","Nin":"nb","Ning":"ng","Niu":"nt","Nong":"nl","Nou":"nr","Nu":"nu","Nuan":"nz","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"ph","Pan":"pd","Pang":"pf","Pao":"ps","Pei":"pw","Pen":"pk","Peng":"pj","Pi":"pi","Pian":"pc","Piao":"pm","Pie":"pp","Pin":"pb","Ping":"pg","Po":"po","Pou":"pr","Pu":"pu","Qi":"qi","Qia":"qk","Qian":"qc","Qiang":"qn","Qiao":"qm","Qie":"qp","Qin":"qb","Qing":"qg","Qiong":"ql","Qiu":"qt","Qu":"qu","Quan":"qj","Que":"qh","Qun":"qw","Ran":"rd","Rang":"rf","Rao":"rs","Re":"re","Ren":"rk","Reng":"rj","Ri":"ri","Rong":"rl","Rou":"rr","Ru":"ru","Rua":"rq","Ruan":"rz","Rui":"rn","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sh","San":"sd","Sang":"sf","Sao":"ss","Se":"se","Sen":"sk","Seng":"sj","Sha":"ua","Shai":"uh","Shan":"ud","Shang":"uf","Shao":"us","She":"ue","Shei":"uw","Shen":"uk","Sheng":"uj","Shi":"ui","Shou":"ur","Shu":"uu","Shua":"uq","Shuai":"ug","Shuan":"uz","Shuang":"ux","Shui":"un","Shun":"uy","Shuo":"uo","Si":"si","Song":"sl","Sou":"sr","Su":"su","Suan":"sz","Sui":"sn","Sun":"sy","Suo":"so","Ta":"ta","Tai":"th","Tan":"td","Tang":"tf","Tao":"ts","Te":"te","Tei":"tw","Teng":"tj","Ti":"ti","Tian":"tc","Tiao":"tm","Tie":"tp","Ting":"tg","Tong":"tl","Tou":"tr","Tu":"tu","Tuan":"tz","Tui":"tn","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xk","Xian":"xc","Xiang":"xn","Xiao":"xm","Xie":"xp","Xin":"xb","Xing":"xg","Xiong":"xl","Xiu":"xt","Xu":"xu","Xuan":"xj","Xue":"xh","Xun":"xw","Za":"za","Zai":"zh","Zan":"zd","Zang":"zf","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zk","Zeng":"zj","Zha":"aa","Zhai":"ah","Zhan":"ad","Zhang":"af","Zhao":"as","Zhe":"ae","Zhen":"ak","Zheng":"aj","Zhi":"ai","Zhong":"al","Zhou":"ar","Zhu":"au","Zhua":"aq","Zhuai":"ag","Zhuan":"az","Zhuang":"ax","Zhui":"an","Zhun":"ay","Zhuo":"ao","Zi":"zi","Zong":"zl","Zou":"zr","Zu":"zu","Zuan":"zz","Zui":"zn","Zun":"zy","Zuo":"zo"},"XiaoLang":{"Lv":"lx","Lve":"lb","Lue":"lb","Nv":"nx","Nve":"nb","Nue":"nb","A":"aa","O":"oo","E":"uu","Ai":"ai","Ei":"ui","Ao":"ao","Ou":"ou","An":"an","En":"un","Ang":"ah","Eng":"un","Er":"ur","Yi":"yi","Ya":"ya","Yo":"yo","Ye":"ye","Yao":"ys","You":"yr","Yan":"yj","Yin":"yd","Yang":"yh","Ying":"yv","Wu":"wu","Wa":"wa","Wo":"wo","Wai":"wk","Wei":"ww","Wan":"wj","Wen":"wm","Wang":"wh","Weng":"wn","Yu":"yu","Yue":"yb","Yuan":"yg","Yun":"yy","Yong":"yl","Ba":"ba","Bai":"bk","Ban":"bj","Bang":"bh","Bao":"bs","Bei":"bw","Ben":"bm","Beng":"bn","Bi":"bi","Bian":"bf","Biang":"bm","Biao":"bc","Bie":"bp","Bin":"bd","Bing":"bv","Bo":"bo","Bu":"bu","Ca":"ca","Cai":"ck","Can":"cj","Cang":"ch","Cao":"cs","Ce":"ce","Cen":"cm","Ceng":"cn","Cha":"ia","Chai":"ik","Chan":"ij","Chang":"ih","Chao":"is","Che":"ie","Chen":"im","Cheng":"in","Chi":"ii","Chong":"il","Chou":"ir","Chu":"iu","Chua":"if","Chuai":"iv","Chuan":"ig","Chuang":"iz","Chui":"id","Chun":"iy","Chuo":"io","Ci":"ci","Cong":"cl","Cou":"cr","Cu":"cu","Cuan":"cg","Cui":"cd","Cun":"cy","Cuo":"co","Da":"da","Dai":"dk","Dan":"dj","Dang":"dh","Dao":"ds","De":"de","Dei":"dw","Den":"dm","Deng":"dn","Di":"di","Dia":"dk","Dian":"df","Diao":"dc","Die":"dp","Ding":"dv","Diu":"dt","Dong":"dl","Dou":"dr","Du":"du","Duan":"dg","Dui":"dd","Dun":"dy","Duo":"do","Fa":"fa","Fan":"fj","Fang":"fh","Fei":"fw","Fen":"fm","Feng":"fn","Fiao":"fc","Fo":"fo","Fou":"fr","Fu":"fu","Ga":"ga","Gai":"gk","Gan":"gj","Gang":"gh","Gao":"gs","Ge":"ge","Gei":"gw","Gen":"gm","Geng":"gn","Gong":"gl","Gou":"gr","Gu":"gu","Gua":"gf","Guai":"gv","Guan":"gg","Guang":"gz","Gui":"gd","Gun":"gy","Guo":"go","Ha":"ha","Hai":"hk","Han":"hj","Hang":"hh","Hao":"hs","He":"he","Hei":"hw","Hen":"hm","Heng":"hn","Hong":"hl","Hou":"hr","Hu":"hu","Hua":"hf","Huai":"hv","Huan":"hg","Huang":"hz","Hui":"hd","Hun":"hy","Huo":"ho","Ji":"ji","Jia":"jk","Jian":"jf","Jiang":"jm","Jiao":"jc","Jie":"jp","Jin":"jd","Jing":"jv","Jiong":"jj","Jiu":"jt","Ju":"ju","Juan":"jg","Jue":"jb","Jun":"jy","Ka":"ka","Kai":"kk","Kan":"kj","Kang":"kh","Kao":"ks","Ke":"ke","Ken":"km","Keng":"kn","Kong":"kl","Kou":"kr","Ku":"ku","Kua":"kf","Kuai":"kv","Kuan":"kg","Kuang":"kz","Kui":"kd","Kun":"ky","Kuo":"ko","La":"la","Lai":"lk","Lan":"lj","Lang":"lh","Lao":"ls","Le":"le","Lei":"lw","Leng":"ln","Li":"li","Lia":"lk","Lian":"lf","Liang":"lm","Liao":"lc","Lie":"lp","Lin":"ld","Ling":"lv","Liu":"lt","Lo":"lo","Long":"ll","Lou":"lr","Lu":"lu","Luan":"lg","Lun":"ly","Luo":"lo","Ma":"ma","Mai":"mk","Man":"mj","Mang":"mh","Mao":"ms","Me":"me","Mei":"mw","Men":"mm","Meng":"mn","Mi":"mi","Mian":"mf","Miao":"mc","Mie":"mp","Min":"md","Ming":"mv","Miu":"mt","Mo":"mo","Mou":"mr","Mu":"mu","Na":"na","Nai":"nk","Nan":"nj","Nang":"nh","Nao":"ns","Ne":"ne","Nei":"nw","Nen":"nm","Neng":"nn","Ni":"ni","Nian":"nf","Niang":"nm","Niao":"nc","Nie":"np","Nin":"nd","Ning":"nv","Niu":"nt","Nong":"nl","Nou":"nr","Nu":"nu","Nuan":"ng","Nun":"ny","Nuo":"no","Pa":"pa","Pai":"pk","Pan":"pj","Pang":"ph","Pao":"ps","Pei":"pw","Pen":"pm","Peng":"pn","Pi":"pi","Pian":"pf","Piao":"pc","Pie":"pp","Pin":"pd","Ping":"pv","Po":"po","Pou":"pr","Pu":"pu","Qi":"qi","Qia":"qk","Qian":"qf","Qiang":"qm","Qiao":"qc","Qie":"qp","Qin":"qd","Qing":"qv","Qiong":"qj","Qiu":"qt","Qu":"qu","Quan":"qg","Que":"qb","Qun":"qy","Ran":"rj","Rang":"rh","Rao":"rs","Re":"re","Ren":"rm","Reng":"rn","Ri":"ri","Rong":"rl","Rou":"rr","Ru":"ru","Rua":"rf","Ruan":"rg","Rui":"rd","Run":"ry","Ruo":"ro","Sa":"sa","Sai":"sk","San":"sj","Sang":"sh","Sao":"ss","Se":"se","Sen":"sm","Seng":"sn","Sha":"va","Shai":"vk","Shan":"vj","Shang":"vh","Shao":"vs","She":"ve","Shei":"vw","Shen":"vm","Sheng":"vn","Shi":"vi","Shou":"vr","Shu":"vu","Shua":"vf","Shuai":"vv","Shuan":"vg","Shuang":"vz","Shui":"vd","Shun":"vy","Shuo":"vo","Si":"si","Song":"sl","Sou":"sr","Su":"su","Suan":"sg","Sui":"sd","Sun":"sy","Suo":"so","Ta":"ta","Tai":"tk","Tan":"tj","Tang":"th","Tao":"ts","Te":"te","Tei":"tw","Teng":"tn","Ti":"ti","Tian":"tf","Tiao":"tc","Tie":"tp","Ting":"tv","Tong":"tl","Tou":"tr","Tu":"tu","Tuan":"tg","Tui":"td","Tun":"ty","Tuo":"to","Xi":"xi","Xia":"xk","Xian":"xf","Xiang":"xm","Xiao":"xc","Xie":"xp","Xin":"xd","Xing":"xv","Xiong":"xj","Xiu":"xt","Xu":"xu","Xuan":"xg","Xue":"xb","Xun":"xy","Za":"za","Zai":"zk","Zan":"zj","Zang":"zh","Zao":"zs","Ze":"ze","Zei":"zw","Zen":"zm","Zeng":"zn","Zha":"ea","Zhai":"ek","Zhan":"ej","Zhang":"eh","Zhao":"es","Zhe":"ee","Zhen":"em","Zheng":"en","Zhi":"ei","Zhong":"el","Zhou":"er","Zhu":"eu","Zhua":"ef","Zhuai":"ev","Zhuan":"eg","Zhuang":"ez","Zhui":"ed","Zhun":"ey","Zhuo":"eo","Zi":"zi","Zong":"zl","Zou":"zr","Zu":"zu","Zuan":"zg","Zui":"zd","Zun":"zy","Zuo":"zo"}} \ No newline at end of file From 4fb2e3d14e856cb6917204ce824d89b3cdf8de9c Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 14 Jun 2025 16:33:48 +0800 Subject: [PATCH 33/75] Fix translation mapping logic --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 6a2cd1e66..36f007f39 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -99,13 +99,19 @@ namespace Flow.Launcher.Infrastructure { if (content[i] >= 0x3400 && content[i] <= 0x9FD5) { - string dp = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i]; - map.AddNewIndex(i, resultBuilder.Length, dp.Length + 1); + string translated = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i]; if (previousIsChinese) { + map.AddNewIndex(i, resultBuilder.Length, translated.Length + 1); resultBuilder.Append(' '); + resultBuilder.Append(translated); + } + else + { + map.AddNewIndex(i, resultBuilder.Length, translated.Length); + resultBuilder.Append(translated); + previousIsChinese = true; } - resultBuilder.Append(dp); } else { From 4b6231ba8b807a62cd1fef17d370b3bd7b0fb31a Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sat, 14 Jun 2025 22:22:25 +0800 Subject: [PATCH 34/75] Extract methods for readability --- .../PinyinAlphabet.cs | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 36f007f39..37b7bb8c3 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -31,12 +31,27 @@ namespace Flow.Launcher.Infrastructure if (e.PropertyName == nameof(Settings.UseDoublePinyin) || e.PropertyName == nameof(Settings.DoublePinyinSchema)) { - LoadDoublePinyinTable(); - _pinyinCache.Clear(); + Reload(); } }; } + public void Reload() + { + LoadDoublePinyinTable(); + _pinyinCache.Clear(); + } + + private void CreateDoublePinyinTableFromStream(Stream jsonStream) + { + Dictionary> table = JsonSerializer.Deserialize>>(jsonStream); + if (!table.TryGetValue(_settings.DoublePinyinSchema, out var value)) + { + throw new InvalidOperationException("DoublePinyinSchema is invalid or double pinyin table is broken."); + } + currentDoublePinyinTable = new ReadOnlyDictionary(value); + } + private void LoadDoublePinyinTable() { if (_settings.UseDoublePinyin) @@ -45,12 +60,7 @@ namespace Flow.Launcher.Infrastructure try { using var fs = File.OpenRead(tablePath); - Dictionary> table = JsonSerializer.Deserialize>>(fs); - if (!table.TryGetValue(_settings.DoublePinyinSchema, out var value)) - { - throw new InvalidOperationException("DoublePinyinSchema is invalid."); - } - currentDoublePinyinTable = new ReadOnlyDictionary(value); + CreateDoublePinyinTableFromStream(fs); } catch (System.Exception e) { @@ -73,7 +83,7 @@ namespace Flow.Launcher.Infrastructure public (string translation, TranslationMapping map) Translate(string content) { - if (!_settings.ShouldUsePinyin) + if (!_settings.ShouldUsePinyin || !WordsHelper.HasChinese(content)) return (content, null); return _pinyinCache.TryGetValue(content, out var value) @@ -83,11 +93,6 @@ namespace Flow.Launcher.Infrastructure private (string translation, TranslationMapping map) BuildCacheFromContent(string content) { - if (!WordsHelper.HasChinese(content)) - { - return (content, null); - } - var resultList = WordsHelper.GetPinyinList(content); var resultBuilder = new StringBuilder(); From 64a3aa583f72be608e3e513aebf2c0f028e49346 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Thu, 19 Jun 2025 19:29:50 +0800 Subject: [PATCH 35/75] Fix Off-by-one in index mapping when consecutive Chinese chars Found by code rabbit --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 37b7bb8c3..ffb92a9bf 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -107,8 +107,8 @@ namespace Flow.Launcher.Infrastructure string translated = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i]; if (previousIsChinese) { - map.AddNewIndex(i, resultBuilder.Length, translated.Length + 1); resultBuilder.Append(' '); + map.AddNewIndex(i, resultBuilder.Length, translated.Length + 1); resultBuilder.Append(translated); } else From b18959514d439bfb4571cb75dc1661e03c22a7bf Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Thu, 19 Jun 2025 19:35:01 +0800 Subject: [PATCH 36/75] Add OnPropertyChanged() for double pinyin properties --- .../UserSettings/Settings.cs | 28 +++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index e7306e3dd..ae3c4a396 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -290,9 +290,33 @@ namespace Flow.Launcher.Infrastructure.UserSettings /// public bool ShouldUsePinyin { get; set; } = false; - public bool UseDoublePinyin { get; set; } = true; //For developing + private bool _useDoublePinyin = true; // TODO: change default to false BEFORE RELEASE + public bool UseDoublePinyin + { + get => _useDoublePinyin; + set + { + if (_useDoublePinyin != value) + { + _useDoublePinyin = value; + OnPropertyChanged(); + } + } + } - public string DoublePinyinSchema { get; set; } = "XiaoHe"; //For developing + private string _doublePinyinSchema = "XiaoHe"; + public string DoublePinyinSchema + { + get => _doublePinyinSchema; + set + { + if (_doublePinyinSchema != value) + { + _doublePinyinSchema = value; + OnPropertyChanged(); + } + } + } public bool AlwaysPreview { get; set; } = false; From d2dc307bc020ebd8205ce01ee8ae5e262703a943 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Thu, 19 Jun 2025 20:06:01 +0800 Subject: [PATCH 37/75] Fix logic of ShouldTranslate() --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index ffb92a9bf..91c13ffad 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -76,9 +76,7 @@ namespace Flow.Launcher.Infrastructure public bool ShouldTranslate(string stringToTranslate) { - return _settings.UseDoublePinyin ? - (!WordsHelper.HasChinese(stringToTranslate) && stringToTranslate.Length % 2 == 0) : - !WordsHelper.HasChinese(stringToTranslate); + return WordsHelper.HasChinese(stringToTranslate); } public (string translation, TranslationMapping map) Translate(string content) From 1bc80d5dd99cdc2fdf6ee900c1c5c4d351a0a1eb Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Thu, 19 Jun 2025 21:52:15 +0800 Subject: [PATCH 38/75] Fix translated length --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 91c13ffad..f11a49613 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -106,7 +106,7 @@ namespace Flow.Launcher.Infrastructure if (previousIsChinese) { resultBuilder.Append(' '); - map.AddNewIndex(i, resultBuilder.Length, translated.Length + 1); + map.AddNewIndex(i, resultBuilder.Length, translated.Length); resultBuilder.Append(translated); } else From 247355e1427af61d73f39fafedd66b2f0d2f6909 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 21 Jun 2025 21:34:49 +1000 Subject: [PATCH 39/75] simplify assignee by using filtered PR list --- .github/update_release_pr.py | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index ccea511b3..bf5f9a15e 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -107,14 +107,12 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") return pr_list -def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[str]: +def get_prs_assignees(pull_request_items: list[dict]) -> list[str]: """ - Returns a list of pull request assignees after applying the label and state filters, excludes jjw24. + Returns a list of pull request assignees, excludes jjw24. Args: - pull_request_items (list[dict]): List of PR items. - label (str): The label name. Filter is not applied when empty string. - state (str): State of PR, e.g. open, closed, all + pull_request_items (list[dict]): List of PR items to get the assignees from. Returns: list: A list of strs, where each string is an assignee name. List is not distinct, so can contain @@ -123,10 +121,9 @@ def get_prs_assignees(pull_request_items: list[dict], label: str = "", state: st """ assignee_list = [] for pr in pull_request_items: - if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]): - [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ] + [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ] - print(f"Found {len(assignee_list)} assignees with {label if label else 'no filter on'} label and state as {state}") + print(f"Found {len(assignee_list)} assignees") return assignee_list @@ -230,7 +227,7 @@ if __name__ == "__main__": description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else "" description_content += f"## Bug fixes\n{get_pr_descriptions(bug_fix_prs)}" if bug_fix_prs else "" - assignees = list(set(get_prs_assignees(pull_requests, "enhancement", "closed") + get_prs_assignees(pull_requests, "bug", "closed"))) + assignees = list(set(get_prs_assignees(enhancement_prs) + get_prs_assignees(bug_fix_prs))) assignees.sort(key=str.lower) description_content += f"### Authors:\n{', '.join(assignees)}" From 4e57e3a66cebec0af365c2bc6b7e462644d5c92d Mon Sep 17 00:00:00 2001 From: Jeremy Date: Sat, 21 Jun 2025 21:37:12 +1000 Subject: [PATCH 40/75] determine milestone from release PR instead of querying milestones --- .github/update_release_pr.py | 77 ++++++++++++++++-------------------- 1 file changed, 34 insertions(+), 43 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index bf5f9a15e..0ae83151d 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -1,11 +1,12 @@ from os import getenv +from typing import Optional import requests def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: str = "all") -> list[dict]: """ - Fetches pull requests from a GitHub repository that match a given milestone and label. + Fetches pull requests from a GitHub repository that match a given label and state. Args: token (str): GitHub token. @@ -23,39 +24,10 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st "Accept": "application/vnd.github.v3+json", } - milestone_id = None - milestone_url = f"https://api.github.com/repos/{owner}/{repo}/milestones" - params = {"state": "open"} - - try: - response = requests.get(milestone_url, headers=headers, params=params) - response.raise_for_status() - milestones = response.json() - - if len(milestones) > 2: - print("More than two milestones found, unable to determine the milestone required.") - exit(1) - - # milestones.pop() - for ms in milestones: - if ms["title"] != "Future": - milestone_id = ms["number"] - print(f"Gathering PRs with milestone {ms['title']}...") - break - - if not milestone_id: - print(f"No suitable milestone found in repository '{owner}/{repo}'.") - exit(1) - - except requests.exceptions.RequestException as e: - print(f"Error fetching milestones: {e}") - exit(1) - - # This endpoint allows filtering by milestone and label. A PR in GH's perspective is a type of issue. + # This endpoint allows filtering by label(and milestone). A PR in GH's perspective is a type of issue. prs_url = f"https://api.github.com/repos/{owner}/{repo}/issues" params = { "state": state, - "milestone": milestone_id, "labels": label, "per_page": 100, } @@ -83,7 +55,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st return all_prs -def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") -> list[dict]: +def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all", milestone_number: Optional[int] = None) -> list[dict]: """ Returns a list of pull requests after applying the label and state filters. @@ -91,6 +63,7 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") pull_request_items (list[dict]): List of PR items. label (str): The label name. Filter is not applied when empty string. state (str): State of PR, e.g. open, closed, all + milestone_number (Optional[int]): The milestone number to filter by. If None, no milestone filtering is applied. Returns: list: A list of dictionaries, where each dictionary represents a pull request. @@ -99,11 +72,20 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all") pr_list = [] count = 0 for pr in pull_request_items: - if state in [pr["state"], "all"] and (not label or [item for item in pr["labels"] if item["name"] == label]): - pr_list.append(pr) - count += 1 + if state not in [pr["state"], "all"]: + continue - print(f"Found {count} PRs with {label if label else 'no filter on'} label and state as {state}") + if label and not [item for item in pr["labels"] if item["name"] == label]: + continue + + if milestone_number: + if not pr.get("milestone") or pr["milestone"]["number"] != milestone_number: + continue + + pr_list.append(pr) + count += 1 + + print(f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get("milestone",{}).get("number","None")}") return pr_list @@ -204,15 +186,16 @@ if __name__ == "__main__": print(f"Fetching {state} PRs for {repository_owner}/{repository_name} ...") - pull_requests = get_github_prs(github_token, repository_owner, repository_name) + # First, get all PRs to find the release PR and determine the milestone + all_pull_requests = get_github_prs(github_token, repository_owner, repository_name) - if not pull_requests: - print("No matching pull requests found") + if not all_pull_requests: + print("No pull requests found") exit(1) - print(f"\nFound total of {len(pull_requests)} pull requests") + print(f"\nFound total of {len(all_pull_requests)} pull requests") - release_pr = get_prs(pull_requests, "release", "open") + release_pr = get_prs(all_pull_requests, "release", "open") if len(release_pr) != 1: print(f"Unable to find the exact release PR. Returned result: {release_pr}") @@ -220,8 +203,16 @@ if __name__ == "__main__": print(f"Found release PR: {release_pr[0]['title']}") - enhancement_prs = get_prs(pull_requests, "enhancement", "closed") - bug_fix_prs = get_prs(pull_requests, "bug", "closed") + release_milestone_number = release_pr[0].get("milestone",{}).get("number",None) + + if not release_milestone_number: + print("Release PR does not have a milestone assigned.") + exit(1) + + print(f"Using milestone number: {release_milestone_number}") + + enhancement_prs = get_prs(all_pull_requests, "enhancement", "closed", release_milestone_number) + bug_fix_prs = get_prs(all_pull_requests, "bug", "closed", release_milestone_number) description_content = "# Release notes\n" description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else "" From 60d59668636db3bbef2488b0291328a78eacc655 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sat, 21 Jun 2025 11:46:12 +0000 Subject: [PATCH 41/75] formatting --- .github/update_release_pr.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 0ae83151d..68e4c0659 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -55,7 +55,9 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st return all_prs -def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all", milestone_number: Optional[int] = None) -> list[dict]: +def get_prs( + pull_request_items: list[dict], label: str = "", state: str = "all", milestone_number: Optional[int] = None +) -> list[dict]: """ Returns a list of pull requests after applying the label and state filters. @@ -85,10 +87,13 @@ def get_prs(pull_request_items: list[dict], label: str = "", state: str = "all", pr_list.append(pr) count += 1 - print(f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get("milestone",{}).get("number","None")}") + print( + f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get("milestone",{}).get("number","None")}" + ) return pr_list + def get_prs_assignees(pull_request_items: list[dict]) -> list[str]: """ Returns a list of pull request assignees, excludes jjw24. @@ -103,12 +108,13 @@ def get_prs_assignees(pull_request_items: list[dict]) -> list[str]: """ assignee_list = [] for pr in pull_request_items: - [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24" ] + [assignee_list.append(assignee["login"]) for assignee in pr["assignees"] if assignee["login"] != "jjw24"] print(f"Found {len(assignee_list)} assignees") return assignee_list + def get_pr_descriptions(pull_request_items: list[dict]) -> str: """ Returns the concatenated string of pr title and number in the format of @@ -203,7 +209,7 @@ if __name__ == "__main__": print(f"Found release PR: {release_pr[0]['title']}") - release_milestone_number = release_pr[0].get("milestone",{}).get("number",None) + release_milestone_number = release_pr[0].get("milestone", {}).get("number", None) if not release_milestone_number: print("Release PR does not have a milestone assigned.") From 9b02e1f74e180c906a7b0f13cde1cfb3c38904de Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sat, 21 Jun 2025 21:52:54 +1000 Subject: [PATCH 42/75] fix typo Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- .github/update_release_pr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 68e4c0659..d637a3275 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -88,7 +88,7 @@ def get_prs( count += 1 print( - f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get("milestone",{}).get("number","None")}" + f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get('milestone', {}).get('number', 'None')}" ) return pr_list From 5c2127ec52bbde14de45950382ae63aa88dedee9 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 6 Jul 2025 21:06:54 +0800 Subject: [PATCH 43/75] Add constructor for CustomPluginHotkey --- .../UserSettings/PluginHotkey.cs | 24 ++++++++++++++++++- 1 file changed, 23 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/PluginHotkey.cs b/Flow.Launcher.Infrastructure/UserSettings/PluginHotkey.cs index 9dc395aca..0c5c38028 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/PluginHotkey.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/PluginHotkey.cs @@ -1,4 +1,5 @@ -using Flow.Launcher.Plugin; +using System; +using Flow.Launcher.Plugin; namespace Flow.Launcher.Infrastructure.UserSettings { @@ -6,5 +7,26 @@ namespace Flow.Launcher.Infrastructure.UserSettings { public string Hotkey { get; set; } public string ActionKeyword { get; set; } + + public CustomPluginHotkey(string hotkey, string actionKeyword) + { + Hotkey = hotkey; + ActionKeyword = actionKeyword; + } + + public override bool Equals(object other) + { + if (other is CustomPluginHotkey otherHotkey) + { + return Hotkey == otherHotkey.Hotkey && ActionKeyword == otherHotkey.ActionKeyword; + } + + return false; + } + + public override int GetHashCode() + { + return HashCode.Combine(Hotkey, ActionKeyword); + } } } From 7c41a37daaa8b76cef86ae6f4ec6406f30bede57 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 6 Jul 2025 21:07:25 +0800 Subject: [PATCH 44/75] Add blank lines --- Flow.Launcher/CustomShortcutSetting.xaml.cs | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Flow.Launcher/CustomShortcutSetting.xaml.cs b/Flow.Launcher/CustomShortcutSetting.xaml.cs index e180f6570..f4644a267 100644 --- a/Flow.Launcher/CustomShortcutSetting.xaml.cs +++ b/Flow.Launcher/CustomShortcutSetting.xaml.cs @@ -43,12 +43,14 @@ namespace Flow.Launcher App.API.ShowMsgBox(App.API.GetTranslation("emptyShortcut")); return; } + // Check if key is modified or adding a new one if (((update && originalKey != Key) || !update) && _hotkeyVm.DoesShortcutExist(Key)) { App.API.ShowMsgBox(App.API.GetTranslation("duplicateShortcut")); return; } + DialogResult = !update || originalKey != Key || originalValue != Value; Close(); } From eb2b8d06a1141f25ccebbdf8384341773d3e0118 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 6 Jul 2025 21:15:00 +0800 Subject: [PATCH 45/75] Refactor CustomQueryHotkeySetting control --- Flow.Launcher/CustomQueryHotkeySetting.xaml | 18 ++++- .../CustomQueryHotkeySetting.xaml.cs | 72 +++++++------------ Flow.Launcher/Languages/en.xaml | 4 +- .../ViewModels/SettingsPaneHotkeyViewModel.cs | 38 ++++++++-- 4 files changed, 77 insertions(+), 55 deletions(-) diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml index 0171e6d79..9575f8121 100644 --- a/Flow.Launcher/CustomQueryHotkeySetting.xaml +++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml @@ -119,7 +119,8 @@ Grid.Column="1" Margin="10" HorizontalAlignment="Stretch" - VerticalAlignment="Center" /> + VerticalAlignment="Center" + Text="{Binding ActionKeyword}" /> diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs index 77febde9d..685fdf00a 100644 --- a/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs +++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml.cs @@ -1,73 +1,52 @@ -using System.Collections.ObjectModel; -using System.Linq; -using System.Windows; -using System.Windows.Input; +using System.Windows; using System.Windows.Controls; -using Flow.Launcher.Helper; +using System.Windows.Input; using Flow.Launcher.Infrastructure.UserSettings; namespace Flow.Launcher { public partial class CustomQueryHotkeySetting : Window { - private readonly Settings _settings; + public string Hotkey { get; set; } = string.Empty; + public string ActionKeyword { get; set; } = string.Empty; - private bool update; - private CustomPluginHotkey updateCustomHotkey; + private readonly bool update; + private readonly CustomPluginHotkey originalCustomHotkey; - public CustomQueryHotkeySetting(Settings settings) + public CustomQueryHotkeySetting() { - _settings = settings; InitializeComponent(); + lblAdd.Visibility = Visibility.Visible; + } + + public CustomQueryHotkeySetting(CustomPluginHotkey hotkey) + { + originalCustomHotkey = hotkey; + update = true; + ActionKeyword = originalCustomHotkey.ActionKeyword; + InitializeComponent(); + lblUpdate.Visibility = Visibility.Visible; + HotkeyControl.SetHotkey(originalCustomHotkey.Hotkey, false); } private void BtnCancel_OnClick(object sender, RoutedEventArgs e) { + DialogResult = false; Close(); } private void btnAdd_OnClick(object sender, RoutedEventArgs e) { - if (!update) + Hotkey = HotkeyControl.CurrentHotkey.ToString(); + + if (string.IsNullOrEmpty(Hotkey) && string.IsNullOrEmpty(ActionKeyword)) { - _settings.CustomPluginHotkeys ??= new ObservableCollection(); - - var pluginHotkey = new CustomPluginHotkey - { - Hotkey = HotkeyControl.CurrentHotkey.ToString(), ActionKeyword = tbAction.Text - }; - _settings.CustomPluginHotkeys.Add(pluginHotkey); - - HotKeyMapper.SetCustomQueryHotkey(pluginHotkey); - } - else - { - var oldHotkey = updateCustomHotkey.Hotkey; - updateCustomHotkey.ActionKeyword = tbAction.Text; - updateCustomHotkey.Hotkey = HotkeyControl.CurrentHotkey.ToString(); - //remove origin hotkey - HotKeyMapper.RemoveHotkey(oldHotkey); - HotKeyMapper.SetCustomQueryHotkey(updateCustomHotkey); - } - - Close(); - } - - public void UpdateItem(CustomPluginHotkey item) - { - updateCustomHotkey = _settings.CustomPluginHotkeys.FirstOrDefault(o => - o.ActionKeyword == item.ActionKeyword && o.Hotkey == item.Hotkey); - if (updateCustomHotkey == null) - { - App.API.ShowMsgBox(App.API.GetTranslation("invalidPluginHotkey")); - Close(); + App.API.ShowMsgBox(App.API.GetTranslation("emptyPluginHotkey")); return; } - tbAction.Text = updateCustomHotkey.ActionKeyword; - HotkeyControl.SetHotkey(updateCustomHotkey.Hotkey, false); - update = true; - lblAdd.Text = App.API.GetTranslation("update"); + DialogResult = !update || originalCustomHotkey.Hotkey != Hotkey || originalCustomHotkey.ActionKeyword != ActionKeyword; + Close(); } private void BtnTestActionKeyword_OnClick(object sender, RoutedEventArgs e) @@ -79,6 +58,7 @@ namespace Flow.Launcher private void cmdEsc_OnPress(object sender, ExecutedRoutedEventArgs e) { + DialogResult = false; Close(); } diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index bd4cbd282..a6ec4718f 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -429,13 +429,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. Preview Hotkey is unavailable, please select a new hotkey - Invalid plugin hotkey + Hotkey is invalid Update Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -444,6 +445,7 @@ Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid Save diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs index 7a7c19dd3..fdc9ef530 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneHotkeyViewModel.cs @@ -69,15 +69,33 @@ public partial class SettingsPaneHotkeyViewModel : BaseModel return; } - var window = new CustomQueryHotkeySetting(Settings); - window.UpdateItem(item); - window.ShowDialog(); + var settingItem = Settings.CustomPluginHotkeys.FirstOrDefault(o => + o.ActionKeyword == item.ActionKeyword && o.Hotkey == item.Hotkey); + if (settingItem == null) + { + App.API.ShowMsgBox(App.API.GetTranslation("invalidPluginHotkey")); + return; + } + + var window = new CustomQueryHotkeySetting(settingItem); + if (window.ShowDialog() is not true) return; + + var index = Settings.CustomPluginHotkeys.IndexOf(settingItem); + Settings.CustomPluginHotkeys[index] = new CustomPluginHotkey(window.Hotkey, window.ActionKeyword); + HotKeyMapper.RemoveHotkey(settingItem.Hotkey); // remove origin hotkey + HotKeyMapper.SetCustomQueryHotkey(Settings.CustomPluginHotkeys[index]); // set new hotkey } [RelayCommand] private void CustomHotkeyAdd() { - new CustomQueryHotkeySetting(Settings).ShowDialog(); + var window = new CustomQueryHotkeySetting(); + if (window.ShowDialog() is true) + { + var customHotkey = new CustomPluginHotkey(window.Hotkey, window.ActionKeyword); + Settings.CustomPluginHotkeys.Add(customHotkey); + HotKeyMapper.SetCustomQueryHotkey(customHotkey); // set new hotkey + } } [RelayCommand] @@ -114,10 +132,18 @@ public partial class SettingsPaneHotkeyViewModel : BaseModel return; } - var window = new CustomShortcutSetting(item.Key, item.Value, this); + var settingItem = Settings.CustomShortcuts.FirstOrDefault(o => + o.Key == item.Key && o.Value == item.Value); + if (settingItem == null) + { + App.API.ShowMsgBox(App.API.GetTranslation("invalidShortcut")); + return; + } + + var window = new CustomShortcutSetting(settingItem.Key, settingItem.Value, this); if (window.ShowDialog() is not true) return; - var index = Settings.CustomShortcuts.IndexOf(item); + var index = Settings.CustomShortcuts.IndexOf(settingItem); Settings.CustomShortcuts[index] = new CustomShortcutModel(window.Key, window.Value); } From e391965acb6543e5bbd4952ee7fb98d1c58a2271 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Mon, 7 Jul 2025 13:46:44 +0800 Subject: [PATCH 46/75] Generate documents for NuGet package --- Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj index 4a49e9589..1d51b6534 100644 --- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj +++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj @@ -27,6 +27,7 @@ true true Readme.md + true From 2856da83c1bcb23636b393047cae82681cc398b4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 8 Jul 2025 09:44:17 +0800 Subject: [PATCH 47/75] Fix quick access link type fetching issue --- .../Views/QuickAccessLinkSettings.xaml.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs index eb66e1efc..7261d37e2 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs @@ -27,6 +27,9 @@ public partial class QuickAccessLinkSettings if (string.IsNullOrEmpty(_selectedName)) { SelectedName = _selectedPath.GetPathName(); + } + if (!string.IsNullOrEmpty(_selectedPath)) + { _accessLinkType = GetResultType(_selectedPath); } } From bad7db69dc252e96de5002f42ede8ddebcf24c65 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 8 Jul 2025 09:45:54 +0800 Subject: [PATCH 48/75] Improve code quality --- Plugins/Flow.Launcher.Plugin.Explorer/Main.cs | 2 +- .../Views/QuickAccessLinkSettings.xaml.cs | 7 ++++--- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs index 0d1d99f8a..f1aea98b4 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Main.cs @@ -97,7 +97,7 @@ namespace Flow.Launcher.Plugin.Explorer return Context.API.GetTranslation("plugin_explorer_plugin_description"); } - private void FillQuickAccessLinkNames() + private static void FillQuickAccessLinkNames() { // Legacy version does not have names for quick access links, so we fill them with the path name. foreach (var link in Settings.QuickAccessLinks) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs index 7261d37e2..818e59724 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs @@ -1,6 +1,7 @@ using System; using System.Collections.ObjectModel; using System.ComponentModel; +using System.IO; using System.Linq; using System.Windows; using System.Windows.Forms; @@ -190,13 +191,13 @@ public partial class QuickAccessLinkSettings private static ResultType GetResultType(string path) { // Check if the path is a file or folder - if (System.IO.File.Exists(path)) + if (File.Exists(path)) { return ResultType.File; } - else if (System.IO.Directory.Exists(path)) + else if (Directory.Exists(path)) { - if (string.Equals(System.IO.Path.GetPathRoot(path), path, StringComparison.OrdinalIgnoreCase)) + if (string.Equals(Path.GetPathRoot(path), path, StringComparison.OrdinalIgnoreCase)) { return ResultType.Volume; } From fe3babd4fc8d57a7532fda4dc16cdbe6c97dc330 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Tue, 8 Jul 2025 09:50:12 +0800 Subject: [PATCH 49/75] Log error when fail to fetch type --- .../Views/QuickAccessLinkSettings.xaml.cs | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs index 818e59724..e6294b98b 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Views/QuickAccessLinkSettings.xaml.cs @@ -15,6 +15,8 @@ namespace Flow.Launcher.Plugin.Explorer.Views; [INotifyPropertyChanged] public partial class QuickAccessLinkSettings { + private static readonly string ClassName = nameof(QuickAccessLinkSettings); + private string _selectedPath; public string SelectedPath { @@ -209,6 +211,7 @@ public partial class QuickAccessLinkSettings else { // This should not happen, but just in case, we assume it's a folder + Main.Context.API.LogError(ClassName, $"The path '{path}' does not exist or is invalid. Defaulting to Folder type."); return ResultType.Folder; } } From b1e352dd54317e7d1d2f4606e9a3ad048ae99b91 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Wed, 9 Jul 2025 11:12:46 +0800 Subject: [PATCH 50/75] Update home page when language changes --- Flow.Launcher/MainWindow.xaml.cs | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index aa5040dac..8474ba50e 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -284,6 +284,10 @@ namespace Flow.Launcher break; case nameof(Settings.Language): UpdateNotifyIconText(); + if (_settings.ShowHomePage && _viewModel.QueryResultsSelected() && string.IsNullOrEmpty(_viewModel.QueryText)) + { + _viewModel.QueryResults(); + } break; case nameof(Settings.Hotkey): UpdateNotifyIconText(); From e36d5d8ce7bcf21950c0adccd2b03b1afd2d3ca2 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Thu, 10 Jul 2025 13:24:07 +0800 Subject: [PATCH 51/75] Fix spelling --- Flow.Launcher/CustomQueryHotkeySetting.xaml | 4 ++-- Flow.Launcher/CustomQueryHotkeySetting.xaml.cs | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Flow.Launcher/CustomQueryHotkeySetting.xaml b/Flow.Launcher/CustomQueryHotkeySetting.xaml index 9575f8121..db99b704a 100644 --- a/Flow.Launcher/CustomQueryHotkeySetting.xaml +++ b/Flow.Launcher/CustomQueryHotkeySetting.xaml @@ -153,13 +153,13 @@ Style="{StaticResource AccentButtonStyle}"> Date: Thu, 10 Jul 2025 13:27:04 +0800 Subject: [PATCH 52/75] Fix typos --- Flow.Launcher/Languages/en.xaml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index a6ec4718f..5bfeeb615 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -12,7 +12,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -378,7 +378,7 @@ Select File Manager Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. File Manager Profile Name File Manager Path From 1a8227a93938a284ca3946ad3d39391e2cb64965 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Fri, 11 Jul 2025 22:24:05 +0800 Subject: [PATCH 53/75] Use try-catch for query text box paste --- Flow.Launcher/MainWindow.xaml.cs | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 8474ba50e..0c8fb4d02 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -44,6 +44,9 @@ namespace Flow.Launcher #region Private Fields + // Class Name + private static readonly string ClassName = nameof(MainWindow); + // Dependency Injection private readonly Settings _settings; private readonly Theme _theme; @@ -1256,14 +1259,21 @@ namespace Flow.Launcher private void QueryTextBox_OnPaste(object sender, DataObjectPastingEventArgs e) { - var isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true); - if (isText) + try { - var text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string; - text = text.Replace(Environment.NewLine, " "); - DataObject data = new DataObject(); - data.SetData(DataFormats.UnicodeText, text); - e.DataObject = data; + var isText = e.SourceDataObject.GetDataPresent(DataFormats.UnicodeText, true); + if (isText) + { + var text = e.SourceDataObject.GetData(DataFormats.UnicodeText) as string; + text = text.Replace(Environment.NewLine, " "); + DataObject data = new DataObject(); + data.SetData(DataFormats.UnicodeText, text); + e.DataObject = data; + } + } + catch (Exception ex) + { + App.API.LogException(ClassName, "Failed to paste text", ex); } } From c5373f6abf29e95bd3452ea3ee1f6e999b796fc4 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 13 Jul 2025 10:51:03 +0800 Subject: [PATCH 54/75] Use one way binding for showing result hotkey --- .../UserSettings/Settings.cs | 16 +++++++++++++++- Flow.Launcher/ResultListBox.xaml | 3 ++- 2 files changed, 17 insertions(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index d55daf175..1a5367499 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -42,7 +42,21 @@ namespace Flow.Launcher.Infrastructure.UserSettings public string Hotkey { get; set; } = $"{KeyConstant.Alt} + {KeyConstant.Space}"; public string OpenResultModifiers { get; set; } = KeyConstant.Alt; public string ColorScheme { get; set; } = "System"; - public bool ShowOpenResultHotkey { get; set; } = true; + + private bool _showOpenResultHotkey = true; + public bool ShowOpenResultHotkey + { + get => _showOpenResultHotkey; + set + { + if (_showOpenResultHotkey != value) + { + _showOpenResultHotkey = value; + OnPropertyChanged(); + } + } + } + public double WindowSize { get; set; } = 580; public string PreviewHotkey { get; set; } = $"F1"; public string AutoCompleteHotkey { get; set; } = $"{KeyConstant.Ctrl} + Tab"; diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml index 8cb15400f..9b5235217 100644 --- a/Flow.Launcher/ResultListBox.xaml +++ b/Flow.Launcher/ResultListBox.xaml @@ -36,6 +36,7 @@ + @@ -66,7 +67,7 @@ Grid.Column="2" Margin="0 0 10 0" VerticalAlignment="Center" - Visibility="{Binding ShowOpenResultHotkey}"> + Visibility="{Binding Settings.ShowOpenResultHotkey, Mode=OneWay, Converter={StaticResource BoolToVisibilityConverter}}"> From ed4fdb7561dc4a5ae25324d9816e437cccb1279f Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 13 Jul 2025 10:55:13 +0800 Subject: [PATCH 55/75] Update result modifiers when OpenResultModifiers is changed --- .../UserSettings/Settings.cs | 16 +++++++++++++++- Flow.Launcher/MainWindow.xaml.cs | 6 ++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 1a5367499..0e755b4f4 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -40,7 +40,21 @@ namespace Flow.Launcher.Infrastructure.UserSettings } public string Hotkey { get; set; } = $"{KeyConstant.Alt} + {KeyConstant.Space}"; - public string OpenResultModifiers { get; set; } = KeyConstant.Alt; + + private string _openResultModifiers = KeyConstant.Alt; + public string OpenResultModifiers + { + get => _openResultModifiers; + set + { + if (_openResultModifiers != value) + { + _openResultModifiers = value; + OnPropertyChanged(); + } + } + } + public string ColorScheme { get; set; } = "System"; private bool _showOpenResultHotkey = true; diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 0c8fb4d02..900befe72 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -323,6 +323,12 @@ namespace Flow.Launcher case nameof(Settings.ShowAtTopmost): Topmost = _settings.ShowAtTopmost; break; + case nameof(Settings.OpenResultModifiers): + if (_viewModel.QueryResultsSelected() && string.IsNullOrEmpty(_viewModel.QueryText)) + { + _viewModel.QueryResults(); + } + break; } }; From b16cd145c14deeb402fa9d594347dafd3d708462 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 13 Jul 2025 10:59:34 +0800 Subject: [PATCH 56/75] Remove unused property --- Flow.Launcher/ViewModel/ResultViewModel.cs | 3 --- 1 file changed, 3 deletions(-) diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index 648ac49bb..df37fef09 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -64,9 +64,6 @@ namespace Flow.Launcher.ViewModel public Settings Settings { get; } - public Visibility ShowOpenResultHotkey => - Settings.ShowOpenResultHotkey ? Visibility.Visible : Visibility.Collapsed; - public Visibility ShowDefaultPreview => Result.PreviewPanel == null ? Visibility.Visible : Visibility.Collapsed; public Visibility ShowCustomizedPreview => Result.PreviewPanel == null ? Visibility.Collapsed : Visibility.Visible; From 100f753e9b9a2f24432b30c0a4696f2cc13cecc8 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 15:39:03 +0800 Subject: [PATCH 57/75] Fix ShouldTranslate() logic --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index f11a49613..c85c432dd 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -76,7 +76,8 @@ namespace Flow.Launcher.Infrastructure public bool ShouldTranslate(string stringToTranslate) { - return WordsHelper.HasChinese(stringToTranslate); + // If a string has Chinese characters, we don't need to translate it to pinyin. + return !WordsHelper.HasChinese(stringToTranslate); } public (string translation, TranslationMapping map) Translate(string content) From d9e89ad6109cd8c71fb32bd096aa2c995121ebd8 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 15:56:25 +0800 Subject: [PATCH 58/75] Refactor TranslationMapping class - Always add index to mapping rather than only Chinese characters - Simplify mapping algorithm - Add unit test for TranslationMapping --- .../PinyinAlphabet.cs | 5 +- .../TranslationMapping.cs | 73 ++----------------- Flow.Launcher.Test/TranslationMappingTest.cs | 56 ++++++++++++++ 3 files changed, 66 insertions(+), 68 deletions(-) create mode 100644 Flow.Launcher.Test/TranslationMappingTest.cs diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index c85c432dd..7f7f2da60 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -107,12 +107,12 @@ namespace Flow.Launcher.Infrastructure if (previousIsChinese) { resultBuilder.Append(' '); - map.AddNewIndex(i, resultBuilder.Length, translated.Length); + map.AddNewIndex(resultBuilder.Length, translated.Length); resultBuilder.Append(translated); } else { - map.AddNewIndex(i, resultBuilder.Length, translated.Length); + map.AddNewIndex(resultBuilder.Length, translated.Length); resultBuilder.Append(translated); previousIsChinese = true; } @@ -124,6 +124,7 @@ namespace Flow.Launcher.Infrastructure previousIsChinese = false; resultBuilder.Append(' '); } + map.AddNewIndex(resultBuilder.Length, resultList[i].Length); resultBuilder.Append(resultList[i]); } } diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs index b33a094db..6d4feccd4 100644 --- a/Flow.Launcher.Infrastructure/TranslationMapping.cs +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -8,82 +8,23 @@ namespace Flow.Launcher.Infrastructure { private bool constructed; - private readonly List originalIndexes = new(); - private readonly List translatedIndexes = new(); + // Asssuming one original item maps to multi translated items + // list[i] is the last translated index + 1 of original index i + private readonly List originalToTranslated = []; - private int translatedLength = 0; - - public void AddNewIndex(int originalIndex, int translatedIndex, int length) + public void AddNewIndex(int translatedIndex, int length) { if (constructed) throw new InvalidOperationException("Mapping shouldn't be changed after constructed"); - originalIndexes.Add(originalIndex); - translatedIndexes.Add(translatedIndex); - translatedIndexes.Add(translatedIndex + length); - translatedLength += length - 1; + originalToTranslated.Add(translatedIndex + length); } public int MapToOriginalIndex(int translatedIndex) { - if (translatedIndex > translatedIndexes.Last()) - return translatedIndex - translatedLength - 1; + int loc = originalToTranslated.BinarySearch(translatedIndex); - int lowerBound = 0; - int upperBound = originalIndexes.Count - 1; - - int count = 0; - - // Corner case handle - if (translatedIndex < translatedIndexes[0]) - return translatedIndex; - - if (translatedIndex > translatedIndexes.Last()) - { - int indexDef = 0; - for (int k = 0; k < originalIndexes.Count; k++) - { - indexDef += translatedIndexes[k * 2 + 1] - translatedIndexes[k * 2]; - } - - return translatedIndex - indexDef - 1; - } - - // Binary Search with Range - for (int i = originalIndexes.Count / 2;; count++) - { - if (translatedIndex < translatedIndexes[i * 2]) - { - // move to lower middle - upperBound = i; - i = (i + lowerBound) / 2; - } - else if (translatedIndex > translatedIndexes[i * 2 + 1] - 1) - { - lowerBound = i; - // move to upper middle - // due to floor of integer division, move one up on corner case - i = (i + upperBound + 1) / 2; - } - else - { - return originalIndexes[i]; - } - - if (upperBound - lowerBound <= 1 && - translatedIndex > translatedIndexes[lowerBound * 2 + 1] && - translatedIndex < translatedIndexes[upperBound * 2]) - { - int indexDef = 0; - - for (int j = 0; j < upperBound; j++) - { - indexDef += translatedIndexes[j * 2 + 1] - translatedIndexes[j * 2]; - } - - return translatedIndex - indexDef - 1; - } - } + return loc > 0 ? loc : ~loc; } public void endConstruct() diff --git a/Flow.Launcher.Test/TranslationMappingTest.cs b/Flow.Launcher.Test/TranslationMappingTest.cs new file mode 100644 index 000000000..10d765f5a --- /dev/null +++ b/Flow.Launcher.Test/TranslationMappingTest.cs @@ -0,0 +1,56 @@ +using Flow.Launcher.Infrastructure; +using NUnit.Framework; +using NUnit.Framework.Legacy; + +namespace Flow.Launcher.Test +{ + [TestFixture] + public class TranslationMappingTest + { + [Test] + public void AddNewIndex_ShouldAddTranslatedIndexPlusLength() + { + var mapping = new TranslationMapping(); + mapping.AddNewIndex(5, 3); + mapping.AddNewIndex(8, 2); + + // 5+3=8, 8+2=10 + ClassicAssert.AreEqual(2, GetOriginalToTranslatedCount(mapping)); + ClassicAssert.AreEqual(8, GetOriginalToTranslatedAt(mapping, 0)); + ClassicAssert.AreEqual(10, GetOriginalToTranslatedAt(mapping, 1)); + } + + [TestCase(0, 0)] + [TestCase(2, 1)] + [TestCase(3, 1)] + [TestCase(5, 2)] + [TestCase(6, 2)] + public void MapToOriginalIndex_ShouldReturnExpectedIndex(int translatedIndex, int expectedOriginalIndex) + { + var mapping = new TranslationMapping(); + // a测试 + // a Ce Shi + mapping.AddNewIndex(0, 1); + mapping.AddNewIndex(2, 2); + mapping.AddNewIndex(5, 3); + + + var result = mapping.MapToOriginalIndex(translatedIndex); + ClassicAssert.AreEqual(expectedOriginalIndex, result); + } + + private int GetOriginalToTranslatedCount(TranslationMapping mapping) + { + var field = typeof(TranslationMapping).GetField("originalToTranslated", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var list = (System.Collections.Generic.List)field.GetValue(mapping); + return list.Count; + } + + private int GetOriginalToTranslatedAt(TranslationMapping mapping, int index) + { + var field = typeof(TranslationMapping).GetField("originalToTranslated", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance); + var list = (System.Collections.Generic.List)field.GetValue(mapping); + return list[index]; + } + } +} From d537ce22f8d2a2c0c61f7f3d05a6084e81565d65 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 16:08:28 +0800 Subject: [PATCH 59/75] Fix init issue --- Flow.Launcher.Infrastructure/TranslationMapping.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs index 6d4feccd4..58754cf90 100644 --- a/Flow.Launcher.Infrastructure/TranslationMapping.cs +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -8,9 +8,9 @@ namespace Flow.Launcher.Infrastructure { private bool constructed; - // Asssuming one original item maps to multi translated items - // list[i] is the last translated index + 1 of original index i - private readonly List originalToTranslated = []; + // Asssuming one original item maps to multi translated items + // list[i] is the last translated index + 1 of original index i + private readonly List originalToTranslated = new List(); public void AddNewIndex(int translatedIndex, int length) { From 67ec700caff12eb129012fa8578163d5afce4a04 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 13 Jul 2025 18:03:14 +0800 Subject: [PATCH 60/75] Use one way binding for modifiers --- Flow.Launcher/MainWindow.xaml.cs | 6 ------ Flow.Launcher/ResultListBox.xaml | 2 +- Flow.Launcher/ViewModel/ResultViewModel.cs | 2 -- 3 files changed, 1 insertion(+), 9 deletions(-) diff --git a/Flow.Launcher/MainWindow.xaml.cs b/Flow.Launcher/MainWindow.xaml.cs index 900befe72..0c8fb4d02 100644 --- a/Flow.Launcher/MainWindow.xaml.cs +++ b/Flow.Launcher/MainWindow.xaml.cs @@ -323,12 +323,6 @@ namespace Flow.Launcher case nameof(Settings.ShowAtTopmost): Topmost = _settings.ShowAtTopmost; break; - case nameof(Settings.OpenResultModifiers): - if (_viewModel.QueryResultsSelected() && string.IsNullOrEmpty(_viewModel.QueryText)) - { - _viewModel.QueryResults(); - } - break; } }; diff --git a/Flow.Launcher/ResultListBox.xaml b/Flow.Launcher/ResultListBox.xaml index 9b5235217..e469bb63b 100644 --- a/Flow.Launcher/ResultListBox.xaml +++ b/Flow.Launcher/ResultListBox.xaml @@ -80,7 +80,7 @@ Style="{DynamicResource ItemHotkeyStyle}"> - + diff --git a/Flow.Launcher/ViewModel/ResultViewModel.cs b/Flow.Launcher/ViewModel/ResultViewModel.cs index df37fef09..c58abae28 100644 --- a/Flow.Launcher/ViewModel/ResultViewModel.cs +++ b/Flow.Launcher/ViewModel/ResultViewModel.cs @@ -149,8 +149,6 @@ namespace Flow.Launcher.ViewModel private bool PreviewImageAvailable => !string.IsNullOrEmpty(Result.Preview.PreviewImagePath) || Result.Preview.PreviewDelegate != null; - public string OpenResultModifiers => Settings.OpenResultModifiers; - public string ShowTitleToolTip => string.IsNullOrEmpty(Result.TitleToolTip) ? Result.Title : Result.TitleToolTip; From a8e6ead59f50318131b5ce5e2935511dede5d095 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 13 Jul 2025 10:40:11 +0000 Subject: [PATCH 61/75] fix get milestone title --- .github/update_release_pr.py | 24 ++++++++++++++---------- 1 file changed, 14 insertions(+), 10 deletions(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index d637a3275..37d4a8683 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -56,7 +56,7 @@ def get_github_prs(token: str, owner: str, repo: str, label: str = "", state: st def get_prs( - pull_request_items: list[dict], label: str = "", state: str = "all", milestone_number: Optional[int] = None + pull_request_items: list[dict], label: str = "", state: str = "all", milestone_title: Optional[str] = None ) -> list[dict]: """ Returns a list of pull requests after applying the label and state filters. @@ -65,7 +65,8 @@ def get_prs( pull_request_items (list[dict]): List of PR items. label (str): The label name. Filter is not applied when empty string. state (str): State of PR, e.g. open, closed, all - milestone_number (Optional[int]): The milestone number to filter by. If None, no milestone filtering is applied. + milestone_title (Optional[str]): The milestone title to filter by. This is the milestone number you created + in GitHub, e.g. '1.20.0'. If None, no milestone filtering is applied. Returns: list: A list of dictionaries, where each dictionary represents a pull request. @@ -80,15 +81,15 @@ def get_prs( if label and not [item for item in pr["labels"] if item["name"] == label]: continue - if milestone_number: - if not pr.get("milestone") or pr["milestone"]["number"] != milestone_number: + if milestone_title: + if pr["milestone"] is None or pr["milestone"]["title"] != milestone_title: continue pr_list.append(pr) count += 1 print( - f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr.get('milestone', {}).get('number', 'None')}" + f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr["milestone"] if pr["milestone"] is not None else "None"}" ) return pr_list @@ -209,16 +210,19 @@ if __name__ == "__main__": print(f"Found release PR: {release_pr[0]['title']}") - release_milestone_number = release_pr[0].get("milestone", {}).get("number", None) + release_milestone_title = release_pr[0].get("milestone", {}).get("title", None) - if not release_milestone_number: + if not release_milestone_title: print("Release PR does not have a milestone assigned.") exit(1) - print(f"Using milestone number: {release_milestone_number}") + print(f"Using milestone number: {release_milestone_title}") - enhancement_prs = get_prs(all_pull_requests, "enhancement", "closed", release_milestone_number) - bug_fix_prs = get_prs(all_pull_requests, "bug", "closed", release_milestone_number) + enhancement_prs = get_prs(all_pull_requests, "enhancement", "closed", release_milestone_title) + bug_fix_prs = get_prs(all_pull_requests, "bug", "closed", release_milestone_title) + + if len(enhancement_prs) == 0 and len(bug_fix_prs) == 0: + print(f"No PRs with {release_milestone_title} milestone were found") description_content = "# Release notes\n" description_content += f"## Features\n{get_pr_descriptions(enhancement_prs)}" if enhancement_prs else "" From fdbb18306431e3b91fafa3a4b38519c4bfb123a3 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:00:31 +0800 Subject: [PATCH 62/75] Remove readonly to reload correctly --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 7f7f2da60..29b20a021 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -14,7 +14,7 @@ namespace Flow.Launcher.Infrastructure { public class PinyinAlphabet : IAlphabet { - private readonly ConcurrentDictionary _pinyinCache = + private ConcurrentDictionary _pinyinCache = new(); private readonly Settings _settings; From ebcd7d59155269d2c54c18bb47a05636e953218c Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:01:59 +0800 Subject: [PATCH 63/75] Fix ShouldTranslate() logic - Check settings or it won't work as expected --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 29b20a021..55c3decd0 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -77,7 +77,7 @@ namespace Flow.Launcher.Infrastructure public bool ShouldTranslate(string stringToTranslate) { // If a string has Chinese characters, we don't need to translate it to pinyin. - return !WordsHelper.HasChinese(stringToTranslate); + return _settings.ShouldUsePinyin && !WordsHelper.HasChinese(stringToTranslate); } public (string translation, TranslationMapping map) Translate(string content) From 130202108c2421046105dc937b983fc50b6509e4 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:09:40 +0800 Subject: [PATCH 64/75] Add UI for double pinyin options --- .../PinyinAlphabet.cs | 16 +++---- .../UserSettings/Settings.cs | 27 ++++++++--- Flow.Launcher/Languages/en.xaml | 13 +++++ .../SettingsPaneGeneralViewModel.cs | 20 +++++++- .../Views/SettingsPaneGeneral.xaml | 48 +++++++++++++++---- 5 files changed, 97 insertions(+), 27 deletions(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index 55c3decd0..d878a3d0e 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -45,7 +45,8 @@ namespace Flow.Launcher.Infrastructure private void CreateDoublePinyinTableFromStream(Stream jsonStream) { Dictionary> table = JsonSerializer.Deserialize>>(jsonStream); - if (!table.TryGetValue(_settings.DoublePinyinSchema, out var value)) + string schemaKey = _settings.DoublePinyinSchema.ToString(); // Convert enum to string + if (!table.TryGetValue(schemaKey, out var value)) { throw new InvalidOperationException("DoublePinyinSchema is invalid or double pinyin table is broken."); } @@ -104,18 +105,13 @@ namespace Flow.Launcher.Infrastructure if (content[i] >= 0x3400 && content[i] <= 0x9FD5) { string translated = _settings.UseDoublePinyin ? ToDoublePin(resultList[i]) : resultList[i]; - if (previousIsChinese) + if (i > 0) { resultBuilder.Append(' '); - map.AddNewIndex(resultBuilder.Length, translated.Length); - resultBuilder.Append(translated); - } - else - { - map.AddNewIndex(resultBuilder.Length, translated.Length); - resultBuilder.Append(translated); - previousIsChinese = true; } + map.AddNewIndex(resultBuilder.Length, translated.Length); + resultBuilder.Append(translated); + previousIsChinese = true; } else { diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index 3ec765fa4..736d3a5dd 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -87,7 +87,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings } } public bool UseDropShadowEffect { get; set; } = true; - public BackdropTypes BackdropType{ get; set; } = BackdropTypes.None; + public BackdropTypes BackdropType { get; set; } = BackdropTypes.None; public string ReleaseNotesVersion { get; set; } = string.Empty; /* Appearance Settings. It should be separated from the setting later.*/ @@ -200,7 +200,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings } } } - + public int MaxHistoryResultsToShowForHomePage { get; set; } = 5; public int CustomExplorerIndex { get; set; } = 0; @@ -313,8 +313,10 @@ namespace Flow.Launcher.Infrastructure.UserSettings } } - private string _doublePinyinSchema = "XiaoHe"; - public string DoublePinyinSchema + private DoublePinyinSchemas _doublePinyinSchema = DoublePinyinSchemas.XiaoHe; + + [JsonInclude, JsonConverter(typeof(JsonStringEnumConverter))] + public DoublePinyinSchemas DoublePinyinSchema { get => _doublePinyinSchema; set @@ -489,7 +491,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings if (!string.IsNullOrEmpty(SettingWindowHotkey)) list.Add(new(SettingWindowHotkey, "SettingWindowHotkey", () => SettingWindowHotkey = "")); if (!string.IsNullOrEmpty(OpenHistoryHotkey)) - list.Add(new(OpenHistoryHotkey, "OpenHistoryHotkey", () => OpenHistoryHotkey = "")); + list.Add(new(OpenHistoryHotkey, "OpenHistoryHotkey", () => OpenHistoryHotkey = "")); if (!string.IsNullOrEmpty(OpenContextMenuHotkey)) list.Add(new(OpenContextMenuHotkey, "OpenContextMenuHotkey", () => OpenContextMenuHotkey = "")); if (!string.IsNullOrEmpty(SelectNextPageHotkey)) @@ -595,9 +597,22 @@ namespace Flow.Launcher.Infrastructure.UserSettings public enum BackdropTypes { - None, + None, Acrylic, Mica, MicaAlt } + + public enum DoublePinyinSchemas + { + XiaoHe, + ZiRanMa, + WeiRuan, + ZhiNengABC, + ZiGuangPinYin, + PinYinJiaJia, + XingKongJianDao, + DaNiu, + XiaoLang + } } diff --git a/Flow.Launcher/Languages/en.xaml b/Flow.Launcher/Languages/en.xaml index bd4cbd282..22a3ca60b 100644 --- a/Flow.Launcher/Languages/en.xaml +++ b/Flow.Launcher/Languages/en.xaml @@ -105,6 +105,19 @@ Regular Search with Pinyin Allows using Pinyin to search. Pinyin is the standard system of romanized spelling for translating Chinese. + Use Double Pinyin + Allows using Double Pinyin to search. Double Pinyin is a variation of Pinyin that uses two characters. + Double Pinyin Schema + Xiao He + Zi Ran Ma + Wei Ruan + Zhi Neng ABC + Zi Guang Pin Yin + Pin Yin Jia Jia + Xing Kong Jian Dao + Da Niu + Xiao Lang + Always Preview Always open preview panel when Flow activates. Press {0} to toggle preview. Shadow effect is not allowed while current theme has blur effect enabled diff --git a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs index bec59a2b1..e5b70cd87 100644 --- a/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs +++ b/Flow.Launcher/SettingPages/ViewModels/SettingsPaneGeneralViewModel.cs @@ -35,6 +35,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel public class SearchWindowAlignData : DropdownDataGeneric { } public class SearchPrecisionData : DropdownDataGeneric { } public class LastQueryModeData : DropdownDataGeneric { } + public class DoublePinyinSchemaData : DropdownDataGeneric { } public bool StartFlowLauncherOnSystemStartup { @@ -177,6 +178,7 @@ public partial class SettingsPaneGeneralViewModel : BaseModel DropdownDataGeneric.UpdateLabels(SearchWindowAligns); DropdownDataGeneric.UpdateLabels(SearchPrecisionScores); DropdownDataGeneric.UpdateLabels(LastQueryModes); + DropdownDataGeneric.UpdateLabels(DoublePinyinSchemas); // Since we are using Binding instead of DynamicResource, we need to manually trigger the update OnPropertyChanged(nameof(AlwaysPreviewToolTip)); } @@ -262,9 +264,25 @@ public partial class SettingsPaneGeneralViewModel : BaseModel public bool ShouldUsePinyin { get => Settings.ShouldUsePinyin; - set => Settings.ShouldUsePinyin = value; + set + { + if (value == false && UseDoublePinyin == true) + { + UseDoublePinyin = false; + } + Settings.ShouldUsePinyin = value; + } } + public bool UseDoublePinyin + { + set => Settings.UseDoublePinyin = value; + get => Settings.UseDoublePinyin; + } + + public List DoublePinyinSchemas { get; } = + DropdownDataGeneric.GetValues("DoublePinyinSchemas"); + public List Languages => _translater.LoadAvailableLanguages(); public string AlwaysPreviewToolTip => string.Format( diff --git a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml index d114736d5..3f29758ba 100644 --- a/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml +++ b/Flow.Launcher/SettingPages/Views/SettingsPaneGeneral.xaml @@ -347,16 +347,44 @@ OnContent="{DynamicResource enable}" /> - - - + + + + + + + + + + + Date: Sun, 13 Jul 2025 19:33:20 +0800 Subject: [PATCH 65/75] Fix zero boundary condition in MapToOriginalIndex Co-authored-by: coderabbitai[bot] <136622811+coderabbitai[bot]@users.noreply.github.com> --- Flow.Launcher.Infrastructure/TranslationMapping.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs index 58754cf90..3a3ca6e2f 100644 --- a/Flow.Launcher.Infrastructure/TranslationMapping.cs +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -23,8 +23,7 @@ namespace Flow.Launcher.Infrastructure public int MapToOriginalIndex(int translatedIndex) { int loc = originalToTranslated.BinarySearch(translatedIndex); - - return loc > 0 ? loc : ~loc; + return loc >= 0 ? loc : ~loc; } public void endConstruct() From 5cd7ae72f4352002572a4f8c4c6bf358ec6e03dc Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:35:11 +0800 Subject: [PATCH 66/75] Fix typo --- Flow.Launcher.Infrastructure/TranslationMapping.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs index 3a3ca6e2f..951979fa7 100644 --- a/Flow.Launcher.Infrastructure/TranslationMapping.cs +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -8,7 +8,7 @@ namespace Flow.Launcher.Infrastructure { private bool constructed; - // Asssuming one original item maps to multi translated items + // Assuming one original item maps to multi translated items // list[i] is the last translated index + 1 of original index i private readonly List originalToTranslated = new List(); From 4c560210cd28e0a83372e5909e3e7003db690f16 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:36:31 +0800 Subject: [PATCH 67/75] More specific exception types for better error handling --- Flow.Launcher.Infrastructure/PinyinAlphabet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs index d878a3d0e..b5344c7e9 100644 --- a/Flow.Launcher.Infrastructure/PinyinAlphabet.cs +++ b/Flow.Launcher.Infrastructure/PinyinAlphabet.cs @@ -48,7 +48,7 @@ namespace Flow.Launcher.Infrastructure string schemaKey = _settings.DoublePinyinSchema.ToString(); // Convert enum to string if (!table.TryGetValue(schemaKey, out var value)) { - throw new InvalidOperationException("DoublePinyinSchema is invalid or double pinyin table is broken."); + throw new ArgumentException("DoublePinyinSchema is invalid or double pinyin table is broken."); } currentDoublePinyinTable = new ReadOnlyDictionary(value); } From 27002c50354d38616fa62c72ab4533a446fa3de6 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 19:48:49 +0800 Subject: [PATCH 68/75] Update doc --- Flow.Launcher.Infrastructure/IAlphabet.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/IAlphabet.cs b/Flow.Launcher.Infrastructure/IAlphabet.cs index e79ec0c6d..d13eeb414 100644 --- a/Flow.Launcher.Infrastructure/IAlphabet.cs +++ b/Flow.Launcher.Infrastructure/IAlphabet.cs @@ -13,7 +13,7 @@ public (string translation, TranslationMapping map) Translate(string stringToTranslate); /// - /// Determine if a string can be translated to English letter with this Alphabet. + /// Determine if a string should be translated to English letter with this Alphabet. /// /// String to translate. /// From bb946b707a8d0bc8fd3956261b527f2fdf4248b5 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 20:54:12 +0800 Subject: [PATCH 69/75] Fix the issue that UWP changes that can't be monitored (#2345) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 相关工作项: #2337 --- Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs index f67111b4e..76599d7ce 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs @@ -290,12 +290,12 @@ namespace Flow.Launcher.Plugin.Program.Programs } private static readonly Channel PackageChangeChannel = Channel.CreateBounded(1); + private static PackageCatalog catalog = PackageCatalog.OpenForCurrentUser(); public static async Task WatchPackageChangeAsync() { if (Environment.OSVersion.Version.Major >= 10) { - var catalog = PackageCatalog.OpenForCurrentUser(); catalog.PackageInstalling += (_, args) => { if (args.IsComplete) From 3159e67c9dfe27f0283544bd26c5bdb97e072a25 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 13 Jul 2025 22:56:34 +1000 Subject: [PATCH 70/75] New Crowdin updates (#3807) --- Flow.Launcher/Languages/ar.xaml | 40 +++- Flow.Launcher/Languages/cs.xaml | 40 +++- Flow.Launcher/Languages/da.xaml | 40 +++- Flow.Launcher/Languages/de.xaml | 42 +++- Flow.Launcher/Languages/es-419.xaml | 40 +++- Flow.Launcher/Languages/es.xaml | 38 ++- Flow.Launcher/Languages/fr.xaml | 42 +++- Flow.Launcher/Languages/he.xaml | 42 +++- Flow.Launcher/Languages/it.xaml | 40 +++- Flow.Launcher/Languages/ja.xaml | 40 +++- Flow.Launcher/Languages/ko.xaml | 40 +++- Flow.Launcher/Languages/nb.xaml | 40 +++- Flow.Launcher/Languages/nl.xaml | 40 +++- Flow.Launcher/Languages/pl.xaml | 42 +++- Flow.Launcher/Languages/pt-br.xaml | 40 +++- Flow.Launcher/Languages/pt-pt.xaml | 42 +++- Flow.Launcher/Languages/ru.xaml | 40 +++- Flow.Launcher/Languages/sk.xaml | 36 ++- Flow.Launcher/Languages/sr.xaml | 40 +++- Flow.Launcher/Languages/tr.xaml | 40 +++- Flow.Launcher/Languages/uk-UA.xaml | 222 ++++++++++-------- Flow.Launcher/Languages/vi.xaml | 40 +++- Flow.Launcher/Languages/zh-cn.xaml | 36 ++- Flow.Launcher/Languages/zh-tw.xaml | 40 +++- .../Languages/uk-UA.xaml | 2 +- .../Languages/uk-UA.xaml | 40 ++-- .../Languages/ar.xaml | 9 +- .../Languages/cs.xaml | 9 +- .../Languages/da.xaml | 9 +- .../Languages/de.xaml | 9 +- .../Languages/es-419.xaml | 9 +- .../Languages/es.xaml | 9 +- .../Languages/fr.xaml | 9 +- .../Languages/he.xaml | 9 +- .../Languages/it.xaml | 9 +- .../Languages/ja.xaml | 9 +- .../Languages/ko.xaml | 9 +- .../Languages/nb.xaml | 9 +- .../Languages/nl.xaml | 9 +- .../Languages/pl.xaml | 9 +- .../Languages/pt-br.xaml | 9 +- .../Languages/pt-pt.xaml | 9 +- .../Languages/ru.xaml | 9 +- .../Languages/sk.xaml | 9 +- .../Languages/sr.xaml | 9 +- .../Languages/tr.xaml | 9 +- .../Languages/uk-UA.xaml | 13 +- .../Languages/vi.xaml | 9 +- .../Languages/zh-cn.xaml | 9 +- .../Languages/zh-tw.xaml | 9 +- .../Languages/uk-UA.xaml | 4 +- .../Languages/uk-UA.xaml | 12 +- .../Languages/uk-UA.xaml | 2 +- .../Languages/uk-UA.xaml | 14 +- .../Languages/uk-UA.xaml | 6 +- 55 files changed, 1189 insertions(+), 253 deletions(-) diff --git a/Flow.Launcher/Languages/ar.xaml b/Flow.Launcher/Languages/ar.xaml index 9795d00fd..80fde6441 100644 --- a/Flow.Launcher/Languages/ar.xaml +++ b/Flow.Launcher/Languages/ar.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} تعذر تعيين مسار الملف التنفيذي لـ {0}، يرجى المحاولة من إعدادات Flow (قم بالتمرير إلى الأسفل). فشل في تهيئة الإضافات @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources البحث عن إضافة @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin متجر الإضافات @@ -191,6 +201,28 @@ إصدار جديد تم تحديث هذه الإضافة في آخر 7 أيام يتوفر تحديث جديد + خطأ في تثبيت الإضاف + خطأ في إلغاء تثبيت الإضافة + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + تم تثبيت الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow. + تم إلغاء تثبيت الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow. + تم تحديث الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow. + Plugin install + {0} بواسطة {1} {2}{2}هل ترغب في تثبيت هذه الإضافة؟ + Plugin uninstall + {0} بواسطة {1} {2}{2}هل ترغب في إلغاء تثبيت هذه الإضافة؟ + Plugin update + {0} بواسطة {1} {2}{2}هل ترغب في تحديث هذه الإضافة؟ + تحميل الإضاف + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + التثبيت من مصدر غير معرو + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path السمة @@ -383,7 +415,7 @@ اختر مدير الملفات Learn more يرجى تحديد موقع ملف مدير الملفات الذي تستخدمه وإضافة الحجج حسب الحاجة. يمثل "%d" مسار الدليل المفتوح، ويستخدمه الحقل "الحجة للمجلد" للأوامر التي تفتح أدلة محددة. يمثل "%f" مسار الملف المفتوح، ويستخدمه الحقل "الحجة للملف" للأوامر التي تفتح ملفات محددة. - على سبيل المثال، إذا كان مدير الملفات يستخدم أمرًا مثل "totalcmd.exe /A c:\windows" لفتح دليل c:\windows، فإن مسار مدير الملفات سيكون totalcmd.exe، وحجة المجلد ستكون /A "%d". قد تحتاج بعض مديري الملفات مثل QTTabBar فقط إلى توفير مسار، في هذه الحالة استخدم "%d" كمسار مدير الملفات واترك باقي الحقول فارغة. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. مدير الملفات اسم الملف الشخصي مسار مدير الملفات @@ -434,13 +466,14 @@ اضغط على مفتاح اختصار مخصص لفتح Flow Launcher وإدخال الاستعلام المحدد تلقائيًا. معاينة مفتاح الاختصار غير متاح، يرجى اختيار مفتاح اختصار جديد - مفتاح اختصار غير صالح للإضافة + Hotkey is invalid تحديث ربط مفتاح الاختصار مفتاح الاختصار الحالي غير متاح. تم حجز هذا المفتاح لـ "{0}" ولا يمكن استخدامه. يرجى اختيار مفتاح اختصار آخر. يتم استخدام هذا المفتاح بالفعل من قبل "{0}". إذا ضغطت على "استبدال"، سيتم إزالته من "{0}". اضغط على المفاتيح التي تريد استخدامها لهذه الوظيفة. + Hotkey and action keyword are empty اختصار الاستعلام المخصص @@ -451,6 +484,7 @@ الاختصار موجود بالفعل، يرجى إدخال اختصار جديد أو تعديل الموجود. الاختصار و/أو توسيعه فارغ. + Shortcut is invalid حفظ diff --git a/Flow.Launcher/Languages/cs.xaml b/Flow.Launcher/Languages/cs.xaml index f559c77cd..aa13f2203 100644 --- a/Flow.Launcher/Languages/cs.xaml +++ b/Flow.Launcher/Languages/cs.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Vyhledat plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Obchod s pluginy @@ -191,6 +201,28 @@ Nová verze Tento plugin byl aktualizován během posledních 7 dní Nová aktualizace je k dispozici + Chyba instalace pluginu + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Stahování pluginu + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Instalace z neznámého zdroje + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Motiv @@ -383,7 +415,7 @@ Vybrat správce souborů Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Správce souborů Jméno profilu Cesta k správci souborů @@ -434,13 +466,14 @@ Stisknutím vlastní klávesové zkratky otevřete nástroj Flow Launcher a automaticky zadejte dotaz. Náhled Klávesová zkratka je nedostupná, zadejte prosím novou zkratku - Neplatná klávesová zkratka pluginu + Hotkey is invalid Aktualizovat Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Vlastní klávesová zkratka pro zadávání dotazů @@ -451,6 +484,7 @@ Pokud před zkratku při zadávání přidáte znak "@", bude odpovíd Zkratka již existuje, zadejte novou zkratku nebo upravte stávající. Zkratka a/nebo její plné znění je prázdné. + Shortcut is invalid Uložit diff --git a/Flow.Launcher/Languages/da.xaml b/Flow.Launcher/Languages/da.xaml index d917db21f..d734b4356 100644 --- a/Flow.Launcher/Languages/da.xaml +++ b/Flow.Launcher/Languages/da.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plugin-butik @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Select File Manager Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Filhåndtering Profilnavn Sti til filhåndtering @@ -434,13 +466,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. Vis Genvejstast er utilgængelig, vælg venligst en ny genvejstast - Ugyldig plugin genvejstast + Hotkey is invalid Opdater Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid Gem diff --git a/Flow.Launcher/Languages/de.xaml b/Flow.Launcher/Languages/de.xaml index ceb92b765..ca2a1bd0b 100644 --- a/Flow.Launcher/Languages/de.xaml +++ b/Flow.Launcher/Languages/de.xaml @@ -8,9 +8,9 @@ Bitte wählen Sie die ausführbare Datei {0} aus - Ihre ausgewählte {0} ausführbare Datei ist ungültig. + Your selected {0} executable is invalid. {2}{2} - Klicken Sie auf "Ja", wenn Sie die ausführbare Datei {0} erneut auswählen möchten. Klicken Sie auf "Nein", wenn Sie {1} herunterladen möchten + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Der Pfad zur ausführbaren Datei {0} kann nicht festgelegt werden. Bitte versuchen Sie es in den Einstellungen von Flow (scrollen Sie nach unten). Plug-ins können nicht initialisiert werden @@ -138,6 +138,10 @@ Dies kann nur bearbeitet werden, wenn das Plug-in das Home-Feature unterstützt und die Homepage aktiviert ist. Suchfenster an vorderster zeigen Setzt die Einstellung 'Immer im Vordergrund' anderer Programme außer Kraft und zeigt Flow in der vordersten Position an. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Plug-in suchen @@ -176,6 +180,12 @@ Plug-ins: {0} - Plug-in-Einstellungsdateien können nicht entfernt werden, bitte entfernen Sie diese manuell Plug-in-Cache kann nicht entfernt werden Plug-ins: {0} - Plug-in-Cache-Dateien können nicht entfernt werden, bitte entfernen Sie diese manuell + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plug-in-Store @@ -191,6 +201,28 @@ Neue Version Dieses Plug-in ist innerhalb der letzten 7 Tage aktualisiert worden Neues Update ist verfügbar + Fehler bei Installation des Plug-ins + Fehler bei Deinstallation des Plug-ins + Error updating plugin + Plug-in-Einstellungen beibehalten + Möchten Sie die Einstellungen des Plug-ins für die nächste Nutzung beibehalten? + Plug-in {0} erfolgreich installiert. Bitte starten Sie Flow neu. + Plug-in {0} erfolgreich deinstalliert. Bitte starten Sie Flow neu. + Plug-in {0} erfolgreich aktualisiert. Bitte starten Sie Flow neu. + Plugin install + {0} von {1} {2}{2}Möchten Sie dieses Plug-in installieren? + Plugin uninstall + {0} von {1} {2}{2}Möchten Sie dieses Plug-in deinstallieren? + Plugin update + {0} von {1} {2}{2}Möchten Sie dieses Plugin aktualisieren? + Plug-in wird heruntergeladen + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installation aus unbekannter Quelle + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Theme @@ -383,7 +415,7 @@ Dateimanager auswählen Mehr erfahren Bitte geben Sie den Dateiort des von Ihnen verwendeten Dateimanagers an und fügen Sie bei Bedarf Argumente hinzu. Das „%d“ repräsentiert den dafür zu öffnenden Verzeichnispfad, der vom Feld Arg for Folder und für Befehle zum Öffnen bestimmter Verzeichnisse verwendet wird. Das „%f“ repräsentiert den dafür zu öffnenden Dateipfad, der vom Feld Arg for File und für Befehle zum Öffnen bestimmter Dateien verwendet wird. - Zum Beispiel, wenn der Dateimanager einen Befehl wie „totalcmd.exe /A c:\windows“ verwendet, um das Verzeichnis c:\windows zu öffnen, lautet der Dateimanager-Pfad „totalcmd.exe“ und der Arg for Folder „/A %d“. Bestimmte Dateimanager wie QTTabBar kann nur die Angabe eines Pfades erfordern, in diesem Fall verwenden Sie „%d“ als den Dateimanager-Pfad und lassen den Rest der Felder blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Dateimanager Profilname Dateimanager-Pfad @@ -434,13 +466,14 @@ Drücken Sie einen benutzerdefinierten Hotkey, um Flow Launcher zu öffnen und die spezifizierte Abfrage automatisch einzugeben. Vorschau Hotkey ist nicht verfügbar, bitte wählen Sie einen neuen Hotkey aus - Plug-in-Hotkey ungültig + Hotkey is invalid Aktualisieren Bindung Hotkey Aktueller Hotkey ist nicht verfügbar. Dieser Hotkey ist für "{0}" reserviert und kann nicht verwendet werden. Bitte wählen Sie einen anderen Hotkey. Dieser Hotkey ist bereits in Verwendung von "{0}". Wenn Sie "Überschreiben" drücken, wird dieser aus "{0}" entfernt. Drücken Sie die Tasten, die Sie für diese Funktion verwenden möchten. + Hotkey and action keyword are empty Benutzerdefinierter Abfrage-Shortcut @@ -451,6 +484,7 @@ Wenn Sie bei der Eingabe eines Shortcuts ein '@'-Präfix hinzufügen, stimmt die Shortcut ist bereits vorhanden, bitte geben Sie einen neuen Shortcut ein oder bearbeiten Sie den vorhandenen. Shortcut und/oder dessen Erweiterung ist leer. + Shortcut is invalid Speichern diff --git a/Flow.Launcher/Languages/es-419.xaml b/Flow.Launcher/Languages/es-419.xaml index dd654d090..814cea882 100644 --- a/Flow.Launcher/Languages/es-419.xaml +++ b/Flow.Launcher/Languages/es-419.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Tienda de Plugins @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Seleccionar Gestor de Archivos Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Gestor de Archivos Nombre de Perfil Ruta del Gestor de Archivos @@ -434,13 +466,14 @@ Presione la tecla de acceso personalizada para insertar automáticamente la consulta especificada. Vista previa Tecla no disponible, por favor seleccione una nueva tecla de acceso directo - Tecla de acceso directo al plugin inválida + Hotkey is invalid Actualizar Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid Guardar diff --git a/Flow.Launcher/Languages/es.xaml b/Flow.Launcher/Languages/es.xaml index 0df1e26f9..c65773212 100644 --- a/Flow.Launcher/Languages/es.xaml +++ b/Flow.Launcher/Languages/es.xaml @@ -8,7 +8,7 @@ Por favor, seleccione el ejecutable {0} - El ejecutable {0} seleccionado no es válido. + El ejecutable seleccionado {0} no es válido. {2}{2} Pulsar Sí, si desea seleccionar de nuevo el ejecutable {0}. Pulsar No, si desea descargar {1} @@ -138,6 +138,10 @@ Esto solo se puede editar si el complemento soporta la función de Inicio y la Página de Inicio está activada. Mostrar ventana de búsqueda en primer plano Anula el ajuste «Siempre arriba» de otros programas y muestra Flow en primer plano. + Reiniciar después de modificar el complemento a través de la Tienda de complementos + Reiniciar Flow Launcher automáticamente después de instalar/desinstalar/actualizar el complemento a través de la Tienda de complementos + Mostrar advertencia de fuente desconocida + Mostrar advertencia al instalar complementos desde fuentes desconocidas Buscar complemento @@ -176,6 +180,12 @@ Complementos: {0} - Fallo al eliminar los archivos de configuración del complemento, por favor elimínelos manualmente Fallo al eliminar la caché del complemento Complementos: {0} - Fallo al eliminar los archivos de caché del complemento, por favor elimínelos manualmente + {0} ya está modificado + Reiniciar Flow antes de realizar más cambios + No se pudo instalar {0} + No se pudo desinstalar {0} + No se puede encontrar plugin.json en el archivo zip extraído, o esta ruta {0} no existe + Ya existe un complemento con el mismo ID y versión, o la versión es superior a la de este complemento descargado Tienda complementos @@ -191,6 +201,28 @@ Nueva versión Este complemento ha sido actualizado en los últimos 7 días Nueva actualización disponible + Error al instalar el complemento + Error al desinstalar el complemento + Error al actualizar el complemento + Mantener la configuración del complemento + ¿Desea mantener la configuración del complemento para el próximo uso? + Complemento {0} instalado correctamente. Por favor, reinicie Flow. + Complemento {0} desinstalado correctamente. Por favor, reinicie Flow. + Complemento {0} actualizado correctamente. Por favor, reinicie Flow. + Instalar complemento + {0} por {1} {2}{2}¿Desea instalar este complemento? + Desinstalar complemento + {0} por {1} {2}{2}¿Desea desinstalar este complemento? + Actualizar complemento + {0} por {1} {2}{2}¿Desea actualizar este complemento? + Descargando complemento + Reiniciar automáticamente después de instalar/desinstalar/actualizar complementos en la Tienda de complementos + El archivo Zip no tiene una configuración de plugin.json válida + Instalando desde una fuente desconocida + ¡Este complemento es de una fuente desconocida y puede contener riesgos potenciales!{0}{0}Asegúrese de entender de dónde proviene este complemento y que es seguro.{0}{0}¿Desea continuar aún?{0}{0}(Puede desactivar esta advertencia en la sección general de la ventana de configuración) + Archivos Zip + Por favor, seleccione archivo zip + Instalar complemento desde la ruta local Tema @@ -434,13 +466,14 @@ Pulse el atajo de teclado personalizado para abrir Flow Launcher y realizar automáticamente la consulta especificada. Vista previa El atajo de teclado no está disponible, por favor seleccione uno nuevo - Atajo de teclado de complemento no válido + La tecla de acceso rápido no es válida Actualizar Atajo de teclado vinculado El atajo de teclado actual no está disponible. Este atajo de teclado está reservado para "{0}" y no se puede utilizar. Por favor, elija otro atajo de teclado. Este atajo de teclado ya está siendo utilizado por "{0}". Si pulsa «Sobrescribir», se eliminará de "{0}". Pulsar las teclas que se deseen utilizar para esta función. + La tecla de acceso rápido y la palabra clave de acción están vacías Acceso directo de consulta personalizada @@ -451,6 +484,7 @@ Si añade un prefijo "@" al introducir un acceso directo, éste coinci El acceso directo ya existe, por favor introduzca uno nuevo o edite el existente. El acceso directo y/o su expansión están vacíos. + El acceso directo no es válido Guardar diff --git a/Flow.Launcher/Languages/fr.xaml b/Flow.Launcher/Languages/fr.xaml index f5f624cfd..52013a7db 100644 --- a/Flow.Launcher/Languages/fr.xaml +++ b/Flow.Launcher/Languages/fr.xaml @@ -8,9 +8,9 @@ Veuillez sélectionner l'exécutable {0} - L'exécutable {0} que vous avez sélectionné est invalide. + L'exécutable {0} que vous avez sélectionné n'est pas valide. {2}{2} - Cliquez sur oui si vous souhaitez sélectionner l'exécutable {0} à nouveau. Cliquez sur non si vous souhaitez télécharger {1}. + Cliquez sur oui si vous souhaitez sélectionner à nouveau l'exécutable {0}. Cliquez sur non si vous souhaitez télécharger {1} Impossible de définir {0} comme chemin d'accès vers l'exécutable. Veuillez essayer à partir des paramètres de Flow (défiler vers le bas). Échec de l'initialisation des plugins @@ -138,6 +138,10 @@ Ceci ne peut être édité que si le plugin prend en charge la fonction Accueil et que la page d'accueil est activée. Afficher la fenêtre de recherche en premier plan Outrepasse le paramètre 'toujours en premier plan' des autres programmes et affiche Flow Launcher en première position. + Redémarrer après modification du plugin via le magasin des plugins + Redémarrez automatiquement Flow Launcher après l'installation / désinstallation / mise à jour du plugin via le magasin des plugins + Afficher l'avertissement de source inconnue + Afficher un avertissement lors de l'installation de plugins à partir de sources inconnues Rechercher des plugins @@ -176,6 +180,12 @@ Plugins : {0} - Échec de la suppression des fichiers de configuration des plugins, veuillez les supprimer manuellement Échec de la suppression du cache du plugin Plugins : {0} - Échec de la suppression des fichiers cache des plugins, veuillez les supprimer manuellement + {0} est déjà modifié + Veuillez redémarrer Flow avant d'apporter d'autres modifications + Échec de l'installation de {0} + Échec de la désinstallation de {0} + Impossible de trouver le fichier plugin.json dans le fichier zip extrait, ou ce chemin {0} n'existe pas + Un plugin avec le même ID et la même version existe déjà, ou la version est supérieure à ce plugin téléchargé Magasin des Plugins @@ -191,6 +201,28 @@ Nouvelle version Cette extension a été mis à jour au cours des 7 derniers jours Une nouvelle mise à jour est disponible + Erreur lors de l'installation du plugin + Erreur lors de la désinstallation du plugin + Erreur de mise à jour du plugin + Garder les paramètres du plugin + Souhaitez-vous conserver les paramètres du plugin pour la prochaine utilisation ? + Plugin {0} installé avec succès. Veuillez redémarrer Flow. + Plugin {0} désinstallé avec succès. Veuillez redémarrer Flow. + Plugin {0} mis à jour avec succès. Veuillez redémarrer Flow. + Installation du plugin + {0} par {1} {2}{2}Voulez-vous installer ce plugin ? + Désinstallation du plugin + {0} par {1} {2}{2}Voulez-vous désinstaller ce plugin ? + Mise à jour du plugin + {0} par {1} {2}{2}Voulez-vous mettre à jour ce plugin ? + Téléchargement du plugin + Redémarrer automatiquement après l'installation / désinstallation / mise à jour des plugins dans le magasin des plugins + Le fichier zip n'a pas de configuration plugin.json valide + Installation depuis une source inconnue + Ce plugin provient d'une source inconnue et il peut contenir des risques !{0}{0}Veuillez vous assurer de comprendre d'où vient ce plugin et qu'il est sûr. {0} {0} Souhaitez-vous continuer ? {0} {0} (vous pouvez désactiver cet avertissement dans la section général des paramètres) + Fichiers zip + Veuillez sélectionner un fichier zip + Installer le plugin depuis le chemin local Thèmes @@ -382,7 +414,7 @@ Sélectionner le gestionnaire de fichiers En savoir plus Veuillez spécifier l'emplacement du fichier de l'explorateur de fichiers que vous utilisez et ajouter des arguments si nécessaire. Le "%d" représente le chemin du répertoire à ouvrir, utilisé par le champ Arg for Folder et pour les commandes ouvrant des répertoires spécifiques. Le "%f" représente le chemin du fichier à ouvrir, utilisé par le champ Arg for File et pour les commandes ouvrant des fichiers spécifiques. - Par exemple, si l'explorateur de fichiers utilise une commande telle que "totalcmd.exe /A c:\windows" pour ouvrir le répertoire c:\windows, le chemin de l'explorateur de fichiers sera totalcmd.exe et l'argument Arg For Folder sera /A "%d"". Certains explorateurs de fichiers comme QTTabBar peuvent simplement nécessiter qu'un chemin soit fourni, dans ce cas, utilisez "%d" comme chemin de l'explorateur de fichiers et laissez le reste des fichiers vides. + Par exemple, si le gestionnaire de fichiers utilise une commande telle que "totalcmd.exe /A c:\windows" pour ouvrir le répertoire c:\windows, le chemin du gestionnaire de fichiers sera totalcmd.exe, et le chemin du dossier sera /A "%d". Certains gestionnaires de fichiers, comme QTTabBar, peuvent se contenter d'un simple chemin d'accès. Dans ce cas, utilisez "%d" comme chemin d'accès au gestionnaire de fichiers et laissez le reste des champs vides. Gestionnaire de fichiers Nom du profil Chemin du gestionnaire de fichiers @@ -433,13 +465,14 @@ Appuyez sur le raccourci personnalisé pour insérer automatiquement la requête spécifiée. Prévisualiser Raccourci indisponible. Veuillez en choisir un autre. - Raccourci invalide + La touche de raccourci n'est pas valide Actualiser Raccourci de liaison Le raccourci clavier actuel n'est pas disponible. Ce raccourci est réservé à "{0}" et ne peut pas être utilisé. Veuillez choisir un autre raccourci clavier. Ce raccourci est déjà utilisé par "{0}". Si vous appuyez sur "Écraser", il sera supprimé de "{0}". Appuyez sur les touches que vous voulez utiliser pour cette fonction. + Les touches de raccourci et les mots-clés d'action sont vides Raccourci de requête personnalisée @@ -450,6 +483,7 @@ Si vous ajoutez un préfixe "@" lors de la saisie d'un raccourci, celu Le raccourci existe déjà, veuillez entrer un nouveau raccourci ou modifier le raccourci existant. Raccourci et/ou son expansion est vide. + Le raccourci n'est pas valide Sauvegarder diff --git a/Flow.Launcher/Languages/he.xaml b/Flow.Launcher/Languages/he.xaml index 17c8152a0..b72125214 100644 --- a/Flow.Launcher/Languages/he.xaml +++ b/Flow.Launcher/Languages/he.xaml @@ -8,9 +8,9 @@ אנא בחר את קובץ ההפעלה {0} - קובץ ההפעלה {0} שבחרת אינו חוקי. + Your selected {0} executable is invalid. {2}{2} - לחץ על כן אם ברצונך, בחר את {0} ההפעלה הקודמת. לחץ על לא אם ברצונך להוריד את {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} לא ניתן להגדיר נתיב הפעלה {0}, אנא נסה שוב בהגדרות Flow (גלול עד למטה). נכשל בהפעלת תוספים @@ -137,6 +137,10 @@ ניתן לערוך זאת רק אם התוסף תומך בתכונת הבית ודף הבית מופעל. Show Search Window at Foremost עוקף את הגדרת תמיד עליון של תוכנות אחרות, ומציג את Flow במיקום הגבוה ביותר. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources חפש תוסף @@ -175,6 +179,12 @@ תוספים: {0} - נכשל בהסרת קבצי הגדרות התוסף, יש להסירם ידנית נכשל בהסרת מטמון התוסף תוספים: {0} - נכשל בהסרת קובצי מטמון התוסף, אנא הסר אותם ידנית + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin חנות תוספים @@ -190,6 +200,28 @@ גרסה חדשה תוסף זה עודכן במהלך 7 הימים האחרונים עדכון חדש זמין + שגיאה בהתקנת תוסף + שגיאה בהסרת תוסף + Error updating plugin + שמור הגדרות תוסף + האם ברצונך לשמור את הגדרות התוסף לשימוש הבא? + התוסף {0} הותקן בהצלחה. נא הפעל מחדש את Flow. + התוסף {0} הוסר בהצלחה. נא הפעל מחדש את Flow. + התוסף {0} עודכן בהצלחה. נא הפעל מחדש את Flow. + Plugin install + {0} מאת {1} {2}{2}האם ברצונך להתקין תוסף זה? + Plugin uninstall + {0} מאת {1} {2}{2}האם ברצונך להסיר תוסף זה? + Plugin update + {0} מאת {1} {2}{2}האם ברצונך לעדכן תוסף זה? + מוריד תוסף + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + מתקין ממקור לא מוכ + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path ערכת נושא @@ -382,7 +414,7 @@ בחר מנהל קבצים למד עוד אנא ציין את מיקום הקובץ של מנהל הקבצים שבו אתה משתמש והוסף ארגומנטים כנדרש. "%d" מייצג את נתיב התיקייה שיש לפתוח, ומשמש בשדה ארגומנט לתיקייה ובפקודות לפתיחת תיקיות מסוימות. "%f" מייצג את נתיב הקובץ שיש לפתוח, ומשמש בשדה ארגומנט לקובץ ובפקודות לפתיחת קבצים מסוימים. - לדוגמה, אם מנהל הקבצים משתמש בפקודה כגון "totalcmd.exe /A c:\windows" כדי לפתוח את התיקייה c:\windows, נתיב מנהל הקבצים יהיה totalcmd.exe, והארגומנט לתיקייה יהיה /A "%d". מנהלי קבצים מסוימים, כגון QTTabBar, עשויים לדרוש רק ציון נתיב, במקרה כזה השתמש ב-"%d" כנתיב מנהל הקבצים והשאר את שאר השדות ריקים. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. מנהל קבצים שם פרופיל נתיב מנהל קבצים @@ -433,13 +465,14 @@ הקש על מקש קיצור מותאם אישית כדי לפתוח את Flow Launcher ולהזין את השאילתה שצוינה באופן אוטומטי. תצוגה מקדימה מקש הקיצור אינו זמין, אנא בחר מקש קיצור חדש - מקש קיצור לא חוקי לתוסף + Hotkey is invalid עדכון שיוך מקש קיצור מקש הקיצור הנוכחי אינו זמין. מקש קיצור זה שמור עבור "{0}" ואינו ניתן לשימוש. אנא בחר מקש קיצור אחר. מקש קיצור זה כבר נמצא בשימוש על ידי "{0}". אם תלחץ על "החלף", הוא יוסר מ-"{0}". הקש על המקשים שברצונך להשתמש בהם עבור פעולה זו. + Hotkey and action keyword are empty קיצור דרך לשאילתה מותאמת אישית @@ -450,6 +483,7 @@ קיצור דרך כבר קיים, אנא הזן קיצור דרך חדש או ערוך את הקיים. קיצור הדרך ו/או ההרחבה שלו ריקים. + Shortcut is invalid שמור diff --git a/Flow.Launcher/Languages/it.xaml b/Flow.Launcher/Languages/it.xaml index ef6b50e7d..83867d00e 100644 --- a/Flow.Launcher/Languages/it.xaml +++ b/Flow.Launcher/Languages/it.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Plugin di ricerca @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Negozio dei Plugin @@ -191,6 +201,28 @@ Nuova versione Questo plugin è stato aggiornato negli ultimi 7 giorni Nuovo aggiornamento disponibile + Errore durante l'installazione del plugin + Errore durante la disinstallazione del plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Il plugin {0} installato con successo. Riavviare Flow. + Il plugin {0} disinstallato con successo. Riavviare Flow. + Il plugin {0} aggiornato con successo. Riavviare Flow. + Plugin install + {0} di {1} {2}{2}Vuoi installare questo plugin? + Plugin uninstall + {0} di {1} {2}{2}Vuoi disinstallare questo plugin? + Plugin update + {0} di {1} {2}{2}Vuoi aggiornare questo plugin? + Download del plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installazione da una fonte sconosciuta + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Seleziona Gestore File Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Gestore File Nome Profilo Percorso Gestore File @@ -434,13 +466,14 @@ Premere un tasto di scelta rapida personalizzato per aprire Flow Launcher e inserire automaticamente la query specificata. Anteprima Tasto di scelta rapida non disponibile, per favore scegli un nuovo tasto di scelta rapida - Tasto di scelta rapida plugin non valido + Hotkey is invalid Aggiorna Registrare Scorciatoie Scorciatoia corrente non disponibile. Questa scorciatoia è riservata per "{0}" e non può essere utilizzata. Si prega di scegliere un'altra scorciatoia. Questa scorciatoia è già in uso da "{0}". Premendo "Sovrascrivi", verrà rimossa da "{0}". Premi i tasti che vuoi usare per questa funzione. + Hotkey and action keyword are empty Scorciatoia per ricerca personalizzata @@ -451,6 +484,7 @@ Se si aggiunge un prefisso '@' mentre si inserisce una scorciatoia, corrisponde La scorciatoia esiste già, inserisci una nuova scorciatoia o modifica quella esistente. La scorciatoia e/o la sua espansione sono vuote. + Shortcut is invalid Salva diff --git a/Flow.Launcher/Languages/ja.xaml b/Flow.Launcher/Languages/ja.xaml index c1ce0ce96..22451ed27 100644 --- a/Flow.Launcher/Languages/ja.xaml +++ b/Flow.Launcher/Languages/ja.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin プラグインストア @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days 新しいアップデートが利用可能です + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path テーマ @@ -383,7 +415,7 @@ デフォルトのファイルマネージャー Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. File Manager Profile Name File Manager Path @@ -434,13 +466,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. プレビュー ホットキーは使用できません。新しいホットキーを選択してください - プラグインホットキーは無効です + Hotkey is invalid 更新 Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty カスタムクエリショートカット @@ -451,6 +484,7 @@ ショートカットが既に存在します。新しいショートカットを入力するか、既存のショートカットを編集してください。 ショートカット、展開の少なくとも一方が空です。 + Shortcut is invalid 保存 diff --git a/Flow.Launcher/Languages/ko.xaml b/Flow.Launcher/Languages/ko.xaml index 942b48966..b0c13d2e6 100644 --- a/Flow.Launcher/Languages/ko.xaml +++ b/Flow.Launcher/Languages/ko.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -129,6 +129,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources 플러그인 검색 @@ -167,6 +171,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin 플러그인 스토어 @@ -182,6 +192,28 @@ 새 버전 이 플러그인은 최근 7일 사이 업데이트 되었습니다 새 업데이트 설치 가능 + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + 플러그인 다운로드 중 + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path 테마 @@ -374,7 +406,7 @@ 파일관리자 선택 더 알아보기 사용 중인 파일 관리자의 파일 위치를 지정하고, 필요한 경우 인수를 추가하세요. "%d"는 열고자 하는 디렉터리 경로를 나타내며, 폴더용 인수 필드 및 특정 디렉터리를 여는 명령어에서 사용됩니다. "%f"는 열고자 하는 파일 경로를 나타내며, 파일용 인수 필드 및 특정 파일을 여는 명령어에서 사용됩니다. - 예를 들어, 파일 관리자가 totalcmd.exe /A c:\windows와 같은 명령어로 c:\windows 디렉터리를 연다면, 파일 관리자 경로는 totalcmd.exe가 되고, 폴더용 인수는 /A "%d"가 됩니다. QTTabBar와 같은 일부 파일 관리자는 경로만 전달하면 되는 경우가 있으므로, 이 경우에는 파일 관리자 경로에 "%d"를 입력하고 나머지 필드는 비워두세요. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. 파일관리자 프로필 이름 파일관리자 경로 @@ -425,13 +457,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. 미리보기 단축키를 사용할 수 없습니다. 다른 단축키를 입력하세요. - 플러그인 단축키가 유효하지 않습니다. + Hotkey is invalid 업데이트 Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". 이 기능에 사용할 키를 눌러주세요. + Hotkey and action keyword are empty 사용자 지정 쿼리 단축어 @@ -442,6 +475,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid 저장 diff --git a/Flow.Launcher/Languages/nb.xaml b/Flow.Launcher/Languages/nb.xaml index ab4af3bcb..c3879e203 100644 --- a/Flow.Launcher/Languages/nb.xaml +++ b/Flow.Launcher/Languages/nb.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Kan ikke angi {0} kjørbar bane, prøv fra Flows innstillinger (bla ned til bunnen). Mislykkes i å initialisere programtillegg @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Søk etter programtillegg @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Programtillegg butikk @@ -191,6 +201,28 @@ Ny versjon Dette programtillegget er oppdatert i løpet av de siste 7 dagene Ny oppdatering er tilgjengelig + Feil ved installering av programtillegg + Feil ved avinstallering av programtillegg + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Programtillegg {0} installert. Vennligst start Flow på nytt. + Programtillegg {0} avinstallert. Vennligst start Flow på nytt. + Programtillegg {0} oppdatert. Vennligst restart Flow. + Plugin install + {0} av {1} {2}{2}Vil du installere dette programtillegget? + Plugin uninstall + {0} av {1} {2}{2}Vil du avinstallere dette programtillegget? + Plugin update + {0} av {1} {2}{2}Vil du oppdatere dette programtillegget? + Laster ned programtillegg + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installerer fra en ukjent kilde + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Drakt @@ -383,7 +415,7 @@ Velg filbehandler Learn more Vennligst spesifiser filplasseringen til filbehandleren du bruker, og legg til argumenter etter behov. "%d" representerer katalogbanen som skal åpnes for, brukt av Arg for mappe-feltet og for kommandoer som åpner spesifikke kataloger. "%f" representerer filbanen som skal åpnes for, brukt av Arg for fil-feltet og for kommandoer som åpner spesifikke filer. - For eksempel, hvis filbehandleren bruker en kommando som "totalcmd.exe /A c:windows" for å åpne c:windows-katalogen, vil filbehandlingsbanen bli totalcmd.exe, og Arg For Folder vil være /A "%d". Enkelte filbehandlere som QTTabBar kan bare kreve at en bane oppgis, i dette tilfellet bruker du "%d" som filbehandlingsbane og lar resten av feltene stå tomme. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Filbehandler Profilnavn Filbehandler sti @@ -434,13 +466,14 @@ Trykk på en egendefinert hurtigtast for å åpne Flow Launcher og skrive inn den angitte spørringen automatisk. Forhåndsvis Hurtigtast er utilgjengelig, vennligst velg en ny hurtigtast - Ugyldig hurtigtast for programtillegg + Hotkey is invalid Oppdater Binding av hurtigtast Nåværende hurtigtast er utilgjengelig. Denne hurtigtasten er reservert for "{0}" og kan ikke brukes. Velg en annen hurtigtast. Denne hurtigtasten er allerede i bruk av "{0}". Hvis du trykker "Overskriv" vil den bli fjernet fra "{0}". Trykk på tastene du vil bruke for denne funksjonen. + Hotkey and action keyword are empty Snarvei for egendefinert spørring @@ -451,6 +484,7 @@ Hvis du legger til et @-prefiks mens du legger inn en snarvei, samsvarer det med Snarveien eksisterer allerede, skriv inn en ny snarvei eller rediger den eksisterende. Snarvei og/eller utvidelsen er tom. + Shortcut is invalid Lagre diff --git a/Flow.Launcher/Languages/nl.xaml b/Flow.Launcher/Languages/nl.xaml index 878851d15..96a7e43dd 100644 --- a/Flow.Launcher/Languages/nl.xaml +++ b/Flow.Launcher/Languages/nl.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Plug-ins zoeken @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plugin Winkel @@ -191,6 +201,28 @@ Nieuwe Versie Deze plug-in is in de laatste 7 dagen bijgewerkt Nieuwe update beschikbaar + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Thema @@ -383,7 +415,7 @@ Bestandsbeheerder selecteren Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Bestandsbeheerder Profielnaam Bestandsbeheerder pad @@ -434,13 +466,14 @@ Druk op een aangepaste sneltoets om Flow Launcher te openen en de opgegeven query automatisch in te voeren. Voorbeeld Sneltoets is niet beschikbaar, selecteer een nieuwe sneltoets - Ongeldige plugin sneltoets + Hotkey is invalid Bijwerken Sneltoets koppelen Huidige sneltoets is niet beschikbaar. Deze sneltoets is gereserveerd voor "{0}" en kan niet worden gebruikt. Kies een andere sneltoets. Deze sneltoets is al in gebruik door "{0}". Als u op "Overschrijven" klikt, zal deze verwijderd worden uit "{0}". Druk op de toetsen die u wilt gebruiken voor deze functie. + Hotkey and action keyword are empty Aangepaste Query Snelkoppeling @@ -451,6 +484,7 @@ Als u een '@' voorvoegsel toevoegt tijdens het invoeren van een snelkoppeling, m Snelkoppeling bestaat al, vul een nieuwe snelkoppeling in of pas de bestaande aan. Snelkoppeling en/of uitbreiding is leeg. + Shortcut is invalid Opslaan diff --git a/Flow.Launcher/Languages/pl.xaml b/Flow.Launcher/Languages/pl.xaml index c14148ddd..ff3c548ad 100644 --- a/Flow.Launcher/Languages/pl.xaml +++ b/Flow.Launcher/Languages/pl.xaml @@ -8,9 +8,9 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wybierz plik wykonywalny {0} - Wybrany plik wykonywalny {0} jest nieprawidłowy. + Your selected {0} executable is invalid. {2}{2} - Kliknij Tak, jeśli chcesz ponownie wybrać plik wykonywalny {0}. Kliknij Nie, jeśli chcesz pobrać {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Nie można ustawić ścieżki do pliku wykonywalnego {0}. Spróbuj ponownie w ustawieniach Flow (przewiń na sam dół). Nie udało się zainicjować wtyczek @@ -137,6 +137,10 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Można edytować tylko wtedy, gdy wtyczka obsługuje funkcję Strona główna i jest ona włączona. Wyświetl okno wyszukiwania na wierzchu Wyświetl okno wyszukiwania ponad innymi oknami + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Szukaj wtyczek @@ -175,6 +179,12 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wtyczki: {0} – nie udało się usunąć plików ustawień wtyczek, usuń je ręcznie Nie udało się usunąć cache wtyczki Wtyczki: {0} - Nie udało się usunąć plików cache wtyczki, usuń je ręcznie + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Sklep z wtyczkami @@ -190,6 +200,28 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Nowa wersja Ta wtyczka została zaktualizowana w ciągu ostatnich 7 dni Aktualizacja jest dostępna + Błąd podczas instalacji wtyczki + Błąd podczas odinstalowywania wtyczki + Error updating plugin + Zachowaj ustawienia wtyczki + Czy chcesz zachować ustawienia wtyczki do następnego użycia? + Wtyczka {0} została pomyślnie zainstalowana. Proszę ponownie uruchomić Flow. + Wtyczka {0} została pomyślnie odinstalowana. Proszę ponownie uruchomić Flow. + Wtyczka {0} została pomyślnie zaktualizowana. Proszę ponownie uruchomić Flow. + Plugin install + {0} autorstwa {1} {2}{2}Czy chcesz zainstalować tę wtyczkę? + Plugin uninstall + {0} autorstwa {1} {2}{2}Czy chcesz odinstalować tę wtyczkę? + Plugin update + {0} autorstwa {1} {2}{2}Czy chcesz zaktualizować tę wtyczkę? + Pobieranie wtyczki + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Instalowanie z nieznanego źródła + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Motyw @@ -382,7 +414,7 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Wybierz menedżer plików Więcej informacji Proszę określić lokalizację pliku menedżera plików, którego używasz i dodać argumenty według potrzeb. Symbol "%d" reprezentuje ścieżkę katalogu do otwarcia, używaną w polu Arg dla Folderu oraz dla poleceń otwierających konkretne katalogi. Symbol "%f" reprezentuje ścieżkę pliku do otwarcia, używaną w polu Arg dla Pliku oraz dla poleceń otwierających konkretne pliki. - Na przykład, jeśli menedżer plików używa polecenia takiego jak „totalcmd.exe /A c:\windows" do otwarcia katalogu c:\windows, Ścieżka Menedżera Plików będzie totalcmd.exe, a Argument dla Folderu będzie /A "%d". Niektóre menedżery plików, takie jak QTTabBar, mogą wymagać jedynie podania ścieżki; w takim przypadku użyj "%d" jako Ścieżki Menedżera Plików, a pozostałe pola pozostaw puste. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Menedżer plików Nazwa profilu Ścieżka menedżera plików @@ -433,13 +465,14 @@ Kliknij "nie", jeśli jest już zainstalowany. Zostaniesz wtedy popros Naciśnij niestandardowy klawisz skrótu, aby otworzyć Flow Launcher i automatycznie wprowadzić określone zapytanie. Podgląd Skrót klawiszowy jest niedostępny, musisz podać inny skrót klawiszowy - Niepoprawny skrót klawiszowy + Hotkey is invalid Aktualizuj Przypisywanie skrótów Bieżący skrót klawiszowy jest niedostępny. Ten skrót klawiszowy jest zarezerwowany dla "{0}" i nie może być użyty. Proszę wybrać inny skrót. Ten skrót klawiszowy jest już używany przez "{0}". Jeśli naciśniesz "Nadpisz", zostanie on usunięty z "{0}". Naciśnij klawisze, których chcesz użyć dla tej funkcji. + Hotkey and action keyword are empty Niestandardowy skrót zapytania @@ -450,6 +483,7 @@ Jeśli dodasz prefiks '@' podczas wprowadzania skrótu, będzie on pasował do d Skrót już istnieje, wprowadź nowy skrót lub edytuj istniejący. Skrót i/lub jego rozwinięcie jest puste. + Shortcut is invalid Zapisz diff --git a/Flow.Launcher/Languages/pt-br.xaml b/Flow.Launcher/Languages/pt-br.xaml index f1cda48f0..fcdb14590 100644 --- a/Flow.Launcher/Languages/pt-br.xaml +++ b/Flow.Launcher/Languages/pt-br.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Buscar Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Loja de Plugins @@ -191,6 +201,28 @@ Nova Versão Este plugin foi atualizado nos últimos 7 dias Nova Atualização Disponível + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Selecione o Gerenciador de Arquivos Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Gerenciador de Arquivos Nome do Perfil Caminho do Gerenciador de Arquivos @@ -434,13 +466,14 @@ Aperte uma tecla de atalho personalizada para abrir o Flow Launcher e insira a pesquisa especificada automaticamente. Prévia Atalho indisponível, escolha outro - Atalho de plugin inválido + Hotkey is invalid Atualizar Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Atalho Personalidado de Pesquisa @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in O atalho já existe, por favor, digite um novo atalho ou edite o existente. Atalho e/ou sua expansão está vazia. + Shortcut is invalid Salvar diff --git a/Flow.Launcher/Languages/pt-pt.xaml b/Flow.Launcher/Languages/pt-pt.xaml index c37bf2eb8..5d64d429f 100644 --- a/Flow.Launcher/Languages/pt-pt.xaml +++ b/Flow.Launcher/Languages/pt-pt.xaml @@ -8,9 +8,9 @@ Por favor, selecione o executável {0} - O executável {0} é inválido. + Your selected {0} executable is invalid. {2}{2} - Clique Sim se quiser escolher o novo executável {0}. Clique Não se quiser descarregar {1}. + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Não foi possível definir o caminho do executável {0}. Experimente definir o caminho nas definições (desloque até ao fundo). Falha ao iniciar os plugins @@ -137,6 +137,10 @@ Esta opção apenas pode ser editada se o plugin tiver suporte a Página inicial e se estiver ativo. Janela de pesquisa à frente Sobrepõe a definição 'Sempre na frente' das outras aplicações e mostra Flow Launcher à frente de qualquer janela. + Reiniciar após modificar o plugin via Loja de plugins + Reiniciar Flow Launcher após instalar/desinstalar/atualizar um plugin via Loja de plugins + Mostrar aviso de origem desconhecida + Mostrar aviso ao instalar plugins de origens desconhecidas Pesquisar plugins @@ -175,6 +179,12 @@ Plugin: {0} - Falha ao remover o ficheiro de definições do plugin. Experimente remover manualmente. Falha ao limpar a cache do plugin Plugin: {0} - Falha ao remover os ficheiros em cache do plugin. Experimente remover manualmente. + {0} já modificado + Reinicie Flow Launcher antes de fazer mais alterações + Falha ao instalar {0} + Falha ao desinstalar {0} + Não foi possível encontrar plugin.json no ficheiro zip ou, então, o caminho {0} não existe. + Já existe um plugin com a mesma ID e versão ou, então, a versão instalada é superior à do plugin descarregado. Loja de plugins @@ -190,6 +200,28 @@ Nova versão Este plugin foi atualizado nos últimos 7 dias Atualização disponível + Erro ao instalar o plugin + Erro ao desinstalar o plugin + Erro ao atualizar o plugin + Manter definições + Deseja manter as definições do plugin para o caso de o voltar a instalar? + Plugin {0} instalado com sucesso. Por favor, reinicie o Flow Launcher. + Plugin {0} desinstalado com sucesso. Por favor, reinicie o Flow Launcher. + Plugin {0} atualizado com sucesso. Por favor, reinicie o Flow Launcher. + Instalador de plugins + {0} de {1} {2}{2}Gostaria de instalar este plugin? + Desinstalador de plugins + {0} de {1} {2}{2}Gostaria de desinstalar este plugin? + Atualização de plugins + {0} de {1} {2}{2}Gostaria de atualizar este plugin? + Descarregar plugin + Reiniciar automaticamente após instalar/desinstalar/atualizar plugins via Loja de plugins + O ficheiro zip não possui uma configuração "plugin.json" válida + Instalar a partir de fontes desconhecidas + Este plugin provém de uma origem desconhecida e pode apresentar riscos!{0}{0}Certifique-se de que a origem é fiável e que o plugin é seguro.{0}{0}Deseja, ainda assim, continuar?{0}{0}Pode desativar este aviso na secção Geral das definições. + Ficheiros Zip + Selecione o ficheiro Zip + Instalar plugin de um caminho local Tema @@ -381,7 +413,7 @@ Selecione o gestor de ficheiros Saber mais Por favor, especifique a localização do executável do seu gestor de ficheiros e adicione os argumentos necessários. "%d" representa o caminho do diretório a abrir, usado pelo argumento do campo Pasta e para comandos que abrem diretórios específicos. "%f" representa o caminho do ficheiro a abrir, usado pelo argumento do campo Ficheiro e para comandos que abrem ficheiros específicos. - Por exemplo, se o gestor de ficheiros utilizar o comando "totalcmd.exe /A c:\windows" para abrir o diretório c:\windows , o caminho para o gestor de ficheiros será totalcmd. exe e os argumentos para a Pasta serão /A "%d". Alguns gestores de ficheiros, como QTTabBar podem apenas exigir que especifique o caminho. Para estes, deve utilizar "%d" como caminho para o gestor de ficheiros e deixar o resto dos campos em branco. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Gestor de ficheiros Nome do perfil Caminho do gestor de ficheiros @@ -432,13 +464,14 @@ Prima uma tecla de atalho personalizada para abrir Flow Launcher e escrever automaticamente a pesquisa. Antevisão Tecla de atalho indisponível, por favor escolha outra - Tecla de atalho inválida + Hotkey is invalid Atualizar Associar tecla de atalho A tecla de atalho atual não está disponível. Esta tecla de atalho está reservada para "{0}" e não pode ser usada. Por favor, escolha outra. Esta tecla de atalho está a ser utilizada por "{0}". Se escolher "Substituir", será removida de "{0}". Prima as teclas que pretende utilizar para esta função. + Hotkey and action keyword are empty Atalho de consulta personalizada @@ -449,6 +482,7 @@ Se adicionar o prefixo '@' durante a introdução do atalho, será utilizada qua Este atallho já existe. Por favor escolha outro ou edite o existente. O atalho e/ou a expansão não estão preenchidos. + Shortcut is invalid Guardar diff --git a/Flow.Launcher/Languages/ru.xaml b/Flow.Launcher/Languages/ru.xaml index 81493ba08..aa4505580 100644 --- a/Flow.Launcher/Languages/ru.xaml +++ b/Flow.Launcher/Languages/ru.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Поиск плагина @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Магазин плагинов @@ -191,6 +201,28 @@ Новая версия Этот плагин был обновлён за последние 7 дней Доступно новое обновление + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Тема @@ -383,7 +415,7 @@ Выбор менеджера файлов Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Файловый менеджер Имя профиля Путь к файловому менеджеру @@ -434,13 +466,14 @@ Нажмите свою горячую клавишу, чтобы открыть Flow Launcher и автоматически ввести заданный запрос. Предпросмотр Горячая клавиша недоступна. Пожалуйста, задайте новую - Недействительная горячая клавиша плагина + Hotkey is invalid Обновить Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Ярлык пользовательского запроса @@ -451,6 +484,7 @@ Ярлык уже существует, пожалуйста, введите новый ярлык или измените существующий. Ярлык и/или его расширение пусты. + Shortcut is invalid Сохранить diff --git a/Flow.Launcher/Languages/sk.xaml b/Flow.Launcher/Languages/sk.xaml index 734dbe743..f7a2ce05a 100644 --- a/Flow.Launcher/Languages/sk.xaml +++ b/Flow.Launcher/Languages/sk.xaml @@ -138,6 +138,10 @@ Úprava je možná len vtedy, ak plugin podporuje funkciu Domovská stránka a Domovská stránka je povolená. Zobraziť vyhľadávacie okno v popredí Prepíše nastavenie "Vždy na vrchu" ostatných programov a zobrazí navrchu Flow. + Reštartovať po úprave pluginu cez Repozitár pluginov + Automaticky reštartovať Flow Launcher po inštalácii/odinštalácii/aktualizáciu pluginu cez Repozitár pluginov + Zobraziť upozornenie na neznámy zdroj + Zobraziť upozornenie pri inštalácii z neznámych zdrojov Vyhľadať plugin @@ -176,6 +180,12 @@ Pluginy: {0} – Nepodarilo sa odstrániť súbory s nastaveniami pluginu, odstráňte ich manuálne Nepodarilo sa odstrániť vyrovnávaciu pamäť pluginu Pluginy: {0} – Nepodarilo sa odstrániť vyrovnávaciu pamäť pluginu, odstráňte ju manuálne + Plugin {0} už bol upravený + Pred vykonaním ďalších zmien reštartujte Flow Launcher + Nepodarilo sa nainštalovať {0} + Nepodarilo sa odinštalovať {0} + Súbor plugin.json sa nenašiel v rozbalenom zip súbore, alebo táto cesta {0} neexistuje + Plugin s rovnakým ID už existuje, alebo ide o vyššiu verziu ako stiahnutý plugin Repozitár pluginov @@ -191,6 +201,28 @@ Nová verzia Tento plugin bol aktualizovaný za posledných 7 dní K dispozícii je nová aktualizácia + Chyba inštalácie pluginu + Chyba odinštalácie pluginu + Chyba aktualizácie pluginu + Ponechať nastavenia pluginu + Chcete zachovať nastavenia pluginu na ďalšie použitie? + Plugin {0} bol úspešne nainštalovaný. Prosím, reštartuje Flow. + Plugin {0} bol úspešne odinštalovaný. Prosím, reštartuje Flow. + Plugin {0} bol úspešne aktualizovaný. Prosím, reštartuje Flow. + Inštalácia pluginu + {0} od {1} {2}{2}Chcete nainštalovať tento plugin? + Odinštalácia pluginu + {0} od {1} {2}{2}Chcete odinštalovať tento plugin? + Aktualizácia pluginu + {0} od {1} {2}{2}Chcete aktualizovať tento plugin? + Sťahovanie pluginu + Automaticky reštartovať po inštalácii/odinštalácii/aktualizáciu pluginov cez Repozitár pluginov + V zipe sa nenachádza platná konfigurácia plugin.json + Inštalácia z neznámeho zdroja + Tento plugin pochádza z neznámeho zdroja a môže predstavovať potenciálne riziká!{0}{0}Uistite sa, že viete, odkiaľ tento plugin pochádza, a že je bezpečný.{0}{0}Stále chcete pokračovať?{0}{0}(Toto upozornenie môžete vypnúť sekcii Všeobecné v nastaveniach) + Zip súbory + Vyberte zip súbor + Inštalovať plugin z miestneho úložiska Motív @@ -434,13 +466,14 @@ Stlačením vlastnej klávesovej skratky otvoríte Flow Launcher a automaticky vložíte zadaný dotaz. Náhľad Klávesová skratka je nedostupná, prosím, zadajte novú skratku - Neplatná klávesová skratka pluginu + Klávesová skratka je neplatná Aktualizovať Priradenie klávesovej skratky Aktuálna klávesová skratka nie je k dispozícii. Táto skratka je rezervovaná pre "{0}" a nemôže byť použitá. Prosím, vyberte inú skratku. Táto skratka sa používa pre "{0}". Ak stlačíte "Prepísať", odstráni sa pre "{0}". Stlačte kláves, ktorý chcete nastaviť pre túto funkciu. + Klávesová skratka a aktivačný príkaz sú prázdne Klávesová skratka vlastného dopytu @@ -451,6 +484,7 @@ Ak pri zadávaní skratky pred ňu pridáte "@", bude sa zhodovať s Skratka už existuje, zadajte novú skratku alebo upravte existujúcu. Skratka a/alebo jej celé znenie je prázdne. + Skratka je neplatná Uložiť diff --git a/Flow.Launcher/Languages/sr.xaml b/Flow.Launcher/Languages/sr.xaml index 859fc27b8..16bd5aeb8 100644 --- a/Flow.Launcher/Languages/sr.xaml +++ b/Flow.Launcher/Languages/sr.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Plugin Store @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Tema @@ -383,7 +415,7 @@ Select File Manager Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. File Manager Profile Name File Manager Path @@ -434,13 +466,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. Pregled Prečica je nedustupna, molim Vas izaberite drugu prečicu - Nepravlna prečica za plugin + Hotkey is invalid Ažuriraj Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid Sačuvaj diff --git a/Flow.Launcher/Languages/tr.xaml b/Flow.Launcher/Languages/tr.xaml index 6f3ded9e3..032891900 100644 --- a/Flow.Launcher/Languages/tr.xaml +++ b/Flow.Launcher/Languages/tr.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Eklenti Ara @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Eklenti Mağazası @@ -191,6 +201,28 @@ Yeni Sürüm Bu eklenti son 7 gün içerisinde güncellenmiş. Yeni Bir Güncelleme Mevcut + Error installing plugin + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Downloading plugin + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Temalar @@ -383,7 +415,7 @@ Dosya Yöneticisi Seçenekleri Daha fazla bilgi Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Dosya Yöneticisi Profil Adı Dosya Yöneticisi Yolu @@ -434,13 +466,14 @@ Flow Launcher'ı açıp otomatik olarak girdiğiniz sorguyu aratması için bir kısayol atayın. Önizleme Kısayol tuşu kullanılamıyor, lütfen başka bir kombinasyon girin. - Geçersiz eklenti kısayol tuşu + Hotkey is invalid Güncelle Kısayol Atanıyor Kullanılamıyor Bu kısayol "{0}" için ayrılmıştır, lütfen başka bir kısayol deneyin. Bu kısayol zaten "{0}" için kullanılıyor. Eğer "Üstüne Yaz"'ı seçerseniz, "{0}" sorgusu bu kısayol ile kullanılamayacak. Bu işleve atamak istediğiniz kısayol tuşlarına basın. + Hotkey and action keyword are empty Özel Kısaltmalar @@ -449,6 +482,7 @@ Anahtar kelime zaten mevcut. Yeni bir kısaltma girin veya mevcut kısaltmayı düzenleyin. Kısaltma ve/veya sorgu eksik. + Shortcut is invalid Kaydet diff --git a/Flow.Launcher/Languages/uk-UA.xaml b/Flow.Launcher/Languages/uk-UA.xaml index 1f15ed7b5..c5dcd3e28 100644 --- a/Flow.Launcher/Languages/uk-UA.xaml +++ b/Flow.Launcher/Languages/uk-UA.xaml @@ -8,9 +8,9 @@ Будласка оберіть виконуваник {0} - Your selected {0} executable is invalid. + Ви вибрали невірний виконуваний файл {0}. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Щоб знову вибрати виконуваний файл {0}, натисніть «Так». Натисніть «Ні», щоб завантажити {1} Не вдається встановити шлях до виконуваника {0}, будласка спробуйте в налаштуваннях Flow (прокрутіть вниз до кінця). Невдача ініціалізації плагінів @@ -18,7 +18,7 @@ Не вдалося зареєструвати гарячу клавішу "{0}". Можливо, гаряча клавіша використовується іншою програмою. Змініть її на іншу гарячу клавішу або вийдіть з програми, де вона використовується. - Failed to unregister hotkey "{0}". Please try again or see log for details + Не вдалося скасувати реєстрацію гарячої клавіші «{0}». Спробуйте ще раз або перегляньте журнал для отримання подробиць Flow Launcher Не вдалося запустити {0} Невірний формат файлу плагіна Flow Launcher @@ -42,8 +42,8 @@ Режим гри Призупинити використання гарячих клавіш. Скидання позиції - Reset search window position - Type here to search + Скинути положення вікна пошуку + Напишіть тут, аби знайти Налаштування @@ -51,12 +51,12 @@ Портативний режим Зберігати всі налаштування і дані користувача в одній теці (буде корисно при видаленні дисків або хмарних сервісах). Запускати Flow Launcher при запуску системи - Use logon task instead of startup entry for faster startup experience - After uninstallation, you need to manually remove this task (Flow.Launcher Startup) via Task Scheduler + Для швидшого запуску використовуйте завдання при вході в систему, а не після запуску + Після видалення, вам необхідно вручну видалити це завдання (Flow.Launcher Startup) через планувальник завдань Помилка запуску налаштування під час запуску Сховати Flow Launcher, якщо втрачено фокус Не повідомляти про доступні нові версії - Search Window Location + Розташування вікна пошуку Пам'ятати останню позицію Монітор з курсором миші Монітор зі сфокусованим вікном @@ -74,8 +74,8 @@ Зберегти останній запит Вибрати останній запит Очистити останній запит - Preserve Last Action Keyword - Select Last Action Keyword + Зберігати останнє ключове слово дії + Вибрати ключове слово останньої дії Максимальна кількість результатів Ви також можете швидко налаштувати цей параметр за допомогою клавіш CTRL+Плюс чи CTRL+Мінус. Ігнорувати гарячі клавіші в повноекранному режимі @@ -106,38 +106,42 @@ Завжди переглядати Завжди відкривати панель попереднього перегляду при активації Flow. Натисніть {0}, щоб переключити попередній перегляд. Ефект тіні не дозволено, коли поточна тема має ефект розмиття - Search Delay - Adds a short delay while typing to reduce UI flicker and result load. Recommended if your typing speed is average. - Enter the wait time (in ms) until input is considered complete. This can only be edited if Search Delay is enabled. - Default Search Delay Time - Wait time before showing results after typing stops. Higher values wait longer. (ms) - Information for Korean IME user + Затримка пошуку + Додає невелику затримку під час набору тексту, щоб зменшити мерехтіння інтерфейсу та навантаження на результати. Рекомендується, якщо у вас середня швидкість друкування. + Введіть час очікування (в мілісекундах) до завершення введення. Цей параметр можна редагувати лише в разі ввімкнення функції «Затримка пошуку». + Типовий час затримки пошуку + Час очікування перед відображенням результатів після завершення введення тексту. Чим вище значення, тим довше очікування. (мс) + Інформація для користувачів корейської IME - The Korean input method used in Windows 11 may cause some issues in Flow Launcher. + Корейський метод введення, який використовується у Windows 11, може спричинити деякі проблеми в Flow Launcher. - If you experience any problems, you may need to enable "Use previous version of Korean IME". + Якщо у вас виникли проблеми, можливо, вам доведеться ввімкнути параметр «Використовувати попередню версію корейського IME». - Open Setting in Windows 11 and go to: + Відкрийте налаштування у Windows 11 і перейдіть до: - Time & Language > Language & Region > Korean > Language Options > Keyboard - Microsoft IME > Compatibility, + Час і мова > Мова і регіон > Корейська > Параметри мови > Клавіатура - Microsoft IME > Сумісність, - and enable "Use previous version of Microsoft IME". + та увімкніть параметр «Використовувати попередню версію Microsoft IME». - Open Language and Region System Settings - Opens the Korean IME setting location. Go to Korean > Language Options > Keyboard - Microsoft IME > Compatibility + Відкрити налаштування системи мови та регіону + Відкриває вікно налаштувань корейського IME. Перейдіть до Корейської > Параметри мови > Клавіатура - Microsoft IME > Сумісність Відкрити - Use Previous Korean IME - You can change the Previous Korean IME settings directly from here - Home Page - Show home page results when query text is empty. - Show History Results in Home Page - Maximum History Results Shown in Home Page - This can only be edited if plugin supports Home feature and Home Page is enabled. - Show Search Window at Foremost - Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Використовувати попередній корейський IME + Ви можете змінити попередні налаштування корейського IME безпосередньо звідси. + Головна сторінка + Показувати результати на головній сторінці, коли текст запиту порожній. + Показати результати історії на головній + Максимальна кількість результатів історії, що показуються на головній + Це можна редагувати тільки в тому випадку, якщо плагін підтримує функцію «Головна сторінка» і вона ввімкнена. + Показувати вікно пошуку на передньому плані + Перекриває налаштування «Завжди зверху» інших програм і виводить Flow на передній план. + Перезапустіть після модифікації плагіну через Магазин плагінів + Автоматично перезапускати Flow Launcher після встановлення / видалення / оновлення плагіну через Магазин плагінів + Показувати попередження про невідоме джерело + Показувати попередження під час встановлення плагінів із невідомих джерел Плагін для пошуку @@ -154,13 +158,13 @@ Поточна гаряча клавіша Нова гаряча клавіша Змінити гарячі клавіши - Plugin search delay time - Change Plugin Search Delay Time - Advanced Settings: + Час затримки пошуку плагіну + Змінити час затримки пошуку плагінів + Додаткові налаштування: Увімкнено Пріоритет - Search Delay - Home Page + Затримка пошуку + Головна сторінка Поточний пріоритет Новий пріоритет Пріоритет @@ -172,10 +176,16 @@ Версія Сайт Видалити - Fail to remove plugin settings - Plugins: {0} - Fail to remove plugin settings files, please remove them manually - Fail to remove plugin cache - Plugins: {0} - Fail to remove plugin cache files, please remove them manually + Не вдалося видалити налаштування плагіну + Плагіни: {0} — Не вдалося видалити файли налаштувань плагінів, видаліть їх вручну. + Не вдалося видалити кеш плагіну + Плагіни: {0} — Не вдалося видалити файли кешу плагінів, видаліть їх вручну + {0} вже змінено + Перезапустіть Flow перед тим, як вносити будь-які подальші зміни. + Не вдалося встановити {0} + Не вдалося видалити {0} + Не вдалося знайти файл plugin.json у розпакованому zip-файлі або цей шлях {0} не існує. + Вже існує плагін з таким самим ідентифікатором та версією, або версія цього плагіну вища за версію завантаженого. Магазин плагінів @@ -191,6 +201,28 @@ Нова версія Цей плагін було оновлено протягом останніх 7 днів Доступне нове оновлення + Помилка під час встановлення плагіна + Помилка видалення плагіну + Помилка під час оновлення плагіну + Зберегти налаштування плагіну + Ви хочете зберегти налаштування плагіну для наступного використання? + Плагін {0} успішно встановлено. Будь ласка, перезапустіть Flow. + Плагін {0} успішно видалено. Будь ласка, перезапустіть Flow. + Плагін {0} успішно оновлено. Будь ласка, перезапустіть Flow. + Встановлення плагіна + {0} від {1} {2}{2}Бажаєте встановити цей плагін? + Видалення плагіну + {0} від {1} {2}{2}Бажаєте видалити цей плагін? + Оновлення плагіну + {0} від {1} {2}{2}Бажаєте оновити цей плагін? + Завантаження плагіну + Автоматично перезапускати після встановлення / видалення / оновлення плагінів у магазині плагінів + Zip-файл не має дійсної конфігурації plugin.json. + Встановлення з невідомого джерела + Цей плагін походить із невідомого джерела та може містити потенційні ризики!{0}{0}Переконайтеся, що ви знаєте, звідки походить він походить, і що він є безпечним.{0}{0}Ви все одно хочете продовжити?{0}{0}(Ви можете вимкнути це попередження в загальному розділі вікна налаштувань) + Zip-файли + Виберіть zip-файл + Встановити плагін із локального шляху Тема @@ -212,9 +244,9 @@ Шрифт заголовка результату Шрифт підзаголовка результату Скинути - Reset to the recommended font and size settings. - Import Theme Size - If a size value intended by the theme designer is available, it will be retrieved and applied. + Скинути до рекомендованих налаштувань шрифту та розміру. + Імпортувати розмір теми + Якщо значення розміру, передбачене дизайнером теми, доступне, воно буде отримане та застосоване. Підлаштувати Віконний режим Прозорість @@ -241,21 +273,21 @@ Користувацька Годинник Дата - Backdrop Type - The backdrop effect is not applied in the preview. - Backdrop supported starting from Windows 11 build 22000 and above + Тип тла + Ефект тла не застосовується у передпоказі. + Тло підтримується починаючи з Windows 11 версії 22000 і вище Нема - Acrylic - Mica - Mica Alt - This theme supports two (light/dark) modes. + Акрил + Слюда + Слюда (альтернатива) + Ця тема підтримує два (світлу/темну) режими. Ця тема підтримує розмитий прозорий фон. - Show placeholder - Display placeholder when query is empty - Placeholder text - Change placeholder text. Input empty will use: {0} - Fixed Window Size - The window size is not adjustable by dragging. + Показати заповнювач + Показувати заповнювач, коли запит порожній + Текст заповнювача + Змінення тексту заповнювача. Ввід буде використовувати: {0} + Фіксований розмір вікна + Розмір вікна не можна регулювати шляхом перетягування. Гаряча клавіша @@ -315,9 +347,9 @@ Використання іконок Segoe Fluent Використання іконок Segoe Fluent Icons для результатів запитів, де це підтримується Натисніть клавішу - Show Result Badges - For supported plugins, badges are displayed to help distinguish them more easily. - Show Result Badges for Global Query Only + Показувати значки результатів + Для підтримуваних плагінів показуються значки для легшого розрізнення. + Показувати значки результатів тільки для глобального запиту HTTP-проксі @@ -358,39 +390,39 @@ Тека журналу Очистити журнали Ви впевнені, що хочете видалити всі журнали? - Cache Folder - Clear Caches - Are you sure you want to delete all caches? - Failed to clear part of folders and files. Please see log file for more information + Кеш теки + Очистити кеш + Дійсно хочете видалити весь кеш? + Не вдалося очистити частину тек і файлів. Перегляньте файл журналу для отримання додаткової інформації Чаклун Розташування даних користувача Налаштування користувача та встановлені плагіни зберігаються у теці даних користувача. Це місце може змінюватися залежно від того, чи перебуває програма в портативному режимі, чи ні. Відкрити теку - Advanced - Log Level - Debug - Info - Setting Window Font + Розширені + Рівень журналювання + Налагодження + Інформація + Встановлення шрифту вікна - See more release notes on GitHub - Failed to fetch release notes - Please check your network connection or ensure GitHub is accessible - Flow Launcher has been updated to {0} - Click here to view the release notes + Дізнатися більше про версію на GitHub + Не вдалося отримати примітки до випуску + Перевірте своє мережеве з'єднання або переконайтеся, що GitHub є доступним + Flow Launcher було оновлено до {0} + Натисніть тут, щоби переглянути примітки до випуску Виберіть файловий менеджер - Learn more - Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + Докладніше + Вкажіть розташування файлу у файловому менеджері, який ви використовуєте, та додайте необхідні аргументи. «%d» позначає шлях до каталогу, який потрібно відкрити, і використовується в полі «Аргумент для теки» та для команд, що відкривають певні каталоги. «%f» позначає шлях до файлу, який потрібно відкрити, і використовується в полі «Аргумент для файлу» та для команд, що відкривають певні файли. + Наприклад, якщо файловий менеджер використовує таку команду, як «totalcmd.exe /A c:\windows» для відкриття каталогу c:\windows, шлях файлового менеджера буде totalcmd.exe, а аргумент для теки — /A «%d». Деякі файлові менеджери, такі як QTTabBar, можуть вимагати лише вказати шлях, у цьому випадку використовуйте «%d» як шлях файлового менеджера і залиште решту полів порожніми. Файловий менеджер Ім'я профілю Шлях до файлового менеджера Аргумент для папки Аргумент для файлу - The file manager '{0}' could not be located at '{1}'. Would you like to continue? - File Manager Path Error + Не вдалося знайти файловий менеджер «{0}» за адресою «{1}». Чи бажаєте продовжити? + Помилка шляху до файлового менеджера Веб-браузер за замовчуванням @@ -415,32 +447,33 @@ Не вдалося знайти вказаний плагін Нова гаряча клавіша не може бути порожньою Нова гаряча клавіша вже використовується іншим плагіном. Будь ласка, вкажіть нову - This new Action Keyword is the same as old, please choose a different one + Це нове ключове слово дії є таким самим, як і старе, виберіть інше. Успішно Успішно завершено - Failed to copy - Enter the action keywords you like to use to start the plugin and use whitespace to divide them. Use * if you don't want to specify any, and the plugin will be triggered without any action keywords. + Не вдалося скопіювати + Введіть ключові слова дій, які ви хочете використовувати для запуску плагіну, й розділіть їх пробілами. Якщо ви не хочете вказувати жодних ключових слів, використовуйте *, і плагін буде запускатися без них. - Search Delay Time Setting - Input the search delay time in ms you like to use for the plugin. Input empty if you don't want to specify any, and the plugin will use default search delay time. + Налаштування часу затримки пошуку + Введіть час затримки пошуку в мілісекундах, який ви хочете використовувати для плагіну. Якщо ви не хочете вказувати час затримки, залиште поле порожнім, і плагін буде використовувати типовий час затримки пошуку. - Home Page - Enable the plugin home page state if you like to show the plugin results when query is empty. + Головна сторінка + Увімкніть стан головної сторінки плагіну, якщо ви хочете показувати його результати, коли запит порожній. Задані гарячі клавіші для запитів Натисніть спеціальну гарячу клавішу, щоб відкрити Flow Launcher і автоматично ввести вказаний запит. Переглянути Гаряча клавіша недоступна. Будь ласка, вкажіть нову - Недійсна гаряча клавіша плагіна + Гаряча клавіша недійсна Оновити Прив'язка галавіші Поточна галавіша недоступна. Ця галавіша зарезервована для «{0}» і не може бути використана. Будласка, виберіть іншу галавішу. Ця галавіша вже використовується «{0}». Якщо ви натиснете «Перезаписати», її буде вилучено з «{0}». Натисніть клавіші, які ви хочете використовувати для цієї функції. + Гаряча клавіша та ключове слово дії порожні Власне скорочення запиту @@ -451,6 +484,7 @@ Скорочення вже існує, будь ласка, введіть нове або відредагуйте існуюче. Скорочення та/або його розширення є порожнім. + Комбінація клавіш недійсна. Зберегти @@ -478,18 +512,18 @@ Звіт успішно відправлено Не вдалося відправити звіт Стався збій в додатку Flow Launcher - Please open new issue in - 1. Upload log file: {0} - 2. Copy below exception message + Створіть нову проблему в + 1. Завантажте файл журналу: {0} + 2. Скопіюйте нижче повідомлення про виняток - File Manager Error + Помилка файлового менеджера - The specified file manager could not be found. Please check the Custom File Manager setting under Settings > General. + Вказаний файловий менеджер не знайдено. Перевірте налаштування вашого файлового менеджера в розділі Налаштування > Загальні. Помилка - An error occurred while opening the folder. {0} - An error occurred while opening the URL in the browser. Please check your Default Web Browser configuration in the General section of the settings window + Під час відкриття теки сталася помилка. {0} + Під час відкриття URL-адреси в браузері сталася помилка. Перевірте налаштування типового веббраузера у розділі «Загальні» вікна налаштувань. Будь ласка, зачекайте... diff --git a/Flow.Launcher/Languages/vi.xaml b/Flow.Launcher/Languages/vi.xaml index dec3cd2e3..2a8769863 100644 --- a/Flow.Launcher/Languages/vi.xaml +++ b/Flow.Launcher/Languages/vi.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Plugin tìm kiếm @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin Tải tiện ích mở rộng @@ -191,6 +201,28 @@ Phiên bản mới Plugin này đã được cập nhật trong vòng 7 ngày qua Đã có bản cập nhật mới + Lỗi cài đặt plugin + Lỗi cài đặt plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + Plugin đang được tải + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Cài đặt từ một nguồn không xác định + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path Giao Diện @@ -385,7 +417,7 @@ Chọn trình quản lý tệp Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. Trình quản lý ngày tháng Tên hồ sơ Đường dẫn quản lý tệp @@ -436,13 +468,14 @@ Nhấn phím nóng tùy chỉnh để mở Flow Launcher và tự động nhập truy vấn được chỉ định. Xem trước Tổ hợp phím không khả dụng, vui lòng chọn tổ hợp phím khác - Tổ hợp phím plugin không hợp lệ + Hotkey is invalid Cập nhật Binding Hotkey Phím nóng hiện tại không có sẵn. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Phím tắt truy vấn tùy chỉnh @@ -455,6 +488,7 @@ Phím tắt đã tồn tại, vui lòng nhập Phím tắt mới hoặc chỉnh sửa phím tắt hiện có. Phím tắt và/hoặc phần mở rộng của nó trống. + Shortcut is invalid Lưu diff --git a/Flow.Launcher/Languages/zh-cn.xaml b/Flow.Launcher/Languages/zh-cn.xaml index 133d2e3c6..0f5e1e165 100644 --- a/Flow.Launcher/Languages/zh-cn.xaml +++ b/Flow.Launcher/Languages/zh-cn.xaml @@ -138,6 +138,10 @@ 这只能在插件支持主页功能和主页启用时进行编辑。 将搜索窗口置于顶层 覆盖其他“总是在顶部”的程序窗口并在最顶层的位置显示 Flow Launcher 搜索窗口。 + 通过插件商店修改插件后重启 + 通过插件商店安装/卸载/更新插件后自动重启 Flow Launcher + 显示未知来源警告 + 安装来自未知来源的插件时显示警告 搜索插件 @@ -176,6 +180,12 @@ 插件:{0} - 移除插件设置文件失败,请手动删除 移除插件缓存失败 插件:{0} - 移除插件设置文件失败,请手动删除 + {0} 已修改 + 请在进行任何进一步更改之前重新启动 Flow + 安装 {0} 失败 + 卸载 {0} 失败 + 无法从提取的zip文件中找到plugin.json,或者此路径 {0} 不存在 + 已存在相同ID和版本的插件,或者存在版本大于此下载的插件 插件商店 @@ -191,6 +201,28 @@ 新版本 此插件在过去7天内有更新 有可用的更新 + 安装插件时出错 + 卸载插件时出错 + 更新插件时出错 + 保留插件设置 + 你想要保留插件设置以便下一次的使用吗? + 成功安装插件{0}。请重新启动 Flow Launcher。 + 成功卸载插件{0}。请重新启动 Flow Launcher。 + 成功更新插件{0}。请重新启动 Flow Launcher。 + 插件安装 + {0} 作者: {1} {2}{2}您想要安装这个插件吗? + 插件卸载 + {0} 作者: {1} {2}{2}您想要卸载这个插件吗? + 插件更新 + {0} 作者: {1} {2}{2}您想要更新这个插件吗? + 下载插件 + 插件商店安装/卸载/更新插件后自动重启 + Zip 文件没有有效的 plugin.json 配置 + 从未知源安装 + 您正在从未知源安装此插件,它可能包含潜在风险!{0}{0}请确保您了解来源以及安全性。{0}{0}您想要继续吗?{0}{0}(您可以通过设置关闭此警告) + Zip 文件 + 请选择 zip 文件 + 从本地路径安装插件 主题 @@ -434,13 +466,14 @@ 输入一个自定义的快捷键来打开 Flow Launcher 并自动输入指定的查询。 预览 热键不可用,请选择一个新的热键 - 插件热键不合法 + 热键无效 更新 绑定热键 当前热键不可用。 此热键为“{0}”保留,无法使用。请选择其他热键。 此热键已被“{0}”使用。如果按“覆盖”,则会将其从“{0}”中删除。 按下您想要用于此功能的键。 + 热键和操作关键字为空 自定义查询捷径 @@ -451,6 +484,7 @@ 捷径已存在,请输入一个新的或者编辑已有的。 捷径及其展开均不能为空。 + 快捷键无效 保存 diff --git a/Flow.Launcher/Languages/zh-tw.xaml b/Flow.Launcher/Languages/zh-tw.xaml index c9e84b9e7..959f75f97 100644 --- a/Flow.Launcher/Languages/zh-tw.xaml +++ b/Flow.Launcher/Languages/zh-tw.xaml @@ -10,7 +10,7 @@ Your selected {0} executable is invalid. {2}{2} - Click yes if you would like select the {0} executable agian. Click no if you would like to download {1} + Click yes if you would like select the {0} executable again. Click no if you would like to download {1} Unable to set {0} executable path, please try from Flow's settings (scroll down to the bottom). Fail to Init Plugins @@ -138,6 +138,10 @@ This can only be edited if plugin supports Home feature and Home Page is enabled. Show Search Window at Foremost Overrides other programs' 'Always on Top' setting and displays Flow in the foremost position. + Restart after modifying plugin via Plugin Store + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugin Store + Show unknown source warning + Show warning when installing plugins from unknown sources Search Plugin @@ -176,6 +180,12 @@ Plugins: {0} - Fail to remove plugin settings files, please remove them manually Fail to remove plugin cache Plugins: {0} - Fail to remove plugin cache files, please remove them manually + {0} modified already + Please restart Flow before making any further changes + Fail to install {0} + Fail to uninstall {0} + Unable to find plugin.json from the extracted zip file, or this path {0} does not exist + A plugin with the same ID and version already exists, or the version is greater than this downloaded plugin 插件商店 @@ -191,6 +201,28 @@ New Version This plugin has been updated within the last 7 days New Update is Available + 安裝插件時發生錯誤 + Error uninstalling plugin + Error updating plugin + Keep plugin settings + Do you want to keep the settings of the plugin for the next usage? + Plugin {0} successfully installed. Please restart Flow. + Plugin {0} successfully uninstalled. Please restart Flow. + Plugin {0} successfully updated. Please restart Flow. + Plugin install + {0} by {1} {2}{2}Would you like to install this plugin? + Plugin uninstall + {0} by {1} {2}{2}Would you like to uninstall this plugin? + Plugin update + {0} by {1} {2}{2}Would you like to update this plugin? + 正在下載擴充功能 + Automatically restart after installing/uninstalling/updating plugins in plugin store + Zip file does not have a valid plugin.json configuration + Installing from an unknown source + This plugin is from an unknown source and it may contain potential risks!{0}{0}Please ensure you understand where this plugin is from and that it is safe.{0}{0}Would you like to continue still?{0}{0}(You can switch off this warning in general section of setting window) + Zip files + Please select zip file + Install plugin from local path 主題 @@ -383,7 +415,7 @@ 選擇檔案管理器 Learn more Please specify the file location of the file manager you using and add arguments as required. The "%d" represents the directory path to open for, used by the Arg for Folder field and for commands opening specific directories. The "%f" represents the file path to open for, used by the Arg for File field and for commands opening specific files. - For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fileds blank. + For example, if the file manager uses a command such as "totalcmd.exe /A c:\windows" to open the c:\windows directory, the File Manager Path will be totalcmd.exe, and the Arg For Folder will be /A "%d". Certain file managers like QTTabBar may just require a path to be supplied, in this instance use "%d" as the File Manager Path and leave the rest of the fields blank. 檔案管理器 檔案名稱 檔案管理器路徑 @@ -434,13 +466,14 @@ Press a custom hotkey to open Flow Launcher and input the specified query automatically. 預覽 快捷鍵不存在,請設定一個新的快捷鍵 - 擴充功能熱鍵無法使用 + Hotkey is invalid 更新 Binding Hotkey Current hotkey is unavailable. This hotkey is reserved for "{0}" and can't be used. Please choose another hotkey. This hotkey is already in use by "{0}". If you press "Overwrite", it will be removed from "{0}". Press the keys you want to use for this function. + Hotkey and action keyword are empty Custom Query Shortcut @@ -451,6 +484,7 @@ If you add an '@' prefix while inputting a shortcut, it matches any position in Shortcut already exists, please enter a new Shortcut or edit the existing one. Shortcut and/or its expansion is empty. + Shortcut is invalid 儲存 diff --git a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml index b8fd4fb83..07ccc2ea4 100644 --- a/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.BrowserBookmark/Languages/uk-UA.xaml @@ -25,6 +25,6 @@ Браузерний рушій Якщо ви не використовуєте Chrome, Firefox або Edge, або використовуєте їхні портативні версії, вам потрібно додати каталог даних закладок і вибрати правильний рушій браузера, щоб цей плагін працював. Наприклад: Рушій Brave - Chromium, і за замовчуванням розташування даних закладок: "%LOCALAPPDATA%\BraveSoftware\Brave-Browser\UserData". Для браузера Firefox директорія закладок - це папка userdata, що містить файл places.sqlite. - Load favicons (can be time consuming during startup) + Завантажити піктограми (може зайняти багато часу під час запуску) diff --git a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml index 435ba6b92..38829112c 100644 --- a/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Explorer/Languages/uk-UA.xaml @@ -3,8 +3,8 @@ Будь ласка, спочатку зробіть вибір - Please select a folder path. - Please choose a different name or folder path. + Виберіть шлях до теки. + Виберіть інше ім'я або шлях до теки. Будь ласка, оберіть посилання на теку Ви впевнені, що хочете видалити {0}? Ви впевнені, що хочете назавжди видалити цей файл? @@ -27,14 +27,14 @@ Додати Загальні налаштування Налаштувати ключові слова дії - Customise Quick Access + Налаштування швидкого доступу Посилання швидкого доступу Налаштування Everything Панель поперегляду Розмір Дата створення Дата останньої зміни - File Age + Дата створення Показати інформацію про файл Формат дати й часу Варіант сортування: @@ -44,7 +44,7 @@ Шлях до оболонки Shell Виключені шляхи індексного пошуку Використовувати розташування результату пошуку як робочу директорію виконуваного файлу - Display more information like size and age in tooltips + Показувати більше інформації, наприклад розмір і дату створення, у підказках Натисніть Enter, щоб відкрити папку у файловому менеджері за замовчуванням Використовуйте індексний пошук для пошуку шляху Параметри індексації @@ -81,15 +81,15 @@ Ctrl + Enter, щоб відкрити каталог Ctrl + Enter, щоб відкрити відповідну папку - {0}{4}Size: {1}{4}Date created: {2}{4}Date modified: {3} + {0}{4}Розмір: {1}{4}Дата створення: {2}{4}Дата змінення: {3} Невідомо - {0}{3}Space free: {1}{3}Total size: {2} + {0}{3}Вільного місця: {1}{3}Загальний розмір: {2} Копіювати шлях Копіювати шлях до поточного елемента в буфер обміну - Copy name - Copy name of current item to clipboard + Копіювати назву + Скопіювати назву поточного елемента в буфер обміну Копіювати Копіювання поточного файлу в буфер обміну Копіювати поточну папку в буфер обміну @@ -97,7 +97,7 @@ Безповоротно видалити поточний файл Назавжди видалити поточну папку Назва - Type + Тип Шлях Файл Тека @@ -159,7 +159,7 @@ Попередження: Це не швидке сортування, пошук може бути повільним Шукати повний шлях - Enable File/Folder Run Count + Увімкнути підрахунок запусків файлів / тек Натисніть, щоб запустити або встановити Everything Встановлення програми Everything @@ -171,20 +171,20 @@ Бажаєте увімкнути пошук контенту для Everything? Без індексу (який підтримується лише у версії Everything v1.5+) воно може працювати дуже повільно - Unable to find Everything.exe - Failed to install Everything, please install it manually + Не вдалося знайти Everything.exe + Не вдалося встановити Everything, встановіть його вручну Рідне контекстне меню Відображати рідне контекстне меню (експериментально) Нижче ви можете вказати елементи, які хочете включити до контекстного меню, вони можуть бути частковими (наприклад, «шир пера») або повними («Відкрити за допомогою»). - Below you can specify items you want to exclude from context menu, they can be partial (e.g. 'pen wit') or complete ('Open with'). + Нижче ви можете вказати елементи, які ви хочете виключити з контекстного меню. Вони можуть бути частковими (наприклад, «pen wit») або повними («Відкрити за допомогою»). - Today - {0} days ago - 1 month ago - {0} months ago - 1 year ago - {0} years ago + Сьогодні + {0} дн. тому + Місяць тому + {0} міс. тому + Рік тому + {0} р. тому diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml index 6fb809d90..8a75cde72 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ar.xaml @@ -43,10 +43,15 @@ تم تحديث الإضافة {0} بنجاح. يرجى إعادة تشغيل Flow. تم تحديث {0} إضافات بنجاح. يرجى إعادة تشغيل Flow. تم تعديل الإضافة {0} بالفعل. يرجى إعادة تشغيل Flow قبل إجراء أي تغييرات أخرى. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} مدير الإضافات - إدارة تثبيت وإلغاء تثبيت أو تحديث إضافات Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window مؤلف غير معروف @@ -61,5 +66,5 @@ تحذير التثبيت من مصدر غير معروف - إعادة تشغيل Flow Launcher تلقائيًا بعد تثبيت/إلغاء تثبيت/تحديث الإضافات + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml index d47e1814b..5ca1700d4 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/cs.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Správce pluginů - Správa instalace, odinstalace nebo aktualizace pluginů Flow Launcheru + Install, uninstall or update Flow Launcher plugins via the search window Neznámý autor @@ -61,5 +66,5 @@ Upozornění na instalaci z neznámého zdroje - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml index 616ce779b..a5d0231ce 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/da.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml index 47ea31cce..c7ef77801 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/de.xaml @@ -43,10 +43,15 @@ Plug-in {0} erfolgreich aktualisiert. Bitte starten Sie Flow neu. {0} Plug-ins erfolgreich aktualisiert. Bitte starten Sie Flow neu. Plug-in {0} ist bereits modifiziert worden. Bitte starten Sie Flow neu, bevor Sie irgendwelche weitere Änderungen vornehmen. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plug-ins-Manager - Verwaltung der Installation, Deinstallation oder Aktualisierung der Plug-ins von Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window Unbekannter Autor @@ -61,5 +66,5 @@ Warnung vor Installation aus unbekannter Quelle - Automatischer Neustart von Flow Launcher nach Installation/Deinstallation/Aktualisierung von Plug-ins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml index 616ce779b..a5d0231ce 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es-419.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml index b0f25f3ea..b6a3a6cbc 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/es.xaml @@ -43,10 +43,15 @@ Complemento {0} actualizado correctamente. Por favor, reinicie Flow. {0} complementos se han actualizado correctamente. Por favor, reinicie Flow. El complemento {0} ya ha sido modificado. Por favor, reinicie Flow antes de realizar más cambios. + {0} ya está modificado + Reiniciar Flow antes de realizar más cambios + + Archivo de instalación zip no válido + Por favor, compruebe si hay un plugin.json en {0} Administrador de complementos - Administración de instalación, desinstalación o actualización de los complementos de Flow Launcher + Instalar, desinstalar o actualizar complementos de Flow Launcher desde la ventana de búsqueda Autor desconocido @@ -61,5 +66,5 @@ Aviso de instalación desde fuentes desconocidas - Reiniciar automáticamente Flow Launcher después de instalar/desinstalar/actualizar complementos + Reiniciar Flow Launcher automáticamente después de instalar/desinstalar/actualizar el complemento a través del Administrador de complementos diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml index 3142ef86d..c95c97231 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/fr.xaml @@ -43,10 +43,15 @@ Plugin {0} mis à jour avec succès. Veuillez redémarrer Flow. {0} plugins mis à jour avec succès. Veuillez redémarrer Flow. Le plugin {0} a déjà été modifié. Veuillez redémarrer Flow avant de faire d'autres modifications. + {0} est déjà modifié + Veuillez redémarrer Flow avant d'apporter d'autres modifications + + Fichier d'installation zip invalide + Veuillez vérifier s'il y a un plugin.json dans {0} Gestionnaire de plugins - Gestion de l'installation, de la désinstallation ou de la mise à jour des plugins Flow Launcher + Installer, désinstaller ou mettre à jour les plugins Flow Launcher via la fenêtre de recherche Auteur inconnu @@ -61,5 +66,5 @@ Avertissement d'installation à partir d'une source inconnue - Redémarrer automatiquement Flow Launcher après l'installation/désinstallation/mise à jour des plugins + Redémarrer Flow Launcher automatiquement après l'installation/désinstallation/mise à jour du plugin via le gestionnaire de plugins diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml index 8c7f0cf02..3fe7fd968 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/he.xaml @@ -43,10 +43,15 @@ התוסף {0} עודכן בהצלחה. נא הפעל מחדש את Flow. {0} תוספים עודכנו בהצלחה. נא הפעל מחדש את Flow. התוסף {0} כבר השתנה. נא הפעל מחדש את Flow לפני ביצוע שינויים נוספים. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} מנהל תוספים - ניהול התקנה, הסרה או עדכון של תוספים עבור Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window מחבר לא ידוע @@ -61,5 +66,5 @@ אזהרה בעת התקנה ממקור לא ידוע - הפעל מחדש את Flow Launcher באופן אוטומטי לאחר התקנה/הסרה/עדכון של תוספים + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml index d154e59dc..3ccefa2db 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/it.xaml @@ -43,10 +43,15 @@ Il plugin {0} aggiornato con successo. Riavviare Flow. {0} plugin aggiornato con successo. Riavviare Flow. Il plugin {0} è già stato modificato. Riavviare Flow prima di fare altre modifiche. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Gestore dei plugin - Gestione dell'installazione, disinstallazione o aggiornamento dei plugin di Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window Autore Sconosciuto @@ -61,5 +66,5 @@ Avviso di installazione da sorgenti sconosciute - Riavvia automaticamente Flow Launcher dopo l'installazione/disinstallazione/aggiornamento dei plugin + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml index c5edca2dc..d62f0f61b 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ja.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Flow Launcher のプラグインのインストール、アンインストールや更新の管理 + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ 不明な提供元からインストールするとき警告する - プラグインのインストール/アンインストール/更新後、Flow Launcher を自動的に再起動する + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml index f6f46448d..8c15f27ad 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ko.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} 플러그인 관리자 - 플러그인의 설치/삭제/업데이트를 관리하는 플러그인 + Install, uninstall or update Flow Launcher plugins via the search window 알수없는 제작자 @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml index b0fd2d10a..bccd55459 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nb.xaml @@ -43,10 +43,15 @@ Programtillegg {0} oppdatert. Vennligst restart Flow. {0} programtillegg oppdatert. Start Flow på nytt. Programtillegg {0} er allerede endret. Start Flow på nytt før nye endringer foretas. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Programtilleggsbehandling - Administrasjon av installasjon, avinstallere eller oppdatere Flow Launcher programtillegg + Install, uninstall or update Flow Launcher plugins via the search window Ukjent utvikler @@ -61,5 +66,5 @@ Advarsel om installering fra ukjent kilde - Start Flow Launcher automatisk på nytt etter installasjon/avinstallering/oppdatering av programtillegg + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml index 616ce779b..a5d0231ce 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/nl.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml index 187900931..3124cc634 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pl.xaml @@ -43,10 +43,15 @@ Wtyczka {0} została pomyślnie zaktualizowana. Proszę ponownie uruchomić Flow. {0} wtyczek zaktualizowano pomyślnie. Proszę ponownie uruchomić Flow. Wtyczka {0} została już zmodyfikowana. Proszę ponownie uruchomić Flow przed wprowadzeniem dalszych zmian. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Menadżer wtyczek - Zarządzanie instalowaniem, odinstalowywaniem i aktualizowaniem wtyczek Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window Nieznany autor @@ -61,5 +66,5 @@ Ostrzeżenie o instalacji z nieznanego źródła - Automatycznie uruchom ponownie Flow Launcher po zainstalowaniu/odinstalowaniu/zaktualizowaniu wtyczek + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml index 179bcab97..2407d5b6e 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-br.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml index 01535c689..40cfc8253 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/pt-pt.xaml @@ -43,10 +43,15 @@ Plugin {0} atualizado com sucesso. Por favor, reinicie o Flow Launcher. {0} plugins atualizados com sucesso. Deve reiniciar Flow Launcher. O plugin {0} foi modificado. Por favor, reinicie o Flow Launcher antes de fazer mais alterações. + {0} já modificado + Reinicie Flow Launcher antes de fazer mais alterações + + Ficheiro Zip inválido + Verifique se existe o ficheiro "plugin.json" em {0} Gestor de plugins - Módulo para instalar, desinstalar e atualizar os plugins do Flow Launcher + Instalar, desinstalar ou atualizar plugins do Flow Launcher através da janela de pesquisa Autor desconhecido @@ -61,5 +66,5 @@ Aviso ao instalar de fontes desconhecidas - Reiniciar automaticamente após instalar/desinstalar/atualizar plugins + Reiniciar Flow Launcher após instalar/desinstalar/atualizar um plugin via Gestor de plugins diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml index 5b0a379b5..18913c7c6 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/ru.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Автор неизвестен @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml index 5529b2fc1..f788c9ce3 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sk.xaml @@ -43,10 +43,15 @@ Plugin {0} bol úspešne aktualizovaný. Prosím, reštartuje Flow. Pluginy úspešne aktualizované ({0}). Reštartuje Flow. Plugin {0} už bol upravený. Prosím, reštartuje Flow pred ďalšími zmenami. + Plugin {0} už bol upravený + Pred vykonaním ďalších zmien reštartujte Flow Launcher + + Neplatný inštalačný súbor zip + Skontrolujte, či sa v {0} nachádza plugin.json Správca pluginov - Správa inštalácie, odinštalácie alebo aktualizácie pluginov programu Flow Launcher + Inštalovať, odinštalovať alebo aktualizovať pluginy Flow Launchera cez vyhľadávacie okno Neznámy autor @@ -61,5 +66,5 @@ Upozornenie na inštaláciu z neznámeho zdroja - Automaticky reštartovať Flow Launcher po inštalácií/odinštalácii/aktualizáciu pluginov + Automaticky reštartovať Flow Launcher po inštalácii/odinštalácii/aktualizáciu pluginu cez Správcu pluginov diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml index 616ce779b..a5d0231ce 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/sr.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Unknown Author @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml index 14f2e1309..ed9aaf4b3 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/tr.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Plugins Manager - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window Bilinmeyen Yazar @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml index 3d2b50a78..e07f417c7 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/uk-UA.xaml @@ -13,8 +13,8 @@ Встановлення плагіна Завантажити та встановити {0} Видалення плагіна - Keep plugin settings - Do you want to keep the settings of the plugin for the next usage? + Зберегти налаштування плагіну + Хочете зберегти налаштування плагіну для наступного використання? Plugin successfully installed. Restarting Flow, please wait... Не вдалося знайти файл метаданих plugin.json у розпакованому zip-архіві. Помилка: Плагін, який має ідентичну або новішу версію з {0}, вже існує. @@ -43,10 +43,15 @@ Плагін {0} успішно оновлено. Будь ласка, перезапустіть Flow. {0} плагіни успішно оновлено. Будь ласка, перезапустіть Flow. Плагін {0} вже було змінено. Будь ласка, перезапустіть Flow, перш ніж вносити будь-які подальші зміни. + {0} вже змінено + Перезапустіть Flow перед тим, як вносити будь-які подальші зміни. + + Неправильний встановлюваний zip-файл + Перевірте, чи є файл plugin.json у {0}. Менеджер плагінів - Керування встановленням, видаленням або оновленням плагінів Flow Launcher + Встановити, видалити або оновити плагіни Flow Launcher через вікно пошуку. Невідомий автор @@ -61,5 +66,5 @@ Попередження про встановлення з невідомого джерела - Автоматичний перезапуск Flow Launcher після встановлення/видалення/оновлення плагінів + Автоматично перезапускати Flow Launcher після встановлення / видалення / оновлення плагіну за допомогою Менеджера плагінів diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml index 3f9315d60..1a2a5c93a 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/vi.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} Trình quản lý plugin - Quản lý cài đặt, gỡ cài đặt hoặc cập nhật plugin Flow Launcher + Install, uninstall or update Flow Launcher plugins via the search window Không rõ tác giả @@ -61,5 +66,5 @@ Cảnh báo cài đặt từ nguồn không xác định - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml index 1a4199965..446609850 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-cn.xaml @@ -43,10 +43,15 @@ 成功更新插件{0}。请重新启动 Flow Launcher。 插件 {0} 更新成功。请重新启动 Flow Launcher。 插件 {0} 已被修改。请在进行任何进一步更改之前重新启动Flow。 + {0} 已被修改 + 请在进行任何进一步更改之前重新启动 Flow + + 无效的 zip 安装程序文件 + 请检查 {0} 中是否有plugin.json 插件管理 - 安装,卸载或更新 Flow Launcher 插件 + 通过搜索窗口安装、卸载或更新 Flow Launcher 插件 未知作者 @@ -61,5 +66,5 @@ 未知源安装警告 - 安装/卸载/更新插件后自动重启 Flow Launcher + 通过插件管理器安装/卸载/更新插件后自动重启 Flow Launcher diff --git a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml index f16feb050..ddd24d0ed 100644 --- a/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml +++ b/Plugins/Flow.Launcher.Plugin.PluginsManager/Languages/zh-tw.xaml @@ -43,10 +43,15 @@ Plugin {0} successfully updated. Please restart Flow. {0} plugins successfully updated. Please restart Flow. Plugin {0} has already been modified. Please restart Flow before making any further changes. + {0} modified already + Please restart Flow before making any further changes + + Invalid zip installer file + Please check if there is a plugin.json in {0} 擴充功能管理 - Management of installing, uninstalling or updating Flow Launcher plugins + Install, uninstall or update Flow Launcher plugins via the search window 未知的作者 @@ -61,5 +66,5 @@ Install from unknown source warning - Automatically restart Flow Launcher after installing/uninstalling/updating plugins + Restart Flow Launcher automatically after installing/uninstalling/updating plugin via Plugins Manager diff --git a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml index 56004028b..6d2086abc 100644 --- a/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.ProcessKiller/Languages/uk-UA.xaml @@ -8,7 +8,7 @@ вбити {0} процесів вбити всі екземпляри - Show title for processes with visible windows - Put processes with visible windows on the top + Показувати назву процесів із видимими вікнами + Помістити процеси з видимими вікнами у верхній частині diff --git a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml index 290954d5f..29158b2ce 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Program/Languages/uk-UA.xaml @@ -34,8 +34,8 @@ Приховує програми з поширеними назвами деінсталяторів, наприклад, unins000.exe Пошук в описі програми Flow буде шукати опис програми - Hide duplicated apps - Hide duplicated Win32 programs that are already in the UWP list + Приховати дублікати застосунків + Приховати дублікати програми Win32, які вже є в списку UWP Суфікси Максимальна глибина @@ -46,8 +46,8 @@ Будь ласка, виберіть джерело програми Ви впевнені, що хочете видалити вибрані джерела програм? - Please select program sources that are not added by you - Please select program sources that are added by you + Виберіть джерела програм, які не були додані вами. + Виберіть джерела програм, які були додані вами. Інше програмне джерело з тим самим розташуванням вже існує. Вихідний код програми @@ -76,7 +76,7 @@ Запустити від імені іншого користувача Запустити від імені адміністратора Відкрити папку - Hide + Приховати Відкрити цільову папку Програма @@ -86,7 +86,7 @@ Кастомізований провідник Аргументи - You can customize the explorer used for opening the container folder by inputing the Environmental Variable of the explorer you want to use. It will be useful to use CMD to test whether the Environmental Variable is available. + Ви можете налаштувати провідник, який використовується для відкриття теки контейнера, ввівши змінну середовища провідника, який ви хочете використовувати. Буде корисно використовувати CMD, аби перевірити, чи доступна змінна середовища. Введіть спеціальні аргументи, які ви хочете додати до вашого провідника. %s для батьківського каталогу, %f для повного шляху (працює лише для win32). Докладнішу інформацію можна знайти на веб-сайті провідника. diff --git a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml index d209cb739..d47474784 100644 --- a/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Shell/Languages/uk-UA.xaml @@ -6,7 +6,7 @@ Натисніть будь-яку клавішу, щоб закрити це вікно... Не закривати командний рядок після виконання команди Завжди запускати від імені адміністратора - Use Windows Terminal + Використовувати Термінал Windows Запустити від імені іншого користувача Shell Дозволяє виконувати системні команди з Flow Launcher diff --git a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml index 19d69511b..c82be249a 100644 --- a/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.Sys/Languages/uk-UA.xaml @@ -26,7 +26,7 @@ Поради щодо Flow Launcher Тека UserData Flow Launcher Перемкнути режим гри - Set the Flow Launcher Theme + Встановити тему Flow Launcher Редагувати @@ -51,7 +51,7 @@ Перегляньте документацію Flow Launcher для отримання додаткової допомоги та підказок щодо використання порад Відкрити каталог, де зберігаються налаштування Flow Launcher Перемкнути режим гри - Quickly change the Flow Launcher theme + Швидко змінити тему Flow Launcher Успішно @@ -62,14 +62,14 @@ Ви впевнені, що хочете перезавантажити комп'ютер за допомогою додаткових параметрів завантаження? Ви впевнені, що хочете вийти з системи? - Command Keyword Setting - Custom Command Keyword - Enter a keyword to search for command: {0}. This keyword is used to match your query. - Command Keyword + Налаштування ключового слова команди + Власне ключове слово команди + Введіть ключове слово для пошуку команди: {0}. Це ключове слово використовується для відповідності вашому запиту. + Ключове слово команди Скинути Підтвердити Скасувати - Please enter a non-empty command keyword + Введіть непорожнє ключове слово команди Системні команди Надає команди, пов'язані з системою, наприклад, вимкнення, блокування, налаштування тощо. diff --git a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml index 5536a7e68..51e1efc6e 100644 --- a/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml +++ b/Plugins/Flow.Launcher.Plugin.WebSearch/Languages/uk-UA.xaml @@ -17,7 +17,7 @@ Ключове слово дії URL Пошук - Use Search Query Autocomplete + Використовувати автозаповнення пошукового запиту Автозаповнення даних з: Будь ласка, виберіть пошуковий запит в Інтернеті Ви впевнені, що хочете видалити {0}? @@ -29,8 +29,8 @@ Таким чином, загальна формула для пошуку на Netflix має вигляд https://www.netflix.com/search?q={q} - Copy URL - Copy search URL to clipboard + Копіювати URL + Скопіювати URL-адресу пошуку в буфер обміну Назва From 2eeb09719467e9ba74bc9d72c2a0f278ec91caa4 Mon Sep 17 00:00:00 2001 From: VictoriousRaptor <10308169+VictoriousRaptor@users.noreply.github.com> Date: Sun, 13 Jul 2025 20:57:36 +0800 Subject: [PATCH 71/75] Use lazy init after version check Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs index 76599d7ce..28f774333 100644 --- a/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs +++ b/Plugins/Flow.Launcher.Plugin.Program/Programs/UWPPackage.cs @@ -290,12 +290,13 @@ namespace Flow.Launcher.Plugin.Program.Programs } private static readonly Channel PackageChangeChannel = Channel.CreateBounded(1); - private static PackageCatalog catalog = PackageCatalog.OpenForCurrentUser(); + private static PackageCatalog? catalog; public static async Task WatchPackageChangeAsync() { if (Environment.OSVersion.Version.Major >= 10) { + catalog ??= PackageCatalog.OpenForCurrentUser(); catalog.PackageInstalling += (_, args) => { if (args.IsComplete) From 43f7cecaff1874fff48fbe1954a8fb3f87d01a58 Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 13 Jul 2025 20:58:15 +0800 Subject: [PATCH 72/75] Improve code quality --- Flow.Launcher.Infrastructure/TranslationMapping.cs | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Flow.Launcher.Infrastructure/TranslationMapping.cs b/Flow.Launcher.Infrastructure/TranslationMapping.cs index 951979fa7..5b02ae666 100644 --- a/Flow.Launcher.Infrastructure/TranslationMapping.cs +++ b/Flow.Launcher.Infrastructure/TranslationMapping.cs @@ -1,6 +1,5 @@ using System; using System.Collections.Generic; -using System.Linq; namespace Flow.Launcher.Infrastructure { @@ -10,7 +9,7 @@ namespace Flow.Launcher.Infrastructure // Assuming one original item maps to multi translated items // list[i] is the last translated index + 1 of original index i - private readonly List originalToTranslated = new List(); + private readonly List originalToTranslated = new(); public void AddNewIndex(int translatedIndex, int length) { From 44d9eb855675cb0ea09215467e97af2b85bbb3cd Mon Sep 17 00:00:00 2001 From: Jack251970 <1160210343@qq.com> Date: Sun, 13 Jul 2025 20:58:26 +0800 Subject: [PATCH 73/75] Change default to false BEFORE RELEASE --- Flow.Launcher.Infrastructure/UserSettings/Settings.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs index f5318cb09..6b10d693d 100644 --- a/Flow.Launcher.Infrastructure/UserSettings/Settings.cs +++ b/Flow.Launcher.Infrastructure/UserSettings/Settings.cs @@ -330,7 +330,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings /// public bool ShouldUsePinyin { get; set; } = false; - private bool _useDoublePinyin = true; // TODO: change default to false BEFORE RELEASE + private bool _useDoublePinyin = false; public bool UseDoublePinyin { get => _useDoublePinyin; From 3b1fe2119cbb06ac65c8d483b054635654e8ba82 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Sun, 13 Jul 2025 13:33:28 +0000 Subject: [PATCH 74/75] fix milestone filter print --- .github/update_release_pr.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/update_release_pr.py b/.github/update_release_pr.py index 37d4a8683..be523bfe8 100644 --- a/.github/update_release_pr.py +++ b/.github/update_release_pr.py @@ -89,7 +89,7 @@ def get_prs( count += 1 print( - f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {pr["milestone"] if pr["milestone"] is not None else "None"}" + f"Found {count} PRs with {label if label else 'no filter on'} label, state as {state}, and milestone {milestone_title if milestone_title else "any"}" ) return pr_list From 3cdf9197b91a7bf398d566d7c584b662b42db742 Mon Sep 17 00:00:00 2001 From: Jeremy Wu Date: Mon, 14 Jul 2025 01:11:06 +1000 Subject: [PATCH 75/75] Merge release v1.20.2 back to dev (#3823) --- Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj | 8 ++++---- appveyor.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj index 1d51b6534..1831bf46f 100644 --- a/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj +++ b/Flow.Launcher.Plugin/Flow.Launcher.Plugin.csproj @@ -14,10 +14,10 @@ - 4.6.0 - 4.6.0 - 4.6.0 - 4.6.0 + 4.7.0 + 4.7.0 + 4.7.0 + 4.7.0 Flow.Launcher.Plugin Flow-Launcher MIT diff --git a/appveyor.yml b/appveyor.yml index 646594f4a..39e2a114c 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -1,4 +1,4 @@ -version: '1.20.1.{build}' +version: '1.20.2.{build}' # Do not build on tags because we create a release on merge to master. Otherwise will upload artifacts twice changing the hash, as well as triggering duplicate GitHub release action & NuGet deployments. skip_tags: true