View Single Post
  #21  
Old 07-06-2012, 09:07 AM
FG28_Kodiak FG28_Kodiak is offline
Approved Member
 
Join Date: Dec 2009
Location: Swabia->Bavaria->Germany
Posts: 884
Default

Ok, made some changes:

The dll:
Code:
using System;
using System.Collections.Generic;
using System.Xml;
using maddox.game;
using maddox.game.world;

namespace smpmessage
{

    public sealed class Translations
    {
        private static readonly Lazy<Translations> Lazy = new Lazy<Translations>(() => new Translations());

        private static readonly Dictionary<string, Dictionary<string, Dictionary<string, string>>> _stringPool =
            new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();

        private const string XmlLanguagenode = "SMP/LanguageSection";
        private const string DefaultLanguage = "en";


        public static Translations GetInstance
        {
            get { return Lazy.Value; }
        }


        private Translations()
        {
        }


        public static Translations UseConfigFile(string fileName)
        {
            if (_stringPool.Count == 0)
                LoadSettings(fileName);
            return Lazy.Value;
        }


        private static void LoadSettings(string languageFile)
        {
            XmlDocument xDoc = LoadXMLFile(languageFile);

            var xmlNodeList = xDoc.SelectNodes(XmlLanguagenode);

            if (xmlNodeList != null)
                foreach (XmlNode sectionNode in xmlNodeList)
                {

                    var strs = new Dictionary<string, Dictionary<string, string>>();

                    foreach (XmlNode textNode in sectionNode.ChildNodes)
                    {

                        var texts = new Dictionary<string, string>();

                        foreach (XmlNode txt in textNode.ChildNodes)
                        {
                            texts.Add(txt.Name, txt.InnerText);
                        }

                        if (textNode.Attributes != null) strs.Add(textNode.Attributes["key"].Value, texts);
                    }

                    if (sectionNode.Attributes != null) _stringPool.Add(sectionNode.Attributes["name"].Value, strs);
                }

        }


        private static XmlDocument LoadXMLFile(string file)
        {
            // Load the xml-file in a xml-document
            XmlDocument xDoc = new XmlDocument();

            try
            {
                xDoc.Load(file);
            }
            catch (System.IO.FileNotFoundException)
            {
                throw new Exception("Xml-File " + file + " not found");
            }
            catch (Exception ex)
            {
                throw new Exception("Error loading " + file + ": " + ex.Message);
            }

            return xDoc;
        }


        public string GetString(string section, string key, string language)
        {
            if (_stringPool.Count > 0)
            {
                Dictionary<string, Dictionary<string, string>> strs;

                if (_stringPool.TryGetValue(section, out strs))
                {
                    Dictionary<string, string> texts;

                    if (strs.TryGetValue(key, out texts))
                    {
                        string text;
                        if (texts.TryGetValue(language, out text))
                            return text;
                        if (texts.TryGetValue(DefaultLanguage, out text))
                            return text;
                    }
                }
            }
            return key; // if nothing is found return a empty string -> modify if a error message is needed. 
        }


        public string GetString(string section, string key)
        {
            return GetString(section, key, DefaultLanguage);
        }

    }


    public static class SendMessage
    {
        private static readonly IGamePlay GamePlay = Strategy.THIS.GamePlay;
        private static Translations Translator = Translations.GetInstance; //Reference to the Singleton Class 
        public static string setupServerLanguage = "en";
        public static string hudON = "on";


        public static void ToAll(string message, string target, params object[] args)
        {
            Send(GetPlayerList(1), message, target, args);
            Send(GetPlayerList(2), message, target, args);
        }


        public static void ToArmy(string message, int army, string target, params object[] args)
        {
            Send(GetPlayerList(army), message, target, args);
        }


        public static void ToPlayers(string message, Player[] players, string target, params object[] args)
        {
            Send(players, message, target, args);
        }


        private static void Send(Player[] playerList, string message, string target, params object[] args)
        {
            List<Player> serverList = new List<Player>();
            if (GamePlay.gpPlayer() != null)
            {
                serverList.Add(GamePlay.gpPlayer());
            }

            if (serverList.Count > 0)
            {
                if (target == "Screen" && hudON == "on")
                {
                    GamePlay.gpLogServer(serverList.ToArray(), "[HUD]:" + message, args);
                }
                else
                {
                    GamePlay.gpLogServer(serverList.ToArray(), message, args);
                }
            }
            if (playerList.Length > 0)
            {
                switch (target)
                {
                    case "ChatAndScreen":
                        {
                            GamePlay.gpLogServer(playerList, message, args);
                            GamePlay.gpHUDLogCenter(playerList, message, args);
                        }
                        break;
                    case "Chat":
                        {
                            GamePlay.gpLogServer(playerList, message, args);
                            break;
                        }
                    case "Screen":
                        GamePlay.gpHUDLogCenter(playerList, message, args);
                        break;
                }
            }

        }


        public static Player[] GetPlayerList(int army)
        {
            List<Player> playerList = new List<Player>();
            List<Player> playerArmyList = new List<Player>();

            if (GamePlay.gpPlayer() != null)
                playerList.Add(GamePlay.gpPlayer());
            if (GamePlay.gpRemotePlayers() != null)
                playerList.AddRange(GamePlay.gpRemotePlayers());

            if (playerList != null)
            {
                foreach (Player player in playerList)
                {
                    if (player.Army() == army && player != null)
                        playerArmyList.Add(player);
                }
            }
            return playerArmyList.ToArray();
        }


        public static void ToAll(string section, string key, string target, params object[] args)
        {
            Send(SendMessage.GetPlayerList(1), section, key, target, args);
            Send(SendMessage.GetPlayerList(2), section, key, target, args);
            SendMessage.GetPlayerList(1);
        }


        public static void ToArmy(string section, string key, int army, string target, params object[] args)
        {
            Send(SendMessage.GetPlayerList(army), section, key, target, args);
        }


        public static void ToPlayers(string section, string key, Player[] players, string target, params object[] args)
        {
            Send(players, section, key, target, args);
        }



        private static void Send(Player[] playerList, string section, string key, string target, params object[] args)
        {
            Dictionary<string, List<Player>> playerLanguageDict = new Dictionary<string, List<Player>>();
            List<Player> serverList = new List<Player>();
            string serverLanguageName = "en";


            if (GamePlay.gpPlayer() != null)
            {
                serverList.Add(GamePlay.gpPlayer());
            }

            foreach (Player player in playerList)
            {
                string languageName = player.LanguageName();
                if (!playerLanguageDict.ContainsKey(languageName))
                {
                    playerLanguageDict.Add(languageName, new List<Player>());
                }
                playerLanguageDict[languageName].Add(player);
            }

            if (serverList.Count > 0)
            {
                foreach (Player serverPlayer in serverList)
                {
                    serverLanguageName = serverPlayer.LanguageName();
                    if (setupServerLanguage != "off")
                    {
                        serverLanguageName = setupServerLanguage;
                    }
                }
                if (target == "Screen" && hudON == "on")
                {
                    GamePlay.gpLogServer(serverList.ToArray(),
                                         "[HUD]:" + Translator.GetString(section, key, serverLanguageName), args);
                }
                else
                {
                    GamePlay.gpLogServer(serverList.ToArray(), Translator.GetString(section, key, serverLanguageName),
                                         args);
                }
            }

            if (playerList.Length > 0)
            {
                foreach (KeyValuePair<string, List<Player>> kvp in playerLanguageDict)
                {
                    switch (target)
                    {
                        case "ChatAndScreen":
                            {
                                GamePlay.gpLogServer(kvp.Value.ToArray(),
                                                     Translator.GetString(section, key, kvp.Key), args);
                                GamePlay.gpHUDLogCenter(kvp.Value.ToArray(),
                                                        Translator.GetString(section, key, kvp.Key), args);
                            }
                            break;
                        case "Chat":
                            GamePlay.gpLogServer(kvp.Value.ToArray(),
                                                 Translator.GetString(section, key, kvp.Key), args);
                            break;
                        case "Screen":
                            GamePlay.gpHUDLogCenter(kvp.Value.ToArray(),
                                                    Translator.GetString(section, key, kvp.Key), args);
                            break;
                    }
                }
            }
        }
    }

}
Test cs (Mission file):
Code:
//$reference smpmessage.dll
using System;
using maddox.game;
using maddox.game.world;
using smpmessage;

/* Available methods:
 * -- Translate and send message 
 * public static void ToAll(string section, string key, string target, params object[] args)
 * public static void ToArmy(string section, string key, int army, string target, params object[] args)
 * public static void ToPlayers(string section, string key, Player[] players, string target, params object[] args)
 * 
 * -- No translate, only send message
 * public static void ToAll(string message, string target, params object[] args)
 * public static void ToArmy(string message, int army, string target, params object[] args)
 * public static void ToPlayers(string message, Player[] players, string target, params object[] args)
 * 
 * -- Only translate, no send message
 * public string GetString(string section, string key, string language)
 *
 * Available languages in game:  en  ru  de  fr  es  cs  it  pl
*/

public class Mission : AMission
{
    // Path to localization xml-file, if you want to use localization on your script
    private static string localizationFilePath = Environment.GetFolderPath(Environment.SpecialFolder.Personal) + "\\1C SoftClub\\il-2 sturmovik cliffs of dover\\missions\\Single\\LocalizationExample\\localization.xml";

    // Load Languagefile for use in Message
    private Translations Translator = Translations.UseConfigFile(localizationFilePath);
    


    public override void OnBattleStarted()
    {
        base.OnBattleStarted();
        MissionNumberListener = -1;
    }

    public override void OnPlaceEnter(Player player, AiActor actor, int placeIndex)
    {
        base.OnPlaceEnter(player, actor, placeIndex);


        string testmsg = "TestMessage: " + Translator.GetString("SendMessageSection", "GetTranslateText", "en");
        GamePlay.gpLogServer(null, testmsg, null);


        SendMessage.ToAll("SendMessageSection", "GetTranslateText", "en");


        SendMessage.ToAll("SendMessageSection", "SendToChatToALLtranslate", "Chat");
        SendMessage.ToPlayers("SendMessageSection", "SendToChatToPlayertranslate", new Player[] { player }, "Chat");
        SendMessage.ToArmy("SendMessageSection", "SendToChatToArmytranslate", 1, "Chat");

        SendMessage.ToAll("SendMessageSection", "SendToScreenToALLtranslate", "Screen");
        SendMessage.ToPlayers("SendMessageSection", "SendToScreenToPlayertranslate", new Player[] { player }, "Screen");
        SendMessage.ToArmy("SendMessageSection", "SendToScreenToArmytranslate", 1, "Screen");

        SendMessage.ToAll("SendMessageSection", "SendToChatAndScreenToALLtranslate", "ChatAndScreen");
        SendMessage.ToPlayers("SendMessageSection", "SendToChatAndScreenToPlayertranslate", new Player[] { player }, "ChatAndScreen");
        SendMessage.ToArmy("SendMessageSection", "SendToChatAndScreenToArmytranslate", 1, "ChatAndScreen");
        
        // No translate, only send message
        SendMessage.ToAll("Message to ALL - ENGLISH or ДРУГОЙ ЯЗЫК", "Chat");
        SendMessage.ToPlayers("Message to Players - ENGLISH or ДРУГОЙ ЯЗЫК", new Player[] { player }, "Chat");
        SendMessage.ToArmy("Message to Army - ENGLISH or ДРУГОЙ ЯЗЫК", 1, "Chat");

        SendMessage.ToAll("Message to ALL - ENGLISH or ДРУГОЙ ЯЗЫК", "Screen");
        SendMessage.ToPlayers("Message to Players - ENGLISH or ДРУГОЙ ЯЗЫК", new Player[] { player }, "Screen");
        SendMessage.ToArmy("Message to Army - ENGLISH or ДРУГОЙ ЯЗЫК", 1, "Screen");

        SendMessage.ToAll("Message to ALL - ENGLISH or ДРУГОЙ ЯЗЫК", "ChatAndScreen");
        SendMessage.ToPlayers("Message to Players - ENGLISH or ДРУГОЙ ЯЗЫК", new Player[] { player }, "ChatAndScreen");
        SendMessage.ToArmy("Message to Army - ENGLISH or ДРУГОЙ ЯЗЫК", 1, "ChatAndScreen");

        // Only translate, no send message
        //initTranslate.GetString("SendMessageSection", "GetTranslateText", "en");
        //initTranslate.GetString("SendMessageSection", "GetTranslateText", "ru");
        //initTranslate.GetString("SendMessageSection", "GetTranslateText", player.LanguageName());
        // Examples for using translated text:
        /*
        SendMessage.ToAll(initTranslate.GetString("SendMessageSection", "GetTranslateText", "en"), "Chat");
        SendMessage.ToAll(initTranslate.GetString("SendMessageSection", "GetTranslateText", player.LanguageName()), "Chat");
        SendMessage.ToAll(initTranslate.GetString("SendMessageSection", "GetTranslateText", "de"), "Chat");
        */
        // Using parameters in messages
        int number1 = 1000;
        int number2 = 500;
        SendMessage.ToAll("SendMessageSection", "============NO TRANSLATE LINE whith xml-file===========", "Chat");

        SendMessage.ToAll("Parameters", "useParametersLabel", "Chat", number1, number2);
        SendMessage.ToAll("Parameters", "useParametersLabel", "Screen", number1, number2);
        SendMessage.ToAll("Parameters", "useParametersLabel", "ChatAndScreen", number1, number2);

        SendMessage.ToAll("Number1 = {0}, Number2 = {1}", "Chat", number1, number2);
        SendMessage.ToAll("Number1 = {0}, Number2 = {1}", "Screen", number1, number2);
        SendMessage.ToAll("Number1 = {0}, Number2 = {1}", "ChatAndScreen", number1, number2);

        SendMessage.ToAll("============NO TRANSLATE LINE whithout xml-file===========", "Chat");
    }
}
What modified:
Changed the old singleton implementation to a better one (without double locking) and renamed it to Translations
Moved the translationsMessages to the sendMessage Class. Added reference to the Singleton Translations "private static Translations Translator = Translations.GetInstance;" so GetString() could used in the sendMessage class (Translator.GetString(...))
Added a UseConfigFile to the singleton to load the language file later (in cs from mission).

To load the Translationsfile into the singleton use:
private Translations Translator = Translations.UseConfigFile(localizationFilePath);
in mission file cs.


Should work now, couldn't test it at work, only short time in coffee break for modifications

Last edited by FG28_Kodiak; 07-06-2012 at 09:13 AM.
Reply With Quote