Skip to content

Commit 068b774

Browse files
authored
Merge branch 'dev' into enable_windows_key
2 parents 36f75ac + 94728e0 commit 068b774

File tree

22 files changed

+256
-188
lines changed

22 files changed

+256
-188
lines changed

Flow.Launcher.Core/Flow.Launcher.Core.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@
5454

5555
<ItemGroup>
5656
<PackageReference Include="Droplex" Version="1.7.0" />
57-
<PackageReference Include="FSharp.Core" Version="9.0.100" />
57+
<PackageReference Include="FSharp.Core" Version="9.0.101" />
5858
<PackageReference Include="Meziantou.Framework.Win32.Jobs" Version="3.4.0" />
5959
<PackageReference Include="Microsoft.IO.RecyclableMemoryStream" Version="3.0.1" />
6060
<PackageReference Include="squirrel.windows" Version="1.5.2" NoWarn="NU1701" />

Flow.Launcher.Core/Plugin/JsonRPCPluginV2.cs

Lines changed: 12 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -26,54 +26,33 @@ internal abstract class JsonRPCPluginV2 : JsonRPCPluginBase, IAsyncDisposable, I
2626

2727
protected override async Task<bool> ExecuteResultAsync(JsonRPCResult result)
2828
{
29-
try
30-
{
31-
var res = await RPC.InvokeAsync<JsonRPCExecuteResponse>(result.JsonRPCAction.Method,
32-
argument: result.JsonRPCAction.Parameters);
29+
var res = await RPC.InvokeAsync<JsonRPCExecuteResponse>(result.JsonRPCAction.Method,
30+
argument: result.JsonRPCAction.Parameters);
3331

34-
return res.Hide;
35-
}
36-
catch
37-
{
38-
return false;
39-
}
32+
return res.Hide;
4033
}
4134

4235
private JoinableTaskFactory JTF { get; } = new JoinableTaskFactory(new JoinableTaskContext());
4336

4437
public override List<Result> LoadContextMenus(Result selectedResult)
4538
{
46-
try
47-
{
48-
var res = JTF.Run(() => RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("context_menu",
49-
new object[] { selectedResult.ContextData }));
39+
var res = JTF.Run(() => RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("context_menu",
40+
new object[] { selectedResult.ContextData }));
5041

51-
var results = ParseResults(res);
42+
var results = ParseResults(res);
5243

53-
return results;
54-
}
55-
catch
56-
{
57-
return new List<Result>();
58-
}
44+
return results;
5945
}
6046

6147
public override async Task<List<Result>> QueryAsync(Query query, CancellationToken token)
6248
{
63-
try
64-
{
65-
var res = await RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("query",
66-
new object[] { query, Settings.Inner },
67-
token);
49+
var res = await RPC.InvokeWithCancellationAsync<JsonRPCQueryResponseModel>("query",
50+
new object[] { query, Settings.Inner },
51+
token);
6852

69-
var results = ParseResults(res);
53+
var results = ParseResults(res);
7054

71-
return results;
72-
}
73-
catch
74-
{
75-
return new List<Result>();
76-
}
55+
return results;
7756
}
7857

7958

Flow.Launcher.Core/Resource/AvailableLanguages.cs

Lines changed: 33 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,6 @@ internal static class AvailableLanguages
3030
public static Language Vietnamese = new Language("vi-vn", "Tiếng Việt");
3131
public static Language Hebrew = new Language("he", "עברית");
3232

33-
3433
public static List<Language> GetAvailableLanguages()
3534
{
3635
List<Language> languages = new List<Language>
@@ -63,5 +62,38 @@ public static List<Language> GetAvailableLanguages()
6362
};
6463
return languages;
6564
}
65+
66+
public static string GetSystemTranslation(string languageCode)
67+
{
68+
return languageCode switch
69+
{
70+
"en" => "System",
71+
"zh-cn" => "系统",
72+
"zh-tw" => "系統",
73+
"uk-UA" => "Система",
74+
"ru" => "Система",
75+
"fr" => "Système",
76+
"ja" => "システム",
77+
"nl" => "Systeem",
78+
"pl" => "System",
79+
"da" => "System",
80+
"de" => "System",
81+
"ko" => "시스템",
82+
"sr" => "Систем",
83+
"pt-pt" => "Sistema",
84+
"pt-br" => "Sistema",
85+
"es" => "Sistema",
86+
"es-419" => "Sistema",
87+
"it" => "Sistema",
88+
"nb-NO" => "System",
89+
"sk" => "Systém",
90+
"tr" => "Sistem",
91+
"cs" => "Systém",
92+
"ar" => "النظام",
93+
"vi-vn" => "Hệ thống",
94+
"he" => "מערכת",
95+
_ => "System",
96+
};
97+
}
6698
}
6799
}

Flow.Launcher.Core/Resource/Internationalization.cs

Lines changed: 47 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,52 @@ public class Internationalization
1818
{
1919
public Settings Settings { get; set; }
2020
private const string Folder = "Languages";
21+
private const string DefaultLanguageCode = "en";
2122
private const string DefaultFile = "en.xaml";
2223
private const string Extension = ".xaml";
2324
private readonly List<string> _languageDirectories = new List<string>();
2425
private readonly List<ResourceDictionary> _oldResources = new List<ResourceDictionary>();
26+
private readonly string SystemLanguageCode;
2527

2628
public Internationalization()
2729
{
2830
AddFlowLauncherLanguageDirectory();
31+
SystemLanguageCode = GetSystemLanguageCodeAtStartup();
2932
}
3033

31-
3234
private void AddFlowLauncherLanguageDirectory()
3335
{
3436
var directory = Path.Combine(Constant.ProgramDirectory, Folder);
3537
_languageDirectories.Add(directory);
3638
}
3739

40+
private static string GetSystemLanguageCodeAtStartup()
41+
{
42+
var availableLanguages = AvailableLanguages.GetAvailableLanguages();
43+
44+
// Retrieve the language identifiers for the current culture.
45+
// ChangeLanguage method overrides the CultureInfo.CurrentCulture, so this needs to
46+
// be called at startup in order to get the correct lang code of system.
47+
var currentCulture = CultureInfo.CurrentCulture;
48+
var twoLetterCode = currentCulture.TwoLetterISOLanguageName;
49+
var threeLetterCode = currentCulture.ThreeLetterISOLanguageName;
50+
var fullName = currentCulture.Name;
51+
52+
// Try to find a match in the available languages list
53+
foreach (var language in availableLanguages)
54+
{
55+
var languageCode = language.LanguageCode;
56+
57+
if (string.Equals(languageCode, twoLetterCode, StringComparison.OrdinalIgnoreCase) ||
58+
string.Equals(languageCode, threeLetterCode, StringComparison.OrdinalIgnoreCase) ||
59+
string.Equals(languageCode, fullName, StringComparison.OrdinalIgnoreCase))
60+
{
61+
return languageCode;
62+
}
63+
}
64+
65+
return DefaultLanguageCode;
66+
}
3867

3968
internal void AddPluginLanguageDirectories(IEnumerable<PluginPair> plugins)
4069
{
@@ -68,8 +97,18 @@ private void LoadDefaultLanguage()
6897
public void ChangeLanguage(string languageCode)
6998
{
7099
languageCode = languageCode.NonNull();
71-
Language language = GetLanguageByLanguageCode(languageCode);
72-
ChangeLanguage(language);
100+
101+
// Get actual language if language code is system
102+
var isSystem = false;
103+
if (languageCode == Constant.SystemLanguageCode)
104+
{
105+
languageCode = SystemLanguageCode;
106+
isSystem = true;
107+
}
108+
109+
// Get language by language code and change language
110+
var language = GetLanguageByLanguageCode(languageCode);
111+
ChangeLanguage(language, isSystem);
73112
}
74113

75114
private Language GetLanguageByLanguageCode(string languageCode)
@@ -87,11 +126,10 @@ private Language GetLanguageByLanguageCode(string languageCode)
87126
}
88127
}
89128

90-
public void ChangeLanguage(Language language)
129+
private void ChangeLanguage(Language language, bool isSystem)
91130
{
92131
language = language.NonNull();
93132

94-
95133
RemoveOldLanguageFiles();
96134
if (language != AvailableLanguages.English)
97135
{
@@ -103,7 +141,7 @@ public void ChangeLanguage(Language language)
103141
CultureInfo.CurrentUICulture = CultureInfo.CurrentCulture;
104142

105143
// Raise event after culture is set
106-
Settings.Language = language.LanguageCode;
144+
Settings.Language = isSystem ? Constant.SystemLanguageCode : language.LanguageCode;
107145
_ = Task.Run(() =>
108146
{
109147
UpdatePluginMetadataTranslations();
@@ -167,7 +205,9 @@ private void LoadLanguage(Language language)
167205

168206
public List<Language> LoadAvailableLanguages()
169207
{
170-
return AvailableLanguages.GetAvailableLanguages();
208+
var list = AvailableLanguages.GetAvailableLanguages();
209+
list.Insert(0, new Language(Constant.SystemLanguageCode, AvailableLanguages.GetSystemTranslation(SystemLanguageCode)));
210+
return list;
171211
}
172212

173213
public string GetTranslation(string key)

Flow.Launcher.Infrastructure/Constant.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,5 +52,7 @@ public static class Constant
5252
public const string SponsorPage = "https://github.com/sponsors/Flow-Launcher";
5353
public const string GitHub = "https://github.com/Flow-Launcher/Flow.Launcher";
5454
public const string Docs = "https://flowlauncher.com/docs";
55+
56+
public const string SystemLanguageCode = "system";
5557
}
5658
}

Flow.Launcher.Infrastructure/FileExplorerHelper.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,7 @@ private static IEnumerable<int> GetZOrder(List<dynamic> hWnds)
6868
var numRemaining = hWnds.Count;
6969
PInvoke.EnumWindows((wnd, _) =>
7070
{
71-
var searchIndex = hWnds.FindIndex(x => x.HWND == wnd.Value);
71+
var searchIndex = hWnds.FindIndex(x => new IntPtr(x.HWND) == wnd);
7272
if (searchIndex != -1)
7373
{
7474
z[searchIndex] = index;

Flow.Launcher.Infrastructure/Flow.Launcher.Infrastructure.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,7 @@
5353

5454
<ItemGroup>
5555
<PackageReference Include="Ben.Demystifier" Version="0.4.1" />
56-
<PackageReference Include="BitFaster.Caching" Version="2.5.2" />
56+
<PackageReference Include="BitFaster.Caching" Version="2.5.3" />
5757
<PackageReference Include="Fody" Version="6.5.5">
5858
<PrivateAssets>all</PrivateAssets>
5959
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>

Flow.Launcher.Infrastructure/UserSettings/Settings.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ namespace Flow.Launcher.Infrastructure.UserSettings
1313
{
1414
public class Settings : BaseModel, IHotkeySettings
1515
{
16-
private string language = "en";
16+
private string language = Constant.SystemLanguageCode;
1717
private string _theme = Constant.DefaultTheme;
1818
public string Hotkey { get; set; } = $"{KeyConstant.LeftAlt} + {KeyConstant.Space}";
1919
public string OpenResultModifiers { get; set; } = KeyConstant.Alt;

Flow.Launcher.Plugin/Result.cs

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -157,27 +157,6 @@ public string PluginDirectory
157157
}
158158
}
159159

160-
/// <inheritdoc />
161-
public override bool Equals(object obj)
162-
{
163-
var r = obj as Result;
164-
165-
var equality = string.Equals(r?.Title, Title) &&
166-
string.Equals(r?.SubTitle, SubTitle) &&
167-
string.Equals(r?.AutoCompleteText, AutoCompleteText) &&
168-
string.Equals(r?.CopyText, CopyText) &&
169-
string.Equals(r?.IcoPath, IcoPath) &&
170-
TitleHighlightData == r.TitleHighlightData;
171-
172-
return equality;
173-
}
174-
175-
/// <inheritdoc />
176-
public override int GetHashCode()
177-
{
178-
return HashCode.Combine(Title, SubTitle, AutoCompleteText, CopyText, IcoPath);
179-
}
180-
181160
/// <inheritdoc />
182161
public override string ToString()
183162
{

Flow.Launcher.Test/Plugins/JsonRPCPluginTest.cs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -63,28 +63,5 @@ public async Task GivenVariousJsonText_WhenVariousNamingCase_ThenExpectNotNullRe
6363
})
6464
};
6565

66-
[TestCaseSource(typeof(JsonRPCPluginTest), nameof(ResponseModelsSource))]
67-
public async Task GivenModel_WhenSerializeWithDifferentNamingPolicy_ThenExpectSameResult_Async(JsonRPCQueryResponseModel reference)
68-
{
69-
var camelText = JsonSerializer.Serialize(reference, new JsonSerializerOptions() { PropertyNamingPolicy = JsonNamingPolicy.CamelCase });
70-
71-
var pascalText = JsonSerializer.Serialize(reference);
72-
73-
var results1 = await QueryAsync(new Query { Search = camelText }, default);
74-
var results2 = await QueryAsync(new Query { Search = pascalText }, default);
75-
76-
Assert.IsNotNull(results1);
77-
Assert.IsNotNull(results2);
78-
79-
foreach (var ((result1, result2), referenceResult) in results1.Zip(results2).Zip(reference.Result))
80-
{
81-
Assert.AreEqual(result1, result2);
82-
Assert.AreEqual(result1, referenceResult);
83-
84-
Assert.IsNotNull(result1);
85-
Assert.IsNotNull(result1.AsyncAction);
86-
}
87-
}
88-
8966
}
9067
}

0 commit comments

Comments
 (0)