using System.Diagnostics;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using XFEEDToolBox.Core.Plugins;
namespace XFEEDToolBox.ViewModels;
public partial class ToolboxViewModel
{
private readonly ChineseTranslationManager chinese=new();
[ObservableProperty] public partial string TranslationGameExecutable { get; set; } = "";
[ObservableProperty] public partial string TranslationSourceDirectory { get; set; } = "";
[ObservableProperty] public partial string TranslationStatusText { get; set; } = "检测本机简体中文组件。";
[ObservableProperty] public partial bool TranslationBusy { get; set; }
private string TranslationResourceStore=>Path.Combine(runtime.DataDirectory,"translation-resources");
private void InitializeTranslationSettings()
{
TranslationGameExecutable=runtime.Settings.TranslationGameExecutable.Length>0?runtime.Settings.TranslationGameExecutable:PluginGameExecutable;
TranslationSourceDirectory=runtime.Settings.TranslationSourceDirectory;
var imported=Path.Combine(TranslationResourceStore,TranslationBundle.Reference.GameSha256);
if(Directory.Exists(imported))TranslationSourceDirectory=imported;
if(TranslationSourceDirectory.Length==0 && TranslationGameExecutable.Length>0 && File.Exists(Path.Combine(Path.GetDirectoryName(TranslationGameExecutable)!,"edchs.pkg")))TranslationSourceDirectory=Path.GetDirectoryName(TranslationGameExecutable)!;
}
private bool TranslationGameRunning()
{
var games=Process.GetProcessesByName("EliteDangerous64");
try{return games.Any(p=>string.Equals(p.MainModule?.FileName,TranslationGameExecutable,StringComparison.OrdinalIgnoreCase));}
finally{foreach(var game in games)game.Dispose();}
}
[RelayCommand] private async Task ReadTranslationAsync(CancellationToken cancellationToken=default)
{
using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
try{TranslationStatusText=TranslationGameExecutable.Length==0?"请选择游戏主程序。":(await chinese.InspectAsync(TranslationGameExecutable,token)).Message;}
catch(OperationCanceledException){TranslationStatusText="状态检查已取消。";}
catch(Exception e){TranslationStatusText=e.Message;}
}
[RelayCommand] private async Task InstallTranslationAsync(CancellationToken cancellationToken=default)
{
using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
if(TranslationBusy)return;TranslationBusy=true;
try
{
if(TranslationGameRunning())throw new InvalidOperationException("请在游戏退出后安装汉化。当前游戏不会被关闭。");
TranslationSourceDirectory=await chinese.ImportBundleAsync(TranslationSourceDirectory,TranslationResourceStore,token);
TranslationStatusText=(await chinese.InstallAsync(TranslationGameExecutable,TranslationSourceDirectory,token)).Message;
await runtime.SaveSettingsAsync(runtime.Settings with{TranslationGameExecutable=TranslationGameExecutable,TranslationSourceDirectory=TranslationSourceDirectory});runtime.Log("汉化",TranslationStatusText);
}
catch(OperationCanceledException){TranslationStatusText="汉化安装已取消;已完成的步骤保留。";}
catch(Exception e){TranslationStatusText=e.Message;}finally{TranslationBusy=false;}
}
[RelayCommand] private async Task UninstallTranslationAsync(CancellationToken cancellationToken=default)
{
using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
if(TranslationBusy)return;TranslationBusy=true;
try
{
if(TranslationGameRunning())throw new InvalidOperationException("请在游戏退出后还原汉化。当前游戏不会被关闭。");
TranslationStatusText=(await chinese.UninstallAsync(TranslationGameExecutable,token)).Message;runtime.Log("汉化",TranslationStatusText);
}
catch(OperationCanceledException){TranslationStatusText="汉化还原已取消;已完成的步骤保留。";}
catch(Exception e){TranslationStatusText=e.Message;}finally{TranslationBusy=false;}
}
[RelayCommand] private async Task ChooseTranslationGameAsync()
{
var picker=new Windows.Storage.Pickers.FileOpenPicker();picker.FileTypeFilter.Add(".exe");InitializePicker(picker);
if(await picker.PickSingleFileAsync() is {} file){TranslationGameExecutable=file.Path;await ReadTranslationAsync();}
}
[RelayCommand] private async Task ChooseTranslationSourceAsync()
{
var picker=new Windows.Storage.Pickers.FolderPicker();picker.FileTypeFilter.Add("*");InitializePicker(picker);
if(await picker.PickSingleFolderAsync() is {} folder)
{
TranslationBusy=true;
try
{
TranslationSourceDirectory=await chinese.ImportBundleAsync(folder.Path,TranslationResourceStore,lifetime.Token);
await runtime.SaveSettingsAsync(runtime.Settings with{TranslationSourceDirectory=TranslationSourceDirectory});
TranslationStatusText="简体中文资源已导入本机资源库,可以独立安装。";
}
catch(Exception e){TranslationStatusText=e.Message;}
finally{TranslationBusy=false;}
}
}
}
using System.Diagnostics;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using XFEEDToolBox.Core.Plugins;
namespace XFEEDToolBox.ViewModels;
public partial class ToolboxViewModel
{
private readonly ChineseTranslationManager chinese=new();
[ObservableProperty] public partial string TranslationGameExecutable { get; set; } = "";
[ObservableProperty] public partial string TranslationSourceDirectory { get; set; } = "";
[ObservableProperty] public partial string TranslationStatusText { get; set; } = "检测本机简体中文组件。";
[ObservableProperty] public partial bool TranslationBusy { get; set; }
private string TranslationResourceStore=>Path.Combine(runtime.DataDirectory,"translation-resources");
private void InitializeTranslationSettings()
{
TranslationGameExecutable=runtime.Settings.TranslationGameExecutable.Length>0?runtime.Settings.TranslationGameExecutable:PluginGameExecutable;
TranslationSourceDirectory=runtime.Settings.TranslationSourceDirectory;
var imported=Path.Combine(TranslationResourceStore,TranslationBundle.Reference.GameSha256);
if(Directory.Exists(imported))TranslationSourceDirectory=imported;
if(TranslationSourceDirectory.Length==0 && TranslationGameExecutable.Length>0 && File.Exists(Path.Combine(Path.GetDirectoryName(TranslationGameExecutable)!,"edchs.pkg")))TranslationSourceDirectory=Path.GetDirectoryName(TranslationGameExecutable)!;
}
private bool TranslationGameRunning()
{
var games=Process.GetProcessesByName("EliteDangerous64");
try{return games.Any(p=>string.Equals(p.MainModule?.FileName,TranslationGameExecutable,StringComparison.OrdinalIgnoreCase));}
finally{foreach(var game in games)game.Dispose();}
}
[RelayCommand] private async Task ReadTranslationAsync(CancellationToken cancellationToken=default)
{
using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
try{TranslationStatusText=TranslationGameExecutable.Length==0?"请选择游戏主程序。":(await chinese.InspectAsync(TranslationGameExecutable,token)).Message;}
catch(OperationCanceledException){TranslationStatusText="状态检查已取消。";}
catch(Exception e){TranslationStatusText=e.Message;}
}
[RelayCommand] private async Task InstallTranslationAsync(CancellationToken cancellationToken=default)
{
using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
if(TranslationBusy)return;TranslationBusy=true;
try
{
if(TranslationGameRunning())throw new InvalidOperationException("请在游戏退出后安装汉化。当前游戏不会被关闭。");
TranslationSourceDirectory=await chinese.ImportBundleAsync(TranslationSourceDirectory,TranslationResourceStore,token);
TranslationStatusText=(await chinese.InstallAsync(TranslationGameExecutable,TranslationSourceDirectory,token)).Message;
await runtime.SaveSettingsAsync(runtime.Settings with{TranslationGameExecutable=TranslationGameExecutable,TranslationSourceDirectory=TranslationSourceDirectory});runtime.Log("汉化",TranslationStatusText);
}
catch(OperationCanceledException){TranslationStatusText="汉化安装已取消;已完成的步骤保留。";}
catch(Exception e){TranslationStatusText=e.Message;}finally{TranslationBusy=false;}
}
[RelayCommand] private async Task UninstallTranslationAsync(CancellationToken cancellationToken=default)
{
using var stop=CancellationTokenSource.CreateLinkedTokenSource(lifetime.Token,cancellationToken);var token=stop.Token;
if(TranslationBusy)return;TranslationBusy=true;
try
{
if(TranslationGameRunning())throw new InvalidOperationException("请在游戏退出后还原汉化。当前游戏不会被关闭。");
TranslationStatusText=(await chinese.UninstallAsync(TranslationGameExecutable,token)).Message;runtime.Log("汉化",TranslationStatusText);
}
catch(OperationCanceledException){TranslationStatusText="汉化还原已取消;已完成的步骤保留。";}
catch(Exception e){TranslationStatusText=e.Message;}finally{TranslationBusy=false;}
}
[RelayCommand] private async Task ChooseTranslationGameAsync()
{
var picker=new Windows.Storage.Pickers.FileOpenPicker();picker.FileTypeFilter.Add(".exe");InitializePicker(picker);
if(await picker.PickSingleFileAsync() is {} file){TranslationGameExecutable=file.Path;await ReadTranslationAsync();}
}
[RelayCommand] private async Task ChooseTranslationSourceAsync()
{
var picker=new Windows.Storage.Pickers.FolderPicker();picker.FileTypeFilter.Add("*");InitializePicker(picker);
if(await picker.PickSingleFolderAsync() is {} folder)
{
TranslationBusy=true;
try
{
TranslationSourceDirectory=await chinese.ImportBundleAsync(folder.Path,TranslationResourceStore,lifetime.Token);
await runtime.SaveSettingsAsync(runtime.Settings with{TranslationSourceDirectory=TranslationSourceDirectory});
TranslationStatusText="简体中文资源已导入本机资源库,可以独立安装。";
}
catch(Exception e){TranslationStatusText=e.Message;}
finally{TranslationBusy=false;}
}
}
}