From 583c95071c8c223cfb7c393cd071bc532555f1e7 Mon Sep 17 00:00:00 2001 From: ptmaster Date: Wed, 11 Sep 2024 05:30:35 +0800 Subject: [PATCH 01/15] ChallengeCompete Init --- GameDatabase/Context/TaikoDbContext.cs | 2 + .../Context/TaikoDbContextChallengeCompete.cs | 78 ++ .../Entities/ChallengeCompeteBestDatum.cs | 24 + .../Entities/ChallengeCompeteDatum.cs | 21 + .../ChallengeCompeteParticipantDatum.cs | 10 + .../Entities/ChallengeCompeteSongDatum.cs | 13 + ...0910100030_AddChallengeCompete.Designer.cs | 769 ++++++++++++++++++ .../20240910100030_AddChallengeCompete.cs | 150 ++++ .../Migrations/TaikoDbContextModelSnapshot.cs | 197 +++++ SharedProject/Enums/CompeteModeType.cs | 9 + SharedProject/Enums/CompeteTargetType.cs | 9 + SharedProject/Enums/ShareType.cs | 7 + .../Api/ChallengeCompeteManageController.cs | 63 ++ .../Game/ChallengeCompetitionController.cs | 10 +- .../Handlers/ChallengeCompeteQuery.cs | 65 ++ TaikoLocalServer/Handlers/UserDataQuery.cs | 9 +- .../Models/ChallengeCompeteInfo.cs | 33 + .../Models/ChallengeCompeteSongInfo.cs | 16 + .../Services/ChallengeCompeteService.cs | 174 ++++ .../Interfaces/IChallengeCompeteService.cs | 18 + 20 files changed, 1668 insertions(+), 9 deletions(-) create mode 100644 GameDatabase/Context/TaikoDbContextChallengeCompete.cs create mode 100644 GameDatabase/Entities/ChallengeCompeteBestDatum.cs create mode 100644 GameDatabase/Entities/ChallengeCompeteDatum.cs create mode 100644 GameDatabase/Entities/ChallengeCompeteParticipantDatum.cs create mode 100644 GameDatabase/Entities/ChallengeCompeteSongDatum.cs create mode 100644 GameDatabase/Migrations/20240910100030_AddChallengeCompete.Designer.cs create mode 100644 GameDatabase/Migrations/20240910100030_AddChallengeCompete.cs create mode 100644 SharedProject/Enums/CompeteModeType.cs create mode 100644 SharedProject/Enums/CompeteTargetType.cs create mode 100644 SharedProject/Enums/ShareType.cs create mode 100644 TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs create mode 100644 TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs create mode 100644 TaikoLocalServer/Models/ChallengeCompeteInfo.cs create mode 100644 TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs create mode 100644 TaikoLocalServer/Services/ChallengeCompeteService.cs create mode 100644 TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs diff --git a/GameDatabase/Context/TaikoDbContext.cs b/GameDatabase/Context/TaikoDbContext.cs index 7e95b796..0e0458cc 100644 --- a/GameDatabase/Context/TaikoDbContext.cs +++ b/GameDatabase/Context/TaikoDbContext.cs @@ -127,8 +127,10 @@ protected override void OnModelCreating(ModelBuilder modelBuilder) }); OnModelCreatingPartial(modelBuilder); + OnModelCreatingChallengeCompete(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); + partial void OnModelCreatingChallengeCompete(ModelBuilder modelBuilder); } } \ No newline at end of file diff --git a/GameDatabase/Context/TaikoDbContextChallengeCompete.cs b/GameDatabase/Context/TaikoDbContextChallengeCompete.cs new file mode 100644 index 00000000..992c3ae6 --- /dev/null +++ b/GameDatabase/Context/TaikoDbContextChallengeCompete.cs @@ -0,0 +1,78 @@ +using GameDatabase.Entities; +using Microsoft.EntityFrameworkCore; + +namespace GameDatabase.Context; + +public partial class TaikoDbContext +{ + public virtual DbSet ChallengeCompeteData { get; set; } = null; + public virtual DbSet ChallengeCompeteParticipantData { get; set; } = null; + public virtual DbSet ChallengeCompeteSongData { get; set; } = null; + public virtual DbSet ChallengeCompeteBestData { get; set; } = null; + + partial void OnModelCreatingChallengeCompete(ModelBuilder modelBuilder) + { + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.CompId }); + + entity.Property(e => e.CompeteMode).HasConversion(); + entity.Property(e => e.Share).HasConversion(); + entity.Property(e => e.CompeteTarget).HasConversion(); + + entity.Property(e => e.CreateTime).HasColumnType("datetime"); + entity.Property(e => e.ExpireTime).HasColumnType("datetime"); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.CompId, e.Baid }); + + entity.HasOne(e => e.UserData) + .WithMany() + .HasPrincipalKey(p => p.Baid) + .HasForeignKey(d => d.Baid) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(e => e.ChallengeCompeteData) + .WithMany(p => p.Participants) + .HasPrincipalKey(p => p.CompId) + .HasForeignKey(d => d.CompId) + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.CompId, e.SongId }); + + entity.HasOne(e => e.ChallengeCompeteData) + .WithMany(p => p.Songs) + .HasPrincipalKey(p => p.CompId) + .HasForeignKey(d => d.CompId) + .OnDelete(DeleteBehavior.Cascade); + + entity.Property(e => e.Difficulty).HasConversion(); + }); + + modelBuilder.Entity(entity => + { + entity.HasKey(e => new { e.CompId, e.Baid, e.SongId }); + + entity.HasOne(e => e.UserData) + .WithMany() + .HasPrincipalKey(p => p.Baid) + .HasForeignKey(d => d.Baid) + .OnDelete(DeleteBehavior.Cascade); + + entity.HasOne(e => e.ChallengeCompeteSongData) + .WithMany(p => p.BestScores) + .HasPrincipalKey(p => new { p.CompId, p.SongId }) + .HasForeignKey(d => new { d.CompId, d.SongId }) + .OnDelete(DeleteBehavior.Cascade); + + entity.Property(e => e.Difficulty).HasConversion(); + entity.Property(e => e.Crown).HasConversion(); + entity.Property(e => e.ScoreRank).HasConversion(); + }); + } +} diff --git a/GameDatabase/Entities/ChallengeCompeteBestDatum.cs b/GameDatabase/Entities/ChallengeCompeteBestDatum.cs new file mode 100644 index 00000000..13130b7a --- /dev/null +++ b/GameDatabase/Entities/ChallengeCompeteBestDatum.cs @@ -0,0 +1,24 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities; + +public partial class ChallengeCompeteBestDatum +{ + public uint CompId { get; set; } + public uint Baid { get; set; } + public uint SongId { get; set; } + public Difficulty Difficulty { get; set; } + public CrownType Crown { get; set; } + public uint Score { get; set; } + public uint ScoreRate { get; set; } + public ScoreRank ScoreRank { get; set; } + public uint GoodCount { get; set; } + public uint OkCount { get; set; } + public uint MissCount { get; set; } + public uint ComboCount { get; set; } + public uint HitCount { get; set; } + public uint DrumrollCount { get; set; } + public bool Skipped { get; set; } + public virtual ChallengeCompeteSongDatum? ChallengeCompeteSongData { get; set; } + public virtual UserDatum? UserData { get; set; } +} diff --git a/GameDatabase/Entities/ChallengeCompeteDatum.cs b/GameDatabase/Entities/ChallengeCompeteDatum.cs new file mode 100644 index 00000000..a8cea9c7 --- /dev/null +++ b/GameDatabase/Entities/ChallengeCompeteDatum.cs @@ -0,0 +1,21 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities; + +public partial class ChallengeCompeteDatum +{ + public uint CompId { get; set; } + public CompeteModeType CompeteMode { get; set; } = CompeteModeType.None; + public uint Baid { get; set; } + public string CompeteName { get; set; } = String.Empty; + public string CompeteDescribe { get; set; } = String.Empty; + public uint MaxParticipant { get; set; } = 2; + public DateTime CreateTime { get; set; } + public DateTime ExpireTime { get; set; } + public uint RequireTitle { get; set; } = 0; + public ShareType Share { get; set; } = ShareType.EveryOne; + public CompeteTargetType CompeteTarget { get; set; } = CompeteTargetType.EveryOne; + public List Songs { get; set; } = new(); + public List Participants { get; set; } = new(); +} + diff --git a/GameDatabase/Entities/ChallengeCompeteParticipantDatum.cs b/GameDatabase/Entities/ChallengeCompeteParticipantDatum.cs new file mode 100644 index 00000000..08fc057f --- /dev/null +++ b/GameDatabase/Entities/ChallengeCompeteParticipantDatum.cs @@ -0,0 +1,10 @@ +namespace GameDatabase.Entities; + +public partial class ChallengeCompeteParticipantDatum +{ + public uint CompId { get; set; } + public uint Baid { get; set; } + public bool IsActive { get; set; } + public virtual ChallengeCompeteDatum? ChallengeCompeteData { get; set; } + public virtual UserDatum? UserData { get; set; } +} diff --git a/GameDatabase/Entities/ChallengeCompeteSongDatum.cs b/GameDatabase/Entities/ChallengeCompeteSongDatum.cs new file mode 100644 index 00000000..846c9094 --- /dev/null +++ b/GameDatabase/Entities/ChallengeCompeteSongDatum.cs @@ -0,0 +1,13 @@ +using SharedProject.Enums; + +namespace GameDatabase.Entities; + +public partial class ChallengeCompeteSongDatum +{ + public uint CompId { get; set; } + public uint SongId { get; set; } + public Difficulty Difficulty { get; set; } + public short SongOpt { get; set; } + public List BestScores { get; set; } = new(); + public virtual ChallengeCompeteDatum? ChallengeCompeteData { get; set; } +} diff --git a/GameDatabase/Migrations/20240910100030_AddChallengeCompete.Designer.cs b/GameDatabase/Migrations/20240910100030_AddChallengeCompete.Designer.cs new file mode 100644 index 00000000..7d504f4e --- /dev/null +++ b/GameDatabase/Migrations/20240910100030_AddChallengeCompete.Designer.cs @@ -0,0 +1,769 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace GameDatabase.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20240910100030_AddChallengeCompete")] + partial class AddChallengeCompete + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.3"); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex("Baid"); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteBestDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "Baid", "SongId"); + + b.HasIndex("Baid"); + + b.HasIndex("CompId", "SongId"); + + b.ToTable("ChallengeCompeteBestData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteDatum", b => + { + b.Property("CompId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("CompeteDescribe") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CompeteMode") + .HasColumnType("INTEGER"); + + b.Property("CompeteName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CompeteTarget") + .HasColumnType("INTEGER"); + + b.Property("CreateTime") + .HasColumnType("datetime"); + + b.Property("ExpireTime") + .HasColumnType("datetime"); + + b.Property("MaxParticipant") + .HasColumnType("INTEGER"); + + b.Property("RequireTitle") + .HasColumnType("INTEGER"); + + b.Property("Share") + .HasColumnType("INTEGER"); + + b.HasKey("CompId"); + + b.ToTable("ChallengeCompeteData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteParticipantDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("IsActive") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "Baid"); + + b.HasIndex("Baid"); + + b.ToTable("ChallengeCompeteParticipantData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SongOpt") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "SongId"); + + b.ToTable("ChallengeCompeteSongData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Credential", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("Password") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Salt") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("Credential", (string)null); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("DanType") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(1); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "DanType"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("DanType") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(1); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "DanType", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Token", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("Id") + .HasColumnType("INTEGER"); + + b.Property("Count") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "Id"); + + b.ToTable("Tokens"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.Property("Baid") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("AiWinCount") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CurrentBody") + .HasColumnType("INTEGER"); + + b.Property("CurrentFace") + .HasColumnType("INTEGER"); + + b.Property("CurrentHead") + .HasColumnType("INTEGER"); + + b.Property("CurrentKigurumi") + .HasColumnType("INTEGER"); + + b.Property("CurrentPuchi") + .HasColumnType("INTEGER"); + + b.Property("DifficultyPlayedArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultyPlayedCourse") + .HasColumnType("INTEGER"); + + b.Property("DifficultyPlayedSort") + .HasColumnType("INTEGER"); + + b.Property("DifficultyPlayedStar") + .HasColumnType("INTEGER"); + + b.Property("DifficultySettingArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultySettingCourse") + .HasColumnType("INTEGER"); + + b.Property("DifficultySettingSort") + .HasColumnType("INTEGER"); + + b.Property("DifficultySettingStar") + .HasColumnType("INTEGER"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsAdmin") + .HasColumnType("INTEGER"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MyDonNameLanguage") + .HasColumnType("INTEGER"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedBody") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedFace") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedHead") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedKigurumi") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedPuchi") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedSongIdList") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Card", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteBestDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "UserData") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GameDatabase.Entities.ChallengeCompeteSongDatum", "ChallengeCompeteSongData") + .WithMany("BestScores") + .HasForeignKey("CompId", "SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteSongData"); + + b.Navigation("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteParticipantDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "UserData") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GameDatabase.Entities.ChallengeCompeteDatum", "ChallengeCompeteData") + .WithMany("Participants") + .HasForeignKey("CompId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteData"); + + b.Navigation("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.HasOne("GameDatabase.Entities.ChallengeCompeteDatum", "ChallengeCompeteData") + .WithMany("Songs") + .HasForeignKey("CompId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Credential", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId", "DanType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Token", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Datum") + .WithMany("Tokens") + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Datum"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteDatum", b => + { + b.Navigation("Participants"); + + b.Navigation("Songs"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.Navigation("BestScores"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.Navigation("Tokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20240910100030_AddChallengeCompete.cs b/GameDatabase/Migrations/20240910100030_AddChallengeCompete.cs new file mode 100644 index 00000000..09931063 --- /dev/null +++ b/GameDatabase/Migrations/20240910100030_AddChallengeCompete.cs @@ -0,0 +1,150 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace GameDatabase.Migrations +{ + /// + public partial class AddChallengeCompete : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "ChallengeCompeteData", + columns: table => new + { + CompId = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + CompeteMode = table.Column(type: "INTEGER", nullable: false), + Baid = table.Column(type: "INTEGER", nullable: false), + CompeteName = table.Column(type: "TEXT", nullable: false), + CompeteDescribe = table.Column(type: "TEXT", nullable: false), + MaxParticipant = table.Column(type: "INTEGER", nullable: false), + CreateTime = table.Column(type: "datetime", nullable: false), + ExpireTime = table.Column(type: "datetime", nullable: false), + RequireTitle = table.Column(type: "INTEGER", nullable: false), + Share = table.Column(type: "INTEGER", nullable: false), + CompeteTarget = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ChallengeCompeteData", x => x.CompId); + }); + + migrationBuilder.CreateTable( + name: "ChallengeCompeteParticipantData", + columns: table => new + { + CompId = table.Column(type: "INTEGER", nullable: false), + Baid = table.Column(type: "INTEGER", nullable: false), + IsActive = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ChallengeCompeteParticipantData", x => new { x.CompId, x.Baid }); + table.ForeignKey( + name: "FK_ChallengeCompeteParticipantData_ChallengeCompeteData_CompId", + column: x => x.CompId, + principalTable: "ChallengeCompeteData", + principalColumn: "CompId", + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ChallengeCompeteParticipantData_UserData_Baid", + column: x => x.Baid, + principalTable: "UserData", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ChallengeCompeteSongData", + columns: table => new + { + CompId = table.Column(type: "INTEGER", nullable: false), + SongId = table.Column(type: "INTEGER", nullable: false), + Difficulty = table.Column(type: "INTEGER", nullable: false), + SongOpt = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ChallengeCompeteSongData", x => new { x.CompId, x.SongId }); + table.ForeignKey( + name: "FK_ChallengeCompeteSongData_ChallengeCompeteData_CompId", + column: x => x.CompId, + principalTable: "ChallengeCompeteData", + principalColumn: "CompId", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateTable( + name: "ChallengeCompeteBestData", + columns: table => new + { + CompId = table.Column(type: "INTEGER", nullable: false), + Baid = table.Column(type: "INTEGER", nullable: false), + SongId = table.Column(type: "INTEGER", nullable: false), + Difficulty = table.Column(type: "INTEGER", nullable: false), + Crown = table.Column(type: "INTEGER", nullable: false), + Score = table.Column(type: "INTEGER", nullable: false), + ScoreRate = table.Column(type: "INTEGER", nullable: false), + ScoreRank = table.Column(type: "INTEGER", nullable: false), + GoodCount = table.Column(type: "INTEGER", nullable: false), + OkCount = table.Column(type: "INTEGER", nullable: false), + MissCount = table.Column(type: "INTEGER", nullable: false), + ComboCount = table.Column(type: "INTEGER", nullable: false), + HitCount = table.Column(type: "INTEGER", nullable: false), + DrumrollCount = table.Column(type: "INTEGER", nullable: false), + Skipped = table.Column(type: "INTEGER", nullable: false) + }, + constraints: table => + { + table.PrimaryKey("PK_ChallengeCompeteBestData", x => new { x.CompId, x.Baid, x.SongId }); + table.ForeignKey( + name: "FK_ChallengeCompeteBestData_ChallengeCompeteSongData_CompId_SongId", + columns: x => new { x.CompId, x.SongId }, + principalTable: "ChallengeCompeteSongData", + principalColumns: new[] { "CompId", "SongId" }, + onDelete: ReferentialAction.Cascade); + table.ForeignKey( + name: "FK_ChallengeCompeteBestData_UserData_Baid", + column: x => x.Baid, + principalTable: "UserData", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_ChallengeCompeteBestData_Baid", + table: "ChallengeCompeteBestData", + column: "Baid"); + + migrationBuilder.CreateIndex( + name: "IX_ChallengeCompeteBestData_CompId_SongId", + table: "ChallengeCompeteBestData", + columns: new[] { "CompId", "SongId" }); + + migrationBuilder.CreateIndex( + name: "IX_ChallengeCompeteParticipantData_Baid", + table: "ChallengeCompeteParticipantData", + column: "Baid"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ChallengeCompeteBestData"); + + migrationBuilder.DropTable( + name: "ChallengeCompeteParticipantData"); + + migrationBuilder.DropTable( + name: "ChallengeCompeteSongData"); + + migrationBuilder.DropTable( + name: "ChallengeCompeteData"); + } + } +} diff --git a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs index 8fa0e9fa..2e6165f7 100644 --- a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs +++ b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs @@ -91,6 +91,142 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("Card", (string)null); }); + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteBestDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "Baid", "SongId"); + + b.HasIndex("Baid"); + + b.HasIndex("CompId", "SongId"); + + b.ToTable("ChallengeCompeteBestData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteDatum", b => + { + b.Property("CompId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("CompeteDescribe") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CompeteMode") + .HasColumnType("INTEGER"); + + b.Property("CompeteName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CompeteTarget") + .HasColumnType("INTEGER"); + + b.Property("CreateTime") + .HasColumnType("datetime"); + + b.Property("ExpireTime") + .HasColumnType("datetime"); + + b.Property("MaxParticipant") + .HasColumnType("INTEGER"); + + b.Property("RequireTitle") + .HasColumnType("INTEGER"); + + b.Property("Share") + .HasColumnType("INTEGER"); + + b.HasKey("CompId"); + + b.ToTable("ChallengeCompeteData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteParticipantDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("IsActive") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "Baid"); + + b.HasIndex("Baid"); + + b.ToTable("ChallengeCompeteParticipantData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SongOpt") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "SongId"); + + b.ToTable("ChallengeCompeteSongData"); + }); + modelBuilder.Entity("GameDatabase.Entities.Credential", b => { b.Property("Baid") @@ -483,6 +619,55 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("Ba"); }); + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteBestDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "UserData") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GameDatabase.Entities.ChallengeCompeteSongDatum", "ChallengeCompeteSongData") + .WithMany("BestScores") + .HasForeignKey("CompId", "SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteSongData"); + + b.Navigation("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteParticipantDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "UserData") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GameDatabase.Entities.ChallengeCompeteDatum", "ChallengeCompeteData") + .WithMany("Participants") + .HasForeignKey("CompId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteData"); + + b.Navigation("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.HasOne("GameDatabase.Entities.ChallengeCompeteDatum", "ChallengeCompeteData") + .WithMany("Songs") + .HasForeignKey("CompId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteData"); + }); + modelBuilder.Entity("GameDatabase.Entities.Credential", b => { b.HasOne("GameDatabase.Entities.UserDatum", "Ba") @@ -554,6 +739,18 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Navigation("AiSectionScoreData"); }); + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteDatum", b => + { + b.Navigation("Participants"); + + b.Navigation("Songs"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.Navigation("BestScores"); + }); + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => { b.Navigation("DanStageScoreData"); diff --git a/SharedProject/Enums/CompeteModeType.cs b/SharedProject/Enums/CompeteModeType.cs new file mode 100644 index 00000000..fd286cb6 --- /dev/null +++ b/SharedProject/Enums/CompeteModeType.cs @@ -0,0 +1,9 @@ +namespace SharedProject.Enums; +public enum CompeteModeType : uint +{ + None = 0, + Chanllenge = 1, + Compete = 2, + OfficialCompete = 3 +} + diff --git a/SharedProject/Enums/CompeteTargetType.cs b/SharedProject/Enums/CompeteTargetType.cs new file mode 100644 index 00000000..1f9dc952 --- /dev/null +++ b/SharedProject/Enums/CompeteTargetType.cs @@ -0,0 +1,9 @@ +namespace SharedProject.Enums; + +public enum CompeteTargetType : uint +{ + EveryOne = 0, + Beginner = 1, + Superior = 2 +} + diff --git a/SharedProject/Enums/ShareType.cs b/SharedProject/Enums/ShareType.cs new file mode 100644 index 00000000..281a1764 --- /dev/null +++ b/SharedProject/Enums/ShareType.cs @@ -0,0 +1,7 @@ +namespace SharedProject.Enums; +public enum ShareType : uint +{ + EveryOne = 0, + FriendOnly = 1, + FriendAndFollower = 2 +} diff --git a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs new file mode 100644 index 00000000..4f282e20 --- /dev/null +++ b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs @@ -0,0 +1,63 @@ +using TaikoLocalServer.Filters; + +namespace TaikoLocalServer.Controllers.Api; + +[ApiController] +[Route("api/[controller]")] +public class ChallengeCompeteManageController(IChallengeCompeteService challengeCompeteService) : BaseController +{ + [HttpGet] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public ActionResult> GetAllChallengeCompete() + { + List datum = challengeCompeteService.GetAllChallengeCompete(); + + return Ok(datum); + } + + [HttpPost("{baid}/createCompete")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompeteInfo) + { + await challengeCompeteService.CreateCompete(baid, challengeCompeteInfo); + + return NoContent(); + } + + [HttpPost("{baid}/createChallenge/{targetBaid}")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteInfo challengeCompeteInfo) + { + await challengeCompeteService.CreateChallenge(baid, targetBaid, challengeCompeteInfo); + + return NoContent(); + } + + [HttpGet("{baid}/joinCompete/{compId}")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task> JoinCompete(uint baid, uint compId) + { + bool result = await challengeCompeteService.ParticipateCompete(compId, baid); + + return Ok(result); + } + + [HttpGet("{baid}/acceptChallenge/{compId}")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task> AcceptChallenge(uint baid, uint compId) + { + bool result = await challengeCompeteService.AnswerChallenge(compId, baid, true); + + return Ok(result); + } + + [HttpGet("{baid}/rejectChallenge/{compId}")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task> RejectChallenge(uint baid, uint compId) + { + bool result = await challengeCompeteService.AnswerChallenge(compId, baid, false); + + return Ok(result); + } + +} \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs b/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs index 62a8f84c..7324c93c 100644 --- a/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs +++ b/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs @@ -3,16 +3,14 @@ [ApiController] public class ChallengeCompetitionController : BaseController { - [HttpPost("/v12r08_ww/chassis/challengecompe.php")] + + [HttpPost("/v12r08_ww/chassis/challengecompe_mn4g8uq1.php")] [Produces("application/protobuf")] - public IActionResult HandleChallenge([FromBody] ChallengeCompeRequest request) + public async Task HandleChallenge([FromBody] ChallengeCompeRequest request) { Logger.LogInformation("ChallengeCompe request : {Request}", request.Stringify()); - var response = new ChallengeCompeResponse - { - Result = 1 - }; + var response = await Mediator.Send(new ChallengeCompeteQuery(request.Baid)); return Ok(response); } diff --git a/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs b/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs new file mode 100644 index 00000000..c0571c93 --- /dev/null +++ b/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs @@ -0,0 +1,65 @@ +using GameDatabase.Context; +using System.Buffers.Binary; + +namespace TaikoLocalServer.Handlers; + +public record ChallengeCompeteQuery(uint Baid) : IRequest; + +public class ChallengeCompeteQueryHandler(TaikoDbContext context, IChallengeCompeteService challengeCompeteService, ILogger logger) + : IRequestHandler +{ + + public async Task Handle(ChallengeCompeteQuery request, CancellationToken cancellationToken) + { + List competes = challengeCompeteService.GetInProgressChallengeCompete(request.Baid); + ChallengeCompeResponse response = new() + { + Result = 1 + }; + + foreach (var compete in competes) + { + ChallengeCompeResponse.CompeData compeData = new() + { + CompeId = compete.CompId + }; + foreach (var song in compete.Songs) + { + var songOptions = new byte[2]; + BinaryPrimitives.WriteInt16LittleEndian(songOptions, song.SongOpt); + + uint myHighScore = 0; + foreach (var bestScore in song.BestScores) + { + if (bestScore.Baid == request.Baid) + { + myHighScore = bestScore.Score; + } + } + + ChallengeCompeResponse.CompeData.TracksData tracksData = new() + { + SongNo = song.SongId, + Level = (uint) song.Difficulty, + OptionFlg = songOptions, + HighScore = myHighScore + }; + compeData.AryTrackStats.Add(tracksData); + } + switch (compete.CompeteMode) + { + case CompeteModeType.Chanllenge: + response.AryChallengeStats.Add(compeData); + break; + case CompeteModeType.Compete: + response.AryUserCompeStats.Add(compeData); + break; + case CompeteModeType.OfficialCompete: + response.AryBngCompeStats.Add(compeData); + break; + } + } + + return response; + } +} diff --git a/TaikoLocalServer/Handlers/UserDataQuery.cs b/TaikoLocalServer/Handlers/UserDataQuery.cs index 79723f6c..2cd688ef 100644 --- a/TaikoLocalServer/Handlers/UserDataQuery.cs +++ b/TaikoLocalServer/Handlers/UserDataQuery.cs @@ -1,12 +1,13 @@ using System.Buffers.Binary; using GameDatabase.Context; +using TaikoLocalServer.Services; using Throw; namespace TaikoLocalServer.Handlers; public record UserDataQuery(uint Baid) : IRequest; -public class UserDataQueryHandler(TaikoDbContext context, IGameDataService gameDataService, ILogger logger) +public class UserDataQueryHandler(TaikoDbContext context, IGameDataService gameDataService, IChallengeCompeteService challengeCompeteService, ILogger logger) : IRequestHandler { @@ -71,7 +72,9 @@ public async Task Handle(UserDataQuery request, Cancella difficultySettingArray[i] -= 1; } } - + + bool hasChallengeCompe = challengeCompeteService.HasChallengeCompete(request.Baid); + var response = new CommonUserDataResponse { Result = 1, @@ -92,7 +95,7 @@ public async Task Handle(UserDataQuery request, Cancella DifficultyPlayedStar = userData.DifficultyPlayedStar, DifficultyPlayedSort = userData.DifficultyPlayedSort, SongRecentCnt = (uint)recentSongs.Length, - IsChallengecompe = false, + IsChallengecompe = hasChallengeCompe, // TODO: Other fields }; diff --git a/TaikoLocalServer/Models/ChallengeCompeteInfo.cs b/TaikoLocalServer/Models/ChallengeCompeteInfo.cs new file mode 100644 index 00000000..d46391cf --- /dev/null +++ b/TaikoLocalServer/Models/ChallengeCompeteInfo.cs @@ -0,0 +1,33 @@ +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class ChallengeCompeteInfo +{ + [JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + [JsonPropertyName("desc")] + public string Desc { get; set; } = string.Empty; + + [JsonPropertyName("competeMode")] + public CompeteModeType CompeteMode { get; set; } + + [JsonPropertyName("maxParticipant")] + public uint MaxParticipant { get; set; } + + [JsonPropertyName("lastFor")] + public uint LastFor { get; set; } + + [JsonPropertyName("requiredTitle")] + public uint RequiredTitle { get; set; } + + [JsonPropertyName("shareType")] + public ShareType ShareType { get; set; } + + [JsonPropertyName("competeTargetType")] + public CompeteTargetType CompeteTargetType { get; set; } + + [JsonPropertyName("competeTargetType")] + public List challengeCompeteSongs { get; set; } = new(); +} diff --git a/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs b/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs new file mode 100644 index 00000000..f9953167 --- /dev/null +++ b/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs @@ -0,0 +1,16 @@ +using SharedProject.Models; +using System.Text.Json.Serialization; + +namespace TaikoLocalServer.Models; + +public class ChallengeCompeteSongInfo +{ + [JsonPropertyName("songId")] + public uint SongId { get; set; } + + [JsonPropertyName("difficulty")] + public Difficulty Difficulty { get; set; } + + [JsonPropertyName("playSetting")] + public PlaySetting PlaySetting { get; set; } = new(); +} diff --git a/TaikoLocalServer/Services/ChallengeCompeteService.cs b/TaikoLocalServer/Services/ChallengeCompeteService.cs new file mode 100644 index 00000000..3d9bb14b --- /dev/null +++ b/TaikoLocalServer/Services/ChallengeCompeteService.cs @@ -0,0 +1,174 @@ + +using GameDatabase.Context; +using SharedProject.Utils; +using Throw; + +namespace TaikoLocalServer.Services; + +public class ChallengeCompeteService : IChallengeCompeteService +{ + private readonly TaikoDbContext context; + public ChallengeCompeteService(TaikoDbContext context) + { + this.context = context; + } + + public bool HasChallengeCompete(uint baid) + { + return context.ChallengeCompeteData + .Include(c => c.Participants) + .Any(data => + data.CreateTime < DateTime.Now && + data.ExpireTime > DateTime.Now && + data.Participants.Any(participant => participant.Baid == baid && participant.IsActive) + ); + } + + public List GetInProgressChallengeCompete(uint baid) + { + return context.ChallengeCompeteData + .Include(c => c.Participants) + .Where(data => + data.CreateTime < DateTime.Now && + data.ExpireTime > DateTime.Now && + data.Participants.Any(participant => participant.Baid == baid) + ).ToList(); + } + + public List GetAllChallengeCompete() + { + return context.ChallengeCompeteData.Where(data => true).ToList(); + } + + public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompeteInfo) + { + ChallengeCompeteDatum challengeCompeteData = new() + { + CompId = context.ChallengeCompeteData.Any() ? context.ChallengeCompeteData.AsEnumerable().Max(c => c.CompId) + 1 : 1, + CompeteMode = challengeCompeteInfo.CompeteMode, + Baid = baid, + CompeteName = challengeCompeteInfo.Name, + CompeteDescribe = challengeCompeteInfo.Desc, + MaxParticipant = challengeCompeteInfo.MaxParticipant, + CreateTime = DateTime.Now, + ExpireTime = DateTime.Now.AddDays(challengeCompeteInfo.LastFor), + RequireTitle = challengeCompeteInfo.RequiredTitle, + Share = challengeCompeteInfo.ShareType, + CompeteTarget = challengeCompeteInfo.CompeteTargetType + }; + await context.AddAsync(challengeCompeteData); + foreach (var song in challengeCompeteInfo.challengeCompeteSongs) + { + ChallengeCompeteSongDatum challengeCompeteSongData = new() + { + CompId = challengeCompeteData.CompId, + SongId = song.SongId, + Difficulty = song.Difficulty, + SongOpt = PlaySettingConverter.PlaySettingToShort(song.PlaySetting) + }; + await context.AddAsync(challengeCompeteSongData); + } + ChallengeCompeteParticipantDatum participantDatum = new() + { + CompId = challengeCompeteData.CompId, + Baid = baid, + IsActive = true + }; + await context.AddAsync(participantDatum); + } + + public async Task ParticipateCompete(uint compId, uint baid) + { + var challengeCompete = await context.ChallengeCompeteData.FindAsync(compId); + challengeCompete.ThrowIfNull($"Challenge not found for CompId {compId}!"); + + if (challengeCompete.MaxParticipant <= challengeCompete.Participants.Count()) return false; + foreach (var participant in challengeCompete.Participants) + { + if (participant.Baid == baid) return false; + } + + ChallengeCompeteParticipantDatum participantDatum = new() + { + CompId = challengeCompete.CompId, + Baid = baid, + IsActive = true, + }; + await context.AddAsync(participantDatum); + + return true; + } + + public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteInfo challengeCompeteInfo) + { + ChallengeCompeteDatum challengeCompeteData = new() + { + CompId = context.ChallengeCompeteData.Any() ? context.ChallengeCompeteData.AsEnumerable().Max(c => c.CompId) + 1 : 1, + CompeteMode = challengeCompeteInfo.CompeteMode, + Baid = baid, + CompeteName = challengeCompeteInfo.Name, + CompeteDescribe = challengeCompeteInfo.Desc, + MaxParticipant = challengeCompeteInfo.MaxParticipant, + CreateTime = DateTime.Now, + ExpireTime = DateTime.Now.AddDays(challengeCompeteInfo.LastFor), + RequireTitle = challengeCompeteInfo.RequiredTitle, + Share = challengeCompeteInfo.ShareType, + CompeteTarget = challengeCompeteInfo.CompeteTargetType + }; + await context.AddAsync(challengeCompeteData); + foreach (var song in challengeCompeteInfo.challengeCompeteSongs) + { + ChallengeCompeteSongDatum challengeCompeteSongData = new() + { + CompId = challengeCompeteData.CompId, + SongId = song.SongId, + Difficulty = song.Difficulty, + SongOpt = PlaySettingConverter.PlaySettingToShort(song.PlaySetting) + }; + await context.AddAsync(challengeCompeteSongData); + } + ChallengeCompeteParticipantDatum participantDatum = new() + { + CompId = challengeCompeteData.CompId, + Baid = baid, + IsActive = false + }; + await context.AddAsync(participantDatum); + ChallengeCompeteParticipantDatum targetDatum = new() + { + CompId = challengeCompeteData.CompId, + Baid = targetBaid, + IsActive = false + }; + await context.AddAsync(targetDatum); + } + + public async Task AnswerChallenge(uint compId, uint baid, bool accept) + { + var challengeCompete = await context.ChallengeCompeteData.FindAsync(compId); + challengeCompete.ThrowIfNull($"Challenge not found for CompId {compId}!"); + + if (challengeCompete.Baid == baid) return false; + bool hasTarget = false; + foreach (var participant in challengeCompete.Participants) + { + if (participant.Baid == baid) hasTarget = true; + } + if (!hasTarget) return false; + + if (accept) + { + foreach (var participant in challengeCompete.Participants) + { + participant.IsActive = true; + context.Update(participant); + } + } + else + { + context.Remove(challengeCompete); + } + + return true; + } +} diff --git a/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs b/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs new file mode 100644 index 00000000..7e7d866c --- /dev/null +++ b/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs @@ -0,0 +1,18 @@ +namespace TaikoLocalServer.Services.Interfaces; + +public interface IChallengeCompeteService +{ + public bool HasChallengeCompete(uint baid); + + public List GetInProgressChallengeCompete(uint baid); + + public List GetAllChallengeCompete(); + + public Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompeteInfo); + + public Task ParticipateCompete(uint compId, uint baid); + + public Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteInfo challengeCompeteInfo); + + public Task AnswerChallenge(uint compId, uint baid, bool accept); +} From e545598c1cf2698906f1c4d78b46c4379ba68842 Mon Sep 17 00:00:00 2001 From: ptmaster Date: Wed, 11 Sep 2024 09:52:16 +0800 Subject: [PATCH 02/15] ChallengeCompete SaveScore --- .../Handlers/UpdatePlayResultCommand.cs | 7 ++- .../Services/ChallengeCompeteService.cs | 54 +++++++++++++++++++ .../Services/Extentions/ServiceExtensions.cs | 1 + .../Interfaces/IChallengeCompeteService.cs | 2 + 4 files changed, 63 insertions(+), 1 deletion(-) diff --git a/TaikoLocalServer/Handlers/UpdatePlayResultCommand.cs b/TaikoLocalServer/Handlers/UpdatePlayResultCommand.cs index 1f89d184..68b5af73 100644 --- a/TaikoLocalServer/Handlers/UpdatePlayResultCommand.cs +++ b/TaikoLocalServer/Handlers/UpdatePlayResultCommand.cs @@ -5,7 +5,7 @@ namespace TaikoLocalServer.Handlers; public record UpdatePlayResultCommand(uint Baid, CommonPlayResultData PlayResultData) : IRequest; -public class UpdatePlayResultCommandHandler(TaikoDbContext context, ILogger logger) +public class UpdatePlayResultCommandHandler(TaikoDbContext context, IChallengeCompeteService challengeCompeteService, ILogger logger) : IRequestHandler { public async Task Handle(UpdatePlayResultCommand request, CancellationToken cancellationToken) @@ -116,6 +116,11 @@ public async Task Handle(UpdatePlayResultCommand request, CancellationToke Difficulty = (Difficulty)stageData.Level }; context.SongPlayData.Add(songPlayDatum); + + + byte[] option = stageData.OptionFlg; + short optionVal = (short)(option[0] + (option[1]) << 8); + await challengeCompeteService.UpdateBestScore(songPlayDatum.Baid, songPlayDatum, optionVal); } await context.SaveChangesAsync(cancellationToken); diff --git a/TaikoLocalServer/Services/ChallengeCompeteService.cs b/TaikoLocalServer/Services/ChallengeCompeteService.cs index 3d9bb14b..1afa9a2a 100644 --- a/TaikoLocalServer/Services/ChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/ChallengeCompeteService.cs @@ -171,4 +171,58 @@ public async Task AnswerChallenge(uint compId, uint baid, bool accept) return true; } + + public async Task UpdateBestScore(uint baid, SongPlayDatum playData, short option) + { + List challengeCompetes = context.ChallengeCompeteData + .Include(e => e.Songs) + .Include(e => e.Participants) + .Where(e => e.CreateTime < DateTime.Now && DateTime.Now < e.ExpireTime) + .Where(e => e.Participants.Any(d => d.Baid == baid && d.IsActive)) + .Where(e => e.Songs.Any(d => d.SongId == playData.SongId && d.SongOpt == option)) + .ToList(); + foreach (var challengeCompete in challengeCompetes) + { + ChallengeCompeteSongDatum? song = challengeCompete.Songs.Find(e => e.SongId == playData.SongId); + if (song == null || song.Difficulty != playData.Difficulty) continue; + + ChallengeCompeteBestDatum? bestScore = song.BestScores.Find(e => e.Baid == baid); + if (bestScore == null) + { + await context.AddAsync(new ChallengeCompeteBestDatum + { + CompId = song.CompId, + Baid = baid, + SongId = song.SongId, + Difficulty = song.Difficulty, + Crown = playData.Crown, + Score = playData.Score, + ScoreRate = playData.ScoreRate, + ScoreRank = playData.ScoreRank, + GoodCount = playData.GoodCount, + OkCount = playData.OkCount, + MissCount = playData.MissCount, + ComboCount = playData.ComboCount, + HitCount = playData.HitCount, + DrumrollCount = playData.DrumrollCount, + Skipped = playData.Skipped + }); + } + else if (bestScore.Score < playData.Score) + { + bestScore.Crown = playData.Crown; + bestScore.Score = playData.Score; + bestScore.ScoreRate = playData.ScoreRate; + bestScore.ScoreRank = playData.ScoreRank; + bestScore.GoodCount = playData.GoodCount; + bestScore.OkCount = playData.OkCount; + bestScore.MissCount = playData.MissCount; + bestScore.ComboCount = playData.ComboCount; + bestScore.HitCount = playData.HitCount; + bestScore.DrumrollCount = playData.DrumrollCount; + bestScore.Skipped = playData.Skipped; + context.Update(bestScore); + } + } + } } diff --git a/TaikoLocalServer/Services/Extentions/ServiceExtensions.cs b/TaikoLocalServer/Services/Extentions/ServiceExtensions.cs index 578fbca2..f6f28132 100644 --- a/TaikoLocalServer/Services/Extentions/ServiceExtensions.cs +++ b/TaikoLocalServer/Services/Extentions/ServiceExtensions.cs @@ -9,6 +9,7 @@ public static IServiceCollection AddTaikoDbServices(this IServiceCollection serv services.AddScoped(); services.AddScoped(); services.AddScoped(); + services.AddScoped(); return services; } diff --git a/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs b/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs index 7e7d866c..92d4a82a 100644 --- a/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs @@ -15,4 +15,6 @@ public interface IChallengeCompeteService public Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteInfo challengeCompeteInfo); public Task AnswerChallenge(uint compId, uint baid, bool accept); + + public Task UpdateBestScore(uint baid, SongPlayDatum playData, short option); } From d755d6edd51d0a83b7335188a0cdb952607d514c Mon Sep 17 00:00:00 2001 From: ptmaster Date: Wed, 11 Sep 2024 22:17:17 +0800 Subject: [PATCH 03/15] Change Db Structure & Add OnlyPlayOnce & Add CompeteState & Compete Option can be null --- .../Entities/ChallengeCompeteDatum.cs | 2 + .../Entities/ChallengeCompeteSongDatum.cs | 5 +- ...1133119_AddChallengeCompetion.Designer.cs} | 21 +++++- ...> 20240911133119_AddChallengeCompetion.cs} | 9 ++- .../Migrations/TaikoDbContextModelSnapshot.cs | 17 ++++- SharedProject/Enums/CompeteState.cs | 10 +++ .../Api/ChallengeCompeteManageController.cs | 50 ++++++++++++++ .../Handlers/ChallengeCompeteQuery.cs | 10 ++- .../Models/ChallengeCompeteInfo.cs | 3 + .../Models/ChallengeCompeteSongInfo.cs | 13 +++- .../Services/ChallengeCompeteService.cs | 67 +++++++++++++++---- 11 files changed, 185 insertions(+), 22 deletions(-) rename GameDatabase/Migrations/{20240910100030_AddChallengeCompete.Designer.cs => 20240911133119_AddChallengeCompetion.Designer.cs} (97%) rename GameDatabase/Migrations/{20240910100030_AddChallengeCompete.cs => 20240911133119_AddChallengeCompetion.cs} (92%) create mode 100644 SharedProject/Enums/CompeteState.cs diff --git a/GameDatabase/Entities/ChallengeCompeteDatum.cs b/GameDatabase/Entities/ChallengeCompeteDatum.cs index a8cea9c7..a5f8aac1 100644 --- a/GameDatabase/Entities/ChallengeCompeteDatum.cs +++ b/GameDatabase/Entities/ChallengeCompeteDatum.cs @@ -6,6 +6,7 @@ public partial class ChallengeCompeteDatum { public uint CompId { get; set; } public CompeteModeType CompeteMode { get; set; } = CompeteModeType.None; + public CompeteState State { get; set; } = CompeteState.Normal; public uint Baid { get; set; } public string CompeteName { get; set; } = String.Empty; public string CompeteDescribe { get; set; } = String.Empty; @@ -13,6 +14,7 @@ public partial class ChallengeCompeteDatum public DateTime CreateTime { get; set; } public DateTime ExpireTime { get; set; } public uint RequireTitle { get; set; } = 0; + public bool OnlyPlayOnce { get; set; } = false; public ShareType Share { get; set; } = ShareType.EveryOne; public CompeteTargetType CompeteTarget { get; set; } = CompeteTargetType.EveryOne; public List Songs { get; set; } = new(); diff --git a/GameDatabase/Entities/ChallengeCompeteSongDatum.cs b/GameDatabase/Entities/ChallengeCompeteSongDatum.cs index 846c9094..3a9310ec 100644 --- a/GameDatabase/Entities/ChallengeCompeteSongDatum.cs +++ b/GameDatabase/Entities/ChallengeCompeteSongDatum.cs @@ -7,7 +7,10 @@ public partial class ChallengeCompeteSongDatum public uint CompId { get; set; } public uint SongId { get; set; } public Difficulty Difficulty { get; set; } - public short SongOpt { get; set; } + public uint? Speed { get; set; } = null; + public bool? IsVanishOn { get; set; } = null; + public bool? IsInverseOn { get; set; } = null; + public RandomType? RandomType { get; set; } = null; public List BestScores { get; set; } = new(); public virtual ChallengeCompeteDatum? ChallengeCompeteData { get; set; } } diff --git a/GameDatabase/Migrations/20240910100030_AddChallengeCompete.Designer.cs b/GameDatabase/Migrations/20240911133119_AddChallengeCompetion.Designer.cs similarity index 97% rename from GameDatabase/Migrations/20240910100030_AddChallengeCompete.Designer.cs rename to GameDatabase/Migrations/20240911133119_AddChallengeCompetion.Designer.cs index 7d504f4e..7d1c8c02 100644 --- a/GameDatabase/Migrations/20240910100030_AddChallengeCompete.Designer.cs +++ b/GameDatabase/Migrations/20240911133119_AddChallengeCompetion.Designer.cs @@ -11,8 +11,8 @@ namespace GameDatabase.Migrations { [DbContext(typeof(TaikoDbContext))] - [Migration("20240910100030_AddChallengeCompete")] - partial class AddChallengeCompete + [Migration("20240911133119_AddChallengeCompetion")] + partial class AddChallengeCompetion { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) @@ -182,12 +182,18 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("MaxParticipant") .HasColumnType("INTEGER"); + b.Property("OnlyPlayOnce") + .HasColumnType("INTEGER"); + b.Property("RequireTitle") .HasColumnType("INTEGER"); b.Property("Share") .HasColumnType("INTEGER"); + b.Property("State") + .HasColumnType("INTEGER"); + b.HasKey("CompId"); b.ToTable("ChallengeCompeteData"); @@ -222,7 +228,16 @@ protected override void BuildTargetModel(ModelBuilder modelBuilder) b.Property("Difficulty") .HasColumnType("INTEGER"); - b.Property("SongOpt") + b.Property("IsInverseOn") + .HasColumnType("INTEGER"); + + b.Property("IsVanishOn") + .HasColumnType("INTEGER"); + + b.Property("RandomType") + .HasColumnType("INTEGER"); + + b.Property("Speed") .HasColumnType("INTEGER"); b.HasKey("CompId", "SongId"); diff --git a/GameDatabase/Migrations/20240910100030_AddChallengeCompete.cs b/GameDatabase/Migrations/20240911133119_AddChallengeCompetion.cs similarity index 92% rename from GameDatabase/Migrations/20240910100030_AddChallengeCompete.cs rename to GameDatabase/Migrations/20240911133119_AddChallengeCompetion.cs index 09931063..207fa239 100644 --- a/GameDatabase/Migrations/20240910100030_AddChallengeCompete.cs +++ b/GameDatabase/Migrations/20240911133119_AddChallengeCompetion.cs @@ -6,7 +6,7 @@ namespace GameDatabase.Migrations { /// - public partial class AddChallengeCompete : Migration + public partial class AddChallengeCompetion : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -18,6 +18,7 @@ protected override void Up(MigrationBuilder migrationBuilder) CompId = table.Column(type: "INTEGER", nullable: false) .Annotation("Sqlite:Autoincrement", true), CompeteMode = table.Column(type: "INTEGER", nullable: false), + State = table.Column(type: "INTEGER", nullable: false), Baid = table.Column(type: "INTEGER", nullable: false), CompeteName = table.Column(type: "TEXT", nullable: false), CompeteDescribe = table.Column(type: "TEXT", nullable: false), @@ -25,6 +26,7 @@ protected override void Up(MigrationBuilder migrationBuilder) CreateTime = table.Column(type: "datetime", nullable: false), ExpireTime = table.Column(type: "datetime", nullable: false), RequireTitle = table.Column(type: "INTEGER", nullable: false), + OnlyPlayOnce = table.Column(type: "INTEGER", nullable: false), Share = table.Column(type: "INTEGER", nullable: false), CompeteTarget = table.Column(type: "INTEGER", nullable: false) }, @@ -65,7 +67,10 @@ protected override void Up(MigrationBuilder migrationBuilder) CompId = table.Column(type: "INTEGER", nullable: false), SongId = table.Column(type: "INTEGER", nullable: false), Difficulty = table.Column(type: "INTEGER", nullable: false), - SongOpt = table.Column(type: "INTEGER", nullable: false) + Speed = table.Column(type: "INTEGER", nullable: true), + IsVanishOn = table.Column(type: "INTEGER", nullable: true), + IsInverseOn = table.Column(type: "INTEGER", nullable: true), + RandomType = table.Column(type: "INTEGER", nullable: true) }, constraints: table => { diff --git a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs index 2e6165f7..468c03f2 100644 --- a/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs +++ b/GameDatabase/Migrations/TaikoDbContextModelSnapshot.cs @@ -179,12 +179,18 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("MaxParticipant") .HasColumnType("INTEGER"); + b.Property("OnlyPlayOnce") + .HasColumnType("INTEGER"); + b.Property("RequireTitle") .HasColumnType("INTEGER"); b.Property("Share") .HasColumnType("INTEGER"); + b.Property("State") + .HasColumnType("INTEGER"); + b.HasKey("CompId"); b.ToTable("ChallengeCompeteData"); @@ -219,7 +225,16 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.Property("Difficulty") .HasColumnType("INTEGER"); - b.Property("SongOpt") + b.Property("IsInverseOn") + .HasColumnType("INTEGER"); + + b.Property("IsVanishOn") + .HasColumnType("INTEGER"); + + b.Property("RandomType") + .HasColumnType("INTEGER"); + + b.Property("Speed") .HasColumnType("INTEGER"); b.HasKey("CompId", "SongId"); diff --git a/SharedProject/Enums/CompeteState.cs b/SharedProject/Enums/CompeteState.cs new file mode 100644 index 00000000..e70bdd8a --- /dev/null +++ b/SharedProject/Enums/CompeteState.cs @@ -0,0 +1,10 @@ +namespace SharedProject.Enums; + +public enum CompeteState : uint +{ + Disabled = 0, + Normal = 1, // In Progress + Waiting = 2, // Waiting for Answer + Finished = 3, // Finished Once Compete + Rejected = 4 // Rejected Challenge +} diff --git a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs index 4f282e20..e84562aa 100644 --- a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs +++ b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs @@ -11,10 +11,60 @@ public class ChallengeCompeteManageController(IChallengeCompeteService challenge public ActionResult> GetAllChallengeCompete() { List datum = challengeCompeteService.GetAllChallengeCompete(); + foreach (var data in datum) + { + foreach (var participant in data.Participants) + { + participant.ChallengeCompeteData = null; + } + foreach (var song in data.Songs) + { + song.ChallengeCompeteData = null; + foreach (var bestScore in song.BestScores) + { + bestScore.ChallengeCompeteSongData = null; + } + } + } return Ok(datum); } + [HttpGet("test/{mode}")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public ActionResult> testCreateCompete(uint mode) + { + ChallengeCompeteInfo info = new() + { + Name = "测试数据", + Desc = "测试数据描述", + CompeteMode = (CompeteModeType)mode, + MaxParticipant = 100, + LastFor = 365, + RequiredTitle = 0, + ShareType = ShareType.EveryOne, + CompeteTargetType = CompeteTargetType.EveryOne, + challengeCompeteSongs = [ + new() { + SongId = 1, + Difficulty = Difficulty.Oni, + RandomType = RandomType.Messy + }, + new() { + SongId = 2, + Difficulty = Difficulty.Oni, + }, + new() { + SongId = 3, + Difficulty = Difficulty.Oni, + }, + ] + }; + challengeCompeteService.CreateCompete(1, info); + + return NoContent(); + } + [HttpPost("{baid}/createCompete")] [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompeteInfo) diff --git a/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs b/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs index c0571c93..565d51ad 100644 --- a/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs +++ b/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs @@ -1,4 +1,5 @@ using GameDatabase.Context; +using SharedProject.Utils; using System.Buffers.Binary; namespace TaikoLocalServer.Handlers; @@ -26,7 +27,14 @@ public async Task Handle(ChallengeCompeteQuery request, foreach (var song in compete.Songs) { var songOptions = new byte[2]; - BinaryPrimitives.WriteInt16LittleEndian(songOptions, song.SongOpt); + short songOpt = PlaySettingConverter.PlaySettingToShort(new() + { + Speed = song.Speed != null ? (uint)song.Speed : 0, + IsVanishOn = song.IsVanishOn != null ? (bool)song.IsVanishOn : false, + IsInverseOn = song.IsInverseOn != null ? (bool)song.IsInverseOn : false, + RandomType = song.RandomType != null ? (RandomType)song.RandomType : RandomType.None, + }); + BinaryPrimitives.WriteInt16LittleEndian(songOptions, songOpt); uint myHighScore = 0; foreach (var bestScore in song.BestScores) diff --git a/TaikoLocalServer/Models/ChallengeCompeteInfo.cs b/TaikoLocalServer/Models/ChallengeCompeteInfo.cs index d46391cf..f32e3c38 100644 --- a/TaikoLocalServer/Models/ChallengeCompeteInfo.cs +++ b/TaikoLocalServer/Models/ChallengeCompeteInfo.cs @@ -16,6 +16,9 @@ public class ChallengeCompeteInfo [JsonPropertyName("maxParticipant")] public uint MaxParticipant { get; set; } + [JsonPropertyName("onlyPlayOnce")] + public bool OnlyPlayOnce { get; set; } + [JsonPropertyName("lastFor")] public uint LastFor { get; set; } diff --git a/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs b/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs index f9953167..96958962 100644 --- a/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs +++ b/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs @@ -11,6 +11,15 @@ public class ChallengeCompeteSongInfo [JsonPropertyName("difficulty")] public Difficulty Difficulty { get; set; } - [JsonPropertyName("playSetting")] - public PlaySetting PlaySetting { get; set; } = new(); + [JsonPropertyName("speed")] + public uint? Speed { get; set; } = null; + + [JsonPropertyName("isVanishOn")] + public bool? IsVanishOn { get; set; } = null; + + [JsonPropertyName("isInverseOn")] + public bool? IsInverseOn { get; set; } = null; + + [JsonPropertyName("randomType")] + public RandomType? RandomType { get; set; } = null; } diff --git a/TaikoLocalServer/Services/ChallengeCompeteService.cs b/TaikoLocalServer/Services/ChallengeCompeteService.cs index 1afa9a2a..95647a61 100644 --- a/TaikoLocalServer/Services/ChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/ChallengeCompeteService.cs @@ -1,5 +1,6 @@  using GameDatabase.Context; +using SharedProject.Models; using SharedProject.Utils; using Throw; @@ -17,10 +18,17 @@ public bool HasChallengeCompete(uint baid) { return context.ChallengeCompeteData .Include(c => c.Participants) + .Include(c => c.Songs) + .ThenInclude(s => s.BestScores) .Any(data => + data.State == CompeteState.Normal && data.CreateTime < DateTime.Now && data.ExpireTime > DateTime.Now && - data.Participants.Any(participant => participant.Baid == baid && participant.IsActive) + data.Participants.Any(participant => participant.Baid == baid && participant.IsActive) && + ( + // Only Play Once need there is no Score for current Compete + !data.OnlyPlayOnce || data.Songs.Any(song => !song.BestScores.Any(s => s.Baid == baid)) + ) ); } @@ -28,16 +36,27 @@ public List GetInProgressChallengeCompete(uint baid) { return context.ChallengeCompeteData .Include(c => c.Participants) + .Include(c => c.Songs) + .ThenInclude(s => s.BestScores) .Where(data => + data.State == CompeteState.Normal && data.CreateTime < DateTime.Now && data.ExpireTime > DateTime.Now && - data.Participants.Any(participant => participant.Baid == baid) + data.Participants.Any(participant => participant.Baid == baid && participant.IsActive) && + ( + // Only Play Once need there is no Score for current Compete + !data.OnlyPlayOnce || data.Songs.Any(song => !song.BestScores.Any(s => s.Baid == baid)) + ) ).ToList(); } public List GetAllChallengeCompete() { - return context.ChallengeCompeteData.Where(data => true).ToList(); + return context.ChallengeCompeteData + .Include(c => c.Participants) + .Include(c => c.Songs) + .ThenInclude(s => s.BestScores) + .Where(data => true).ToList(); } public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompeteInfo) @@ -46,10 +65,12 @@ public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompete { CompId = context.ChallengeCompeteData.Any() ? context.ChallengeCompeteData.AsEnumerable().Max(c => c.CompId) + 1 : 1, CompeteMode = challengeCompeteInfo.CompeteMode, + State = CompeteState.Normal, Baid = baid, CompeteName = challengeCompeteInfo.Name, CompeteDescribe = challengeCompeteInfo.Desc, MaxParticipant = challengeCompeteInfo.MaxParticipant, + OnlyPlayOnce = challengeCompeteInfo.OnlyPlayOnce, CreateTime = DateTime.Now, ExpireTime = DateTime.Now.AddDays(challengeCompeteInfo.LastFor), RequireTitle = challengeCompeteInfo.RequiredTitle, @@ -64,7 +85,10 @@ public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompete CompId = challengeCompeteData.CompId, SongId = song.SongId, Difficulty = song.Difficulty, - SongOpt = PlaySettingConverter.PlaySettingToShort(song.PlaySetting) + Speed = song.Speed, + IsInverseOn = song.IsInverseOn, + IsVanishOn = song.IsVanishOn, + RandomType = song.RandomType }; await context.AddAsync(challengeCompeteSongData); } @@ -75,6 +99,7 @@ public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompete IsActive = true }; await context.AddAsync(participantDatum); + await context.SaveChangesAsync(); } public async Task ParticipateCompete(uint compId, uint baid) @@ -95,6 +120,7 @@ public async Task ParticipateCompete(uint compId, uint baid) IsActive = true, }; await context.AddAsync(participantDatum); + await context.SaveChangesAsync(); return true; } @@ -104,11 +130,13 @@ public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteIn ChallengeCompeteDatum challengeCompeteData = new() { CompId = context.ChallengeCompeteData.Any() ? context.ChallengeCompeteData.AsEnumerable().Max(c => c.CompId) + 1 : 1, - CompeteMode = challengeCompeteInfo.CompeteMode, + CompeteMode = CompeteModeType.Chanllenge, + State = CompeteState.Waiting, Baid = baid, CompeteName = challengeCompeteInfo.Name, CompeteDescribe = challengeCompeteInfo.Desc, - MaxParticipant = challengeCompeteInfo.MaxParticipant, + MaxParticipant = 2, + OnlyPlayOnce = challengeCompeteInfo.OnlyPlayOnce, CreateTime = DateTime.Now, ExpireTime = DateTime.Now.AddDays(challengeCompeteInfo.LastFor), RequireTitle = challengeCompeteInfo.RequiredTitle, @@ -123,7 +151,10 @@ public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteIn CompId = challengeCompeteData.CompId, SongId = song.SongId, Difficulty = song.Difficulty, - SongOpt = PlaySettingConverter.PlaySettingToShort(song.PlaySetting) + Speed = song.Speed, + IsInverseOn = song.IsInverseOn, + IsVanishOn = song.IsVanishOn, + RandomType = song.RandomType }; await context.AddAsync(challengeCompeteSongData); } @@ -141,6 +172,7 @@ public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteIn IsActive = false }; await context.AddAsync(targetDatum); + await context.SaveChangesAsync(); } public async Task AnswerChallenge(uint compId, uint baid, bool accept) @@ -158,6 +190,7 @@ public async Task AnswerChallenge(uint compId, uint baid, bool accept) if (accept) { + challengeCompete.State = CompeteState.Normal; foreach (var participant in challengeCompete.Participants) { participant.IsActive = true; @@ -166,8 +199,10 @@ public async Task AnswerChallenge(uint compId, uint baid, bool accept) } else { - context.Remove(challengeCompete); + challengeCompete.State = CompeteState.Rejected; } + context.Update(challengeCompete); + await context.SaveChangesAsync(); return true; } @@ -176,15 +211,22 @@ public async Task UpdateBestScore(uint baid, SongPlayDatum playData, short optio { List challengeCompetes = context.ChallengeCompeteData .Include(e => e.Songs) + .ThenInclude(s => s.BestScores) .Include(e => e.Participants) .Where(e => e.CreateTime < DateTime.Now && DateTime.Now < e.ExpireTime) .Where(e => e.Participants.Any(d => d.Baid == baid && d.IsActive)) - .Where(e => e.Songs.Any(d => d.SongId == playData.SongId && d.SongOpt == option)) + .Where(e => e.Songs.Any(d => d.SongId == playData.SongId && d.Difficulty == playData.Difficulty)) + .Where(e => !e.OnlyPlayOnce || e.Songs.Any(song => !song.BestScores.Any(s => s.Baid == baid))) .ToList(); + PlaySetting setting = PlaySettingConverter.ShortToPlaySetting(option); foreach (var challengeCompete in challengeCompetes) { - ChallengeCompeteSongDatum? song = challengeCompete.Songs.Find(e => e.SongId == playData.SongId); - if (song == null || song.Difficulty != playData.Difficulty) continue; + ChallengeCompeteSongDatum? song = challengeCompete.Songs.Find(e => e.SongId == playData.SongId && e.Difficulty == playData.Difficulty); + if (song == null) continue; + if (song.Speed != null && song.Speed != setting.Speed) continue; + if (song.IsVanishOn != null && song.IsVanishOn != setting.IsVanishOn) continue; + if (song.IsInverseOn != null && song.IsInverseOn != setting.IsInverseOn) continue; + if (song.RandomType != null && song.RandomType != setting.RandomType) continue; ChallengeCompeteBestDatum? bestScore = song.BestScores.Find(e => e.Baid == baid); if (bestScore == null) @@ -208,7 +250,7 @@ await context.AddAsync(new ChallengeCompeteBestDatum Skipped = playData.Skipped }); } - else if (bestScore.Score < playData.Score) + else if (!challengeCompete.OnlyPlayOnce && bestScore.Score < playData.Score) { bestScore.Crown = playData.Crown; bestScore.Score = playData.Score; @@ -224,5 +266,6 @@ await context.AddAsync(new ChallengeCompeteBestDatum context.Update(bestScore); } } + await context.AddRangeAsync(); } } From 9bb363e1b8303d183f6773647e7c39556a16a092 Mon Sep 17 00:00:00 2001 From: ptmaster Date: Sun, 15 Sep 2024 22:56:28 +0800 Subject: [PATCH 04/15] Add Compete Dialog --- .../Models/ChallengeCompeteCreateInfo.cs | 37 + .../Models/ChallengeCompeteCreateSongInfo.cs | 24 + SharedProject/Models/ChallengeCompetition.cs | 22 + .../Models/ChallengeCompetitionBestScore.cs | 23 + .../Models/ChallengeCompetitionParticipant.cs | 8 + .../Models/ChallengeCompetitionSong.cs | 16 + .../Models/Requests/AnswerChallengeRequest.cs | 8 + .../Responses/ChallengeCompetitionResponse.cs | 10 + SharedProject/Models/SongInfo.cs | 11 + SharedProject/Models/UserAppearance.cs | 18 + .../Api/ChallengeCompeteManageController.cs | 72 +- .../Game/ChallengeCompetitionController.cs | 15 +- .../Handlers/ChallengeCompeteQuery.cs | 16 +- TaikoLocalServer/Handlers/UserDataQuery.cs | 2 +- .../Mappers/ChallengeCompeMappers.cs | 12 + .../CommonChallengeCompeRequest.cs | 8 + .../CommonChallengeCompeResponse.cs | 23 + .../Models/ChallengeCompeteSongInfo.cs | 3 +- .../Services/ChallengeCompeteService.cs | 154 ++- .../Interfaces/IChallengeCompeteService.cs | 19 +- TaikoLocalServer/TaikoLocalServer.csproj | 60 +- TaikoWebUI/Components/ChallengeCompe.razor | 100 ++ .../Components/ChallengeCompeteGrid.razor | 194 +++ TaikoWebUI/Components/NavMenu.razor | 8 + .../LocalizationResource.Designer.cs | 1040 ++++++++++++--- .../LocalizationResource.en-US.resx | 1136 ++++++++-------- .../LocalizationResource.fr-FR.resx | 897 +++++++------ .../Localization/LocalizationResource.ja.resx | 1136 ++++++++-------- .../Localization/LocalizationResource.resx | 1159 ++++++++++------- .../LocalizationResource.zh-Hans.resx | 1142 ++++++++-------- .../LocalizationResource.zh-Hant.resx | 1142 ++++++++-------- TaikoWebUI/Pages/Challenge.razor | 10 + TaikoWebUI/Pages/Compete.razor | 10 + .../AddChallengeCompetitionDialog.razor | 255 ++++ .../Pages/Dialogs/ChooseSongDialog.razor | 138 ++ TaikoWebUI/Pages/OfficialCompete.razor | 10 + 36 files changed, 5526 insertions(+), 3412 deletions(-) create mode 100644 SharedProject/Models/ChallengeCompeteCreateInfo.cs create mode 100644 SharedProject/Models/ChallengeCompeteCreateSongInfo.cs create mode 100644 SharedProject/Models/ChallengeCompetition.cs create mode 100644 SharedProject/Models/ChallengeCompetitionBestScore.cs create mode 100644 SharedProject/Models/ChallengeCompetitionParticipant.cs create mode 100644 SharedProject/Models/ChallengeCompetitionSong.cs create mode 100644 SharedProject/Models/Requests/AnswerChallengeRequest.cs create mode 100644 SharedProject/Models/Responses/ChallengeCompetitionResponse.cs create mode 100644 SharedProject/Models/SongInfo.cs create mode 100644 SharedProject/Models/UserAppearance.cs create mode 100644 TaikoLocalServer/Mappers/ChallengeCompeMappers.cs create mode 100644 TaikoLocalServer/Models/Application/CommonChallengeCompeRequest.cs create mode 100644 TaikoLocalServer/Models/Application/CommonChallengeCompeResponse.cs create mode 100644 TaikoWebUI/Components/ChallengeCompe.razor create mode 100644 TaikoWebUI/Components/ChallengeCompeteGrid.razor create mode 100644 TaikoWebUI/Pages/Challenge.razor create mode 100644 TaikoWebUI/Pages/Compete.razor create mode 100644 TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor create mode 100644 TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor create mode 100644 TaikoWebUI/Pages/OfficialCompete.razor diff --git a/SharedProject/Models/ChallengeCompeteCreateInfo.cs b/SharedProject/Models/ChallengeCompeteCreateInfo.cs new file mode 100644 index 00000000..e20158c4 --- /dev/null +++ b/SharedProject/Models/ChallengeCompeteCreateInfo.cs @@ -0,0 +1,37 @@ +using SharedProject.Enums; +using System.Text.Json.Serialization; + +namespace SharedProject.Models; + +public class ChallengeCompeteCreateInfo +{ + [JsonPropertyName("name")] + public string Name { get; set; } = string.Empty; + + [JsonPropertyName("desc")] + public string Desc { get; set; } = string.Empty; + + [JsonPropertyName("competeMode")] + public CompeteModeType CompeteMode { get; set; } + + [JsonPropertyName("maxParticipant")] + public uint MaxParticipant { get; set; } + + [JsonPropertyName("onlyPlayOnce")] + public bool OnlyPlayOnce { get; set; } + + [JsonPropertyName("lastFor")] + public uint LastFor { get; set; } + + [JsonPropertyName("requiredTitle")] + public uint RequiredTitle { get; set; } = 0; + + [JsonPropertyName("shareType")] + public ShareType ShareType { get; set; } = ShareType.EveryOne; + + [JsonPropertyName("competeTargetType")] + public CompeteTargetType CompeteTargetType { get; set; } = CompeteTargetType.EveryOne; + + [JsonPropertyName("challengeCompeteSongs")] + public List challengeCompeteSongs { get; set; } = new(); +} diff --git a/SharedProject/Models/ChallengeCompeteCreateSongInfo.cs b/SharedProject/Models/ChallengeCompeteCreateSongInfo.cs new file mode 100644 index 00000000..6ca70270 --- /dev/null +++ b/SharedProject/Models/ChallengeCompeteCreateSongInfo.cs @@ -0,0 +1,24 @@ +using SharedProject.Enums; +using System.Text.Json.Serialization; + +namespace SharedProject.Models; +public class ChallengeCompeteCreateSongInfo +{ + [JsonPropertyName("songId")] + public uint SongId { get; set; } + + [JsonPropertyName("difficulty")] + public Difficulty Difficulty { get; set; } + + [JsonPropertyName("speed")] + public int Speed { get; set; } = -1; + + [JsonPropertyName("isVanishOn")] + public int IsVanishOn { get; set; } = -1; + + [JsonPropertyName("isInverseOn")] + public int IsInverseOn { get; set; } = -1; + + [JsonPropertyName("randomType")] + public int RandomType { get; set; } = -1; +} \ No newline at end of file diff --git a/SharedProject/Models/ChallengeCompetition.cs b/SharedProject/Models/ChallengeCompetition.cs new file mode 100644 index 00000000..e9b428dc --- /dev/null +++ b/SharedProject/Models/ChallengeCompetition.cs @@ -0,0 +1,22 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class ChallengeCompetition +{ + public uint CompId { get; set; } + public CompeteModeType CompeteMode { get; set; } = CompeteModeType.None; + public CompeteState State { get; set; } = CompeteState.Normal; + public uint Baid { get; set; } + public string CompeteName { get; set; } = String.Empty; + public string CompeteDescribe { get; set; } = String.Empty; + public uint MaxParticipant { get; set; } = 2; + public DateTime CreateTime { get; set; } + public DateTime ExpireTime { get; set; } + public uint RequireTitle { get; set; } = 0; + public bool OnlyPlayOnce { get; set; } = false; + public ShareType Share { get; set; } = ShareType.EveryOne; + public CompeteTargetType CompeteTarget { get; set; } = CompeteTargetType.EveryOne; + public List Songs { get; set; } = new(); + public List Participants { get; set; } = new(); +} diff --git a/SharedProject/Models/ChallengeCompetitionBestScore.cs b/SharedProject/Models/ChallengeCompetitionBestScore.cs new file mode 100644 index 00000000..3c02a7a3 --- /dev/null +++ b/SharedProject/Models/ChallengeCompetitionBestScore.cs @@ -0,0 +1,23 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class ChallengeCompetitionBestScore +{ + public uint CompId { get; set; } + public uint Baid { get; set; } + public uint SongId { get; set; } + public UserAppearance? UserAppearance { get; set; } = null; + public Difficulty Difficulty { get; set; } + public CrownType Crown { get; set; } + public uint Score { get; set; } + public uint ScoreRate { get; set; } + public ScoreRank ScoreRank { get; set; } + public uint GoodCount { get; set; } + public uint OkCount { get; set; } + public uint MissCount { get; set; } + public uint ComboCount { get; set; } + public uint HitCount { get; set; } + public uint DrumrollCount { get; set; } + public bool Skipped { get; set; } +} diff --git a/SharedProject/Models/ChallengeCompetitionParticipant.cs b/SharedProject/Models/ChallengeCompetitionParticipant.cs new file mode 100644 index 00000000..172b7aa1 --- /dev/null +++ b/SharedProject/Models/ChallengeCompetitionParticipant.cs @@ -0,0 +1,8 @@ +namespace SharedProject.Models; + +public class ChallengeCompetitionParticipant +{ + public uint CompId { get; set; } + public uint Baid { get; set; } + public bool IsActive { get; set; } +} diff --git a/SharedProject/Models/ChallengeCompetitionSong.cs b/SharedProject/Models/ChallengeCompetitionSong.cs new file mode 100644 index 00000000..a6104f80 --- /dev/null +++ b/SharedProject/Models/ChallengeCompetitionSong.cs @@ -0,0 +1,16 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class ChallengeCompetitionSong +{ + public uint CompId { get; set; } + public uint SongId { get; set; } + public MusicDetail? MusicDetail { get; set; } = null; + public Difficulty Difficulty { get; set; } + public uint? Speed { get; set; } = null; + public bool? IsVanishOn { get; set; } = null; + public bool? IsInverseOn { get; set; } = null; + public RandomType? RandomType { get; set; } = null; + public List BestScores { get; set; } = new(); +} diff --git a/SharedProject/Models/Requests/AnswerChallengeRequest.cs b/SharedProject/Models/Requests/AnswerChallengeRequest.cs new file mode 100644 index 00000000..e5d50346 --- /dev/null +++ b/SharedProject/Models/Requests/AnswerChallengeRequest.cs @@ -0,0 +1,8 @@ +namespace SharedProject.Models.Requests; + +public class AnswerChallengeRequest +{ + public uint CompId { get; set; } + public uint Baid { get; set; } + public bool Accept { get; set; } +} diff --git a/SharedProject/Models/Responses/ChallengeCompetitionResponse.cs b/SharedProject/Models/Responses/ChallengeCompetitionResponse.cs new file mode 100644 index 00000000..f9371869 --- /dev/null +++ b/SharedProject/Models/Responses/ChallengeCompetitionResponse.cs @@ -0,0 +1,10 @@ +namespace SharedProject.Models.Responses; + +public class ChallengeCompetitionResponse +{ + public List List { get; set; } = new(); + public int Page { get; set; } = 1; + public int TotalPages { get; set; } = 0; + public int Total { get; set; } = 0; + +} diff --git a/SharedProject/Models/SongInfo.cs b/SharedProject/Models/SongInfo.cs new file mode 100644 index 00000000..a3d64bb2 --- /dev/null +++ b/SharedProject/Models/SongInfo.cs @@ -0,0 +1,11 @@ +using SharedProject.Enums; + +namespace SharedProject.Models; + +public class SongInfo +{ + public MusicDetail MusicDetail { get; set; } = new(); + + public Difficulty Difficulty { get; set; } = new(); + +} diff --git a/SharedProject/Models/UserAppearance.cs b/SharedProject/Models/UserAppearance.cs new file mode 100644 index 00000000..9206d79d --- /dev/null +++ b/SharedProject/Models/UserAppearance.cs @@ -0,0 +1,18 @@ +namespace SharedProject.Models; + +public class UserAppearance +{ + public uint Baid { get; set; } + public string MyDonName { get; set; } = string.Empty; + public uint MyDonNameLanguage { get; set; } + public string Title { get; set; } = string.Empty; + public uint TitlePlateId { get; set; } + public uint Kigurumi { get; set; } + public uint Head { get; set; } + public uint Body { get; set; } + public uint Face { get; set; } + public uint Puchi { get; set; } + public uint FaceColor { get; set; } + public uint BodyColor { get; set; } + public uint LimbColor { get; set; } +} diff --git a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs index e84562aa..b24b0dd6 100644 --- a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs +++ b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs @@ -1,4 +1,7 @@ -using TaikoLocalServer.Filters; +using MediatR; +using SharedProject.Models; +using SharedProject.Models.Responses; +using TaikoLocalServer.Filters; namespace TaikoLocalServer.Controllers.Api; @@ -8,33 +11,49 @@ public class ChallengeCompeteManageController(IChallengeCompeteService challenge { [HttpGet] [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] - public ActionResult> GetAllChallengeCompete() + public async Task>> GetAllChallengeCompete() { - List datum = challengeCompeteService.GetAllChallengeCompete(); + List datum = await challengeCompeteService.GetAllChallengeCompete(); + List converted = new(); foreach (var data in datum) { - foreach (var participant in data.Participants) - { - participant.ChallengeCompeteData = null; - } - foreach (var song in data.Songs) - { - song.ChallengeCompeteData = null; - foreach (var bestScore in song.BestScores) - { - bestScore.ChallengeCompeteSongData = null; - } - } + var challengeCompetition = Mappers.ChallengeCompeMappers.MapData(data); + challengeCompetition = await challengeCompeteService.FillData(challengeCompetition); + converted.Add(challengeCompetition); } - return Ok(datum); + return Ok(converted); + } + + [HttpGet("queryPage")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task> GetChallengeCompePage([FromQuery] uint mode = 0, [FromQuery] uint baid = 0, [FromQuery] int inProgress = 0, [FromQuery] int page = 1, [FromQuery] int limit = 10, [FromQuery] string? searchTerm = null) + { + if (page < 1) + { + return BadRequest(new { Message = "Page number cannot be less than 1." }); + } + + if (limit > 200) + { + return BadRequest(new { Message = "Limit cannot be greater than 200." }); + } + + if (mode == 0) + { + return BadRequest(new { Message = "Invalid mode." }); + } + + ChallengeCompetitionResponse response = await challengeCompeteService.GetChallengeCompetePage((CompeteModeType)mode, baid, inProgress != 0, page, limit, searchTerm); + + return Ok(response); } [HttpGet("test/{mode}")] [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] public ActionResult> testCreateCompete(uint mode) { - ChallengeCompeteInfo info = new() + ChallengeCompeteCreateInfo info = new() { Name = "测试数据", Desc = "测试数据描述", @@ -48,7 +67,7 @@ public ActionResult> testCreateCompete(uint mode) new() { SongId = 1, Difficulty = Difficulty.Oni, - RandomType = RandomType.Messy + RandomType = (int)RandomType.Messy }, new() { SongId = 2, @@ -65,10 +84,22 @@ public ActionResult> testCreateCompete(uint mode) return NoContent(); } + [HttpPost("createOfficialCompete")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task CreateCompete(ChallengeCompeteCreateInfo challengeCompeteInfo) + { + Logger.LogInformation("CreateOfficialCompete : {Request}", JsonFormatter.JsonSerialize(challengeCompeteInfo)); + + await challengeCompeteService.CreateCompete(0, challengeCompeteInfo); + + return NoContent(); + } + [HttpPost("{baid}/createCompete")] [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] - public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompeteInfo) + public async Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeCompeteInfo) { + Logger.LogInformation("CreateCompete : {Request}", JsonFormatter.JsonSerialize(challengeCompeteInfo)); await challengeCompeteService.CreateCompete(baid, challengeCompeteInfo); return NoContent(); @@ -76,8 +107,9 @@ public async Task CreateCompete(uint baid, ChallengeCompeteInfo c [HttpPost("{baid}/createChallenge/{targetBaid}")] [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] - public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteInfo challengeCompeteInfo) + public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteCreateInfo challengeCompeteInfo) { + Logger.LogInformation("CreateChallenge : {Request}", JsonFormatter.JsonSerialize(challengeCompeteInfo)); await challengeCompeteService.CreateChallenge(baid, targetBaid, challengeCompeteInfo); return NoContent(); diff --git a/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs b/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs index 7324c93c..b25fe6aa 100644 --- a/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs +++ b/TaikoLocalServer/Controllers/Game/ChallengeCompetitionController.cs @@ -10,22 +10,21 @@ public async Task HandleChallenge([FromBody] ChallengeCompeReques { Logger.LogInformation("ChallengeCompe request : {Request}", request.Stringify()); - var response = await Mediator.Send(new ChallengeCompeteQuery(request.Baid)); + CommonChallengeCompeResponse response = await Mediator.Send(new ChallengeCompeteQuery(request.Baid)); + var response_3906 = Mappers.ChallengeCompeMappers.MapTo3906(response); - return Ok(response); + return Ok(response_3906); } [HttpPost("/v12r00_cn/chassis/challengecompe.php")] [Produces("application/protobuf")] - public IActionResult HandleChallenge3209([FromBody] Models.v3209.ChallengeCompeRequest request) + public async Task HandleChallenge3209([FromBody] Models.v3209.ChallengeCompeRequest request) { Logger.LogInformation("ChallengeCompe request : {Request}", request.Stringify()); - var response = new Models.v3209.ChallengeCompeResponse - { - Result = 1 - }; + CommonChallengeCompeResponse response = await Mediator.Send(new ChallengeCompeteQuery((uint)request.Baid)); + var response_3209 = Mappers.ChallengeCompeMappers.MapTo3209(response); - return Ok(response); + return Ok(response_3209); } } \ No newline at end of file diff --git a/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs b/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs index 565d51ad..1b59c939 100644 --- a/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs +++ b/TaikoLocalServer/Handlers/ChallengeCompeteQuery.cs @@ -4,23 +4,23 @@ namespace TaikoLocalServer.Handlers; -public record ChallengeCompeteQuery(uint Baid) : IRequest; +public record ChallengeCompeteQuery(uint Baid) : IRequest; -public class ChallengeCompeteQueryHandler(TaikoDbContext context, IChallengeCompeteService challengeCompeteService, ILogger logger) - : IRequestHandler +public class ChallengeCompeteQueryHandler(IChallengeCompeteService challengeCompeteService) + : IRequestHandler { - public async Task Handle(ChallengeCompeteQuery request, CancellationToken cancellationToken) + public async Task Handle(ChallengeCompeteQuery request, CancellationToken cancellationToken) { - List competes = challengeCompeteService.GetInProgressChallengeCompete(request.Baid); - ChallengeCompeResponse response = new() + List competes = await challengeCompeteService.GetInProgressChallengeCompete(request.Baid); + CommonChallengeCompeResponse response = new() { Result = 1 }; foreach (var compete in competes) { - ChallengeCompeResponse.CompeData compeData = new() + CommonCompeData compeData = new() { CompeId = compete.CompId }; @@ -45,7 +45,7 @@ public async Task Handle(ChallengeCompeteQuery request, } } - ChallengeCompeResponse.CompeData.TracksData tracksData = new() + CommonTracksData tracksData = new() { SongNo = song.SongId, Level = (uint) song.Difficulty, diff --git a/TaikoLocalServer/Handlers/UserDataQuery.cs b/TaikoLocalServer/Handlers/UserDataQuery.cs index 2cd688ef..7ef75ce7 100644 --- a/TaikoLocalServer/Handlers/UserDataQuery.cs +++ b/TaikoLocalServer/Handlers/UserDataQuery.cs @@ -73,7 +73,7 @@ public async Task Handle(UserDataQuery request, Cancella } } - bool hasChallengeCompe = challengeCompeteService.HasChallengeCompete(request.Baid); + bool hasChallengeCompe = await challengeCompeteService.HasChallengeCompete(request.Baid); var response = new CommonUserDataResponse { diff --git a/TaikoLocalServer/Mappers/ChallengeCompeMappers.cs b/TaikoLocalServer/Mappers/ChallengeCompeMappers.cs new file mode 100644 index 00000000..2b725917 --- /dev/null +++ b/TaikoLocalServer/Mappers/ChallengeCompeMappers.cs @@ -0,0 +1,12 @@ +using Riok.Mapperly.Abstractions; +using SharedProject.Models; + +namespace TaikoLocalServer.Mappers; + +[Mapper] +public static partial class ChallengeCompeMappers +{ + public static partial ChallengeCompeResponse MapTo3906(CommonChallengeCompeResponse response); + public static partial Models.v3209.ChallengeCompeResponse MapTo3209(CommonChallengeCompeResponse response); + public static partial ChallengeCompetition MapData(ChallengeCompeteDatum data); +} diff --git a/TaikoLocalServer/Models/Application/CommonChallengeCompeRequest.cs b/TaikoLocalServer/Models/Application/CommonChallengeCompeRequest.cs new file mode 100644 index 00000000..626da6f5 --- /dev/null +++ b/TaikoLocalServer/Models/Application/CommonChallengeCompeRequest.cs @@ -0,0 +1,8 @@ +namespace TaikoLocalServer.Models.Application; + +public class CommonChallengeCompeRequest +{ + public uint Baid { get; set; } + public string ChassisId { get; set; } = string.Empty; + public string ShopId { get; set; } = string.Empty; +} diff --git a/TaikoLocalServer/Models/Application/CommonChallengeCompeResponse.cs b/TaikoLocalServer/Models/Application/CommonChallengeCompeResponse.cs new file mode 100644 index 00000000..8d1ea226 --- /dev/null +++ b/TaikoLocalServer/Models/Application/CommonChallengeCompeResponse.cs @@ -0,0 +1,23 @@ +namespace TaikoLocalServer.Models.Application; + +public class CommonChallengeCompeResponse +{ + public uint Result { get; set; } + public List AryChallengeStats { get; set; } = []; + public List AryUserCompeStats { get; set; } = []; + public List AryBngCompeStats { get; set; } = []; +} + +public class CommonCompeData +{ + public uint CompeId { get; set; } + public List AryTrackStats { get; set; } = []; +} + +public class CommonTracksData +{ + public uint SongNo { get; set; } + public uint Level { get; set; } + public byte[] OptionFlg { get; set; } = []; + public uint HighScore { get; set; } +} \ No newline at end of file diff --git a/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs b/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs index 96958962..546e11ee 100644 --- a/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs +++ b/TaikoLocalServer/Models/ChallengeCompeteSongInfo.cs @@ -1,5 +1,4 @@ -using SharedProject.Models; -using System.Text.Json.Serialization; +using System.Text.Json.Serialization; namespace TaikoLocalServer.Models; diff --git a/TaikoLocalServer/Services/ChallengeCompeteService.cs b/TaikoLocalServer/Services/ChallengeCompeteService.cs index 95647a61..d2d81719 100644 --- a/TaikoLocalServer/Services/ChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/ChallengeCompeteService.cs @@ -1,7 +1,9 @@  using GameDatabase.Context; using SharedProject.Models; +using SharedProject.Models.Responses; using SharedProject.Utils; +using TaikoLocalServer.Services.Interfaces; using Throw; namespace TaikoLocalServer.Services; @@ -9,18 +11,26 @@ namespace TaikoLocalServer.Services; public class ChallengeCompeteService : IChallengeCompeteService { private readonly TaikoDbContext context; - public ChallengeCompeteService(TaikoDbContext context) + private readonly IGameDataService gameDataService; + private readonly IUserDatumService userDatumService; + + private Dictionary musicDetailDict; + public ChallengeCompeteService(TaikoDbContext context, IGameDataService gameDataService, IUserDatumService userDatumService) { this.context = context; + this.gameDataService = gameDataService; + this.userDatumService = userDatumService; + + this.musicDetailDict = gameDataService.GetMusicDetailDictionary(); } - public bool HasChallengeCompete(uint baid) + public async Task HasChallengeCompete(uint baid) { - return context.ChallengeCompeteData + return await context.ChallengeCompeteData .Include(c => c.Participants) .Include(c => c.Songs) .ThenInclude(s => s.BestScores) - .Any(data => + .AnyAsync(data => data.State == CompeteState.Normal && data.CreateTime < DateTime.Now && data.ExpireTime > DateTime.Now && @@ -32,9 +42,9 @@ public bool HasChallengeCompete(uint baid) ); } - public List GetInProgressChallengeCompete(uint baid) + public async Task> GetInProgressChallengeCompete(uint baid) { - return context.ChallengeCompeteData + return await context.ChallengeCompeteData .Include(c => c.Participants) .Include(c => c.Songs) .ThenInclude(s => s.BestScores) @@ -47,19 +57,76 @@ public List GetInProgressChallengeCompete(uint baid) // Only Play Once need there is no Score for current Compete !data.OnlyPlayOnce || data.Songs.Any(song => !song.BestScores.Any(s => s.Baid == baid)) ) - ).ToList(); + ).ToListAsync(); } - public List GetAllChallengeCompete() + public async Task> GetAllChallengeCompete() { - return context.ChallengeCompeteData + return await context.ChallengeCompeteData .Include(c => c.Participants) .Include(c => c.Songs) .ThenInclude(s => s.BestScores) - .Where(data => true).ToList(); + .Where(data => true).ToListAsync(); } - public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompeteInfo) + public async Task GetChallengeCompetePage(CompeteModeType mode, uint baid, bool inProgress, int page, int limit, string? search) + { + IQueryable? query = null; + string? lowSearch = search != null ? search.ToLower() : null; + if (mode == CompeteModeType.Chanllenge) + { + query = context.ChallengeCompeteData + .Include(e => e.Songs).ThenInclude(e => e.BestScores).Include(e => e.Participants) + .Where(e => e.CompeteMode == CompeteModeType.Chanllenge) + .Where(e => inProgress == false || (e.CreateTime < DateTime.Now && DateTime.Now < e.ExpireTime)) + .Where(e => baid == 0 || (e.Baid == baid || e.Participants.Any(p => p.Baid == baid))) + .Where(e => lowSearch == null || (e.CompId.ToString() == lowSearch || e.CompeteName.ToLower().Contains(lowSearch))); + } + else if (mode == CompeteModeType.Compete) + { + query = context.ChallengeCompeteData + .Include(e => e.Songs).ThenInclude(e => e.BestScores).Include(e => e.Participants) + .Where(e => e.CompeteMode == CompeteModeType.Compete) + .Where(e => inProgress == false || (e.CreateTime < DateTime.Now && DateTime.Now < e.ExpireTime)) + .Where(e => baid == 0 || (e.Baid == baid || e.Participants.Any(p => p.Baid == baid) || e.Share == ShareType.EveryOne)) + .Where(e => lowSearch == null || (e.CompId.ToString() == lowSearch || e.CompeteName.ToLower().Contains(lowSearch))); + } + else if (mode == CompeteModeType.OfficialCompete) + { + query = context.ChallengeCompeteData + .Include(e => e.Songs).ThenInclude(e => e.BestScores).Include(e => e.Participants) + .Where(e => e.CompeteMode == CompeteModeType.OfficialCompete) + .Where(e => inProgress == false || (e.CreateTime < DateTime.Now && DateTime.Now < e.ExpireTime)) + .Where(e => lowSearch == null || (e.CompId.ToString() == lowSearch || e.CompeteName.ToLower().Contains(lowSearch))); + } + if (query == null) return new ChallengeCompetitionResponse(); + + var total = await query.CountAsync(); + var totalPage = total / limit; + if (total % limit > 0) totalPage += 1; + + var challengeCompeteDatum= await query + .OrderBy(e => e.CompId).Skip((page - 1) * limit).Take(limit) + .ToListAsync(); + + List converted = new(); + foreach (var data in challengeCompeteDatum) + { + var challengeCompetition = Mappers.ChallengeCompeMappers.MapData(data); + challengeCompetition = await FillData(challengeCompetition); + converted.Add(challengeCompetition); + } + + return new ChallengeCompetitionResponse + { + List = converted, + Page = page, + TotalPages = totalPage, + Total = total + }; + } + + public async Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeCompeteInfo) { ChallengeCompeteDatum challengeCompeteData = new() { @@ -85,20 +152,23 @@ public async Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompete CompId = challengeCompeteData.CompId, SongId = song.SongId, Difficulty = song.Difficulty, - Speed = song.Speed, - IsInverseOn = song.IsInverseOn, - IsVanishOn = song.IsVanishOn, - RandomType = song.RandomType + Speed = song.Speed == -1 ? null : (uint)song.Speed, + IsInverseOn = song.IsInverseOn == -1 ? null : (song.IsInverseOn != 0), + IsVanishOn = song.IsVanishOn == -1 ? null : (song.IsVanishOn != 0), + RandomType = song.RandomType == -1 ? null : (RandomType)song.RandomType, }; await context.AddAsync(challengeCompeteSongData); } - ChallengeCompeteParticipantDatum participantDatum = new() + if (baid != 0) { - CompId = challengeCompeteData.CompId, - Baid = baid, - IsActive = true - }; - await context.AddAsync(participantDatum); + ChallengeCompeteParticipantDatum participantDatum = new() + { + CompId = challengeCompeteData.CompId, + Baid = baid, + IsActive = true + }; + await context.AddAsync(participantDatum); + } await context.SaveChangesAsync(); } @@ -125,7 +195,7 @@ public async Task ParticipateCompete(uint compId, uint baid) return true; } - public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteInfo challengeCompeteInfo) + public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteCreateInfo challengeCompeteInfo) { ChallengeCompeteDatum challengeCompeteData = new() { @@ -151,10 +221,10 @@ public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteIn CompId = challengeCompeteData.CompId, SongId = song.SongId, Difficulty = song.Difficulty, - Speed = song.Speed, - IsInverseOn = song.IsInverseOn, - IsVanishOn = song.IsVanishOn, - RandomType = song.RandomType + Speed = song.Speed == -1 ? null : (uint)song.Speed, + IsInverseOn = song.IsInverseOn == -1 ? null : (song.IsInverseOn != 0), + IsVanishOn = song.IsVanishOn == -1 ? null : (song.IsVanishOn != 0), + RandomType = song.RandomType == -1 ? null : (RandomType)song.RandomType, }; await context.AddAsync(challengeCompeteSongData); } @@ -268,4 +338,36 @@ await context.AddAsync(new ChallengeCompeteBestDatum } await context.AddRangeAsync(); } + + public async Task FillData(ChallengeCompetition challenge) + { + foreach (var song in challenge.Songs) + { + if (song == null) continue; + song.MusicDetail = musicDetailDict.GetValueOrDefault(song.SongId); + foreach (var score in song.BestScores) + { + UserDatum? user = await userDatumService.GetFirstUserDatumOrNull(score.Baid); + if (user == null) continue; + score.UserAppearance = new UserAppearance + { + Baid = score.Baid, + MyDonName = user.MyDonName, + MyDonNameLanguage = user.MyDonNameLanguage, + Title = user.Title, + TitlePlateId = user.TitlePlateId, + Kigurumi = user.CurrentKigurumi, + Head = user.CurrentHead, + Body = user.CurrentBody, + Face = user.CurrentFace, + Puchi = user.CurrentPuchi, + FaceColor = user.ColorFace, + BodyColor = user.ColorBody, + LimbColor = user.ColorLimb, + }; + } + } + + return challenge; + } } diff --git a/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs b/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs index 92d4a82a..8f1bc2cf 100644 --- a/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs @@ -1,20 +1,27 @@ -namespace TaikoLocalServer.Services.Interfaces; +using SharedProject.Models; +using SharedProject.Models.Responses; + +namespace TaikoLocalServer.Services.Interfaces; public interface IChallengeCompeteService { - public bool HasChallengeCompete(uint baid); + public Task HasChallengeCompete(uint baid); + + public Task> GetInProgressChallengeCompete(uint baid); - public List GetInProgressChallengeCompete(uint baid); + public Task> GetAllChallengeCompete(); - public List GetAllChallengeCompete(); + public Task GetChallengeCompetePage(CompeteModeType mode, uint baid, bool inProgress, int page, int limit, string? search); - public Task CreateCompete(uint baid, ChallengeCompeteInfo challengeCompeteInfo); + public Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeCompeteInfo); public Task ParticipateCompete(uint compId, uint baid); - public Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteInfo challengeCompeteInfo); + public Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteCreateInfo challengeCompeteInfo); public Task AnswerChallenge(uint compId, uint baid, bool accept); public Task UpdateBestScore(uint baid, SongPlayDatum playData, short option); + + public Task FillData(ChallengeCompetition challenge); } diff --git a/TaikoLocalServer/TaikoLocalServer.csproj b/TaikoLocalServer/TaikoLocalServer.csproj index b112262c..6a26cf42 100644 --- a/TaikoLocalServer/TaikoLocalServer.csproj +++ b/TaikoLocalServer/TaikoLocalServer.csproj @@ -28,34 +28,36 @@ - + + + - - - - - - - + + + + + + + all runtime; build; native; contentfiles; analyzers; buildtransitive - - - - - - - - - - - - - + + + + + + + + + + + + + @@ -65,26 +67,26 @@ PreserveNewest - + PreserveNewest PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest - + PreserveNewest @@ -199,8 +201,8 @@ - - - + + + diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor new file mode 100644 index 00000000..a9e24387 --- /dev/null +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -0,0 +1,100 @@ +@inject IDialogService DialogService; +@inject HttpClient Client + +@if (ChallengeCompetition != null) +{ + + + + @ChallengeCompetition.CompeteName + @Localizer["Comp ID"]:@ChallengeCompetition.CompId + @Localizer["Describe"]:@ChallengeCompetition.CompeteDescribe + + + @if (false && SelfHoldedChallengeCompetiton()) + { + + } + + + + + @{ + foreach (var song in ChallengeCompetition.Songs) + { +
+ @song.MusicDetail?.SongName +
+ } + } +
+ + + AnswerChallenge(true))>@Localizer["Information"] + @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) + { + + AnswerChallenge(true))>@Localizer["Accept"] + AnswerChallenge(false))>@Localizer["Reject"] + + } + else + { + AnswerChallenge(true))>@Localizer["Participate"] + } + + +
+} + +@code { + [Parameter] public ChallengeCompetition? ChallengeCompetition { get; set; } + [Parameter] public uint Baid { get; set; } + + private bool SelfHoldedChallengeCompetiton() + { + return ChallengeCompetition?.Baid == Baid || Baid == 0; + } + + private bool ChallengeNeedAnswer() + { + return ChallengeCompetition?.State == CompeteState.Waiting && !SelfHoldedChallengeCompetiton(); + } + + private bool ParticipatedChallengeCompetition() + { + return ChallengeCompetition?.Participants?.Find(p => p.Baid == Baid) != null; + } + + private bool CanParticipateChallengeCompetition() + { + return ChallengeCompetition?.CreateTime < DateTime.Now && DateTime.Now < ChallengeCompetition?.ExpireTime && !ParticipatedChallengeCompetition(); + } + + private async Task AnswerChallenge(bool accept) + { + if (ChallengeCompetition == null || ChallengeCompetition.State != CompeteState.Waiting) return; + var request = new AnswerChallengeRequest + { + CompId = ChallengeCompetition.CompId, + Baid = Baid, + Accept = accept + }; + var response = await Client.PostAsJsonAsync("api/ChallengeCompetitionManage/AnswerChallenge", request); + if (!response.IsSuccessStatusCode) + { + await DialogService.ShowMessageBox( + Localizer["Error"], + Localizer["Unknown Error"], + Localizer["Dialog OK"], null, null, new DialogOptions { DisableBackdropClick = true }); + return; + } + + ChallengeCompetition.State = accept ? CompeteState.Normal : CompeteState.Rejected; + + } +} diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor b/TaikoWebUI/Components/ChallengeCompeteGrid.razor new file mode 100644 index 00000000..5c0330d8 --- /dev/null +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor @@ -0,0 +1,194 @@ +@inject HttpClient Client +@inject AuthService AuthService +@inject NavigationManager NavigationManager +@inject BreadcrumbsStateContainer BreadcrumbsStateContainer +@inject IDialogService DialogService; + +@using TaikoWebUI.Components; +@using TaikoWebUI.Pages.Dialogs + + + @if (!AuthService.LoginRequired || (AuthService.LoginRequired && AuthService.IsAdmin)) + { + +
+ + + @if (Mode == 1) { + OpenDialogAsync(1, 1)) Style="width: 80px">@Localizer["Add"] + } + else if (Mode == 2) + { + OpenDialogAsync(2, 3)) Style="width: 80px">@Localizer["Add"] + } + else if (Mode == 3) + { + OpenDialogAsync(3, 3)) Style="width: 80px">@Localizer["Add"] + } + +
+
+ @if (isLoading || response == null) + { + // Loading... + for (uint i = 0; i < pageSize; i++) + { + + + + + + + + + + + + + + + + } + } + else if (response.List.Count > 0) + { + foreach (var challengeCompetition in response.List) + { + + + + } + } + else + { // No users in the database + + + @Localizer["No Data"] + + + } + } + else if (AuthService.LoginRequired && !AuthService.IsLoggedIn) + { + // Not logged in, redirect + NavigationManager.NavigateTo("/Login"); + } + else + { + NavigationManager.NavigateTo("/"); + } + + @if (response != null && TotalPages > 1) + { + +
+ +
+
+ } +
+ +@code { + [Parameter] + public int Baid { get; set; } + + [Parameter] + public int Mode { get; set; } + + + + private ChallengeCompetitionResponse? response = new(); + private CancellationTokenSource? cts; + private int TotalPages { get; set; } = 0; + private bool isLoading = true; + private int currentPage = 1; + private readonly int pageSize = 12; + private string? searchTerm = null; + private bool inProgress = false; + + private async Task GetUsersData() + { + isLoading = true; + + response = await Client.GetFromJsonAsync($"api/ChallengeCompeteManage/queryPage?mode={(uint)Mode}&baid={Baid}&inProgress={(inProgress ? 1 : 0)}&page={currentPage}&limit={pageSize}&searchTerm={searchTerm}"); + response.ThrowIfNull(); + + TotalPages = response.TotalPages; + isLoading = false; + } + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + if (AuthService.LoginRequired && !AuthService.IsLoggedIn) + { + await AuthService.LoginWithAuthToken(); + } + + if (AuthService.IsAdmin || !AuthService.LoginRequired) + { + await GetUsersData(); + } + + BreadcrumbsStateContainer.breadcrumbs.Clear(); + BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users")); + BreadcrumbsStateContainer.NotifyStateChanged(); + } + + private async Task OnPageChange(int page) + { + currentPage = page; + await GetUsersData(); + } + + private async Task Debounce(Func action, int delayInMilliseconds) + { + // Cancel the previous task + cts?.Cancel(); + + // Create a new CancellationTokenSource + cts = new CancellationTokenSource(); + + try + { + // Wait for the delay + await Task.Delay(delayInMilliseconds, cts.Token); + + // Execute the action + await action(); + } + catch (TaskCanceledException) + { + // Ignore the exception + } + } + + private async Task OnSearch(string search) + { + searchTerm = search; + currentPage = 1; + + // Debounce the GetUsersData method + await Debounce(GetUsersData, 500); // 500 milliseconds delay + } + + private Task OpenDialogAsync(int mode, int maxSongs) + { + var options = new DialogOptions { CloseOnEscapeKey = true }; + var parameters = new DialogParameters(); + parameters.Add("Mode", mode); + parameters.Add("MaxSongs", maxSongs); + + return DialogService.ShowAsync(Localizer["Create"], parameters, options); + } +} diff --git a/TaikoWebUI/Components/NavMenu.razor b/TaikoWebUI/Components/NavMenu.razor index ce2e3fe7..38efc33e 100644 --- a/TaikoWebUI/Components/NavMenu.razor +++ b/TaikoWebUI/Components/NavMenu.razor @@ -43,6 +43,14 @@ @Localizer["Log Out"] } } + + @{ + + @Localizer["Challenge"] + @Localizer["Competition"] + @Localizer["Official Competition"] + + } @code { diff --git a/TaikoWebUI/Localization/LocalizationResource.Designer.cs b/TaikoWebUI/Localization/LocalizationResource.Designer.cs index 7f1453c4..f4a5355c 100644 --- a/TaikoWebUI/Localization/LocalizationResource.Designer.cs +++ b/TaikoWebUI/Localization/LocalizationResource.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// Ce code a été généré par un outil. -// Version du runtime :4.0.30319.42000 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 // -// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si -// le code est régénéré. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ @@ -13,12 +13,12 @@ namespace TaikoWebUI.Localization { /// - /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. + /// 一个强类型的资源类,用于查找本地化的字符串等。 /// - // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder - // à l'aide d'un outil, tel que ResGen ou Visual Studio. - // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen - // avec l'option /str ou régénérez votre projet VS. + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -33,7 +33,7 @@ internal LocalizationResource() { } /// - /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ internal LocalizationResource() { } /// - /// Remplace la propriété CurrentUICulture du thread actuel pour toutes - /// les recherches de ressources à l'aide de cette classe de ressource fortement typée. + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ internal LocalizationResource() { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _1_Star { get { @@ -70,7 +70,7 @@ internal static string _1_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _10_Star { get { @@ -79,7 +79,7 @@ internal static string _10_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _2_Star { get { @@ -88,7 +88,7 @@ internal static string _2_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _3_Star { get { @@ -97,7 +97,7 @@ internal static string _3_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _4_Star { get { @@ -106,7 +106,7 @@ internal static string _4_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _5_Star { get { @@ -115,7 +115,7 @@ internal static string _5_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _6_Star { get { @@ -124,7 +124,7 @@ internal static string _6_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _7_Star { get { @@ -133,7 +133,7 @@ internal static string _7_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _8_Star { get { @@ -142,7 +142,7 @@ internal static string _8_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _8bittaiko { get { @@ -151,7 +151,7 @@ internal static string _8bittaiko { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _9_Star { get { @@ -160,7 +160,7 @@ internal static string _9_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _Invite_Code__Optional__ { get { @@ -169,7 +169,16 @@ internal static string _Invite_Code__Optional__ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Accept { + get { + return ResourceManager.GetString("Accept", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Access_Code { get { @@ -178,7 +187,7 @@ internal static string Access_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Already_Bound_Error { get { @@ -187,7 +196,7 @@ internal static string Access_Code_Already_Bound_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Bound_Success { get { @@ -196,7 +205,7 @@ internal static string Access_Code_Bound_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Delete_Confirm { get { @@ -205,7 +214,7 @@ internal static string Access_Code_Delete_Confirm { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Delete_Last_Access_Code_Error { get { @@ -214,7 +223,7 @@ internal static string Access_Code_Delete_Last_Access_Code_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Delete_Success { get { @@ -223,7 +232,7 @@ internal static string Access_Code_Delete_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Empty_Error { get { @@ -232,7 +241,7 @@ internal static string Access_Code_Empty_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_is_Required { get { @@ -241,7 +250,7 @@ internal static string Access_Code_is_Required { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Not_Admin_Error { get { @@ -250,7 +259,7 @@ internal static string Access_Code_Not_Admin_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Not_Registered_Error { get { @@ -259,7 +268,7 @@ internal static string Access_Code_Not_Registered_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Upper_Limit_Error { get { @@ -268,7 +277,7 @@ internal static string Access_Code_Upper_Limit_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Codes { get { @@ -277,7 +286,7 @@ internal static string Access_Codes { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Achievement_Panel { get { @@ -286,7 +295,7 @@ internal static string Achievement_Panel { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Achievement_Panel_Difficulty { get { @@ -295,7 +304,7 @@ internal static string Achievement_Panel_Difficulty { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Add { get { @@ -304,7 +313,7 @@ internal static string Add { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Add_Access_Code { get { @@ -313,7 +322,7 @@ internal static string Add_Access_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string AI_Battle_Data { get { @@ -322,7 +331,7 @@ internal static string AI_Battle_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Akemi { get { @@ -331,7 +340,7 @@ internal static string Akemi { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string And { get { @@ -340,7 +349,7 @@ internal static string And { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Bad { get { @@ -349,7 +358,7 @@ internal static string Bad { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Best_Crown { get { @@ -358,7 +367,7 @@ internal static string Best_Crown { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Best_Rank { get { @@ -367,7 +376,34 @@ internal static string Best_Rank { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Best_Score { + get { + return ResourceManager.GetString("Best Score", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Body { + get { + return ResourceManager.GetString("Body", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Body_Color { + get { + return ResourceManager.GetString("Body Color", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Cancel { get { @@ -376,7 +412,34 @@ internal static string Cancel { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Challenge { + get { + return ResourceManager.GetString("Challenge", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Challenge_Competition_Data { + get { + return ResourceManager.GetString("Challenge Competition Data", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Change_Password { + get { + return ResourceManager.GetString("Change Password", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Change_Password_Different_Confirm_Password_Error { get { @@ -385,7 +448,7 @@ internal static string Change_Password_Different_Confirm_Password_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Change_Password_Success { get { @@ -394,7 +457,7 @@ internal static string Change_Password_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Change_Password_Wrong_Current_Password_Error { get { @@ -403,7 +466,7 @@ internal static string Change_Password_Wrong_Current_Password_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Chinese_Simplified { get { @@ -412,7 +475,7 @@ internal static string Chinese_Simplified { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Chinese_Traditional { get { @@ -421,7 +484,7 @@ internal static string Chinese_Traditional { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Chojin { get { @@ -430,7 +493,7 @@ internal static string Chojin { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Clapping { get { @@ -439,7 +502,34 @@ internal static string Clapping { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Comp_ID { + get { + return ResourceManager.GetString("Comp ID", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Competition { + get { + return ResourceManager.GetString("Competition", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Conditions { + get { + return ResourceManager.GetString("Conditions", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Confirm_New_Password { get { @@ -448,7 +538,7 @@ internal static string Confirm_New_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Confirm_Password { get { @@ -457,7 +547,7 @@ internal static string Confirm_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Confirm_Password_is_Required { get { @@ -466,7 +556,7 @@ internal static string Confirm_Password_is_Required { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Conga { get { @@ -475,7 +565,7 @@ internal static string Conga { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Copy_to_Clipboard { get { @@ -484,7 +574,25 @@ internal static string Copy_to_Clipboard { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Costume { + get { + return ResourceManager.GetString("Costume", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Costume_Options { + get { + return ResourceManager.GetString("Costume Options", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Course_Songs { get { @@ -493,7 +601,16 @@ internal static string Course_Songs { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Crown { + get { + return ResourceManager.GetString("Crown", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Currently_Selected_ { get { @@ -502,7 +619,7 @@ internal static string Currently_Selected_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Dani_Dojo { get { @@ -511,7 +628,7 @@ internal static string Dani_Dojo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Dashboard { get { @@ -520,7 +637,7 @@ internal static string Dashboard { } /// - /// Recherche une chaîne localisée semblable à MM/dd/yyyy h:mm:ss tt. + /// 查找类似 MM/dd/yyyy h:mm:ss tt 的本地化字符串。 /// internal static string DateFormat { get { @@ -529,7 +646,7 @@ internal static string DateFormat { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Default { get { @@ -538,7 +655,7 @@ internal static string Default { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Delete { get { @@ -547,7 +664,16 @@ internal static string Delete { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Delete_User { + get { + return ResourceManager.GetString("Delete User", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Delete_User_Confirm { get { @@ -556,7 +682,7 @@ internal static string Delete_User_Confirm { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Delete_User_Success { get { @@ -565,7 +691,25 @@ internal static string Delete_User_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Describe { + get { + return ResourceManager.GetString("Describe", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Details { + get { + return ResourceManager.GetString("Details", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Dialog_OK { get { @@ -574,7 +718,7 @@ internal static string Dialog_OK { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Difficulty { get { @@ -583,7 +727,52 @@ internal static string Difficulty { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Difficulty_Setting_Course { + get { + return ResourceManager.GetString("Difficulty Setting Course", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Difficulty_Setting_Sort { + get { + return ResourceManager.GetString("Difficulty Setting Sort", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Difficulty_Setting_Star { + get { + return ResourceManager.GetString("Difficulty Setting Star", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Display_Achievement_Panel { + get { + return ResourceManager.GetString("Display Achievement Panel", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Display_Dan_Rank_on_Name_Plate { + get { + return ResourceManager.GetString("Display Dan Rank on Name Plate", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Drum { get { @@ -592,7 +781,16 @@ internal static string Drum { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Drumroll { + get { + return ResourceManager.GetString("Drumroll", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Easy { get { @@ -601,7 +799,7 @@ internal static string Easy { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Edit_Profile { get { @@ -610,7 +808,7 @@ internal static string Edit_Profile { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Eighth_Dan { get { @@ -619,7 +817,7 @@ internal static string Eighth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Electric_Guitar { get { @@ -628,7 +826,7 @@ internal static string Electric_Guitar { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string English { get { @@ -637,7 +835,7 @@ internal static string English { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Error { get { @@ -646,7 +844,25 @@ internal static string Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Face { + get { + return ResourceManager.GetString("Face", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Face_Color { + get { + return ResourceManager.GetString("Face Color", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Fifth_Dan { get { @@ -655,7 +871,7 @@ internal static string Fifth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Fifth_Kyuu { get { @@ -664,7 +880,7 @@ internal static string Fifth_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Filter_by_Genre { get { @@ -673,7 +889,7 @@ internal static string Filter_by_Genre { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string First_Dan { get { @@ -682,7 +898,7 @@ internal static string First_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string First_Kyuu { get { @@ -691,7 +907,7 @@ internal static string First_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Fourth_Dan { get { @@ -700,7 +916,7 @@ internal static string Fourth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Fourth_Kyuu { get { @@ -709,7 +925,7 @@ internal static string Fourth_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Funassyi { get { @@ -718,7 +934,7 @@ internal static string Funassyi { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Gaiden { get { @@ -727,7 +943,7 @@ internal static string Gaiden { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Generate_Invite_Code { get { @@ -736,7 +952,25 @@ internal static string Generate_Invite_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Genre { + get { + return ResourceManager.GetString("Genre", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Gold { + get { + return ResourceManager.GetString("Gold", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Gold_Donderful_Combo { get { @@ -745,7 +979,7 @@ internal static string Gold_Donderful_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Gold_Full_Combo { get { @@ -754,7 +988,16 @@ internal static string Gold_Full_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Good { + get { + return ResourceManager.GetString("Good", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Hard { get { @@ -763,7 +1006,25 @@ internal static string Hard { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Head { + get { + return ResourceManager.GetString("Head", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Hide { + get { + return ResourceManager.GetString("Hide", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string High_Scores { get { @@ -772,7 +1033,7 @@ internal static string High_Scores { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string ID { get { @@ -781,7 +1042,16 @@ internal static string ID { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Information { + get { + return ResourceManager.GetString("Information", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Inuneko { get { @@ -790,7 +1060,16 @@ internal static string Inuneko { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Inverse { + get { + return ResourceManager.GetString("Inverse", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Invite_Code { get { @@ -799,7 +1078,7 @@ internal static string Invite_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Isogai { get { @@ -808,7 +1087,7 @@ internal static string Isogai { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Japanese { get { @@ -817,7 +1096,16 @@ internal static string Japanese { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Kigurumi { + get { + return ResourceManager.GetString("Kigurumi", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Korean { get { @@ -826,7 +1114,7 @@ internal static string Korean { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Kuroto { get { @@ -835,7 +1123,16 @@ internal static string Kuroto { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Language { + get { + return ResourceManager.GetString("Language", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Last_Play_Date { get { @@ -844,7 +1141,7 @@ internal static string Last_Play_Date { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Last_Play_Time_5_Min_Around_Credit_End_ { get { @@ -853,7 +1150,16 @@ internal static string Last_Play_Time_5_Min_Around_Credit_End_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Last_Played { + get { + return ResourceManager.GetString("Last Played", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Leaderboard { get { @@ -862,7 +1168,25 @@ internal static string Leaderboard { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Level { + get { + return ResourceManager.GetString("Level", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Limb_Color { + get { + return ResourceManager.GetString("Limb Color", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Log_In { get { @@ -871,7 +1195,7 @@ internal static string Log_In { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Log_In_First { get { @@ -880,7 +1204,7 @@ internal static string Log_In_First { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Log_Out { get { @@ -889,7 +1213,7 @@ internal static string Log_Out { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Log_Out_Confirm { get { @@ -898,7 +1222,7 @@ internal static string Log_Out_Confirm { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Login_Only_Admin_Error { get { @@ -907,7 +1231,7 @@ internal static string Login_Only_Admin_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Login_Wrong_Password_Error { get { @@ -916,7 +1240,7 @@ internal static string Login_Wrong_Password_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Matsuri { get { @@ -925,7 +1249,16 @@ internal static string Matsuri { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string MAX_Combo { + get { + return ResourceManager.GetString("MAX Combo", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Meijin { get { @@ -934,7 +1267,7 @@ internal static string Meijin { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Mekadon { get { @@ -943,7 +1276,7 @@ internal static string Mekadon { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Messy { get { @@ -952,7 +1285,16 @@ internal static string Messy { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Name { + get { + return ResourceManager.GetString("Name", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string New_Access_Code { get { @@ -961,7 +1303,7 @@ internal static string New_Access_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string New_Password { get { @@ -970,7 +1312,7 @@ internal static string New_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Ninth_Dan { get { @@ -979,7 +1321,7 @@ internal static string Ninth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string No_Data { get { @@ -988,7 +1330,7 @@ internal static string No_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string No_Play_History_Found { get { @@ -997,7 +1339,7 @@ internal static string No_Play_History_Found { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string None { get { @@ -1006,7 +1348,7 @@ internal static string None { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Normal { get { @@ -1015,7 +1357,7 @@ internal static string Normal { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Cleared { get { @@ -1024,7 +1366,7 @@ internal static string Not_Cleared { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Donderful_Combo { get { @@ -1033,7 +1375,7 @@ internal static string Not_Donderful_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Full_Combo { get { @@ -1042,7 +1384,7 @@ internal static string Not_Full_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Logged_In_Error { get { @@ -1051,7 +1393,7 @@ internal static string Not_Logged_In_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Passed { get { @@ -1060,7 +1402,34 @@ internal static string Not_Passed { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Notes_Position { + get { + return ResourceManager.GetString("Notes Position", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Official_Competition { + get { + return ResourceManager.GetString("Official Competition", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string OK { + get { + return ResourceManager.GetString("OK", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Old_Password { get { @@ -1069,7 +1438,7 @@ internal static string Old_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Oni { get { @@ -1078,7 +1447,7 @@ internal static string Oni { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string other_access_code_s_ { get { @@ -1087,7 +1456,25 @@ internal static string other_access_code_s_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Participate { + get { + return ResourceManager.GetString("Participate", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Pass { + get { + return ResourceManager.GetString("Pass", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Password { get { @@ -1096,7 +1483,7 @@ internal static string Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Password_is_Required { get { @@ -1105,7 +1492,7 @@ internal static string Password_is_Required { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Play_Data { get { @@ -1114,7 +1501,7 @@ internal static string Play_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Play_History { get { @@ -1123,7 +1510,7 @@ internal static string Play_History { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Play_Time { get { @@ -1132,7 +1519,16 @@ internal static string Play_Time { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Player { + get { + return ResourceManager.GetString("Player", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Player_Titles { get { @@ -1141,7 +1537,34 @@ internal static string Player_Titles { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Profile { + get { + return ResourceManager.GetString("Profile", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Profile_Options { + get { + return ResourceManager.GetString("Profile Options", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Puchi { + get { + return ResourceManager.GetString("Puchi", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Puchipuchi { get { @@ -1150,7 +1573,7 @@ internal static string Puchipuchi { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string QR_Code { get { @@ -1159,7 +1582,16 @@ internal static string QR_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Random { + get { + return ResourceManager.GetString("Random", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Rank { get { @@ -1168,7 +1600,16 @@ internal static string Rank { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Red { + get { + return ResourceManager.GetString("Red", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Red_Donderful_Combo { get { @@ -1177,7 +1618,7 @@ internal static string Red_Donderful_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Red_Full_Combo { get { @@ -1186,7 +1627,7 @@ internal static string Red_Full_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register { get { @@ -1195,7 +1636,7 @@ internal static string Register { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Already_Registered_Error { get { @@ -1204,7 +1645,7 @@ internal static string Register_Already_Registered_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Different_Confirm_Password_Error { get { @@ -1213,7 +1654,7 @@ internal static string Register_Different_Confirm_Password_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Only_Admin_Error { get { @@ -1222,7 +1663,7 @@ internal static string Register_Only_Admin_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Success { get { @@ -1231,7 +1672,7 @@ internal static string Register_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Wrong_Last_Play_Time_Error { get { @@ -1240,7 +1681,16 @@ internal static string Register_Wrong_Last_Play_Time_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Reject { + get { + return ResourceManager.GetString("Reject", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Reset { get { @@ -1249,7 +1699,16 @@ internal static string Reset { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Reset_Password { + get { + return ResourceManager.GetString("Reset Password", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Reset_Password_Confirm_1 { get { @@ -1258,7 +1717,7 @@ internal static string Reset_Password_Confirm_1 { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Reset_Password_Confirm_2 { get { @@ -1267,7 +1726,16 @@ internal static string Reset_Password_Confirm_2 { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Result { + get { + return ResourceManager.GetString("Result", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Rows_Per_Page_ { get { @@ -1276,7 +1744,25 @@ internal static string Rows_Per_Page_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Save { + get { + return ResourceManager.GetString("Save", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Score { + get { + return ResourceManager.GetString("Score", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Search { get { @@ -1285,7 +1771,16 @@ internal static string Search { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Search_by_Name__Comp_ID { + get { + return ResourceManager.GetString("Search by Name, Comp ID", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Search_by_Name__ID__or_Access_Code { get { @@ -1294,7 +1789,7 @@ internal static string Search_by_Name__ID__or_Access_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Search_by_Title__Artist_or_Date { get { @@ -1303,7 +1798,7 @@ internal static string Search_by_Title__Artist_or_Date { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Search_by_Title_or_Artist { get { @@ -1312,7 +1807,7 @@ internal static string Search_by_Title_or_Artist { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Second_Dan { get { @@ -1321,7 +1816,7 @@ internal static string Second_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Second_Kyuu { get { @@ -1330,7 +1825,25 @@ internal static string Second_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Section_No_ { + get { + return ResourceManager.GetString("Section No.", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Select_a_Title { + get { + return ResourceManager.GetString("Select a Title", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Set_Up_Each_Time { get { @@ -1339,7 +1852,7 @@ internal static string Set_Up_Each_Time { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Settings { get { @@ -1348,7 +1861,7 @@ internal static string Settings { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Seventh_Dan { get { @@ -1357,7 +1870,25 @@ internal static string Seventh_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Show { + get { + return ResourceManager.GetString("Show", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Show_QR_Code { + get { + return ResourceManager.GetString("Show QR Code", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Shuriken { get { @@ -1366,7 +1897,7 @@ internal static string Shuriken { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Sixth_Dan { get { @@ -1375,7 +1906,7 @@ internal static string Sixth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Skip_Song { get { @@ -1384,7 +1915,7 @@ internal static string Skip_Song { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song_List { get { @@ -1393,7 +1924,7 @@ internal static string Song_List { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song_Name { get { @@ -1402,7 +1933,7 @@ internal static string Song_Name { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song_Number { get { @@ -1411,7 +1942,16 @@ internal static string Song_Number { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Song_Options { + get { + return ResourceManager.GetString("Song Options", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Song_Title___Artist { get { @@ -1420,7 +1960,16 @@ internal static string Song_Title___Artist { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Soul_Gauge { + get { + return ResourceManager.GetString("Soul Gauge", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Soya { get { @@ -1429,7 +1978,25 @@ internal static string Soya { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Speed { + get { + return ResourceManager.GetString("Speed", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Stage { + get { + return ResourceManager.GetString("Stage", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Success { get { @@ -1438,7 +2005,7 @@ internal static string Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Synthdrum { get { @@ -1447,7 +2014,7 @@ internal static string Synthdrum { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Taiko { get { @@ -1456,7 +2023,7 @@ internal static string Taiko { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Tambourine { get { @@ -1465,7 +2032,7 @@ internal static string Tambourine { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Tatsujin { get { @@ -1474,7 +2041,7 @@ internal static string Tatsujin { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Tenth_Dan { get { @@ -1483,7 +2050,7 @@ internal static string Tenth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Third_Dan { get { @@ -1492,7 +2059,7 @@ internal static string Third_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Third_Kyuu { get { @@ -1501,7 +2068,43 @@ internal static string Third_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Title { + get { + return ResourceManager.GetString("Title", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Title_Plate { + get { + return ResourceManager.GetString("Title Plate", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Tone { + get { + return ResourceManager.GetString("Tone", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Total_Clears { + get { + return ResourceManager.GetString("Total Clears", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Total_Credits_Played { get { @@ -1510,7 +2113,43 @@ internal static string Total_Credits_Played { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Total_Donderful_Combos { + get { + return ResourceManager.GetString("Total Donderful Combos", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Total_Full_Combos { + get { + return ResourceManager.GetString("Total Full Combos", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Total_Hits { + get { + return ResourceManager.GetString("Total Hits", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Totals { + get { + return ResourceManager.GetString("Totals", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string UI { get { @@ -1519,7 +2158,7 @@ internal static string UI { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Unknown_Access_Code_Error { get { @@ -1528,7 +2167,7 @@ internal static string Unknown_Access_Code_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Unknown_Error { get { @@ -1537,7 +2176,7 @@ internal static string Unknown_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Unregister { get { @@ -1546,7 +2185,7 @@ internal static string Unregister { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Ura_Oni { get { @@ -1555,7 +2194,7 @@ internal static string Ura_Oni { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string UraOni { get { @@ -1564,7 +2203,7 @@ internal static string UraOni { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string User { get { @@ -1573,7 +2212,7 @@ internal static string User { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string User_ID { get { @@ -1582,7 +2221,7 @@ internal static string User_ID { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Users { get { @@ -1591,7 +2230,16 @@ internal static string Users { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Vanish { + get { + return ResourceManager.GetString("Vanish", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string View_Play_Data { get { @@ -1600,7 +2248,16 @@ internal static string View_Play_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Voice { + get { + return ResourceManager.GetString("Voice", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Wadadon { get { @@ -1609,7 +2266,16 @@ internal static string Wadadon { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Welcome_to_TaikoWebUI_ { + get { + return ResourceManager.GetString("Welcome to TaikoWebUI!", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string Whimsical { get { @@ -1618,7 +2284,7 @@ internal static string Whimsical { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Wonderfultaiko { get { @@ -1627,7 +2293,7 @@ internal static string Wonderfultaiko { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Wrap { get { diff --git a/TaikoWebUI/Localization/LocalizationResource.en-US.resx b/TaikoWebUI/Localization/LocalizationResource.en-US.resx index e9c2c413..3cc99fa4 100644 --- a/TaikoWebUI/Localization/LocalizationResource.en-US.resx +++ b/TaikoWebUI/Localization/LocalizationResource.en-US.resx @@ -1,839 +1,867 @@  - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - Dashboard - - - Users - - - Edit Profile - - - User - - - View Play Data - - - High Scores - - - Show QR Code - - - Manage Access Codes - - - Change Password - - - Reset Password - - - Delete User - - - Welcome to TaikoWebUI! - - - Song - - - Level - - - Genre - - - Best Score - - - Best Crown - - - Best Rank - - - Good - - - OK - - - Bad - - - Drumroll - - - MAX Combo - - - AI Battle Data - - - Last Played - - - Total Plays - - - Total Clears - - - Total Full Combos - - - Total Donderful Combos - - - Songs - - - Hide - - - Show - - - Section No. - - - Result - - - Score - - - Crown - - - No data - - - "Please log in by clicking on "Users" tab first. - - - Total Hits - - - Soul Gauge - - - Songs - - - Conditions - - - Red Clear - - - Gold - - - Not Passed - - - Pass - - - Totals - - - Details - - - Stage - - - Dani Dojo - - - Profile - - - Profile Options - - - Costume + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + MM/dd/yyyy h:mm:ss tt - - Costume Options + + Generate Invite Code - - Song Options + + Register - - Player + + Log In - + Achievement Panel - - Save - - - Language - - - Name - - - Title - - - Title Plate - - + Achievement Panel Difficulty - - Display Dan Rank on Name Plate - - - Display Achievement Panel - - - Difficulty Setting Course - - - Difficulty Setting Star - - - Difficulty Setting Sort - - - Select a Title - - - Head - - - Body - - - Face - - - Kigurumi - - - Puchi - - - Body Color - - - Face Color - - - Limb Color - - - Vanish - - - Inverse - - - Skip Song - - - Voice - - - Speed - - - Random - - - Tone - - - Notes Position - - - Are you sure you want to reset the password for this user? - - - This will remove the user's current password and user will have to register again. - - - MM/dd/yyyy h:mm:ss tt + + AI Battle Data - - Generate Invite Code + + Bad - - Register + + Best Crown - - Log In + + Best Rank - + Log Out - + Play Data - + + High Scores + + + Manage Access Codes + + Add Access Code - + New Access Code - + Delete - + Access Code - + Old Password - + New Password - + Confirm New Password - + OK - + QR Code - - Chojin + + 5th Kyuu - - Eighth Dan + + 4th Kyuu - - 5th Dan + + 3rd Kyuu - - 5th Kyuu + + 2nd Kyuu - + + 1st Kyuu + + 1st Dan - - 1st Kyuu + + 2nd Dan + + + 3rd Dan - + 4th Dan - - 4th Kyuu + + 5th Dan - - Gaiden + + 6th Dan - - Kuroto + + 7th Dan - - Meijin + + Eighth Dan - + 9th Dan - - 2nd Dan + + 10th Dan - - 2nd Kyuu + + Kuroto - - 7th Dan + + Meijin - - 6th Dan + + Chojin - + Tatsujin - - 10th Dan - - - 3rd Dan - - - 3rd Kyuu + + Gaiden - + Gold Full Combo - - Red Donderful Combo - - + Red Full Combo - + + Red Donderful Combo + + Gold Donderful Combo - + + Songs + + + "Please log in by clicking on "Users" tab first. + + + Dani Dojo + + + Songs + + + Song + + Song Title / Artist - + Search by Title or Artist - + Filter by Genre - + Play History - + No play history found - + Password - + Settings - + Play Time - + Rank - + Difficulty - + Song Number - + Search by Title, Artist or Date - + + Users + + + Dashboard + + Unregister - + and - + other Access Code(s) - + Copy to Clipboard - + Invite Code - + Error - + + View Play Data + + + Not Passed + + + User + + Access Code is required - + "Invite Code (Optional)" - + Last Play Date - + Last Play Time(5 Min Around Credit End) - + Password is required - + Confirm Password - + Confirm password is required - + Unknown Error - + Success - + Ura - + Extreme - + Hard - + Normal - + Easy - + Rows Per Page: - + + Total Plays + + UI - + Add - + New access code bound successfully. - + Not logged in.<br />Please log in first and try again. - + Bound access code upper limit reached.<br />Please delete one access code first. - + This access code has already been bound. - + Access code cannot be empty.<br />Please enter a valid access code. - + This action is not allowed.<br />Only admin will be able to edit another user's access code. - + Only admin can log in. - + Password changed successfully. - + Confirm new password is different from new password.<br />Please check again. - + Unknown access code.<br />Please play one game with this access code and try again. - + Current password is wrong.<br />Please check again. - + Access code not registered.<br />Please register first and try again. - + Wrong password.<br />Please check again. - + Only admin can register. - + Access code registered successfully. - + Confirm password is not the same as password.<br />Please check again. - + Access code is already registered.<br />Please use set password to login. - + Wrong last play time.<br />If you have forgotten when you last played, please play another game with this access code or contact admin. - + Cancel - + Cannot delete user's last access code. - + Access code deleted successfully. - + ID - + + Edit Profile + + Are you sure you want to delete this access code? - + Currently Selected: - + Reset - + + Are you sure you want to reset the password for this user? + + + This will remove the user's current password and user will have to register again. + + Do you really want to delete this user's data?<br />All the related data will be deleted and this process cannot be undone! - + User deleted successfully. - + + Skip Song + + Off - + Whimsical - + Messy - + Taiko - + Festival - + Dogs & Cats - + Deluxe Taiko - + Drumset - + Tambourine - + Wadadon - + Clapping - + Conga - + 8-bit Taiko - + Heave-ho - + Mecha Don - + Funassyi - + Rap - + Hosogai - + Akemi - + Synth Drum - + Shuriken - + Bubble Pop - + Electric Guitar - + Ura - + Set Up Each Time - + Default - + Not Cleared - + Not Full Combo - + Not Donderful Combo - + Japanese - + English - + Chinese Traditional - + Korean - + Chinese Simplified - + ★ 1 - - ★ 10 - - + ★ 2 - + ★ 3 - + ★ 4 - + ★ 5 - + ★ 6 - + ★ 7 - + ★ 8 - + ★ 9 - + + ★ 10 + + Are you sure you want to log out? - + Leaderboard - + + No data + + User ID - + Search by Name, ID, or Access Code - - Player Titles - - - Search - + + Player Titles + + + Search + + + Show QR Code + + + Change Password + + + Reset Password + + + Delete User + + + Welcome to TaikoWebUI! + + + Level + + + Genre + + + Best Score + + + Good + + + OK + + + Drumroll + + + MAX Combo + + + Last Played + + + Total Clears + + + Total Full Combos + + + Total Donderful Combos + + + Hide + + + Show + + + Section No. + + + Result + + + Score + + + Crown + + + Total Hits + + + Soul Gauge + + + Conditions + + + Red Clear + + + Gold + + + Pass + + + Totals + + + Details + + + Stage + + + Profile + + + Profile Options + + + Costume + + + Costume Options + + + Song Options + + + Player + + + Save + + + Language + + + Name + + + Title + + + Title Plate + + + Display Dan Rank on Name Plate + + + Display Achievement Panel + + + Difficulty Setting Course + + + Difficulty Setting Star + + + Difficulty Setting Sort + + + Select a Title + + + Head + + + Body + + + Face + + + Kigurumi + + + Puchi + + + Body Color + + + Face Color + + + Limb Color + + + Vanish + + + Inverse + + + Voice + + + Speed + + + Random + + + Tone + + + Notes Position + + + Challenge + + + Competition + + + Official Competition + + + Comp ID + + + Search by Name, Comp ID + + + Comment + + + Participate + + + Accept + + + Reject + + + Information + + + Challenge Competition Data + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx index 5bffda97..0d1af08d 100644 --- a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx +++ b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx @@ -117,275 +117,35 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - Tableau de bord - - - Utilisateurs - - - Profil - - - Utilisateur - - - Données de jeu - - - Meilleurs Scores - - - Afficher le Code QR - - - Codes d'accès - - - Changer le mot de passe - - - Réinitialiser le mot de passe - - - Supprimer l'utilisateur - - - Bienvenue sur TaikoWebUI ! - - - Musique - - - Niveau - - - Genre - - - Meilleur score - - - Meilleure couronne - - - Meilleur rank - - - Good - - - OK - - - Bad - - - Drumroll - - - Combo MAX - - - Données du mode IA Battle - - - Joué la dernière fois - - - Nombre total de parties - - - Total Clears - - - Nombre total de Full Combos - - - Nombre total de Combos Donderful - - - Musiques - - - Cacher - - - Afficher - - - Numéro de section - - - Résultats - - - Score - - - Couronnes - - - Pas de données - - - Veuillez vous connecter en cliquant d'abord sur l'onglet “Utilisateurs”. - - - Total Hits - - - Jauge d'âme - - - Musiques - - - Conditions - - - Red Clear - - - Gold - - - Pas Clear - - - Pass - - - Totaux - - - Details - - - Stage - - - Dani Dojo - - - Profil - - - Options de profil - - - Costume + + dd/MM/yyyy h:mm:ss tt - - Options de costume + + Créer un code d'invitation - - Options de jeu + + Inscription - - Joueur + + Connexion Tableau de reussite - - Sauvegarder - - - Langue - - - Nom - - - Titre - - - Décor de Plaque - Difficulté du tableau de réussite - - Afficher le Dan sur la plaque - - - Afficher le Tableau de Réussite - - - Mode recherche : Difficulté - - - Mode recherche : Etoiles - - - Mode recherche : Tri - - - Sélectionner un titre - - - Tête - - - Corps - - - Visage - - - Kigurumi - - - Puchi - - - Couleur du Corps - - - Couleur du Visage - - - Couleur des Membres - - - Disparition - - - Inverser - - - Voix - - - Vitesse - - - Aléatoire - - - Son de tambour - - - Position des notes - - - Êtes-vous sûr de vouloir réinitialiser le mot de passe de cet utilisateur ? - - - Le mot de passe actuel de l'utilisateur sera alors supprimé et l'utilisateur devra s'inscrire à nouveau. - - - dd/MM/yyyy h:mm:ss tt + + Données du mode IA Battle - - Créer un code d'invitation + + Bad - - Inscription + + Meilleure couronne - - Connexion + + Meilleur rank Déconnexion @@ -393,6 +153,12 @@ Données de jeu + + Meilleurs Scores + + + Codes d'accès + Ajouter un code d'accès @@ -420,77 +186,92 @@ Code QR - - Chojin + + 5ème Kyuu - - 8ème Dan + + 4ème Kyuu - - 5ème Dan + + 3ème Kyuu - - 5ème Kyuu + + 2ème Kyuu + + + 1er Kyuu 1er Dan - - 1er Kyuu + + 2ème Dan + + + 3ème Dan 4ème Dan - - 4ème Kyuu + + 5ème Dan - - Gaiden + + 6ème Dan - - Kuroto + + 7ème Dan - - Meijin + + 8ème Dan 9ème Dan - - 2ème Dan + + 10ème Dan - - 2ème Kyuu + + Kuroto - - 7ème Dan + + Meijin - - 6ème Dan + + Chojin Tatsujin - - 10ème Dan - - - 3ème Dan - - - 3ème Kyuu + + Gaiden Gold Full Combo + + Red Full Combo + Red Donderful Combo - - Red Full Combo + + Gold Donderful Combo + + + Musiques + + + Veuillez vous connecter en cliquant d'abord sur l'onglet “Utilisateurs”. + + + Dani Dojo + + + Musiques - - Gold Donderful Combo + + Musique Titre / Artiste de la musique @@ -528,6 +309,12 @@ Recherche par titre, artiste ou date + + Utilisateurs + + + Tableau de bord + Désinscription @@ -546,6 +333,15 @@ Erreur + + Données de jeu + + + Non validé + + + Utilisateur + Le code d'accès est requis @@ -591,6 +387,9 @@ Rangées par page : + + Nombre total de parties + UI @@ -624,211 +423,445 @@ La confirmation du nouveau mot de passe est différent du nouveau mot de passe.<br />Veuillez réessayer. - - Code d'accès inconnu.<br />Veuillez jouer une partie avec ce code d'accès et réessayer. + + Code d'accès inconnu.<br />Veuillez jouer une partie avec ce code d'accès et réessayer. + + + Le mot de passe actuel est erroné.<br />>Veuillez réessayer. + + + Code d'accès non enregistré.<br />Veuillez d'abord vous inscrire et réessayer. + + + Mot de passe erroné.<br />Vérifiez à nouveau. + + + Seuls les administrateurs peuvent s'inscrire. + + + Code d'accès enregistré avec succès. + + + Le mot de passe de confirmation est différent.<br />Veuillez réessayer. + + + Le code d'accès est déjà enregistré.<br />Veuillez utiliser le mot de passe défini pour vous connecter. + + + Mauvaise date de dernière partie.<br />Si vous avez oublié la date de votre derniere partie, veuillez en jouer une autre avec ce code d'accès ou contacter l'administrateur du serveur! + + + Annuler + + + Impossible de supprimer le dernier code d'accès de l'utilisateur. + + + Code d'accès supprimé avec succès. + + + ID + + + Profil + + + Êtes-vous sûr de vouloir supprimer ce code d'accès ? + + + Actuellement sélectionné : + + + Réinitialiser + + + Êtes-vous sûr de vouloir réinitialiser le mot de passe de cet utilisateur ? + + + Le mot de passe actuel de l'utilisateur sera alors supprimé et l'utilisateur devra s'inscrire à nouveau. + + + Voulez-vous vraiment supprimer les données de cet utilisateur ? <br />Toutes les données associées seront supprimées et ne pourront pas être récupérées ! + + + Utilisateur supprimé. + + + Passer la chanson + + + Désactivé + + + Fantaisiste + + + Désordonné + + + Taiko + + + Festival + + + Chiens & Chats + + + Taiko Deluxe + + + Tambour + + + Tambourin + + + Wadadon + + + Applaudissements + + + Conga + + + Taiko 8 bits + + + Oh hisse + + + Don Mecha + + + Funassyi + + + Rap + + + Hosogai + + + Akemi + + + Tambour Synthétique + + + Shuriken + + + Bubble Pop + + + Guitare électrique + + + Ura + + + Configurer à chaque fois + + + Défaut + + + Pas Clear + + + Pas Full Combo + + + Pas Donderful Combo + + + Japonais + + + Anglais + + + Chinois traditionnel + + + Coréen + + + Chinois simplifié + + + ★ 1 + + + ★ 2 + + + ★ 3 + + + ★ 4 + + + ★ 5 + + + ★ 6 + + + ★ 7 + + + ★ 8 + + + ★ 9 + + + ★ 10 + + + Êtes-vous sûr de vouloir vous déconnecter ? + + + Classement + + + Pas de données + + + ID de l'utilisateur + + + Recherche par nom, identifiant ou code d'accès + + + Titres du joueur + + + Rechercher + + + Afficher le Code QR + + + Changer le mot de passe + + + Réinitialiser le mot de passe + + + Supprimer l'utilisateur + + + Bienvenue sur TaikoWebUI ! + + + Niveau - - Le mot de passe actuel est erroné.<br />>Veuillez réessayer. + + Genre - - Code d'accès non enregistré.<br />Veuillez d'abord vous inscrire et réessayer. + + Meilleur score - - Mot de passe erroné.<br />Vérifiez à nouveau. + + Good - - Seuls les administrateurs peuvent s'inscrire. + + OK - - Code d'accès enregistré avec succès. + + Drumroll - - Le mot de passe de confirmation est différent.<br />Veuillez réessayer. + + Combo MAX - - Le code d'accès est déjà enregistré.<br />Veuillez utiliser le mot de passe défini pour vous connecter. + + Joué la dernière fois - - Mauvaise date de dernière partie.<br />Si vous avez oublié la date de votre derniere partie, veuillez en jouer une autre avec ce code d'accès ou contacter l'administrateur du serveur! + + Total Clears - - Annuler + + Nombre total de Full Combos - - Impossible de supprimer le dernier code d'accès de l'utilisateur. + + Nombre total de Combos Donderful - - Code d'accès supprimé avec succès. + + Cacher - - ID + + Afficher - - Êtes-vous sûr de vouloir supprimer ce code d'accès ? + + Numéro de section - - Actuellement sélectionné : + + Résultats - - Réinitialiser + + Score - - Voulez-vous vraiment supprimer les données de cet utilisateur ? <br />Toutes les données associées seront supprimées et ne pourront pas être récupérées ! + + Couronnes - - Utilisateur supprimé. + + Total Hits - - ★ 1 + + Jauge d'âme - - ★ 2 + + Conditions - - ★ 3 + + Red Clear - - ★ 4 + + Gold - - ★ 5 + + Pass - - ★ 6 + + Totaux - - ★ 7 + + Details - - ★ 8 + + Stage - - ★ 9 + + Profil - - ★ 10 + + Options de profil - - Non validé + + Costume - - ID de l'utilisateur + + Options de costume - - Classement + + Options de jeu - - Êtes-vous sûr de vouloir vous déconnecter ? + + Joueur - - Taiko 8 bits + + Sauvegarder - - Akemi + + Langue - - Chinois simplifié + + Nom - - Chinois traditionnel + + Titre - - Applaudissements + + Décor de Plaque - - Conga + + Afficher le Dan sur la plaque - - Défaut + + Afficher le Tableau de Réussite - - Tambour + + Mode recherche : Difficulté - - Désactivé + + Mode recherche : Etoiles - - Fantaisiste + + Mode recherche : Tri - - Désordonné + + Sélectionner un titre - - Taiko + + Tête - - Festival + + Corps - - Chiens & Chats + + Visage - - Taiko Deluxe + + Kigurumi - - Tambourin + + Puchi - - Wadadon + + Couleur du Corps - - Oh hisse + + Couleur du Visage - - Don Mecha + + Couleur des Membres - - Funassyi + + Disparition - - Rap + + Inverser - - Hosogai + + Voix - - Tambour Synthétique + + Vitesse - - Shuriken + + Aléatoire - - Bubble Pop + + Son de tambour - - Guitare électrique + + Position des notes - - Ura + + Défi - - Configurer à chaque fois + + Compétition - - Pas Full Combo + + Compétition Officielle - - Pas Donderful Combo + + ID de compé - - Japonais + + Recherche par nom, ID de compé - - Anglais + + Commentaire - - Coréen + + Rejoindre - - Passer la chanson + + Accepter - - Rechercher + + Rejeter - - Titres du joueur + + Information - - Recherche par nom, identifiant ou code d'accès + + Données de compétition de défi \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.ja.resx b/TaikoWebUI/Localization/LocalizationResource.ja.resx index b571791a..0f9255f2 100644 --- a/TaikoWebUI/Localization/LocalizationResource.ja.resx +++ b/TaikoWebUI/Localization/LocalizationResource.ja.resx @@ -1,839 +1,867 @@  - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - メニュー - - - ユーザー管理 - - - プロフィール編集 - - - ユーザー - - - プレイデータ - - - 自己ベスト - - - QRコード - - - アクセスコード管理 - - - パスワード変更 - - - パスワードリセット - - - ユーザー削除 - - - TaikoWebUIへようこそ! - - - 曲名 - - - ★の数 - - - ジャンル - - - ベストスコア - - - ベスト王冠 - - - ベストランク - - - - - - - - - 不可 - - - 連打 - - - 最大コンボ数 - - - AIバトル演奏データ - - - ラストプレイ - - - プレイ回数 - - - クリア回数 - - - フルコンボ回数 - - - ドンダフルコンボ回数 - - - 曲目リスト - - - 隠す - - - 表示 - - - 区間 - - - 結果 - - - スコア - - - 王冠 - - - データがありません - - - "ユーザー管理"タブでログインしてください。 - - - 叩けた数 - - - 魂ゲージ - - - 課題曲 - - - 条件 - - - 赤合格 - - - 金合格 - - - 未合格 - - - 合格 - - - 合計 - - - 記録 - - - 曲目 - - - 段位道場 - - - プロフィール - - - プロフィール設定 - - - 着せ替え + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + yyyy/MM/dd HH:mm:ss - - 着せ替え設定 + + 招待コード生成 - - 演奏オプション + + 登録 - - プレイヤー + + ログイン - + 総合成績パネル - - 保存 - - - 言語 - - - 名前 - - - 称号 - - - 称号タイプ - - + 総合成績パネルの難易度 - - 段位表示 - - - 成績表示 - - - むずかしさからえらぶの難易度 - - - むずかしさからえらぶの★の数 - - - むずかしさからえらぶの表示順 - - - 称号を選択してください - - - あたま - - - からだ - - - メイク - - - きぐるみ - - - ぷちキャラ - - - どうの色 - - - かおの色 - - - てあしの色 - - - ドロン - - - あべこべ - - - 演奏スキップ - - - ボイス - - - はやさ - - - ランダム - - - 音色 - - - 音符位置調整 - - - yyyy/MM/dd HH:mm:ss - - - 招待コード生成 - - - 登録 + + AIバトル演奏データ - - 本当にこのユーザーのパスワードをリセットしますか? + + 不可 - - これにより、ユーザーの現在のパスワードは削除され、ユーザーは再度登録する必要があります。 + + ベスト王冠 - - ログイン + + ベストランク - + ログアウト - + プレイデータ - + + 自己ベスト + + + アクセスコード管理 + + アクセスコード追加 - + 新しいアクセスコード - + 削除 - + アクセスコード - + 旧パスワード - + 新しいパスワード - + パスワードの再入力 - + 確認 - + QRコード - - 超人 + + 五級 - - 八段 + + 四級 - - 五段 + + 三級 - - 五級 + + 二級 - + + 一級 + + 一段 - - 一級 + + 二段 + + + 三段 - + 四段 - - 四級 + + 五段 - - 外伝 + + 六段 - - 玄人 + + 七段 - - 名人 + + 八段 - + 九段 - - 二段 + + 十段 - - 二級 + + 玄人 - - 七段 + + 名人 - - 六段 + + 超人 - + 達人 - - 十段 - - - 三段 - - - 三級 + + 外伝 - + 金金合格 - - 虹赤合格 - - + 金赤合格 - + + 虹赤合格 + + 虹金合格 - + + 曲目リスト + + + "ユーザー管理"タブでログインしてください。 + + + 段位道場 + + + 課題曲 + + + 曲名 + + 曲名 / Artist - + 曲名、アーティスト名で検索 - + ジャンル検索 - + プレイ履歴 - + プレイ履歴なし - + パスワード - + 設定 - + プレイ時間 - + ランク - + 難易度 - + 曲数 - + 曲名、アーティスト名、日付で検索 - + + ユーザー管理 + + + メニュー + + 登録解除 - + - + 他のアクセスコード - + クリップボードにコピー - + 招待コード - + エラー - + + プレイデータ + + + 未合格 + + + ユーザー + + アクセスコードが必要です - + 招待コード(任意) - + 前回プレイデート - + 前回プレイ時間(クレジット終了5分以内) - + パスワードが必要です - + パスワードの再入力 - + アクセスコードの再入力が必要です - + 未知のエラー - + 成功 - + おに裏 - + おに - + むずかしい - + ふつう - + かんたん - + 1ページ当たりの行数 - + + プレイ回数 + + UI - + 追加 - + 新しいアクセスコードのバインドに成功。 - + ログインしていません。<br />ログインしてからもう一度お試しください。 - + バウンドアクセスコードの上限に達しました。<br />まずアクセスコードを1つ削除してください。 - + このアクセスコードはすでにバインドされています。 - + アクセスコードは空ではありません。<br />有効なアクセスコードを入力してください。 - + この操作は許可されていません。<br />他のユーザーのアクセスコードを編集できるのは管理者のみです。 - + ログインできるのは管理者のみです。 - + パスワードの変更に成功しました。 - + 新しいパスワードが違うことを確認してください。<br />もう一度確認してください。 - + 不明なアクセスコードです。<br />このアクセスコードでゲームを1回プレイしてから、再度お試しください。 - + 現在のパスワードが間違っています。<br />再度ご確認ください。 - + アクセスコードが登録されていません。<br />まず登録してから再度お試しください。 - + パスワードが間違っています。<br />再度ご確認ください。 - + 登録できるのは管理者のみです。 - + アクセスコードが正常に登録されました。 - + パスワードの確認がパスワードと一致しません。<br />再度ご確認ください。 - + アクセスコードは既に登録されています。<br />設定したパスワードを使用してログインしてください。 - + 最後のプレイ時間が間違っています。<br />最後にプレイした時間を忘れた場合は、このアクセスコードで再度ゲームをプレイするか、管理者に連絡してください。 - + キャンセル - + ユーザーの最後のアクセスコードを削除できません。 - + アクセスコードが正常に削除されました。 - + ID - + + プロフィール編集 + + このアクセスコードを削除してもよろしいですか? - + 現在選択中: - + リセット - + + 本当にこのユーザーのパスワードをリセットしますか? + + + これにより、ユーザーの現在のパスワードは削除され、ユーザーは再度登録する必要があります。 + + このユーザーのデータを本当に削除してもよろしいですか?<br />関連するすべてのデータが削除され、この操作は元に戻せません! - + ユーザーが正常に削除されました。 - + + 演奏スキップ + + なし - + きまぐれ - + でたらめ - + 太鼓 - + お祭り - + いぬねこ - + 豪華な太鼓 - + ドラム - + タンバリン - + 和田どん - + 手拍子 - + コンガ - + 8ビット太鼓 - + ソイヤ - + メカドン - + ふなっしー - + ラップ - + 細貝さん - + 朱美ちゃん - + シンセドラム - + しゅりけん - + プチプチ - + エレキギター - + おに裏 - + 毎回設定 - + デフォルト - + 未クリア優先 - + 未フルコンボ優先 - + 未ドンダフルコンボ優先 - + 日本語 - + 英語 - + 繁体字中国語 - + 韓国語 - + 簡体字中国語 - + ★ 1 - - ★ 10 - - + ★ 2 - + ★ 3 - + ★ 4 - + ★ 5 - + ★ 6 - + ★ 7 - + ★ 8 - + ★ 9 - + + ★ 10 + + ログアウトしてもよろしいですか? - + ランキング - + + データがありません + + ユーザーID - + 名前、ID、アクセスコードで検索 - - プレイヤー称号 - - - 検索 - + + プレイヤー称号 + + + 検索 + + + QRコード + + + パスワード変更 + + + パスワードリセット + + + ユーザー削除 + + + TaikoWebUIへようこそ! + + + ★の数 + + + ジャンル + + + ベストスコア + + + + + + + + + 連打 + + + 最大コンボ数 + + + ラストプレイ + + + クリア回数 + + + フルコンボ回数 + + + ドンダフルコンボ回数 + + + 隠す + + + 表示 + + + 区間 + + + 結果 + + + スコア + + + 王冠 + + + 叩けた数 + + + 魂ゲージ + + + 条件 + + + 赤合格 + + + 金合格 + + + 合格 + + + 合計 + + + 記録 + + + 曲目 + + + プロフィール + + + プロフィール設定 + + + 着せ替え + + + 着せ替え設定 + + + 演奏オプション + + + プレイヤー + + + 保存 + + + 言語 + + + 名前 + + + 称号 + + + 称号タイプ + + + 段位表示 + + + 成績表示 + + + むずかしさからえらぶの難易度 + + + むずかしさからえらぶの★の数 + + + むずかしさからえらぶの表示順 + + + 称号を選択してください + + + あたま + + + からだ + + + メイク + + + きぐるみ + + + ぷちキャラ + + + どうの色 + + + かおの色 + + + てあしの色 + + + ドロン + + + あべこべ + + + ボイス + + + はやさ + + + ランダム + + + 音色 + + + 音符位置調整 + + + 挑戦状 + + + 大会 + + + 公式大会 + + + 挑戦ID + + + 名前、挑戦IDで検索 + + + コメント + + + 参加する + + + 受け入れる + + + 拒否する + + + 詳細 + + + 挑戦と大会 + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.resx b/TaikoWebUI/Localization/LocalizationResource.resx index 12e87441..261ce544 100644 --- a/TaikoWebUI/Localization/LocalizationResource.resx +++ b/TaikoWebUI/Localization/LocalizationResource.resx @@ -1,650 +1,867 @@  - - - - + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + MM/dd/yyyy h:mm:ss tt - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx b/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx index 8551b35c..279c0739 100644 --- a/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx +++ b/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx @@ -1,839 +1,867 @@  - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - 主页 - - - 用户管理 - - - 编辑档案 - - - 用户 - - - 查看记录 - - - 最高分 - - - 查看二维码 - - - 管理访问码 - - - 更改密码 - - - 重置密码 - - - 删除帐号 - - - 欢迎来到TaikoWebUI! - - - 曲名 - - - ★数 - - - 分类 - - - 最佳成绩 - - - 最佳王冠 - - - 最佳评价 - - - - - - - - - 不可 - - - 连打 - - - 最大连击数 - - - AI对战数据 - - - 最后游玩时间 - - - 总游玩次数 - - - 总通过次数 - - - 总全连段次数 - - - 总完美连段次数 - - - 曲目列表 - - - 隐藏 - - - 显示 - - - 区间 - - - 结果 - - - 成绩 - - - 王冠 - - - 没有数据 - - - "请先在用户管理那边登录 - - - 总打击次数 - - - 魂条 - - - 课题曲 - - - 条件 - - - 赤合格 - - - 金合格 - - - 未合格 - - - 合格 - - - 总共 - - - 记录 - - - 曲目 - - - 段位道场 - - - 档案 - - - 档案设定 - - - 装饰 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + yyyy/M/d HH:mm:ss - - 装饰设定 + + 生成邀请码 - - 演奏设定 + + 注册 - - 玩家 + + 登录 - + 成绩版面 - - 储存 - - - 语言 - - - 名字 - - - 称号 - - - 称号种类 - - + 成绩版面难度 - - 显示段位 - - - 显示成绩版面 - - - 筛选歌曲版面难度 - - - 筛选歌曲版面★数 - - - 筛选歌曲版面顺序条件 - - - 选择一个称号 - - - 头部 - - - 身体 - - - 面部 - - - 套装 - - - 小角色 - - - 身体颜色 - - - 面部颜色 - - - 边框颜色 - - - 隐谱 - - - 反谱 - - - 跳过演奏 - - - 声音 - - - 流速 - - - 随机 - - - 音色 - - - 音符位置调整 - - - yyyy/M/d HH:mm:ss - - - 生成邀请码 - - - 注册 + + AI对战数据 - - 确定要为这位用户重置密码吗? + + 不可 - - 重置密码后,用户需要再次注册 + + 最佳王冠 - - 登录 + + 最佳评价 - + 登出 - + 游玩数据 - + + 最高分 + + + 管理访问码 + + 新增访问码 - + 新访问码 - + 删除 - + 访问码 - + 现有密码 - + 新密码 - + 再次输入新密码 - + 确定 - + 二维码 - - 超人 + + 五级 - - 八段 + + 四级 - - 五段 + + 三级 - - 五级 + + 二级 - + + 一级 + + 一段 - - 一级 + + 二段 + + + 三段 - + 四段 - - 四级 + + 五段 - - 外传 + + 六段 - - 玄人 + + 七段 - - 名人 + + 八段 - + 九段 - - 二段 + + 十段 - - 二级 + + 玄人 - - 七段 + + 名人 - - 六段 + + 超人 - + 达人 - - 十段 - - - 三段 - - - 三级 + + 外传 - + 金金合格 - - 虹赤合格 - - + 金赤合格 - + + 虹赤合格 + + 虹金合格 - + + 曲目列表 + + + "请先在用户管理那边登录 + + + 段位道场 + + + 课题曲 + + + 曲名 + + 曲名 / Artist - + 曲名/Artist名搜索 - + 分类过滤 - + 游玩历史 - + 沒有游玩历史 - + 密码 - + 设定 - + 游玩时间 - + 评价 - + 难度 - + 曲数 - + 曲名/Artist名/日期搜索 - + + 用户管理 + + + 主页 + + 注销账号 - + - + 个其他访问码 - + 复制到粘贴板 - + 邀请码 - + 错误 - + + 查看记录 + + + 未合格 + + + 用户 + + 访问码为必填项 - + 邀请码(可选) - + + 最后游玩日期 + + 最后游玩时间(游戏结束5分钟内) - + 密码为必填项 - + 再次输入密码 - + 再次输入密码为必填项 - + 不明错误 - + 成功 - + 里譜面 - + 魔王 - + 困难 - + 普通 - + 简单 - + 每页行数 - + + 总游玩次数 + + 界面 - + 添加 - + 新访问码绑定成功。 - + 用户未登录。<br />请先登录,然后再试一次。 - + 已达到绑定访问码数量上限。<br />请先删除一个已绑定的访问码。 - + 此访问码已被绑定。 - + 访问码不能为空。<br/>请输入有效的访问码。 - + 不允许执行此操作。<br />只有管理员可以编辑其他用户的访问码。 - + 只有管理员可以登录。 - + 密码更改成功。 - + 确认新密码与新密码不同。<br />请再次检查。 - + 未知的访问码。<br />请使用此访问码玩一局游戏后再试一次。 - + 当前密码错误。<br />请再检查一次。 - + 访问码未注册。<br />请先注册然后再试一次。 - + 密码错误。<br />请再检查一次。 - + 只有管理员可以注册。 - + 访问码已成功注册。 - + 确认密码与密码不一致。<br />请再检查一次。 - + 访问码已注册。<br />请使用设置的密码登录。 - + 最后的游戏时间错误。<br />如果您忘记了上次玩游戏的时间,请使用此访问码再玩一局游戏或联系管理员。 - + 取消 - + 无法删除用户的最后一个访问码。 - + 访问码已成功删除。 - + ID - - 最后游玩日期 + + 编辑档案 - + 您确定要删除此访问码吗? - + 当前选择: - + 重置 - + + 确定要为这位用户重置密码吗? + + + 重置密码后,用户需要再次注册 + + 您真的要删除该用户的数据吗?<br />所有相关数据将被删除,此过程无法撤销! - + 用户已成功删除。 - + + 跳过演奏 + + - + 随兴 - + 随意 - + 太鼓 - + 祭典 - + 狗与猫 - + 豪华的太鼓 - + 架子鼓 - + + 铃鼓 + + 和田咚 - + 手拍子 - + 康加鼓 - + 8-bit太鼓 - + 嘿哟 - + 机械咚 - + 船梨精 - + 说唱 - + 細貝先生 - + 朱美酱 - + 合成鼓 - - 铃鼓 - - + 手里剑 - + 泡泡 - + 电吉他 - + 里譜面 - + 每次设置 - + 默认 - + 未通关优先 - + 未全连段优先 - + 未全良连段优先 - + 日语 - + 英语 - + 繁体中文 - + 韩语 - + 简体中文 - + ★ 1 - - ★ 10 - - + ★ 2 - + ★ 3 - + ★ 4 - + ★ 5 - + ★ 6 - + ★ 7 - + ★ 8 - + ★ 9 - + + ★ 10 + + 您确定要登出吗? - + 排行榜 - + + 没有数据 + + 用户ID - + 名称,ID,访问码搜索 - - 玩家称号 - - - 搜索 - + + 玩家称号 + + + 搜索 + + + 查看二维码 + + + 更改密码 + + + 重置密码 + + + 删除帐号 + + + 欢迎来到TaikoWebUI! + + + ★数 + + + 分类 + + + 最佳成绩 + + + + + + + + + 连打 + + + 最大连击数 + + + 最后游玩时间 + + + 总通过次数 + + + 总全连段次数 + + + 总完美连段次数 + + + 隐藏 + + + 显示 + + + 区间 + + + 结果 + + + 成绩 + + + 王冠 + + + 总打击次数 + + + 魂条 + + + 条件 + + + 赤合格 + + + 金合格 + + + 合格 + + + 总共 + + + 记录 + + + 曲目 + + + 档案 + + + 档案设定 + + + 装饰 + + + 装饰设定 + + + 演奏设定 + + + 玩家 + + + 储存 + + + 语言 + + + 名字 + + + 称号 + + + 称号种类 + + + 显示段位 + + + 显示成绩版面 + + + 筛选歌曲版面难度 + + + 筛选歌曲版面★数 + + + 筛选歌曲版面顺序条件 + + + 选择一个称号 + + + 头部 + + + 身体 + + + 面部 + + + 套装 + + + 小角色 + + + 身体颜色 + + + 面部颜色 + + + 边框颜色 + + + 隐谱 + + + 反谱 + + + 声音 + + + 流速 + + + 随机 + + + 音色 + + + 音符位置调整 + + + 挑战书 + + + 大赛 + + + 官方大赛 + + + 比赛ID + + + 名称,比赛ID搜索 + + + 简介 + + + 参加 + + + 接受 + + + 拒绝 + + + 详情 + + + 挑战与大赛 + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx b/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx index 76376807..e8a8b7ff 100644 --- a/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx +++ b/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx @@ -1,839 +1,867 @@  - - - - + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, - PublicKeyToken=b77a5c561934e089 - - - - 首頁 - - - 管理用戶 - - - 編輯檔案 - - - 用戶 - - - 查看記錄 - - - 最高分 - - - 查看QR Code - - - 管理訪問碼 - - - 更改密碼 - - - 重置密碼 - - - 刪除帳號 - - - 歡迎來到TaikoWebUI! - - - 曲名 - - - ★數 - - - 分類 - - - 最佳成績 - - - 最佳皇冠 - - - 最佳評價 - - - - - - - - - 不可 - - - 連打 - - - 最大連擊數 - - - AI對戰數據 - - - 最後遊玩時間 - - - 總遊玩次數 - - - 總通過次數 - - - 總全接次數 - - - 總全良次數 - - - 曲目列表 - - - 隱藏 - - - 顯示 - - - 區間 - - - 结果 - - - 成績 - - - 皇冠 - - - 沒有數據 - - - "請先在管理用戶那邊登入 - - - 總打擊次數 - - - 魂條 - - - 課題曲 - - - 條件 - - - 赤合格 - - - 金合格 - - - 未合格 - - - 合格 - - - 總共 - - - 記錄 - - - 曲目 - - - 段位道埸 - - - 檔案 - - - 檔案設定 - - - 裝飾 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + yyyy/M/d HH:mm:ss - - 裝飾設定 + + 生成邀請碼 - - 演奏設定 + + 注冊 - - 玩家 + + 登錄 - + 成績版面 - - 儲存 - - - 語言 - - - 名字 - - - 稱號 - - - 稱號種類 - - + 成績版面難度 - - 顯示段位 - - - 顯示成績版面 - - - 篩選歌曲版面難度 - - - 篩選歌曲版面★數 - - - 篩選歌曲版面順序條件 - - - 選擇一個稱號 - - - 頭部 - - - 身體 - - - 面部 - - - 套装 - - - 小角色 - - - 身體顏色 - - - 面部顏色 - - - 邊框顏色 - - - 隱譜 - - - 反譜 - - - 跳略演奏 - - - 聲音 - - - 流速 - - - 隨機 - - - 音色 - - - 音符位置調整 - - - yyyy/M/d HH:mm:ss - - - 生成邀請碼 - - - 注冊 + + AI對戰數據 - - 確定要為這位用戶重置密碼嗎? + + 不可 - - 重置密碼后,用戶需要再次注冊 + + 最佳皇冠 - - 登錄 + + 最佳評價 - + 登出 - + 游玩數據 - + + 最高分 + + + 管理訪問碼 + + 新增訪問碼 - + 新訪問碼 - + 删除 - + 訪問碼 - + 現有密碼 - + 新密碼 - + 再次輸入新密碼 - + 確認 - + 查看QR Code - - 超人 - - - 八段 - - - 外傳 + + 五級 - + 四級 - - 四段 + + 三級 - + + 二級 + + 一級 - + 一段 - - 五級 + + 二段 + + + 三段 - + + 四段 + + 五段 - - 玄人 + + 六段 - - 名人 + + 七段 - + + 八段 + + 九段 - - 二段 + + 十段 - - 二級 + + 玄人 - - 七段 + + 名人 - - 六段 + + 超人 - + 達人 - - 十段 - - - 三段 - - - 三級 + + 外傳 - + 金金合格 - - 虹赤合格 - - + 金赤合格 - + + 虹赤合格 + + 虹金合格 - + + 曲目列表 + + + "請先在管理用戶那邊登入 + + + 段位道埸 + + + 課題曲 + + + 曲名 + + 曲名 / Artist - + 曲名/Artist名搜索 - + 分類過濾 - + 游玩歷史 - + 没有游玩歷史 - + 密碼 - + 設定 - + 游玩時間 - + 評價 - + 難度 - + 曲數 - + 曲名/Artist名/日期搜索 - + + 管理用戶 + + + 首頁 + + 注銷賬號 - + - + 個其他訪問碼 - + 複製到粘貼板 - + 邀請碼 - + 錯誤 - + + 查看記錄 + + + 未合格 + + + 用戶 + + 訪問碼為必填項 - + 邀請碼(可選) - + + 最後游玩日期 + + 最後游玩時間(游戲結束5分鐘内) - + 密碼為必填項 - + 再次輸入密碼 - + 再次輸入密碼為必填項 - + 不明錯誤 - + 成功 - + 裏譜面 - + 魔王 - + 困難 - + 普通 - + 簡單 - + 每頁行數 - + + 總遊玩次數 + + 界面 - + 添加 - + 新訪問碼綁定成功 。 - + 用戶未登錄。<br />請先登錄,然後再試一次。 - + 已達到綁定訪問碼數量上限。<br />請先刪除一個已綁定的訪問碼。 - + 此訪問碼已被綁定。 - + 訪問碼不能爲空。<br/>請輸入有效的訪問碼。 - + 不允許執行此操作。<br />只有管理員可以編輯其他用戶的訪問碼。 - + 只有管理員可以登錄。 - + 密碼更改成功。 - + 確認新密碼與新密碼不同。<br />請再次檢查。 - + 未知的訪問碼。<br />請使用此訪問碼玩一局遊戲後再試一次。 - + 當前密碼錯誤。<br />請再檢查一次。 - + 訪問碼未註冊。<br />請先註冊然後再試一次。 - + 密碼錯誤。<br />請再檢查一次。 - + 只有管理員可以註冊。 - + 訪問碼已成功註冊。 - + 確認密碼與密碼不一致。<br />請再檢查一次。 - + 訪問碼已註冊。<br />請使用設置的密碼登錄。 - + 最後的遊戲時間錯誤。<br />如果您忘記了上次玩遊戲的時間,請使用此訪問碼再玩一局遊戲或聯繫管理員。 - + 取消 - + 無法刪除用戶的最後一個訪問碼。 - + 訪問碼已成功刪除。 - + ID - - 最後游玩日期 + + 編輯檔案 - + 您確定要刪除此訪問碼嗎? - + 當前選擇: - + 重置 - + + 確定要為這位用戶重置密碼嗎? + + + 重置密碼后,用戶需要再次注冊 + + 您真的要刪除該用戶的數據嗎?<br />所有相關數據將被刪除,此過程無法撤銷! - + 用戶已成功刪除。 - + + 跳略演奏 + + - + 隨興 - + 隨意 - + 太鼓 - + 祭典 - + 狗與貓 - + 豪華的太鼓 - + 爵士鼓 - + + 鈴鼓 + + 和田咚 - + 手拍子 - + 康加鼓 - + 8-bit太鼓 - + 嘿喲 - + 機械咚 - + 船梨精 - + 説唱 - + 細貝先生 - + 朱美醬 - + 合成鼓 - - 鈴鼓 - - + 手裏劍 - + 泡泡 - + 電吉他 - + 裏譜面 - + 每次設置 - + 默認 - + 未通關優先 - + 未全連段優先 - + 未全良連段優先 - + 日語 - + 英語 - + 繁體中文 - + 韓語 - + 簡體中文 - + ★ 1 - - ★ 10 - - + ★ 2 - + ★ 3 - + ★ 4 - + ★ 5 - + ★ 6 - + ★ 7 - + ★ 8 - + ★ 9 - + + ★ 10 + + 您確定要登出嗎? - + 排行榜 - + + 沒有數據 + + 用戶ID - + 按名稱,ID ,訪問碼搜索 - - 玩家稱號 - - - 搜索 - + + 玩家稱號 + + + 搜索 + + + 查看QR Code + + + 更改密碼 + + + 重置密碼 + + + 刪除帳號 + + + 歡迎來到TaikoWebUI! + + + ★數 + + + 分類 + + + 最佳成績 + + + + + + + + + 連打 + + + 最大連擊數 + + + 最後遊玩時間 + + + 總通過次數 + + + 總全接次數 + + + 總全良次數 + + + 隱藏 + + + 顯示 + + + 區間 + + + 结果 + + + 成績 + + + 皇冠 + + + 總打擊次數 + + + 魂條 + + + 條件 + + + 赤合格 + + + 金合格 + + + 合格 + + + 總共 + + + 記錄 + + + 曲目 + + + 檔案 + + + 檔案設定 + + + 裝飾 + + + 裝飾設定 + + + 演奏設定 + + + 玩家 + + + 儲存 + + + 語言 + + + 名字 + + + 稱號 + + + 稱號種類 + + + 顯示段位 + + + 顯示成績版面 + + + 篩選歌曲版面難度 + + + 篩選歌曲版面★數 + + + 篩選歌曲版面順序條件 + + + 選擇一個稱號 + + + 頭部 + + + 身體 + + + 面部 + + + 套装 + + + 小角色 + + + 身體顏色 + + + 面部顏色 + + + 邊框顏色 + + + 隱譜 + + + 反譜 + + + 聲音 + + + 流速 + + + 隨機 + + + 音色 + + + 音符位置調整 + + + 挑戰書 + + + 大賽 + + + 官方大赛 + + + 比赛ID + + + 按名稱,比赛ID搜索 + + + 簡介 + + + 參加 + + + 接受 + + + 拒絕 + + + 詳情 + + + 挑戰與大赛 + \ No newline at end of file diff --git a/TaikoWebUI/Pages/Challenge.razor b/TaikoWebUI/Pages/Challenge.razor new file mode 100644 index 00000000..7a6ca1f9 --- /dev/null +++ b/TaikoWebUI/Pages/Challenge.razor @@ -0,0 +1,10 @@ +@using TaikoWebUI.Components; + +@page "/ChallengeCompe/{baid:int}/Challenge" + + + +@code { + [Parameter] + public int Baid { get; set; } +} diff --git a/TaikoWebUI/Pages/Compete.razor b/TaikoWebUI/Pages/Compete.razor new file mode 100644 index 00000000..5843dd52 --- /dev/null +++ b/TaikoWebUI/Pages/Compete.razor @@ -0,0 +1,10 @@ +@using TaikoWebUI.Components; + +@page "/ChallengeCompe/{baid:int}/Competition" + + + +@code { + [Parameter] + public int Baid { get; set; } +} diff --git a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor new file mode 100644 index 00000000..7c7662c2 --- /dev/null +++ b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor @@ -0,0 +1,255 @@ +@using System.Net +@using TaikoWebUI.Utilities; + +@inject HttpClient Client +@inject ISnackbar Snackbar +@inject IDialogService DialogService; + + + + @if (Mode == 1) + { + + + @Localizer["Create Challenge"] + + } + else if (Mode == 2) + { + + + @Localizer["Create Competition"] + + } + else if (Mode == 3) + { + + + @Localizer["Create Official Competition"] + + } + + + + + @if (Mode == 2 || Mode == 3) + { + + } + + @for (int i = 0; i < Info.challengeCompeteSongs.Count; i ++) + { + var song_idx = i; + var song_label = Localizer["Song"] + $" {song_idx + 1}"; + var song = Info.challengeCompeteSongs[song_idx]; + + + + + + @if (difficulties[song_idx] != Difficulty.None) + { + Difficulty difficulty = difficulties[song_idx]; + + } + @(musicDetails[song_idx].SongId == 0 ? Localizer["No Select"] : musicDetails[song_idx].SongName) + + + + @if (Info.challengeCompeteSongs.Count > 1) + { + + } + + + + + + @Localizer["Any"] + @Localizer["On"] + @Localizer["Off"] + + + @Localizer["Any"] + @Localizer["On"] + @Localizer["Off"] + + + @Localizer["Any"] + @for (uint idx = 0; idx < SpeedStrings.Length; idx++) + { + var speed_idx = idx; + @SpeedStrings[speed_idx] + } + + + @Localizer["Any"] + @foreach (var item in Enum.GetValues()) + { + @Localizer[item.ToString()] + } + + + + + + } + @if (Info.challengeCompeteSongs.Count < MaxSongs) + { + + } + + + @Localizer["Only Play Once"] + + + + @Localizer["Cancel"] + @Localizer["Create"] + + + +@code { + [CascadingParameter] + private MudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] + public int Mode { get; set; } = 0; + + [Parameter] + public int MaxSongs { get; set; } = 1; + + [Parameter] + public int MaxDays { get; set; } = 30; + + [Parameter] + public int MaxParticipant { get; set; } = 20; + + [Parameter] + public ChallengeCompeteCreateInfo Info { get; set; } = new(); + + private static readonly string[] SpeedStrings = + { + "1.0", "1.1", "1.2", "1.3", "1.4", + "1.5", "1.6", "1.7", "1.8", "1.9", + "2.0", "2.5", "3.0", "3.5", "4.0" + }; + + private string Name = string.Empty; + + private string Desc = string.Empty; + + private bool[] _expandeds = new bool[0]; + + private MusicDetail[] musicDetails = new MusicDetail[0]; + + private Difficulty[] difficulties = new Difficulty[0]; + + private int LastFor = 1; + + private int ParticipantCount = 1; + + private bool OnlyPlayOnce = false; + + + protected override void OnInitialized() + { + _expandeds = new bool[MaxSongs]; + musicDetails = new MusicDetail[MaxSongs]; + difficulties = new Difficulty[MaxSongs]; + for (int i = 0; i < MaxSongs; i++) + { + musicDetails[i] = new(); + difficulties[i] = Difficulty.None; + } + Info.challengeCompeteSongs.Add(new()); + } + + private void AddSong() + { + Info.challengeCompeteSongs.Add(new()); + } + + private async Task SelSong(int i) + { + var options = new DialogOptions { CloseOnEscapeKey = true }; + var parameters = new DialogParameters(); + parameters.Add("SelectedSong", musicDetails[i]); + + var reference = await DialogService.ShowAsync(Localizer["Create"], parameters, options); + var songInfo = await reference.GetReturnValueAsync(); + + if (songInfo != null) + { + musicDetails[i] = songInfo.MusicDetail; + difficulties[i] = songInfo.Difficulty; + } + } + + private void DelSong(int i) + { + Info.challengeCompeteSongs.RemoveAt(i); + for (int ex = i; ex < MaxSongs; ex ++) + { + if (ex + 1 < MaxSongs) + { + _expandeds[ex] = _expandeds[ex + 1]; + musicDetails[ex] = musicDetails[ex + 1]; + difficulties[ex] = difficulties[ex + 1]; + } + else + { + _expandeds[ex] = false; + musicDetails[ex] = new(); + difficulties[ex] = Difficulty.None; + } + } + } + + private void Cancel() => MudDialog.Cancel(); + + private async Task CreateChallengeCompetition() + { + var options = new DialogOptions { CloseOnEscapeKey = true }; + + Info.Name = Name; + Info.Desc = Desc; + for (int i = 0; i < Info.challengeCompeteSongs.Count; i ++) + { + if (difficulties[i] == Difficulty.None) + { + await DialogService.ShowMessageBox( + Localizer["Error"], + (MarkupString) + (string)Localizer["Must Select Song Error"], + Localizer["Dialog OK"], null, null, options); + return; + } + + Info.challengeCompeteSongs[i].SongId = musicDetails[i].SongId; + Info.challengeCompeteSongs[i].Difficulty = difficulties[i]; + } + Info.MaxParticipant = (uint) ParticipantCount; + Info.LastFor = (uint) LastFor; + Info.CompeteMode = (CompeteModeType)Mode; + Info.OnlyPlayOnce = OnlyPlayOnce; + + var resp = await Client.PostAsJsonAsync($"api/ChallengeCompeteManage/createOfficialCompete", Info); + if (resp.StatusCode != HttpStatusCode.OK) + { + await DialogService.ShowMessageBox( + Localizer["Error"], + (MarkupString) + (string)Localizer["Create Compete Error"], + Localizer["Dialog OK"], null, null, options); + return; + } + + MudDialog.Close(DialogResult.Ok(1)); + } + + private void OnExpandCollapseClick(int i) + { + _expandeds[i] = !_expandeds[i]; + } +} diff --git a/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor b/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor new file mode 100644 index 00000000..44947fc9 --- /dev/null +++ b/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor @@ -0,0 +1,138 @@ +@using Blazored.LocalStorage +@using TaikoWebUI.Utilities; + +@inject IJSRuntime Js +@inject ILocalStorageService LocalStorage +@inject IGameDataService GameDataService + + + + + + + + + + + + + + + @Localizer["Song Title"] + + + @foreach (var difficulty in Enum.GetValues()) + { + @if (difficulty is not Difficulty.None) + { + + + @ScoreUtils.GetDifficultyTitle(difficulty) + + + } + } + + + + + @GameDataService.GetMusicNameBySongId(musicDetailDictionary, context.SongId, SongNameLanguage) + + + @foreach (var difficulty in Enum.GetValues()) + { + @if (difficulty is not Difficulty.None) + { + var starLevel = GameDataService.GetMusicStarLevel(musicDetailDictionary, context.SongId, difficulty); + + @if (starLevel > 0) + { + @starLevel + } + else + { + + - + + } + + } + } + + + + + + + + + @Localizer["Cancel"] + + + + +@code { + + [CascadingParameter] MudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] public MusicDetail SelectedSong { get; set; } = new(); + + private Dictionary musicDetailDictionary = new(); + + private string? SongNameLanguage; + + private string Search { get; set; } = string.Empty; + + private string GenreFilter { get; set; } = string.Empty; + + private string searchString = string.Empty; + + protected override async Task OnInitializedAsync() + { + base.OnInitialized(); + SongNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage"); + musicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); + + } + + private bool FilterSongs(MusicDetail musicDetail) + { + var stringsToCheck = new List + { + musicDetail.SongName, + musicDetail.SongNameEN, + musicDetail.SongNameCN, + musicDetail.SongNameKO, + }; + + if (!string.IsNullOrEmpty(Search) && !stringsToCheck.Any(s => s.Contains(Search, StringComparison.OrdinalIgnoreCase))) + { + return false; + } + + return true; + } + + private void Select(MusicDetail musicDetail, Difficulty difficulty) + { + MudDialog.Close(DialogResult.Ok(new SongInfo() + { + MusicDetail = musicDetail, + Difficulty = difficulty + })); + } + + private void Cancel() + { + MudDialog.Cancel(); + } + +} \ No newline at end of file diff --git a/TaikoWebUI/Pages/OfficialCompete.razor b/TaikoWebUI/Pages/OfficialCompete.razor new file mode 100644 index 00000000..5850db2c --- /dev/null +++ b/TaikoWebUI/Pages/OfficialCompete.razor @@ -0,0 +1,10 @@ +@using TaikoWebUI.Components; + +@page "/ChallengeCompe/{baid:int}/OfficialCompetition" + + + +@code { + [Parameter] + public int Baid { get; set; } +} From aa9b398628b0e789f7887e965c1673baf17ae03b Mon Sep 17 00:00:00 2001 From: ptmaster Date: Mon, 16 Sep 2024 20:04:01 +0800 Subject: [PATCH 05/15] Create Challenge/Compete | Accept/Reject Challenge | Participate in Compete --- ...82025_Add ChallengeCompetition.Designer.cs | 798 ++++++++++++++++++ ...0240915182025_Add ChallengeCompetition.cs} | 14 +- ...2_Update ChallengeCompetition.Designer.cs} | 4 +- ...40915191732_Update ChallengeCompetition.cs | 40 + SharedProject/Models/ChallengeCompetition.cs | 1 + .../Models/ChallengeCompetitionHolderInfo.cs | 18 + .../Models/ChallengeCompetitionParticipant.cs | 1 + SharedProject/Models/PlaySetting.cs | 9 +- SharedProject/Models/User.cs | 14 +- SharedProject/Models/UserSetting.cs | 38 +- .../Api/ChallengeCompeteManageController.cs | 9 +- .../Controllers/Api/UsersController.cs | 13 + .../Services/ChallengeCompeteService.cs | 60 +- .../Services/Interfaces/IUserDatumService.cs | 8 +- TaikoLocalServer/Services/UserDatumService.cs | 42 + TaikoWebUI/Components/ChallengeCompe.razor | 107 ++- .../Components/ChallengeCompeteGrid.razor | 25 +- .../AddChallengeCompetitionDialog.razor | 117 ++- .../Pages/Dialogs/ChooseSongDialog.razor | 2 - .../Pages/Dialogs/ChooseUserDialog.razor | 102 +++ 20 files changed, 1321 insertions(+), 101 deletions(-) create mode 100644 GameDatabase/Migrations/20240915182025_Add ChallengeCompetition.Designer.cs rename GameDatabase/Migrations/{20240911133119_AddChallengeCompetion.cs => 20240915182025_Add ChallengeCompetition.cs} (93%) rename GameDatabase/Migrations/{20240911133119_AddChallengeCompetion.Designer.cs => 20240915191732_Update ChallengeCompetition.Designer.cs} (99%) create mode 100644 GameDatabase/Migrations/20240915191732_Update ChallengeCompetition.cs create mode 100644 SharedProject/Models/ChallengeCompetitionHolderInfo.cs create mode 100644 TaikoWebUI/Pages/Dialogs/ChooseUserDialog.razor diff --git a/GameDatabase/Migrations/20240915182025_Add ChallengeCompetition.Designer.cs b/GameDatabase/Migrations/20240915182025_Add ChallengeCompetition.Designer.cs new file mode 100644 index 00000000..9010989e --- /dev/null +++ b/GameDatabase/Migrations/20240915182025_Add ChallengeCompetition.Designer.cs @@ -0,0 +1,798 @@ +// +using System; +using GameDatabase.Context; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; + +#nullable disable + +namespace GameDatabase.Migrations +{ + [DbContext(typeof(TaikoDbContext))] + [Migration("20240915182025_Add ChallengeCompetition")] + partial class AddChallengeCompetition + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "8.0.3"); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("AiScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("SectionIndex") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("IsWin") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty", "SectionIndex"); + + b.ToTable("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Card", b => + { + b.Property("AccessCode") + .HasColumnType("TEXT"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.HasKey("AccessCode"); + + b.HasIndex("Baid"); + + b.ToTable("Card", (string)null); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteBestDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "Baid", "SongId"); + + b.HasIndex("Baid"); + + b.HasIndex("CompId", "SongId"); + + b.ToTable("ChallengeCompeteBestData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteDatum", b => + { + b.Property("CompId") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("CompeteDescribe") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CompeteMode") + .HasColumnType("INTEGER"); + + b.Property("CompeteName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CompeteTarget") + .HasColumnType("INTEGER"); + + b.Property("CreateTime") + .HasColumnType("datetime"); + + b.Property("ExpireTime") + .HasColumnType("datetime"); + + b.Property("MaxParticipant") + .HasColumnType("INTEGER"); + + b.Property("OnlyPlayOnce") + .HasColumnType("INTEGER"); + + b.Property("RequireTitle") + .HasColumnType("INTEGER"); + + b.Property("Share") + .HasColumnType("INTEGER"); + + b.Property("State") + .HasColumnType("INTEGER"); + + b.HasKey("CompId"); + + b.HasIndex("Baid") + .IsUnique(); + + b.ToTable("ChallengeCompeteData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteParticipantDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("IsActive") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "Baid"); + + b.HasIndex("Baid"); + + b.ToTable("ChallengeCompeteParticipantData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.Property("CompId") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("IsInverseOn") + .HasColumnType("INTEGER"); + + b.Property("IsVanishOn") + .HasColumnType("INTEGER"); + + b.Property("RandomType") + .HasColumnType("INTEGER"); + + b.Property("Speed") + .HasColumnType("INTEGER"); + + b.HasKey("CompId", "SongId"); + + b.ToTable("ChallengeCompeteSongData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Credential", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("Password") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("Salt") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("Credential", (string)null); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("DanType") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(1); + + b.Property("ArrivalSongCount") + .HasColumnType("INTEGER"); + + b.Property("ClearState") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(0u); + + b.Property("ComboCountTotal") + .HasColumnType("INTEGER"); + + b.Property("SoulGaugeTotal") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "DanType"); + + b.ToTable("DanScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("DanId") + .HasColumnType("INTEGER"); + + b.Property("DanType") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER") + .HasDefaultValue(1); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.Property("BadCount") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HighScore") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayScore") + .HasColumnType("INTEGER"); + + b.Property("TotalHitCount") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "DanId", "DanType", "SongNumber"); + + b.ToTable("DanStageScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("BestCrown") + .HasColumnType("INTEGER"); + + b.Property("BestRate") + .HasColumnType("INTEGER"); + + b.Property("BestScore") + .HasColumnType("INTEGER"); + + b.Property("BestScoreRank") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "SongId", "Difficulty"); + + b.ToTable("SongBestData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("ComboCount") + .HasColumnType("INTEGER"); + + b.Property("Crown") + .HasColumnType("INTEGER"); + + b.Property("Difficulty") + .HasColumnType("INTEGER"); + + b.Property("DrumrollCount") + .HasColumnType("INTEGER"); + + b.Property("GoodCount") + .HasColumnType("INTEGER"); + + b.Property("HitCount") + .HasColumnType("INTEGER"); + + b.Property("MissCount") + .HasColumnType("INTEGER"); + + b.Property("OkCount") + .HasColumnType("INTEGER"); + + b.Property("PlayTime") + .HasColumnType("datetime"); + + b.Property("Score") + .HasColumnType("INTEGER"); + + b.Property("ScoreRank") + .HasColumnType("INTEGER"); + + b.Property("ScoreRate") + .HasColumnType("INTEGER"); + + b.Property("Skipped") + .HasColumnType("INTEGER"); + + b.Property("SongId") + .HasColumnType("INTEGER"); + + b.Property("SongNumber") + .HasColumnType("INTEGER"); + + b.HasKey("Id"); + + b.HasIndex("Baid"); + + b.ToTable("SongPlayData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Token", b => + { + b.Property("Baid") + .HasColumnType("INTEGER"); + + b.Property("Id") + .HasColumnType("INTEGER"); + + b.Property("Count") + .HasColumnType("INTEGER"); + + b.HasKey("Baid", "Id"); + + b.ToTable("Tokens"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.Property("Baid") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("AchievementDisplayDifficulty") + .HasColumnType("INTEGER"); + + b.Property("AiWinCount") + .HasColumnType("INTEGER"); + + b.Property("ColorBody") + .HasColumnType("INTEGER"); + + b.Property("ColorFace") + .HasColumnType("INTEGER"); + + b.Property("ColorLimb") + .HasColumnType("INTEGER"); + + b.Property("CostumeData") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CostumeFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("CurrentBody") + .HasColumnType("INTEGER"); + + b.Property("CurrentFace") + .HasColumnType("INTEGER"); + + b.Property("CurrentHead") + .HasColumnType("INTEGER"); + + b.Property("CurrentKigurumi") + .HasColumnType("INTEGER"); + + b.Property("CurrentPuchi") + .HasColumnType("INTEGER"); + + b.Property("DifficultyPlayedArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultyPlayedCourse") + .HasColumnType("INTEGER"); + + b.Property("DifficultyPlayedSort") + .HasColumnType("INTEGER"); + + b.Property("DifficultyPlayedStar") + .HasColumnType("INTEGER"); + + b.Property("DifficultySettingArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("DifficultySettingCourse") + .HasColumnType("INTEGER"); + + b.Property("DifficultySettingSort") + .HasColumnType("INTEGER"); + + b.Property("DifficultySettingStar") + .HasColumnType("INTEGER"); + + b.Property("DisplayAchievement") + .HasColumnType("INTEGER"); + + b.Property("DisplayDan") + .HasColumnType("INTEGER"); + + b.Property("FavoriteSongsArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("GenericInfoFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("IsAdmin") + .HasColumnType("INTEGER"); + + b.Property("IsSkipOn") + .HasColumnType("INTEGER"); + + b.Property("IsVoiceOn") + .HasColumnType("INTEGER"); + + b.Property("LastPlayDatetime") + .HasColumnType("datetime"); + + b.Property("LastPlayMode") + .HasColumnType("INTEGER"); + + b.Property("MyDonName") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("MyDonNameLanguage") + .HasColumnType("INTEGER"); + + b.Property("NotesPosition") + .HasColumnType("INTEGER"); + + b.Property("OptionSetting") + .HasColumnType("INTEGER"); + + b.Property("SelectedToneId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitleFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("TitlePlateId") + .HasColumnType("INTEGER"); + + b.Property("ToneFlgArray") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedBody") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedFace") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedHead") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedKigurumi") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedPuchi") + .IsRequired() + .HasColumnType("TEXT"); + + b.Property("UnlockedSongIdList") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Baid"); + + b.ToTable("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiSectionScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.AiScoreDatum", "Parent") + .WithMany("AiSectionScoreData") + .HasForeignKey("Baid", "SongId", "Difficulty") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Card", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteBestDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "UserData") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GameDatabase.Entities.ChallengeCompeteSongDatum", "ChallengeCompeteSongData") + .WithMany("BestScores") + .HasForeignKey("CompId", "SongId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteSongData"); + + b.Navigation("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Holder") + .WithOne() + .HasForeignKey("GameDatabase.Entities.ChallengeCompeteDatum", "Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Holder"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteParticipantDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "UserData") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("GameDatabase.Entities.ChallengeCompeteDatum", "ChallengeCompeteData") + .WithMany("Participants") + .HasForeignKey("CompId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteData"); + + b.Navigation("UserData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.HasOne("GameDatabase.Entities.ChallengeCompeteDatum", "ChallengeCompeteData") + .WithMany("Songs") + .HasForeignKey("CompId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("ChallengeCompeteData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Credential", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanStageScoreDatum", b => + { + b.HasOne("GameDatabase.Entities.DanScoreDatum", "Parent") + .WithMany("DanStageScoreData") + .HasForeignKey("Baid", "DanId", "DanType") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Parent"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongBestDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.SongPlayDatum", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Ba") + .WithMany() + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Ba"); + }); + + modelBuilder.Entity("GameDatabase.Entities.Token", b => + { + b.HasOne("GameDatabase.Entities.UserDatum", "Datum") + .WithMany("Tokens") + .HasForeignKey("Baid") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Datum"); + }); + + modelBuilder.Entity("GameDatabase.Entities.AiScoreDatum", b => + { + b.Navigation("AiSectionScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteDatum", b => + { + b.Navigation("Participants"); + + b.Navigation("Songs"); + }); + + modelBuilder.Entity("GameDatabase.Entities.ChallengeCompeteSongDatum", b => + { + b.Navigation("BestScores"); + }); + + modelBuilder.Entity("GameDatabase.Entities.DanScoreDatum", b => + { + b.Navigation("DanStageScoreData"); + }); + + modelBuilder.Entity("GameDatabase.Entities.UserDatum", b => + { + b.Navigation("Tokens"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/GameDatabase/Migrations/20240911133119_AddChallengeCompetion.cs b/GameDatabase/Migrations/20240915182025_Add ChallengeCompetition.cs similarity index 93% rename from GameDatabase/Migrations/20240911133119_AddChallengeCompetion.cs rename to GameDatabase/Migrations/20240915182025_Add ChallengeCompetition.cs index 207fa239..6c3540d3 100644 --- a/GameDatabase/Migrations/20240911133119_AddChallengeCompetion.cs +++ b/GameDatabase/Migrations/20240915182025_Add ChallengeCompetition.cs @@ -6,7 +6,7 @@ namespace GameDatabase.Migrations { /// - public partial class AddChallengeCompetion : Migration + public partial class AddChallengeCompetition : Migration { /// protected override void Up(MigrationBuilder migrationBuilder) @@ -33,6 +33,12 @@ protected override void Up(MigrationBuilder migrationBuilder) constraints: table => { table.PrimaryKey("PK_ChallengeCompeteData", x => x.CompId); + table.ForeignKey( + name: "FK_ChallengeCompeteData_UserData_Baid", + column: x => x.Baid, + principalTable: "UserData", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); }); migrationBuilder.CreateTable( @@ -130,6 +136,12 @@ protected override void Up(MigrationBuilder migrationBuilder) table: "ChallengeCompeteBestData", columns: new[] { "CompId", "SongId" }); + migrationBuilder.CreateIndex( + name: "IX_ChallengeCompeteData_Baid", + table: "ChallengeCompeteData", + column: "Baid", + unique: true); + migrationBuilder.CreateIndex( name: "IX_ChallengeCompeteParticipantData_Baid", table: "ChallengeCompeteParticipantData", diff --git a/GameDatabase/Migrations/20240911133119_AddChallengeCompetion.Designer.cs b/GameDatabase/Migrations/20240915191732_Update ChallengeCompetition.Designer.cs similarity index 99% rename from GameDatabase/Migrations/20240911133119_AddChallengeCompetion.Designer.cs rename to GameDatabase/Migrations/20240915191732_Update ChallengeCompetition.Designer.cs index 7d1c8c02..7b0a3a74 100644 --- a/GameDatabase/Migrations/20240911133119_AddChallengeCompetion.Designer.cs +++ b/GameDatabase/Migrations/20240915191732_Update ChallengeCompetition.Designer.cs @@ -11,8 +11,8 @@ namespace GameDatabase.Migrations { [DbContext(typeof(TaikoDbContext))] - [Migration("20240911133119_AddChallengeCompetion")] - partial class AddChallengeCompetion + [Migration("20240915191732_Update ChallengeCompetition")] + partial class UpdateChallengeCompetition { /// protected override void BuildTargetModel(ModelBuilder modelBuilder) diff --git a/GameDatabase/Migrations/20240915191732_Update ChallengeCompetition.cs b/GameDatabase/Migrations/20240915191732_Update ChallengeCompetition.cs new file mode 100644 index 00000000..ed6bff60 --- /dev/null +++ b/GameDatabase/Migrations/20240915191732_Update ChallengeCompetition.cs @@ -0,0 +1,40 @@ +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace GameDatabase.Migrations +{ + /// + public partial class UpdateChallengeCompetition : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_ChallengeCompeteData_UserData_Baid", + table: "ChallengeCompeteData"); + + migrationBuilder.DropIndex( + name: "IX_ChallengeCompeteData_Baid", + table: "ChallengeCompeteData"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateIndex( + name: "IX_ChallengeCompeteData_Baid", + table: "ChallengeCompeteData", + column: "Baid", + unique: true); + + migrationBuilder.AddForeignKey( + name: "FK_ChallengeCompeteData_UserData_Baid", + table: "ChallengeCompeteData", + column: "Baid", + principalTable: "UserData", + principalColumn: "Baid", + onDelete: ReferentialAction.Cascade); + } + } +} diff --git a/SharedProject/Models/ChallengeCompetition.cs b/SharedProject/Models/ChallengeCompetition.cs index e9b428dc..08c0b492 100644 --- a/SharedProject/Models/ChallengeCompetition.cs +++ b/SharedProject/Models/ChallengeCompetition.cs @@ -17,6 +17,7 @@ public class ChallengeCompetition public bool OnlyPlayOnce { get; set; } = false; public ShareType Share { get; set; } = ShareType.EveryOne; public CompeteTargetType CompeteTarget { get; set; } = CompeteTargetType.EveryOne; + public UserAppearance? Holder { get; set; } = new(); public List Songs { get; set; } = new(); public List Participants { get; set; } = new(); } diff --git a/SharedProject/Models/ChallengeCompetitionHolderInfo.cs b/SharedProject/Models/ChallengeCompetitionHolderInfo.cs new file mode 100644 index 00000000..d2300582 --- /dev/null +++ b/SharedProject/Models/ChallengeCompetitionHolderInfo.cs @@ -0,0 +1,18 @@ +namespace SharedProject.Models; + +public class ChallengeCompetitionHolderInfo +{ + public uint Baid { get; set; } + public string MyDonName { get; set; } = string.Empty; + public uint MyDonNameLanguage { get; set; } + public string Title { get; set; } = string.Empty; + public uint TitlePlateId { get; set; } + public uint ColorBody { get; set; } + public uint ColorFace { get; set; } + public uint ColorLimb { get; set; } + public uint CurrentKigurumi { get; set; } + public uint CurrentHead { get; set; } + public uint CurrentBody { get; set; } + public uint CurrentFace { get; set; } + public uint CurrentPuchi { get; set; } +} diff --git a/SharedProject/Models/ChallengeCompetitionParticipant.cs b/SharedProject/Models/ChallengeCompetitionParticipant.cs index 172b7aa1..c308667e 100644 --- a/SharedProject/Models/ChallengeCompetitionParticipant.cs +++ b/SharedProject/Models/ChallengeCompetitionParticipant.cs @@ -5,4 +5,5 @@ public class ChallengeCompetitionParticipant public uint CompId { get; set; } public uint Baid { get; set; } public bool IsActive { get; set; } + public UserAppearance? UserInfo { get; set; } = new(); } diff --git a/SharedProject/Models/PlaySetting.cs b/SharedProject/Models/PlaySetting.cs index c554bf4b..f34301af 100644 --- a/SharedProject/Models/PlaySetting.cs +++ b/SharedProject/Models/PlaySetting.cs @@ -1,14 +1,19 @@ using SharedProject.Enums; +using System.Text.Json.Serialization; namespace SharedProject.Models; public class PlaySetting { + [JsonPropertyName("speed")] public uint Speed { get; set; } + [JsonPropertyName("isVanishOn")] public bool IsVanishOn { get; set; } - + + [JsonPropertyName("isInverseOn")] public bool IsInverseOn { get; set; } - + + [JsonPropertyName("randomType")] public RandomType RandomType { get; set; } } \ No newline at end of file diff --git a/SharedProject/Models/User.cs b/SharedProject/Models/User.cs index ad50e18e..d16c2ce0 100644 --- a/SharedProject/Models/User.cs +++ b/SharedProject/Models/User.cs @@ -1,12 +1,18 @@ -namespace SharedProject.Models; +using System.Text.Json.Serialization; + +namespace SharedProject.Models; public class User { + [JsonPropertyName("baid")] public uint Baid { get; set; } - + + [JsonPropertyName("accessCodes")] public List AccessCodes { get; set; } = new(); - + + [JsonPropertyName("isAdmin")] public bool IsAdmin { get; set; } - + + [JsonPropertyName("userSetting")] public UserSetting UserSetting { get; set; } = new(); } \ No newline at end of file diff --git a/SharedProject/Models/UserSetting.cs b/SharedProject/Models/UserSetting.cs index 6699bfdc..ec65f3c9 100644 --- a/SharedProject/Models/UserSetting.cs +++ b/SharedProject/Models/UserSetting.cs @@ -1,68 +1,100 @@ using SharedProject.Enums; +using System.Text.Json.Serialization; namespace SharedProject.Models; public class UserSetting { + [JsonPropertyName("baid")] public uint Baid { get; set; } - + + [JsonPropertyName("toneId")] public uint ToneId { get; set; } + [JsonPropertyName("isDisplayAchievement")] public bool IsDisplayAchievement { get; set; } + [JsonPropertyName("isDisplayDanOnNamePlate")] public bool IsDisplayDanOnNamePlate { get; set; } + [JsonPropertyName("difficultySettingCourse")] public uint DifficultySettingCourse { get; set; } + [JsonPropertyName("difficultySettingStar")] public uint DifficultySettingStar { get; set; } + [JsonPropertyName("difficultySettingSort")] public uint DifficultySettingSort { get; set; } + [JsonPropertyName("isVoiceOn")] public bool IsVoiceOn { get; set; } + [JsonPropertyName("isSkipOn")] public bool IsSkipOn { get; set; } + [JsonPropertyName("achievementDisplayDifficulty")] public Difficulty AchievementDisplayDifficulty { get; set; } + [JsonPropertyName("playSetting")] public PlaySetting PlaySetting { get; set; } = new(); + [JsonPropertyName("notesPosition")] public int NotesPosition { get; set; } + [JsonPropertyName("myDonName")] public string MyDonName { get; set; } = string.Empty; + [JsonPropertyName("myDonNameLanguage")] public uint MyDonNameLanguage { get; set; } + [JsonPropertyName("title")] public string Title { get; set; } = string.Empty; + [JsonPropertyName("titlePlateId")] public uint TitlePlateId { get; set; } + [JsonPropertyName("kigurumi")] public uint Kigurumi { get; set; } + [JsonPropertyName("head")] public uint Head { get; set; } + [JsonPropertyName("body")] public uint Body { get; set; } + [JsonPropertyName("face")] public uint Face { get; set; } + [JsonPropertyName("puchi")] public uint Puchi { get; set; } + [JsonPropertyName("unlockedKigurumi")] public List UnlockedKigurumi { get; set; } = new(); + [JsonPropertyName("unlockedHead")] public List UnlockedHead { get; set; } = new(); + [JsonPropertyName("unlockedBody")] public List UnlockedBody { get; set; } = new(); + [JsonPropertyName("unlockedFace")] public List UnlockedFace { get; set; } = new(); + [JsonPropertyName("unlockedPuchi")] public List UnlockedPuchi { get; set; } = new(); - + + [JsonPropertyName("unlockedTitle")] public List UnlockedTitle { get; set; } = new(); + [JsonPropertyName("faceColor")] public uint FaceColor { get; set; } + [JsonPropertyName("bodyColor")] public uint BodyColor { get; set; } + [JsonPropertyName("limbColor")] public uint LimbColor { get; set; } - + + [JsonPropertyName("lastPlayDateTime")] public DateTime LastPlayDateTime { get; set; } } \ No newline at end of file diff --git a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs index b24b0dd6..98d199ba 100644 --- a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs +++ b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs @@ -92,7 +92,7 @@ public async Task CreateCompete(ChallengeCompeteCreateInfo challe await challengeCompeteService.CreateCompete(0, challengeCompeteInfo); - return NoContent(); + return Ok(); } [HttpPost("{baid}/createCompete")] @@ -102,7 +102,7 @@ public async Task CreateCompete(uint baid, ChallengeCompeteCreate Logger.LogInformation("CreateCompete : {Request}", JsonFormatter.JsonSerialize(challengeCompeteInfo)); await challengeCompeteService.CreateCompete(baid, challengeCompeteInfo); - return NoContent(); + return Ok(); } [HttpPost("{baid}/createChallenge/{targetBaid}")] @@ -112,13 +112,14 @@ public async Task CreateChallenge(uint baid, uint targetBaid, Cha Logger.LogInformation("CreateChallenge : {Request}", JsonFormatter.JsonSerialize(challengeCompeteInfo)); await challengeCompeteService.CreateChallenge(baid, targetBaid, challengeCompeteInfo); - return NoContent(); + return Ok(); } [HttpGet("{baid}/joinCompete/{compId}")] [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] public async Task> JoinCompete(uint baid, uint compId) { + Logger.LogInformation($"JoinCompete {baid} {compId}"); bool result = await challengeCompeteService.ParticipateCompete(compId, baid); return Ok(result); @@ -128,6 +129,7 @@ public async Task> JoinCompete(uint baid, uint compId) [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] public async Task> AcceptChallenge(uint baid, uint compId) { + Logger.LogInformation($"AcceptChallenge {baid} {compId}"); bool result = await challengeCompeteService.AnswerChallenge(compId, baid, true); return Ok(result); @@ -137,6 +139,7 @@ public async Task> AcceptChallenge(uint baid, uint compId) [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] public async Task> RejectChallenge(uint baid, uint compId) { + Logger.LogInformation($"RejectChallenge {baid} {compId}"); bool result = await challengeCompeteService.AnswerChallenge(compId, baid, false); return Ok(result); diff --git a/TaikoLocalServer/Controllers/Api/UsersController.cs b/TaikoLocalServer/Controllers/Api/UsersController.cs index dd2a4d33..2dce169d 100644 --- a/TaikoLocalServer/Controllers/Api/UsersController.cs +++ b/TaikoLocalServer/Controllers/Api/UsersController.cs @@ -88,4 +88,17 @@ public async Task DeleteUser(uint baid) return result ? NoContent() : NotFound(); } + + [HttpGet("{baid}/AllUserDict")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task AllUserDict(uint baid) + { + Dictionary data = await userDatumService.GetAllUserDict(); + if (baid != 0) + { + data.Remove(baid); + } + + return Ok(data); + } } \ No newline at end of file diff --git a/TaikoLocalServer/Services/ChallengeCompeteService.cs b/TaikoLocalServer/Services/ChallengeCompeteService.cs index d2d81719..5dc5ab59 100644 --- a/TaikoLocalServer/Services/ChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/ChallengeCompeteService.cs @@ -3,7 +3,6 @@ using SharedProject.Models; using SharedProject.Models.Responses; using SharedProject.Utils; -using TaikoLocalServer.Services.Interfaces; using Throw; namespace TaikoLocalServer.Services; @@ -174,7 +173,8 @@ public async Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeC public async Task ParticipateCompete(uint compId, uint baid) { - var challengeCompete = await context.ChallengeCompeteData.FindAsync(compId); + var challengeCompete = await context.ChallengeCompeteData + .Include(c => c.Participants).Where(c => c.CompId == compId).FirstOrDefaultAsync(); challengeCompete.ThrowIfNull($"Challenge not found for CompId {compId}!"); if (challengeCompete.MaxParticipant <= challengeCompete.Participants.Count()) return false; @@ -247,16 +247,15 @@ public async Task CreateChallenge(uint baid, uint targetBaid, ChallengeCompeteCr public async Task AnswerChallenge(uint compId, uint baid, bool accept) { - var challengeCompete = await context.ChallengeCompeteData.FindAsync(compId); + var challengeCompete = await context.ChallengeCompeteData + .Include(c => c.Participants).Where(c => c.CompId == compId).FirstOrDefaultAsync(); challengeCompete.ThrowIfNull($"Challenge not found for CompId {compId}!"); if (challengeCompete.Baid == baid) return false; - bool hasTarget = false; - foreach (var participant in challengeCompete.Participants) + if (!challengeCompete.Participants.Any(p => p.Baid == baid)) { - if (participant.Baid == baid) hasTarget = true; + return false; } - if (!hasTarget) return false; if (accept) { @@ -341,6 +340,14 @@ await context.AddAsync(new ChallengeCompeteBestDatum public async Task FillData(ChallengeCompetition challenge) { + UserDatum? holder = await userDatumService.GetFirstUserDatumOrNull(challenge.Baid); + challenge.Holder = convert(holder); + foreach (var participant in challenge.Participants) + { + if (participant == null) continue; + UserDatum? user = await userDatumService.GetFirstUserDatumOrNull(participant.Baid); + participant.UserInfo = convert(user); + } foreach (var song in challenge.Songs) { if (song == null) continue; @@ -348,26 +355,31 @@ public async Task FillData(ChallengeCompetition challenge) foreach (var score in song.BestScores) { UserDatum? user = await userDatumService.GetFirstUserDatumOrNull(score.Baid); - if (user == null) continue; - score.UserAppearance = new UserAppearance - { - Baid = score.Baid, - MyDonName = user.MyDonName, - MyDonNameLanguage = user.MyDonNameLanguage, - Title = user.Title, - TitlePlateId = user.TitlePlateId, - Kigurumi = user.CurrentKigurumi, - Head = user.CurrentHead, - Body = user.CurrentBody, - Face = user.CurrentFace, - Puchi = user.CurrentPuchi, - FaceColor = user.ColorFace, - BodyColor = user.ColorBody, - LimbColor = user.ColorLimb, - }; + score.UserAppearance = convert(user); } } return challenge; } + + private UserAppearance? convert(UserDatum? user) + { + if (user == null) return null; + return new UserAppearance + { + Baid = user.Baid, + MyDonName = user.MyDonName, + MyDonNameLanguage = user.MyDonNameLanguage, + Title = user.Title, + TitlePlateId = user.TitlePlateId, + Kigurumi = user.CurrentKigurumi, + Head = user.CurrentHead, + Body = user.CurrentBody, + Face = user.CurrentFace, + Puchi = user.CurrentPuchi, + FaceColor = user.ColorFace, + BodyColor = user.ColorBody, + LimbColor = user.ColorLimb, + }; + } } diff --git a/TaikoLocalServer/Services/Interfaces/IUserDatumService.cs b/TaikoLocalServer/Services/Interfaces/IUserDatumService.cs index e8b17859..fc07fd99 100644 --- a/TaikoLocalServer/Services/Interfaces/IUserDatumService.cs +++ b/TaikoLocalServer/Services/Interfaces/IUserDatumService.cs @@ -1,9 +1,13 @@ -namespace TaikoLocalServer.Services.Interfaces; +using SharedProject.Models; + +namespace TaikoLocalServer.Services.Interfaces; public interface IUserDatumService { public Task> GetAllUserDatum(); - + + public Task> GetAllUserDict(); + public Task GetFirstUserDatumOrNull(uint baid); public Task UpdateUserDatum(UserDatum userDatum); diff --git a/TaikoLocalServer/Services/UserDatumService.cs b/TaikoLocalServer/Services/UserDatumService.cs index d2211ee2..8f0ce9b8 100644 --- a/TaikoLocalServer/Services/UserDatumService.cs +++ b/TaikoLocalServer/Services/UserDatumService.cs @@ -1,5 +1,7 @@ using GameDatabase.Context; using Throw; +using SharedProject.Models; +using MudExtensions; namespace TaikoLocalServer.Services; @@ -9,6 +11,46 @@ public async Task> GetAllUserDatum() { return await context.UserData.Include(d => d.Tokens).ToListAsync(); } + + public async Task> GetAllUserDict() + { + List listUser = await GetAllUserDatum(); + Dictionary dict = new Dictionary(); + foreach (var user in listUser) + { + dict.Add(user.Baid, new() + { + Baid = user.Baid, + IsAdmin = false, + UserSetting = new() + { + Baid = user.Baid, + ToneId = user.SelectedToneId, + IsDisplayAchievement = user.DisplayAchievement, + IsDisplayDanOnNamePlate = user.DisplayDan, + DifficultySettingCourse = user.DifficultySettingCourse, + DifficultySettingStar = user.DifficultyPlayedStar, + DifficultySettingSort = user.DifficultyPlayedSort, + IsVoiceOn = user.IsVoiceOn, + IsSkipOn = user.IsSkipOn, + AchievementDisplayDifficulty = user.AchievementDisplayDifficulty, + MyDonName = user.MyDonName, + MyDonNameLanguage = user.MyDonNameLanguage, + Title = user.Title, + TitlePlateId = user.TitlePlateId, + Kigurumi = user.CurrentKigurumi, + Head = user.CurrentHead, + Body = user.CurrentBody, + Face = user.CurrentFace, + Puchi = user.CurrentPuchi, + FaceColor = user.ColorFace, + BodyColor = user.ColorFace, + LimbColor = user.ColorLimb + } + }); + } + return dict; + } public async Task GetFirstUserDatumOrNull(uint baid) { diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor index a9e24387..052e6ac0 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -6,12 +6,28 @@ - @ChallengeCompetition.CompeteName - @Localizer["Comp ID"]:@ChallengeCompetition.CompId - @Localizer["Describe"]:@ChallengeCompetition.CompeteDescribe + @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) + { + @if (ChallengeCompetition?.Baid != Baid) + { + @Localizer["From"] @ChallengeCompetition?.Holder?.MyDonName + } + else + { + var participant = ChallengeCompetition?.Participants?.Find(p => p.Baid != Baid); + @Localizer["To"] @participant?.UserInfo?.MyDonName + } + } + else + { + @ChallengeCompetition?.CompeteName + } + + @Localizer["Comp ID"]:@ChallengeCompetition?.CompId + @Localizer["Describe"]:@ChallengeCompetition?.CompeteDescribe - @if (false && SelfHoldedChallengeCompetiton()) + @if (false && ChallengeCompetition?.Baid == Baid || Baid == 0) { } @@ -34,17 +50,51 @@ OnClick=@(_ => AnswerChallenge(true))>@Localizer["Information"] @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) { - - AnswerChallenge(true))>@Localizer["Accept"] - AnswerChallenge(false))>@Localizer["Reject"] - + @if (Baid == 0 || ChallengeCompetition?.Baid == Baid || ChallengeCompetition?.State != CompeteState.Waiting) + { + switch (ChallengeCompetition?.State) + { + case CompeteState.Waiting: + @Localizer["Waiting"] + break; + case CompeteState.Normal: + @Localizer["Accepted"] + break; + case CompeteState.Rejected: + @Localizer["Rejected"] + break; + } + } + else + { + + AnswerChallenge(true))>@Localizer["Accept"] + AnswerChallenge(false))>@Localizer["Reject"] + + } } - else + else if (ChallengeCompetition.CompeteMode == CompeteModeType.Compete || ChallengeCompetition.CompeteMode == CompeteModeType.OfficialCompete) { - AnswerChallenge(true))>@Localizer["Participate"] + if (Baid != 0) + { + if (ChallengeCompetition.Participants.Any(p => p.Baid == Baid)) + { + @Localizer["Participated"] + } + else + { + if (ChallengeCompetition.MaxParticipant <= ChallengeCompetition.Participants.Count) + { + @Localizer["Fullfilled"] + } + else + { + @Localizer["Participate"] + } + } + } } @@ -53,7 +103,8 @@ @code { [Parameter] public ChallengeCompetition? ChallengeCompetition { get; set; } - [Parameter] public uint Baid { get; set; } + [Parameter] public int Baid { get; set; } + [Parameter] public EventCallback Refresh { get; set; } private bool SelfHoldedChallengeCompetiton() { @@ -62,7 +113,7 @@ private bool ChallengeNeedAnswer() { - return ChallengeCompetition?.State == CompeteState.Waiting && !SelfHoldedChallengeCompetiton(); + return Baid != 0 && ChallengeCompetition?.State == CompeteState.Waiting && ChallengeCompetition?.Baid != Baid; } private bool ParticipatedChallengeCompetition() @@ -78,23 +129,33 @@ private async Task AnswerChallenge(bool accept) { if (ChallengeCompetition == null || ChallengeCompetition.State != CompeteState.Waiting) return; - var request = new AnswerChallengeRequest - { - CompId = ChallengeCompetition.CompId, - Baid = Baid, - Accept = accept - }; - var response = await Client.PostAsJsonAsync("api/ChallengeCompetitionManage/AnswerChallenge", request); + var url = accept ? $"api/ChallengeCompeteManage/{Baid}/acceptChallenge/{ChallengeCompetition.CompId}" : $"api/ChallengeCompeteManage/{Baid}/rejectChallenge/{ChallengeCompetition.CompId}"; + var response = await Client.GetAsync(url); if (!response.IsSuccessStatusCode) { await DialogService.ShowMessageBox( Localizer["Error"], - Localizer["Unknown Error"], + Localizer["Request Error"], Localizer["Dialog OK"], null, null, new DialogOptions { DisableBackdropClick = true }); return; } + await Refresh.InvokeAsync(ChallengeCompetition); ChallengeCompetition.State = accept ? CompeteState.Normal : CompeteState.Rejected; + } + private async Task AnswerCompete() + { + if (ChallengeCompetition == null) return; + var response = await Client.GetAsync($"api/ChallengeCompeteManage/{Baid}/joinCompete/{ChallengeCompetition.CompId}"); + if (!response.IsSuccessStatusCode) + { + await DialogService.ShowMessageBox( + Localizer["Error"], + Localizer["Request Error"], + Localizer["Dialog OK"], null, null, new DialogOptions { DisableBackdropClick = true }); + return; + } + await Refresh.InvokeAsync(ChallengeCompetition); } } diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor b/TaikoWebUI/Components/ChallengeCompeteGrid.razor index 5c0330d8..8dfa2b9f 100644 --- a/TaikoWebUI/Components/ChallengeCompeteGrid.razor +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor @@ -65,7 +65,7 @@ foreach (var challengeCompetition in response.List) { - + } } @@ -105,8 +105,6 @@ [Parameter] public int Mode { get; set; } - - private ChallengeCompetitionResponse? response = new(); private CancellationTokenSource? cts; private int TotalPages { get; set; } = 0; @@ -127,6 +125,17 @@ isLoading = false; } + private async Task UpdateCompete(ChallengeCompetition cc) + { + await GetUsersData(); + var updated = response?.List.Find(c => c.CompId == cc.CompId); + if (updated != null) + { + cc.CompeteMode = updated.CompeteMode; + cc.Participants = updated.Participants; + } + } + protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); @@ -182,13 +191,19 @@ await Debounce(GetUsersData, 500); // 500 milliseconds delay } - private Task OpenDialogAsync(int mode, int maxSongs) + private async Task OpenDialogAsync(int mode, int maxSongs) { var options = new DialogOptions { CloseOnEscapeKey = true }; var parameters = new DialogParameters(); parameters.Add("Mode", mode); parameters.Add("MaxSongs", maxSongs); + parameters.Add("Baid", Baid); - return DialogService.ShowAsync(Localizer["Create"], parameters, options); + var dialogRet = await DialogService.ShowAsync(Localizer["Create"], parameters, options); + if (dialogRet != null) + { + bool result = await dialogRet.GetReturnValueAsync(); + if (result == true) await GetUsersData(); + } } } diff --git a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor index 7c7662c2..ae51bde1 100644 --- a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor +++ b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor @@ -34,9 +34,16 @@ @if (Mode == 2 || Mode == 3) { - + + } + + @if (Mode == 1) + { + + + @Localizer["Select"] + } - @for (int i = 0; i < Info.challengeCompeteSongs.Count; i ++) { var song_idx = i; @@ -44,7 +51,7 @@ var song = Info.challengeCompeteSongs[song_idx]; - + @if (difficulties[song_idx] != Difficulty.None) @@ -64,17 +71,17 @@ - + @Localizer["Any"] @Localizer["On"] @Localizer["Off"] - + @Localizer["Any"] @Localizer["On"] @Localizer["Off"] - + @Localizer["Any"] @for (uint idx = 0; idx < SpeedStrings.Length; idx++) { @@ -82,7 +89,7 @@ @SpeedStrings[speed_idx] } - + @Localizer["Any"] @foreach (var item in Enum.GetValues()) { @@ -98,14 +105,17 @@ { } - - - @Localizer["Only Play Once"] + @if (Mode != 1) + { + + } + + @Localizer["Only Play Once"] @Localizer["Cancel"] - @Localizer["Create"] + @Localizer["Create"] @@ -116,6 +126,9 @@ [Parameter] public int Mode { get; set; } = 0; + [Parameter] + public int Baid { get; set; } = 0; + [Parameter] public int MaxSongs { get; set; } = 1; @@ -135,9 +148,9 @@ "2.0", "2.5", "3.0", "3.5", "4.0" }; - private string Name = string.Empty; + private uint TargetBaid = 0; - private string Desc = string.Empty; + private string TargetUserName = string.Empty; private bool[] _expandeds = new bool[0]; @@ -206,23 +219,33 @@ } } + private async Task SelTarget() + { + var options = new DialogOptions { CloseOnEscapeKey = true }; + var parameters = new DialogParameters(); + parameters.Add("Exclude", Baid); + + var reference = await DialogService.ShowAsync(Localizer["Select User"], parameters, options); + var user = await reference.GetReturnValueAsync(); + + if (user != null) + { + TargetUserName = user.UserSetting.MyDonName; + TargetBaid = user.Baid; + } + } + private void Cancel() => MudDialog.Cancel(); - private async Task CreateChallengeCompetition() + private async Task Create() { var options = new DialogOptions { CloseOnEscapeKey = true }; - Info.Name = Name; - Info.Desc = Desc; for (int i = 0; i < Info.challengeCompeteSongs.Count; i ++) { if (difficulties[i] == Difficulty.None) { - await DialogService.ShowMessageBox( - Localizer["Error"], - (MarkupString) - (string)Localizer["Must Select Song Error"], - Localizer["Dialog OK"], null, null, options); + await ShowError(Localizer["Must Select Song Error"]); return; } @@ -234,18 +257,52 @@ Info.CompeteMode = (CompeteModeType)Mode; Info.OnlyPlayOnce = OnlyPlayOnce; - var resp = await Client.PostAsJsonAsync($"api/ChallengeCompeteManage/createOfficialCompete", Info); - if (resp.StatusCode != HttpStatusCode.OK) + if (Mode == 1) { - await DialogService.ShowMessageBox( - Localizer["Error"], - (MarkupString) - (string)Localizer["Create Compete Error"], - Localizer["Dialog OK"], null, null, options); - return; + if (TargetBaid == 0) + { + await ShowError(Localizer["Must Select Challenge Target Error"]); + return; + } + var resp = await Client.PostAsJsonAsync($"api/ChallengeCompeteManage/{Baid}/createChallenge/{TargetBaid}", Info); + if (resp.StatusCode != HttpStatusCode.OK) + { + await ShowError(Localizer["Create Compete Error"]); + return; + } + } + else if (Mode == 2) + { + var resp = await Client.PostAsJsonAsync($"api/ChallengeCompeteManage/{Baid}/createCompete", Info); + if (resp.StatusCode != HttpStatusCode.OK) + { + await ShowError(Localizer["Create Compete Error"]); + return; + } + } + else if (Mode == 3) + { + var resp = await Client.PostAsJsonAsync($"api/ChallengeCompeteManage/createOfficialCompete", Info); + if (resp.StatusCode != HttpStatusCode.OK) + { + await ShowError(Localizer["Create Compete Error"]); + return; + } } - MudDialog.Close(DialogResult.Ok(1)); + MudDialog.Close(DialogResult.Ok(true)); + } + + private async Task ShowError(string errorWord) + { + var options = new DialogOptions { CloseOnEscapeKey = true }; + await DialogService.ShowMessageBox( + Localizer["Error"], + (MarkupString) + (string)errorWord, + Localizer["Dialog OK"], + null, null, options + ); } private void OnExpandCollapseClick(int i) diff --git a/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor b/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor index 44947fc9..4f06d6b7 100644 --- a/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor +++ b/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor @@ -91,8 +91,6 @@ private string Search { get; set; } = string.Empty; - private string GenreFilter { get; set; } = string.Empty; - private string searchString = string.Empty; protected override async Task OnInitializedAsync() diff --git a/TaikoWebUI/Pages/Dialogs/ChooseUserDialog.razor b/TaikoWebUI/Pages/Dialogs/ChooseUserDialog.razor new file mode 100644 index 00000000..9f7dc7f9 --- /dev/null +++ b/TaikoWebUI/Pages/Dialogs/ChooseUserDialog.razor @@ -0,0 +1,102 @@ +@using Blazored.LocalStorage +@using TaikoWebUI.Utilities; + +@inject IJSRuntime Js +@inject ILocalStorageService LocalStorage +@inject HttpClient HttpClient + + + + + + + + + + + + + + + @Localizer["User ID"] + + + + + @Localizer["Users"] + + + + + @context.Baid + + @context.UserSetting.MyDonName + + + + + + + + + + @Localizer["Cancel"] + + + + +@code { + + [CascadingParameter] MudDialogInstance MudDialog { get; set; } = null!; + + [Parameter] public int Exclude { get; set; } = 0; + + private Dictionary userDict = new(); + + private string Search { get; set; } = string.Empty; + + private string searchString = string.Empty; + + protected override async Task OnInitializedAsync() + { + base.OnInitialized(); + Dictionary? dict = await HttpClient.GetFromJsonAsync>($"api/Users/{Exclude}/AllUserDict"); + dict.ThrowIfNull(); + userDict = dict; + } + + private bool FilterUser(User user) + { + var stringsToCheck = new List + { + user.Baid + "", + user.UserSetting.MyDonName + }; + + if (!string.IsNullOrEmpty(Search) && !stringsToCheck.Any(s => s.Contains(Search, StringComparison.OrdinalIgnoreCase))) + { + return false; + } + + return true; + } + + private void Select(User user) + { + MudDialog.Close(DialogResult.Ok(user)); + } + + private void Cancel() + { + MudDialog.Cancel(); + } + +} \ No newline at end of file From db71975b4ec7fac50d7642369342b2a538d1fe5d Mon Sep 17 00:00:00 2001 From: ptmaster Date: Mon, 16 Sep 2024 20:47:07 +0800 Subject: [PATCH 06/15] Fix Error After Dialog Cancelled --- TaikoWebUI/Components/ChallengeCompeteGrid.razor | 4 ++-- .../Dialogs/AddChallengeCompetitionDialog.razor | 13 ++++++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor b/TaikoWebUI/Components/ChallengeCompeteGrid.razor index 8dfa2b9f..88632170 100644 --- a/TaikoWebUI/Components/ChallengeCompeteGrid.razor +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor @@ -202,8 +202,8 @@ var dialogRet = await DialogService.ShowAsync(Localizer["Create"], parameters, options); if (dialogRet != null) { - bool result = await dialogRet.GetReturnValueAsync(); - if (result == true) await GetUsersData(); + var result = await dialogRet.GetReturnValueAsync(); + if (result != null && result == true) await GetUsersData(); } } } diff --git a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor index ae51bde1..4fc57253 100644 --- a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor +++ b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor @@ -190,12 +190,15 @@ parameters.Add("SelectedSong", musicDetails[i]); var reference = await DialogService.ShowAsync(Localizer["Create"], parameters, options); - var songInfo = await reference.GetReturnValueAsync(); - - if (songInfo != null) + if (reference != null) { - musicDetails[i] = songInfo.MusicDetail; - difficulties[i] = songInfo.Difficulty; + var songInfo = await reference.GetReturnValueAsync(); + + if (songInfo != null) + { + musicDetails[i] = songInfo.MusicDetail; + difficulties[i] = songInfo.Difficulty; + } } } From b1ce6003fbc214c467ed29a2fddbca47d5133be0 Mon Sep 17 00:00:00 2001 From: ptmaster Date: Mon, 16 Sep 2024 20:59:36 +0800 Subject: [PATCH 07/15] Fix Information Button Disable rule | Add Entry In UserCard --- TaikoWebUI/Components/ChallengeCompe.razor | 3 +-- TaikoWebUI/Components/UserCard.razor | 8 ++++++++ 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor index 052e6ac0..a7eff82d 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -46,8 +46,7 @@ - AnswerChallenge(true))>@Localizer["Information"] + AnswerChallenge(true))>@Localizer["Information"] @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) { @if (Baid == 0 || ChallengeCompetition?.Baid == Baid || ChallengeCompetition?.State != CompeteState.Waiting) diff --git a/TaikoWebUI/Components/UserCard.razor b/TaikoWebUI/Components/UserCard.razor index 76510164..5b2d2d3d 100644 --- a/TaikoWebUI/Components/UserCard.razor +++ b/TaikoWebUI/Components/UserCard.razor @@ -73,6 +73,14 @@ } + + @Localizer["Challenge"] + + + + @Localizer["Competition"] + + @if (AuthService.AllowUserDelete) { Date: Mon, 16 Sep 2024 21:36:59 +0800 Subject: [PATCH 08/15] fix some detail --- TaikoWebUI/Components/ChallengeCompe.razor | 8 ++++---- .../Components/ChallengeCompeteGrid.razor | 12 ++++++------ TaikoWebUI/Components/NavMenu.razor | 18 ++++++++++-------- TaikoWebUI/Components/UserCard.razor | 4 ++++ 4 files changed, 24 insertions(+), 18 deletions(-) diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor index a7eff82d..f9cba139 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -66,10 +66,10 @@ } else { - - + AnswerChallenge(true))>@Localizer["Accept"] - AnswerChallenge(false))>@Localizer["Reject"] } @@ -90,7 +90,7 @@ } else { - @Localizer["Participate"] + @Localizer["Participate"] } } } diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor b/TaikoWebUI/Components/ChallengeCompeteGrid.razor index 88632170..8bcca74b 100644 --- a/TaikoWebUI/Components/ChallengeCompeteGrid.razor +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor @@ -24,16 +24,16 @@ Variant="Variant.Outlined" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" Style="width: 100%"/> - @if (Mode == 1) { - OpenDialogAsync(1, 1)) Style="width: 80px">@Localizer["Add"] + @if (Mode == 1 && Baid != 0) { + OpenDialogAsync(1, 1)) Style="width: 80px">@Localizer["Add"] } - else if (Mode == 2) + else if (Mode == 2 && Baid != 0) { - OpenDialogAsync(2, 3)) Style="width: 80px">@Localizer["Add"] + OpenDialogAsync(2, 3)) Style="width: 80px">@Localizer["Add"] } - else if (Mode == 3) + else if (Mode == 3 && Baid == 0) { - OpenDialogAsync(3, 3)) Style="width: 80px">@Localizer["Add"] + OpenDialogAsync(3, 3)) Style="width: 80px">@Localizer["Add"] } diff --git a/TaikoWebUI/Components/NavMenu.razor b/TaikoWebUI/Components/NavMenu.razor index 38efc33e..8b901f68 100644 --- a/TaikoWebUI/Components/NavMenu.razor +++ b/TaikoWebUI/Components/NavMenu.razor @@ -30,6 +30,16 @@ @Localizer["Play History"] @Localizer["Dani Dojo"] + } + + + @Localizer["Challenge"] + @Localizer["Competition"] + @Localizer["Official Competition"] + + + if (AuthService.IsLoggedIn) + { @Localizer["Show QR Code"] @Localizer["Change Password"] @@ -43,14 +53,6 @@ @Localizer["Log Out"] } } - - @{ - - @Localizer["Challenge"] - @Localizer["Competition"] - @Localizer["Official Competition"] - - } @code { diff --git a/TaikoWebUI/Components/UserCard.razor b/TaikoWebUI/Components/UserCard.razor index 5b2d2d3d..e1cb7fa2 100644 --- a/TaikoWebUI/Components/UserCard.razor +++ b/TaikoWebUI/Components/UserCard.razor @@ -81,6 +81,10 @@ @Localizer["Competition"] + + @Localizer["Official Competition"] + + @if (AuthService.AllowUserDelete) { Date: Mon, 16 Sep 2024 23:47:48 +0800 Subject: [PATCH 09/15] Add Challenge/Competition Localization Resources --- SharedProject/Models/SongInfo.cs | 2 + TaikoWebUI/Components/ChallengeCompe.razor | 23 +- .../Components/ChallengeCompeteGrid.razor | 6 +- TaikoWebUI/Components/UserCard.razor | 8 +- .../LocalizationResource.Designer.cs | 198 ++++++++++++++++++ .../LocalizationResource.en-US.resx | 66 ++++++ .../LocalizationResource.fr-FR.resx | 66 ++++++ .../Localization/LocalizationResource.ja.resx | 66 ++++++ .../Localization/LocalizationResource.resx | 66 ++++++ .../LocalizationResource.zh-Hans.resx | 66 ++++++ .../LocalizationResource.zh-Hant.resx | 66 ++++++ .../AddChallengeCompetitionDialog.razor | 23 +- 12 files changed, 638 insertions(+), 18 deletions(-) diff --git a/SharedProject/Models/SongInfo.cs b/SharedProject/Models/SongInfo.cs index a3d64bb2..b85e4111 100644 --- a/SharedProject/Models/SongInfo.cs +++ b/SharedProject/Models/SongInfo.cs @@ -8,4 +8,6 @@ public class SongInfo public Difficulty Difficulty { get; set; } = new(); + public int Level { get; set; } = 0; + } diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor index f9cba139..47817318 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -8,14 +8,17 @@ @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) { - @if (ChallengeCompetition?.Baid != Baid) + if (Baid == 0) { - @Localizer["From"] @ChallengeCompetition?.Holder?.MyDonName + @formatChallengeTitle(Localizer["FullChallengeTitle"]) + } + else if (ChallengeCompetition?.Baid != Baid) + { + @formatChallengeTitle(Localizer["ReceiverChallengeTitle"]) } else { - var participant = ChallengeCompetition?.Participants?.Find(p => p.Baid != Baid); - @Localizer["To"] @participant?.UserInfo?.MyDonName + @formatChallengeTitle(Localizer["CreatorChallengeTitle"]) } } else @@ -86,13 +89,16 @@ { if (ChallengeCompetition.MaxParticipant <= ChallengeCompetition.Participants.Count) { - @Localizer["Fullfilled"] + @Localizer["Fulfilled"] } else { @Localizer["Participate"] } } + } else + { + @ChallengeCompetition.Participants.Count / @ChallengeCompetition.MaxParticipant } } @@ -125,6 +131,13 @@ return ChallengeCompetition?.CreateTime < DateTime.Now && DateTime.Now < ChallengeCompetition?.ExpireTime && !ParticipatedChallengeCompetition(); } + private string formatChallengeTitle(string template) + { + return template + .Replace("{From}", ChallengeCompetition?.Holder?.MyDonName) + .Replace("{To}", ChallengeCompetition?.Participants?.Find(p => p.Baid != ChallengeCompetition?.Baid)?.UserInfo?.MyDonName); + } + private async Task AnswerChallenge(bool accept) { if (ChallengeCompetition == null || ChallengeCompetition.State != CompeteState.Waiting) return; diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor b/TaikoWebUI/Components/ChallengeCompeteGrid.razor index 8bcca74b..960232af 100644 --- a/TaikoWebUI/Components/ChallengeCompeteGrid.razor +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor @@ -33,7 +33,7 @@ } else if (Mode == 3 && Baid == 0) { - OpenDialogAsync(3, 3)) Style="width: 80px">@Localizer["Add"] + OpenDialogAsync(3, 5, 365, 100)) Style="width: 80px">@Localizer["Add"] } @@ -191,12 +191,14 @@ await Debounce(GetUsersData, 500); // 500 milliseconds delay } - private async Task OpenDialogAsync(int mode, int maxSongs) + private async Task OpenDialogAsync(int mode, int maxSongs, int maxDays = 30, int maxParticipant = 20) { var options = new DialogOptions { CloseOnEscapeKey = true }; var parameters = new DialogParameters(); parameters.Add("Mode", mode); parameters.Add("MaxSongs", maxSongs); + parameters.Add("MaxDays", maxDays); + parameters.Add("MaxParticipant", maxParticipant); parameters.Add("Baid", Baid); var dialogRet = await DialogService.ShowAsync(Localizer["Create"], parameters, options); diff --git a/TaikoWebUI/Components/UserCard.razor b/TaikoWebUI/Components/UserCard.razor index e1cb7fa2..308946ed 100644 --- a/TaikoWebUI/Components/UserCard.razor +++ b/TaikoWebUI/Components/UserCard.razor @@ -39,7 +39,7 @@ @Localizer["Access Codes"] @@ -73,15 +73,15 @@ } - + @Localizer["Challenge"] - + @Localizer["Competition"] - + @Localizer["Official Competition"] diff --git a/TaikoWebUI/Localization/LocalizationResource.Designer.cs b/TaikoWebUI/Localization/LocalizationResource.Designer.cs index f4a5355c..627a6554 100644 --- a/TaikoWebUI/Localization/LocalizationResource.Designer.cs +++ b/TaikoWebUI/Localization/LocalizationResource.Designer.cs @@ -177,6 +177,15 @@ internal static string Accept { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Accepted { + get { + return ResourceManager.GetString("Accepted", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -348,6 +357,15 @@ internal static string And { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Any { + get { + return ResourceManager.GetString("Any", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -429,6 +447,15 @@ internal static string Challenge_Competition_Data { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Challenge_Target { + get { + return ResourceManager.GetString("Challenge Target", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -600,6 +627,51 @@ internal static string Course_Songs { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Create { + get { + return ResourceManager.GetString("Create", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Create_Challenge { + get { + return ResourceManager.GetString("Create Challenge", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Create_Competition { + get { + return ResourceManager.GetString("Create Competition", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Create_Official_Competition { + get { + return ResourceManager.GetString("Create Official Competition", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string CreatorChallengeTitle { + get { + return ResourceManager.GetString("CreatorChallengeTitle", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -924,6 +996,24 @@ internal static string Fourth_Kyuu { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Fulfilled { + get { + return ResourceManager.GetString("Fulfilled", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string FullChallengeTitle { + get { + return ResourceManager.GetString("FullChallengeTitle", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1131,6 +1221,15 @@ internal static string Language { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Last_For__Days_ { + get { + return ResourceManager.GetString("Last For (Days)", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1257,6 +1356,15 @@ internal static string MAX_Combo { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Max_Participant { + get { + return ResourceManager.GetString("Max Participant", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1338,6 +1446,15 @@ internal static string No_Play_History_Found { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string No_Select { + get { + return ResourceManager.GetString("No Select", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1410,6 +1527,15 @@ internal static string Notes_Position { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Off { + get { + return ResourceManager.GetString("Off", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1437,6 +1563,15 @@ internal static string Old_Password { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string On { + get { + return ResourceManager.GetString("On", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1446,6 +1581,15 @@ internal static string Oni { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Only_Play_Once { + get { + return ResourceManager.GetString("Only Play Once", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1464,6 +1608,15 @@ internal static string Participate { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Participated { + get { + return ResourceManager.GetString("Participated", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1599,6 +1752,15 @@ internal static string Rank { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string ReceiverChallengeTitle { + get { + return ResourceManager.GetString("ReceiverChallengeTitle", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1689,6 +1851,15 @@ internal static string Reject { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Rejected { + get { + return ResourceManager.GetString("Rejected", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1842,6 +2013,24 @@ internal static string Select_a_Title { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Select_Song { + get { + return ResourceManager.GetString("Select Song", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Select_User { + get { + return ResourceManager.GetString("Select User", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// @@ -1914,6 +2103,15 @@ internal static string Skip_Song { } } + /// + /// 查找类似 的本地化字符串。 + /// + internal static string Song { + get { + return ResourceManager.GetString("Song", resourceCulture); + } + } + /// /// 查找类似 的本地化字符串。 /// diff --git a/TaikoWebUI/Localization/LocalizationResource.en-US.resx b/TaikoWebUI/Localization/LocalizationResource.en-US.resx index 3cc99fa4..c79edb58 100644 --- a/TaikoWebUI/Localization/LocalizationResource.en-US.resx +++ b/TaikoWebUI/Localization/LocalizationResource.en-US.resx @@ -864,4 +864,70 @@ Challenge Competition Data + + Accepted + + + Rejected + + + Challenge User + + + Duration (days) + + + Song + + + Only Play Once + + + Limit Reached + + + Participated + + + Challenge from {From} to {To} + + + Challenge from {From} + + + Challenge to {To} + + + Create Challenge + + + Create Competition + + + Create Official Competition + + + Create + + + No Selected Song + + + Max Participant + + + Select a Song with Difficulty + + + Select Challenge Target User + + + Any + + + On + + + Off + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx index 0d1af08d..444c169b 100644 --- a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx +++ b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx @@ -864,4 +864,70 @@ Données de compétition de défi + + Accepté + + + Rejeté + + + Objet de défi + + + Durée (jours) + + + Chanson + + + Jouer une seule fois + + + Limite atteinte + + + Déjà participé + + + Défi de {From} à {To} + + + Défi de {From} + + + Défi à {To} + + + Créer un défi + + + Créer une compétition + + + Créer une compétition officielle + + + Créer + + + Aucune chanson sélectionnée + + + Nombre maximal de participants + + + Sélectionnez une chanson avec difficulté + + + Sélectionnez l'utilisateur cible du défi + + + N'importe lequel + + + allumer + + + fermeture + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.ja.resx b/TaikoWebUI/Localization/LocalizationResource.ja.resx index 0f9255f2..6e8fe1bd 100644 --- a/TaikoWebUI/Localization/LocalizationResource.ja.resx +++ b/TaikoWebUI/Localization/LocalizationResource.ja.resx @@ -864,4 +864,70 @@ 挑戦と大会 + + 受け入れられました + + + 拒否されました + + + 挑戦対象 + + + 期間 (日) + + + + + + 一度だけプレイ + + + すでに満席 + + + 参加済み + + + {From} から {To} への挑戦状 + + + {From} からの挑戦状 + + + {To} への挑戦状 + + + 挑戦状を作成する + + + 大会を作成する + + + 公式大会を作成する + + + 作成する + + + 曲が選択されていません + + + 最大参加者数 + + + 難しいと曲を選ぶ + + + 挑戦対象を選択 + + + 指定しない + + + オン + + + オフ + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.resx b/TaikoWebUI/Localization/LocalizationResource.resx index 261ce544..c452a4b5 100644 --- a/TaikoWebUI/Localization/LocalizationResource.resx +++ b/TaikoWebUI/Localization/LocalizationResource.resx @@ -864,4 +864,70 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx b/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx index 279c0739..252d2ffc 100644 --- a/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx +++ b/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx @@ -864,4 +864,70 @@ 挑战与大赛 + + 已接受 + + + 已拒绝 + + + 挑战对象 + + + 持续时间(天) + + + 歌曲 + + + 单次挑战 + + + 已满员 + + + 已参加 + + + {From} 向 {To} 发起的挑战书 + + + 来自 {From} 的挑战书 + + + 向 {To} 发起的挑战书 + + + 发起挑战 + + + 创建大赛 + + + 创建官方大赛 + + + 创建 + + + 无歌曲 + + + 最大参与人数 + + + 请选择歌曲与难度 + + + 请选择挑战的对象 + + + 任意 + + + 开启 + + + 关闭 + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx b/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx index e8a8b7ff..4015c947 100644 --- a/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx +++ b/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx @@ -864,4 +864,70 @@ 挑戰與大赛 + + 已接受 + + + 已拒絕 + + + 挑戰對象 + + + 持續時間(天) + + + 歌曲 + + + 單次挑戰 + + + 已滿員 + + + 已參加 + + + {From} 向 {To} 發起的挑戰書 + + + 來自 {From} 的挑戰書 + + + 向 {To} 發起的挑戰書 + + + 發起挑戰 + + + 創建大賽 + + + 創建官方大賽 + + + 創建 + + + 未選擇歌曲 + + + 最大參與人數 + + + 請選擇歌曲與難度 + + + 請選擇挑戰的對象 + + + 任意 + + + 開啟 + + + 關閉 + \ No newline at end of file diff --git a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor index 4fc57253..35cd2b7a 100644 --- a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor +++ b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor @@ -34,13 +34,13 @@ @if (Mode == 2 || Mode == 3) { - + } @if (Mode == 1) { - + @Localizer["Select"] } @@ -60,6 +60,7 @@ } @(musicDetails[song_idx].SongId == 0 ? Localizer["No Select"] : musicDetails[song_idx].SongName) + @levels[song_idx] @@ -107,9 +108,9 @@ } @if (Mode != 1) { - + } - + @Localizer["Only Play Once"] @@ -158,9 +159,11 @@ private Difficulty[] difficulties = new Difficulty[0]; - private int LastFor = 1; + private int[] levels = new int[0]; - private int ParticipantCount = 1; + private int LastFor = 7; + + private int ParticipantCount = 5; private bool OnlyPlayOnce = false; @@ -170,10 +173,12 @@ _expandeds = new bool[MaxSongs]; musicDetails = new MusicDetail[MaxSongs]; difficulties = new Difficulty[MaxSongs]; + levels = new int[MaxSongs]; for (int i = 0; i < MaxSongs; i++) { musicDetails[i] = new(); difficulties[i] = Difficulty.None; + levels[i] = 0; } Info.challengeCompeteSongs.Add(new()); } @@ -189,7 +194,7 @@ var parameters = new DialogParameters(); parameters.Add("SelectedSong", musicDetails[i]); - var reference = await DialogService.ShowAsync(Localizer["Create"], parameters, options); + var reference = await DialogService.ShowAsync(Localizer["Select Song"], parameters, options); if (reference != null) { var songInfo = await reference.GetReturnValueAsync(); @@ -198,6 +203,7 @@ { musicDetails[i] = songInfo.MusicDetail; difficulties[i] = songInfo.Difficulty; + levels[i] = songInfo.Level; } } } @@ -212,12 +218,14 @@ _expandeds[ex] = _expandeds[ex + 1]; musicDetails[ex] = musicDetails[ex + 1]; difficulties[ex] = difficulties[ex + 1]; + levels[ex] = levels[ex + 1]; } else { _expandeds[ex] = false; musicDetails[ex] = new(); difficulties[ex] = Difficulty.None; + levels[ex] = 0; } } } @@ -262,6 +270,7 @@ if (Mode == 1) { + Info.MaxParticipant = 2; if (TargetBaid == 0) { await ShowError(Localizer["Must Select Challenge Target Error"]); From d5533248d767e9945616dac85b3899b4bad50564 Mon Sep 17 00:00:00 2001 From: ptmaster Date: Tue, 17 Sep 2024 03:07:13 +0800 Subject: [PATCH 10/15] ChallengeCompetition Fix&Improve --- .../Api/ChallengeCompeteManageController.cs | 12 ++++ .../Services/ChallengeCompeteService.cs | 9 +++ .../Interfaces/IChallengeCompeteService.cs | 2 + TaikoWebUI/Components/ChallengeCompe.razor | 61 ++++++++++++++----- .../Components/ChallengeCompeteGrid.razor | 48 ++++++++++++--- .../AddChallengeCompetitionDialog.razor | 40 +++++++----- .../Pages/Dialogs/ChooseSongDialog.razor | 27 ++++---- 7 files changed, 145 insertions(+), 54 deletions(-) diff --git a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs index 98d199ba..1887030c 100644 --- a/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs +++ b/TaikoLocalServer/Controllers/Api/ChallengeCompeteManageController.cs @@ -49,6 +49,18 @@ public async Task> GetChallengeCompeP return Ok(response); } + [HttpGet("comp/{compId}")] + [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] + public async Task> GetChallengeCompe(uint compId) + { + var data = await challengeCompeteService.GetFirstOrDefaultCompete(compId); + if (data == null) return BadRequest(new { Message = $"Compete(CompId={compId}) is Not Exist!"}); + var challengeCompetition = Mappers.ChallengeCompeMappers.MapData(data); + challengeCompetition = await challengeCompeteService.FillData(challengeCompetition); + + return Ok(challengeCompetition); + } + [HttpGet("test/{mode}")] [ServiceFilter(typeof(AuthorizeIfRequiredAttribute))] public ActionResult> testCreateCompete(uint mode) diff --git a/TaikoLocalServer/Services/ChallengeCompeteService.cs b/TaikoLocalServer/Services/ChallengeCompeteService.cs index 5dc5ab59..db81db5d 100644 --- a/TaikoLocalServer/Services/ChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/ChallengeCompeteService.cs @@ -4,6 +4,7 @@ using SharedProject.Models.Responses; using SharedProject.Utils; using Throw; +using static Microsoft.EntityFrameworkCore.DbLoggerCategory; namespace TaikoLocalServer.Services; @@ -125,6 +126,14 @@ public async Task GetChallengeCompetePage(CompeteM }; } + public Task GetFirstOrDefaultCompete(uint compId) + { + return context.ChallengeCompeteData + .Include(e => e.Songs).ThenInclude(e => e.BestScores).Include(e => e.Participants) + .Where(c => c.CompId == compId) + .FirstOrDefaultAsync(); + } + public async Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeCompeteInfo) { ChallengeCompeteDatum challengeCompeteData = new() diff --git a/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs b/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs index 8f1bc2cf..2a63ea56 100644 --- a/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/Interfaces/IChallengeCompeteService.cs @@ -13,6 +13,8 @@ public interface IChallengeCompeteService public Task GetChallengeCompetePage(CompeteModeType mode, uint baid, bool inProgress, int page, int limit, string? search); + public Task GetFirstOrDefaultCompete(uint compId); + public Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeCompeteInfo); public Task ParticipateCompete(uint compId, uint baid); diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor index 47817318..9b248460 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -1,30 +1,38 @@ -@inject IDialogService DialogService; +@using Blazored.LocalStorage + @inject HttpClient Client +@inject IDialogService DialogService; +@inject IGameDataService GameDataService +@inject ILocalStorageService LocalStorage @if (ChallengeCompetition != null) { - @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) - { - if (Baid == 0) + + @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) { - @formatChallengeTitle(Localizer["FullChallengeTitle"]) - } - else if (ChallengeCompetition?.Baid != Baid) - { - @formatChallengeTitle(Localizer["ReceiverChallengeTitle"]) + if (Baid == 0) + { + @formatChallengeTitle(Localizer["FullChallengeTitle"]) + } + else if (ChallengeCompetition?.Baid != Baid) + { + + @formatChallengeTitle(Localizer["ReceiverChallengeTitle"]) + } + else + { + + @formatChallengeTitle(Localizer["CreatorChallengeTitle"]) + } } else { - @formatChallengeTitle(Localizer["CreatorChallengeTitle"]) + @ChallengeCompetition?.CompeteName } - } - else - { - @ChallengeCompetition?.CompeteName - } + @Localizer["Comp ID"]:@ChallengeCompetition?.CompId @Localizer["Describe"]:@ChallengeCompetition?.CompeteDescribe @@ -42,7 +50,9 @@ foreach (var song in ChallengeCompetition.Songs) {
- @song.MusicDetail?.SongName + + @GameDataService.GetMusicNameBySongId(MusicDetailDictionary, song.MusicDetail.SongId, SongNameLanguage)@(song.BestScores.Any(bs => bs.Baid == Baid) ? (" (" + Localizer["Played"] + ")") : "") +
} } @@ -110,6 +120,25 @@ [Parameter] public ChallengeCompetition? ChallengeCompetition { get; set; } [Parameter] public int Baid { get; set; } [Parameter] public EventCallback Refresh { get; set; } + [Parameter] public Dictionary? MusicDetailDictionary { get; set; } = null; + [Parameter] public string? SongNameLanguage { get; set; } = null; + + protected override async Task OnInitializedAsync() + { + base.OnInitialized(); + if (SongNameLanguage == null) SongNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage"); + if (MusicDetailDictionary == null) MusicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); + } + + private string GetSongInfo(ChallengeCompetitionSong song) + { + var songName = GameDataService.GetMusicNameBySongId(MusicDetailDictionary, song.MusicDetail.SongId, SongNameLanguage); + if (song.BestScores.Any(bs => bs.Baid == Baid)) + { + return songName + " (" + Localizer["Played"] + ")"; + } + return songName; + } private bool SelfHoldedChallengeCompetiton() { diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor b/TaikoWebUI/Components/ChallengeCompeteGrid.razor index 960232af..2811837e 100644 --- a/TaikoWebUI/Components/ChallengeCompeteGrid.razor +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor @@ -1,8 +1,12 @@ -@inject HttpClient Client +@using Blazored.LocalStorage + +@inject HttpClient Client @inject AuthService AuthService +@inject IDialogService DialogService; +@inject IGameDataService GameDataService +@inject ILocalStorageService LocalStorage @inject NavigationManager NavigationManager @inject BreadcrumbsStateContainer BreadcrumbsStateContainer -@inject IDialogService DialogService; @using TaikoWebUI.Components; @using TaikoWebUI.Pages.Dialogs @@ -65,7 +69,11 @@ foreach (var challengeCompetition in response.List) { - + } } @@ -105,6 +113,12 @@ [Parameter] public int Mode { get; set; } + [Parameter] + public Dictionary? MusicDetailDictionary { get; set; } = null; + + [Parameter] + public string? SongNameLanguage { get; set; } = null; + private ChallengeCompetitionResponse? response = new(); private CancellationTokenSource? cts; private int TotalPages { get; set; } = 0; @@ -114,7 +128,7 @@ private string? searchTerm = null; private bool inProgress = false; - private async Task GetUsersData() + private async Task GetChallengeCompetitionData() { isLoading = true; @@ -127,7 +141,7 @@ private async Task UpdateCompete(ChallengeCompetition cc) { - await GetUsersData(); + await GetChallengeCompetitionData(); var updated = response?.List.Find(c => c.CompId == cc.CompId); if (updated != null) { @@ -139,6 +153,9 @@ protected override async Task OnInitializedAsync() { await base.OnInitializedAsync(); + if (SongNameLanguage == null) SongNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage"); + if (MusicDetailDictionary == null) MusicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); + if (AuthService.LoginRequired && !AuthService.IsLoggedIn) { await AuthService.LoginWithAuthToken(); @@ -146,18 +163,29 @@ if (AuthService.IsAdmin || !AuthService.LoginRequired) { - await GetUsersData(); + await GetChallengeCompetitionData(); } BreadcrumbsStateContainer.breadcrumbs.Clear(); - BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Users"], href: "/Users")); + if (Mode == 1) + { + BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Challenge"], href: $"/ChallengeCompe/{Baid}/Challenge")); + } + else if (Mode == 2) + { + BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Competition"], href: $"/ChallengeCompe/{Baid}/Competition")); + } + else if (Mode == 3) + { + BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Official Competition"], href: $"/ChallengeCompe/{Baid}/OfficialCompetition")); + } BreadcrumbsStateContainer.NotifyStateChanged(); } private async Task OnPageChange(int page) { currentPage = page; - await GetUsersData(); + await GetChallengeCompetitionData(); } private async Task Debounce(Func action, int delayInMilliseconds) @@ -188,7 +216,7 @@ currentPage = 1; // Debounce the GetUsersData method - await Debounce(GetUsersData, 500); // 500 milliseconds delay + await Debounce(GetChallengeCompetitionData, 500); // 500 milliseconds delay } private async Task OpenDialogAsync(int mode, int maxSongs, int maxDays = 30, int maxParticipant = 20) @@ -205,7 +233,7 @@ if (dialogRet != null) { var result = await dialogRet.GetReturnValueAsync(); - if (result != null && result == true) await GetUsersData(); + if (result != null && result == true) await GetChallengeCompetitionData(); } } } diff --git a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor index 35cd2b7a..22657eff 100644 --- a/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor +++ b/TaikoWebUI/Pages/Dialogs/AddChallengeCompetitionDialog.razor @@ -1,9 +1,12 @@ @using System.Net -@using TaikoWebUI.Utilities; +@using Blazored.LocalStorage +@using TaikoWebUI.Utilities @inject HttpClient Client @inject ISnackbar Snackbar -@inject IDialogService DialogService; +@inject IDialogService DialogService +@inject IGameDataService GameDataService +@inject ILocalStorageService LocalStorage @@ -36,7 +39,7 @@ { } - + @if (Mode == 1) { @@ -59,9 +62,10 @@ Difficulty difficulty = difficulties[song_idx]; } - @(musicDetails[song_idx].SongId == 0 ? Localizer["No Select"] : musicDetails[song_idx].SongName) - @levels[song_idx] - + @(musicDetails[song_idx].SongId == 0 ? Localizer["No Select"] : GameDataService.GetMusicNameBySongId(MusicDetailDictionary, musicDetails[song_idx].SongId, SongNameLanguage)) + @if (levels[song_idx] > 0) { + @levels[song_idx] + } @if (Info.challengeCompeteSongs.Count > 1) @@ -69,20 +73,20 @@ } - + - - + + @Localizer["Any"] @Localizer["On"] @Localizer["Off"] - + @Localizer["Any"] @Localizer["On"] @Localizer["Off"] - + @Localizer["Any"] @for (uint idx = 0; idx < SpeedStrings.Length; idx++) { @@ -90,7 +94,7 @@ @SpeedStrings[speed_idx] } - + @Localizer["Any"] @foreach (var item in Enum.GetValues()) { @@ -142,6 +146,10 @@ [Parameter] public ChallengeCompeteCreateInfo Info { get; set; } = new(); + private Dictionary MusicDetailDictionary = new(); + + private string? SongNameLanguage; + private static readonly string[] SpeedStrings = { "1.0", "1.1", "1.2", "1.3", "1.4", @@ -168,8 +176,9 @@ private bool OnlyPlayOnce = false; - protected override void OnInitialized() + protected override async Task OnInitializedAsync() { + base.OnInitialized(); _expandeds = new bool[MaxSongs]; musicDetails = new MusicDetail[MaxSongs]; difficulties = new Difficulty[MaxSongs]; @@ -181,6 +190,8 @@ levels[i] = 0; } Info.challengeCompeteSongs.Add(new()); + SongNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage"); + MusicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); } private void AddSong() @@ -192,7 +203,8 @@ { var options = new DialogOptions { CloseOnEscapeKey = true }; var parameters = new DialogParameters(); - parameters.Add("SelectedSong", musicDetails[i]); + parameters.Add("MusicDetailDictionary", MusicDetailDictionary); + parameters.Add("SongNameLanguage", SongNameLanguage); var reference = await DialogService.ShowAsync(Localizer["Select Song"], parameters, options); if (reference != null) diff --git a/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor b/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor index 4f06d6b7..2b993a8c 100644 --- a/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor +++ b/TaikoWebUI/Pages/Dialogs/ChooseSongDialog.razor @@ -7,7 +7,7 @@ - + @@ -25,7 +25,7 @@ - + @Localizer["Song Title"] @@ -34,7 +34,7 @@ @if (difficulty is not Difficulty.None) { - + @ScoreUtils.GetDifficultyTitle(difficulty) @@ -44,18 +44,18 @@ - @GameDataService.GetMusicNameBySongId(musicDetailDictionary, context.SongId, SongNameLanguage) + @GameDataService.GetMusicNameBySongId(MusicDetailDictionary, context.SongId, SongNameLanguage) @foreach (var difficulty in Enum.GetValues()) { @if (difficulty is not Difficulty.None) { - var starLevel = GameDataService.GetMusicStarLevel(musicDetailDictionary, context.SongId, difficulty); + var starLevel = GameDataService.GetMusicStarLevel(MusicDetailDictionary, context.SongId, difficulty); @if (starLevel > 0) { - @starLevel + @starLevel } else { @@ -83,11 +83,9 @@ [CascadingParameter] MudDialogInstance MudDialog { get; set; } = null!; - [Parameter] public MusicDetail SelectedSong { get; set; } = new(); + [Parameter] public Dictionary? MusicDetailDictionary { get; set; } = null; - private Dictionary musicDetailDictionary = new(); - - private string? SongNameLanguage; + [Parameter] public string? SongNameLanguage { get; set; } = null; private string Search { get; set; } = string.Empty; @@ -96,8 +94,8 @@ protected override async Task OnInitializedAsync() { base.OnInitialized(); - SongNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage"); - musicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); + if (SongNameLanguage == null) SongNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage"); + if (MusicDetailDictionary == null) MusicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); } @@ -119,12 +117,13 @@ return true; } - private void Select(MusicDetail musicDetail, Difficulty difficulty) + private void Select(MusicDetail musicDetail, Difficulty difficulty, int level) { MudDialog.Close(DialogResult.Ok(new SongInfo() { MusicDetail = musicDetail, - Difficulty = difficulty + Difficulty = difficulty, + Level = level, })); } From 44c74fc5cc2dab8dfc3d8aa0fed820d8f656dc28 Mon Sep 17 00:00:00 2001 From: KIT! Date: Mon, 28 Oct 2024 12:46:53 +0100 Subject: [PATCH 11/15] Code cleanup & FR Locale Fixes Moved the page code to .cs files for all Challenge pages Made the challenge section only visibile when user is connected --- TaikoWebUI/Components/ChallengeCompe.razor | 122 +--- TaikoWebUI/Components/ChallengeCompe.razor.cs | 91 +++ .../Components/ChallengeCompeteGrid.razor | 144 +---- .../Components/ChallengeCompeteGrid.razor.cs | 119 ++++ TaikoWebUI/Components/NavMenu.razor | 16 +- .../LocalizationResource.Designer.cs | 566 +++++++++--------- .../LocalizationResource.fr-FR.resx | 28 +- 7 files changed, 537 insertions(+), 549 deletions(-) create mode 100644 TaikoWebUI/Components/ChallengeCompe.razor.cs create mode 100644 TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor index 9b248460..441ccc06 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -1,31 +1,32 @@ @using Blazored.LocalStorage @inject HttpClient Client +@inject AuthService AuthService @inject IDialogService DialogService; @inject IGameDataService GameDataService @inject ILocalStorageService LocalStorage @if (ChallengeCompetition != null) { - + @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) { - if (Baid == 0) + if (AuthService.IsAdmin) { - @formatChallengeTitle(Localizer["FullChallengeTitle"]) + @FormatChallengeTitle(Localizer["FullChallengeTitle"]) } else if (ChallengeCompetition?.Baid != Baid) { - @formatChallengeTitle(Localizer["ReceiverChallengeTitle"]) + @FormatChallengeTitle(Localizer["ReceiverChallengeTitle"]) } else { - @formatChallengeTitle(Localizer["CreatorChallengeTitle"]) + @FormatChallengeTitle(Localizer["CreatorChallengeTitle"]) } } else @@ -34,11 +35,11 @@ } - @Localizer["Comp ID"]:@ChallengeCompetition?.CompId - @Localizer["Describe"]:@ChallengeCompetition?.CompeteDescribe + @Localizer["Comp ID"]: @ChallengeCompetition?.CompId + @Localizer["Describe"]: @ChallengeCompetition?.CompeteDescribe - @if (false && ChallengeCompetition?.Baid == Baid || Baid == 0) + @if (false && ChallengeCompetition?.Baid == Baid || AuthService.IsAdmin) { } @@ -49,11 +50,13 @@ @{ foreach (var song in ChallengeCompetition.Songs) { -
- - @GameDataService.GetMusicNameBySongId(MusicDetailDictionary, song.MusicDetail.SongId, SongNameLanguage)@(song.BestScores.Any(bs => bs.Baid == Baid) ? (" (" + Localizer["Played"] + ")") : "") - -
+ @if (MusicDetailDictionary != null && song.MusicDetail!= null){ +
+ + @GameDataService.GetMusicNameBySongId(MusicDetailDictionary, song.MusicDetail.SongId, SongNameLanguage)@(song.BestScores.Any(bs => bs.Baid == Baid) ? (" (" + Localizer["Played"] + ")") : "") + +
+ } } } @@ -62,7 +65,7 @@ AnswerChallenge(true))>@Localizer["Information"] @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) { - @if (Baid == 0 || ChallengeCompetition?.Baid == Baid || ChallengeCompetition?.State != CompeteState.Waiting) + @if (AuthService.IsAdmin || ChallengeCompetition?.Baid == Baid || ChallengeCompetition?.State != CompeteState.Waiting) { switch (ChallengeCompetition?.State) { @@ -80,9 +83,9 @@ else { - AnswerChallenge(true))>@Localizer["Accept"] - AnswerChallenge(false))>@Localizer["Reject"] } @@ -114,89 +117,4 @@
-} - -@code { - [Parameter] public ChallengeCompetition? ChallengeCompetition { get; set; } - [Parameter] public int Baid { get; set; } - [Parameter] public EventCallback Refresh { get; set; } - [Parameter] public Dictionary? MusicDetailDictionary { get; set; } = null; - [Parameter] public string? SongNameLanguage { get; set; } = null; - - protected override async Task OnInitializedAsync() - { - base.OnInitialized(); - if (SongNameLanguage == null) SongNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage"); - if (MusicDetailDictionary == null) MusicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); - } - - private string GetSongInfo(ChallengeCompetitionSong song) - { - var songName = GameDataService.GetMusicNameBySongId(MusicDetailDictionary, song.MusicDetail.SongId, SongNameLanguage); - if (song.BestScores.Any(bs => bs.Baid == Baid)) - { - return songName + " (" + Localizer["Played"] + ")"; - } - return songName; - } - - private bool SelfHoldedChallengeCompetiton() - { - return ChallengeCompetition?.Baid == Baid || Baid == 0; - } - - private bool ChallengeNeedAnswer() - { - return Baid != 0 && ChallengeCompetition?.State == CompeteState.Waiting && ChallengeCompetition?.Baid != Baid; - } - - private bool ParticipatedChallengeCompetition() - { - return ChallengeCompetition?.Participants?.Find(p => p.Baid == Baid) != null; - } - - private bool CanParticipateChallengeCompetition() - { - return ChallengeCompetition?.CreateTime < DateTime.Now && DateTime.Now < ChallengeCompetition?.ExpireTime && !ParticipatedChallengeCompetition(); - } - - private string formatChallengeTitle(string template) - { - return template - .Replace("{From}", ChallengeCompetition?.Holder?.MyDonName) - .Replace("{To}", ChallengeCompetition?.Participants?.Find(p => p.Baid != ChallengeCompetition?.Baid)?.UserInfo?.MyDonName); - } - - private async Task AnswerChallenge(bool accept) - { - if (ChallengeCompetition == null || ChallengeCompetition.State != CompeteState.Waiting) return; - var url = accept ? $"api/ChallengeCompeteManage/{Baid}/acceptChallenge/{ChallengeCompetition.CompId}" : $"api/ChallengeCompeteManage/{Baid}/rejectChallenge/{ChallengeCompetition.CompId}"; - var response = await Client.GetAsync(url); - if (!response.IsSuccessStatusCode) - { - await DialogService.ShowMessageBox( - Localizer["Error"], - Localizer["Request Error"], - Localizer["Dialog OK"], null, null, new DialogOptions { DisableBackdropClick = true }); - return; - } - await Refresh.InvokeAsync(ChallengeCompetition); - - ChallengeCompetition.State = accept ? CompeteState.Normal : CompeteState.Rejected; - } - - private async Task AnswerCompete() - { - if (ChallengeCompetition == null) return; - var response = await Client.GetAsync($"api/ChallengeCompeteManage/{Baid}/joinCompete/{ChallengeCompetition.CompId}"); - if (!response.IsSuccessStatusCode) - { - await DialogService.ShowMessageBox( - Localizer["Error"], - Localizer["Request Error"], - Localizer["Dialog OK"], null, null, new DialogOptions { DisableBackdropClick = true }); - return; - } - await Refresh.InvokeAsync(ChallengeCompetition); - } -} +} \ No newline at end of file diff --git a/TaikoWebUI/Components/ChallengeCompe.razor.cs b/TaikoWebUI/Components/ChallengeCompe.razor.cs new file mode 100644 index 00000000..9508dd57 --- /dev/null +++ b/TaikoWebUI/Components/ChallengeCompe.razor.cs @@ -0,0 +1,91 @@ +using TaikoWebUI.Pages.Dialogs; +namespace TaikoWebUI.Components; + +public partial class ChallengeCompe +{ + [Parameter] public ChallengeCompetition? ChallengeCompetition { get; set; } + [Parameter] public int Baid { get; set; } + [Parameter] public EventCallback Refresh { get; set; } + [Parameter] public Dictionary? MusicDetailDictionary { get; set; } = null; + [Parameter] public string? SongNameLanguage { get; set; } = null; + + protected override async Task OnInitializedAsync() + { + base.OnInitialized(); + SongNameLanguage ??= await LocalStorage.GetItemAsync("songNameLanguage"); + MusicDetailDictionary ??= await GameDataService.GetMusicDetailDictionary(); + } + + private string GetSongInfo(ChallengeCompetitionSong song) + { + MusicDetailDictionary.ThrowIfNull(); + song.MusicDetail.ThrowIfNull(); + + var songName = GameDataService.GetMusicNameBySongId(MusicDetailDictionary, song.MusicDetail.SongId, SongNameLanguage); + if (song.BestScores.Any(bs => bs.Baid == Baid)) + { + return songName + " (" + Localizer["Played"] + ")"; + } + return songName; + } + + private bool SelfHoldedChallengeCompetiton() + { + return ChallengeCompetition?.Baid == Baid || AuthService.IsAdmin; + } + + private bool ChallengeNeedAnswer() + { + return Baid != 0 && ChallengeCompetition?.State == CompeteState.Waiting && ChallengeCompetition?.Baid != Baid; + } + + private bool ParticipatedChallengeCompetition() + { + return ChallengeCompetition?.Participants?.Find(p => p.Baid == Baid) != null; + } + + private bool CanParticipateChallengeCompetition() + { + return ChallengeCompetition?.CreateTime < DateTime.Now && DateTime.Now < ChallengeCompetition?.ExpireTime && !ParticipatedChallengeCompetition(); + } + + private string FormatChallengeTitle(string template) + { + return template + .Replace("{From}", ChallengeCompetition?.Holder?.MyDonName) + .Replace("{To}", ChallengeCompetition?.Participants?.Find(p => p.Baid != ChallengeCompetition?.Baid)?.UserInfo?.MyDonName); + } + + private async Task AnswerChallenge(bool accept) + { + if (ChallengeCompetition == null || ChallengeCompetition.State != CompeteState.Waiting) return; + var url = accept ? $"api/ChallengeCompeteManage/{Baid}/acceptChallenge/{ChallengeCompetition.CompId}" : $"api/ChallengeCompeteManage/{Baid}/rejectChallenge/{ChallengeCompetition.CompId}"; + var response = await Client.GetAsync(url); + if (!response.IsSuccessStatusCode) + { + await DialogService.ShowMessageBox( + Localizer["Error"], + Localizer["Request Error"], + Localizer["Dialog OK"], null, null, new DialogOptions { DisableBackdropClick = true }); + return; + } + await Refresh.InvokeAsync(ChallengeCompetition); + + ChallengeCompetition.State = accept ? CompeteState.Normal : CompeteState.Rejected; + } + + private async Task AnswerCompete() + { + if (ChallengeCompetition == null) return; + var response = await Client.GetAsync($"api/ChallengeCompeteManage/{Baid}/joinCompete/{ChallengeCompetition.CompId}"); + if (!response.IsSuccessStatusCode) + { + await DialogService.ShowMessageBox( + Localizer["Error"], + Localizer["Request Error"], + Localizer["Dialog OK"], null, null, new DialogOptions { DisableBackdropClick = true }); + return; + } + await Refresh.InvokeAsync(ChallengeCompetition); + } +} \ No newline at end of file diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor b/TaikoWebUI/Components/ChallengeCompeteGrid.razor index 2811837e..ee5f4c7e 100644 --- a/TaikoWebUI/Components/ChallengeCompeteGrid.razor +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor @@ -8,11 +8,8 @@ @inject NavigationManager NavigationManager @inject BreadcrumbsStateContainer BreadcrumbsStateContainer -@using TaikoWebUI.Components; -@using TaikoWebUI.Pages.Dialogs - - @if (!AuthService.LoginRequired || (AuthService.LoginRequired && AuthService.IsAdmin)) + @if (!AuthService.LoginRequired || (AuthService.LoginRequired)) {
@@ -28,14 +25,15 @@ Variant="Variant.Outlined" Adornment="Adornment.Start" AdornmentIcon="@Icons.Material.Filled.Search" Style="width: 100%"/> - @if (Mode == 1 && Baid != 0) { + @if (Mode == 1) + { OpenDialogAsync(1, 1)) Style="width: 80px">@Localizer["Add"] } - else if (Mode == 2 && Baid != 0) + else if (Mode == 2) { OpenDialogAsync(2, 3)) Style="width: 80px">@Localizer["Add"] } - else if (Mode == 3 && Baid == 0) + else if (Mode == 3 && AuthService.IsAdmin) { OpenDialogAsync(3, 5, 365, 100)) Style="width: 80px">@Localizer["Add"] } @@ -105,135 +103,3 @@ } - -@code { - [Parameter] - public int Baid { get; set; } - - [Parameter] - public int Mode { get; set; } - - [Parameter] - public Dictionary? MusicDetailDictionary { get; set; } = null; - - [Parameter] - public string? SongNameLanguage { get; set; } = null; - - private ChallengeCompetitionResponse? response = new(); - private CancellationTokenSource? cts; - private int TotalPages { get; set; } = 0; - private bool isLoading = true; - private int currentPage = 1; - private readonly int pageSize = 12; - private string? searchTerm = null; - private bool inProgress = false; - - private async Task GetChallengeCompetitionData() - { - isLoading = true; - - response = await Client.GetFromJsonAsync($"api/ChallengeCompeteManage/queryPage?mode={(uint)Mode}&baid={Baid}&inProgress={(inProgress ? 1 : 0)}&page={currentPage}&limit={pageSize}&searchTerm={searchTerm}"); - response.ThrowIfNull(); - - TotalPages = response.TotalPages; - isLoading = false; - } - - private async Task UpdateCompete(ChallengeCompetition cc) - { - await GetChallengeCompetitionData(); - var updated = response?.List.Find(c => c.CompId == cc.CompId); - if (updated != null) - { - cc.CompeteMode = updated.CompeteMode; - cc.Participants = updated.Participants; - } - } - - protected override async Task OnInitializedAsync() - { - await base.OnInitializedAsync(); - if (SongNameLanguage == null) SongNameLanguage = await LocalStorage.GetItemAsync("songNameLanguage"); - if (MusicDetailDictionary == null) MusicDetailDictionary = await GameDataService.GetMusicDetailDictionary(); - - if (AuthService.LoginRequired && !AuthService.IsLoggedIn) - { - await AuthService.LoginWithAuthToken(); - } - - if (AuthService.IsAdmin || !AuthService.LoginRequired) - { - await GetChallengeCompetitionData(); - } - - BreadcrumbsStateContainer.breadcrumbs.Clear(); - if (Mode == 1) - { - BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Challenge"], href: $"/ChallengeCompe/{Baid}/Challenge")); - } - else if (Mode == 2) - { - BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Competition"], href: $"/ChallengeCompe/{Baid}/Competition")); - } - else if (Mode == 3) - { - BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Official Competition"], href: $"/ChallengeCompe/{Baid}/OfficialCompetition")); - } - BreadcrumbsStateContainer.NotifyStateChanged(); - } - - private async Task OnPageChange(int page) - { - currentPage = page; - await GetChallengeCompetitionData(); - } - - private async Task Debounce(Func action, int delayInMilliseconds) - { - // Cancel the previous task - cts?.Cancel(); - - // Create a new CancellationTokenSource - cts = new CancellationTokenSource(); - - try - { - // Wait for the delay - await Task.Delay(delayInMilliseconds, cts.Token); - - // Execute the action - await action(); - } - catch (TaskCanceledException) - { - // Ignore the exception - } - } - - private async Task OnSearch(string search) - { - searchTerm = search; - currentPage = 1; - - // Debounce the GetUsersData method - await Debounce(GetChallengeCompetitionData, 500); // 500 milliseconds delay - } - - private async Task OpenDialogAsync(int mode, int maxSongs, int maxDays = 30, int maxParticipant = 20) - { - var options = new DialogOptions { CloseOnEscapeKey = true }; - var parameters = new DialogParameters(); - parameters.Add("Mode", mode); - parameters.Add("MaxSongs", maxSongs); - parameters.Add("MaxDays", maxDays); - parameters.Add("MaxParticipant", maxParticipant); - parameters.Add("Baid", Baid); - - var dialogRet = await DialogService.ShowAsync(Localizer["Create"], parameters, options); - if (dialogRet != null) - { - var result = await dialogRet.GetReturnValueAsync(); - if (result != null && result == true) await GetChallengeCompetitionData(); - } - } -} diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs b/TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs new file mode 100644 index 00000000..f7e53bb3 --- /dev/null +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs @@ -0,0 +1,119 @@ +using TaikoWebUI.Pages.Dialogs; +namespace TaikoWebUI.Components; + +public partial class ChallengeCompeteGrid +{ + [Parameter] public int Baid { get; set; } + [Parameter] public int Mode { get; set; } + [Parameter] public Dictionary? MusicDetailDictionary { get; set; } = null; + [Parameter] public string? SongNameLanguage { get; set; } = null; + + private ChallengeCompetitionResponse? response = new(); + private CancellationTokenSource? cts; + private int TotalPages { get; set; } = 0; + private bool isLoading = true; + private int currentPage = 1; + private readonly int pageSize = 12; + private string? searchTerm = null; + private bool inProgress = false; + + private async Task GetChallengeCompetitionData() + { + isLoading = true; + + response = await Client.GetFromJsonAsync($"api/ChallengeCompeteManage/queryPage?mode={(uint)Mode}&baid={Baid}&inProgress={(inProgress ? 1 : 0)}&page={currentPage}&limit={pageSize}&searchTerm={searchTerm}"); + response.ThrowIfNull(); + + TotalPages = response.TotalPages; + isLoading = false; + } + + private async Task UpdateCompete(ChallengeCompetition cc) + { + await GetChallengeCompetitionData(); + var updated = response?.List.Find(c => c.CompId == cc.CompId); + if (updated != null) + { + cc.CompeteMode = updated.CompeteMode; + cc.Participants = updated.Participants; + } + } + + protected override async Task OnInitializedAsync() + { + await base.OnInitializedAsync(); + SongNameLanguage ??= await LocalStorage.GetItemAsync("songNameLanguage"); + MusicDetailDictionary ??= await GameDataService.GetMusicDetailDictionary(); + + if (AuthService.LoginRequired && !AuthService.IsLoggedIn) + { + await AuthService.LoginWithAuthToken(); + } + + if (AuthService.LoginRequired && AuthService.IsLoggedIn) + { + await GetChallengeCompetitionData(); + } + + BreadcrumbsStateContainer.breadcrumbs.Clear(); + BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Challenge"], href: $"/ChallengeCompe/{Baid}/" + (Mode == 1 ? "Challenge" : Mode == 2 ? "Competition" : "OfficialCompetition"))); + BreadcrumbsStateContainer.NotifyStateChanged(); + } + + private async Task OnPageChange(int page) + { + currentPage = page; + await GetChallengeCompetitionData(); + } + + private async Task Debounce(Func action, int delayInMilliseconds) + { + // Cancel the previous task + cts?.Cancel(); + + // Create a new CancellationTokenSource + cts = new CancellationTokenSource(); + + try + { + // Wait for the delay + await Task.Delay(delayInMilliseconds, cts.Token); + + // Execute the action + await action(); + } + catch (TaskCanceledException) + { + // Ignore the exception + } + } + + private async Task OnSearch(string search) + { + searchTerm = search; + currentPage = 1; + + // Debounce the GetUsersData method + await Debounce(GetChallengeCompetitionData, 500); // 500 milliseconds delay + } + + private async Task OpenDialogAsync(int mode, int maxSongs, int maxDays = 30, int maxParticipant = 20) + { + var options = new DialogOptions { CloseOnEscapeKey = true }; + var parameters = new DialogParameters + { + { "Mode", mode }, + { "MaxSongs", maxSongs }, + { "MaxDays", maxDays }, + { "MaxParticipant", maxParticipant }, + { "Baid", Baid } + }; + + var dialogRet = await DialogService.ShowAsync(Localizer["Create"], parameters, options); + if (dialogRet != null) + { + var result = await dialogRet.GetReturnValueAsync(); + if (result != null && result == true) await GetChallengeCompetitionData(); + } + } +} \ No newline at end of file diff --git a/TaikoWebUI/Components/NavMenu.razor b/TaikoWebUI/Components/NavMenu.razor index 8b901f68..f300d68e 100644 --- a/TaikoWebUI/Components/NavMenu.razor +++ b/TaikoWebUI/Components/NavMenu.razor @@ -30,25 +30,19 @@ @Localizer["Play History"] @Localizer["Dani Dojo"] - } - - @Localizer["Challenge"] - @Localizer["Competition"] - @Localizer["Official Competition"] - + + @Localizer["Challenge"] + @Localizer["Competition"] + @Localizer["Official Competition"] + - if (AuthService.IsLoggedIn) - { @Localizer["Show QR Code"] @Localizer["Change Password"] @Localizer["Access Codes"] - } - if (AuthService.IsLoggedIn) - { @Localizer["Log Out"] } diff --git a/TaikoWebUI/Localization/LocalizationResource.Designer.cs b/TaikoWebUI/Localization/LocalizationResource.Designer.cs index 627a6554..82ba3b74 100644 --- a/TaikoWebUI/Localization/LocalizationResource.Designer.cs +++ b/TaikoWebUI/Localization/LocalizationResource.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// 此代码由工具生成。 -// 运行时版本:4.0.30319.42000 +// Ce code a été généré par un outil. +// Version du runtime :4.0.30319.42000 // -// 对此文件的更改可能会导致不正确的行为,并且如果 -// 重新生成代码,这些更改将会丢失。 +// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si +// le code est régénéré. // //------------------------------------------------------------------------------ @@ -13,12 +13,12 @@ namespace TaikoWebUI.Localization { /// - /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 + // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder + // à l'aide d'un outil, tel que ResGen ou Visual Studio. + // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen + // avec l'option /str ou régénérez votre projet VS. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -33,7 +33,7 @@ internal LocalizationResource() { } /// - /// 返回此类使用的缓存的 ResourceManager 实例。 + /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ internal LocalizationResource() { } /// - /// 重写当前线程的 CurrentUICulture 属性,对 - /// 使用此强类型资源类的所有资源查找执行重写。 + /// Remplace la propriété CurrentUICulture du thread actuel pour toutes + /// les recherches de ressources à l'aide de cette classe de ressource fortement typée. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ internal LocalizationResource() { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _1_Star { get { @@ -70,7 +70,7 @@ internal static string _1_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _10_Star { get { @@ -79,7 +79,7 @@ internal static string _10_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _2_Star { get { @@ -88,7 +88,7 @@ internal static string _2_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _3_Star { get { @@ -97,7 +97,7 @@ internal static string _3_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _4_Star { get { @@ -106,7 +106,7 @@ internal static string _4_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _5_Star { get { @@ -115,7 +115,7 @@ internal static string _5_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _6_Star { get { @@ -124,7 +124,7 @@ internal static string _6_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _7_Star { get { @@ -133,7 +133,7 @@ internal static string _7_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _8_Star { get { @@ -142,7 +142,7 @@ internal static string _8_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _8bittaiko { get { @@ -151,7 +151,7 @@ internal static string _8bittaiko { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _9_Star { get { @@ -160,7 +160,7 @@ internal static string _9_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _Invite_Code__Optional__ { get { @@ -169,7 +169,7 @@ internal static string _Invite_Code__Optional__ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Accept { get { @@ -178,7 +178,7 @@ internal static string Accept { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Accepted { get { @@ -187,7 +187,7 @@ internal static string Accepted { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code { get { @@ -196,7 +196,7 @@ internal static string Access_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Already_Bound_Error { get { @@ -205,7 +205,7 @@ internal static string Access_Code_Already_Bound_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Bound_Success { get { @@ -214,7 +214,7 @@ internal static string Access_Code_Bound_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Delete_Confirm { get { @@ -223,7 +223,7 @@ internal static string Access_Code_Delete_Confirm { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Delete_Last_Access_Code_Error { get { @@ -232,7 +232,7 @@ internal static string Access_Code_Delete_Last_Access_Code_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Delete_Success { get { @@ -241,7 +241,7 @@ internal static string Access_Code_Delete_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Empty_Error { get { @@ -250,7 +250,7 @@ internal static string Access_Code_Empty_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_is_Required { get { @@ -259,7 +259,7 @@ internal static string Access_Code_is_Required { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Not_Admin_Error { get { @@ -268,7 +268,7 @@ internal static string Access_Code_Not_Admin_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Not_Registered_Error { get { @@ -277,7 +277,7 @@ internal static string Access_Code_Not_Registered_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Upper_Limit_Error { get { @@ -286,7 +286,7 @@ internal static string Access_Code_Upper_Limit_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Codes { get { @@ -295,7 +295,7 @@ internal static string Access_Codes { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Achievement_Panel { get { @@ -304,7 +304,7 @@ internal static string Achievement_Panel { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Achievement_Panel_Difficulty { get { @@ -313,7 +313,7 @@ internal static string Achievement_Panel_Difficulty { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Add { get { @@ -322,7 +322,7 @@ internal static string Add { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Add_Access_Code { get { @@ -331,7 +331,7 @@ internal static string Add_Access_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string AI_Battle_Data { get { @@ -340,7 +340,7 @@ internal static string AI_Battle_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Akemi { get { @@ -349,7 +349,7 @@ internal static string Akemi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string And { get { @@ -358,7 +358,7 @@ internal static string And { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Any { get { @@ -367,7 +367,7 @@ internal static string Any { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Bad { get { @@ -376,7 +376,7 @@ internal static string Bad { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Best_Crown { get { @@ -385,7 +385,7 @@ internal static string Best_Crown { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Best_Rank { get { @@ -394,7 +394,7 @@ internal static string Best_Rank { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Best_Score { get { @@ -403,7 +403,7 @@ internal static string Best_Score { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Body { get { @@ -412,7 +412,7 @@ internal static string Body { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Body_Color { get { @@ -421,7 +421,7 @@ internal static string Body_Color { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Cancel { get { @@ -430,7 +430,7 @@ internal static string Cancel { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Challenge { get { @@ -439,7 +439,7 @@ internal static string Challenge { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Challenge_Competition_Data { get { @@ -448,7 +448,7 @@ internal static string Challenge_Competition_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Challenge_Target { get { @@ -457,7 +457,7 @@ internal static string Challenge_Target { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Change_Password { get { @@ -466,7 +466,7 @@ internal static string Change_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Change_Password_Different_Confirm_Password_Error { get { @@ -475,7 +475,7 @@ internal static string Change_Password_Different_Confirm_Password_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Change_Password_Success { get { @@ -484,7 +484,7 @@ internal static string Change_Password_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Change_Password_Wrong_Current_Password_Error { get { @@ -493,7 +493,7 @@ internal static string Change_Password_Wrong_Current_Password_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Chinese_Simplified { get { @@ -502,7 +502,7 @@ internal static string Chinese_Simplified { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Chinese_Traditional { get { @@ -511,7 +511,7 @@ internal static string Chinese_Traditional { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Chojin { get { @@ -520,7 +520,7 @@ internal static string Chojin { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Clapping { get { @@ -529,7 +529,7 @@ internal static string Clapping { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Comp_ID { get { @@ -538,7 +538,7 @@ internal static string Comp_ID { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Competition { get { @@ -547,7 +547,7 @@ internal static string Competition { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Conditions { get { @@ -556,7 +556,7 @@ internal static string Conditions { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Confirm_New_Password { get { @@ -565,7 +565,7 @@ internal static string Confirm_New_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Confirm_Password { get { @@ -574,7 +574,7 @@ internal static string Confirm_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Confirm_Password_is_Required { get { @@ -583,7 +583,7 @@ internal static string Confirm_Password_is_Required { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Conga { get { @@ -592,7 +592,7 @@ internal static string Conga { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Copy_to_Clipboard { get { @@ -601,7 +601,7 @@ internal static string Copy_to_Clipboard { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Costume { get { @@ -610,7 +610,7 @@ internal static string Costume { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Costume_Options { get { @@ -619,7 +619,7 @@ internal static string Costume_Options { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Course_Songs { get { @@ -628,7 +628,7 @@ internal static string Course_Songs { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Create { get { @@ -637,7 +637,7 @@ internal static string Create { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Create_Challenge { get { @@ -646,7 +646,7 @@ internal static string Create_Challenge { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Create_Competition { get { @@ -655,7 +655,7 @@ internal static string Create_Competition { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Create_Official_Competition { get { @@ -664,7 +664,7 @@ internal static string Create_Official_Competition { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string CreatorChallengeTitle { get { @@ -673,7 +673,7 @@ internal static string CreatorChallengeTitle { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Crown { get { @@ -682,7 +682,7 @@ internal static string Crown { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Currently_Selected_ { get { @@ -691,7 +691,7 @@ internal static string Currently_Selected_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Dani_Dojo { get { @@ -700,7 +700,7 @@ internal static string Dani_Dojo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Dashboard { get { @@ -709,7 +709,7 @@ internal static string Dashboard { } /// - /// 查找类似 MM/dd/yyyy h:mm:ss tt 的本地化字符串。 + /// Recherche une chaîne localisée semblable à MM/dd/yyyy h:mm:ss tt. /// internal static string DateFormat { get { @@ -718,7 +718,7 @@ internal static string DateFormat { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Default { get { @@ -727,7 +727,7 @@ internal static string Default { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Delete { get { @@ -736,7 +736,7 @@ internal static string Delete { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Delete_User { get { @@ -745,7 +745,7 @@ internal static string Delete_User { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Delete_User_Confirm { get { @@ -754,7 +754,7 @@ internal static string Delete_User_Confirm { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Delete_User_Success { get { @@ -763,7 +763,7 @@ internal static string Delete_User_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Describe { get { @@ -772,7 +772,7 @@ internal static string Describe { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Details { get { @@ -781,7 +781,7 @@ internal static string Details { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Dialog_OK { get { @@ -790,7 +790,7 @@ internal static string Dialog_OK { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Difficulty { get { @@ -799,7 +799,7 @@ internal static string Difficulty { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Difficulty_Setting_Course { get { @@ -808,7 +808,7 @@ internal static string Difficulty_Setting_Course { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Difficulty_Setting_Sort { get { @@ -817,7 +817,7 @@ internal static string Difficulty_Setting_Sort { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Difficulty_Setting_Star { get { @@ -826,7 +826,7 @@ internal static string Difficulty_Setting_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Display_Achievement_Panel { get { @@ -835,7 +835,7 @@ internal static string Display_Achievement_Panel { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Display_Dan_Rank_on_Name_Plate { get { @@ -844,7 +844,7 @@ internal static string Display_Dan_Rank_on_Name_Plate { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Drum { get { @@ -853,7 +853,7 @@ internal static string Drum { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Drumroll { get { @@ -862,7 +862,7 @@ internal static string Drumroll { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Easy { get { @@ -871,7 +871,7 @@ internal static string Easy { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Edit_Profile { get { @@ -880,7 +880,7 @@ internal static string Edit_Profile { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Eighth_Dan { get { @@ -889,7 +889,7 @@ internal static string Eighth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Electric_Guitar { get { @@ -898,7 +898,7 @@ internal static string Electric_Guitar { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string English { get { @@ -907,7 +907,7 @@ internal static string English { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Error { get { @@ -916,7 +916,7 @@ internal static string Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Face { get { @@ -925,7 +925,7 @@ internal static string Face { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Face_Color { get { @@ -934,7 +934,7 @@ internal static string Face_Color { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fifth_Dan { get { @@ -943,7 +943,7 @@ internal static string Fifth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fifth_Kyuu { get { @@ -952,7 +952,7 @@ internal static string Fifth_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Filter_by_Genre { get { @@ -961,7 +961,7 @@ internal static string Filter_by_Genre { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string First_Dan { get { @@ -970,7 +970,7 @@ internal static string First_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string First_Kyuu { get { @@ -979,7 +979,7 @@ internal static string First_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fourth_Dan { get { @@ -988,7 +988,7 @@ internal static string Fourth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fourth_Kyuu { get { @@ -997,7 +997,7 @@ internal static string Fourth_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fulfilled { get { @@ -1006,7 +1006,7 @@ internal static string Fulfilled { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string FullChallengeTitle { get { @@ -1015,7 +1015,7 @@ internal static string FullChallengeTitle { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Funassyi { get { @@ -1024,7 +1024,7 @@ internal static string Funassyi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Gaiden { get { @@ -1033,7 +1033,7 @@ internal static string Gaiden { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Generate_Invite_Code { get { @@ -1042,7 +1042,7 @@ internal static string Generate_Invite_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Genre { get { @@ -1051,7 +1051,7 @@ internal static string Genre { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Gold { get { @@ -1060,7 +1060,7 @@ internal static string Gold { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Gold_Donderful_Combo { get { @@ -1069,7 +1069,7 @@ internal static string Gold_Donderful_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Gold_Full_Combo { get { @@ -1078,7 +1078,7 @@ internal static string Gold_Full_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Good { get { @@ -1087,7 +1087,7 @@ internal static string Good { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Hard { get { @@ -1096,7 +1096,7 @@ internal static string Hard { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Head { get { @@ -1105,7 +1105,7 @@ internal static string Head { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Hide { get { @@ -1114,7 +1114,7 @@ internal static string Hide { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string High_Scores { get { @@ -1123,7 +1123,7 @@ internal static string High_Scores { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string ID { get { @@ -1132,7 +1132,7 @@ internal static string ID { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Information { get { @@ -1141,7 +1141,7 @@ internal static string Information { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Inuneko { get { @@ -1150,7 +1150,7 @@ internal static string Inuneko { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Inverse { get { @@ -1159,7 +1159,7 @@ internal static string Inverse { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Invite_Code { get { @@ -1168,7 +1168,7 @@ internal static string Invite_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Isogai { get { @@ -1177,7 +1177,7 @@ internal static string Isogai { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Japanese { get { @@ -1186,7 +1186,7 @@ internal static string Japanese { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Kigurumi { get { @@ -1195,7 +1195,7 @@ internal static string Kigurumi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Korean { get { @@ -1204,7 +1204,7 @@ internal static string Korean { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Kuroto { get { @@ -1213,7 +1213,7 @@ internal static string Kuroto { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Language { get { @@ -1222,7 +1222,7 @@ internal static string Language { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Last_For__Days_ { get { @@ -1231,7 +1231,7 @@ internal static string Last_For__Days_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Last_Play_Date { get { @@ -1240,7 +1240,7 @@ internal static string Last_Play_Date { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Last_Play_Time_5_Min_Around_Credit_End_ { get { @@ -1249,7 +1249,7 @@ internal static string Last_Play_Time_5_Min_Around_Credit_End_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Last_Played { get { @@ -1258,7 +1258,7 @@ internal static string Last_Played { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Leaderboard { get { @@ -1267,7 +1267,7 @@ internal static string Leaderboard { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Level { get { @@ -1276,7 +1276,7 @@ internal static string Level { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Limb_Color { get { @@ -1285,7 +1285,7 @@ internal static string Limb_Color { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Log_In { get { @@ -1294,7 +1294,7 @@ internal static string Log_In { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Log_In_First { get { @@ -1303,7 +1303,7 @@ internal static string Log_In_First { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Log_Out { get { @@ -1312,7 +1312,7 @@ internal static string Log_Out { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Log_Out_Confirm { get { @@ -1321,7 +1321,7 @@ internal static string Log_Out_Confirm { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Login_Only_Admin_Error { get { @@ -1330,7 +1330,7 @@ internal static string Login_Only_Admin_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Login_Wrong_Password_Error { get { @@ -1339,7 +1339,7 @@ internal static string Login_Wrong_Password_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Matsuri { get { @@ -1348,7 +1348,7 @@ internal static string Matsuri { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string MAX_Combo { get { @@ -1357,7 +1357,7 @@ internal static string MAX_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Max_Participant { get { @@ -1366,7 +1366,7 @@ internal static string Max_Participant { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Meijin { get { @@ -1375,7 +1375,7 @@ internal static string Meijin { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Mekadon { get { @@ -1384,7 +1384,7 @@ internal static string Mekadon { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Messy { get { @@ -1393,7 +1393,7 @@ internal static string Messy { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Name { get { @@ -1402,7 +1402,7 @@ internal static string Name { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string New_Access_Code { get { @@ -1411,7 +1411,7 @@ internal static string New_Access_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string New_Password { get { @@ -1420,7 +1420,7 @@ internal static string New_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Ninth_Dan { get { @@ -1429,7 +1429,7 @@ internal static string Ninth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string No_Data { get { @@ -1438,7 +1438,7 @@ internal static string No_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string No_Play_History_Found { get { @@ -1447,7 +1447,7 @@ internal static string No_Play_History_Found { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string No_Select { get { @@ -1456,7 +1456,7 @@ internal static string No_Select { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string None { get { @@ -1465,7 +1465,7 @@ internal static string None { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Normal { get { @@ -1474,7 +1474,7 @@ internal static string Normal { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Cleared { get { @@ -1483,7 +1483,7 @@ internal static string Not_Cleared { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Donderful_Combo { get { @@ -1492,7 +1492,7 @@ internal static string Not_Donderful_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Full_Combo { get { @@ -1501,7 +1501,7 @@ internal static string Not_Full_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Logged_In_Error { get { @@ -1510,7 +1510,7 @@ internal static string Not_Logged_In_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Passed { get { @@ -1519,7 +1519,7 @@ internal static string Not_Passed { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Notes_Position { get { @@ -1528,7 +1528,7 @@ internal static string Notes_Position { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Off { get { @@ -1537,7 +1537,7 @@ internal static string Off { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Official_Competition { get { @@ -1546,7 +1546,7 @@ internal static string Official_Competition { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string OK { get { @@ -1555,7 +1555,7 @@ internal static string OK { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Old_Password { get { @@ -1564,7 +1564,7 @@ internal static string Old_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string On { get { @@ -1573,7 +1573,7 @@ internal static string On { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Oni { get { @@ -1582,7 +1582,7 @@ internal static string Oni { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Only_Play_Once { get { @@ -1591,7 +1591,7 @@ internal static string Only_Play_Once { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string other_access_code_s_ { get { @@ -1600,7 +1600,7 @@ internal static string other_access_code_s_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Participate { get { @@ -1609,7 +1609,7 @@ internal static string Participate { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Participated { get { @@ -1618,7 +1618,7 @@ internal static string Participated { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Pass { get { @@ -1627,7 +1627,7 @@ internal static string Pass { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Password { get { @@ -1636,7 +1636,7 @@ internal static string Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Password_is_Required { get { @@ -1645,7 +1645,7 @@ internal static string Password_is_Required { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Play_Data { get { @@ -1654,7 +1654,7 @@ internal static string Play_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Play_History { get { @@ -1663,7 +1663,7 @@ internal static string Play_History { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Play_Time { get { @@ -1672,7 +1672,7 @@ internal static string Play_Time { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Player { get { @@ -1681,7 +1681,7 @@ internal static string Player { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Player_Titles { get { @@ -1690,7 +1690,7 @@ internal static string Player_Titles { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Profile { get { @@ -1699,7 +1699,7 @@ internal static string Profile { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Profile_Options { get { @@ -1708,7 +1708,7 @@ internal static string Profile_Options { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Puchi { get { @@ -1717,7 +1717,7 @@ internal static string Puchi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Puchipuchi { get { @@ -1726,7 +1726,7 @@ internal static string Puchipuchi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string QR_Code { get { @@ -1735,7 +1735,7 @@ internal static string QR_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Random { get { @@ -1744,7 +1744,7 @@ internal static string Random { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Rank { get { @@ -1753,7 +1753,7 @@ internal static string Rank { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string ReceiverChallengeTitle { get { @@ -1762,7 +1762,7 @@ internal static string ReceiverChallengeTitle { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Red { get { @@ -1771,7 +1771,7 @@ internal static string Red { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Red_Donderful_Combo { get { @@ -1780,7 +1780,7 @@ internal static string Red_Donderful_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Red_Full_Combo { get { @@ -1789,7 +1789,7 @@ internal static string Red_Full_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register { get { @@ -1798,7 +1798,7 @@ internal static string Register { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Already_Registered_Error { get { @@ -1807,7 +1807,7 @@ internal static string Register_Already_Registered_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Different_Confirm_Password_Error { get { @@ -1816,7 +1816,7 @@ internal static string Register_Different_Confirm_Password_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Only_Admin_Error { get { @@ -1825,7 +1825,7 @@ internal static string Register_Only_Admin_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Success { get { @@ -1834,7 +1834,7 @@ internal static string Register_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Wrong_Last_Play_Time_Error { get { @@ -1843,7 +1843,7 @@ internal static string Register_Wrong_Last_Play_Time_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reject { get { @@ -1852,7 +1852,7 @@ internal static string Reject { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Rejected { get { @@ -1861,7 +1861,7 @@ internal static string Rejected { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reset { get { @@ -1870,7 +1870,7 @@ internal static string Reset { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reset_Password { get { @@ -1879,7 +1879,7 @@ internal static string Reset_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reset_Password_Confirm_1 { get { @@ -1888,7 +1888,7 @@ internal static string Reset_Password_Confirm_1 { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reset_Password_Confirm_2 { get { @@ -1897,7 +1897,7 @@ internal static string Reset_Password_Confirm_2 { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Result { get { @@ -1906,7 +1906,7 @@ internal static string Result { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Rows_Per_Page_ { get { @@ -1915,7 +1915,7 @@ internal static string Rows_Per_Page_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Save { get { @@ -1924,7 +1924,7 @@ internal static string Save { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Score { get { @@ -1933,7 +1933,7 @@ internal static string Score { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search { get { @@ -1942,7 +1942,7 @@ internal static string Search { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search_by_Name__Comp_ID { get { @@ -1951,7 +1951,7 @@ internal static string Search_by_Name__Comp_ID { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search_by_Name__ID__or_Access_Code { get { @@ -1960,7 +1960,7 @@ internal static string Search_by_Name__ID__or_Access_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search_by_Title__Artist_or_Date { get { @@ -1969,7 +1969,7 @@ internal static string Search_by_Title__Artist_or_Date { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search_by_Title_or_Artist { get { @@ -1978,7 +1978,7 @@ internal static string Search_by_Title_or_Artist { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Second_Dan { get { @@ -1987,7 +1987,7 @@ internal static string Second_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Second_Kyuu { get { @@ -1996,7 +1996,7 @@ internal static string Second_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Section_No_ { get { @@ -2005,7 +2005,7 @@ internal static string Section_No_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Select_a_Title { get { @@ -2014,7 +2014,7 @@ internal static string Select_a_Title { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Select_Song { get { @@ -2023,7 +2023,7 @@ internal static string Select_Song { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Select_User { get { @@ -2032,7 +2032,7 @@ internal static string Select_User { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Set_Up_Each_Time { get { @@ -2041,7 +2041,7 @@ internal static string Set_Up_Each_Time { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Settings { get { @@ -2050,7 +2050,7 @@ internal static string Settings { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Seventh_Dan { get { @@ -2059,7 +2059,7 @@ internal static string Seventh_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Show { get { @@ -2068,7 +2068,7 @@ internal static string Show { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Show_QR_Code { get { @@ -2077,7 +2077,7 @@ internal static string Show_QR_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Shuriken { get { @@ -2086,7 +2086,7 @@ internal static string Shuriken { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Sixth_Dan { get { @@ -2095,7 +2095,7 @@ internal static string Sixth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Skip_Song { get { @@ -2104,7 +2104,7 @@ internal static string Skip_Song { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song { get { @@ -2113,7 +2113,7 @@ internal static string Song { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_List { get { @@ -2122,7 +2122,7 @@ internal static string Song_List { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_Name { get { @@ -2131,7 +2131,7 @@ internal static string Song_Name { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_Number { get { @@ -2140,7 +2140,7 @@ internal static string Song_Number { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_Options { get { @@ -2149,7 +2149,7 @@ internal static string Song_Options { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_Title___Artist { get { @@ -2158,7 +2158,7 @@ internal static string Song_Title___Artist { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Soul_Gauge { get { @@ -2167,7 +2167,7 @@ internal static string Soul_Gauge { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Soya { get { @@ -2176,7 +2176,7 @@ internal static string Soya { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Speed { get { @@ -2185,7 +2185,7 @@ internal static string Speed { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Stage { get { @@ -2194,7 +2194,7 @@ internal static string Stage { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Success { get { @@ -2203,7 +2203,7 @@ internal static string Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Synthdrum { get { @@ -2212,7 +2212,7 @@ internal static string Synthdrum { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Taiko { get { @@ -2221,7 +2221,7 @@ internal static string Taiko { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Tambourine { get { @@ -2230,7 +2230,7 @@ internal static string Tambourine { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Tatsujin { get { @@ -2239,7 +2239,7 @@ internal static string Tatsujin { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Tenth_Dan { get { @@ -2248,7 +2248,7 @@ internal static string Tenth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Third_Dan { get { @@ -2257,7 +2257,7 @@ internal static string Third_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Third_Kyuu { get { @@ -2266,7 +2266,7 @@ internal static string Third_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Title { get { @@ -2275,7 +2275,7 @@ internal static string Title { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Title_Plate { get { @@ -2284,7 +2284,7 @@ internal static string Title_Plate { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Tone { get { @@ -2293,7 +2293,7 @@ internal static string Tone { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Clears { get { @@ -2302,7 +2302,7 @@ internal static string Total_Clears { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Credits_Played { get { @@ -2311,7 +2311,7 @@ internal static string Total_Credits_Played { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Donderful_Combos { get { @@ -2320,7 +2320,7 @@ internal static string Total_Donderful_Combos { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Full_Combos { get { @@ -2329,7 +2329,7 @@ internal static string Total_Full_Combos { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Hits { get { @@ -2338,7 +2338,7 @@ internal static string Total_Hits { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Totals { get { @@ -2347,7 +2347,7 @@ internal static string Totals { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string UI { get { @@ -2356,7 +2356,7 @@ internal static string UI { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Unknown_Access_Code_Error { get { @@ -2365,7 +2365,7 @@ internal static string Unknown_Access_Code_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Unknown_Error { get { @@ -2374,7 +2374,7 @@ internal static string Unknown_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Unregister { get { @@ -2383,7 +2383,7 @@ internal static string Unregister { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Ura_Oni { get { @@ -2392,7 +2392,7 @@ internal static string Ura_Oni { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string UraOni { get { @@ -2401,7 +2401,7 @@ internal static string UraOni { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string User { get { @@ -2410,7 +2410,7 @@ internal static string User { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string User_ID { get { @@ -2419,7 +2419,7 @@ internal static string User_ID { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Users { get { @@ -2428,7 +2428,7 @@ internal static string Users { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Vanish { get { @@ -2437,7 +2437,7 @@ internal static string Vanish { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string View_Play_Data { get { @@ -2446,7 +2446,7 @@ internal static string View_Play_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Voice { get { @@ -2455,7 +2455,7 @@ internal static string Voice { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Wadadon { get { @@ -2464,7 +2464,7 @@ internal static string Wadadon { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Welcome_to_TaikoWebUI_ { get { @@ -2473,7 +2473,7 @@ internal static string Welcome_to_TaikoWebUI_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Whimsical { get { @@ -2482,7 +2482,7 @@ internal static string Whimsical { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Wonderfultaiko { get { @@ -2491,7 +2491,7 @@ internal static string Wonderfultaiko { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Wrap { get { diff --git a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx index 444c169b..2579a2f5 100644 --- a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx +++ b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx @@ -832,19 +832,19 @@ Position des notes - Défi + Défis - Compétition + Tournois - Compétition Officielle + Tournois Officiels - ID de compé + Identifiant de tournoi - Recherche par nom, ID de compé + Recherche par nom, Identifiant de tournoi Commentaire @@ -859,10 +859,10 @@ Rejeter - Information + Informations - Données de compétition de défi + Tournois Accepté @@ -871,13 +871,13 @@ Rejeté - Objet de défi + Utilisateur défié Durée (jours) - Chanson + Musique Jouer une seule fois @@ -910,24 +910,24 @@ Créer - Aucune chanson sélectionnée + Selectionnez une musique Nombre maximal de participants - Sélectionnez une chanson avec difficulté + Sélectionnez une musique par difficulté - Sélectionnez l'utilisateur cible du défi + Sélectionnez l'utilisateur défié N'importe lequel - allumer + On - fermeture + Off \ No newline at end of file From cfc2b65159ac692731ce04bd8250fae91d650893 Mon Sep 17 00:00:00 2001 From: KIT! Date: Mon, 28 Oct 2024 15:28:11 +0100 Subject: [PATCH 12/15] Fixed pages not working for LoginRequired=false --- TaikoWebUI/Components/ChallengeCompeteGrid.razor | 2 +- TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs | 8 +++----- TaikoWebUI/Components/NavMenu.razor | 8 +++++++- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor b/TaikoWebUI/Components/ChallengeCompeteGrid.razor index ee5f4c7e..be89aae5 100644 --- a/TaikoWebUI/Components/ChallengeCompeteGrid.razor +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor @@ -33,7 +33,7 @@ { OpenDialogAsync(2, 3)) Style="width: 80px">@Localizer["Add"] } - else if (Mode == 3 && AuthService.IsAdmin) + else if ((Mode == 3 && AuthService.IsAdmin) || !AuthService.LoginRequired) { OpenDialogAsync(3, 5, 365, 100)) Style="width: 80px">@Localizer["Add"] } diff --git a/TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs b/TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs index f7e53bb3..d8247b9e 100644 --- a/TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs +++ b/TaikoWebUI/Components/ChallengeCompeteGrid.razor.cs @@ -50,13 +50,11 @@ protected override async Task OnInitializedAsync() await AuthService.LoginWithAuthToken(); } - if (AuthService.LoginRequired && AuthService.IsLoggedIn) - { - await GetChallengeCompetitionData(); - } + await GetChallengeCompetitionData(); + BreadcrumbsStateContainer.breadcrumbs.Clear(); - BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem(Localizer["Challenge"], href: $"/ChallengeCompe/{Baid}/" + (Mode == 1 ? "Challenge" : Mode == 2 ? "Competition" : "OfficialCompetition"))); + BreadcrumbsStateContainer.breadcrumbs.Add(new BreadcrumbItem((Mode == 1 ? Localizer["Challenge"] : Mode == 2 ? Localizer["Competition"] : Localizer["Official Competition"]), href: $"/ChallengeCompe/{Baid}/" + (Mode == 1 ? "Challenge" : Mode == 2 ? "Competition" : "OfficialCompetition"))); BreadcrumbsStateContainer.NotifyStateChanged(); } diff --git a/TaikoWebUI/Components/NavMenu.razor b/TaikoWebUI/Components/NavMenu.razor index f300d68e..35da9074 100644 --- a/TaikoWebUI/Components/NavMenu.razor +++ b/TaikoWebUI/Components/NavMenu.razor @@ -30,13 +30,19 @@ @Localizer["Play History"] @Localizer["Dani Dojo"] + } + if (AuthService.IsLoggedIn || !AuthService.LoginRequired) + { @Localizer["Challenge"] @Localizer["Competition"] @Localizer["Official Competition"] + } + if (AuthService.IsLoggedIn) + { @Localizer["Show QR Code"] @Localizer["Change Password"] @@ -45,7 +51,7 @@ @Localizer["Log Out"] - } + } } From 6471a571455278e2f57f1792aca4d249448cf975 Mon Sep 17 00:00:00 2001 From: ptmaster Date: Mon, 28 Oct 2024 22:35:15 +0800 Subject: [PATCH 13/15] Add Finish Mark to Challenge/Competition --- TaikoWebUI/Components/ChallengeCompe.razor | 6 +- .../LocalizationResource.Designer.cs | 575 +++++++++--------- .../LocalizationResource.en-US.resx | 3 + .../LocalizationResource.fr-FR.resx | 3 + .../Localization/LocalizationResource.ja.resx | 3 + .../Localization/LocalizationResource.resx | 3 + .../LocalizationResource.zh-Hans.resx | 3 + .../LocalizationResource.zh-Hant.resx | 3 + 8 files changed, 315 insertions(+), 284 deletions(-) diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor index 441ccc06..dff8265a 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -63,7 +63,11 @@ AnswerChallenge(true))>@Localizer["Information"] - @if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) + @if (ChallengeCompetition.ExpireTime < DateTime.Now) + { + @Localizer["Finished"] + } + else if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) { @if (AuthService.IsAdmin || ChallengeCompetition?.Baid == Baid || ChallengeCompetition?.State != CompeteState.Waiting) { diff --git a/TaikoWebUI/Localization/LocalizationResource.Designer.cs b/TaikoWebUI/Localization/LocalizationResource.Designer.cs index 82ba3b74..ddb24e43 100644 --- a/TaikoWebUI/Localization/LocalizationResource.Designer.cs +++ b/TaikoWebUI/Localization/LocalizationResource.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// Ce code a été généré par un outil. -// Version du runtime :4.0.30319.42000 +// 此代码由工具生成。 +// 运行时版本:4.0.30319.42000 // -// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si -// le code est régénéré. +// 对此文件的更改可能会导致不正确的行为,并且如果 +// 重新生成代码,这些更改将会丢失。 // //------------------------------------------------------------------------------ @@ -13,12 +13,12 @@ namespace TaikoWebUI.Localization { /// - /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. + /// 一个强类型的资源类,用于查找本地化的字符串等。 /// - // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder - // à l'aide d'un outil, tel que ResGen ou Visual Studio. - // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen - // avec l'option /str ou régénérez votre projet VS. + // 此类是由 StronglyTypedResourceBuilder + // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 + // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen + // (以 /str 作为命令选项),或重新生成 VS 项目。 [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -33,7 +33,7 @@ internal LocalizationResource() { } /// - /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. + /// 返回此类使用的缓存的 ResourceManager 实例。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ internal LocalizationResource() { } /// - /// Remplace la propriété CurrentUICulture du thread actuel pour toutes - /// les recherches de ressources à l'aide de cette classe de ressource fortement typée. + /// 重写当前线程的 CurrentUICulture 属性,对 + /// 使用此强类型资源类的所有资源查找执行重写。 /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ internal LocalizationResource() { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _1_Star { get { @@ -70,7 +70,7 @@ internal static string _1_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _10_Star { get { @@ -79,7 +79,7 @@ internal static string _10_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _2_Star { get { @@ -88,7 +88,7 @@ internal static string _2_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _3_Star { get { @@ -97,7 +97,7 @@ internal static string _3_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _4_Star { get { @@ -106,7 +106,7 @@ internal static string _4_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _5_Star { get { @@ -115,7 +115,7 @@ internal static string _5_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _6_Star { get { @@ -124,7 +124,7 @@ internal static string _6_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _7_Star { get { @@ -133,7 +133,7 @@ internal static string _7_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _8_Star { get { @@ -142,7 +142,7 @@ internal static string _8_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _8bittaiko { get { @@ -151,7 +151,7 @@ internal static string _8bittaiko { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _9_Star { get { @@ -160,7 +160,7 @@ internal static string _9_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string _Invite_Code__Optional__ { get { @@ -169,7 +169,7 @@ internal static string _Invite_Code__Optional__ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Accept { get { @@ -178,7 +178,7 @@ internal static string Accept { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Accepted { get { @@ -187,7 +187,7 @@ internal static string Accepted { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code { get { @@ -196,7 +196,7 @@ internal static string Access_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Already_Bound_Error { get { @@ -205,7 +205,7 @@ internal static string Access_Code_Already_Bound_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Bound_Success { get { @@ -214,7 +214,7 @@ internal static string Access_Code_Bound_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Delete_Confirm { get { @@ -223,7 +223,7 @@ internal static string Access_Code_Delete_Confirm { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Delete_Last_Access_Code_Error { get { @@ -232,7 +232,7 @@ internal static string Access_Code_Delete_Last_Access_Code_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Delete_Success { get { @@ -241,7 +241,7 @@ internal static string Access_Code_Delete_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Empty_Error { get { @@ -250,7 +250,7 @@ internal static string Access_Code_Empty_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_is_Required { get { @@ -259,7 +259,7 @@ internal static string Access_Code_is_Required { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Not_Admin_Error { get { @@ -268,7 +268,7 @@ internal static string Access_Code_Not_Admin_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Not_Registered_Error { get { @@ -277,7 +277,7 @@ internal static string Access_Code_Not_Registered_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Code_Upper_Limit_Error { get { @@ -286,7 +286,7 @@ internal static string Access_Code_Upper_Limit_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Access_Codes { get { @@ -295,7 +295,7 @@ internal static string Access_Codes { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Achievement_Panel { get { @@ -304,7 +304,7 @@ internal static string Achievement_Panel { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Achievement_Panel_Difficulty { get { @@ -313,7 +313,7 @@ internal static string Achievement_Panel_Difficulty { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Add { get { @@ -322,7 +322,7 @@ internal static string Add { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Add_Access_Code { get { @@ -331,7 +331,7 @@ internal static string Add_Access_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string AI_Battle_Data { get { @@ -340,7 +340,7 @@ internal static string AI_Battle_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Akemi { get { @@ -349,7 +349,7 @@ internal static string Akemi { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string And { get { @@ -358,7 +358,7 @@ internal static string And { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Any { get { @@ -367,7 +367,7 @@ internal static string Any { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Bad { get { @@ -376,7 +376,7 @@ internal static string Bad { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Best_Crown { get { @@ -385,7 +385,7 @@ internal static string Best_Crown { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Best_Rank { get { @@ -394,7 +394,7 @@ internal static string Best_Rank { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Best_Score { get { @@ -403,7 +403,7 @@ internal static string Best_Score { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Body { get { @@ -412,7 +412,7 @@ internal static string Body { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Body_Color { get { @@ -421,7 +421,7 @@ internal static string Body_Color { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Cancel { get { @@ -430,7 +430,7 @@ internal static string Cancel { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Challenge { get { @@ -439,7 +439,7 @@ internal static string Challenge { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Challenge_Competition_Data { get { @@ -448,7 +448,7 @@ internal static string Challenge_Competition_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Challenge_Target { get { @@ -457,7 +457,7 @@ internal static string Challenge_Target { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Change_Password { get { @@ -466,7 +466,7 @@ internal static string Change_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Change_Password_Different_Confirm_Password_Error { get { @@ -475,7 +475,7 @@ internal static string Change_Password_Different_Confirm_Password_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Change_Password_Success { get { @@ -484,7 +484,7 @@ internal static string Change_Password_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Change_Password_Wrong_Current_Password_Error { get { @@ -493,7 +493,7 @@ internal static string Change_Password_Wrong_Current_Password_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Chinese_Simplified { get { @@ -502,7 +502,7 @@ internal static string Chinese_Simplified { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Chinese_Traditional { get { @@ -511,7 +511,7 @@ internal static string Chinese_Traditional { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Chojin { get { @@ -520,7 +520,7 @@ internal static string Chojin { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Clapping { get { @@ -529,7 +529,7 @@ internal static string Clapping { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Comp_ID { get { @@ -538,7 +538,7 @@ internal static string Comp_ID { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Competition { get { @@ -547,7 +547,7 @@ internal static string Competition { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Conditions { get { @@ -556,7 +556,7 @@ internal static string Conditions { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Confirm_New_Password { get { @@ -565,7 +565,7 @@ internal static string Confirm_New_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Confirm_Password { get { @@ -574,7 +574,7 @@ internal static string Confirm_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Confirm_Password_is_Required { get { @@ -583,7 +583,7 @@ internal static string Confirm_Password_is_Required { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Conga { get { @@ -592,7 +592,7 @@ internal static string Conga { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Copy_to_Clipboard { get { @@ -601,7 +601,7 @@ internal static string Copy_to_Clipboard { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Costume { get { @@ -610,7 +610,7 @@ internal static string Costume { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Costume_Options { get { @@ -619,7 +619,7 @@ internal static string Costume_Options { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Course_Songs { get { @@ -628,7 +628,7 @@ internal static string Course_Songs { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Create { get { @@ -637,7 +637,7 @@ internal static string Create { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Create_Challenge { get { @@ -646,7 +646,7 @@ internal static string Create_Challenge { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Create_Competition { get { @@ -655,7 +655,7 @@ internal static string Create_Competition { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Create_Official_Competition { get { @@ -664,7 +664,7 @@ internal static string Create_Official_Competition { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string CreatorChallengeTitle { get { @@ -673,7 +673,7 @@ internal static string CreatorChallengeTitle { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Crown { get { @@ -682,7 +682,7 @@ internal static string Crown { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Currently_Selected_ { get { @@ -691,7 +691,7 @@ internal static string Currently_Selected_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Dani_Dojo { get { @@ -700,7 +700,7 @@ internal static string Dani_Dojo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Dashboard { get { @@ -709,7 +709,7 @@ internal static string Dashboard { } /// - /// Recherche une chaîne localisée semblable à MM/dd/yyyy h:mm:ss tt. + /// 查找类似 MM/dd/yyyy h:mm:ss tt 的本地化字符串。 /// internal static string DateFormat { get { @@ -718,7 +718,7 @@ internal static string DateFormat { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Default { get { @@ -727,7 +727,7 @@ internal static string Default { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Delete { get { @@ -736,7 +736,7 @@ internal static string Delete { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Delete_User { get { @@ -745,7 +745,7 @@ internal static string Delete_User { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Delete_User_Confirm { get { @@ -754,7 +754,7 @@ internal static string Delete_User_Confirm { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Delete_User_Success { get { @@ -763,7 +763,7 @@ internal static string Delete_User_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Describe { get { @@ -772,7 +772,7 @@ internal static string Describe { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Details { get { @@ -781,7 +781,7 @@ internal static string Details { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Dialog_OK { get { @@ -790,7 +790,7 @@ internal static string Dialog_OK { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Difficulty { get { @@ -799,7 +799,7 @@ internal static string Difficulty { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Difficulty_Setting_Course { get { @@ -808,7 +808,7 @@ internal static string Difficulty_Setting_Course { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Difficulty_Setting_Sort { get { @@ -817,7 +817,7 @@ internal static string Difficulty_Setting_Sort { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Difficulty_Setting_Star { get { @@ -826,7 +826,7 @@ internal static string Difficulty_Setting_Star { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Display_Achievement_Panel { get { @@ -835,7 +835,7 @@ internal static string Display_Achievement_Panel { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Display_Dan_Rank_on_Name_Plate { get { @@ -844,7 +844,7 @@ internal static string Display_Dan_Rank_on_Name_Plate { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Drum { get { @@ -853,7 +853,7 @@ internal static string Drum { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Drumroll { get { @@ -862,7 +862,7 @@ internal static string Drumroll { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Easy { get { @@ -871,7 +871,7 @@ internal static string Easy { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Edit_Profile { get { @@ -880,7 +880,7 @@ internal static string Edit_Profile { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Eighth_Dan { get { @@ -889,7 +889,7 @@ internal static string Eighth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Electric_Guitar { get { @@ -898,7 +898,7 @@ internal static string Electric_Guitar { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string English { get { @@ -907,7 +907,7 @@ internal static string English { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Error { get { @@ -916,7 +916,7 @@ internal static string Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Face { get { @@ -925,7 +925,7 @@ internal static string Face { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Face_Color { get { @@ -934,7 +934,7 @@ internal static string Face_Color { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Fifth_Dan { get { @@ -943,7 +943,7 @@ internal static string Fifth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Fifth_Kyuu { get { @@ -952,7 +952,7 @@ internal static string Fifth_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Filter_by_Genre { get { @@ -961,7 +961,16 @@ internal static string Filter_by_Genre { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 + /// + internal static string Finished { + get { + return ResourceManager.GetString("Finished", resourceCulture); + } + } + + /// + /// 查找类似 的本地化字符串。 /// internal static string First_Dan { get { @@ -970,7 +979,7 @@ internal static string First_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string First_Kyuu { get { @@ -979,7 +988,7 @@ internal static string First_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Fourth_Dan { get { @@ -988,7 +997,7 @@ internal static string Fourth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Fourth_Kyuu { get { @@ -997,7 +1006,7 @@ internal static string Fourth_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Fulfilled { get { @@ -1006,7 +1015,7 @@ internal static string Fulfilled { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string FullChallengeTitle { get { @@ -1015,7 +1024,7 @@ internal static string FullChallengeTitle { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Funassyi { get { @@ -1024,7 +1033,7 @@ internal static string Funassyi { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Gaiden { get { @@ -1033,7 +1042,7 @@ internal static string Gaiden { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Generate_Invite_Code { get { @@ -1042,7 +1051,7 @@ internal static string Generate_Invite_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Genre { get { @@ -1051,7 +1060,7 @@ internal static string Genre { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Gold { get { @@ -1060,7 +1069,7 @@ internal static string Gold { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Gold_Donderful_Combo { get { @@ -1069,7 +1078,7 @@ internal static string Gold_Donderful_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Gold_Full_Combo { get { @@ -1078,7 +1087,7 @@ internal static string Gold_Full_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Good { get { @@ -1087,7 +1096,7 @@ internal static string Good { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Hard { get { @@ -1096,7 +1105,7 @@ internal static string Hard { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Head { get { @@ -1105,7 +1114,7 @@ internal static string Head { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Hide { get { @@ -1114,7 +1123,7 @@ internal static string Hide { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string High_Scores { get { @@ -1123,7 +1132,7 @@ internal static string High_Scores { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string ID { get { @@ -1132,7 +1141,7 @@ internal static string ID { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Information { get { @@ -1141,7 +1150,7 @@ internal static string Information { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Inuneko { get { @@ -1150,7 +1159,7 @@ internal static string Inuneko { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Inverse { get { @@ -1159,7 +1168,7 @@ internal static string Inverse { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Invite_Code { get { @@ -1168,7 +1177,7 @@ internal static string Invite_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Isogai { get { @@ -1177,7 +1186,7 @@ internal static string Isogai { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Japanese { get { @@ -1186,7 +1195,7 @@ internal static string Japanese { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Kigurumi { get { @@ -1195,7 +1204,7 @@ internal static string Kigurumi { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Korean { get { @@ -1204,7 +1213,7 @@ internal static string Korean { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Kuroto { get { @@ -1213,7 +1222,7 @@ internal static string Kuroto { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Language { get { @@ -1222,7 +1231,7 @@ internal static string Language { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Last_For__Days_ { get { @@ -1231,7 +1240,7 @@ internal static string Last_For__Days_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Last_Play_Date { get { @@ -1240,7 +1249,7 @@ internal static string Last_Play_Date { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Last_Play_Time_5_Min_Around_Credit_End_ { get { @@ -1249,7 +1258,7 @@ internal static string Last_Play_Time_5_Min_Around_Credit_End_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Last_Played { get { @@ -1258,7 +1267,7 @@ internal static string Last_Played { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Leaderboard { get { @@ -1267,7 +1276,7 @@ internal static string Leaderboard { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Level { get { @@ -1276,7 +1285,7 @@ internal static string Level { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Limb_Color { get { @@ -1285,7 +1294,7 @@ internal static string Limb_Color { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Log_In { get { @@ -1294,7 +1303,7 @@ internal static string Log_In { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Log_In_First { get { @@ -1303,7 +1312,7 @@ internal static string Log_In_First { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Log_Out { get { @@ -1312,7 +1321,7 @@ internal static string Log_Out { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Log_Out_Confirm { get { @@ -1321,7 +1330,7 @@ internal static string Log_Out_Confirm { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Login_Only_Admin_Error { get { @@ -1330,7 +1339,7 @@ internal static string Login_Only_Admin_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Login_Wrong_Password_Error { get { @@ -1339,7 +1348,7 @@ internal static string Login_Wrong_Password_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Matsuri { get { @@ -1348,7 +1357,7 @@ internal static string Matsuri { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string MAX_Combo { get { @@ -1357,7 +1366,7 @@ internal static string MAX_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Max_Participant { get { @@ -1366,7 +1375,7 @@ internal static string Max_Participant { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Meijin { get { @@ -1375,7 +1384,7 @@ internal static string Meijin { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Mekadon { get { @@ -1384,7 +1393,7 @@ internal static string Mekadon { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Messy { get { @@ -1393,7 +1402,7 @@ internal static string Messy { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Name { get { @@ -1402,7 +1411,7 @@ internal static string Name { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string New_Access_Code { get { @@ -1411,7 +1420,7 @@ internal static string New_Access_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string New_Password { get { @@ -1420,7 +1429,7 @@ internal static string New_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Ninth_Dan { get { @@ -1429,7 +1438,7 @@ internal static string Ninth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string No_Data { get { @@ -1438,7 +1447,7 @@ internal static string No_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string No_Play_History_Found { get { @@ -1447,7 +1456,7 @@ internal static string No_Play_History_Found { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string No_Select { get { @@ -1456,7 +1465,7 @@ internal static string No_Select { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string None { get { @@ -1465,7 +1474,7 @@ internal static string None { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Normal { get { @@ -1474,7 +1483,7 @@ internal static string Normal { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Cleared { get { @@ -1483,7 +1492,7 @@ internal static string Not_Cleared { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Donderful_Combo { get { @@ -1492,7 +1501,7 @@ internal static string Not_Donderful_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Full_Combo { get { @@ -1501,7 +1510,7 @@ internal static string Not_Full_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Logged_In_Error { get { @@ -1510,7 +1519,7 @@ internal static string Not_Logged_In_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Not_Passed { get { @@ -1519,7 +1528,7 @@ internal static string Not_Passed { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Notes_Position { get { @@ -1528,7 +1537,7 @@ internal static string Notes_Position { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Off { get { @@ -1537,7 +1546,7 @@ internal static string Off { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Official_Competition { get { @@ -1546,7 +1555,7 @@ internal static string Official_Competition { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string OK { get { @@ -1555,7 +1564,7 @@ internal static string OK { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Old_Password { get { @@ -1564,7 +1573,7 @@ internal static string Old_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string On { get { @@ -1573,7 +1582,7 @@ internal static string On { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Oni { get { @@ -1582,7 +1591,7 @@ internal static string Oni { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Only_Play_Once { get { @@ -1591,7 +1600,7 @@ internal static string Only_Play_Once { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string other_access_code_s_ { get { @@ -1600,7 +1609,7 @@ internal static string other_access_code_s_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Participate { get { @@ -1609,7 +1618,7 @@ internal static string Participate { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Participated { get { @@ -1618,7 +1627,7 @@ internal static string Participated { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Pass { get { @@ -1627,7 +1636,7 @@ internal static string Pass { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Password { get { @@ -1636,7 +1645,7 @@ internal static string Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Password_is_Required { get { @@ -1645,7 +1654,7 @@ internal static string Password_is_Required { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Play_Data { get { @@ -1654,7 +1663,7 @@ internal static string Play_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Play_History { get { @@ -1663,7 +1672,7 @@ internal static string Play_History { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Play_Time { get { @@ -1672,7 +1681,7 @@ internal static string Play_Time { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Player { get { @@ -1681,7 +1690,7 @@ internal static string Player { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Player_Titles { get { @@ -1690,7 +1699,7 @@ internal static string Player_Titles { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Profile { get { @@ -1699,7 +1708,7 @@ internal static string Profile { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Profile_Options { get { @@ -1708,7 +1717,7 @@ internal static string Profile_Options { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Puchi { get { @@ -1717,7 +1726,7 @@ internal static string Puchi { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Puchipuchi { get { @@ -1726,7 +1735,7 @@ internal static string Puchipuchi { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string QR_Code { get { @@ -1735,7 +1744,7 @@ internal static string QR_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Random { get { @@ -1744,7 +1753,7 @@ internal static string Random { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Rank { get { @@ -1753,7 +1762,7 @@ internal static string Rank { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string ReceiverChallengeTitle { get { @@ -1762,7 +1771,7 @@ internal static string ReceiverChallengeTitle { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Red { get { @@ -1771,7 +1780,7 @@ internal static string Red { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Red_Donderful_Combo { get { @@ -1780,7 +1789,7 @@ internal static string Red_Donderful_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Red_Full_Combo { get { @@ -1789,7 +1798,7 @@ internal static string Red_Full_Combo { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register { get { @@ -1798,7 +1807,7 @@ internal static string Register { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Already_Registered_Error { get { @@ -1807,7 +1816,7 @@ internal static string Register_Already_Registered_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Different_Confirm_Password_Error { get { @@ -1816,7 +1825,7 @@ internal static string Register_Different_Confirm_Password_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Only_Admin_Error { get { @@ -1825,7 +1834,7 @@ internal static string Register_Only_Admin_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Success { get { @@ -1834,7 +1843,7 @@ internal static string Register_Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Register_Wrong_Last_Play_Time_Error { get { @@ -1843,7 +1852,7 @@ internal static string Register_Wrong_Last_Play_Time_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Reject { get { @@ -1852,7 +1861,7 @@ internal static string Reject { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Rejected { get { @@ -1861,7 +1870,7 @@ internal static string Rejected { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Reset { get { @@ -1870,7 +1879,7 @@ internal static string Reset { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Reset_Password { get { @@ -1879,7 +1888,7 @@ internal static string Reset_Password { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Reset_Password_Confirm_1 { get { @@ -1888,7 +1897,7 @@ internal static string Reset_Password_Confirm_1 { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Reset_Password_Confirm_2 { get { @@ -1897,7 +1906,7 @@ internal static string Reset_Password_Confirm_2 { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Result { get { @@ -1906,7 +1915,7 @@ internal static string Result { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Rows_Per_Page_ { get { @@ -1915,7 +1924,7 @@ internal static string Rows_Per_Page_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Save { get { @@ -1924,7 +1933,7 @@ internal static string Save { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Score { get { @@ -1933,7 +1942,7 @@ internal static string Score { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Search { get { @@ -1942,7 +1951,7 @@ internal static string Search { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Search_by_Name__Comp_ID { get { @@ -1951,7 +1960,7 @@ internal static string Search_by_Name__Comp_ID { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Search_by_Name__ID__or_Access_Code { get { @@ -1960,7 +1969,7 @@ internal static string Search_by_Name__ID__or_Access_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Search_by_Title__Artist_or_Date { get { @@ -1969,7 +1978,7 @@ internal static string Search_by_Title__Artist_or_Date { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Search_by_Title_or_Artist { get { @@ -1978,7 +1987,7 @@ internal static string Search_by_Title_or_Artist { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Second_Dan { get { @@ -1987,7 +1996,7 @@ internal static string Second_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Second_Kyuu { get { @@ -1996,7 +2005,7 @@ internal static string Second_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Section_No_ { get { @@ -2005,7 +2014,7 @@ internal static string Section_No_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Select_a_Title { get { @@ -2014,7 +2023,7 @@ internal static string Select_a_Title { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Select_Song { get { @@ -2023,7 +2032,7 @@ internal static string Select_Song { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Select_User { get { @@ -2032,7 +2041,7 @@ internal static string Select_User { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Set_Up_Each_Time { get { @@ -2041,7 +2050,7 @@ internal static string Set_Up_Each_Time { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Settings { get { @@ -2050,7 +2059,7 @@ internal static string Settings { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Seventh_Dan { get { @@ -2059,7 +2068,7 @@ internal static string Seventh_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Show { get { @@ -2068,7 +2077,7 @@ internal static string Show { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Show_QR_Code { get { @@ -2077,7 +2086,7 @@ internal static string Show_QR_Code { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Shuriken { get { @@ -2086,7 +2095,7 @@ internal static string Shuriken { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Sixth_Dan { get { @@ -2095,7 +2104,7 @@ internal static string Sixth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Skip_Song { get { @@ -2104,7 +2113,7 @@ internal static string Skip_Song { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song { get { @@ -2113,7 +2122,7 @@ internal static string Song { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song_List { get { @@ -2122,7 +2131,7 @@ internal static string Song_List { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song_Name { get { @@ -2131,7 +2140,7 @@ internal static string Song_Name { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song_Number { get { @@ -2140,7 +2149,7 @@ internal static string Song_Number { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song_Options { get { @@ -2149,7 +2158,7 @@ internal static string Song_Options { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Song_Title___Artist { get { @@ -2158,7 +2167,7 @@ internal static string Song_Title___Artist { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Soul_Gauge { get { @@ -2167,7 +2176,7 @@ internal static string Soul_Gauge { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Soya { get { @@ -2176,7 +2185,7 @@ internal static string Soya { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Speed { get { @@ -2185,7 +2194,7 @@ internal static string Speed { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Stage { get { @@ -2194,7 +2203,7 @@ internal static string Stage { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Success { get { @@ -2203,7 +2212,7 @@ internal static string Success { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Synthdrum { get { @@ -2212,7 +2221,7 @@ internal static string Synthdrum { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Taiko { get { @@ -2221,7 +2230,7 @@ internal static string Taiko { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Tambourine { get { @@ -2230,7 +2239,7 @@ internal static string Tambourine { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Tatsujin { get { @@ -2239,7 +2248,7 @@ internal static string Tatsujin { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Tenth_Dan { get { @@ -2248,7 +2257,7 @@ internal static string Tenth_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Third_Dan { get { @@ -2257,7 +2266,7 @@ internal static string Third_Dan { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Third_Kyuu { get { @@ -2266,7 +2275,7 @@ internal static string Third_Kyuu { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Title { get { @@ -2275,7 +2284,7 @@ internal static string Title { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Title_Plate { get { @@ -2284,7 +2293,7 @@ internal static string Title_Plate { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Tone { get { @@ -2293,7 +2302,7 @@ internal static string Tone { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Total_Clears { get { @@ -2302,7 +2311,7 @@ internal static string Total_Clears { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Total_Credits_Played { get { @@ -2311,7 +2320,7 @@ internal static string Total_Credits_Played { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Total_Donderful_Combos { get { @@ -2320,7 +2329,7 @@ internal static string Total_Donderful_Combos { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Total_Full_Combos { get { @@ -2329,7 +2338,7 @@ internal static string Total_Full_Combos { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Total_Hits { get { @@ -2338,7 +2347,7 @@ internal static string Total_Hits { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Totals { get { @@ -2347,7 +2356,7 @@ internal static string Totals { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string UI { get { @@ -2356,7 +2365,7 @@ internal static string UI { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Unknown_Access_Code_Error { get { @@ -2365,7 +2374,7 @@ internal static string Unknown_Access_Code_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Unknown_Error { get { @@ -2374,7 +2383,7 @@ internal static string Unknown_Error { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Unregister { get { @@ -2383,7 +2392,7 @@ internal static string Unregister { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Ura_Oni { get { @@ -2392,7 +2401,7 @@ internal static string Ura_Oni { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string UraOni { get { @@ -2401,7 +2410,7 @@ internal static string UraOni { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string User { get { @@ -2410,7 +2419,7 @@ internal static string User { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string User_ID { get { @@ -2419,7 +2428,7 @@ internal static string User_ID { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Users { get { @@ -2428,7 +2437,7 @@ internal static string Users { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Vanish { get { @@ -2437,7 +2446,7 @@ internal static string Vanish { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string View_Play_Data { get { @@ -2446,7 +2455,7 @@ internal static string View_Play_Data { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Voice { get { @@ -2455,7 +2464,7 @@ internal static string Voice { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Wadadon { get { @@ -2464,7 +2473,7 @@ internal static string Wadadon { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Welcome_to_TaikoWebUI_ { get { @@ -2473,7 +2482,7 @@ internal static string Welcome_to_TaikoWebUI_ { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Whimsical { get { @@ -2482,7 +2491,7 @@ internal static string Whimsical { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Wonderfultaiko { get { @@ -2491,7 +2500,7 @@ internal static string Wonderfultaiko { } /// - /// Recherche une chaîne localisée semblable à . + /// 查找类似 的本地化字符串。 /// internal static string Wrap { get { diff --git a/TaikoWebUI/Localization/LocalizationResource.en-US.resx b/TaikoWebUI/Localization/LocalizationResource.en-US.resx index c79edb58..c45f8439 100644 --- a/TaikoWebUI/Localization/LocalizationResource.en-US.resx +++ b/TaikoWebUI/Localization/LocalizationResource.en-US.resx @@ -930,4 +930,7 @@ Off + + Finished + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx index 2579a2f5..b7c50a64 100644 --- a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx +++ b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx @@ -930,4 +930,7 @@ Off + + Terminé + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.ja.resx b/TaikoWebUI/Localization/LocalizationResource.ja.resx index 6e8fe1bd..0155ad14 100644 --- a/TaikoWebUI/Localization/LocalizationResource.ja.resx +++ b/TaikoWebUI/Localization/LocalizationResource.ja.resx @@ -930,4 +930,7 @@ オフ + + 終わった + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.resx b/TaikoWebUI/Localization/LocalizationResource.resx index c452a4b5..cfb61e11 100644 --- a/TaikoWebUI/Localization/LocalizationResource.resx +++ b/TaikoWebUI/Localization/LocalizationResource.resx @@ -930,4 +930,7 @@ + + + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx b/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx index 252d2ffc..6e5c521c 100644 --- a/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx +++ b/TaikoWebUI/Localization/LocalizationResource.zh-Hans.resx @@ -930,4 +930,7 @@ 关闭 + + 已结束 + \ No newline at end of file diff --git a/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx b/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx index 4015c947..5eb5ac4a 100644 --- a/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx +++ b/TaikoWebUI/Localization/LocalizationResource.zh-Hant.resx @@ -930,4 +930,7 @@ 關閉 + + 已結束 + \ No newline at end of file From 5ab84f1f647175a8697b578960158f9193a2ab33 Mon Sep 17 00:00:00 2001 From: KIT! Date: Mon, 28 Oct 2024 16:46:23 +0100 Subject: [PATCH 14/15] Added admin user checks on the backend We no longer match admins to baid 0 but rather use their actual isAdmin value from the db --- TaikoLocalServer/Services/ChallengeCompeteService.cs | 6 ++++-- TaikoWebUI/Components/LanguageToggle.razor | 5 ++++- TaikoWebUI/Components/NavMenu.razor | 8 ++++---- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/TaikoLocalServer/Services/ChallengeCompeteService.cs b/TaikoLocalServer/Services/ChallengeCompeteService.cs index db81db5d..ae560947 100644 --- a/TaikoLocalServer/Services/ChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/ChallengeCompeteService.cs @@ -73,13 +73,15 @@ public async Task GetChallengeCompetePage(CompeteM { IQueryable? query = null; string? lowSearch = search != null ? search.ToLower() : null; + bool isAdmin = context.UserData.Where(u => u.Baid == baid).First().IsAdmin; + if (mode == CompeteModeType.Chanllenge) { query = context.ChallengeCompeteData .Include(e => e.Songs).ThenInclude(e => e.BestScores).Include(e => e.Participants) .Where(e => e.CompeteMode == CompeteModeType.Chanllenge) .Where(e => inProgress == false || (e.CreateTime < DateTime.Now && DateTime.Now < e.ExpireTime)) - .Where(e => baid == 0 || (e.Baid == baid || e.Participants.Any(p => p.Baid == baid))) + .Where(e => isAdmin || (e.Baid == baid || e.Participants.Any(p => p.Baid == baid))) .Where(e => lowSearch == null || (e.CompId.ToString() == lowSearch || e.CompeteName.ToLower().Contains(lowSearch))); } else if (mode == CompeteModeType.Compete) @@ -88,7 +90,7 @@ public async Task GetChallengeCompetePage(CompeteM .Include(e => e.Songs).ThenInclude(e => e.BestScores).Include(e => e.Participants) .Where(e => e.CompeteMode == CompeteModeType.Compete) .Where(e => inProgress == false || (e.CreateTime < DateTime.Now && DateTime.Now < e.ExpireTime)) - .Where(e => baid == 0 || (e.Baid == baid || e.Participants.Any(p => p.Baid == baid) || e.Share == ShareType.EveryOne)) + .Where(e => isAdmin || (e.Baid == baid || e.Participants.Any(p => p.Baid == baid) || e.Share == ShareType.EveryOne)) .Where(e => lowSearch == null || (e.CompId.ToString() == lowSearch || e.CompeteName.ToLower().Contains(lowSearch))); } else if (mode == CompeteModeType.OfficialCompete) diff --git a/TaikoWebUI/Components/LanguageToggle.razor b/TaikoWebUI/Components/LanguageToggle.razor index 0862fe0c..d53abed4 100644 --- a/TaikoWebUI/Components/LanguageToggle.razor +++ b/TaikoWebUI/Components/LanguageToggle.razor @@ -16,7 +16,10 @@ @Localizer["Song List"] @foreach (var culture in supportedCultures) { - @culture.Value + @if (culture.Key.Name != "fr-FR") //We do not add an entry for French song names as the game's wordlist has no fields for this. + { + @culture.Value + } } diff --git a/TaikoWebUI/Components/NavMenu.razor b/TaikoWebUI/Components/NavMenu.razor index 35da9074..f2a4797f 100644 --- a/TaikoWebUI/Components/NavMenu.razor +++ b/TaikoWebUI/Components/NavMenu.razor @@ -24,7 +24,7 @@ { @Localizer["Profile"] - + @Localizer["Song List"] @Localizer["High Scores"] @Localizer["Play History"] @@ -35,9 +35,9 @@ if (AuthService.IsLoggedIn || !AuthService.LoginRequired) { - @Localizer["Challenge"] - @Localizer["Competition"] - @Localizer["Official Competition"] + @Localizer["Challenge"] + @Localizer["Competition"] + @Localizer["Official Competition"] } From a200b5c9616c59a5bdd411a54f631e52c0545dd9 Mon Sep 17 00:00:00 2001 From: KIT! Date: Mon, 28 Oct 2024 17:36:01 +0100 Subject: [PATCH 15/15] Allow for admin players to accept / reject challenges Admins should be able to register to competitions and to accept / reject challenges. By default however, creating a competition as an admin does not make you register to it. --- .../Services/ChallengeCompeteService.cs | 8 +- TaikoWebUI/Components/ChallengeCompe.razor | 15 +- TaikoWebUI/Components/ChallengeCompe.razor.cs | 2 +- .../LocalizationResource.Designer.cs | 568 +++++++++--------- .../LocalizationResource.fr-FR.resx | 2 +- 5 files changed, 302 insertions(+), 293 deletions(-) diff --git a/TaikoLocalServer/Services/ChallengeCompeteService.cs b/TaikoLocalServer/Services/ChallengeCompeteService.cs index ae560947..9a085a1a 100644 --- a/TaikoLocalServer/Services/ChallengeCompeteService.cs +++ b/TaikoLocalServer/Services/ChallengeCompeteService.cs @@ -138,6 +138,8 @@ public async Task GetChallengeCompetePage(CompeteM public async Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeCompeteInfo) { + bool isAdmin = context.UserData.Where(u => u.Baid == baid).First().IsAdmin; + ChallengeCompeteDatum challengeCompeteData = new() { CompId = context.ChallengeCompeteData.Any() ? context.ChallengeCompeteData.AsEnumerable().Max(c => c.CompId) + 1 : 1, @@ -169,8 +171,8 @@ public async Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeC }; await context.AddAsync(challengeCompeteSongData); } - if (baid != 0) - { + + if (!isAdmin){ ChallengeCompeteParticipantDatum participantDatum = new() { CompId = challengeCompeteData.CompId, @@ -179,7 +181,9 @@ public async Task CreateCompete(uint baid, ChallengeCompeteCreateInfo challengeC }; await context.AddAsync(participantDatum); } + await context.SaveChangesAsync(); + } public async Task ParticipateCompete(uint compId, uint baid) diff --git a/TaikoWebUI/Components/ChallengeCompe.razor b/TaikoWebUI/Components/ChallengeCompe.razor index dff8265a..724f3502 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor +++ b/TaikoWebUI/Components/ChallengeCompe.razor @@ -69,8 +69,11 @@ } else if (ChallengeCompetition.CompeteMode == CompeteModeType.Chanllenge) { - @if (AuthService.IsAdmin || ChallengeCompetition?.Baid == Baid || ChallengeCompetition?.State != CompeteState.Waiting) - { + var targeted = true; + if (ChallengeCompetition?.Participants.Find(u => u.Baid == Baid) == null) targeted = false; + //The above is used for admins only: If you are the target of a challenge, you should be able to accept or reject it + if (ChallengeCompetition?.Baid == Baid || ChallengeCompetition?.State != CompeteState.Waiting || (!targeted && AuthService.IsAdmin)) + { switch (ChallengeCompetition?.State) { case CompeteState.Waiting: @@ -87,16 +90,18 @@ else { - AnswerChallenge(true))>@Localizer["Accept"] - AnswerChallenge(false))>@Localizer["Reject"] + // The buttons are disabled on (AuthService.IsAdmin && !targeted) which means "You are admin and you're not a target of the challenge" + // This should never happen as you should instead see the buttons from the switch statement above ! } } else if (ChallengeCompetition.CompeteMode == CompeteModeType.Compete || ChallengeCompetition.CompeteMode == CompeteModeType.OfficialCompete) { - if (Baid != 0) + if (!AuthService.IsAdmin) { if (ChallengeCompetition.Participants.Any(p => p.Baid == Baid)) { diff --git a/TaikoWebUI/Components/ChallengeCompe.razor.cs b/TaikoWebUI/Components/ChallengeCompe.razor.cs index 9508dd57..33b20125 100644 --- a/TaikoWebUI/Components/ChallengeCompe.razor.cs +++ b/TaikoWebUI/Components/ChallengeCompe.razor.cs @@ -36,7 +36,7 @@ private bool SelfHoldedChallengeCompetiton() private bool ChallengeNeedAnswer() { - return Baid != 0 && ChallengeCompetition?.State == CompeteState.Waiting && ChallengeCompetition?.Baid != Baid; + return !AuthService.IsAdmin && ChallengeCompetition?.State == CompeteState.Waiting && ChallengeCompetition?.Baid != Baid; } private bool ParticipatedChallengeCompetition() diff --git a/TaikoWebUI/Localization/LocalizationResource.Designer.cs b/TaikoWebUI/Localization/LocalizationResource.Designer.cs index ddb24e43..32d22bcd 100644 --- a/TaikoWebUI/Localization/LocalizationResource.Designer.cs +++ b/TaikoWebUI/Localization/LocalizationResource.Designer.cs @@ -1,10 +1,10 @@ //------------------------------------------------------------------------------ // -// 此代码由工具生成。 -// 运行时版本:4.0.30319.42000 +// Ce code a été généré par un outil. +// Version du runtime :4.0.30319.42000 // -// 对此文件的更改可能会导致不正确的行为,并且如果 -// 重新生成代码,这些更改将会丢失。 +// Les modifications apportées à ce fichier peuvent provoquer un comportement incorrect et seront perdues si +// le code est régénéré. // //------------------------------------------------------------------------------ @@ -13,12 +13,12 @@ namespace TaikoWebUI.Localization { /// - /// 一个强类型的资源类,用于查找本地化的字符串等。 + /// Une classe de ressource fortement typée destinée, entre autres, à la consultation des chaînes localisées. /// - // 此类是由 StronglyTypedResourceBuilder - // 类通过类似于 ResGen 或 Visual Studio 的工具自动生成的。 - // 若要添加或移除成员,请编辑 .ResX 文件,然后重新运行 ResGen - // (以 /str 作为命令选项),或重新生成 VS 项目。 + // Cette classe a été générée automatiquement par la classe StronglyTypedResourceBuilder + // à l'aide d'un outil, tel que ResGen ou Visual Studio. + // Pour ajouter ou supprimer un membre, modifiez votre fichier .ResX, puis réexécutez ResGen + // avec l'option /str ou régénérez votre projet VS. [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "17.0.0.0")] [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] @@ -33,7 +33,7 @@ internal LocalizationResource() { } /// - /// 返回此类使用的缓存的 ResourceManager 实例。 + /// Retourne l'instance ResourceManager mise en cache utilisée par cette classe. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Resources.ResourceManager ResourceManager { @@ -47,8 +47,8 @@ internal LocalizationResource() { } /// - /// 重写当前线程的 CurrentUICulture 属性,对 - /// 使用此强类型资源类的所有资源查找执行重写。 + /// Remplace la propriété CurrentUICulture du thread actuel pour toutes + /// les recherches de ressources à l'aide de cette classe de ressource fortement typée. /// [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] internal static global::System.Globalization.CultureInfo Culture { @@ -61,7 +61,7 @@ internal LocalizationResource() { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _1_Star { get { @@ -70,7 +70,7 @@ internal static string _1_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _10_Star { get { @@ -79,7 +79,7 @@ internal static string _10_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _2_Star { get { @@ -88,7 +88,7 @@ internal static string _2_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _3_Star { get { @@ -97,7 +97,7 @@ internal static string _3_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _4_Star { get { @@ -106,7 +106,7 @@ internal static string _4_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _5_Star { get { @@ -115,7 +115,7 @@ internal static string _5_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _6_Star { get { @@ -124,7 +124,7 @@ internal static string _6_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _7_Star { get { @@ -133,7 +133,7 @@ internal static string _7_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _8_Star { get { @@ -142,7 +142,7 @@ internal static string _8_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _8bittaiko { get { @@ -151,7 +151,7 @@ internal static string _8bittaiko { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _9_Star { get { @@ -160,7 +160,7 @@ internal static string _9_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string _Invite_Code__Optional__ { get { @@ -169,7 +169,7 @@ internal static string _Invite_Code__Optional__ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Accept { get { @@ -178,7 +178,7 @@ internal static string Accept { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Accepted { get { @@ -187,7 +187,7 @@ internal static string Accepted { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code { get { @@ -196,7 +196,7 @@ internal static string Access_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Already_Bound_Error { get { @@ -205,7 +205,7 @@ internal static string Access_Code_Already_Bound_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Bound_Success { get { @@ -214,7 +214,7 @@ internal static string Access_Code_Bound_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Delete_Confirm { get { @@ -223,7 +223,7 @@ internal static string Access_Code_Delete_Confirm { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Delete_Last_Access_Code_Error { get { @@ -232,7 +232,7 @@ internal static string Access_Code_Delete_Last_Access_Code_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Delete_Success { get { @@ -241,7 +241,7 @@ internal static string Access_Code_Delete_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Empty_Error { get { @@ -250,7 +250,7 @@ internal static string Access_Code_Empty_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_is_Required { get { @@ -259,7 +259,7 @@ internal static string Access_Code_is_Required { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Not_Admin_Error { get { @@ -268,7 +268,7 @@ internal static string Access_Code_Not_Admin_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Not_Registered_Error { get { @@ -277,7 +277,7 @@ internal static string Access_Code_Not_Registered_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Code_Upper_Limit_Error { get { @@ -286,7 +286,7 @@ internal static string Access_Code_Upper_Limit_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Access_Codes { get { @@ -295,7 +295,7 @@ internal static string Access_Codes { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Achievement_Panel { get { @@ -304,7 +304,7 @@ internal static string Achievement_Panel { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Achievement_Panel_Difficulty { get { @@ -313,7 +313,7 @@ internal static string Achievement_Panel_Difficulty { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Add { get { @@ -322,7 +322,7 @@ internal static string Add { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Add_Access_Code { get { @@ -331,7 +331,7 @@ internal static string Add_Access_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string AI_Battle_Data { get { @@ -340,7 +340,7 @@ internal static string AI_Battle_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Akemi { get { @@ -349,7 +349,7 @@ internal static string Akemi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string And { get { @@ -358,7 +358,7 @@ internal static string And { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Any { get { @@ -367,7 +367,7 @@ internal static string Any { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Bad { get { @@ -376,7 +376,7 @@ internal static string Bad { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Best_Crown { get { @@ -385,7 +385,7 @@ internal static string Best_Crown { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Best_Rank { get { @@ -394,7 +394,7 @@ internal static string Best_Rank { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Best_Score { get { @@ -403,7 +403,7 @@ internal static string Best_Score { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Body { get { @@ -412,7 +412,7 @@ internal static string Body { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Body_Color { get { @@ -421,7 +421,7 @@ internal static string Body_Color { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Cancel { get { @@ -430,7 +430,7 @@ internal static string Cancel { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Challenge { get { @@ -439,7 +439,7 @@ internal static string Challenge { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Challenge_Competition_Data { get { @@ -448,7 +448,7 @@ internal static string Challenge_Competition_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Challenge_Target { get { @@ -457,7 +457,7 @@ internal static string Challenge_Target { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Change_Password { get { @@ -466,7 +466,7 @@ internal static string Change_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Change_Password_Different_Confirm_Password_Error { get { @@ -475,7 +475,7 @@ internal static string Change_Password_Different_Confirm_Password_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Change_Password_Success { get { @@ -484,7 +484,7 @@ internal static string Change_Password_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Change_Password_Wrong_Current_Password_Error { get { @@ -493,7 +493,7 @@ internal static string Change_Password_Wrong_Current_Password_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Chinese_Simplified { get { @@ -502,7 +502,7 @@ internal static string Chinese_Simplified { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Chinese_Traditional { get { @@ -511,7 +511,7 @@ internal static string Chinese_Traditional { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Chojin { get { @@ -520,7 +520,7 @@ internal static string Chojin { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Clapping { get { @@ -529,7 +529,7 @@ internal static string Clapping { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Comp_ID { get { @@ -538,7 +538,7 @@ internal static string Comp_ID { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Competition { get { @@ -547,7 +547,7 @@ internal static string Competition { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Conditions { get { @@ -556,7 +556,7 @@ internal static string Conditions { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Confirm_New_Password { get { @@ -565,7 +565,7 @@ internal static string Confirm_New_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Confirm_Password { get { @@ -574,7 +574,7 @@ internal static string Confirm_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Confirm_Password_is_Required { get { @@ -583,7 +583,7 @@ internal static string Confirm_Password_is_Required { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Conga { get { @@ -592,7 +592,7 @@ internal static string Conga { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Copy_to_Clipboard { get { @@ -601,7 +601,7 @@ internal static string Copy_to_Clipboard { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Costume { get { @@ -610,7 +610,7 @@ internal static string Costume { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Costume_Options { get { @@ -619,7 +619,7 @@ internal static string Costume_Options { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Course_Songs { get { @@ -628,7 +628,7 @@ internal static string Course_Songs { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Create { get { @@ -637,7 +637,7 @@ internal static string Create { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Create_Challenge { get { @@ -646,7 +646,7 @@ internal static string Create_Challenge { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Create_Competition { get { @@ -655,7 +655,7 @@ internal static string Create_Competition { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Create_Official_Competition { get { @@ -664,7 +664,7 @@ internal static string Create_Official_Competition { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string CreatorChallengeTitle { get { @@ -673,7 +673,7 @@ internal static string CreatorChallengeTitle { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Crown { get { @@ -682,7 +682,7 @@ internal static string Crown { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Currently_Selected_ { get { @@ -691,7 +691,7 @@ internal static string Currently_Selected_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Dani_Dojo { get { @@ -700,7 +700,7 @@ internal static string Dani_Dojo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Dashboard { get { @@ -709,7 +709,7 @@ internal static string Dashboard { } /// - /// 查找类似 MM/dd/yyyy h:mm:ss tt 的本地化字符串。 + /// Recherche une chaîne localisée semblable à MM/dd/yyyy h:mm:ss tt. /// internal static string DateFormat { get { @@ -718,7 +718,7 @@ internal static string DateFormat { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Default { get { @@ -727,7 +727,7 @@ internal static string Default { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Delete { get { @@ -736,7 +736,7 @@ internal static string Delete { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Delete_User { get { @@ -745,7 +745,7 @@ internal static string Delete_User { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Delete_User_Confirm { get { @@ -754,7 +754,7 @@ internal static string Delete_User_Confirm { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Delete_User_Success { get { @@ -763,7 +763,7 @@ internal static string Delete_User_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Describe { get { @@ -772,7 +772,7 @@ internal static string Describe { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Details { get { @@ -781,7 +781,7 @@ internal static string Details { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Dialog_OK { get { @@ -790,7 +790,7 @@ internal static string Dialog_OK { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Difficulty { get { @@ -799,7 +799,7 @@ internal static string Difficulty { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Difficulty_Setting_Course { get { @@ -808,7 +808,7 @@ internal static string Difficulty_Setting_Course { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Difficulty_Setting_Sort { get { @@ -817,7 +817,7 @@ internal static string Difficulty_Setting_Sort { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Difficulty_Setting_Star { get { @@ -826,7 +826,7 @@ internal static string Difficulty_Setting_Star { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Display_Achievement_Panel { get { @@ -835,7 +835,7 @@ internal static string Display_Achievement_Panel { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Display_Dan_Rank_on_Name_Plate { get { @@ -844,7 +844,7 @@ internal static string Display_Dan_Rank_on_Name_Plate { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Drum { get { @@ -853,7 +853,7 @@ internal static string Drum { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Drumroll { get { @@ -862,7 +862,7 @@ internal static string Drumroll { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Easy { get { @@ -871,7 +871,7 @@ internal static string Easy { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Edit_Profile { get { @@ -880,7 +880,7 @@ internal static string Edit_Profile { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Eighth_Dan { get { @@ -889,7 +889,7 @@ internal static string Eighth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Electric_Guitar { get { @@ -898,7 +898,7 @@ internal static string Electric_Guitar { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string English { get { @@ -907,7 +907,7 @@ internal static string English { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Error { get { @@ -916,7 +916,7 @@ internal static string Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Face { get { @@ -925,7 +925,7 @@ internal static string Face { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Face_Color { get { @@ -934,7 +934,7 @@ internal static string Face_Color { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fifth_Dan { get { @@ -943,7 +943,7 @@ internal static string Fifth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fifth_Kyuu { get { @@ -952,7 +952,7 @@ internal static string Fifth_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Filter_by_Genre { get { @@ -961,7 +961,7 @@ internal static string Filter_by_Genre { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Finished { get { @@ -970,7 +970,7 @@ internal static string Finished { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string First_Dan { get { @@ -979,7 +979,7 @@ internal static string First_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string First_Kyuu { get { @@ -988,7 +988,7 @@ internal static string First_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fourth_Dan { get { @@ -997,7 +997,7 @@ internal static string Fourth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fourth_Kyuu { get { @@ -1006,7 +1006,7 @@ internal static string Fourth_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Fulfilled { get { @@ -1015,7 +1015,7 @@ internal static string Fulfilled { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string FullChallengeTitle { get { @@ -1024,7 +1024,7 @@ internal static string FullChallengeTitle { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Funassyi { get { @@ -1033,7 +1033,7 @@ internal static string Funassyi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Gaiden { get { @@ -1042,7 +1042,7 @@ internal static string Gaiden { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Generate_Invite_Code { get { @@ -1051,7 +1051,7 @@ internal static string Generate_Invite_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Genre { get { @@ -1060,7 +1060,7 @@ internal static string Genre { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Gold { get { @@ -1069,7 +1069,7 @@ internal static string Gold { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Gold_Donderful_Combo { get { @@ -1078,7 +1078,7 @@ internal static string Gold_Donderful_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Gold_Full_Combo { get { @@ -1087,7 +1087,7 @@ internal static string Gold_Full_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Good { get { @@ -1096,7 +1096,7 @@ internal static string Good { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Hard { get { @@ -1105,7 +1105,7 @@ internal static string Hard { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Head { get { @@ -1114,7 +1114,7 @@ internal static string Head { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Hide { get { @@ -1123,7 +1123,7 @@ internal static string Hide { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string High_Scores { get { @@ -1132,7 +1132,7 @@ internal static string High_Scores { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string ID { get { @@ -1141,7 +1141,7 @@ internal static string ID { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Information { get { @@ -1150,7 +1150,7 @@ internal static string Information { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Inuneko { get { @@ -1159,7 +1159,7 @@ internal static string Inuneko { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Inverse { get { @@ -1168,7 +1168,7 @@ internal static string Inverse { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Invite_Code { get { @@ -1177,7 +1177,7 @@ internal static string Invite_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Isogai { get { @@ -1186,7 +1186,7 @@ internal static string Isogai { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Japanese { get { @@ -1195,7 +1195,7 @@ internal static string Japanese { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Kigurumi { get { @@ -1204,7 +1204,7 @@ internal static string Kigurumi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Korean { get { @@ -1213,7 +1213,7 @@ internal static string Korean { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Kuroto { get { @@ -1222,7 +1222,7 @@ internal static string Kuroto { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Language { get { @@ -1231,7 +1231,7 @@ internal static string Language { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Last_For__Days_ { get { @@ -1240,7 +1240,7 @@ internal static string Last_For__Days_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Last_Play_Date { get { @@ -1249,7 +1249,7 @@ internal static string Last_Play_Date { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Last_Play_Time_5_Min_Around_Credit_End_ { get { @@ -1258,7 +1258,7 @@ internal static string Last_Play_Time_5_Min_Around_Credit_End_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Last_Played { get { @@ -1267,7 +1267,7 @@ internal static string Last_Played { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Leaderboard { get { @@ -1276,7 +1276,7 @@ internal static string Leaderboard { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Level { get { @@ -1285,7 +1285,7 @@ internal static string Level { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Limb_Color { get { @@ -1294,7 +1294,7 @@ internal static string Limb_Color { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Log_In { get { @@ -1303,7 +1303,7 @@ internal static string Log_In { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Log_In_First { get { @@ -1312,7 +1312,7 @@ internal static string Log_In_First { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Log_Out { get { @@ -1321,7 +1321,7 @@ internal static string Log_Out { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Log_Out_Confirm { get { @@ -1330,7 +1330,7 @@ internal static string Log_Out_Confirm { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Login_Only_Admin_Error { get { @@ -1339,7 +1339,7 @@ internal static string Login_Only_Admin_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Login_Wrong_Password_Error { get { @@ -1348,7 +1348,7 @@ internal static string Login_Wrong_Password_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Matsuri { get { @@ -1357,7 +1357,7 @@ internal static string Matsuri { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string MAX_Combo { get { @@ -1366,7 +1366,7 @@ internal static string MAX_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Max_Participant { get { @@ -1375,7 +1375,7 @@ internal static string Max_Participant { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Meijin { get { @@ -1384,7 +1384,7 @@ internal static string Meijin { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Mekadon { get { @@ -1393,7 +1393,7 @@ internal static string Mekadon { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Messy { get { @@ -1402,7 +1402,7 @@ internal static string Messy { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Name { get { @@ -1411,7 +1411,7 @@ internal static string Name { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string New_Access_Code { get { @@ -1420,7 +1420,7 @@ internal static string New_Access_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string New_Password { get { @@ -1429,7 +1429,7 @@ internal static string New_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Ninth_Dan { get { @@ -1438,7 +1438,7 @@ internal static string Ninth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string No_Data { get { @@ -1447,7 +1447,7 @@ internal static string No_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string No_Play_History_Found { get { @@ -1456,7 +1456,7 @@ internal static string No_Play_History_Found { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string No_Select { get { @@ -1465,7 +1465,7 @@ internal static string No_Select { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string None { get { @@ -1474,7 +1474,7 @@ internal static string None { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Normal { get { @@ -1483,7 +1483,7 @@ internal static string Normal { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Cleared { get { @@ -1492,7 +1492,7 @@ internal static string Not_Cleared { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Donderful_Combo { get { @@ -1501,7 +1501,7 @@ internal static string Not_Donderful_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Full_Combo { get { @@ -1510,7 +1510,7 @@ internal static string Not_Full_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Logged_In_Error { get { @@ -1519,7 +1519,7 @@ internal static string Not_Logged_In_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Not_Passed { get { @@ -1528,7 +1528,7 @@ internal static string Not_Passed { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Notes_Position { get { @@ -1537,7 +1537,7 @@ internal static string Notes_Position { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Off { get { @@ -1546,7 +1546,7 @@ internal static string Off { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Official_Competition { get { @@ -1555,7 +1555,7 @@ internal static string Official_Competition { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string OK { get { @@ -1564,7 +1564,7 @@ internal static string OK { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Old_Password { get { @@ -1573,7 +1573,7 @@ internal static string Old_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string On { get { @@ -1582,7 +1582,7 @@ internal static string On { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Oni { get { @@ -1591,7 +1591,7 @@ internal static string Oni { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Only_Play_Once { get { @@ -1600,7 +1600,7 @@ internal static string Only_Play_Once { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string other_access_code_s_ { get { @@ -1609,7 +1609,7 @@ internal static string other_access_code_s_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Participate { get { @@ -1618,7 +1618,7 @@ internal static string Participate { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Participated { get { @@ -1627,7 +1627,7 @@ internal static string Participated { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Pass { get { @@ -1636,7 +1636,7 @@ internal static string Pass { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Password { get { @@ -1645,7 +1645,7 @@ internal static string Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Password_is_Required { get { @@ -1654,7 +1654,7 @@ internal static string Password_is_Required { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Play_Data { get { @@ -1663,7 +1663,7 @@ internal static string Play_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Play_History { get { @@ -1672,7 +1672,7 @@ internal static string Play_History { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Play_Time { get { @@ -1681,7 +1681,7 @@ internal static string Play_Time { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Player { get { @@ -1690,7 +1690,7 @@ internal static string Player { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Player_Titles { get { @@ -1699,7 +1699,7 @@ internal static string Player_Titles { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Profile { get { @@ -1708,7 +1708,7 @@ internal static string Profile { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Profile_Options { get { @@ -1717,7 +1717,7 @@ internal static string Profile_Options { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Puchi { get { @@ -1726,7 +1726,7 @@ internal static string Puchi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Puchipuchi { get { @@ -1735,7 +1735,7 @@ internal static string Puchipuchi { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string QR_Code { get { @@ -1744,7 +1744,7 @@ internal static string QR_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Random { get { @@ -1753,7 +1753,7 @@ internal static string Random { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Rank { get { @@ -1762,7 +1762,7 @@ internal static string Rank { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string ReceiverChallengeTitle { get { @@ -1771,7 +1771,7 @@ internal static string ReceiverChallengeTitle { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Red { get { @@ -1780,7 +1780,7 @@ internal static string Red { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Red_Donderful_Combo { get { @@ -1789,7 +1789,7 @@ internal static string Red_Donderful_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Red_Full_Combo { get { @@ -1798,7 +1798,7 @@ internal static string Red_Full_Combo { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register { get { @@ -1807,7 +1807,7 @@ internal static string Register { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Already_Registered_Error { get { @@ -1816,7 +1816,7 @@ internal static string Register_Already_Registered_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Different_Confirm_Password_Error { get { @@ -1825,7 +1825,7 @@ internal static string Register_Different_Confirm_Password_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Only_Admin_Error { get { @@ -1834,7 +1834,7 @@ internal static string Register_Only_Admin_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Success { get { @@ -1843,7 +1843,7 @@ internal static string Register_Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Register_Wrong_Last_Play_Time_Error { get { @@ -1852,7 +1852,7 @@ internal static string Register_Wrong_Last_Play_Time_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reject { get { @@ -1861,7 +1861,7 @@ internal static string Reject { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Rejected { get { @@ -1870,7 +1870,7 @@ internal static string Rejected { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reset { get { @@ -1879,7 +1879,7 @@ internal static string Reset { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reset_Password { get { @@ -1888,7 +1888,7 @@ internal static string Reset_Password { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reset_Password_Confirm_1 { get { @@ -1897,7 +1897,7 @@ internal static string Reset_Password_Confirm_1 { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Reset_Password_Confirm_2 { get { @@ -1906,7 +1906,7 @@ internal static string Reset_Password_Confirm_2 { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Result { get { @@ -1915,7 +1915,7 @@ internal static string Result { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Rows_Per_Page_ { get { @@ -1924,7 +1924,7 @@ internal static string Rows_Per_Page_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Save { get { @@ -1933,7 +1933,7 @@ internal static string Save { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Score { get { @@ -1942,7 +1942,7 @@ internal static string Score { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search { get { @@ -1951,7 +1951,7 @@ internal static string Search { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search_by_Name__Comp_ID { get { @@ -1960,7 +1960,7 @@ internal static string Search_by_Name__Comp_ID { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search_by_Name__ID__or_Access_Code { get { @@ -1969,7 +1969,7 @@ internal static string Search_by_Name__ID__or_Access_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search_by_Title__Artist_or_Date { get { @@ -1978,7 +1978,7 @@ internal static string Search_by_Title__Artist_or_Date { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Search_by_Title_or_Artist { get { @@ -1987,7 +1987,7 @@ internal static string Search_by_Title_or_Artist { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Second_Dan { get { @@ -1996,7 +1996,7 @@ internal static string Second_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Second_Kyuu { get { @@ -2005,7 +2005,7 @@ internal static string Second_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Section_No_ { get { @@ -2014,7 +2014,7 @@ internal static string Section_No_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Select_a_Title { get { @@ -2023,7 +2023,7 @@ internal static string Select_a_Title { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Select_Song { get { @@ -2032,7 +2032,7 @@ internal static string Select_Song { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Select_User { get { @@ -2041,7 +2041,7 @@ internal static string Select_User { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Set_Up_Each_Time { get { @@ -2050,7 +2050,7 @@ internal static string Set_Up_Each_Time { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Settings { get { @@ -2059,7 +2059,7 @@ internal static string Settings { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Seventh_Dan { get { @@ -2068,7 +2068,7 @@ internal static string Seventh_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Show { get { @@ -2077,7 +2077,7 @@ internal static string Show { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Show_QR_Code { get { @@ -2086,7 +2086,7 @@ internal static string Show_QR_Code { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Shuriken { get { @@ -2095,7 +2095,7 @@ internal static string Shuriken { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Sixth_Dan { get { @@ -2104,7 +2104,7 @@ internal static string Sixth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Skip_Song { get { @@ -2113,7 +2113,7 @@ internal static string Skip_Song { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song { get { @@ -2122,7 +2122,7 @@ internal static string Song { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_List { get { @@ -2131,7 +2131,7 @@ internal static string Song_List { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_Name { get { @@ -2140,7 +2140,7 @@ internal static string Song_Name { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_Number { get { @@ -2149,7 +2149,7 @@ internal static string Song_Number { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_Options { get { @@ -2158,7 +2158,7 @@ internal static string Song_Options { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Song_Title___Artist { get { @@ -2167,7 +2167,7 @@ internal static string Song_Title___Artist { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Soul_Gauge { get { @@ -2176,7 +2176,7 @@ internal static string Soul_Gauge { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Soya { get { @@ -2185,7 +2185,7 @@ internal static string Soya { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Speed { get { @@ -2194,7 +2194,7 @@ internal static string Speed { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Stage { get { @@ -2203,7 +2203,7 @@ internal static string Stage { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Success { get { @@ -2212,7 +2212,7 @@ internal static string Success { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Synthdrum { get { @@ -2221,7 +2221,7 @@ internal static string Synthdrum { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Taiko { get { @@ -2230,7 +2230,7 @@ internal static string Taiko { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Tambourine { get { @@ -2239,7 +2239,7 @@ internal static string Tambourine { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Tatsujin { get { @@ -2248,7 +2248,7 @@ internal static string Tatsujin { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Tenth_Dan { get { @@ -2257,7 +2257,7 @@ internal static string Tenth_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Third_Dan { get { @@ -2266,7 +2266,7 @@ internal static string Third_Dan { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Third_Kyuu { get { @@ -2275,7 +2275,7 @@ internal static string Third_Kyuu { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Title { get { @@ -2284,7 +2284,7 @@ internal static string Title { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Title_Plate { get { @@ -2293,7 +2293,7 @@ internal static string Title_Plate { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Tone { get { @@ -2302,7 +2302,7 @@ internal static string Tone { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Clears { get { @@ -2311,7 +2311,7 @@ internal static string Total_Clears { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Credits_Played { get { @@ -2320,7 +2320,7 @@ internal static string Total_Credits_Played { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Donderful_Combos { get { @@ -2329,7 +2329,7 @@ internal static string Total_Donderful_Combos { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Full_Combos { get { @@ -2338,7 +2338,7 @@ internal static string Total_Full_Combos { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Total_Hits { get { @@ -2347,7 +2347,7 @@ internal static string Total_Hits { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Totals { get { @@ -2356,7 +2356,7 @@ internal static string Totals { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string UI { get { @@ -2365,7 +2365,7 @@ internal static string UI { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Unknown_Access_Code_Error { get { @@ -2374,7 +2374,7 @@ internal static string Unknown_Access_Code_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Unknown_Error { get { @@ -2383,7 +2383,7 @@ internal static string Unknown_Error { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Unregister { get { @@ -2392,7 +2392,7 @@ internal static string Unregister { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Ura_Oni { get { @@ -2401,7 +2401,7 @@ internal static string Ura_Oni { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string UraOni { get { @@ -2410,7 +2410,7 @@ internal static string UraOni { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string User { get { @@ -2419,7 +2419,7 @@ internal static string User { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string User_ID { get { @@ -2428,7 +2428,7 @@ internal static string User_ID { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Users { get { @@ -2437,7 +2437,7 @@ internal static string Users { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Vanish { get { @@ -2446,7 +2446,7 @@ internal static string Vanish { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string View_Play_Data { get { @@ -2455,7 +2455,7 @@ internal static string View_Play_Data { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Voice { get { @@ -2464,7 +2464,7 @@ internal static string Voice { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Wadadon { get { @@ -2473,7 +2473,7 @@ internal static string Wadadon { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Welcome_to_TaikoWebUI_ { get { @@ -2482,7 +2482,7 @@ internal static string Welcome_to_TaikoWebUI_ { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Whimsical { get { @@ -2491,7 +2491,7 @@ internal static string Whimsical { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Wonderfultaiko { get { @@ -2500,7 +2500,7 @@ internal static string Wonderfultaiko { } /// - /// 查找类似 的本地化字符串。 + /// Recherche une chaîne localisée semblable à . /// internal static string Wrap { get { diff --git a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx index b7c50a64..77d72ae3 100644 --- a/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx +++ b/TaikoWebUI/Localization/LocalizationResource.fr-FR.resx @@ -886,7 +886,7 @@ Limite atteinte - Déjà participé + Inscrit Défi de {From} à {To}