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 _logger; private readonly ILocalizationService _localizationService; public CsvLocalizationService(ILocalizationService localizationService, ILogger logger) { _localizationService = localizationService; _logger = logger; _localizationService.OnLanguageChangeAsync += OnLanguageChangeAsync; } public static Dictionary> ParseCsvToDictionary(string csvData) { var dict = new Dictionary>(); 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? 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(); 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(); _localizationService.LocalizedStrings.Add(lang,currentDictionary); } foreach (var (key, value) in dictionary) { currentDictionary.Set(key, value); } } } } }