protected override async Task Translate(ITranslationSession translationSession) { var authenticationKey = AuthenticationKey; if (string.IsNullOrEmpty(authenticationKey)) { translationSession.AddMessage("Azure Translator requires subscription secret."); return; } var token = await AzureAuthentication.GetBearerAccessTokenAsync(authenticationKey, translationSession.CancellationToken).ConfigureAwait(false); using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("Authorization", token); var throttle = new Throttle(MaxCharactersPerMinute, translationSession.CancellationToken); var itemsByLanguage = translationSession.Items.GroupBy(item => item.TargetCulture); foreach (var languageGroup in itemsByLanguage) { var cultureKey = languageGroup.Key; var targetLanguage = cultureKey.Culture ?? translationSession.NeutralResourcesLanguage; var itemsByTextType = languageGroup.GroupBy(GetTextType); foreach (var textTypeGroup in itemsByTextType) { var textType = textTypeGroup.Key; foreach (var sourceItems in SplitIntoChunks(translationSession, textTypeGroup)) { if (!sourceItems.Any()) { break; } var sourceStrings = sourceItems .Select(item => item.Source) .Select(RemoveKeyboardShortcutIndicators) .ToList(); await throttle.Tick(sourceItems); if (translationSession.IsCanceled) { return; } var uri = new Uri($"https://api.cognitive.microsofttranslator.com/translate?api-version=3.0&from={translationSession.SourceLanguage.IetfLanguageTag}&to={targetLanguage.IetfLanguageTag}&textType={textType}"); var response = await client.PostAsync(uri, CreateRequestContent(sourceStrings), translationSession.CancellationToken).ConfigureAwait(false); response.EnsureSuccessStatusCode(); var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false); using (var reader = new StreamReader(stream, Encoding.UTF8)) { var translations = JsonConvert.DeserializeObject <List <AzureTranslationResponse> >(reader.ReadToEnd()); if (translations != null) { await translationSession.MainThread.StartNew(() => ReturnResults(sourceItems, translations)).ConfigureAwait(false); } } } } } } }
public TranslatorHost([ImportMany] ITranslator[] translators) { Contract.Requires(translators != null); _changeThrottle = new Throttle(TimeSpan.FromSeconds(1), SaveConfiguration); _translators = translators; _translators.ForEach(translator => translator.PropertyChanged += (_, __) => _changeThrottle.Tick()); var settings = Settings.Default; var configuration = settings.Configuration; if (string.IsNullOrEmpty(configuration)) { return; } try { var values = JsonConvert.DeserializeObject <Dictionary <string, string> >(configuration); Contract.Assume(values != null); foreach (var translator in _translators) { Contract.Assume(translator != null); string setting; if (!values.TryGetValue(translator.Id, out setting)) { continue; } if (string.IsNullOrEmpty(setting)) { continue; } try { JsonConvert.PopulateObject(setting, translator); } catch // Newtonsoft.Jason has not documented any exceptions... { } } } catch // Newtonsoft.Jason has not documented any exceptions... { } }