Files
Nitrox/NitroxPatcher/Patches/Persistent/Language_LoadLanguageFile_Patch.cs
2025-07-06 00:23:46 +02:00

92 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Reflection;
using HarmonyLib;
using LitJson;
using NitroxModel.Helper;
namespace NitroxPatcher.Patches.Persistent;
public class Language_LoadLanguageFile_Patch : NitroxPatch, IPersistentPatch
{
private static readonly MethodInfo TARGET_METHOD = Reflect.Method((Language t) => t.LoadLanguageFile(default));
private static readonly Dictionary<string, Tuple<string, string>> languageToIsoCode = new(); // First Tuple item is region specific (en-US), second isn't (en)
public static void Postfix(string language, Dictionary<string, string> ___strings)
{
if (!TryLoadLanguageFile("en", ___strings)) //Loading english as fallback for missing files or keys
{
Log.Error($"The English language file could not be loaded");
return;
}
if (!TryLoadLanguageFile(languageToIsoCode[language].Item1, ___strings))
{
if (!TryLoadLanguageFile(languageToIsoCode[language].Item2, ___strings))
{
Log.Warn($"No language file was found for {language}. Using English as fallback");
}
}
Language.main.ParseMetaData();
}
private static bool TryLoadLanguageFile(string fileName, IDictionary<string, string> strings)
{
string filePath = Path.Combine(NitroxUser.LanguageFilesPath, $"{fileName}.json");
if (!File.Exists(filePath))
{
return false;
}
using StreamReader streamReader = new(filePath);
try
{
JsonData json = JsonMapper.ToObject(streamReader);
foreach (string key in json.Keys)
{
JsonData entry = json[key];
if (entry.IsString)
{
strings[key] = (string)entry;
}
}
return true;
}
catch (Exception ex)
{
Log.Error(ex, $"Error while reading language file {fileName}.json");
}
return false;
}
public override void Patch(Harmony harmony)
{
List<string> existingLanguageNames = Directory.EnumerateFiles(SNUtils.InsideUnmanaged("LanguageFiles"), "*.json").Select(Path.GetFileNameWithoutExtension).ToList();
foreach (CultureInfo culture in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
if (!languageToIsoCode.ContainsKey(culture.EnglishName) && !string.IsNullOrEmpty(culture.Name) && existingLanguageNames.Contains(culture.EnglishName))
{
languageToIsoCode.Add(culture.EnglishName, new Tuple<string, string>(culture.Name, culture.TwoLetterISOLanguageName));
}
}
// This language isn't registered in CultureInfo
if (existingLanguageNames.Contains("Spanish (Latin America)"))
{
languageToIsoCode.Add("Spanish (Latin America)", new Tuple<string, string>("es-419", "es"));
}
PatchPostfix(harmony, TARGET_METHOD, ((Action<string, Dictionary<string, string>>)Postfix).Method);
}
}