Add translation support to website, read user's language from settings

This commit is contained in:
jvyden 2022-04-14 16:24:17 -04:00
commit 3e18d79fa5
No known key found for this signature in database
GPG key ID: 18BCF2BE0262B278
8 changed files with 103 additions and 33 deletions

View file

@ -15,15 +15,12 @@ public static class LocalizationManager
Console.WriteLine($"Attempting to load '{key}' for '{language}'");
#endif
string resourceBasename;
if (language == defaultLang)
{
resourceBasename = $"{namespaceStr}.{translationArea.ToString()}";
}
else
{
resourceBasename = $"{namespaceStr}.{translationArea.ToString()}.lang-{language}";
}
string resourceBasename = $"{namespaceStr}.{translationArea.ToString()}";
// We don't have an en-US .resx, so if we aren't using en-US then we need to add the appropriate language.
// Otherwise, keep it to the normal .resx file
// e.g. BaseLayout.resx as opposed to BaseLayout.lang-da-DK.resx.
if (language != defaultLang) resourceBasename += $".lang-{language}";
ResourceManager resourceManager = new(resourceBasename, Assembly.GetExecutingAssembly());
@ -39,12 +36,12 @@ public static class LocalizationManager
return localizedString;
}
public static IEnumerable<string> GetAvailableLanguages(TranslationAreas translationArea)
// This is a bit scuffed, but it will work for what I need it to do.
public static IEnumerable<string> GetAvailableLanguages()
{
string area = translationArea.ToString();
string area = TranslationAreas.BaseLayout.ToString();
// scuffed but it will work for now
List<string> langs = Assembly.GetExecutingAssembly()
List<string> 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))
@ -53,8 +50,8 @@ public static class LocalizationManager
.Where(r => r != "resources")
.ToList();
langs.Add(defaultLang);
languages.Add(defaultLang);
return langs;
return languages;
}
}

View file

@ -14,7 +14,7 @@ public static class Program
Console.Write('\n');
foreach (string language in LocalizationManager.GetAvailableLanguages(TranslationAreas.BaseLayout))
foreach (string language in LocalizationManager.GetAvailableLanguages())
{
Console.WriteLine(LocalizationManager.GetLocalizedString(TranslationAreas.BaseLayout, language, "header_home"));
}

View file

@ -0,0 +1,11 @@
namespace LBPUnion.ProjectLighthouse.Localization.StringLists;
public static class BaseLayoutStrings
{
public static readonly TranslatableString HeaderHome = create("header_home");
public static readonly TranslatableString HeaderUsers = create("header_users");
public static readonly TranslatableString HeaderPhotos = create("header_photos");
public static readonly TranslatableString HeaderSlots = create("header_slots");
private static TranslatableString create(string key) => new(TranslationAreas.BaseLayout, key);
}

View file

@ -0,0 +1,21 @@
namespace LBPUnion.ProjectLighthouse.Localization;
public class TranslatableString
{
public TranslatableString(TranslationAreas area, string key)
{
this.Key = key;
this.Area = area;
}
public string Key { get; init; }
public TranslationAreas Area { get; init; }
public string Translate(string language) => LocalizationManager.GetLocalizedString(this.Area, language, this.Key);
[Obsolete("Do not translate by using ToString. Use TranslatableString.Translate().", true)]
public override string ToString() => "NOT TRANSLATED CORRECTLY!";
[Obsolete("Do not translate by using ToString. Use TranslatableString.Translate().", true)]
public static implicit operator string(TranslatableString _) => "NOT TRANSLATED CORRECTLY!";
}