Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/build.yml
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ jobs:
shell: bash
run: |
cp -r PostCodeSerialMonitor/bin/${{ matrix.configuration }}/net9.0/${{ matrix.runtime }}/publish/* artifacts/${{ matrix.runtime }}/${{ matrix.configuration }}/
cp PostCodeSerialMonitor/config.json artifacts/${{ matrix.runtime }}/${{ matrix.configuration }}/

- name: Upload artifacts
uses: actions/upload-artifact@v4
Expand Down
8 changes: 5 additions & 3 deletions PostCodeSerialMonitor/App.axaml.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,8 @@
using PostCodeSerialMonitor.ViewModels;
using PostCodeSerialMonitor.Views;
using Microsoft.Extensions.DependencyInjection;
using PostCodeSerialMonitor.Services;
using System.Globalization;

namespace PostCodeSerialMonitor;

Expand All @@ -29,11 +31,11 @@ public override void OnFrameworkInitializationCompleted()
// Creates a ServiceProvider containing services from the provided IServiceCollection
var services = collection.BuildServiceProvider();

var configService = services.GetRequiredService<ConfigurationService>();
var mainWindowViewModel = services.GetRequiredService<MainWindowViewModel>();

//@todo Load language setting in cofig.json.
//
//Assets.Resources.Culture = new CultureInfo("en-US");
// Load language setting in config.json.
Assets.Resources.Culture = new CultureInfo(configService.Config.Language);

if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)
{
Expand Down
26 changes: 24 additions & 2 deletions PostCodeSerialMonitor/Assets/Resources.Designer.cs

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions PostCodeSerialMonitor/Assets/Resources.pt-BR.resx
Original file line number Diff line number Diff line change
Expand Up @@ -369,4 +369,12 @@
<value>Falha ao abrir URL: {0}</value>
<comment>In Views/MainWindow.axaml.cs</comment>
</data>
<data name="RestartRequired" xml:space="preserve">
<value>Necessário reiniciar</value>
<comment>In ViewModels/ConfigurationDialogViewModel.cs</comment>
</data>
<data name="LanguageChangedPleaseRestart" xml:space="preserve">
<value>O idioma foi alterado. Reinicie o aplicativo para que a alteração entre em vigor.</value>
<comment>In ViewModels/ConfigurationDialogViewModel.cs</comment>
</data>
</root>
8 changes: 8 additions & 0 deletions PostCodeSerialMonitor/Assets/Resources.resx
Original file line number Diff line number Diff line change
Expand Up @@ -369,4 +369,12 @@
<value>Failed to open URL: {0}</value>
<comment>In Views/MainWindow.axaml.cs</comment>
</data>
<data name="RestartRequired" xml:space="preserve">
<value>Restart required</value>
<comment>In ViewModels/ConfigurationDialogViewModel.cs</comment>
</data>
<data name="LanguageChangedPleaseRestart" xml:space="preserve">
<value>Language was changed. Please restart the application for it to take effect.</value>
<comment>In ViewModels/ConfigurationDialogViewModel.cs</comment>
</data>
</root>
6 changes: 6 additions & 0 deletions PostCodeSerialMonitor/PostCodeSerialMonitor.csproj
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,12 @@
</Compile>
</ItemGroup>

<ItemGroup>
<None Update="config.json">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>

<ItemGroup>
<PackageReference Include="Avalonia" Version="11.3.0" />
<PackageReference Include="Avalonia.Controls.ItemsRepeater" Version="11.1.5" />
Expand Down
5 changes: 2 additions & 3 deletions PostCodeSerialMonitor/ServiceCollectionExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,12 @@ public static void AddCommonServices(this IServiceCollection collection)

// Build configuration
var configuration = new ConfigurationBuilder()
.AddJsonFile("config.json", optional: true, reloadOnChange: true)
.AddJsonFile("config.json", optional: false, reloadOnChange: true)
.Build();

// Configure options with validation
collection.Configure<AppConfiguration>(configuration.GetSection(nameof(AppConfiguration)));
collection.AddOptions<AppConfiguration>()
.Bind(configuration.GetSection(nameof(AppConfiguration)))
.Bind(configuration.GetRequiredSection(nameof(AppConfiguration)))
.Validate(x => {
return x.FormatVersion == SUPPORTED_CONFIG_FORMAT_VERSION;
})
Expand Down
12 changes: 10 additions & 2 deletions PostCodeSerialMonitor/Services/ConfigurationService.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@
using PostCodeSerialMonitor.Models;
using Microsoft.Extensions.Options;
using Microsoft.Extensions.Logging;
using System.Collections.Generic;
using System.Linq;

namespace PostCodeSerialMonitor.Services;
public class ConfigurationService
Expand All @@ -30,12 +32,18 @@ public async Task SaveConfigurationAsync()
{
try
{
var json = JsonSerializer.Serialize(_configurationMonitor.CurrentValue, new JsonSerializerOptions
var startupPath = AppContext.BaseDirectory?.TrimEnd(Path.DirectorySeparatorChar)
?? throw new InvalidOperationException();

var newConfig = new Dictionary<string, AppConfiguration>(){
{ nameof(AppConfiguration), _configurationMonitor.CurrentValue }
};
var json = JsonSerializer.Serialize(newConfig, new JsonSerializerOptions
{
WriteIndented = true
});

await File.WriteAllTextAsync(_configFilePath, json);
await File.WriteAllTextAsync(Path.Join(startupPath, _configFilePath), json);
_logger.LogInformation(Assets.Resources.ConfigurationSaved);
}
catch (Exception ex)
Expand Down
38 changes: 38 additions & 0 deletions PostCodeSerialMonitor/Utils/LocalizationUtils.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
using System.Collections.Generic;
using System.Globalization;
using System.Resources;
using PostCodeSerialMonitor.Assets;

namespace PostCodeSerialMonitor.Utils;

public static class LocalizationUtils
{
public static IEnumerable<CultureInfo> GetAvailableCultures()
{
List<CultureInfo> result = new List<CultureInfo>()
{
// Prefill with the default culture info, as this won't be gathered by GetCultures
CultureInfo.GetCultureInfo("en-US")
};

ResourceManager rm = new ResourceManager(typeof(Resources));

CultureInfo[] cultures = CultureInfo.GetCultures(CultureTypes.AllCultures);
foreach (CultureInfo culture in cultures)
{
try
{
if (culture.Equals(CultureInfo.InvariantCulture)) continue; //do not use "==", won't work

ResourceSet? rs = rm.GetResourceSet(culture, true, false);
if (rs != null)
result.Add(culture);
}
catch (CultureNotFoundException)
{

}
}
return result;
}
}
29 changes: 26 additions & 3 deletions PostCodeSerialMonitor/ViewModels/ConfigurationDialogViewModel.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,14 @@
using CommunityToolkit.Mvvm.Input;
using PostCodeSerialMonitor.Models;
using PostCodeSerialMonitor.Services;
using PostCodeSerialMonitor.Utils;
using System.Threading.Tasks;
using Avalonia.Controls;
using System;
using System.Collections.Generic;
using System.Globalization;
using MsBox.Avalonia;
using MsBox.Avalonia.Enums;

namespace PostCodeSerialMonitor.ViewModels;

Expand All @@ -32,11 +37,21 @@ public partial class ConfigurationDialogViewModel : ViewModelBase
[ObservableProperty]
private string fwUpdateUrl;

public ObservableCollection<string> Languages { get; } = new();
[ObservableProperty]
private ObservableCollection<string> languages;

[ObservableProperty]
private string selectedLanguage;

public static ObservableCollection<string> GetAvailableLanguages()
{
var languages = new ObservableCollection<string>();
var cultures = LocalizationUtils.GetAvailableCultures();
foreach (CultureInfo culture in cultures)
languages.Add(culture.Name);
return languages;
}

public ConfigurationDialogViewModel(ConfigurationService configurationService)
{
_configurationService = configurationService;
Expand All @@ -52,13 +67,14 @@ public ConfigurationDialogViewModel(ConfigurationService configurationService)
SelectedLanguage = _originalConfiguration.Language;

//Add available languages
Languages.Add("en-US");
Languages.Add("pt-BR");
Languages = GetAvailableLanguages();
}

[RelayCommand]
private async Task SaveAsync(Window window)
{
bool languageChanged = _originalConfiguration.Language != SelectedLanguage;

await _configurationService.UpdateConfigurationAsync(config =>
{
config.CheckForAppUpdates = CheckForAppUpdates;
Expand All @@ -71,6 +87,13 @@ await _configurationService.UpdateConfigurationAsync(config =>
});

window.Close();

if (languageChanged) {
await MessageBoxManager
.GetMessageBoxStandard(Assets.Resources.RestartRequired, string.Format(Assets.Resources.LanguageChangedPleaseRestart),
ButtonEnum.Ok)
.ShowAsync();
}
}

[RelayCommand]
Expand Down
1 change: 1 addition & 0 deletions PostCodeSerialMonitor/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@
"CodesMetaBaseUrl": "https://errors.xboxresearch.com/",
"FwUpdateUrl": "https://example.com/todo",
"MetaStoragePath": "meta",
"Language": "en-US",
"MetaJsonUrl": "https://errors.xboxresearch.com/meta.json"
}
}