93 lines
3.2 KiB
C#
93 lines
3.2 KiB
C#
using System;
|
|
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" 列
|
|
{
|
|
var header = headers[i];
|
|
if (dict.ContainsKey(header) is false)
|
|
{
|
|
dict.Add(header, 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++)
|
|
{
|
|
if(i>headers.Length-1)continue;
|
|
var header = headers[i];
|
|
if (dict.TryGetValue(header, out var d) is false)
|
|
{
|
|
d = new Dictionary<string, string>();
|
|
dict.Add(header,d);
|
|
}
|
|
d.Set(key,columns[i]);
|
|
//dict[headers[i]][key] = columns[i]; // 填充语言数据
|
|
}
|
|
}
|
|
|
|
return dict;
|
|
}
|
|
|
|
private async UniTask OnLanguageChangeAsync(string arg1, string arg2)
|
|
{
|
|
var csv = await new HttpClient().GetStringAsync(Url+$"?{DateTime.Now.Ticks}");
|
|
|
|
_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);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
}
|