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); } }
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); } }
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); }