Код:
internal class LanguageManager
{
public string defaultLanguage;
public IGamePlay gamePlay;
public Dictionary<string, Dictionary<string, string>> lines = new Dictionary<string, Dictionary<string, string>>();
public LanguageManager(IGamePlay gamePlay, string defaultLanguage, string langFolderPath)
{
this.defaultLanguage = defaultLanguage;
this.gamePlay = gamePlay;
//string fullPath = Path.Combine(Path.GetDirectoryName(System.Reflection.Assembly.GetExecutingAssembly().Location), langFolderPath);
//load(fullPath);
load(langFolderPath);
}
public string GetString(string msgKey, string language)
{
string retval = msgKey;
if (!lines.ContainsKey(language))
{
language = defaultLanguage;
}
if (lines.ContainsKey(language) && lines[language].ContainsKey(msgKey))
{
retval = lines[language][msgKey];
}
return retval;
}
public void SendMessageToAll(string msgKey, SendMsgTarget target, params string[] parameters)
{
Player[] players = gamePlay.gpRemotePlayers();
if (players != null)
{
send(players, msgKey, target, parameters);
}
}
public void SendMessageToArmy(string msgKey, int army, SendMsgTarget target, params string[] parameters)
{
Player[] players = gamePlay.gpRemotePlayers();
List<Player> acceptedPlayers = new List<Player>();
if (players != null)
{
foreach (Player player in players)
{
if (player.Army() == army) acceptedPlayers.Add(player);
}
if (acceptedPlayers.Count > 0)
{
send(acceptedPlayers.ToArray(), msgKey, target, parameters);
}
}
}
public void SendMessageToPlayers(string msgKey, Player[] players, SendMsgTarget target, params string[] parameters)
{
if (players != null)
{
send(players, msgKey, target, parameters);
}
}
private void send(Player[] players, string msgKey, SendMsgTarget target, params string[] parameters)
{
Dictionary<string, List<Player>> sorted = new Dictionary<string, List<Player>>();
foreach (Player player in players)
{
string langName = player.LanguageName();
if (!lines.ContainsKey(langName))
{
langName = defaultLanguage;
}
if (!sorted.ContainsKey(langName))
{
sorted.Add(langName, new List<Player>());
}
sorted[langName].Add(player);
}
foreach (KeyValuePair<string, List<Player>> kvp in sorted)
{
if (lines[kvp.Key].ContainsKey(msgKey))
{
switch (target)
{
case SendMsgTarget.ChatAndScreen:
{
gamePlay.gpLogServer(kvp.Value.ToArray(), lines[kvp.Key][msgKey], parameters);
gamePlay.gpHUDLogCenter(kvp.Value.ToArray(), lines[kvp.Key][msgKey], parameters);
} break;
case SendMsgTarget.Chat: gamePlay.gpLogServer(kvp.Value.ToArray(), lines[kvp.Key][msgKey], parameters); break;
case SendMsgTarget.Screen: gamePlay.gpHUDLogCenter(kvp.Value.ToArray(), lines[kvp.Key][msgKey], parameters); break;
}
}
}
}
private void load(string langFolderPath)
{
IEnumerable<string> fileNames = Directory.EnumerateFiles(langFolderPath, "*.txt", SearchOption.TopDirectoryOnly);
foreach (string filename in fileNames)
{
parseLanguageFile(filename);
}
}
private void parseLanguageFile(string filename)
{
string[] filelines = File.ReadAllLines(filename);
string[] firstLine = filelines[0].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
if (firstLine[0].Equals("LanguageName"))
{
string langName = firstLine[1];
if (!lines.ContainsKey(langName))
{
lines.Add(langName, new Dictionary<string, string>());
}
for (int i = 1; i < filelines.Length; i++)
{
string[] lineArr = filelines[i].Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries);
if (lineArr.Length != 2) continue;
lines[langName][lineArr[0]] = lineArr[1];
}
}
}
}
internal enum SendMsgTarget
{
Chat,
Screen,
ChatAndScreen
}