80 lines
2.6 KiB
C#
80 lines
2.6 KiB
C#
|
using System.Collections;
|
||
|
using System.Collections.Generic;
|
||
|
using System.IO;
|
||
|
using System.Net.Http;
|
||
|
using BITKit;
|
||
|
using Cysharp.Threading.Tasks;
|
||
|
using Microsoft.Extensions.Logging;
|
||
|
|
||
|
namespace Net.BITKit.Localization
|
||
|
{
|
||
|
public class CsvLocalizationService
|
||
|
{
|
||
|
public string Url { get; set; } =
|
||
|
@"http://server.bitfall.icu:21982/com.project.b/net.project.b.localization.csv";
|
||
|
|
||
|
private readonly ILogger<CsvLocalizationService> _logger;
|
||
|
private readonly ILocalizationService _localizationService;
|
||
|
|
||
|
public CsvLocalizationService(ILocalizationService localizationService, ILogger<CsvLocalizationService> logger)
|
||
|
{
|
||
|
_localizationService = localizationService;
|
||
|
_logger = logger;
|
||
|
|
||
|
_localizationService.OnLanguageChangeAsync += OnLanguageChangeAsync;
|
||
|
}
|
||
|
|
||
|
public static Dictionary<string, Dictionary<string, string>> ParseCsvToDictionary(string csvData)
|
||
|
{
|
||
|
var dict = new Dictionary<string, Dictionary<string, string>>();
|
||
|
using var reader = new StringReader(csvData);
|
||
|
|
||
|
var headerLine = reader.ReadLine();
|
||
|
if (headerLine == null) return dict;
|
||
|
|
||
|
var headers = headerLine.Split(',');
|
||
|
|
||
|
for (var i = 1; i < headers.Length; i++) // 跳过 "Key" 列
|
||
|
{
|
||
|
dict[headers[i]] = new Dictionary<string, string>();
|
||
|
}
|
||
|
|
||
|
string? line;
|
||
|
while ((line = reader.ReadLine()) != null)
|
||
|
{
|
||
|
var columns = line.Split(',');
|
||
|
if (columns.Length < 2) continue;
|
||
|
|
||
|
var key = columns[0]; // 取 Key 值
|
||
|
for (var i = 1; i < columns.Length; i++)
|
||
|
{
|
||
|
dict[headers[i]][key] = columns[i]; // 填充语言数据
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return dict;
|
||
|
}
|
||
|
|
||
|
private async UniTask OnLanguageChangeAsync(string arg1, string arg2)
|
||
|
{
|
||
|
var csv = await new HttpClient().GetStringAsync(Url);
|
||
|
|
||
|
_logger.LogInformation($"下载完成:\n{csv}");
|
||
|
|
||
|
foreach (var (lang, dictionary) in ParseCsvToDictionary(csv))
|
||
|
{
|
||
|
if (_localizationService.LocalizedStrings.TryGetValue(lang, out var currentDictionary) is false)
|
||
|
{
|
||
|
currentDictionary = new Dictionary<string, string>();
|
||
|
_localizationService.LocalizedStrings.Add(lang,currentDictionary);
|
||
|
}
|
||
|
foreach (var (key, value) in dictionary)
|
||
|
{
|
||
|
currentDictionary.Set(key, value);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
}
|