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
  #12  
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
 

Thread Tools
Display Modes

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 01:36 PM.


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