geekbot/Geekbot.net/Lib/Localization/TranslationHandler.cs

180 lines
7.1 KiB
C#
Raw Normal View History

2017-11-15 01:08:20 +01:00
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
2017-11-16 00:51:36 +01:00
using Discord.Commands;
2017-11-15 01:08:20 +01:00
using Discord.WebSocket;
using Geekbot.net.Database;
using Geekbot.net.Database.Models;
using Geekbot.net.Lib.Extensions;
using Geekbot.net.Lib.Logger;
2018-04-30 23:44:19 +02:00
using Utf8Json;
2017-11-15 01:08:20 +01:00
namespace Geekbot.net.Lib.Localization
2017-11-15 01:08:20 +01:00
{
public class TranslationHandler : ITranslationHandler
{
private readonly DatabaseContext _database;
private readonly IGeekbotLogger _logger;
private readonly Dictionary<ulong, string> _serverLanguages;
2017-11-15 01:08:20 +01:00
private Dictionary<string, Dictionary<string, Dictionary<string, string>>> _translations;
2017-11-16 00:51:36 +01:00
private List<string> _supportedLanguages;
2017-11-15 01:08:20 +01:00
public TranslationHandler(DatabaseContext database, IGeekbotLogger logger)
2017-11-15 01:08:20 +01:00
{
_database = database;
2017-11-15 01:08:20 +01:00
_logger = logger;
_logger.Information(LogSource.Geekbot, "Loading Translations");
2017-11-15 01:08:20 +01:00
LoadTranslations();
_serverLanguages = new Dictionary<ulong, string>();
2017-11-15 01:08:20 +01:00
}
private void LoadTranslations()
{
try
{
var translationFile = File.ReadAllText(Path.GetFullPath("./Lib/Localization/Translations.json"));
2018-04-30 23:44:19 +02:00
var rawTranslations = JsonSerializer.Deserialize<Dictionary<string, Dictionary<string, Dictionary<string, string>>>>(translationFile);
2017-11-16 00:51:36 +01:00
var sortedPerLanguage = new Dictionary<string, Dictionary<string, Dictionary<string, string>>>();
foreach (var command in rawTranslations)
{
foreach (var str in command.Value)
{
foreach (var lang in str.Value)
{
if (!sortedPerLanguage.ContainsKey(lang.Key))
{
var commandDict = new Dictionary<string, Dictionary<string, string>>();
var strDict = new Dictionary<string, string>();
strDict.Add(str.Key, lang.Value);
commandDict.Add(command.Key, strDict);
sortedPerLanguage.Add(lang.Key, commandDict);
}
if (!sortedPerLanguage[lang.Key].ContainsKey(command.Key))
{
var strDict = new Dictionary<string, string>();
strDict.Add(str.Key, lang.Value);
sortedPerLanguage[lang.Key].Add(command.Key, strDict);
}
if (!sortedPerLanguage[lang.Key][command.Key].ContainsKey(str.Key))
{
sortedPerLanguage[lang.Key][command.Key].Add(str.Key, lang.Value);
}
}
}
}
_translations = sortedPerLanguage;
2017-11-15 01:08:20 +01:00
_supportedLanguages = new List<string>();
2017-11-16 00:51:36 +01:00
foreach (var lang in sortedPerLanguage)
2017-11-15 01:08:20 +01:00
{
_supportedLanguages.Add(lang.Key);
}
}
catch (Exception e)
{
_logger.Error(LogSource.Geekbot, "Failed to load Translations", e);
2018-05-06 02:00:45 +02:00
Environment.Exit(GeekbotExitCode.TranslationsFailed.GetHashCode());
2017-11-15 01:08:20 +01:00
}
}
2017-11-16 00:51:36 +01:00
private string GetServerLanguage(ulong guildId)
2017-11-15 01:08:20 +01:00
{
try
2017-11-15 01:08:20 +01:00
{
string lang;
try
2017-11-15 01:08:20 +01:00
{
lang = _serverLanguages[guildId];
if (!string.IsNullOrEmpty(lang))
{
return lang;
}
throw new Exception();
2017-11-15 01:08:20 +01:00
}
catch
2017-11-15 01:08:20 +01:00
{
lang = GetGuild(guildId).Language ?? "EN";
_serverLanguages[guildId] = lang;
return lang;
2017-11-15 01:08:20 +01:00
}
}
catch (Exception e)
{
_logger.Error(LogSource.Geekbot, "Could not get guild langage", e);
return "EN";
}
2017-11-15 01:08:20 +01:00
}
public string GetString(ulong guildId, string command, string stringName)
{
var translation = _translations[GetServerLanguage(guildId)][command][stringName];
2017-11-15 01:08:20 +01:00
if (!string.IsNullOrWhiteSpace(translation)) return translation;
translation = _translations[command][stringName]["EN"];
if (string.IsNullOrWhiteSpace(translation))
{
_logger.Warning(LogSource.Geekbot, $"No translation found for {command} - {stringName}");
2017-11-15 01:08:20 +01:00
}
return translation;
}
2017-11-16 00:51:36 +01:00
public Dictionary<string, string> GetDict(ICommandContext context)
{
try
{
var command = context.Message.Content.Split(' ').First().TrimStart('!').ToLower();
return _translations[GetServerLanguage(context.Guild.Id)][command];
2017-11-16 00:51:36 +01:00
}
catch (Exception e)
{
2018-05-06 02:00:45 +02:00
_logger.Error(LogSource.Geekbot, "No translations for command found", e);
return new Dictionary<string, string>();
2017-11-16 00:51:36 +01:00
}
}
public Dictionary<string, string> GetDict(ICommandContext context, string command)
{
try
{
return _translations[GetServerLanguage(context.Guild.Id)][command];
}
catch (Exception e)
{
2018-05-06 02:00:45 +02:00
_logger.Error(LogSource.Geekbot, "No translations for command found", e);
return new Dictionary<string, string>();
}
}
2017-11-16 00:51:36 +01:00
2017-11-15 01:08:20 +01:00
public bool SetLanguage(ulong guildId, string language)
{
try
{
if (!_supportedLanguages.Contains(language)) return false;
var guild = GetGuild(guildId);
guild.Language = language;
_database.GuildSettings.Update(guild);
2017-11-15 01:08:20 +01:00
_serverLanguages[guildId] = language;
return true;
}
catch (Exception e)
{
_logger.Error(LogSource.Geekbot, "Error while changing language", e);
2017-11-15 01:08:20 +01:00
return false;
}
}
public List<string> SupportedLanguages => _supportedLanguages;
private GuildSettingsModel GetGuild(ulong guildId)
{
var guild = _database.GuildSettings.FirstOrDefault(g => g.GuildId.Equals(guildId.AsLong()));
if (guild != null) return guild;
_database.GuildSettings.Add(new GuildSettingsModel
{
GuildId = guildId.AsLong()
});
_database.SaveChanges();
return _database.GuildSettings.FirstOrDefault(g => g.GuildId.Equals(guildId.AsLong()));
}
2017-11-15 01:08:20 +01:00
}
}