コード例 #1
0
        public ITranslation Translate(string stringToTranslate, ILanguage destLanguage, ILanguage sourceLanguage = null)
        {
            if (string.IsNullOrEmpty(stringToTranslate))
            {
                throw new ArgumentNullException("stringToTranslate");
            }

            if (sourceLanguage == null)
            {
                sourceLanguage = this.DetectLanguage(stringToTranslate);
            }

            ITranslation translation = BingLocanTranslator.GetTranslationFromCache(stringToTranslate, sourceLanguage, destLanguage);

            if (translation == null)
            {
                string translationResult = null;
                using (BingTranslatorService.SoapService client = new BingTranslatorService.SoapService()) {
                    translationResult = client.Translate(
                        this.ApiKey,
                        stringToTranslate,
                        sourceLanguage.Language,
                        destLanguage.Language,
                        this.TranslateOptions.ContentType,
                        this.TranslateOptions.Category);
                }

                translation = new Translation(sourceLanguage, destLanguage, stringToTranslate, translationResult);
            }

            return(translation);
        }
コード例 #2
0
        private static ITranslation GetTranslationFromCache(string stringToTranslate, ILanguage sourceLanguage, ILanguage destLanguage)
        {
            if (string.IsNullOrEmpty(stringToTranslate))
            {
                throw new ArgumentNullException("stringToTranslate");
            }
            if (sourceLanguage == null)
            {
                throw new ArgumentNullException("sourceLanguage");
            }
            if (destLanguage == null)
            {
                throw new ArgumentNullException("destLanguage");
            }

            ITranslation translation          = null;
            ITranslation translationFromCache = null;

            BingLocanTranslator.translationCache.TryGetValue(
                BingLocanTranslator.GetCacheKeyFor(stringToTranslate, sourceLanguage, destLanguage),
                out translationFromCache);

            if (translationFromCache != null)
            {
                // double check the values because there may have been a collision on the hash code
                if (stringToTranslate.Equals(translationFromCache.StringToTranslate) &&
                    sourceLanguage.Equals(translationFromCache.SourceLanguage) &&
                    destLanguage.Equals(translationFromCache.DestLanguage))
                {
                    translation = translationFromCache;
                }
            }

            return(translation);
        }
コード例 #3
0
        public ActionResult Save(string isoCode, Guid fileId)
        {
            var dal = new LocanDal();
            var apiKey = dal.GetUserByFileId(fileId).ApiKey;
            ILocanTranslator bingTranslator = new BingLocanTranslator(apiKey);
            Language language = Language.GetLanguages(apiKey).SingleOrDefault(l => l.IsoCode.Equals(isoCode, StringComparison.OrdinalIgnoreCase));

            var phrases = dal.GetPhrases(p => p.FileId == fileId).ToList();
            IDictionary<string, string> result = new Dictionary<string, string>();

            foreach (string key in Request.Form)
            {
                var phrase = phrases.SingleOrDefault(p => p.TranslateKey == key);
                if (phrase != null)
                {
                    result.Add(phrase.StringToTranslate, Request.Form[key]);
                }
            }

            ILanguage sourceLanguage = bingTranslator.DetectLanguage(phrases.First().StringToTranslate);
            ILanguage destLanguage = new Locan.Translate.BaseLanguage(isoCode);

            bingTranslator.AddCustomTranslations(sourceLanguage, destLanguage, result);

            return View("Done");
        }
コード例 #4
0
        private static void AddTranslationToCache(ITranslation translation)
        {
            int hashCode = BingLocanTranslator.GetCacheKeyFor(translation);

            lock (BingLocanTranslator.translationCacheLock) {
                BingLocanTranslator.translationCache[hashCode] = translation;
            }
        }
コード例 #5
0
ファイル: Language.cs プロジェクト: sayedihashimi/locan
        public static IEnumerable<Language> GetLanguages(string apiKey)
        {
            BingLocanTranslator bingTranslator = new BingLocanTranslator(apiKey);
            var result = bingTranslator.GetSupportedLanguages()
                .Select(l => l.Language.Replace("zh-CHT", "zh"))
                .Where(l => l != "ht" && l != "zh-CHS");

            return result.Select(l => new Language() { IsoCode = l, Emails = new string[0] }).OrderBy(l => l.Culture.EnglishName);
        }
コード例 #6
0
        private static IEnumerable<TranslationItem> Convert(IEnumerable<Phrase> phrases, string apiKey, string isoCode)
        {
            BingLocanTranslator bingTranslator = new BingLocanTranslator(apiKey);
            var result = bingTranslator.TranslateSync(phrases.Select(p => p.StringToTranslate), new BaseLanguage(isoCode));

            for (int i = 0; i < phrases.Count(); i++)
            {
                Phrase phrase = phrases.ElementAt(i);
                string translation = result[i].TranslatedText;

                yield return new TranslationItem()
                {
                    ID = phrase.TranslateKey,
                    ValueFrom = phrase.StringToTranslate,
                    ValueTo = translation,
                    Comment = phrase.Comment
                };
            }
        }
コード例 #7
0
        internal void Translate(string apiKey, Project project, ProjectItem selectedItem, EnvDTE80.DTE2 dte)
        {
            if (string.IsNullOrWhiteSpace(apiKey)) { throw new ArgumentNullException("apiKey"); }
            if (project == null) { throw new ArgumentNullException("project"); }
            if (selectedItem == null) { throw new ArgumentNullException("selectedItem"); }
            if (dte == null) { throw new ArgumentNullException("dte"); }

            // get the file path which should be translated
            string filePath = selectedItem.Properties.Item("FullPath").Value.ToString();

            dte.StatusBar.Animate(true, vsStatusAnimation.vsStatusAnimationGeneral);

            ILocanTranslator bingTranslator = new BingLocanTranslator(apiKey);
            IList<ILocanRow> rowsToTranslate = this.ReadResxFileForTranslation(filePath);

            var stringsToTranslate = from r in rowsToTranslate
                                     select r.StringToTranslate;

            IList<ILanguage> languages = bingTranslator.GetSupportedLanguages().ToList();

            int currentLanguageIndex = 1;
            int totalCountOfLanguages = languages.Count;
            ILanguage sourceLanguage = bingTranslator.DetectLanguage(stringsToTranslate.First());
            foreach (ILanguage destLang in languages) {
                if (this.PreserveUpdates) {
                    // TODO: Look to see if there is an existing file at {Filename}.{language}.resx.cache
                    this.SendTranslationUpdatesToBing(filePath, rowsToTranslate, sourceLanguage, destLang, bingTranslator);
                }

                ProjectItem addedResxProjectItem = null;
                bingTranslator
                    .Translate(stringsToTranslate, destLang, sourceLanguage)
                    .OnTranslationComplete((payload, translations) => {
                        string destFile = this.GetDestFilename(filePath, payload.DestLanguage);
                        this.UpdateProgressBar(destFile, currentLanguageIndex++, totalCountOfLanguages, dte);
                        using (ILocanWriter writer = LocanReaderWriterFactory.Instance.GetWriter(new { filepath = destFile })) {
                            // it is not reliable to use any variables declared outside of this scope
                            // because this is happening async the loop may change the values outside of this scope
                            int currentIndex = 0;
                            foreach (ITranslation translation in translations) {
                                // get source row
                                ILocanRow sourceRow = rowsToTranslate[currentIndex];
                                ILocanRow translatedRow = new LocanRow(id: sourceRow.Id, translatedString: translation.TrnaslatedString);
                                writer.WriteRow(translatedRow);

                                // addedResxProjectItem = this.AddFileToProject(selectedItem, destFile);
                                addedResxProjectItem = this.AddFileToProjectAsChild(selectedItem, destFile);
                                currentIndex++;
                            }
                        }

                        if (this.PreserveUpdates) {
                            // now copy this file to the cache location so that we can compute difference next time.
                            string cacheFile = this.GetDestCacheFilename(filePath, payload.DestLanguage);
                            File.Copy(destFile, cacheFile, true);
                            this.AddFileToProjectAsChild(addedResxProjectItem, cacheFile);
                        }
                    });
            }
        }