using Model;
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml.Linq;
namespace AppTranslator
{
public partial class Form1 : Form
{
//хранилище слов
Dictionary store;
public Form1()
{
InitializeComponent();
//если файл существует
if (File.Exists(Properties.Settings.Default.Path))
//извлекаем из него информацию
store = XMLHelper.Load(Properties.Settings.Default.Path);
else //иначе создаем новый объект
store = new Dictionary();
}
//переключение режимов
private void англорусскийToolStripMenuItem_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Mode = Mode.EngRus.ToString();
русскоанглийскийToolStripMenuItem.Checked = false;
англорусскийToolStripMenuItem.Checked = true;
}
private void русскоанглийскийToolStripMenuItem_Click(object sender, EventArgs e)
{
Properties.Settings.Default.Mode = Mode.EngRus.ToString();
англорусскийToolStripMenuItem.Checked = false;
русскоанглийскийToolStripMenuItem.Checked = true;
}
private void загрузкаБДToolStripMenuItem_Click(object sender, EventArgs e)
{
//диалог для открытия файла
var fd = new OpenFileDialog();
//ставим фильтр только на .xml файлы
fd.Filter = "Xml files (.xml)|*.xml";
//если какой-то из файлов был выбран
if (fd.ShowDialog() == DialogResult.OK)
{
//загружаем информацию
store = XMLHelper.Load(fd.FileName);
//сохраняем путь
Properties.Settings.Default.Path = fd.FileName;
}
}
private void добавитьСловоToolStripMenuItem_Click(object sender, EventArgs e)
{
var form = new AddWord();
//открываем диалоговую форму для добавления файла
form.ShowDialog();
foreach (var record in form.Records)
{
//если значение уже есть в словаре добавляем новые переводы
//в соответствующий список
if (store.ContainsKey(record.Word))
foreach (var r in record.Values)
store[record.Word].Values.Add(r);
else
//иначе добавляем новую запись
store.Add(record.Word, record);
}
//сохраняем новую информацию в файл
XMLHelper.Save(store, Properties.Settings.Default.Path);
}
private void button1_Click(object sender, EventArgs e)
{
//получаем слово для перевода
var key = textBox1.Text.Trim().ToLower();
//если слово есть в хранилище выводим все варианты перевода
if (store.ContainsKey(key))
textBox2.Text = string.Join(Environment.NewLine, store[key].Values);
else
{
//проверяем что такое слово не встречается нигде в "вариантах" перевода
var first = store.FirstOrDefault(pair => pair.Value.Values.Contains(key));
if (first.Value != null) //если такое слово есть отображаем его
textBox2.Text = first.Value.Word;
else
MessageBox.Show("Указанное слово отсутствует в словаре");
}
}
}
}
namespace Model
{
//вспомогательный класс для работы с xml
public static class XMLHelper
{
//метод, отвечающие за получение информации из файле
public static Dictionary Load(string path)
{
var xd = XDocument.Load(path);
return
xd.Element("root") //получаем корень
.Elements("word")//возвращаем все элементы с указанным названием
.Select(word => new Record //преобразовываем XElement в тип записи
(
word: (string)word.Attribute("value"),
values: word.Elements("translation").Select(x => (string)x),
mode: (Mode)Enum.Parse(typeof(Mode), (string)word.Attribute("mode"))
))
//создаем словарь для быстрой проверки нахождения слова
.ToDictionary(x => x.Word, val => val);
}
//сохранение инфорации в файл
public static void Save(Dictionary dct, string path)
{
var xd = new XElement("root");
foreach (var val in dct.Values)
{
xd.Add(new XElement("word",
new XAttribute("mode", val.Mode),
new XAttribute("value", val.Word),
val.Values.Select(t => new XElement("translation", t)).ToArray()
));
}
xd.Save(path);
}
}
}
namespace AppTranslator
{
public partial class AddWord : Form
{
//список добавленных слов
public List Records { get; set; }
private Mode mode;
public AddWord()
{
InitializeComponent();
Enum.TryParse(Properties.Settings.Default.Mode, out mode);
Records = new List();
button1.Click += Button1_Click;
button2.Click += Button2_Click;
}
//обработчики событий
private void Button2_Click(object sender, EventArgs e)
{
this.Close();
}
private void Button1_Click(object sender, EventArgs e)
{
//преобразуем слово введенное пользователем к нижнем регистру, а также удаляем начальные и конечные пробельные символы
var word = textBox1.Text.Trim().ToLower();
var values =
textBox2.Text //разбиваем строку из второго текстобокса по символу-разделителю
.Split(new[] { "\n" }, StringSplitOptions.RemoveEmptyEntries)
.Select(x => x.ToLower());//приводим к нижнему регистру
//создаем запись
var record = new Record(word, values, mode);
//добавляем её в список
Records.Add(record);
//очищаем поля для ввода
textBox1.Clear();
textBox2.Clear();
}
}
}
namespace Model
{
//перечисление с возможными режимами
public enum Mode { RusEng, EngRus }
//класс запись, отвечает за одну запись в файл
public class Record
{
//слово
public string Word { get; private set; }
//множество значений для перевода
public HashSet Values { get; private set; }
public Record(string word, IEnumerable values, Mode mode)
{
Word = word;
Values = new HashSet(values);
Mode = mode;
}
}
}
//режим
public Mode Mode { get; private set; }}