using Atomx.Utils.Json;
using Hangfire;
using Microsoft.Extensions.Logging;
using System.Text.Json;
namespace Atomx.Core.Jos
{
///
/// 多语言本地化任务
///
public class LocalizationJob
{
readonly ILogger _logger;
public LocalizationJob(ILogger logger)
{
_logger = logger;
}
///
/// 如果任务失败,重试 3 次,超过后删除任务,60 秒内不允许并发执行
///
[AutomaticRetry(Attempts = 3, OnAttemptsExceeded = AttemptsExceededAction.Delete)]
[DisableConcurrentExecution(60)]
public async Task ExecuteAsync(string path, string culture, string data)
{
try
{
var translations = data.FromJson>();
var fileName = $"{culture}.json";
var filePath = Path.Combine(path, fileName);
if (!Directory.Exists(filePath))
{
Directory.CreateDirectory(filePath);
_logger.LogInformation("Created Resources directory: {Path}", filePath);
}
var json = await File.ReadAllTextAsync(filePath);
var fileData = JsonSerializer.Deserialize>(json, new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase
});
if (fileData == null)
{
fileData = new Dictionary();
}
foreach (var item in translations)
{
if (fileData.ContainsKey(item.Key))
{
fileData[item.Key] = item.Value;
}
else
{
fileData.Add(item.Key, item.Value);
}
}
var options = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
WriteIndented = true
};
json = JsonSerializer.Serialize(fileData, options);
await File.WriteAllTextAsync(filePath, json);
_logger.LogInformation("Saved localization file for culture: {Culture} with {Count} translations",
culture, translations.Count);
}
catch(Exception ex) {
_logger.LogError(ex, "Error saving localization file for culture: {Culture}", culture);
}
}
}
}