View Single Post
  #17  
Old 07-05-2012, 08:37 AM
podvoxx podvoxx is offline
Approved Member
 
Join Date: Feb 2010
Posts: 190
Default

Quote:
Originally Posted by FG28_Kodiak View Post
@podvoxx

btw. ive created a translation system, also:

I use a nested Dictionary to store the translation strings and fill it from a XML - File.
I create new message system whith translate function, but I have some problem.
In your script:
Code:
private Configuration Config = Configuration.GetInstance(CONFIG_FILE);
...

Config.GetString("Messages", msgKey, pl.LanguageName());
In my script:
Code:
private SendTranslate initTranslate = SendTranslate.GetInstance(localizationFilePath);
I can't use:
Code:
initTranslate.GetString("Messages", msgKey, pl.LanguageName())
I can use only:
Code:
SendTranslate.GetString("Messages", msgKey, pl.LanguageName(), "Chat")
It's ptoblem whith static methods in dll-file:
Code:
public static string GetString(string section, string key, string language)
If I change to none-static field, I have error on this method:
Code:
private static void Send(Player[] playerList, string section, string key, string target, params object[] args)
What I need to do for fix this trouble? I need use code in my mission scripts as on you script type:
Code:
initTranslate.GetString("Messages", msgKey, pl.LanguageName())
My dll.file:
Code:
using System;
using System.IO;
using System.Collections;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;
using System.Xml;

namespace smpmessage
{
    // ====================================================
    // (based on Small_Bee and FG_Kodiak code)
    // ====================================================
    
    public sealed class SendTranslate
    {
        #region Parameters
        private static volatile SendTranslate _theOneAndOnly = null;
        private static readonly Dictionary<string, Dictionary<string, Dictionary<string, string>>> _stringPool = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();
        static readonly IGamePlay GamePlay = Strategy.THIS.GamePlay;

        private static object syncRoot = new object(); //nessesary for threadsave Singleton
        const string XmlLanguagenode = "SMP/LanguageSection";
        private const string DefaultLanguage = "en";
        public static string setupServerLanguage = "en";
        public static string hudON = "on";
        #endregion

        #region Read File
        public static SendTranslate GetInstance(string filename)
        {
            if (_theOneAndOnly == null)
            {
                lock (syncRoot)
                {
                    if (_theOneAndOnly == null)
                    {
                        _theOneAndOnly = new SendTranslate(filename);
                    }
                }
            }
            return _theOneAndOnly;
        }

        private SendTranslate(string filename)
        {
            LoadSettings(filename);
        }

        private 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;
        }

        private 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);
                }

        }

        public static 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);
        }

        #endregion

        #region Send Translate Message to List
        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);
        }

        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);
        }
        #endregion

        #region Send
        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]:" + GetString(section, key, serverLanguageName), args);
                }
                else
                {
                    GamePlay.gpLogServer(serverList.ToArray(), 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(), GetString(section, key, kvp.Key.ToString()), args);
                            GamePlay.gpHUDLogCenter(kvp.Value.ToArray(), GetString(section, key, kvp.Key.ToString()), args);
                        } break;
                        case "Chat": GamePlay.gpLogServer(kvp.Value.ToArray(), GetString(section, key, kvp.Key.ToString()), args); break;
                        case "Screen": GamePlay.gpHUDLogCenter(kvp.Value.ToArray(), GetString(section, key, kvp.Key.ToString()), args); break;
                    }
                }
            }
        }
        #endregion
    }

    public static class SendMessage
    {
        #region Parameters
        static readonly IGamePlay GamePlay = Strategy.THIS.GamePlay;
        public static string hudON = "on";
        #endregion      

        #region Send Message to List
        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);
        }
        #endregion

        #region Send
        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;
                }
            }

        }
        #endregion

        #region GetPlayerList
        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();
        }
        #endregion
    }
}
And example .cs:
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";

    // Create dictionary for translate and send messages
    private SendTranslate initTranslate = SendTranslate.GetInstance(localizationFilePath);

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

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

        initTranslate.GetString("SendMessageSection", "GetTranslateText", "en");

        // TEST Messages
        // Translate and send message 
        /*
        initTranslate.ToAll("SendMessageSection", "SendToChatToALLtranslate", "Chat");
        initTranslate.ToPlayers("SendMessageSection", "SendToChatToPlayertranslate", new Player[] { player }, "Chat");
        initTranslate.ToArmy("SendMessageSection", "SendToChatToArmytranslate", 1, "Chat");

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

        initTranslate.ToAll("SendMessageSection", "SendToChatAndScreenToALLtranslate", "ChatAndScreen");
        initTranslate.ToPlayers("SendMessageSection", "SendToChatAndScreenToPlayertranslate", new Player[] { player }, "ChatAndScreen");
        initTranslate.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");
    }
}
xml:
Code:
<?xml version="1.0" encoding="utf-8"?>
<!-- Language dictionary-->
<SMP>	
	<LanguageSection name="SendMessageSection">		
		<Text key="SendToChatToALLtranslate">
			<en>Send To Chat To ALL translate ENGLISH</en>
			<ru>Send To Chat To ALL translate РУССКИЙ</ru>
		</Text>
		<Text key="SendToChatToPlayertranslate">
			<en>Send To Chat To Player translate ENGLISH</en>
			<ru>Send To Chat To Player translate РУССКИЙ</ru>
		</Text>
		<Text key="SendToChatToArmytranslate">
			<en>Send To Chat To Army translate ENGLISH</en>
			<ru>Send To Chat To Army translate РУССКИЙ</ru>
		</Text>
		<Text key="SendToScreenToALLtranslate">
			<en>Send To Screen To ALL translate ENGLISH</en>
			<ru>Send To Screen To ALL translate РУССКИЙ</ru>
		</Text>
		<Text key="SendToScreenToPlayertranslate">
			<en>Send To Screen To Player translate ENGLISH</en>
			<ru>Send To Screen To Player translate РУССКИЙ</ru>
		</Text>
		<Text key="SendToScreenToArmytranslate">
			<en>Send To Screen To Army translate ENGLISH</en>
			<ru>Send To Screen To Army translate РУССКИЙ</ru>
		</Text>		
		<Text key="SendToChatAndScreenToALLtranslate">
			<en>Send To Chat And Screen To ALL translate ENGLISH</en>
			<ru>Send To Chat And Screen To ALL translate РУССКИЙ</ru>
		</Text>
		<Text key="SendToChatAndScreenToPlayertranslate">
			<en>Send To Chat And Screen To Player translate ENGLISH</en>
			<ru>Send To Chat And Screen To Player translate РУССКИЙ</ru>
		</Text>
		<Text key="SendToChatAndScreenToArmytranslate">
			<en>Send To Chat And Screen To Army translate ENGLISH</en>
			<ru>Send To Chat And Screen To Army translate РУССКИЙ</ru>
		</Text>
		<Text key="GetTranslateText">
			<en>Get Translate Text ENGLISH</en>
			<ru>Get Translate Text РУССКИЙ</ru>
		</Text>
		<Text key="useParametersLabel">
			<en>Number1: {0}, Number2: {1}</en>
			<ru>Число 1: {0}, Число 2: {1}</ru>
		</Text>
	</LanguageSection>
	<LanguageSection name="Parameters">				
		<Text key="useParametersLabel">
			<en>Number1: {0}, Number2: {1}</en>
			<ru>Число 1: {0}, Число 2: {1}</ru>
		</Text>
	</LanguageSection>
</SMP>

Last edited by podvoxx; 07-06-2012 at 06:15 AM.
Reply With Quote