1
0
mirror of synced 2025-01-31 04:13:50 +01:00

Added a button allowing song name language switching individually from UI language

This commit is contained in:
S-Sebb 2024-05-26 23:06:51 +01:00
parent e983bc525b
commit 8bcb89578e
19 changed files with 229 additions and 122 deletions

View File

@ -0,0 +1,54 @@
@using Blazored.LocalStorage
@using Microsoft.Extensions.Options
@using TaikoWebUI.Settings
@inject NavigationManager NavigationManager
@inject IOptions<WebUiSettings> Settings
@inject ILocalStorageService LocalStorage
<MudMenu Icon="@Icons.Material.Filled.Translate" Color="Color.Inherit" Size="Size.Small" Dense="true">
<MudText Align="Align.Center" GutterBottom="true">@Localizer["Song Name Language"]</MudText>
<MudDivider />
@foreach (var culture in supportedCultures)
{
<MudMenuItem OnClick="() => RequestCultureChange(culture.Key)" OnTouch="() => RequestCultureChange(culture.Key)">@culture.Value</MudMenuItem>
}
</MudMenu>
@code {
private readonly Dictionary<CultureInfo, string> supportedCultures = new();
protected override async Task OnInitializedAsync()
{
await base.OnInitializedAsync();
foreach (var language in Settings.Value.SupportedLanguages)
{
supportedCultures.Add(new CultureInfo(language.CultureCode), language.DisplayName);
}
if (supportedCultures.Count == 0)
{
supportedCultures.Add(new CultureInfo("en-US"), "English");
}
var currentSongNameLanguage = await LocalStorage.GetItemAsync<string>("songNameLanguage");
if (string.IsNullOrEmpty(currentSongNameLanguage))
{
await LocalStorage.SetItemAsync("songNameLanguage", "en-US");
}
}
private async Task RequestCultureChange(CultureInfo newCulture)
{
var currentSongNameLanguage = await LocalStorage.GetItemAsync<string>("songNameLanguage");
if (currentSongNameLanguage == newCulture.Name)
{
return;
}
await LocalStorage.SetItemAsync("songNameLanguage", newCulture.Name);
NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true);
}
}

View File

@ -1,31 +1,32 @@
@using System.Globalization; @using Microsoft.Extensions.Options
@using Microsoft.Extensions.Options
@using TaikoWebUI.Settings @using TaikoWebUI.Settings
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@inject IJSRuntime JSRuntime @inject IJSRuntime JsRuntime
@inject IOptions<WebUiSettings> Settings @inject IOptions<WebUiSettings> Settings
<MudMenu Icon="@Icons.Material.Filled.Translate" Color="Color.Inherit" Size="Size.Small" Dense="true"> <MudMenu Icon="@Icons.Material.Filled.Language" Color="Color.Inherit" Size="Size.Small" Dense="true">
@foreach (var culture in SupportedCultures) <MudText Align="Align.Center" GutterBottom="true">@Localizer["UI Language"]</MudText>
<MudDivider />
@foreach (var culture in supportedCultures)
{ {
<MudMenuItem OnClick="() => RequestCultureChange(culture.Key)" OnTouch="() => RequestCultureChange(culture.Key)">@culture.Value</MudMenuItem> <MudMenuItem OnClick="() => RequestCultureChange(culture.Key)" OnTouch="() => RequestCultureChange(culture.Key)">@culture.Value</MudMenuItem>
} }
</MudMenu> </MudMenu>
@code { @code {
public Dictionary<CultureInfo, string> SupportedCultures = new(); private Dictionary<CultureInfo, string> supportedCultures = new();
protected override void OnInitialized() protected override void OnInitialized()
{ {
base.OnInitialized(); base.OnInitialized();
foreach (var language in Settings.Value.SupportedLanguages) foreach (var language in Settings.Value.SupportedLanguages)
{ {
SupportedCultures.Add(new CultureInfo(language.CultureCode), language.DisplayName); supportedCultures.Add(new CultureInfo(language.CultureCode), language.DisplayName);
} }
if (SupportedCultures.Count == 0) if (supportedCultures.Count == 0)
{ {
SupportedCultures.Add(new CultureInfo("en-US"), "English"); supportedCultures.Add(new CultureInfo("en-US"), "English");
} }
} }
@ -36,9 +37,8 @@
return; return;
} }
var js = (IJSInProcessRuntime)JSRuntime; var js = (IJSInProcessRuntime)JsRuntime;
js.InvokeVoid("blazorCulture.set", newCulture.Name); js.InvokeVoid("blazorCulture.set", newCulture.Name);
NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true); NavigationManager.NavigateTo(NavigationManager.Uri, forceLoad: true);
} }
} }

View File

@ -1,6 +1,5 @@
@inherits LayoutComponentBase @inherits LayoutComponentBase
@inject Blazored.LocalStorage.ILocalStorageService LocalStorage @inject Blazored.LocalStorage.ILocalStorageService LocalStorage
@inject HttpClient Client
@inject AuthService AuthService @inject AuthService AuthService
<MudThemeProvider IsDarkMode="@isDarkMode" Theme="@taikoWebUiTheme" /> <MudThemeProvider IsDarkMode="@isDarkMode" Theme="@taikoWebUiTheme" />
@ -11,9 +10,10 @@
<MudAppBar Elevation="0"> <MudAppBar Elevation="0">
<MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" Edge="Edge.Start" OnClick="DrawerToggle" Size="Size.Small" /> <MudIconButton Icon="@Icons.Material.Filled.Menu" Color="Color.Inherit" Edge="Edge.Start" OnClick="DrawerToggle" Size="Size.Small" />
<MudSpacer /> <MudSpacer />
<MudStack Spacing="2" Row="true"> <MudStack Spacing="3" Row="true">
<MudIconButton Icon="@DarkModeIcon" Size="Size.Small" Color="Color.Inherit" OnClick="ToggleDarkMode" /> <MudIconButton Icon="@DarkModeIcon" Size="Size.Small" Color="Color.Inherit" OnClick="ToggleDarkMode" />
<ChooseLanguage /> <ChooseUILanguage />
<ChooseSongNameLanguage />
</MudStack> </MudStack>
</MudAppBar> </MudAppBar>
<MudDrawer Elevation="0" Style="border-right:1px solid #ededf0" @bind-Open="drawerOpen"> <MudDrawer Elevation="0" Style="border-right:1px solid #ededf0" @bind-Open="drawerOpen">

View File

@ -752,6 +752,15 @@ namespace TaikoWebUI.Localization {
} }
} }
/// <summary>
/// Looks up a localized string similar to .
/// </summary>
internal static string Song_Name_Language {
get {
return ResourceManager.GetString("Song Name Language", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to . /// Looks up a localized string similar to .
/// </summary> /// </summary>
@ -824,6 +833,15 @@ namespace TaikoWebUI.Localization {
} }
} }
/// <summary>
/// Looks up a localized string similar to .
/// </summary>
internal static string UI_Language {
get {
return ResourceManager.GetString("UI Language", resourceCulture);
}
}
/// <summary> /// <summary>
/// Looks up a localized string similar to . /// Looks up a localized string similar to .
/// </summary> /// </summary>

View File

@ -594,4 +594,10 @@
<data name="Rows Per Page:" xml:space="preserve"> <data name="Rows Per Page:" xml:space="preserve">
<value>Rows Per Page:</value> <value>Rows Per Page:</value>
</data> </data>
<data name="UI Language" xml:space="preserve">
<value>UI Lang</value>
</data>
<data name="Song Name Language" xml:space="preserve">
<value>Song Lang</value>
</data>
</root> </root>

View File

@ -594,4 +594,10 @@
<data name="Rows Per Page:" xml:space="preserve"> <data name="Rows Per Page:" xml:space="preserve">
<value>1ページ当たりの行数</value> <value>1ページ当たりの行数</value>
</data> </data>
<data name="UI Language" xml:space="preserve">
<value>UI言語</value>
</data>
<data name="Song Name Language" xml:space="preserve">
<value>曲名言語</value>
</data>
</root> </root>

View File

@ -390,4 +390,10 @@
<data name="Total Credits Played" xml:space="preserve"> <data name="Total Credits Played" xml:space="preserve">
<value /> <value />
</data> </data>
<data name="UI Language" xml:space="preserve">
<value />
</data>
<data name="Song Name Language" xml:space="preserve">
<value />
</data>
</root> </root>

View File

@ -591,4 +591,10 @@
<data name="Rows Per Page:" xml:space="preserve"> <data name="Rows Per Page:" xml:space="preserve">
<value>每页行数</value> <value>每页行数</value>
</data> </data>
<data name="UI Language" xml:space="preserve">
<value>界面语言</value>
</data>
<data name="Song Name Language" xml:space="preserve">
<value>曲名语言</value>
</data>
</root> </root>

View File

@ -591,4 +591,10 @@
<data name="Rows Per Page:" xml:space="preserve"> <data name="Rows Per Page:" xml:space="preserve">
<value>每頁行數</value> <value>每頁行數</value>
</data> </data>
<data name="UI Language" xml:space="preserve">
<value>界面語言</value>
</data>
<data name="Song Name Language" xml:space="preserve">
<value>曲名語言</value>
</data>
</root> </root>

View File

@ -1,8 +1,11 @@
@inject IGameDataService GameDataService @using Blazored.LocalStorage
@inject IGameDataService GameDataService
@inject HttpClient Client @inject HttpClient Client
@inject AuthService AuthService @inject AuthService AuthService
@inject IJSRuntime JsRuntime @inject IJSRuntime JsRuntime
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@inject ILocalStorageService LocalStorage
@page "/Users/{baid:int}/DaniDojo" @page "/Users/{baid:int}/DaniDojo"
@ -148,12 +151,12 @@ else
</MudItem> </MudItem>
<MudItem xs="9" md="4" Style="display:flex;flex-direction:column;" Class="pl-4"> <MudItem xs="9" md="4" Style="display:flex;flex-direction:column;" Class="pl-4">
<MudText Typo="Typo.body1" Style="font-weight: bold;">@GameDataService.GetMusicNameBySongId(musicDetailDictionary, danDataOdaiSong.SongNo, @CurrentLanguage)</MudText> <MudText Typo="Typo.body1" Style="font-weight: bold;">@GameDataService.GetMusicNameBySongId(musicDetailDictionary, danDataOdaiSong.SongNo, SongNameLanguage)</MudText>
<MudText Typo="Typo.caption">@GameDataService.GetMusicArtistBySongId(musicDetailDictionary, danDataOdaiSong.SongNo, @CurrentLanguage)</MudText> <MudText Typo="Typo.caption">@GameDataService.GetMusicArtistBySongId(musicDetailDictionary, danDataOdaiSong.SongNo, SongNameLanguage)</MudText>
</MudItem> </MudItem>
@if (bestDataMap.TryGetValue(danId, out var danBestData)) @if (_bestDataMap.TryGetValue(danId, out var danBestData))
{ {
if (danBestData.DanBestStageDataList.Count > index) if (danBestData.DanBestStageDataList.Count > index)
{ {
@ -218,7 +221,7 @@ else
} }
<MudStack Spacing="1"> <MudStack Spacing="1">
<MudText Typo="Typo.subtitle2" Style="font-weight:bold;">@Localizer["Result"]</MudText> <MudText Typo="Typo.subtitle2" Style="font-weight:bold;">@Localizer["Result"]</MudText>
@if (bestDataMap.TryGetValue(danId, out var danBestData)) @if (_bestDataMap.TryGetValue(danId, out var danBestData))
{ {
if (danBestData.SoulGaugeTotal >= redRequirement) { if (danBestData.SoulGaugeTotal >= redRequirement) {
barClass = "bar-pass-red"; barClass = "bar-pass-red";
@ -288,7 +291,7 @@ else
} }
<MudStack Spacing="1"> <MudStack Spacing="1">
<MudText Typo="Typo.subtitle2" Style="font-weight:bold;">@Localizer["Result"]</MudText> <MudText Typo="Typo.subtitle2" Style="font-weight:bold;">@Localizer["Result"]</MudText>
@if (bestDataMap.TryGetValue(danId, out var danBestData)) @if (_bestDataMap.TryGetValue(danId, out var danBestData))
{ {
var bestData = GetAllBestFromData((DanConditionType)border.OdaiType, danBestData); var bestData = GetAllBestFromData((DanConditionType)border.OdaiType, danBestData);
@ -381,7 +384,7 @@ else
</MudCardHeader> </MudCardHeader>
<MudCardContent> <MudCardContent>
<MudText Typo="Typo.subtitle2" Style="font-weight:bold;">@Localizer["Result"]</MudText> <MudText Typo="Typo.subtitle2" Style="font-weight:bold;">@Localizer["Result"]</MudText>
@if (bestDataMap.TryGetValue(danId, out var danBestData) && (danBestData.DanBestStageDataList.Count > songNumber)) @if (_bestDataMap.TryGetValue(danId, out var danBestData) && (danBestData.DanBestStageDataList.Count > songNumber))
{ {
var bestData = GetSongBestFromData((DanConditionType)border.OdaiType, danBestData, songNumber); var bestData = GetSongBestFromData((DanConditionType)border.OdaiType, danBestData, songNumber);
if ((DanConditionType)border.OdaiType is DanConditionType.BadCount or DanConditionType.OkCount) if ((DanConditionType)border.OdaiType is DanConditionType.BadCount or DanConditionType.OkCount)

View File

@ -6,12 +6,13 @@ public partial class DaniDojo
{ {
[Parameter] [Parameter]
public int Baid { get; set; } public int Baid { get; set; }
public string CurrentLanguage { get; set; } = "ja";
private string? SongNameLanguage { get; set; }
private DanBestDataResponse? response; private DanBestDataResponse? response;
private UserSetting? userSetting; private UserSetting? userSetting;
private static Dictionary<uint, DanBestData> bestDataMap = new(); private static Dictionary<uint, DanBestData> _bestDataMap = new();
private Dictionary<uint, MusicDetail> musicDetailDictionary = new(); private Dictionary<uint, MusicDetail> musicDetailDictionary = new();
private readonly List<BreadcrumbItem> breadcrumbs = new(); private readonly List<BreadcrumbItem> breadcrumbs = new();
@ -29,9 +30,9 @@ public partial class DaniDojo
response.ThrowIfNull(); response.ThrowIfNull();
response.DanBestDataList.ForEach(data => data.DanBestStageDataList response.DanBestDataList.ForEach(data => data.DanBestStageDataList
.Sort((stageData, otherStageData) => stageData.SongNumber.CompareTo(otherStageData.SongNumber))); .Sort((stageData, otherStageData) => stageData.SongNumber.CompareTo(otherStageData.SongNumber)));
bestDataMap = response.DanBestDataList.ToDictionary(data => data.DanId); _bestDataMap = response.DanBestDataList.ToDictionary(data => data.DanId);
CurrentLanguage = await JsRuntime.InvokeAsync<string>("blazorCulture.get"); SongNameLanguage = await LocalStorage.GetItemAsync<string>("songNameLanguage");
userSetting = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}"); userSetting = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}");
@ -176,12 +177,12 @@ public partial class DaniDojo
string icon; string icon;
const string notClearIcon = "<image href='/images/dani_NotClear.png' width='24' height='24' style='filter: contrast(0.65)'/>"; const string notClearIcon = "<image href='/images/dani_NotClear.png' width='24' height='24' style='filter: contrast(0.65)'/>";
if (!bestDataMap.ContainsKey(danId)) if (!_bestDataMap.ContainsKey(danId))
{ {
return notClearIcon; return notClearIcon;
} }
var state = bestDataMap[danId].ClearState; var state = _bestDataMap[danId].ClearState;
icon = state is DanClearState.NotClear ? notClearIcon : $"<image href='/images/dani_{state}.png' width='24' height='24' />"; icon = state is DanClearState.NotClear ? notClearIcon : $"<image href='/images/dani_{state}.png' width='24' height='24' />";
@ -190,7 +191,7 @@ public partial class DaniDojo
private DanClearState GetDanResultState(uint danId) private DanClearState GetDanResultState(uint danId)
{ {
return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].ClearState : DanClearState.NotClear; return _bestDataMap.ContainsKey(danId) ? _bestDataMap[danId].ClearState : DanClearState.NotClear;
} }
private static uint GetSoulGauge(DanData data, bool isGold) private static uint GetSoulGauge(DanData data, bool isGold)
@ -217,36 +218,36 @@ public partial class DaniDojo
private static long GetTotalScore(uint danId) private static long GetTotalScore(uint danId)
{ {
return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.HighScore) : 0; return _bestDataMap.ContainsKey(danId) ? _bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.HighScore) : 0;
} }
private static long GetTotalGoodHits(uint danId) private static long GetTotalGoodHits(uint danId)
{ {
return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.GoodCount) : 0; return _bestDataMap.ContainsKey(danId) ? _bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.GoodCount) : 0;
} }
private static long GetTotalOkHits(uint danId) private static long GetTotalOkHits(uint danId)
{ {
return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.OkCount) : 0; return _bestDataMap.ContainsKey(danId) ? _bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.OkCount) : 0;
} }
private static long GetTotalBadHits(uint danId) private static long GetTotalBadHits(uint danId)
{ {
return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.BadCount) : 0; return _bestDataMap.ContainsKey(danId) ? _bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.BadCount) : 0;
} }
private static long GetTotalDrumrollHits(uint danId) private static long GetTotalDrumrollHits(uint danId)
{ {
return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.DrumrollCount) : 0; return _bestDataMap.ContainsKey(danId) ? _bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.DrumrollCount) : 0;
} }
private static long GetTotalMaxCombo(uint danId) private static long GetTotalMaxCombo(uint danId)
{ {
return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.ComboCount) : 0; return _bestDataMap.ContainsKey(danId) ? _bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.ComboCount) : 0;
} }
private static long GetTotalHits(uint danId) private static long GetTotalHits(uint danId)
{ {
return bestDataMap.ContainsKey(danId) ? bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.TotalHitCount) : 0; return _bestDataMap.ContainsKey(danId) ? _bestDataMap[danId].DanBestStageDataList.Sum(stageData => stageData.TotalHitCount) : 0;
} }
} }

View File

@ -1,10 +1,10 @@
@inject IGameDataService GameDataService @using TaikoWebUI.Utilities;
@inject IGameDataService GameDataService
@inject HttpClient Client @inject HttpClient Client
@inject AuthService AuthService @inject AuthService AuthService
@inject IJSRuntime JsRuntime
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@inject Blazored.LocalStorage.ILocalStorageService LocalStorage @inject Blazored.LocalStorage.ILocalStorageService LocalStorage
@using TaikoWebUI.Utilities;
@page "/Users/{baid:int}/HighScores" @page "/Users/{baid:int}/HighScores"

View File

@ -1,6 +1,4 @@
using Microsoft.JSInterop; namespace TaikoWebUI.Pages;
namespace TaikoWebUI.Pages;
public partial class HighScores public partial class HighScores
{ {
@ -29,15 +27,15 @@ public partial class HighScores
userSetting = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}"); userSetting = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}");
var language = await JsRuntime.InvokeAsync<string>("blazorCulture.get"); var songNameLanguage = await LocalStorage.GetItemAsync<string>("songNameLanguage");
musicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); musicDetailDictionary = await GameDataService.GetMusicDetailDictionary();
response.SongBestData.ForEach(data => response.SongBestData.ForEach(data =>
{ {
var songId = data.SongId; var songId = data.SongId;
data.Genre = GameDataService.GetMusicGenreBySongId(musicDetailDictionary, songId); data.Genre = GameDataService.GetMusicGenreBySongId(musicDetailDictionary, songId);
data.MusicName = GameDataService.GetMusicNameBySongId(musicDetailDictionary, songId, string.IsNullOrEmpty(language) ? "ja" : language); data.MusicName = GameDataService.GetMusicNameBySongId(musicDetailDictionary, songId, string.IsNullOrEmpty(songNameLanguage) ? "ja" : songNameLanguage);
data.MusicArtist = GameDataService.GetMusicArtistBySongId(musicDetailDictionary, songId, string.IsNullOrEmpty(language) ? "ja" : language); data.MusicArtist = GameDataService.GetMusicArtistBySongId(musicDetailDictionary, songId, string.IsNullOrEmpty(songNameLanguage) ? "ja" : songNameLanguage);
}); });
songBestDataMap = response.SongBestData.GroupBy(data => data.Difficulty) songBestDataMap = response.SongBestData.GroupBy(data => data.Difficulty)

View File

@ -1,8 +1,11 @@
@using Blazored.LocalStorage
@inject IGameDataService GameDataService @inject IGameDataService GameDataService
@inject HttpClient Client @inject HttpClient Client
@inject AuthService AuthService @inject AuthService AuthService
@inject IJSRuntime JsRuntime @inject IJSRuntime JsRuntime
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@inject ILocalStorageService LocalStorage
@page "/Users/{baid:int}/PlayHistory" @page "/Users/{baid:int}/PlayHistory"

View File

@ -12,7 +12,7 @@ public partial class PlayHistory
private string Search { get; set; } = string.Empty; private string Search { get; set; } = string.Empty;
private string? currentLanguage; private string? songNameLanguage;
private SongHistoryResponse? response; private SongHistoryResponse? response;
@ -35,7 +35,7 @@ public partial class PlayHistory
response = await Client.GetFromJsonAsync<SongHistoryResponse>($"api/PlayHistory/{(uint)Baid}"); response = await Client.GetFromJsonAsync<SongHistoryResponse>($"api/PlayHistory/{(uint)Baid}");
response.ThrowIfNull(); response.ThrowIfNull();
currentLanguage = await JsRuntime.InvokeAsync<string>("blazorCulture.get"); songNameLanguage = await LocalStorage.GetItemAsync<string>("songNameLanguage");
musicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); musicDetailDictionary = await GameDataService.GetMusicDetailDictionary();
@ -43,8 +43,8 @@ public partial class PlayHistory
{ {
var songId = data.SongId; var songId = data.SongId;
data.Genre = GameDataService.GetMusicGenreBySongId(musicDetailDictionary, songId); data.Genre = GameDataService.GetMusicGenreBySongId(musicDetailDictionary, songId);
data.MusicName = GameDataService.GetMusicNameBySongId(musicDetailDictionary, songId, string.IsNullOrEmpty(currentLanguage) ? "ja" : currentLanguage); data.MusicName = GameDataService.GetMusicNameBySongId(musicDetailDictionary, songId, string.IsNullOrEmpty(songNameLanguage) ? "ja" : songNameLanguage);
data.MusicArtist = GameDataService.GetMusicArtistBySongId(musicDetailDictionary, songId, string.IsNullOrEmpty(currentLanguage) ? "ja" : currentLanguage); data.MusicArtist = GameDataService.GetMusicArtistBySongId(musicDetailDictionary, songId, string.IsNullOrEmpty(songNameLanguage) ? "ja" : songNameLanguage);
data.Stars = GameDataService.GetMusicStarLevel(musicDetailDictionary, songId, data.Difficulty); data.Stars = GameDataService.GetMusicStarLevel(musicDetailDictionary, songId, data.Difficulty);
data.ShowDetails = false; data.ShowDetails = false;
}); });
@ -140,7 +140,7 @@ public partial class PlayHistory
return true; return true;
} }
var language = currentLanguage ?? "ja"; var language = songNameLanguage ?? "ja";
if (songHistoryDataList[0].PlayTime if (songHistoryDataList[0].PlayTime
.ToString("dddd d MMMM yyyy - HH:mm", CultureInfo.CreateSpecificCulture(language)) .ToString("dddd d MMMM yyyy - HH:mm", CultureInfo.CreateSpecificCulture(language))

View File

@ -1,12 +1,13 @@
@page "/Users/{baid:int}/Songs/{songId:int}" @page "/Users/{baid:int}/Songs/{songId:int}"
@using Blazored.LocalStorage
@using TaikoWebUI.Components.Song
@inject IGameDataService GameDataService @inject IGameDataService GameDataService
@inject HttpClient Client @inject HttpClient Client
@inject AuthService AuthService @inject AuthService AuthService
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@inject IJSRuntime JsRuntime @inject ILocalStorageService LocalStorage
@using TaikoWebUI.Components.Song;
@if (AuthService.LoginRequired && (!AuthService.IsLoggedIn || (AuthService.GetLoggedInBaid() != Baid && !AuthService.IsAdmin))) @if (AuthService.LoginRequired && (!AuthService.IsLoggedIn || (AuthService.GetLoggedInBaid() != Baid && !AuthService.IsAdmin)))
{ {

View File

@ -1,65 +1,62 @@
using Microsoft.JSInterop; namespace TaikoWebUI.Pages;
namespace TaikoWebUI.Pages public partial class Song
{ {
public partial class Song [Parameter]
public int SongId { get; set; }
[Parameter]
public int Baid { get; set; }
private UserSetting? userSetting;
private SongHistoryResponse? response;
private List<SongHistoryData>? songHistoryData;
private readonly List<BreadcrumbItem> breadcrumbs = new();
private string songTitle = string.Empty;
private string songArtist = string.Empty;
protected override async Task OnInitializedAsync()
{ {
[Parameter] await base.OnInitializedAsync();
public int SongId { get; set; }
if (AuthService.LoginRequired && !AuthService.IsLoggedIn)
[Parameter]
public int Baid { get; set; }
private UserSetting? userSetting;
private SongHistoryResponse? response;
private List<SongHistoryData>? songHistoryData;
private readonly List<BreadcrumbItem> breadcrumbs = new();
private string songTitle = string.Empty;
private string songArtist = string.Empty;
protected override async Task OnInitializedAsync()
{ {
await base.OnInitializedAsync(); await AuthService.LoginWithAuthToken();
if (AuthService.LoginRequired && !AuthService.IsLoggedIn)
{
await AuthService.LoginWithAuthToken();
}
response = await Client.GetFromJsonAsync<SongHistoryResponse>($"api/PlayHistory/{(uint)Baid}");
response.ThrowIfNull();
// Get all song best data with SongId
songHistoryData = response.SongHistoryData.Where(data => data.SongId == (uint)SongId).ToList();
// Get user settings
userSetting = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}");
var musicDetailDictionary = await GameDataService.GetMusicDetailDictionary();
// Get song title and artist
var language = await JsRuntime.InvokeAsync<string>("blazorCulture.get");
songTitle = GameDataService.GetMusicNameBySongId(musicDetailDictionary, (uint)SongId, string.IsNullOrEmpty(language) ? "ja" : language);
songArtist = GameDataService.GetMusicArtistBySongId(musicDetailDictionary, (uint)SongId, string.IsNullOrEmpty(language) ? "ja" : language);
// Breadcrumbs
var formattedSongTitle = songTitle;
if (formattedSongTitle.Length > 20)
{
formattedSongTitle = string.Concat(formattedSongTitle.AsSpan(0, 20), "...");
}
if (AuthService.IsLoggedIn && !AuthService.IsAdmin)
{
breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
}
else
{
breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
};
breadcrumbs.Add(new BreadcrumbItem($"{userSetting?.MyDonName}", href: null, disabled: true));
breadcrumbs.Add(new BreadcrumbItem(Localizer["Song List"], href: $"/Users/{Baid}/Songs", disabled: false));
breadcrumbs.Add(new BreadcrumbItem(formattedSongTitle, href: $"/Users/{Baid}/Songs/{SongId}", disabled: false));
} }
response = await Client.GetFromJsonAsync<SongHistoryResponse>($"api/PlayHistory/{(uint)Baid}");
response.ThrowIfNull();
// Get all song best data with SongId
songHistoryData = response.SongHistoryData.Where(data => data.SongId == (uint)SongId).ToList();
// Get user settings
userSetting = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}");
var musicDetailDictionary = await GameDataService.GetMusicDetailDictionary();
// Get song title and artist
var songNameLanguage = await LocalStorage.GetItemAsync<string>("songNameLanguage");
songTitle = GameDataService.GetMusicNameBySongId(musicDetailDictionary, (uint)SongId, string.IsNullOrEmpty(songNameLanguage) ? "ja" : songNameLanguage);
songArtist = GameDataService.GetMusicArtistBySongId(musicDetailDictionary, (uint)SongId, string.IsNullOrEmpty(songNameLanguage) ? "ja" : songNameLanguage);
// Breadcrumbs
var formattedSongTitle = songTitle;
if (formattedSongTitle.Length > 20)
{
formattedSongTitle = string.Concat(formattedSongTitle.AsSpan(0, 20), "...");
}
if (AuthService.IsLoggedIn && !AuthService.IsAdmin)
{
breadcrumbs.Add(new BreadcrumbItem(Localizer["Dashboard"], href: "/"));
}
else
{
breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users"));
};
breadcrumbs.Add(new BreadcrumbItem($"{userSetting?.MyDonName}", href: null, disabled: true));
breadcrumbs.Add(new BreadcrumbItem(Localizer["Song List"], href: $"/Users/{Baid}/Songs", disabled: false));
breadcrumbs.Add(new BreadcrumbItem(formattedSongTitle, href: $"/Users/{Baid}/Songs/{SongId}", disabled: false));
} }
} }

View File

@ -1,9 +1,11 @@
@inject IGameDataService GameDataService @using Blazored.LocalStorage
@using TaikoWebUI.Utilities;
@inject IGameDataService GameDataService
@inject HttpClient Client @inject HttpClient Client
@inject AuthService AuthService @inject AuthService AuthService
@inject IJSRuntime JsRuntime @inject ILocalStorageService LocalStorage
@inject NavigationManager NavigationManager @inject NavigationManager NavigationManager
@using TaikoWebUI.Utilities;
@page "/Users/{baid:int}/Songs" @page "/Users/{baid:int}/Songs"
@ -55,7 +57,7 @@
</ToolBarContent> </ToolBarContent>
<HeaderContent> <HeaderContent>
<MudTh> <MudTh>
<MudTableSortLabel T="MusicDetail" SortBy="context => GameDataService.GetMusicNameBySongId(musicDetailDictionary, context.SongId, CurrentLanguage)"> <MudTableSortLabel T="MusicDetail" SortBy="context => GameDataService.GetMusicNameBySongId(musicDetailDictionary, context.SongId, SongNameLanguage)">
@Localizer["Song Title / Artist"] @Localizer["Song Title / Artist"]
</MudTableSortLabel> </MudTableSortLabel>
</MudTh> </MudTh>
@ -82,10 +84,10 @@
<div> <div>
<a href="@($"/Users/{Baid}/Songs/{context.SongId}")"> <a href="@($"/Users/{Baid}/Songs/{context.SongId}")">
<MudText Typo="Typo.body2" Style="font-weight:bold"> <MudText Typo="Typo.body2" Style="font-weight:bold">
@GameDataService.GetMusicNameBySongId(musicDetailDictionary, context.SongId, CurrentLanguage) @GameDataService.GetMusicNameBySongId(musicDetailDictionary, context.SongId, SongNameLanguage)
</MudText> </MudText>
<MudText Typo="Typo.caption"> <MudText Typo="Typo.caption">
@GameDataService.GetMusicArtistBySongId(musicDetailDictionary, context.SongId, CurrentLanguage) @GameDataService.GetMusicArtistBySongId(musicDetailDictionary, context.SongId, SongNameLanguage)
</MudText> </MudText>
</a> </a>
</div> </div>

View File

@ -1,6 +1,4 @@
using Microsoft.JSInterop; namespace TaikoWebUI.Pages;
namespace TaikoWebUI.Pages;
public partial class SongList public partial class SongList
{ {
@ -9,7 +7,7 @@ public partial class SongList
private string Search { get; set; } = string.Empty; private string Search { get; set; } = string.Empty;
private string GenreFilter { get; set; } = string.Empty; private string GenreFilter { get; set; } = string.Empty;
private string CurrentLanguage { get; set; } = "ja"; private string? SongNameLanguage { get; set; }
private SongBestResponse? response; private SongBestResponse? response;
private UserSetting? userSetting; private UserSetting? userSetting;
@ -33,7 +31,9 @@ public partial class SongList
userSetting = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}"); userSetting = await Client.GetFromJsonAsync<UserSetting>($"api/UserSettings/{Baid}");
musicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); musicDetailDictionary = await GameDataService.GetMusicDetailDictionary();
CurrentLanguage = await JsRuntime.InvokeAsync<string>("blazorCulture.get"); SongNameLanguage = await LocalStorage.GetItemAsync<string>("songNameLanguage");
Console.WriteLine("Language: " + SongNameLanguage);
if (AuthService.IsLoggedIn && !AuthService.IsAdmin) if (AuthService.IsLoggedIn && !AuthService.IsAdmin)
{ {