@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.
|