view Translatable/ControlTranslator.cs @ 39:35b88b848524

* Add simple dialog to add basic widgets to for use in WarFoundry
author IBBoard <dev@ibboard.co.uk>
date Tue, 18 Oct 2011 20:58:49 +0100
parents 70c46caee508
children f04e973e5ea0
line wrap: on
line source

//  This file (ControlTranslator.cs) is a part of the IBBoard.GtkSharp project and is copyright 2010 IBBoard
// 
// // The file and the library/program it is in are licensed and distributed, without warranty, under the GNU LGPL license, either version 3 of the License or (at your option) any later version. Please see COPYING for more information and the full license.

using Gtk;
using IBBoard.Lang;

namespace IBBoard.GtkSharp.Translatable
{
	/// <summary>
	/// A custom cascading translator. It takes any widget type and translates them if they implement <see>ITranslatable</see>
	/// and optionally cascades the process to translate all children.
	/// </summary>
	public class ControlTranslator
	{
		public static void TranslateWidget(Widget toTranslate)
		{
			TranslateWidget(toTranslate, true);
		}

		public static void TranslateWidget(Widget toTranslate, bool cascade)
		{
			if (toTranslate is ITranslatable)
			{
				Translation.Translate((ITranslatable)toTranslate);
			}
			else if (toTranslate is MenuItem || toTranslate is ToolButton)
			{
				TranslateWidgetWithAction((Widget)toTranslate);
			}

			if (cascade && toTranslate is Container)
			{
				CascadeTranslations((Container)toTranslate, cascade);
			}
		}

		private static void TranslateWidgetWithAction(Widget widget)
		{
			Action action = widget.Action;
			string translation = Translation.GetTranslation(widget.Name, "");

			if (translation == "")
			{
				widget.TooltipText = translation;
			}
			else if (action != null)
			{
				widget.TooltipText = action.Label;
			}
		}

		private static void CascadeTranslations(Container container, bool cascade)
		{
			if (container is ITranslatableWithActions)
			{
				TranslateActions((ITranslatableWithActions)container);
			}

			foreach (Widget childWidget in container.AllChildren)
			{
				TranslateWidget(childWidget, cascade);
			}
		}

		private static void TranslateActions(ITranslatableWithActions actionContainer)
		{
			foreach (Action action in actionContainer.Actions)
			{
				TranslateAction(action);
			}
		}

		private static void TranslateAction(Gtk.Action action)
		{
			action.Label = Translation.GetTranslation(action.Name, action.Label);
		}

		public static void TranslateButtons(params Button[] buttons)
		{
			foreach (Button button in buttons)
			{
				TranslateButton(button);
			}
		}

		public static void TranslateButton(Button button)
		{
			Widget image = button.Image;
			button.Label = Translation.GetTranslation(button.Name, button.Label);
			button.Image = image;
		}
	}
}