diff --git a/ProjectLighthouse.Localization/LocalizationManager.cs b/ProjectLighthouse.Localization/LocalizationManager.cs
index d27d7d2f..bd4688cd 100644
--- a/ProjectLighthouse.Localization/LocalizationManager.cs
+++ b/ProjectLighthouse.Localization/LocalizationManager.cs
@@ -1,4 +1,5 @@
using System.Diagnostics;
+using System.Globalization;
using System.Reflection;
using System.Resources;
@@ -16,7 +17,7 @@ public static class LocalizationManager
language = mapLanguageBack(language);
#if DEBUG
- Console.WriteLine($"Attempting to load '{key}' for '{language}'");
+ Console.WriteLine($@"Attempting to load '{key}' for '{language}'");
#endif
string resourceBasename = $"{namespaceStr}.{translationArea.ToString()}";
@@ -84,28 +85,51 @@ public static class LocalizationManager
};
///
- /// Some languages crowdin uses have names that differ from the ones that ASP.NET expects. This function converts the names.
+ /// Returns a Crowdin friendly language code from an ASP.NET language code
///
- /// The language to convert to ASP.NET names
- /// The name of the language that ASP.NET expects.
- public static string MapLanguage(string language)
- {
- foreach ((string? key, string? value) in languageMappings)
- {
- if (key == language) return value;
- }
+ /// The ASP.NET language code
+ /// The Crowdin friendly language code
+ private static string mapLanguageBack(string language)
+ => languageMappings.FirstOrDefault(kv => kv.Value == language, KeyValuePair.Create(language, "")).Key;
+
- return language;
+ private static string getLanguageDisplay(string langCode)
+ {
+ return langCode switch
+ {
+ "en-PT" => "Pirate Speak (The Seven Seas)",
+ "en-UD" => "English (Upside Down)",
+ "zh-CN" => "Simplified Chinese",
+ "zh-TW" => "Traditional Chinese",
+ "ingsoc" => "Newspeak",
+ "toki" => "Toki Pona",
+ _ => langCode,
+ };
+
}
- private static string mapLanguageBack(string language)
+ public static string GetLanguageName(string langCode)
{
- foreach ((string? key, string? value) in languageMappings)
+ string mappedLanguage = getLanguageDisplay(langCode);
+ if(mappedLanguage == langCode && TryGetCultureInfo(langCode, out CultureInfo? info))
{
- if (value == language) return key;
+ return info!.DisplayName;
}
+ return mappedLanguage;
+ }
- return language;
+ public static bool TryGetCultureInfo(string name, out CultureInfo? culture)
+ {
+ try
+ {
+ culture = new CultureInfo(name);
+ return true;
+ }
+ catch
+ {
+ culture = null;
+ return false;
+ }
}
// This is a bit scuffed, but it will work for what I need it to do.
@@ -116,7 +140,7 @@ public static class LocalizationManager
List languages = Assembly.GetExecutingAssembly()
.GetManifestResourceNames()
.Where(r => r.StartsWith($"{namespaceStr}.{area}"))
- .Select(r => r.Substring(r.IndexOf(area), r.Length - r.IndexOf(area)).Substring(area.Length + 1))
+ .Select(r => r.Substring(r.IndexOf(area), r.Length - r.IndexOf(area))[(area.Length + 1)..])
.Select(r => r.Replace(".resources", string.Empty)) // Remove .resources
.Select(r => r.Replace("lang-", string.Empty)) // Remove 'lang-' prefix from languages
.Where(r => r != "resources")
diff --git a/ProjectLighthouse.Servers.Website/Pages/UserSettingsPage.cshtml b/ProjectLighthouse.Servers.Website/Pages/UserSettingsPage.cshtml
index 85fb155b..8cbd1fdd 100644
--- a/ProjectLighthouse.Servers.Website/Pages/UserSettingsPage.cshtml
+++ b/ProjectLighthouse.Servers.Website/Pages/UserSettingsPage.cshtml
@@ -97,14 +97,7 @@ function onSubmit(e){
{
selected = " selected=\"selected\"";
}
- string langName = new CultureInfo(lang).DisplayName;
- langName = lang switch
- {
- "en-PT" => "Pirate Speak (The Seven Seas)",
- "zh-CN" => "Simplified Chinese",
- "zh-TW" => "Traditional Chinese",
- _ => langName,
- };
+ string langName = LocalizationManager.GetLanguageName(lang);
}
diff --git a/ProjectLighthouse.Servers.Website/Startup/WebsiteStartup.cs b/ProjectLighthouse.Servers.Website/Startup/WebsiteStartup.cs
index bb89c6bf..2fb00fe8 100644
--- a/ProjectLighthouse.Servers.Website/Startup/WebsiteStartup.cs
+++ b/ProjectLighthouse.Servers.Website/Startup/WebsiteStartup.cs
@@ -5,11 +5,13 @@ using LBPUnion.ProjectLighthouse.Configuration;
using LBPUnion.ProjectLighthouse.Configuration.ConfigurationCategories;
using LBPUnion.ProjectLighthouse.Database;
using LBPUnion.ProjectLighthouse.Localization;
+using LBPUnion.ProjectLighthouse.Logging;
using LBPUnion.ProjectLighthouse.Mail;
using LBPUnion.ProjectLighthouse.Middlewares;
using LBPUnion.ProjectLighthouse.Servers.Website.Captcha;
using LBPUnion.ProjectLighthouse.Servers.Website.Middlewares;
using LBPUnion.ProjectLighthouse.Services;
+using LBPUnion.ProjectLighthouse.Types.Logging;
using LBPUnion.ProjectLighthouse.Types.Mail;
using Microsoft.AspNetCore.HttpOverrides;
using Microsoft.AspNetCore.Localization;
@@ -81,7 +83,16 @@ public class WebsiteStartup
services.Configure(config =>
{
- List languages = LocalizationManager.GetAvailableLanguages().Select(l => new CultureInfo(LocalizationManager.MapLanguage(l))).ToList();
+ List languages = LocalizationManager.GetAvailableLanguages()
+ .Select(l =>
+ {
+ LocalizationManager.TryGetCultureInfo(l, out CultureInfo? culture);
+ if(culture == null) Logger.Debug($"Failed to generate culture info for language {l}", LogArea.Startup);
+
+ return culture;
+ })
+ .Where(c => c != null)
+ .ToList()!;
config.DefaultRequestCulture = new RequestCulture(new CultureInfo("en"));