/// <summary>
 /// Open a translation
 /// </summary>
 public async Task<TranslationEditorViewModel> OpenTranslationAsync(TranslationFileViewModel file)
 {
     if (file == null) return null;
     TranslationEditorViewModel trans = Editors.FirstOrDefault(e => e.File == file);
     if (trans == null)
     {
         if (Loading) return null;
         Loading = true;
         try
         {
             trans = new TranslationEditorViewModel(file);
             Editors.Add(trans);
             await trans.LoadAsync();
         }
         finally
         {
             Loading = false;
         }
     }
     CurrentEditor = trans;
     return trans;
 }
 /// <summary>
 /// Close an editor
 /// </summary>
 public async Task<bool> CloseEditorAsync(TranslationEditorViewModel editor)
 {
     var idx = Editors.IndexOf(editor);
     if (idx < 0) return false;
     if (editor.IsDirty)
     {
         var res = await _AppService.ConfirmYesNoCancelAsync(
             Locales.SR.CloseEditor_ConfirmSaveModifications_Message,
             Locales.SR.CloseEditor_ConfirmSaveModifications_Title
             );
         if (!res.HasValue) return false;
         if (res == true)
         {
             await editor.SaveAsync();
         }
     }
     Editors.Remove(editor);
     idx = Math.Min(idx, Editors.Count - 1);
     CurrentEditor = idx >= 0 ? Editors[idx] : null;
     return true;
 }
 /// <summary>
 /// Create a new model
 /// </summary>
 public TranslationViewModel(TranslationEditorViewModel editor, Model.TranslationContentValue value)
 {
     this.Editor = editor;
     this.ContentValue = value;
 }