Skip to content

Commit

Permalink
Localization Support
Browse files Browse the repository at this point in the history
  • Loading branch information
JavidPack committed Feb 19, 2018
1 parent 3530bff commit fa25ca4
Show file tree
Hide file tree
Showing 34 changed files with 404 additions and 175 deletions.
4 changes: 2 additions & 2 deletions Commands/AdminInstructionsCommand.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,12 +10,12 @@ internal class AdminInstructionsCommand : ModCommand

public override string Command => "HEROsAdmin";

public override string Description => "Informs you how to become Admin in HERO's Mod";
public override string Description => HEROsMod.HeroText("AdminInstructionsCommandDescription");

public override void Action(CommandCaller caller, string input, string[] args)
{
Console.ForegroundColor = ConsoleColor.Yellow;
Console.WriteLine("Create an account, login, and type /auth " + Network.AuthCode + " to become Admin.");
Console.WriteLine(string.Format(HEROsMod.HeroText("DedicatedServerAutoMessage"), Network.AuthCode));
Console.ResetColor();
}
}
Expand Down
8 changes: 4 additions & 4 deletions Commands/BecomeAdmin.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ internal class BecomeAdmin : ModCommand

public override string Command => "auth";

public override string Description => "Makes you Admin in HERO's Mod";
public override string Description => HEROsMod.HeroText("MakesYouAdminInHEROsMod");

public override string Usage => "/auth SecretCode";

Expand All @@ -33,16 +33,16 @@ public override void Action(CommandCaller caller, string input, string[] args)
Network.Players[caller.Player.whoAmI].Group = Network.AdminGroup;
DatabaseController.SetPlayerGroup(Network.Players[caller.Player.whoAmI].ID, Network.Players[caller.Player.whoAmI].Group.ID);
LoginService.SendPlayerPermissions(caller.Player.whoAmI);
Network.SendTextToPlayer("You are now Admin", caller.Player.whoAmI);
Network.SendTextToPlayer(HEROsMod.HeroText("YouAreNowAdmin"), caller.Player.whoAmI);
return;
}
else
{
Network.SendTextToPlayer("Please login first", caller.Player.whoAmI);
Network.SendTextToPlayer(HEROsMod.HeroText("PleaseLoginFirst"), caller.Player.whoAmI);
return;
}
}
throw new UsageException("Auth code is incorrect");
throw new UsageException(HEROsMod.HeroText("AuthCodeIsIncorrect"));
}
}
}
63 changes: 62 additions & 1 deletion HEROsMod.cs
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,11 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Reflection;
using Terraria;
using Terraria.DataStructures;
using Terraria.Localization;
using Terraria.ModLoader;
using Terraria.ModLoader.IO;
using Terraria.UI;
Expand All @@ -21,18 +24,24 @@ namespace HEROsMod
internal class HEROsMod : Mod
{
public static HEROsMod instance;
internal static Dictionary<string, ModTranslation> translations; // reference to private field.

public override void Load()
{
// Since we are using hooks not in older versions, and since ItemID.Count changed, we need to do this.
if (ModLoader.version < new Version(0, 10))
{
throw new Exception("\nThis mod uses functionality only present in the latest tModLoader. Please update tModLoader to use this mod\n\n");
throw new Exception(HEROsMod.HeroText("UpdateTModLoaderToUse"));
}

try
{
instance = this;

FieldInfo translationsField = typeof(Mod).GetField("translations", BindingFlags.Instance | BindingFlags.NonPublic);
translations = (Dictionary<string, ModTranslation>)translationsField.GetValue(this);
LoadTranslations();

// AddGlobalItem("HEROsModGlobalItem", new HEROsModGlobalItem());
// AddPlayer("HEROsModModPlayer", new HEROsModModPlayer());
//if (ModUtils.NetworkMode != NetworkMode.Server)
Expand All @@ -59,9 +68,17 @@ public override void Load()
}
}

internal static string HeroText(string key)
{
return translations[$"Mods.HEROsMod.{key}"].GetTranslation(Language.ActiveCulture);
// This isn't good until after load....
// return Language.GetTextValue($"Mods.HEROsMod.{category}.{key}");
}

// Clear EVERYthing, mod is unloaded.
public override void Unload()
{
translations = null;
UIKit.UIComponents.ItemBrowser.Filters = null;
UIKit.UIComponents.ItemBrowser.DefaultSorts = null;
UIKit.UIButton.buttonBackground = null;
Expand Down Expand Up @@ -185,6 +202,50 @@ public override bool HijackGetData(ref byte messageType, ref BinaryReader reader
return false;
}

private void LoadTranslations()
{
// 0.10.1.2 already does this
if (ModLoader.version >= new Version(0, 10, 1, 2))
return;

var modTranslationDictionary = new Dictionary<string, ModTranslation>();
var translationFiles = File.Where(x => Path.GetExtension(x.Key) == ".lang");
foreach (var translationFile in translationFiles)
{
string translationFileContents = System.Text.Encoding.UTF8.GetString(translationFile.Value);
GameCulture culture = GameCulture.FromName(Path.GetFileNameWithoutExtension(translationFile.Key));

using (StringReader reader = new StringReader(translationFileContents))
{
string line;
while ((line = reader.ReadLine()) != null)
{
int split = line.IndexOf('=');
if (split < 0)
continue; // lines witout a = are ignored
string key = line.Substring(0, split).Trim().Replace(" ", "_");
string value = line.Substring(split + 1).Trim();
if (value.Length == 0)
{
continue;
}
value = value.Replace("\\n", "\n");
// TODO: Maybe prepend key with filename: en.US.ItemName.lang would automatically assume "ItemName." for all entries.
//string key = key;
ModTranslation mt;
if (!modTranslationDictionary.TryGetValue(key, out mt))
modTranslationDictionary[key] = mt = CreateTranslation(key);
mt.AddTranslation(culture, value);
}
}
}

foreach (var value in modTranslationDictionary.Values)
{
AddTranslation(value);
}
}

//public override Matrix ModifyTransformMatrix(Matrix Transform)
//{
// if (!Main.gameMenu)
Expand Down
51 changes: 26 additions & 25 deletions HEROsModNetwork/GeneralMessages.cs
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ private static void ProcessPlayerUsingHEROsMod(int playerNumber)
// CTF.CTFMessages.TellClientGameStarted(playerNumber);
// CTF.CTFMessages.ChangePlayerTeam(Network.Players[playerNumber], CTF.TeamColor.None);
//}
Network.SendTextToPlayer(@"Click the 'Login' button on the HEROsMod hotbar to Login or Create an Account", playerNumber, Color.Red);
Network.SendTextToPlayer(HEROsMod.HeroText("LoginInstructions"), playerNumber, Color.Red);
}
}

Expand All @@ -353,31 +353,31 @@ private static void ProcessTimeChangeRequest(ref BinaryReader reader, int player
case TimeChangeType.SetToNoon:
Main.dayTime = true;
Main.time = 27000.0;
Network.SendTextToAllPlayers("The time has been changed to noon by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("TimeChangedNoonBy"), Main.player[playerNumber].name));
break;

case TimeChangeType.SetToMidnight:
Main.dayTime = false;
Main.time = 27000.0;
Network.SendTextToAllPlayers("The time has been changed to midnight by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("TimeChangedMidnightBy"), Main.player[playerNumber].name));
break;

case TimeChangeType.SetToNight:
Main.dayTime = false;
Main.time = 0;
Network.SendTextToAllPlayers("The time has been changed to night by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("TimeChangedNightBy"), Main.player[playerNumber].name));
break;

case TimeChangeType.Pause:
HEROsModServices.TimeWeatherChanger.TimePaused = !HEROsModServices.TimeWeatherChanger.TimePaused;
if (HEROsModServices.TimeWeatherChanger.TimePaused)
{
HEROsModServices.TimeWeatherChanger.PausedTime = Main.time;
Network.SendTextToAllPlayers("Time has been paused by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("TimePausedBy"), Main.player[playerNumber].name));
}
else
{
Network.SendTextToAllPlayers("Time has been resumed by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("TimeResumedBy"), Main.player[playerNumber].name));
}
TimePausedOrResumed();
break;
Expand Down Expand Up @@ -411,7 +411,7 @@ private static void ProcessClearGroundItemsRequest(int playerNumber)
if (Network.Players[playerNumber].Group.HasPermission("ClearItems"))
{
Network.ClearGroundItems();
Network.SendTextToAllPlayers("Items on the ground were cleared by " + Netplay.Clients/*.serverSock*/[playerNumber].Name/*name*/);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("ItemsClearedBy"), Main.player[playerNumber].name));
}
}

Expand All @@ -428,11 +428,11 @@ private static void ProcessToggleEnemiesRequest(int playerNumber)
HEROsModServices.EnemyToggler.ToggleNPCs();
if (HEROsModServices.EnemyToggler.EnemiesAllowed)
{
Network.SendTextToAllPlayers("Enemy spawns were enabled by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("EnemySpawnsEnabledBy"), Main.player[playerNumber].name));
}
else
{
Network.SendTextToAllPlayers("Enemy spawns were disabled by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("EnemySpawnsDisabledBy"), Main.player[playerNumber].name));
}
EnemiesToggled();
}
Expand Down Expand Up @@ -479,7 +479,7 @@ private static void ProcessStartRainRequest(int playerNumber)
if (Network.Players[playerNumber].Group.HasPermission("ChangeTimeWeather"))
{
ModUtils.StartRain();
Network.SendTextToAllPlayers("Rain has been turned on by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("RainTurnedOnBy"), Main.player[playerNumber].name));
}
}

Expand All @@ -494,7 +494,7 @@ private static void ProcessStopRainRequest(int playerNumber)
if (Network.Players[playerNumber].Group.HasPermission("ChangeTimeWeather"))
{
ModUtils.StopRain();
Network.SendTextToAllPlayers("Rain has been turned off by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("RainTurnedOffBy"), Main.player[playerNumber].name));
}
}

Expand All @@ -509,7 +509,7 @@ private static void ProcessStartSandstormRequest(int playerNumber)
if (Network.Players[playerNumber].Group.HasPermission("ChangeTimeWeather"))
{
ModUtils.StartSandstorm();
Network.SendTextToAllPlayers("Sandstorm has been turned on by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("SandstormTurnedOnBy"), Main.player[playerNumber].name));
}
}

Expand All @@ -524,7 +524,7 @@ private static void ProcessStopSandstormRequest(int playerNumber)
if (Network.Players[playerNumber].Group.HasPermission("ChangeTimeWeather"))
{
ModUtils.StopSandstorm();
Network.SendTextToAllPlayers("Sandstorm has been turned off by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("SandstormTurnedOffBy"), Main.player[playerNumber].name));
}
}

Expand All @@ -541,7 +541,7 @@ private static void ProcessForcedSundialRequest(int playerNumber)
Main.fastForwardTime = true;
Main.sundialCooldown = 0;
NetMessage.SendData(7, -1, -1, null, 0, 0f, 0f, 0f, 0, 0, 0);
Network.SendTextToAllPlayers("Forced Enchanted Sundial initiated by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("ForcedEnchangedSundialBy"), Main.player[playerNumber].name));
}
}

Expand Down Expand Up @@ -595,7 +595,7 @@ private static void ProcessAddWaypointRequest(ref BinaryReader reader, int playe
}
else
{
Network.SendTextToPlayer("A waypoint with this name already exists, please enter another name.", playerNumber);
Network.SendTextToPlayer(HEROsMod.HeroText("WaypointAlreadyExists"), playerNumber);
}
}
}
Expand Down Expand Up @@ -745,7 +745,7 @@ private static void ProcessCreateRegionRequest(ref BinaryReader reader, int play
DatabaseController.AddRegion(ref region);
Network.Regions.Add(region);
SendRegionListToAllPlayers();
Network.SendTextToAllPlayers(@"'" + region.Name + "' region created by " + Network.Players[playerNumber].ServerInstance.Name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("RegionCreatedBy"), region.Name, Network.Players[playerNumber].ServerInstance.Name));
}
}

Expand Down Expand Up @@ -973,7 +973,7 @@ private static void ProcessSetSpawnPointRequest(int playerNumber)
Main.spawnTileX = (int)(player.position.X - 8 + player.width / 2) / 16;
Main.spawnTileY = (int)(player.position.Y + player.height) / 16;

Network.SendTextToAllPlayers(string.Format("Spawn Point set to X:{0} Y:{1} by {2}", Main.spawnTileX, Main.spawnTileY, player.name));
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("SpawnPointSetToBy"), Main.spawnTileX, Main.spawnTileY, player.name));
}
}

Expand All @@ -990,11 +990,11 @@ private static void ProcessToggleGravestonesRequest(int playerNumber)
Network.GravestonesAllowed = !Network.GravestonesAllowed;
if (Network.GravestonesAllowed)
{
Network.SendTextToAllPlayers("Gravestones were enabled by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("GravestonesEnabledBy"), Main.player[playerNumber].name));
}
else
{
Network.SendTextToAllPlayers("Gravestones were disabled by " + Main.player[playerNumber].name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("GravestonesDisabledBy"), Main.player[playerNumber].name));
}
GravestonesToggled();
}
Expand Down Expand Up @@ -1096,18 +1096,19 @@ private static void ProcessTileModificationCheckRequest(ref BinaryReader reader,
}
if (user != null)
{
Network.SendTextToPlayer("Tile last modified by " + user.Username, playerNumber);
Network.SendTextToPlayer(string.Format(HEROsMod.HeroText("TileLastModifiedBy"), user.Username), playerNumber);
}
}
else
{
Network.SendTextToPlayer("This tile has not been modified since last server boot up.", playerNumber);
// TODO: These should all be NetworkText.FromKey so they show up in correct language on Client
Network.SendTextToPlayer(HEROsMod.HeroText("TileNotModified"), playerNumber);
}
}
}
else
{
Network.SendTextToPlayer("You don't have permission to do that.", playerNumber);
Network.SendTextToPlayer(HEROsMod.HeroText("YouDontHavePermissionToDoThat"), playerNumber);
}
}

Expand Down Expand Up @@ -1173,7 +1174,7 @@ private static void ProcessStopEventsRequest(int playerNumber)
if (Network.Players[playerNumber].Group.HasPermission("StartEvents"))
{
HEROsModServices.InvasionService.StopAllEvents();
Network.SendTextToAllPlayers("All events have been stopped by " + Network.Players[playerNumber].GameInstance.name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("EventsStoppedBy"), Network.Players[playerNumber].GameInstance.name));
}
}

Expand All @@ -1190,11 +1191,11 @@ private static void ProcessToggleBannedItemsRequest(int playerNumber)
HEROsModServices.ItemBanner.ItemsBanned = !HEROsModServices.ItemBanner.ItemsBanned;
if (HEROsModServices.ItemBanner.ItemsBanned)
{
Network.SendTextToAllPlayers("Destructive Explosives banned by " + Network.Players[playerNumber].ServerInstance.Name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("DestructiveExplosivesBannedBy"), Main.player[playerNumber].name));
}
else
{
Network.SendTextToAllPlayers("Destructive Explosives unbanned by " + Network.Players[playerNumber].ServerInstance.Name);
Network.SendTextToAllPlayers(string.Format(HEROsMod.HeroText("DestructiveExplosivesUnbannedBy"), Main.player[playerNumber].name));
}
BannedItemsToggled();
}
Expand Down
Loading

0 comments on commit fa25ca4

Please sign in to comment.