BrettonYe 3 mēneši atpakaļ
vecāks
revīzija
e205860f05
71 mainītis faili ar 2319 papildinājumiem un 2179 dzēšanām
  1. 1 1
      app/Console/Commands/AutoClearLogs.php
  2. 1 1
      app/Console/Commands/TaskMonthly.php
  3. 1 1
      app/Http/Controllers/Admin/PermissionController.php
  4. 1 1
      app/Http/Controllers/Admin/RuleController.php
  5. 1 1
      app/Http/Controllers/Admin/SystemController.php
  6. 2 2
      app/Http/Controllers/AuthController.php
  7. 5 3
      app/Http/Controllers/User/AffiliateController.php
  8. 5 3
      app/Http/Controllers/User/InviteController.php
  9. 1 1
      app/Notifications/TicketCreated.php
  10. 1 1
      app/Notifications/TicketReplied.php
  11. 12 12
      database/seeders/ConfigSeeder.php
  12. 391 452
      resources/lang/en/admin.php
  13. 22 22
      resources/lang/en/auth.php
  14. 23 24
      resources/lang/en/common.php
  15. 19 19
      resources/lang/en/errors.php
  16. 240 107
      resources/lang/en/model.php
  17. 1 1
      resources/lang/en/notification.php
  18. 168 165
      resources/lang/en/user.php
  19. 334 424
      resources/lang/zh_CN/admin.php
  20. 23 23
      resources/lang/zh_CN/auth.php
  21. 25 26
      resources/lang/zh_CN/common.php
  22. 20 20
      resources/lang/zh_CN/errors.php
  23. 185 52
      resources/lang/zh_CN/model.php
  24. 3 3
      resources/lang/zh_CN/notification.php
  25. 126 123
      resources/lang/zh_CN/user.php
  26. 22 22
      resources/views/admin/aff/index.blade.php
  27. 2 2
      resources/views/admin/aff/rebate.blade.php
  28. 19 19
      resources/views/admin/article/index.blade.php
  29. 62 61
      resources/views/admin/article/marketing.blade.php
  30. 1 1
      resources/views/admin/article/show.blade.php
  31. 196 196
      resources/views/admin/config/common.blade.php
  32. 22 21
      resources/views/admin/config/emailFilter.blade.php
  33. 59 50
      resources/views/admin/config/system.blade.php
  34. 14 14
      resources/views/admin/coupon/index.blade.php
  35. 2 2
      resources/views/admin/logs/callback.blade.php
  36. 2 2
      resources/views/admin/logs/notification.blade.php
  37. 2 2
      resources/views/admin/logs/onlineIPMonitor.blade.php
  38. 5 3
      resources/views/admin/logs/order.blade.php
  39. 8 6
      resources/views/admin/logs/traffic.blade.php
  40. 3 3
      resources/views/admin/logs/userBanHistory.blade.php
  41. 1 1
      resources/views/admin/logs/userCreditHistory.blade.php
  42. 1 1
      resources/views/admin/logs/userOnlineIP.blade.php
  43. 1 1
      resources/views/admin/logs/userTraffic.blade.php
  44. 25 25
      resources/views/admin/node/auth.blade.php
  45. 10 10
      resources/views/admin/node/cert/index.blade.php
  46. 10 10
      resources/views/admin/permission/index.blade.php
  47. 10 10
      resources/views/admin/role/index.blade.php
  48. 10 10
      resources/views/admin/rule/group/index.blade.php
  49. 40 40
      resources/views/admin/rule/index.blade.php
  50. 9 9
      resources/views/admin/rule/log.blade.php
  51. 12 12
      resources/views/admin/shop/index.blade.php
  52. 8 8
      resources/views/admin/subscribe/log.blade.php
  53. 27 27
      resources/views/admin/ticket/index.blade.php
  54. 22 22
      resources/views/admin/tools/analysis.blade.php
  55. 20 20
      resources/views/admin/tools/convert.blade.php
  56. 13 13
      resources/views/admin/tools/decompile.blade.php
  57. 10 10
      resources/views/admin/user/group/index.blade.php
  58. 1 1
      resources/views/admin/user/oauth.blade.php
  59. 1 1
      resources/views/auth/resetPassword.blade.php
  60. 1 1
      resources/views/components/system/input-file.blade.php
  61. 2 2
      resources/views/components/system/input-limit.blade.php
  62. 1 1
      resources/views/components/system/input.blade.php
  63. 1 1
      resources/views/components/system/select.blade.php
  64. 1 1
      resources/views/components/system/switch.blade.php
  65. 3 3
      resources/views/components/system/task-group.blade.php
  66. 2 2
      resources/views/components/system/textarea.blade.php
  67. 1 1
      resources/views/user/index.blade.php
  68. 15 14
      resources/views/user/invite.blade.php
  69. 1 1
      resources/views/user/invoices.blade.php
  70. 3 3
      resources/views/user/knowledge.blade.php
  71. 27 26
      resources/views/user/referral.blade.php

+ 1 - 1
app/Console/Commands/AutoClearLogs.php

@@ -61,7 +61,7 @@ class AutoClearLogs extends Command
 
             UserDataFlowLog::where('log_time', '<=', strtotime(sysConfig('tasks_clean.traffic_logs')))->delete(); // 清除用户流量日志
         } catch (Exception $e) {
-            Log::emergency(trans('common.error_item', ['attribute' => trans('admin.system.is_clear_log')]).': '.$e->getMessage());
+            Log::emergency(trans('common.error_item', ['attribute' => trans('model.config.is_clear_log')]).': '.$e->getMessage());
         }
     }
 }

+ 1 - 1
app/Console/Commands/TaskMonthly.php

@@ -52,7 +52,7 @@ class TaskMonthly extends Command
 
             Order::whereStatus(-1)->where('created_at', '<=', date('Y-m-d H:i:s', strtotime(sysConfig('tasks_clean.unpaid_orders'))))->delete(); // 清理用户未支付订单
         } catch (Exception $e) {
-            Log::emergency(trans('common.error_item', ['attribute' => trans('admin.system.is_clear_log')]).': '.$e->getMessage());
+            Log::emergency(trans('common.error_item', ['attribute' => trans('model.config.is_clear_log')]).': '.$e->getMessage());
         }
     }
 }

+ 1 - 1
app/Http/Controllers/Admin/PermissionController.php

@@ -62,7 +62,7 @@ class PermissionController extends Controller
                 return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]);
             }
         } catch (Exception $e) {
-            Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('admin.logs.rule.title')]).': '.$e->getMessage());
+            Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.permission.attribute')]).': '.$e->getMessage());
 
             return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]);
         }

+ 1 - 1
app/Http/Controllers/Admin/RuleController.php

@@ -88,7 +88,7 @@ class RuleController extends Controller
         try {
             $ret = RuleLog::query()->delete();
         } catch (Exception $e) {
-            Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('admin.logs.rule.title')]).': '.$e->getMessage());
+            Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.rule.logs')]).': '.$e->getMessage());
 
             return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]);
         }

+ 1 - 1
app/Http/Controllers/Admin/SystemController.php

@@ -63,7 +63,7 @@ class SystemController extends Controller
             'configs' => $config,
             'payments' => PaymentManager::getAvailable(),
             'paymentForms' => $paymentForms,
-            'paymentTabs' => array_keys($paymentForms),
+            'paymentTabs' => [...array_keys($paymentForms), 'manual'],
             'paymentLists' => [
                 'ali' => PaymentManager::getPaymentsByMethod('ali'),
                 'wechat' => PaymentManager::getPaymentsByMethod('wechat'),

+ 2 - 2
app/Http/Controllers/AuthController.php

@@ -365,7 +365,7 @@ class AuthController extends Controller
 
             // 是否开启重设密码
             if (! sysConfig('password_reset_notification')) {
-                return redirect()->back()->withErrors(trans('auth.password.reset.error.disabled', ['email' => sysConfig('webmaster_email')]));
+                return redirect()->back()->withErrors(trans('auth.password.reset.error.disabled'));
             }
 
             // 查找账号
@@ -487,7 +487,7 @@ class AuthController extends Controller
             if (cache()->has('activeUser_'.md5($username))) {
                 $activeTimes = cache()->get('activeUser_'.md5($username));
                 if ($activeTimes >= sysConfig('active_times')) {
-                    return redirect()->back()->withErrors(trans('auth.active.error.throttle', ['email' => sysConfig('webmaster_email')]));
+                    return redirect()->back()->withErrors(trans('auth.active.error.throttle'));
                 }
             }
 

+ 5 - 3
app/Http/Controllers/User/AffiliateController.php

@@ -9,19 +9,21 @@ use App\Models\ReferralLog;
 use App\Utils\Helpers;
 use Illuminate\Contracts\View\View;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Response;
 
 class AffiliateController extends Controller
 {
     // 推广返利
-    public function index(): View
+    public function index(): Response|View
     {
         if (ReferralLog::uid()->doesntExist() && Order::uid()->whereStatus(2)->doesntExist()) {
-            return view('auth.error', ['message' => trans('user.purchase.required').'<a class="btn btn-sm btn-danger" href="/">'.trans('common.back').'</a>'], 402);
+            return Response::view('auth.error', ['message' => trans('user.purchase.required').'<a class="btn btn-sm btn-danger" href="/">'.trans('common.back').'</a>'], 402);
         }
 
         return view('user.referral', [
+            'referral_reward_mode' => sysConfig('referral_reward_type', 0),
             'referral_traffic' => formatBytes(sysConfig('referral_traffic'), 'MiB'),
-            'referral_percent' => sysConfig('referral_percent'),
+            'referral_percent' => sysConfig('referral_percent') * 100,
             'referral_money' => Helpers::getPriceTag(sysConfig('referral_money')),
             'totalAmount' => ReferralLog::uid()->sum('commission') / 100,
             'canAmount' => Helpers::getPriceTag(ReferralLog::uid()->whereStatus(0)->sum('commission') / 100),

+ 5 - 3
app/Http/Controllers/User/InviteController.php

@@ -7,21 +7,23 @@ use App\Models\Invite;
 use App\Models\Order;
 use Illuminate\Contracts\View\View;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Http\Response;
 use Str;
 
 class InviteController extends Controller
 {
-    public function index(): View
+    public function index(): Response|View
     { // 邀请页面
         if (Order::uid()->active()->where('origin_amount', '>', 0)->doesntExist()) {
-            return view('auth.error', ['message' => trans('user.purchase.required').' <a class="btn btn-sm btn-danger" href="/">'.trans('common.back').'</a>'], 402);
+            return Response::view('auth.error', ['message' => trans('user.purchase.required').' <a class="btn btn-sm btn-danger" href="/">'.trans('common.back').'</a>'], 402);
         }
 
         return view('user.invite', [
             'num' => auth()->user()->invite_num, // 还可以生成的邀请码数量
             'inviteList' => Invite::uid()->with('invitee')->paginate(10), // 邀请码列表
+            'referral_reward_mode' => sysConfig('referral_reward_type', 0),
             'referral_traffic' => formatBytes(sysConfig('referral_traffic'), 'MiB'),
-            'referral_percent' => sysConfig('referral_percent'),
+            'referral_percent' => sysConfig('referral_percent') * 100,
         ]);
     }
 

+ 1 - 1
app/Notifications/TicketCreated.php

@@ -58,7 +58,7 @@ class TicketCreated extends Notification implements ShouldQueue
 
     private function markdownMessage($ticket): string
     {
-        return '📮'.trans('admin.system.ticket_created_notification')." #$ticket->id\n———————————————\n".trans('validation.attributes.title').": \n`$ticket->title`\n".trans('validation.attributes.content').": \n`$ticket->content`";
+        return '📮'.trans('model.config.ticket_created_notification')." #$ticket->id\n———————————————\n".trans('validation.attributes.title').": \n`$ticket->title`\n".trans('validation.attributes.content').": \n`$ticket->content`";
     }
 
     public function toBark($notifiable): array

+ 1 - 1
app/Notifications/TicketReplied.php

@@ -58,7 +58,7 @@ class TicketReplied extends Notification implements ShouldQueue
 
     private function markdownMessage(TicketReply $reply): string
     {
-        return '📮'.trans('admin.system.ticket_replied_notification')." #{$reply->ticket->id}\n———————————————\n".trans('validation.attributes.title').": \n`{$reply->ticket->title}`\n".trans('validation.attributes.content').": \n`$reply->content`";
+        return '📮'.trans('model.config.ticket_replied_notification')." #{$reply->ticket->id}\n———————————————\n".trans('validation.attributes.title').": \n`{$reply->ticket->title}`\n".trans('validation.attributes.content').": \n`$reply->content`";
     }
 
     public function toBark($notifiable): array

+ 12 - 12
database/seeders/ConfigSeeder.php

@@ -16,9 +16,13 @@ class ConfigSeeder extends Seeder
         'AppStore_id',
         'AppStore_password',
         'auto_release_port',
+        'ban_duration',
         'bark_key',
         'captcha_key',
         'captcha_secret',
+        'checkin_interval',
+        'checkin_reward',
+        'checkin_reward_max',
         'codepay_id',
         'codepay_key',
         'codepay_url',
@@ -63,9 +67,7 @@ class ConfigSeeder extends Seeder
         'maintenance_mode',
         'maintenance_time',
         'max_port',
-        'checkin_reward_max',
         'min_port',
-        'checkin_reward',
         'node_blocked_notification',
         'node_daily_notification',
         'node_offline_notification',
@@ -77,6 +79,7 @@ class ConfigSeeder extends Seeder
         'paybeaver_app_secret',
         'payjs_key',
         'payjs_mch_id',
+        'payment_callback_url',
         'payment_confirm_notification',
         'payment_received_notification',
         'paypal_app_id',
@@ -85,12 +88,13 @@ class ConfigSeeder extends Seeder
         'pushDeer_key',
         'pushplus_token',
         'rand_subscribe',
+        'recently_heartbeat',
         'redirect_url',
         'referral_money',
         'referral_percent',
+        'referral_reward_type',
         'referral_status',
         'referral_traffic',
-        'referral_reward_type',
         'register_ip_limit',
         'reset_password_times',
         'reset_traffic',
@@ -100,9 +104,12 @@ class ConfigSeeder extends Seeder
         'stripe_secret_key',
         'stripe_signing_secret',
         'subject_name',
-        'subscribe_rate_limit',
         'subscribe_domain',
         'subscribe_max',
+        'subscribe_rate_limit',
+        'tasks_chunk',
+        'tasks_clean',
+        'tasks_close',
         'telegram_token',
         'tg_chat_token',
         'theadpay_key',
@@ -111,9 +118,7 @@ class ConfigSeeder extends Seeder
         'ticket_closed_notification',
         'ticket_created_notification',
         'ticket_replied_notification',
-        'ban_duration',
         'traffic_abuse_limit',
-        'checkin_interval',
         'traffic_warning_percent',
         'trojan_license',
         'username_type',
@@ -121,13 +126,12 @@ class ConfigSeeder extends Seeder
         'v2ray_license',
         'v2ray_tls_provider',
         'webmaster_email',
-        'website_statistics_code',
-        'payment_callback_url',
         'website_customer_service_code',
         'website_home_logo',
         'website_logo',
         'website_name',
         'website_security_code',
+        'website_statistics_code',
         'website_url',
         'web_api_url',
         'wechat_aid',
@@ -136,10 +140,6 @@ class ConfigSeeder extends Seeder
         'wechat_qrcode',
         'wechat_secret',
         'wechat_token',
-        'tasks_chunk',
-        'tasks_clean',
-        'tasks_close',
-        'recently_heartbeat',
     ];
 
     public function run(): void

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 391 - 452
resources/lang/en/admin.php


+ 22 - 22
resources/lang/en/auth.php

@@ -3,13 +3,13 @@
 declare(strict_types=1);
 
 return [
-    'accept_term' => 'I have read and accepted',
+    'accept_term' => 'I have read and agree to',
     'active' => [
-        'attribute' => 'Activate',
+        'attribute' => 'Activation',
         'error' => [
-            'activated' => 'Account already activated, no need to reactivate',
-            'disable' => 'The account activation is disabled, you can sign in directly!',
-            'throttle' => 'You have reached the activation request limit, please try again later! If you have any questions, contact :email.',
+            'activated' => 'Account activated, please sign in!',
+            'disable' => 'Account activation is disabled, you can sign in directly!',
+            'throttle' => 'You have triggered an activation request limit, please try again later!',
         ],
         'promotion' => 'Account not activated yet, please [:action] first!',
         'sent' => 'Activation email has been sent to your mailbox, please check it (including the spam folder).',
@@ -18,36 +18,36 @@ return [
     'captcha' => [
         'attribute' => 'Captcha',
         'error' => [
-            'failed' => 'Captcha verification failed, please try again',
-            'timeout' => 'Captcha has expired, please refresh and try again.',
+            'failed' => 'Incorrect captcha. Please try again!',
+            'timeout' => 'The captcha has expired. Please refresh and try again!',
         ],
         'required' => 'Please complete the captcha!',
         'sent' => 'Captcha sent to your email, please check it (including the spam folder).',
     ],
     'email' => [
         'error' => [
-            'banned' => 'Your email provider is blocked, please use another email.',
-            'invalid' => 'Your email is not supported.',
+            'banned' => 'Your email provider is blocked, please use another email!',
+            'invalid' => 'The email you entered is not supported!',
         ],
     ],
     'error' => [
-        'account_baned' => 'Your account has been banned!',
+        'account_baned' => 'Your account has been suspended!',
         'login_error' => 'Login error, please try again later!',
         'login_failed' => 'Login failed, please check your username and password!',
-        'not_found_user' => 'No account found, please try other login methods.',
-        'repeat_request' => 'Please do not repeat requests, refresh and try again.',
-        'url_timeout' => 'The link has expired, please request again.',
+        'not_found_user' => 'No account found, please try other login methods!',
+        'repeat_request' => 'Please do not repeat requests, refresh and try again!',
+        'url_timeout' => 'The link has expired, please request again!',
     ],
     'failed' => 'Invalid credentials.',
     'invite' => [
         'get' => 'Get invitation code',
         'not_required' => 'No invitation code required, you can register directly!',
-        'unavailable' => 'Invalid invitation code, please try again.',
+        'unavailable' => 'This invitation code is invalid. Please try again!',
     ],
     'login' => 'Login',
     'logout' => 'Logout',
-    'maintenance' => 'Maintenance',
-    'maintenance_tip' => 'Under maintenance',
+    'maintenance' => 'System maintenance',
+    'maintenance_tip' => 'The system is under maintenance. Please check back later!',
     'oauth' => [
         'login_failed' => 'Third-party login failed!',
         'register' => 'Quick Register',
@@ -62,11 +62,11 @@ return [
         'reset' => [
             'attribute' => 'Reset Password',
             'error' => [
-                'demo' => 'Cannot change admin password in demo mode.',
-                'disabled' => 'Password reset disabled, please contact :email for assistance.',
-                'same' => 'New password cannot be the same as old one, please re-enter.',
-                'throttle' => 'You can only reset password :time times in 24 hours, do not operate too frequently.',
-                'wrong' => 'Incorrect password, please try again.',
+                'demo' => 'Demo environment prohibits changing admin password!',
+                'disabled' => 'Password reset disabled on this site!',
+                'same' => 'New password cannot be the same as the current one. Please choose a different password!',
+                'throttle' => 'You can reset your password up to :time times within 24 hours. Please try again later!',
+                'wrong' => 'Old password incorrect, please try again!',
             ],
             'sent' => 'Reset link sent to your mailbox, please check it (including the spam folder).',
             'success' => 'New password reset successfully, you can now login.',
@@ -80,7 +80,7 @@ return [
             'throttle' => 'Anti-bot system activated! Please avoid frequent submissions!',
         ],
         'failed' => 'Registration failed, please try again later.',
-        'promotion' => 'No account yet? Please go to ',
+        'promotion' => 'Don’t have an account yet? Please',
     ],
     'remember_me' => 'Remember Me',
     'request' => 'Request',

+ 23 - 24
resources/lang/en/common.php

@@ -9,14 +9,14 @@ return [
     'add' => 'Add',
     'advance' => 'Advance',
     'all' => 'All',
-    'applied' => ':attribute applied',
+    'applied' => ':attribute has been applied',
     'apply' => 'Apply',
     'available_date' => 'Validity Period',
     'avatar' => 'Avatar',
     'back' => 'Back',
-    'back_to' => 'Back to :page',
+    'back_to' => 'Return to :page',
     'bark' => [
-        'custom' => 'Custom message',
+        'custom' => 'Customize',
         'node_status' => 'Node Status',
     ],
     'cancel' => 'Cancel',
@@ -32,10 +32,10 @@ return [
         'success' => 'Copied successfully',
     ],
     'create' => 'Create',
-    'created_at' => 'Date Created',
+    'created_at' => 'Created At',
     'customize' => 'Customize',
     'days' => [
-        'attribute' => '{1} Days|{2} Day',
+        'attribute' => '{1} Days|{2}th day',
         'next' => 'Next Day',
         'weekend' => 'Weekend',
         'work' => 'Weekday',
@@ -48,13 +48,13 @@ return [
     'download' => 'Download',
     'edit' => 'Edit',
     'error' => 'Error',
-    'error_action_item' => ':action :attribute error',
-    'error_item' => ':attribute Error',
-    'exists_error' => 'There are associated accounts under this :attribute. Please remove the associations first!',
+    'error_action_item' => 'Error during :action :attribute',
+    'error_item' => ':attribute error',
+    'exists_error' => ':attribute is associated with other accounts. Please unlink them first.',
     'expired_at' => 'Expiry Date',
     'export' => 'Export',
     'failed' => 'Failed',
-    'failed_action_item' => ':action :attribute failed',
+    'failed_action_item' => 'Failed to :action :attribute',
     'failed_item' => ':attribute failed',
     'free' => 'Free',
     'function' => [
@@ -65,11 +65,10 @@ return [
     'generate' => 'Generate',
     'generate_item' => 'Generate :attribute',
     'goto' => 'Go to',
-    'hour' => '{1} Hour|{2} O\'clock',
+    'hour' => '{1} Hours|{2} O\'clock',
     'import' => 'Import',
-    'latest_at' => 'Last Activity',
+    'latest_at' => 'Last Updated',
     'more' => 'More',
-    'new' => 'New',
     'none' => 'None',
     'open' => 'Open',
     'or' => 'or',
@@ -79,23 +78,23 @@ return [
             'completed' => 'Completed',
             'ongoing' => 'Ongoing',
             'prepaid' => 'Prepaid',
-            'review' => 'Pending Review',
+            'review' => 'Pending',
         ],
     ],
     'payment' => [
         'alipay' => 'Alipay',
         'credit' => 'Credit',
-        'crypto' => 'Cryptocurrency',
+        'crypto' => 'Crypto Currency',
         'manual' => 'Manual Payment',
         'qq' => 'QQ Wallet',
         'wechat' => 'WeChat Pay',
     ],
     'print' => 'Print',
     'qrcode' => ':attribute QR Code',
-    'random_generate' => 'Leave empty to generate randomly',
+    'random_generate' => 'Leave blank to generate randomly',
     'recommend' => 'Recommend',
     'request' => 'Request',
-    'request_failed' => 'Request failed, please retry',
+    'request_failed' => 'Request failed, please try again',
     'request_url' => 'Request URL',
     'reset' => 'Reset',
     'search' => 'Search',
@@ -123,24 +122,24 @@ return [
         'reply' => 'Replied',
         'review' => 'Pending Review',
         'reviewed' => 'Reviewed',
-        'run_out' => 'Data Used Up',
+        'run_out' => 'Used Up',
         'send_to_credit' => 'Add to Credit',
         'unknown' => 'Unknown',
         'unused' => 'Unused',
         'used' => 'Used',
-        'withdrawal_pending' => 'Unwithdrawn',
+        'withdrawal_pending' => 'Pending Cash Out',
         'withdrawn' => 'Withdrawn',
     ],
-    'stay_unchanged' => 'Leave empty to stay unchanged',
-    'storage_logo' => 'Logo Storage',
+    'stay_unchanged' => 'Leave empty',
+    'storage_logo' => 'LOGO Storage',
     'store' => 'Storage',
     'submit' => 'Submit',
     'success' => 'Success',
-    'success_action_item' => ':action :attribute success',
-    'success_item' => ':attribute succeeded',
+    'success_action_item' => 'Successfully :action :attribute',
+    'success_item' => 'Successfully :attribute',
     'to' => 'to',
-    'to_be_send' => 'To be sent',
-    'to_safari' => 'Click the <i class="icon wb-more-horizontal" aria-hidden="true"></i> icon in the upper right corner, then select Open in <img class="w-30 h-30 vertical-align-middle m-3" src="https://gw.alicdn.com/tfs/TB1xwiUNpXXXXaIXXXXXXXXXXXX-55-55.png" alt="Safari" /> Safari to access our site properly!',
+    'to_be_send' => 'Pending sending',
+    'to_safari' => 'Tap <i class="icon wb-more-horizontal" aria-hidden="true"></i> at the top right, then select <img class="w-30 h-30 vertical-align-middle m-3" src="https://gw.alicdn.com/tfs/TB1xwiUNpXXXXaIXXXXXXXXXXXX-55-55.png" alt="Safari" /> Safari to open<br>to access the website properly!',
     'toggle' => 'Toggle',
     'toggle_action' => 'Toggle :action',
     'unlimited' => 'Unlimited',

+ 19 - 19
resources/lang/en/errors.php

@@ -4,33 +4,33 @@ declare(strict_types=1);
 
 return [
     'forbidden' => [
-        'access' => 'Detected unknown IP or proxy access, access denied',
-        'bots' => 'Detected bot access, access denied',
-        'china' => 'Detected China IP or proxy access, access denied',
-        'oversea' => 'Detected overseas IP or proxy access, access denied',
-        'redirect' => 'Detected (:ip :url) accessing through a subscription link, forcing a redirect.',
-        'unknown' => 'Unknown forbidden access mode! Please modify the [Access Restriction] in the system settings!',
+        'access' => 'Unknown IP or proxy detected. Access denied!',
+        'bots' => 'Bot access detected. Access denied!',
+        'china' => 'China-based IP or proxy detected. Access denied!',
+        'oversea' => 'Overseas IP or proxy detected. Access denied!',
+        'redirect' => 'Detected (:ip :url) accessing via subscription link. Redirected.',
+        'unknown' => 'Unknown interception mode. Please check system settings!',
     ],
     'get_ip' => 'Failed to retrieve IP information',
     'log' => 'Log',
     'refresh' => 'Refresh',
     'refresh_page' => 'Please refresh the page and try again',
-    'report' => 'The error carried a report: ',
-    'safe_code' => 'Please enter the safe code',
-    'safe_enter' => 'Safe Entrance',
+    'report' => 'Error report:',
+    'safe_code' => 'Please enter the security code',
+    'safe_enter' => 'Access via Secure Entry',
     'subscribe' => [
-        'banned_until' => 'Account banned until :time, please wait for unlock!',
-        'expired' => 'Account expired! Please renew your subscription!',
+        'banned_until' => 'Account banned until :time. Please try again after unblocking.',
+        'expired' => 'Account expired. Please renew your subscription.',
         'none' => 'No available nodes',
-        'out' => 'OUT OF DATA! Please purchase more or reset data!',
-        'question' => 'Account issues!? Visit the website for details',
-        'sub_banned' => 'Subscription banned! Visit the website for details',
-        'unknown' => 'Invalid subscription link! Please obtain a new one!',
-        'user' => 'Invalid URL, account does not exist!',
-        'user_disabled' => 'Account Disabled! Contact Support!',
+        'out' => 'Data exhausted. Please purchase more or reset your quota.',
+        'question' => 'Account issue detected. Visit the official site for details.',
+        'sub_banned' => 'Subscription link has been banned. Check the official site for details.',
+        'unknown' => 'Invalid subscription link. Please obtain a new one.',
+        'user' => 'Invalid link. Account does not exist. Please obtain a new one.',
+        'user_disabled' => 'Account has been disabled.',
     ],
-    'title' => '⚠️ Error Triggered',
-    'unsafe_enter' => 'Unsafe Entrance',
+    'title' => '⚠️ Error Occurred',
+    'unsafe_enter' => 'Access via Unsecure Entry',
     'visit' => 'Please visit',
     'whoops' => 'Whoops!',
 ];

+ 240 - 107
resources/lang/en/model.php

@@ -4,144 +4,144 @@ declare(strict_types=1);
 
 return [
     'aff' => [
-        'amount' => 'Order Amount',
+        'amount' => 'Order Total',
         'commission' => 'Commission',
-        'created_at' => 'Ordered On',
-        'invitee' => 'Buyer',
-        'updated_at' => 'Processed On',
+        'created_at' => 'Order Date',
+        'invitee' => 'Invitee',
+        'updated_at' => 'Handled At',
     ],
     'article' => [
         'attribute' => 'Article',
         'category' => 'Category',
-        'created_at' => 'Published On',
+        'created_at' => 'Published Date',
         'language' => 'Language',
         'logo' => 'Cover',
-        'updated_at' => 'Updated On',
+        'updated_at' => 'Last Updated',
     ],
     'common' => [
         'description' => 'Description',
-        'extend' => 'Extended Info',
+        'extend' => 'Extra Information',
         'level' => 'Level',
-        'sort' => 'Sort',
+        'sort' => 'Sort Order',
         'type' => 'Type',
     ],
     'country' => [
         'code' => 'Country Code',
-        'icon' => 'Flag',
+        'icon' => 'Flag Icon',
         'name' => 'Country Name',
     ],
     'coupon' => [
         'attribute' => 'Coupon',
-        'groups' => 'Group Limit',
-        'levels' => 'Level Limit',
-        'logo' => 'Logo',
+        'groups' => 'Group Restriction',
+        'levels' => 'Level Restriction',
+        'logo' => 'Image',
         'minimum' => 'Minimum Spend',
-        'name' => 'Name',
-        'newbie' => 'New User Only',
+        'name' => 'Coupon Name',
+        'newbie' => 'New Users Only',
         'num' => 'Quantity',
-        'priority' => 'Priority',
-        'services_blacklist' => 'Blacklist Goods',
-        'services_whitelist' => 'Whitelist Goods',
-        'sn' => 'Code',
+        'priority' => 'Priority Level',
+        'services_blacklist' => 'Excluded Products',
+        'services_whitelist' => 'Eligible Products',
+        'sn' => 'Coupon Code',
         'usable_times' => 'Usage Limit',
-        'used' => 'Personal Limit',
-        'users_blacklist' => 'Blacklist Users',
-        'users_whitelist' => 'Whitelist Users',
+        'used' => 'Limit per User',
+        'users_blacklist' => 'Excluded Users',
+        'users_whitelist' => 'Eligible Users',
         'value' => 'Value',
     ],
     'goods' => [
-        'attribute' => 'Goods',
+        'attribute' => 'Product',
         'available_date' => 'Validity Period',
         'category' => 'Category',
         'color' => 'Color',
         'hot' => 'Bestseller',
-        'info' => 'Custom Info',
-        'invite_num' => 'Bonus Invitations',
-        'limit_num' => 'Purchase Limit',
-        'logo' => 'Logo',
-        'name' => 'Name',
-        'period' => 'Reset Cycle',
+        'info' => 'Custom List',
+        'invite_num' => 'Additional Invite Quota',
+        'limit_num' => 'Limit per User',
+        'logo' => 'Product Image',
+        'name' => 'Product Name',
+        'period' => 'Reset Interval',
         'price' => 'Price',
-        'renew' => 'Data Renewal Price',
-        'traffic' => 'Data Allowance',
+        'renew' => 'Renewal Price',
+        'traffic' => 'Data Allocation',
         'user_limit' => 'User Speed Limit',
     ],
     'ip' => [
-        'info' => 'Location',
+        'info' => 'Geolocation',
         'network_type' => 'Network Type',
     ],
     'node' => [
         'attribute' => 'Node',
         'client_limit' => 'Client Limit',
-        'country' => 'Country',
-        'data_consume' => 'Data Usage',
-        'data_rate' => 'Data Ratio',
+        'country' => 'Location',
+        'data_consume' => 'Traffic Consumed',
+        'data_rate' => 'Traffic Multiplier',
         'ddns' => 'DDNS',
         'detection' => 'Block Detection',
-        'display' => 'Display & Subscribe',
-        'domain' => 'Domain',
+        'display' => 'Visibility & Subscription',
+        'domain' => 'Domain Name',
         'id' => 'Node ID',
-        'ipv4' => 'IPv4',
-        'ipv6' => 'IPv6',
-        'label' => 'Label',
-        'method' => 'Encryption',
-        'name' => 'Name',
+        'ipv4' => 'IPv4 Address',
+        'ipv6' => 'IPv6 Address',
+        'label' => 'Node Label',
+        'method' => 'Encryption Method',
+        'name' => 'Node Name',
         'next_renewal_date' => 'Next Renewal Date',
-        'obfs' => 'Obfs',
-        'obfs_param' => 'Obfs Param',
+        'obfs' => 'Obfuscation Protocol',
+        'obfs_param' => 'Obfuscation Parameters',
         'online_user' => 'Online Users',
-        'protocol' => 'Protocol',
-        'protocol_param' => 'Protocol Param',
+        'protocol' => 'Transfer Protocol',
+        'protocol_param' => 'Protocol Parameters',
         'push_port' => 'Push Port',
         'relay_port' => 'Relay Port',
-        'renewal_cost' => 'Renewal Cost',
+        'renewal_cost' => 'Renewal Fee',
         'service_port' => 'Service Port',
-        'single' => 'Single Port',
-        'single_passwd' => '[Single] Password',
-        'static' => 'Alive Status',
+        'single' => 'Single Port Mode',
+        'single_passwd' => 'Single Port Password',
+        'static' => 'Online Status',
         'subscription_term' => 'Subscription Term',
-        'traffic_limit' => 'Speed Limit',
-        'transfer' => 'Relay',
-        'udp' => 'UDP',
+        'traffic_limit' => 'Traffic Cap',
+        'transfer' => 'Relay Settings',
+        'udp' => 'UDP Supported',
         'v2_alter_id' => 'Alter ID',
-        'v2_cover' => 'Cover',
-        'v2_host' => 'Host',
-        'v2_net' => 'Network',
-        'v2_path' => 'Path | Key',
+        'v2_cover' => 'Traffic Obfuscation',
+        'v2_host' => 'Host Header',
+        'v2_net' => 'Transport Protocol',
+        'v2_path' => 'Path or Key',
         'v2_sni' => 'SNI',
-        'v2_tls' => 'TLS',
-        'v2_tls_provider' => 'TLS Config',
+        'v2_tls' => 'TLS Encryption',
+        'v2_tls_provider' => 'TLS Certificate Provider',
     ],
     'node_auth' => [
-        'attribute' => 'Node Auth',
-        'key' => 'Key <small>for node</small>',
-        'secret' => 'Reverse Secret',
+        'attribute' => 'Node Authentication',
+        'key' => 'Communication Key',
+        'secret' => 'Reverse Key',
     ],
     'node_cert' => [
-        'attribute' => 'Domain Cert',
-        'domain' => 'Domain',
-        'expired_date' => 'Expired Date',
+        'attribute' => 'Domain Certificate',
+        'domain' => 'Domain Name',
+        'expired_date' => 'Expiration Date',
         'issuer' => 'Issuer',
-        'key' => 'KEY',
-        'pem' => 'PEM',
-        'signed_date' => 'Signed Date',
+        'key' => 'Private Key',
+        'pem' => 'PEM Certificate',
+        'signed_date' => 'Issue Date',
     ],
     'notification' => [
         'address' => 'Recipient',
-        'created_at' => 'Sent On',
+        'created_at' => 'Sent Date',
         'status' => 'Status',
     ],
     'oauth' => [
-        'identifier' => 'Identifier',
-        'type' => 'Channel',
+        'identifier' => 'User Identifier',
+        'type' => 'Login Method',
     ],
     'order' => [
         'attribute' => 'Order',
-        'id' => 'Order ID',
+        'id' => 'Order Number',
         'original_price' => 'Original Price',
-        'pay_way' => 'Payment',
-        'price' => 'Actual Price',
-        'status' => 'Status',
+        'pay_way' => 'Payment Method',
+        'price' => 'Paid',
+        'status' => 'Order Status',
     ],
     'permission' => [
         'attribute' => 'Permission',
@@ -149,44 +149,45 @@ return [
         'name' => 'Route Name',
     ],
     'referral' => [
-        'amount' => 'Amount',
-        'created_at' => 'Applied On',
-        'id' => 'Application ID',
-        'user' => 'Applicant',
+        'amount' => 'Requested Amount',
+        'created_at' => 'Request Date',
+        'id' => 'Request ID',
+        'user' => 'Requester',
     ],
     'role' => [
         'attribute' => 'Role',
-        'name' => 'Name',
-        'permissions' => 'Permissions',
+        'name' => 'Role Name',
+        'permissions' => 'Assigned Permissions',
     ],
     'rule' => [
         'attribute' => 'Rule',
-        'name' => 'Description',
-        'pattern' => 'Value',
+        'name' => 'Rule Name',
+        'pattern' => 'Match Value',
+        'logs' => 'Trigger Logs',
     ],
     'rule_group' => [
         'attribute' => 'Rule Group',
-        'name' => 'Name',
-        'rules' => 'Rules',
-        'type' => 'Type',
+        'name' => 'Group Name',
+        'rules' => 'Included Rules',
+        'type' => 'Group Type',
     ],
     'subscribe' => [
-        'ban_desc' => 'Ban Reason',
-        'ban_time' => 'Ban Time',
-        'code' => 'Sub Code',
-        'req_header' => 'Access Header',
+        'ban_desc' => 'Suspension Reason',
+        'ban_time' => 'Suspension Time',
+        'code' => 'Subscription Code',
+        'req_header' => 'Request Header',
         'req_ip' => 'Request IP',
-        'req_times' => 'Request Times',
-        'updated_at' => 'Last Request',
+        'req_times' => 'Request Count',
+        'updated_at' => 'Last Accessed',
     ],
     'user' => [
-        'account_status' => 'Account Status',
+        'account_status' => 'Status',
         'attribute' => 'User',
         'created_date' => 'Registration Date',
         'credit' => 'Balance',
         'expired_date' => 'Expiration Date',
         'id' => 'User ID',
-        'invite_num' => 'Available Invitations',
+        'invite_num' => 'Invitation Quota',
         'inviter' => 'Inviter',
         'nickname' => 'Nickname',
         'password' => 'Password',
@@ -197,37 +198,169 @@ return [
         'proxy_protocol' => 'Protocol',
         'proxy_status' => 'Proxy Status',
         'qq' => 'QQ',
-        'remark' => 'Note',
+        'remark' => 'Notes',
         'reset_date' => 'Data Reset Date',
-        'role' => 'Role',
-        'service' => 'Proxy',
-        'speed_limit' => 'Speed Limit',
+        'role' => 'User Role',
+        'service' => 'Proxy Service',
+        'speed_limit' => 'Speed Cap',
         'traffic_used' => 'Data Used',
-        'usable_traffic' => 'Data Allowance',
+        'usable_traffic' => 'Remaining Data',
         'username' => 'Username',
         'uuid' => 'VMess UUID',
         'wechat' => 'WeChat',
     ],
     'user_credit' => [
-        'after' => 'After',
-        'amount' => 'Amount',
-        'before' => 'Before',
-        'created_at' => 'Changed At',
+        'after' => 'After Change',
+        'amount' => 'Amount Changed',
+        'before' => 'Before Change',
+        'created_at' => 'Logged At',
     ],
     'user_data_modify' => [
-        'after' => 'After',
-        'before' => 'Before',
-        'created_at' => 'Changed At',
+        'after' => 'After Change',
+        'before' => 'Before Change',
+        'created_at' => 'Logged At',
     ],
     'user_group' => [
         'attribute' => 'User Group',
         'name' => 'Group Name',
-        'nodes' => 'Nodes',
+        'nodes' => 'Available Nodes',
     ],
     'user_traffic' => [
         'download' => 'Download',
-        'log_time' => 'Logged At',
+        'log_time' => 'Log Time',
         'total' => 'Total',
         'upload' => 'Upload',
     ],
+    'config' => [
+        'AppStore_id' => 'Apple ID',
+        'AppStore_password' => 'Apple Password',
+        'account_expire_notification' => 'Account Expiry Notification',
+        'active_times' => 'Maximum Activations',
+        'admin_invite_days' => 'Admin Invite Expiration',
+        'affiliate_link_salt' => 'Referral Link Salt',
+        'alipay_qrcode' => 'Alipay QR Code',
+        'auto_release_port' => 'Port Recycle',
+        'ban_duration' => 'Ban Duration',
+        'bark_key' => 'Bark Device Key',
+        'captcha_key' => 'Captcha Key',
+        'captcha_secret' => 'Captcha Secret/ID',
+        'checkin_interval' => 'Check-in Cooldown',
+        'checkin_reward' => 'Check-in Bonus',
+        'codepay_id' => 'CodePay Merchant ID',
+        'codepay_key' => 'CodePay Secret Key',
+        'codepay_url' => 'CodePay Payment URL',
+        'cryptomus_api_key' => 'Cryptomus API Key',
+        'cryptomus_merchant_uuid' => 'Cryptomus Merchant UUID',
+        'data_anomaly_notification' => 'Data Anomaly Alert',
+        'data_exhaust_notification' => 'Data Limit Alert',
+        'ddns_key' => 'DDNS Key',
+        'ddns_mode' => 'DDNS Sync Mode',
+        'ddns_secret' => 'DDNS Secret Key',
+        'default_days' => 'Default Account Duration',
+        'default_traffic' => 'Initial Bandwidth',
+        'detection_check_times' => 'Block Detection Notification',
+        'dingTalk_access_token' => 'DingTalk Access Token',
+        'dingTalk_secret' => 'DingTalk Secret',
+        'epay_key' => 'Epay Secret Key',
+        'epay_mch_id' => 'Epay Merchant ID',
+        'epay_url' => 'Epay Gateway URL',
+        'expire_days' => 'Expiration Warning',
+        'f2fpay_app_id' => 'Alipay App ID',
+        'f2fpay_private_key' => 'Alipay Private Key',
+        'f2fpay_public_key' => 'Alipay Public Key',
+        'forbid_mode' => 'Access Restriction',
+        'iYuu_token' => 'IYUU Token',
+        'invite_num' => 'Initial Invitation Quota',
+        'is_AliPay' => 'Alipay',
+        'is_QQPay' => 'QQPay',
+        'is_WeChatPay' => 'WeChatPay',
+        'is_activate_account' => 'Account Activation',
+        'is_ban_status' => 'Auto-ban on Expiry',
+        'is_captcha' => 'Captcha',
+        'is_clear_log' => 'Auto-clear Logs',
+        'is_custom_subscribe' => 'Custom Subscriptions',
+        'is_email_filtering' => 'Email Domain Filter',
+        'is_forbid_robot' => 'Block Search Engine Crawlers',
+        'is_free_code' => 'Free Invite Codes',
+        'is_invite_register' => 'Invite-only Registration',
+        'is_otherPay' => 'Custom Payment Channels',
+        'is_rand_port' => 'Random Port Assignment',
+        'is_register' => 'Registration',
+        'maintenance_content' => 'Maintenance Announcement',
+        'maintenance_mode' => 'Maintenance Mode',
+        'maintenance_time' => 'Maintenance End Time',
+        'min_port' => 'Port Range',
+        'node_blocked_notification' => 'Node Blocked Alert',
+        'node_daily_notification' => 'Daily Node Summary',
+        'node_offline_notification' => 'Node Offline Alert',
+        'node_renewal_notification' => 'Node Renewal Reminder',
+        'oauth_path' => 'OAuth Login Callback Path',
+        'offline_check_times' => 'Offline Check Count',
+        'password_reset_notification' => 'Password Reset Alert',
+        'paybeaver_app_id' => 'PayBeaver App ID',
+        'paybeaver_app_secret' => 'PayBeaver Secret Key',
+        'payjs_key' => 'PayJS Secret Key',
+        'payjs_mch_id' => 'PayJS Merchant ID',
+        'payment_callback_url' => 'Payment Callback URL',
+        'payment_confirm_notification' => 'Manual Payment Notification',
+        'payment_received_notification' => 'Payment Received Alert',
+        'paypal_app_id' => 'PayPal App ID',
+        'paypal_client_id' => 'PayPal Client ID',
+        'paypal_client_secret' => 'PayPal Secret Key',
+        'pushDeer_key' => 'PushDeer Key',
+        'pushplus_token' => 'PushPlus Token',
+        'rand_subscribe' => 'Randomize Subscription Link',
+        'recently_heartbeat' => 'Recent Node Load Threshold',
+        'redirect_url' => 'Blocked Request Redirect URL',
+        'referral_money' => 'Minimum Withdrawal Amount',
+        'referral_percent' => 'Commission Rate',
+        'referral_reward_type' => 'Commission Calculation Type',
+        'referral_status' => 'Affiliate Program',
+        'referral_traffic' => 'Referral Bonus Bandwidth',
+        'register_ip_limit' => 'Max Registrations per IP',
+        'reset_password_times' => 'Password Reset Limit per Day',
+        'reset_traffic' => 'Periodic Traffic Reset',
+        'server_chan_key' => 'ServerChan SCKEY',
+        'standard_currency' => 'Default Currency',
+        'stripe_public_key' => 'Stripe Public Key',
+        'stripe_secret_key' => 'Stripe Secret Key',
+        'stripe_signing_secret' => 'Stripe Webhook Signing Secret',
+        'subject_name' => 'Product Title',
+        'subscribe_domain' => 'Subscription Domain',
+        'subscribe_max' => 'Max Subscription Node Count',
+        'subscribe_rate_limit' => 'Subscription Rate Limit',
+        'tasks_chunk' => 'Batch Processing Tasks',
+        'tasks_clean' => 'Clean-up Tasks',
+        'tasks_close' => 'Close Tasks',
+        'telegram_token' => 'Telegram Bot Token',
+        'tg_chat_token' => 'Telegram Chat Token',
+        'theadpay_key' => 'THeadPay Key',
+        'theadpay_mchid' => 'THeadPay Merchant ID',
+        'theadpay_url' => 'THeadPay Payment URL',
+        'ticket_closed_notification' => 'Ticket Closed Alert',
+        'ticket_created_notification' => 'Ticket Created Alert',
+        'ticket_replied_notification' => 'Ticket Reply Alert',
+        'traffic_abuse_limit' => 'Data Abuse Threshold',
+        'traffic_warning_percent' => 'Data Usage Warning',
+        'trojan_license' => 'Trojan Backend License ',
+        'user_invite_days' => 'User Invite Code Expiration',
+        'username_type' => 'Account Username Format',
+        'v2ray_license' => 'V2Ray Backend License ',
+        'v2ray_tls_provider' => 'V2Ray TLS Certificate Provider',
+        'web_api_url' => 'Backend API URL',
+        'webmaster_email' => 'Administrator Email',
+        'website_customer_service_code' => 'Customer Service Script',
+        'website_home_logo' => 'Homepage Logo',
+        'website_logo' => 'Inner Page Logo',
+        'website_name' => 'Site Name',
+        'website_security_code' => 'Security Code',
+        'website_statistics_code' => 'Website Analytics Script',
+        'website_url' => 'Primary Website Domain',
+        'wechat_aid' => 'WeChat AID',
+        'wechat_cid' => 'WeChat CID',
+        'wechat_encodingAESKey' => 'WeChat Encoding Key',
+        'wechat_qrcode' => 'WeChat Pay QR Code',
+        'wechat_secret' => 'WeChat App Secret',
+        'wechat_token' => 'WeChat Token',
+    ],
 ];

+ 1 - 1
resources/lang/en/notification.php

@@ -31,7 +31,7 @@ return [
     'node_offline' => 'Node offline warning',
     'node_offline_content' => 'Abnormal nodes, may be offline:',
     'node_renewal' => 'Node Renewal Reminder',
-    'node_renewal_blade' => 'The following nodes are about to expire. Please renew in advance:',
+    'node_renewal_blade' => 'The following nodes are about to expire. Please renew in advance: :nodes',
     'node_renewal_content' => 'The following nodes are about to expire. Please renew before the expiration to avoid service interruption.',
     'payment_received' => 'Payment received, amount: :amount. View order details',
     'reply_ticket' => 'Ticket replied: :title',

+ 168 - 165
resources/lang/en/user.php

@@ -4,209 +4,212 @@ declare(strict_types=1);
 
 return [
     'account' => [
-        'connect_password' => 'Proxy Connection Password',
+        'connect_password' => 'Node Connection Password',
         'credit' => 'Account Balance',
-        'group' => 'Group',
+        'group' => 'User Group',
         'last_login' => 'Last Login',
-        'level' => 'Account Level',
+        'level' => 'Account Tier',
         'reason' => [
-            'expired' => 'Your plan has expired',
-            'normal' => 'Account is normal',
-            'overused' => 'You have exceeded the <code>:data</code> GB limit for this period<br/> Limit will be lifted in <code id="banedTime">:min</code> minutes',
-            'traffic_exhausted' => 'Data has been exhausted',
-            'unknown' => 'Unknown reason, please try refreshing the browser! If the problem persists, contact support.',
+            'expired' => 'Subscription expired',
+            'normal' => 'Account status normal',
+            'overused' => 'Exceeded <code>:data</code>GB limit<br>Unblock in <code id="banedTime">:min</code> minutes',
+            'traffic_exhausted' => 'Traffic allocation exhausted',
+            'unknown' => 'System error. Refresh or contact support',
         ],
-        'remain' => 'Remaining Data',
-        'reset' => '{0} Data will reset in <code id="restTime">:days</code> |{1} :days day left to reset data |[2,*] :days days left to reset data',
+        'remain' => 'Remaining Traffic',
+        'reset' => '{0} Reset in <code id="restTime">:days</code> |{1} :days day until reset|[2,*] :days days until reset',
         'speed_limit' => 'Speed Limit',
         'status' => 'Account Status',
-        'time' => 'Plan Duration',
+        'time' => 'Subscription Period',
     ],
     'attribute' => [
-        'address' => 'Location',
-        'data' => 'Data',
+        'address' => 'Region',
+        'data' => 'Traffic',
         'ip' => 'IP Address',
         'isp' => 'ISP',
         'node' => 'Node',
     ],
     'bought_at' => 'Purchase Date',
     'clients' => 'Clients',
-    'contact' => 'Contact',
+    'contact' => 'Contact Method',
     'coupon' => [
         'discount' => 'Discount',
         'error' => [
             'expired' => 'Coupon expired',
-            'inactive' => 'Coupon not active',
-            'minimum' => 'Minimum amount is :amount',
-            'overused' => 'Can only be used :times times',
-            'run_out' => 'Coupon exhausted',
-            'services' => 'Goods not eligible for discount, check promotional terms',
+            'inactive' => 'Coupon not yet active',
+            'minimum' => 'Minimum purchase: :amount',
+            'overused' => 'Usage limit: :times times',
+            'run_out' => 'All coupons have been claimed',
+            'services' => 'Product excluded from promotion',
             'unknown' => 'Invalid coupon',
-            'unmet' => 'Conditions not met',
-            'used' => 'Coupon already used',
-            'users' => 'Account not eligible for promotion',
-            'wait' => 'Will be active at :time, please wait!',
+            'unmet' => 'Conditions not satisfied',
+            'used' => 'Coupon already redeemed',
+            'users' => 'Account ineligible for promotion',
+            'wait' => 'This promotion will start at :time. Please be patient!',
         ],
-        'input' => 'Please enter the recharge coupon code',
+        'input' => 'Enter coupon code',
     ],
-    'current_role' => 'Current Role as',
-    'error_response' => 'An error occurred, please try again later.',
+    'current_role' => 'Current Role',
+    'error_response' => 'System busy. Please retry',
     'home' => [
         'announcement' => 'Announcements',
         'attendance' => [
-            'attribute' => 'Check In',
+            'attribute' => 'Check-in',
             'disable' => 'Check-in disabled',
-            'done' => 'You have already checked in. Come back tomorrow!',
-            'failed' => 'System error',
-            'success' => 'You received :data data',
+            'done' => 'Already checked in today',
+            'failed' => 'System exception',
+            'success' => 'Check-in successful +:data traffic',
         ],
-        'chat_group' => 'Chat Group',
-        'empty_announcement' => 'No announcements',
-        'traffic_logs' => 'Data Records',
+        'chat_group' => 'Community',
+        'empty_announcement' => 'No Announcements',
+        'traffic_logs' => 'Traffic Records',
         'wechat_push' => 'WeChat Notifications',
     ],
     'invite' => [
         'attribute' => 'Invitation Code',
-        'counts' => 'Total of <code>:num</code> invitation codes',
-        'generate_failed' => 'Failed to generate: Quota exceeded',
-        'logs' => 'Invitation Logs',
-        'promotion' => 'Both you and the invitee will receive <mark>:traffic</mark> data when they register with your code; You will earn <mark>:referral_percent%</mark> commission when they make a purchase.',
-        'tips' => '<strong>:num</strong> invitations remaining, codes expire :days days after creation',
+        'counts' => 'Available: <code>:num</code>',
+        'generate_failed' => 'Generation quota exceeded',
+        'logs' => 'Referral Records',
+        'promotion' => [
+            'base' => 'When you invite someone:<br>• You and the invitee will both receive <mark>:traffic</mark> traffic;',
+            'bonus' => [
+                0 => '',
+                1 => '<br>&nbsp;&nbsp;&nbsp;&nbsp;• When the invitee makes their <strong>FIRST</strong> purchase, you\'ll earn <mark>:referral_percent%</mark> rebate;',
+                2 => '<br>&nbsp;&nbsp;&nbsp;&nbsp;• <strong>EVERY TIME</strong> the invitee makes a purchase, you\'ll earn <mark>:referral_percent%</mark> rebate;',
+            ],
+        ],
+        'tips' => 'Remaining invitations: <strong>:num</strong>. Validity: :days days',
     ],
-    'invitee' => 'Invitee',
-    'inviter' => 'Inviter',
+    'invitee' => 'Referred User',
+    'inviter' => 'Referrer',
     'invoice' => [
-        'active_prepaid_question' => 'Activate prepaid package early?',
-        'active_prepaid_tips' => 'After activation:<br>Your current plan will immediately expire<br>The new plan\'s expiration date will be recalculated from today',
+        'active_prepaid_question' => 'Activate prepaid package?',
+        'active_prepaid_tips' => '<p class="text-left">Activating early means:</p><ol class="text-left"><li>Current plan will be terminated immediately. Remaining validity will be discarded.</li><li>New plan will take effect right away and start from now.</li></ol>',
         'amount' => 'Amount',
         'attribute' => 'Order',
-        'detail' => 'Order Details',
-    ],
-    'knowledge' => [
-        'basic' => 'Basic',
-        'title' => 'Knowledge Base',
+        'detail' => 'Transaction History',
     ],
     'menu' => [
-        'admin_dashboard' => 'Dashboard',
+        'admin_dashboard' => 'Admin',
         'help' => 'Help',
-        'home' => 'Home',
-        'invites' => 'Invite',
-        'invoices' => 'Invoice',
+        'home' => 'Dashboard',
+        'invites' => 'Invites',
+        'invoices' => 'Orders',
         'nodes' => 'Nodes',
         'profile' => 'Profile',
-        'promotion' => 'Referral',
+        'promotion' => 'Promotions',
         'shop' => 'Shop',
         'tickets' => 'Tickets',
     ],
     'node' => [
-        'info' => 'Configuration Info',
-        'rate' => ':ratio times data consumption',
-        'setting' => 'Proxy Settings',
-        'unstable' => 'Unstable/Maintenance',
+        'info' => 'Connection Details',
+        'rate' => 'Traffic multiplier: :ratio',
+        'setting' => 'Proxy Configuration',
+        'unstable' => 'Unstable or Under Maintenance',
     ],
     'oauth' => [
-        'bind' => 'Link',
-        'bind_title' => 'Link Your Social Account',
+        'bind' => 'Link Account',
+        'bind_title' => 'Link Social Account',
         'not_bind' => 'Not Linked',
-        'rebind' => 'Re-link',
+        'rebind' => 'Relink',
         'unbind' => 'Unlink',
     ],
-    'pay' => 'Pay',
+    'pay' => 'Proceed to Payment',
     'payment' => [
-        'close_tips' => 'Complete the payment within <code>:minutes</code> minutes, or the order will close automatically',
-        'creating' => 'Creating payment...',
-        'error' => 'Invalid recharge amount',
-        'insufficient_balance' => 'Your balance is insufficient. Please recharge first.',
+        'close_tips' => 'Complete payment within <code>:minutes</code> minutes',
+        'creating' => 'Creating order...',
+        'error' => 'Invalid amount',
+        'insufficient_balance' => 'Insufficient balance',
         'manual' => [
-            'hint' => 'After scanning the QR code to pay, please follow the steps until you click Submit to complete the payment.',
-            'next' => 'Next',
-            'payment_tips' => 'When making the payment, please pay the exact amount (no refunds for overpayment, additional payment required if underpaid).',
+            'hint' => 'Submit payment confirmation after transaction',
+            'next' => 'Continue',
+            'payment_tips' => 'Please pay the exact amount (overpayments won’t be refunded)',
             'pre' => 'Previous',
             'red_packet' => 'Alipay Red Packet',
             'steps' => [
                 'complete' => [
-                    'description' => 'Waiting for manual payment verification',
-                    'title' => 'Completion',
+                    'description' => 'Pending manual verification',
+                    'title' => 'Payment Completion',
                 ],
                 'notice' => [
-                    'description' => 'How to make a manual payment',
-                    'title' => 'Notes',
+                    'description' => 'Payment instructions',
+                    'title' => 'Payment Notes',
                 ],
                 'payment' => [
-                    'description' => 'Get the payment QR code and pay',
-                    'title' => 'Payment',
+                    'description' => 'Scan QR code to pay',
+                    'title' => 'Payment Process',
                 ],
                 'remark' => [
-                    'description' => 'Enter your login account for manual verification',
-                    'title' => 'Add a note',
+                    'description' => 'Provide account details for verification',
+                    'title' => 'Remark Information',
                 ],
             ],
         ],
         'method' => 'Payment Method',
-        'mobile_tips' => '<strong>Mobile Users:</strong> Long press the QR code -> Save image -> Open payment app -> Scan image to pay',
+        'mobile_tips' => '<strong>Mobile:</strong> Long-press → Save image → Open payment app → Scan from gallery',
         'order_creation' => [
-            'failed' => 'Order creation failed. Please try a different payment method!',
-            'info' => 'We will review your purchase/recharge within [24 hours]! Please be patient.',
-            'order_limit' => 'This item is limited to :limit_num purchases. You have already bought :count times.',
-            'order_timeout' => 'The order timed out and was automatically closed due to non-payment.',
-            'payment_disabled' => 'Order creation failed: Online payment feature is not enabled.',
-            'pending_order' => 'Order creation failed: There are pending orders. Please complete those payments first.',
-            'plan_required' => 'Please purchase a plan before buying the recharge package.',
-            'price_issue' => 'Order creation failed: Abnormal total order price',
-            'price_zero' => 'Order creation failed: The total order price is 0; online payment is not required.',
-            'product_unavailable' => 'Order creation failed: The item has been removed from sale.',
-            'success' => 'Order created successfully!',
-            'unknown_order' => 'Unknown order',
-            'unknown_payment' => 'Unknown payment method',
+            'failed' => 'Order creation failed. Try alternative payment method',
+            'info' => 'Order processing within 24 hours!',
+            'order_limit' => 'Limit: :limit_num per user. You\'ve already purchased :count!',
+            'order_timeout' => 'Order expired due to non-payment!',
+            'payment_disabled' => 'Order failed: Online payment is not enabled!',
+            'pending_order' => 'Order failed: Unpaid orders detected. Please pay or cancel it first!',
+            'plan_required' => 'Please purchase a subscription before buying add-ons!',
+            'price_issue' => 'Order failed: Abnormal total price!',
+            'price_zero' => 'Order not processed: No payment required for free items.',
+            'product_unavailable' => 'Order failed: Product is no longer available!',
+            'success' => 'Order created successfully',
+            'unknown_order' => 'Order not recognized',
+            'unknown_payment' => 'Payment method not recognized',
         ],
-        'qrcode_tips' => 'Please scan with <strong class="red-600">:software</strong>',
+        'qrcode_tips' => 'Scan with <strong class="red-600">:software</strong>',
         'redirect_stripe' => 'Redirecting to Stripe',
     ],
     'purchase' => [
-        'completed' => 'Purchase completed!',
-        'promotion' => 'Don\'t miss out—buy our services today!',
+        'completed' => 'Purchase completed',
+        'promotion' => 'Unlock services immediately',
         'required' => 'This feature is available to paid users only. Please',
-        'to_unlock' => 'Unlock with Purchase',
+        'to_unlock' => 'Purchase service to unlock',
     ],
-    'recharge' => 'Recharge',
-    'recharge_credit' => 'Credit Recharge',
-    'recharging' => 'Recharging...',
+    'recharge' => 'Top Up',
+    'recharge_credit' => 'Balance Top-up',
+    'recharging' => 'Processing payment...',
     'referral' => [
         'link' => 'Referral Link',
-        'logs' => 'Commission Logs',
+        'logs' => 'Commission Records',
         'msg' => [
-            'account' => 'Account expired, please purchase a plan first',
-            'applied' => 'Existing request, please wait for processing',
-            'error' => 'Error creating order, try again later or contact support',
-            'unfulfilled' => 'Need :amount to withdraw, keep going!',
-            'wait' => 'Please wait for admin approval',
+            'account' => 'Account expired',
+            'applied' => 'Application processing',
+            'error' => 'Application error',
+            'unfulfilled' => 'You need at least :amount to withdraw. Keep earning!',
+            'wait' => 'Pending review',
         ],
-        'total' => 'Total commission: :amount (:total times), can withdraw when over :money',
+        'total' => 'Accumulated rebate: :amount (:total times), can withdraw when reaching :money',
     ],
     'registered_at' => 'Registration Date',
     'reset_data' => [
-        'action' => 'Reset Data',
-        'cost' => 'Cost: <code>:amount</code>',
-        'cost_tips' => 'The reset will deduct :amount!',
+        'action' => 'Reset Traffic',
+        'cost' => 'Requires <code>:amount</code>',
+        'cost_tips' => 'This will deduct :amount from your account balance.',
     ],
-    'scan_qrcode' => 'Scan QR code with client',
+    'scan_qrcode' => 'Scan with client application',
     'service' => [
-        'country_count' => 'Covers <code>:num</code> countries or regions',
-        'node_count' => '<code>:num</code> high-quality nodes',
+        'country_count' => '<code>:num</code> countries/regions',
+        'node_count' => '<code>:num</code> premium nodes',
         'unlimited' => 'Unlimited speed',
     ],
     'shop' => [
-        'buy' => 'Buy',
-        'call4help' => 'Contact support if you have any questions',
-        'change_amount' => 'Recharge Amount',
-        'change_amount_help' => 'Enter recharge amount',
-        'conflict' => 'Conflict',
-        'conflict_tips' => '<p>The current purchase will be set as a <code>prepaid plan</code></p><ol><li>Prepaid plan will automatically activate after current plan expires</li><li>You can manually activate it after payment</li></ol>',
-        'description' => 'Description',
-        'hot' => 'Hot',
-        'limited' => 'Limited',
-        'pay_credit' => 'Pay with Credit',
-        'pay_online' => 'Pay Online',
+        'buy' => 'Purchase',
+        'support' => 'Contact support for assistance',
+        'change_amount' => 'Top-up Amount',
+        'change_amount_help' => 'Enter a custom amount',
+        'conflict' => 'Subscription Conflict',
+        'conflict_tips' => '<p>This purchase will be designated <code>prepaid</code></p><ol class="text-left"><li>Activates after current subscription expires</li><li>Manually activatable post-payment</li></ol>',
+        'description' => 'Service Description',
+        'hot' => 'Popular',
+        'limited' => 'Limited Offer',
+        'pay_credit' => 'Pay with Balance',
+        'pay_online' => 'Online Payment',
         'price' => 'Price',
         'quantity' => 'Quantity',
         'service' => 'Service',
@@ -215,62 +218,62 @@ return [
     ],
     'subscribe' => [
         'custom' => 'Custom Subscription',
-        'error' => 'Error changing subscription link',
-        'exchange_warning' => 'Changing the subscription link will:\n1. Revoke the current link immediately\n2. Change the connection password',
+        'error' => 'Subscription update failed',
+        'exchange_warning' => '<p>Changing your subscription link will:</p><ol class="text-left"><li>Immediately disable the old link;</li><li>Regenerate your connection password;</li></ol>',
         'info' => [
-            'download' => 'Download',
-            'title' => 'Account Summary [Non-Realtime]',
-            'total' => 'Plan Data',
-            'upload' => 'Upload',
+            'download' => 'Download Used',
+            'title' => 'Account Summary [Delayed]',
+            'total' => 'Allocated Traffic',
+            'upload' => 'Upload Used',
         ],
         'link' => 'Subscription Link',
-        'ss_only' => 'Subscribe SS only',
-        'ssr_only' => 'Subscribe SSR (incl. SS) only',
-        'tips' => 'Warning: This link is for personal use only. Do not share it, or your account may be banned for abnormal usage.',
-        'trojan_only' => 'Subscribe Trojan only',
-        'v2ray_only' => 'Subscribe V2Ray only',
+        'ss_only' => 'SS Only',
+        'ssr_only' => 'SSR (Includes SS)',
+        'tips' => 'Warning: This link is for personal use only. Sharing may result in account suspension.',
+        'trojan_only' => 'Trojan Only',
+        'v2ray_only' => 'V2Ray Only',
     ],
     'telegram' => [
-        'bind_exists' => 'This account is already linked to a Telegram account.',
-        'bind_missing' => 'No user information found. Please link your account first.',
+        'bind_exists' => 'Telegram account already linked',
+        'bind_missing' => 'No linked account found',
         'command' => [
-            'bind' => 'Link your :web_name account',
-            'intro' => 'You can use the following commands',
-            'traffic' => 'Check data usage',
-            'unbind' => 'Unlink',
-            'web_url' => 'Get the latest :web_name URL',
+            'bind' => 'Bind to :web_name account',
+            'intro' => 'You can use the following commands:',
+            'traffic' => 'Traffic query',
+            'unbind' => 'Unlink account',
+            'web_url' => 'Retrieve the latest :web_name access link',
         ],
-        'get_url' => 'The latest URL for :web_name is',
-        'params_missing' => 'Invalid parameters. Please include your email address and resend.',
-        'ticket_missing' => 'Ticket does not exist',
-        'ticket_reply' => 'Reply to ticket #`:id` was successful',
-        'traffic_query' => 'Data usage query',
-        'user_missing' => 'User does not exist',
+        'get_url' => ':web_name latest URL',
+        'params_missing' => 'Invalid parameters. Include email address',
+        'ticket_missing' => 'Ticket not found',
+        'ticket_reply' => 'Ticket #:id has a new reply',
+        'traffic_query' => 'Traffic query result',
+        'user_missing' => 'User not found',
     ],
     'ticket' => [
-        'attribute' => 'Ticket',
-        'close_msg' => 'Ticket ID :id closed by user',
-        'close_tips' => 'Confirm close ticket?',
-        'content_placeholder' => 'Provide detailed description of your issue to help us assist you better',
-        'error' => 'Unknown error! Please contact support',
-        'new' => 'Create New Ticket',
-        'online_hour' => 'Online Hours',
-        'reply' => 'Reply',
-        'reply_confirm' => 'Confirm reply ticket?',
-        'reply_placeholder' => 'Write something...',
-        'service_hours' => 'Customer Service Hours',
-        'service_tips' => 'Please use only <code>one</code> contact method to reach support! Repeated requests will delay response time.',
-        'submit_tips' => 'Confirm submit ticket?',
-        'title_placeholder' => 'Briefly describe your issue',
+        'attribute' => 'Support Ticket',
+        'close_msg' => 'Ticket #:id closed',
+        'close_tips' => 'Are you sure you want to close this ticket?',
+        'content_placeholder' => 'Please describe your issue or request in as much detail as possible so we can assist you promptly',
+        'error' => 'System error. Contact support',
+        'new' => 'Create Ticket',
+        'online_hour' => 'Support Hours',
+        'reply' => 'Respond',
+        'reply_confirm' => 'Confirm response?',
+        'reply_placeholder' => 'Enter response...',
+        'service_hours' => 'Support Availability',
+        'service_tips' => 'Kindly use <code>only one</code> contact method when reaching out to support. Multiple submissions may delay our response.',
+        'submit_tips' => 'Submit ticket?',
+        'title_placeholder' => 'Briefly describe the issue youre experiencing',
     ],
     'traffic_logs' => [
-        'daily' => 'This Month\'s Data Usage',
-        'hourly' => 'Today\'s Data Usage',
-        'tips' => 'Note: There is a delay in data statistics updates.',
+        'daily' => 'Monthly Usage',
+        'hourly' => 'Daily Usage',
+        'tips' => 'Note: Data updates may be delayed',
     ],
-    'tutorials' => 'Tutorials',
-    'withdraw' => 'Withdraw',
+    'tutorials' => 'Guides',
+    'withdraw' => 'Withdraw Funds',
     'withdraw_at' => 'Withdrawal Date',
-    'withdraw_commission' => 'Withdraw Commission',
-    'withdraw_logs' => 'Withdrawal Logs',
+    'withdraw_commission' => 'Commission Withdrawal',
+    'withdraw_logs' => 'Withdrawal History',
 ];

Failā izmaiņas netiks attēlotas, jo tās ir par lielu
+ 334 - 424
resources/lang/zh_CN/admin.php


+ 23 - 23
resources/lang/zh_CN/auth.php

@@ -3,13 +3,13 @@
 declare(strict_types=1);
 
 return [
-    'accept_term' => '我已阅读并同意遵守',
+    'accept_term' => '我已阅读并同意',
     'active' => [
         'attribute' => '激活',
         'error' => [
-            'activated' => '该账号已激活,无需再次激活',
-            'disable' => '本站关闭账号激活功能,您可直接登录!',
-            'throttle' => '您已触发激活请求限制,请稍后再尝试。如有问题,请联系:email',
+            'activated' => '账号已激活,请直接登录!',
+            'disable' => '本站关闭账号激活功能,您可直接登录!',
+            'throttle' => '您已触发激活请求限制,请稍后再尝试',
         ],
         'promotion' => '账号尚未激活,请先「:action」!',
         'sent' => '激活链接已发送至您的邮箱,请稍等或检查垃圾箱',
@@ -18,36 +18,36 @@ return [
     'captcha' => [
         'attribute' => '验证码',
         'error' => [
-            'failed' => '验证码错误,请重新输入',
-            'timeout' => '验证码已失效,请刷新后重试',
+            'failed' => '验证码输入有误,请重新输入!',
+            'timeout' => '验证码已过期,请刷新后重试!',
         ],
         'required' => '请正确完成验证码操作',
         'sent' => '验证码已发送至您的邮箱,请稍等或检查垃圾箱',
     ],
     'email' => [
         'error' => [
-            'banned' => '本站不支持您使用的邮箱服务商,请更换邮箱',
-            'invalid' => '该邮箱不在本站支持的邮箱列表内',
+            'banned' => '本站不支持您使用的邮箱服务商,请更换邮箱',
+            'invalid' => '您填写的邮箱不在本站支持的邮箱列表中!',
         ],
     ],
     'error' => [
-        'account_baned' => '您的账号已被禁!',
-        'login_error' => '登录出现错误,请稍后再试!',
+        'account_baned' => '您的账号已被禁!',
+        'login_error' => '登录过程中发生错误,请稍后重试!',
         'login_failed' => '登录失败,请检查账号或密码是否正确!',
-        'not_found_user' => '未找到关联的账号,请使用其他方式登录',
-        'repeat_request' => '请勿重复请求,请刷新后再试',
-        'url_timeout' => '链接已失效,请重新操作',
+        'not_found_user' => '未找到关联的账号,请使用其他方式登录',
+        'repeat_request' => '请勿重复请求,请刷新后再试',
+        'url_timeout' => '链接已失效,请重新操作',
     ],
     'failed' => '用户名或密码错误。',
     'invite' => [
         'get' => '点击获取邀请码',
         'not_required' => '无需邀请码,可直接注册!',
-        'unavailable' => '邀请码不可用,请重试',
+        'unavailable' => '邀请码无效,请重试!',
     ],
     'login' => '登录',
     'logout' => '登出',
-    'maintenance' => '维护',
-    'maintenance_tip' => '网站维护中',
+    'maintenance' => '系统维护',
+    'maintenance_tip' => '系统维护中,请稍后再访问!',
     'oauth' => [
         'login_failed' => '第三方登录失败!',
         'register' => '快速注册',
@@ -62,14 +62,14 @@ return [
         'reset' => [
             'attribute' => '重置密码',
             'error' => [
-                'demo' => '演示环境禁止修改管理员密码',
-                'disabled' => '本站关闭了密码重置功能,如遇问题请联系:email',
-                'same' => '新密码不能与旧密码相同,请重新输入',
-                'throttle' => '24小时内只能重设密码:time次,请勿频繁操作',
-                'wrong' => '旧密码错误,请重新输入',
+                'demo' => '演示环境禁止修改管理员密码',
+                'disabled' => '本站关闭了密码重置功能',
+                'same' => '新密码不能与旧密码相同,请重新设置!',
+                'throttle' => '每24小时仅可重设密码 :time 次,请勿频繁操作!',
+                'wrong' => '旧密码错误,请重新输入',
             ],
             'sent' => '重置成功,请查看您的邮箱(可能在垃圾箱中)',
-            'success' => '新密码设置成功,请前往登录页面',
+            'success' => '新密码设置成功,请前往登录页面登录。',
         ],
     ],
     'register' => [
@@ -85,5 +85,5 @@ return [
     'remember_me' => '记住我',
     'request' => '获取',
     'throttle' => '您尝试的登录次数过多,请 :seconds 秒后再试。',
-    'tos' => '用户条款',
+    'tos' => '服务条款',
 ];

+ 25 - 26
resources/lang/zh_CN/common.php

@@ -7,16 +7,16 @@ return [
     'action' => '操作',
     'active_item' => '激活:attribute',
     'add' => '添加',
-    'advance' => '进阶',
+    'advance' => '高级',
     'all' => '全部',
-    'applied' => ':attribute已生效',
+    'applied' => ':attribute已应用',
     'apply' => '应用',
-    'available_date' => '有效期',
+    'available_date' => '有效期',
     'avatar' => '头像',
     'back' => '返回',
-    'back_to' => '返回:page',
+    'back_to' => '返回:page',
     'bark' => [
-        'custom' => '自定义信息',
+        'custom' => '自定义',
         'node_status' => '节点状态',
     ],
     'cancel' => '取消',
@@ -28,14 +28,14 @@ return [
     'convert' => '转换',
     'copy' => [
         'attribute' => '复制',
-        'failed' => '复制失败,请手动复制',
+        'failed' => '复制失败,请手动执行',
         'success' => '复制成功',
     ],
     'create' => '创建',
-    'created_at' => '创建时间',
+    'created_at' => '创建日期',
     'customize' => '自定义',
     'days' => [
-        'attribute' => '{1} 天|{2} 日',
+        'attribute' => '{1}天|{2}日',
         'next' => '次日',
         'weekend' => '周末',
         'work' => '工作日',
@@ -44,14 +44,14 @@ return [
     'delete' => '删除',
     'deleted' => '已删除',
     'deleted_item' => ':attribute已删除',
-    'developing' => '开发中,敬请期待!',
+    'developing' => '功能开发中,敬请期待!',
     'download' => '下载',
     'edit' => '编辑',
     'error' => '错误',
-    'error_action_item' => ':action:attribute错',
-    'error_item' => ':attribute错',
-    'exists_error' => '该:attribute下存在关联账号,请先取消关联!',
-    'expired_at' => '期时间',
+    'error_action_item' => ':action:attribute错',
+    'error_item' => ':attribute错',
+    'exists_error' => ':attribute与其他账号有关联,请先解除关联!',
+    'expired_at' => '期时间',
     'export' => '导出',
     'failed' => '失败',
     'failed_action_item' => ':action:attribute失败',
@@ -59,17 +59,16 @@ return [
     'free' => '免费',
     'function' => [
         'fullscreen' => '全屏',
-        'menubar' => '菜单',
+        'menubar' => '菜单',
         'navigation' => '导航',
     ],
     'generate' => '生成',
     'generate_item' => '生成:attribute',
     'goto' => '前往',
-    'hour' => '{1} 小时|{2} 点',
+    'hour' => '{1}小时|{2}点',
     'import' => '导入',
     'latest_at' => '最近更新',
     'more' => '更多',
-    'new' => '新',
     'none' => '无',
     'open' => '打开',
     'or' => '或',
@@ -78,21 +77,21 @@ return [
             'canceled' => '已取消',
             'completed' => '已完成',
             'ongoing' => '使用中',
-            'prepaid' => '预付',
+            'prepaid' => '预付',
             'review' => '待确认',
         ],
     ],
     'payment' => [
         'alipay' => '支付宝',
         'credit' => '余额',
-        'crypto' => '虚拟货币',
+        'crypto' => '加密货币',
         'manual' => '人工支付',
         'qq' => 'QQ钱包',
         'wechat' => '微信支付',
     ],
     'print' => '打印',
     'qrcode' => ':attribute二维码',
-    'random_generate' => '留空随机生成',
+    'random_generate' => '留空随机生成',
     'recommend' => '推荐',
     'request' => '请求',
     'request_failed' => '请求失败,请重试',
@@ -122,17 +121,17 @@ return [
         'rejected' => '已驳回',
         'reply' => '已回复',
         'review' => '待审核',
-        'reviewed' => '审核通过待打款',
-        'run_out' => '流量耗尽',
-        'send_to_credit' => '打款至余额',
+        'reviewed' => '审核',
+        'run_out' => '已用尽',
+        'send_to_credit' => '转入余额',
         'unknown' => '未知',
         'unused' => '未使用',
         'used' => '已使用',
-        'withdrawal_pending' => '提现',
+        'withdrawal_pending' => '提现',
         'withdrawn' => '已提现',
     ],
-    'stay_unchanged' => '留空不变',
-    'storage_logo' => 'Logo存储',
+    'stay_unchanged' => '留空表示不变',
+    'storage_logo' => 'LOGO存储',
     'store' => '存储',
     'submit' => '提交',
     'success' => '成功',
@@ -140,7 +139,7 @@ return [
     'success_item' => ':attribute成功',
     'to' => '至',
     'to_be_send' => '待发送',
-    'to_safari' => '点击右上角<i class="icon wb-more-horizontal" aria-hidden="true"></i>,选择<img class="w-30 h-30 vertical-align-middle m-3" src="https://gw.alicdn.com/tfs/TB1xwiUNpXXXXaIXXXXXXXXXXXX-55-55.png" alt="Safari" />Safari 中打开<br>即可正常访问本站!',
+    'to_safari' => '点击右上角 <i class="icon wb-more-horizontal" aria-hidden="true"></i>,选择<img class="w-30 h-30 vertical-align-middle m-3" src="https://gw.alicdn.com/tfs/TB1xwiUNpXXXXaIXXXXXXXXXXXX-55-55.png" alt="Safari" /> Safari 中打开<br>即可正常访问本站!',
     'toggle' => '切换',
     'toggle_action' => '切换:action',
     'unlimited' => '无限制',

+ 20 - 20
resources/lang/zh_CN/errors.php

@@ -4,33 +4,33 @@ declare(strict_types=1);
 
 return [
     'forbidden' => [
-        'access' => '检测到未知IP或代理访问,禁止访问',
-        'bots' => '检测到机器人访问,禁止访问',
-        'china' => '检测到中国IP或代理访问,禁止访问',
-        'oversea' => '检测到海外IP或代理访问,禁止访问',
-        'redirect' => '识别到(:ip :url)通过订阅链接访问,强制重定向',
-        'unknown' => '未知禁止访问模式!请在系统设置中修改【禁止访问模式】!',
+        'access' => '检测到未知 IP 或代理,禁止访问',
+        'bots' => '检测到机器人访问,禁止访问',
+        'china' => '检测到中国 IP 或代理,禁止访问',
+        'oversea' => '检测到海外 IP 或代理,禁止访问',
+        'redirect' => '检测到 (:ip :url) 使用订阅链接访问,已强制重定向',
+        'unknown' => '未知拦截模式,请在系统设置中检查配置!',
     ],
-    'get_ip' => '获取IP信息异常',
+    'get_ip' => '获取 IP 信息失败',
     'log' => '日志',
     'refresh' => '刷新',
-    'refresh_page' => '请刷新页面后,再访问',
-    'report' => '错携带了报告:',
+    'refresh_page' => '请刷新页面后重试',
+    'report' => '错误报告内容:',
     'safe_code' => '请输入安全码',
     'safe_enter' => '安全入口访问',
     'subscribe' => [
-        'banned_until' => '账号封禁至:time,请解封后再更新!',
-        'expired' => '账号已过期,请续费!',
-        'none' => '无可用节点',
-        'out' => '流量耗尽,请重新购买或重置流量!',
-        'question' => '账号存在问题,请前往官网查询!',
-        'sub_banned' => '链接已被封禁,请前往官网查询原因',
-        'unknown' => '使用了错误的链接,请重新获取链接!',
-        'user' => '使用了错误的链接,账号不存在!请重新获取链接!',
-        'user_disabled' => '账号被禁用!',
+        'banned_until' => '账号封禁至 :time,请解封后再尝试更新!',
+        'expired' => '账号已过期,请续费后使用!',
+        'none' => '无可用节点',
+        'out' => '流量已用尽,请购买或重置流量!',
+        'question' => '账号存在异常,请前往官网查询详情!',
+        'sub_banned' => '订阅链接已被封禁,请前往官网了解原因!',
+        'unknown' => '订阅链接无效,请重新获取!',
+        'user' => '链接无效,账号不存在,请重新获取!',
+        'user_disabled' => '账号被禁用!',
     ],
-    'title' => '⚠️错误触发',
+    'title' => '⚠️ 发生错误',
     'unsafe_enter' => '非安全入口访问',
     'visit' => '请访问',
-    'whoops' => '哎!',
+    'whoops' => '哎!',
 ];

+ 185 - 52
resources/lang/zh_CN/model.php

@@ -26,26 +26,26 @@ return [
         'type' => '类型',
     ],
     'country' => [
-        'code' => '国家/地区代码',
+        'code' => '国家代码',
         'icon' => '国旗',
-        'name' => '国家/地区名称',
+        'name' => '国家名称',
     ],
     'coupon' => [
         'attribute' => '卡券',
         'groups' => '分组限制',
         'levels' => '等级限制',
         'logo' => '图片',
-        'minimum' => '满减条件',
+        'minimum' => '最低消费',
         'name' => '名称',
         'newbie' => '新用户专享',
         'num' => '数量',
-        'priority' => '权重',
+        'priority' => '优先级',
         'services_blacklist' => '禁用商品',
         'services_whitelist' => '适用商品',
-        'sn' => '卡号',
+        'sn' => '券码',
         'usable_times' => '使用次数',
-        'used' => '个人限制',
-        'users_blacklist' => '禁用户',
+        'used' => '每人限用',
+        'users_blacklist' => '禁用户',
         'users_whitelist' => '允许用户',
         'value' => '面值',
     ],
@@ -56,13 +56,13 @@ return [
         'color' => '颜色',
         'hot' => '热销',
         'info' => '自定义信息',
-        'invite_num' => '赠邀请名额',
-        'limit_num' => '限购数量',
-        'logo' => '商品图',
+        'invite_num' => '赠邀请名额',
+        'limit_num' => '每人限购',
+        'logo' => '商品图',
         'name' => '名称',
-        'period' => '周期',
+        'period' => '重置周期',
         'price' => '售价',
-        'renew' => '流量重置价',
+        'renew' => '流量重置价',
         'traffic' => '流量',
         'user_limit' => '用户限速',
     ],
@@ -74,23 +74,23 @@ return [
         'attribute' => '节点',
         'client_limit' => '设备限制',
         'country' => '国家/地区',
-        'data_consume' => '产生流量',
-        'data_rate' => '流量计算系数',
+        'data_consume' => '消耗流量',
+        'data_rate' => '流量系数',
         'ddns' => 'DDNS',
-        'detection' => '阻断检测',
+        'detection' => '封锁检测',
         'display' => '显示与订阅',
         'domain' => '域名',
-        'id' => '节点 ID',
-        'ipv4' => 'IPv4 地址',
-        'ipv6' => 'IPv6 地址',
+        'id' => '节点ID',
+        'ipv4' => 'IPv4地址',
+        'ipv6' => 'IPv6地址',
         'label' => '标签',
         'method' => '加密方式',
-        'name' => '名称',
+        'name' => '节点名称',
         'next_renewal_date' => '下次续费日期',
-        'obfs' => '混淆',
+        'obfs' => '混淆协议',
         'obfs_param' => '混淆参数',
-        'online_user' => '在线人数',
-        'protocol' => '协议',
+        'online_user' => '在线用户',
+        'protocol' => '传输协议',
         'protocol_param' => '协议参数',
         'push_port' => '推送端口',
         'relay_port' => '中转端口',
@@ -98,33 +98,33 @@ return [
         'service_port' => '服务端口',
         'single' => '单端口',
         'single_passwd' => '单端口密码',
-        'static' => '存活状态',
+        'static' => '运行状态',
         'subscription_term' => '订阅周期',
-        'traffic_limit' => '限速',
-        'transfer' => '中继',
-        'udp' => 'UDP',
-        'v2_alter_id' => '额外 ID',
-        'v2_cover' => '伪装类型',
+        'traffic_limit' => '流量限制',
+        'transfer' => '中继设置',
+        'udp' => 'UDP支持',
+        'v2_alter_id' => '额外ID',
+        'v2_cover' => '流量伪装',
         'v2_host' => '伪装域名',
-        'v2_net' => '传输方式',
-        'v2_path' => '路径密钥',
+        'v2_net' => '传输协议',
+        'v2_path' => '路径/密钥',
         'v2_sni' => 'SNI',
-        'v2_tls' => 'TLS连接',
-        'v2_tls_provider' => 'TLS 配置',
+        'v2_tls' => 'TLS加密',
+        'v2_tls_provider' => 'TLS证书配置',
     ],
     'node_auth' => [
-        'attribute' => '节点授权',
-        'key' => '通信密钥<small>节点用</small>',
+        'attribute' => '节点认证',
+        'key' => '通信密钥',
         'secret' => '反向密钥',
     ],
     'node_cert' => [
         'attribute' => '证书',
         'domain' => '域名',
-        'expired_date' => '终止时间',
+        'expired_date' => '到期时间',
         'issuer' => '签发机构',
-        'key' => '钥',
+        'key' => '钥',
         'pem' => '证书',
-        'signed_date' => '颁发时间',
+        'signed_date' => '签发日期',
     ],
     'notification' => [
         'address' => '收件地址',
@@ -163,10 +163,11 @@ return [
         'attribute' => '规则',
         'name' => '描述',
         'pattern' => '匹配值',
+        'logs' => '触发记录',
     ],
     'rule_group' => [
         'attribute' => '规则组',
-        'name' => '名',
+        'name' => '名',
         'rules' => '规则',
         'type' => '模式',
     ],
@@ -177,7 +178,7 @@ return [
         'req_header' => '请求头',
         'req_ip' => '请求IP',
         'req_times' => '请求次数',
-        'updated_at' => '最后请求时间',
+        'updated_at' => '最后请求',
     ],
     'user' => [
         'account_status' => '账号状态',
@@ -186,13 +187,13 @@ return [
         'credit' => '余额',
         'expired_date' => '过期时间',
         'id' => '用户ID',
-        'invite_num' => '可用邀请名额',
+        'invite_num' => '邀请名额',
         'inviter' => '邀请人',
         'nickname' => '昵称',
         'password' => '密码',
         'port' => '端口',
-        'proxy_method' => '加密方式',
-        'proxy_obfs' => '混淆方式',
+        'proxy_method' => '传输加密',
+        'proxy_obfs' => '流量伪装',
         'proxy_passwd' => '代理密码',
         'proxy_protocol' => '代理协议',
         'proxy_status' => '代理状态',
@@ -201,7 +202,7 @@ return [
         'reset_date' => '流量重置日',
         'role' => '用户角色',
         'service' => '代理服务',
-        'speed_limit' => '速限制',
+        'speed_limit' => '速限制',
         'traffic_used' => '已用流量',
         'usable_traffic' => '可用流量',
         'username' => '用户名',
@@ -209,15 +210,15 @@ return [
         'wechat' => '微信',
     ],
     'user_credit' => [
-        'after' => '变更后余额',
-        'amount' => '变更额',
-        'before' => '变更前余额',
-        'created_at' => '变更时间',
+        'after' => '变更后',
+        'amount' => '变更额',
+        'before' => '变更前',
+        'created_at' => '记录时间',
     ],
     'user_data_modify' => [
-        'after' => '变更后流量',
-        'before' => '变更前流量',
-        'created_at' => '变更时间',
+        'after' => '变更后',
+        'before' => '变更前',
+        'created_at' => '记录时间',
     ],
     'user_group' => [
         'attribute' => '用户组',
@@ -225,9 +226,141 @@ return [
         'nodes' => '节点',
     ],
     'user_traffic' => [
-        'download' => '下流量',
+        'download' => '下流量',
         'log_time' => '记录时间',
         'total' => '总流量',
-        'upload' => '上传流量',
+        'upload' => '上行流量',
+    ],
+    'config' => [
+        'AppStore_id' => 'Apple ID',
+        'AppStore_password' => 'Apple密码',
+        'account_expire_notification' => '账号过期通知',
+        'active_times' => '激活次数限制',
+        'admin_invite_days' => '管理邀请码有效期',
+        'affiliate_link_salt' => '邀请链接加密',
+        'alipay_qrcode' => '支付宝收款码',
+        'auto_release_port' => '端口回收',
+        'ban_duration' => '封禁时长',
+        'bark_key' => 'Bark设备号',
+        'captcha_key' => '验证码Key',
+        'captcha_secret' => '验证码Secret/ID',
+        'checkin_interval' => '签到间隔',
+        'checkin_reward' => '签到奖励',
+        'codepay_id' => '码支付ID',
+        'codepay_key' => '通信密钥',
+        'codepay_url' => '请求URL',
+        'cryptomus_api_key' => 'API key',
+        'cryptomus_merchant_uuid' => 'Merchant ID',
+        'data_anomaly_notification' => '流量异常通知',
+        'data_exhaust_notification' => '流量耗尽通知',
+        'ddns_key' => 'DNS Key',
+        'ddns_mode' => 'DDNS模式',
+        'ddns_secret' => 'DNS Secret',
+        'default_days' => '初始有效期',
+        'default_traffic' => '初始流量',
+        'detection_check_times' => '封锁检测通知',
+        'dingTalk_access_token' => '钉钉Access Token',
+        'dingTalk_secret' => '钉钉密钥',
+        'epay_key' => '商户密钥',
+        'epay_mch_id' => '商户ID',
+        'epay_url' => '接口地址',
+        'expire_days' => '过期警告阈值',
+        'f2fpay_app_id' => '应用ID',
+        'f2fpay_private_key' => '应用私钥',
+        'f2fpay_public_key' => '支付宝公钥',
+        'forbid_mode' => '访问拦截模式',
+        'iYuu_token' => 'IYUU令牌',
+        'invite_num' => '初始邀请名额',
+        'is_AliPay' => '支付宝',
+        'is_QQPay' => 'QQ钱包',
+        'is_WeChatPay' => '微信支付',
+        'is_activate_account' => '账号激活',
+        'is_ban_status' => '过期自动封禁',
+        'is_captcha' => '验证码',
+        'is_clear_log' => '自动清理日志',
+        'is_custom_subscribe' => '高级订阅',
+        'is_email_filtering' => '邮箱过滤',
+        'is_forbid_robot' => '拦截机器人',
+        'is_free_code' => '免费邀请码',
+        'is_invite_register' => '邀请注册',
+        'is_otherPay' => '特殊支付',
+        'is_rand_port' => '随机端口',
+        'is_register' => '开放注册',
+        'maintenance_content' => '维护公告',
+        'maintenance_mode' => '维护模式',
+        'maintenance_time' => '维护结束时间',
+        'min_port' => '端口范围',
+        'node_blocked_notification' => '节点阻断通知',
+        'node_daily_notification' => '每日节点报告',
+        'node_offline_notification' => '节点离线通知',
+        'node_renewal_notification' => '节点续费提醒',
+        'oauth_path' => '第三方登录',
+        'offline_check_times' => '离线通知次数',
+        'password_reset_notification' => '密码重置',
+        'paybeaver_app_id' => 'App ID',
+        'paybeaver_app_secret' => 'App Secret',
+        'payjs_key' => '通信密钥',
+        'payjs_mch_id' => '商户号',
+        'payment_callback_url' => '支付回调地址',
+        'payment_confirm_notification' => '人工支付通知',
+        'payment_received_notification' => '支付成功通知',
+        'paypal_app_id' => 'APP ID',
+        'paypal_client_id' => 'Client ID',
+        'paypal_client_secret' => 'Client Secret Key',
+        'pushDeer_key' => 'PushDeer Key',
+        'pushplus_token' => 'PushPlus Token',
+        'rand_subscribe' => '随机订阅',
+        'recently_heartbeat' => '节点负载近期阈值',
+        'redirect_url' => '重定向地址',
+        'referral_money' => '最低提现金额',
+        'referral_percent' => '返利比例',
+        'referral_reward_type' => '返利模式',
+        'referral_status' => '推广功能',
+        'referral_traffic' => '注册赠流量',
+        'register_ip_limit' => '同IP注册限制',
+        'reset_password_times' => '每日密码重置上限',
+        'reset_traffic' => '周期性流量重置',
+        'server_chan_key' => 'ServerChan SCKEY',
+        'standard_currency' => '本位货币',
+        'stripe_public_key' => 'Public Key',
+        'stripe_secret_key' => 'Secret Key',
+        'stripe_signing_secret' => 'WebHook Signing Secret',
+        'subject_name' => '商品名称',
+        'subscribe_domain' => '订阅地址',
+        'subscribe_max' => '订阅节点数',
+        'subscribe_rate_limit' => '订阅请求限制',
+        'tasks_chunk' => '分段处理量',
+        'tasks_clean' => '清理任务',
+        'tasks_close' => '关闭任务',
+        'telegram_token' => 'Telegram Token',
+        'tg_chat_token' => 'TG酱Token',
+        'theadpay_key' => '商户密钥',
+        'theadpay_mchid' => '商户ID',
+        'theadpay_url' => '接口地址',
+        'ticket_closed_notification' => '工单关闭通知',
+        'ticket_created_notification' => '新工单通知',
+        'ticket_replied_notification' => '工单回复通知',
+        'traffic_abuse_limit' => '流量异常阈值',
+        'traffic_warning_percent' => '流量耗尽警告阈值',
+        'trojan_license' => 'Trojan授权',
+        'user_invite_days' => '用户邀请码有效期',
+        'username_type' => '账号类型',
+        'v2ray_license' => 'V2Ray授权',
+        'v2ray_tls_provider' => 'V2Ray TLS',
+        'web_api_url' => '授权/后端访问域名',
+        'webmaster_email' => '站点管理员邮箱',
+        'website_customer_service_code' => '客服代码',
+        'website_home_logo' => '首页LOGO',
+        'website_logo' => '站内LOGO',
+        'website_name' => '网站名称',
+        'website_security_code' => '安全码',
+        'website_statistics_code' => '统计代码',
+        'website_url' => '网站地址',
+        'wechat_aid' => '应用ID',
+        'wechat_cid' => '企业ID',
+        'wechat_encodingAESKey' => 'EncodingAESKey',
+        'wechat_qrcode' => '微信收款码',
+        'wechat_secret' => '应用密钥',
+        'wechat_token' => 'TOKEN',
     ],
 ];

+ 3 - 3
resources/lang/zh_CN/notification.php

@@ -23,9 +23,9 @@ return [
     'new_ticket' => '您收到了一个新工单 [标题: :title],请点击查看详细内容。',
     'next_check_time' => '下次节点阻断检测时间::time',
     'node' => [
-        'download' => '下载流量',
-        'total' => '总流量',
-        'upload' => '上传流量',
+        'download' => '下',
+        'total' => '总',
+        'upload' => '上',
     ],
     'node_block' => '节点阻断警告通知',
     'node_offline' => '节点离线警告',

+ 126 - 123
resources/lang/zh_CN/user.php

@@ -4,21 +4,21 @@ declare(strict_types=1);
 
 return [
     'account' => [
-        'connect_password' => '代理连接密码',
+        'connect_password' => '节点连接密码',
         'credit' => '账户余额',
         'group' => '所属分组',
-        'last_login' => '最登录',
+        'last_login' => '最登录',
         'level' => '账号等级',
         'reason' => [
-            'expired' => '账号套餐已过期',
-            'normal' => '账号一切正常',
-            'overused' => '本时段使用流量超过 <code>:data</code> GB,触发限制<br/> <code id="banedTime">:min</code> 后解除',
-            'traffic_exhausted' => '套餐流量已用完',
-            'unknown' => '未知原因,请刷新浏览器后重试。如问题持续,请联系客服',
+            'expired' => '套餐已过期',
+            'normal' => '账号状态正常',
+            'overused' => '超出 <code>:data</code>GB 限额,<code id="banedTime">:min</code> 分钟后恢复使用',
+            'traffic_exhausted' => '套餐流量已耗尽',
+            'unknown' => '未知错误,请刷新重试',
         ],
         'remain' => '剩余流量',
         'reset' => '{0} 还有 <code id="restTime">:days</code> 重置流量|[1,*] 还有 :days 天重置流量',
-        'speed_limit' => '速',
+        'speed_limit' => '速率限制',
         'status' => '账号状态',
         'time' => '套餐有效期',
     ],
@@ -27,146 +27,149 @@ return [
         'data' => '流量',
         'ip' => 'IP地址',
         'isp' => '运营商',
-        'node' => '线路',
+        'node' => '节点',
     ],
     'bought_at' => '购买日期',
     'clients' => '客户端',
     'contact' => '联系方式',
     'coupon' => [
-        'discount' => '优惠',
+        'discount' => '折扣',
         'error' => [
             'expired' => '优惠券已过期',
             'inactive' => '优惠券尚未生效',
             'minimum' => '本券最低使用金额为 :amount',
             'overused' => '本券只能使用 :times 次',
-            'run_out' => '优惠券已完',
-            'services' => '商品不符合折扣条件,请查看促销条款',
-            'unknown' => '无效优惠券',
-            'unmet' => '不满足使用条件',
+            'run_out' => '优惠券已完',
+            'services' => '商品不符合使用条件,请查看促销条款',
+            'unknown' => '无效券',
+            'unmet' => '使用条件未满足',
             'used' => '优惠券已被使用',
-            'users' => '账不符合促销条件',
-            'wait' => '活动将于 :time 生效,请耐心等待!',
+            'users' => '账不符合促销条件',
+            'wait' => '该优惠将于 :time 开始,请耐心等待!',
         ],
-        'input' => '输入充值券码',
+        'input' => '输入充值券码',
     ],
     'current_role' => '当前身份',
-    'error_response' => '出现了错误,请稍后再试。',
+    'error_response' => '系统繁忙,请稍后重试',
     'home' => [
         'announcement' => '公告',
         'attendance' => [
             'attribute' => '签到',
-            'disable' => '系统未开启签到功能',
-            'done' => '今天已经签到过了,请明天再试!',
-            'failed' => '系统异常',
-            'success' => '签到成功,获得 :data 流量',
+            'disable' => '签到功能已关闭',
+            'done' => '今日已签到',
+            'failed' => '系统异常',
+            'success' => '签到成功 +:data 流量',
         ],
-        'chat_group' => '聊天群组',
+        'chat_group' => '官方社群',
         'empty_announcement' => '暂无公告',
         'traffic_logs' => '流量记录',
-        'wechat_push' => '微信推送',
+        'wechat_push' => '微信通知',
     ],
     'invite' => [
         'attribute' => '邀请码',
-        'counts' => '共计 <code>:num</code> 枚邀请码',
-        'generate_failed' => '生成失败:已无邀请码生成名额',
+        'counts' => '可用:<code>:num</code> 枚',
+        'generate_failed' => '生成额度不足',
         'logs' => '邀请记录',
-        'promotion' => '通过您的邀请码注册并激活,您和受邀用户将获得 <mark>:traffic</mark> 流量奖励;当他们消费时,您将获得他们消费金额的 <mark>:referral_percent%</mark> 作为奖励。',
-        'tips' => '剩余 <strong>:num</strong> 枚可用邀请名额,邀请码创建后 :days 天内有效',
+        'promotion' => [
+            'base' => '成功邀请奖励:<br>&nbsp;&nbsp;&nbsp;&nbsp;• 双方各获 <mark>:traffic</mark> 流量;',
+            'bonus' => [
+                0 => '',
+                1 => '<br>&nbsp;&nbsp;&nbsp;&nbsp;• 受邀者<strong>首次</strong>购买套餐时,你将获 <mark>:referral_percent%</mark> 返利;',
+                2 => '<br>&nbsp;&nbsp;&nbsp;&nbsp;• 受邀者<strong>每次</strong>消费,你都将获 <mark>:referral_percent%</mark> 返利;',
+            ],
+        ],
+        'tips' => '剩余名额:<strong>:num</strong>,有效期 :days 天',
     ],
-    'invitee' => '受邀者',
-    'inviter' => '邀请者',
+    'invitee' => '受邀用户',
+    'inviter' => '邀请',
     'invoice' => [
-        'active_prepaid_question' => '是否提前启用预付套餐?',
-        'active_prepaid_tips' => '启用后:<br>现有账号套餐将失效<br>账号过期日期将重新计算',
+        'active_prepaid_question' => '启用预付套餐?',
+        'active_prepaid_tips' => '<p class="text-left">提取启用意味着:</p><ol class="text-left"><li>当前套餐将立即失效,剩余有效期作废;</li><li>新套餐将立刻生效,并从当前时间起开始计算;</li></ol>',
         'amount' => '金额',
         'attribute' => '订单',
         'detail' => '消费记录',
     ],
-    'knowledge' => [
-        'basic' => '基础',
-        'title' => '知识库',
-    ],
     'menu' => [
-        'admin_dashboard' => '管理',
-        'help' => '帮助',
-        'home' => '页',
-        'invites' => '邀请',
-        'invoices' => '单',
-        'nodes' => '线路',
-        'profile' => '设置',
-        'promotion' => '推广',
-        'shop' => '服务',
-        'tickets' => '工单',
+        'admin_dashboard' => '管理后台',
+        'help' => '帮助中心',
+        'home' => '首页',
+        'invites' => '邀请管理',
+        'invoices' => '我的订单',
+        'nodes' => '节点列表',
+        'profile' => '账户设置',
+        'promotion' => '推广计划',
+        'shop' => '服务商店',
+        'tickets' => '我的工单',
     ],
     'node' => [
         'info' => '配置信息',
-        'rate' => ':ratio 倍流量消耗',
+        'rate' => '流量倍率: :ratio',
         'setting' => '代理设置',
-        'unstable' => '线路波动/维护中',
+        'unstable' => '波动/维护中',
     ],
     'oauth' => [
         'bind' => '绑定',
         'bind_title' => '绑定社交账号',
-        'not_bind' => '未绑定',
-        'rebind' => '重新绑定',
+        'not_bind' => '未绑定',
+        'rebind' => '换绑',
         'unbind' => '解绑',
     ],
     'pay' => '支付',
     'payment' => [
-        'close_tips' => '请在 <code>:minutes</code> 分钟内完成支付,否则订单将被取消',
-        'creating' => '正在创建支付订单...',
-        'error' => '充值金额不合法',
-        'insufficient_balance' => '您的余额不足,请先充值',
+        'close_tips' => '请在 <code>:minutes</code> 分钟内完成支付',
+        'creating' => '创建订单...',
+        'error' => '金额不合法',
+        'insufficient_balance' => '余额不足',
         'manual' => [
-            'hint' => '扫码支付后,请按顺序点击【下一步】,直到点击【提交】完成支付',
+            'hint' => '支付后按流程提交凭证',
             'next' => '下一步',
-            'payment_tips' => '支付时,请充值对应金额(多不退,少需补)',
+            'payment_tips' => '请准确支付(少要补)',
             'pre' => '上一步',
-            'red_packet' => '支付宝红包',
+            'red_packet' => '支付宝红包',
             'steps' => [
                 'complete' => [
-                    'description' => '等待支付人工核',
+                    'description' => '等待人工核',
                     'title' => '完成',
                 ],
                 'notice' => [
-                    'description' => '如何正确人工支付',
+                    'description' => '人工支付指南',
                     'title' => '须知',
                 ],
                 'payment' => [
-                    'description' => '获取支付二维码,进行支付',
+                    'description' => '扫描二维码,进行支付',
                     'title' => '支付',
                 ],
                 'remark' => [
-                    'description' => '填写登录账号,以便人工核对',
-                    'title' => '备注账号',
+                    'description' => '填写账号,以便人工核对',
+                    'title' => '备注',
                 ],
             ],
         ],
         'method' => '支付方式',
-        'mobile_tips' => '<strong>手机用户</strong>:长按二维码 -> 保存图片 -> 打开支付应用 -> 扫一扫 -> 选择相册 -> 选择图片付款',
+        'mobile_tips' => '<strong>手机用户</strong>:长按保存 → 支付APP扫相册',
         'order_creation' => [
             'failed' => '创建订单失败,请尝试其他支付方式!',
-            'info' => '我们将在【24小时】内对购买/充值的款项进行开通!请耐心等待',
-            'order_limit' => '此商品限购 :limit_num 次,您已购买 :count 次',
-            'order_timeout' => '订单超时未支付,已自动关闭',
-            'payment_disabled' => '订单创建失败:系统未开启在线支付功能',
-            'pending_order' => '订单创建失败:尚有未支付的订单,请先完成支付',
-            'plan_required' => '购买加油包前,请先购买套餐',
-            'price_issue' => '订单创建失败:订单总价异常',
-            'price_zero' => '订单创建失败:订单总价为0,无需使用在线支付',
-            'product_unavailable' => '订单创建失败:商品已下架',
+            'info' => '我们将在【24小时】内对购买/充值的款项进行开通!请耐心等待',
+            'order_limit' => '此商品限购 :limit_num 次,您已购买 :count 次',
+            'order_timeout' => '订单超时未支付,已自动关闭',
+            'payment_disabled' => '订单创建失败:系统未开启在线支付功能',
+            'pending_order' => '订单创建失败:你有未支付订单,请先完成或取消!',
+            'plan_required' => '购买加油包前,请先购买套餐',
+            'price_issue' => '订单创建失败:订单总价异常',
+            'price_zero' => '订单创建失败:订单总价为0,无需使用在线支付',
+            'product_unavailable' => '订单创建失败:商品已下架',
             'success' => '创建订单成功!',
             'unknown_order' => '未知订单',
             'unknown_payment' => '未知支付方式',
         ],
         'qrcode_tips' => '请使用 <strong class="red-600">:software</strong> 扫描此二维码',
-        'redirect_stripe' => '跳转至 Stripe 支付界面',
+        'redirect_stripe' => '跳转至Stripe支付',
     ],
     'purchase' => [
         'completed' => '购买完成!',
-        'promotion' => '快来购买服务吧!',
+        'promotion' => '立即解锁服务',
         'required' => '此功能仅限付费用户,请先',
-        'to_unlock' => '购买服务解锁',
+        'to_unlock' => '购买解锁',
     ],
     'recharge' => '充值',
     'recharge_credit' => '余额充值',
@@ -176,33 +179,33 @@ return [
         'logs' => '佣金记录',
         'msg' => [
             'account' => '账号已过期,请先购买服务',
-            'applied' => '已有申请,请等待之前的申请处理完',
-            'error' => '返利单建立失败,请稍后尝试或联系管理员',
-            'unfulfilled' => '满 :amount 才可提现,请继续努力',
-            'wait' => '等待管理员审核',
+            'applied' => '已有申请,请等待前一个申请处理完成',
+            'error' => '申请失败,请稍后尝试或发起工单咨询',
+            'unfulfilled' => '满 :amount 元方可提现,请继续努力!',
+            'wait' => '等待审核',
         ],
-        'total' => '计返利 :amount(:total 次),满 :money 可提现',
+        'total' => '计返利 :amount(:total 次),满 :money 可提现',
     ],
-    'registered_at' => '注册时间',
+    'registered_at' => '注册日期',
     'reset_data' => [
         'action' => '重置流量',
-        'cost' => '需 <code>:amount</code>',
-        'cost_tips' => '本次重置流量将扣除余额 :amount!',
+        'cost' => '需 <code>:amount</code>',
+        'cost_tips' => '此操作将扣除 :amount 余额',
     ],
-    'scan_qrcode' => '请使用客户端扫描二维码',
+    'scan_qrcode' => '客户端扫码添加',
     'service' => [
-        'country_count' => '覆盖 <code>:num</code> 个国家地区',
-        'node_count' => '<code>:num</code> 条优质线路',
-        'unlimited' => '不限速',
+        'country_count' => '覆盖 <code>:num</code> 个国家/地区',
+        'node_count' => '<code>:num</code> 个优质节点',
+        'unlimited' => '无速率限制',
     ],
     'shop' => [
-        'buy' => '购买',
-        'call4help' => '如有疑问请开工单联系客服',
+        'buy' => '立即购买',
+        'support' => '疑问?联系客服',
         'change_amount' => '充值金额',
-        'change_amount_help' => '输入充值金额',
+        'change_amount_help' => '输入金额',
         'conflict' => '套餐冲突',
         'conflict_tips' => '<p>当前购买套餐将设置为 <code>预付套餐</code></p><ol class="text-left"><li>预付套餐将在当前套餐失效后自动生效</li><li>您也可以在支付后在订单页面手动激活预付套餐</li></ol>',
-        'description' => '描述',
+        'description' => '商品描述',
         'hot' => '热销',
         'limited' => '限购',
         'pay_credit' => '余额支付',
@@ -215,8 +218,8 @@ return [
     ],
     'subscribe' => [
         'custom' => '自定义订阅',
-        'error' => '更换订阅地址失败',
-        'exchange_warning' => '更换订阅地址将导致:\n1.旧地址立即失效\n2.连接密码被更改',
+        'error' => '订阅地址更新失败',
+        'exchange_warning' => '<p>更换订阅地址将导致</p><ol class="text-left"><li>旧地址立即失效;</li><li>节点连接密码被更改;</li></ol>',
         'info' => [
             'download' => '已用下行',
             'title' => '账户摘要 [非实时]',
@@ -224,53 +227,53 @@ return [
             'upload' => '已用上行',
         ],
         'link' => '订阅链接',
-        'ss_only' => '只订阅SS',
-        'ssr_only' => '只订阅SSR(含SS)',
-        'tips' => '警告:该订阅链接仅限个人使用,请勿传播,否则将导致账号流量异常并触发封号机制。',
-        'trojan_only' => '只订阅Trojan',
-        'v2ray_only' => '只订阅V2Ray',
+        'ss_only' => '仅SS订阅',
+        'ssr_only' => 'SSR订阅(含SS)',
+        'tips' => '警告:此链接仅限个人使用,传播将导致封号',
+        'trojan_only' => '仅Trojan订阅',
+        'v2ray_only' => '仅V2Ray订阅',
     ],
     'telegram' => [
-        'bind_exists' => '该账号已经绑定了Telegram账号',
-        'bind_missing' => '没有查询到您的用户信息,请先绑定账号',
+        'bind_exists' => 'Telegram账号已绑定',
+        'bind_missing' => '未查询到绑定信息',
         'command' => [
-            'bind' => '绑定你的:web_name账号',
-            'intro' => '以使以下指令',
-            'traffic' => '查询流量信息',
-            'unbind' => '解除绑定',
-            'web_url' => '获取最新:web_name网址',
+            'bind' => '绑定:web_name账号',
+            'intro' => '可用指令',
+            'traffic' => '流量查询',
+            'unbind' => '解绑账号',
+            'web_url' => '获取:web_name最新网址',
         ],
-        'get_url' => ':web_name的最新网址是',
+        'get_url' => ':web_name 最新网址',
         'params_missing' => '参数有误,请携带邮箱地址发送',
         'ticket_missing' => '工单不存在',
-        'ticket_reply' => '#`:id` 工单回复成功',
+        'ticket_reply' => '工单 #:id 已回复',
         'traffic_query' => '流量查询',
         'user_missing' => '用户不存在',
     ],
     'ticket' => [
         'attribute' => '工单',
-        'close_msg' => '工单:ID:id 用户已手动关闭',
-        'close_tips' => '确定要关闭该工单吗?',
-        'content_placeholder' => '请详细描述您的问题或需要帮助的地方,以便我们快速解决',
-        'error' => '出现未知错误,请联系客服处理',
-        'new' => '创建新工单',
-        'online_hour' => '在线时',
+        'close_msg' => '工单 #:id 已关闭',
+        'close_tips' => '确认关闭此工单?',
+        'content_placeholder' => '请尽量详细描述问题或需求,我们将尽快协助您处理',
+        'error' => '系统异常,请联系客服',
+        'new' => '新建工单',
+        'online_hour' => '在线时',
         'reply' => '回复',
-        'reply_confirm' => '确定回复工单吗?',
+        'reply_confirm' => '确认回复?',
         'reply_placeholder' => '说点什么吧?',
-        'service_hours' => '客服工作时间',
-        'service_tips' => '本站有多种联系方式,请使用其中 <code>一种</code> 联系客服!<br>重复请求会影响客服处理。',
-        'submit_tips' => '确定提交工单吗?',
-        'title_placeholder' => '请简单描述您的问题类型或涉及的内容',
+        'service_hours' => '客服时间',
+        'service_tips' => '请通过 <code>一种</code> 联系方式联系客服,避免重复提交,以免影响处理进度。',
+        'submit_tips' => '确认提交工单?',
+        'title_placeholder' => '请简要说明您遇到的问题',
     ],
     'traffic_logs' => [
-        'daily' => '本月流量使用情况',
-        'hourly' => '今日流量使用情况',
-        'tips' => '提示:流量统计更新有一定延迟。',
+        'daily' => '本月流量',
+        'hourly' => '今日流量',
+        'tips' => '提示:数据更新有延迟',
     ],
-    'tutorials' => '教程',
+    'tutorials' => '使用教程',
     'withdraw' => '提现',
     'withdraw_at' => '提现日期',
-    'withdraw_commission' => '提取佣金',
+    'withdraw_commission' => '佣金提现',
     'withdraw_logs' => '提现记录',
 ];

+ 22 - 22
resources/views/admin/aff/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">{{ trans('admin.aff.title') }}</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.promotion.withdraw') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">
@@ -124,50 +124,50 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('#status').selectpicker('val', @json(Request::query('status')));
+            $("#status").selectpicker("val", @json(Request::query('status')));
         });
 
         @can('admin.aff.setStatus')
             // 更改状态
             function setStatus(id, status) {
                 $.ajax({
-                    method: 'PUT',
+                    method: "PUT",
                     url: '{{ route('admin.aff.setStatus', '') }}/' + id,
                     data: {
                         _token: '{{ csrf_token() }}',
-                        status: status,
+                        status: status
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     success: function(ret) {
-                        if (ret.status === 'success') {
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
-                                showConfirmButton: false,
+                                showConfirmButton: false
                             }).then(() => window.location.reload());
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             }).then(() => window.location.reload());
                         }
                     },
                     error: function(data) {
-                        let str = '';
+                        let str = "";
                         const errors = data.responseJSON;
                         if ($.isEmptyObject(errors) === false) {
                             $.each(errors.errors, function(index, value) {
-                                str += '<li>' + value + '</li>';
+                                str += "<li>" + value + "</li>";
                             });
                             swal.fire({
                                 title: '{{ trans('admin.hint') }}',
                                 html: str,
-                                icon: 'error',
-                                confirmButtonText: '{{ trans('common.confirm') }}',
+                                icon: "error",
+                                confirmButtonText: '{{ trans('common.confirm') }}'
                             });
                         }
-                    },
+                    }
                 });
             }
         @endcan
@@ -177,20 +177,20 @@
             function handleUserCredit(uid, amount, aid, status) {
                 $.ajax({
                     url: '{{ route('admin.user.updateCredit', '') }}/' + uid,
-                    method: 'POST',
+                    method: "POST",
                     data: {
                         _token: '{{ csrf_token() }}',
                         amount: amount,
-                        description: '{{ trans('admin.aff.referral') }}',
+                        description: '{{ trans('admin.aff.referral') }}'
                     },
                     beforeSend: function() {
-                        $('#makePayment_' + aid).removeClass('wb-payment').addClass('wb-loop icon-spin');
+                        $("#makePayment_" + aid).removeClass("wb-payment").addClass("wb-loop icon-spin");
                     },
                     success: function(ret) {
-                        if (ret.status === 'success') {
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
                                 showConfirmButton: false
                             }).then(() => {
@@ -199,14 +199,14 @@
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             }).then(() => window.location.reload());
                         }
                     },
                     error: function() {
-                        $('#msg').show().html('{{ trans('common.request_failed') }}');
+                        $("#msg").show().html('{{ trans('common.request_failed') }}');
                     },
-                    complete: function() {},
+                    complete: function() {}
                 });
             }
         @endcan

+ 2 - 2
resources/views/admin/aff/rebate.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.aff.rebate_title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.promotion.rebate_flow') }}</h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
@@ -91,7 +91,7 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('#status').selectpicker('val', @json(Request::query('status')));
+            $("#status").selectpicker("val", @json(Request::query('status')));
         });
     </script>
 @endpush

+ 19 - 19
resources/views/admin/article/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">{{ trans('admin.article.title') }}</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.customer_service.article') }}</h3>
                 @can('admin.article.create')
                     <div class="panel-actions">
                         <a class="btn btn-primary" href="{{ route('admin.article.create') }}">
@@ -133,10 +133,10 @@
     @can('admin.article.destroy')
         <script>
             $(document).ready(function() {
-                $('#type').selectpicker('val', @json(Request::query('type')))
-                $('#category').selectpicker('val', @json(Request::query('category')))
-                $('#language').selectpicker('val', @json(Request::query('language')))
-            })
+                $("#type").selectpicker("val", @json(Request::query('type')));
+                $("#category").selectpicker("val", @json(Request::query('category')));
+                $("#language").selectpicker("val", @json(Request::query('language')));
+            });
 
             // 删除文章
             function delArticle(url, id) {
@@ -144,37 +144,37 @@
                     title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.article.attribute')]) }}' +
                         id +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'question',
+                    icon: "question",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: url,
                             data: {
-                                _token: '{{ csrf_token() }}',
+                                _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
-                                    }).then(() => window.location.reload())
+                                        showConfirmButton: false
+                                    }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error',
-                                    }).then(() => window.location.reload())
+                                        icon: "error"
+                                    }).then(() => window.location.reload());
                                 }
-                            },
-                        })
+                            }
+                        });
                     }
-                })
+                });
             }
         </script>
     @endcan

+ 62 - 61
resources/views/admin/article/marketing.blade.php

@@ -122,7 +122,7 @@
                                         <span class="input-group-text"><i class="fa-solid fa-calendar-minus"></i></span>
                                     </div>
                                     <input class="form-control" name="expire_start" data-plugin="datepicker" type="text"
-                                           placeholder="{{ trans('admin.marketing.email.expired_date') }}" autocomplete="off" />
+                                           placeholder="{{ trans('admin.marketing.email.expire_start') }}" autocomplete="off" />
                                 </div>
                             </div>
                             <div class="form-group col-lg-3 col-md-4 col-6">
@@ -131,7 +131,7 @@
                                         <span class="input-group-text"><i class="fa-solid fa-calendar-plus"></i></span>
                                     </div>
                                     <input class="form-control" name="expire_end" data-plugin="datepicker" type="text"
-                                           placeholder="{{ trans('admin.marketing.email.will_expire_date') }}" autocomplete="off" />
+                                           placeholder="{{ trans('admin.marketing.email.expire_end') }}" autocomplete="off" />
                                 </div>
                             </div>
                             <div class="form-group col-lg-3 col-md-4 col-6">
@@ -312,137 +312,138 @@
     <script src="/assets/global/js/Plugin/bootstrap-datepicker.js"></script>
     <script>
         function resetSearchForm() {
-            window.location.href = window.location.href.split('?')[0]
+            window.location.href = window.location.href.split("?")[0];
         }
 
         function renderMarkdown(element) {
-            var markdownText = $(element).data('markdown');
+            var markdownText = $(element).data("markdown");
             var htmlContent = marked(markdownText);
             $(element).html(htmlContent);
-            $(element).data('rendered', true); // Mark as rendered
+            $(element).data("rendered", true); // Mark as rendered
 
         }
+
         $(document).ready(function() {
-            $('#status').selectpicker('val', @json(Request::query('status')))
+            $("#status").selectpicker("val", @json(Request::query('status')));
 
             // Render Markdown content when collapse is shown
-            $('.collapse').on('shown.bs.collapse', function() {
-                if ($(this).find('.markdown-content').length > 0 && $(this).find('.markdown-content').data('rendered') === false) {
-                    renderMarkdown($(this).find('.markdown-content'));
+            $(".collapse").on("shown.bs.collapse", function() {
+                if ($(this).find(".markdown-content").length > 0 && $(this).find(".markdown-content").data("rendered") === false) {
+                    renderMarkdown($(this).find(".markdown-content"));
                 }
             });
 
             @can('admin.marketing.email')
-                fetchStatistics()
+                fetchStatistics();
 
-                $('#content').summernote({
+                $("#content").summernote({
                     tabsize: 2,
                     height: 400,
                     dialogsInBody: true,
-                    lang: '{{ config('common.language')[app()->getLocale()][2] }}', // default: 'en-US'
-                })
+                    lang: '{{ config('common.language')[app()->getLocale()][2] }}' // default: 'en-US'
+                });
             @endcan
-        })
+        });
 
         @can('admin.marketing.email')
-            $('[name="expire_start"]').datepicker({
-                format: 'yyyy-mm-dd',
-                endDate: new Date(),
-            })
+            $("[name=\"expire_start\"]").datepicker({
+                format: "yyyy-mm-dd",
+                endDate: new Date()
+            });
 
-            $('[name="expire_end"]').datepicker({
-                format: 'yyyy-mm-dd',
-                startDate: new Date(),
-            })
+            $("[name=\"expire_end\"]").datepicker({
+                format: "yyyy-mm-dd",
+                startDate: new Date()
+            });
 
             function resetFilterForm() {
-                const form = $('#filter-form');
+                const form = $("#filter-form");
                 form[0].reset();
-                form.find('select').selectpicker('refresh');
-                form.find('[data-plugin="tokenfield"]').each(function() {
-                    $(this).tokenfield('setTokens', []);
+                form.find("select").selectpicker("refresh");
+                form.find("[data-plugin=\"tokenfield\"]").each(function() {
+                    $(this).tokenfield("setTokens", []);
                 });
-                fetchStatistics()
+                fetchStatistics();
             }
 
             function fetchStatistics() {
-                const filterFormData = $('#filter-form').serializeArray()
-                const filteredFilterFormData = filterFormData.filter(field => field.value.trim() !== '')
+                const filterFormData = $("#filter-form").serializeArray();
+                const filteredFilterFormData = filterFormData.filter(field => field.value.trim() !== "");
                 $.ajax({
                     url: '{{ route('admin.marketing.create', ['type' => 'email']) }}',
-                    method: 'GET',
+                    method: "GET",
                     data: $.param(filteredFilterFormData),
                     beforeSend: function() {
-                        $('#statistics').html('{{ trans('admin.marketing.email.loading_statistics') }}')
+                        $("#statistics").html('{{ trans('admin.marketing.email.loading_statistics') }}');
                     },
                     success: function(data) {
-                        $('#statistics').html(data.count)
+                        $("#statistics").html(data.count);
                     },
                     error: function() {
-                        $('#statistics').html('<p>{{ trans('common.request_failed') }}</p>')
-                    },
-                })
+                        $("#statistics").html('<p>{{ trans('common.request_failed') }}</p>');
+                    }
+                });
             }
 
             function sendEmail() {
-                const filterFormData = $('#filter-form').serializeArray()
-                const filteredFilterFormData = filterFormData.filter(field => field.value.trim() !== '')
+                const filterFormData = $("#filter-form").serializeArray();
+                const filteredFilterFormData = filterFormData.filter(field => field.value.trim() !== "");
 
-                const emailFormData = $('#send-email-form').serializeArray()
+                const emailFormData = $("#send-email-form").serializeArray();
                 emailFormData.push({
-                    name: '_token',
-                    value: '{{ csrf_token() }}',
-                })
+                    name: "_token",
+                    value: '{{ csrf_token() }}'
+                });
 
                 $.ajax({
                     url: '{{ route('admin.marketing.create', ['type' => 'email']) }}?' + $.param(filteredFilterFormData),
-                    method: 'POST',
+                    method: "POST",
                     data: $.param(emailFormData),
                     beforeSend: function() {
-                        $('#msg').show().removeClass('alert-danger alert-success').addClass('alert-info').html('{{ trans('admin.creating') }}')
+                        $("#msg").show().removeClass("alert-danger alert-success").addClass("alert-info").html('{{ trans('admin.creating') }}');
                     },
                     success: function(ret) {
-                        $('#msg').show().html(ret.message)
-                        if (ret.status === 'success') {
-                            $('#msg').removeClass('alert-info alert-danger').addClass('alert-success').show().html(ret.message)
+                        $("#msg").show().html(ret.message);
+                        if (ret.status === "success") {
+                            $("#msg").removeClass("alert-info alert-danger").addClass("alert-success").show().html(ret.message);
                         } else {
-                            $('#msg').removeClass('alert-info alert-success').addClass('alert-danger').show().html(ret.message)
+                            $("#msg").removeClass("alert-info alert-success").addClass("alert-danger").show().html(ret.message);
                         }
                     },
                     error: function() {
-                        $('#msg').removeClass('alert-info alert-success').addClass('alert-danger').show().html('{{ trans('common.request_failed') }}')
+                        $("#msg").removeClass("alert-info alert-success").addClass("alert-danger").show().html('{{ trans('common.request_failed') }}');
                     },
-                    complete: function() {},
-                })
+                    complete: function() {}
+                });
             }
         @endcan
 
         @can('admin.marketing.push')
             // 发送通道消息
             function sendPush() {
-                const formData = $('#send_push_modal').serializeArray()
+                const formData = $("#send_push_modal").serializeArray();
                 formData.push({
-                    name: '_token',
-                    value: '{{ csrf_token() }}',
-                })
+                    name: "_token",
+                    value: '{{ csrf_token() }}'
+                });
                 $.ajax({
                     url: '{{ route('admin.marketing.create', ['type' => 'push']) }}',
-                    method: 'POST',
+                    method: "POST",
                     data: $.param(formData),
                     beforeSend: function() {
-                        $('#msg').show().html('{{ trans('admin.creating') }}');
+                        $("#msg").show().html('{{ trans('admin.creating') }}');
                     },
                     success: function(ret) {
-                        if (ret.status === 'fail') {
-                            $('#msg').show().html(ret.message);
+                        if (ret.status === "fail") {
+                            $("#msg").show().html(ret.message);
                             return false;
                         }
-                        $('#send_modal').modal('hide');
+                        $("#send_modal").modal("hide");
                     },
                     error: function() {
-                        $('#msg').show().html('{{ trans('common.request_failed') }}');
+                        $("#msg").show().html('{{ trans('common.request_failed') }}');
                     },
-                    complete: function() {},
+                    complete: function() {}
                 });
             }
         @endcan

+ 1 - 1
resources/views/admin/article/show.blade.php

@@ -61,7 +61,7 @@
         function exchangeSubscribe() {
             swal.fire({
                 title: '{{ trans('common.warning') }}',
-                text: '{{ trans('user.subscribe.exchange_warning') }}',
+                html: `{!! trans('user.subscribe.exchange_warning') !!}`,
                 icon: "warning",
                 showCancelButton: true,
                 cancelButtonText: '{{ trans('common.close') }}',

+ 196 - 196
resources/views/admin/config/common.blade.php

@@ -4,7 +4,7 @@
         <div class="panel">
             <div class="panel-heading">
                 <h1 class="panel-title">
-                    <i class="icon wb-settings" aria-hidden="true"></i>{{ trans('admin.setting.common.title') }}
+                    <i class="icon wb-settings" aria-hidden="true"></i>{{ trans('admin.menu.setting.universal') }}
                 </h1>
             </div>
             <div class="panel-body container-fluid">
@@ -449,58 +449,58 @@
     <script>
         function addLevel() { // 添加等级
             @can('admin.config.level.store')
-                const level = $('#add_level').val();
-                const level_name = $('#add_level_name').val();
+                const level = $("#add_level").val();
+                const level_name = $("#add_level_name").val();
 
-                if (level.trim() === '') {
-                    $('#level_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.common.level')]) }}');
-                    $('#level').focus();
+                if (level.trim() === "") {
+                    $("#level_msg").show().html('{{ trans('validation.required', ['attribute' => trans('model.common.level')]) }}');
+                    $("#level").focus();
                     return false;
                 }
 
-                if (level_name.trim() === '') {
-                    $('#level_msg').show().html('{{ trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.name'))]) }}');
-                    $('#level_name').focus();
+                if (level_name.trim() === "") {
+                    $("#level_msg").show().html('{{ trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.name'))]) }}');
+                    $("#level_name").focus();
                     return false;
                 }
 
                 $.ajax({
                     url: '{{ route('admin.config.level.store') }}',
-                    method: 'POST',
+                    method: "POST",
                     data: {
                         _token: '{{ csrf_token() }}',
                         level: level,
                         name: level_name
                     },
                     beforeSend: function() {
-                        $('#level_msg').show().html('{{ trans('admin.creating') }}');
+                        $("#level_msg").show().html('{{ trans('admin.creating') }}');
                     },
                     success: function(ret) {
-                        if (ret.status === 'fail') {
-                            $('#level_msg').show().html(ret.message);
+                        if (ret.status === "fail") {
+                            $("#level_msg").show().html(ret.message);
                             return false;
                         }
-                        $('#add_level_modal').modal('hide');
+                        $("#add_level_modal").modal("hide");
                         window.location.reload();
                     },
                     error: function() {
-                        $('#level_msg').show().html('{{ trans('common.request_failed') }}');
+                        $("#level_msg").show().html('{{ trans('common.request_failed') }}');
                     },
                     complete: function() {
                         swal.fire({
-                            icon: 'success',
+                            icon: "success",
                             timer: 1000,
                             showConfirmButton: false
                         }).then(() => window.location.reload());
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.level.store')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -508,37 +508,37 @@
         function updateLevel(id) { // 更新等级
             @can('admin.config.level.update')
                 $.ajax({
-                    method: 'PUT',
+                    method: "PUT",
                     url: '{{ route('admin.config.level.update', '') }}/' + id,
                     data: {
                         _token: '{{ csrf_token() }}',
-                        level: $('#level_' + id).val(),
-                        name: $('#level_name_' + id).val(),
+                        level: $("#level_" + id).val(),
+                        name: $("#level_name_" + id).val()
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     success: function(ret) {
-                        if (ret.status === 'success') {
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
-                                showConfirmButton: false,
+                                showConfirmButton: false
                             }).then(() => window.location.reload());
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             }).then(() => window.location.reload());
                         }
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.level.update')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -548,35 +548,35 @@
                 swal.fire({
                     title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.common.level')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'question',
+                    icon: "question",
                     allowEnterKey: false,
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: '{{ route('admin.config.level.destroy', '') }}/' + id,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });
@@ -584,67 +584,67 @@
             @cannot('admin.config.level.destroy')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
 
         function addCategory() { // 添加分类
             @can('admin.config.category.store')
-                const name = $('#add_category_name').val();
-                const sort = $('#add_category_sort').val();
+                const name = $("#add_category_name").val();
+                const sort = $("#add_category_sort").val();
 
-                if (name.trim() === '') {
-                    $('#category_msg').show().html('{{ trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.name'))]) }}');
-                    $('#category_name').focus();
+                if (name.trim() === "") {
+                    $("#category_msg").show().html('{{ trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.name'))]) }}');
+                    $("#category_name").focus();
                     return false;
                 }
 
-                if (sort.trim() === '') {
-                    $('#category_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.common.sort')]) }}');
-                    $('#category_sort').focus();
+                if (sort.trim() === "") {
+                    $("#category_msg").show().html('{{ trans('validation.required', ['attribute' => trans('model.common.sort')]) }}');
+                    $("#category_sort").focus();
                     return false;
                 }
 
                 $.ajax({
                     url: '{{ route('admin.config.category.store') }}',
-                    method: 'POST',
+                    method: "POST",
                     data: {
                         _token: '{{ csrf_token() }}',
                         name: name,
                         sort: sort
                     },
                     beforeSend: function() {
-                        $('#category_msg').show().html('{{ trans('admin.creating') }}');
+                        $("#category_msg").show().html('{{ trans('admin.creating') }}');
                     },
                     success: function(ret) {
-                        if (ret.status === 'fail') {
-                            $('#category_msg').show().html(ret.message);
+                        if (ret.status === "fail") {
+                            $("#category_msg").show().html(ret.message);
                             return false;
                         }
-                        $('#add_category_modal').modal('hide');
+                        $("#add_category_modal").modal("hide");
                         window.location.reload();
                     },
                     error: function() {
-                        $('#category_msg').show().html('{{ trans('common.request_failed') }}');
+                        $("#category_msg").show().html('{{ trans('common.request_failed') }}');
                     },
                     complete: function() {
                         swal.fire({
-                            icon: 'success',
+                            icon: "success",
                             timer: 1000,
                             showConfirmButton: false
                         }).then(() => window.location.reload());
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.category.store')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -652,37 +652,37 @@
         function updateCategory(id) { // 更新分类
             @can('admin.config.category.update')
                 $.ajax({
-                    method: 'PUT',
+                    method: "PUT",
                     url: '{{ route('admin.config.category.update', '') }}/' + id,
                     data: {
                         _token: '{{ csrf_token() }}',
-                        name: $('#category_name_' + id).val(),
-                        sort: $('#category_sort_' + id).val(),
+                        name: $("#category_name_" + id).val(),
+                        sort: $("#category_sort_" + id).val()
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     success: function(ret) {
-                        if (ret.status === 'success') {
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
-                                showConfirmButton: false,
+                                showConfirmButton: false
                             }).then(() => window.location.reload());
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             }).then(() => window.location.reload());
                         }
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.category.update')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -692,35 +692,35 @@
                 swal.fire({
                     title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.goods.category')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'question',
+                    icon: "question",
                     allowEnterKey: false,
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: '{{ route('admin.config.category.destroy', '') }}/' + id,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });
@@ -728,67 +728,67 @@
             @cannot('admin.config.category.destroy')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
 
         function addCountry() { // 添加国家/地区
             @can('admin.config.country.store')
-                const country_name = $('#add_country_name').val();
-                const country_code = $('#add_country_code').val();
+                const country_name = $("#add_country_name").val();
+                const country_code = $("#add_country_code").val();
 
-                if (country_code.trim() === '') {
-                    $('#country_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.country.code')]) }}');
-                    $('#add_country_code').focus();
+                if (country_code.trim() === "") {
+                    $("#country_msg").show().html('{{ trans('validation.required', ['attribute' => trans('model.country.code')]) }}');
+                    $("#add_country_code").focus();
                     return false;
                 }
 
-                if (country_name.trim() === '') {
-                    $('#country_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.country.name')]) }}');
-                    $('#add_country_name').focus();
+                if (country_name.trim() === "") {
+                    $("#country_msg").show().html('{{ trans('validation.required', ['attribute' => trans('model.country.name')]) }}');
+                    $("#add_country_name").focus();
                     return false;
                 }
 
                 $.ajax({
                     url: '{{ route('admin.config.country.store') }}',
-                    method: 'POST',
+                    method: "POST",
                     data: {
                         _token: '{{ csrf_token() }}',
                         code: country_code,
                         name: country_name
                     },
                     beforeSend: function() {
-                        $('#country_msg').show().html('{{ trans('admin.creating') }}');
+                        $("#country_msg").show().html('{{ trans('admin.creating') }}');
                     },
                     success: function(ret) {
-                        if (ret.status === 'fail') {
-                            $('#country_msg').show().html(ret.message);
+                        if (ret.status === "fail") {
+                            $("#country_msg").show().html(ret.message);
                             return false;
                         }
-                        $('#add_country_modal').modal('hide');
+                        $("#add_country_modal").modal("hide");
                         window.location.reload();
                     },
                     error: function() {
-                        $('#country_msg').show().html('{{ trans('common.request_failed') }}');
+                        $("#country_msg").show().html('{{ trans('common.request_failed') }}');
                     },
                     complete: function() {
                         swal.fire({
-                            icon: 'success',
+                            icon: "success",
                             timer: 1000,
-                            showConfirmButton: false,
+                            showConfirmButton: false
                         }).then(() => window.location.reload());
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.country.store')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -796,36 +796,36 @@
         function updateCountry(code) { // 更新国家/地区
             @can('admin.config.country.update')
                 $.ajax({
-                    method: 'PUT',
+                    method: "PUT",
                     url: '{{ route('admin.config.country.update', '') }}/' + code,
                     data: {
                         _token: '{{ csrf_token() }}',
-                        name: $('#country_' + code).val()
+                        name: $("#country_" + code).val()
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     success: function(ret) {
-                        if (ret.status === 'success') {
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
-                                showConfirmButton: false,
+                                showConfirmButton: false
                             }).then(() => window.location.reload());
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             });
                         }
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.country.update')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -835,35 +835,35 @@
                 swal.fire({
                     title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node.country')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'question',
+                    icon: "question",
                     allowEnterKey: false,
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: '{{ route('admin.config.country.destroy', '') }}/' + code,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });
@@ -871,62 +871,62 @@
             @cannot('admin.config.country.destroy')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
 
         function addConfig() { // 添加配置
             @can('admin.config.ss.store')
-                const name = $('#name').val();
-                const type = $('#type').val();
+                const name = $("#name").val();
+                const type = $("#type").val();
 
-                if (name.trim() === '') {
-                    $('#msg').show().html('{{ trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.name'))]) }}');
-                    $('#name').focus();
+                if (name.trim() === "") {
+                    $("#msg").show().html('{{ trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.name'))]) }}');
+                    $("#name").focus();
                     return false;
                 }
 
                 $.ajax({
                     url: '{{ route('admin.config.ss.store') }}',
-                    method: 'POST',
+                    method: "POST",
                     data: {
                         _token: '{{ csrf_token() }}',
                         name: name,
                         type: type
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     beforeSend: function() {
-                        $('#msg').show().html('{{ trans('admin.creating') }}');
+                        $("#msg").show().html('{{ trans('admin.creating') }}');
                     },
                     success: function(ret) {
-                        if (ret.status === 'fail') {
-                            $('#msg').show().html(ret.message);
+                        if (ret.status === "fail") {
+                            $("#msg").show().html(ret.message);
                             return false;
                         }
 
-                        $('#add_config_modal').modal('hide');
+                        $("#add_config_modal").modal("hide");
                     },
                     error: function() {
-                        $('#msg').show().html('{{ trans('common.request_failed') }}');
+                        $("#msg").show().html('{{ trans('common.request_failed') }}');
                     },
                     complete: function() {
                         swal.fire({
-                            icon: 'success',
+                            icon: "success",
                             timer: 1000,
                             showConfirmButton: false
                         }).then(() => window.location.reload());
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.ss.store')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -934,35 +934,35 @@
         function setDefault(id) { // 置为默认
             @can('admin.config.ss.update')
                 $.ajax({
-                    method: 'PUT',
+                    method: "PUT",
                     url: '{{ route('admin.config.ss.update', '') }}/' + id,
                     data: {
                         _token: '{{ csrf_token() }}'
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     success: function(ret) {
-                        if (ret.status === 'success') {
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
-                                showConfirmButton: false,
+                                showConfirmButton: false
                             }).then(() => window.location.reload());
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             }).then(() => window.location.reload());
                         }
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.ss.update')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -972,35 +972,35 @@
                 swal.fire({
                     title: '{{ trans('admin.confirm.delete.0', ['attribute' => '']) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'question',
+                    icon: "question",
                     allowEnterKey: false,
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: '{{ route('admin.config.ss.destroy', '') }}/' + id,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });
@@ -1008,65 +1008,65 @@
             @cannot('admin.config.ss.destroy')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
 
         function addLabel() { // 添加标签
             @can('admin.config.label.store')
-                const name = $('#add_label').val();
-                const sort = $('#add_label_sort').val();
+                const name = $("#add_label").val();
+                const sort = $("#add_label_sort").val();
 
-                if (name.trim() === '') {
-                    $('#lable_msg').show().html('{{ trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.name'))]) }}');
+                if (name.trim() === "") {
+                    $("#lable_msg").show().html('{{ trans('validation.required', ['attribute' => ucfirst(trans('validation.attributes.name'))]) }}');
                     return false;
                 }
 
-                if (sort.trim() === '') {
-                    $('#lable_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.common.sort')]) }}');
+                if (sort.trim() === "") {
+                    $("#lable_msg").show().html('{{ trans('validation.required', ['attribute' => trans('model.common.sort')]) }}');
                     return false;
                 }
 
                 $.ajax({
                     url: '{{ route('admin.config.label.store') }}',
-                    method: 'POST',
+                    method: "POST",
                     data: {
                         _token: '{{ csrf_token() }}',
                         name: name,
                         sort: sort
                     },
                     beforeSend: function() {
-                        $('#level_msg').show().html('{{ trans('admin.creating') }}');
+                        $("#level_msg").show().html('{{ trans('admin.creating') }}');
                     },
                     success: function(ret) {
-                        if (ret.status === 'fail') {
-                            $('#lable_msg').show().html(ret.message);
+                        if (ret.status === "fail") {
+                            $("#lable_msg").show().html(ret.message);
                             return false;
                         }
-                        $('#add_label_modal').modal('hide');
+                        $("#add_label_modal").modal("hide");
                         window.location.reload();
                     },
                     error: function() {
-                        $('#lable_msg').show().html('{{ trans('common.request_failed') }}');
+                        $("#lable_msg").show().html('{{ trans('common.request_failed') }}');
                     },
                     complete: function() {
                         swal.fire({
-                            icon: 'success',
+                            icon: "success",
                             timer: 1000,
-                            showConfirmButton: false,
+                            showConfirmButton: false
                         }).then(() => window.location.reload());
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.label.store')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -1074,37 +1074,37 @@
         function updateLabel(id) { // 编辑标签
             @can('admin.config.label.update')
                 $.ajax({
-                    method: 'PUT',
+                    method: "PUT",
                     url: '{{ route('admin.config.label.update', '') }}/' + id,
                     data: {
                         _token: '{{ csrf_token() }}',
-                        name: $('#label_name_' + id).val(),
-                        sort: $('#label_sort_' + id).val(),
+                        name: $("#label_name_" + id).val(),
+                        sort: $("#label_sort_" + id).val()
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     success: function(ret) {
-                        if (ret.status === 'success') {
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
-                                showConfirmButton: false,
+                                showConfirmButton: false
                             }).then(() => window.location.reload());
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             }).then(() => window.location.reload());
                         }
-                    },
+                    }
                 });
             @endcan
             @cannot('admin.config.label.update')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }
@@ -1115,42 +1115,42 @@
                     title: '{{ trans('common.warning') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node.label')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     $.ajax({
-                        method: 'DELETE',
+                        method: "DELETE",
                         url: '{{ route('admin.config.label.destroy', '') }}/' + id,
                         data: {
                             _token: '{{ csrf_token() }}'
                         },
-                        dataType: 'json',
+                        dataType: "json",
                         success: function(ret) {
-                            if (ret.status === 'success') {
+                            if (ret.status === "success") {
                                 swal.fire({
                                     title: ret.message,
-                                    icon: 'success',
+                                    icon: "success",
                                     timer: 1000,
-                                    showConfirmButton: false,
+                                    showConfirmButton: false
                                 }).then(() => window.location.reload());
                             } else {
                                 swal.fire({
                                     title: ret.message,
-                                    icon: 'error'
+                                    icon: "error"
                                 }).then(() => window.location.reload());
                             }
-                        },
+                        }
                     });
                 });
             @endcan
             @cannot('admin.config.label.destroy')
                 swal.fire({
                     title: '{{ trans('admin.setting.no_permission') }}',
-                    icon: 'error',
+                    icon: "error",
                     timer: 1500,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
             @endcannot
         }

+ 22 - 21
resources/views/admin/config/emailFilter.blade.php

@@ -3,7 +3,8 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{!! trans('admin.setting.email.title') !!}
+                <h2 class="panel-title">
+                    {{ trans('admin.menu.setting.email_suffix') }} <small>{{ trans('admin.setting.email.sub_title') }}</small>
                 </h2>
                 @can('admin.config.filter.store')
                     <div class="panel-actions">
@@ -102,34 +103,34 @@
         @can('admin.config.filter.store')
             // 添加邮箱后缀
             function addEmailSuffix() {
-                const words = $('#words').val();
-                if (words.trim() === '') {
+                const words = $("#words").val();
+                if (words.trim() === "") {
                     swal.fire({
                         title: '{{ trans('validation.required', ['attribute' => trans('admin.setting.email.tail')]) }}',
-                        icon: 'warning',
+                        icon: "warning",
                         timer: 1000,
-                        showConfirmButton: false,
+                        showConfirmButton: false
                     });
-                    $('#words').focus();
+                    $("#words").focus();
                     return false;
                 }
 
                 $.post('{{ route('admin.config.filter.store') }}', {
                     _token: '{{ csrf_token() }}',
-                    type: $('input:radio[name=\'type\']:checked').val(),
-                    words: words,
+                    type: $("input:radio[name='type']:checked").val(),
+                    words: words
                 }, function(ret) {
-                    if (ret.status === 'success') {
+                    if (ret.status === "success") {
                         swal.fire({
                             title: ret.message,
-                            icon: 'success',
+                            icon: "success",
                             timer: 1000,
-                            showConfirmButton: false,
+                            showConfirmButton: false
                         }).then(() => window.location.reload());
                     } else {
                         swal.fire({
                             title: ret.message,
-                            icon: 'error'
+                            icon: "error"
                         }).then(() => window.location.reload());
                     }
                 });
@@ -143,34 +144,34 @@
                     title: '{{ trans('common.warning') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('admin.setting.email.tail')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.cancel') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: '{{ route('admin.config.filter.destroy', '') }}/' + id,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 59 - 50
resources/views/admin/config/system.blade.php

@@ -4,13 +4,25 @@
     <link href="/assets/global/vendor/switchery/switchery.min.css" rel="stylesheet">
     <link href="/assets/global/vendor/dropify/dropify.min.css" rel="stylesheet">
     <link href="/assets/global/vendor/toastr/toastr.min.css" rel="stylesheet">
+    <style>
+        .hr-text::after {
+            content: attr(data-content);
+            position: absolute;
+            top: -0.8em;
+            left: 45%;
+            transform: translateX(-50%);
+            background: #fff;
+            padding: 0 15px;
+            font-size: 16px;
+        }
+    </style>
 @endsection
 @section('content')
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
                 <h1 class="panel-title">
-                    <i class="icon fas fa-cog" aria-hidden="true"></i>{{ trans('admin.setting.system.title') }}
+                    <i class="icon fas fa-cog" aria-hidden="true"></i>{{ trans('admin.menu.setting.system') }}
                 </h1>
             </div>
             <div class="panel-body">
@@ -23,7 +35,6 @@
                             'security' => ['icon' => 'shield-alt', 'text' => trans('admin.setting.system.security')],
                             'payment' => ['icon' => 'credit-card', 'text' => trans('admin.setting.system.payment')],
                             'notify' => ['icon' => 'bell', 'text' => trans('admin.setting.system.notify')],
-                            'checkIn' => ['icon' => 'calendar-check', 'text' => trans('admin.setting.system.check_in')],
                             'automation' => ['icon' => 'robot', 'text' => trans('admin.setting.system.auto_job')],
                         ];
                     @endphp
@@ -72,7 +83,7 @@
                             <x-system.input type="email" code="webmaster_email" :value="$configs['webmaster_email']" />
                             <div class="form-group col-lg-6">
                                 <div class="form-row">
-                                    <label class="col-md-3 col-form-label" for="website_security_code">{{ trans('admin.system.website_security_code') }}</label>
+                                    <label class="col-md-3 col-form-label" for="website_security_code">{{ trans('model.config.website_security_code') }}</label>
                                     <div class="col-md-6">
                                         <div class="input-group">
                                             <input class="form-control" id="website_security_code" type="text"
@@ -88,10 +99,6 @@
                                     </div>
                                 </div>
                             </div>
-                            <x-system.switch code="maintenance_mode" :check="$configs['maintenance_mode']" :url="route('admin.login')" />
-                            <x-system.input type="datetime-local" code="maintenance_time" :value="$configs['maintenance_time']" />
-                            <x-system.textarea code="maintenance_content" :value="$configs['maintenance_content']" row="3" />
-                            <x-system.input type="url" code="redirect_url" :value="$configs['redirect_url']" />
                             <x-system.input type="url" code="website_home_logo" :value="$configs['website_home_logo']" />
                             <x-system.input type="url" code="website_logo" :value="$configs['website_logo']" />
                             <form class="upload-form col-lg-12 row" role="form" action="{{ route('admin.system.extend') }}" method="post"
@@ -111,6 +118,7 @@
                                 trans('admin.system.username.mobile') => 'numeric',
                                 trans('admin.system.username.any') => 'string',
                             ]" />
+                            <x-system.select code="is_email_filtering" :list="[trans('common.status.closed') => '', trans('admin.setting.email.black') => 1, trans('admin.setting.email.white') => 2]" />
                             <x-system.select code="is_invite_register" :list="[trans('common.status.closed') => '', trans('admin.optional') => 1, trans('admin.require') => 2]" />
                             <x-system.select code="is_activate_account" :list="[
                                 trans('common.status.closed') => '',
@@ -126,14 +134,29 @@
                             ('#min_port').val()" hmax="65535" />
                             <x-system.input-limit code="default_days" :value="$configs['default_days']" unit="{{ trans_choice('common.days.attribute', 1) }}" />
                             <x-system.input-limit code="default_traffic" :value="$configs['default_traffic']" unit="MB" />
-                            <x-system.input-limit code="invite_num" :value="$configs['invite_num']" />
                             <x-system.input-limit code="reset_password_times" :value="$configs['reset_password_times']" />
                             <x-system.input-limit code="active_times" :value="$configs['active_times']" />
                             <x-system.input-limit code="register_ip_limit" :value="$configs['register_ip_limit']" />
+                            <x-system.input-limit code="invite_num" :value="$configs['invite_num']" />
                             <x-system.input-limit code="user_invite_days" :value="$configs['user_invite_days']" min="1"
                                                   unit="{{ trans_choice('common.days.attribute', 1) }}" />
                             <x-system.input-limit code="admin_invite_days" :value="$configs['admin_invite_days']" min="1"
                                                   unit="{{ trans_choice('common.days.attribute', 1) }}" />
+                            <hr class="col-12 hr-text" data-content="{{ trans('admin.aff.referral') }}" />
+                            <x-system.switch code="referral_status" :check="$configs['referral_status']" />
+                            <x-system.input-limit code="referral_traffic" :value="$configs['referral_traffic']" unit="MB" />
+                            <x-system.select code="referral_reward_type" :list="[
+                                trans('common.status.closed') => '',
+                                trans('admin.system.referral.once') => 1,
+                                trans('admin.system.referral.loop') => 2,
+                            ]" />
+                            <x-system.input-limit code="referral_percent" :value="$configs['referral_percent'] * 100" max="100" unit="%" />
+                            <x-system.input-limit code="referral_money" :value="$configs['referral_money']"
+                                                  unit="{{ array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')] }}" />
+                            <hr class="col-12 hr-text" data-content="{{ trans('user.home.attendance.attribute') }}" />
+                            <x-system.input-limit code="checkin_interval" :value="$configs['checkin_interval']" unit="{{ ucfirst(trans('validation.attributes.minute')) }}" />
+                            <x-system.input-limit code="checkin_reward" hcode="checkin_reward_max" :value="$configs['checkin_reward']" :hvalue="$configs['checkin_reward_max']" :max="$configs['checkin_reward_max']"
+                                                  :hmin="$configs['checkin_reward']" unit="MB" />
                         </x-system.tab-pane>
                         <!-- 节点设置 -->
                         <x-system.tab-pane id="node">
@@ -145,6 +168,10 @@
                             <x-system.input code="v2ray_license" :value="$configs['v2ray_license']" />
                             <x-system.input code="trojan_license" :value="$configs['trojan_license']" />
                             <x-system.input code="v2ray_tls_provider" :value="$configs['v2ray_tls_provider']" />
+                            <hr class="col-lg-12 hr-text" data-content="{{ trans('model.node.ddns') }}">
+                            <x-system.select code="ddns_mode" :list="$ddns_labels" />
+                            <x-system.input code="ddns_key" :value="$configs['ddns_key']" />
+                            <x-system.input code="ddns_secret" :value="$configs['ddns_secret']" />
                         </x-system.tab-pane>
                         <!-- 安全&验证 -->
                         <x-system.tab-pane id="security">
@@ -155,8 +182,8 @@
                                 trans('admin.system.forbid.oversea') => 'ban_oversea',
                             ]" />
                             <x-system.switch code="is_forbid_robot" :check="$configs['is_forbid_robot']" />
-                            <x-system.select code="is_email_filtering" :list="[trans('common.status.closed') => '', trans('admin.setting.email.black') => 1, trans('admin.setting.email.white') => 2]" />
-                            <hr class="col-lg-12">
+                            <x-system.input type="url" code="redirect_url" :value="$configs['redirect_url']" />
+                            <hr class="col-lg-12 hr-text" data-content="{{ trans('auth.captcha.attribute') }}">
                             <x-system.select code="is_captcha" :list="[
                                 trans('common.status.closed') => '',
                                 trans('admin.system.captcha.standard') => 1,
@@ -167,31 +194,21 @@
                             ]" />
                             <x-system.input code="captcha_key" :value="$configs['captcha_key']" />
                             <x-system.input code="captcha_secret" :value="$configs['captcha_secret']" />
-                            <hr class="col-lg-12">
-                            <x-system.select code="ddns_mode" :list="$ddns_labels" />
-                            <x-system.input code="ddns_key" :value="$configs['ddns_key']" />
-                            <x-system.input code="ddns_secret" :value="$configs['ddns_secret']" />
+                            <hr class="col-lg-12 hr-text" data-content="{{ trans('auth.maintenance') }}">
+                            <x-system.switch code="maintenance_mode" :check="$configs['maintenance_mode']" :url="route('admin.login')" />
+                            <x-system.input type="datetime-local" code="maintenance_time" :value="$configs['maintenance_time']" />
+                            <x-system.textarea code="maintenance_content" :value="$configs['maintenance_content']" row="3" />
                         </x-system.tab-pane>
                         <!-- 支付系统 -->
                         <x-system.tab-pane id="payment">
                             <div class="tab-content pb-100 w-p100">
                                 <x-system.tab-pane id="paymentSetting" :active="true">
-                                    <x-system.select code="is_AliPay" :list="array_merge([trans('common.status.closed') => ''], $paymentLists['ali'])" />
-                                    <x-system.select code="is_QQPay" :list="array_merge([trans('common.status.closed') => ''], $paymentLists['qq'])" />
-                                    <x-system.select code="is_WeChatPay" :list="array_merge([trans('common.status.closed') => ''], $paymentLists['wechat'])" />
+                                    <x-system.select code="is_AliPay" :list="[trans('common.status.closed') => '', ...$paymentLists['ali']]" />
+                                    <x-system.select code="is_QQPay" :list="[trans('common.status.closed') => '', ...$paymentLists['qq']]" />
+                                    <x-system.select code="is_WeChatPay" :list="[trans('common.status.closed') => '', ...$paymentLists['wechat']]" />
                                     <x-system.select code="is_otherPay" multiple="1" :list="$paymentLists['other']" />
                                     <x-system.input code="subject_name" :value="$configs['subject_name']" />
                                     <x-system.input type="url" code="payment_callback_url" :value="$configs['payment_callback_url']" :holder="trans('admin.system.placeholder.default_url', ['url' => $configs['website_url']])" />
-                                    <x-system.switch code="referral_status" :check="$configs['referral_status']" />
-                                    <x-system.select code="referral_reward_type" :list="[
-                                        trans('common.status.closed') => '',
-                                        trans('admin.system.referral.once') => 1,
-                                        trans('admin.system.referral.loop') => 2,
-                                    ]" />
-                                    <x-system.input-limit code="referral_traffic" :value="$configs['referral_traffic']" unit="MB" />
-                                    <x-system.input-limit code="referral_percent" :value="$configs['referral_percent'] * 100" max="100" unit="%" />
-                                    <x-system.input-limit code="referral_money" :value="$configs['referral_money']"
-                                                          unit="{{ array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')] }}" />
                                 </x-system.tab-pane>
                                 @foreach ($paymentForms as $code => $forms)
                                     <x-system.tab-pane :id="$code">
@@ -262,17 +279,18 @@
                                 <x-system.input code="{{ $code }}" :value="$configs[$code]" holder="{{ trans('admin.system.placeholder.' . $code) }}"
                                                 :url="$config['url'] ?? null" :test="$config['test'] ?? null" />
                             @endforeach
-                            <hr class="col-10" />
+                            <hr class="col-12 hr-text" data-content="{{ trans('notification.attribute') }}" />
+                            <x-system.input-limit code="expire_days" :value="$configs['expire_days']" unit="{{ trans_choice('common.days.attribute', 1) }}" />
                             <x-system.select code="account_expire_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
                                 trans('admin.system.notification.channel.site') => 'database',
                             ]" />
-                            <x-system.input-limit code="expire_days" :value="$configs['expire_days']" unit="{{ trans_choice('common.days.attribute', 1) }}" />
+                            <x-system.input-limit code="traffic_warning_percent" :value="$configs['traffic_warning_percent']" unit="%" />
                             <x-system.select code="data_exhaust_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
                                 trans('admin.system.notification.channel.site') => 'database',
                             ]" />
-                            <x-system.input-limit code="traffic_warning_percent" :value="$configs['traffic_warning_percent']" unit="%" />
+                            <x-system.input-limit code="offline_check_times" :value="$configs['offline_check_times']" unit="{{ trans('admin.times') }}" />
                             <x-system.select code="node_offline_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
                                 trans('admin.system.notification.channel.bark') => 'bark',
@@ -285,31 +303,30 @@
                                 trans('admin.system.notification.channel.tg_chat') => 'tgChat',
                                 trans('admin.system.notification.channel.pushplus') => 'pushPlus',
                             ]" />
-                            <x-system.select code="node_renewal_notification" multiple="1" :list="[
+                            <x-system.input-limit code="detection_check_times" :value="$configs['detection_check_times']" max="12" unit="{{ trans('admin.times') }}" />
+                            <x-system.select code="node_blocked_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
-                                trans('admin.system.notification.channel.bark') => 'bark',
                                 trans('admin.system.notification.channel.serverchan') => 'serverChan',
                                 trans('admin.system.notification.channel.pushdeer') => 'pushDear',
                                 trans('admin.system.notification.channel.iyuu') => 'iYuu',
                                 trans('admin.system.notification.channel.telegram') => 'telegram',
-                                trans('admin.system.notification.channel.dingtalk') => 'dingTalk',
                                 trans('admin.system.notification.channel.wechat') => 'weChat',
                                 trans('admin.system.notification.channel.tg_chat') => 'tgChat',
                                 trans('admin.system.notification.channel.pushplus') => 'pushPlus',
-                                trans('admin.system.notification.channel.site') => 'database',
                             ]" />
-                            <x-system.input-limit code="offline_check_times" :value="$configs['offline_check_times']" unit="{{ trans('admin.times') }}" />
-                            <x-system.select code="node_blocked_notification" multiple="1" :list="[
+                            <x-system.select code="node_renewal_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
+                                trans('admin.system.notification.channel.bark') => 'bark',
                                 trans('admin.system.notification.channel.serverchan') => 'serverChan',
                                 trans('admin.system.notification.channel.pushdeer') => 'pushDear',
                                 trans('admin.system.notification.channel.iyuu') => 'iYuu',
                                 trans('admin.system.notification.channel.telegram') => 'telegram',
+                                trans('admin.system.notification.channel.dingtalk') => 'dingTalk',
                                 trans('admin.system.notification.channel.wechat') => 'weChat',
                                 trans('admin.system.notification.channel.tg_chat') => 'tgChat',
                                 trans('admin.system.notification.channel.pushplus') => 'pushPlus',
+                                trans('admin.system.notification.channel.site') => 'database',
                             ]" />
-                            <x-system.input-limit code="detection_check_times" :value="$configs['detection_check_times']" max="12" unit="{{ trans('admin.times') }}" />
                             <x-system.select code="payment_received_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
                                 trans('admin.system.notification.channel.site') => 'database',
@@ -321,7 +338,7 @@
                                 trans('admin.system.notification.channel.dingtalk') => 'dingTalk',
                                 trans('admin.system.notification.channel.wechat') => 'weChat',
                             ]" />
-                            <x-system.select code="ticket_closed_notification" multiple="1" :list="[
+                            <x-system.select code="ticket_created_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
                                 trans('admin.system.notification.channel.bark') => 'bark',
                                 trans('admin.system.notification.channel.serverchan') => 'serverChan',
@@ -333,7 +350,7 @@
                                 trans('admin.system.notification.channel.tg_chat') => 'tgChat',
                                 trans('admin.system.notification.channel.pushplus') => 'pushPlus',
                             ]" />
-                            <x-system.select code="ticket_created_notification" multiple="1" :list="[
+                            <x-system.select code="ticket_replied_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
                                 trans('admin.system.notification.channel.bark') => 'bark',
                                 trans('admin.system.notification.channel.serverchan') => 'serverChan',
@@ -345,7 +362,7 @@
                                 trans('admin.system.notification.channel.tg_chat') => 'tgChat',
                                 trans('admin.system.notification.channel.pushplus') => 'pushPlus',
                             ]" />
-                            <x-system.select code="ticket_replied_notification" multiple="1" :list="[
+                            <x-system.select code="ticket_closed_notification" multiple="1" :list="[
                                 trans('admin.system.notification.channel.email') => 'mail',
                                 trans('admin.system.notification.channel.bark') => 'bark',
                                 trans('admin.system.notification.channel.serverchan') => 'serverChan',
@@ -358,12 +375,6 @@
                                 trans('admin.system.notification.channel.pushplus') => 'pushPlus',
                             ]" />
                         </x-system.tab-pane>
-                        <!-- 签到系统 -->
-                        <x-system.tab-pane id="checkIn">
-                            <x-system.input-limit code="checkin_interval" :value="$configs['checkin_interval']" />
-                            <x-system.input-limit code="checkin_reward" hcode="checkin_reward_max" :value="$configs['checkin_reward']" :hvalue="$configs['checkin_reward_max']" :max="$configs['checkin_reward_max']"
-                                                  :hmin="$configs['checkin_reward']" unit="MB" />
-                        </x-system.tab-pane>
                         <!-- 自动化任务 -->
                         <x-system.tab-pane id="automation">
                             <x-system.switch code="is_clear_log" :check="$configs['is_clear_log']" feature="tasks_clean" />
@@ -383,7 +394,7 @@
                                 trans('admin.system.notification.channel.pushplus') => 'pushPlus',
                             ]" />
                             <x-system.input-limit code="traffic_abuse_limit" :value="$configs['traffic_abuse_limit']" min="1" unit="GB" />
-                            <x-system.input-limit code="ban_duration" :value="$configs['ban_duration']" unit="{{ trans('admin.minute') }}" />
+                            <x-system.input-limit code="ban_duration" :value="$configs['ban_duration']" unit="{{ ucfirst(trans('validation.attributes.minute')) }}" />
                             <x-system.input-limit code="auto_release_port" min="0" :value="$configs['auto_release_port']"
                                                   unit="{{ ucfirst(trans('validation.attributes.day')) }}" />
                             <x-system.switch code="is_ban_status" :check="$configs['is_ban_status']" />
@@ -398,11 +409,9 @@
                                 trans('admin.system.notification.channel.tg_chat') => 'tgChat',
                                 trans('admin.system.notification.channel.pushplus') => 'pushPlus',
                             ]" />
-
                             <x-system.input-limit code="recently_heartbeat" :value="$configs['recently_heartbeat']" :min="1"
                                                   unit="{{ ucfirst(trans('validation.attributes.minute')) }}" />
-                            <x-system.task-group type="clean" :items="$configs['tasks_clean']" :units="['minutes', 'hours', 'days', 'months', 'years']" />
-
+                            <x-system.task-group type="clean" :items="$configs['tasks_clean']" :units="['minutes', 'hours', 'days', 'months', 'years']" feature="tasks_clean" />
                             <x-system.task-group type="close" :items="$configs['tasks_close']" :units="['minutes', 'hours']" />
                         </x-system.tab-pane>
                     </div>

+ 14 - 14
resources/views/admin/coupon/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title">{{ trans('admin.coupon.title') }}</h1>
+                <h1 class="panel-title">{{ trans('admin.menu.shop.coupon') }}</h1>
                 @canany(['admin.coupon.export', 'admin.coupon.create'])
                     <div class="panel-actions btn-group">
                         @can('admin.coupon.export')
@@ -122,8 +122,8 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('#type').selectpicker('val', @json(Request::query('type')));
-            $('#status').selectpicker('val', @json(Request::query('status')));
+            $("#type").selectpicker("val", @json(Request::query('type')));
+            $("#status").selectpicker("val", @json(Request::query('status')));
         });
 
         @can('admin.coupon.export')
@@ -132,10 +132,10 @@
                 swal.fire({
                     title: '{{ trans('admin.coupon.export_title') }}',
                     text: '{{ trans('admin.confirm.export') }}?',
-                    icon: 'question',
+                    icon: "question",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         window.location.href = '{{ route('admin.coupon.export') }}';
@@ -150,35 +150,35 @@
                 swal.fire({
                     title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.coupon.attribute')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'question',
+                    icon: "question",
                     allowEnterKey: false,
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: '{{ route('admin.coupon.destroy', '') }}/' + id,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 2 - 2
resources/views/admin/logs/callback.blade.php

@@ -4,7 +4,7 @@
         <div class="panel">
             <div class="panel-heading">
                 <h2 class="panel-title">
-                    {!! trans('admin.logs.callback') !!}
+                    {{ trans('admin.menu.log.payment_callback') }}
                 </h2>
             </div>
             <div class="panel-body">
@@ -79,7 +79,7 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('#status').selectpicker('val', @json(Request::query('status')));
+            $("#status").selectpicker("val", @json(Request::query('status')));
         });
     </script>
 @endpush

+ 2 - 2
resources/views/admin/logs/notification.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.logs.notification') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.log.notify') }}</h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
@@ -77,7 +77,7 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('#type').selectpicker('val', @json(Request::query('type')));
+            $("#type").selectpicker("val", @json(Request::query('type')));
         });
     </script>
 @endpush

+ 2 - 2
resources/views/admin/logs/onlineIPMonitor.blade.php

@@ -4,7 +4,7 @@
         <div class="panel">
             <div class="panel-heading">
                 <h2 class="panel-title">
-                    {!! trans('admin.logs.ip_monitor') !!}
+                    {{ trans('admin.menu.log.online_monitor') }} <small>{{ trans('admin.logs.monitor.sub_title') }}</small>
                 </h2>
             </div>
             <div class="panel-body">
@@ -90,7 +90,7 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('#node_id').selectpicker('val', @json(Request::query('node_id')));
+            $("#node_id").selectpicker("val", @json(Request::query('node_id')));
         });
     </script>
 @endpush

+ 5 - 3
resources/views/admin/logs/order.blade.php

@@ -12,7 +12,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.logs.order.title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.shop.order') }}</h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
@@ -28,11 +28,13 @@
                             <div class="input-group-prepend">
                                 <span class="input-group-text"><i class="icon wb-calendar" aria-hidden="true"></i></span>
                             </div>
-                            <input class="form-control" name="start" type="text" value="{{ Request::query('start') }}" autocomplete="off" />
+                            <input class="form-control" name="start" type="text" value="{{ Request::query('start') }}"
+                                   placeholder="{{ trans('admin.filter.start_time') }}" autocomplete="off" />
                             <div class="input-group-prepend">
                                 <span class="input-group-text">{{ trans('common.to') }}</span>
                             </div>
-                            <input class="form-control" name="end" type="text" value="{{ Request::query('end') }}" autocomplete="off" />
+                            <input class="form-control" name="end" type="text" value="{{ Request::query('end') }}"
+                                   placeholder="{{ trans('admin.filter.end_time') }}" autocomplete="off" />
                         </div>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">

+ 8 - 6
resources/views/admin/logs/traffic.blade.php

@@ -6,7 +6,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.logs.user_traffic.title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.log.traffic') }}</h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
@@ -37,11 +37,13 @@
                                     <i class="icon wb-calendar" aria-hidden="true"></i>
                                 </span>
                             </div>
-                            <input class="form-control" name="start" type="text" value="{{ Request::query('start') }}" autocomplete="off" />
+                            <input class="form-control" name="start" type="text" value="{{ Request::query('start') }}"
+                                   placeholder="{{ trans('admin.filter.start_time') }}" autocomplete="off" />
                             <div class="input-group-prepend">
                                 <span class="input-group-text">{{ trans('common.to') }}</span>
                             </div>
-                            <input class="form-control" name="end" type="text" value="{{ Request::query('end') }}" autocomplete="off" />
+                            <input class="form-control" name="end" type="text" value="{{ Request::query('end') }}"
+                                   placeholder="{{ trans('admin.filter.end_time') }}" autocomplete="off" />
                         </div>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4 btn-group">
@@ -108,12 +110,12 @@
     <script src="/assets/global/vendor/bootstrap-datepicker/bootstrap-datepicker.min.js"></script>
     <script src="/assets/global/js/Plugin/bootstrap-datepicker.js"></script>
     <script>
-        $('.input-daterange').datepicker({
-            format: 'yyyy-mm-dd',
+        $(".input-daterange").datepicker({
+            format: "yyyy-mm-dd"
         });
 
         $(document).ready(function() {
-            $('#node_id').selectpicker('val', @json(Request::query('node_id')));
+            $("#node_id").selectpicker("val", @json(Request::query('node_id')));
         });
     </script>
 @endpush

+ 3 - 3
resources/views/admin/logs/userBanHistory.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">{{ trans('admin.logs.ban.title') }}</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.log.service_ban') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">
@@ -21,7 +21,7 @@
                         <tr>
                             <th> #</th>
                             <th> {{ trans('common.account') }}</th>
-                            <th> {{ trans('admin.logs.ban.time') }}</th>
+                            <th> {{ trans('admin.logs.ban.time') }} ({{ ucfirst(trans('validation.attributes.minute')) }})</th>
                             <th> {{ trans('admin.logs.ban.reason') }}</th>
                             <th> {{ trans('admin.logs.ban.ban_time') }}</th>
                             <th> {{ trans('admin.logs.ban.last_connect_at') }}</th>
@@ -45,7 +45,7 @@
                                         【{{ trans('common.deleted_item', ['attribute' => trans('common.account')]) }}】
                                     @endif
                                 </td>
-                                <td> {{ $log->time }} {{ trans('admin.minute') }}</td>
+                                <td> {{ $log->time }}</td>
                                 <td> {{ $log->description }} </td>
                                 <td> {{ $log->created_at }} </td>
                                 <td> {{ date('Y-m-d H:i:s', $log->user->t) }} </td>

+ 1 - 1
resources/views/admin/logs/userCreditHistory.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">{{ trans('admin.logs.credit_title') }}</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.user.credit_log') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">

+ 1 - 1
resources/views/admin/logs/userOnlineIP.blade.php

@@ -4,7 +4,7 @@
         <div class="panel">
             <div class="panel-heading">
                 <h3 class="panel-title">
-                    {!! trans('admin.logs.user_ip.title') !!}
+                    {{ trans('admin.menu.log.online_logs') }} <small>{{ trans('admin.logs.user_ip.sub_title') }}</small>
                 </h3>
             </div>
             <div class="panel-body">

+ 1 - 1
resources/views/admin/logs/userTraffic.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">{{ trans('admin.logs.user_data_modify_title') }}</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.log.traffic_flow') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">

+ 25 - 25
resources/views/admin/node/auth.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{!! trans('admin.node.auth.title') !!}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.node.auth') }}</h2>
                 @can('admin.node.auth.store')
                     <div class="panel-actions">
                         <button class="btn btn-primary" onclick="addAuth()">
@@ -220,26 +220,26 @@
                 swal.fire({
                     title: '{{ trans('admin.hint') }}',
                     text: '{{ trans('admin.node.auth.generating_all') }}',
-                    icon: 'info',
+                    icon: "info",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.post('{{ route('admin.node.auth.store') }}', {
                             _token: '{{ csrf_token() }}'
                         }, function(ret) {
-                            if (ret.status === 'success') {
+                            if (ret.status === "success") {
                                 swal.fire({
                                     title: ret.message,
-                                    icon: 'success',
+                                    icon: "success",
                                     timer: 1000,
-                                    showConfirmButton: false,
+                                    showConfirmButton: false
                                 }).then(() => window.location.reload());
                             } else {
                                 swal.fire({
                                     title: ret.message,
-                                    icon: 'error'
+                                    icon: "error"
                                 }).then(() => window.location.reload());
                             }
                         });
@@ -255,34 +255,34 @@
                     title: '{{ trans('admin.hint') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node_auth.attribute')]) }}' + id +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'info',
+                    icon: "info",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: '{{ route('admin.node.auth.destroy', '') }}/' + id,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });
@@ -295,34 +295,34 @@
                 swal.fire({
                     title: '{{ trans('admin.hint') }}',
                     text: '{{ trans('admin.confirm.continues') }}',
-                    icon: 'info',
+                    icon: "info",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'PUT',
+                            method: "PUT",
                             url: '{{ route('admin.node.auth.update', '') }}/' + id,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 10 - 10
resources/views/admin/node/cert/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{!! trans('admin.node.cert.title') !!}</h2>
+                <h2 class="panel-title">{!! trans('admin.menu.node.cert') !!}</h2>
                 @can('admin.node.cert.create')
                     <div class="panel-actions">
                         <a class="btn btn-primary" href="{{ route('admin.node.cert.create') }}">
@@ -81,34 +81,34 @@
                     title: '{{ trans('admin.hint') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node_cert.attribute')]) }}' + id +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'info',
+                    icon: "info",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: '{{ route('admin.node.cert.destroy', '') }}/' + id,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 10 - 10
resources/views/admin/permission/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.permission.title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.rbac.permission') }}</h2>
                 @can('admin.permission.create')
                     <div class="panel-actions">
                         <a class="btn btn-outline-primary" href="{{ route('admin.permission.create') }}">
@@ -85,34 +85,34 @@
                     title: '{{ trans('common.warning') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.permission.attribute')]) }}' +
                         name + '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: url,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 10 - 10
resources/views/admin/role/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.role.title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.rbac.role') }}</h2>
                 @can('admin.role.create')
                     <div class="panel-actions">
                         <a class="btn btn-outline-primary" href="{{ route('admin.role.create') }}">
@@ -79,34 +79,34 @@
                     title: '{{ trans('common.warning') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.role.attribute')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: url,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 10 - 10
resources/views/admin/rule/group/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.rule.group.title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.rule.group') }}</h2>
                 @can('admin.rule.group.create')
                     <div class="panel-actions">
                         <a class="btn btn-outline-primary" href="{{ route('admin.rule.group.create') }}">
@@ -74,34 +74,34 @@
                     title: '{{ trans('common.warning') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.rule_group.attribute')]) }}' +
                         name + '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: url,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 40 - 40
resources/views/admin/rule/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.rule.title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.rule.list') }}</h2>
                 @can('admin.rule.store')
                     <div class="panel-actions">
                         <button class="btn btn-outline-primary" data-toggle="modal" data-target="#add">
@@ -137,54 +137,54 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('select').selectpicker('val', {{ Request::query('type') }});
+            $("select").selectpicker("val", {{ Request::query('type') }});
         });
 
         @can('admin.rule.store')
             // 添加规则
             function addRule() {
                 $.ajax({
-                    method: 'POST',
+                    method: "POST",
                     url: "{{ route('admin.rule.store') }}",
                     data: {
                         _token: '{{ csrf_token() }}',
-                        type: $('#add_type').val(),
-                        name: $('#name').val(),
-                        pattern: $('#pattern').val(),
+                        type: $("#add_type").val(),
+                        name: $("#name").val(),
+                        pattern: $("#pattern").val()
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     success: function(ret) {
-                        $('#add').modal('hide');
-                        if (ret.status === 'success') {
+                        $("#add").modal("hide");
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
-                                showConfirmButton: false,
+                                showConfirmButton: false
                             }).then(() => window.location.reload());
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             }).then(() => window.location.reload());
                         }
                     },
                     error: function(data) {
-                        $('#add').modal('hide');
-                        let str = '';
+                        $("#add").modal("hide");
+                        let str = "";
                         const errors = data.responseJSON;
                         if ($.isEmptyObject(errors) === false) {
                             $.each(errors.errors, function(index, value) {
-                                str += '<li>' + value + '</li>';
+                                str += "<li>" + value + "</li>";
                             });
                             swal.fire({
                                 title: '{{ trans('admin.hint') }}',
                                 html: str,
-                                icon: 'error',
-                                confirmButtonText: '{{ trans('common.confirm') }}',
+                                icon: "error",
+                                confirmButtonText: '{{ trans('common.confirm') }}'
                             });
                         }
-                    },
+                    }
                 });
             }
         @endcan
@@ -193,44 +193,44 @@
             // 编辑规则
             function editRule(id) {
                 $.ajax({
-                    method: 'PUT',
+                    method: "PUT",
                     url: '{{ route('admin.rule.update', '') }}/' + id,
                     data: {
                         _token: '{{ csrf_token() }}',
-                        name: $('#name_' + id).val(),
-                        pattern: $('#pattern_' + id).val(),
+                        name: $("#name_" + id).val(),
+                        pattern: $("#pattern_" + id).val()
                     },
-                    dataType: 'json',
+                    dataType: "json",
                     success: function(ret) {
-                        if (ret.status === 'success') {
+                        if (ret.status === "success") {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'success',
+                                icon: "success",
                                 timer: 1000,
-                                showConfirmButton: false,
+                                showConfirmButton: false
                             }).then(() => window.location.reload());
                         } else {
                             swal.fire({
                                 title: ret.message,
-                                icon: 'error'
+                                icon: "error"
                             }).then(() => window.location.reload());
                         }
                     },
                     error: function(data) {
-                        let str = '';
+                        let str = "";
                         const errors = data.responseJSON;
                         if ($.isEmptyObject(errors) === false) {
                             $.each(errors.errors, function(index, value) {
-                                str += '<li>' + value + '</li>';
+                                str += "<li>" + value + "</li>";
                             });
                             swal.fire({
                                 title: '{{ trans('admin.hint') }}',
                                 html: str,
-                                icon: 'error',
-                                confirmButtonText: '{{ trans('common.confirm') }}',
+                                icon: "error",
+                                confirmButtonText: '{{ trans('common.confirm') }}'
                             });
                         }
-                    },
+                    }
                 });
             }
         @endcan
@@ -242,34 +242,34 @@
                     title: '{{ trans('common.warning') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.rule.attribute')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: url,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 9 - 9
resources/views/admin/rule/log.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.logs.rule.title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.rule.trigger') }}</h2>
                 @can('admin.rule.clear')
                     <div class="panel-actions">
                         <button class="btn btn-outline-primary" onclick="clearLog()">
@@ -90,8 +90,8 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('#node_id').selectpicker('val', @json(Request::query('node_id')));
-            $('#rule_id').selectpicker('val', @json(Request::query('rule_id')));
+            $("#node_id").selectpicker("val", @json(Request::query('node_id')));
+            $("#rule_id").selectpicker("val", @json(Request::query('rule_id')));
         });
 
         @can('admin.rule.clear')
@@ -100,26 +100,26 @@
                 swal.fire({
                     title: '{{ trans('common.warning') }}',
                     text: '{{ trans('admin.logs.rule.clear_confirm') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.post("{{ route('admin.rule.clear') }}", {
                             _token: '{{ csrf_token() }}'
                         }, function(ret) {
-                            if (ret.status === 'success') {
+                            if (ret.status === "success") {
                                 swal.fire({
                                     title: ret.message,
-                                    icon: 'success',
+                                    icon: "success",
                                     timer: 1000,
-                                    showConfirmButton: false,
+                                    showConfirmButton: false
                                 }).then(() => window.location.reload());
                             } else {
                                 swal.fire({
                                     title: ret.message,
-                                    icon: 'error'
+                                    icon: "error"
                                 });
                             }
                         });

+ 12 - 12
resources/views/admin/shop/index.blade.php

@@ -4,7 +4,7 @@
         <div class="panel panel-bordered">
             <div class="panel-heading">
                 <h1 class="panel-title">
-                    <i class="icon wb-shopping-cart" aria-hidden="true"></i>{{ trans('admin.goods.title') }}
+                    <i class="icon wb-shopping-cart" aria-hidden="true"></i>{{ trans('admin.menu.shop.goods') }}
                 </h1>
                 @can('admin.goods.create')
                     <div class="panel-actions">
@@ -133,8 +133,8 @@
 @push('javascript')
     <script>
         $(document).ready(function() {
-            $('#type').selectpicker('val', @json(Request::query('type')));
-            $('#status').selectpicker('val', @json(Request::query('status')));
+            $("#type").selectpicker("val", @json(Request::query('type')));
+            $("#status").selectpicker("val", @json(Request::query('status')));
         });
 
         @can('admin.goods.destroy')
@@ -144,34 +144,34 @@
                     title: '{{ trans('common.warning') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.goods.attribute')]) }}' + name +
                         '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.cancel') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
                             url: url,
-                            method: 'DELETE',
+                            method: "DELETE",
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 8 - 8
resources/views/admin/subscribe/log.blade.php

@@ -6,7 +6,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title">{{ trans('admin.logs.subscribe') }}</h1>
+                <h1 class="panel-title">{{ trans('admin.menu.user.subscribe') }}</h1>
             </div>
             <div class="panel-body row">
                 <form class="form-row col-12">
@@ -24,12 +24,12 @@
                                 </span>
                             </div>
                             <input class="form-control" name="start" type="text" value="{{ Request::query('start') }}"
-                                   placeholder="{{ trans('admin.start_time') }}" autocomplete="off" />
+                                   placeholder="{{ trans('admin.filter.start_time') }}" autocomplete="off" />
                             <div class="input-group-prepend">
                                 <span class="input-group-text">{{ trans('common.to') }}</span>
                             </div>
                             <input class="form-control" name="end" type="text" value="{{ Request::query('end') }}"
-                                   placeholder="{{ trans('admin.end_time') }}" autocomplete="off" />
+                                   placeholder="{{ trans('admin.filter.end_time') }}" autocomplete="off" />
                         </div>
                     </div>
                     <div class="form-group col-xxl-1 col-lg-2 btn-group">
@@ -131,8 +131,8 @@
     <script src="/assets/global/vendor/bootstrap-datepicker/bootstrap-datepicker.min.js"></script>
     <script src="/assets/global/js/Plugin/bootstrap-datepicker.js"></script>
     <script>
-        $('.input-daterange').datepicker({
-            format: 'yyyy-mm-dd',
+        $(".input-daterange").datepicker({
+            format: "yyyy-mm-dd"
         });
 
         @can('admin.subscribe.set')
@@ -141,10 +141,10 @@
                 $.post(url, {
                     _token: '{{ csrf_token() }}'
                 }, function(ret) {
-                    if (ret.status === 'success') {
+                    if (ret.status === "success") {
                         swal.fire({
                             title: ret.message,
-                            icon: 'success',
+                            icon: "success",
                             timer: 1000,
                             showConfirmButton: false
                         }).then(() => {
@@ -153,7 +153,7 @@
                     } else {
                         swal.fire({
                             title: ret.message,
-                            icon: 'error',
+                            icon: "error",
                             timer: 1000,
                             showConfirmButton: false
                         }).then(() => {

+ 27 - 27
resources/views/admin/ticket/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">{{ trans('admin.ticket.title') }}</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.customer_service.ticket') }}</h3>
                 @can('admin.ticket.store')
                     <div class="panel-actions">
                         <button class="btn btn-primary btn-animate btn-animate-side" data-toggle="modal" data-target="#add_ticket_modal">
@@ -132,86 +132,86 @@
         @can('admin.ticket.store')
             // 发起工单
             function createTicket() {
-                const uid = $('#uid').val();
-                const username = $('#username').val();
-                const title = $('#title').val();
-                const content = $('#content').val();
+                const uid = $("#uid").val();
+                const username = $("#username").val();
+                const title = $("#title").val();
+                const content = $("#content").val();
 
-                if (uid.trim() === '' && username.trim() === '') {
+                if (uid.trim() === "" && username.trim() === "") {
                     swal.fire({
                         title: '{{ trans('admin.ticket.send_to') }}',
-                        icon: 'warning'
+                        icon: "warning"
                     });
                     return false;
                 }
 
-                if (title.trim() === '') {
+                if (title.trim() === "") {
                     swal.fire({
                         title: '{{ ucfirst(trans('validation.required', ['attribute' => trans('validation.attributes.title')])) }}',
-                        icon: 'warning',
+                        icon: "warning"
                     });
                     return false;
                 }
 
-                if (content.trim() === '') {
+                if (content.trim() === "") {
                     swal.fire({
                         title: '{{ ucfirst(trans('validation.required', ['attribute' => trans('validation.attributes.content')])) }}',
-                        icon: 'warning',
+                        icon: "warning"
                     });
                     return false;
                 }
 
                 swal.fire({
                     title: '{{ trans('user.ticket.submit_tips') }}',
-                    icon: 'question',
+                    icon: "question",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'POST',
+                            method: "POST",
                             url: "{{ route('admin.ticket.store') }}",
                             data: {
                                 _token: '{{ csrf_token() }}',
                                 uid: uid,
                                 username: username,
                                 title: title,
-                                content: content,
+                                content: content
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                $('#add_ticket_modal').modal('hide');
-                                if (ret.status === 'success') {
+                                $("#add_ticket_modal").modal("hide");
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
                             },
                             error: function(data) {
-                                $('#add_ticket_modal').modal('hide');
-                                let str = '';
+                                $("#add_ticket_modal").modal("hide");
+                                let str = "";
                                 const errors = data.responseJSON;
                                 if ($.isEmptyObject(errors) === false) {
                                     $.each(errors.errors, function(index, value) {
-                                        str += '<li>' + value + '</li>';
+                                        str += "<li>" + value + "</li>";
                                     });
                                     swal.fire({
                                         title: '{{ trans('admin.hint') }}',
                                         html: str,
-                                        icon: 'error',
-                                        confirmButtonText: '{{ trans('common.confirm') }}',
+                                        icon: "error",
+                                        confirmButtonText: '{{ trans('common.confirm') }}'
                                     });
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 22 - 22
resources/views/admin/tools/analysis.blade.php

@@ -4,7 +4,7 @@
         <div class="panel">
             <div class="panel-heading">
                 <h2 class="panel-title">
-                    {!! trans('admin.tools.analysis.title') !!}
+                    {{ trans('admin.menu.tools.analysis') }} <small>{{ trans('admin.tools.analysis.sub_title') }}</small>
                 </h2>
             </div>
             @if (Session::has('analysisErrorMsg'))
@@ -40,53 +40,53 @@
     <script>
         const TableDatatablesScroller = function() {
             const e = function() {
-                const e = $('#analysis');
+                const e = $("#analysis");
                 e.dataTable({
                     language: {
                         aria: {
-                            sortAscending: ': activate to sort column ascending',
-                            sortDescending: ': activate to sort column descending',
+                            sortAscending: ": activate to sort column ascending",
+                            sortDescending: ": activate to sort column descending"
                         },
-                        emptyTable: '暂无数据',
-                        info: '第 _START_ 到 _END_ 条,共计 _TOTAL_ 条',
-                        infoEmpty: '未找到',
-                        infoFiltered: '(filtered1 from _MAX_ total entries)',
-                        lengthMenu: '_MENU_ entries',
-                        search: '搜索:',
-                        zeroRecords: '未找到',
+                        emptyTable: "暂无数据",
+                        info: "第 _START_ 到 _END_ 条,共计 _TOTAL_ 条",
+                        infoEmpty: "未找到",
+                        infoFiltered: "(filtered1 from _MAX_ total entries)",
+                        lengthMenu: "_MENU_ entries",
+                        search: "搜索:",
+                        zeroRecords: "未找到"
                     },
                     buttons: [{
-                            extend: 'print',
-                            className: 'btn btn-outline-dark'
+                            extend: "print",
+                            className: "btn btn-outline-dark"
                         },
                         {
-                            extend: 'pdf',
-                            className: 'btn btn-outline-success'
+                            extend: "pdf",
+                            className: "btn btn-outline-success"
                         },
                         {
-                            extend: 'csv',
-                            className: 'btn btn-outline-primary'
-                        },
+                            extend: "csv",
+                            className: "btn btn-outline-primary"
+                        }
                     ],
                     scrollY: 300,
                     deferRender: !0,
                     scroller: !0,
                     stateSave: !0,
                     order: [
-                        [0, 'asc']
+                        [0, "asc"]
                     ],
                     lengthMenu: [
                         [10, 15, 20, -1],
-                        [10, 15, 20, 'All']
+                        [10, 15, 20, "All"]
                     ],
                     pageLength: 20,
-                    dom: '<\'row\' <\'col-md-12\'B>><\'row\'<\'col-md-6 col-sm-12\'l><\'col-md-6 col-sm-12\'f>r><\'table-scrollable\'t><\'row\'<\'col-md-5 col-sm-12\'i><\'col-md-7 col-sm-12\'p>>',
+                    dom: "<'row' <'col-md-12'B>><'row'<'col-md-6 col-sm-12'l><'col-md-6 col-sm-12'f>r><'table-scrollable't><'row'<'col-md-5 col-sm-12'i><'col-md-7 col-sm-12'p>>"
                 });
             };
             return {
                 init: function() {
                     jQuery().dataTable && (e());
-                },
+                }
             };
         }();
         jQuery(document).ready(function() {

+ 20 - 20
resources/views/admin/tools/convert.blade.php

@@ -4,7 +4,7 @@
         <div class="panel">
             <div class="panel-heading">
                 <h2 class="panel-title">
-                    {!! trans('admin.tools.convert.title') !!}
+                    {{ trans('admin.menu.tools.convert') }} <small>{{ trans('admin.tools.convert.sub_title') }}</small>
                 </h2>
             </div>
             <div class="panel-body">
@@ -75,47 +75,47 @@
     <script>
         // 转换
         function Convert() {
-            const content = $('#content').val();
+            const content = $("#content").val();
 
-            if (content.trim() === '') {
+            if (content.trim() === "") {
                 swal.fire({
                     title: '{{ trans('admin.tools.convert.content_placeholder') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     timer: 1000,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
                 return;
             }
             swal.fire({
                 title: '{{ trans('admin.confirm.continues') }}',
-                icon: 'question',
+                icon: "question",
                 allowEnterKey: false,
                 showCancelButton: true,
                 cancelButtonText: '{{ trans('common.close') }}',
-                confirmButtonText: '{{ trans('common.confirm') }}',
+                confirmButtonText: '{{ trans('common.confirm') }}'
             }).then((result) => {
                 if (result.value) {
                     $.ajax({
-                        method: 'POST',
+                        method: "POST",
                         url: '{{ route('admin.tools.convert') }}',
-                        dataType: 'json',
+                        dataType: "json",
                         data: {
                             _token: '{{ csrf_token() }}',
-                            method: $('#method').val(),
-                            transfer_enable: $('#transfer_enable').val(),
-                            protocol: $('#protocol').val(),
-                            protocol_param: $('#protocol_param').val(),
-                            obfs: $('#obfs').val(),
-                            obfs_param: $('#obfs_param').val(),
-                            content: content,
+                            method: $("#method").val(),
+                            transfer_enable: $("#transfer_enable").val(),
+                            protocol: $("#protocol").val(),
+                            protocol_param: $("#protocol_param").val(),
+                            obfs: $("#obfs").val(),
+                            obfs_param: $("#obfs_param").val(),
+                            content: content
                         },
                         success: function(ret) {
-                            if (ret.status === 'success') {
-                                $('#result').val(ret.data);
+                            if (ret.status === "success") {
+                                $("#result").val(ret.data);
                             } else {
-                                $('#result').val(ret.message);
+                                $("#result").val(ret.message);
                             }
-                        },
+                        }
                     });
                 }
             });

+ 13 - 13
resources/views/admin/tools/decompile.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{!! trans('admin.tools.decompile.title') !!}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.tools.decompile') }}</h2>
             </div>
             <div class="panel-body">
                 <div class="row">
@@ -28,41 +28,41 @@
     <script>
         // 转换
         function Decompile() {
-            const content = $('#content').val();
+            const content = $("#content").val();
 
-            if (content.trim() === '') {
+            if (content.trim() === "") {
                 swal.fire({
                     title: '{{ trans('admin.tools.decompile.content_placeholder') }}',
-                    icon: 'warning',
+                    icon: "warning",
                     timer: 1000,
-                    showConfirmButton: false,
+                    showConfirmButton: false
                 });
                 return;
             }
             swal.fire({
                 title: '{{ trans('admin.confirm.continues') }}',
-                icon: 'question',
+                icon: "question",
                 allowEnterKey: false,
                 showCancelButton: true,
                 cancelButtonText: '{{ trans('common.close') }}',
-                confirmButtonText: '{{ trans('common.confirm') }}',
+                confirmButtonText: '{{ trans('common.confirm') }}'
             }).then((result) => {
                 if (result.value) {
                     $.ajax({
-                        method: 'POST',
+                        method: "POST",
                         url: '{{ route('admin.tools.decompile') }}',
-                        dataType: 'json',
+                        dataType: "json",
                         data: {
                             _token: '{{ csrf_token() }}',
                             content: content
                         },
                         success: function(ret) {
-                            if (ret.status === 'success') {
-                                $('#result').val(ret.data);
+                            if (ret.status === "success") {
+                                $("#result").val(ret.data);
                             } else {
-                                $('#result').val(ret.message);
+                                $("#result").val(ret.message);
                             }
-                        },
+                        }
                     });
                 }
             });

+ 10 - 10
resources/views/admin/user/group/index.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{!! trans('admin.user.group.title') !!}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.user.group') }} <small>{{ trans('admin.user.group.sub_title') }}</small></h2>
                 @can('admin.user.group.create')
                     <div class="panel-actions">
                         <a class="btn btn-primary" href="{{ route('admin.user.group.create') }}">
@@ -72,34 +72,34 @@
                     title: '{{ trans('admin.hint') }}',
                     text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.user_group.attribute')]) }}' +
                         name + '{{ trans('admin.confirm.delete.1') }}',
-                    icon: 'info',
+                    icon: "info",
                     showCancelButton: true,
                     cancelButtonText: '{{ trans('common.close') }}',
-                    confirmButtonText: '{{ trans('common.confirm') }}',
+                    confirmButtonText: '{{ trans('common.confirm') }}'
                 }).then((result) => {
                     if (result.value) {
                         $.ajax({
-                            method: 'DELETE',
+                            method: "DELETE",
                             url: url,
                             data: {
                                 _token: '{{ csrf_token() }}'
                             },
-                            dataType: 'json',
+                            dataType: "json",
                             success: function(ret) {
-                                if (ret.status === 'success') {
+                                if (ret.status === "success") {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'success',
+                                        icon: "success",
                                         timer: 1000,
-                                        showConfirmButton: false,
+                                        showConfirmButton: false
                                     }).then(() => window.location.reload());
                                 } else {
                                     swal.fire({
                                         title: ret.message,
-                                        icon: 'error'
+                                        icon: "error"
                                     }).then(() => window.location.reload());
                                 }
-                            },
+                            }
                         });
                     }
                 });

+ 1 - 1
resources/views/admin/user/oauth.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{ trans('admin.oauth.title') }}</h2>
+                <h2 class="panel-title">{{ trans('admin.menu.user.oauth') }}</h2>
             </div>
             <div class="panel-body">
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">

+ 1 - 1
resources/views/auth/resetPassword.blade.php

@@ -20,7 +20,7 @@
                 </label>
             </div>
         @else
-            <x-alert type="danger" :message="trans('auth.password.reset.error.disabled', ['email' => sysConfig('webmaster_email')])" />
+            <x-alert type="danger" :message="trans('auth.password.reset.error.disabled')" />
         @endif
         <a class="btn btn-danger btn-lg {{ sysConfig('password_reset_notification') ? 'float-left' : 'btn-block' }}" href="{{ route('login') }}">
             {{ trans('common.back') }}

+ 1 - 1
resources/views/components/system/input-file.blade.php

@@ -2,7 +2,7 @@
 
 <div class="form-group col-lg-6">
     <div class="row">
-        <label class="col-form-label col-md-3" for="{{ $code }}">{{ trans("admin.system.$code") }}</label>
+        <label class="col-form-label col-md-3" for="{{ $code }}">{{ trans("model.config.$code") }}</label>
         <div class="col-md-8">
             <input name="{{ $code }}" data-plugin="dropify" data-default-file="{{ asset($value ?? '/assets/images/default.png') }}" type="file" />
             <button class="btn btn-success float-right mt-10" type="submit">{{ trans('common.submit') }}</button>

+ 2 - 2
resources/views/components/system/input-limit.blade.php

@@ -2,7 +2,7 @@
 
 <div class="form-group col-lg-6">
     <div class="row">
-        <label class="col-md-3 col-form-label" for="{{ $code }}">{{ trans("admin.system.$code") }}</label>
+        <label class="col-md-3 col-form-label" for="{{ $code }}">{{ trans("model.config.$code") }}</label>
         <div class="col-md-7">
             @isset($hcode)
                 <div class="input-group">
@@ -36,6 +36,6 @@
             @if (trans("admin.system.hint.$code") !== "admin.system.hint.$code")
                 <span class="text-help"> {!! trans("admin.system.hint.$code") !!} </span>
             @endisset
+        </div>
     </div>
 </div>
-</div>

+ 1 - 1
resources/views/components/system/input.blade.php

@@ -3,7 +3,7 @@
 <div class="form-group col-lg-6">
     <div class="row">
         <label class="col-md-3 col-form-label" for="{{ $code }}">
-            {{ trans("admin.system.$code") }}
+            {{ trans("model.config.$code") }}
         </label>
         <div class="col-md-6">
             <div class="input-group">

+ 1 - 1
resources/views/components/system/select.blade.php

@@ -2,7 +2,7 @@
 
 <div class="form-group col-lg-6">
     <div class="row">
-        <label class="col-md-3 col-form-label" for="{{ $code }}">{{ trans("admin.system.$code") }}</label>
+        <label class="col-md-3 col-form-label" for="{{ $code }}">{{ trans("model.config.$code") }}</label>
         <div class="col-md-9">
             <select id="{{ $code }}" data-plugin="selectpicker" data-style="btn-outline btn-primary"
                     onchange="updateFromOther('{{ $multiple ? 'multiSelect' : 'select' }}','{{ $code }}')"

+ 1 - 1
resources/views/components/system/switch.blade.php

@@ -2,7 +2,7 @@
 
 <div class="form-group col-lg-6">
     <div class="row">
-        <label class="col-md-3 col-form-label" for="{{ $code }}">{{ trans("admin.system.$code") }}</label>
+        <label class="col-md-3 col-form-label" for="{{ $code }}">{{ trans("model.config.$code") }}</label>
         <div class="col-md-9">
             <input id="{{ $code }}" data-plugin="switchery" type="checkbox" @if ($check) checked @endif
                    @if ($feature) data-feature-toggle="{{ $feature }}" @endif

+ 3 - 3
resources/views/components/system/task-group.blade.php

@@ -1,6 +1,6 @@
-@props(['type', 'items', 'units'])
-<div class="col-12 row" id="{{ "tasks_$type" }}">
-    <hr class="col-12" />
+@props(['type', 'items', 'units', 'feature' => null])
+<div class="col-12 row" id="{{ "tasks_$type" }}" data-feature="{{ $feature }}">
+    <hr class="col-12 hr-text" data-content="{{ trans("model.config.tasks_$type") }}" />
     @foreach ($items as $key => $duration)
         <x-system.input-unit type="{{ $type }}" :key="$key" :value="$duration['num']" :unit="$duration['unit']" :units="$units" />
     @endforeach

+ 2 - 2
resources/views/components/system/textarea.blade.php

@@ -2,7 +2,7 @@
 
 <div class="form-group col-lg-6">
     <div class="row">
-        <label class="col-md-3 col-form-label" for="{{ $code }}">{{ trans("admin.system.$code") }}</label>
+        <label class="col-md-3 col-form-label" for="{{ $code }}">{{ trans("model.config.$code") }}</label>
         <div class="col-md-8">
             <div class="input-group">
                 <textarea class="form-control" id="{{ $code }}" rows={{ $row }}>{{ $value }}</textarea>
@@ -13,6 +13,6 @@
             @if (trans("admin.system.hint.$code") !== "admin.system.hint.$code")
                 <span class="text-help"> {!! trans("admin.system.hint.$code") !!} </span>
             @endisset
+        </div>
     </div>
 </div>
-</div>

+ 1 - 1
resources/views/user/index.blade.php

@@ -322,7 +322,7 @@
         function exchangeSubscribe() { // 更换订阅地址
             swal.fire({
                 title: '{{ trans('common.warning') }}',
-                text: '{{ trans('user.subscribe.exchange_warning') }}',
+                html: `{!! trans('user.subscribe.exchange_warning') !!}`,
                 icon: "warning",
                 showCancelButton: true,
                 cancelButtonText: '{{ trans('common.close') }}',

+ 15 - 14
resources/views/user/invite.blade.php

@@ -9,7 +9,8 @@
         </h1>
     </div>
     <div class="page-content container-fluid">
-        <x-alert type="info" :message="trans('user.invite.promotion', ['traffic' => $referral_traffic, 'referral_percent' => $referral_percent * 100])" />
+        <x-alert type="info" :message="trans('user.invite.promotion.base', ['traffic' => $referral_traffic]) .
+            trans('user.invite.promotion.bonus.' . $referral_reward_mode, ['referral_percent' => $referral_percent])" />
         <div class="row">
             <div class="col-xxl-3 col-lg-4">
                 <div class="card">
@@ -85,44 +86,44 @@
         // 生成邀请码
         function makeInvite() {
             $.ajax({
-                method: 'POST',
-                dataType: 'json',
+                method: "POST",
+                dataType: "json",
                 url: '{{ route('invite.store') }}',
                 data: {
                     _token: '{{ csrf_token() }}'
                 },
                 success: function(ret) {
-                    if (ret.status === 'success') {
+                    if (ret.status === "success") {
                         swal.fire({
                             title: ret.message,
-                            icon: 'success'
+                            icon: "success"
                         }).then(() => window.location.reload());
                     } else {
                         swal.fire({
                             title: ret.message,
-                            icon: 'error'
+                            icon: "error"
                         }).then(() => window.location.reload());
                     }
-                },
+                }
             });
             return false;
         }
 
-        const clipboard = new ClipboardJS('.mt-clipboard');
-        clipboard.on('success', function() {
+        const clipboard = new ClipboardJS(".mt-clipboard");
+        clipboard.on("success", function() {
             swal.fire({
                 title: '{{ trans('common.copy.success') }}',
-                icon: 'success',
+                icon: "success",
                 timer: 1300,
-                showConfirmButton: false,
+                showConfirmButton: false
             });
         });
-        clipboard.on('error', function() {
+        clipboard.on("error", function() {
             swal.fire({
                 title: '{{ trans('common.copy.failed') }}',
-                icon: 'error',
+                icon: "error",
                 timer: 1500,
-                showConfirmButton: false,
+                showConfirmButton: false
             });
         });
     </script>

+ 1 - 1
resources/views/user/invoices.blade.php

@@ -83,7 +83,7 @@
         function closePlan() {
             swal.fire({
                 title: '{{ trans('user.invoice.active_prepaid_question') }}',
-                html: @json(trans('user.invoice.active_prepaid_tips')),
+                html: `{!! trans('user.invoice.active_prepaid_tips') !!}`,
                 icon: 'warning',
                 showCancelButton: true,
                 cancelButtonText: '{{ trans('common.close') }}',

+ 3 - 3
resources/views/user/knowledge.blade.php

@@ -6,7 +6,7 @@
 @endsection
 @section('content')
     <div class="page-header">
-        <h1 class="page-title">{{ __('user.knowledge.title') }}</h1>
+        <h1 class="page-title">{{ __('user.menu.help') }}</h1>
     </div>
     <div class="page-content container-fluid">
         @if ($knowledge->isNotEmpty())
@@ -95,7 +95,7 @@
                                             @endif
                                             @foreach ($articles as $article)
                                                 <div class="panel">
-                                                    <div class="panel-heading"id="article_Q{{ $article->id }}">
+                                                    <div class="panel-heading" id="article_Q{{ $article->id }}">
                                                         <a class="panel-title collapsed" data-toggle="collapse" href="#article_A{{ $article->id }}"
                                                            role="tab" aria-controls="article_A{{ $article->id }}" aria-expanded="false"
                                                            style="display: flex;" onclick="getArticle('{{ $article->id }}')">
@@ -162,7 +162,7 @@
         function exchangeSubscribe() {
             swal.fire({
                 title: '{{ trans('common.warning') }}',
-                text: '{{ trans('user.subscribe.exchange_warning') }}',
+                html: `{!! trans('user.subscribe.exchange_warning') !!}`,
                 icon: "warning",
                 showCancelButton: true,
                 cancelButtonText: '{{ trans('common.close') }}',

+ 27 - 26
resources/views/user/referral.blade.php

@@ -7,7 +7,8 @@
         <h1 class="page-title cyan-600"><i class="icon wb-star"></i>{{ trans('user.menu.promotion') }}</h1>
     </div>
     <div class="page-content  container-fluid">
-        <x-alert type="success" :message="trans('user.invite.promotion', ['traffic' => $referral_traffic, 'referral_percent' => $referral_percent * 100])" />
+        <x-alert type="success" :message="trans('user.invite.promotion.base', ['traffic' => $referral_traffic]) .
+            trans('user.invite.promotion.bonus.' . $referral_reward_mode, ['referral_percent' => $referral_percent])" />
         <div class="row">
             <div class="col-lg-5">
                 <!-- 推广链接 -->
@@ -167,27 +168,27 @@
             dotScale: 0.9,
             width: 144,
             height: 144,
-            backgroundImage: '/assets/images/logo_original.png',
+            backgroundImage: "/assets/images/logo_original.png",
             backgroundImageAlpha: 1,
-            PO_TL: '#007bff',
-            PI_TL: '#17a2b8',
-            PI_TR: '#fd7e14',
-            PO_TR: '#28a745',
-            PI_BL: '#ffc107',
-            PO_BL: '#17a2b8',
-            AO: '#fd7e14',
-            AI: '#20c997',
-            autoColor: true,
+            PO_TL: "#007bff",
+            PI_TL: "#17a2b8",
+            PI_TR: "#fd7e14",
+            PO_TR: "#28a745",
+            PI_BL: "#ffc107",
+            PO_BL: "#17a2b8",
+            AO: "#fd7e14",
+            AI: "#20c997",
+            autoColor: true
         };
 
         // Create QRCode Object
-        new QRCode(document.getElementById('qrcode'), options);
+        new QRCode(document.getElementById("qrcode"), options);
 
         function Download() {
-            const canvas = document.getElementsByTagName('canvas')[0];
+            const canvas = document.getElementsByTagName("canvas")[0];
             canvas.toBlob((blob) => {
-                let link = document.createElement('a');
-                link.download = 'qr.png';
+                let link = document.createElement("a");
+                link.download = "qr.png";
 
                 let reader = new FileReader();
                 reader.readAsDataURL(blob);
@@ -195,7 +196,7 @@
                     link.href = reader.result;
                     link.click();
                 };
-            }, 'image/png');
+            }, "image/png");
         }
 
         // 申请提现
@@ -203,36 +204,36 @@
             $.post('{{ route('referral.withdraw') }}', {
                 _token: '{{ csrf_token() }}'
             }, function(ret) {
-                if (ret.status === 'success') {
+                if (ret.status === "success") {
                     swal.fire({
                         title: ret.message,
-                        icon: 'success',
+                        icon: "success",
                         timer: 1000,
                         showConfirmButton: false
                     }).then(() => {
                         window.location.reload();
                     });
                 } else {
-                    swal.fire(ret.title, ret.message, 'error');
+                    swal.fire(ret.title, ret.message, "error");
                 }
             });
         }
 
-        const clipboard = new ClipboardJS('.mt-clipboard');
-        clipboard.on('success', function() {
+        const clipboard = new ClipboardJS(".mt-clipboard");
+        clipboard.on("success", function() {
             swal.fire({
                 title: '{{ trans('common.copy.success') }}',
-                icon: 'success',
+                icon: "success",
                 timer: 1300,
-                showConfirmButton: false,
+                showConfirmButton: false
             });
         });
-        clipboard.on('error', function() {
+        clipboard.on("error", function() {
             swal.fire({
                 title: '{{ trans('common.copy.failed') }}',
-                icon: 'error',
+                icon: "error",
                 timer: 1500,
-                showConfirmButton: false,
+                showConfirmButton: false
             });
         });
     </script>

Daži faili netika attēloti, jo izmaiņu fails ir pārāk liels