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> >();
        }
Esempio n. 4
0
        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;
                            }
                        }
                    }
                }
            }
        }
Esempio n. 5
0
 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);
     }
 }
Esempio n. 6
0
        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)));
 }
Esempio n. 10
0
        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);
        }