[gbrainy/gbrainy-17x] Introduces service pattern, translation service + fixes in web client



commit 71ab462029b059335d3d594eac16c77c1b39ba95
Author: Jordi Mas <jmas softcatala org>
Date:   Sun Jan 30 23:47:07 2011 +0100

    Introduces service pattern, translation service + fixes in web client

 gbrainy.csproj                                     |    4 +-
 po/POTFILES.in                                     |    1 +
 src/Clients/Classical/gbrainy.cs                   |    4 +
 src/Clients/WebForms/Default.aspx                  |    2 +-
 src/Clients/WebForms/Default.aspx.cs               |    2 +-
 src/Clients/WebForms/Default.aspx.designer.cs      |    2 +-
 src/Clients/WebForms/Defines.cs                    |   34 +++++++
 src/Clients/WebForms/Download.aspx                 |    2 +-
 src/Clients/WebForms/Download.aspx.cs              |    2 +-
 src/Clients/WebForms/Download.aspx.designer.cs     |    6 +-
 src/Clients/WebForms/Game.aspx                     |    2 +-
 src/Clients/WebForms/Game.aspx.cs                  |   44 +++++----
 src/Clients/WebForms/Game.aspx.designer.cs         |    2 +-
 src/Clients/WebForms/Global.asax                   |    2 +-
 src/Clients/WebForms/Global.asax.cs                |    9 ++-
 src/Clients/WebForms/LanguageSupport.cs            |   22 +----
 src/Clients/WebForms/Logger.cs                     |    2 +-
 src/Clients/WebForms/MasterPage.master             |    2 +-
 src/Clients/WebForms/MasterPage.master.cs          |    3 +-
 src/Clients/WebForms/MasterPage.master.designer.cs |    2 +-
 src/Clients/WebForms/Status.aspx                   |    2 +-
 src/Clients/WebForms/Status.aspx.cs                |    2 +-
 src/Clients/WebForms/Status.aspx.designer.cs       |    2 +-
 src/Clients/WebForms/WebForms.csproj               |   32 +------
 src/Clients/WebForms/WebSession.cs                 |    2 +-
 src/Clients/WebForms/images/allgames-32.png        |  Bin 445 -> 0 bytes
 src/Clients/WebForms/images/endgame-32.png         |  Bin 474 -> 0 bytes
 src/Clients/WebForms/images/logic-games-32.png     |  Bin 1811 -> 0 bytes
 src/Clients/WebForms/images/math-games-32.png      |  Bin 1191 -> 0 bytes
 src/Clients/WebForms/images/memory-games-32.png    |  Bin 1146 -> 0 bytes
 src/Clients/WebForms/images/pause-32.png           |  Bin 457 -> 0 bytes
 src/Clients/WebForms/images/resume-32.png          |  Bin 559 -> 0 bytes
 src/Clients/WebForms/images/verbal-games-32.png    |  Bin 1762 -> 0 bytes
 src/Clients/WebForms/package.sh                    |   43 +++++++++
 src/Clients/WebForms/web.config                    |    8 +-
 src/Core/Core.csproj                               |   12 ++-
 src/Core/Libraries/TranslationsCatalog.cs          |   42 +++++++++
 src/Core/Main/ColorPalette.cs                      |   18 ++--
 src/Core/Main/Game.cs                              |   25 +++---
 src/Core/Main/GameManager.cs                       |   14 ++-
 src/Core/Main/GameSession.cs                       |   24 +++---
 src/Core/Main/GameTips.cs                          |   33 ++++---
 src/Core/Main/GameTypes.cs                         |   11 +-
 src/Core/Main/Memory.cs                            |    6 +-
 src/Core/Main/PdfExporter.cs                       |   12 +-
 src/Core/Main/ThemeManager.cs                      |    2 -
 src/Core/Main/Verbal/Analogies.cs                  |   18 ++--
 src/Core/Main/Verbal/AnalogiesFactory.cs           |    4 +-
 src/Core/Main/Verbal/AnalogiesMultipleOptions.cs   |   12 +-
 .../Main/Verbal/AnalogiesPairOfWordsCompare.cs     |    9 +-
 .../Main/Verbal/AnalogiesPairOfWordsOptions.cs     |   14 ++--
 src/Core/Main/Verbal/AnalogiesQuestionAnswer.cs    |    4 +-
 src/Core/Main/Xml/GameXml.cs                       |   21 ++--
 src/Core/Makefile.am                               |    6 +-
 src/Core/Services/IService.cs                      |   27 ++++++
 src/Core/Services/ITranslations.cs                 |   29 ++++++
 src/Core/Services/ServiceLocator.cs                |   79 ++++++++++++++++
 src/Core/Views/CountDownView.cs                    |    4 +-
 src/Core/Views/FinishView.cs                       |   34 ++++----
 src/Core/Views/PlayerHistoryView.cs                |    8 +-
 src/Core/Views/WelcomeView.cs                      |   16 ++--
 src/Games/Calculation/CalculationArithmetical.cs   |    7 +-
 src/Games/Calculation/CalculationAverage.cs        |   10 +-
 src/Games/Calculation/CalculationCloserFraction.cs |   10 +-
 src/Games/Calculation/CalculationFractions.cs      |    6 +-
 .../Calculation/CalculationGreatestDivisor.cs      |   12 +-
 src/Games/Calculation/CalculationOperator.cs       |   10 +-
 src/Games/Calculation/CalculationPrimes.cs         |   12 +-
 src/Games/Calculation/CalculationProportions.cs    |    6 +-
 src/Games/Calculation/CalculationRatio.cs          |   16 ++--
 src/Games/Calculation/CalculationTwoNumbers.cs     |   16 ++--
 src/Games/Logic/Puzzle3DCube.cs                    |    8 +-
 src/Games/Logic/PuzzleBalance.cs                   |   10 +-
 src/Games/Logic/PuzzleBuildTriangle.cs             |   10 +-
 src/Games/Logic/PuzzleCirclesSquare.cs             |   18 ++--
 src/Games/Logic/PuzzleClocks.cs                    |   10 +-
 src/Games/Logic/PuzzleCountCircles.cs              |    8 +-
 src/Games/Logic/PuzzleCountSeries.cs               |   18 ++--
 src/Games/Logic/PuzzleCounting.cs                  |   18 ++--
 src/Games/Logic/PuzzleCoverPercentage.cs           |    6 +-
 src/Games/Logic/PuzzleCube.cs                      |    6 +-
 src/Games/Logic/PuzzleDice.cs                      |   20 ++--
 src/Games/Logic/PuzzleDivideCircle.cs              |    8 +-
 src/Games/Logic/PuzzleEquation.cs                  |    8 +-
 src/Games/Logic/PuzzleExtraCircle.cs               |   10 +-
 src/Games/Logic/PuzzleFigureLetter.cs              |   10 +-
 src/Games/Logic/PuzzleFigurePattern.cs             |   12 +-
 src/Games/Logic/PuzzleFigures.cs                   |   18 ++--
 src/Games/Logic/PuzzleFourSided.cs                 |   10 +-
 src/Games/Logic/PuzzleHandshakes.cs                |    8 +-
 src/Games/Logic/PuzzleLargerShape.cs               |    8 +-
 src/Games/Logic/PuzzleLines.cs                     |   10 +-
 src/Games/Logic/PuzzleMatrixGroups.cs              |   10 +-
 src/Games/Logic/PuzzleMatrixNumbers.cs             |   22 ++--
 src/Games/Logic/PuzzleMissingPiece.cs              |   12 +-
 src/Games/Logic/PuzzleMissingSlice.cs              |   12 +-
 src/Games/Logic/PuzzleMostInCommon.cs              |   14 ++--
 src/Games/Logic/PuzzleMoveFigure.cs                |   10 +-
 src/Games/Logic/PuzzleNextFigure.cs                |   10 +-
 src/Games/Logic/PuzzleNumericRelation.cs           |   14 ++--
 src/Games/Logic/PuzzleNumericSequence.cs           |   14 ++--
 src/Games/Logic/PuzzleOstracism.cs                 |   16 ++--
 src/Games/Logic/PuzzlePencil.cs                    |    6 +-
 src/Games/Logic/PuzzlePeopleTable.cs               |   22 ++--
 src/Games/Logic/PuzzlePercentage.cs                |   12 +-
 src/Games/Logic/PuzzlePredicateLogic.cs            |   98 ++++++++++----------
 src/Games/Logic/PuzzleQuadrilaterals.cs            |    8 +-
 src/Games/Logic/PuzzleRelatedNumbers.cs            |   14 ++--
 src/Games/Logic/PuzzleSquareDots.cs                |    8 +-
 src/Games/Logic/PuzzleSquareSheets.cs              |   11 +-
 src/Games/Logic/PuzzleSquares.cs                   |   13 +--
 src/Games/Logic/PuzzleSquaresAndLetters.cs         |    8 +-
 src/Games/Logic/PuzzleTetris.cs                    |   10 +-
 src/Games/Logic/PuzzleTimeNow.cs                   |   12 +-
 src/Games/Logic/PuzzleTrains.cs                    |   18 ++--
 src/Games/Logic/PuzzleTriangles.cs                 |   10 +-
 src/Games/Logic/PuzzleTrianglesWithNumbers.cs      |   10 +-
 src/Games/Memory/MemoryColouredFigures.cs          |    6 +-
 src/Games/Memory/MemoryColouredText.cs             |    6 +-
 src/Games/Memory/MemoryCountDots.cs                |    6 +-
 src/Games/Memory/MemoryFacts.cs                    |   26 +++---
 src/Games/Memory/MemoryFigures.cs                  |    6 +-
 src/Games/Memory/MemoryFiguresAndText.cs           |   14 ++--
 src/Games/Memory/MemoryFiguresNumbers.cs           |    6 +-
 src/Games/Memory/MemoryIndications.cs              |   18 ++--
 src/Games/Memory/MemoryNumbers.cs                  |   10 +-
 src/Games/Memory/MemoryWords.cs                    |   76 ++++++++--------
 127 files changed, 934 insertions(+), 697 deletions(-)
---
diff --git a/gbrainy.csproj b/gbrainy.csproj
index fb0d79d..7f088d1 100644
--- a/gbrainy.csproj
+++ b/gbrainy.csproj
@@ -46,11 +46,11 @@
       <Package>gtk-sharp-2.0</Package>
     </Reference>
     <Reference Include="Mono.Posix" />
-    <Reference Include="Mono.Cairo" />
     <Reference Include="atk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f">
       <Package>gtk-sharp-2.0</Package>
     </Reference>
     <Reference Include="System" />
+    <Reference Include="Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="src\Clients\Classical\gbrainy.cs" />
@@ -68,8 +68,8 @@
     <Compile Include="src\Clients\Classical\Dialogs\HigMessageDialog.cs" />
     <Compile Include="src\Clients\Classical\CommandLine.cs" />
     <Compile Include="src\Clients\Classical\Widgets\BrowseFile.cs" />
-    <Compile Include="src\Clients\Classical\Widgets\SimpleLabel.cs" />
     <Compile Include="src\Clients\Classical\Dialogs\PdfExportDialog.cs" />
+    <Compile Include="src\Clients\Classical\Widgets\GameDrawingArea.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ItemGroup>
diff --git a/po/POTFILES.in b/po/POTFILES.in
index 9571c29..23c59ab 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -39,6 +39,7 @@ src/Clients/Classical/Dialogs/PreferencesDialog.cs
 [type: gettext/glade] src/Clients/Classical/Dialogs/ui/PlayerHistoryDialog.ui
 [type: gettext/glade] src/Clients/Classical/Dialogs/ui/PreferencesDialog.ui
 src/Clients/Classical/Widgets/BrowseFile.cs
+src/Clients/Classical/Widgets/GameDrawingArea.cs
 src/Games/Logic/Puzzle3DCube.cs
 src/Games/Logic/PuzzleBalance.cs
 src/Games/Logic/PuzzleBuildTriangle.cs
diff --git a/src/Clients/Classical/gbrainy.cs b/src/Clients/Classical/gbrainy.cs
index 86a4db3..43bd21a 100755
--- a/src/Clients/Classical/gbrainy.cs
+++ b/src/Clients/Classical/gbrainy.cs
@@ -26,6 +26,7 @@ using Gdk;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Platform;
+using gbrainy.Core.Services;
 using gbrainy.Clients.Classical.Dialogs;
 using gbrainy.Clients.Classical.Widgets;
 
@@ -784,6 +785,9 @@ namespace gbrainy.Clients.Classical
 
 			DateTime start_time = DateTime.Now;
 
+			// Register services
+			ServiceLocator.Instance.RegisterService <ITranslations> (new TranslationsCatalog ());
+
 			GtkClient app = new GtkClient ();
 			CommandLine.Version ();
 
diff --git a/src/Clients/WebForms/Default.aspx b/src/Clients/WebForms/Default.aspx
index d7953db..016d39d 100644
--- a/src/Clients/WebForms/Default.aspx
+++ b/src/Clients/WebForms/Default.aspx
@@ -1,4 +1,4 @@
-<%@ Page Language="C#" MasterPageFile = "MasterPage.master" Inherits="WebForms.Default" %>
+<%@ Page Language="C#" MasterPageFile = "MasterPage.master" Inherits="gbrainy.Clients.WebForms.Default" %>
 <%@ Import Namespace="System.Data" %>
 
 <asp:content id="main_content" ContentPlaceHolderID ="main_placeholder" runat="server">
diff --git a/src/Clients/WebForms/Default.aspx.cs b/src/Clients/WebForms/Default.aspx.cs
index e9e0779..980ee32 100644
--- a/src/Clients/WebForms/Default.aspx.cs
+++ b/src/Clients/WebForms/Default.aspx.cs
@@ -22,7 +22,7 @@ using System.Web;
 using System.Web.UI;
 using System.Web.UI.WebControls;
 
-namespace WebForms
+namespace gbrainy.Clients.WebForms
 {
 	public partial class Default : System.Web.UI.Page
 	{
diff --git a/src/Clients/WebForms/Default.aspx.designer.cs b/src/Clients/WebForms/Default.aspx.designer.cs
index 09308ba..501e3ce 100644
--- a/src/Clients/WebForms/Default.aspx.designer.cs
+++ b/src/Clients/WebForms/Default.aspx.designer.cs
@@ -8,7 +8,7 @@
 //  </autogenerated>
 // ------------------------------------------------------------------------------
 
-namespace WebForms {
+namespace gbrainy.Clients.WebForms {
 	
 	
 	public partial class Default {
diff --git a/src/Clients/WebForms/Defines.cs b/src/Clients/WebForms/Defines.cs
new file mode 100644
index 0000000..1ee76ab
--- /dev/null
+++ b/src/Clients/WebForms/Defines.cs
@@ -0,0 +1,34 @@
+/*
+ * Copyright (C) 2011 Jordi Mas i Hernàndez <jmas softcatala org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+using System;
+
+namespace gbrainy.Clients.WebForms
+{
+	// Configuration for the web client
+	public static class Defines
+	{
+		public const string LOCALE_DIR = "locale/";
+		public const string THEMES_DIR = "themes/";
+
+		public const string VERBAL_ANALOGIES = "verbal_analogies.xml";
+		public const string GAME_ASSEMBLY = "bin/gbrainy.Games.dll";
+		public const string GAMES_FILE = "games.xml";
+	}
+}
diff --git a/src/Clients/WebForms/Download.aspx b/src/Clients/WebForms/Download.aspx
index bcdf745..5764f7a 100644
--- a/src/Clients/WebForms/Download.aspx
+++ b/src/Clients/WebForms/Download.aspx
@@ -1,4 +1,4 @@
-<%@ Page Language="C#" Inherits="WebForms.Download" MasterPageFile="~/MasterPage.master" %>
+<%@ Page Language="C#" Inherits="gbrainy.Clients.WebForms.Download" MasterPageFile="~/MasterPage.master" %>
 <%@ MasterType VirtualPath="~/MasterPage.master" %>
 <asp:Content ContentPlaceHolderID="main_placeholder" ID="main_placeholderContent" runat="server">
 
diff --git a/src/Clients/WebForms/Download.aspx.cs b/src/Clients/WebForms/Download.aspx.cs
index dd4d2fe..c3a6a9f 100644
--- a/src/Clients/WebForms/Download.aspx.cs
+++ b/src/Clients/WebForms/Download.aspx.cs
@@ -23,7 +23,7 @@ using System.Web;
 using System.Web.UI;
 using gbrainy.Core.Main;
 
-namespace WebForms
+namespace gbrainy.Clients.WebForms
 {
 	public partial class Download : System.Web.UI.Page
 	{
diff --git a/src/Clients/WebForms/Download.aspx.designer.cs b/src/Clients/WebForms/Download.aspx.designer.cs
index d33c35c..fb2b60f 100644
--- a/src/Clients/WebForms/Download.aspx.designer.cs
+++ b/src/Clients/WebForms/Download.aspx.designer.cs
@@ -8,16 +8,16 @@
 //  </autogenerated>
 // ------------------------------------------------------------------------------
 
-namespace WebForms {
+namespace gbrainy.Clients.WebForms {
 	
 	
 	public partial class Download {
 		
 		protected System.Web.UI.WebControls.Content main_placeholderContent;
 		
-		public new WebForms.MasterPage Master {
+		public new gbrainy.Clients.WebForms.MasterPage Master {
 			get {
-				return ((WebForms.MasterPage)(base.Master));
+				return ((gbrainy.Clients.WebForms.MasterPage)(base.Master));
 			}
 		}
 	}
diff --git a/src/Clients/WebForms/Game.aspx b/src/Clients/WebForms/Game.aspx
index 3771581..5ebb466 100644
--- a/src/Clients/WebForms/Game.aspx
+++ b/src/Clients/WebForms/Game.aspx
@@ -1,4 +1,4 @@
-<%@ Page Language="C#" MasterPageFile = "MasterPage.master" Inherits="WebForms.Game" %>
+<%@ Page Language="C#" MasterPageFile = "MasterPage.master" Inherits="gbrainy.Clients.WebForms.Game" %>
 
 <asp:content id="main_content" ContentPlaceHolderID ="main_placeholder" runat="server">
 
diff --git a/src/Clients/WebForms/Game.aspx.cs b/src/Clients/WebForms/Game.aspx.cs
index c90b9c6..d54c1eb 100644
--- a/src/Clients/WebForms/Game.aspx.cs
+++ b/src/Clients/WebForms/Game.aspx.cs
@@ -24,7 +24,9 @@ using System.Web.UI;
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
 
-namespace WebForms
+using gbrainy.Core.Services;
+
+namespace gbrainy.Clients.WebForms
 {
 	public partial class Game : System.Web.UI.Page
 	{
@@ -36,8 +38,8 @@ namespace WebForms
 		static public GameManager CreateManager ()
 		{
 			manager = new GameManager ();
-			manager.LoadAssemblyGames ("bin/gbrainy.Games.dll");
-			manager.LoadVerbalAnalogies (System.IO.Path.Combine ("data/", "verbal_analogies.xml"));
+			manager.LoadAssemblyGames (Defines.GAME_ASSEMBLY);
+			manager.LoadVerbalAnalogies (System.IO.Path.Combine ("data/", Defines.VERBAL_ANALOGIES));
 
 			manager.Difficulty = gbrainy.Core.Main.GameDifficulty.Medium;
 			manager.GameType = gbrainy.Core.Main.GameSession.Types.LogicPuzzles |
@@ -46,13 +48,23 @@ namespace WebForms
 			return manager;
 		}
 
+		int GetLanguageIndexFromSessionHandler ()
+		{
+			web_session = Global.Sessions [Session.SessionID];
+			return web_session.LanguageIndex;
+		}
+
 		private void Page_Load (Object sender, EventArgs e)
 		{
 			web_session = Global.Sessions [Session.SessionID];
 
 			Logger.Debug ("Game.Page_Load. Page load starts. Session ID {0}, IsPostBack {1}", Session.SessionID,
 				IsPostBack);
-			
+
+			TranslationsWeb service = (TranslationsWeb) ServiceLocator.Instance.GetService <ITranslations> ();
+
+			service.GetLanguageIndexFromSession = GetLanguageIndexFromSessionHandler;
+
 			if (web_session.GameState == null)
 			{
 				Logger.Debug ("Game.Page_Load creating new session");
@@ -74,6 +86,10 @@ namespace WebForms
 			}
 
 			if (IsPostBack == true) {
+				
+				if (web_session.GameState.Status != GameSession.SessionStatus.Finished)
+					UpdateGame ();
+				
 				Logger.Debug ("Game.Page_Load. Ignoring postback");
 				return;
 			}
@@ -89,8 +105,8 @@ namespace WebForms
 			}
 			
 			// Toolbar
-			allgames_label.Text = LanguageSupport.GetString (web_session, "All");
-			endgames_label.Text = LanguageSupport.GetString (web_session, "Finish");
+			allgames_label.Text = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All");
+			endgames_label.Text = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Finish");
 
 			nextgame_link.Text = "Next Game";
 			Logger.Debug ("Game.Page_Load. Page load completed");
@@ -142,7 +158,7 @@ namespace WebForms
 				return;
 
 			status.Text = session.StatusText;
-			question.Text = LanguageSupport.GetString (web_session, _game.Question);
+			question.Text = _game.Question;
 		 	image.ImageUrl = CreateImage (web_session);
 		}
 
@@ -204,13 +220,6 @@ namespace WebForms
 		public virtual void OnClickNextGame (Object sender, EventArgs e)
 		{
 			Logger.Debug ("Game.OnClickNextGame");
-			/*
-			Console.WriteLine ("--> OnClick Next Game");
-			Cache.Remove ("game");
-
-			_game = GetNextGame ();
-			UpdateGame ();
-			*/
 
 			// TODO: This should be done at GameSession.Level
 			session.ScoreGame (String.Empty);
@@ -227,15 +236,15 @@ namespace WebForms
 			if (String.IsNullOrEmpty (answer) == false)
 			{
 				if (session.ScoreGame (answer) == true) {
-					result_label.Text = LanguageSupport.GetString (web_session, "Congratulations.");
+					result_label.Text = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Congratulations.");
 					result_label.CssClass = "CorrectAnswer";
 				}
 				else {
-					result_label.Text = LanguageSupport.GetString (web_session, "Incorrect. ");
+					result_label.Text = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Incorrect. ");
 					result_label.CssClass = null;
 				}
 
-				rationale_label.Text = LanguageSupport.GetString (web_session, session.CurrentGame.Answer);
+				rationale_label.Text = ServiceLocator.Instance.GetService <ITranslations> ().GetString (session.CurrentGame.Answer);
 			} else
 
 			answer_button.Enabled = false;
@@ -254,6 +263,5 @@ namespace WebForms
 			web_session.GameState = null;
 			Response.Redirect ("Game.aspx");
 		}
-		
 	}
 }
diff --git a/src/Clients/WebForms/Game.aspx.designer.cs b/src/Clients/WebForms/Game.aspx.designer.cs
index 6ad698e..b8caeba 100644
--- a/src/Clients/WebForms/Game.aspx.designer.cs
+++ b/src/Clients/WebForms/Game.aspx.designer.cs
@@ -8,7 +8,7 @@
 //  </autogenerated>
 // ------------------------------------------------------------------------------
 
-namespace WebForms {
+namespace gbrainy.Clients.WebForms {
 	
 	
 	public partial class Game {
diff --git a/src/Clients/WebForms/Global.asax b/src/Clients/WebForms/Global.asax
index a18034e..5177cee 100644
--- a/src/Clients/WebForms/Global.asax
+++ b/src/Clients/WebForms/Global.asax
@@ -1 +1 @@
-<%@ Application Inherits="WebForms.Global" %>
+<%@ Application Inherits="gbrainy.Clients.WebForms.Global" %>
diff --git a/src/Clients/WebForms/Global.asax.cs b/src/Clients/WebForms/Global.asax.cs
index a6837df..9b0f2ae 100644
--- a/src/Clients/WebForms/Global.asax.cs
+++ b/src/Clients/WebForms/Global.asax.cs
@@ -7,7 +7,10 @@ using System.Collections.Generic;
 using System.Web;
 using System.Web.SessionState;
 
-namespace WebForms
+using gbrainy.Core.Services;
+using gbrainy.Core.Main;
+
+namespace gbrainy.Clients.WebForms
 {
 	public class Global : System.Web.HttpApplication
 	{
@@ -25,6 +28,10 @@ namespace WebForms
 				Logger.LogLevel = Level.INFO;
 				Logger.LogDevice = new ConsoleLogger ();
 			}
+			
+			// Setup core services
+			ServiceLocator.Instance.RegisterService <ITranslations> (new TranslationsWeb ());
+			ThemeManager.ConfigPath = Defines.THEMES_DIR;
 
 			Logger.Info ("Global.Application_Start.gbrainy web starting");
 		}
diff --git a/src/Clients/WebForms/LanguageSupport.cs b/src/Clients/WebForms/LanguageSupport.cs
index ec7b619..b5e3965 100644
--- a/src/Clients/WebForms/LanguageSupport.cs
+++ b/src/Clients/WebForms/LanguageSupport.cs
@@ -20,9 +20,9 @@
 using System;
 using Mono.Unix;
 
-namespace WebForms
+namespace gbrainy.Clients.WebForms
 {
-	static public class LanguageSupport
+	static class LanguageSupport
 	{
 		public class Language
 		{
@@ -54,24 +54,6 @@ namespace WebForms
 		{
 			return languages [i];
 		}
-
-		static public String GetString (WebSession session, string str)
-		{
-			// GetText
-			string s = null;
-
-			Environment.SetEnvironmentVariable ("LANGUAGE",
-				LanguageSupport.GetFromIndex (session.LanguageIndex).LangCode);
-
-			Catalog.Init ("gbrainy", "po/");
-			s = Catalog.GetString (str);
-
-			if (String.IsNullOrEmpty (s) == true)
-				return str;
-
-			return s;
-		}
-
 	}
 }
 
diff --git a/src/Clients/WebForms/Logger.cs b/src/Clients/WebForms/Logger.cs
index eb311a7..ecad91e 100644
--- a/src/Clients/WebForms/Logger.cs
+++ b/src/Clients/WebForms/Logger.cs
@@ -20,7 +20,7 @@
 using System;
 using System.IO;
 
-namespace WebForms
+namespace gbrainy.Clients.WebForms
 {
 	public enum Level { DEBUG, INFO, WARN, ERROR, FATAL };
 
diff --git a/src/Clients/WebForms/MasterPage.master b/src/Clients/WebForms/MasterPage.master
index 09c2253..dfefee7 100644
--- a/src/Clients/WebForms/MasterPage.master
+++ b/src/Clients/WebForms/MasterPage.master
@@ -1,4 +1,4 @@
-<%@ Master Language="C#" Inherits="WebForms.MasterPage" AutoEventWireup="true" %>
+<%@ Master Language="C#" Inherits="gbrainy.Clients.WebForms.MasterPage" AutoEventWireup="true" %>
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd";>
 <html>
 <head>
diff --git a/src/Clients/WebForms/MasterPage.master.cs b/src/Clients/WebForms/MasterPage.master.cs
index 508ea8f..c232f25 100644
--- a/src/Clients/WebForms/MasterPage.master.cs
+++ b/src/Clients/WebForms/MasterPage.master.cs
@@ -20,8 +20,7 @@
 using System;
 using System.Web;
 
-
-namespace WebForms
+namespace gbrainy.Clients.WebForms
 {
 	public partial class MasterPage : System.Web.UI.MasterPage
 	{
diff --git a/src/Clients/WebForms/MasterPage.master.designer.cs b/src/Clients/WebForms/MasterPage.master.designer.cs
index 507cad5..493eb9c 100644
--- a/src/Clients/WebForms/MasterPage.master.designer.cs
+++ b/src/Clients/WebForms/MasterPage.master.designer.cs
@@ -8,7 +8,7 @@
 //  </autogenerated>
 // ------------------------------------------------------------------------------
 
-namespace WebForms {
+namespace gbrainy.Clients.WebForms {
 	
 	
 	public partial class MasterPage {
diff --git a/src/Clients/WebForms/Status.aspx b/src/Clients/WebForms/Status.aspx
index 712f74f..214c66f 100644
--- a/src/Clients/WebForms/Status.aspx
+++ b/src/Clients/WebForms/Status.aspx
@@ -1,4 +1,4 @@
-<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Status.aspx.cs" Inherits="WebForms.Status" %>
+<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Status.aspx.cs" Inherits="gbrainy.Clients.WebForms.Status" %>
 
 
 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd";>
diff --git a/src/Clients/WebForms/Status.aspx.cs b/src/Clients/WebForms/Status.aspx.cs
index c06e421..0284811 100644
--- a/src/Clients/WebForms/Status.aspx.cs
+++ b/src/Clients/WebForms/Status.aspx.cs
@@ -25,7 +25,7 @@ using System.Web.UI.WebControls;
 using System.Reflection;
 using System.Diagnostics;
 
-namespace WebForms
+namespace gbrainy.Clients.WebForms
 {
     public partial class Status : System.Web.UI.Page
     {
diff --git a/src/Clients/WebForms/Status.aspx.designer.cs b/src/Clients/WebForms/Status.aspx.designer.cs
index 5a1afa0..f1eea7c 100644
--- a/src/Clients/WebForms/Status.aspx.designer.cs
+++ b/src/Clients/WebForms/Status.aspx.designer.cs
@@ -8,7 +8,7 @@
 //  </autogenerated>
 // ------------------------------------------------------------------------------
 
-namespace WebForms {
+namespace gbrainy.Clients.WebForms {
 	
 	
 	public partial class Status {
diff --git a/src/Clients/WebForms/WebForms.csproj b/src/Clients/WebForms/WebForms.csproj
index d19834d..156f30b 100644
--- a/src/Clients/WebForms/WebForms.csproj
+++ b/src/Clients/WebForms/WebForms.csproj
@@ -31,44 +31,18 @@
     <Reference Include="System" />
     <Reference Include="System.Web" />
     <Reference Include="System.Web.Extensions" />
-    <Reference Include="Mono.Cairo" />
     <Reference Include="Mono.Posix" />
+    <Reference Include="Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
   </ItemGroup>
   <ItemGroup>
     <Content Include="web.config" />
     <Content Include="Default.aspx" />
     <Content Include="Download.aspx" />
-    <Content Include="images\allgames-32.png" />
-    <Content Include="images\endgame-32.png" />
-    <Content Include="images\logic-games-32.png" />
-    <Content Include="images\math-games-32.png" />
-    <Content Include="images\memory-games-32.png" />
-    <Content Include="images\pause-32.png" />
-    <Content Include="images\resume-32.png" />
-    <Content Include="images\verbal-games-32.png" />
     <Content Include="MasterPage.master" />
     <Content Include="styles.css" />
     <Content Include="Status.aspx" />
     <Content Include="Global.asax" />
     <Content Include="Game.aspx" />
-    <Content Include="..\..\..\po\ca.gmo">
-      <Link>locale\ca.gmo</Link>
-      <DeployService-Deploy>true</DeployService-Deploy>
-      <DeployService-RelativeDeployPath>../locale/ca/LC_MESSAGES/gbrainy.mo</DeployService-RelativeDeployPath>
-      <DeployService-TargetDirectoryId>ProgramFiles</DeployService-TargetDirectoryId>
-    </Content>
-    <Content Include="..\..\..\po\de.gmo">
-      <Link>locale\de.gmo</Link>
-      <DeployService-Deploy>true</DeployService-Deploy>
-      <DeployService-RelativeDeployPath>../locale/de/LC_MESSAGES/gbrainy.mo</DeployService-RelativeDeployPath>
-      <DeployService-TargetDirectoryId>ProgramFiles</DeployService-TargetDirectoryId>
-    </Content>
-    <Content Include="..\..\..\po\es.gmo">
-      <Link>locale\es.gmo</Link>
-      <DeployService-Deploy>true</DeployService-Deploy>
-      <DeployService-RelativeDeployPath>../locale/es/LC_MESSAGES/gbrainy.mo</DeployService-RelativeDeployPath>
-      <DeployService-TargetDirectoryId>ProgramFiles</DeployService-TargetDirectoryId>
-    </Content>
     <Content Include="..\..\..\data\verbal_analogies.xml">
       <Link>data\verbal_analogies.xml</Link>
     </Content>
@@ -110,6 +84,8 @@
       <DependentUpon>Global.asax</DependentUpon>
     </Compile>
     <Compile Include="WebSession.cs" />
+    <Compile Include="TranslationsWeb.cs" />
+    <Compile Include="Defines.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v8.0\WebApplications\Microsoft.WebApplication.targets" />
@@ -126,8 +102,6 @@
     </MonoDevelop>
   </ProjectExtensions>
   <ItemGroup>
-    <Folder Include="images\" />
-    <Folder Include="locale\" />
     <Folder Include="data\" />
   </ItemGroup>
   <ItemGroup>
diff --git a/src/Clients/WebForms/WebSession.cs b/src/Clients/WebForms/WebSession.cs
index a85cdeb..188a023 100644
--- a/src/Clients/WebForms/WebSession.cs
+++ b/src/Clients/WebForms/WebSession.cs
@@ -2,7 +2,7 @@ using System;
 using System.Web.SessionState;
 using gbrainy.Core;
 
-namespace WebForms
+namespace gbrainy.Clients.WebForms
 {
 	public class WebSession
 	{
diff --git a/src/Clients/WebForms/package.sh b/src/Clients/WebForms/package.sh
new file mode 100755
index 0000000..a390a81
--- /dev/null
+++ b/src/Clients/WebForms/package.sh
@@ -0,0 +1,43 @@
+#
+# This script creates a package for deploying gbrainy on a web server
+#
+
+rm package -r -f
+mkdir package
+cd package
+
+mkdir bin
+mkdir tmp
+mkdir po
+mkdir data
+mkdir images
+mkdir locale
+mkdir themes
+
+cp ../*.aspx .
+cp ../*.master .
+cp ../*.css .
+cp ../*.asax .
+cp ../web.config .
+
+cp ../bin/* bin
+cp ../../../../data/*.xml data
+cp ../../../../data/game-graphics/* images
+cp ../../../../data/app-graphics/* images
+cp ../../../../data/themes/* themes
+
+mkdir locale/ca
+mkdir locale/ca/LC_MESSAGES
+cp ../../../../po/ca.gmo locale/ca/LC_MESSAGES/gbrainy.mo
+
+mkdir locale/es
+mkdir locale/es/LC_MESSAGES
+cp ../../../../po/es.gmo locale/es/LC_MESSAGES/gbrainy.mo
+
+mkdir locale/de
+mkdir locale/de/LC_MESSAGES
+cp ../../../../po/de.gmo locale/de/LC_MESSAGES/gbrainy.mo
+
+tar -cvf gbrainy_web.tar *
+cp gbrainy_web.tar ../
+ls -l ../gbrainy_web.tar
diff --git a/src/Clients/WebForms/web.config b/src/Clients/WebForms/web.config
index c2a3f2f..e5d367d 100644
--- a/src/Clients/WebForms/web.config
+++ b/src/Clients/WebForms/web.config
@@ -11,12 +11,12 @@ http://msdn2.microsoft.com/en-us/library/b5ysx397.aspx
     <compilation defaultLanguage="C#" debug="true">
       <assemblies>
         <add assembly="Mono.Posix, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
-        <add assembly="Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
         <add assembly="System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" />
+        <add assembly="Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
       </assemblies>
     </compilation>
-    <customErrors mode="RemoteOnly">
-    </customErrors>
+    <!-- Show exceptions to remote users -->
+    <customErrors mode="Off"/>
     <authentication mode="None">
     </authentication>
     <authorization>
@@ -30,4 +30,4 @@ http://msdn2.microsoft.com/en-us/library/b5ysx397.aspx
     <pages>
     </pages>
   </system.web>
-</configuration>
\ No newline at end of file
+</configuration>
diff --git a/src/Core/Core.csproj b/src/Core/Core.csproj
index c332f89..6cdf394 100644
--- a/src/Core/Core.csproj
+++ b/src/Core/Core.csproj
@@ -45,7 +45,7 @@
       <Package>gtk-sharp-2.0</Package>
     </Reference>
     <Reference Include="Mono.CSharp" />
-    <Reference Include="Mono.Cairo" />
+    <Reference Include="Mono.Cairo, Version=2.0.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756" />
   </ItemGroup>
   <ItemGroup>
     <Compile Include="Main\ArrayListIndicesRandom.cs" />
@@ -103,6 +103,12 @@
     <Compile Include="Main\Xml\TextDrawingObject.cs" />
     <Compile Include="Main\Xml\DrawingObject.cs" />
     <Compile Include="Main\PdfExporter.cs" />
+    <Compile Include="Services\IService.cs" />
+    <Compile Include="Services\ITranslations.cs" />
+    <Compile Include="Services\ServiceLocator.cs" />
+    <Compile Include="Main\Theme.cs" />
+    <Compile Include="Main\ThemeManager.cs" />
+    <Compile Include="Libraries\TranslationsCatalog.cs" />
   </ItemGroup>
   <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
   <ProjectExtensions>
@@ -114,10 +120,6 @@
     <Folder Include="Resources\" />
   </ItemGroup>
   <ItemGroup>
-    <EmbeddedResource Include="..\..\data\app-graphics\background.svg">
-      <Link>Resources\background.svg</Link>
-      <LogicalName>background.svg</LogicalName>
-    </EmbeddedResource>
     <EmbeddedResource Include="..\..\data\app-graphics\endgame.svg">
       <Link>Resources\endgame.svg</Link>
       <LogicalName>endgame.svg</LogicalName>
diff --git a/src/Core/Libraries/TranslationsCatalog.cs b/src/Core/Libraries/TranslationsCatalog.cs
new file mode 100644
index 0000000..04ee810
--- /dev/null
+++ b/src/Core/Libraries/TranslationsCatalog.cs
@@ -0,0 +1,42 @@
+/*
+ * Copyright (C) 2011 Jordi Mas i Hernàndez <jmas softcatala org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+using Mono.Unix;
+
+namespace gbrainy.Core.Services
+{
+	public class TranslationsCatalog : ITranslations
+	{
+		public void Init (string package, string localedir)
+		{
+			Catalog.Init (package, localedir);
+		}
+		
+		public string GetString (string s)
+		{
+			return Catalog.GetString (s);
+		}
+
+		public string GetPluralString (string s, string p, int n)
+		{
+			return Catalog.GetPluralString (s, p, n);
+		}
+	}
+}
+
diff --git a/src/Core/Main/ColorPalette.cs b/src/Core/Main/ColorPalette.cs
index 508587e..23a3c72 100644
--- a/src/Core/Main/ColorPalette.cs
+++ b/src/Core/Main/ColorPalette.cs
@@ -19,7 +19,7 @@
  */
 
 using Cairo;
-using Mono.Unix;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main
 {
@@ -45,14 +45,14 @@ namespace gbrainy.Core.Main
 		};
 
 		private static readonly string[] ColorName= new string[] {
-			Catalog.GetString ("red"),
-			Catalog.GetString ("green"),
-			Catalog.GetString ("blue"),
-			Catalog.GetString ("yellow"),
-			Catalog.GetString ("magenta"),
-			Catalog.GetString ("orange"),
-			Catalog.GetString ("black"),
-			Catalog.GetString ("white")
+			ServiceLocator.Instance.GetService <ITranslations> ().GetString ("red"),
+			ServiceLocator.Instance.GetService <ITranslations> ().GetString ("green"),
+			ServiceLocator.Instance.GetService <ITranslations> ().GetString ("blue"),
+			ServiceLocator.Instance.GetService <ITranslations> ().GetString ("yellow"),
+			ServiceLocator.Instance.GetService <ITranslations> ().GetString ("magenta"),
+			ServiceLocator.Instance.GetService <ITranslations> ().GetString ("orange"),
+			ServiceLocator.Instance.GetService <ITranslations> ().GetString ("black"),
+			ServiceLocator.Instance.GetService <ITranslations> ().GetString ("white")
 		};
 
 		private static Cairo.Color[] CairoColor = new Cairo.Color[] {
diff --git a/src/Core/Main/Game.cs b/src/Core/Main/Game.cs
index dfed7d2..9283974 100644
--- a/src/Core/Main/Game.cs
+++ b/src/Core/Main/Game.cs
@@ -22,9 +22,10 @@ using System.ComponentModel;
 using System.Collections.Generic;
 using System.Text.RegularExpressions;
 using System.Text;
-using Mono.Unix;
+
 
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main
 {
@@ -148,13 +149,13 @@ namespace gbrainy.Core.Main
 			get {
 				string str;
 
-				str = String.Format (Catalog.GetString ("The correct answer is {0}."), AnswerValue);
+				str = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The correct answer is {0}."), AnswerValue);
 
 				if (String.IsNullOrEmpty (Rationale))
 					return str;
 				
 				// Translators: answer + rationale of the answer
-				return String.Format (Catalog.GetString ("{0} {1}"), str, Rationale);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} {1}"), str, Rationale);
 			}
 		}
 
@@ -314,21 +315,21 @@ namespace gbrainy.Core.Main
 				// For languages represented with the Latin alphabet use
 				// the same than English
 			case 0: // First possible answer for a series (e.g.: Figure A)
-				return Catalog.GetString ("A");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A");
 			case 1: // Second possible answer for a series
-				return Catalog.GetString ("B");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("B");
 			case 2: // Third possible answer for a series
-				return Catalog.GetString ("C");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("C");
 			case 3: // Fourth possible answer for a series
-				return Catalog.GetString ("D");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("D");
 			case 4: // Fifth possible answer for a series
-				return Catalog.GetString ("E");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("E");
 			case 5: // Sixth possible answer for a series
-				return Catalog.GetString ("F");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("F");
 			case 6: // Seventh possible answer for a series
-				return Catalog.GetString ("G");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("G");
 			case 7: // Eighth possible answer for a series
-				return Catalog.GetString ("H");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("H");
 			default:
 				throw new ArgumentOutOfRangeException ("Do not have an option for this answer");
 			}
@@ -336,7 +337,7 @@ namespace gbrainy.Core.Main
 
 		public string GetPossibleFigureAnswer (int answer)
 		{
-			return String.Format (Catalog.GetString ("Figure {0}"), GetPossibleAnswer (answer));
+			return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Figure {0}"), GetPossibleAnswer (answer));
 		}
 
 		protected void InitDraw (CairoContextEx gr, int width, int height, bool rtl)
diff --git a/src/Core/Main/GameManager.cs b/src/Core/Main/GameManager.cs
index b66d849..b40e61f 100644
--- a/src/Core/Main/GameManager.cs
+++ b/src/Core/Main/GameManager.cs
@@ -20,7 +20,8 @@
 using System;
 using System.Collections.Generic;
 using System.Reflection;
-using Mono.Unix;
+
+using gbrainy.Core.Services;
 
 #if MONO_ADDINS
 using Mono.Addins;
@@ -170,8 +171,13 @@ namespace gbrainy.Core.Main
 				// Expects the assembly to be in the same dir than this assembly
 				Assembly asm = Assembly.GetExecutingAssembly ();
 				string asm_dir = System.IO.Path.GetDirectoryName (asm.Location);
-
+#if _ASPNET_	
+				string s = System.IO.Path.GetFileName (file);
+				AssemblyName aname = AssemblyName.GetAssemblyName (file);
+				asem = Assembly.Load (aname);
+#else
 				asem = Assembly.LoadFrom (System.IO.Path.Combine (asm_dir, file));
+#endif				
 
 				foreach (Type t in asem.GetTypes())
 				{
@@ -310,13 +316,13 @@ namespace gbrainy.Core.Main
 		{
 			String s = string.Empty;
 	#if MONO_ADDINS
-			s += Catalog.GetString ("Extensions database:") + " " + 
+			s += ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Extensions database:") + " " + 
 					System.IO.Path.Combine (Environment.GetFolderPath (Environment.SpecialFolder.ApplicationData), "gbrainy");
 
 			s += Environment.NewLine;
 	#endif
 			// Translators: 'Games registered' is the games know to gbrainy (build-in and load from addins-in and external files)
-			s += String.Format (Catalog.GetString ("Games registered: {0}: {1} logic puzzles, {2} calculation trainers, {3} memory trainers, {4} verbal analogies"),
+			s += String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Games registered: {0}: {1} logic puzzles, {2} calculation trainers, {3} memory trainers, {4} verbal analogies"),
 					cnt_logic + cnt_memory + cnt_calculation + cnt_verbal,
 					cnt_logic, cnt_calculation, cnt_memory, cnt_verbal);
 
diff --git a/src/Core/Main/GameSession.cs b/src/Core/Main/GameSession.cs
index 835bbba..c486570 100644
--- a/src/Core/Main/GameSession.cs
+++ b/src/Core/Main/GameSession.cs
@@ -18,11 +18,11 @@
  */
 
 using System;
-using Mono.Unix;
 using System.Timers;
 using System.ComponentModel;
 
 using gbrainy.Core.Views;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main
 {
@@ -174,17 +174,17 @@ namespace gbrainy.Core.Main
 
 				string played, time, game;
 
-				played = String.Format (Catalog.GetString ("Games played: {0} (Score: {1})"), history.GamesPlayed, history.TotalScore);
-				time = String.Format (Catalog.GetString ("Time: {0}"), current_time);
+				played = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Games played: {0} (Score: {1})"), history.GamesPlayed, history.TotalScore);
+				time = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Time: {0}"), current_time);
 
 				if (CurrentGame != null) {
 					// Translators: {0} is the name of the game
-	 				game = String.Format (Catalog.GetString ("Game: {0}"), CurrentGame.Name);
+	 				game = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Game: {0}"), CurrentGame.Name);
 					// Translators: text in the status bar: games played - time - game name
-					return String.Format (Catalog.GetString ("{0} - {1} - {2}"), played, time, game);
+					return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} - {1} - {2}"), played, time, game);
 				} else {
 					// Translators: text in the status bar: games played - time
-					return String.Format (Catalog.GetString ("{0} - {1}"), played, time);
+					return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} - {1}"), played, time);
 				}	
 			}
 		}
@@ -197,14 +197,14 @@ namespace gbrainy.Core.Main
 				if (history.GamesPlayed >= 10) {
 					int percentage_won = (int) (100 * history.GamesWon / history.GamesPlayed);
 					if (percentage_won >= 90)
-						s = Catalog.GetString ("Outstanding results");
+						s = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Outstanding results");
 					else if (percentage_won >= 70)
-						s = Catalog.GetString ("Excellent results");
+						s = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Excellent results");
 					else if (percentage_won >= 50)
-						s = Catalog.GetString ("Good results");
+						s = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Good results");
 					else if (percentage_won >= 30)
-						s = Catalog.GetString ("Poor results");
-					else s = Catalog.GetString ("Disappointing results");
+						s = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Poor results");
+					else s = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Disappointing results");
 				} else
 					s = string.Empty;
 	
@@ -273,7 +273,7 @@ namespace gbrainy.Core.Main
 		{
 			EnableTimer = false;
 			paused = true;
-			current_time = Catalog.GetString ("Paused");
+			current_time = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Paused");
 
 			if (CurrentGame != null)
 				CurrentGame.EnableMouseEvents (false);
diff --git a/src/Core/Main/GameTips.cs b/src/Core/Main/GameTips.cs
index b386b10..22e1f21 100644
--- a/src/Core/Main/GameTips.cs
+++ b/src/Core/Main/GameTips.cs
@@ -19,7 +19,8 @@
 
 
 using System;
-using Mono.Unix;
+
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main
 {
@@ -48,35 +49,35 @@ namespace gbrainy.Core.Main
 		{
 			switch (tip) {
 			case 0:
-				return Catalog.GetString ("Read the instructions carefully and identify the data and given clues.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Read the instructions carefully and identify the data and given clues.");
 			case 1:
-				return Catalog.GetString ("To score the player gbrainy uses the time and tips needed to complete each game.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("To score the player gbrainy uses the time and tips needed to complete each game.");
 			case 2:
-				return Catalog.GetString ("In logic games, elements that may seem irrelevant can be very important.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In logic games, elements that may seem irrelevant can be very important.");
 			case 3:
-				return Catalog.GetString ("Break the mental blocks and look into the boundaries of problems.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Break the mental blocks and look into the boundaries of problems.");
 			case 4:
-				return Catalog.GetString ("Enjoy making mistakes, they are part of the learning process.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Enjoy making mistakes, they are part of the learning process.");
 			case 5:
-				return Catalog.GetString ("Do all the problems, even the difficult ones. Improvement comes from practicing.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Do all the problems, even the difficult ones. Improvement comes from practicing.");
 			case 6:
-				return Catalog.GetString ("Play on a daily basis, you will notice progress soon.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Play on a daily basis, you will notice progress soon.");
 			case 7: // Translators: Custom Game Selection is a menu option
-				return Catalog.GetString ("Use the 'Custom Game Selection' to choose exactly which games you want to play.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Use the 'Custom Game Selection' to choose exactly which games you want to play.");
 			case 8:
-				return Catalog.GetString ("Use the Settings to adjust the difficulty level of the game.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Use the Settings to adjust the difficulty level of the game.");
 			case 9:
-				return Catalog.GetString ("Association of elements is a common technique for remembering things.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Association of elements is a common technique for remembering things.");
 			case 10:
-				return Catalog.GetString ("Grouping elements into categories is a common technique for remembering things.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Grouping elements into categories is a common technique for remembering things.");
 			case 11:
-				return Catalog.GetString ("Build acronyms using the first letter of each fact to be remembered.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Build acronyms using the first letter of each fact to be remembered.");
 			case 12:
-				return Catalog.GetString ("The enjoyment obtained from a puzzle is proportional to the time spent on it.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The enjoyment obtained from a puzzle is proportional to the time spent on it.");
 			case 13:
-				return Catalog.GetString ("Think of breaking down every problem into simpler components.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Think of breaking down every problem into simpler components.");
 			case 14:
-				return Catalog.GetString ("When answering verbal analogies pay attention to the verb tense.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("When answering verbal analogies pay attention to the verb tense.");
 			default:
 				throw new InvalidOperationException ();
 			}
diff --git a/src/Core/Main/GameTypes.cs b/src/Core/Main/GameTypes.cs
index 061701e..8c0d4c4 100644
--- a/src/Core/Main/GameTypes.cs
+++ b/src/Core/Main/GameTypes.cs
@@ -18,7 +18,8 @@
  */
 
 using System;
-using Mono.Unix;
+
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main
 {
@@ -41,13 +42,13 @@ namespace gbrainy.Core.Main
 			switch (type) 
 			{
 				case GameTypes.LogicPuzzle:
-					return Catalog.GetString ("Logic");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Logic");
 				case GameTypes.Memory:
-					return Catalog.GetString ("Memory");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memory");
 				case GameTypes.Calculation:
-					return Catalog.GetString ("Calculation");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Calculation");
 				case GameTypes.VerbalAnalogy:
-					return Catalog.GetString ("Verbal");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Verbal");
 				default:
 					throw new InvalidOperationException ("Unknown game type");
 			}
diff --git a/src/Core/Main/Memory.cs b/src/Core/Main/Memory.cs
index 56d1e9d..29db301 100644
--- a/src/Core/Main/Memory.cs
+++ b/src/Core/Main/Memory.cs
@@ -19,8 +19,8 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 using System.Timers;
+using gbrainy.Core.Services;
 
 using gbrainy.Core.Views;
 
@@ -50,7 +50,7 @@ namespace gbrainy.Core.Main
 
 		public override string Question {
 			get {
-				return Catalog.GetString ("Memorize the objects below in the given time");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memorize the objects below in the given time");
 			}
 		}
 
@@ -213,7 +213,7 @@ namespace gbrainy.Core.Main
 			double width = 0.04, height = 0.6;
 			const double w = 0.003, h = 0.003;
 
-			gr.DrawTextCentered (x + (width / 2), y + height + 0.05, Catalog.GetString ("Time left"));
+			gr.DrawTextCentered (x + (width / 2), y + height + 0.05, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Time left"));
 			gr.Stroke ();
 
 			gr.Save ();
diff --git a/src/Core/Main/PdfExporter.cs b/src/Core/Main/PdfExporter.cs
index f50ffa1..5d0d66f 100644
--- a/src/Core/Main/PdfExporter.cs
+++ b/src/Core/Main/PdfExporter.cs
@@ -18,10 +18,10 @@
  */
 
 using System;
-using Mono.Unix;
-
 using Cairo;
+
 using gbrainy.Core.Libraries;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main
 {
@@ -101,7 +101,7 @@ namespace gbrainy.Core.Main
 
 				// Translators: {0} is the game number and {1} the game question or answer
 				// The number is used as reference when looking for the game solution in the PDF
-				str = String.Format (Catalog.GetString ("Game {0}. {1}"), i + 1, puzzle.Question);
+				str = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Game {0}. {1}"), i + 1, puzzle.Question);
 
 				// Draw question
 				cr.SetPangoFontSize (12);
@@ -118,7 +118,7 @@ namespace gbrainy.Core.Main
 					cr.Save ();
 					cr.SetPangoFontSize (0.02);
 					cr.MoveTo (0.05, 0.95);
-					cr.ShowPangoText (String.Format (Catalog.GetString ("Created by gbrainy {0}"), Defines.VERSION));
+					cr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Created by gbrainy {0}"), Defines.VERSION));
 					cr.Stroke ();
 					cr.Restore ();
 				}				
@@ -154,7 +154,7 @@ namespace gbrainy.Core.Main
 			// Draw solution title
 			cr.SetPangoFontSize (20);
 			cr.DrawStringWithWrapping (x + margin, y + margin,
-				Catalog.GetString ("Solutions"), width - margin);
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Solutions"), width - margin);
 			y += space_lines;
 			cr.Stroke ();
 
@@ -162,7 +162,7 @@ namespace gbrainy.Core.Main
 			cr.UseMarkup = true;
 			for (int i = 0; i < games.Length; i++)
 			{
-				str = String.Format (Catalog.GetString ("Game {0}. {1}"), i + 1, games[i].Answer);
+				str = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Game {0}. {1}"), i + 1, games[i].Answer);
 
 				// Draw Solution
 				cr.DrawStringWithWrapping (x + margin, y + margin, str, width - margin);
diff --git a/src/Core/Main/ThemeManager.cs b/src/Core/Main/ThemeManager.cs
index ee484d9..941fe8c 100644
--- a/src/Core/Main/ThemeManager.cs
+++ b/src/Core/Main/ThemeManager.cs
@@ -65,8 +65,6 @@ namespace gbrainy.Core.Main
 			throw new InvalidOperationException (String.Format ("ThemeManager. Theme not found '{0}'", name));
 		}
 
-
-
 		static public void Load ()
 		{
 			try {
diff --git a/src/Core/Main/Verbal/Analogies.cs b/src/Core/Main/Verbal/Analogies.cs
index 817fad3..d1ca366 100644
--- a/src/Core/Main/Verbal/Analogies.cs
+++ b/src/Core/Main/Verbal/Analogies.cs
@@ -19,9 +19,9 @@
 
 using System;
 using System.Collections.Generic;
-using gbrainy.Core.Libraries;
 
-using Mono.Unix;
+using gbrainy.Core.Libraries;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main.Verbal
 {
@@ -53,13 +53,13 @@ namespace gbrainy.Core.Main.Verbal
 				if (current == null || current.MultipleAnswers == false)
 					return base.Answer;
 
-				str = String.Format (Catalog.GetString ("Possible correct answers are: {0}."), AnswerValue);
+				str = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible correct answers are: {0}."), AnswerValue);
 
 				if (String.IsNullOrEmpty (Rationale))
 					return str;
 				
 				// Translators: answer + rationale of the answer
-				return  String.Format (Catalog.GetString ("{0} {1}"), str, Rationale);
+				return  String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} {1}"), str, Rationale);
 			}
 		}
 
@@ -88,7 +88,7 @@ namespace gbrainy.Core.Main.Verbal
 					if (i + 1 < items.Length) {
 						// Translators: this the separator used when concatenating multiple possible answers for verbal analogies
 						// For example: "Possible correct answers are: sleep, rest."
-						str += Catalog.GetString (", ");
+						str += ServiceLocator.Instance.GetService <ITranslations> ().GetString (", ");
 					}
 				}
 				return str;
@@ -131,7 +131,7 @@ namespace gbrainy.Core.Main.Verbal
 					if (GetText.StringExists (analogy.answers [indices[i]]) == false)
 						localized = false;
 
-					answers [i] = Catalog.GetString (analogy.answers [indices[i]]);
+					answers [i] = ServiceLocator.Instance.GetService <ITranslations> ().GetString (analogy.answers [indices[i]]);
 					if (indices[i] == analogy.right)
 						new_right = i;
 				}
@@ -145,13 +145,13 @@ namespace gbrainy.Core.Main.Verbal
 				localized = false;
 
 			if (localized == true) {
-				analogy.question = Catalog.GetString (analogy.question);
+				analogy.question = ServiceLocator.Instance.GetService <ITranslations> ().GetString (analogy.question);
 
 				if (String.IsNullOrEmpty (analogy.tip) == false)
-					analogy.tip = Catalog.GetString (analogy.tip);
+					analogy.tip = ServiceLocator.Instance.GetService <ITranslations> ().GetString (analogy.tip);
 
 				if (String.IsNullOrEmpty (analogy.rationale) == false)
-					analogy.rationale = Catalog.GetString (analogy.rationale);
+					analogy.rationale = ServiceLocator.Instance.GetService <ITranslations> ().GetString (analogy.rationale);
 			} else {
 
 				// Get analogy again
diff --git a/src/Core/Main/Verbal/AnalogiesFactory.cs b/src/Core/Main/Verbal/AnalogiesFactory.cs
index 1c51e98..8066fe8 100644
--- a/src/Core/Main/Verbal/AnalogiesFactory.cs
+++ b/src/Core/Main/Verbal/AnalogiesFactory.cs
@@ -22,7 +22,7 @@ using System.Xml;
 using System.IO;
 using System.Collections.Generic;
 
-using Mono.Unix;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main.Verbal
 {
@@ -74,7 +74,7 @@ namespace gbrainy.Core.Main.Verbal
 						else {
 							if (reader.NodeType == XmlNodeType.EndElement &&
 								// Ignores verbal analogies disabled for a specific locale
-								Catalog.GetString (analogy.question) != IgnoreAnalogy) {
+								ServiceLocator.Instance.GetService <ITranslations> ().GetString (analogy.question) != IgnoreAnalogy) {
 								analogy.answers = answers.ToArray ();
 								analogies_arrays [(int) analogy.type].Add (analogies_arrays [(int) analogy.type].Count, analogy);
 							}
diff --git a/src/Core/Main/Verbal/AnalogiesMultipleOptions.cs b/src/Core/Main/Verbal/AnalogiesMultipleOptions.cs
index ffaeb77..1514c6d 100644
--- a/src/Core/Main/Verbal/AnalogiesMultipleOptions.cs
+++ b/src/Core/Main/Verbal/AnalogiesMultipleOptions.cs
@@ -22,10 +22,10 @@ using System.IO;
 using System.Collections.Generic;
 
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Libraries;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main.Verbal
 {
@@ -40,7 +40,7 @@ namespace gbrainy.Core.Main.Verbal
 		}
 
 		public override string Name {
-			get { return String.Format (Catalog.GetString ("Multiple options #{0}"), Variant);}
+			get { return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Multiple options #{0}"), Variant);}
 		}
 
 		public override string Question {
@@ -60,13 +60,13 @@ namespace gbrainy.Core.Main.Verbal
 					if (n +1 < current.answers.Length) {
 						// Translators: this the separator used when concatenating possible options for answering verbal analogies
 						// For example: "Possible correct answers are: a, b, c, d."						
-						str += Catalog.GetString (", ");
+						str += ServiceLocator.Instance.GetService <ITranslations> ().GetString (", ");
 					}
 				}
 
 				// Translators: {0} is replaced by a question and {1} by the suggestions on how to answer
 				// E.g: What is the correct option? Answer A, B, C.
-				return String.Format (Catalog.GetString ("{0} Answer {1}."),
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} Answer {1}."),
 					current.question,
 					str);
 			}
@@ -102,7 +102,7 @@ namespace gbrainy.Core.Main.Verbal
 					int n = (int) e.Data;
 
 					e.Context.MoveTo (0.05, 0.02);
-					e.Context.ShowPangoText (String.Format (Catalog.GetString ("{0}) {1}"), GetPossibleAnswer (n), current.answers[n].ToString ()));
+					e.Context.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}) {1}"), GetPossibleAnswer (n), current.answers[n].ToString ()));
 				};
 			}
 		}
@@ -116,7 +116,7 @@ namespace gbrainy.Core.Main.Verbal
 
 			gr.SetPangoLargeFontSize ();
 			gr.MoveTo (0.1, DrawAreaY + 0.05);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 		}
 	}
 }
diff --git a/src/Core/Main/Verbal/AnalogiesPairOfWordsCompare.cs b/src/Core/Main/Verbal/AnalogiesPairOfWordsCompare.cs
index f890a07..ea6848c 100644
--- a/src/Core/Main/Verbal/AnalogiesPairOfWordsCompare.cs
+++ b/src/Core/Main/Verbal/AnalogiesPairOfWordsCompare.cs
@@ -20,8 +20,7 @@
 using System;
 using System.Collections.Generic;
 
-using Mono.Unix;
-
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main.Verbal
 {
@@ -39,7 +38,7 @@ namespace gbrainy.Core.Main.Verbal
 		}
 
 		public override string Name {
-			get { return String.Format (Catalog.GetString ("Pair of words compare #{0}"), Variant);}
+			get { return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Pair of words compare #{0}"), Variant);}
 		}
 
 		public override Dictionary <int, Analogy> List {
@@ -54,7 +53,7 @@ namespace gbrainy.Core.Main.Verbal
 				if (current.answers == null)
 					return current.question;
 
-				return String.Format (Catalog.GetString (
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString (
 					"Given the relationship between the two words below, which word has the same relationship to '{0}'?"),
 					sample);
 			}
@@ -91,7 +90,7 @@ namespace gbrainy.Core.Main.Verbal
 
 			gr.SetPangoLargeFontSize ();
 			gr.DrawTextCentered (0.5, y + 0.25,
-				String.Format (Catalog.GetString ("Words: {0}"), samples));
+				String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Words: {0}"), samples));
 		}
 	}
 }
diff --git a/src/Core/Main/Verbal/AnalogiesPairOfWordsOptions.cs b/src/Core/Main/Verbal/AnalogiesPairOfWordsOptions.cs
index f9970ab..fbfd255 100644
--- a/src/Core/Main/Verbal/AnalogiesPairOfWordsOptions.cs
+++ b/src/Core/Main/Verbal/AnalogiesPairOfWordsOptions.cs
@@ -19,9 +19,9 @@
 
 using System;
 using System.Collections.Generic;
-using Mono.Unix;
 
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main.Verbal
 {
@@ -37,7 +37,7 @@ namespace gbrainy.Core.Main.Verbal
 		}
 
 		public override string Name {
-			get { return String.Format (Catalog.GetString ("Pair of words #{0}"), Variant);}
+			get { return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Pair of words #{0}"), Variant);}
 		}
 
 		public override Dictionary <int, Analogy> List {
@@ -61,11 +61,11 @@ namespace gbrainy.Core.Main.Verbal
 					if (n +1 < current.answers.Length) {
 						// Translators: this the separator used when concatenating possible options for answering verbal analogies
 						// For example: "Possible correct answers are: a, b, c, d."						
-						str += Catalog.GetString (", ");
+						str += ServiceLocator.Instance.GetService <ITranslations> ().GetString (", ");
 					}
 				}
 
-				return String.Format (Catalog.GetString (
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString (
 					"Given the relationship between the two words below, which word has the same relationship to '{0}'?"),
 					sample);
 			}
@@ -109,7 +109,7 @@ namespace gbrainy.Core.Main.Verbal
 
 					//e.Context.SetPangoLargeFontSize ();
 					e.Context.MoveTo (0.05, 0.02);
-					e.Context.ShowPangoText (String.Format (Catalog.GetString ("{0}) {1}"), GetPossibleAnswer (n), current.answers[n].ToString ()));
+					e.Context.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}) {1}"), GetPossibleAnswer (n), current.answers[n].ToString ()));
 				};
 			}
 		}
@@ -126,11 +126,11 @@ namespace gbrainy.Core.Main.Verbal
 			gr.SetPangoLargeFontSize ();
 
 			gr.MoveTo (0.1, y + 0.12);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 			gr.Stroke ();
 
 			gr.DrawTextCentered (0.5, y,
-				String.Format (Catalog.GetString ("Words: {0}"), samples));
+				String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Words: {0}"), samples));
 
 		}
 	}
diff --git a/src/Core/Main/Verbal/AnalogiesQuestionAnswer.cs b/src/Core/Main/Verbal/AnalogiesQuestionAnswer.cs
index 0978b34..619ab81 100644
--- a/src/Core/Main/Verbal/AnalogiesQuestionAnswer.cs
+++ b/src/Core/Main/Verbal/AnalogiesQuestionAnswer.cs
@@ -20,7 +20,7 @@
 using System;
 using System.Collections.Generic;
 
-using Mono.Unix;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main.Verbal
 {
@@ -35,7 +35,7 @@ namespace gbrainy.Core.Main.Verbal
 		}
 
 		public override string Name {
-			get { return String.Format (Catalog.GetString ("Question and answer #{0}"), Variant);}
+			get { return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Question and answer #{0}"), Variant);}
 		}
 
 		public override Dictionary <int, Analogy> List {
diff --git a/src/Core/Main/Xml/GameXml.cs b/src/Core/Main/Xml/GameXml.cs
index 389a515..0230f6b 100644
--- a/src/Core/Main/Xml/GameXml.cs
+++ b/src/Core/Main/Xml/GameXml.cs
@@ -21,9 +21,8 @@ using System;
 using System.Collections.Generic;
 using System.IO;
 
-using Mono.Unix;
-
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Main.Xml
 {
@@ -109,7 +108,7 @@ namespace gbrainy.Core.Main.Xml
 		}
 
 		public override string Name {
-			get { return Catalog.GetString (game.Name); }
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString (game.Name); }
 		}
 
 		public override string Question {
@@ -123,10 +122,10 @@ namespace gbrainy.Core.Main.Xml
 		public override string Tip {
 			get {
 				if (game.Variants.Count > 0 && game.Variants[current.Variant].Tip != null)
-					return Catalog.GetString (game.Variants[current.Variant].Tip);
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString (game.Variants[current.Variant].Tip);
 				else
 					if (String.IsNullOrEmpty (game.Tip) == false)
-						return Catalog.GetString (game.Tip);
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString (game.Tip);
 					else
 						return null;
 			}
@@ -216,12 +215,12 @@ namespace gbrainy.Core.Main.Xml
 				}
 	
 				for (int i = 0; i < options.Count - 1; i++)
-					answers += String.Format (Catalog.GetString ("{0}, "), GetPossibleAnswer (i));
+					answers += String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}, "), GetPossibleAnswer (i));
 
-				answers += String.Format (Catalog.GetString ("{0}."), GetPossibleAnswer (options.Count - 1));
+				answers += String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}."), GetPossibleAnswer (options.Count - 1));
 
 				// Translators {0}: list of options (A, B, C)
-				answers = String.Format (Catalog.GetString ("Answer {0}"), answers);
+				answers = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Answer {0}"), answers);
 				question = question.Replace (option_answers, answers);					
 			}
 			else
@@ -464,7 +463,7 @@ namespace gbrainy.Core.Main.Xml
 		{
 			string answer;
 			
-			answer = String.Format (Catalog.GetString ("{0}) "), GetPossibleAnswer (option));
+			answer = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}) "), GetPossibleAnswer (option));
 			return str.Replace (option_prefix, answer);
 		}
 
@@ -486,7 +485,7 @@ namespace gbrainy.Core.Main.Xml
 			if (String.IsNullOrEmpty (str))
 				return str;
 
-			return Catalog.GetString (str);
+			return ServiceLocator.Instance.GetService <ITranslations> ().GetString (str);
 		}
 
 		// Protect from calling with null + resolve plurals
@@ -498,7 +497,7 @@ namespace gbrainy.Core.Main.Xml
 			if (localizable.IsPlural () == false)
 				return CatalogGetString (localizable.String);
 
-			return Catalog.GetPluralString (localizable.String, localizable.PluralString, localizable.ValueComputed);
+			return ServiceLocator.Instance.GetService <ITranslations> ().GetPluralString (localizable.String, localizable.PluralString, localizable.ValueComputed);
 		}
 	}
 }
diff --git a/src/Core/Makefile.am b/src/Core/Makefile.am
index 013431d..1010a6f 100644
--- a/src/Core/Makefile.am
+++ b/src/Core/Makefile.am
@@ -62,7 +62,11 @@ CSDISTFILES =  \
 		$(srcdir)/Platform/Unix.cs		\
 		$(srcdir)/Libraries/CairoContext.cs	\
 		$(srcdir)/Libraries/GetText.cs		\
-		$(srcdir)/Libraries/SVGImage.cs
+		$(srcdir)/Libraries/SVGImage.cs		\
+		$(srcdir)/Services/IService.cs		\
+		$(srcdir)/Services/ServiceLocator.cs	\
+		$(srcdir)/Services/ITranslations.cs	\
+		$(srcdir)/Libraries/TranslationsCatalog.cs
 
 CSFILES = $(CSDISTFILES)	\
 	Main/Defines.cs	\
diff --git a/src/Core/Services/IService.cs b/src/Core/Services/IService.cs
new file mode 100644
index 0000000..dbc376e
--- /dev/null
+++ b/src/Core/Services/IService.cs
@@ -0,0 +1,27 @@
+/*
+ * Copyright (C) 2011 Jordi Mas i Hernàndez <jmas softcatala org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+namespace gbrainy.Core.Services
+{
+	public interface IService
+	{
+
+	}
+}
+
diff --git a/src/Core/Services/ITranslations.cs b/src/Core/Services/ITranslations.cs
new file mode 100644
index 0000000..96515ba
--- /dev/null
+++ b/src/Core/Services/ITranslations.cs
@@ -0,0 +1,29 @@
+/*
+ * Copyright (C) 2011 Jordi Mas i Hernàndez <jmas softcatala org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+namespace gbrainy.Core.Services
+{
+	public interface ITranslations : IService
+	{
+		void Init (string package, string localedir);
+		string GetString (string s);
+		string GetPluralString (string s, string p, int n);
+	}
+}
+
diff --git a/src/Core/Services/ServiceLocator.cs b/src/Core/Services/ServiceLocator.cs
new file mode 100644
index 0000000..66642b5
--- /dev/null
+++ b/src/Core/Services/ServiceLocator.cs
@@ -0,0 +1,79 @@
+/*
+ * Copyright (C) 2011 Jordi Mas i Hernàndez <jmas softcatala org>
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public
+ * License along with this program; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+using System;
+using System.Collections.Generic;
+using SL = gbrainy.Core.Services.ServiceLocator;
+
+namespace gbrainy.Core.Services
+{
+	public class ServiceLocator
+	{
+		Dictionary <Type, object> services;
+		static ServiceLocator instance = new ServiceLocator ();
+		static readonly object  sync = new object ();
+
+		public ServiceLocator ()
+		{
+			services = new Dictionary <Type, object> ();
+		}
+
+		public static ServiceLocator Instance {
+			get {
+				return instance;
+			}
+		}
+
+		public void RegisterService <T> (T service) where T : class, IService
+		{
+			Type  t = typeof (T);
+
+			lock (sync)
+			{
+				if (services.ContainsKey (t) == false)
+				{
+					services.Add (t, service);
+				}
+				else
+				{
+					services[t] = service;
+				}
+			}
+		}
+
+		public T GetService <T> () where T: IService
+		{
+			lock (sync)
+			{
+				try
+				{
+					return (T) services [typeof (T)];
+				}
+
+				catch (KeyNotFoundException)
+				{
+					string service = typeof (T).ToString ();
+
+					throw new InvalidOperationException (
+						String.Format ("ServiceLocator. The requested service {0} is not registered", service));
+				}
+			}
+		}
+	}
+}
diff --git a/src/Core/Views/CountDownView.cs b/src/Core/Views/CountDownView.cs
index 4ae6784..03f892e 100644
--- a/src/Core/Views/CountDownView.cs
+++ b/src/Core/Views/CountDownView.cs
@@ -20,11 +20,11 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 using System.Timers;
 using System.ComponentModel;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Views
 {
@@ -78,7 +78,7 @@ namespace gbrainy.Core.Views
 			gr.Color = new Cairo.Color (0, 0, 0, 1);
 
 			gr.SetPangoLargeFontSize ();
-			gr.DrawTextCentered (0.5, 0.1, Catalog.GetString ("Get ready to memorize the next objects..."));
+			gr.DrawTextCentered (0.5, 0.1, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Get ready to memorize the next objects..."));
 			gr.Stroke ();
 
 			gr.SetPangoFontSize (0.35);
diff --git a/src/Core/Views/FinishView.cs b/src/Core/Views/FinishView.cs
index c41c66f..57a7860 100644
--- a/src/Core/Views/FinishView.cs
+++ b/src/Core/Views/FinishView.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 using System.Collections.Generic;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Views
 {
@@ -94,35 +94,35 @@ namespace gbrainy.Core.Views
 
 			x = x + space_x;
 			DrawBar (gr, x, y + area_h, bar_w, bar_h, session.History.TotalScore);
-			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, Catalog.GetString ("Total"));
+			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Total"));
 
 			x = x + space_x * 2;
 
 			if (session.History.LogicPlayed > 0)
 				DrawBar (gr, x, y + area_h, bar_w, bar_h, session.History.LogicScore);
 
-			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, 	Catalog.GetString ("Logic")); 
+			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, 	ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Logic")); 
 
 			x = x + space_x * 2;
 
 			if (session.History.MathPlayed > 0)
 				DrawBar (gr, x, y + area_h, bar_w, bar_h, session.History.MathScore);
 
-			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, Catalog.GetString ("Calculation"));
+			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Calculation"));
 
 			x = x + space_x * 2;
 
 			if (session.History.MemoryPlayed > 0)
 				DrawBar (gr, x, y + area_h, bar_w, bar_h, session.History.MemoryScore);
 
-			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, Catalog.GetString ("Memory"));
+			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memory"));
 
 			x = x + space_x * 2;
 
 			if (session.History.VerbalPlayed > 0)
 				DrawBar (gr, x, y + area_h, bar_w, bar_h, session.History.VerbalScore);
 
-			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, Catalog.GetString ("Verbal"));
+			gr.DrawTextCentered (x + bar_w / 2, y + area_h + 0.03, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Verbal"));
 		}
 
 		public void Draw (CairoContextEx gr, int area_width, int area_height, bool rtl)
@@ -137,7 +137,7 @@ namespace gbrainy.Core.Views
 			gr.Color = new Cairo.Color (0, 0, 0, 1);
 
 			gr.MoveTo (x, y);
-			gr.ShowPangoText (Catalog.GetString ("Score"), false, -1, 0);
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Score"), false, -1, 0);
 			DrawBand (gr, 0.03, y - 0.01);
 
 			y += 0.08;
@@ -147,13 +147,13 @@ namespace gbrainy.Core.Views
 	
 			s = session.Result;
 			if (s == string.Empty)
-				gr.ShowPangoText (String.Format (Catalog.GetString ("Games won: {0} ({1} played)"), session.History.GamesWon, session.History.GamesPlayed));
+				gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Games won: {0} ({1} played)"), session.History.GamesWon, session.History.GamesPlayed));
 			else
-				gr.ShowPangoText (String.Format (Catalog.GetString ("{0}. Games won: {1} ({2} played)"), s, session.History.GamesWon, session.History.GamesPlayed));
+				gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}. Games won: {1} ({2} played)"), s, session.History.GamesWon, session.History.GamesPlayed));
 
 			y += 0.06;
 			gr.MoveTo (x, y);
-			gr.ShowPangoText (String.Format (Catalog.GetString ("Time played {0} (average per game {1})"), session.GameTime, session.TimePerGame));
+			gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Time played {0} (average per game {1})"), session.GameTime, session.TimePerGame));
 		
 			y += 0.09;
 			DrawColumnBarGraphic (gr, x, y);
@@ -162,7 +162,7 @@ namespace gbrainy.Core.Views
 			gr.MoveTo (x, y);
 			gr.SetPangoFontSize (smaller_font);
 			// Translators: translated string should not be longer that the English original (space restriction on the UI)
-			gr.ShowPangoText (Catalog.GetString ("For details on how gbrainy's scoring works refer to the help."));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("For details on how gbrainy's scoring works refer to the help."));
 
 			y += 0.07;
 			gr.SetPangoNormalFontSize ();
@@ -172,7 +172,7 @@ namespace gbrainy.Core.Views
 			if (records.Count == 0) {
 				bool caching = cached_sessionid != session.ID;
 	
-				gr.ShowPangoText (Catalog.GetString ("Tips for your next games"), false, -1, 0);
+				gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Tips for your next games"), false, -1, 0);
 				DrawBand (gr, 0.03, y - 0.01);
 
 				y += 0.08;
@@ -200,7 +200,7 @@ namespace gbrainy.Core.Views
 					cached_sessionid = session.ID;
 			} 
 			else  {
-				gr.ShowPangoText (Catalog.GetString ("Congratulations! New personal record"), false, -1, 0);
+				gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Congratulations! New personal record"), false, -1, 0);
 				DrawBand (gr, 0.03, y - 0.01);
 
 				y += 0.08;
@@ -209,25 +209,25 @@ namespace gbrainy.Core.Views
 				{
 					switch (records[i].GameType) {
 					case GameTypes.LogicPuzzle:
-						s = String.Format (Catalog.
+						s = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().
 							GetString ("By scoring {0} in logic puzzle games you have established a new personal record. Your previous record was {1}."),
 							records[i].NewScore,
 							records[i].PreviousScore);
 						break;
 					case GameTypes.Calculation:
-						s = String.Format (Catalog.
+						s = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().
 							GetString ("By scoring {0} in calculation games you have established a new personal record. Your previous record was {1}."),
 							records[i].NewScore,
 							records[i].PreviousScore);
 						break;
 					case GameTypes.Memory:
-						s = String.Format (Catalog.
+						s = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().
 							GetString ("By scoring {0} in memory games you have established a new personal record. Your previous record was {1}."),
 							records[i].NewScore,
 							records[i].PreviousScore);
 						break;
 					case GameTypes.VerbalAnalogy:
-						s = String.Format (Catalog.
+						s = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().
 							GetString ("By scoring {0} in verbal analogies you have established a new personal record. Your previous record was {1}."),
 							records[i].NewScore,
 							records[i].PreviousScore);
diff --git a/src/Core/Views/PlayerHistoryView.cs b/src/Core/Views/PlayerHistoryView.cs
index f387d06..53b322b 100644
--- a/src/Core/Views/PlayerHistoryView.cs
+++ b/src/Core/Views/PlayerHistoryView.cs
@@ -20,9 +20,9 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Views
 {
@@ -80,7 +80,7 @@ namespace gbrainy.Core.Views
 			cr.Stroke ();
 			cr.Color = text_color;
 			cr.MoveTo (x + line_size + offset_x, y - 0.01);
-			cr.ShowPangoText (Catalog.GetString ("Total"));
+			cr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Total"));
 			cr.Stroke ();
 
 			cr.Color = logic_color;
@@ -271,8 +271,8 @@ namespace gbrainy.Core.Views
 			DrawLegend (cr, x + grid_offsetx, y + area_h + 0.06);
 			DrawGrid (cr, grid_x, grid_y);
 
-			DrawAxisDescription (cr, x + area_w + 0.01, 0.78, Catalog.GetString ("Time"));
-			DrawAxisDescription (cr, 0, 0.03, Catalog.GetString ("Score"));
+			DrawAxisDescription (cr, x + area_w + 0.01, 0.78, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Time"));
+			DrawAxisDescription (cr, 0, 0.03, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Score"));
 		}
 	}
 }
diff --git a/src/Core/Views/WelcomeView.cs b/src/Core/Views/WelcomeView.cs
index a06a139..f205987 100644
--- a/src/Core/Views/WelcomeView.cs
+++ b/src/Core/Views/WelcomeView.cs
@@ -20,11 +20,11 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 using System.Collections.Generic;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Core.Views
 {
@@ -58,7 +58,7 @@ namespace gbrainy.Core.Views
 			drawable_area.DrawEventHandler += delegate (object sender, DrawEventArgs e)
 			{
 				e.Context.DrawStringWithWrapping (0, 0,
-					Catalog.GetString ("Logic puzzles. Challenge your reasoning and thinking skills."), 
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Logic puzzles. Challenge your reasoning and thinking skills."), 
 					e.Width);
 			};
 
@@ -79,7 +79,7 @@ namespace gbrainy.Core.Views
 			drawable_area.DrawEventHandler += delegate (object sender, DrawEventArgs e)
 			{
 				e.Context.DrawStringWithWrapping (0, 0,
-					Catalog.GetString ("Mental calculation. Arithmetical operations that test your mental calculation abilities."),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Mental calculation. Arithmetical operations that test your mental calculation abilities."),
 					e.Width);
 			};
 
@@ -100,7 +100,7 @@ namespace gbrainy.Core.Views
 			drawable_area.DrawEventHandler += delegate (object sender, DrawEventArgs e)
 			{
 				e.Context.DrawStringWithWrapping (0, 0,
-					Catalog.GetString ("Memory trainers. To prove your short term memory."),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memory trainers. To prove your short term memory."),
 					e.Width);
 			};
 
@@ -121,7 +121,7 @@ namespace gbrainy.Core.Views
 			drawable_area.DrawEventHandler += delegate (object sender, DrawEventArgs e)
 			{
 				e.Context.DrawStringWithWrapping (0, 0,
-					Catalog.GetString ("Verbal analogies. Challenge your verbal aptitude."),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Verbal analogies. Challenge your verbal aptitude."),
 					e.Width);
 			};
 		}
@@ -137,15 +137,15 @@ namespace gbrainy.Core.Views
 
 			gr.MoveTo (0.05, y);
 			// Translators: {0} is the version number of the program
-			gr.ShowPangoText (String.Format (Catalog.GetString ("Welcome to gbrainy {0}"), Defines.VERSION), true, -1, 0);
+			gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Welcome to gbrainy {0}"), Defines.VERSION), true, -1, 0);
 			gr.Stroke ();
 
 			gr.DrawStringWithWrapping (0.05, y + 0.07, 
-				Catalog.GetString ("gbrainy is a brain teaser game and trainer to have fun and to keep your brain trained. It includes:"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("gbrainy is a brain teaser game and trainer to have fun and to keep your brain trained. It includes:"),
 				1 - 0.05);
 
 			y = 0.22 + space * 3;
-			gr.DrawStringWithWrapping (0.05, y + 0.17,  Catalog.GetString ("Use the Settings to adjust the difficulty level of the game."),
+			gr.DrawStringWithWrapping (0.05, y + 0.17,  ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Use the Settings to adjust the difficulty level of the game."),
 				1 - 0.05);
 			gr.Stroke ();
 
diff --git a/src/Games/Calculation/CalculationArithmetical.cs b/src/Games/Calculation/CalculationArithmetical.cs
index 99f1d0d..16f0c1d 100644
--- a/src/Games/Calculation/CalculationArithmetical.cs
+++ b/src/Games/Calculation/CalculationArithmetical.cs
@@ -17,9 +17,8 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
-
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -39,7 +38,7 @@ namespace gbrainy.Games.Calculation
 		private int max_operations;
 
 		public override string Name {
-			get {return Catalog.GetString ("Arithmetical");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Arithmetical");}
 		}
 
 		public override GameTypes Type {
@@ -47,7 +46,7 @@ namespace gbrainy.Games.Calculation
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What is the result of the arithmetical operation?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the result of the arithmetical operation?");} 
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Calculation/CalculationAverage.cs b/src/Games/Calculation/CalculationAverage.cs
index 6c13bc6..cd27159 100644
--- a/src/Games/Calculation/CalculationAverage.cs
+++ b/src/Games/Calculation/CalculationAverage.cs
@@ -18,10 +18,10 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -35,7 +35,7 @@ namespace gbrainy.Games.Calculation
 		double correct;
 
 		public override string Name {
-			get {return Catalog.GetString ("Average");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Average");}
 		}
 
 		public override GameTypes Type {
@@ -52,17 +52,17 @@ namespace gbrainy.Games.Calculation
 				nums += numbers [numbers.Length - 1];
 
 				return String.Format (
-					Catalog.GetString ("Given the numbers: {0}. Which of the following numbers is the nearest to the average? Answer {1}, {2}, {3} or {4}."), nums,
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Given the numbers: {0}. Which of the following numbers is the nearest to the average? Answer {1}, {2}, {3} or {4}."), nums,
 					GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The average of a list of numbers is the sum of all of the numbers divided by the number of items in the list.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The average of a list of numbers is the sum of all of the numbers divided by the number of items in the list.");}
 		}
 
 		public override string Rationale {
 			get { 
-				return String.Format (Catalog.GetString ("The result of the operation is {0:##0.###}."), 
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The result of the operation is {0:##0.###}."), 
 					correct);				
 			}
 		}
diff --git a/src/Games/Calculation/CalculationCloserFraction.cs b/src/Games/Calculation/CalculationCloserFraction.cs
index 344f2e8..98c38e8 100644
--- a/src/Games/Calculation/CalculationCloserFraction.cs
+++ b/src/Games/Calculation/CalculationCloserFraction.cs
@@ -18,10 +18,10 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -34,7 +34,7 @@ namespace gbrainy.Games.Calculation
 		private int which;
 
 		public override string Name {
-			get {return Catalog.GetString ("Closer fraction");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Closer fraction");}
 		}
 
 		public override GameTypes Type {
@@ -43,7 +43,7 @@ namespace gbrainy.Games.Calculation
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which of the following numbers is closer to {0:##0.###}? Answer {1}, {2}, {3} or {4}."), question_num,
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which of the following numbers is closer to {0:##0.###}? Answer {1}, {2}, {3} or {4}."), question_num,
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
@@ -51,7 +51,7 @@ namespace gbrainy.Games.Calculation
 			get {
 				int ans_idx = random_indices[which];
 
-				return String.Format (Catalog.GetString ("The result of the operation {0} / {1} is {2:##0.###}"), 
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The result of the operation {0} / {1} is {2:##0.###}"), 
 					options[ans_idx * 2], options[(ans_idx * 2) + 1], question_num);
 			}
 		}
@@ -158,7 +158,7 @@ namespace gbrainy.Games.Calculation
 
 					e.Context.SetPangoLargeFontSize ();
 					e.Context.MoveTo (0.02, 0.02);
-					e.Context.ShowPangoText (String.Format (Catalog.GetString ("{0}) {1}"), GetPossibleAnswer (n) , 
+					e.Context.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}) {1}"), GetPossibleAnswer (n) , 
 						options [indx * 2] +  " / " + options [(indx  * 2) +1]));
 				};
 			}
diff --git a/src/Games/Calculation/CalculationFractions.cs b/src/Games/Calculation/CalculationFractions.cs
index 4e60f70..4b06f59 100644
--- a/src/Games/Calculation/CalculationFractions.cs
+++ b/src/Games/Calculation/CalculationFractions.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -57,7 +57,7 @@ namespace gbrainy.Games.Calculation
 		private const string format_string = "{0:##0.###}";
 
 		public override string Name {
-			get {return Catalog.GetString ("Fractions");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Fractions");}
 		}
 
 		public override GameTypes Type {
@@ -65,7 +65,7 @@ namespace gbrainy.Games.Calculation
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What is the result of the given operation? Answer using either a fraction or a number.");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the result of the given operation? Answer using either a fraction or a number.");} 
 		}
 
 		private int Factor {
diff --git a/src/Games/Calculation/CalculationGreatestDivisor.cs b/src/Games/Calculation/CalculationGreatestDivisor.cs
index ac33d60..df02913 100644
--- a/src/Games/Calculation/CalculationGreatestDivisor.cs
+++ b/src/Games/Calculation/CalculationGreatestDivisor.cs
@@ -18,10 +18,10 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -34,7 +34,7 @@ namespace gbrainy.Games.Calculation
 		private int answer_idx;
 
 		public override string Name {
-			get {return Catalog.GetString ("Greatest divisor");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Greatest divisor");}
 		}
 
 		public override GameTypes Type {
@@ -42,7 +42,7 @@ namespace gbrainy.Games.Calculation
 		}
 
 		public override string Question {
-			get { return String.Format (Catalog.GetString (
+			get { return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString (
 				"Which of the possible divisors is the greatest that divides all numbers? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));
 			}
@@ -149,7 +149,7 @@ namespace gbrainy.Games.Calculation
 					int d = (int) e.Data;
 					e.Context.SetPangoLargeFontSize ();
 					e.Context.MoveTo (0.07, 0.02);
-					e.Context.ShowPangoText (String.Format (Catalog.GetString ("{0}) {1}"), GetPossibleAnswer (d),
+					e.Context.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}) {1}"), GetPossibleAnswer (d),
 						answers[d].ToString ()));
 				};
 			}
@@ -240,7 +240,7 @@ namespace gbrainy.Games.Calculation
 
 			gr.MoveTo (0.05, y);
 			gr.SetPangoLargeFontSize ();
-			gr.ShowPangoText (Catalog.GetString ("Numbers"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Numbers"));
 			y += 0.08;
 
 			for (int n = 0; n < numbers.Length; n++)
@@ -254,7 +254,7 @@ namespace gbrainy.Games.Calculation
 			y += 0.16;
 
 			gr.MoveTo (0.05, y);
-			gr.ShowPangoText (Catalog.GetString ("Possible divisors"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible divisors"));
 		}
 
 		public override bool CheckAnswer (string answer)
diff --git a/src/Games/Calculation/CalculationOperator.cs b/src/Games/Calculation/CalculationOperator.cs
index 24fcb5f..cb89ce5 100644
--- a/src/Games/Calculation/CalculationOperator.cs
+++ b/src/Games/Calculation/CalculationOperator.cs
@@ -19,9 +19,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -32,11 +32,11 @@ namespace gbrainy.Games.Calculation
 		private char oper1, oper2;
 
 		public override string Name {
-			get {return Catalog.GetString ("Operators");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Operators");}
 		}
 
 		public override string Tip {
-			get {return String.Format( Catalog.GetString ("The first operator is {0}."), oper1);}
+			get {return String.Format( ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The first operator is {0}."), oper1);}
 		}
 
 		public override GameTypes Type {
@@ -44,7 +44,7 @@ namespace gbrainy.Games.Calculation
 		}
 
 		public override string Question {
-			get {return String.Format (Catalog.GetString ("Which operators make {0}, {1}, and {2} equal {3}? Answer using '+-/*'."), number_a, number_b, number_c, total);}
+			get {return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which operators make {0}, {1}, and {2} equal {3}? Answer using '+-/*'."), number_a, number_b, number_c, total);}
 		}
 
 		public override string AnswerCheckExpression {
@@ -56,7 +56,7 @@ namespace gbrainy.Games.Calculation
 		}
 
 		public override string AnswerValue {
-			get { return String.Format (Catalog.GetString ("{0} and {1}"), oper1, oper2); }
+			get { return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} and {1}"), oper1, oper2); }
 		}
 
 		private double ProcessOperation (double total, double number, char op)
diff --git a/src/Games/Calculation/CalculationPrimes.cs b/src/Games/Calculation/CalculationPrimes.cs
index e3b146f..8d178ee 100644
--- a/src/Games/Calculation/CalculationPrimes.cs
+++ b/src/Games/Calculation/CalculationPrimes.cs
@@ -18,10 +18,10 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -65,7 +65,7 @@ namespace gbrainy.Games.Calculation
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Primes");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Primes");}
 		}
 
 		public override GameTypes Type {
@@ -74,17 +74,17 @@ namespace gbrainy.Games.Calculation
 
 		public override string Question {
 			get { return String.Format (
-				Catalog.GetString ("Which of the following numbers is a prime? A prime number is a positive integer that has exactly two different positive divisors, 1 and itself. Answer {0}, {1}, {2} or {3}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which of the following numbers is a prime? A prime number is a positive integer that has exactly two different positive divisors, 1 and itself. Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("If the sum of all digits in a given number is divisible by 3, then so is the number. For example 15 = 1 + 5 = 6, which is divisible by 3.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If the sum of all digits in a given number is divisible by 3, then so is the number. For example 15 = 1 + 5 = 6, which is divisible by 3.");}
 		}
 
 		public override string Rationale {
 			get { 
-				return String.Format (Catalog.GetString ("The number {0} is a primer number."), answer);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The number {0} is a primer number."), answer);
 			}
 		}
 
@@ -148,7 +148,7 @@ namespace gbrainy.Games.Calculation
 			gr.SetPangoLargeFontSize ();
 
 			gr.MoveTo (0.05, DrawAreaY + 0.1);
-			gr.ShowPangoText (Catalog.GetString ("Numbers"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Numbers"));
 		}
 
 		short GenerateNonPrime ()
diff --git a/src/Games/Calculation/CalculationProportions.cs b/src/Games/Calculation/CalculationProportions.cs
index d303f8f..99d6523 100644
--- a/src/Games/Calculation/CalculationProportions.cs
+++ b/src/Games/Calculation/CalculationProportions.cs
@@ -18,10 +18,10 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -34,7 +34,7 @@ namespace gbrainy.Games.Calculation
 		double num, den, percentage, correct;
 
 		public override string Name {
-			get {return Catalog.GetString ("Proportions");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Proportions");}
 		}
 
 		public override GameTypes Type {
@@ -44,7 +44,7 @@ namespace gbrainy.Games.Calculation
 		public override string Question {
 			get {
 				return String.Format (
-					Catalog.GetString ("What is {0}% of {1}/{2}? Answer {3}, {4}, {5} or {6}."), 
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is {0}% of {1}/{2}? Answer {3}, {4}, {5} or {6}."), 
 					percentage, num, den, GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
diff --git a/src/Games/Calculation/CalculationRatio.cs b/src/Games/Calculation/CalculationRatio.cs
index 9bf878b..4a02abe 100644
--- a/src/Games/Calculation/CalculationRatio.cs
+++ b/src/Games/Calculation/CalculationRatio.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -29,7 +29,7 @@ namespace gbrainy.Games.Calculation
 		int number_a, number_b, ratio_a, ratio_b;
 
 		public override string Name {
-			get {return Catalog.GetString ("Ratio");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Ratio");}
 		}
 
 		public override GameTypes Type {
@@ -39,20 +39,20 @@ namespace gbrainy.Games.Calculation
 		public override string Question {
 			get {
 				return String.Format (
-					Catalog.GetString ("Two numbers sum {0} and have a ratio of {1} to {2}. Which are these numbers? Answer using two numbers (e.g.: 1 and 2)."), 
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Two numbers sum {0} and have a ratio of {1} to {2}. Which are these numbers? Answer using two numbers (e.g.: 1 and 2)."), 
 					number_a + number_b, ratio_a, ratio_b);
 			}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("The second number is calculated by multiplying the first by {0} and dividing it by {1}."),
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The second number is calculated by multiplying the first by {0} and dividing it by {1}."),
 					ratio_a, ratio_b);
 			}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("A ratio specifies a proportion between two numbers. A ratio a:b means that for every 'a' parts you have 'b' parts.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A ratio specifies a proportion between two numbers. A ratio a:b means that for every 'a' parts you have 'b' parts.");}
 		}
 
 		public override GameAnswerCheckAttributes CheckAttributes {
@@ -64,7 +64,7 @@ namespace gbrainy.Games.Calculation
 		}
 
 		public override string AnswerValue {
-			get { return String.Format (Catalog.GetString ("{0} and {1}"), number_a, number_b); }
+			get { return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} and {1}"), number_a, number_b); }
 		}
 
 		protected override void Initialize ()
@@ -105,10 +105,10 @@ namespace gbrainy.Games.Calculation
 			gr.SetPangoLargeFontSize ();
 
 			gr.MoveTo (x, DrawAreaY + 0.22);
-			gr.ShowPangoText (String.Format (Catalog.GetString ("x + y = {0}"), number_a + number_b));
+			gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("x + y = {0}"), number_a + number_b));
 		
 			gr.MoveTo (x, DrawAreaY + 0.44);
-			gr.ShowPangoText (String.Format (Catalog.GetString ("have a ratio of {0}:{1}"), ratio_a, ratio_b));
+			gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("have a ratio of {0}:{1}"), ratio_a, ratio_b));
 		}
 	}
 }
diff --git a/src/Games/Calculation/CalculationTwoNumbers.cs b/src/Games/Calculation/CalculationTwoNumbers.cs
index a123910..8851110 100644
--- a/src/Games/Calculation/CalculationTwoNumbers.cs
+++ b/src/Games/Calculation/CalculationTwoNumbers.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Calculation
 {
@@ -39,7 +39,7 @@ namespace gbrainy.Games.Calculation
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Two numbers");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Two numbers");}
 		}
 
 		public override GameTypes Type {
@@ -50,9 +50,9 @@ namespace gbrainy.Games.Calculation
 			get {
 				switch (type) {
 				case SubGameTypes.Addition:
-					return String.Format (Catalog.GetString ("Which two numbers when added are {0} and when multiplied are {1}? Answer using two numbers (e.g.: 1 and 2)."), op1, op2);
+					return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which two numbers when added are {0} and when multiplied are {1}? Answer using two numbers (e.g.: 1 and 2)."), op1, op2);
 				case SubGameTypes.Subtraction:
-					return String.Format (Catalog.GetString ("Which two numbers when subtracted are {0} and when multiplied are {1}? Answer using two numbers (e.g.: 1 and 2)."), op1, op2);
+					return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which two numbers when subtracted are {0} and when multiplied are {1}? Answer using two numbers (e.g.: 1 and 2)."), op1, op2);
 				default:
 					throw new InvalidOperationException ();
 				}
@@ -68,7 +68,7 @@ namespace gbrainy.Games.Calculation
 		}
 
 		public override string AnswerValue {
-			get { return String.Format (Catalog.GetString ("{0} and {1}"), number_a, number_b); }
+			get { return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} and {1}"), number_a, number_b); }
 		}
 
 		protected override void Initialize ()
@@ -123,17 +123,17 @@ namespace gbrainy.Games.Calculation
 
 			switch (type) {
 			case SubGameTypes.Addition:
-				gr.ShowPangoText (String.Format (Catalog.GetString ("x + y = {0}"), op1));
+				gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("x + y = {0}"), op1));
 				break;
 			case SubGameTypes.Subtraction:
-				gr.ShowPangoText (String.Format (Catalog.GetString ("x - y = {0}"), op1));
+				gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("x - y = {0}"), op1));
 				break;
 			default:
 				throw new InvalidOperationException ();
 			}
 
 			gr.MoveTo (x, DrawAreaY + 0.44);
-			gr.ShowPangoText (String.Format (Catalog.GetString ("x * y = {0}"), op2));
+			gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("x * y = {0}"), op2));
 		}
 
 		public override bool CheckAnswer (string answer)
diff --git a/src/Games/Logic/Puzzle3DCube.cs b/src/Games/Logic/Puzzle3DCube.cs
index f18d6b9..38e9f5b 100644
--- a/src/Games/Logic/Puzzle3DCube.cs
+++ b/src/Games/Logic/Puzzle3DCube.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -29,15 +29,15 @@ namespace gbrainy.Games.Logic
 		int rows, columns, depth;
 
 		public override string Name {
-			get {return Catalog.GetString ("3D Cube");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("3D Cube");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("How many small cubes does it take to build the large cube below? Answer using a number.");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many small cubes does it take to build the large cube below? Answer using a number.");}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("A cube is a regular solid object having six congruent square faces.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A cube is a regular solid object having six congruent square faces.");}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Logic/PuzzleBalance.cs b/src/Games/Logic/PuzzleBalance.cs
index 2363c2a..09ebb3a 100644
--- a/src/Games/Logic/PuzzleBalance.cs
+++ b/src/Games/Logic/PuzzleBalance.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -46,21 +46,21 @@ namespace gbrainy.Games.Logic
 		private const double figure_width = 0.1, figure_height = 0.1, space_width = 0.05, space_height = 0;
 
 		public override string Name {
-			get {return Catalog.GetString ("Balance");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Balance");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("Using triangles only, how many triangles are needed in the right part of the last figure to keep it balanced?");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Using triangles only, how many triangles are needed in the right part of the last figure to keep it balanced?");}
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("Every circle is equivalent to two triangles and every square to three triangles.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every circle is equivalent to two triangles and every square to three triangles.");
 			}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("Every circle is equivalent two triangles.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every circle is equivalent two triangles.");}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Logic/PuzzleBuildTriangle.cs b/src/Games/Logic/PuzzleBuildTriangle.cs
index 260d957..9b0c9c7 100644
--- a/src/Games/Logic/PuzzleBuildTriangle.cs
+++ b/src/Games/Logic/PuzzleBuildTriangle.cs
@@ -19,9 +19,9 @@
 
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -48,17 +48,17 @@ namespace gbrainy.Games.Logic
 		private double radian = Math.PI / 180;
 
 		public override string Name {
-			get {return Catalog.GetString ("Build a triangle");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Build a triangle");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which three pieces can you use together to build a triangle? Answer using the three figure names, e.g.: {0}{1}{2}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which three pieces can you use together to build a triangle? Answer using the three figure names, e.g.: {0}{1}{2}."),
 					GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2));}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The resulting triangle is isosceles.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The resulting triangle is isosceles.");}
 		}
 
 		public override GameAnswerCheckAttributes CheckAttributes {
@@ -179,7 +179,7 @@ namespace gbrainy.Games.Logic
 				return;
 
 			gr.MoveTo (DrawAreaX, y + 0.28);
-			gr.ShowPangoText (Catalog.GetString ("The triangle is:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The triangle is:"));
 			gr.Stroke ();
 		
 			x = DrawAreaX + 0.35;
diff --git a/src/Games/Logic/PuzzleCirclesSquare.cs b/src/Games/Logic/PuzzleCirclesSquare.cs
index 8b50ea8..a1168c6 100644
--- a/src/Games/Logic/PuzzleCirclesSquare.cs
+++ b/src/Games/Logic/PuzzleCirclesSquare.cs
@@ -18,29 +18,29 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
 	public class PuzzleCirclesSquare : Game
 	{
 		public override string Name {
-			get {return Catalog.GetString ("Circles in a square");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Circles in a square");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What is the maximum number of circles (as shown) that fit in the square below?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the maximum number of circles (as shown) that fit in the square below?");} 
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("You can fit more than 64 circles.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You can fit more than 64 circles.");}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("In the layout shown {0} units of height are gained in each row. This allows using an additional row."), 0.1340);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In the layout shown {0} units of height are gained in each row. This allows using an additional row."), 0.1340);
 			}
 		}
 
@@ -74,7 +74,7 @@ namespace gbrainy.Games.Logic
 			gr.Stroke ();
 
 			gr.MoveTo (first_x + 0.2, first_y - 0.06 - space_fromrect);
-			gr.ShowPangoText (Catalog.GetString ("8 units"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("8 units"));
 			gr.Stroke ();
 
 
@@ -95,7 +95,7 @@ namespace gbrainy.Games.Logic
 			gr.Stroke ();
 
 			gr.MoveTo (first_x - space_fromrect - 0.07, first_y + 0.3);
-			gr.ShowPangoText (Catalog.GetString ("8 units"), false, -1, 270 * Math.PI/180);
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("8 units"), false, -1, 270 * Math.PI/180);
 			gr.Stroke ();
 
 			// Sample circle
@@ -114,7 +114,7 @@ namespace gbrainy.Games.Logic
 			gr.Stroke ();
 
 			gr.MoveTo (first_x + 0.65, first_y - 0.04 - space_fromcircle);
-			gr.ShowPangoText (Catalog.GetString ("1 unit"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("1 unit"));
 			gr.Stroke ();
 
 			//  ---
@@ -133,7 +133,7 @@ namespace gbrainy.Games.Logic
 			gr.Stroke ();
 
 			gr.MoveTo (first_x + 0.65 - space_fromcircle - 0.08, first_y + 0.15);
-			gr.ShowPangoText (Catalog.GetString ("1 unit"), false, -1, 270 * Math.PI/180);
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("1 unit"), false, -1, 270 * Math.PI/180);
 			gr.Stroke ();
 
 			if (DrawAnswer == false)
diff --git a/src/Games/Logic/PuzzleClocks.cs b/src/Games/Logic/PuzzleClocks.cs
index 6f1402d..17da526 100644
--- a/src/Games/Logic/PuzzleClocks.cs
+++ b/src/Games/Logic/PuzzleClocks.cs
@@ -17,11 +17,11 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -35,24 +35,24 @@ namespace gbrainy.Games.Logic
 		private const int handle_num = 2;
 
 		public override string Name {
-			get {return Catalog.GetString ("Clocks");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Clocks");}
 		}
 
 		public override string Question {
 			get {return (String.Format (
 				// Translators: {0} is replaced by 'Figure X'
-				Catalog.GetString ("To what number should the large handle of the '{0}' clock point? Answer using numbers."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("To what number should the large handle of the '{0}' clock point? Answer using numbers."),
 				GetPossibleFigureAnswer (3)));}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("Starting from the first clock sum {0} to the value indicated by the hands."), addition);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Starting from the first clock sum {0} to the value indicated by the hands."), addition);
 			}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The clocks do not follow the time logic.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The clocks do not follow the time logic.");}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Logic/PuzzleCountCircles.cs b/src/Games/Logic/PuzzleCountCircles.cs
index 8b62292..71eda1d 100644
--- a/src/Games/Logic/PuzzleCountCircles.cs
+++ b/src/Games/Logic/PuzzleCountCircles.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -45,15 +45,15 @@ namespace gbrainy.Games.Logic
 		ItemCircle[] circles;
 
 		public override string Name {
-			get {return Catalog.GetString ("Count circles");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Count circles");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("How many circles do you count?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many circles do you count?");} 
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("It is an easy exercise if you systematically count the circles.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("It is an easy exercise if you systematically count the circles.");}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Logic/PuzzleCountSeries.cs b/src/Games/Logic/PuzzleCountSeries.cs
index fc1614c..79e3da7 100644
--- a/src/Games/Logic/PuzzleCountSeries.cs
+++ b/src/Games/Logic/PuzzleCountSeries.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -37,7 +37,7 @@ namespace gbrainy.Games.Logic
 		private string question, rationale;
 
 		public override string Name {
-			get {return Catalog.GetString ("Count series");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Count series");}
 		}
 
 		public override string Question {
@@ -59,19 +59,19 @@ namespace gbrainy.Games.Logic
 			switch (game_type)
 			{
 				case GameType.HowManyNines:
-					question = Catalog.GetString ("How many numbers '9' are required to represent the numbers between 10 to 100?");
+					question = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many numbers '9' are required to represent the numbers between 10 to 100?");
 					right_answer = "19";
 					numbers = new short [] {19, 29, 39, 49, 59, 69, 79, 89, 90, 91, 92 , 93, 94, 95, 96, 97, 98, 99};
 					break;
 
 				case GameType.HowManyBiggerDigits:
-					question = Catalog.GetString ("How many two digit numbers occur where the first digit is larger than the second (e.g.: 20 and 21)?");
+					question = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many two digit numbers occur where the first digit is larger than the second (e.g.: 20 and 21)?");
 					right_answer = "45";
 					numbers = new short [] {10, 20, 21, 30, 31, 32, 40, 41, 42, 43, 50, 51, 52, 53, 54, 60, 61, 62, 63, 64, 65, 70, 71, 72, 73, 74, 75, 76, 80, 81, 82, 83, 84, 85, 86, 87, 90, 91, 92, 93, 94, 95, 96, 97, 98};
 					break;
 
 				case GameType.HowManySmallerDigits:
-					question = Catalog.GetString ("How many two digit numbers occur where the first digit is smaller than the second (e.g.: 12 and 13)?");
+					question = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many two digit numbers occur where the first digit is smaller than the second (e.g.: 12 and 13)?");
 					right_answer = "36";
 					numbers = new short [] {12, 13, 14, 15, 16, 17, 18, 19, 23, 24, 25, 26, 27, 28, 29, 34, 35, 36, 37, 38, 39, 45, 46, 47, 48, 49, 56, 57, 58, 59, 67, 68, 69, 78, 79, 89};
 					break;
@@ -83,15 +83,15 @@ namespace gbrainy.Games.Logic
 			for (int i = 1; i < numbers.Length; i++)
 			{
 				// Translators: A sequence of numbers 1, 2, 3, etc.
-				rationale = string.Format (Catalog.GetString ("{0}, {1}"), rationale, numbers[i].ToString ());
+				rationale = string.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}, {1}"), rationale, numbers[i].ToString ());
 			}
 
-			rationale = string.Format (Catalog.GetString ("The numbers are: {0}."), rationale);
+			rationale = string.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The numbers are: {0}."), rationale);
 
 			if (game_type == GameType.HowManyNines) {
 				// Translators: Concadenating two strings (rationale of answer + extra information).
-				rationale = string.Format (Catalog.GetString ("{0} {1}"), rationale,
-					Catalog.GetString ("Notice that 99 contains two numbers '9'."));
+				rationale = string.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} {1}"), rationale,
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Notice that 99 contains two numbers '9'."));
 			}				
 		}
 	}
diff --git a/src/Games/Logic/PuzzleCounting.cs b/src/Games/Logic/PuzzleCounting.cs
index a2adf2d..0a14e1b 100644
--- a/src/Games/Logic/PuzzleCounting.cs
+++ b/src/Games/Logic/PuzzleCounting.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -38,7 +38,7 @@ namespace gbrainy.Games.Logic
 		GameType gametype;
 
 		public override string Name {
-			get {return Catalog.GetString ("Counting");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Counting");}
 		}
 
 		public override string Question {
@@ -61,16 +61,16 @@ namespace gbrainy.Games.Logic
 				var = 2 + random.Next (5);
 				total = 50 + random.Next (100);
 				question = String.Format (
-					Catalog.GetPluralString ("We have a {0} meter piece of fabric.", "We have a {0} meters piece of fabric.", total),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetPluralString ("We have a {0} meter piece of fabric.", "We have a {0} meters piece of fabric.", total),
 					total);
 				question += " ";
 				question += String.Format (
-					Catalog.GetPluralString ("Machine A takes {0} second to cut 1 meter of this fabric. How many seconds does Machine A take to cut the entire piece of fabric into 1 meter pieces?",
+					ServiceLocator.Instance.GetService <ITranslations> ().GetPluralString ("Machine A takes {0} second to cut 1 meter of this fabric. How many seconds does Machine A take to cut the entire piece of fabric into 1 meter pieces?",
 						"Machine A takes {0} seconds to cut 1 meter of this fabric. How many seconds does Machine A take to cut the entire piece of fabric into 1 meter pieces?"
 						, var), var);
 				answer = String.Format (
 					// Translators: {0} is always a number greater than 1
-					Catalog.GetString ("With the {0} cut, Machine A creates two 1 meter pieces."), (total - 1));
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("With the {0} cut, Machine A creates two 1 meter pieces."), (total - 1));
 	
 				ans = (total - 1) * var;
 				break;
@@ -80,11 +80,11 @@ namespace gbrainy.Games.Logic
 				ans = 4 * total - 4;
 				question = String.Format (
 					// Translators: {0} is always a number greater than 20
-					Catalog.GetString ("A fence is built to enclose a square shaped region. {0} fence poles are used in each side of the square. How many fence poles are used in total?"),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A fence is built to enclose a square shaped region. {0} fence poles are used in each side of the square. How many fence poles are used in total?"),
 					total);
 					// Translators: {0} is always a number greater than 20
 				answer = String.Format (
-					Catalog.GetString ("There are {0} fence poles since the poles on the corners of the square are shared."), ans);
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There are {0} fence poles since the poles on the corners of the square are shared."), ans);
 				break;
 
 			case GameType.Present:
@@ -93,9 +93,9 @@ namespace gbrainy.Games.Logic
 				ans = total;
 				question = String.Format (
 					// Translators: {0} is always a number greater than 5
-					Catalog.GetString ("Wrapping an anniversary present costs one euro. The anniversary present costs {0} euros more than the cost to wrap it. How much does it cost to both purchase and wrap the present?"),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Wrapping an anniversary present costs one euro. The anniversary present costs {0} euros more than the cost to wrap it. How much does it cost to both purchase and wrap the present?"),
 					present);
-				answer = Catalog.GetString ("Individually, the present costs one euro more to purchase than to wrap.");
+				answer = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Individually, the present costs one euro more to purchase than to wrap.");
 				break;
 			default:
 				throw new Exception ("Unexpected value");
diff --git a/src/Games/Logic/PuzzleCoverPercentage.cs b/src/Games/Logic/PuzzleCoverPercentage.cs
index 75bda69..2c52ead 100644
--- a/src/Games/Logic/PuzzleCoverPercentage.cs
+++ b/src/Games/Logic/PuzzleCoverPercentage.cs
@@ -18,9 +18,9 @@
  */
 
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -32,11 +32,11 @@ namespace gbrainy.Games.Logic
 		private const double line_width = 0.001;
 
 		public override string Name {
-			get {return Catalog.GetString ("Cover percentage");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Cover percentage");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What percentage of the figure is colored?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What percentage of the figure is colored?");} 
 		}
 
 		public override string AnswerCheckExpression {
diff --git a/src/Games/Logic/PuzzleCube.cs b/src/Games/Logic/PuzzleCube.cs
index ad2e361..0490f60 100755
--- a/src/Games/Logic/PuzzleCube.cs
+++ b/src/Games/Logic/PuzzleCube.cs
@@ -17,11 +17,11 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -42,11 +42,11 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Cube");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Cube");}
 		}
 
 		public override string Question {
-			get {return String.Format (Catalog.GetString ("When you fold the figure below as a cube, which face on the figure is opposite the face with a {0} drawn on it? Answer the number written on face."), question);} 
+			get {return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("When you fold the figure below as a cube, which face on the figure is opposite the face with a {0} drawn on it? Answer the number written on face."), question);} 
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Logic/PuzzleDice.cs b/src/Games/Logic/PuzzleDice.cs
index 5151516..635bec0 100644
--- a/src/Games/Logic/PuzzleDice.cs
+++ b/src/Games/Logic/PuzzleDice.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -47,25 +47,25 @@ namespace gbrainy.Games.Logic
 
 		Problem [] problems =
 		{
-			new Problem (Catalog.GetString ("What is the probability of getting a '2' or a '6' in a single throw of a fair 6 sided die? Answer using a fraction (e.g.: 1/2)."),
+			new Problem (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the probability of getting a '2' or a '6' in a single throw of a fair 6 sided die? Answer using a fraction (e.g.: 1/2)."),
 				"1/3",
-				Catalog.GetString ("There are 2 of 6 possibilities."), true),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There are 2 of 6 possibilities."), true),
 
-			new Problem (Catalog.GetString ("What is the probability of not getting a '5' in a single throw of a fair 6 sided die? Answer using a fraction (e.g.: 1/2)."),
+			new Problem (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the probability of not getting a '5' in a single throw of a fair 6 sided die? Answer using a fraction (e.g.: 1/2)."),
 				"5/6",
-				Catalog.GetString ("There are 5 of 6 possibilities."), true),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There are 5 of 6 possibilities."), true),
 
-			new Problem (Catalog.GetString ("Two fair 6 sided dices are thrown simultaneously. What is the probability of getting two even numbers? Answer using a fraction (e.g.: 1/2)."),
+			new Problem (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Two fair 6 sided dices are thrown simultaneously. What is the probability of getting two even numbers? Answer using a fraction (e.g.: 1/2)."),
 				"9/36",
-				Catalog.GetString ("There are 9 of 36 possibilities of getting two even numbers."), false),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There are 9 of 36 possibilities of getting two even numbers."), false),
 
-			new Problem (Catalog.GetString ("Two fair 6 sided dices are thrown simultaneously. What is the probability of getting two '6'? Answer using a fraction (e.g.: 1/2)."),
+			new Problem (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Two fair 6 sided dices are thrown simultaneously. What is the probability of getting two '6'? Answer using a fraction (e.g.: 1/2)."),
 				"1/36",
-				Catalog.GetString ("There is 1 of 6 possibilities of getting a '6' on the first die and the same for the second die."), false),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There is 1 of 6 possibilities of getting a '6' on the first die and the same for the second die."), false),
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Dice");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Dice");}
 		}
 
 		public override string Question {
diff --git a/src/Games/Logic/PuzzleDivideCircle.cs b/src/Games/Logic/PuzzleDivideCircle.cs
index ff07f65..a9038a2 100644
--- a/src/Games/Logic/PuzzleDivideCircle.cs
+++ b/src/Games/Logic/PuzzleDivideCircle.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -42,11 +42,11 @@ namespace gbrainy.Games.Logic
 		}
 
 		public override string Name {
-			get {return Catalog.GetString ("Divide circles");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Divide circles");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("In the last figure, in how many regions is the circle divided into when all dots are connected?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In the last figure, in how many regions is the circle divided into when all dots are connected?");} 
 		}
 
 		protected override void Initialize ()
@@ -176,7 +176,7 @@ namespace gbrainy.Games.Logic
 		
 		string HasNRegionString (int regions)
 		{
-			return String.Format (Catalog.GetPluralString ("Has {0} region", 
+			return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetPluralString ("Has {0} region", 
 				"Has {0} regions", regions), regions);
 			
 		}
diff --git a/src/Games/Logic/PuzzleEquation.cs b/src/Games/Logic/PuzzleEquation.cs
index cec9eca..ce230ff 100644
--- a/src/Games/Logic/PuzzleEquation.cs
+++ b/src/Games/Logic/PuzzleEquation.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -30,16 +30,16 @@ namespace gbrainy.Games.Logic
 		private string formula;
 
 		public override string Name {
-			get {return Catalog.GetString ("Equation");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Equation");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What is the result of the equation below?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the result of the equation below?");} 
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("The order of arithmetical operations is always as follows: exponents and roots, multiplication and division, addition and subtraction.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The order of arithmetical operations is always as follows: exponents and roots, multiplication and division, addition and subtraction.");
 			}
 		}
 
diff --git a/src/Games/Logic/PuzzleExtraCircle.cs b/src/Games/Logic/PuzzleExtraCircle.cs
index 8fce87c..f09ed5e 100644
--- a/src/Games/Logic/PuzzleExtraCircle.cs
+++ b/src/Games/Logic/PuzzleExtraCircle.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -50,7 +50,7 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Extra circle");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Extra circle");}
 		}
 
 		public override bool UsesColors {
@@ -59,17 +59,17 @@ namespace gbrainy.Games.Logic
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which circle does not belong to the group? It is not a sequence of elements. Answer {0}, {1}, {2} or {3}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which circle does not belong to the group? It is not a sequence of elements. Answer {0}, {1}, {2} or {3}."),
 					GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("All circles share a common property except for one.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All circles share a common property except for one.");}
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("In all circles the color slices follow the same order except for this one.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In all circles the color slices follow the same order except for this one.");
 			}
 		}
 
diff --git a/src/Games/Logic/PuzzleFigureLetter.cs b/src/Games/Logic/PuzzleFigureLetter.cs
index ca5f8e1..47d435b 100644
--- a/src/Games/Logic/PuzzleFigureLetter.cs
+++ b/src/Games/Logic/PuzzleFigureLetter.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -37,20 +37,20 @@ namespace gbrainy.Games.Logic
 		}
 
 		public override string Name {
-			get {return Catalog.GetString ("Figures and text");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Figures and text");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("The figures and the text are related. What text should go under the last figure?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The figures and the text are related. What text should go under the last figure?");} 
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("Every character of the text represents a property of the figure.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every character of the text represents a property of the figure.");}
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("'A' indicates that the figures overlap, 'B' that are squares, 'C' that are circles, 'D' that the figures are separated, 'E' that there are three figures and 'F' that there are two figures.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("'A' indicates that the figures overlap, 'B' that are squares, 'C' that are circles, 'D' that the figures are separated, 'E' that there are three figures and 'F' that there are two figures.");
 			}
 		}
 
diff --git a/src/Games/Logic/PuzzleFigurePattern.cs b/src/Games/Logic/PuzzleFigurePattern.cs
index 37777f2..438028c 100644
--- a/src/Games/Logic/PuzzleFigurePattern.cs
+++ b/src/Games/Logic/PuzzleFigurePattern.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -37,22 +37,22 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Figure pattern");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Figure pattern");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("What figure should replace the question mark? Answer {0}, {1} or {2}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What figure should replace the question mark? Answer {0}, {1} or {2}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2));}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The third figure of every row involves somehow combining the first two figures.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The third figure of every row involves somehow combining the first two figures.");}
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("Superpose the first and second figures and remove the lines that they have in common, then rotate the resulting figure 45 degrees.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Superpose the first and second figures and remove the lines that they have in common, then rotate the resulting figure 45 degrees.");
 			}
 		}
 
@@ -187,7 +187,7 @@ namespace gbrainy.Games.Logic
 			gr.Stroke ();
 	
 			gr.MoveTo (0.05, y - 0.01 + space_y);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 
 			// Answers
 			x = org_x;
diff --git a/src/Games/Logic/PuzzleFigures.cs b/src/Games/Logic/PuzzleFigures.cs
index f86d901..4ac9c3a 100644
--- a/src/Games/Logic/PuzzleFigures.cs
+++ b/src/Games/Logic/PuzzleFigures.cs
@@ -19,10 +19,10 @@
 
 using System;
 using System.Text;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -39,16 +39,16 @@ namespace gbrainy.Games.Logic
 		private const double figure_width = 0.1, figure_height = 0.1, space_width = 0.05, space_height = 0;
 
 		public override string Name {
-			get {return Catalog.GetString ("Figures");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Figures");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What is the next logical sequence of objects in the last column? See below the convention when giving the answer.");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the next logical sequence of objects in the last column? See below the convention when giving the answer.");} 
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("It is the only combination that you can build with the given elements without repeating them.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("It is the only combination that you can build with the given elements without repeating them.");
 			}
 		}
 
@@ -75,7 +75,7 @@ namespace gbrainy.Games.Logic
 			drawable_area.DrawEventHandler += delegate (object sender, DrawEventArgs e)
 			{
 				e.Context.MoveTo (0, 0.05);
-				e.Context.ShowPangoText (String.Format (Catalog.GetString ("{0} ->"), GetPossibleAnswer (0)));
+				e.Context.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} ->"), GetPossibleAnswer (0)));
 				e.Context.DrawPentagon (0.1, 0, 0.1);
 				e.Context.Stroke ();
 			};
@@ -87,7 +87,7 @@ namespace gbrainy.Games.Logic
 			drawable_area.DrawEventHandler += delegate (object sender, DrawEventArgs e)
 			{
 				e.Context.MoveTo (0, 0.05);
-				e.Context.ShowPangoText (String.Format (Catalog.GetString ("{0} ->"), GetPossibleAnswer (1)));
+				e.Context.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} ->"), GetPossibleAnswer (1)));
 				e.Context.Stroke ();
 				e.Context.Arc (0.15, 0.05, 0.05, 0, 2 * Math.PI);
 				e.Context.Stroke ();
@@ -100,7 +100,7 @@ namespace gbrainy.Games.Logic
 			drawable_area.DrawEventHandler += delegate (object sender, DrawEventArgs e)
 			{
 				e.Context.MoveTo (0, 0.05);
-				e.Context.ShowPangoText (String.Format (Catalog.GetString ("{0} ->"), GetPossibleAnswer (2)));
+				e.Context.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} ->"), GetPossibleAnswer (2)));
 				e.Context.DrawEquilateralTriangle (0.1, 0, 0.1);
 			};
 		}
@@ -156,11 +156,11 @@ namespace gbrainy.Games.Logic
 			x = DrawAreaX;
 			gr.MoveTo (x, y - 0.01);
 			y += 0.05;
-			gr.ShowPangoText (Catalog.GetString ("Convention when giving the answer is:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Convention when giving the answer is:"));
 
 			y += 0.16;
 			gr.MoveTo (x, y);		
-			gr.ShowPangoText (String.Format (Catalog.GetString ("E.g: {0}{1}{2} (pentagon, triangle, circle)"),
+			gr.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("E.g: {0}{1}{2} (pentagon, triangle, circle)"),
 				GetPossibleAnswer (0), GetPossibleAnswer (2), GetPossibleAnswer (1)));
 		}
 	}
diff --git a/src/Games/Logic/PuzzleFourSided.cs b/src/Games/Logic/PuzzleFourSided.cs
index 3d206e3..5a26712 100644
--- a/src/Games/Logic/PuzzleFourSided.cs
+++ b/src/Games/Logic/PuzzleFourSided.cs
@@ -19,9 +19,9 @@
 
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -29,20 +29,20 @@ namespace gbrainy.Games.Logic
 	{
 		int type;
 		public override string Name {
-			get {return Catalog.GetString ("Four sided");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Four sided");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("How many four sided figures do you count in the figure below?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many four sided figures do you count in the figure below?");} 
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("A four sided figure can be embedded inside another figure.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A four sided figure can be embedded inside another figure.");}
 		}
 
 		public override string Rationale {
 			get { 
-				return String.Format (Catalog.GetString ("The four sided figures are made by connecting the following points: {0}"),
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The four sided figures are made by connecting the following points: {0}"),
 					(type == 0) ? "abde, degh, bcef, efhi, acdf, dfgi, abhg, bcih, acig, aghe, aefc, deig, bcie." : 
 					"abde, degh, bcef, efhi, acdf, dfgi, abhg, bcih, acig, aghe, aefc, deig, bcie, acde, cehi, abeg, egif.");
 			}
diff --git a/src/Games/Logic/PuzzleHandshakes.cs b/src/Games/Logic/PuzzleHandshakes.cs
index f58a512..171c7f8 100644
--- a/src/Games/Logic/PuzzleHandshakes.cs
+++ b/src/Games/Logic/PuzzleHandshakes.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -29,17 +29,17 @@ namespace gbrainy.Games.Logic
 		int people, handshakes;
 
 		public override string Name {
-			get {return Catalog.GetString ("Handshakes");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Handshakes");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("All attendees to a party are introduced to one another. {0} handshakes are made in total. How many people are attending the party?"), 				handshakes);
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All attendees to a party are introduced to one another. {0} handshakes are made in total. How many people are attending the party?"), 				handshakes);
 			}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("Try to imagine a situation in which you are meeting a small number of people.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Try to imagine a situation in which you are meeting a small number of people.");}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Logic/PuzzleLargerShape.cs b/src/Games/Logic/PuzzleLargerShape.cs
index 570cc0c..dce4b8e 100644
--- a/src/Games/Logic/PuzzleLargerShape.cs
+++ b/src/Games/Logic/PuzzleLargerShape.cs
@@ -18,11 +18,11 @@
  */
 
 using Cairo;
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -110,7 +110,7 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Larger shape");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Larger shape");}
 		}
 
 		public override bool UsesColors {
@@ -119,7 +119,7 @@ namespace gbrainy.Games.Logic
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which larger shape can you make combining the first two figures? Answer {0}, {1}, {2} or {3}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which larger shape can you make combining the first two figures? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
@@ -299,7 +299,7 @@ namespace gbrainy.Games.Logic
 			base.Draw (gr, area_width, area_height, rtl);
 
 			gr.MoveTo (0.1, 0.3);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 			gr.Stroke ();
 		}
 	}
diff --git a/src/Games/Logic/PuzzleLines.cs b/src/Games/Logic/PuzzleLines.cs
index 283aae2..61b3898 100644
--- a/src/Games/Logic/PuzzleLines.cs
+++ b/src/Games/Logic/PuzzleLines.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -31,21 +31,21 @@ namespace gbrainy.Games.Logic
 		private int fig1, fig2;
 
 		public override string Name {
-			get {return Catalog.GetString ("Lines");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Lines");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("How many line segments in total are in the figures below? A line segment is a line between two points with no crossing lines.");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many line segments in total are in the figures below? A line segment is a line between two points with no crossing lines.");}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("There are {0} lines in the figure to the left and {1} in the figure to the right."), fig1, fig2);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There are {0} lines in the figure to the left and {1} in the figure to the right."), fig1, fig2);
 			}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("It is an easy exercise if you systematically count the lines.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("It is an easy exercise if you systematically count the lines.");}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Logic/PuzzleMatrixGroups.cs b/src/Games/Logic/PuzzleMatrixGroups.cs
index 5837c8b..5cb7fea 100644
--- a/src/Games/Logic/PuzzleMatrixGroups.cs
+++ b/src/Games/Logic/PuzzleMatrixGroups.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -32,20 +32,20 @@ namespace gbrainy.Games.Logic
 		private int divisor;
 
 		public override string Name {
-			get {return Catalog.GetString ("Matrix groups");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Matrix groups");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("One of the numbers in the matrix must be circled. Which one?");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("One of the numbers in the matrix must be circled. Which one?");}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("All circled numbers share an arithmetical property.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All circled numbers share an arithmetical property.");}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("Every circled number can be divided by {0}."), divisor);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every circled number can be divided by {0}."), divisor);
 			}
 		}
 
diff --git a/src/Games/Logic/PuzzleMatrixNumbers.cs b/src/Games/Logic/PuzzleMatrixNumbers.cs
index 7435dd4..9b10bee 100644
--- a/src/Games/Logic/PuzzleMatrixNumbers.cs
+++ b/src/Games/Logic/PuzzleMatrixNumbers.cs
@@ -19,9 +19,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -41,19 +41,19 @@ namespace gbrainy.Games.Logic
 		private const int rows = 4, columns = 4;
 
 		public override string Name {
-			get {return Catalog.GetString ("Matrix numbers");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Matrix numbers");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("The numbers in the matrix follow a pattern. Which number should replace the question mark?");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The numbers in the matrix follow a pattern. Which number should replace the question mark?");}
 		}
 
 		public override string Tip {
 			get { 
 				if (orientation) 
-					return Catalog.GetString ("The pattern is arithmetical and works vertically.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The pattern is arithmetical and works vertically.");
 				else 
-					return Catalog.GetString ("The pattern is arithmetical and works horizontally.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The pattern is arithmetical and works horizontally.");
 			}
 		}
 
@@ -62,21 +62,21 @@ namespace gbrainy.Games.Logic
 				switch (operation) {
 				case Operation.MultiplyAndAdd:
 					if (orientation) {
-						return Catalog.GetString ("The fourth row is calculated by multiplying the first two rows and adding the third.");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The fourth row is calculated by multiplying the first two rows and adding the third.");
 					} else {
-						return Catalog.GetString ("The fourth column is calculated by multiplying the first two columns and adding the third.");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The fourth column is calculated by multiplying the first two columns and adding the third.");
 					}
 				case Operation.MutilplyAndSubs:
 					if (orientation) {
-						return Catalog.GetString ("The fourth row is calculated by multiplying the first two rows and subtracting the third.");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The fourth row is calculated by multiplying the first two rows and subtracting the third.");
 					} else {
-						return Catalog.GetString ("The fourth column is calculated by multiplying the first two columns and subtracting the third.");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The fourth column is calculated by multiplying the first two columns and subtracting the third.");
 					}
 				case Operation.AddAndSubs:
 					if (orientation) {
-						return Catalog.GetString ("The fourth row is calculated by adding the first two rows and subtracting the third.");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The fourth row is calculated by adding the first two rows and subtracting the third.");
 					} else {
-						return Catalog.GetString ("The fourth column is calculated by adding the first two columns and subtracting the third.");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The fourth column is calculated by adding the first two columns and subtracting the third.");
 					}
 				default:
 					return string.Empty;
diff --git a/src/Games/Logic/PuzzleMissingPiece.cs b/src/Games/Logic/PuzzleMissingPiece.cs
index 00520fd..5375bfc 100644
--- a/src/Games/Logic/PuzzleMissingPiece.cs
+++ b/src/Games/Logic/PuzzleMissingPiece.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -32,22 +32,22 @@ namespace gbrainy.Games.Logic
 		private const double sub_figure = 0.15;
 
 		public override string Name {
-			get {return Catalog.GetString ("Missing piece");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Missing piece");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which square completes the figure below? Answer {0}, {1} or {2}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which square completes the figure below? Answer {0}, {1} or {2}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2));}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The logic works at row level.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The logic works at row level.");}
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("In every row the third square is made by flipping the first square and superimposing it on the second square, followed by removing the matching lines.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In every row the third square is made by flipping the first square and superimposing it on the second square, followed by removing the matching lines.");
 			}
 		}
 
@@ -169,7 +169,7 @@ namespace gbrainy.Games.Logic
 			DrawFigureSequence (gr, x, DrawAreaY + sub_figure * 2 , 2, false);
 
 			gr.MoveTo (0.1, 0.62);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 		}
 	}
 }
diff --git a/src/Games/Logic/PuzzleMissingSlice.cs b/src/Games/Logic/PuzzleMissingSlice.cs
index 4ae9fe3..8496366 100644
--- a/src/Games/Logic/PuzzleMissingSlice.cs
+++ b/src/Games/Logic/PuzzleMissingSlice.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -59,22 +59,22 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Missing slice");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Missing slice");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("The slices below have some kind of relation. Which is the missing slice in the circle below? Answer {0}, {1} or {2}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The slices below have some kind of relation. Which is the missing slice in the circle below? Answer {0}, {1} or {2}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2));}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("Each slice is related to the opposite one.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Each slice is related to the opposite one.");}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("All numbers of each slice, when added to the ones of the opposite slice, add always {0}."), sum_offset + 8);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All numbers of each slice, when added to the ones of the opposite slice, add always {0}."), sum_offset + 8);
 			}
 		}
 
@@ -213,7 +213,7 @@ namespace gbrainy.Games.Logic
 			}
 
 			gr.MoveTo (0.1, 0.61);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 			gr.Stroke ();
 		}
 	}
diff --git a/src/Games/Logic/PuzzleMostInCommon.cs b/src/Games/Logic/PuzzleMostInCommon.cs
index a6b98c2..e6162f4 100644
--- a/src/Games/Logic/PuzzleMostInCommon.cs
+++ b/src/Games/Logic/PuzzleMostInCommon.cs
@@ -20,11 +20,11 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 using System.Collections;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -73,25 +73,25 @@ namespace gbrainy.Games.Logic
 		private const double pos7_y = 0.11;
 
 		public override string Name {
-			get {return Catalog.GetString ("Most in common");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Most in common");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which of the possible answers have the most in common with the four given figures? Answer {0}, {1}, {2} or {3}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which of the possible answers have the most in common with the four given figures? Answer {0}, {1}, {2} or {3}."),
 					GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("Think of the common elements that the given figures have inside them.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Think of the common elements that the given figures have inside them.");}
 		}
 
 		public override string Rationale {
 			get {
 				if (CurrentDifficulty ==  GameDifficulty.Easy) 
-					return Catalog.GetString ("It has the same number of elements inside the figure as the given figures.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("It has the same number of elements inside the figure as the given figures.");
 				else
-					return Catalog.GetString ("It is the figure with the most elements in common compared to the given figures.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("It is the figure with the most elements in common compared to the given figures.");
 			}
 		}
 
@@ -309,7 +309,7 @@ namespace gbrainy.Games.Logic
 			y += 0.28;
 			x = DrawAreaX;
 			gr.MoveTo (x - 0.06, y);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 			gr.Stroke ();
 		}
 	}
diff --git a/src/Games/Logic/PuzzleMoveFigure.cs b/src/Games/Logic/PuzzleMoveFigure.cs
index 94e4cad..15aa22a 100644
--- a/src/Games/Logic/PuzzleMoveFigure.cs
+++ b/src/Games/Logic/PuzzleMoveFigure.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -30,20 +30,20 @@ namespace gbrainy.Games.Logic
 		private int type;
 
 		public override string Name {
-			get {return Catalog.GetString ("Move figure");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Move figure");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What is the minimum number of circles to be moved in order to convert the left figure into the right figure?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the minimum number of circles to be moved in order to convert the left figure into the right figure?");} 
 		}
 	
 		public override string Rationale {
 			get {
 				switch (type) {
 				case 0:
-					return Catalog.GetString ("Move the circle from the first line to the second and move two circles from the fourth line to the second and the fifth lines.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Move the circle from the first line to the second and move two circles from the fourth line to the second and the fifth lines.");
 				case 1:
-					return Catalog.GetString ("Move the first line to the seventh; move the two circles of the second line to third; and move first and last circles of the fifth line to the sixth.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Move the first line to the seventh; move the two circles of the second line to third; and move first and last circles of the fifth line to the sixth.");
 				default:	
 					return string.Empty;
 				}
diff --git a/src/Games/Logic/PuzzleNextFigure.cs b/src/Games/Logic/PuzzleNextFigure.cs
index 731397b..f5996a1 100644
--- a/src/Games/Logic/PuzzleNextFigure.cs
+++ b/src/Games/Logic/PuzzleNextFigure.cs
@@ -18,11 +18,11 @@
  */
 
 using Cairo;
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -50,19 +50,19 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Next figure");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Next figure");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which is the next logical figure in the sequence? Answer {0}, {1} or {2}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which is the next logical figure in the sequence? Answer {0}, {1} or {2}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2));} 
 		}
 
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("From first figure, the top circle advances by two positions clockwise, while the left circle goes backwards one position.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("From first figure, the top circle advances by two positions clockwise, while the left circle goes backwards one position.");
 			}
 		}
 
@@ -162,7 +162,7 @@ namespace gbrainy.Games.Logic
 		
 			y += figure_size + 0.06;
 			gr.MoveTo (x, y);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 			gr.Stroke ();
 		}
 	}
diff --git a/src/Games/Logic/PuzzleNumericRelation.cs b/src/Games/Logic/PuzzleNumericRelation.cs
index fac4c34..dd11924 100644
--- a/src/Games/Logic/PuzzleNumericRelation.cs
+++ b/src/Games/Logic/PuzzleNumericRelation.cs
@@ -19,9 +19,9 @@
 
 using System;
 using System.Text;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -43,26 +43,26 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Numeric relation");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Numeric relation");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What number should replace the question mark?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What number should replace the question mark?");} 
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The numbers are related arithmetically.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The numbers are related arithmetically.");}
 		}
 
 		public override string Rationale {
 			get {
 				switch (formula) {
 				case Formula.AllAdding:
-					return String.Format (Catalog.GetString ("Every group of {0} numbers sums exactly {1}."), group_size, sum_value);
+					return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every group of {0} numbers sums exactly {1}."), group_size, sum_value);
 				case Formula.ThirdMultiply:
-					return Catalog.GetString ("Divide the sequence in groups of three numbers. Every third number is calculated by multiplying by the two previous ones.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Divide the sequence in groups of three numbers. Every third number is calculated by multiplying by the two previous ones.");
 				case Formula.ThirdSubstracting:
-					return Catalog.GetString ("Divide the sequence in groups of three numbers. Every third number is calculated by subtracting the second number from the first.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Divide the sequence in groups of three numbers. Every third number is calculated by subtracting the second number from the first.");
 				default:
 					throw new InvalidOperationException ("Invalid Value");
 				}
diff --git a/src/Games/Logic/PuzzleNumericSequence.cs b/src/Games/Logic/PuzzleNumericSequence.cs
index ec06220..2000994 100644
--- a/src/Games/Logic/PuzzleNumericSequence.cs
+++ b/src/Games/Logic/PuzzleNumericSequence.cs
@@ -19,9 +19,9 @@
 
 using System;
 using System.Text;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -39,26 +39,26 @@ namespace gbrainy.Games.Logic
 		private Formula formula;
 
 		public override string Name {
-			get {return Catalog.GetString ("Numeric sequence");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Numeric sequence");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("The next sequence follows a logic. What number should replace the question mark?");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The next sequence follows a logic. What number should replace the question mark?");}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("Every number in the sequence is related to the previous one.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every number in the sequence is related to the previous one.");}
 		}
 
 		public override string Rationale {
 			get {
 				switch (formula) {
 				case Formula.SubstractingOne:
-					return Catalog.GetString ("Every number in the sequence is the result of subtracting 1 from the previous number and multiplying it by 2.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every number in the sequence is the result of subtracting 1 from the previous number and multiplying it by 2.");
 				case Formula.Adding:
-					return Catalog.GetString ("Every number in the sequence is the result of adding 1 to the previous number and multiplying it by 3.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every number in the sequence is the result of adding 1 to the previous number and multiplying it by 3.");
 				case Formula.SubstractingTwo:
-					return Catalog.GetString ("Every number in the sequence is the result of subtracting 2 from the previous number and multiplying it by -2.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every number in the sequence is the result of subtracting 2 from the previous number and multiplying it by -2.");
 				default:
 					return string.Empty;
 				}
diff --git a/src/Games/Logic/PuzzleOstracism.cs b/src/Games/Logic/PuzzleOstracism.cs
index 0247f7a..205bff6 100644
--- a/src/Games/Logic/PuzzleOstracism.cs
+++ b/src/Games/Logic/PuzzleOstracism.cs
@@ -18,10 +18,10 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -50,12 +50,12 @@ namespace gbrainy.Games.Logic
 		string [] equations;
 
 		public override string Name {
-			get {return Catalog.GetString ("Ostracism");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Ostracism");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which element does not belong to the group? It is not related to divisibility of the numbers. Answer {0}, {1}, {2}, {3} or {4}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which element does not belong to the group? It is not related to divisibility of the numbers. Answer {0}, {1}, {2}, {3} or {4}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3), GetPossibleAnswer (4));}
 		}
 
@@ -63,9 +63,9 @@ namespace gbrainy.Games.Logic
 			get {
 				switch (gametype) {
 				case GameType.Equations:
-					return Catalog.GetString ("The criteria for deciding if an equation belongs to the group is not arithmetical.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The criteria for deciding if an equation belongs to the group is not arithmetical.");
 				case GameType.Numbers:
-					return Catalog.GetString ("Consider that every number that belongs to the group has two parts that are related.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Consider that every number that belongs to the group has two parts that are related.");
 				default:
 					throw new InvalidOperationException ();
 				}
@@ -76,9 +76,9 @@ namespace gbrainy.Games.Logic
 			get {
 				switch (gametype) {
 				case GameType.Equations:
-					return Catalog.GetString ("In all the other equations the digits from the left side appear also in the right side.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In all the other equations the digits from the left side appear also in the right side.");
 				case GameType.Numbers:
-					return Catalog.GetString ("In all the other numbers the last three digits are the square of the first two digits.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In all the other numbers the last three digits are the square of the first two digits.");
 				default:
 					throw new InvalidOperationException ();
 				}
@@ -156,7 +156,7 @@ namespace gbrainy.Games.Logic
 					e.Context.SetPangoLargeFontSize ();
 					e.Context.MoveTo (0.05, 0.02);
 					// Translators: this "option) answer" for example "a) "21 x 60 = 1260". This should not be changed for most of the languages
-					e.Context.ShowPangoText (String.Format (Catalog.GetString ("{0}) {1}"), GetPossibleAnswer (n), equations [random_indices[n]]));
+					e.Context.ShowPangoText (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}) {1}"), GetPossibleAnswer (n), equations [random_indices[n]]));
 				};
 			}
 		}
diff --git a/src/Games/Logic/PuzzlePencil.cs b/src/Games/Logic/PuzzlePencil.cs
index ef20561..22f3252 100644
--- a/src/Games/Logic/PuzzlePencil.cs
+++ b/src/Games/Logic/PuzzlePencil.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -35,11 +35,11 @@ namespace gbrainy.Games.Logic
 		private const int answer_index = 4;
 
 		public override string Name {
-			get {return Catalog.GetString ("Pencil");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Pencil");}
 		}
 
 		public override string Question {
-			get {return String.Format ( Catalog.GetString 
+			get {return String.Format ( ServiceLocator.Instance.GetService <ITranslations> ().GetString 
 				("Which of the following figures cannot be drawn without crossing any previous lines nor lifting the pencil? Answer {0}, {1}, {2}, {3} or {4}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3), GetPossibleAnswer (4));} 
 		}
diff --git a/src/Games/Logic/PuzzlePeopleTable.cs b/src/Games/Logic/PuzzlePeopleTable.cs
index 850652b..1d0b837 100644
--- a/src/Games/Logic/PuzzlePeopleTable.cs
+++ b/src/Games/Logic/PuzzlePeopleTable.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -42,16 +42,16 @@ namespace gbrainy.Games.Logic
 		}
 
 		public override string Name {
-			get {return Catalog.GetString ("People at a table");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("People at a table");}
 		}
 
 		public override string Question {
-			get {return String.Format (Catalog.GetString ("A group of people are sitting at round table, evenly spaced out. How many people are there if the {0} person is across from the {1}?"), ques1, ques2);} 
+			get {return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A group of people are sitting at round table, evenly spaced out. How many people are there if the {0} person is across from the {1}?"), ques1, ques2);} 
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("Subtracting the two positions you find out how many people are seated half way around the table. Doubling this number leaves you with the total amount of people.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Subtracting the two positions you find out how many people are seated half way around the table. Doubling this number leaves you with the total amount of people.");
 			}
 		}
 
@@ -59,18 +59,18 @@ namespace gbrainy.Games.Logic
 		{
 			switch (random.Next (3)) {
 			case 0:
-				ques1 = Catalog.GetString ("5th");
-				ques2 = Catalog.GetString ("19th");
+				ques1 = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("5th");
+				ques2 = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("19th");
 				right_answer = "28";
 				break;
 			case 1:
-				ques1 = Catalog.GetString ("4th");
-				ques2 = Catalog.GetString ("12th");
+				ques1 = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("4th");
+				ques2 = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("12th");
 				right_answer = "16";
 				break;
 			case 2:
-				ques1 = Catalog.GetString ("9th");
-				ques2 = Catalog.GetString ("22nd");
+				ques1 = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("9th");
+				ques2 = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("22nd");
 				right_answer = "26";
 				break;
 			}			
@@ -110,7 +110,7 @@ namespace gbrainy.Games.Logic
 			gr.Stroke ();
 
 			gr.DrawTextCentered (pos_x + figure_size, pos_y + 0.08 + figure_size * 2, 
-				Catalog.GetString ("Two people in the table sitting across each other"));
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Two people in the table sitting across each other"));
 		}
 	}
 }
diff --git a/src/Games/Logic/PuzzlePercentage.cs b/src/Games/Logic/PuzzlePercentage.cs
index 62ef153..1ddda96 100644
--- a/src/Games/Logic/PuzzlePercentage.cs
+++ b/src/Games/Logic/PuzzlePercentage.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -38,7 +38,7 @@ namespace gbrainy.Games.Logic
 		GameType gametype;
 
 		public override string Name {
-			get {return Catalog.GetString ("Percentage");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Percentage");}
 		}
 
 		public override string Question {
@@ -75,7 +75,7 @@ namespace gbrainy.Games.Logic
 				}  while (paid != Math.Truncate (paid));
 
 				question = String.Format (
-					Catalog.GetString ("After getting {0}% discount you have paid {1} monetary units for a TV set. What was the original price of the TV set?"),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("After getting {0}% discount you have paid {1} monetary units for a TV set. What was the original price of the TV set?"),
 					discount, paid);
 				ans = (int)price;
 				svg_image = "tv_set.svg";
@@ -93,7 +93,7 @@ namespace gbrainy.Games.Logic
 
 			
 				question = String.Format (
-					Catalog.GetString ("John's shop had sales of {0} monetary units. This was an increase of {1}% over last month. What were last month sales?"),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("John's shop had sales of {0} monetary units. This was an increase of {1}% over last month. What were last month sales?"),
 					sales, increase);
 				ans = (int) previous;
 				svg_image = "shop.svg";
@@ -109,10 +109,10 @@ namespace gbrainy.Games.Logic
 				} while (percentage != Math.Truncate (percentage));
 			
 				question = String.Format (
-					Catalog.GetString ("The amount of water in a bucket decreases by {0}%. By what percentage must the amount of water increase to reach its original value?"),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The amount of water in a bucket decreases by {0}%. By what percentage must the amount of water increase to reach its original value?"),
 					decrease);
 
-				answer = Catalog.GetString ("The objective is to obtain the same total amount.");
+				answer = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The objective is to obtain the same total amount.");
 				ans = (int) percentage;
 				svg_image = "bucket.svg";
 				break;
diff --git a/src/Games/Logic/PuzzlePredicateLogic.cs b/src/Games/Logic/PuzzlePredicateLogic.cs
index a5e3852..a83e8bf 100644
--- a/src/Games/Logic/PuzzlePredicateLogic.cs
+++ b/src/Games/Logic/PuzzlePredicateLogic.cs
@@ -19,10 +19,10 @@
 
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -53,81 +53,81 @@ namespace gbrainy.Games.Logic
 
 		Predicate [] predicates =
 		{
-			new Predicate (String.Format (Catalog.GetString ("If all painters are artists and some citizens of Barcelona are artists. Which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If all painters are artists and some citizens of Barcelona are artists. Which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 					GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("Some citizens of Barcelona are painters"),
-				Catalog.GetString ("All citizens of Barcelona are painters"),
-				Catalog.GetString ("No citizen of Barcelona is a painter"),
-				Catalog.GetString ("None of the other options"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some citizens of Barcelona are painters"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All citizens of Barcelona are painters"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("No citizen of Barcelona is a painter"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("None of the other options"),
 				3),
 
-			new Predicate (String.Format (Catalog.GetString ("If no ill artist is happy and some artists are happy. Which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If no ill artist is happy and some artists are happy. Which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 					GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("Some artist are not ill"),
-				Catalog.GetString ("Some painters are not artists"),
-				Catalog.GetString ("All artists are happy"),
-				Catalog.GetString ("None of the other options"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some artist are not ill"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some painters are not artists"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All artists are happy"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("None of the other options"),
 				0),
 
-			new Predicate (String.Format (Catalog.GetString ("People that travel always buy a map. You are not going to travel. Which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("People that travel always buy a map. You are not going to travel. Which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("You do not have any map"),
-				Catalog.GetString ("You do not buy a map"),
-				Catalog.GetString ("All people have a map"),
-				Catalog.GetString ("None of the other options"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You do not have any map"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You do not buy a map"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All people have a map"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("None of the other options"),
 				3),
 
-			new Predicate (String.Format (Catalog.GetString ("If you whistle if you are happy and you always smile when you whistle, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If you whistle if you are happy and you always smile when you whistle, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("You smile if you are happy"),
-				Catalog.GetString ("You are only happy if you whistle"),
-				Catalog.GetString ("You whistle if you are not happy"),
-				Catalog.GetString ("None of the other options"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You smile if you are happy"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You are only happy if you whistle"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You whistle if you are not happy"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("None of the other options"),
 				0),
 
-			new Predicate (String.Format (Catalog.GetString ("If your course is always honest and your course is always the best policy, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If your course is always honest and your course is always the best policy, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("Honesty is sometimes the best policy"),
-				Catalog.GetString ("Honesty is always the best policy"),
-				Catalog.GetString ("Honesty is not always the best policy"),
-				Catalog.GetString ("Some of the best policies are dishonest"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Honesty is sometimes the best policy"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Honesty is always the best policy"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Honesty is not always the best policy"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some of the best policies are dishonest"),
 				0),
 
-			new Predicate (String.Format (Catalog.GetString ("If no old misers are cheerful and some old misers are thin, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If no old misers are cheerful and some old misers are thin, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("Some thin people are not cheerful"),
-				Catalog.GetString ("Thin people are not cheerful"),
-				Catalog.GetString ("Cheerful people are not thin"),
-				Catalog.GetString ("Some cheerful people are not thin"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some thin people are not cheerful"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Thin people are not cheerful"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Cheerful people are not thin"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some cheerful people are not thin"),
 				0),
 
-			new Predicate (String.Format (Catalog.GetString ("If all pigs are fat and nothing that is fed on barley-water is fat, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If all pigs are fat and nothing that is fed on barley-water is fat, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("All animals fed on barley-water are non pigs"),
-				Catalog.GetString ("No pigs are fed on barley-water"),
-				Catalog.GetString ("Pigs are not fed on barley-water"),
-				Catalog.GetString ("All the other options"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All animals fed on barley-water are non pigs"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("No pigs are fed on barley-water"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Pigs are not fed on barley-water"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All the other options"),
 				3),
 
-			new Predicate (String.Format (Catalog.GetString ("If some pictures are first attempts and no first attempts are really good, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If some pictures are first attempts and no first attempts are really good, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("Some bad pictures are not first attempts"),
-				Catalog.GetString ("Some pictures are not really good"),
-				Catalog.GetString ("All bad pictures are first attempts"),
-				Catalog.GetString ("All the others"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some bad pictures are not first attempts"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some pictures are not really good"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All bad pictures are first attempts"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All the others"),
 				1),
 
-			new Predicate (String.Format (Catalog.GetString ("If you have been out for a walk and you are feeling better, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
+			new Predicate (String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If you have been out for a walk and you are feeling better, which of the following conclusions is correct? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3)),
-				Catalog.GetString ("To feel better, you must go out for a walk"),
-				Catalog.GetString ("If you go out for a walk, you will feel better"),
-				Catalog.GetString ("Some who go out for a walk feel better"),
-				Catalog.GetString ("No one feels better who does not go out for a walk"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("To feel better, you must go out for a walk"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("If you go out for a walk, you will feel better"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Some who go out for a walk feel better"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("No one feels better who does not go out for a walk"),
 				2),
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Predicate Logic");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Predicate Logic");}
 		}
 
 		public override string Question {
@@ -173,7 +173,7 @@ namespace gbrainy.Games.Logic
 					int option = random_indices [data];
 
 					e.Context.SetPangoNormalFontSize ();
-					e.Context.DrawStringWithWrapping (0.05, 0.02, String.Format (Catalog.GetString ("{0}) {1}"), GetPossibleAnswer (data),
+					e.Context.DrawStringWithWrapping (0.05, 0.02, String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0}) {1}"), GetPossibleAnswer (data),
 						predicates[question].options[option].ToString ()), 0.8 - DrawAreaX);
 					e.Context.Stroke ();
 				};
@@ -186,7 +186,7 @@ namespace gbrainy.Games.Logic
 
 			gr.SetPangoLargeFontSize ();
 			gr.MoveTo (0.1, DrawAreaY);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 		}
 	}
 }
diff --git a/src/Games/Logic/PuzzleQuadrilaterals.cs b/src/Games/Logic/PuzzleQuadrilaterals.cs
index 3c1680f..0ad8a12 100644
--- a/src/Games/Logic/PuzzleQuadrilaterals.cs
+++ b/src/Games/Logic/PuzzleQuadrilaterals.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -41,19 +41,19 @@ namespace gbrainy.Games.Logic
 		private const double figure_size = 0.15;
 
 		public override string Name {
-			get {return Catalog.GetString ("Quadrilaterals");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Quadrilaterals");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("Which of the following figures does not belong to the group? Answer {0}, {1}, {2}, {3}, {4} or {5}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which of the following figures does not belong to the group? Answer {0}, {1}, {2}, {3}, {4} or {5}."),
 					GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3), GetPossibleAnswer (4), 
 					GetPossibleAnswer (5));}
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("It is the only figure with all lines of equal length.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("It is the only figure with all lines of equal length.");
 			}
 		}
 
diff --git a/src/Games/Logic/PuzzleRelatedNumbers.cs b/src/Games/Logic/PuzzleRelatedNumbers.cs
index b9a90fc..6c817f6 100644
--- a/src/Games/Logic/PuzzleRelatedNumbers.cs
+++ b/src/Games/Logic/PuzzleRelatedNumbers.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -156,26 +156,26 @@ namespace gbrainy.Games.Logic
 		}
 
 		public override string Name {
-			get {return Catalog.GetString ("Related numbers");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Related numbers");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("In the matrix below, which number should replace the question mark?");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In the matrix below, which number should replace the question mark?");}
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The pattern is arithmetical and works horizontally."); }
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The pattern is arithmetical and works horizontally."); }
 		}
 
 		public override string Rationale {
 			get {
 				switch (operation) {
 				case Operation.AddHalf:
-					return Catalog.GetString ("The number on the middle in every row is equal to half of the sum of the other numbers of the row.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The number on the middle in every row is equal to half of the sum of the other numbers of the row.");
 				case Operation.Add:
-					return Catalog.GetString ("The number on the middle in every row is equal the sum of the other numbers of the row.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The number on the middle in every row is equal the sum of the other numbers of the row.");
 				case Operation.AddDouble:
-					return Catalog.GetString ("The number on the middle in every row is equal to the double of the sum of the other numbers of the row.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The number on the middle in every row is equal to the double of the sum of the other numbers of the row.");
 				default:
 					throw new InvalidOperationException ("Invalid value");
 				}
diff --git a/src/Games/Logic/PuzzleSquareDots.cs b/src/Games/Logic/PuzzleSquareDots.cs
index ec2669e..f718f82 100644
--- a/src/Games/Logic/PuzzleSquareDots.cs
+++ b/src/Games/Logic/PuzzleSquareDots.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -201,12 +201,12 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Square with dots");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Square with dots");}
 		}
 
 		public override string Question {
 			get {return (String.Format (
-				Catalog.GetString ("Which is the next logical figure in the sequence? Answer {0}, {1} or {2}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which is the next logical figure in the sequence? Answer {0}, {1} or {2}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2)));}
 		}
 
@@ -317,7 +317,7 @@ namespace gbrainy.Games.Logic
 
 			y += figure_size + 0.10;
 			gr.MoveTo (x, y - 0.02);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 		}
 	}
 }
diff --git a/src/Games/Logic/PuzzleSquareSheets.cs b/src/Games/Logic/PuzzleSquareSheets.cs
index 8011f44..f7bbbd1 100644
--- a/src/Games/Logic/PuzzleSquareSheets.cs
+++ b/src/Games/Logic/PuzzleSquareSheets.cs
@@ -17,30 +17,29 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
-
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
 	public class PuzzleSquareSheets : Game
 	{
 		public override string Name {
-			get {return Catalog.GetString ("Square sheets");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Square sheets");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("What is the minimum number of square sheets of paper of any size required to create the figure? Lines indicate frontiers between different sheets.");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What is the minimum number of square sheets of paper of any size required to create the figure? Lines indicate frontiers between different sheets.");} 
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The sheets should overlap.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The sheets should overlap.");}
 		}
 
 		public override string Rationale {
 			get {
 				// Translators: the translated version should not take more characters that the English original
-				return Catalog.GetString ("A full sized square of paper, a 3/4 of the whole size square of paper in the bottom right corner, another 3/4 square of paper in the top left corner and a 1/4 square of paper in the top left corner.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A full sized square of paper, a 3/4 of the whole size square of paper in the bottom right corner, another 3/4 square of paper in the top left corner and a 1/4 square of paper in the top left corner.");
 			}
 		}
 
diff --git a/src/Games/Logic/PuzzleSquares.cs b/src/Games/Logic/PuzzleSquares.cs
index 62597c1..5943d7c 100644
--- a/src/Games/Logic/PuzzleSquares.cs
+++ b/src/Games/Logic/PuzzleSquares.cs
@@ -17,9 +17,8 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
-
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -29,24 +28,24 @@ namespace gbrainy.Games.Logic
 		private int type;
 
 		public override string Name {
-			get {return Catalog.GetString ("Squares");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Squares");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("How many squares of any size do you count in the figure below?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many squares of any size do you count in the figure below?");} 
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("A square is a rectangle with sides of equal length. A square can also be built from other squares.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A square is a rectangle with sides of equal length. A square can also be built from other squares.");}
 		}
 
 		public override string Rationale {
 			get {
 				switch (type) {
 				case 0:
-					return Catalog.GetString ("There are 16 single squares, 9 squares made by 4 single squares, 4 squares made by 9 single squares and 1 square made by 16 single squares.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There are 16 single squares, 9 squares made by 4 single squares, 4 squares made by 9 single squares and 1 square made by 16 single squares.");
 				case 1:
-					return Catalog.GetString ("There are 9 single squares, 4 squares made by 4 single squares and 1 square made by 9 single squares.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There are 9 single squares, 4 squares made by 4 single squares and 1 square made by 9 single squares.");
 				default:
 					return string.Empty;
 				}
diff --git a/src/Games/Logic/PuzzleSquaresAndLetters.cs b/src/Games/Logic/PuzzleSquaresAndLetters.cs
index a474210..b19272b 100644
--- a/src/Games/Logic/PuzzleSquaresAndLetters.cs
+++ b/src/Games/Logic/PuzzleSquaresAndLetters.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -32,16 +32,16 @@ namespace gbrainy.Games.Logic
 		private const int figures = 3;
 
 		public override string Name {
-			get {return Catalog.GetString ("Squares and letters");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Squares and letters");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("The letters around the squares follow a pattern. Which letter should replace the question mark in the last square?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The letters around the squares follow a pattern. Which letter should replace the question mark in the last square?");} 
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("Every letter is calculated by taking the alphabetical position of the previous character and adding {0} to it in order to get the position of the new letter."), step);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Every letter is calculated by taking the alphabetical position of the previous character and adding {0} to it in order to get the position of the new letter."), step);
 			}
 		}
 
diff --git a/src/Games/Logic/PuzzleTetris.cs b/src/Games/Logic/PuzzleTetris.cs
index 1a00acc..b04f1c7 100644
--- a/src/Games/Logic/PuzzleTetris.cs
+++ b/src/Games/Logic/PuzzleTetris.cs
@@ -17,11 +17,11 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -32,18 +32,18 @@ namespace gbrainy.Games.Logic
 		private const double rect_witdh = 0.04, rect_height = 0.04, space_figures = 0.22;
 
 		public override string Name {
-			get {return Catalog.GetString ("Tetris");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Tetris");}
 		}
 
 		public override string Question {
 			get {return String.Format (
-				Catalog.GetString ("What figure completes the set below? Answer {0}, {1} or {2}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What figure completes the set below? Answer {0}, {1} or {2}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2));}
 		}
 
 		public override string Rationale {
 			get {
-				return Catalog.GetString ("It is the figure that completes all possible combinations with four blocks without taking into account rotations.");
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("It is the figure that completes all possible combinations with four blocks without taking into account rotations.");
 			}
 		}
 
@@ -168,7 +168,7 @@ namespace gbrainy.Games.Logic
 			}
 
 			gr.MoveTo (0.1, 0.4 - 0.02);
-			gr.ShowPangoText (Catalog.GetString ("Possible answers are:"));
+			gr.ShowPangoText (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Possible answers are:"));
 		}
 	}
 }
diff --git a/src/Games/Logic/PuzzleTimeNow.cs b/src/Games/Logic/PuzzleTimeNow.cs
index 9b2787f..8a45190 100644
--- a/src/Games/Logic/PuzzleTimeNow.cs
+++ b/src/Games/Logic/PuzzleTimeNow.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -31,7 +31,7 @@ namespace gbrainy.Games.Logic
 		DateTime position_a, position_b, ans;
 
 		public override string Name {
-			get {return Catalog.GetString ("Time now");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Time now");}
 		}
 
 		public override string Question {
@@ -41,13 +41,13 @@ namespace gbrainy.Games.Logic
 				// http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx
 				// For 12-hour clock format use {0:%h} and for 24-hour clock format use {0:%H}. The date formats {0:h} and {0:H} are invalid.
 				//
-				Catalog.GetString ("{0} hours ago it was as long after {1:h tt} as it was before {2:h tt} on the same day. What is the time now? Answer using the hour (e.g.: {3:h tt})"),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0} hours ago it was as long after {1:h tt} as it was before {2:h tt} on the same day. What is the time now? Answer using the hour (e.g.: {3:h tt})"),
 				after, position_a, position_b, position_b));}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("You have to calculate the hour from which the distance is the same for the given times, and then add the {0} hours to convert it to present time."), after);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You have to calculate the hour from which the distance is the same for the given times, and then add the {0} hours to convert it to present time."), after);
 			}
 		}
 
@@ -73,7 +73,7 @@ namespace gbrainy.Games.Logic
  			// Explanation of the date and time format specifications can be found here:
 			// http://msdn.microsoft.com/en-us/library/system.globalization.datetimeformatinfo.aspx
 			// For 12-hour clock format use {0:%h} and for 24-hour clock format use {0:%H}. The date formats {0:h} and {0:H} are invalid.
-			right_answer = String.Format (Catalog.GetString ("{0:h tt}"), ans);
+			right_answer = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("{0:h tt}"), ans);
 		}
 
 		public override void Draw (CairoContextEx gr, int area_width, int area_height, bool rtl)
@@ -82,7 +82,7 @@ namespace gbrainy.Games.Logic
 			gr.DrawClock (DrawAreaX + 0.4, DrawAreaY + 0.4, figure_size,
 				0, 0 /* No hands */);
 
-			gr.DrawTextCentered (0.5, DrawAreaY + 0.3 + figure_size, Catalog.GetString ("Sample clock"));
+			gr.DrawTextCentered (0.5, DrawAreaY + 0.3 + figure_size, ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Sample clock"));
 		}
 	}
 }
diff --git a/src/Games/Logic/PuzzleTrains.cs b/src/Games/Logic/PuzzleTrains.cs
index 1574911..0022d65 100644
--- a/src/Games/Logic/PuzzleTrains.cs
+++ b/src/Games/Logic/PuzzleTrains.cs
@@ -17,10 +17,10 @@
  * Boston, MA 02111-1307, USA.
  */
 
-using Mono.Unix;
 using System;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -38,7 +38,7 @@ namespace gbrainy.Games.Logic
 		GameType gametype;
 
 		public override string Name {
-			get {return Catalog.GetString ("Trains");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Trains");}
 		}
 
 		public override string Question {
@@ -50,7 +50,7 @@ namespace gbrainy.Games.Logic
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("The distance formula is 'distance = rate x time'.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The distance formula is 'distance = rate x time'.");}
 		}
 
 		protected override void Initialize ()
@@ -79,11 +79,11 @@ namespace gbrainy.Games.Logic
 					// Translators:
 					//  - mph (miles per hour). You must localize this using the right unit of speed for your locale
 					/// - The translated string should not use more characters than the original sentence
-					Catalog.GetPluralString ("A train leaves the station traveling at {0} mph. {1} hour later a second train leaves the station traveling in the same direction at {2} mph. How many hours does it take the second train to overtake the first train?",
+					ServiceLocator.Instance.GetService <ITranslations> ().GetPluralString ("A train leaves the station traveling at {0} mph. {1} hour later a second train leaves the station traveling in the same direction at {2} mph. How many hours does it take the second train to overtake the first train?",
 						"A train leaves the station traveling at {0} mph. {1} hours later a second train leaves the station traveling in the same direction at {2} mph. How many hours does it take the second train to overtake the first train?", (int) hours),
 						speed_a, hours, speed_b);
 			
-				answer = Catalog.GetString ("You can calculate the answer multiplying the speed of the first train by the time and dividing it by the difference of speeds.");
+				answer = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You can calculate the answer multiplying the speed of the first train by the time and dividing it by the difference of speeds.");
 				break;
 			}
 			case GameType.Meet:
@@ -99,12 +99,12 @@ namespace gbrainy.Games.Logic
 				question = String.Format (
 					// Translators:
 					//  - mph (miles per hour) and miles must be localized this using the right unit of speed for your locale
-					Catalog.GetPluralString ("Two trains separated by {0} mile are heading towards each other on straight parallel tracks. One travels at {1} mph and the other at {2} mph. In how many hours do they meet?",
+					ServiceLocator.Instance.GetService <ITranslations> ().GetPluralString ("Two trains separated by {0} mile are heading towards each other on straight parallel tracks. One travels at {1} mph and the other at {2} mph. In how many hours do they meet?",
 						"Two trains separated by {0} miles are heading towards each other on straight parallel tracks. One travels at {1} mph and the other at {2} mph. In how many hours do they meet?",
 						(int) distance),
 						distance, speed_a, speed_b);
 
-				answer = Catalog.GetString ("You can calculate the answer dividing the distance by the sum of both speeds.");
+				answer = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You can calculate the answer dividing the distance by the sum of both speeds.");
 				break;
 			}
 			case GameType.Apart:
@@ -121,12 +121,12 @@ namespace gbrainy.Games.Logic
 				question = String.Format (
 					// Translators:
 					//  - mph (miles per hour) and miles must be localized this using the right unit of speed for your locale
-					Catalog.GetPluralString ("Two trains on straight parallel tracks leave from the same point and time traveling in opposite directions at {0} and {1} mph respectively. In how many hours they will be {2} mile apart?",
+					ServiceLocator.Instance.GetService <ITranslations> ().GetPluralString ("Two trains on straight parallel tracks leave from the same point and time traveling in opposite directions at {0} and {1} mph respectively. In how many hours they will be {2} mile apart?",
 						"Two trains on straight parallel tracks leave from the same point and time traveling in opposite directions at {0} and {1} mph respectively. In how many hours they will be {2} miles apart?",
 						(int) distance),
 						speed_a, speed_b, distance);
 
-				answer = Catalog.GetString ("You can calculate the answer dividing the distance by the sum of both speeds.");
+				answer = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("You can calculate the answer dividing the distance by the sum of both speeds.");
 				break;
 			}
 			default:
diff --git a/src/Games/Logic/PuzzleTriangles.cs b/src/Games/Logic/PuzzleTriangles.cs
index e76ca84..8f8c4fb 100644
--- a/src/Games/Logic/PuzzleTriangles.cs
+++ b/src/Games/Logic/PuzzleTriangles.cs
@@ -19,9 +19,9 @@
 
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -29,20 +29,20 @@ namespace gbrainy.Games.Logic
 	{
 		int type;
 		public override string Name {
-			get {return Catalog.GetString ("Triangles");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Triangles");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("How many triangles of any size do you count in the figure below?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many triangles of any size do you count in the figure below?");} 
 		}
 
 		public override string Tip {
-			get { return Catalog.GetString ("A triangle can be embedded inside another triangle.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("A triangle can be embedded inside another triangle.");}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("The triangles are made by connecting the following points: {0}"),
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The triangles are made by connecting the following points: {0}"),
 					(type == 0) ? "bdc, dcf, dfg, abd, ade, edg, acg, abg, bcg, afg, ecg, acd, acf, ace, adg, cdg." : 
 					"dcf, ade, acg, afg, ecg, acd, acf, ace.");
 			}
diff --git a/src/Games/Logic/PuzzleTrianglesWithNumbers.cs b/src/Games/Logic/PuzzleTrianglesWithNumbers.cs
index edc1e23..9e473cc 100644
--- a/src/Games/Logic/PuzzleTrianglesWithNumbers.cs
+++ b/src/Games/Logic/PuzzleTrianglesWithNumbers.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Logic
 {
@@ -55,21 +55,21 @@ namespace gbrainy.Games.Logic
 		};
 
 		public override string Name {
-			get {return Catalog.GetString ("Triangles with numbers");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Triangles with numbers");}
 		}
 
 		public override string Question {
-			get {return Catalog.GetString ("Which number should replace the question mark below?");} 
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which number should replace the question mark below?");} 
 		}
 
 
 		public override string Tip {
-			get { return Catalog.GetString ("All the triangles share a property and are independent of the rest.");}
+			get { return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("All the triangles share a property and are independent of the rest.");}
 		}
 
 		public override string Rationale {
 			get {
-				return String.Format (Catalog.GetString ("The result of multiplying the two numbers inside every triangle is {0}."), answer_number);
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The result of multiplying the two numbers inside every triangle is {0}."), answer_number);
 			}
 		}
 
diff --git a/src/Games/Memory/MemoryColouredFigures.cs b/src/Games/Memory/MemoryColouredFigures.cs
index 46b9041..e67775f 100644
--- a/src/Games/Memory/MemoryColouredFigures.cs
+++ b/src/Games/Memory/MemoryColouredFigures.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -48,7 +48,7 @@ namespace gbrainy.Games.Memory
 		private const double block_space = 0.35;
 
 		public override string Name {
-			get {return Catalog.GetString ("Colored figures");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Colored figures");}
 		}
 
 		public override bool UsesColors {
@@ -57,7 +57,7 @@ namespace gbrainy.Games.Memory
 
 		public override string MemoryQuestion {
 			get { return String.Format (
-				Catalog.GetString ("Which of these figures was previously shown? Answer {0}, {1}, {2} or {3}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which of these figures was previously shown? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
diff --git a/src/Games/Memory/MemoryColouredText.cs b/src/Games/Memory/MemoryColouredText.cs
index 825b87f..589bcc4 100644
--- a/src/Games/Memory/MemoryColouredText.cs
+++ b/src/Games/Memory/MemoryColouredText.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -33,7 +33,7 @@ namespace gbrainy.Games.Memory
 		private ArrayListIndicesRandom color_order;
 
 		public override string Name {
-			get {return Catalog.GetString ("Colored text");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Colored text");}
 		}
 
 		public override bool UsesColors {
@@ -42,7 +42,7 @@ namespace gbrainy.Games.Memory
 
 		public override string MemoryQuestion {
 			get { 
-				return String.Format (Catalog.GetString ("What was the color of the text that said '{0}'?"), question_colorname);}
+				return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What was the color of the text that said '{0}'?"), question_colorname);}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Memory/MemoryCountDots.cs b/src/Games/Memory/MemoryCountDots.cs
index efd2c19..34595c7 100644
--- a/src/Games/Memory/MemoryCountDots.cs
+++ b/src/Games/Memory/MemoryCountDots.cs
@@ -19,9 +19,9 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -38,7 +38,7 @@ namespace gbrainy.Games.Memory
 		private int [] dotsPerColor;
 
 		public override string Name {
-			get {return Catalog.GetString ("Counting dots");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Counting dots");}
 		}
 
 		public override bool UsesColors {
@@ -49,7 +49,7 @@ namespace gbrainy.Games.Memory
 			get { 
 				return String.Format (
 					// Translators: {0} is the name of the color. The color name is always singular
-					Catalog.GetString ("How many dots of {0} color were in the previous image? Answer using numbers."),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many dots of {0} color were in the previous image? Answer using numbers."),
 					palette.Name (0));
 			}
 		}
diff --git a/src/Games/Memory/MemoryFacts.cs b/src/Games/Memory/MemoryFacts.cs
index e9af0fa..68ad7ca 100644
--- a/src/Games/Memory/MemoryFacts.cs
+++ b/src/Games/Memory/MemoryFacts.cs
@@ -18,9 +18,9 @@
  */
 
 using System;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -46,7 +46,7 @@ namespace gbrainy.Games.Memory
 		}
 
 		public override string Name {
-			get {return Catalog.GetString ("Memorize facts");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memorize facts");}
 		}
 
 		public override string MemoryQuestion {
@@ -105,12 +105,12 @@ namespace gbrainy.Games.Memory
 				fact.answers [1] = 1914 + random.Next (50);
 				fact.fact = String.Format (
 					// Translators: {0} is replaced by a number, {1} by a year (like 1940)
-					Catalog.GetPluralString ("Shiny Cars had already announced a {0} day production halt next month, but before that it had not cut production since {1}.",
+					ServiceLocator.Instance.GetService <ITranslations> ().GetPluralString ("Shiny Cars had already announced a {0} day production halt next month, but before that it had not cut production since {1}.",
 					"Shiny Cars had already announced a {0} days production halt next month, but before that it had not cut production since {1}.",
 					fact.answers [0]),
 					fact.answers [0], fact.answers [1]);
-				fact.questions [0] = Catalog.GetString ("For how many days did Shiny Cars halt its production?");
-				fact.questions [1] = Catalog.GetString ("In what year did Shiny Cars last halt its production?");
+				fact.questions [0] = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("For how many days did Shiny Cars halt its production?");
+				fact.questions [1] = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In what year did Shiny Cars last halt its production?");
 				break;
 			case 1:
 				fact.Initialize (2);
@@ -118,26 +118,26 @@ namespace gbrainy.Games.Memory
 				fact.answers [1] = 1914 + random.Next (50);
 				fact.fact = String.Format (
 					// Translators: {0} is replaced by a number, {1} by a year (like 1940)
-					Catalog.GetString ("Shiny Cars sales fell {0}% this past December, the worse decline since {1}."),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Shiny Cars sales fell {0}% this past December, the worse decline since {1}."),
 					fact.answers [0], fact.answers [1]);
-				fact.questions [0] = Catalog.GetString ("By how much did company sales fall last December?");
-				fact.questions [1] = Catalog.GetString ("In what year did Shiny Cars record a sales total lower than that of last December?");
+				fact.questions [0] = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("By how much did company sales fall last December?");
+				fact.questions [1] = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In what year did Shiny Cars record a sales total lower than that of last December?");
 				break;
 			case 2:
 				fact.Initialize (1);
 				fact.answers [0] = 10 + random.Next (30);
-				fact.fact = String.Format (Catalog.GetString ("About {0}% of Shiny Cars produced worldwide are sold in Europe."),
+				fact.fact = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("About {0}% of Shiny Cars produced worldwide are sold in Europe."),
 					fact.answers [0]);
-				fact.questions [0] = Catalog.GetString ("What percentage of all Shiny Cars produced worldwide are sold in Europe?");
+				fact.questions [0] = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What percentage of all Shiny Cars produced worldwide are sold in Europe?");
 				break;
 			case 3:
 				fact.Initialize (2);
 				fact.answers [0] = 10 + random.Next (30);
 				fact.answers [1] = 100 - (1 + random.Next (10)) - fact.answers [0];
-				fact.fact = String.Format (Catalog.GetString ("About {0}% of Shiny Cars use diesel, {1}% use gasoline and the remainder use electric."),
+				fact.fact = String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("About {0}% of Shiny Cars use diesel, {1}% use gasoline and the remainder use electric."),
 					fact.answers [0], fact.answers [1]);
-				fact.questions [0] = Catalog.GetString ("What percentage of Shiny Cars use diesel?");
-				fact.questions [1] = Catalog.GetString ("What percentage of Shiny Cars use gasoline?");
+				fact.questions [0] = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What percentage of Shiny Cars use diesel?");
+				fact.questions [1] = ServiceLocator.Instance.GetService <ITranslations> ().GetString ("What percentage of Shiny Cars use gasoline?");
 				break;
 			default:
 				throw new Exception ("Invalid index value");
diff --git a/src/Games/Memory/MemoryFigures.cs b/src/Games/Memory/MemoryFigures.cs
index c606dea..27e3376 100644
--- a/src/Games/Memory/MemoryFigures.cs
+++ b/src/Games/Memory/MemoryFigures.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -52,12 +52,12 @@ namespace gbrainy.Games.Memory
 		}
 
 		public override string Name {
-			get {return Catalog.GetString ("Memorize figures");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memorize figures");}
 		}
 
 		public override string MemoryQuestion {
 			get { 
-				return Catalog.GetString ("In which cell is the other figure like the one shown below? Answer the cell number." );}
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("In which cell is the other figure like the one shown below? Answer the cell number." );}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Memory/MemoryFiguresAndText.cs b/src/Games/Memory/MemoryFiguresAndText.cs
index a324a9d..738b480 100644
--- a/src/Games/Memory/MemoryFiguresAndText.cs
+++ b/src/Games/Memory/MemoryFiguresAndText.cs
@@ -19,9 +19,9 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -48,13 +48,13 @@ namespace gbrainy.Games.Memory
 			{
 				switch (type) {
 				case Triangle:
-					return Catalog.GetString ("Triangle");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Triangle");
 				case Square:
-					return Catalog.GetString ("Square");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Square");
 				case Pentagon:
-					return Catalog.GetString ("Pentagon");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Pentagon");
 				case Circle:
-					return Catalog.GetString ("Circle");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Circle");
 				default:
 					throw new InvalidOperationException ();
 				}
@@ -62,11 +62,11 @@ namespace gbrainy.Games.Memory
 		}
 
 		public override string Name {
-			get {return Catalog.GetString ("Memorize figures and text");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memorize figures and text");}
 		}
 
 		public override string MemoryQuestion {
-			get {return Catalog.GetString ("The list below enumerates the figures shown in the previous image except for one. Which is the missing figure? Possible answers are triangle, square, pentagon and circle." );}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("The list below enumerates the figures shown in the previous image except for one. Which is the missing figure? Possible answers are triangle, square, pentagon and circle." );}
 		}
 
 		protected override void Initialize ()
diff --git a/src/Games/Memory/MemoryFiguresNumbers.cs b/src/Games/Memory/MemoryFiguresNumbers.cs
index 79dda31..f13ccff 100644
--- a/src/Games/Memory/MemoryFiguresNumbers.cs
+++ b/src/Games/Memory/MemoryFiguresNumbers.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -36,12 +36,12 @@ namespace gbrainy.Games.Memory
 		private const double block_space = 0.35;
 
 		public override string Name {
-			get {return Catalog.GetString ("Figures with numbers");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Figures with numbers");}
 		}
 
 		public override string MemoryQuestion {
 			get { return String.Format (
-				Catalog.GetString ("Which one of these squares was previously shown? Answer {0}, {1}, {2} or {3}."),
+				ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which one of these squares was previously shown? Answer {0}, {1}, {2} or {3}."),
 				GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
diff --git a/src/Games/Memory/MemoryIndications.cs b/src/Games/Memory/MemoryIndications.cs
index 900d251..a8b76fa 100644
--- a/src/Games/Memory/MemoryIndications.cs
+++ b/src/Games/Memory/MemoryIndications.cs
@@ -19,10 +19,10 @@
 
 using System;
 using Cairo;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
 using gbrainy.Core.Toolkit;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -127,22 +127,22 @@ namespace gbrainy.Games.Memory
 			{
 				switch (type) {
 				case Indication.Type.Start:
-					return String.Format (Catalog.GetString ("Start at point number {0}"), (int) obj);
+					return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Start at point number {0}"), (int) obj);
 				case Indication.Type.Turn: {
 					switch ((TurnDirection) obj) {
 					case TurnDirection.Right:
-						return Catalog.GetString ("Move right");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Move right");
 					case TurnDirection.Left:
-						return Catalog.GetString ("Move left");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Move left");
 					case TurnDirection.Up:
-						return Catalog.GetString ("Move up");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Move up");
 					case TurnDirection.Down:
-						return Catalog.GetString ("Move down");
+						return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Move down");
 					}
 					break;
 				}
 				case Indication.Type.End:
-					return String.Format (Catalog.GetString ("End at point {0}"), obj);
+					return String.Format (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("End at point {0}"), obj);
 				}
 				return null;
 			}
@@ -156,13 +156,13 @@ namespace gbrainy.Games.Memory
 		private int ans;
 
 		public override string Name {
-			get {return Catalog.GetString ("Memorize indications");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memorize indications");}
 		}
 
 		public override string MemoryQuestion {
 			get { 
 				return String.Format (
-					Catalog.GetString ("Which of the following graphics represent the indications previously given? Answer {0}, {1}, {2} or {3}."),
+					ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Which of the following graphics represent the indications previously given? Answer {0}, {1}, {2} or {3}."),
 					GetPossibleAnswer (0), GetPossibleAnswer (1), GetPossibleAnswer (2), GetPossibleAnswer (3));}
 		}
 
diff --git a/src/Games/Memory/MemoryNumbers.cs b/src/Games/Memory/MemoryNumbers.cs
index 8aabebd..b62f185 100644
--- a/src/Games/Memory/MemoryNumbers.cs
+++ b/src/Games/Memory/MemoryNumbers.cs
@@ -18,9 +18,9 @@
  */
 
 using System.Text;
-using Mono.Unix;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -53,7 +53,7 @@ namespace gbrainy.Games.Memory
 		{
 			public override string Question {
 				get {
-					return Catalog.GetString ("How many odd numbers were in the previous image? Answer using numbers.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many odd numbers were in the previous image? Answer using numbers.");
 				}
 			}
 
@@ -73,7 +73,7 @@ namespace gbrainy.Games.Memory
 		{
 			public override string Question {
 				get {
-					return Catalog.GetString ("How many even numbers were in the previous image? Answer using numbers.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many even numbers were in the previous image? Answer using numbers.");
 				}
 			}
 
@@ -93,7 +93,7 @@ namespace gbrainy.Games.Memory
 		{
 			public override string Question {
 				get {
-					return Catalog.GetString ("How many numbers with more than one digit were in the previous image? Answer using numbers.");
+					return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("How many numbers with more than one digit were in the previous image? Answer using numbers.");
 				}
 			}
 
@@ -110,7 +110,7 @@ namespace gbrainy.Games.Memory
 		}
 
 		public override string Name {
-			get {return Catalog.GetString  ("Memorize numbers");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString  ("Memorize numbers");}
 		}
 
 		public override string MemoryQuestion {
diff --git a/src/Games/Memory/MemoryWords.cs b/src/Games/Memory/MemoryWords.cs
index c53e417..aaf02fa 100644
--- a/src/Games/Memory/MemoryWords.cs
+++ b/src/Games/Memory/MemoryWords.cs
@@ -18,10 +18,10 @@
  */
 
 using System;
-using Mono.Unix;
 using System.Collections.Generic;
 
 using gbrainy.Core.Main;
+using gbrainy.Core.Services;
 
 namespace gbrainy.Games.Memory
 {
@@ -34,12 +34,12 @@ namespace gbrainy.Games.Memory
 		private int answer;
 
 		public override string Name {
-			get {return Catalog.GetString ("Memorize words");}
+			get {return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("Memorize words");}
 		}
 
 		public override string MemoryQuestion {
 			get { 
-				return Catalog.GetString ("There is a missing word from the previous list. Which one is the missing word?");}
+				return ServiceLocator.Instance.GetService <ITranslations> ().GetString ("There is a missing word from the previous list. Which one is the missing word?");}
 		}
 
 		protected override void Initialize ()
@@ -48,53 +48,53 @@ namespace gbrainy.Games.Memory
 			words = new List <string> (total_words);
 
 			// Body parts
-			words.Add (Catalog.GetString ("wrist"));
-			words.Add (Catalog.GetString ("elbow"));
-			words.Add (Catalog.GetString ("armpit"));
-			words.Add (Catalog.GetString ("hand"));
-			words.Add (Catalog.GetString ("chest"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("wrist"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("elbow"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("armpit"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("hand"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("chest"));
 			
 			//Fishes
-			words.Add (Catalog.GetString ("sardine"));
-			words.Add (Catalog.GetString ("trout"));
-			words.Add (Catalog.GetString ("monkfish"));
-			words.Add (Catalog.GetString ("cod"));
-			words.Add (Catalog.GetString ("salmon"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("sardine"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("trout"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("monkfish"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("cod"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("salmon"));
 
 			// Vegetables
-			words.Add (Catalog.GetString ("potato"));
-			words.Add (Catalog.GetString ("ginger"));			
-			words.Add (Catalog.GetString ("pepper"));
-			words.Add (Catalog.GetString ("garlic"));
-			words.Add (Catalog.GetString ("pumpkin"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("potato"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("ginger"));			
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("pepper"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("garlic"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("pumpkin"));
 
 			// Bicycle
-			words.Add (Catalog.GetString ("brake"));
-			words.Add (Catalog.GetString ("pedal"));
-			words.Add (Catalog.GetString ("chain"));			
-			words.Add (Catalog.GetString ("wheel"));
-			words.Add (Catalog.GetString ("handlebar"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("brake"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("pedal"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("chain"));			
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("wheel"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("handlebar"));
 
 			// Music
-			words.Add (Catalog.GetString ("drummer"));
-			words.Add (Catalog.GetString ("speaker"));
-			words.Add (Catalog.GetString ("lyrics"));
-			words.Add (Catalog.GetString ("beat"));			
-			words.Add (Catalog.GetString ("song"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("drummer"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("speaker"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("lyrics"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("beat"));			
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("song"));
 
 			// Weather
-			words.Add (Catalog.GetString ("cloud"));
-			words.Add (Catalog.GetString ("rain"));
-			words.Add (Catalog.GetString ("storm"));
-			words.Add (Catalog.GetString ("fog"));
-			words.Add (Catalog.GetString ("rainbow"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("cloud"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("rain"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("storm"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("fog"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("rainbow"));
 
 			// Animals
-			words.Add (Catalog.GetString ("rabbit"));
-			words.Add (Catalog.GetString ("mouse"));
-			words.Add (Catalog.GetString ("monkey"));
-			words.Add (Catalog.GetString ("bear"));
-			words.Add (Catalog.GetString ("wolf"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("rabbit"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("mouse"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("monkey"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("bear"));
+			words.Add (ServiceLocator.Instance.GetService <ITranslations> ().GetString ("wolf"));
 
 			switch (CurrentDifficulty) {
 			case GameDifficulty.Easy:



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]