diff --git a/GreenshotLanguageEditor/GreenshotLanguageEditor.csproj b/GreenshotLanguageEditor/GreenshotLanguageEditor.csproj
index 946ba526a..06d52c891 100644
--- a/GreenshotLanguageEditor/GreenshotLanguageEditor.csproj
+++ b/GreenshotLanguageEditor/GreenshotLanguageEditor.csproj
@@ -10,13 +10,15 @@
v4.0
Client
Properties
-
-
- x86
+ False
+ False
+ 4
+ false
+ C:\Users\jens\AppData\Roaming\ICSharpCode/SharpDevelop4\Settings.SourceAnalysis
bin\Debug\
- True
+ true
Full
False
True
@@ -30,6 +32,16 @@
False
TRACE
+
+ False
+ Auto
+ 4194304
+ x86
+ 4096
+
+
+ x86
+
3.0
@@ -78,6 +90,19 @@
+
+
+ Always
+ icon-save
+
+
+
+
+
+
+
+ Always
+
\ No newline at end of file
diff --git a/GreenshotLanguageEditor/Language.cs b/GreenshotLanguageEditor/Language.cs
index b8c7c5b73..7cb6848e7 100644
--- a/GreenshotLanguageEditor/Language.cs
+++ b/GreenshotLanguageEditor/Language.cs
@@ -29,6 +29,9 @@ namespace GreenshotLanguageEditor {
public string FilePath {
get;
set;
+ }
+ public string FileName {
+ get {return Path.GetFileName(FilePath);}
}
public string IETF {
get;
diff --git a/GreenshotLanguageEditor/Window1.xaml b/GreenshotLanguageEditor/Window1.xaml
index 90d1f8bda..32d106e83 100644
--- a/GreenshotLanguageEditor/Window1.xaml
+++ b/GreenshotLanguageEditor/Window1.xaml
@@ -1,48 +1,144 @@
-
-
+
+
+
+
+
+
+
+
-
-
+
+
-
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
-
\ No newline at end of file
diff --git a/GreenshotLanguageEditor/Window1.xaml.cs b/GreenshotLanguageEditor/Window1.xaml.cs
index 3513f4010..4be89d136 100644
--- a/GreenshotLanguageEditor/Window1.xaml.cs
+++ b/GreenshotLanguageEditor/Window1.xaml.cs
@@ -20,6 +20,7 @@
*/
using System;
using System.Collections.Generic;
+using System.IO;
using System.Text;
using System.Windows;
using System.Windows.Controls;
@@ -35,66 +36,142 @@ namespace GreenshotLanguageEditor {
/// Interaction logic for Window1.xaml
///
public partial class Window1 : Window {
+
+ IDictionary languageResources = new SortedDictionary();
+ IList languageFiles = new List();
+
public ICollectionView View {
get;
set;
}
+
+ // TODO user should be able to create a new translation file using this app
+ // TODO possibility to edit language file meta data, such as version, languagegroup, description, etc.
public Window1() {
- var dialog = new System.Windows.Forms.FolderBrowserDialog();
+
+ // TODO remember last selected location
+
+ /*var dialog = new System.Windows.Forms.FolderBrowserDialog();
dialog.ShowNewFolderButton = false;
System.Windows.Forms.DialogResult result = dialog.ShowDialog();
string languagePath;
+
+
if (result == System.Windows.Forms.DialogResult.OK) {
languagePath = dialog.SelectedPath;
} else {
this.Close();
return;
- }
+ }*/
+
+
+ string languagePath = @"C:\Users\jens\Documents\Sharpdevelop Projects\Greenshot\trunk\Greenshot\Languages\";
InitializeComponent();
- View = CollectionViewSource.GetDefaultView(LoadResources(languagePath));
DataContext = this;
this.Activate();
+
+ this.language1ComboBox.ItemsSource = languageFiles;
+ this.language1ComboBox.DisplayMemberPath = "FileName";
+ this.language2ComboBox.ItemsSource = languageFiles;
+ this.language2ComboBox.DisplayMemberPath = "FileName";
+
+ View = CollectionViewSource.GetDefaultView(LoadResources(languagePath));
}
private IList LoadResources(string languagePath) {
- IDictionary languageResources = new SortedDictionary();
-
+
foreach (LanguageFile languageFile in GreenshotLanguage.GetLanguageFiles(languagePath, "language*.xml")) {
+ languageFiles.Add(languageFile);
+
if ("en-US".Equals(languageFile.IETF)) {
- IDictionary enResources = GreenshotLanguage.ReadLanguageFile(languageFile);
- foreach(string key in enResources.Keys) {
- LanguageEntry entry;
- if (languageResources.ContainsKey(key)) {
- entry = languageResources[key];
- } else {
- entry = new LanguageEntry();
- entry.Key = key;
- languageResources.Add(key, entry);
- }
- entry.Entry1 = enResources[key];
- }
- }
- if ("de-DE".Equals(languageFile.IETF)) {
- IDictionary deResources = GreenshotLanguage.ReadLanguageFile(languageFile);
- foreach(string key in deResources.Keys) {
- LanguageEntry entry;
- if (languageResources.ContainsKey(key)) {
- entry = languageResources[key];
- } else {
- entry = new LanguageEntry();
- entry.Key = key;
- languageResources.Add(key, entry);
- }
- entry.Entry2 = deResources[key];
- }
+ // we should always start with en-US, so the grid is initialized with the probably most-complete language file as benchmark for translations
+ this.language1ComboBox.SelectedItem = languageFile;
+ } else if(this.language2ComboBox.SelectedItem == null) {
+ this.language2ComboBox.SelectedItem = languageFile;
}
}
+ if(this.language1ComboBox.SelectedItem == null) {
+ MessageBox.Show("language-en-US.xml does not exist in the location selected. It is needed as reference for the translation.");
+ this.Close();
+ }
return new List(languageResources.Values);
}
- public void CreateXML(string savePath) {
+ private void PopulateColumn(LanguageFile languageFile, int columnIndex) {
+ ClearColumn(columnIndex);
+ IDictionary resources = GreenshotLanguage.ReadLanguageFile(languageFile);
+ foreach(string key in resources.Keys) {
+ LanguageEntry entry = GetOrCreateLanguageEntry(key);
+ if(columnIndex == 1) entry.Entry1 = resources[key];
+ else if (columnIndex == 2) entry.Entry2 = resources[key];
+ else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2");
+ }
+ }
+
+ private void ClearColumn(int columnIndex) {
+ // we do not throw out LanguageEntries that do not exist in selected language,
+ // so that en-US (loaded at startup) is always the benchmark, even when other languages are displayed
+ foreach(LanguageEntry e in languageResources.Values) {
+ if (columnIndex == 1) e.Entry1 = "";
+ else if (columnIndex == 2) e.Entry2 = "";
+ else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2");
+ }
+ }
+
+ private LanguageEntry GetOrCreateLanguageEntry(string key) {
+ LanguageEntry entry;
+ if (languageResources.ContainsKey(key)) {
+ entry = languageResources[key];
+ } else {
+ entry = new LanguageEntry();
+ entry.Key = key;
+ languageResources.Add(key, entry);
+ }
+ return entry;
+ }
+
+ private void saveButtonClicked(object sender, RoutedEventArgs e) {
+ int targetColumn = GetTargetColumn((Control)sender);
+ LanguageFile editedFile = (LanguageFile) (targetColumn == 1 ? language1ComboBox.SelectedItem : language2ComboBox.SelectedItem);
+
+ var dialog = new System.Windows.Forms.SaveFileDialog();
+ dialog.AutoUpgradeEnabled = true;
+ dialog.DefaultExt = ".xml";
+ dialog.InitialDirectory = Path.GetDirectoryName(editedFile.FilePath);
+ dialog.FileName = editedFile.FileName;
+ dialog.CheckFileExists = true;
+ System.Windows.Forms.DialogResult result = dialog.ShowDialog();
+ if (result == System.Windows.Forms.DialogResult.OK) {
+ CreateXML(dialog.FileName, targetColumn);
+ }
+ }
+
+ private void languageComboBoxSelectionChanged(object sender, SelectionChangedEventArgs e) {
+ // TODO let user confirm if there are unsaved changes
+ int targetColumn = GetTargetColumn((Control)sender);
+ LanguageFile file = (LanguageFile)((ComboBox)sender).SelectedItem;
+ PopulateColumn(file, targetColumn);
+ }
+
+ private void cancelButtonClicked(object sender, RoutedEventArgs e) {
+ // TODO let user confirm if there are unsaved changes
+ int targetColumn = GetTargetColumn((Control)sender);
+ LanguageFile file = (LanguageFile)(targetColumn == 1 ? language1ComboBox.SelectedItem : language2ComboBox.SelectedItem);
+ PopulateColumn(file, targetColumn);
+ }
+
+ private int GetTargetColumn(Control control) {
+ object tag = control.Tag;
+ if(tag == null && !tag.Equals("1") && !tag.Equals("2")) {
+ throw new ApplicationException("Please use the control's Tag property to indicate the column to interact with (1 or 2).");
+ } else {
+ return tag.Equals("1") ? 1 : 2;
+ }
+ }
+
+ public void CreateXML(string savePath, int targetColumn) {
ICollectionView view = (ICollectionView)LanguageGrid.ItemsSource;
IList entries = (IList)view.SourceCollection;
@@ -113,7 +190,9 @@ namespace GreenshotLanguageEditor {
foreach(LanguageEntry entry in entries) {
xmlWriter.WriteStartElement("resource");
xmlWriter.WriteAttributeString("name", entry.Key);
- xmlWriter.WriteString(entry.Entry1);
+ if(targetColumn == 1) xmlWriter.WriteString(entry.Entry1);
+ else if(targetColumn == 2 ) xmlWriter.WriteString(entry.Entry2);
+ else throw new ArgumentOutOfRangeException("Argument columnIndex must be either 1 or 2");
xmlWriter.WriteEndElement();
}
xmlWriter.WriteEndElement();
@@ -122,19 +201,6 @@ namespace GreenshotLanguageEditor {
}
}
- private void Button_Click(object sender, RoutedEventArgs e) {
- var dialog = new System.Windows.Forms.SaveFileDialog();
- dialog.AutoUpgradeEnabled = true;
- dialog.DefaultExt = ".xml";
- System.Windows.Forms.DialogResult result = dialog.ShowDialog();
- if (result == System.Windows.Forms.DialogResult.OK) {
- CreateXML(dialog.FileName);
- } else {
- this.Close();
- return;
- }
-
- }
}
public class LanguageEntry : IEditableObject, INotifyPropertyChanged {
@@ -151,13 +217,13 @@ namespace GreenshotLanguageEditor {
public Brush Background {
get {
- if (Entry1 == null) {
+ if (String.IsNullOrEmpty(Entry1)) {
return Brushes.Red;
}
- if (Entry2 == null) {
+ if (String.IsNullOrEmpty(Entry2)) {
return Brushes.Red;
}
- return Brushes.Green;
+ return Brushes.White;
}
}
public string Key {
diff --git a/GreenshotLanguageEditor/icons/cross.png b/GreenshotLanguageEditor/icons/cross.png
new file mode 100644
index 000000000..d6921565d
Binary files /dev/null and b/GreenshotLanguageEditor/icons/cross.png differ
diff --git a/GreenshotLanguageEditor/icons/disk-black.png b/GreenshotLanguageEditor/icons/disk-black.png
new file mode 100644
index 000000000..26507e51b
Binary files /dev/null and b/GreenshotLanguageEditor/icons/disk-black.png differ