1
0
mirror of https://github.com/soarqin/DSP_Mods.git synced 2025-12-08 20:53:28 +08:00
Files
DSP_Mods/CompressSave/I18N.cs
2023-12-15 20:59:48 +08:00

104 lines
3.1 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using HarmonyLib;
namespace CompressSave;
public static class I18N
{
private static bool _initialized;
public static Action OnInitialized;
public static void Init()
{
Harmony.CreateAndPatchAll(typeof(I18N));
}
public static bool Initialized() => _initialized;
private struct Translation
{
public string Key;
public string English;
public string Chinese;
}
private static readonly List<Translation> StringsToAdd = [];
public static void Add(string key, string enus, string zhcn = null)
{
if (zhcn == null && key == enus) return;
var strProto = new Translation
{
Key = key,
English = enus,
Chinese = string.IsNullOrEmpty(zhcn) ? enus : zhcn
};
StringsToAdd.Add(strProto);
}
public static void Apply()
{
if (!_initialized) return;
var indexer = Localization.namesIndexer;
var enIdx = -1;
var zhIdx = -1;
var llen = 0;
for (var i = 0; i < Localization.strings.Length; i++)
{
switch (Localization.Languages[i].lcId)
{
case Localization.LCID_ENUS:
if (!Localization.LanguageLoaded(i) && Localization.Loaded)
{
Localization.LoadLanguage(i);
}
enIdx = i;
break;
case Localization.LCID_ZHCN:
if (!Localization.LanguageLoaded(i) && Localization.Loaded)
{
Localization.LoadLanguage(i);
}
zhIdx = i;
llen = Localization.strings[i].Length;
break;
}
}
var enus = new string[StringsToAdd.Count];
var zhcn = new string[StringsToAdd.Count];
for (var i = 0; i < StringsToAdd.Count; i++)
{
var str = StringsToAdd[i];
enus[i] = str.English;
zhcn[i] = str.Chinese;
indexer[str.Key] = llen + i;
}
Localization.strings[enIdx] = Localization.strings[enIdx].Concat(enus).ToArray();
if (enIdx == Localization.currentLanguageIndex)
{
Localization.currentStrings = Localization.strings[enIdx];
}
Localization.strings[zhIdx] = Localization.strings[zhIdx].Concat(zhcn).ToArray();
if (zhIdx == Localization.currentLanguageIndex)
{
Localization.currentStrings = Localization.strings[zhIdx];
}
StringsToAdd.Clear();
}
[HarmonyPostfix, HarmonyPriority(Priority.Last), HarmonyPatch(typeof(VFPreload), "InvokeOnLoadWorkEnded")]
private static void VFPreload_InvokeOnLoadWorkEnded_Postfix()
{
if (_initialized) return;
_initialized = true;
if (StringsToAdd.Count == 0)
{
OnInitialized?.Invoke();
return;
}
Apply();
OnInitialized?.Invoke();
}
}