diff --git a/ProjectLighthouse.Localization/LocalizationManager.cs b/ProjectLighthouse.Localization/LocalizationManager.cs index 7b72021d..4b2d2660 100644 --- a/ProjectLighthouse.Localization/LocalizationManager.cs +++ b/ProjectLighthouse.Localization/LocalizationManager.cs @@ -11,6 +11,10 @@ public static class LocalizationManager public static string GetLocalizedString(TranslationAreas translationArea, string language, string key) { + // ASP.NET requires specific names for certain languages (like ja for japanese as opposed to the standard ja-JP) + // We map that value back here. + language = mapLanguageBack(language); + #if DEBUG Console.WriteLine($"Attempting to load '{key}' for '{language}'"); #endif @@ -36,6 +40,43 @@ public static class LocalizationManager return localizedString; } + // If a language isn't working, it might be because a language is using a different name than what ASP.NET expects. + // You can retrieve the name of the language from the Accept-Language header in an HTTP request. + private static readonly Dictionary languageMappings = new() + { + { + "ja-JP", "ja" + }, + { + "eo-UY", "eo" + }, + }; + + /// + /// Some languages crowdin uses have names that differ from the ones that ASP.NET expects. This function converts the names. + /// + /// 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; + } + + return language; + } + + private static string mapLanguageBack(string language) + { + foreach ((string? key, string? value) in languageMappings) + { + if (value == language) return key; + } + + return language; + } + // This is a bit scuffed, but it will work for what I need it to do. public static IEnumerable GetAvailableLanguages() { diff --git a/ProjectLighthouse.Localization/StringLists/LandingPageStrings.cs b/ProjectLighthouse.Localization/StringLists/LandingPageStrings.cs index e7c46916..6a0b58d8 100644 --- a/ProjectLighthouse.Localization/StringLists/LandingPageStrings.cs +++ b/ProjectLighthouse.Localization/StringLists/LandingPageStrings.cs @@ -11,5 +11,5 @@ public static class LandingPageStrings public static readonly TranslatableString AuthAttemptsPending = create("authAttemptsPending"); - private static TranslatableString create(string key) => new(TranslationAreas.BaseLayout, key); + private static TranslatableString create(string key) => new(TranslationAreas.LandingPage, key); } \ No newline at end of file diff --git a/ProjectLighthouse.Localization/TranslatableString.cs b/ProjectLighthouse.Localization/TranslatableString.cs index 4805a2ab..89530be6 100644 --- a/ProjectLighthouse.Localization/TranslatableString.cs +++ b/ProjectLighthouse.Localization/TranslatableString.cs @@ -13,8 +13,12 @@ public class TranslatableString public string Translate(string language) => LocalizationManager.GetLocalizedString(this.Area, language, this.Key); + // CS0809 is a warning about obsolete methods overriding non-obsoleted methods. + // That works against what we're trying to do here, so we disable the warning here. + #pragma warning disable CS0809 [Obsolete("Do not translate by using ToString. Use TranslatableString.Translate().", true)] public override string ToString() => "NOT TRANSLATED CORRECTLY!"; + #pragma warning restore CS0809 [Obsolete("Do not translate by using ToString. Use TranslatableString.Translate().", true)] public static implicit operator string(TranslatableString _) => "NOT TRANSLATED CORRECTLY!"; diff --git a/ProjectLighthouse/Pages/LandingPage.cshtml b/ProjectLighthouse/Pages/LandingPage.cshtml index 098f5e4e..99b4484f 100644 --- a/ProjectLighthouse/Pages/LandingPage.cshtml +++ b/ProjectLighthouse/Pages/LandingPage.cshtml @@ -1,4 +1,5 @@ @page "/" +@using LBPUnion.ProjectLighthouse.Localization.StringLists @using LBPUnion.ProjectLighthouse.Types @using LBPUnion.ProjectLighthouse.Types.Settings @model LBPUnion.ProjectLighthouse.Pages.LandingPage @@ -7,11 +8,11 @@ Layout = "Layouts/BaseLayout"; Model.ShowTitleInPage = false; } -

Welcome to Project Lighthouse!

+

@Model.Translate(LandingPageStrings.Welcome)

@if (Model.User != null) { -

You are currently logged in as @Model.User.Username.

+

@string.Format(Model.Translate(LandingPageStrings.LoggedInAs), $"{Model.User.Username}")

// TODO: make this bold if (ServerSettings.Instance.UseExternalAuth && Model.AuthenticationAttemptsCount > 0) {

@@ -22,7 +23,7 @@ @if (Model.PlayersOnlineCount == 1) { -

There is 1 user currently online:

+

@Model.Translate(LandingPageStrings.UsersSingle)

@foreach (User user in Model.PlayersOnline) { @user.Username @@ -31,7 +32,7 @@ else if (Model.PlayersOnlineCount == 0) { -

There are no users online. Why not hop on?

+

@Model.Translate(LandingPageStrings.UsersNone)

} else { diff --git a/ProjectLighthouse/Startup/Startup.cs b/ProjectLighthouse/Startup/Startup.cs index 488e6371..fb78e597 100644 --- a/ProjectLighthouse/Startup/Startup.cs +++ b/ProjectLighthouse/Startup/Startup.cs @@ -94,7 +94,9 @@ public class Startup ( config => { - List languages = LocalizationManager.GetAvailableLanguages().Select(l => new CultureInfo(l)).ToList(); + List languages = LocalizationManager.GetAvailableLanguages() + .Select(l => new CultureInfo(LocalizationManager.MapLanguage(l))) + .ToList(); config.DefaultRequestCulture = new RequestCulture(new CultureInfo("en-US"));