Skip to content

Commit 6b99494

Browse files
committed
commited what i had
1 parent dfa7f64 commit 6b99494

File tree

5 files changed

+97
-1
lines changed

5 files changed

+97
-1
lines changed

src/Loader.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -746,6 +746,12 @@ public static void LoadAssetBundle(Mod mod, Mod.File file)
746746
);
747747
}
748748

749+
public static void LoadLanguageFile(Mod mod, Mod.File file, string languageName)
750+
{
751+
var dict = JsonSerializer.Deserialize<Dictionary<string, string>>(file.bytes);
752+
Loc.BuildAndLoadCustomLanguage(languageName, dict);
753+
}
754+
749755
/// <summary>
750756
/// Processes the merged game logic data after all mods have been loaded and patched.
751757
/// </summary>

src/Managers/Loc.cs

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ namespace PolyMod.Managers;
1212
/// </summary>
1313
public static class Loc
1414
{
15+
public record TermInfo(string term, string localizedString);
16+
internal static Dictionary<int, string> languagesToAdd = new();
17+
1518
/// <summary>
1619
/// Patches the tribe selection popup to correctly display descriptions for custom skins.
1720
/// </summary>
@@ -112,6 +115,62 @@ public static void BuildAndLoadLocalization(Dictionary<string, Dictionary<string
112115
}
113116
}
114117

118+
[HarmonyPrefix]
119+
[HarmonyPatch(typeof(SettingsScreen), nameof(SettingsScreen.LanguageChangedCallback))]
120+
public static bool LanguageChangedCallback(SettingsScreen __instance, int index)
121+
{
122+
Console.Write("LanguageChangedCallback");
123+
Console.Write(index);
124+
Il2CppSystem.Nullable<int> il2cppNullable = __instance.languageSelector.GetIdForIndex(index);
125+
Console.Write(il2cppNullable.HasValue);
126+
if (!il2cppNullable.HasValue)
127+
{
128+
var allLanguages = LocalizationManager.GetAllLanguages();
129+
string languageName = allLanguages[index];
130+
string languageCode = LocalizationManager.GetLanguageCode(languageName);
131+
Console.Write(languageCode);
132+
SettingsUtils.Language = languageCode;
133+
LocalizationManager.CurrentLanguage = languageName;
134+
UINavigationManager.Select(__instance.languageSelector.GetCurrentSelectable());
135+
}
136+
else
137+
{
138+
Console.Write(il2cppNullable.Value);
139+
}
140+
return il2cppNullable.HasValue;
141+
}
142+
public static void BuildAndLoadCustomLanguage(string name, Dictionary<string, string> terms)
143+
{
144+
LanguageSourceData source = LocalizationManager.Sources[0];
145+
int languageIndex = source.GetLanguageIndex(name);
146+
string languageName = terms["language"];
147+
if (languageIndex == -1)
148+
{
149+
source.AddLanguage(terms["language"], name);
150+
languageIndex = source.GetLanguageIndex(languageName);
151+
languagesToAdd[languageIndex] = terms["language"];
152+
Console.Write($"{name} language added.");
153+
}
154+
155+
foreach (var kvp in terms)
156+
{
157+
TermData term = source.GetTermData(kvp.Key);
158+
if (term == null)
159+
{
160+
source.AddTerm(kvp.Key);
161+
term = source.GetTermData(kvp.Key);
162+
}
163+
164+
term.Languages[languageIndex] = kvp.Value;
165+
}
166+
167+
LocalizationManager.UpdateSources();
168+
169+
// LocalizationManager.CurrentLanguage = name;
170+
171+
Console.Write($"{name} strings added and language activated!");
172+
}
173+
115174
/// <summary>
116175
/// Initializes the Loc manager by patching the necessary methods.
117176
/// </summary>

src/Managers/Main.cs

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,14 +415,27 @@ internal static void Load(GameLogicData gameLogicData, JObject json)
415415
);
416416
continue;
417417
}
418-
if (Regex.IsMatch(Path.GetFileName(file.name), @"^prefab(_.*)?\.json$"))
418+
Match prefabMatch = Regex.Match(Path.GetFileName(file.name), @"^prefab(?:_(.*))?\.json$");
419+
if (prefabMatch.Success)
419420
{
420421
Loader.LoadPrefabInfoFile(
421422
mod,
422423
file
423424
);
424425
continue;
425426
}
427+
Match languageMatch = Regex.Match(Path.GetFileName(file.name), @"^language(?:_(.*))?\.json$");
428+
if (languageMatch.Success)
429+
{
430+
string languageName = languageMatch.Groups[1].Value;
431+
Console.WriteLine(languageName);
432+
Loader.LoadLanguageFile(
433+
mod,
434+
file,
435+
languageName
436+
);
437+
continue;
438+
}
426439

427440
switch (Path.GetExtension(file.name))
428441
{

src/Managers/Visual.cs

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -617,6 +617,23 @@ private static void PopupBase_Hide(PopupBase __instance)
617617
basicPopupWidths.Remove(__instance.GetInstanceID());
618618
}
619619

620+
[HarmonyPostfix]
621+
[HarmonyPatch(typeof(SettingsScreen), nameof(SettingsScreen.CreateLanguageList))]
622+
private static void CreateLanguageList(SettingsScreen __instance, Transform parent)
623+
{
624+
foreach (KeyValuePair<int, string> language in Loc.languagesToAdd)
625+
{
626+
List<string> keys = __instance.languageSelector.data.ToList();
627+
List<int> ids = __instance.languageSelector.ids.ToList();
628+
keys.Add(language.Value);
629+
ids.Add(language.Key);
630+
__instance.languageSelector.SetData(keys.ToArray(), ids.ToArray(), 0, false);
631+
Console.Write("CreateLanguageList");
632+
Console.Write(language.Key);
633+
Console.Write(__instance.languageSelector.ids.Length);
634+
}
635+
}
636+
620637
/// <summary>Shows a basic popup with a custom width.</summary>
621638
public static void ShowSetWidth(this BasicPopup self, int width)
622639
{

src/Registry.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,7 @@ public static class Registry
8686
/// </summary>
8787
public static int gameModesAutoidx = Enum.GetValues(typeof(GameMode)).Length;
8888

89+
public static List<Loc.TermInfo> languageInfo = new();
8990
/// <summary>
9091
/// Gets a sprite from the registry, trying to find the best match.
9192
/// </summary>

0 commit comments

Comments
 (0)