feat: improve autotranslate performance
This commit is contained in:
parent
8a7593327c
commit
8993da08e2
@ -16,6 +16,7 @@ namespace ChatTwo.Util;
|
|||||||
|
|
||||||
internal static class AutoTranslate {
|
internal static class AutoTranslate {
|
||||||
private static readonly Dictionary<ClientLanguage, List<AutoTranslateEntry>> Entries = new();
|
private static readonly Dictionary<ClientLanguage, List<AutoTranslateEntry>> Entries = new();
|
||||||
|
private static readonly HashSet<(uint, uint)> ValidEntries = new();
|
||||||
|
|
||||||
private static Parser<char, (string name, Maybe<IEnumerable<ISelectorPart>> selector)> Parser() {
|
private static Parser<char, (string name, Maybe<IEnumerable<ISelectorPart>> selector)> Parser() {
|
||||||
var sheetName = Any
|
var sheetName = Any
|
||||||
@ -93,6 +94,8 @@ internal static class AutoTranslate {
|
|||||||
return entries;
|
return entries;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
var shouldAdd = ValidEntries.Count == 0;
|
||||||
|
|
||||||
var parser = Parser();
|
var parser = Parser();
|
||||||
var list = new List<AutoTranslateEntry>();
|
var list = new List<AutoTranslateEntry>();
|
||||||
foreach (var row in data.GetExcelSheet<Completion>()!) {
|
foreach (var row in data.GetExcelSheet<Completion>()!) {
|
||||||
@ -167,6 +170,10 @@ internal static class AutoTranslate {
|
|||||||
text,
|
text,
|
||||||
name
|
name
|
||||||
));
|
));
|
||||||
|
|
||||||
|
if (shouldAdd) {
|
||||||
|
ValidEntries.Add((row.Group, (uint) i));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -179,6 +186,10 @@ internal static class AutoTranslate {
|
|||||||
text.TextValue,
|
text.TextValue,
|
||||||
text
|
text
|
||||||
));
|
));
|
||||||
|
|
||||||
|
if (shouldAdd) {
|
||||||
|
ValidEntries.Add((row.Group, row.RowId));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -222,16 +233,21 @@ internal static class AutoTranslate {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ValidEntries.Count == 0) {
|
||||||
|
// populate the list of valid entries
|
||||||
|
AllEntries(data);
|
||||||
|
}
|
||||||
|
|
||||||
var start = -1;
|
var start = -1;
|
||||||
for (var i = 0; i < bytes.Length; i++) {
|
for (var i = 0; i < bytes.Length; i++) {
|
||||||
if (start != -1) {
|
if (start != -1) {
|
||||||
if (bytes[i] == '>') {
|
if (bytes[i] == '>') {
|
||||||
var tag = Encoding.UTF8.GetString(bytes[start..(i + 1)]);
|
var tag = Encoding.UTF8.GetString(bytes[start..(i + 1)]);
|
||||||
var parts = tag[4..^1].Split(',', 2);
|
var parts = tag[4..^1].Split(',', 2);
|
||||||
if (uint.TryParse(parts[0], out var group) && uint.TryParse(parts[1], out var key)) {
|
if (parts.Length == 2 && uint.TryParse(parts[0], out var group) && uint.TryParse(parts[1], out var key)) {
|
||||||
var payload = AllEntries(data).FirstOrDefault(entry => entry.Group == group && entry.Row == key) == null
|
var payload = ValidEntries.Contains((group, key))
|
||||||
? Array.Empty<byte>()
|
? new AutoTranslatePayload(group, key).Encode()
|
||||||
: new AutoTranslatePayload(group, key).Encode();
|
: Array.Empty<byte>();
|
||||||
var oldBytes = bytes.ToArray();
|
var oldBytes = bytes.ToArray();
|
||||||
var lengthDiff = payload.Length - (i - start);
|
var lengthDiff = payload.Length - (i - start);
|
||||||
bytes = new byte[oldBytes.Length + lengthDiff];
|
bytes = new byte[oldBytes.Length + lengthDiff];
|
||||||
|
Loading…
Reference in New Issue
Block a user