This commit is contained in:
zznty
2023-11-20 13:56:59 +07:00
parent 7b80b5bfec
commit 5e4bef5b01
42 changed files with 1863 additions and 64 deletions

View File

@@ -0,0 +1,62 @@
using System.IO;
using Microsoft.Extensions.Configuration;
using SmartFormat;
using SmartFormat.Core.Settings;
using Torch.API.Managers;
using Torch.Managers;
namespace Maintenance.Managers;
public class LanguageManager(string storagePath) : IManager
{
private readonly string[] _langs = { "en" };
public IConfiguration Language => _configurationRoot ?? throw new InvalidOperationException("Manager is not attached");
private IConfigurationRoot? _configurationRoot;
[Manager.Dependency]
private readonly ConfigManager _configManager = null!;
public SmartFormatter Formatter { get; } = Smart.CreateDefaultSmartFormat(new()
{
CaseSensitivity = CaseSensitivityType.CaseInsensitive
});
public string this[string key] => Language[key] ?? throw new KeyNotFoundException(key);
public void Attach()
{
var langDirectory = Path.Combine(storagePath, "translations");
if (!Directory.Exists(langDirectory))
Directory.CreateDirectory(langDirectory);
foreach (var lang in _langs)
{
var path = Path.Combine(langDirectory, $"{lang}.yml");
if (!File.Exists(path))
ExtractTranslation(path);
}
_configurationRoot = new ConfigurationBuilder()
.AddYamlFile(Path.Combine(langDirectory, $"{_configManager.Configuration.GetValue<string>(ConfigKeys.Language)!}.yml"), false, true)
.Build();
}
public string Format(string key, object obj) => Formatter.Format(this[key], obj);
private void ExtractTranslation(string path)
{
var lang = path[storagePath.Length..].TrimStart(Path.GetInvalidFileNameChars()).Replace('\\', '.');
using var stream = typeof(LanguageManager).Assembly.GetManifestResourceStream(lang)!;
using var file = File.Create(path);
stream.CopyTo(file);
}
public void Detach()
{
}
}