AddEntryViewModel.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Collections.ObjectModel;
  4. using System.Linq;
  5. using System.Windows;
  6. using LocalizationTool.Models;
  7. namespace LocalizationTool.ViewModels
  8. {
  9. /// <summary>单个语言的译文输入字段。</summary>
  10. public class EntryField
  11. {
  12. public string LanguageCode { get; set; }
  13. public string Label { get; set; }
  14. public string Value { get; set; }
  15. }
  16. /// <summary>新增词条窗口:中文 key + 各语言译文(可留空 = 缺译)。</summary>
  17. public class AddEntryViewModel : ViewModelBase
  18. {
  19. private string _key;
  20. public string Key
  21. {
  22. get => _key;
  23. set
  24. {
  25. if (Set(ref _key, value)) OnPropertyChanged(nameof(CanConfirm));
  26. }
  27. }
  28. /// <summary>各目标语言译文输入字段。</summary>
  29. public ObservableCollection<EntryField> Fields { get; } = new ObservableCollection<EntryField>();
  30. public bool CanConfirm => !string.IsNullOrWhiteSpace(Key);
  31. public bool HasNoFields => Fields.Count == 0;
  32. /// <summary>请求关闭窗口(true = 确认)。</summary>
  33. public event Action<bool> RequestClose;
  34. public RelayCommand ConfirmCommand { get; }
  35. public RelayCommand CancelCommand { get; }
  36. /// <summary>确认后按语言代码收集的译文(留空的语言不收录)。</summary>
  37. public Dictionary<string, string> CollectTranslations() =>
  38. Fields.Where(f => !string.IsNullOrWhiteSpace(f.Value))
  39. .ToDictionary(f => f.LanguageCode, f => f.Value.Trim());
  40. public AddEntryViewModel(IEnumerable<PackFile> langs)
  41. {
  42. foreach (var lang in langs ?? Enumerable.Empty<PackFile>())
  43. Fields.Add(new EntryField
  44. {
  45. LanguageCode = lang.LanguageCode,
  46. Label = $"{lang.LanguageName} ({lang.LanguageCode}) —— 可留空待翻译",
  47. });
  48. ConfirmCommand = new RelayCommand(() =>
  49. {
  50. if (!CanConfirm)
  51. {
  52. MessageBox.Show("请输入中文原文(key)。", "提示");
  53. return;
  54. }
  55. RequestClose?.Invoke(true);
  56. });
  57. CancelCommand = new RelayCommand(() => RequestClose?.Invoke(false));
  58. }
  59. }
  60. }