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

pull/1192/head
Oleksii Holub 10 months ago committed by GitHub
parent 982ba6a76c
commit 057beaacd6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

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

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

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

@ -1,5 +1,4 @@
using System; using System;
using System.Globalization;
using System.IO; using System.IO;
using Cogwheel; using Cogwheel;
using DiscordChatExporter.Core.Exporting; using DiscordChatExporter.Core.Exporting;
@ -21,7 +20,7 @@ public partial class SettingsService()
public ThreadInclusionMode ThreadInclusionMode { get; set; } = ThreadInclusionMode.None; 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; } public bool IsUtcNormalizationEnabled { get; set; }

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

Loading…
Cancel
Save