UI: Reorganize Game Info dialog popup + localization

This commit is contained in:
Evan Husted 2025-02-04 23:28:37 -06:00
parent bd08a111a8
commit 717851985e
4 changed files with 317 additions and 234 deletions

View file

@ -1525,151 +1525,151 @@
{
"ID": "GameListHeaderDeveloper",
"Translations": {
"ar_SA": "المطور",
"de_DE": "Entwickler",
"el_GR": "Προγραμματιστής",
"en_US": "Developer",
"es_ES": "Desarrollador",
"fr_FR": "Développeur",
"he_IL": "מפתח",
"it_IT": "Sviluppatore",
"ja_JP": "開発元",
"ko_KR": "개발자",
"no_NO": "Utvikler",
"pl_PL": "Twórca",
"pt_BR": "Desenvolvedor",
"ru_RU": "Разработчик",
"sv_SE": "Utvecklare",
"th_TH": "ผู้พัฒนา",
"tr_TR": "Geliştirici",
"uk_UA": "Розробник",
"zh_CN": "制作商",
"zh_TW": "開發者"
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Developed by {0}",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "GameListHeaderVersion",
"Translations": {
"ar_SA": "الإصدار",
"ar_SA": "",
"de_DE": "",
"el_GR": "Έκδοση",
"en_US": "Version",
"es_ES": "Versión",
"el_GR": "Έκδοση: {0}",
"en_US": "Version: {0}",
"es_ES": "Versión: {0}",
"fr_FR": "",
"he_IL": "גרסה",
"it_IT": "Versione",
"ja_JP": "バージョン",
"ko_KR": "버전",
"no_NO": "Versjon",
"pl_PL": "Wersja",
"pt_BR": "Versão",
"ru_RU": "Версия",
"he_IL": "",
"it_IT": "Versione: {0}",
"ja_JP": "バージョン: {0}",
"ko_KR": "버전: {0}",
"no_NO": "Versjon: {0}",
"pl_PL": "Wersja: {0}",
"pt_BR": "Versão: {0}",
"ru_RU": "Версия: {0}",
"sv_SE": "",
"th_TH": "เวอร์ชั่น",
"tr_TR": "Sürüm",
"uk_UA": "Версія",
"zh_CN": "版本",
"zh_TW": "版本"
"th_TH": "เวอร์ชั่น: {0}",
"tr_TR": "Sürüm: {0}",
"uk_UA": "Версія: {0}",
"zh_CN": "版本: {0}",
"zh_TW": "版本: {0}"
}
},
{
"ID": "GameListHeaderTimePlayed",
"Translations": {
"ar_SA": "وقت اللعب",
"de_DE": "Spielzeit",
"el_GR": "Χρόνος",
"en_US": "Play Time",
"es_ES": "Tiempo jugado",
"fr_FR": "Temps de jeu",
"he_IL": "זמן משחק",
"it_IT": "Tempo di gioco",
"ja_JP": "プレイ時間",
"ko_KR": "플레이 타임",
"no_NO": "Spilletid",
"pl_PL": "Czas w grze:",
"pt_BR": "Tempo de jogo",
"ru_RU": "Время в игре",
"sv_SE": "Speltid",
"th_TH": "เล่นไปแล้ว",
"tr_TR": "Oynama Süresi",
"uk_UA": "Зіграно часу",
"zh_CN": "游玩时长",
"zh_TW": "遊玩時數"
"ar_SA": "",
"de_DE": "Spielzeit: {0}",
"el_GR": "Χρόνος: {0}",
"en_US": "Play Time: {0}",
"es_ES": "Tiempo jugado: {0}",
"fr_FR": "Temps de jeu: {0}",
"he_IL": "",
"it_IT": "Tempo di gioco: {0}",
"ja_JP": "プレイ時間: {0}",
"ko_KR": "플레이 타임: {0}",
"no_NO": "Spilletid: {0}",
"pl_PL": "Czas w grze: {0}",
"pt_BR": "Tempo de jogo: {0}",
"ru_RU": "Время в игре: {0}",
"sv_SE": "Speltid: {0}",
"th_TH": "เล่นไปแล้ว: {0}",
"tr_TR": "Oynama Süresi: {0}",
"uk_UA": "Зіграно часу: {0}",
"zh_CN": "游玩时长: {0}",
"zh_TW": "遊玩時數: {0}"
}
},
{
"ID": "GameListHeaderLastPlayed",
"Translations": {
"ar_SA": "آخر مرة لُعبت",
"de_DE": "Zuletzt gespielt",
"el_GR": "Παίχτηκε",
"en_US": "Last Played",
"es_ES": "Jugado por última vez",
"fr_FR": "Dernière partie jouée",
"he_IL": "שוחק לאחרונה",
"it_IT": "Ultima partita",
"ja_JP": "最終プレイ日時",
"ko_KR": "마지막 플레이",
"no_NO": "Sist Spilt",
"pl_PL": "Ostatnio grane",
"pt_BR": "Último jogo",
"ru_RU": "Последний запуск",
"sv_SE": "Senast spelad",
"th_TH": "เล่นล่าสุด",
"tr_TR": "Son Oynama Tarihi",
"uk_UA": "Востаннє зіграно",
"zh_CN": "最近游玩",
"zh_TW": "最近遊玩"
"ar_SA": "",
"de_DE": "Zuletzt gespielt: {0}",
"el_GR": "Παίχτηκε: {0}",
"en_US": "Last Played: {0}",
"es_ES": "Jugado por última vez: {0}",
"fr_FR": "Dernière partie jouée: {0}",
"he_IL": "",
"it_IT": "Ultima partita: {0}",
"ja_JP": "最終プレイ日時: {0}",
"ko_KR": "마지막 플레이: {0}",
"no_NO": "Sist Spilt: {0}",
"pl_PL": "Ostatnio grane: {0}",
"pt_BR": "Último jogo: {0}",
"ru_RU": "Последний запуск: {0}",
"sv_SE": "Senast spelad: {0}",
"th_TH": "เล่นล่าสุด: {0}",
"tr_TR": "Son Oynama Tarihi: {0}",
"uk_UA": "Востаннє зіграно: {0}",
"zh_CN": "最近游玩: {0}",
"zh_TW": "最近遊玩: {0}"
}
},
{
"ID": "GameListHeaderFileExtension",
"Translations": {
"ar_SA": "صيغة الملف",
"de_DE": "Dateiformat",
"el_GR": "Κατάληξη",
"en_US": "File Ext",
"es_ES": "Extensión",
"fr_FR": "Extension du Fichier",
"he_IL": "סיומת קובץ",
"it_IT": "Estensione",
"ja_JP": "ファイル拡張子",
"ko_KR": "파일 확장자",
"no_NO": "Fil Eks.",
"pl_PL": "Rozszerzenie pliku",
"pt_BR": "Extensão",
"ru_RU": "Расширение файла",
"sv_SE": "Filänd",
"th_TH": "นามสกุลไฟล์",
"tr_TR": "Dosya Uzantısı",
"uk_UA": "Розширення файлу",
"zh_CN": "扩展名",
"zh_TW": "副檔名"
"ar_SA": "",
"de_DE": "Dateiformat: {0}",
"el_GR": "Κατάληξη: {0}",
"en_US": "Extension: {0}",
"es_ES": "Extensión: {0}",
"fr_FR": "Extension du Fichier: {0}",
"he_IL": "",
"it_IT": "Estensione: {0}",
"ja_JP": "ファイル拡張子: {0}",
"ko_KR": "파일 확장자: {0}",
"no_NO": "Fil Eks.: {0}",
"pl_PL": "Rozszerzenie pliku: {0}",
"pt_BR": "Extensão: {0}",
"ru_RU": "Расширение файла: {0}",
"sv_SE": "Filänd: {0}",
"th_TH": "นามสกุลไฟล์: {0}",
"tr_TR": "Dosya Uzantısı: {0}",
"uk_UA": "Розширення файлу: {0}",
"zh_CN": "扩展名: {0}",
"zh_TW": "副檔名: {0}"
}
},
{
"ID": "GameListHeaderFileSize",
"Translations": {
"ar_SA": "حجم الملف",
"de_DE": "Dateigröße",
"el_GR": "Μέγεθος Αρχείου",
"en_US": "File Size",
"es_ES": "Tamaño del archivo",
"fr_FR": "Taille du Fichier",
"he_IL": "גודל הקובץ",
"it_IT": "Dimensione file",
"ja_JP": "ファイルサイズ",
"ko_KR": "파일 크기",
"no_NO": "Fil Størrelse",
"pl_PL": "Rozmiar pliku",
"pt_BR": "Tamanho",
"ru_RU": "Размер файла",
"sv_SE": "Filstorlek",
"th_TH": "ขนาดไฟล์",
"tr_TR": "Dosya Boyutu",
"uk_UA": "Розмір файлу",
"zh_CN": "大小",
"zh_TW": "檔案大小"
"ar_SA": "",
"de_DE": "Dateigröße: {0}",
"el_GR": "Μέγεθος Αρχείου: {0}",
"en_US": "File Size: {0}",
"es_ES": "Tamaño del archivo: {0}",
"fr_FR": "Taille du Fichier: {0}",
"he_IL": "",
"it_IT": "Dimensione file: {0}",
"ja_JP": "ファイルサイズ: {0}",
"ko_KR": "파일 크기: {0}",
"no_NO": "Fil Størrelse: {0}",
"pl_PL": "Rozmiar pliku: {0}",
"pt_BR": "Tamanho: {0}",
"ru_RU": "Размер файла: {0}",
"sv_SE": "Filstorlek: {0}",
"th_TH": "ขนาดไฟล์: {0}",
"tr_TR": "Dosya Boyutu: {0}",
"uk_UA": "Розмір файлу: {0}",
"zh_CN": "大小: {0}",
"zh_TW": "檔案大小: {0}"
}
},
{
@ -1697,6 +1697,106 @@
"zh_TW": "路徑"
}
},
{
"ID": "GameListHeaderCompatibilityStatus",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Compatibility:",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "GameListHeaderTitleId",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Title ID:",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "GameListHeaderHostedGames",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Hosted Games: {0}",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "GameListHeaderPlayerCount",
"Translations": {
"ar_SA": "",
"de_DE": "",
"el_GR": "",
"en_US": "Online Players: {0}",
"es_ES": "",
"fr_FR": "",
"he_IL": "",
"it_IT": "",
"ja_JP": "",
"ko_KR": "",
"no_NO": "",
"pl_PL": "",
"pt_BR": "",
"ru_RU": "",
"sv_SE": "",
"th_TH": "",
"tr_TR": "",
"uk_UA": "",
"zh_CN": "",
"zh_TW": ""
}
},
{
"ID": "GameListContextMenuOpenUserSaveDirectory",
"Translations": {
@ -23298,4 +23398,4 @@
}
}
]
}
}

View file

@ -2,7 +2,7 @@
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:helpers="clr-namespace:Ryujinx.Ava.UI.Helpers"
xmlns:appLibrary="using:Ryujinx.Ava.Utilities.AppLibrary"
xmlns:ext="using:Ryujinx.Ava.Common.Markup"
xmlns:viewModels="using:Ryujinx.Ava.UI.ViewModels"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
@ -13,112 +13,102 @@
MaxWidth="256"
MinWidth="256"
Source="{Binding AppData.Icon, Converter={x:Static helpers:BitmapArrayValueConverter.Instance}}" />
<Border Margin="5, 0" Width="2" Height="256" BorderBrush="Gray" Background="Gray" />
<Border Margin="5, 0" Width="1" Height="256" BorderBrush="Gray" Background="Gray" />
<StackPanel Orientation="Vertical">
<Grid
RowDefinitions="Auto, Auto, Auto, Auto"
RowDefinitions="Auto,Auto,Auto"
ColumnDefinitions="*">
<TextBlock Grid.Row="0"
HorizontalAlignment="Center"
Padding="0, -2, 0, 5"
Classes="h1"
Text="{Binding AppData.Name}" />
<TextBlock Grid.Row="1"
HorizontalAlignment="Center"
Text="{Binding FormattedVersion}"
TextAlignment="Start"
TextWrapping="Wrap" />
<TextBlock Grid.Row="2"
HorizontalAlignment="Center"
Text="{Binding FormattedDeveloper}"
TextAlignment="Start"
TextWrapping="Wrap" />
<StackPanel Grid.ColumnSpan="2" Grid.Row="3"
HorizontalAlignment="Center"
Orientation="Horizontal" Margin="0 10, 0, 0"
Spacing="5">
<Button
Click="PlayabilityStatus_OnClick"
HorizontalContentAlignment="Left"
VerticalAlignment="Center"
IsVisible="{Binding AppData.HasPlayabilityInfo}"
Background="{DynamicResource AppListBackgroundColor}"
Padding="0">
<TextBlock
Margin="1.5"
Tag="{Binding AppData.IdString}"
Text="{Binding AppData.LocalizedStatus}"
Foreground="{Binding AppData.PlayabilityStatus, Converter={x:Static helpers:PlayabilityStatusConverter.Shared}}"
TextAlignment="Start"
TextWrapping="Wrap" />
<Button.Styles>
<Style Selector="Button">
<Setter Property="MinWidth"
Value="0" />
<!-- avoids very wide buttons from the overall project avalonia style -->
</Style>
</Button.Styles>
</Button>
<Button
Click="IdString_OnClick"
HorizontalContentAlignment="Left"
VerticalAlignment="Center"
Background="{DynamicResource AppListBackgroundColor}"
Padding="0">
<TextBlock
Margin="1.5"
HorizontalAlignment="Stretch"
Text="{Binding AppData.IdString}"
TextAlignment="Start"
TextWrapping="Wrap" />
</Button>
<StackPanel Grid.Row="0">
<TextBlock HorizontalAlignment="Left"
Text="{Binding FormattedVersion}"
TextAlignment="Start"
TextWrapping="Wrap" />
<TextBlock HorizontalAlignment="Left"
Text="{Binding FormattedDeveloper}"
TextAlignment="Start"
TextWrapping="Wrap" />
<TextBlock HorizontalAlignment="Stretch"
Text="{Binding FormattedFileExtension}"
TextAlignment="Start"
TextWrapping="Wrap" />
<TextBlock HorizontalAlignment="Stretch"
Text="{Binding FormattedFileSize}"
TextAlignment="Start"
TextWrapping="Wrap" />
</StackPanel>
</Grid>
<Separator Margin="0, 10, 0, 10" Height="2" BorderBrush="Gray" Background="Gray" />
<Grid ColumnDefinitions="Auto,*,Auto">
<StackPanel Grid.Column="0"
Margin="10,0,0,0"
<Separator Grid.Row="1" Margin="0, 10, 0, 10" Height="1" BorderBrush="Gray" Background="Gray" />
<StackPanel Grid.Row="2"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Orientation="Vertical"
Spacing="5">
<TextBlock
HorizontalAlignment="Stretch"
Text="{Binding FormattedFileExtension}"
TextAlignment="Start"
TextWrapping="Wrap" />
<TextBlock
HorizontalAlignment="Stretch"
IsVisible="{Binding AppData.HasLdnGames}"
Text="{Binding FormattedLdnInfo}"
TextAlignment="Start"
TextWrapping="Wrap" />
</StackPanel>
<StackPanel
Grid.Column="2"
Margin="0,0,10,0"
HorizontalAlignment="Right"
VerticalAlignment="Top"
Orientation="Vertical"
Spacing="5">
<TextBlock
HorizontalAlignment="Stretch"
Text="{Binding FormattedLastPlayed}"
TextAlignment="End"
TextWrapping="Wrap" />
<TextBlock
HorizontalAlignment="Stretch"
Text="{Binding FormattedPlayTime}"
IsVisible="{Binding AppData.HasPlayedPreviously}"
TextAlignment="End"
TextWrapping="Wrap" />
<TextBlock
HorizontalAlignment="Stretch"
Text="{Binding FormattedFileSize}"
TextAlignment="End"
TextWrapping="Wrap" />
<StackPanel Orientation="Horizontal">
<TextBlock Padding="0, 0, 5, 0" Text="{ext:Locale GameListHeaderCompatibilityStatus}" />
<Button
Click="PlayabilityStatus_OnClick"
HorizontalContentAlignment="Left"
VerticalAlignment="Center"
IsVisible="{Binding AppData.HasPlayabilityInfo}"
Background="{DynamicResource AppListBackgroundColor}"
Padding="0">
<TextBlock
Margin="1.5"
Tag="{Binding AppData.IdString}"
Text="{Binding AppData.LocalizedStatus}"
Foreground="{Binding AppData.PlayabilityStatus, Converter={x:Static helpers:PlayabilityStatusConverter.Shared}}"
TextAlignment="Start"
TextWrapping="Wrap" />
<Button.Styles>
<Style Selector="Button">
<Setter Property="MinWidth"
Value="0" />
<!-- avoids very wide buttons from the overall project avalonia style -->
</Style>
</Button.Styles>
</Button>
</StackPanel>
<StackPanel Orientation="Horizontal">
<TextBlock Padding="0, 0, 5, 0" Text="{ext:Locale GameListHeaderTitleId}" />
<Button
Click="IdString_OnClick"
HorizontalContentAlignment="Left"
VerticalAlignment="Center"
Background="{DynamicResource AppListBackgroundColor}"
Padding="0">
<TextBlock
Margin="1.5"
HorizontalAlignment="Stretch"
Text="{Binding AppData.IdString}"
TextAlignment="Start"
TextWrapping="Wrap" />
</Button>
</StackPanel>
</StackPanel>
</Grid>
<Separator Margin="0, 10, 0, 10" Height="1" BorderBrush="Gray" Background="Gray" />
<TextBlock
HorizontalAlignment="Stretch"
IsVisible="{Binding AppData.HasLdnGames}"
Text="{Binding FormattedLdnInfo}"
TextAlignment="Start"
TextWrapping="Wrap" />
<Separator IsVisible="{Binding AppData.HasLdnGames}" Margin="0, 10, 0, 10" Height="1" BorderBrush="Gray" Background="Gray" />
<StackPanel
HorizontalAlignment="Left"
VerticalAlignment="Top"
Orientation="Vertical"
Spacing="5">
<TextBlock
HorizontalAlignment="Stretch"
Text="{Binding FormattedLastPlayed}"
TextAlignment="Start"
TextWrapping="Wrap" />
<TextBlock
HorizontalAlignment="Stretch"
Text="{Binding FormattedPlayTime}"
IsVisible="{Binding AppData.HasPlayedPreviously}"
TextAlignment="Start"
TextWrapping="Wrap" />
</StackPanel>
</StackPanel>
</StackPanel>
</UserControl>

View file

@ -23,6 +23,7 @@ namespace Ryujinx.Ava.UI.Controls
{
ContentDialog contentDialog = new()
{
Title = appData.Name,
PrimaryButtonText = string.Empty,
SecondaryButtonText = string.Empty,
CloseButtonText = LocaleManager.Instance[LocaleKeys.SettingsButtonClose],

View file

@ -1,34 +1,26 @@
using Gommon;
using Ryujinx.Ava.Common.Locale;
using Ryujinx.Ava.Utilities.AppLibrary;
namespace Ryujinx.Ava.UI.ViewModels
{
public class ApplicationDataViewModel : BaseModel
{
private const string FormatVersion = "Current Version: {0}";
private const string FormatDeveloper = "Developed by {0}";
private const string FormatExtension = "Game type: {0}";
private const string FormatLastPlayed = "Last played: {0}";
private const string FormatPlayTime = "Play time: {0}";
private const string FormatSize = "Size: {0}";
private const string FormatHostedGames = "Hosted Games: {0}";
private const string FormatPlayerCount = "Online Players: {0}";
public ApplicationData AppData { get; }
public ApplicationDataViewModel(ApplicationData appData) => AppData = appData;
public string FormattedVersion => FormatVersion.Format(AppData.Version);
public string FormattedDeveloper => FormatDeveloper.Format(AppData.Developer);
public string FormattedVersion => LocaleManager.Instance[LocaleKeys.GameListHeaderVersion].Format(AppData.Version);
public string FormattedDeveloper => LocaleManager.Instance[LocaleKeys.GameListHeaderDeveloper].Format(AppData.Developer);
public string FormattedFileExtension => FormatExtension.Format(AppData.FileExtension);
public string FormattedLastPlayed => FormatLastPlayed.Format(AppData.LastPlayedString);
public string FormattedPlayTime => FormatPlayTime.Format(AppData.TimePlayedString);
public string FormattedFileSize => FormatSize.Format(AppData.FileSizeString);
public string FormattedFileExtension => LocaleManager.Instance[LocaleKeys.GameListHeaderFileExtension].Format(AppData.FileExtension);
public string FormattedLastPlayed => LocaleManager.Instance[LocaleKeys.GameListHeaderLastPlayed].Format(AppData.LastPlayedString);
public string FormattedPlayTime => LocaleManager.Instance[LocaleKeys.GameListHeaderTimePlayed].Format(AppData.TimePlayedString);
public string FormattedFileSize => LocaleManager.Instance[LocaleKeys.GameListHeaderFileSize].Format(AppData.FileSizeString);
public string FormattedLdnInfo =>
$"{FormatHostedGames.Format(AppData.GameCount)}\n{FormatPlayerCount.Format(AppData.PlayerCount)}";
$"{LocaleManager.Instance[LocaleKeys.GameListHeaderHostedGames].Format(AppData.GameCount)}" +
$"\n" +
$"{LocaleManager.Instance[LocaleKeys.GameListHeaderPlayerCount].Format(AppData.PlayerCount)}";
}
}