Не совсем понятно как это совместить с LocalizedMessages
sendChatMessageTo(-1, GetLocalizedMessage("ru", "Hello"), null); Это отправит сообщение только владельцам русской версии? А если нужно отправить всем, но на разных языках. Мысли вслух.
GetLocalizedMessage сам проверяет язык установленной игры у клиента?
--- Добавлено ---
Цитата:
Сообщение от Small_Bee
А для Player есть LanguageName() - языковая проблема походу решена.
Цитата:
Сообщение от Small_Bee
Все остальное примерно так
Код:
private string GetLocalizedMessage(string lang, string key)
{
switch(key)
{
case "Hello":
{
switch (lang)
{
case "ru": return "Привет!";
case "en": return "Hello!";
case "turtle": return "Cawabanga dude!";
}
} break;
}
return String.Empty;
}
Вот эти вещи как совместить можно, т.е. как этот скрипт узнает на каком конкретно языке писать конкретному пользователю?
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if ((GamePlay.gpPlayer().Army() == army || army == -1) && GamePlay.gpPlayer().LanguageName().Equals(playerlanguage))
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if ((p.Army() == army || army == -1) && p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpHUDLogCenter(Players.ToArray(), msg, parms);
}
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if ((GamePlay.gpPlayer().Army() == army || army == -1) && GamePlay.gpPlayer().LanguageName().Equals(playerlanguage))
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if ((p.Army() == army || army == -1) && p.LanguageName().Equals(playerlanguage))
Players.Add(p);
}
}
if (Players != null && Players.Count > 0)
GamePlay.gpLogServer(Players.ToArray(), msg, parms);
}
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
foreach (string st in exepttoplayerlanguages)
{
Players.RemoveAll(item => item.LanguageName().Equals(st));
}
foreach (string st in exepttoplayerlanguages)
{
//Singleplayer or Dedi Server
if (GamePlay.gpPlayer() != null)
{
if (GamePlay.gpPlayer().Army() == army || army == -1)
Players.Add(GamePlay.gpPlayer());
} // Multiplayer
if (GamePlay.gpRemotePlayers() != null || GamePlay.gpRemotePlayers().Length > 0)
{
foreach (Player p in GamePlay.gpRemotePlayers())
{
if (p.Army() == army || army == -1)
Players.Add(p);
}
}
}
foreach (string st in exepttoplayerlanguages)
{
Players.RemoveAll(item => item.LanguageName().Equals(st));
}
Re: [Скрипт] Сообщение на экран и в чат для оффлана и онлайна
Выкладываю свой вариант локализации, основан на массивах. Компактней и читабельней switch..case
Код:
using System;
using System.Collections;
using maddox.game;
using maddox.game.world;
using maddox.GP;
using System.Collections.Generic;
using System.IO;
public class Mission : AMission
{
//=========================LOCALIZATION=============================
string[] languageArray = { "en", "ru", "de", "fr", "es", "cs", "it", "pl" };
В конструкторе класса передаем следующие параметры
1. IGamePlay gamePlay - собственно GamePlay наш дорогой, что бы менеджер мог найти игроков и отправлять сообщения.
2. string defaultLanguage - язык, который будет использоваться по-умолчанию (если соотв. игроку языковой файл не существует).
3. string langFolderPath - полный путь к папке, где хранятся языковые файлы.
Методы
Класс предоставляет четыре публичных метода для работы с ним.
1. GetString(string msgKey, string language)
Получить строку на требуемом языке. Первый параметр ключ строки, второй - язык. Может потребоваться, к примеру, для заполнения строк в миссионном меню на языке игрока.
2. SendMessageToAll(string msgKey, SendMsgTarget target, params string[] parameters)
Отправить сообщение всем игрокам.
Первый параметр - ключ строки.
Второй параметр перечисление, куда выводить сообщение. Может принимать три значения:
Chat - сообщение будет выведено в чат;
Screen - сообщение будет выведено по центру экрана большими красными буквами;
ChatAndScreen - сообщение будет выведено и в чат, и на экран.
Третий параметр - массив параметров сообщения, использование аналогично родным методам. null если параметры не используются.
3. SendMessageToArmy(string msgKey, int army, SendMsgTarget target, params string[] parameters)
Отправить сообщение команде.
Первый параметр - аналогично п.2.
Второй параметр - целевая армия, 1 - красным, 2 - синим:
Третий параметр - перечисление, аналогично п.2
Четвертый параметр - аналогично п.2.
4. SendMessageToPlayers(string msgKey, Player[] players, SendMsgTarget target, params string[] parameters)
Отправить сообщение только указанным игрокам
Второй параметр - массив игроков, которым надо отправить сообщение, остальное аналогично указанному выше.
Структура языкового файла:
Примитивный ini-подобный файл с парами ключ-значение. Ключ мы непосредственно используем в скрипте, класс на основе этого ключа выдает строку.
Первая пара должна представлять собой название целевого языка.
Требования
1. Должен быть как минимум один языковой файл для языка по умолчанию, который вы передаете в конструкторе.
2. Первой строкой в языковом файле должно быть наименование языка, для которого этот файл используется. Имя файла значения не имеет.
3. Актуален для онлайн миссий.
Преимущества
1. Минимум кода для при использовании непосредственно в скрипте миссии.
2. Нас не волнует язык игрока, класс самостоятельно выбирает нужный язык, и если его не существует, использует язык по-умолчанию.
3. Не надо править/исправлять скрипт для добавления языков или изменения строк, все делается в языковых файлах.
Полный cs-файл и пример языкового файла во вложении. cs-файл выдрал из проекта, поэтому при использовании может понадобится удалить/переименовать namespace.
Собственно старая версия этого класса использовалась в морском льве.
13.01.2012, 11:24
podvoxx
Re: [Скрипт] Сообщение на экран и в чат для оффлана и онлайна
И правда ,зачем изобретать велосипед )) Использую готовое профессиональное решение, а освободившееся время потрачу на что-нибудь другое интересное. Спасибо за код :thx:
23.05.2012, 19:09
podvoxx
Re: [Скрипт] Сообщение на экран и в чат для оффлана и онлайна