Skip to content

Commit c0c4195

Browse files
committed
fix: trim caused issue
1 parent ad5ef23 commit c0c4195

5 files changed

Lines changed: 22 additions & 7 deletions

File tree

src/LiteSnap.App/LanguageExtension.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics.CodeAnalysis;
23
using Avalonia.Data;
34
using Avalonia.Markup.Xaml;
45
using LiteSnap.App.Services;
@@ -9,6 +10,7 @@ public class LanguageExtension : MarkupExtension
910
{
1011
public string? Key { get; set; }
1112

13+
[UnconditionalSuppressMessage("Trimming", "IL2026", Justification = "Dynamic Binding for i18n is by-design")]
1214
public override object ProvideValue(IServiceProvider serviceProvider)
1315
{
1416
if (Key is null) return "";

src/LiteSnap.App/LiteSnap.App.csproj

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,11 @@
1515
<AvaloniaResource Include="Locales\**" />
1616
</ItemGroup>
1717

18+
<!-- Preserve all app code from trimming: LanguageManager loads Locales via AssetLoader.Open at runtime -->
19+
<ItemGroup>
20+
<TrimmerRootAssembly Include="LiteSnap.App" />
21+
</ItemGroup>
22+
1823
<ItemGroup>
1924
<PackageReference Include="Avalonia" Version="12.0.5" />
2025
<PackageReference Include="Avalonia.Desktop" Version="12.0.5" />

src/LiteSnap.App/Services/LanguageManager.cs

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.ComponentModel;
4-
using System.IO;
54
using System.Text.Json;
65
using System.Threading.Tasks;
76
using Avalonia.Platform;
@@ -54,10 +53,13 @@ public async Task LoadAsync(string lang)
5453
{
5554
var uri = new Uri($"avares://LiteSnap.App/Locales/{lang}.json");
5655
using var stream = AssetLoader.Open(uri);
57-
using var reader = new StreamReader(stream);
58-
var json = await reader.ReadToEndAsync();
59-
var data = JsonSerializer.Deserialize<Dictionary<string, string>>(json);
60-
_strings = data ?? [];
56+
using var doc = await JsonDocument.ParseAsync(stream);
57+
var dict = new Dictionary<string, string>();
58+
foreach (var prop in doc.RootElement.EnumerateObject())
59+
{
60+
dict[prop.Name] = prop.Value.GetString() ?? "";
61+
}
62+
_strings = dict;
6163
_resolved = lang;
6264
}
6365
catch

src/LiteSnap.App/ViewLocator.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Diagnostics.CodeAnalysis;
23
using Avalonia.Controls;
34
using Avalonia.Controls.Templates;
45
using LiteSnap.App.ViewModels;
@@ -8,6 +9,7 @@ namespace LiteSnap.App;
89
public class ViewLocator : IDataTemplate
910
{
1011

12+
[UnconditionalSuppressMessage("Trimming", "IL2057", Justification = "View-for-ViewModel convention is a runtime pattern")]
1113
public Control? Build(object? param)
1214
{
1315
if (param is null)

src/LiteSnap.App/ViewModels/MainWindowViewModel.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
using System.Runtime.InteropServices;
1010
using System.Threading;
1111
using System.Text.Json;
12+
using System.Text.Json.Serialization;
1213
using System.Threading.Tasks;
1314
using Avalonia;
1415
using Avalonia.Controls;
@@ -81,7 +82,7 @@ private void LoadHistory()
8182
var path = HistoryPath;
8283
if (!File.Exists(path)) return;
8384
var json = File.ReadAllText(path);
84-
var list = JsonSerializer.Deserialize<List<string>>(json);
85+
var list = JsonSerializer.Deserialize(json, AppJsonContext.Default.ListString);
8586
if (list is null) return;
8687
RecentFolders.Clear();
8788
foreach (var p in list
@@ -99,7 +100,7 @@ private void SaveHistory()
99100
{
100101
var dir = Path.GetDirectoryName(HistoryPath)!;
101102
Directory.CreateDirectory(dir);
102-
var json = JsonSerializer.Serialize(RecentFolders.Take(8).ToList());
103+
var json = JsonSerializer.Serialize(RecentFolders.Take(8).ToList(), AppJsonContext.Default.ListString);
103104
File.WriteAllText(HistoryPath, json);
104105
}
105106
catch { }
@@ -561,4 +562,7 @@ private static async Task OpenUrl(string url)
561562
}
562563
}
563564

565+
[JsonSerializable(typeof(List<string>))]
566+
internal partial class AppJsonContext : JsonSerializerContext { }
567+
564568

0 commit comments

Comments
 (0)