view Windows/Forms/I18N/ControlTranslator.cs @ 2:b829a3320688

Re #3 - Copy control related translation to new class in I18N
author IBBoard <dev@ibboard.co.uk>
date Sat, 27 Dec 2008 18:33:01 +0000
parents
children 1acdb0aff4a7
line wrap: on
line source

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows.Forms;
using System.ComponentModel;
using IBBoard.Lang;

namespace IBBoard.Windows.Forms.I18N
{
    public class ControlTranslator
    {
        public static void TranslateControl(Control ctrl, params object[] replacements)
        {
            TranslateControl(ctrl, true, replacements);
        }

        public static void TranslateControl(Control ctrl, bool cascadeTranslate, params object[] replacements)
        {
            if (ctrl is ITranslatable)
            {
                Translation.Translate((ITranslatable)ctrl, replacements);
            }

            if (cascadeTranslate)
            {
                CascadeControlTranslation(ctrl, replacements);
            }
        }

        private static void CascadeControlTranslation(Control ctrl, params object[] replacements)
        {
            if (ctrl is ToolBar)
            {
                foreach (ToolBarButton bttn in ((ToolBar)ctrl).Buttons)
                {
                    TranslateComponent(bttn, true, replacements);
                }
            }
            else
            {
                foreach (Control subctr in ctrl.Controls)
                {
                    TranslateControl(subctr, true, replacements);
                }
            }
        }

        public static void TranslateComponent(Component comp, params object[] replacements)
        {
            TranslateComponent(comp, true, replacements);
        }

        public static void TranslateComponent(Component comp, bool cascadeTranslate, params object[] replacements)
        {
            if (comp is ITranslatable)
            {
                Translation.Translate((ITranslatable)comp, replacements);
            }
            else if (comp is FileDialog)
            {
                //HACK: We can't override SWF dialogs in .Net 1.1, so put in a special condition check for them
                FileDialog dialog = (FileDialog)comp;

                if (dialog.Title.StartsWith("Translatable:"))
                {
                    dialog.Title = Translation.GetTranslation(dialog.Title.Substring(13), replacements);
                }
            }

            if (cascadeTranslate)
            {
                CascadeComponentTranslations(comp, cascadeTranslate, replacements);
            }
        }

        private static void CascadeComponentTranslations(Component comp, params object[] replacements)
        {
            if (comp is Menu)
            {
                foreach (MenuItem mi in ((Menu)comp).MenuItems)
                {
                    TranslateComponent(mi, true, replacements);
                }
            }
        }
    }
}