LANCommander/LANCommander.Launcher/UI/Components/InstallDialog.razor
Pat Hartl 5a32bbf890 Add localization support to launcher
Adds localization across the launcher and includes English, German, Spanish, French, Italian, Japanese, Korean, Dutch, Portuguese, Ukranian, and Chinese. These localizations were generated by Claude 3.5 and need to be reviewed by a human for accuracy.
2025-08-18 21:29:38 -05:00

151 lines
No EOL
4.8 KiB
Text

@using LANCommander.Launcher.Data.Models
@using LANCommander.Launcher.Models
@using LANCommander.SDK.Extensions
@inherits FeedbackComponent<Models.ListItem, string>
@inject InstallService InstallService
@inject SDK.Client Client
@inject LocalizationService LocalizationService
<div style="padding: 16px;">
<Row Gutter="16">
<Col Span="12">
<Statistic Title="@LocalizationService.GetString("DownloadSize")" Value="@ByteSizeLib.ByteSize.FromBytes(GetDownloadSize()).ToString()" Style="text-align: center;"/>
</Col>
<Col Span="12">
<Statistic Title="@LocalizationService.GetString("SpaceRequired")" Value="@ByteSizeLib.ByteSize.FromBytes(GetSpaceRequired()).ToString()" Style="text-align: center;"/>
</Col>
</Row>
@if (Addons.Any())
{
<Divider Text="@LocalizationService.GetString("Addons")" />
<CheckboxButtonGroup @bind-Selected="SelectedAddons" DataSource="Addons" KeySelector="a => a.Id" LabelSelector="a => a.Title" Direction="SpaceDirection.Vertical" />
}
@if (Settings.Games.InstallDirectories.Length > 1)
{
<Divider Text="@LocalizationService.GetString("InstallLocation")" />
<RadioGroup @bind-Value="SelectedDirectory" ButtonStyle="RadioButtonStyle.Solid" Size="InputSize.Large" Class="install-dialog-directory-selector radio-group-vertical radio-group-block">
@foreach (var directory in Settings.Games.InstallDirectories)
{
<Radio RadioButton Value="@directory">
<GridRow>
<GridCol Flex="@("auto")">
@directory
</GridCol>
<GridCol>
<ByteSize Value="GetFreeSpace(directory)" />
</GridCol>
</GridRow>
</Radio>
}
</RadioGroup>
}
</div>
<Flex Gap="FlexGap.Middle" Style="padding: 16px; padding-top: 0px" Justify="FlexJustify.FlexEnd">
@if (GetOperation() != "None")
{
<Button Type="ButtonType.Primary" OnClick="Install">@LocalizationService.GetString(GetOperation())</Button>
}
<Button OnClick="() => Close()">@LocalizationService.GetString("Close")</Button>
</Flex>
@code {
Settings Settings = SettingService.GetSettings();
string SelectedDirectory = "";
SDK.Models.Game RemoteGame;
Data.Models.Game Game;
List<SDK.Models.Game> Addons = new();
IEnumerable<SDK.Models.Game> SelectedAddons = new List<SDK.Models.Game>();
protected override async Task OnInitializedAsync()
{
Game = Options.DataItem as Game;
if (Game.Installed)
SelectedDirectory = Settings.Games.InstallDirectories.FirstOrDefault(d => Game.InstallDirectory.StartsWith(d));
if (String.IsNullOrWhiteSpace(SelectedDirectory))
SelectedDirectory = Settings.Games.InstallDirectories.First();
RemoteGame = await Client.Games.GetAsync(Options.Key);
Addons = (await Client.Games.GetAddonsAsync(Options.Key)).OrderByTitle(g => g.SortTitle ?? g.Title).ToList();
var localAddons = Game?.DependentGames.Where(g => g.Installed).Select(addon => addon.Id).ToArray() ?? [];
SelectedAddons = Addons?.Where(addon => localAddons.Contains(addon.Id)).ToList() ?? [];
}
async Task Close()
{
await CloseFeedbackAsync();
}
async Task Install()
{
var game = Options.DataItem as Game;
InstallService.Add(game, SelectedDirectory, SelectedAddons.ToArray());
await CloseFeedbackAsync();
}
string GetOperation()
{
if (!Game.Installed)
return "Install";
if (Game.DependentGames.Any(g => g.Installed ^ SelectedAddons.Any(a => a.Id == g.Id)))
return "Modify";
if (!Game.InstallDirectory.StartsWith(SelectedDirectory))
return "Move";
return string.Empty;
}
long GetDownloadSize()
{
long size = 0;
if (RemoteGame != null && RemoteGame.Archives.Any())
{
size += RemoteGame.Archives.OrderByDescending(a => a.CreatedOn).First().CompressedSize;
size += SelectedAddons.Sum(a => a.Archives.OrderByDescending(arc => arc.CreatedOn).First().CompressedSize);
}
return size;
}
long GetSpaceRequired()
{
long size = 0;
if (RemoteGame != null && RemoteGame.Archives.Any())
{
size += RemoteGame.Archives.OrderByDescending(a => a.CreatedOn).First().UncompressedSize;
size += SelectedAddons.Sum(a => a.Archives.OrderByDescending(arc => arc.CreatedOn).First().UncompressedSize);
}
return size;
}
long GetFreeSpace(string path)
{
var root = Path.GetPathRoot(path);
var drive = new DriveInfo(path);
return drive.AvailableFreeSpace;
}
}