View Single Post
  #14  
Old 05-23-2012, 12:21 PM
FG28_Kodiak FG28_Kodiak is offline
Approved Member
 
Join Date: Dec 2009
Location: Swabia->Bavaria->Germany
Posts: 884
Default

@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.
In the DLL (threadsafe Singleton Pattern):
Code:
using System;
using System.Collections.Generic;
using System.Xml;

namespace CoD
{
    public sealed class Configuration
    {

        private static volatile Configuration _theOneAndOnly = null;  
        private readonly Dictionary<string, Dictionary<string, Dictionary<string, string>>> _stringPool = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();

        private static object syncRoot = new object(); //nessesary for threadsave Singleton
        const string XmlLanguagenode = "CloDo/LanguageSection";
        private const string DefaultLanguage = "en";


        public static Configuration GetInstance(string filename)
        {
            if (_theOneAndOnly == null)
            {
                lock (syncRoot)
                {
                    if (_theOneAndOnly == null)
                    {
                        _theOneAndOnly = new Configuration(filename);
                    }
                }
            }
            return _theOneAndOnly;
        }


        private Configuration(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 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 ""; // 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);
        }
    }
}
in the mis (example
Code:
//$reference parts/core/CoD.dll
using System;
using System.Collections.Generic;
using maddox.game;
using maddox.game.world;
using CoD;

public class Mission : AMission
{

    private static string userdocpath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
    private static string FILE_PATH = userdocpath + @"\1C SoftClub\il-2 sturmovik cliffs of dover\";
    private static string CONFIG_FILE = FILE_PATH + @"missions\tests\Language.xml";


    private Configuration Config = Configuration.GetInstance(CONFIG_FILE);

    enum toTarget
    {
        ChatAndScreen,
        Chat,
        Screen
    }


    private void send(IEnumerable<Player> players, string msgKey, toTarget target, params object[] args)
    {
        if (players == null) return;

        foreach (Player pl in players)
        {
            switch (target)
            {
                case toTarget.ChatAndScreen:
                    GamePlay.gpLogServer(new[] { pl }, Config.GetString("Messages", msgKey, pl.LanguageName()), args);
                    GamePlay.gpHUDLogCenter(new[] { pl }, Config.GetString("Messages", msgKey, pl.LanguageName()), args);
                    break;
                case toTarget.Chat:
                    GamePlay.gpLogServer(new[] { pl }, Config.GetString("Messages", msgKey, pl.LanguageName()), args);
                    break;
                case toTarget.Screen:
                    GamePlay.gpHUDLogCenter(new[] { pl }, Config.GetString("Messages", msgKey, pl.LanguageName()), args);
                    break;
            }
        }
    }


    public void SetMainMenu(Player player)
    {

        if (GamePlay.gpPlayer() != null && player == GamePlay.gpPlayer())
            GamePlay.gpSetOrderMissionMenu(player, false, 0, new string[] { Config.GetString("InGameMenu", "MainMenuItem1", player.LanguageName()), Config.GetString("InGameMenu", "MainMenuItem2", player.LanguageName()), Config.GetString("InGameMenu", "MainMenuItem3", player.LanguageName()) }, new bool[] { true, true, true });
        else
            GamePlay.gpSetOrderMissionMenu(player, false, 0, new string[] { Config.GetString("InGameMenu", "MainMenuItem1", player.LanguageName()), Config.GetString("InGameMenu", "MainMenuItem2", player.LanguageName()) }, new bool[] { true, true });
    }


    public override void OnOrderMissionMenuSelected(Player player, int ID, int menuItemIndex)
    {


        if (ID == 0)
        { // main menu
            if (menuItemIndex == 1)
            {

            }
            if (menuItemIndex == 2)
            {


            }
            if (menuItemIndex == 3)
            {


            }
        }
        if (ID == 105)
        {
            if (menuItemIndex == 1)
            {

            }
        }
    }


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

        send(new Player[] { player }, "successMission01_1", toTarget.ChatAndScreen);
        send(new Player[] { player }, "successMission01_2", toTarget.Chat);
        send(new Player[] { player }, "successMission02", toTarget.Chat);
        send(new Player[] { player }, "successMission03", toTarget.Chat);
        send(new Player[] { player }, "successMission04", toTarget.Chat);
        send(new Player[] { player }, "successMission05_1", toTarget.Chat);
        send(new Player[] { player }, "successMission05_2", toTarget.Chat);
        send(new Player[] { player }, "successMission05_3", toTarget.Chat);
        send(new Player[] { player }, "successMission06", toTarget.Chat);

        SetMainMenu(player);
    }
}
A example XML-File:
Code:
<?xml version="1.0" encoding="utf-8"?>
<!-- Sample XML - File for Translation -->
<CloDo>
  <LanguageSection name="Messages">
    <Text key="successMission01_1">
      <en>Red side has destroyed blue artillery</en>
      <ru>Команда красных уничтожила артиллерию синих</ru>
      <de>Die rote Seite hat die blaue Artillerie zerstört</de>
    </Text>
    <Text key="successMission01_2">
      <en>Red side has destroyed blue artillery supply</en>
      <ru>Команда красных уничтожила снабжение артиллерии синих</ru>
      <de>Die rote Seite hat den blauen Artillerie Nachschub zerstört</de>
    </Text>
    <Text key="successMission02">
      <en>Red side has destroyed blue column</en>
      <ru>Команда красных уничтожила автоколонну синих</ru>
      <de>Die rote Seite hat blaue Kolonne zerstört</de>
    </Text>
    <Text key="successMission03">
      <en>Red side has destroyed blue reconnaissance aircraft</en>
      <ru>Команда красных уничтожила самолет-разведчик синих</ru>
      <de>Die rote Seite hat blaues Aufklärungsflugzeug abgeschossen</de>
    </Text>
    <Text key="successMission04">
      <en>Blue side has destroyed red column</en>
      <ru>Команда синих уничтожила автоколонну красных</ru>
      <de>Die blaue Seite hat rote Kolonne zerstört</de>
    </Text>
    <Text key="successMission05_1">
      <en>Blue side has destroyed 30% of the convoy of red</en>
      <ru>Команда синих уничтожила 30% конвоя красных</ru>
      <de>Die blaue Seite hat 30% der roten Kolonne zerstört</de>
    </Text>
    <Text key="successMission05_2">
      <en>Blue side has destroyed 60% of the convoy of red</en>
      <ru>Команда синих уничтожила 60% конвоя красных</ru>
      <de>Die blaue Seite hat 60% der roten Kolonne zerstört</de>
    </Text>
    <Text key="successMission05_3">
      <en>Blue side has destroyed 100% of the convoy of red</en>
      <ru>Команда синих уничтожила 100% конвоя красных</ru>
      <de>Die blaue Seite hat 100% der roten Kolonne zerstört</de>
    </Text>
    <Text key="successMission06">
      <en>Blue side has destroyed red tanks</en>
      <ru>Команда синих уничтожила танковую дивизию красных</ru>
      <de>Die blaue Seite hat die roten Panzer zerstört</de>
    </Text>
  </LanguageSection>
  <LanguageSection name="InGameMenu">
    <Text key="MainMenuItem1">
      <de>Flugzeug auswählen</de>
      <en>Plane selection</en>
    </Text>
    <Text key="MainMenuItem2">
      <de>Gruppen Befehle</de>
      <en>Group Orders</en>
    </Text>
    <Text key="MainMenuItem3">
      <de>Hoster Befehle</de>
      <en>Host Orders</en>
    </Text>
  </LanguageSection>
</CloDo>
Advantages you can add new languages simply, if the language is not found a default language is used, in my example the english one (specifie in DLL).

Last edited by FG28_Kodiak; 05-23-2012 at 12:25 PM.
Reply With Quote