Fulqrum Publishing Home   |   Register   |   Today Posts   |   Members   |   UserCP   |   Calendar   |   Search   |   FAQ

Go Back   Official Fulqrum Publishing forum > Fulqrum Publishing > IL-2 Sturmovik: Cliffs of Dover > FMB, Mission & Campaign builder Discussions

 
 
Thread Tools Display Modes
Prev Previous Post   Next Post Next
  #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
 


Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off

Forum Jump


All times are GMT. The time now is 08:59 AM.


Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright © 2007 Fulqrum Publishing. All rights reserved.