public void Associate(UntranslatedText key, object ui, InternalTranslationResult translationResult, ParserTranslationContext context, bool saveResultGlobally) { // if just one of the things associated with this job, wants to save it, we shall! SaveResultGlobally = SaveResultGlobally || saveResultGlobally; if (context != null) { Contexts.Add(context); context.Jobs.Add(this); TranslationType |= TranslationType.Token; } else { if (ui != null && !ui.IsSpammingComponent()) { Components.Add(new KeyAnd <object>(key, ui)); } if (translationResult != null) { TranslationResults.Add(new KeyAnd <InternalTranslationResult>(key, translationResult)); } TranslationType |= TranslationType.Full; } }
public TranslationJob(TranslationEndpointManager endpoint, UntranslatedText key, bool saveResult) { Endpoint = endpoint; Key = key; SaveResultGlobally = saveResult; Components = new List <object>(); Contexts = new HashSet <ParserTranslationContext>(); TranslationResults = new HashSet <TranslationResult>(); }
public TranslationJob(TranslationEndpointManager endpoint, UntranslatedText key, bool saveResult, bool isTranslatable) { Endpoint = endpoint; Key = key; SaveResultGlobally = saveResult; IsTranslatable = isTranslatable; Components = new List <KeyAnd <object> >(); Contexts = new HashSet <ParserTranslationContext>(); TranslationResults = new HashSet <KeyAnd <InternalTranslationResult> >(); }
private void LoadTranslationsInFile(string fullFileName) { if (File.Exists(fullFileName)) { XuaLogger.Current.Debug($"Loading texts: {fullFileName}."); string[] translations = File.ReadAllLines(fullFileName, Encoding.UTF8); foreach (string translation in translations) { for (int i = 0; i < TranslationSplitters.Length; i++) { var splitter = TranslationSplitters[i]; string[] kvp = translation.Split(splitter, StringSplitOptions.None); if (kvp.Length == 2) { string key = TextHelper.Decode(kvp[0]); string value = TextHelper.Decode(kvp[1]); if (!string.IsNullOrEmpty(key) && !string.IsNullOrEmpty(value) && IsTranslatable(key)) { if (key.StartsWith("r:")) { try { var regex = new RegexTranslation(key, value); AddTranslationRegex(regex); } catch (Exception e) { XuaLogger.Current.Warn(e, $"An error occurred while constructing regex translation: '{translation}'."); } } else { AddTranslation(key, value); // also add a modified version of the translation var ukey = new UntranslatedText(key, false, false); var uvalue = new UntranslatedText(value, false, false); if (ukey.TrimmedTranslatableText != key) { AddTranslation(ukey.TrimmedTranslatableText, uvalue.TrimmedTranslatableText); } } break; } } } } } }
private static void AssociateTextKeyWithFile(UntranslatedText key, string virtualFilePath) { AssociateTextWithFile(key.TemplatedOriginal_Text, virtualFilePath); if (!ReferenceEquals(key.TemplatedOriginal_Text, key.TemplatedOriginal_Text_ExternallyTrimmed)) { AssociateTextWithFile(key.TemplatedOriginal_Text_ExternallyTrimmed, virtualFilePath); } if (!ReferenceEquals(key.TemplatedOriginal_Text, key.TemplatedOriginal_Text_InternallyTrimmed)) { AssociateTextWithFile(key.TemplatedOriginal_Text_InternallyTrimmed, virtualFilePath); } if (!ReferenceEquals(key.TemplatedOriginal_Text_InternallyTrimmed, key.TemplatedOriginal_Text_FullyTrimmed)) { AssociateTextWithFile(key.TemplatedOriginal_Text_FullyTrimmed, virtualFilePath); } }
internal void AddTranslationToCache(string key, string value, bool persistToDisk = true) { if (!HasTranslated(key)) { AddTranslation(key, value); // also add a trimmed version of the translation var ukey = new UntranslatedText(key, false, false); var uvalue = new UntranslatedText(value, false, false); if (ukey.TrimmedTranslatableText != key && !HasTranslated(ukey.TrimmedTranslatableText)) { AddTranslation(ukey.TrimmedTranslatableText, uvalue.TrimmedTranslatableText); } if (persistToDisk) { QueueNewTranslationForDisk(key, value); } } }
/// <summary> /// Attempts to resolve a translation for the specified string. /// </summary> /// <param name="untranslatedText"></param> /// <param name="allowRegex"></param> /// <param name="value"></param> /// <returns></returns> public bool TryGetTranslation(string untranslatedText, bool allowRegex, out string value) { var key = new UntranslatedText(untranslatedText, false, true, Settings.FromLanguageUsesWhitespaceBetweenWords, false); bool result; string untemplated; string unmodifiedValue; string unmodifiedKey; string untemplated_TemplatedOriginal_Text = null; string untemplated_TemplatedOriginal_Text_InternallyTrimmed = null; string untemplated_TemplatedOriginal_Text_ExternallyTrimmed = null; string untemplated_TemplatedOriginal_Text_FullyTrimmed = null; lock ( _translations ) { // lookup UNTEMPLATED translations - ALL VARIATIONS if (key.IsTemplated && !key.IsFromSpammingComponent) { // key.TemplatedOriginal_Text = ' What are you \ndoing here, {{A}}?' // untemplated = ' What are you \ndoing here, Sophie?' // THEN: Check unscoped translations // lookup original untemplated = untemplated_TemplatedOriginal_Text ?? (untemplated_TemplatedOriginal_Text = key.Untemplate(key.TemplatedOriginal_Text)); result = _translations.TryGetValue(untemplated, out value); if (result) { return(result); } // lookup original minus external whitespace if (!ReferenceEquals(key.TemplatedOriginal_Text, key.TemplatedOriginal_Text_ExternallyTrimmed)) { // key.TemplatedOriginal_Text_ExternallyTrimmed = 'What are you \ndoing here, {{A}}?' // untemplated = 'What are you \ndoing here, Sophie?' untemplated = untemplated_TemplatedOriginal_Text_ExternallyTrimmed ?? (untemplated_TemplatedOriginal_Text_ExternallyTrimmed = key.Untemplate(key.TemplatedOriginal_Text_ExternallyTrimmed)); result = _translations.TryGetValue(untemplated, out value); if (result) { // WHITESPACE DIFFERENCE, Store new value unmodifiedValue = key.LeadingWhitespace + value + key.TrailingWhitespace; unmodifiedKey = untemplated_TemplatedOriginal_Text ?? (untemplated_TemplatedOriginal_Text = key.Untemplate(key.TemplatedOriginal_Text)); value = unmodifiedValue; return(result); } } // lookup internally trimmed if (!ReferenceEquals(key.TemplatedOriginal_Text, key.TemplatedOriginal_Text_InternallyTrimmed)) { // key.TemplatedOriginal_Text_InternallyTrimmed = ' What are you doing here, {{A}}?' // untemplated = ' What are you doing here, Sophie?' untemplated = untemplated_TemplatedOriginal_Text_InternallyTrimmed ?? (untemplated_TemplatedOriginal_Text_InternallyTrimmed = key.Untemplate(key.TemplatedOriginal_Text_InternallyTrimmed)); result = _translations.TryGetValue(untemplated, out value); if (result) { // WHITESPACE DIFFERENCE, Store new value unmodifiedValue = value; unmodifiedKey = untemplated_TemplatedOriginal_Text ?? (untemplated_TemplatedOriginal_Text = key.Untemplate(key.TemplatedOriginal_Text)); value = unmodifiedValue; return(result); } } // lookup internally trimmed minus external whitespace if (!ReferenceEquals(key.TemplatedOriginal_Text_InternallyTrimmed, key.TemplatedOriginal_Text_FullyTrimmed)) { // key.TemplatedOriginal_Text_FullyTrimmed = 'What are you doing here, {{A}}?' // untemplated = 'What are you doing here, Sophie?' untemplated = untemplated_TemplatedOriginal_Text_FullyTrimmed ?? (untemplated_TemplatedOriginal_Text_FullyTrimmed = key.Untemplate(key.TemplatedOriginal_Text_FullyTrimmed)); result = _translations.TryGetValue(untemplated, out value); if (result) { // WHITESPACE DIFFERENCE, Store new value unmodifiedValue = key.LeadingWhitespace + value + key.TrailingWhitespace; unmodifiedKey = untemplated_TemplatedOriginal_Text ?? (untemplated_TemplatedOriginal_Text = key.Untemplate(key.TemplatedOriginal_Text)); value = unmodifiedValue; return(result); } } } // THEN: Check unscoped translations // key.TemplatedOriginal_Text = ' What are you \ndoing here, {{A}}?' result = _translations.TryGetValue(key.TemplatedOriginal_Text, out value); if (result) { return(result); } // lookup original minus external whitespace if (!ReferenceEquals(key.TemplatedOriginal_Text, key.TemplatedOriginal_Text_ExternallyTrimmed)) { // key.TemplatedOriginal_Text_ExternallyTrimmed = 'What are you \ndoing here, {{A}}?' result = _translations.TryGetValue(key.TemplatedOriginal_Text_ExternallyTrimmed, out value); if (result) { // WHITESPACE DIFFERENCE, Store new value unmodifiedValue = key.LeadingWhitespace + value + key.TrailingWhitespace; value = unmodifiedValue; return(result); } } // lookup internally trimmed if (!ReferenceEquals(key.TemplatedOriginal_Text, key.TemplatedOriginal_Text_InternallyTrimmed)) { // key.TemplatedOriginal_Text_InternallyTrimmed = ' What are you doing here, {{A}}?' result = _translations.TryGetValue(key.TemplatedOriginal_Text_InternallyTrimmed, out value); if (result) { return(result); } } // lookup internally trimmed minus external whitespace if (!ReferenceEquals(key.TemplatedOriginal_Text_InternallyTrimmed, key.TemplatedOriginal_Text_FullyTrimmed)) { // key.TemplatedOriginal_Text_FullyTrimmed = 'What are you doing here, {{A}}?' result = _translations.TryGetValue(key.TemplatedOriginal_Text_FullyTrimmed, out value); if (result) { // WHITESPACE DIFFERENCE, Store new value unmodifiedValue = key.LeadingWhitespace + value + key.TrailingWhitespace; value = unmodifiedValue; return(result); } } // regex lookups - ONLY ORIGNAL VARIATION if (allowRegex) { for (int i = _defaultRegexes.Count - 1; i > -1; i--) { var regex = _defaultRegexes[i]; try { var match = regex.CompiledRegex.Match(key.TemplatedOriginal_Text); if (!match.Success) { continue; } value = regex.CompiledRegex.Replace(key.TemplatedOriginal_Text, regex.Translation).MakeRedirected(); return(true); } catch (Exception e) { _defaultRegexes.RemoveAt(i); XuaLogger.AutoTranslator.Error(e, $"Failed while attempting to replace or match text of regex '{regex.Original}'. Removing that regex from the cache."); } } } } return(result); }
public KeyAnd(UntranslatedText key, T item) { Key = key; Item = item; }
public bool TryGetTranslation(UntranslatedText key, bool allowRegex, bool allowToken, int scope, out string value) { return(_first.TryGetTranslation(key, allowRegex, allowToken, scope, out value) || (_first.AllowFallback && _second.TryGetTranslation(key, allowRegex, allowToken, scope, out value))); }
internal bool TryGetTranslation(UntranslatedText key, bool allowRegex, out string value) { var unmodifiedKey = key.TranslatableText; var result = _translations.TryGetValue(unmodifiedKey, out value); if (result) { return(result); } var modifiedKey = key.TrimmedTranslatableText; if (modifiedKey != unmodifiedKey) { result = _translations.TryGetValue(modifiedKey, out value); if (result) { // add an unmodifiedKey to the dictionary var unmodifiedValue = key.LeadingWhitespace + value + key.TrailingWhitespace; XuaLogger.Current.Info($"Whitespace difference: '{key.TrimmedTranslatableText}' => '{value}'"); AddTranslationToCache(unmodifiedKey, unmodifiedValue, Settings.CacheWhitespaceDifferences); value = unmodifiedValue; return(result); } } if (allowRegex) { bool found = false; for (int i = _defaultRegexes.Count - 1; i > -1; i--) { var regex = _defaultRegexes[i]; try { var match = regex.CompiledRegex.Match(unmodifiedKey); if (!match.Success) { continue; } var translation = regex.CompiledRegex.Replace(unmodifiedKey, regex.Translation); AddTranslationToCache(unmodifiedKey, translation, Settings.CacheRegexLookups); // Would store it to file... Should we???? value = translation; found = true; XuaLogger.Current.Info($"Regex lookup: '{key.TrimmedTranslatableText}' => '{value}'"); break; } catch (Exception e) { _defaultRegexes.RemoveAt(i); XuaLogger.Current.Error(e, $"Failed while attempting to replace or match text of regex '{regex.Original}'. Removing that regex from the cache."); } } if (found) { return(true); } } if (_staticTranslations.Count > 0) { if (_staticTranslations.TryGetValue(unmodifiedKey, out value)) { AddTranslationToCache(unmodifiedKey, value); return(true); } else if (_staticTranslations.TryGetValue(modifiedKey, out value)) { var unmodifiedValue = key.LeadingWhitespace + value + key.TrailingWhitespace; AddTranslationToCache(unmodifiedKey, unmodifiedValue); value = unmodifiedValue; return(true); } } return(result); }