Click here to Skip to main content
15,896,063 members
Articles / Desktop Programming / WPF

Localization Sync

Rate me:
Please Sign up or sign in to vote.
5.00/5 (3 votes)
23 Feb 2012CPOL4 min read 21.3K   625   9  
Small utility to keep localized resources synchronized
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using Microsoft.Win32;
using System.IO;
using System.Xml.Linq;
using System.Windows.Media.Animation;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Threading;

namespace LocalizationSync
{
    /// <summary>
    /// Interaction logic for MainWindow.xaml
    /// </summary>
    public partial class MainWindow : Window
    {
        int noOfErrorsOnScreen = 0;
        SourceItem sourceData = new SourceItem();      

        public MainWindow()
        {
            InitializeComponent();

            TextBoxSource.DataContext = sourceData;
            ListBoxDestination.DataContext = TranslationManager.Singleton;
            AccessTextInfo.DataContext = TranslationManager.Singleton;
        }

        /// <summary>
        /// Fired when source button is clicked
        /// </summary>
        private void ButtonSource_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                OpenFileDialog dialog = new OpenFileDialog();
                dialog.Filter = "Language Files (*.resx)|*.resx";
                dialog.Multiselect = false;
                if (dialog.ShowDialog() == true)
                {
                    TextBoxSource.Text = dialog.FileName;
                }
            }
            catch (System.Exception ex)
            {               
                Log.Exception(ex);
                TranslationManager.Singleton.Status = new Info("An error occurred during adding source language file", InfoType.Error);
                DisplayInfo();
            }
        }

        private void TextBoxSource_TextChanged(object sender, TextChangedEventArgs e)
        {
            TextBox sourceTextBox = sender as TextBox;
            sourceData.Source = sourceTextBox.Text;
            sourceTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            TranslationManager.Singleton.SourceTranslation.DocumentPath = sourceTextBox.Text;
        }

        /// <summary>
        /// Fired when destination button is clicked
        /// </summary>
        private void ButtonDestination_Click(object sender, RoutedEventArgs e)
        {
            try
            {
                OpenFileDialog dialog = new OpenFileDialog();
                dialog.Filter = "Language Files (*.resx)|*.resx";
                dialog.Multiselect = true;
                if (dialog.ShowDialog() == true)
                {
                    TranslationManager.Singleton.DestinationElements.Clear();
                    foreach (string fileName in dialog.FileNames)
                    {
                        DestinationItem destinationItem = new DestinationItem(fileName);
                        TranslationManager.Singleton.DestinationElements.Add(destinationItem);
                    }

                    ListBoxDestination.ItemsSource = TranslationManager.Singleton.DestinationElements;
                }
            }
            catch (System.Exception ex)
            {                
                Log.Exception(ex);
                TranslationManager.Singleton.Status = new Info("An error occurred when adding destination language file", InfoType.Error);
                DisplayInfo();
            }
        }

        /// <summary>
        /// Fired when update button is clicked
        /// </summary>
        private void ButtonUpdate_Click(object sender, RoutedEventArgs e)
        {
            ListBoxDestination.GetBindingExpression(ListBox.ItemsSourceProperty).UpdateSource();
            TextBoxSource.GetBindingExpression(TextBox.TextProperty).UpdateSource();
            if (noOfErrorsOnScreen == 0)
            {
                StackPanelProcessing.Visibility = Visibility.Visible;
                TranslationManager.Singleton.RunWorker();
            }
        }

        /// <summary>
        /// Fired when reset button is clicked
        /// </summary>
        private void ButtonReset_Click(object sender, RoutedEventArgs e)
        {
            ResetUI();
        }

        private void Validation_Error(object sender, ValidationErrorEventArgs e)
        {
            if (e.Action == ValidationErrorEventAction.Added)
                noOfErrorsOnScreen++;
            else
                noOfErrorsOnScreen--;
        }

        private void Update_CanExecute(object sender, CanExecuteRoutedEventArgs e)
        {
            e.CanExecute = noOfErrorsOnScreen == 0;
            e.Handled = true;
        }

        private void ResetUI()
        {
            sourceData.Source = null;
            TranslationManager.Singleton.DestinationElements.Clear();
        }

        public void DisplayInfo()
        {
            StackPanelProcessing.Visibility = Visibility.Collapsed;
            ProgressBarProcessing.Value = 0;

            // Start final info storyboard animation (fade out effect)
            Storyboard board = (Storyboard)this.FindResource("StoryboardInfo");
            board.Begin();
        }

        public void WorkInProgress(int progressPercentage)
        {
            ProgressBarProcessing.Value = progressPercentage;
        }

        private void Manual_Click(object sender, RoutedEventArgs e)
        {
            ControlAbout.Visibility = Visibility.Collapsed;
            ControlLicense.Visibility = Visibility.Collapsed;
            ControlManual.Visibility = Visibility.Visible;
            ControlManual.Focus();
        }

        private void About_Click(object sender, RoutedEventArgs e)
        {
            ControlManual.Visibility = Visibility.Collapsed;
            ControlLicense.Visibility = Visibility.Collapsed;
            ControlAbout.Visibility = Visibility.Visible;
            ControlAbout.Focus();
        }

        private void License_Click(object sender, RoutedEventArgs e)
        {
            ControlManual.Visibility = Visibility.Collapsed;
            ControlAbout.Visibility = Visibility.Collapsed;
            ControlLicense.Visibility = Visibility.Visible;
            ControlLicense.Focus();
        }
    }
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Software Developer
Romania Romania
I have been a software developer for a while and still find this an interesting job.

Comments and Discussions