![]() |
#12
|
|||
|
|||
![]()
@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); } } } 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); } } 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> Last edited by FG28_Kodiak; 05-23-2012 at 12:25 PM. |
Thread Tools | |
Display Modes | |
|
|