-
Notifications
You must be signed in to change notification settings - Fork 3
/
LocalizationManager.cs
108 lines (98 loc) · 4.11 KB
/
LocalizationManager.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
using BepInEx;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using UnityEngine;
using Newtonsoft.Json;
namespace RF5.HisaCat.NPCDetails.Localization
{
internal static class LocalizationManager
{
private static Dictionary<string, LocalizedString> dic = null;
public const string MainPath = "Localized";
public static string Load(string key) => Load(key, BootSystem.OptionData.SystemLanguage);
public static string Load(string key, BootOption.SystemLanguage lang) => Load(MainPath, key, lang);
public static string Load(string path, string key) => Load(path, key, BootSystem.OptionData.SystemLanguage);
public static string Load(string path, string key, BootOption.SystemLanguage lang)
{
if (dic == null)
dic = new Dictionary<string, LocalizedString>(StringComparer.OrdinalIgnoreCase);
if (dic.ContainsKey(path) == false)
dic.Add(path, new LocalizedString(path));
return dic[path].Load(key, lang);
}
}
internal class LocalizedString
{
public static string GetLocaleStr(BootOption.SystemLanguage lang)
{
switch (lang)
{
case BootOption.SystemLanguage.English:
return "en_US";
case BootOption.SystemLanguage.Japanese:
return "ja_JP";
case BootOption.SystemLanguage.ChineseSimplified:
return "zh_CN";
case BootOption.SystemLanguage.ChineseTraditional:
return "zh_TW";
case BootOption.SystemLanguage.Korean:
return "ko_KR";
case BootOption.SystemLanguage.French:
return "fr_FR";
case BootOption.SystemLanguage.Germen:
return "de_DE";
default:
return string.Empty;
}
}
public static void CreateTemplate()
{
var data = new Dictionary<string, string>();
for (int i = 0; i < 3; i++)
data.Add($"key{i}", "text");
var json = JsonConvert.SerializeObject(data, Formatting.Indented);
for (var lang = BootOption.SystemLanguage.English; lang <= BootOption.SystemLanguage.Germen; lang++)
{
var path = System.IO.Path.Combine(Paths.PluginPath, BepInExLoader.GUID, $"{GetLocaleStr(lang)}.json");
System.IO.File.WriteAllText(path, json);
}
}
public const BootOption.SystemLanguage FallbackLang = BootOption.SystemLanguage.English;
private Dictionary<BootOption.SystemLanguage, Dictionary<string, string>> dic = null;
public readonly string Path = string.Empty;
public LocalizedString(string path)
{
this.Path = path;
this.dic = new Dictionary<BootOption.SystemLanguage, Dictionary<string, string>>();
}
public string Load(string key) => Load(key, BootSystem.OptionData.SystemLanguage);
public string Load(string key, BootOption.SystemLanguage lang)
{
if (this.dic.ContainsKey(lang) == false)
{
//Load.
var datas = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
var curPath = System.IO.Path.Combine(Paths.PluginPath, BepInExLoader.GUID, this.Path, $"{GetLocaleStr(lang)}.json");
if (System.IO.File.Exists(curPath))
{
var json = System.IO.File.ReadAllText(curPath);
datas = JsonConvert.DeserializeObject<Dictionary<string, string>>(json);
}
this.dic.Add(lang, datas);
}
if (this.dic[lang].ContainsKey(key))
return this.dic[lang][key];
else
{
//Fallback
if (lang != FallbackLang)
return Load(key, FallbackLang);
else
return key;
}
}
}
}