student 4 недель назад
Родитель
Сommit
16ccb14b29
19 измененных файлов с 653 добавлено и 223 удалено
  1. 30 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/log4net.config
  2. 279 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.Designer.cs
  3. 94 1
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.resx
  4. 94 1
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.vi.resx
  5. 1 1
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Program.cs
  6. 3 27
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/DailyWinners/Index.cshtml
  7. 4 28
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Guide/Index.cshtml
  8. 11 35
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/History/Index.cshtml
  9. 9 34
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Home/Index.cshtml
  10. 0 24
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Leaderboard/Index.cshtml
  11. 0 24
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/MonthlyWinners/Index.cshtml
  12. 22 23
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Play/Index.cshtml
  13. 43 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Shared/_Layout.cshtml
  14. 0 24
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Winner/Index.cshtml
  15. 2 1
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/_ViewImports.cshtml
  16. 9 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/appsettings.json
  17. 30 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/log4net.config
  18. 11 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/css/all.min.css
  19. 11 0
      Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/css/input.css

+ 30 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Apis/log4net.config

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<log4net>
+	<root>
+		<appender-ref ref="console" />
+		<appender-ref ref="file" />
+	</root>
+	<appender name="console" type="log4net.Appender.ConsoleAppender">
+		<layout type="log4net.Layout.PatternLayout">
+			<conversionPattern value="%date %level - %message%newline" />
+		</layout>
+		<threshold value="ALL" />
+	</appender>
+	<!-- Custom appender: mỗi ngày 1 file + tự xóa, chỉ giữ lại maxNumberOfFiles file gần nhất -->
+	<appender name="file" type="Common.DailyRollingFileAppender, Common">
+		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+		<!-- Thư mục chứa log (phải kết thúc bằng dấu \) -->
+		<file value="../../logs/" />
+		<appendToFile value="true" />
+		<!-- Rolling theo NGÀY: mỗi ngày 1 file riêng, vd 21.05.2026.log -->
+		<rollingStyle value="Date" />
+		<datePattern value="dd.MM.yyyy'.log'" />
+		<staticLogFileName value="false" />
+		<!-- Chỉ giữ 30 file log gần nhất; file cũ hơn sẽ TỰ ĐỘNG bị xóa -->
+		<maxNumberOfFiles value="30" />
+		<layout type="log4net.Layout.PatternLayout">
+			<conversionPattern value="%date [%thread] %level - %message%newline" />
+		</layout>
+		<threshold value="ALL" />
+	</appender>
+</log4net>

+ 279 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.Designer.cs

@@ -60,6 +60,123 @@ namespace Kitty_Fall.Website.Language {
             }
         }
         
+        /// <summary>
+        ///   Looks up a localized string similar to Back.
+        /// </summary>
+        public static string Back {
+            get {
+                return ResourceManager.GetString("Back", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Balanced challenge.
+        /// </summary>
+        public static string BalancedChallenge {
+            get {
+                return ResourceManager.GetString("BalancedChallenge", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Climb to the Leaderboard.
+        /// </summary>
+        public static string ClimbToLeaderboard {
+            get {
+                return ResourceManager.GetString("ClimbToLeaderboard", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Daily Package.
+        /// </summary>
+        public static string DailyPackage {
+            get {
+                return ResourceManager.GetString("DailyPackage", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Easier to complete levels.
+        /// </summary>
+        public static string EasierToCompleteLevels {
+            get {
+                return ResourceManager.GetString("EasierToCompleteLevels", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Easy.
+        /// </summary>
+        public static string Easy {
+            get {
+                return ResourceManager.GetString("Easy", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Fewer obstacles.
+        /// </summary>
+        public static string FewerObstacles {
+            get {
+                return ResourceManager.GetString("FewerObstacles", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to For experienced players.
+        /// </summary>
+        public static string ForExperiencedPlayers {
+            get {
+                return ResourceManager.GetString("ForExperiencedPlayers", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Players can choose the game difficulty level: Easy - Normal - Hard..
+        /// </summary>
+        public static string GameDifficultyLevelGuide {
+            get {
+                return ResourceManager.GetString("GameDifficultyLevelGuide", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Get 5 Turns every day!.
+        /// </summary>
+        public static string GetFiveTurnsEveryDay {
+            get {
+                return ResourceManager.GetString("GetFiveTurnsEveryDay", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Guide.
+        /// </summary>
+        public static string Guide {
+            get {
+                return ResourceManager.GetString("Guide", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Hard.
+        /// </summary>
+        public static string Hard {
+            get {
+                return ResourceManager.GetString("Hard", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Higher score rewards.
+        /// </summary>
+        public static string HigherScoreRewards {
+            get {
+                return ResourceManager.GetString("HigherScoreRewards", resourceCulture);
+            }
+        }
+        
         /// <summary>
         ///   Looks up a localized string similar to History.
         /// </summary>
@@ -77,5 +194,167 @@ namespace Kitty_Fall.Website.Language {
                 return ResourceManager.GetString("Home", resourceCulture);
             }
         }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Leaderboard.
+        /// </summary>
+        public static string Leaderboard {
+            get {
+                return ResourceManager.GetString("Leaderboard", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Maximum to complete levels.
+        /// </summary>
+        public static string MaximumToCompleteLevels {
+            get {
+                return ResourceManager.GetString("MaximumToCompleteLevels", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Medium.
+        /// </summary>
+        public static string Medium {
+            get {
+                return ResourceManager.GetString("Medium", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to mode.
+        /// </summary>
+        public static string Mode {
+            get {
+                return ResourceManager.GetString("Mode", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to More obstacles.
+        /// </summary>
+        public static string MoreObstacles {
+            get {
+                return ResourceManager.GetString("MoreObstacles", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Most challenging levels.
+        /// </summary>
+        public static string MostChallengingLevels {
+            get {
+                return ResourceManager.GetString("MostChallengingLevels", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Play game.
+        /// </summary>
+        public static string PlayGame {
+            get {
+                return ResourceManager.GetString("PlayGame", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Play now.
+        /// </summary>
+        public static string PlayNow {
+            get {
+                return ResourceManager.GetString("PlayNow", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Play Turns.
+        /// </summary>
+        public static string PlayTurns {
+            get {
+                return ResourceManager.GetString("PlayTurns", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Points.
+        /// </summary>
+        public static string Points {
+            get {
+                return ResourceManager.GetString("Points", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Requires better skills.
+        /// </summary>
+        public static string RequiresBetterSkills {
+            get {
+                return ResourceManager.GetString("RequiresBetterSkills", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Rewards.
+        /// </summary>
+        public static string Rewards {
+            get {
+                return ResourceManager.GetString("Rewards", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Select a difficulty level and start your adventure!.
+        /// </summary>
+        public static string SelectDifficultyLevelAndStartAdventure {
+            get {
+                return ResourceManager.GetString("SelectDifficultyLevelAndStartAdventure", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Standard score rewards.
+        /// </summary>
+        public static string StandardScoreRewards {
+            get {
+                return ResourceManager.GetString("StandardScoreRewards", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Subscribe now.
+        /// </summary>
+        public static string SubscribeNow {
+            get {
+                return ResourceManager.GetString("SubscribeNow", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Subscription auto renew daily.
+        /// </summary>
+        public static string SubscriptionAutoRenewDaily {
+            get {
+                return ResourceManager.GetString("SubscriptionAutoRenewDaily", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Suitable for beginners.
+        /// </summary>
+        public static string SuitableForBeginners {
+            get {
+                return ResourceManager.GetString("SuitableForBeginners", resourceCulture);
+            }
+        }
+        
+        /// <summary>
+        ///   Looks up a localized string similar to Winner List.
+        /// </summary>
+        public static string WinnerList {
+            get {
+                return ResourceManager.GetString("WinnerList", resourceCulture);
+            }
+        }
     }
 }

+ 94 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.resx

@@ -123,4 +123,97 @@
   <data name="History" xml:space="preserve">
     <value>History</value>
   </data>
-</root>
+  <data name="WinnerList" xml:space="preserve">
+    <value>Winner List</value>
+  </data>
+  <data name="Leaderboard" xml:space="preserve">
+    <value>Leaderboard</value>
+  </data>
+  <data name="Guide" xml:space="preserve">
+    <value>Guide</value>
+  </data>
+  <data name="Points" xml:space="preserve">
+    <value>Points</value>
+  </data>
+  <data name="PlayTurns" xml:space="preserve">
+    <value>Play Turns</value>
+  </data>
+  <data name="DailyPackage" xml:space="preserve">
+    <value>Daily Package</value>
+  </data>
+  <data name="GetFiveTurnsEveryDay" xml:space="preserve">
+    <value>Get 5 Turns every day!</value>
+  </data>
+  <data name="SubscriptionAutoRenewDaily" xml:space="preserve">
+    <value>Subscription auto renew daily</value>
+  </data>
+  <data name="SubscribeNow" xml:space="preserve">
+    <value>Subscribe now</value>
+  </data>
+  <data name="PlayNow" xml:space="preserve">
+    <value>Play now</value>
+  </data>
+  <data name="SelectDifficultyLevelAndStartAdventure" xml:space="preserve">
+    <value>Select a difficulty level and start your adventure!</value>
+  </data>
+  <data name="Easy" xml:space="preserve">
+    <value>Easy</value>
+  </data>
+  <data name="Medium" xml:space="preserve">
+    <value>Medium</value>
+  </data>
+  <data name="Hard" xml:space="preserve">
+    <value>Hard</value>
+  </data>
+  <data name="SuitableForBeginners" xml:space="preserve">
+    <value>Suitable for beginners</value>
+  </data>
+  <data name="FewerObstacles" xml:space="preserve">
+    <value>Fewer obstacles</value>
+  </data>
+  <data name="EasierToCompleteLevels" xml:space="preserve">
+    <value>Easier to complete levels</value>
+  </data>
+  <data name="StandardScoreRewards" xml:space="preserve">
+    <value>Standard score rewards</value>
+  </data>
+  <data name="BalancedChallenge" xml:space="preserve">
+    <value>Balanced challenge</value>
+  </data>
+  <data name="MoreObstacles" xml:space="preserve">
+    <value>More obstacles</value>
+  </data>
+  <data name="RequiresBetterSkills" xml:space="preserve">
+    <value>Requires better skills</value>
+  </data>
+  <data name="HigherScoreRewards" xml:space="preserve">
+    <value>Higher score rewards</value>
+  </data>
+  <data name="ForExperiencedPlayers" xml:space="preserve">
+    <value>For experienced players</value>
+  </data>
+  <data name="MostChallengingLevels" xml:space="preserve">
+    <value>Most challenging levels</value>
+  </data>
+  <data name="MaximumToCompleteLevels" xml:space="preserve">
+    <value>Maximum to complete levels</value>
+  </data>
+  <data name="ClimbToLeaderboard" xml:space="preserve">
+    <value>Climb to the Leaderboard</value>
+  </data>
+  <data name="Rewards" xml:space="preserve">
+    <value>Rewards</value>
+  </data>
+  <data name="Back" xml:space="preserve">
+    <value>Back</value>
+  </data>
+  <data name="PlayGame" xml:space="preserve">
+    <value>Play game</value>
+  </data>
+  <data name="GameDifficultyLevelGuide" xml:space="preserve">
+    <value>Players can choose the game difficulty level: Easy - Normal - Hard.</value>
+  </data>
+  <data name="Mode" xml:space="preserve">
+    <value>mode</value>
+  </data>
+</root>

+ 94 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Language/Lang.vi.resx

@@ -123,4 +123,97 @@
   <data name="History" xml:space="preserve">
     <value>လက်ခံပြီး</value>
   </data>
-</root>
+  <data name="WinnerList" xml:space="preserve">
+    <value>Winner List</value>
+  </data>
+  <data name="Leaderboard" xml:space="preserve">
+    <value>Leaderboard</value>
+  </data>
+  <data name="Guide" xml:space="preserve">
+    <value>Guide</value>
+  </data>
+  <data name="Points" xml:space="preserve">
+    <value>Points</value>
+  </data>
+  <data name="PlayTurns" xml:space="preserve">
+    <value>Play Turns</value>
+  </data>
+  <data name="DailyPackage" xml:space="preserve">
+    <value>Daily Package</value>
+  </data>
+  <data name="GetFiveTurnsEveryDay" xml:space="preserve">
+    <value>Get 5 Turns every day!</value>
+  </data>
+  <data name="SubscriptionAutoRenewDaily" xml:space="preserve">
+    <value>Subscription auto renew daily</value>
+  </data>
+  <data name="SubscribeNow" xml:space="preserve">
+    <value>Subscribe now</value>
+  </data>
+  <data name="PlayNow" xml:space="preserve">
+    <value>Play now</value>
+  </data>
+  <data name="SelectDifficultyLevelAndStartAdventure" xml:space="preserve">
+    <value>Select a difficulty level and start your adventure!</value>
+  </data>
+  <data name="Easy" xml:space="preserve">
+    <value>Easy</value>
+  </data>
+  <data name="Medium" xml:space="preserve">
+    <value>Medium</value>
+  </data>
+  <data name="Hard" xml:space="preserve">
+    <value>Hard</value>
+  </data>
+  <data name="SuitableForBeginners" xml:space="preserve">
+    <value>Suitable for beginners</value>
+  </data>
+  <data name="FewerObstacles" xml:space="preserve">
+    <value>Fewer obstacles</value>
+  </data>
+  <data name="EasierToCompleteLevels" xml:space="preserve">
+    <value>Easier to complete levels</value>
+  </data>
+  <data name="StandardScoreRewards" xml:space="preserve">
+    <value>Standard score rewards</value>
+  </data>
+  <data name="BalancedChallenge" xml:space="preserve">
+    <value>Balanced challenge</value>
+  </data>
+  <data name="MoreObstacles" xml:space="preserve">
+    <value>More obstacles</value>
+  </data>
+  <data name="RequiresBetterSkills" xml:space="preserve">
+    <value>Requires better skills</value>
+  </data>
+  <data name="HigherScoreRewards" xml:space="preserve">
+    <value>Higher score rewards</value>
+  </data>
+  <data name="ForExperiencedPlayers" xml:space="preserve">
+    <value>For experienced players</value>
+  </data>
+  <data name="MostChallengingLevels" xml:space="preserve">
+    <value>Most challenging levels</value>
+  </data>
+  <data name="MaximumToCompleteLevels" xml:space="preserve">
+    <value>Maximum to complete levels</value>
+  </data>
+  <data name="ClimbToLeaderboard" xml:space="preserve">
+    <value>Climb to the Leaderboard</value>
+  </data>
+  <data name="Rewards" xml:space="preserve">
+    <value>Rewards</value>
+  </data>
+  <data name="Back" xml:space="preserve">
+    <value>Back</value>
+  </data>
+  <data name="PlayGame" xml:space="preserve">
+    <value>Play game</value>
+  </data>
+  <data name="GameDifficultyLevelGuide" xml:space="preserve">
+    <value>Players can choose the game difficulty level: Easy - Normal - Hard.</value>
+  </data>
+  <data name="Mode" xml:space="preserve">
+    <value>mode</value>
+  </data>
+</root>

+ 1 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Program.cs

@@ -21,7 +21,7 @@ builder.Services.AddSession(options =>
     options.IdleTimeout = TimeSpan.FromMinutes(15);
     options.Cookie.HttpOnly = true;
     options.Cookie.IsEssential = true;
-    options.Cookie.Name = "MyJob.Website.Session";
+    options.Cookie.Name = "Kitty_Fall.Website.Session";
 });
 
 builder.Services.Configure<RequestLocalizationOptions>(options =>

+ 3 - 27
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/DailyWinners/Index.cshtml

@@ -63,7 +63,7 @@
                             <span>2</span>
                             <span>0123 456 780</span>
                             <span>08:30:15</span>
-                            <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>Points</small></strong>
+                            <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>@Lang.Points</small></strong>
                         </div>
                         <div class="daily-row">
                             <span>3</span>
@@ -93,13 +93,13 @@
                             <span>7</span>
                             <span>0123 456 780</span>
                             <span>08:30:15</span>
-                            <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>Points</small></strong>
+                            <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>@Lang.Points</small></strong>
                         </div>
                         <div class="daily-row">
                             <span>8</span>
                             <span>0123 456 780</span>
                             <span>08:30:15</span>
-                            <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>150</b><small>Points</small></strong>
+                            <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>150</b><small>@Lang.Points</small></strong>
                         </div>
                     </div>
                 </div>
@@ -107,30 +107,6 @@
         </div>
     </section>
 
-    <nav class="bottom-nav-shell scale-floor" data-scale-floor="368" data-scale-height="60" data-scale-var="--bottom-nav-height" aria-label="Main navigation">
-        <div class="bottom-nav scale-floor-inner">
-            <a href="/">
-                <img src="~/kitty/assets/kitty-fall/nav-home.png" alt="">
-                <span>Home</span>
-            </a>
-            <a class="active" href="/Winner">
-                <img src="~/kitty/assets/kitty-fall/nav-winner.png" alt="">
-                <span>Winner List</span>
-            </a>
-            <a href="/Leaderboard">
-                <img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt="">
-                <span>Leaderboard</span>
-            </a>
-            <a href="/History">
-                <img src="~/kitty/assets/kitty-fall/nav-history.png" alt="">
-                <span>History</span>
-            </a>
-            <a href="/Guide">
-                <img src="~/kitty/assets/kitty-fall/nav-guide.png" alt="">
-                <span>Guide</span>
-            </a>
-        </div>
-    </nav>
 </main>
 
 

+ 4 - 28
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Guide/Index.cshtml

@@ -59,7 +59,7 @@
 
                 <section class="guide-section">
                     <h2><b>3</b><span>Game Overview</span></h2>
-                    <p>Players can choose the game difficulty level: Easy - Normal - Hard.</p>
+                    <p>@Lang.GameDifficultyLevelGuide</p>
                     <p>Each mode consists of 50 levels, with differences in gameplay time, scoring, and rewards at each level.</p>
                     <p>The game includes a total of 50 levels with increasing difficulty, allowing players to progressively experience and challenge themselves.</p>
                     <p>As players progress and complete each level, they can earn reward points, and at key milestones, they will receive direct rewards from the service.</p>
@@ -69,7 +69,7 @@
                     <h3>Level - Score - Time - Reward Table</h3>
                     <div class="guide-table-wrap">
                         <table class="guide-table">
-                            <caption>Easy mode</caption>
+                            <caption>@Lang.Easy @Lang.Mode</caption>
                             <thead>
                                 <tr><th>Level</th><th>Score</th><th>Time</th><th>Reward</th></tr>
                             </thead>
@@ -92,7 +92,7 @@
 
                     <div class="guide-table-wrap">
                         <table class="guide-table is-compact">
-                            <caption>Medium mode</caption>
+                            <caption>@Lang.Medium @Lang.Mode</caption>
                             <thead>
                                 <tr><th>Level</th><th>Score</th><th>Time</th><th>Reward</th></tr>
                             </thead>
@@ -105,7 +105,7 @@
 
                     <div class="guide-table-wrap">
                         <table class="guide-table is-compact">
-                            <caption>Hard mode</caption>
+                            <caption>@Lang.Hard @Lang.Mode</caption>
                             <thead>
                                 <tr><th>Level</th><th>Score</th><th>Time</th><th>Reward</th></tr>
                             </thead>
@@ -171,30 +171,6 @@
         </article>
     </section>
 
-    <nav class="bottom-nav-shell scale-floor" data-scale-floor="368" data-scale-height="60" data-scale-var="--bottom-nav-height" aria-label="Main navigation">
-        <div class="bottom-nav scale-floor-inner">
-            <a href="/">
-                <img src="~/kitty/assets/kitty-fall/nav-home.png" alt="">
-                <span>Home</span>
-            </a>
-            <a href="/Winner">
-                <img src="~/kitty/assets/kitty-fall/nav-winner.png" alt="">
-                <span>Winner List</span>
-            </a>
-            <a href="/Leaderboard">
-                <img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt="">
-                <span>Leaderboard</span>
-            </a>
-            <a href="/History">
-                <img src="~/kitty/assets/kitty-fall/nav-history.png" alt="">
-                <span>History</span>
-            </a>
-            <a class="active" href="/Guide">
-                <img src="~/kitty/assets/kitty-fall/nav-guide.png" alt="">
-                <span>Guide</span>
-            </a>
-        </div>
-    </nav>
 </main>
 
 

+ 11 - 35
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/History/Index.cshtml

@@ -66,51 +66,51 @@
                         <div class="history-table-body">
                             <div class="history-row">
                                 <span><b>25/06/2026</b><small>20:30:45</small></span>
-                                <span><b>Play game</b><small class="is-hard">Hard</small></span>
+                                <span><b>@Lang.PlayGame</b><small class="is-hard">@Lang.Hard</small></span>
                                 <span>Passed level 78</span>
                                 <strong class="reward-pill is-data"><img src="~/kitty/assets/kitty-fall/icon-data.png" alt=""><b>500</b><small>MB 5G</small></strong>
                             </div>
                             <div class="history-row">
                                 <span><b>25/06/2026</b><small>20:30:45</small></span>
-                                <span><b>Play game</b><small class="is-medium">medium</small></span>
+                                <span><b>@Lang.PlayGame</b><small class="is-medium">@Lang.Medium</small></span>
                                 <span>Passed level 78</span>
-                                <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>Points</small></strong>
+                                <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>@Lang.Points</small></strong>
                             </div>
                             <div class="history-row">
                                 <span><b>25/06/2026</b><small>20:30:45</small></span>
-                                <span><b>Play game</b><small class="is-easy">Easy</small></span>
+                                <span><b>@Lang.PlayGame</b><small class="is-easy">@Lang.Easy</small></span>
                                 <span>Passed level 78</span>
                                 <strong class="reward-pill is-score"><img src="~/kitty/assets/kitty-fall/nav-winner.png" alt=""><b>250</b><small>Scores</small></strong>
                             </div>
                             <div class="history-row">
                                 <span><b>25/06/2026</b><small>20:30:45</small></span>
-                                <span><b>Play game</b><small class="is-hard">Hard</small></span>
+                                <span><b>@Lang.PlayGame</b><small class="is-hard">@Lang.Hard</small></span>
                                 <span>Passed level 78</span>
                                 <strong class="reward-pill is-data"><img src="~/kitty/assets/kitty-fall/icon-data.png" alt=""><b>500</b><small>MB 5G</small></strong>
                             </div>
                             <div class="history-row">
                                 <span><b>25/06/2026</b><small>20:30:45</small></span>
-                                <span><b>Play game</b><small class="is-medium">medium</small></span>
+                                <span><b>@Lang.PlayGame</b><small class="is-medium">@Lang.Medium</small></span>
                                 <span>Passed level 78</span>
-                                <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>Points</small></strong>
+                                <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>@Lang.Points</small></strong>
                             </div>
                             <div class="history-row">
                                 <span><b>25/06/2026</b><small>20:30:45</small></span>
-                                <span><b>Play game</b><small class="is-easy">Easy</small></span>
+                                <span><b>@Lang.PlayGame</b><small class="is-easy">@Lang.Easy</small></span>
                                 <span>Passed level 78</span>
                                 <strong class="reward-pill is-score"><img src="~/kitty/assets/kitty-fall/nav-winner.png" alt=""><b>250</b><small>Scores</small></strong>
                             </div>
                             <div class="history-row">
                                 <span><b>25/06/2026</b><small>20:30:45</small></span>
-                                <span><b>Play game</b><small class="is-hard">Hard</small></span>
+                                <span><b>@Lang.PlayGame</b><small class="is-hard">@Lang.Hard</small></span>
                                 <span>Passed level 78</span>
                                 <strong class="reward-pill is-data"><img src="~/kitty/assets/kitty-fall/icon-data.png" alt=""><b>500</b><small>MB 5G</small></strong>
                             </div>
                             <div class="history-row">
                                 <span><b>25/06/2026</b><small>20:30:45</small></span>
-                                <span><b>Play game</b><small class="is-medium">medium</small></span>
+                                <span><b>@Lang.PlayGame</b><small class="is-medium">@Lang.Medium</small></span>
                                 <span>Passed level 78</span>
-                                <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>Points</small></strong>
+                                <strong class="reward-pill is-points"><img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt=""><b>100</b><small>@Lang.Points</small></strong>
                             </div>
                         </div>
                     </div>
@@ -131,30 +131,6 @@
         </div>
     </section>
 
-    <nav class="bottom-nav-shell scale-floor" data-scale-floor="368" data-scale-height="60" data-scale-var="--bottom-nav-height" aria-label="Main navigation">
-        <div class="bottom-nav scale-floor-inner">
-            <a href="/">
-                <img src="~/kitty/assets/kitty-fall/nav-home.png" alt="">
-                <span>Home</span>
-            </a>
-            <a href="/Winner">
-                <img src="~/kitty/assets/kitty-fall/nav-winner.png" alt="">
-                <span>Winner List</span>
-            </a>
-            <a href="/Leaderboard">
-                <img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt="">
-                <span>Leaderboard</span>
-            </a>
-            <a class="active" href="/History">
-                <img src="~/kitty/assets/kitty-fall/nav-history.png" alt="">
-                <span>History</span>
-            </a>
-            <a href="/Guide">
-                <img src="~/kitty/assets/kitty-fall/nav-guide.png" alt="">
-                <span>Guide</span>
-            </a>
-        </div>
-    </nav>
 </main>
 
 

+ 9 - 34
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Home/Index.cshtml

@@ -26,7 +26,7 @@
             <div class="stat-item">
                 <img class="stat-icon coin" src="~/kitty/assets/kitty-fall/coin.png" alt="">
                 <div>
-                    <p>Points</p>
+                    <p>@Lang.Points</p>
                     <strong class="points">2,450</strong>
                 </div>
             </div>
@@ -34,7 +34,7 @@
             <div class="stat-item">
                 <img class="stat-icon ticket" src="~/kitty/assets/kitty-fall/ticket.png" alt="">
                 <div>
-                    <p>Play Turns</p>
+                    <p>@Lang.PlayTurns</p>
                     <strong class="turns">24</strong>
                 </div>
             </div>
@@ -46,55 +46,30 @@
         <img class="kitty-cat" src="~/kitty/assets/kitty-fall/cat.png" alt="Smiling kitten">
     </section>
 
-    <a class="play-button home-screen" href="/Play" aria-label="Play now">
+    <a class="play-button home-screen" href="/Play" aria-label="@Lang.PlayNow">
         <span class="play-icon">
             <img src="~/kitty/assets/kitty-fall/play-icon.svg" alt="">
         </span>
-        <span>Play now</span>
+        <span>@Lang.PlayNow</span>
     </a>
 
-    <section class="package-shell home-screen scale-floor" data-scale-floor="368" data-scale-height="100" data-scale-keep-height="true" aria-label="Daily package">
+    <section class="package-shell home-screen scale-floor" data-scale-floor="368" data-scale-height="100" data-scale-keep-height="true" aria-label="@Lang.DailyPackage">
         <div class="package-card scale-floor-inner">
             <img class="package-icon" src="~/kitty/assets/kitty-fall/gift.png" alt="">
             <div class="package-copy">
                 <div class="package-title">
-                    <h2>Daily Package</h2>
+                    <h2>@Lang.DailyPackage</h2>
                 </div>
-                <p>Get 5 Turns every day!</p>
-                <p>Subscription auto renew daily</p>
+                <p>@Lang.GetFiveTurnsEveryDay</p>
+                <p>@Lang.SubscriptionAutoRenewDaily</p>
             </div>
             <div class="package-action">
                 <p><strong>179</strong> MMK/Day</p>
-                <button class="subscribe-trigger" type="button" data-open-subscription>Subscribe now</button>
+                <button class="subscribe-trigger" type="button" data-open-subscription>@Lang.SubscribeNow</button>
             </div>
         </div>
     </section>
 
-    <nav class="bottom-nav-shell home-screen scale-floor" data-scale-floor="368" data-scale-height="60" data-scale-var="--bottom-nav-height" aria-label="Main navigation">
-        <div class="bottom-nav scale-floor-inner">
-            <a class="active" href="#">
-                <img src="~/kitty/assets/kitty-fall/nav-home.png" alt="">
-                <span>Home</span>
-            </a>
-            <a href="/Winner">
-                <img src="~/kitty/assets/kitty-fall/nav-winner.png" alt="">
-                <span>Winner List</span>
-            </a>
-            <a href="/Leaderboard">
-                <img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt="">
-                <span>Leaderboard</span>
-            </a>
-            <a href="/History">
-                <img src="~/kitty/assets/kitty-fall/nav-history.png" alt="">
-                <span>History</span>
-            </a>
-            <a href="/Guide">
-                <img src="~/kitty/assets/kitty-fall/nav-guide.png" alt="">
-                <span>Guide</span>
-            </a>
-        </div>
-    </nav>
-
     <div class="subscription-modal" data-subscription-modal aria-hidden="true">
         <button class="subscription-backdrop" type="button" data-close-subscription aria-label="Dismiss subscription confirmation"></button>
         <section class="confirm-dialog-shell scale-floor modal-panel is-active" data-modal-panel="confirm" data-scale-floor="361" data-scale-height="540" role="dialog" aria-modal="true" aria-label="Confirm subscription">

+ 0 - 24
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Leaderboard/Index.cshtml

@@ -85,30 +85,6 @@
         </div>
     </section>
 
-    <nav class="bottom-nav-shell scale-floor" data-scale-floor="368" data-scale-height="60" data-scale-var="--bottom-nav-height" aria-label="Main navigation">
-        <div class="bottom-nav scale-floor-inner">
-            <a href="/">
-                <img src="~/kitty/assets/kitty-fall/nav-home.png" alt="">
-                <span>Home</span>
-            </a>
-            <a href="/Winner">
-                <img src="~/kitty/assets/kitty-fall/nav-winner.png" alt="">
-                <span>Winner List</span>
-            </a>
-            <a class="active" href="/Leaderboard">
-                <img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt="">
-                <span>Leaderboard</span>
-            </a>
-            <a href="/History">
-                <img src="~/kitty/assets/kitty-fall/nav-history.png" alt="">
-                <span>History</span>
-            </a>
-            <a href="/Guide">
-                <img src="~/kitty/assets/kitty-fall/nav-guide.png" alt="">
-                <span>Guide</span>
-            </a>
-        </div>
-    </nav>
 </main>
 
 

+ 0 - 24
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/MonthlyWinners/Index.cshtml

@@ -74,30 +74,6 @@
         </div>
     </section>
 
-    <nav class="bottom-nav-shell scale-floor" data-scale-floor="368" data-scale-height="60" data-scale-var="--bottom-nav-height" aria-label="Main navigation">
-        <div class="bottom-nav scale-floor-inner">
-            <a href="/">
-                <img src="~/kitty/assets/kitty-fall/nav-home.png" alt="">
-                <span>Home</span>
-            </a>
-            <a class="active" href="/Winner">
-                <img src="~/kitty/assets/kitty-fall/nav-winner.png" alt="">
-                <span>Winner List</span>
-            </a>
-            <a href="/Leaderboard">
-                <img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt="">
-                <span>Leaderboard</span>
-            </a>
-            <a href="/History">
-                <img src="~/kitty/assets/kitty-fall/nav-history.png" alt="">
-                <span>History</span>
-            </a>
-            <a href="/Guide">
-                <img src="~/kitty/assets/kitty-fall/nav-guide.png" alt="">
-                <span>Guide</span>
-            </a>
-        </div>
-    </nav>
 </main>
 
 

+ 22 - 23
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Play/Index.cshtml

@@ -36,7 +36,7 @@
         <div class="challenge-content">
             <img class="challenge-title" src="~/kitty/assets/kitty-fall/challenge-title.png" alt="Choose your challenge">
 
-            <p class="challenge-hint">Select a difficulty level and start your adventure!</p>
+            <p class="challenge-hint">@Lang.SelectDifficultyLevelAndStartAdventure</p>
 
             <div class="level-list">
                 <button class="level-card is-easy" type="button" data-level="easy">
@@ -44,12 +44,12 @@
                         <img src="~/kitty/assets/kitty-fall/cat.png" alt="">
                     </span>
                     <span class="level-copy">
-                        <strong><span class="level-paw" aria-hidden="true"></span>Easy</strong>
-                        <span>Suitable for beginners</span>
-                        <span>Fewer obstacles</span>
-                        <span>Easier to complete levels</span>
-                        <span>Standard score rewards</span>
-                        <em>Rewards: <b>+10-50</b> Points</em>
+                        <strong><span class="level-paw" aria-hidden="true"></span>@Lang.Easy</strong>
+                        <span>@Lang.SuitableForBeginners</span>
+                        <span>@Lang.FewerObstacles</span>
+                        <span>@Lang.EasierToCompleteLevels</span>
+                        <span>@Lang.StandardScoreRewards</span>
+                        <em>@Lang.Rewards: <b>+10-50</b> @Lang.Points</em>
                     </span>
                 </button>
 
@@ -58,12 +58,12 @@
                         <img src="~/kitty/assets/kitty-fall/cat.png" alt="">
                     </span>
                     <span class="level-copy">
-                        <strong><span class="level-paw" aria-hidden="true"></span>Medium</strong>
-                        <span>Balanced challenge</span>
-                        <span>More obstacles</span>
-                        <span>Requires better skills</span>
-                        <span>Higher score rewards</span>
-                        <em>Rewards: <b>+20-100</b> Points</em>
+                        <strong><span class="level-paw" aria-hidden="true"></span>@Lang.Medium</strong>
+                        <span>@Lang.BalancedChallenge</span>
+                        <span>@Lang.MoreObstacles</span>
+                        <span>@Lang.RequiresBetterSkills</span>
+                        <span>@Lang.HigherScoreRewards</span>
+                        <em>@Lang.Rewards: <b>+20-100</b> @Lang.Points</em>
                     </span>
                 </button>
 
@@ -72,12 +72,12 @@
                         <img src="~/kitty/assets/kitty-fall/cat.png" alt="">
                     </span>
                     <span class="level-copy">
-                        <strong><span class="level-paw" aria-hidden="true"></span>Hard</strong>
-                        <span>For experienced players</span>
-                        <span>Most challenging levels</span>
-                        <span>Maximum to complete levels</span>
-                        <span>Climb to the Leaderboard</span>
-                        <em>Rewards: <b>+100-200</b> Points</em>
+                        <strong><span class="level-paw" aria-hidden="true"></span>@Lang.Hard</strong>
+                        <span>@Lang.ForExperiencedPlayers</span>
+                        <span>@Lang.MostChallengingLevels</span>
+                        <span>@Lang.MaximumToCompleteLevels</span>
+                        <span>@Lang.ClimbToLeaderboard</span>
+                        <em>@Lang.Rewards: <b>+100-200</b> @Lang.Points</em>
                     </span>
                 </button>
             </div>
@@ -87,15 +87,14 @@
 
     <div class="play-action-bar">
         <a class="play-back-button" href="/">
-            <span aria-hidden="true">←</span>
-            <strong>Back</strong>
+            <span aria-hidden="true"></span>
+            <strong>@Lang.Back</strong>
         </a>
         <button class="play-start-button" type="button">
             <span class="play-icon">
                 <img src="~/kitty/assets/kitty-fall/play-icon.svg" alt="">
             </span>
-            <strong>Play now</strong>
+            <strong>@Lang.PlayNow</strong>
         </button>
     </div>
 </main>
-

+ 43 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Shared/_Layout.cshtml

@@ -1,3 +1,4 @@
+@using Kitty_Fall.Website.Language
 <!DOCTYPE html>
 <html lang="en">
 <head>
@@ -8,8 +9,50 @@
     <link rel="stylesheet" href="~/kitty/css/all.min.css" asp-append-version="true" />
 </head>
 <body>
+@{
+    var controller = ViewContext.RouteData.Values["controller"]?.ToString() ?? "";
+    var isHome = string.Equals(controller, "Home", StringComparison.OrdinalIgnoreCase);
+    var isWinner = string.Equals(controller, "Winner", StringComparison.OrdinalIgnoreCase)
+        || string.Equals(controller, "DailyWinners", StringComparison.OrdinalIgnoreCase)
+        || string.Equals(controller, "MonthlyWinners", StringComparison.OrdinalIgnoreCase);
+    var isLeaderboard = string.Equals(controller, "Leaderboard", StringComparison.OrdinalIgnoreCase);
+    var isHistory = string.Equals(controller, "History", StringComparison.OrdinalIgnoreCase);
+    var isGuide = string.Equals(controller, "Guide", StringComparison.OrdinalIgnoreCase);
+    var showBottomNav = isHome || isWinner || isLeaderboard || isHistory || isGuide;
+    var navShellClass = isHome
+        ? "bottom-nav-shell home-screen scale-floor"
+        : "bottom-nav-shell scale-floor";
+}
     @RenderBody()
 
+    @if (showBottomNav)
+    {
+        <nav class="@navShellClass" data-scale-floor="368" data-scale-height="60" data-scale-var="--bottom-nav-height" aria-label="Main navigation">
+            <div class="bottom-nav scale-floor-inner">
+                <a class="@(isHome ? "active" : null)" href="/">
+                    <img src="~/kitty/assets/kitty-fall/nav-home.png" alt="">
+                    <span>@Lang.Home</span>
+                </a>
+                <a class="@(isWinner ? "active" : null)" href="/Winner">
+                    <img src="~/kitty/assets/kitty-fall/nav-winner.png" alt="">
+                    <span>@Lang.WinnerList</span>
+                </a>
+                <a class="@(isLeaderboard ? "active" : null)" href="/Leaderboard">
+                    <img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt="">
+                    <span>@Lang.Leaderboard</span>
+                </a>
+                <a class="@(isHistory ? "active" : null)" href="/History">
+                    <img src="~/kitty/assets/kitty-fall/nav-history.png" alt="">
+                    <span>@Lang.History</span>
+                </a>
+                <a class="@(isGuide ? "active" : null)" href="/Guide">
+                    <img src="~/kitty/assets/kitty-fall/nav-guide.png" alt="">
+                    <span>@Lang.Guide</span>
+                </a>
+            </div>
+        </nav>
+    }
+
     <script src="~/kitty/lib/jquery/jquery.min.js" asp-append-version="true"></script>
     <script src="~/kitty/js/all.min.js" asp-append-version="true"></script>
     @await RenderSectionAsync("Scripts", required: false)

+ 0 - 24
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/Winner/Index.cshtml

@@ -65,30 +65,6 @@
         </div>
     </section>
 
-    <nav class="bottom-nav-shell scale-floor" data-scale-floor="368" data-scale-height="60" data-scale-var="--bottom-nav-height" aria-label="Main navigation">
-        <div class="bottom-nav scale-floor-inner">
-            <a href="/">
-                <img src="~/kitty/assets/kitty-fall/nav-home.png" alt="">
-                <span>Home</span>
-            </a>
-            <a class="active" href="/Winner">
-                <img src="~/kitty/assets/kitty-fall/nav-winner.png" alt="">
-                <span>Winner List</span>
-            </a>
-            <a href="/Leaderboard">
-                <img src="~/kitty/assets/kitty-fall/nav-leaderboard.png" alt="">
-                <span>Leaderboard</span>
-            </a>
-            <a href="/History">
-                <img src="~/kitty/assets/kitty-fall/nav-history.png" alt="">
-                <span>History</span>
-            </a>
-            <a href="/Guide">
-                <img src="~/kitty/assets/kitty-fall/nav-guide.png" alt="">
-                <span>Guide</span>
-            </a>
-        </div>
-    </nav>
 </main>
 
 

+ 2 - 1
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/Views/_ViewImports.cshtml

@@ -1,3 +1,4 @@
-@using Kitty_Fall.Website
+@using Kitty_Fall.Website
 @using Kitty_Fall.Website.Models
+@using Kitty_Fall.Website.Language
 @addTagHelper *, Microsoft.AspNetCore.Mvc.TagHelpers

+ 9 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/appsettings.json

@@ -1,9 +1,18 @@
 {
+  "url": "http://127.0.0.1:8309",
+  "CountryCode": "95",
   "Logging": {
     "LogLevel": {
       "Default": "Information",
       "Microsoft.AspNetCore": "Warning"
     }
   },
+  "Jwt": {
+    "Key": "UDOFCY9/U/82TPHl5UddrOB9NqdP+1ulDFkSCKyn20Qwx7jjRQcrAekm2fX+MSD2u5HjGFNWXPlVkh98viqpD4B6ZgI5Zg6fno65xX43GYo=",
+    "Issuer": "InventoryAuthenticationServer",
+    "Audience": "InventoryServiceAppClient",
+    "Subject": "InventoryServiceAccessToken",
+    "Time": "1000000"
+  },
   "AllowedHosts": "*"
 }

+ 30 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/log4net.config

@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<log4net>
+	<root>
+		<appender-ref ref="console" />
+		<appender-ref ref="file" />
+	</root>
+	<appender name="console" type="log4net.Appender.ConsoleAppender">
+		<layout type="log4net.Layout.PatternLayout">
+			<conversionPattern value="%date %level - %message%newline" />
+		</layout>
+		<threshold value="ALL" />
+	</appender>
+	<!-- Custom appender: mỗi ngày 1 file + tự xóa, chỉ giữ lại maxNumberOfFiles file gần nhất -->
+	<appender name="file" type="Common.DailyRollingFileAppender, Common">
+		<lockingModel type="log4net.Appender.FileAppender+MinimalLock" />
+		<!-- Thư mục chứa log (phải kết thúc bằng dấu \) -->
+		<file value="../../logs/" />
+		<appendToFile value="true" />
+		<!-- Rolling theo NGÀY: mỗi ngày 1 file riêng, vd 21.05.2026.log -->
+		<rollingStyle value="Date" />
+		<datePattern value="dd.MM.yyyy'.log'" />
+		<staticLogFileName value="false" />
+		<!-- Chỉ giữ 30 file log gần nhất; file cũ hơn sẽ TỰ ĐỘNG bị xóa -->
+		<maxNumberOfFiles value="30" />
+		<layout type="log4net.Layout.PatternLayout">
+			<conversionPattern value="%date [%thread] %level - %message%newline" />
+		</layout>
+		<threshold value="ALL" />
+	</appender>
+</log4net>

+ 11 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/css/all.min.css

@@ -1063,6 +1063,17 @@ button {
   overflow: visible;
 }
 
+@media (min-width: 501px) {
+  .bottom-nav-shell {
+    position: fixed;
+    left: 50%;
+    right: auto;
+    bottom: 16px;
+    width: calc(var(--screen-width) - 32px);
+    transform: translateX(-50%);
+  }
+}
+
 .scale-floor {
   --scale-floor-width: 368px;
   --scale-floor-scale: 1;

+ 11 - 0
Kitty_Fall/Kitty_Fall/Kitty_Fall.Website/wwwroot/kitty/css/input.css

@@ -471,6 +471,17 @@ button {
     overflow: visible;
 }
 
+@media (min-width: 501px) {
+    .bottom-nav-shell {
+        position: fixed;
+        left: 50%;
+        right: auto;
+        bottom: 16px;
+        width: calc(var(--screen-width) - 32px);
+        transform: translateX(-50%);
+    }
+}
+
 .scale-floor {
     --scale-floor-width: 368px;
     --scale-floor-scale: 1;