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);
                                }
                            }
                        }
                    }
                }
            }
        }
예제 #2
0
        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...
            {
            }
        }