예제 #1
0
 public IEnumerable<ILocanRow> GetRowsTranslated()
 {
     this.ResxReader = new ResXResourceReader(this.Filepath);
     foreach (DictionaryEntry entry in this.ResxReader) {
         // conver the entry into an ILocanRow
         ILocanRow row = new LocanRow(Convert.ToString(entry.Key), null, Convert.ToString(entry.Value));
         yield return row;
     }
 }
예제 #2
0
 public IEnumerable <ILocanRow> GetRowsTranslated()
 {
     this.ResxReader = new ResXResourceReader(this.Filepath);
     foreach (DictionaryEntry entry in this.ResxReader)
     {
         // conver the entry into an ILocanRow
         ILocanRow row = new LocanRow(Convert.ToString(entry.Key), null, Convert.ToString(entry.Value));
         yield return(row);
     }
 }
예제 #3
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);
                        }
                    });
            }
        }