Use null as the default locale, which resolves to the current system default locale (#1185)

This commit is contained in:
Oleksii Holub 2024-01-15 23:58:28 +02:00 committed by GitHub
parent 982ba6a76c
commit 057beaacd6
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 26 additions and 18 deletions

View file

@ -1,7 +1,6 @@
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
@ -118,8 +117,12 @@ public abstract class ExportCommandBase : DiscordCommandBase
)]
public string DateFormat { get; init; } = "MM/dd/yyyy h:mm tt";
[CommandOption("locale", Description = "Locale to use when formatting dates and numbers.")]
public string Locale { get; init; } = CultureInfo.CurrentCulture.Name;
[CommandOption(
"locale",
Description = "Locale to use when formatting dates and numbers. "
+ "If not specified, the default system locale will be used."
)]
public string? Locale { get; init; }
[CommandOption("utc", Description = "Normalize all timestamps to UTC+0.")]
public bool IsUtcNormalizationEnabled { get; init; } = false;

View file

@ -8,6 +8,7 @@ using DiscordChatExporter.Core.Discord.Data;
using DiscordChatExporter.Core.Exporting.Filtering;
using DiscordChatExporter.Core.Exporting.Partitioning;
using DiscordChatExporter.Core.Utils;
using DiscordChatExporter.Core.Utils.Extensions;
namespace DiscordChatExporter.Core.Exporting;
@ -39,9 +40,9 @@ public partial class ExportRequest
public bool ShouldReuseAssets { get; }
public string Locale { get; }
public string? Locale { get; }
public CultureInfo CultureInfo { get; }
public CultureInfo? CultureInfo { get; }
public bool IsUtcNormalizationEnabled { get; }
@ -58,7 +59,7 @@ public partial class ExportRequest
bool shouldFormatMarkdown,
bool shouldDownloadAssets,
bool shouldReuseAssets,
string locale,
string? locale,
bool isUtcNormalizationEnabled
)
{
@ -83,7 +84,7 @@ public partial class ExportRequest
? FormatPath(assetsDirPath, Guild, Channel, After, Before)
: $"{OutputFilePath}_Files{Path.DirectorySeparatorChar}";
CultureInfo = CultureInfo.GetCultureInfo(Locale);
CultureInfo = Locale?.Pipe(CultureInfo.GetCultureInfo);
}
}

View file

@ -9,13 +9,15 @@ public class LocaleToDisplayNameConverter : IValueConverter
{
public static LocaleToDisplayNameConverter Instance { get; } = new();
public object? Convert(object value, Type targetType, object parameter, CultureInfo culture) =>
value is string locale ? CultureInfo.GetCultureInfo(locale).DisplayName : null;
public object Convert(object? value, Type targetType, object? parameter, CultureInfo culture) =>
value is string locale && !string.IsNullOrWhiteSpace(locale)
? CultureInfo.GetCultureInfo(locale).DisplayName
: "System default";
public object ConvertBack(
object value,
object? value,
Type targetType,
object parameter,
object? parameter,
CultureInfo culture
) => throw new NotSupportedException();
}

View file

@ -1,5 +1,4 @@
using System;
using System.Globalization;
using System.IO;
using Cogwheel;
using DiscordChatExporter.Core.Exporting;
@ -21,7 +20,7 @@ public partial class SettingsService()
public ThreadInclusionMode ThreadInclusionMode { get; set; } = ThreadInclusionMode.None;
public string Locale { get; set; } = CultureInfo.CurrentCulture.Name;
public string? Locale { get; set; }
public bool IsUtcNormalizationEnabled { get; set; }

View file

@ -1,7 +1,7 @@
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using DiscordChatExporter.Core.Utils.Extensions;
using DiscordChatExporter.Gui.Models;
using DiscordChatExporter.Gui.Services;
using DiscordChatExporter.Gui.ViewModels.Framework;
@ -37,10 +37,11 @@ public class SettingsViewModel(SettingsService settingsService) : DialogScreen
set => settingsService.ThreadInclusionMode = value;
}
// These items have to be non-nullable because WPF ComboBox doesn't allow a null value to be selected
public IReadOnlyList<string> AvailableLocales { get; } = new[]
{
// Current locale
CultureInfo.CurrentCulture.Name,
// Current locale (maps to null downstream)
"",
// Locales supported by the Discord app
"da-DK",
"de-DE",
@ -73,10 +74,12 @@ public class SettingsViewModel(SettingsService settingsService) : DialogScreen
"ko-KR"
}.Distinct(StringComparer.OrdinalIgnoreCase).ToArray();
// This has to be non-nullable because WPF ComboBox doesn't allow a null value to be selected
public string Locale
{
get => settingsService.Locale;
set => settingsService.Locale = value;
get => settingsService.Locale ?? "";
// Important to reduce empty strings to nulls, because empty strings don't correspond to valid cultures
set => settingsService.Locale = value.NullIfWhiteSpace();
}
public bool IsUtcNormalizationEnabled