public override bool UpdateParam(string calculatedModificationPath, SimpleTextTranslationCache cache, EventInfo.Param param) { var key = TextResourceHelper.GetSpecializedKey(param, param.Name); if (string.IsNullOrEmpty(key)) { return(false); } var result = false; if (cache.TryGetTranslation(key, true, out var translated)) { param.Name = translated; TrackReplacement(calculatedModificationPath, key, translated); TranslationHelper.RegisterRedirectedResourceTextToPath(translated, calculatedModificationPath); result = true; } else if (AutoTranslatorSettings.IsDumpingRedirectedResourcesEnabled && LanguageHelper.IsTranslatable(key)) { cache.AddTranslationToCache(key, !string.IsNullOrEmpty(param.Name) ? param.Name : string.Empty); } return(result); }
private bool TryRegisterTranslation(SimpleTextTranslationCache cache, ScenarioData.Param param, int i, string calculatedModificationPath) { var key = TextResourceHelper.GetSpecializedKey(param, i, out var value); if (!string.IsNullOrEmpty(key)) { if (cache.TryGetTranslation(key, true, out var translated)) { var result = TextResourceHelper.GetSpecializedTranslation(param, i, translated); TranslationHelper.RegisterRedirectedResourceTextToPath(result, calculatedModificationPath); param.Args[i] = result; Logger.DebugLogDebug($"{GetType()} handled {calculatedModificationPath}"); return(true); } if (LanguageHelper.IsTranslatable(key)) { TranslationHelper.RegisterRedirectedResourceTextToPath(key, calculatedModificationPath); if (AutoTranslatorSettings.IsDumpingRedirectedResourcesEnabled) { cache.AddTranslationToCache(key, value); } } } return(false); }
/// <summary> /// Caches forward and reverse translation of assets as they're loaded, but does not apply them. /// to avoid breaking code that relies on original names being present. /// </summary> protected override bool ReplaceOrUpdateAsset(string calculatedModificationPath, ref MapInfo asset, IAssetOrResourceLoadedContext context) { var result = false; var start = Time.realtimeSinceStartup; try { // updating the MapInfo assets directly breaks places that are doing lookups by mapName // instead of id, so we just register this as a place to lookup MapInfo translations and // return true so it appears handled Hooks.Init(); // register new translations with helper without replacing var cache = GetTranslationCache(calculatedModificationPath, asset, context); if (cache.IsEmpty) { return(result = true); } var shouldTrack = IsTranslationRegistrationAllowed(calculatedModificationPath); // register with helper or dump without translating here foreach (var key in asset.param .Select(entry => TextResourceHelper.GetSpecializedKey(entry, GetMapName(entry))) .Where(k => !string.IsNullOrEmpty(k))) { if (cache.TryGetTranslation(key, true, out var translated)) { if (string.IsNullOrEmpty(translated)) { continue; } _mapLookup[key] = translated; _reverseMapLookup[translated] = key; if (shouldTrack) { TrackReplacement(calculatedModificationPath, key, translated); } TranslationHelper.RegisterRedirectedResourceTextToPath(translated, calculatedModificationPath); } else if (AutoTranslatorSettings.IsDumpingRedirectedResourcesEnabled && !string.IsNullOrEmpty(key) && LanguageHelper.IsTranslatable(key)) { cache.AddTranslationToCache(key, key); } } GameSpecificReplaceOrUpdateAsset(calculatedModificationPath, ref asset, context, cache, shouldTrack); return(result = true); } finally { Logger.DebugLogDebug("{0}.{1}: {2} => {3} ({4} seconds)", GetType(), nameof(ReplaceOrUpdateAsset), calculatedModificationPath, result, Time.realtimeSinceStartup - start); } }
protected virtual bool DefaultDumpParam(SimpleTextTranslationCache cache, TParam param, string value) { var key = TextResourceHelper.GetSpecializedKey(param, value); if (string.IsNullOrEmpty(key) || !LanguageHelper.IsTranslatable(value)) { return(false); } cache.AddTranslationToCache(key, string.Empty); return(true); }
public override bool DumpParam(SimpleTextTranslationCache cache, EventInfo.Param param) { var key = TextResourceHelper.GetSpecializedKey(param, param.Name); var value = !string.IsNullOrEmpty(key) ? key : string.Empty; if (string.IsNullOrEmpty(key) || !LanguageHelper.IsTranslatable(key)) { return(false); } cache.AddTranslationToCache(key, value); return(true); }
/// <summary> /// Caches forward and reverse translation of assets as they're loaded, but does not apply them. /// to avoid breaking code that relies on original names being present. /// </summary> protected override bool ReplaceOrUpdateAsset(string calculatedModificationPath, ref MapInfo asset, IAssetOrResourceLoadedContext context) { // updating the MapInfo assets directly breaks places that are doing lookups by mapName // instead of id, so we just register this as a place to lookup MapInfo translations and // return true so it appears handled Hooks.Init(); // register new translations with helper without replacing var defaultTranslationFile = Path.Combine(calculatedModificationPath, "translation.txt"); var redirectedResources = RedirectedDirectory.GetFilesInDirectory(calculatedModificationPath, ".txt"); var streams = redirectedResources.Select(x => x.OpenStream()); var cache = new SimpleTextTranslationCache( defaultTranslationFile, streams, false, true); if (cache.IsEmpty) { return(true); } var shouldTrack = IsTranslationRegistrationAllowed(calculatedModificationPath); // register with helper or dump without translating here foreach (var key in asset.param .Select(entry => TextResourceHelper.GetSpecializedKey(entry, GetMapName(entry))) .Where(k => !string.IsNullOrEmpty(k))) { if (cache.TryGetTranslation(key, true, out var translated)) { if (string.IsNullOrEmpty(translated)) { continue; } _mapLookup[key] = translated; _reverseMapLookup[translated] = key; if (shouldTrack) { TrackReplacement(calculatedModificationPath, key, translated); } TranslationHelper.RegisterRedirectedResourceTextToPath(translated, calculatedModificationPath); } else if (AutoTranslatorSettings.IsDumpingRedirectedResourcesEnabled && !string.IsNullOrEmpty(key) && LanguageHelper.IsTranslatable(key)) { cache.AddTranslationToCache(key, key); } } return(true); }
public override bool DumpParam(SimpleTextTranslationCache cache, TitleSkillName.Param param) { var key = TextResourceHelper.GetSpecializedKey(param, param.name0); if (string.IsNullOrEmpty(key) || !LanguageHelper.IsTranslatable(key)) { return(false); } var value = !string.IsNullOrEmpty(param.name1) ? param.name1 : key; cache.AddTranslationToCache(key, value); return(true); }
protected override bool DumpAsset(string calculatedModificationPath, NickName asset, IAssetOrResourceLoadedContext context) { var cache = GetDumpCache(calculatedModificationPath, asset, context); foreach (var entry in asset.param) { var key = TextResourceHelper.GetSpecializedKey(entry, entry.Name); if (!string.IsNullOrEmpty(key) && LanguageHelper.IsTranslatable(key)) { cache.AddTranslationToCache(key, entry.Name); } } return(true); }
protected override bool DumpAsset(string calculatedModificationPath, MapInfo asset, IAssetOrResourceLoadedContext context) { var cache = GetDumpCache(calculatedModificationPath, asset, context); var result = false; foreach (var entry in asset.param) { var key = TextResourceHelper.GetSpecializedKey(entry, GetMapName(entry)); if (string.IsNullOrEmpty(key) || !LanguageHelper.IsTranslatable(key)) { continue; } cache.AddTranslationToCache(key, GetMapNameTranslation(entry)); result = true; } return(result); }
protected override bool DumpAsset(string calculatedModificationPath, NickName asset, IAssetOrResourceLoadedContext context) { var defaultTranslationFile = Path.Combine(calculatedModificationPath, "translation.txt"); var cache = new SimpleTextTranslationCache( defaultTranslationFile, false); foreach (var entry in asset.param) { if (!entry.isSpecial) { continue; } var key = TextResourceHelper.GetSpecializedKey(entry, entry.Name); if (!string.IsNullOrEmpty(key) && LanguageHelper.IsTranslatable(key)) { cache.AddTranslationToCache(key, entry.Name); } } return(true); }
protected override bool DumpAsset(string calculatedModificationPath, ScenarioData asset, IAssetOrResourceLoadedContext context) { var defaultTranslationFile = Path.Combine(calculatedModificationPath, "translation.txt"); var cache = new SimpleTextTranslationCache( defaultTranslationFile, false); foreach (var param in asset.list) { if (!TextResourceHelper.IsSupportedCommand(param.Command)) { continue; } if (param.Command == Command.Text) { foreach (var key in param.Args) { if (!string.IsNullOrEmpty(key) && !TextResourceHelper.TextKeysBlacklist.Contains(key) && LanguageHelper.IsTranslatable(key)) { cache.AddTranslationToCache(key, key); } } } else if (param.Command == Command.Calc) { if (param.Args.Length >= 3 && TextResourceHelper.CalcKeys.Contains(param.Args[0])) { cache.AddTranslationToCache(param.Args[2], param.Args[2]); } } else if (param.Command == Command.Format) { if (param.Args.Length >= 2 && TextResourceHelper.FormatKeys.Contains(param.Args[0])) { cache.AddTranslationToCache(param.Args[1], param.Args[1]); } } else if (param.Command == Command.Choice) { for (var i = 0; i < param.Args.Length; i++) { var key = TextResourceHelper.GetSpecializedKey(param, i, out var value); if (!key.IsNullOrEmpty()) { cache.AddTranslationToCache(key, value); } } } #if false else if (param.Command == ADV.Command.Switch) { for (int i = 1; i < param.Args.Length; i += 1) { cache.AddTokenTranslationToCache(param.Args[i], param.Args[i]); } } #endif #if false else if (param.Command == ADV.Command.InfoText) { for (int i = 1; i < param.Args.Length; i += 1) { cache.AddTokenTranslationToCache(param.Args[i], param.Args[i]); } } #endif #if false else if (param.Command == ADV.Command.Jump) { // TODO: detect if should be dumped if (param.Args.Length >= 1) { cache.AddTokenTranslationToCache(param.Args[0], param.Args[0]); } } #endif } return(true); }
/// <inheritdoc /> /// <remarks>Always returns <c>true</c> to signal nothing else should handle these.</remarks> protected override bool ReplaceOrUpdateAsset(string calculatedModificationPath, ref NickName asset, IAssetOrResourceLoadedContext context) { // updating the NickName assets directly causes issues, but after SaveData.LoadNickNameParam() they // are safe to manipulate InitHooks(); var defaultTranslationFile = Path.Combine(calculatedModificationPath, "translation.txt"); var redirectedResources = RedirectedDirectory.GetFilesInDirectory(calculatedModificationPath, ".txt"); var streams = redirectedResources.Select(x => x.OpenStream()); var cache = new SimpleTextTranslationCache( defaultTranslationFile, streams, false, true); if (cache.IsEmpty) { return(true); } var replacementKey = calculatedModificationPath .Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) .LastOrDefault(); // don't touch "player" entry if (string.IsNullOrEmpty(replacementKey) || replacementKey.Equals("player", StringComparison.OrdinalIgnoreCase)) { return(true); } if (!_replacements.TryGetValue(replacementKey, out var replacements)) { _replacements[replacementKey] = replacements = new Dictionary <string, string>(); } foreach (var entry in asset.param) { if (!entry.isSpecial) { continue; } var key = TextResourceHelper.GetSpecializedKey(entry, entry.Name); if (string.IsNullOrEmpty(key)) { continue; } if (cache.TryGetTranslation(key, true, out var translated)) { replacements[key] = translated; TranslationHelper.RegisterRedirectedResourceTextToPath(translated, calculatedModificationPath); } else if (AutoTranslatorSettings.IsDumpingRedirectedResourcesEnabled && LanguageHelper.IsTranslatable(key)) { cache.AddTranslationToCache(key, entry.Name); } } return(true); }
/// <inheritdoc /> /// <remarks>Always returns <c>true</c> to signal nothing else should handle these.</remarks> protected override bool ReplaceOrUpdateAsset(string calculatedModificationPath, ref NickName asset, IAssetOrResourceLoadedContext context) { var result = false; var start = UnityEngine.Time.realtimeSinceStartup; try { // updating the NickName assets directly causes issues, save off a lookup table. var cache = GetTranslationCache(calculatedModificationPath, asset, context); if (cache.IsEmpty) { return(false); } var personalityKey = calculatedModificationPath .Split(Path.DirectorySeparatorChar, Path.AltDirectorySeparatorChar) .LastOrDefault(); if (string.IsNullOrEmpty(personalityKey)) { return(false); } var replacements = _replacements.GetOrInit(personalityKey); foreach (var entry in asset.param) { // nicknames should not fall back on undecorated keys, so don't loop var key = TextResourceHelper.GetSpecializedKey(entry, entry.Name); if (string.IsNullOrEmpty(key)) { continue; } if (cache.TryGetTranslation(key, true, out var translated)) { replacements[key] = translated; result = true; // use entry.Name here to avoid tracking with key // Scope 15 for the class nickname editor TrackReplacement(calculatedModificationPath, entry.Name, translated, 15, -1); TranslationHelper.RegisterRedirectedResourceTextToPath(translated, calculatedModificationPath); Logger.DebugLogDebug("{0}.{1}: {2}: {3} => {4}", GetType().FullName, nameof(ReplaceOrUpdateAsset), personalityKey, key, translated); } else if (AutoTranslatorSettings.IsDumpingRedirectedResourcesEnabled && LanguageHelper.IsTranslatable(key)) { cache.AddTranslationToCache(key, entry.Name); } } return(result); } finally { Logger.DebugLogDebug("{0}.{1}: {2} => {3} (4 seconds)", GetType().Name, nameof(ReplaceOrUpdateAsset), calculatedModificationPath, result, Time.realtimeSinceStartup - start); } }