Skip to content

Commit 8b481c4

Browse files
committed
update translation.
1 parent 63c7ca1 commit 8b481c4

File tree

4 files changed

+185
-1
lines changed

4 files changed

+185
-1
lines changed

DungeonArtifactTrans/Hooks.cs

Lines changed: 84 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,15 @@
44
using System.Linq;
55
using System.Reflection;
66
using System.Text;
7+
using BepInEx;
78
using Compiler;
89
using HarmonyLib;
10+
using Localize;
911
using Newtonsoft.Json;
12+
using Roguelike;
1013
using UnityEngine;
1114
using Spell;
15+
using TMPro;
1216

1317
namespace catrice.DungeonArtifactTrans
1418
{
@@ -88,6 +92,10 @@ public static void Postfix()
8892
Vocabulary.keyWordsExp = ApplyLocalization(Vocabulary.keyWordsExp);
8993
Vocabulary.categoryToStr = ApplyLocalization(Vocabulary.categoryToStr);
9094
}
95+
96+
var fi = AccessTools.Field(typeof(GameProgress), "values");
97+
var value = fi.GetValue(null) as GameProgress.Progress;
98+
value.exp += 999999;
9199
}
92100
}
93101

@@ -101,5 +109,80 @@ public static void Prefix(ScenarioComponent __instance, ref string str)
101109
Logger.Log($"Translated:{str}");
102110
}
103111
}
104-
112+
113+
[HarmonyPatch(typeof(Lang), nameof(Lang.ToText))]
114+
public static class LangFix
115+
{
116+
public static void Postfix(ref string __result)
117+
{
118+
if (TranslationDB.LangDescription.TryGetValue(__result, out var transValue))
119+
{
120+
//Logger.Log($"{__result} to {transValue.Translation}");
121+
if (!transValue.Translation.Trim().IsNullOrWhiteSpace())
122+
__result = transValue.Translation;
123+
}
124+
else
125+
{
126+
Logger.Log($"Unmatched <{__result}>");
127+
}
128+
}
129+
}
130+
131+
[HarmonyPatch(typeof(PlayableCharacter), nameof(PlayableCharacter.LoadResource))]
132+
public static class CharacterFix
133+
{
134+
public static void Postfix()
135+
{
136+
var piName = AccessTools.Property(typeof(PlayableCharacter), "name");
137+
var piDesc = AccessTools.Property(typeof(PlayableCharacter), "discription");
138+
var players = PlayableCharacter.GetAll();
139+
foreach (var player in players)
140+
{
141+
if (TranslationDB.EntityInfo.TryGetValue(player.name, out var transValue))
142+
{
143+
Logger.Log($"{player.name} to {transValue}");
144+
if (!transValue.Trim().IsNullOrWhiteSpace())
145+
piName.SetValue(player, transValue);
146+
}
147+
148+
if (TranslationDB.EntityInfo.TryGetValue(player.discription, out var transValue2))
149+
{
150+
Logger.Log($"{player.discription} to {transValue2}");
151+
if (!transValue2.Trim().IsNullOrWhiteSpace())
152+
piDesc.SetValue(player, transValue2);
153+
}
154+
}
155+
}
156+
}
157+
158+
[HarmonyPatch(typeof(Controler), nameof(PlayableCharacter.LoadResource))]
159+
public static class EntityFix
160+
{
161+
public static void Postfix(ref Controler.EntityXml __result)
162+
{
163+
if (TranslationDB.EntityInfo.TryGetValue(__result.name, out var transValue))
164+
{
165+
if (!transValue.Trim().IsNullOrWhiteSpace())
166+
__result.name = transValue;
167+
}
168+
}
169+
}
170+
171+
[HarmonyPatch(typeof(CreditComponent), "Update")]
172+
public static class CreditFix
173+
{
174+
public static bool DoOnce = false;
175+
public static void Postfix()
176+
{
177+
if (DoOnce) return;
178+
DoOnce = true;
179+
var tailCredit = GameObject.Find("item (4)");
180+
var inner = tailCredit.transform.Find("auther");
181+
var txt = inner.GetComponent<TextMeshProUGUI>();
182+
/* Expected:ExertionGame
183+
https://exertiongame.com */
184+
const string MyString = "\n\n\n汉化工作:\n程序:Finn.\n翻译&校对:Phenix02, 哔哩是梨子";
185+
txt.text += MyString;
186+
}
187+
}
105188
}

DungeonArtifactTrans/TranslationDB.cs

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ public static class TranslationDB
1313
public static Dictionary<string, TranslationItem> EnchantInfo = null;
1414
public static Dictionary<string, string> VocabularyInfo = null;
1515
public static Dictionary<string, string> ScenarioInfo = null;
16+
public static Dictionary<string, TranslationItem> LangDescription = null;
17+
public static Dictionary<string, string> EntityInfo = null;
18+
1619
public static void Init()
1720
{
1821

@@ -96,6 +99,48 @@ public static void Init()
9699

97100
EnchantInfo = dst;
98101
}
102+
103+
{
104+
// 读取 JSON 文件内容
105+
string jsonContent = File.ReadAllText(
106+
Path.Join(modPath, "translated_json.json"));
107+
108+
// 反序列化 JSON 字符串为 TranslationItem 结构体的列表
109+
var items = JsonConvert.DeserializeObject<List<TranslationItem>>(jsonContent);
110+
var dst = new Dictionary<string, TranslationItem>();
111+
foreach (var item in items)
112+
{
113+
if (!dst.TryAdd(item.Original, item))
114+
{
115+
Logger.Log($"Find Duplicated Item {item.Original}, content {item.Translation}");
116+
continue;
117+
}
118+
}
119+
120+
LangDescription = dst;
121+
}
122+
123+
{
124+
// 读取 JSON 文件内容
125+
string jsonContent = File.ReadAllText(
126+
Path.Join(modPath, "entity_translated.json"));
127+
128+
// 反序列化 JSON 字符串为 TranslationItem 结构体的列表
129+
var items = JsonConvert.DeserializeObject<List<TranslationItem>>(jsonContent);
130+
var dst = new Dictionary<string, string>();
131+
foreach (var item in items)
132+
{
133+
if (!dst.TryAdd(item.Original, item.Translation))
134+
{
135+
Logger.Log($"Find Duplicated Item {item.Original}, content {item.Translation}");
136+
continue;
137+
}
138+
}
139+
140+
EntityInfo = dst;
141+
}
99142
}
143+
144+
100145
}
101146
}
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
using System.Xml.Linq;
2+
using Newtonsoft.Json;
3+
4+
namespace ExtractTranslations;
5+
6+
public class CharacterTrans
7+
{
8+
9+
public static void ExtractCharacterText(string directoryPath, string outJsonPath)
10+
{
11+
12+
var translations = new List<Dictionary<string, object>>();
13+
14+
15+
16+
17+
foreach (var filePath in Directory.GetFiles(directoryPath, "*.xml", SearchOption.AllDirectories))
18+
{
19+
FileInfo fi = new FileInfo(filePath);
20+
var parentName = fi.Directory.Name;
21+
var doc = XDocument.Load(filePath);
22+
var name = doc.Root?.Element("name")?.Value;
23+
var discription = doc.Root?.Element("discription")?.Value;
24+
25+
if (name != null)
26+
{
27+
translations.Add(new Dictionary<string, object>
28+
{
29+
{ "key", $"{parentName}.{fi.Name}.name" },
30+
{ "original", name },
31+
{ "translation", name },
32+
{ "context", null }
33+
});
34+
}
35+
36+
if (discription != null)
37+
{
38+
//对于entity 的 xml,不会包含这个部分
39+
translations.Add(new Dictionary<string, object>
40+
{
41+
{ "key", $"{parentName}.{fi.Name}.discription" },
42+
{ "original", discription },
43+
{ "translation", discription },
44+
{ "context", null }
45+
});
46+
}
47+
}
48+
49+
50+
var json = JsonConvert.SerializeObject(translations, Formatting.Indented);
51+
File.WriteAllText(outJsonPath, json);
52+
}
53+
}

ExtractTranslations/Program.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,14 @@ private static void RunOptionsAndReturnExitCode(Options opts)
2525
CardTrans.ExtractCardPollText(Path.Join(directoryPath, "Spell"), Path.Join(jsonFilePath, "pool.json"));
2626
EnchantTrans.ExtractEnchantText(Path.Join(directoryPath, "Enchant"), Path.Join(jsonFilePath, "enchant.json"));
2727
ScenarioTrans.ExtractScenario(Path.Join(directoryPath, "Scenario"), Path.Join(jsonFilePath, "scenario.json"));
28+
CharacterTrans.ExtractCharacterText(Path.Join(directoryPath, "Japanese"), Path.Join(jsonFilePath, "entity.json"));
2829

2930
VocabularyTrans.ExtractVocabulary(Path.Join(directoryPath, "Language/Japanese_Vocabulary.txt"),
3031
Path.Join(jsonFilePath, "vocabulary.json"));
3132

3233
Console.WriteLine("转换完成喵!");
34+
35+
3336
}
3437

3538
private static void HandleParseError(IEnumerable<Error> errs)

0 commit comments

Comments
 (0)