Example #1
0
        public static async Task <string> Translate(string phraseInDefaultLanguage, ILanguage language)
        {
            if (language == null)
            {
                language = await GetCurrentLanguage();
            }

            var byEvent = await TryTranslateUsingTheEvent(phraseInDefaultLanguage, language);

            if (byEvent.Item1)
            {
                return(byEvent.Item2);
            }

            if (phraseInDefaultLanguage.IsEmpty())
            {
                return(phraseInDefaultLanguage);
            }

            if (language.Equals(await GetDefaultLanguage()))
            {
                return(phraseInDefaultLanguage);
            }
            else
            {
                // First try: Exact match:
                var translation = await GetLocalTranslation(phraseInDefaultLanguage, language);

                if (translation.HasValue())
                {
                    return(translation);
                }

                // special characters aren't translated:
                if (phraseInDefaultLanguage.ToCharArray().None(c => char.IsLetter(c)))
                {
                    return(phraseInDefaultLanguage);
                }

                // Next try: Remove special characters:
                var leftDecorators  = FindLeftDecorators(phraseInDefaultLanguage);
                var rightDecorators = FindRightDecorators(phraseInDefaultLanguage);

                if (leftDecorators.HasValue())
                {
                    phraseInDefaultLanguage = phraseInDefaultLanguage.TrimStart(leftDecorators);
                }

                if (rightDecorators.HasValue())
                {
                    phraseInDefaultLanguage = phraseInDefaultLanguage.TrimEnd(rightDecorators);
                }

                translation = await GetLocalTranslation(phraseInDefaultLanguage, language);

                if (translation.IsEmpty())
                {
                    if (phraseInDefaultLanguage.Length <= GOOGLE_TRANSLATE_LIMIT && AttemptAutomaticTranslation)
                    {
                        translation = await GoogleTranslate(phraseInDefaultLanguage, language.IsoCode);
                    }
                    else
                    {
                        translation = phraseInDefaultLanguage;
                    }

                    if (translation.HasValue())
                    {
                        try
                        {
                            var arg = new TranslationDownloadedEventArgs(phraseInDefaultLanguage, language, translation);
                            await TranslationDownloaded.Raise(arg);
                        }
                        catch { /* No Logging needed*/ }
                    }
                }

                return(leftDecorators + translation.Or(phraseInDefaultLanguage) + rightDecorators);
            }
        }
Example #2
0
        public static string Translate(string phraseInDefaultLanguage, ILanguage language)
        {
            if (language == null)
            {
                language = GetCurrentLanguage();
            }

            if (TranslationRequested != null)
            {
                var args = new TranslationRequestedEventArgs {
                    PhraseInDefaultLanguage = phraseInDefaultLanguage, Language = language
                };

                TranslationRequested?.Invoke(null, args);

                if (args.Cancel)
                {
                    return(phraseInDefaultLanguage);
                }

                if (args.TranslationProvider != null)
                {
                    return(args.TranslationProvider());
                }
            }

            if (phraseInDefaultLanguage.IsEmpty())
            {
                return(phraseInDefaultLanguage);
            }

            if (language.Equals(DefaultLanguage))
            {
                return(phraseInDefaultLanguage);
            }
            else
            {
                // First try: Exact match:
                var translation = GetLocalTranslation(phraseInDefaultLanguage, language);

                if (translation.HasValue())
                {
                    return(translation);
                }

                // special characters aren't translated:
                if (phraseInDefaultLanguage.ToCharArray().None(c => char.IsLetter(c)))
                {
                    return(phraseInDefaultLanguage);
                }

                // Next try: Remove special characters:
                var leftDecorators  = FindLeftDecorators(phraseInDefaultLanguage);
                var rightDecorators = FindRightDecorators(phraseInDefaultLanguage);

                if (leftDecorators.HasValue())
                {
                    phraseInDefaultLanguage = phraseInDefaultLanguage.TrimStart(leftDecorators);
                }

                if (rightDecorators.HasValue())
                {
                    phraseInDefaultLanguage = phraseInDefaultLanguage.TrimEnd(rightDecorators);
                }

                translation = GetLocalTranslation(phraseInDefaultLanguage, language);

                if (translation.IsEmpty())
                {
                    if (phraseInDefaultLanguage.Length <= GOOGLE_TRANSLATE_LIMIT && AttemptAutomaticTranslation)
                    {
                        translation = GoogleTranslate(phraseInDefaultLanguage, language.IsoCode);
                    }
                    else
                    {
                        translation = phraseInDefaultLanguage;
                    }

                    if (translation.HasValue())
                    {
                        try
                        {
                            TranslationDownloaded?.Invoke(phraseInDefaultLanguage, new TranslationDownloadedEventArgs(phraseInDefaultLanguage, language, translation));
                        }
                        catch { }
                    }
                }

                return(leftDecorators + translation.Or(phraseInDefaultLanguage) + rightDecorators);
            }
        }
Example #3
0
        public static async Task <string> Translate(string phraseInDefaultLanguage, ILanguage language)
        {
            if (language == null)
            {
                throw new ArgumentNullException(nameof(language));
            }

            if (phraseInDefaultLanguage.IsEmpty())
            {
                return(phraseInDefaultLanguage);
            }
            if (language.Equals(await Context.Current.DefaultLanguage()))
            {
                return(phraseInDefaultLanguage);
            }

            // Already saved locally?
            var translation = await GetLocalTranslation(phraseInDefaultLanguage, language);

            if (translation.HasValue())
            {
                return(translation);
            }

            // special characters aren't translated:
            if (phraseInDefaultLanguage.ToCharArray().None(c => char.IsLetter(c)))
            {
                return(phraseInDefaultLanguage);
            }

            // Clean up:
            var leftDecorators = FindLeftDecorators(phraseInDefaultLanguage);

            if (leftDecorators.HasValue())
            {
                phraseInDefaultLanguage = phraseInDefaultLanguage.TrimStart(leftDecorators);
            }

            var rightDecorators = FindRightDecorators(phraseInDefaultLanguage);

            if (rightDecorators.HasValue())
            {
                phraseInDefaultLanguage = phraseInDefaultLanguage.TrimEnd(rightDecorators);
            }

            // Try local translations again:
            translation = await GetLocalTranslation(phraseInDefaultLanguage, language);

            if (translation.IsEmpty())
            {
                foreach (var translator in Providers)
                {
                    translation = await translator.Translate(phraseInDefaultLanguage,
                                                             (await Context.Current.DefaultLanguage()).IsoCode, language.IsoCode);

                    if (translation.HasValue())
                    {
                        try
                        {
                            var arg = new TranslationDownloadedEventArgs(phraseInDefaultLanguage, language, translation);
                            await TranslationDownloaded.Raise(arg);
                        }
                        catch { /* No Logging needed*/ }
                        break;
                    }
                }
            }

            return(leftDecorators + translation.Or(phraseInDefaultLanguage) + rightDecorators);
        }