浏览代码

管理端 国际化

BrettonYe 2 年之前
父节点
当前提交
01e5bc3ea8
共有 100 个文件被更改,包括 8854 次插入3120 次删除
  1. 2 2
      app/Http/Controllers/Admin/CouponController.php
  2. 1 1
      app/Http/Controllers/Admin/ToolsController.php
  3. 3 3
      app/Http/Controllers/Admin/UserController.php
  4. 2 2
      app/Http/Controllers/AdminController.php
  5. 4 4
      app/Models/Invite.php
  6. 8 8
      app/Models/Order.php
  7. 3 3
      app/Models/Payment.php
  8. 3 3
      app/Models/ReferralApply.php
  9. 3 3
      app/Models/ReferralLog.php
  10. 2 2
      app/Models/RuleGroup.php
  11. 4 4
      app/Models/Ticket.php
  12. 2 0
      config/common.php
  13. 1 1
      config/version.php
  14. 56 0
      public/assets/css/font.css
  15. 3 1
      readme.md
  16. 844 0
      resources/lang/en/admin.php
  17. 2 8
      resources/lang/en/auth.php
  18. 115 57
      resources/lang/en/common.php
  19. 239 0
      resources/lang/en/model.php
  20. 44 68
      resources/lang/en/user.php
  21. 4 2
      resources/lang/en/validation.php
  22. 28 0
      resources/lang/ko.json
  23. 844 0
      resources/lang/ko/admin.php
  24. 84 0
      resources/lang/ko/auth.php
  25. 144 0
      resources/lang/ko/common.php
  26. 36 0
      resources/lang/ko/errors.php
  27. 239 0
      resources/lang/ko/model.php
  28. 35 0
      resources/lang/ko/notification.php
  29. 219 0
      resources/lang/ko/user.php
  30. 25 3
      resources/lang/ko/validation.php
  31. 28 0
      resources/lang/vi.json
  32. 844 0
      resources/lang/vi/admin.php
  33. 84 0
      resources/lang/vi/auth.php
  34. 144 0
      resources/lang/vi/common.php
  35. 36 0
      resources/lang/vi/errors.php
  36. 239 0
      resources/lang/vi/model.php
  37. 35 0
      resources/lang/vi/notification.php
  38. 6 0
      resources/lang/vi/pagination.php
  39. 9 0
      resources/lang/vi/passwords.php
  40. 219 0
      resources/lang/vi/user.php
  41. 137 0
      resources/lang/vi/validation.php
  42. 844 0
      resources/lang/zh_CN/admin.php
  43. 115 57
      resources/lang/zh_CN/common.php
  44. 239 0
      resources/lang/zh_CN/model.php
  45. 41 65
      resources/lang/zh_CN/user.php
  46. 13 14
      resources/views/_layout.blade.php
  47. 12 11
      resources/views/admin/aff/detail.blade.php
  48. 87 86
      resources/views/admin/aff/index.blade.php
  49. 49 49
      resources/views/admin/aff/invite.blade.php
  50. 26 24
      resources/views/admin/aff/rebate.blade.php
  51. 26 26
      resources/views/admin/article/index.blade.php
  52. 17 15
      resources/views/admin/article/info.blade.php
  53. 7 7
      resources/views/admin/article/show.blade.php
  54. 117 119
      resources/views/admin/config/common.blade.php
  55. 57 57
      resources/views/admin/config/emailFilter.blade.php
  56. 240 265
      resources/views/admin/config/system.blade.php
  57. 50 51
      resources/views/admin/coupon/create.blade.php
  58. 41 37
      resources/views/admin/coupon/index.blade.php
  59. 32 47
      resources/views/admin/coupon/show.blade.php
  60. 29 29
      resources/views/admin/index.blade.php
  61. 56 60
      resources/views/admin/layouts.blade.php
  62. 12 12
      resources/views/admin/logs/callback.blade.php
  63. 17 17
      resources/views/admin/logs/notification.blade.php
  64. 17 17
      resources/views/admin/logs/onlineIPMonitor.blade.php
  65. 39 36
      resources/views/admin/logs/order.blade.php
  66. 23 23
      resources/views/admin/logs/traffic.blade.php
  67. 11 11
      resources/views/admin/logs/userBanHistory.blade.php
  68. 12 12
      resources/views/admin/logs/userCreditHistory.blade.php
  69. 67 67
      resources/views/admin/logs/userMonitor.blade.php
  70. 24 24
      resources/views/admin/logs/userOnlineIP.blade.php
  71. 12 12
      resources/views/admin/logs/userTraffic.blade.php
  72. 21 21
      resources/views/admin/marketing/emailList.blade.php
  73. 61 62
      resources/views/admin/marketing/pushList.blade.php
  74. 125 124
      resources/views/admin/node/auth.blade.php
  75. 35 35
      resources/views/admin/node/cert/index.blade.php
  76. 23 19
      resources/views/admin/node/cert/info.blade.php
  77. 150 150
      resources/views/admin/node/index.blade.php
  78. 91 93
      resources/views/admin/node/info.blade.php
  79. 67 67
      resources/views/admin/node/monitor.blade.php
  80. 34 33
      resources/views/admin/permission/index.blade.php
  81. 22 17
      resources/views/admin/permission/info.blade.php
  82. 131 127
      resources/views/admin/report/accounting.blade.php
  83. 74 74
      resources/views/admin/report/userDataAnalysis.blade.php
  84. 30 30
      resources/views/admin/role/index.blade.php
  85. 52 47
      resources/views/admin/role/info.blade.php
  86. 32 32
      resources/views/admin/rule/group/index.blade.php
  87. 52 47
      resources/views/admin/rule/group/info.blade.php
  88. 117 116
      resources/views/admin/rule/index.blade.php
  89. 43 43
      resources/views/admin/rule/log.blade.php
  90. 59 59
      resources/views/admin/shop/index.blade.php
  91. 131 127
      resources/views/admin/shop/info.blade.php
  92. 38 38
      resources/views/admin/subscribe/index.blade.php
  93. 42 39
      resources/views/admin/subscribe/log.blade.php
  94. 75 74
      resources/views/admin/ticket/index.blade.php
  95. 34 33
      resources/views/admin/ticket/reply.blade.php
  96. 49 49
      resources/views/admin/tools/analysis.blade.php
  97. 52 51
      resources/views/admin/tools/convert.blade.php
  98. 36 35
      resources/views/admin/tools/decompile.blade.php
  99. 2 2
      resources/views/admin/tools/import.blade.php
  100. 64 51
      resources/views/admin/user/export.blade.php

+ 2 - 2
app/Http/Controllers/Admin/CouponController.php

@@ -147,7 +147,7 @@ class CouponController extends Controller
             $sheet->fromArray(['名称', '使用次数', '有效期', '券码', '金额('.array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')].')', '权重', '使用限制']);
             foreach ($voucherList as $k => $vo) {
                 $dateRange = $vo->start_time.' ~ '.$vo->end_time;
-                $sheet->fromArray([$vo->name, $vo->usable_times ?? '无限制', $dateRange, $vo->sn, $vo->value, $vo->priority, json_encode($vo->limit)], null, 'A'.($k + 2));
+                $sheet->fromArray([$vo->name, $vo->usable_times ?? trans('common.unlimited'), $dateRange, $vo->sn, $vo->value, $vo->priority, json_encode($vo->limit)], null, 'A'.($k + 2));
             }
 
             // 折扣券
@@ -158,7 +158,7 @@ class CouponController extends Controller
             $sheet->fromArray(['名称', '使用次数', '有效期', '券码', '折扣(折)', '权重', '使用限制']);
             foreach ($discountCouponList as $k => $vo) {
                 $dateRange = $vo->start_time.' ~ '.$vo->end_time;
-                $sheet->fromArray([$vo->name, $vo->usable_times ?? '无限制', $dateRange, $vo->sn, $vo->value, $vo->priority, json_encode($vo->limit)], null, 'A'.($k + 2));
+                $sheet->fromArray([$vo->name, $vo->usable_times ?? trans('common.unlimited'), $dateRange, $vo->sn, $vo->value, $vo->priority, json_encode($vo->limit)], null, 'A'.($k + 2));
             }
 
             // 充值券

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

@@ -41,7 +41,7 @@ class ToolsController extends Controller
             }
 
             // 生成转换好的JSON文件
-            file_put_contents(public_path('downloads/decompile.json'), $txt);
+            //file_put_contents(public_path('downloads/decompile.json'), $txt);
 
             return Response::json(['status' => 'success', 'data' => $txt, 'message' => '反解析成功']);
         }

+ 3 - 3
app/Http/Controllers/Admin/UserController.php

@@ -179,12 +179,12 @@ class UserController extends Controller
             for ($i = 0; $i < (int) request('amount', 1); $i++) {
                 $user = Helpers::addUser(Str::random(8).'@auto.generate', Str::random(), 1024 * GB, 365);
                 // 写入用户流量变动记录
-                Helpers::addUserTrafficModifyLog($user->id, null, 0, 1024 * GB, '后台批量生成用户');
+                Helpers::addUserTrafficModifyLog($user->id, null, 0, 1024 * GB, trans('admin.user.massive.note'));
             }
 
-            return Response::json(['status' => 'success', 'message' => '批量生成账号成功']);
+            return Response::json(['status' => 'success', 'message' => trans('admin.user.massive.succeed')]);
         } catch (Exception $e) {
-            return Response::json(['status' => 'fail', 'message' => '批量生成账号失败:'.$e->getMessage()]);
+            return Response::json(['status' => 'fail', 'message' => trans('admin.user.massive.failed').':'.$e->getMessage()]);
         }
     }
 

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

@@ -36,7 +36,7 @@ class AdminController extends Controller
             'enableUserCount' => User::whereEnable(1)->count(), // 有效用户数
             'activeUserCount' => User::where('t', '>=', $past)->count(), // 活跃用户数,
             'payingUserCount' => Order::whereStatus(2)->where('goods_id', '<>', null)->whereIsExpire(0)->where('amount', '>', 0)->pluck('user_id')->unique()->count(), // 付费用户数
-            'unActiveUserCount' => User::whereEnable(1)->whereBetween('t', [1, $past])->count(), // 不活跃用户数
+            'inactiveUserCount' => User::whereEnable(1)->whereBetween('t', [1, $past])->count(), // 不活跃用户数
             'onlineUserCount' => User::where('t', '>=', strtotime('-10 minutes'))->count(), // 10分钟内在线用户数
             'expireWarningUserCount' => User::whereBetween('expired_at', [date('Y-m-d'), date('Y-m-d', strtotime(sysConfig('expire_days').' days'))])->count(), // 临近过期用户数
             'largeTrafficUserCount' => User::whereRaw('(u + d)/transfer_enable >= 0.9')->where('status', '<>', -1)->count(), // 流量使用超过90%的用户
@@ -62,7 +62,7 @@ class AdminController extends Controller
     // 邀请码列表
     public function inviteList()
     {
-        return view('admin.inviteList', [
+        return view('admin.aff.invite', [
             'inviteList' => Invite::with(['invitee:id,username', 'inviter:id,username'])->orderBy('status')->orderByDesc('id')->paginate(15)->appends(request('page')),
         ]);
     }

+ 4 - 4
app/Models/Invite.php

@@ -37,16 +37,16 @@ class Invite extends Model
     {
         switch ($this->attributes['status']) {
             case 0:
-                $status_label = '<span class="badge badge-success">'.trans('user.status.unused').'</span>';
+                $status_label = '<span class="badge badge-success">'.trans('common.status.unused').'</span>';
                 break;
             case 1:
-                $status_label = '<span class="badge badge-danger">'.trans('user.status.used').'</span>';
+                $status_label = '<span class="badge badge-danger">'.trans('common.status.used').'</span>';
                 break;
             case 2:
-                $status_label = '<span class="badge badge-default">'.trans('user.status.expired').'</span>';
+                $status_label = '<span class="badge badge-default">'.trans('common.status.expire').'</span>';
                 break;
             default:
-                $status_label = '<span class="badge badge-default"> 未知 </span>';
+                $status_label = '<span class="badge badge-default"> '.trans('common.status.unknown').' </span>';
         }
 
         return $status_label;

+ 8 - 8
app/Models/Order.php

@@ -114,28 +114,28 @@ class Order extends Model
     {
         switch ($this->attributes['status']) {
             case -1:
-                $status_label = '<span class="badge badge-default">'.trans('user.status.closed').'</span>';
+                $status_label = '<span class="badge badge-default">'.trans('common.order.status.cancel').'</span>';
                 break;
             case 0:
-                $status_label = '<span class="badge badge-danger">'.trans('user.status.waiting_payment').'</span>';
+                $status_label = '<span class="badge badge-danger">'.trans('common.payment.status.wait').'</span>';
                 break;
             case 1:
-                $status_label = '<span class="badge badge-info">'.trans('user.status.waiting_confirm').'</span>';
+                $status_label = '<span class="badge badge-info">'.trans('common.order.status.review').'</span>';
                 break;
             case 2:
                 if ($this->attributes['goods_id'] === null) {
-                    $status_label = '<span class="badge badge-default">'.trans('user.status.completed').'</span>';
+                    $status_label = '<span class="badge badge-default">'.trans('common.order.status.complete').'</span>';
                 } elseif ($this->attributes['is_expire']) {
-                    $status_label = '<span class="badge badge-default">'.trans('user.status.expired').'</span>';
+                    $status_label = '<span class="badge badge-default">'.trans('common.status.expire').'</span>';
                 } else {
-                    $status_label = '<span class="badge badge-success">'.trans('user.status.using').'</span>';
+                    $status_label = '<span class="badge badge-success">'.trans('common.order.status.ongoing').'</span>';
                 }
                 break;
             case 3:
-                $status_label = '<span class="badge badge-info">'.trans('user.status.prepaid').'</span>';
+                $status_label = '<span class="badge badge-info">'.trans('common.order.status.prepaid').'</span>';
                 break;
             default:
-                $status_label = trans('user.unknown');
+                $status_label = trans('common.status.unknown');
         }
 
         return $status_label;

+ 3 - 3
app/Models/Payment.php

@@ -65,14 +65,14 @@ class Payment extends Model
     {
         switch ($this->attributes['status']) {
             case -1:
-                $status_label = '支付失败';
+                $status_label =  trans('common.payment.status.fail');
                 break;
             case 1:
-                $status_label = '支付成功';
+                $status_label = trans('common.payment.status.success');
                 break;
             case 0:
             default:
-                $status_label = '等待支付';
+                $status_label = trans('common.payment.status.wait');
         }
 
         return $status_label;

+ 3 - 3
app/Models/ReferralApply.php

@@ -70,14 +70,14 @@ class ReferralApply extends Model
     {
         switch ($this->attributes['status']) {
             case 1:
-                $status_label = '<span class="badge badge-sm badge-info">'.trans('user.status.pending').'</span>';
+                $status_label = '<span class="badge badge-sm badge-info">'.trans('common.status.pending').'</span>';
                 break;
             case 2:
-                $status_label = trans('user.status.withdrawn');
+                $status_label = trans('common.status.withdrawn');
                 break;
             case 0:
             default:
-                $status_label = '<span class="badge badge-sm badge-warning">'.trans('user.status.applying').'</span>';
+                $status_label = '<span class="badge badge-sm badge-warning">'.trans('common.status.applying').'</span>';
         }
 
         return $status_label;

+ 3 - 3
app/Models/ReferralLog.php

@@ -69,13 +69,13 @@ class ReferralLog extends Model
     {
         switch ($this->attributes['status']) {
             case 1:
-                $status_label = '<span class="badge badge-sm badge-info">'.trans('user.status.applying').'</span>';
+                $status_label = '<span class="badge badge-sm badge-info">'.trans('common.status.applying').'</span>';
                 break;
             case 2:
-                $status_label = '<span class="badge badge-sm badge-default">'.trans('user.status.withdrawn').'</span>';
+                $status_label = '<span class="badge badge-sm badge-default">'.trans('common.status.withdrawn').'</span>';
                 break;
             default:
-                $status_label = '<span class="badge badge-sm badge-success">'.trans('user.status.not_withdrawn').'</span>';
+                $status_label = '<span class="badge badge-sm badge-success">'.trans('common.status.unwithdrawn').'</span>';
         }
 
         return $status_label;

+ 2 - 2
app/Models/RuleGroup.php

@@ -15,9 +15,9 @@ class RuleGroup extends Model
     public function getTypeLabelAttribute(): string
     {
         if ($this->attributes['type']) {
-            $type_label = '<span class="badge badge-danger">阻 断</span>';
+            $type_label = '<span class="badge badge-danger">'.trans('admin.rule.group.type.off').'</span>';
         } else {
-            $type_label = '<span class="badge badge-primary">放 行</span>';
+            $type_label = '<span class="badge badge-primary">'.trans('admin.rule.group.type.on').'</span>';
         }
 
         return $type_label;

+ 4 - 4
app/Models/Ticket.php

@@ -46,16 +46,16 @@ class Ticket extends Model
     {
         switch ($this->attributes['status']) {
             case 0:
-                $status_label = '<span class="badge badge-lg badge-success">'.trans('user.status.pending').'</span>';
+                $status_label = '<span class="badge badge-lg badge-success">'.trans('common.status.pending').'</span>';
                 break;
             case 1:
-                $status_label = '<span class="badge badge-lg badge-danger">'.trans('user.status.reply').'</span>';
+                $status_label = '<span class="badge badge-lg badge-danger">'.trans('common.status.reply').'</span>';
                 break;
             case 2:
-                $status_label = '<span class="badge badge-lg badge-default">'.trans('user.status.closed').'</span>';
+                $status_label = '<span class="badge badge-lg badge-default">'.trans('common.status.closed').'</span>';
                 break;
             default:
-                $status_label = '<span class="badge badge-lg badge-default">'.trans('user.unknown').'</span>';
+                $status_label = '<span class="badge badge-lg badge-default">'.trans('common.status.unknown').'</span>';
         }
 
         return $status_label;

+ 2 - 0
config/common.php

@@ -76,6 +76,8 @@ return [
     'language' => [
         'zh_CN' => ['简体中文', 'cn'],
         'en'    => ['English', 'us'],
+        'ko'    => ['한국어', 'kr'],
+        'vi'    => ['Tiếng Việt', 'vn'],
     ],
 
     'currency' => [

+ 1 - 1
config/version.php

@@ -2,5 +2,5 @@
 
 return [
     'name' => 'ProxyPanel',
-    'number' => '2.7.d',
+    'number' => '2.7.e',
 ];

+ 56 - 0
public/assets/css/font.css

@@ -0,0 +1,56 @@
+
+/* roboto-300 */
+@font-face {
+    font-family: 'Roboto';
+    font-style: normal;
+    font-weight: 300;
+    src: url('//lib.baomitu.com/fonts/roboto/roboto-300.eot'); /* IE9 Compat Modes */
+    src: local('Roboto'), local('Roboto-Normal'),
+    url('//lib.baomitu.com/fonts/roboto/roboto-300.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+    url('//lib.baomitu.com/fonts/roboto/roboto-300.woff2') format('woff2'), /* Super Modern Browsers */
+    url('//lib.baomitu.com/fonts/roboto/roboto-300.woff') format('woff'), /* Modern Browsers */
+    url('//lib.baomitu.com/fonts/roboto/roboto-300.ttf') format('truetype'), /* Safari, Android, iOS */
+    url('//lib.baomitu.com/fonts/roboto/roboto-300.svg#Roboto') format('svg'); /* Legacy iOS */
+}
+
+/* roboto-regular */
+@font-face {
+    font-family: 'Roboto';
+    font-style: normal;
+    font-weight: regular;
+    src: url('//lib.baomitu.com/fonts/roboto/roboto-regular.eot'); /* IE9 Compat Modes */
+    src: local('Roboto'), local('Roboto-Normal'),
+    url('//lib.baomitu.com/fonts/roboto/roboto-regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+    url('//lib.baomitu.com/fonts/roboto/roboto-regular.woff2') format('woff2'), /* Super Modern Browsers */
+    url('//lib.baomitu.com/fonts/roboto/roboto-regular.woff') format('woff'), /* Modern Browsers */
+    url('//lib.baomitu.com/fonts/roboto/roboto-regular.ttf') format('truetype'), /* Safari, Android, iOS */
+    url('//lib.baomitu.com/fonts/roboto/roboto-regular.svg#Roboto') format('svg'); /* Legacy iOS */
+}
+
+/* roboto-500 */
+@font-face {
+    font-family: 'Roboto';
+    font-style: normal;
+    font-weight: 500;
+    src: url('//lib.baomitu.com/fonts/roboto/roboto-500.eot'); /* IE9 Compat Modes */
+    src: local('Roboto'), local('Roboto-Normal'),
+    url('//lib.baomitu.com/fonts/roboto/roboto-500.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+    url('//lib.baomitu.com/fonts/roboto/roboto-500.woff2') format('woff2'), /* Super Modern Browsers */
+    url('//lib.baomitu.com/fonts/roboto/roboto-500.woff') format('woff'), /* Modern Browsers */
+    url('//lib.baomitu.com/fonts/roboto/roboto-500.ttf') format('truetype'), /* Safari, Android, iOS */
+    url('//lib.baomitu.com/fonts/roboto/roboto-500.svg#Roboto') format('svg'); /* Legacy iOS */
+}
+
+/* roboto-300italic */
+@font-face {
+    font-family: 'Roboto';
+    font-style: italic;
+    font-weight: 300;
+    src: url('//lib.baomitu.com/fonts/roboto/roboto-300italic.eot'); /* IE9 Compat Modes */
+    src: local('Roboto'), local('Roboto-Italic'),
+    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
+    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.woff2') format('woff2'), /* Super Modern Browsers */
+    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.woff') format('woff'), /* Modern Browsers */
+    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.ttf') format('truetype'), /* Safari, Android, iOS */
+    url('//lib.baomitu.com/fonts/roboto/roboto-300italic.svg#Roboto') format('svg'); /* Legacy iOS */
+}

+ 3 - 1
readme.md

@@ -1,4 +1,6 @@
-# ProxyPanel
+# ProxyPanel 
+[![Crowdin](https://badges.crowdin.net/proxypanel/localized.svg)](https://crowdin.com/project/proxypanel)
+
 [简体中文](https://proxypanel.gitbook.io/wiki/)
 
 Support but not limited to: Shadowsocks,ShadowsocksR,ShadowsocksRR,V2Ray,Trojan,VNET

+ 844 - 0
resources/lang/en/admin.php

@@ -0,0 +1,844 @@
+<?php
+
+return [
+    'dashboard'           => [
+        'users'                   => 'Users',
+        'available_users'         => 'Available Users',
+        'paid_users'              => 'Paying Users',
+        'active_days_users'       => 'Active Users Within :days Days',
+        'inactive_days_users'     => 'Inactive Users Over :days Days',
+        'online_users'            => 'Current Online Users',
+        'expiring_users'          => 'Near-Expiring Users',
+        'overuse_users'           => 'Overusered Users (Traffic consumed ≥ 90%)',
+        'abnormal_users'          => 'Hourly Traffic Abnormal Users',
+        'nodes'                   => 'Nodes',
+        'maintaining_nodes'       => 'Nodes Under Maintenance',
+        'traffic_consumed'        => 'Traffic Consumed',
+        'traffic_days_consumed'   => 'Traffic Consumed Within :days Days',
+        'orders'                  => 'Orders',
+        'online_orders'           => 'Online Orders',
+        'succeed_orders'          => 'Succeed Orders',
+        'credit'                  => 'Credit',
+        'withdrawing_commissions' => 'Withdrawing Commissions',
+        'withdrawn_commissions'   => 'Withdrawn Commissions',
+    ],
+    'action'              => [
+        'edit_item' => 'Edit :attribute',
+        'add_item'  => 'Add :attribute',
+    ],
+    'confirm'             => [
+        'delete'    => [0 => 'Are you sure you want to delete :attribute_envelope', 1 => '】? '],
+        'continues' => 'Are you sure you want to continue? ',
+        'export'    => 'Are you sure you want to export all? ',
+    ],
+    'user_dashboard'      => 'User Dashboard',
+    'menu'                => [
+        'dashboard'        => 'Dashboard',
+        'user'             => [
+            'attribute'  => 'User',
+            'list'       => 'User Management',
+            'oauth'      => 'OAuth',
+            'group'      => 'User Group',
+            'credit_log' => 'Credit Log',
+            'subscribe'  => 'Subscription',
+        ],
+        'rbac'             => [
+            'attribute'  => 'RBAC',
+            'permission' => 'Permissions',
+            'role'       => 'Roles',
+        ],
+        'customer_service' => [
+            'attribute' => 'Chat & Note',
+            'ticket'    => 'Ticket Management',
+            'article'   => 'Article Management',
+            'push'      => 'Push Notification',
+            'mail'      => 'Mass Mailing',
+        ],
+        'node'             => [
+            'attribute' => 'Node',
+            'list'      => 'Node Management',
+            'auth'      => 'Api Authorization',
+            'cert'      => 'Certificate',
+        ],
+        'rule'             => [
+            'attribute' => 'Audit Rule',
+            'list'      => 'Rule Management',
+            'group'     => 'Rule Group',
+            'trigger'   => 'Trigger Log',
+        ],
+        'shop'             => [
+            'attribute' => 'Shop',
+            'goods'     => 'Product Management',
+            'coupon'    => 'Coupon Management',
+            'order'     => 'Orders',
+        ],
+        'promotion'        => [
+            'attribute'   => 'Promotion',
+            'invite'      => 'Invitation Management',
+            'withdraw'    => 'Withdrawal Management',
+            'rebate_flow' => 'Rebate Flow',
+        ],
+        'analysis'         => [
+            'attribute'  => 'Report',
+            'accounting' => 'Accounting',
+            'user_flow'  => 'User Flow',
+        ],
+        'log'              => [
+            'attribute'        => 'Logs',
+            'traffic'          => 'Traffic Usage',
+            'traffic_flow'     => 'Traffic Flow',
+            'service_ban'      => 'Service Ban',
+            'online_logs'      => 'Online Log',
+            'online_monitor'   => 'Online Monitoring',
+            'notify'           => 'Notification Log',
+            'payment_callback' => 'Payment Callback',
+            'system'           => 'System Report',
+        ],
+        'tools'            => [
+            'attribute' => 'Toolbox',
+            'decompile' => 'Decompile',
+            'convert'   => 'Convert',
+            'import'    => 'Import',
+            'analysis'  => 'Analysis',
+        ],
+        'setting'          => [
+            'attribute'    => 'Setting',
+            'email_suffix' => 'Email Suffix Management',
+            'universal'    => 'Universal Setting',
+            'system'       => 'System Setting',
+        ],
+    ],
+    'user'                => [
+        'massive'         => [
+            'text'    => 'Number of User Generated',
+            'button'  => 'Bulk Spawn',
+            'failed'  => 'Bulk generation failed',
+            'succeed' => 'Bulk generated account successfully',
+            'note'    => 'Batch generate users in background',
+        ],
+        'proxy_info'      => 'Configuration information',
+        'traffic_monitor' => 'Traffic Statistics',
+        'online_monitor'  => 'Online Patrols',
+        'reset_traffic'   => 'Reset Data',
+        'user_view'       => 'User View',
+        'connection_test' => 'Web test',
+        'counts'          => 'out of <code>:num</code> accounts',
+        'reset_confirm'   => [0 => 'Are you sure you want to reset the package', 1 => '\'s traffic?'],
+        'info'            => [
+            'account'              => 'Account Information',
+            'proxy'                => 'Proxy Information',
+            'switch'               => 'Switch Identity',
+            'reset_date_hint'      => 'Account traffic next reset date',
+            'expired_date_hint'    => 'Leave empty to be one year by default',
+            'uuid_hint'            => 'Account ID for V2Ray',
+            'recharge_placeholder' => 'Fill in negative values to deduct balance',
+        ],
+        'update_help'     => 'Successfully updated, do you want to return?',
+        'proxies_config'  => ':username connection configuration information',
+        'group'           => [
+            'title'  => 'User Group Control<small>(same node can be assigned to more than one group, One user can only belong to one group; For visible / available nodes: filter by level first, then group)</small>',
+            'name'   => 'Group Name',
+            'counts' => ' out of <code>:num</code> groups',
+        ],
+    ],
+    'zero_unlimited_hint' => 'Unset /0, as unlimited',
+    'node'                => [
+        'traffic_monitor' => 'Traffic Statistics',
+        'refresh_geo'     => 'Refresh geography',
+        'ping'            => 'Detect delay',
+        'connection_test' => 'Connectivity detection',
+        'counts'          => 'out of <code> :num </code> circuits',
+        'reload_all'      => 'Reload Backend',
+        'refresh_geo_all' => 'Refresh all nodes',
+        'reload_confirm'  => 'Are you sure you want to reload the node?',
+        'info'            => [
+            'hint'                  => '<strong>Note:</strong> the automatically generated<code>ID</code>when adding a node is deployed<code>usermysql.json</code>the value of<code>node_id</code>and the<code>nodeId</code>when V2Ray backend is deployed;',
+            'basic'                 => 'Basic Information',
+            'ddns_hint'             => 'Dynamic IP nodes require<a href="https://github.com/NewFuture/DDNS" target="_blank">to configure DDDNS</a>for this type of node, nodes block will be detected by domain name',
+            'domain_placeholder'    => 'Server domain address with priority domain address',
+            'domain_hint'           => 'Enable DNS mode in System Settings. Domain will be automatically bound to IP content below! No longer need to go to the DNS registrant page to modify IP information.',
+            'extend'                => 'Extended Information',
+            'display'               => [
+                'invisible' => 'is completely invisible',
+                'node'      => 'Show only on \':trans\' page',
+                'sub'       => 'Show only',
+                'all'       => 'Fully visible',
+                'hint'      => 'Whether users can subscriber/see this node',
+            ],
+            'ipv4_hint'             => 'Multi-IP uses \',\' partition, example:1.1.1.1, 8.8.8.8',
+            'ipv6_hint'             => 'Multi-IP uses \',\' partition, example:1.1.1.1, 8.8.8.8',
+            'ipv4_placeholder'      => 'Server IPv4 Address',
+            'ipv6_placeholder'      => 'Server IPv6 address, field is visible to user and domain name is invalid',
+            'push_port_hint'        => 'Required and firewall needs to be loaded, otherwise the message will cause an exception',
+            'data_rate_hint'        => 'Example:.1 Checkout 10M with 100M and 500M with 100M',
+            'level_hint'            => 'Level:- No ratings, all visible',
+            'detection'             => [
+                'tcp'  => 'TCP only',
+                'icmp' => 'Detect ICMP only',
+                'all'  => 'Detect All',
+                'hint' => 'Random node block detection every 30-60 minutes',
+            ],
+            'obfs_param_hint'       => 'While obfs is not [plain], fill in parameters to traffic masquerading; &#13;&#10; While obfs is [http_simple], suggest set port to 80; &#13;&#10; While obfs is [tls], suggest set port to 443;',
+            'additional_ports_hint' => 'If enabled, please configure server<span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span>information',
+            'v2_method_hint'        => 'Do not use none when using WebSocket',
+            'v2_net_hint'           => 'Enable TLS when using WebSocket Transfer Protocol',
+            'v2_cover'              => [
+                'none'      => 'No cover',
+                'http'      => 'HTTP data stream',
+                'srtp'      => 'Video call data (SRTP)',
+                'utp'       => 'BT download data (uTP)',
+                'wechat'    => 'Micromessage video call',
+                'dtls'      => 'DTLS1.2 packets',
+                'wireguard' => 'Wire Guard packets',
+            ],
+            'v2_host_hint'          => 'Use WebSocket transfer protocol only for single commas separated from multiple camouflage types',
+            'v2_tls_provider_hint'  => 'Different backend configurations are different:',
+            'single_hint'           => 'Recommended 80 or 443. The server needs to configure <br> strict mode:user\'s port cannot be connected, only via the following specified port(<a href="javascript:showPortsOnlyConfig();">how to configure</a>)',
+        ],
+        'proxy_info'      => '*Compatibility SS',
+        'proxy_info_hint' => 'If compatible, please add<span class="red-700">_compatible</span> to server configuration protocol and confuse',
+        'reload'          => 'Reload Backend',
+        'auth'            => [
+            'title'          => 'Node authorization list<small>WEBAPI</small>',
+            'deploy'         => [
+                'title'          => 'Deployment :type_label backend',
+                'attribute'      => 'Deployment Backend',
+                'command'        => 'Operations command',
+                'update'         => 'Update:',
+                'uninstall'      => 'Uninstall:',
+                'start'          => 'Launch:',
+                'stop'           => 'Stop:',
+                'status'         => 'Status:',
+                'recent_logs'    => 'Recent Log:',
+                'real_time_logs' => 'Live Log:',
+                'restart'        => 'Restart:',
+                'same'           => 'Id.',
+                'trojan_hint'    => 'Please input <a href=":url" target="_blank">nodes\' domain</a>, then resolve IP to this the domain',
+            ],
+            'reset_auth'     => 'Reset key',
+            'counts'         => 'of <code>:num</code> Licenses',
+            'generating_all' => 'Are you sure you want to generate authorization for all nodes?',
+        ],
+        'cert'            => [
+            'title'           => 'Domain certificate list<small>(disguised domain name of V2Ray nodes)</small>',
+            'counts'          => 'out of <code>:num</code> domain name certificates',
+            'key_placeholder' => 'The KEY value of the domain certificate. Allowed to be empty, VNET-V2Ray backend support auto-signing certificate',
+            'pem_placeholder' => 'The PEM value of the domain certificate. Allowed to be empty, VNET-V2Ray backend support auto-signing certificate',
+        ],
+    ],
+    'hint'                => 'Prompt',
+    'oauth'               => [
+        'title'  => 'User OAuth Authorization',
+        'counts' => 'out of <code>:num</code> licenses',
+    ],
+    'select_all'          => 'Full selection',
+    'clear'               => 'Empty',
+    'unselected_hint'     => 'To assign rules, search here',
+    'selected_hint'       => 'The rules have been assigned, you can search here',
+    'clone'               => 'Clone',
+    'monitor'             => [
+        'daily_chart'   => 'Daily traffic chart',
+        'monthly_chart' => 'Monthly traffic chart',
+        'node'          => 'Node traffic',
+        'user'          => 'User traffic',
+        'hint'          => '<strong>Hint:</strong> If no statistics are available, please check if the scheduled task is correct.',
+    ],
+    'tools'               => [
+        'analysis'  => [
+            'title'      => 'SSR log analysis<small>for single nodes only</small>',
+            'req_url'    => 'Recently requested address',
+            'not_enough' => 'No more than 15,000 accesses and cannot analyze data',
+        ],
+        'convert'   => [
+            'title'               => 'Format transformation <small>Shadowsocks turn ShadowsocksR</small>',
+            'content_placeholder' => 'Please fill in the configuration information to convert',
+        ],
+        'decompile' => [
+            'title'               => 'Reparse<small>config transformation</small>',
+            'attribute'           => 'Invert parsing',
+            'content_placeholder' => 'Please fill in the ShadowsocksR link to parse',
+        ],
+    ],
+    'ticket'              => [
+        'title'         => 'Ticket list',
+        'counts'        => 'out of <code>:num</code>',
+        'send_to'       => 'Please fill in the target user information!',
+        'user_info'     => 'User Information',
+        'inviter_info'  => 'Invitation Information',
+        'close_confirm' => 'Are you sure you want to close the ticket?',
+        'error'         => 'Unknown error! Please see the running log',
+    ],
+    'logs'                => [
+        'subscribe'              => 'Subscription List',
+        'counts'                 => 'of <code>:num</code> records',
+        'rule'                   => [
+            'clear_all'     => 'Clear records',
+            'title'         => 'Trigger record',
+            'name'          => 'Trigger Rule',
+            'reason'        => 'Trigger reason',
+            'created_at'    => 'Trigger Time',
+            'tag'           => '✅ access non-rule allowed',
+            'clear_confirm' => 'Are you sure you want to clear all records?',
+        ],
+        'order'                  => [
+            'title'      => 'Order List',
+            'is_expired' => 'Expiry',
+            'is_coupon'  => 'Use coupons',
+        ],
+        'user_traffic'           => [
+            'title'       => 'Data usage',
+            'choose_node' => 'Select Node',
+        ],
+        'user_data_modify_title' => 'Traffic Changes',
+        'callback'               => 'Callback log <small>(online payment)</small>',
+        'notification'           => 'Mail delivery record',
+        'ip_monitor'             => 'Live data for <small>2 minutes of online IP monitoring</small>',
+        'user_ip'                => [
+            'title'   => 'User online IP list <small>last 10 minutes</small>',
+            'connect' => 'Connect IP',
+        ],
+        'ban'                    => [
+            'title'           => 'User Blocked Records',
+            'time'            => 'Duration',
+            'reason'          => 'Rationale',
+            'ban_time'        => 'Banned Time',
+            'last_connect_at' => 'Last connection time',
+        ],
+        'credit_title'           => 'Changes in balances',
+    ],
+    'start_time'          => 'Start range',
+    'end_time'            => 'End range',
+    'goods'               => [
+        'title'         => 'Product List',
+        'type'          => [
+            'top_up'  => 'Pay',
+            'package' => 'Data Pack',
+            'plan'    => 'Pack',
+        ],
+        'info'          => [
+            'type_hint'           => 'The package is related to the period of validity of the account, the traffic pack is only available and does not affect the validity period',
+            'period_hint'         => 'Package traffic reset every N day',
+            'limit_num_hint'      => 'This product can be purchased per user for 0 times',
+            'available_date_hint' => 'Automatically deduct traffic from total traffic when due',
+            'desc_placeholder'    => 'Simple description of products',
+            'list_placeholder'    => 'Add custom list of products',
+            'list_hint'           => 'Please start with<code>&lt;li&gt;</code> each line of content<code>&lt;/li&gt;</code>',
+        ],
+        'status'        => [
+            'yes' => 'Listing',
+            'no'  => 'Next shelf',
+        ],
+        'sell_and_used' => 'Use / Sale',
+        'counts'        => 'out of <code>:num</code> products',
+    ],
+    'sort_asc'            => 'Sort value higher',
+    'yes'                 => 'Yes',
+    'no'                  => 'No',
+    'rule'                => [
+        'type'   => [
+            'reg'      => 'Regular expression',
+            'domain'   => 'Domain Name',
+            'ip'       => 'IP',
+            'protocol' => 'Protocol',
+        ],
+        'counts' => 'out of <code>:num</code> audit rules',
+        'title'  => 'Rule List',
+        'group'  => [
+            'type'   => [
+                'off' => 'Snack',
+                'on'  => 'Release',
+            ],
+            'title'  => 'Rule Group',
+            'counts' => 'out of <code>:num</code> groups',
+        ],
+    ],
+    'role'                => [
+        'name_hint'        => 'Unique identifier, eg::Administrator',
+        'description_hint' => 'dashboard.eg::admin',
+        'title'            => 'List of permissions',
+        'permissions_all'  => 'All permissions',
+        'counts'           => 'out of <code>:num</code> permissions role',
+    ],
+    'report'              => [
+        'monthly_accounting'  => 'Monthly Waterbook',
+        'annually_accounting' => 'Annual Watershed Book',
+        'historic_accounting' => 'Historical Watershed Book',
+        'current_month'       => ' This month ',
+        'last_month'          => ' Last Month',
+        'current_year'        => ' current year ',
+        'last_year'           => ' Go to year ',
+        'hourly_traffic'      => 'traffic per hour',
+        'daily_traffic'       => 'Daily traffic',
+        'today'               => ' Japan ',
+    ],
+    'permission'          => [
+        'title'            => 'Permissions Actions List',
+        'description_hint' => 'Fill in description, example:[System Edit A]',
+        'name_hint'        => 'Fill in the route name, example:admin.permission.create,update',
+        'counts'           => 'out of <code>:num</code> permission behavior',
+    ],
+    'marketing'           => [
+        'email'         => [
+            'title'      => 'Mailing List',
+            'group_send' => 'Mass Mail',
+            'counts'     => 'out of <code>:num</code> messages',
+        ],
+        'send_status'   => 'Send Status',
+        'send_time'     => 'Sent Time',
+        'error_message' => 'Error message',
+        'push'          => [
+            'title'  => 'Push Message List',
+            'send'   => 'Push Message',
+            'counts' => 'out of <code>:num</code> push messages',
+        ],
+    ],
+    'creating'            => 'Adding...',
+    'article'             => [
+        'type'          => [
+            'knowledge'    => 'Articles',
+            'announcement' => 'Announcement',
+        ],
+        'category_hint' => 'The same category will be grouped under the same folder',
+        'logo_hint'     => 'Recommended size:100x75',
+        'title'         => 'Article List',
+        'counts'        => 'out of <code>:num</code> articles',
+    ],
+    'coupon'              => [
+        'title'                   => 'Card List',
+        'name_hint'               => 'Will be used for frontend display',
+        'sn_hint'                 => 'The coupon is provided to users using the coupon. Leave empty to be 8 bit random code',
+        'type'                    => [
+            'voucher'  => 'Voucher',
+            'discount' => 'Discount voucher',
+            'charge'   => 'Voucher',
+        ],
+        'type_hint'               => 'Redemption: deduct the amount of the product; Discount: discount the percentage of the product; Recharge: add the amount to the user balance',
+        'value'                   => '{1} :havy_minus_sign: :num|{2} :num disc{3} ➕ :num',
+        'value_hint'              => 'Range 1% ~99% ',
+        'priority_hint'           => 'With the coupon code, the eligible high weight code will be used preferentially. Up to 255',
+        'minimum_hint'            => 'This coupon can only be used when the amount of payment exceeds <strong>:num</strong>;',
+        'used_hint'               => 'This voucher can be used by eligible users <strong>:num</strong> times;',
+        'levels_hint'             => 'This voucher will only be used if the user level is in the selected rank.',
+        'groups_hint'             => 'Group of selected users to use this voucher',
+        'users_placeholder'       => 'Enter user ID to go back to car',
+        'user_whitelist_hint'     => 'This coupon is available to all users involved and leave this condition empty for no use',
+        'users_blacklist_hint'    => 'This coupon is not available for all users. Empty is not used',
+        'services_placeholder'    => 'Enter product ID, go back to car',
+        'services_whitelist_hint' => 'The product is available to use the voucher, leave empty for this condition',
+        'services_blacklist_hint' => 'The coupon is not available for the product. Leave empty for this condition',
+        'newbie'                  => [
+            'first_discount' => 'Initial appointment of any vouchers',
+            'first_order'    => 'First ticket',
+            'created_days'   => 'Creator',
+        ],
+        'created_days_hint'       => 'and <code>:day</code> days',
+        'limit_hint'              => 'The conditions for this item are <strong>and</strong> related, please use your own mix',
+        'info_title'              => 'Card Info',
+        'counts'                  => 'out of <code>:num</code> coupons',
+        'discount'                => 'Discount',
+        'export_title'            => 'Card Export',
+        'single_use'              => 'One-time',
+    ],
+    'times'               => 'Times',
+    'massive_export'      => 'Bulk Export',
+    'system_generate'     => 'System generation',
+    'aff'                 => [
+        'rebate_title'      => 'Return flow records',
+        'counts'            => 'out of <code>:num</code> applications',
+        'title'             => 'List of cash out applications',
+        'apply_counts'      => 'out of <code>:num</code> applications',
+        'referral'          => 'Promotion of return',
+        'commission_title'  => 'Cash out request details',
+        'commission_counts' => 'This application involves <code>:num</code>',
+    ],
+    'setting'             => [
+        'common'        => [
+            'title'         => 'General Configuration',
+            'set_default'   => 'Set as default',
+            'connect_nodes' => 'Linked Nodes',
+        ],
+        'email'         => [
+            'title'            => 'Email filter list <small>(used to block registration email suffixes)</small>',
+            'tail'             => 'Email Suffix',
+            'rule'             => 'Rules',
+            'black'            => 'Blacklist',
+            'white'            => 'Whitelist',
+            'tail_placeholder' => 'Please fill in the email suffix',
+        ],
+        'system'        => [
+            'title'     => 'System Configuration',
+            'web'       => 'Website General',
+            'account'   => 'Account Settings',
+            'node'      => 'Node Settings',
+            'extend'    => 'Expansion',
+            'check_in'  => 'Sign To System',
+            'promotion' => 'Extension system',
+            'notify'    => 'Notification System',
+            'auto_job'  => 'Auto Task',
+            'other'     => 'LOGO|Support | Statistics',
+            'payment'   => 'Payment system',
+            'menu'      => 'Menu',
+        ],
+        'no_permission' => 'You do not have permission to modify parameters!',
+    ],
+    'system'              => [
+        'account_expire_notification'   => 'Account Expired Notifications',
+        'active_times'                  => 'Number of active accounts',
+        'admin_invite_days'             => 'Admin - Invitation Code Expiration',
+        'aff_salt'                      => 'Invite Link User Information Characterization',
+        'alipay_qrcode'                 => 'PayPal QR',
+        'AppStore_id'                   => 'Apple Account',
+        'AppStore_password'             => 'Apple Password',
+        'auto_release_port'             => 'Port recovery mechanisms',
+        'bark_key'                      => 'Bark Device Number',
+        'bitpay_secret',
+        'captcha_key'                   => 'Captcha Key',
+        'captcha_secret'                => 'Captcha Secret/ID',
+        'codepay_id'                    => 'Code Payment ID',
+        'codepay_key'                   => 'Communication Key',
+        'codepay_url'                   => 'Request URL',
+        'data_anomaly_notification'     => 'Data exception notification',
+        'data_exhaust_notification'     => 'Data Expiration Notification',
+        'ddns_key'                      => 'DNS Server Key',
+        'ddns_mode'                     => 'DDNS mode',
+        'ddns_secret'                   => 'DNS Server Secret',
+        'default_days'                  => 'Initial expiration',
+        'default_traffic'               => 'Initial traffic',
+        'detection_check_times'         => 'Block detection alerts',
+        'dingTalk_access_token'         => 'Pin Custom Robot Access Token',
+        'dingTalk_secret'               => 'Studded custom robot key',
+        'epay_key'                      => 'Merchant Key',
+        'epay_mch_id'                   => 'Merchant ID',
+        'epay_url'                      => 'Interface Address',
+        'expire_days'                   => 'Expired warning threshold',
+        'f2fpay_app_id'                 => 'Application ID',
+        'f2fpay_private_key'            => 'Apply private key',
+        'f2fpay_public_key'             => 'PayPal Public Key',
+        'forbid_mode'                   => 'Disable access mode',
+        'invite_num'                    => 'Number of invitations to generate',
+        'is_activate_account'           => 'Activate Account',
+        'is_AliPay'                     => 'PayPal Payment',
+        'is_ban_status'                 => 'Expire auto-ban',
+        'is_captcha'                    => 'Verification Code Mode',
+        'is_checkin'                    => 'Checking to plus traffic',
+        'is_clear_log'                  => 'Auto-clear log',
+        'is_custom_subscribe'           => 'Premium Subscription',
+        'is_email_filtering'            => 'Email filtering mechanism',
+        'is_forbid_robot'               => 'Block robot access',
+        'is_free_code'                  => 'Free invitation code',
+        'is_invite_register'            => 'Invite to Register',
+        'is_otherPay'                   => 'Special Payment',
+        'is_push_bear',
+        'is_QQPay'                      => 'QQ Wallet',
+        'is_rand_port'                  => 'Random Port',
+        'is_register'                   => 'User Registration',
+        'is_subscribe_ban'              => 'Subscription exception auto-ban',
+        'is_traffic_ban'                => 'Exception auto-seal number',
+        'is_WeChatPay'                  => 'Micromessage payment',
+        'iYuu_token'                    => 'IYUU Token',
+        'maintenance_content'           => 'Maintain Description',
+        'maintenance_mode'              => 'Maintenance mode',
+        'maintenance_time'              => 'Maintenance End Time',
+        'max_port',
+        'max_rand_traffic',
+        'min_port'                      => 'Port range',
+        'min_rand_traffic'              => 'Data range',
+        'node_blocked_notification'     => 'Node block alarm',
+        'node_daily_notification'       => 'Node Usage Report',
+        'node_offline_notification'     => 'Node Offline Reminder',
+        'oauth_path'                    => 'Third Party Login Platform',
+        'offline_check_times'           => 'Number of reminders offline',
+        'password_reset_notification'   => 'Reset Password',
+        'paybeaver_app_id'              => 'App ID',
+        'paybeaver_app_secret'          => 'App Secret',
+        'payjs_key'                     => 'Communication Key',
+        'payjs_mch_id'                  => 'Merchant Number',
+        'payment_confirm_notification'  => 'Manual Payment Confirmation Notification',
+        'payment_received_notification' => 'Payment successful',
+        'paypal_app_id'                 => 'Application ID',
+        'paypal_certificate'            => 'Certificates',
+        'paypal_password'               => 'API Password',
+        'paypal_secret'                 => 'Signature',
+        'paypal_username'               => 'API Username',
+        'pushDeer_key'                  => 'PushDeer Key',
+        'pushplus_token'                => 'PushPlus Token',
+        'rand_subscribe'                => 'Random Subscription',
+        'redirect_url'                  => 'Redirect Address',
+        'referral_money'                => 'Cash out Limit',
+        'referral_percent'              => 'Return Ratio',
+        'referral_status'               => 'Promotion features',
+        'referral_traffic'              => 'Register traffic',
+        'referral_type'                 => 'Return Mode',
+        'register_ip_limit'             => 'Registration limit with IP',
+        'reset_password_times'          => 'Reset Password Count',
+        'reset_traffic'                 => 'Data reset automatically',
+        'server_chan_key'               => 'ServerChan SCKEY',
+        'standard_currency'             => 'Current currency',
+        'stripe_public_key'             => 'Public Key',
+        'stripe_secret_key'             => 'Secret Key',
+        'stripe_signing_secret'         => 'WebHook Signing secret',
+        'subject_name'                  => 'Custom Product Name',
+        'subscribe_ban_times'           => 'Subscription request threshold
+',
+        'subscribe_domain'              => 'Node Subscription Address',
+        'subscribe_max'                 => 'Subscribe to Nodes',
+        'telegram_token'                => 'Telegram Token',
+        'tg_chat_token'                 => 'TG Jam Token',
+        'theadpay_key'                  => 'Merchant Key',
+        'theadpay_mchid'                => 'Merchant ID',
+        'theadpay_url'                  => 'Interface Address',
+        'ticket_closed_notification'    => 'Ticket close notification',
+        'ticket_created_notification'   => 'New Ticket Notification',
+        'ticket_replied_notification'   => 'Ticket Reply Notification',
+        'traffic_ban_time'              => 'Envelope duration',
+        'traffic_ban_value'             => 'Data abnormal threshold',
+        'traffic_limit_time'            => 'Time interval',
+        'traffic_warning_percent'       => 'Traffic warning threshold',
+        'trojan_license'                => 'Trojan Authorization',
+        'username_type'                 => 'Account Type',
+        'user_invite_days'              => 'User-Invitation Code Expiration',
+        'v2ray_license'                 => 'V2Ray Authorize',
+        'v2ray_tls_provider'            => 'V2Ray TLS Configuration',
+        'webmaster_email'               => 'Admin Email',
+        'website_analytics'             => 'Statistics Code',
+        'website_callback_url'          => 'General Payment Callback Address',
+        'website_customer_service'      => 'Support Code',
+        'website_home_logo'             => 'Homepage logo',
+        'website_logo'                  => 'Logo',
+        'website_name'                  => 'Site Name',
+        'website_security_code'         => 'Site Security Code',
+        'website_url'                   => 'Site address',
+        'web_api_url'                   => 'Authorization/Backend Access Domain',
+        'wechat_aid'                    => 'Microcredit Enterprise Application ID',
+        'wechat_cid'                    => 'Microcredit Company ID',
+        'wechat_encodingAESKey'         => 'Microcredit Enterprise Application EncodingAESKey',
+        'wechat_qrcode'                 => 'Min QR Code',
+        'wechat_secret'                 => 'Microcredit Enterprise Application Key',
+        'wechat_token'                  => 'Microcredit Application TOKEN',
+
+        'hint'           => [
+            'account_expire_notification'   => 'Notify users about to expire',
+            'active_times'                  => 'Number of accounts that can be activated by email within 24 hours',
+            'admin_invite_days'             => 'Expiration of administrator-generated invitation code',
+            'aff_salt'                      => 'When left blank, the invite link will show the user ID; enter any English/number to encrypt the user link ID',
+            'alipa_qrcode',
+            'AppStore_id'                   => 'Apple account used in iOS settings tutorials',
+            'AppStore_password'             => 'Apple password used in iOS settings tutorials',
+            'auto_release_port'             => 'Banned/Expires <code>'.config('tasks.release_port').'The port of the </code> day account is automatically released',
+            'bark_key'                      => 'Push messages to iOS device. Requires an app called Bark to be installed on iOS device, a long string of URLs from the site. Enable Bark. Make sure to fill in this value',
+            'bitpay_secret',
+            'captcha_key'                   => 'Browse<a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">Setup Guide</a>to set up',
+            'captcha_secret',
+            'codepay_id',
+            'codepay_key',
+            'codepay_url',
+            'data_anomaly_notification'     => 'Inner traffic exceeding abnormal threshold notification overtube',
+            'data_exhaust_notification'     => 'Notify users that traffic will be exhausted',
+            'ddns_key'                      => "Browse<a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>Setup Guide</a>to set up",
+            'ddns_mode'                     => 'Automatically update content to DNS Provider when adding/editing/deleting node\'s domain name, ipv4, ipv6',
+            'ddns_secret',
+            'default_days'                  => 'Default account validity period when user is registered, 0 is due that day',
+            'default_traffic'               => 'Default traffic available when registering users',
+            'detection_check_times'         => 'Automatically disconnect nodes after N and no limit for 0/empty and no more than 12',
+            'dingTalk_access_token'         => 'Ready to read the<a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>nailing manual</a>to review steps',
+            'dingTalk_secret'               => 'Optional! Enabling robot[加签]is required!',
+            'epa_key',
+            'epa_mch_id',
+            'epa_url',
+            'expire_days'                   => '[Account Expiry Notice] Start Thresholder, Daily Notifications',
+            'f2fpay_app_id'                 => 'Use:APPID',
+            'f2fpay_private_key'            => 'Application key generated when generated',
+            'f2fpay_public_key'             => 'Note that the public key is not applied!',
+            'forbid_mode'                   => 'Block the corresponding area by IP, non-block access',
+            'invite_num'                    => 'Number of invitations that users can generate',
+            'is_activate_account'           => 'When enabled, users need email to activate their account',
+            'is_AliPay',
+            'is_ban_status'                 => '(prudent) Blocking the entire account will reset all data on the account and prevent users from logging in, and disable user agent only on status',
+            'is_captcha'                    => 'Authentication code is required for login/registration after enabled.',
+            'is_checkin'                    => 'When logging in, traffic will be randomly obtained according to traffic range',
+            'is_clear_log'                  => 'Auto-clear unused logs when enabled (recommended)',
+            'is_custom_subscribe'           => 'When enabled, the top of the subscription information will show the expiration time, the amount of traffic left (only individual clients are supported)',
+            'is_email_filtering'            => 'Blacklist: Users can register with emails other than any blacklist; whitelist: Users can only choose to register using whitelisted email suffixes',
+            'is_forbid_robot'               => '404 errors if you are robot, creep, and proxy access to the website',
+            'is_free_code'                  => 'Free invite code is not visible after closing',
+            'is_invite_register',
+            'is_otherPay',
+            'is_push_bear',
+            'is_QQPay',
+            'is_rand_port'                  => 'Random port when registering, adding user',
+            'is_register'                   => 'Cannot register after closing',
+            'is_subscribe_ban'              => 'Automatically block user subscription requests beyond the set threshold when enabled',
+            'is_traffic_ban'                => 'Auto-envelope number after 1 hour traffic above the abnormal threshold (disable proxy only)',
+            'is_WeChatPay',
+            'iYuu_token'                    => 'Enables flying. Make sure to fill in this value (<a href=http://iyuu.cn target=_blank>to apply for IYUU tok</a>)',
+            'maintenance_content'           => 'Custom maintenance information',
+            'maintenance_mode'              => "When enabled, user access migration to maintenance interface | Admin login using <a href='javascript:(0)'>:url</a>",
+            'maintenance_time'              => 'Used to maintain interface countdown',
+            'max_port',
+            'max_rand_traffic',
+            'min_port'                      => 'Port range:1000 - 65535',
+            'min_rand_traffic',
+            'node_blocked_notification'     => 'Hourly check if the node is blocked and alerts the administrator',
+            'node_daily_notification'       => 'Report consumption yesterday by node traffic',
+            'node_offline_notification'     => 'Detect node offline every 10 minutes and remind administrator',
+            'oauth_path'                    => 'Please add settings in .ENV to open the platform here',
+            'offline_check_times'           => 'Don\'t remind again within 24 hours',
+            'password_reset_notification'   => 'When enabled users can reset their password',
+            'paybeaver_app_id'              => '<a href="https://merchant.paybeaver.com/" target="_blank">Merchant Center</a> -> Developer -> App ID',
+            'paybeaver_app_secret'          => '<a href="https://merchant.paybeaver.com/" target="_blank">Merchant Center</a> -> Developer -> App Secret',
+            'payjs_key',
+            'payjs_mch_id'                  => 'Get information on<a href="https://payjs.cn/dashboard/member" target="_blank">interface</a>',
+            'payment_confirm_notification'  => 'User notifies the administrator of the order after manual payment',
+            'payment_received_notification' => 'Notify user order status after payment of order',
+            'paypal_app_id',
+            'paypal_certificate',
+            'paypal_password',
+            'paypal_secret',
+            'paypal_username',
+            'pushDeer_key'                  => 'Enable PushDeer, make sure to enter this value (<a href=http://www.pushdeer.com/official.html
+                                    target=_blank>to apply for Push Key</a>)',
+            'pushplus_token'                => 'Enable PushPlus, make sure to enter this value (<a href=https://www.pushplus.plus/push1.html target=_blank>to apply Token</a>)',
+            'rand_subscribe'                => 'When enabled, you will return the node information randomly, otherwise you will return it in order of the node',
+            'redirect_url'                  => 'Access request was blocked and redirected to the address when triggering the audit rule',
+            'referral_money'                => 'How many dollars to apply for cashout',
+            'referral_percent'              => 'Percentage of shares per consumer promoter per account registered by promotion link',
+            'referral_status'               => 'User is not visible after shutdown but does not affect normal invitation return',
+            'referral_traffic'              => 'Send traffic by extension link, invitation code registration',
+            'referral_type'                 => 'Old data will remain unchanged after switching mode and new returns will be calculated in new mode',
+            'register_ip_limit'             => 'Number of registrations allowed with IP within 24 hours, no limit for 0/empty',
+            'reset_password_times'          => 'Number of times you can reset your password by email within 24 hours',
+            'reset_traffic'                 => 'Users will automatically reset available traffic according to their purchase date',
+            'server_chan_key'               => "Enable ServerChan, please enter this value (<a href=https://sc.ftqq.com target=_blank>to apply SCKEY</a>)",
+            'standard_currency'             => 'Default currency for the money section of the site',
+            'stripe_public_key',
+            'stripe_secret_key',
+            'stripe_signing_secret',
+            'subject_name'                  => 'Display product title for payment channel',
+            'subscribe_ban_times'           => 'Subscription link request limit within 24 hours',
+            'subscribe_domain'              => '(recommended) To prevent DNS poisoning of DNS domains from being subscribed properly by http:// or https://"',
+            'subscribe_max'                 => 'Get several nodes on client subscription, return all nodes on 0/empty',
+            'telegram_token'                => 'Find <a href=https://t.me/BotFather target=_blank>@Bother</a> to apply for robots to get TOKEN',
+            'tg_chat_token'                 => 'Enable TG jamma. Make sure to enter this value (<a href=https://t.me/realtgchat_bot target=_blank>to apply token</a>)',
+            'theadpay_key',
+            'theadpay_mchid',
+            'theadpay_url',
+            'ticket_closed_notification'    => 'Notify user about ticket shutdown',
+            'ticket_created_notification'   => 'New ticket notification manager/user depending on who created the new ticket',
+            'ticket_replied_notification'   => 'Ticket reply notification each other',
+            'traffic_ban_time'              => 'Trigger traffic abnormalities cause users to be banned for long periods of time and automatically unblock when they expire',
+            'traffic_ban_value'             => 'This value exceeds in 1 hour, triggering auto-seal',
+            'traffic_limit_time'            => 'How long to sign again',
+            'traffic_warning_percent'       => '[Notification Duration of traffic threshold] to notify users daily',
+            'control_license',
+            'username_type'                 => 'Specify the type of site user account, default to email',
+            'user_invite_days'              => 'Expiration of user self-generated invitations',
+            'v2ray_license',
+            'v2ray_tls_provider'            => 'Use backend autoissue/load TLS certificate (node\'s settings value is higher than here)',
+            'webmaster_email'               => 'An administrator email will be provided for contact information when an error is prompted',
+            'website_analytics'             => 'Stats JS',
+            'website_callback_url'          => 'Prevent payment from being backsliding due to a DNS poisoning of a website domain, with http://',
+            'website_customer_service'      => 'Support JS',
+            'website_home_logo',
+            'website_logo',
+            'website_name'                  => 'Show On Mail',
+            'website_security_code'         => 'You must add a security code to the<a href=":url" target="_blank">security entry</a>when not empty',
+            'website_url'                   => 'Generate password reset and pay online',
+            'web_api_url'                   => 'Example:https://demo.proxypanel.cf',
+            'wechat_aid'                    => 'Create an app in<a href=https://work.weixin.qq.com/wework_admin/frame#apps arget=_blank>app management</a>- AgentId',
+            'wechat_cid'                    => 'Get the enterprise ID in<a href=https://work.weixin.qq.com/wework_admin/frame#profile target=_blank>my enterprise</a>',
+            'wechat_encodingAESKey'         => 'App Management -> Application -> Set API Receive -> EncodingAESKey',
+            'wechat_qrcode',
+            'wechat_secret'                 => 'App Secretariats (may need to download company micromessages to view)',
+            'wechat_token'                  => 'App Management -> Application -> Set API Receive -> TOKEN, URL Settings::url',
+        ],
+        'placeholder'    => [
+            'default_url'           => 'Defaulting :url',
+            'server_chan_key'       => 'Enter ServerChan\'s SCKEY->Click again to update',
+            'pushDeer_key'          => 'Fill Push Key -> Click on Update',
+            'iYuu_token'            => 'Fill IYUU Token -> Fly in Love',
+            'bark_key'              => 'Enter the device number in Bark -> Click to Update',
+            'telegram_token'        => 'Enter Telegram Token -> Click Update',
+            'pushplus_token'        => 'Please go to ServerChan application',
+            'dingTalk_access_token' => 'Customize access_token in robot WebHook',
+            'dingTalk_secret'       => 'Customize the key that will appear after robot is signed',
+            'wechat_aid'            => 'Applied AgentId',
+            'wechat_cid'            => 'Enter the MicroMessage Business ID -> Click to Update',
+            'wechat_secret'         => 'App Secret',
+            'tg_chat_token'         => 'Please go to Telegram application',
+            'codepay_url'           => 'https://codepay.fatq.com/create_order/?',
+        ],
+        'payment'        => [
+            'attribute' => 'Payment Settings',
+            'channel'   => [
+                'alipay'    => 'PayPal F2F',
+                'codepay'   => 'Code Payment',
+                'epay'      => 'Pay easily',
+                'payjs'     => 'PayJs',
+                'paypal'    => 'PayPal',
+                'stripe'    => 'Stripe',
+                'paybeaver' => 'Beaver Payment',
+                'theadpay'  => 'Horizontal payments',
+                'manual'    => 'Manual payment',
+            ],
+            'hint'      => [
+                'alipay'    => 'This feature requires<a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">ant gold for open platform</a>to apply for permissions and apps',
+                'codepay'   => '<a href="https://codepay.fateqq.com/i/377289" target="_blank">Apply Codepay Account</a>',
+                'payjs'     => 'Please apply to<a href="https://payjs.cn/ref/zgxjnb" target="_blank">PayJs</a>',
+                'paypal'    => 'Sign in with merchant account<a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">API credentials application page</a>agree and get settings information',
+                'paybeaver' => '<a href="https://merchant.paybeaver.com/?aff_code=iK4GNuX8" target="_blank">Apply PayBeaver Account</a>',
+                'theadpay'  => 'Please pay THeadPay</a>for your account at<a href="https://theadpay.com/" target="_blank">',
+                'manual'    => 'Display will be automatically enabled after setting',
+            ],
+        ],
+        'notification'   => [
+            'channel' => [
+                'telegram'   => 'TG telex',
+                'wechat'     => 'Microcredit Enterprise',
+                'dingtalk'   => 'Pin',
+                'email'      => 'Email',
+                'bark'       => 'Bark',
+                'serverchan' => 'ServerChan',
+                'pushdeer'   => 'PushDeer',
+                'pushplus'   => 'PushPlus',
+                'iyuu'       => 'Love Fly',
+                'tg_chat'    => 'TG sauce',
+                'site'       => 'Inside Notifications',
+            ],
+        ],
+        'forbid'         => [
+            'mainland' => 'Block Continent',
+            'china'    => 'Block China',
+            'oversea'  => 'Blocking Outcomers',
+        ],
+        'username'       => [
+            'email'  => 'Email',
+            'mobile' => 'Phone number',
+            'any'    => 'Any Username',
+        ],
+        'active_account' => [
+            'before' => 'Activate before registration',
+            'after'  => 'Activate after registration',
+        ],
+        'ddns'           => [
+            'namesilo'   => 'Namesilo',
+            'aliyun'     => 'Aliyun (International&domestic)',
+            'dnspod'     => 'DNSPod',
+            'cloudflare' => 'CloudFlare',
+        ],
+        'captcha'        => [
+            'standard'  => 'Normal Code',
+            'geetest'   => 'Positive aspects',
+            'recaptcha' => 'Google ReCaptcha',
+            'hcaptcha'  => 'hCaptcha',
+        ],
+        'referral'       => [
+            'once' => 'First acquisition return',
+            'loop' => 'Loop Return',
+        ],
+    ],
+    'set_to'              => 'The :attribute',
+    'minute'              => 'minutes',
+    'query'               => 'Question',
+    'optional'            => 'Optional',
+    'require'             => 'Required',
+];

+ 2 - 8
resources/lang/en/auth.php

@@ -20,10 +20,7 @@ return [
         'sent'      => 'Email has been sent! Please check your mailbox! (Email may be in the Trash)',
     ],
     'email'           => [
-        'error' => [
-            'banned'  => 'Your email service provider was banned by our platform. Please use another valid email',
-            'invalid' => 'Your email service provider is not in our supporting list. Please use another email',
-        ],
+        'error' => ['banned' => 'Your email service provider was banned by our platform. Please use another valid email', 'invalid' => 'Your email service provider is not in our supporting list. Please use another email'],
     ],
     'error'           => [
         'account_baned'  => 'Your account has been banned!',
@@ -76,10 +73,7 @@ return [
     'register'        => [
         'attribute' => 'Sign up',
         'code'      => 'Registration Code',
-        'error'     => [
-            'disable'  => 'Sorry, The registration function has been disabled',
-            'throttle' => 'Anti-bots shield is active! Please do not send multiple register from at short amount of times!',
-        ],
+        'error'     => ['disable' => 'Sorry, The registration function has been disabled', 'throttle' => 'Anti-bots shield is active! Please do not send multiple register from at short amount of times!'],
         'promotion' => 'Still no account? Please go to ',
         'failed'    => 'Registration failed, please try later',
         'success'   => 'Registration successfully',

+ 115 - 57
resources/lang/en/common.php

@@ -1,61 +1,63 @@
 <?php
 
 return [
-    'account'        => 'Account',
-    'available_date' => 'Available Until/Period',
-    'created_at'     => 'Created At',
-    'expired_at'     => 'Expired At',
-    'updated_at'     => 'Updated At',
-    'back'           => 'Back',
-    'cancel'         => 'Cancel',
-    'close'          => 'Close',
-    'close_item'     => 'Close :attribute',
-    'confirm'        => 'Confirm',
-    'continues'      => 'Continues',
-    'open'           => 'Open',
-    'send'           => 'Send',
-    'view'           => 'View',
-    'reset'          => 'Rest',
-    'copy'           => [
+    'account'         => 'Account',
+    'available_date'  => 'Available Until/Period',
+    'created_at'      => 'Created At',
+    'expired_at'      => 'Expired At',
+    'updated_at'      => 'Updated At',
+    'latest_at'       => 'Latest At',
+    'back'            => 'Back',
+    'cancel'          => 'Cancel',
+    'close'           => 'Close',
+    'close_item'      => 'Close :attribute',
+    'confirm'         => 'Confirm',
+    'continues'       => 'Continues',
+    'open'            => 'Open',
+    'send'            => 'Send',
+    'view'            => 'View',
+    'reset'           => 'Rest',
+    'copy'            => [
         'attribute' => 'Copy',
         'success'   => 'Copy successfully',
         'failed'    => 'Copy failed, please copy manually',
     ],
-    'free'           => 'Free',
-    'replace'        => 'Change',
-    'submit'         => 'Submit',
-    'submit_item'    => 'Submit :attribute',
-    'generate'       => 'Generate',
-    'generate_item'  => 'Generate :attribute',
-    'to_safari'      => ['0' => 'Click on the upper right corner', '1' => ', Choose ', '2' => 'Open In Safari', '3' => ' to improve your experience.'],
-    'update_browser' => ['0' => 'You are using an ', '1' => 'outdated', '2' => ' browser. Please', '3' => 'upgrade your browser', '4' => ' to improve your experience.'],
-    'apply'          => 'Apply',
-    'avatar'         => 'Avatar',
-    'customize'      => 'Custom',
-    'all'            => 'All',
-    'default'        => 'Default',
-    'download'       => 'Download',
-    'goto'           => 'Goto',
-    'warning'        => 'Warning',
-    'success'        => 'Successfully',
-    'failed'         => 'Failed',
-    'update'         => 'Update',
-    'update_action'  => 'Update :action',
-    'none'           => 'None',
-    'new'            => 'New',
-    'sorry'          => 'Sorry',
-    'applied'        => ':attribute Applied',
-    'active_item'    => 'Active :attribute',
-    'error'          => 'Error',
-    'toggle'         => 'Toggle',
-    'toggle_action'  => 'Toggle :action',
-    'request_url'    => 'Request Url',
-    'function'       => [
+    'add'             => 'Add',
+    'free'            => 'Free',
+    'replace'         => 'Change',
+    'submit'          => 'Submit',
+    'submit_item'     => 'Submit :attribute',
+    'generate'        => 'Generate',
+    'generate_item'   => 'Generate :attribute',
+    'to_safari'       => [0 => 'Click on the upper right corner', 1 => ', Choose ', 2 => 'Open In Safari', 3 => ' to improve your experience.'],
+    'update_browser'  => [0 => 'You are using an ', 1 => 'outdated', 2 => ' browser. Please', 3 => 'upgrade your browser', 4 => ' to improve your experience.'],
+    'apply'           => 'Apply',
+    'avatar'          => 'Avatar',
+    'customize'       => 'Custom',
+    'all'             => 'All',
+    'default'         => 'Default',
+    'download'        => 'Download',
+    'goto'            => 'Goto',
+    'warning'         => 'Warning',
+    'success'         => 'Successfully',
+    'failed'          => 'Failed',
+    'update'          => 'Update',
+    'update_action'   => 'Update :action',
+    'none'            => 'None',
+    'new'             => 'New',
+    'sorry'           => 'Sorry',
+    'applied'         => ':attribute Applied',
+    'active_item'     => 'Active :attribute',
+    'error'           => 'Error',
+    'toggle'          => 'Toggle',
+    'toggle_action'   => 'Toggle :action',
+    'request_url'     => 'Request Url',
+    'function'        => [
         'navigation' => 'Navigation',
         'menubar'    => 'Menubar',
         'fullscreen' => 'Fullscreen',
     ],
-    'days'           => [
+    'days'            => [
         'sun'     => 'Sunday',
         'mon'     => 'Monday',
         'tue'     => 'Tuesday',
@@ -67,20 +69,76 @@ return [
         'work'    => 'Work Day',
         'next'    => 'Next Day',
     ],
-    'qrcode'         => ':attribute QrCode',
-    'deleted'        => 'Deleted',
-    'deleted_item'   => ':attribute Deleted',
-    'print'          => 'Print',
-    'unlimited'      => 'Unlimited',
-    'payment'        => [
+    'qrcode'          => ':attribute QrCode',
+    'deleted'         => 'Deleted',
+    'deleted_item'    => ':attribute Deleted',
+    'print'           => 'Print',
+    'unlimited'       => 'Unlimited',
+    'payment'         => [
         'credit' => 'Credit',
         'wechat' => 'Wechat',
         'alipay' => 'Alipay',
         'crypto' => 'Cryptocurrency',
         'manual' => 'Manual Pay',
+        'status' => [
+            'wait'    => 'Awaiting payment',
+            'fail'    => 'Payment Failed',
+            'success' => 'Payment successful',
+        ],
     ],
-    'recommend'      => 'Recommend',
-    'advance'        => 'Advance',
-    'status'         => 'Status',
-    'action'         => 'Action',
+    'order'           => [
+        'status' => [
+            'cancel'   => 'Cancel',
+            'complete' => 'Completed',
+            'prepaid'  => 'Prepaid',
+            'ongoing'  => 'Using',
+            'review'   => 'Waiting for confirm',
+        ],
+    ],
+    'recommend'       => 'Recommend',
+    'advance'         => 'Advance',
+    'action'          => 'Action',
+    'search'          => 'Search',
+    'edit'            => 'Part',
+    'delete'          => 'Deletions',
+    'status'          => [
+        'attribute'         => 'Status',
+        'inactive'          => 'Not activated',
+        'disabled'          => 'Stop using',
+        'banned'            => 'Banned',
+        'normal'            => 'Regular',
+        'enabled'           => 'Reuse',
+        'expire'            => 'Expiration',
+        'limited'           => 'Limitations',
+        'run_out'           => 'Out of traffic',
+        'unused'            => 'Unused',
+        'used'              => 'Used',
+        'closed'            => 'Closed',
+        'applying'          => 'Applying',
+        'withdrawn'         => 'Withdrawn',
+        'unwithdrawn'       => 'Not withdrawn',
+        'reply'             => 'Replied',
+        'pending'           => 'Pending',
+        'unknown'           => 'Announcements',
+        'available'         => 'Active',
+        'reject'            => 'Rise Back',
+        'rejected'          => 'Rejected',
+        'review'            => 'Pending approval',
+        'reviewed'          => 'Approve pending payment',
+        'paid'              => 'Waited',
+        'payment_pending'   => 'To be paid',
+        'pass'              => 'Passed',
+        'send_to_credit'    => 'Buy to Balance',
+        'waiting_tobe_send' => 'Waiting for delivery',
+    ],
+    'stay_unchanged'  => 'Leave empty for the same',
+    'random_generate' => 'Leave empty to randomly generate',
+    'request_failed'  => 'Request error, please try again',
+    'convert'         => 'Convert',
+    'import'          => 'Inputs',
+    'or'              => 'or',
+    'more'            => 'More',
+    'to'              => 'To',
+    'to_be_send'      => 'Pending',
+    'developing'      => 'Developing! Stay tuned',
 ];

+ 239 - 0
resources/lang/en/model.php

@@ -0,0 +1,239 @@
+<?php
+
+return [
+    'user'             => [
+        'id'             => 'User ID',
+        'attribute'      => 'User',
+        'nickname'       => 'Nickname',
+        'username'       => 'Account',
+        'password'       => 'Password',
+        'credit'         => 'Credit',
+        'invite_num'     => 'Available Invitation Code',
+        'reset_date'     => 'Reset day',
+        'port'           => 'Port',
+        'traffic_used'   => 'Traffic Usage',
+        'service'        => 'Proxy',
+        'group'          => 'Group',
+        'level'          => 'Rank',
+        'account_status' => 'Status',
+        'proxy_status'   => 'Proxy Status',
+        'expired_date'   => 'Expiration Date',
+        'role'           => 'Role Permissions',
+        'wechat'         => 'Wechat',
+        'qq'             => 'QQ',
+        'remark'         => 'Remarks',
+        'uuid'           => 'VMess UUID',
+        'proxy_passwd'   => 'Password',
+        'proxy_method'   => 'Encryption Method',
+        'usable_traffic' => 'Available traffic',
+        'proxy_protocol' => 'Protocol',
+        'proxy_obfs'     => 'Obsolete',
+        'speed_limit'    => 'User limit',
+        'inviter'        => 'invitees',
+        'created_date'   => 'Registration at',
+    ],
+    'common'           => [
+        'extend'      => 'Extended',
+        'sort'        => 'Sort by',
+        'description' => 'Description',
+    ],
+    'country'          => [
+        'code' => 'ISO country code',
+        'icon' => 'Character',
+        'name' => 'Country name',
+    ],
+    'subscribe'        => [
+        'code'       => 'Subscription Code',
+        'req_times'  => 'Number of requests',
+        'updated_at' => 'Last Request Time',
+        'ban_time'   => 'Banned Time',
+        'ban_desc'   => 'Ban reason',
+        'req_ip'     => 'Request IP',
+        'req_header' => 'Visits',
+    ],
+    'oauth'            => [
+        'type'       => 'Channels',
+        'identifier' => ' Unique ID',
+    ],
+    'user_group'       => [
+        'attribute' => 'User Group',
+        'name'      => 'Group Name',
+        'nodes'     => 'Select Node',
+    ],
+    'node'             => [
+        'attribute'       => 'Node',
+        'id'              => 'Node ID',
+        'type'            => 'Type',
+        'name'            => 'Name',
+        'domain'          => 'Domain Name',
+        'static'          => 'Survive',
+        'online_user'     => 'Online',
+        'data_consume'    => 'Generate traffic',
+        'data_rate'       => 'Data Ratio',
+        'ddns'            => 'DNS',
+        'ipv4'            => 'IPv4 Address',
+        'ipv6'            => 'IPv6 Address',
+        'push_port'       => 'Message Push Port',
+        'level'           => 'Rank',
+        'rule_group'      => 'Audit Group',
+        'traffic_limit'   => 'Node Speed',
+        'client_limit'    => 'Device Limit',
+        'label'           => 'Tags',
+        'country'         => 'Country/region',
+        'udp'             => 'UDP',
+        'display'         => 'Display & Subscription',
+        'detection'       => 'Node block detection',
+        'method'          => 'Encryption Method',
+        'protocol'        => 'Protocol',
+        'protocol_param'  => 'Protocol parameters',
+        'obfs'            => 'Obsolete',
+        'obfs_param'      => 'obfuscate parameters',
+        'single'          => 'Single Port',
+        'transfer'        => 'Transit',
+        'service_port'    => 'Service Port',
+        'single_passwd'   => '[单] Password',
+        'v2_alter_id'     => 'Extra ID',
+        'v2_net'          => 'Transfer Method',
+        'v2_cover'        => 'disguised type',
+        'v2_host'         => 'camouflage domain',
+        'v2_path'         => 'Path | Key',
+        'v2_sni'          => 'SNI',
+        'v2_tls'          => 'Connect to TLS',
+        'v2_tls_provider' => 'TLS Configuration',
+        'relay_port'      => 'Transit Port',
+    ],
+    'node_auth'        => [
+        'attribute' => 'Node Authorization',
+        'key'       => 'Communication key<small>node uses</small>',
+        'secret'    => 'Reverse Communication Key',
+    ],
+    'node_cert'        => [
+        'attribute'    => 'Domain Certificate',
+        'domain'       => 'Domain Name',
+        'key'          => 'KEY',
+        'pem'          => 'PEM',
+        'issuer'       => 'Issuing agency',
+        'signed_date'  => 'Issued on',
+        'expired_date' => 'Expired At',
+    ],
+    'order'            => [
+        'attribute'      => 'Order',
+        'id'             => 'Order ID',
+        'original_price' => 'Original price',
+        'price'          => 'Real Price',
+        'pay_way'        => 'payment method',
+        'status'         => 'Order Status',
+    ],
+    'goods'            => [
+        'attribute'      => 'Commodities',
+        'type'           => 'Type',
+        'name'           => 'Name',
+        'price'          => 'Sale Price',
+        'category'       => 'Categories',
+        'level'          => 'Rank',
+        'renew'          => 'Data Reset Price',
+        'user_limit'     => 'User limit',
+        'period'         => 'Reset period',
+        'traffic'        => 'Traffic limit',
+        'invite_num'     => 'Send Invitation Number',
+        'limit_num'      => 'Limit purchase quantity',
+        'available_date' => 'Available Until/Period',
+        'hot'            => 'Hot',
+        'color'          => 'Colors',
+        'logo'           => 'Product Image',
+        'info'           => 'Custom List',
+    ],
+    'rule'             => [
+        'attribute' => 'Rules',
+        'type'      => 'Type',
+        'name'      => 'Description',
+        'pattern'   => 'Value',
+    ],
+    'rule_group'       => [
+        'attribute' => 'Rule Group',
+        'name'      => 'Group Name',
+        'type'      => 'Audit mode',
+        'rules'     => 'Select Rule',
+    ],
+    'role'             => [
+        'attribute'   => 'Roles',
+        'name'        => 'Name',
+        'permissions' => 'Permissions',
+    ],
+    'permission'       => [
+        'attribute'   => 'Permission Behavior',
+        'description' => 'Description of behavior',
+        'name'        => 'Route Name',
+    ],
+    'article'          => [
+        'attribute'  => 'Articles',
+        'type'       => 'Class',
+        'category'   => 'Categories',
+        'language'   => 'Languages',
+        'logo'       => 'Header',
+        'created_at' => 'Published Date',
+        'updated_at' => 'Last updated',
+    ],
+    'coupon'           => [
+        'attribute'          => 'Voucher',
+        'name'               => 'Card Name',
+        'sn'                 => 'Use voucher code',
+        'logo'               => 'Card Image',
+        'type'               => 'Type',
+        'value'              => 'Quote limit',
+        'priority'           => 'Rights',
+        'usable_times'       => 'Usage Count',
+        'minimum'            => 'Discount condition',
+        'used'               => 'Personal Usage',
+        'levels'             => 'Ranking limit',
+        'groups'             => 'Group Limit',
+        'users_whitelist'    => 'Exclusive User',
+        'users_blacklist'    => 'Disable User',
+        'services_whitelist' => 'License Item',
+        'services_blacklist' => 'Disable products',
+        'newbie'             => 'Newcomer Exclusive',
+        'num'                => 'Quantity',
+    ],
+    'aff'              => [
+        'invitee'    => 'Consumer',
+        'order_id'   => 'Order number',
+        'amount'     => 'Spend amount',
+        'commission' => 'Rebate amount',
+        'updated_at' => 'Processing time',
+        'created_at' => 'Order Time',
+    ],
+    'referral'         => [
+        'created_at' => 'Request Time',
+        'user'       => 'Request Account',
+        'amount'     => 'Amount requested to cash out',
+        'id'         => 'Request ID',
+    ],
+    'notification'     => [
+        'type'       => 'Type',
+        'address'    => 'Incoming Address',
+        'created_at' => 'Delivery Time',
+        'status'     => 'Delivery Status',
+    ],
+    'ip'               => [
+        'network_type' => 'Newsletter Type',
+        'info'         => 'Dependencies',
+    ],
+    'user_traffic'     => [
+        'upload'   => 'Upload traffic',
+        'download' => 'Download traffic',
+        'total'    => 'Total traffic',
+        'log_time' => 'Record Time',
+    ],
+    'user_data_modify' => [
+        'before'      => 'Pre-change traffic',
+        'after'       => 'Traffic after change',
+        'description' => 'Description',
+        'created_at'  => 'Time of occurrence',
+    ],
+    'user_credit'      => [
+        'before'     => 'Balance before operation',
+        'after'      => 'Amount after operation',
+        'amount'     => 'Amount occurs',
+        'created_at' => 'Time of occurrence',
+    ],
+];

+ 44 - 68
resources/lang/en/user.php

@@ -20,26 +20,6 @@ return [
             'unknown'           => 'UNKNOWN ERROR, Please try to refresh your browser first before contact admin for help',
         ],
     ],
-    'status'              => [
-        'disabled'        => 'Disabled',
-        'enabled'         => 'Normal',
-        'expired'         => 'Expired',
-        'limited'         => 'Limited',
-        'run_out'         => 'Run out of Data',
-        'unused'          => 'Unused',
-        'used'            => 'Used',
-        'closed'          => 'Closed',
-        'completed'       => 'Completed',
-        'waiting_payment' => 'Waiting for payment',
-        'using'           => 'Using',
-        'waiting_confirm' => 'Waiting for confirm',
-        'prepaid'         => 'Prepaid',
-        'applying'        => 'Applying',
-        'withdrawn'       => 'Withdrawn',
-        'not_withdrawn'   => 'Not withdrawn',
-        'reply'           => 'Replied',
-        'pending'         => 'Pending',
-    ],
     'home'                => [
         'attendance'         => [
             'attribute' => 'Attendance',
@@ -107,7 +87,7 @@ return [
     'error_response'      => 'Something went wrong, please try again later.',
     'invite'              => [
         'attribute'       => 'Invitation code',
-        'total'           => 'Total: num invitation codes',
+        'counts'          => 'Total <code>:num</code> invitation codes',
         'tips'            => 'Can generate <strong> :num <strong> invitation codes, valid within :days',
         'logs'            => 'Invitation Record',
         'promotion'       => 'Register and activate with your invitation code, Both sides will get <mark>:traffic</mark> traffic as rewards; when invitees purchase services, you will get <mark>:referral_percent%</mark> of their spend amount as commission.',
@@ -122,14 +102,12 @@ return [
         'success'   => 'Reset Successfully',
     ],
     'referral'            => [
-        'link'       => 'Referral link',
-        'total'      => 'Total rebate :amount (:total times), you can apply for cash withdrawal when it reaches :money.',
-        'amount'     => 'Spend amount',
-        'commission' => 'Rebate amount',
-        'logs'       => 'Commission records',
-        'failed'     => 'Application failed',
-        'success'    => 'Application success',
-        'msg'        => [
+        'link'    => 'Referral link',
+        'total'   => 'Total rebate :amount (:total times), you can apply for cash withdrawal when it reaches :money.',
+        'logs'    => 'Commission records',
+        'failed'  => 'Application failed',
+        'success' => 'Application success',
+        'msg'     => [
             'account'     => 'Account has expired, please purchase to active service first',
             'applied'     => 'There is an application exist, please wait for the previous application to be processed',
             'unfulfilled' => 'A minimal amount to created application is :amount',
@@ -139,8 +117,6 @@ return [
     ],
     'inviter'             => 'Inviter',
     'invitee'             => 'Invitee',
-    'consumer'            => 'Consumer',
-    'unknown'             => 'Unknown',
     'registered_at'       => 'Registration at',
     'bought_at'           => 'Purchased at',
     'payment_method'      => 'payment method',
@@ -155,21 +131,27 @@ return [
     'withdraw'            => 'Withdraw',
     'scan_qrcode'         => 'Please scan the QR code',
     'shop'                => [
-        'hot'           => 'HOT',
-        'limited'       => 'LIMIT',
-        'change_amount' => 'Amount',
-        'buy'           => 'Purchase',
-        'description'   => 'Description',
-        'service'       => 'Service',
-        'pay_credit'    => 'Pay By Credit',
-        'pay_online'    => 'Pay By Online payment',
-        'price'         => 'Price',
-        'quantity'      => 'Quantity',
-        'subtotal'      => 'Subtotal',
-        'total'         => 'Total',
-        'conflict'      => 'Service Conflict',
-        'conflict_tips' => '<p>Current order will be set as <code>Prepaid order</code><p><ol class="text-left"><li> Prepaid order will be active after current service expired!</li><li> Your also can active the order manually</li></ol>',
-        'call4help'     => 'Please create a ticket to ask customer service',
+        'hot'                => 'HOT',
+        'limited'            => 'LIMIT',
+        'change_amount'      => 'Amount',
+        'change_amount_help' => 'Please enter a recharge amount',
+        'buy'                => 'Purchase',
+        'description'        => 'Description',
+        'service'            => 'Service',
+        'pay_credit'         => 'Pay By Credit',
+        'pay_online'         => 'Pay By Online payment',
+        'price'              => 'Price',
+        'quantity'           => 'Quantity',
+        'subtotal'           => 'Subtotal',
+        'total'              => 'Total',
+        'conflict'           => 'Service Conflict',
+        'conflict_tips'      => '<p>Current order will be set as <code>Prepaid order</code><p><ol class="text-left"><li> Prepaid order will be active after current service expired!</li><li> Your also can active the order manually</li></ol>',
+        'call4help'          => 'Please create a ticket to ask customer service',
+    ],
+    'service'             => [
+        'node_count'    => 'Include <code>:num</code> Nodes',
+        'country_count' => 'Covered <code>:num</code> Countries or Areas',
+        'unlimited'     => 'Unlimited Speed',
     ],
     'payment'             => [
         'error'           => 'The recharge balance is not compliant',
@@ -181,17 +163,11 @@ return [
     ],
     'invoice'             => [
         'attribute'               => 'Order',
-        'id'                      => 'Order number',
         'detail'                  => 'Order Detail',
         'amount'                  => 'Amount',
         'active_prepaid_question' => 'Are you sure to active prepaid order?',
         'active_prepaid_tips'     => 'After active:<br>Current order will be set to expired! <br> Expired dates will be recalculated!',
     ],
-    'service'             => [
-        'node_count'    => 'Include <code>:num</code> Nodes',
-        'country_count' => 'Covered <code>:num</code> Countries or Areas',
-        'unlimited'     => 'Unlimited Speed',
-    ],
     'node'                => [
         'info'     => 'Configuration information',
         'setting'  => 'Proxy settings',
@@ -211,22 +187,22 @@ return [
         'error'            => 'Exchange Link Error',
     ],
     'ticket'              => [
-        'attribute'         => 'Ticket',
-        'submit_tips'       => 'Submit Ticket?',
-        'reply_confirm'     => 'Reply Ticket?',
-        'close_tips'        => 'Are you sure to close this ticket?',
-        'close'             => 'Close Ticket',
-        'failed_closed'     => 'Error: Ticket has been closed',
-        'reply_placeholder' => 'Say something',
-        'reply'             => 'Reply',
-        'close_msg'         => 'Ticket ID :id has been closed by user',
-        'placeholder'       => 'Please describe your questions in detail',
-        'title_placeholder' => 'Please describe your questions in few key words',
-        'new'               => 'Create Ticket',
-        'working_hour'      => 'Customer Service',
-        'online_hour'       => 'Working Hours',
-        'service_tips'      => 'We have many way to contact, please choose <code> ONE </code> of them! <br> Duplicate request will cost the service to delay',
-        'error'             => 'Error!Please contact Customer Service',
+        'attribute'           => 'Ticket',
+        'submit_tips'         => 'Submit Ticket?',
+        'reply_confirm'       => 'Reply Ticket?',
+        'close_tips'          => 'Are you sure to close this ticket?',
+        'close'               => 'Close Ticket',
+        'failed_closed'       => 'Error: Ticket has been closed',
+        'reply_placeholder'   => 'Say something',
+        'reply'               => 'Reply',
+        'close_msg'           => 'Ticket ID :id has been closed by user',
+        'title_placeholder'   => 'Please describe your questions in few key words',
+        'content_placeholder' => 'Please describe in detail the problems you have encountered or where we need our help so that we can help you quickly',
+        'new'                 => 'Create Ticket',
+        'working_hour'        => 'Customer Service',
+        'online_hour'         => 'Working Hours',
+        'service_tips'        => 'We have many way to contact, please choose <code> ONE </code> of them! <br> Duplicate request will cost the service to delay',
+        'error'               => 'Error!Please contact Customer Service',
     ],
     'traffic_logs'        => [
         '24hours' => 'Today Traffic Usage',

+ 4 - 2
resources/lang/en/validation.php

@@ -106,12 +106,14 @@ return [
     'uploaded'             => 'The :attribute failed to upload.',
     'url'                  => 'The :attribute format is invalid.',
     'uuid'                 => 'The :attribute must be a valid UUID.',
-    'custom'               => [
+
+    'custom' => [
         'attribute-name' => [
             'rule-name' => 'custom-message',
         ],
     ],
-    'attributes'           => [
+
+    'attributes' => [
         'name'                  => 'Name',
         'nickname'              => 'Nickname',
         'username'              => 'Username',

+ 28 - 0
resources/lang/ko.json

@@ -0,0 +1,28 @@
+{
+  "All rights reserved.": "버전 소유",
+  "Hello!": "안녕하세요",
+  "If you did not create an account, no further action is required.": "회원가입을 하지 않았다면 이 메일을 무시해주세요.",
+  "If you did not request a password reset, no further action is required.": "암호 재설정을 요청하지 않은 경우 추가 작업이 필요하지 않습니다.",
+  "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "\":actionText\" 버튼을 클릭하는데 문제가 있는 경우 아래 URL을 복사하여 웹 브라우저에 붙여 넣으세요.",
+  "If your problem has not been solved, Feel free to open other one.": "문제가 해결되지 않은 경우 다른 해결방안을 살펴보세요",
+  "Invoice Detail": "주문서 상세 내역",
+  "Nodes Daily Report": "회선 데이터 보고",
+  "Payment for #:sn has been received! Total amount: :amount.": "您成功支付了订单#:sn,总金额为 :amount。",
+  "Payment Received": "주문서 결제 성공",
+  "Please click the button below to verify your email address.": "아래 버튼을 클릭하여 이메일을 인증하세요",
+  "Please click the button below to reset your password.": "비밀번호를 초기화하려면 아래 버튼을 누르십시오:",
+  "Regards": "권장",
+  "Reset Password Notification": "비밀번호 재설정 알림 ",
+  "Reset Password": "비밀번호 재설정",
+  "Send Password Reset Link": "비밀번호 재설정 링크 전송",
+  "Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn't receive the email, we will gladly send you another.": "회원가입 해주셔서 감사합니다! 시작하기 전에 이메일 계정으로 보낸 링크를 클릭해서 이메일을 확인해야 합니다! 만약 이메일을 받지 못했다면, 다시 전송해드리겠습니다.",
+  "Too Many Attempts.": "너무 많이 시도하였습니다",
+  "Too Many Requests": "요청이 횟수 많음",
+  "Verify Email Address": "이메일 인증",
+  "Verify Your Email Address": "이메일 인증해주세요",
+  "We won't ask for your password again for a few hours.": "확인이 완료되면 앞으로 몇 시간 동안 비밀번호를 입력하지 않아도 됩니다.",
+  "You are receiving this email because we received a password reset request for your account.": "계정의 비밀번호 재설정 요청으로 인하여 이 메일을 전송합니다.",
+  "Your email address is not verified.": "이메일이 인증되지 않았습니다.",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": ":num시간 이상 동안 문의 답장이 없습니다. 시스템이 자동으로 문의를 닫았습니다.",
+  "You must have a valid subscription to view the content in this area!": "您必须拥有有效套餐才可以查看该区域的内容!"
+}

+ 844 - 0
resources/lang/ko/admin.php

@@ -0,0 +1,844 @@
+<?php
+
+return [
+    'dashboard'           => [
+        'users'                   => '总用户',
+        'available_users'         => '有效用户',
+        'paid_users'              => '付费用户',
+        'active_days_users'       => ':days 日内活跃用户',
+        'inactive_days_users'     => ':days 日以上不活跃用户',
+        'online_users'            => '当前在线',
+        'expiring_users'          => '临近到期',
+        'overuse_users'           => '流量大户(超过90%的用户)',
+        'abnormal_users'          => '1小时内流量异常',
+        'nodes'                   => '节点',
+        'maintaining_nodes'       => '维护中的节点',
+        'traffic_consumed'        => '记录的消耗流量',
+        'traffic_days_consumed'   => ':days 日内消耗流量',
+        'orders'                  => '总订单数',
+        'online_orders'           => '在线支付订单数',
+        'succeed_orders'          => '支付成功订单数',
+        'credit'                  => '总余额',
+        'withdrawing_commissions' => '待提现佣金',
+        'withdrawn_commissions'   => '已支出佣金',
+    ],
+    'action'              => [
+        'edit_item' => '编辑:attribute',
+        'add_item'  => '添加:attribute',
+    ],
+    'confirm'             => [
+        'delete'    => [0 => '确定删除:attribute【', 1 => '】? '],
+        'continues' => '确定继续操作吗? ',
+        'export'    => '确定全部导出? ',
+    ],
+    'user_dashboard'      => '个人中心',
+    'menu'                => [
+        'dashboard'        => '管理中心',
+        'user'             => [
+            'attribute'  => '用户系统',
+            'list'       => '用户管理',
+            'oauth'      => '用户授权',
+            'group'      => '用戶分组',
+            'credit_log' => '余额变动',
+            'subscribe'  => '订阅管理',
+        ],
+        'rbac'             => [
+            'attribute'  => '权限系统',
+            'permission' => '权限列表',
+            'role'       => '角色列表',
+        ],
+        'customer_service' => [
+            'attribute' => '客服系统',
+            'ticket'    => '服务工单',
+            'article'   => '文章管理',
+            'push'      => '消息推送',
+            'mail'      => '邮件群发',
+        ],
+        'node'             => [
+            'attribute' => '线路系统',
+            'list'      => '线路管理',
+            'auth'      => '线路授权',
+            'cert'      => '证书列表',
+        ],
+        'rule'             => [
+            'attribute' => '审计规则',
+            'list'      => '规则列表',
+            'group'     => '规则分组',
+            'trigger'   => '触发记录',
+        ],
+        'shop'             => [
+            'attribute' => '商品系统',
+            'goods'     => '商品管理',
+            'coupon'    => '卡券管理',
+            'order'     => '商品订单',
+        ],
+        'promotion'        => [
+            'attribute'   => '推广系统',
+            'invite'      => '邀请管理',
+            'withdraw'    => '提现管理',
+            'rebate_flow' => '返利流水',
+        ],
+        'analysis'         => [
+            'attribute'  => '分析报告',
+            'accounting' => '流水账簿',
+            'user_flow'  => '用户分析',
+        ],
+        'log'              => [
+            'attribute'        => '日志系统',
+            'traffic'          => '流量使用',
+            'traffic_flow'     => '流量变动',
+            'service_ban'      => '封禁记录',
+            'online_logs'      => '在线记录',
+            'online_monitor'   => '在线监控',
+            'notify'           => '通知记录',
+            'payment_callback' => '支付回调',
+            'system'           => '系统日志',
+        ],
+        'tools'            => [
+            'attribute' => '工具箱',
+            'decompile' => '反解析',
+            'convert'   => '格式转换',
+            'import'    => '数据导入',
+            'analysis'  => '日志分析',
+        ],
+        'setting'          => [
+            'attribute'    => '设置',
+            'email_suffix' => '邮箱后缀管理',
+            'universal'    => '通用配置',
+            'system'       => '系统设置',
+        ],
+    ],
+    'user'                => [
+        'massive'         => [
+            'text'    => '用户生成数量',
+            'button'  => '批量生成',
+            'failed'  => '批量生成账号失败',
+            'succeed' => '批量生成账号成功',
+            'note'    => '后台批量生成用户',
+        ],
+        'proxy_info'      => '설정 정보',
+        'traffic_monitor' => '流量统计',
+        'online_monitor'  => '在线巡查',
+        'reset_traffic'   => '데이터 재설정',
+        'user_view'       => '用户视角',
+        'connection_test' => '联网测试',
+        'counts'          => '共 <code>:num</code> 个账号',
+        'reset_confirm'   => [0 => '确定重置 【', 1 => '】 流量吗?'],
+        'info'            => [
+            'account'              => '账号信息',
+            'proxy'                => '代理信息',
+            'switch'               => '切换身份',
+            'reset_date_hint'      => '账号流量下一个重置日期',
+            'expired_date_hint'    => '留空默认为一年',
+            'uuid_hint'            => 'V2Ray的账户ID',
+            'recharge_placeholder' => '填入负值则会扣余额',
+        ],
+        'update_help'     => '更新成功,是否返回?',
+        'proxies_config'  => '【:username】连接配置信息',
+        'group'           => [
+            'title'  => '用户分组控制<small>(同一节点可分配至多个分组,一个用户只能属于一个分组;对于用户可见/可用节点:先按分组后按等级)</small>',
+            'name'   => '分组名称',
+            'counts' => ' 共 <code>:num</code> 个分组',
+        ],
+    ],
+    'zero_unlimited_hint' => '不设置/0,即为无限制',
+    'node'                => [
+        'traffic_monitor' => '流量统计',
+        'refresh_geo'     => '刷新地理',
+        'ping'            => '检测延迟',
+        'connection_test' => '连通性检测',
+        'counts'          => '共 <code> :num </code> 条线路',
+        'reload_all'      => '重载【全部】后端',
+        'refresh_geo_all' => '刷新【全部】节点地理信息',
+        'reload_confirm'  => '确定重载节点?',
+        'info'            => [
+            'hint'                  => '<strong>注意:</strong> 添加节点后自动生成的<code>ID</code>,即为该节点部署ShadowsocksR Python版后端时<code>usermysql.json</code>中的<code>node_id</code>的值,同时也是部署V2Ray后端时的<code>nodeId</code>的值;',
+            'basic'                 => '基础信息',
+            'ddns_hint'             => '动态IP节点需要<a href="https://github.com/NewFuture/DDNS" target="_blank">配置DDNS</a>,对此类型节点,节点阻断功能会通过域名进行检测',
+            'domain_placeholder'    => '服务器域名地址,填则优先取域名地址',
+            'domain_hint'           => '系统设置中开启【DDNS模式】,域名将会自动与下方IP内容进行绑定操作!无需再前往域名注册商页面修改IP信息了哟',
+            'extend'                => '扩展信息',
+            'display'               => [
+                'invisible' => '完全不可见',
+                'node'      => '只显示于【:trans】页面',
+                'sub'       => '只显示于【订 阅】',
+                'all'       => '完全可见',
+                'hint'      => '用户是否可以订阅/看到本节点',
+            ],
+            'ipv4_hint'             => '多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8',
+            'ipv6_hint'             => '多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8',
+            'ipv4_placeholder'      => '服务器IPv4地址',
+            'ipv6_placeholder'      => '服务器IPv6地址,填写则用户可见,域名无效',
+            'push_port_hint'        => '必填且防火墙需放行,否则将导致消息推送异常',
+            'data_rate_hint'        => '举例:0.1用100M结算10M,5用100M结算500M',
+            'level_hint'            => '等级:0-无等级,全部可见',
+            'detection'             => [
+                'tcp'  => '只检测TCP',
+                'icmp' => '只检测ICMP',
+                'all'  => '检测全部',
+                'hint' => '每30~60分钟随机进行节点阻断检测',
+            ],
+            'obfs_param_hint'       => '混淆不为 [plain] 时可填入参数进行流量伪装;&#13;&#10;混淆为 [http_simple] 时,建议端口为 80;&#13;&#10;混淆为 [tls] 时,建议端口为 443;',
+            'additional_ports_hint' => '如果启用请配置服务端的<span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span>信息',
+            'v2_method_hint'        => '使用WebSocket传输协议时不要使用none',
+            'v2_net_hint'           => '使用WebSocket传输协议时请启用TLS',
+            'v2_cover'              => [
+                'none'      => '无伪装',
+                'http'      => 'HTTP数据流',
+                'srtp'      => '视频通话数据 (SRTP)',
+                'utp'       => 'BT下载数据 (uTP)',
+                'wechat'    => '微信视频通话',
+                'dtls'      => 'DTLS1.2数据包',
+                'wireguard' => 'WireGuard数据包',
+            ],
+            'v2_host_hint'          => '伪装类型为http时多个伪装域名逗号隔开,使用WebSocket传输协议时只允许单个',
+            'v2_tls_provider_hint'  => '不同后端配置不同:',
+            'single_hint'           => '推荐80或443,服务端需要配置 <br> 严格模式:用户的端口无法连接,只能通过以下指定的端口进行连接(<a href="javascript:showPortsOnlyConfig();">如何配置</a>)',
+        ],
+        'proxy_info'      => '*兼容 SS',
+        'proxy_info_hint' => '如果兼容请在服务端配置协议和混淆时加上<span class="red-700">_compatible</span>',
+        'reload'          => '重载后端',
+        'auth'            => [
+            'title'          => '节点授权列表<small>WEBAPI</small>',
+            'deploy'         => [
+                'title'          => '部署 :type_label 后端',
+                'attribute'      => '部署后端',
+                'command'        => '操作命令',
+                'update'         => '更新:',
+                'uninstall'      => '卸载:',
+                'start'          => '启动:',
+                'stop'           => '停止:',
+                'status'         => '状态:',
+                'recent_logs'    => '近期日志:',
+                'real_time_logs' => '实时日志:',
+                'restart'        => '重启:',
+                'same'           => '同上',
+                'trojan_hint'    => '请先<a href=":url" target="_blank">填写节点域名</a>并将域名解析到节点对应的IP上',
+            ],
+            'reset_auth'     => '重置密钥',
+            'counts'         => '共 <code>:num</code> 条授权',
+            'generating_all' => '确定生成所有节点的授权吗?',
+        ],
+        'cert'            => [
+            'title'           => '域名证书列表<small>(V2Ray节点的伪装域名)</small>',
+            'counts'          => '共 <code>:num</code> 个域名证书',
+            'key_placeholder' => '域名证书的KEY值,允许为空,VNET-V2Ray后端支持自动签证书',
+            'pem_placeholder' => '域名证书的PEM值,允许为空,VNET-V2Ray后端支持自动签证书',
+        ],
+    ],
+    'hint'                => '提示',
+    'oauth'               => [
+        'title'  => '用户OAuth授权',
+        'counts' => '共 <code>:num</code> 个授权',
+    ],
+    'select_all'          => '全 选',
+    'clear'               => '清 空',
+    'unselected_hint'     => '待分配规则,此处可搜索',
+    'selected_hint'       => '已分配规则,此处可搜索',
+    'clone'               => '克隆',
+    'monitor'             => [
+        'daily_chart'   => '每日流量图',
+        'monthly_chart' => '月流量图',
+        'node'          => '节点流量',
+        'user'          => '用户流量',
+        'hint'          => '<strong>提示:</strong> 如果无统计数据,请检查定时任务是否正常。',
+    ],
+    'tools'               => [
+        'analysis'  => [
+            'title'      => 'SSR日志分析<small>仅适用于单机单节点</small>',
+            'req_url'    => '近期请求地址',
+            'not_enough' => '访问记录不足15000条,无法分析数据',
+        ],
+        'convert'   => [
+            'title'               => '格式转换 <small>Shadowsocks 转 ShadowsocksR</small>',
+            'content_placeholder' => '请填入要转换的配置信息',
+        ],
+        'decompile' => [
+            'title'               => '反解析<small>配置转换</small>',
+            'attribute'           => '反解析',
+            'content_placeholder' => '请填入要反解析的ShadowsocksR链接,一行一条',
+        ],
+    ],
+    'ticket'              => [
+        'title'         => '工单列表',
+        'counts'        => '共 <code>:num</code> 个工单',
+        'send_to'       => '请填入目标用户信息!',
+        'user_info'     => '用户信息',
+        'inviter_info'  => '邀请人信息',
+        'close_confirm' => '确定关闭工单?',
+        'error'         => '未知错误!请查看运行日志',
+    ],
+    'logs'                => [
+        'subscribe'              => '订阅列表',
+        'counts'                 => '共 <code>:num</code> 条记录',
+        'rule'                   => [
+            'clear_all'     => '清空记录',
+            'title'         => '触发记录',
+            'name'          => '触发规则',
+            'reason'        => '触发原因',
+            'created_at'    => '触发时间',
+            'tag'           => '✅ 访问非规则允许内容',
+            'clear_confirm' => '确定清空所有记录吗?',
+        ],
+        'order'                  => [
+            'title'      => '订单列表',
+            'is_expired' => '是否过期',
+            'is_coupon'  => '是否使用优惠券',
+        ],
+        'user_traffic'           => [
+            'title'       => '流量使用记录',
+            'choose_node' => '选择节点',
+        ],
+        'user_data_modify_title' => '流量变动记录',
+        'callback'               => '回调日志 <small>(在线支付)</small>',
+        'notification'           => '邮件投递记录',
+        'ip_monitor'             => '在线IP监控 <small>2分钟内的实时数据</small>',
+        'user_ip'                => [
+            'title'   => '用户在线IP列表 <small>最近10分钟</small>',
+            'connect' => '连接IP',
+        ],
+        'ban'                    => [
+            'title'           => '用户封禁记录',
+            'time'            => '时长',
+            'reason'          => '理由',
+            'ban_time'        => '封禁时间',
+            'last_connect_at' => '最后连接时间',
+        ],
+        'credit_title'           => '余额变动记录',
+    ],
+    'start_time'          => '开始区间',
+    'end_time'            => '结束区间',
+    'goods'               => [
+        'title'         => '商品列表',
+        'type'          => [
+            'top_up'  => '충전',
+            'package' => '流量包',
+            'plan'    => '套餐',
+        ],
+        'info'          => [
+            'type_hint'           => '套餐与账号有效期有关,流量包只扣可用流量,不影响有效期',
+            'period_hint'         => '套餐流量会每N天重置',
+            'limit_num_hint'      => '每个用户可以购买该商品次数,为 0 时代表不限购',
+            'available_date_hint' => '到期后会自动从总流量扣减对应的流量',
+            'desc_placeholder'    => '商品的简单描述',
+            'list_placeholder'    => '商品的自定义列表添加',
+            'list_hint'           => '每行内容请以<code>&lt;li&gt;</code> 开头<code>&lt;/li&gt;</code> 结尾',
+        ],
+        'status'        => [
+            'yes' => '上架',
+            'no'  => '下架',
+        ],
+        'sell_and_used' => '使用 / 销售',
+        'counts'        => '共 <code>:num</code> 个商品',
+    ],
+    'sort_asc'            => '排序值越大排越前',
+    'yes'                 => '是',
+    'no'                  => '否',
+    'rule'                => [
+        'type'   => [
+            'reg'      => '正则表达式',
+            'domain'   => '域名',
+            'ip'       => 'IP',
+            'protocol' => '协议',
+        ],
+        'counts' => '共 <code>:num</code> 条审计规则',
+        'title'  => '规则列表',
+        'group'  => [
+            'type'   => [
+                'off' => '阻断',
+                'on'  => '放行',
+            ],
+            'title'  => '规则分组',
+            'counts' => '共 <code>:num</code> 个分组',
+        ],
+    ],
+    'role'                => [
+        'name_hint'        => '唯一标识名称,例如:Administrator',
+        'description_hint' => '面板显示名称,例如:管理员',
+        'title'            => '权限角色列表',
+        'permissions_all'  => '全部权限',
+        'counts'           => '共 <code>:num</code> 个权限角色',
+    ],
+    'report'              => [
+        'monthly_accounting'  => '月流水账簿',
+        'annually_accounting' => '年流水账簿',
+        'historic_accounting' => '历史流水账簿',
+        'current_month'       => ' 本 月 ',
+        'last_month'          => ' 上 月',
+        'current_year'        => ' 今 年 ',
+        'last_year'           => ' 去 年 ',
+        'hourly_traffic'      => '每时流量',
+        'daily_traffic'       => '每天流量',
+        'today'               => ' 本 日 ',
+    ],
+    'permission'          => [
+        'title'            => '权限行为列表',
+        'description_hint' => '填写描述,例:【A系统】编辑A',
+        'name_hint'        => '填写路由名称,例:admin.permission.create,update',
+        'counts'           => '共 <code>:num</code> 条权限行为',
+    ],
+    'marketing'           => [
+        'email'         => [
+            'title'      => '邮件群发列表',
+            'group_send' => '群发邮件',
+            'counts'     => '共 <code>:num</code> 条消息',
+        ],
+        'send_status'   => '发送状态',
+        'send_time'     => '发送时间',
+        'error_message' => '错误信息',
+        'push'          => [
+            'title'  => '推送消息列表',
+            'send'   => '推送消息',
+            'counts' => '共 <code>:num</code> 条推送消息',
+        ],
+    ],
+    'creating'            => '正在添加...',
+    'article'             => [
+        'type'          => [
+            'knowledge'    => '文章',
+            'announcement' => '공지',
+        ],
+        'category_hint' => '同一类别将归类与同一文件夹下',
+        'logo_hint'     => '推荐尺寸:100x75',
+        'title'         => '文章列表',
+        'counts'        => '共 <code>:num</code> 篇文章',
+    ],
+    'coupon'              => [
+        'title'                   => '卡券列表',
+        'name_hint'               => '会用于前端显示',
+        'sn_hint'                 => '提供给用户使用卡券的卡券,留空则默认为8位随机码',
+        'type'                    => [
+            'voucher'  => '抵用券',
+            'discount' => '折扣券',
+            'charge'   => '充值券',
+        ],
+        'type_hint'               => '抵用:抵扣商品金额,折扣:商品百分比打折,充值:充值用户账号余额',
+        'value'                   => '{1} ➖ :num|{2} :num 折|{3} ➕ :num',
+        'value_hint'              => '范围为 1% ~ 99% ',
+        'priority_hint'           => '同【使用券码】下,符合条件的高权重码将会被优先使用。最高为 255',
+        'minimum_hint'            => '当支付金额超过 <strong>:num</strong> 值时,才能使用本优惠劵;',
+        'used_hint'               => '符合条件的用户可以使用本券 <strong>:num</strong> 次;',
+        'levels_hint'             => '用户等级在选定等级内,方可使用本券',
+        'groups_hint'             => '选定的用户分组,方可使用本券',
+        'users_placeholder'       => '输入用户ID, 再回车',
+        'user_whitelist_hint'     => '涉及用户均可使用本券,留空为不使用此条件',
+        'users_blacklist_hint'    => '涉及用户均不可使用本券,空为不使用此条件',
+        'services_placeholder'    => '输入商品ID, 再回车',
+        'services_whitelist_hint' => '涉及商品方可使用本券,留空为不使用此条件',
+        'services_blacklist_hint' => '涉及商品不可使用本券,留空为不使用此条件',
+        'newbie'                  => [
+            'first_discount' => '首次用任意券',
+            'first_order'    => '首单',
+            'created_days'   => '创号',
+        ],
+        'created_days_hint'       => '且 创号 <code>:days</code> 天',
+        'limit_hint'              => '本项各条件为 <strong>并且</strong> 关系,请自行搭配使用',
+        'info_title'              => '卡券信息',
+        'counts'                  => '共 <code>:num</code> 张优惠券',
+        'discount'                => '할인',
+        'export_title'            => '卡券导出',
+        'single_use'              => '一次性',
+    ],
+    'times'               => '次',
+    'massive_export'      => '批量导出',
+    'system_generate'     => '系统生成',
+    'aff'                 => [
+        'rebate_title'      => '返利流水记录',
+        'counts'            => '共 <code>:num</code> 个申请',
+        'title'             => '提现申请列表',
+        'apply_counts'      => '共 <code>:num</code> 个申请',
+        'referral'          => '推广返利',
+        'commission_title'  => '提现申请详情',
+        'commission_counts' => '本申请共涉及 <code>:num</code> 单',
+    ],
+    'setting'             => [
+        'common'        => [
+            'title'         => '通用配置',
+            'set_default'   => '设为默认',
+            'connect_nodes' => '关联节点数',
+        ],
+        'email'         => [
+            'title'            => '邮箱过滤列表 <small>(用于屏蔽注册邮箱后缀)</small>',
+            'tail'             => '邮箱后缀',
+            'rule'             => '规则',
+            'black'            => '黑名单',
+            'white'            => '白名单',
+            'tail_placeholder' => '请填入邮箱后缀',
+        ],
+        'system'        => [
+            'title'     => '系统配置',
+            'web'       => '网站常规',
+            'account'   => '账号设置',
+            'node'      => '节点设置',
+            'extend'    => '拓展功能',
+            'check_in'  => '签到系统',
+            'promotion' => '推广系统',
+            'notify'    => '通知系统',
+            'auto_job'  => '自动任务',
+            'other'     => 'LOGO|客服|统计',
+            'payment'   => '支付系统',
+            'menu'      => '菜单',
+        ],
+        'no_permission' => '您没有权限修改参数!',
+    ],
+    'system'              => [
+        'account_expire_notification'   => '账号过期通知',
+        'active_times'                  => '激活账号次数',
+        'admin_invite_days'             => '管理员-邀请码有效期',
+        'aff_salt'                      => '邀请链接 用户信息字符化',
+        'alipay_qrcode'                 => '支付宝二维码',
+        'AppStore_id'                   => '苹果账号',
+        'AppStore_password'             => '苹果密码',
+        'auto_release_port'             => '端口回收机制',
+        'bark_key'                      => 'Bark设备号',
+        'bitpay_secret',
+        'captcha_key'                   => '验证码 Key',
+        'captcha_secret'                => '验证码 Secret/ID',
+        'codepay_id'                    => '码支付ID',
+        'codepay_key'                   => '通信密钥',
+        'codepay_url'                   => '请求URL',
+        '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'                   => '禁止访问模式',
+        'invite_num'                    => '可生成邀请码数',
+        'is_activate_account'           => '激活账号',
+        'is_AliPay'                     => '支付宝支付',
+        'is_ban_status'                 => '过期自动封禁',
+        'is_captcha'                    => '验证码模式',
+        'is_checkin'                    => '签到加流量',
+        'is_clear_log'                  => '自动清除日志',
+        'is_custom_subscribe'           => '高级订阅',
+        'is_email_filtering'            => '邮箱过滤机制',
+        'is_forbid_robot'               => '阻止机器人访问',
+        'is_free_code'                  => '免费邀请码',
+        'is_invite_register'            => '邀请注册',
+        'is_otherPay'                   => '特殊支付',
+        'is_push_bear',
+        'is_QQPay'                      => 'QQ钱包',
+        'is_rand_port'                  => '随机端口',
+        'is_register'                   => '用户注册',
+        'is_subscribe_ban'              => '订阅异常自动封禁',
+        'is_traffic_ban'                => '异常自动封号',
+        'is_WeChatPay'                  => '微信支付',
+        'iYuu_token'                    => 'IYUU令牌',
+        'maintenance_content'           => '维护介绍内容',
+        'maintenance_mode'              => '维护模式',
+        'maintenance_time'              => '维护结束时间',
+        'max_port',
+        'max_rand_traffic',
+        'min_port'                      => '端口范围',
+        'min_rand_traffic'              => '流量范围',
+        'node_blocked_notification'     => '节点阻断提醒',
+        'node_daily_notification'       => '节点使用报告',
+        'node_offline_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_confirm_notification'  => '人工支付确认通知',
+        'payment_received_notification' => '支付成功通知',
+        'paypal_app_id'                 => '应用ID',
+        'paypal_certificate'            => '证书',
+        'paypal_password'               => 'API密码',
+        'paypal_secret'                 => '签名',
+        'paypal_username'               => 'API用户名',
+        'pushDeer_key'                  => 'PushDeer Key',
+        'pushplus_token'                => 'PushPlus Token',
+        'rand_subscribe'                => '随机订阅',
+        'redirect_url'                  => '重定向地址',
+        'referral_money'                => '提现限制',
+        'referral_percent'              => '返利比例',
+        'referral_status'               => '推广功能',
+        'referral_traffic'              => '注册送流量',
+        'referral_type'                 => '返利模式',
+        '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_ban_times'           => '订阅请求阈值
+',
+        'subscribe_domain'              => '节点订阅地址',
+        'subscribe_max'                 => '订阅节点数',
+        '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_ban_time'              => '封号时长',
+        'traffic_ban_value'             => '流量异常阈值',
+        'traffic_limit_time'            => '时间间隔',
+        'traffic_warning_percent'       => '流量警告阈值',
+        'trojan_license'                => 'Trojan授权',
+        'username_type'                 => '账号类型',
+        'user_invite_days'              => '用户-邀请码有效期',
+        'v2ray_license'                 => 'V2Ray授权',
+        'v2ray_tls_provider'            => 'V2Ray TLS配置',
+        'webmaster_email'               => '管理员邮箱',
+        'website_analytics'             => '统计代码',
+        'website_callback_url'          => '通用支付回调地址',
+        'website_customer_service'      => '客服代码',
+        'website_home_logo'             => '首页LOGO',
+        'website_logo'                  => '站内LOGO',
+        'website_name'                  => '网站名称',
+        'website_security_code'         => '网站安全码',
+        'website_url'                   => '网站地址',
+        'web_api_url'                   => '授权/后端访问域名',
+        'wechat_aid'                    => '微信企业应用ID',
+        'wechat_cid'                    => '微信企业ID',
+        'wechat_encodingAESKey'         => '微信企业应用EncodingAESKey',
+        'wechat_qrcode'                 => '微 信二维码',
+        'wechat_secret'                 => '微信企业应用密钥',
+        'wechat_token'                  => '微信企业应用TOKEN',
+
+        'hint'           => [
+            'account_expire_notification'   => '通知用户账号即将到期',
+            'active_times'                  => '24小时内可以通过邮件激活账号次数',
+            'admin_invite_days'             => '管理员生成邀请码的有效期',
+            'aff_salt'                      => '留空时,邀请链接将显示用户ID;填入任意英文/数字 即可对用户链接ID进行加密',
+            'alipay_qrcode',
+            'AppStore_id'                   => 'iOS软件设置教程中使用的苹果账号',
+            'AppStore_password'             => 'iOS软件设置教程中使用的苹果密码',
+            'auto_release_port'             => '被封禁/过期 <code>'.config('tasks.release_port').'</code> 天的账号端口自动释放',
+            'bark_key'                      => '推送消息到iOS设备,需要在iOS设备里装一个名为Bark的应用,取网址后的一长串字符串,启用Bark,请务必填入本值',
+            'bitpay_secret',
+            'captcha_key'                   => '浏览<a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">设置指南</a>来设置',
+            'captcha_secret',
+            'codepay_id',
+            'codepay_key',
+            'codepay_url',
+            'data_anomaly_notification'     => '1小时内流量超过异常阈值通知超管',
+            'data_exhaust_notification'     => '通知用户流量即将耗尽',
+            'ddns_key'                      => "浏览<a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>设置指南</a>来设置",
+            'ddns_mode'                     => '添加/编辑/删除节点的【域名、ipv4、ipv6】时,自动更新对应内容至DNS服务商',
+            'ddns_secret',
+            'default_days'                  => '用户注册时默认账户有效期,为0即当天到期',
+            'default_traffic'               => '用户注册时默认可用流量',
+            'detection_check_times'         => '提醒N次后自动下线节点,为0/留空时不限制,不超过12',
+            'dingTalk_access_token'         => '可以阅读<a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>钉钉手册</a>查阅步骤',
+            'dingTalk_secret'               => '可选填!开启机器人[加签]就是必填项目!',
+            'epay_key',
+            'epay_mch_id',
+            'epay_url',
+            'expire_days'                   => '【账号过期通知】开始阈值,每日通知用户',
+            'f2fpay_app_id'                 => '即:APPID',
+            'f2fpay_private_key'            => '生成秘钥软件生成时,产生的应用秘钥',
+            'f2fpay_public_key'             => '注意不是应用公钥!',
+            'forbid_mode'                   => '依据IP对对应地区进行阻拦,非阻拦地区可正常访问',
+            'invite_num'                    => '用户可以生成的邀请码数',
+            'is_activate_account'           => '启用后用户需要通过邮件来激活账号',
+            'is_AliPay',
+            'is_ban_status'                 => '(慎重)封禁整个账号会重置账号的所有数据且会导致用户无法登录,不开启状态下只封禁用户代理',
+            'is_captcha'                    => '启用后 登录/注册 需要进行验证码认证',
+            'is_checkin'                    => '登录时将根据流量范围随机得到流量',
+            'is_clear_log'                  => '(推荐)启用后自动清除无用日志',
+            'is_custom_subscribe'           => '启用后,订阅信息顶部将显示过期时间、剩余流量(只支持个别客户端)',
+            'is_email_filtering'            => '黑名单: 用户可使用任意黑名单外的邮箱注册;白名单:用户只能选择使用白名单中的邮箱后缀注册',
+            'is_forbid_robot'               => '如果是机器人、爬虫、代理访问网站则会抛出404错误',
+            'is_free_code'                  => '关闭后免费邀请码不可见',
+            'is_invite_register',
+            'is_otherPay',
+            'is_push_bear',
+            'is_QQPay',
+            'is_rand_port'                  => '注册、添加用户时随机生成端口',
+            'is_register'                   => '关闭后无法注册',
+            'is_subscribe_ban'              => '启用后用户订阅链接请求超过设定阈值则自动封禁',
+            'is_traffic_ban'                => '1小时内流量超过异常阈值则自动封号(仅禁用代理)',
+            'is_WeChatPay',
+            'iYuu_token'                    => '启用爱语飞飞,请务必填入本值(<a href=http://iyuu.cn target=_blank>申请 IYUU令牌</a>)',
+            'maintenance_content'           => '自定义维护内容信息',
+            'maintenance_mode'              => "启用后,用户访问转移至维护界面 | 管理员使用 <a href='javascript:(0)'>:url</a> 登录",
+            'maintenance_time'              => '用于维护界面倒计时',
+            'max_port',
+            'max_rand_traffic',
+            'min_port'                      => '端口范围:1000 - 65535',
+            'min_rand_traffic',
+            'node_blocked_notification'     => '每小时检测节点是否被阻断并提醒管理员',
+            'node_daily_notification'       => '报告各节点流量昨日消耗情况',
+            'node_offline_notification'     => '每10分钟检测节点离线并提醒管理员',
+            'oauth_path'                    => '请在.ENV中添加设置,再在此处开启平台',
+            'offline_check_times'           => '24小时内提醒n次后不再提醒',
+            'password_reset_notification'   => '启用后用户可以重置密码',
+            'paybeaver_app_id'              => '<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -> 开发者 -> App ID',
+            'paybeaver_app_secret'          => '<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -> 开发者 -> App Secret',
+            'payjs_key',
+            'payjs_mch_id'                  => '在<a href="https://payjs.cn/dashboard/member" target="_blank">本界面</a>获取信息',
+            'payment_confirm_notification'  => '用户使用人工支付后通知管理员处理订单',
+            'payment_received_notification' => '用户支付订单后通知用户订单状态',
+            'paypal_app_id',
+            'paypal_certificate',
+            'paypal_password',
+            'paypal_secret',
+            'paypal_username',
+            'pushDeer_key'                  => '启用PushDeer,请务必填入本值(<a href=http://www.pushdeer.com/official.html
+                                    target=_blank>申请 Push Key</a>)',
+            'pushplus_token'                => '启用PushPlus,请务必填入本值(<a href=https://www.pushplus.plus/push1.html target=_blank>申请 Token</a>)',
+            'rand_subscribe'                => '启用后,订阅时将随机返回节点信息,否则按节点排序返回',
+            'redirect_url'                  => '触发审计规则时访问请求被阻断并重定向至该地址',
+            'referral_money'                => '满多少元才可以申请提现',
+            'referral_percent'              => '根据推广链接注册的账号每笔消费推广人可以分成的比例',
+            'referral_status'               => '关闭后用户不可见,但是不影响其正常邀请返利',
+            'referral_traffic'              => '根据推广链接、邀请码注册则赠送相应的流量',
+            'referral_type'                 => '切换模式后旧数据不变,新的返利按新的模式计算',
+            'register_ip_limit'             => '同IP在24小时内允许注册数量,为0/留空时不限制',
+            'reset_password_times'          => '24小时内可以通过邮件重置密码次数',
+            'reset_traffic'                 => '用户会按其购买套餐的日期自动重置可用流量',
+            'server_chan_key'               => "启用ServerChan,请务必填入本值(<a href=https://sc.ftqq.com target=_blank>申请 SCKEY</a>)",
+            'standard_currency'             => '网站中涉及金钱部分的默认货币',
+            'stripe_public_key',
+            'stripe_secret_key',
+            'stripe_signing_secret',
+            'subject_name'                  => '用于在支付渠道的商品标题显示',
+            'subscribe_ban_times'           => '24小时内订阅链接请求次数限制',
+            'subscribe_domain'              => '(推荐)防止面板域名被DNS投毒后无法正常订阅,需带http://或https://"',
+            'subscribe_max'                 => '客户端订阅时取得几个节点,为0/留空时返回全部节点',
+            'telegram_token'                => '找 <a href=https://t.me/BotFather target=_blank>@BotFather</a> 申请机器人获取TOKEN',
+            'tg_chat_token'                 => '启用TG酱,请务必填入本值(<a href=https://t.me/realtgchat_bot target=_blank>申请 Token</a>)',
+            'theadpay_key',
+            'theadpay_mchid',
+            'theadpay_url',
+            'ticket_closed_notification'    => '工单关闭通知用户',
+            'ticket_created_notification'   => '新工单通知管理/用户,取决于谁创建了新工单',
+            'ticket_replied_notification'   => '工单回复通知对方',
+            'traffic_ban_time'              => '触发流量异常导致用户被封禁的时长,到期后自动解封',
+            'traffic_ban_value'             => '1小时内超过该值,则触发自动封号',
+            'traffic_limit_time'            => '间隔多久才可以再次签到',
+            'traffic_warning_percent'       => '【流量耗尽通知】开始阈值,每日通知用户',
+            'trojan_license',
+            'username_type'                 => '规范站点用户账号的类型,默认为电子邮箱',
+            'user_invite_days'              => '用户自行生成邀请的有效期',
+            'v2ray_license',
+            'v2ray_tls_provider'            => '后端自动签发/载入TLS证书时用(节点的设置值优先级高于此处)',
+            'webmaster_email'               => '错误提示时会提供管理员邮箱作为联系方式',
+            'website_analytics'             => '统计JS',
+            'website_callback_url'          => '防止因为网站域名被DNS投毒后导致支付无法正常回调,需带http://或https://',
+            'website_customer_service'      => '客服JS',
+            'website_home_logo',
+            'website_logo',
+            'website_name'                  => '发邮件时展示',
+            'website_security_code'         => '非空时必须通过<a href=":url" target="_blank">安全入口</a>加上安全码才可访问',
+            'website_url'                   => '生成重置密码、在线支付必备',
+            'web_api_url'                   => '例:https://demo.proxypanel.cf',
+            'wechat_aid'                    => '在<a href=https://work.weixin.qq.com/wework_admin/frame#apps arget=_blank>应用管理</a>自建中创建应用 - AgentId',
+            'wechat_cid'                    => '获取<a href=https://work.weixin.qq.com/wework_admin/frame#profile target=_blank>我的企业</a>中的企业ID',
+            'wechat_encodingAESKey'         => '应用管理->应用->设置API接收->EncodingAESKey',
+            'wechat_qrcode',
+            'wechat_secret'                 => '应用的Secret(可能需要下载企业微信才能查看)',
+            'wechat_token'                  => '应用管理->应用->设置API接收->TOKEN,URL设置::url',
+        ],
+        'placeholder'    => [
+            'default_url'           => '默认为 :url',
+            'server_chan_key'       => '填入ServerChan的SCKEY->再点击更新',
+            'pushDeer_key'          => '填入PushDeer的Push Key -> 再点击更新',
+            'iYuu_token'            => '填入爱语飞飞的IYUU令牌 -> 再点击更新',
+            'bark_key'              => '填入Bark的设备号 -> 再点击更新',
+            'telegram_token'        => '填入Telegram的 Token -> 再点击更新',
+            'pushplus_token'        => '请到ServerChan申请',
+            'dingTalk_access_token' => '自定义机器人的WebHook中的access_token',
+            'dingTalk_secret'       => '自定义机器人加签后出现的的密钥',
+            'wechat_aid'            => '应用的AgentId',
+            'wechat_cid'            => '填入微信企业ID -> 再点击更新',
+            'wechat_secret'         => '应用的Secret',
+            'tg_chat_token'         => '请到Telegram申请',
+            'codepay_url'           => 'https://codepay.fateqq.com/creat_order/?',
+        ],
+        'payment'        => [
+            'attribute' => '支付设置',
+            'channel'   => [
+                'alipay'    => '支付宝F2F',
+                'codepay'   => '码支付',
+                'epay'      => '易支付',
+                'payjs'     => 'PayJs',
+                'paypal'    => 'PayPal',
+                'stripe'    => 'Stripe',
+                'paybeaver' => '海狸支付',
+                'theadpay'  => '平头哥支付',
+                'manual'    => '人工支付',
+            ],
+            'hint'      => [
+                'alipay'    => '本功能需要<a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">蚂蚁金服开放平台</a>申请权限及应用',
+                'codepay'   => '请到 <a href="https://codepay.fateqq.com/i/377289" target="_blank">码支付</a>申请账号,然后下载登录其挂机软件',
+                'payjs'     => '请到<a href="https://payjs.cn/ref/zgxjnb" target="_blank">PayJs</a> 申请账号',
+                'paypal'    => '使用商家账号登录<a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">API凭证申请页</a>, 同意并获取设置信息',
+                'paybeaver' => '请到<a href="https://merchant.paybeaver.com/?aff_code=iK4GNuX8" target="_blank">海狸支付 PayBeaver</a>申请账号',
+                'theadpay'  => '请到<a href="https://theadpay.com/" target="_blank">平头哥支付 THeadPay</a>申请账号',
+                'manual'    => '设置后会自动开启对应显示',
+            ],
+        ],
+        'notification'   => [
+            'channel' => [
+                'telegram'   => 'TG电报',
+                'wechat'     => '微信企业',
+                'dingtalk'   => '钉钉',
+                'email'      => '이메일',
+                'bark'       => 'Bark',
+                'serverchan' => 'ServerChan',
+                'pushdeer'   => 'PushDeer',
+                'pushplus'   => 'PushPlus',
+                'iyuu'       => '爱语飞飞',
+                'tg_chat'    => 'TG酱',
+                'site'       => '站内通知',
+            ],
+        ],
+        'forbid'         => [
+            'mainland' => '阻拦大陆',
+            'china'    => '阻拦中国',
+            'oversea'  => '阻拦海外',
+        ],
+        'username'       => [
+            'email'  => '电子邮箱',
+            'mobile' => '手机号码',
+            'any'    => '任意用户名',
+        ],
+        'active_account' => [
+            'before' => '注册前激活',
+            'after'  => '注册后激活',
+        ],
+        'ddns'           => [
+            'namesilo'   => 'Namesilo',
+            'aliyun'     => '阿里云(国际&国内)',
+            'dnspod'     => 'DNSPod',
+            'cloudflare' => 'CloudFlare',
+        ],
+        'captcha'        => [
+            'standard'  => '普通验证码',
+            'geetest'   => '极 验',
+            'recaptcha' => 'Google reCaptcha',
+            'hcaptcha'  => 'hCaptcha',
+        ],
+        'referral'       => [
+            'once' => '首购返利',
+            'loop' => '循环返利',
+        ],
+    ],
+    'set_to'              => '置 :attribute',
+    'minute'              => '分钟',
+    'query'               => '查 询',
+    'optional'            => '옵션',
+    'require'             => '必须',
+];

+ 84 - 0
resources/lang/ko/auth.php

@@ -0,0 +1,84 @@
+<?php
+
+return [
+    'accept_term'     => '약관을 확인하였으며, 이에 동의합니다.',
+    'active'          => [
+        'attribute' => '활성화',
+        'error'     => [
+            'activated' => '계정이 이미 활성화 되어있습니다. 다시 활성화할 필요가 없습니다.',
+            'disable'   => '이 사이트는 계정 활성화 시스템을 사용하지 않습니다. 사이트로 가서 로그인 해주세요!',
+            'throttle'  => '회원님의 비정상적인 행동이 감지되었습니다. 조작에 주의부탁드립니다! 문제가 있을 경우 이메일로 연락주세요.',
+        ],
+        'sent'      => '활성화코드가 이미 회원님의 이메일로 전송되었습니다. 잠시 후에 메일 확인이 안 될 경우, 휴지통이나 스팸차단을 확인해주세요.',
+        'promotion' => ['0' => '계정이 비활성화 되었습니다. 클릭해주세요', '1' => '활성화 시스템을 가동합니다!'],
+    ],
+    'aup'             => '수용가능한 이용약관',
+    'captcha'         => [
+        'attribute' => '인증번호',
+        'error'     => ['failed' => '인증번호 확인 실패, 다시 입력해주세요.', 'timeout' => '인증번호가 올바르지 않습니다! 제한시간이 지났거나 새로고침하여 다시 시도해주세요.'],
+        'required'  => '인증번호를 정확하게 입력해주세요.',
+        'sent'      => '인증번호가 메일로 전송되었습니다. 잠시 후에 도착하지 않을 경우 휴지통이나 스팸차단을 확인해주세요',
+    ],
+    'email'           => [
+        'error' => ['banned' => '사이트에서 고객님이 사용하시는 이메일을 차단하였습니다. 다른 유효한 이메일을 사용해주세요.', 'invalid' => '지원하지 않는 이메일 형식입니다.'],
+    ],
+    'error'           => [
+        'account_baned'  => '회원님의 계정은 차단되었습니다!',
+        'login_error'    => '로그인 오류, 잠시 후 다시 시도해주세요!',
+        'login_failed'   => '로그인 실패, 이메일계정과 비밀번호를 정확하게 입력해주세요!',
+        'not_found_user' => '해당 계정을 찾을 수 없습니다. 다른 방식으로 로그인해주세요.',
+        'repeat_request' => '새로 고침 후 다시 시도해 주시기 바랍니다.',
+        'url_timeout'    => '연결 실패, 다시 시도해주세요.',
+    ],
+    'invite'          => [
+        'attribute'    => '초대 코드',
+        'error'        => ['unavailable' => '초대코드 사용불가. 다시 시도해주세요.'],
+        'get'          => '초대 코드를 받기',
+        'not_required' => '초대 코드없이 회원가입을 진행해주세요!',
+    ],
+    'login'           => '로그인',
+    'logout'          => '로그아웃',
+    'maintenance'     => '보호',
+    'maintenance_tip' => '사이트 점검 중',
+    'oauth'           => [
+        'bind_success'    => '연동 성공',
+        'bind_failed'     => '연동 실패',
+        'login_failed'    => '중복 접속 실패!',
+        'register'        => '회원가입 바로가기',
+        'registered'      => '이미 가입되셨습니다, 로그인 해주세요.',
+        'register_failed' => '회원가입 실패',
+        'rebind_success'  => '재연동 성공',
+        'unbind_success'  => '연동 해제 성공',
+        'unbind_failed'   => '연동 해제 실패',
+    ],
+    'optional'        => '옵션',
+    'password'        => [
+        'forget'   => '비밀번호를 잊으셨나요?',
+        'new'      => '새로운 비밀번호를 입력하세요',
+        'original' => '이전 비밀번호',
+        'reset'    => [
+            'attribute' => '비밀번호 재설정',
+            'error'     => [
+                'disabled' => '현재 비밀번호 재설정이 불가합니다. 다음 이메일로 연락 주세요: email',
+                'failed'   => '비밀번호 재설정 실패',
+                'throttle' => '24시간 이내 비밀번호 재설정 : time 회만 가능, 잦은 시도를 하지 마십시오.',
+                'same'     => '새 비밀번호는 기존 비밀번호와 같을 수 없습니다, 다시 입력해주세요.',
+                'wrong'    => '이진 비밀번호 오류, 다시 입력해주세요.',
+                'demo'     => '관리자 페이지 비밀번호 변경 금지',
+            ],
+            'sent'      => '재설정 성공, 모든 이메일을 확인해주세요. (없을 경우 스팸메일 확인)',
+            'success'   => '새 비밀번호 설정 성공,  로그인 페이지로 가십시오.',
+        ],
+    ],
+    'register'        => [
+        'attribute' => '회원가입',
+        'code'      => '회원가입 인증번호',
+        'error'     => ['disable' => '죄송합니다. 현재 회원가입이 불가합니다.', 'throttle' => '防刷机制已激活,请勿频繁注册'],
+        'promotion' => '아직 계정이 없으신가요?',
+        'failed'    => '회원가입 실패, 잠시 후 다시 시도해주세요.',
+        'success'   => '회원가입 성공',
+    ],
+    'remember_me'     => '로그인 상태 유지',
+    'request'         => '획득',
+    'tos'             => '이용 약관',
+];

+ 144 - 0
resources/lang/ko/common.php

@@ -0,0 +1,144 @@
+<?php
+
+return [
+    'account'         => '아이디',
+    'available_date'  => '유효기간',
+    'created_at'      => '创建时间',
+    'expired_at'      => '만료시간',
+    'updated_at'      => '갱신시간',
+    'latest_at'       => '最近时间',
+    'back'            => '뒤로가기',
+    'cancel'          => '취소',
+    'close'           => '닫기',
+    'close_item'      => '닫기:attribute',
+    'confirm'         => '확인',
+    'continues'       => '계속',
+    'open'            => '열기',
+    'send'            => '전송',
+    'view'            => '보기',
+    'reset'           => '재설정',
+    'copy'            => [
+        'attribute' => '복사',
+        'success'   => '복사 성공',
+        'failed'    => '복사 실패, 수동으로 복사해주세요.',
+    ],
+    'add'             => '添 加',
+    'free'            => '무료',
+    'replace'         => '변경',
+    'submit'          => '제출',
+    'submit_item'     => '제출:attribute',
+    'generate'        => '생성',
+    'generate_item'   => '생성:attribute',
+    'to_safari'       => [0 => '이용자약관', 1 => ', 여기서 선택해주세요.', 2 => 'Safari 로 열어주세요.', 3 => '정상적으로 본 사이트에 접속이 가능합니다.'],
+    'update_browser'  => [0 => '고객님은 현재 사용 중', 1 => '만료', 2 => '의 부라우저.', 3 => '브라우저를 업데이트 해주세요.', 4 => '최고 환경에서의 웹서핑을 느끼기 위해'],
+    'apply'           => '응용',
+    'avatar'          => '프로필',
+    'customize'       => '사용자 정의',
+    'all'             => '전체',
+    'default'         => '기본값',
+    'download'        => '下 载',
+    'goto'            => '이전',
+    'warning'         => '경고',
+    'success'         => '성공',
+    'failed'          => '실패',
+    'update'          => '갱신',
+    'update_action'   => '갱신:action',
+    'none'            => '없음',
+    'new'             => '신규',
+    'sorry'           => '죄송합니다',
+    'applied'         => ':attribute 발생',
+    'active_item'     => ':attribute 활성화',
+    'error'           => '错误',
+    'toggle'          => '切 换',
+    'toggle_action'   => '切换:action',
+    'request_url'     => '请求地址',
+    'function'        => [
+        'navigation' => '导航',
+        'menubar'    => '菜单栏',
+        'fullscreen' => '全屏',
+    ],
+    'days'            => [
+        'sun'     => '周日',
+        'mon'     => '周一',
+        'tue'     => '周二',
+        'wed'     => '周三',
+        'thu'     => '周四',
+        'fri'     => '周五',
+        'sat'     => '周六',
+        'weekend' => '周末',
+        'work'    => '工作日',
+        'next'    => '次日',
+    ],
+    'qrcode'          => ':attribute二维码',
+    'deleted'         => '已删除',
+    'deleted_item'    => ':attribute已删除',
+    'print'           => '打印',
+    'unlimited'       => '无限制',
+    'payment'         => [
+        'credit' => '余额',
+        'wechat' => '微信',
+        'alipay' => '支付宝',
+        'crypto' => '虚拟货币',
+        'manual' => '人工支付',
+        'status' => [
+            'wait'    => '待支付',
+            'fail'    => '支付失败',
+            'success' => '支付成功',
+        ],
+    ],
+    'order'           => [
+        'status' => [
+            'cancel'   => '취소',
+            'complete' => '완성',
+            'prepaid'  => '선불 결제',
+            'ongoing'  => '사용 중',
+            'review'   => '확인 대기 중',
+        ],
+    ],
+    'recommend'       => '推荐',
+    'advance'         => '进阶',
+    'action'          => '操作',
+    'search'          => '搜 索',
+    'edit'            => '编 辑',
+    'delete'          => '删 除',
+    'status'          => [
+        'attribute'         => '状态',
+        'inactive'          => '未激活',
+        'disabled'          => '停 用',
+        'banned'            => '禁 用',
+        'normal'            => '正 常',
+        'enabled'           => '启 用',
+        'expire'            => '过 期',
+        'limited'           => '限 制',
+        'run_out'           => '流量耗尽',
+        'unused'            => '사용하지 않음',
+        'used'              => '이미 사용중',
+        'closed'            => '닫기',
+        'applying'          => '신청 중',
+        'withdrawn'         => '인출함',
+        'unwithdrawn'       => '인출 하지 않음',
+        'reply'             => '답변됨',
+        'pending'           => '대기 중',
+        'unknown'           => '未 知',
+        'available'         => '生效中',
+        'reject'            => '驳 回',
+        'rejected'          => '已驳回',
+        'review'            => '待审核',
+        'reviewed'          => '审核通过待打款',
+        'paid'              => '已打款',
+        'payment_pending'   => '待打款',
+        'pass'              => '通 过',
+        'send_to_credit'    => '打款至余额',
+        'waiting_tobe_send' => '等待投递',
+    ],
+    'stay_unchanged'  => '留空为不变',
+    'random_generate' => '留空则随机生成',
+    'request_failed'  => '请求错误,请重试',
+    'convert'         => '转 换',
+    'import'          => '导 入',
+    'or'              => '或',
+    'more'            => '더 보기',
+    'to'              => '至',
+    'to_be_send'      => '待发送',
+    'developing'      => '开发中!敬请期待',
+];

+ 36 - 0
resources/lang/ko/errors.php

@@ -0,0 +1,36 @@
+<?php
+
+return [
+    'forbidden'    => [
+        'access'  => '알 수 없는 IP 혹은 프록시를 통해 방문하여 접근을 금지합니다.',
+        'bots'    => '비정상적인 로봇 접근 감지, 접근을 금지합니다.',
+        'china'   => '중국IP 혹은 프록시 접근 감지, 접근을 금지합니다.',
+        'oversea' => '해외 IP 감지, 접근을 금지합니다.',
+    ],
+    'http'         => 'HTTP请求类型错误',
+    'log'          => '로그',
+    'missing_page' => '페이지를 찾을 수 없습니다.',
+    'refresh'      => '새로고침',
+    'refresh_page' => '페이즈를 새로고침 후, 다시 방문해주세요.',
+    'report'       => '错❌误携带了报告:',
+    'safe_enter'   => '정상적인 접근',
+    'safe_code'    => '보안코드를 입력해주세요.',
+    'system'       => '시스템 오류',
+    'title'        => '⚠️오류발생',
+    'unauthorized' => '접근 허가 없음',
+    'unsafe_enter' => '비정상적인 접근',
+    'visit'        => '방문해주세요.',
+    'whoops'       => '!!!',
+    'get_ip'       => 'IP 오류정보 불러오기',
+    'subscribe'    => [
+        'unknown'      => '링크 사용 오류! 다시 불러오세요!',
+        'sub_baned'    => '링크 사용 불가능, 홈페이지를 방문하여 원인을 확인하세요.',
+        'user'         => '잘못된 링크, 계정이 존재하지 않습니다! 링크를 다시 불러오세요.',
+        'user_disable' => '계정이 차단되었습니다!',
+        'baned_until'  => '계정 차단 시간 :time, 차단 해지 후 다시 갱신하세요!',
+        'out'          => '데이터 소진! 데이터를 다시 구매 하시거나 초기화 해주세요!',
+        'expired'      => '계정 만료! 기간을 연장해주세요!',
+        'question'     => '계정에 문제가 있습니다. 문의 바랍니다.',
+        'none'         => '사용 가능한 서버가 없습니다.',
+    ],
+];

+ 239 - 0
resources/lang/ko/model.php

@@ -0,0 +1,239 @@
+<?php
+
+return [
+    'user'             => [
+        'id'             => '用户ID',
+        'attribute'      => '用户',
+        'nickname'       => '닉네임',
+        'username'       => '아이디',
+        'password'       => '비밀번호',
+        'credit'         => '余额',
+        'invite_num'     => '可用邀请码',
+        'reset_date'     => '重置日',
+        'port'           => '端口',
+        'traffic_used'   => '流量使用',
+        'service'        => '代理',
+        'group'          => '分组',
+        'level'          => '等级',
+        'account_status' => '계정 상태',
+        'proxy_status'   => '代理状态',
+        'expired_date'   => '过期日',
+        'role'           => '角色权限',
+        'wechat'         => '微信',
+        'qq'             => 'QQ',
+        'remark'         => '备注',
+        'uuid'           => 'VMess UUID',
+        'proxy_passwd'   => '비밀번호',
+        'proxy_method'   => '加密方式',
+        'usable_traffic' => '可用流量',
+        'proxy_protocol' => '协议',
+        'proxy_obfs'     => '混淆',
+        'speed_limit'    => '用户限速',
+        'inviter'        => '邀请人',
+        'created_date'   => '회원가입 시간',
+    ],
+    'common'           => [
+        'extend'      => '扩展',
+        'sort'        => '排序',
+        'description' => '표시',
+    ],
+    'country'          => [
+        'code' => 'ISO国家代码',
+        'icon' => '图 标',
+        'name' => '国家/地区名称',
+    ],
+    'subscribe'        => [
+        'code'       => '订阅码',
+        'req_times'  => '请求次数',
+        'updated_at' => '最后请求时间',
+        'ban_time'   => '封禁时间',
+        'ban_desc'   => '封禁理由',
+        'req_ip'     => '请求IP',
+        'req_header' => '访问',
+    ],
+    'oauth'            => [
+        'type'       => '渠道',
+        'identifier' => ' 唯一标识',
+    ],
+    'user_group'       => [
+        'attribute' => '用戶分组',
+        'name'      => '分组名称',
+        'nodes'     => '选择节点',
+    ],
+    'node'             => [
+        'attribute'       => '节点',
+        'id'              => '节点ID',
+        'type'            => '类型',
+        'name'            => '이름',
+        'domain'          => '域名',
+        'static'          => '存活',
+        'online_user'     => '在线',
+        'data_consume'    => '产生流量',
+        'data_rate'       => '流量比例',
+        'ddns'            => 'DDNS',
+        'ipv4'            => 'IPv4地址',
+        'ipv6'            => 'IPv6地址',
+        'push_port'       => '消息推送端口',
+        'level'           => '等级',
+        'rule_group'      => '审计分组',
+        'traffic_limit'   => '节点限速',
+        'client_limit'    => '设备数限制',
+        'label'           => '标签',
+        'country'         => '国家/地区',
+        'udp'             => 'UDP',
+        'display'         => '显示 与 订阅',
+        'detection'       => '节点阻断检测',
+        'method'          => '加密方式',
+        'protocol'        => '协议',
+        'protocol_param'  => '协议参数',
+        'obfs'            => '混淆',
+        'obfs_param'      => '混淆参数',
+        'single'          => '单端口',
+        'transfer'        => '中 转',
+        'service_port'    => '服务端口',
+        'single_passwd'   => '[单] 密码',
+        'v2_alter_id'     => '额外ID',
+        'v2_net'          => '传输方式',
+        'v2_cover'        => '伪装类型',
+        'v2_host'         => '伪装域名',
+        'v2_path'         => '路径 | 密钥',
+        'v2_sni'          => 'SNI',
+        'v2_tls'          => '连接TLS',
+        'v2_tls_provider' => 'TLS配置',
+        'relay_port'      => '中转端口',
+    ],
+    'node_auth'        => [
+        'attribute' => '节点授权',
+        'key'       => '通信密钥<small>节点用</small>',
+        'secret'    => '反向通信密钥',
+    ],
+    'node_cert'        => [
+        'attribute'    => '域名证书',
+        'domain'       => '域名',
+        'key'          => 'KEY',
+        'pem'          => 'PEM',
+        'issuer'       => '签发机构',
+        'signed_date'  => '签发日期',
+        'expired_date' => '만료시간',
+    ],
+    'order'            => [
+        'attribute'      => '주문서',
+        'id'             => '订单ID',
+        'original_price' => '原价',
+        'price'          => '实价',
+        'pay_way'        => '결제 방식',
+        'status'         => '订单状态',
+    ],
+    'goods'            => [
+        'attribute'      => '商品',
+        'type'           => '类型',
+        'name'           => '이름',
+        'price'          => '售价',
+        'category'       => '分类',
+        'level'          => '等级',
+        'renew'          => '流量重置价格',
+        'user_limit'     => '用户限速',
+        'period'         => '重置周期',
+        'traffic'        => '流量额度',
+        'invite_num'     => '赠送邀请码数量',
+        'limit_num'      => '限购数量',
+        'available_date' => '유효기간',
+        'hot'            => '热销',
+        'color'          => '颜色',
+        'logo'           => '商品图片',
+        'info'           => '自定义列表',
+    ],
+    'rule'             => [
+        'attribute' => '规则',
+        'type'      => '类型',
+        'name'      => '표시',
+        'pattern'   => '值',
+    ],
+    'rule_group'       => [
+        'attribute' => '规则分组',
+        'name'      => '分组名称',
+        'type'      => '审计模式',
+        'rules'     => '选择规则',
+    ],
+    'role'             => [
+        'attribute'   => '角色',
+        'name'        => '이름',
+        'permissions' => '权限',
+    ],
+    'permission'       => [
+        'attribute'   => '权限行为',
+        'description' => '行为描述',
+        'name'        => '路由名称',
+    ],
+    'article'          => [
+        'attribute'  => '文章',
+        'type'       => '类 型',
+        'category'   => '类 别',
+        'language'   => '语 言',
+        'logo'       => '头 图',
+        'created_at' => '发布日期',
+        'updated_at' => '最后更新',
+    ],
+    'coupon'           => [
+        'attribute'          => '卡券',
+        'name'               => '卡券名称',
+        'sn'                 => '使用券码',
+        'logo'               => '卡券图片',
+        'type'               => '类型',
+        'value'              => '优惠额度',
+        'priority'           => '权 重',
+        'usable_times'       => '使用次数',
+        'minimum'            => '满减条件',
+        'used'               => '个人限用',
+        'levels'             => '等级限定',
+        'groups'             => '分组限定',
+        'users_whitelist'    => '专属用户',
+        'users_blacklist'    => '禁用用户',
+        'services_whitelist' => '许可商品',
+        'services_blacklist' => '禁用商品',
+        'newbie'             => '新人专属',
+        'num'                => '수량',
+    ],
+    'aff'              => [
+        'invitee'    => '소비자',
+        'order_id'   => '주문 번호',
+        'amount'     => '소비금액',
+        'commission' => '반려금액',
+        'updated_at' => '处理时间',
+        'created_at' => '下单时间',
+    ],
+    'referral'         => [
+        'created_at' => '申请时间',
+        'user'       => '申请账号',
+        'amount'     => '申请提现金额',
+        'id'         => '申请单ID',
+    ],
+    'notification'     => [
+        'type'       => '类型',
+        'address'    => '收信地址',
+        'created_at' => '投递时间',
+        'status'     => '投递状态',
+    ],
+    'ip'               => [
+        'network_type' => '通讯类型',
+        'info'         => '归属地',
+    ],
+    'user_traffic'     => [
+        'upload'   => '上传流量',
+        'download' => '下载流量',
+        'total'    => '总流量',
+        'log_time' => '记录时间',
+    ],
+    'user_data_modify' => [
+        'before'      => '变动前流量',
+        'after'       => '变动后流量',
+        'description' => '표시',
+        'created_at'  => '发生时间',
+    ],
+    'user_credit'      => [
+        'before'     => '操作前余额',
+        'after'      => '操作后金额',
+        'amount'     => '发生金额',
+        'created_at' => '发生时间',
+    ],
+];

+ 35 - 0
resources/lang/ko/notification.php

@@ -0,0 +1,35 @@
+<?php
+
+return [
+    'attribute'               => '공지',
+    'new'                     => ':num 새로운 소식',
+    'empty'                   => '새 소식을 받지 못하였습니다.',
+    'payment_received'        => '订单支付成功,金额::amount,查看详情',
+    'account_expired'         => '계정 만료 알림',
+    'account_expired_content' => '고객님의 계정은 【:days】 일 후 만료됩니다, 서비스를 계속 정상적으로 이용하시려면, 기간을 연장해주세요.',
+    'account_expired_blade'   => '계정이 【:days天】 후 만료될 예정이오니, 기간을 연장해주세요.',
+    'active_email'            => '30분 이내에 설정을 완료해주세요.',
+    'close_ticket'            => '문의 【:id】:title 닫기',
+    'view_web'                => '홈페이지 접속',
+    'view_ticket'             => '문의 보기',
+    'new_ticket'              => '새 문의 수령 :title',
+    'reply_ticket'            => '문의 답변 :title',
+    'ticket_content'          => '문의내용',
+    'node_block'              => '서버 차단 경고',
+    'node_offline'            => '서버 오프라인 경고',
+    'node_offline_content'    => '다음 서버에 문제가 있습니다: 신호 없음, 서버 오프라인 확인:',
+    'block_report'            => '차단 로그',
+    'traffic_warning'         => '데이터 알림',
+    'traffic_remain'          => '데이터 percent% 사용함, 주의하세요.',
+    'traffic_tips'            => '요금제의 데이터 초기화 날짜에 주의하여 데이터를 적절하게 할당하여 사용하거나, 데이터 소진 후 요금제를 유료로 초기화하여 사용하세요.',
+    'verification_account'    => '계정 인증',
+    'verification'            => '인증번호:',
+    'verification_limit'      => ':minutes 분 안에 인증을 완료해주세요.',
+    'data_anomaly'            => '데이터 용량 이상! 사용자 알림!',
+    'data_anomaly_content'    => '사용자:id:최근 1시간 [업로드::upload | 다운로드::download | 합계::total]',
+    'node'                    => [
+        'upload'   => '업로드',
+        'download' => '다운로드',
+        'total'    => '종합',
+    ],
+];

+ 219 - 0
resources/lang/ko/user.php

@@ -0,0 +1,219 @@
+<?php
+
+return [
+    'account'             => [
+        'credit'           => '계정 잔고',
+        'status'           => '계정 상태',
+        'level'            => '계정 등급',
+        'group'            => '소속 그룹',
+        'speed_limit'      => '속도 제한',
+        'remain'           => '잔여 데이터',
+        'time'             => '요금제 기간',
+        'last_login'       => '최근 접속',
+        'reset'            => '{0} 还有 <code id="restTime">:days</code> 重置流量|[1,*] 还有 :days 天重置流量',
+        'connect_password' => '비밀번호 연결',
+        'reason'           => [
+            'normal'            => '계정이 정상입니다.',
+            'expired'           => '고객님 요금제 상품이 만료되었습니다.',
+            'overused'          => '本时段使用流量超过 <code>:data</code> GB触发系统限制<br/> <code id="banedTime">:min</code> 后解除限制',
+            'traffic_exhausted' => '고객님의 [데이터] 가 소진되었습니다.',
+            'unknown'           => '未知原因,请尝试[刷新]你的浏览器!多次无果后再请开工单联系管理',
+        ],
+    ],
+    'home'                => [
+        'attendance'         => [
+            'attribute' => '출첵',
+            'disable'   => '출첵 기능이 활성화되지 않았습니다.',
+            'done'      => '출첵완료, 내일도 방문해주세요!',
+            'success'   => '고객님은 :data 용량을 받았습니다.',
+            'failed'    => '시스템 이상',
+        ],
+        'traffic_logs'       => '용량 기록',
+        'announcement'       => '공지',
+        'wechat_push'        => '위챗 공지 발송',
+        'chat_group'         => '단톡방',
+        'empty_announcement' => '공지 없음',
+    ],
+    'purchase_to_unlock'  => '서비스 구매 후 잠금 해제',
+    'purchase_required'   => '해당 기능은 유료 구매자에게만 제공됩니다!',
+    'more'                => '더 보기',
+    'attribute'           => [
+        'node'    => '회선',
+        'data'    => '용량',
+        'ip'      => 'IP 주소',
+        'isp'     => '사업자',
+        'address' => '지역',
+    ],
+    'purchase_promotion'  => '서둘러 서비스를 구매하세요!',
+    'menu'                => [
+        'helps'           => '도움',
+        'home'            => '메인페이지',
+        'invites'         => '초대',
+        'invoices'        => '주문',
+        'nodes'           => '회선',
+        'referrals'       => '홍보',
+        'shop'            => '서비스',
+        'profile'         => '설정',
+        'tickets'         => '문의',
+        'admin_dashboard' => '관리',
+    ],
+    'contact'             => '연락처 정보',
+    'oauth'               => [
+        'bind_title' => '소셜 계정 연동',
+        'not_bind'   => '연동되지않음',
+        'bind'       => '연동',
+        'rebind'     => '재연동',
+        'unbind'     => '연동 해제',
+    ],
+    'coupon'              => [
+        'attribute' => '할인쿠폰',
+        'voucher'   => '상품권',
+        'recharge'  => '충전권',
+        'discount'  => '할인',
+        'error'     => [
+            'unknown'  => '유효하지 않은 쿠폰',
+            'used'     => '이미 사용된 쿠폰',
+            'expired'  => '쿠폰이 만료됨',
+            'run_out'  => '쿠폰 소진',
+            'inactive' => '쿠폰이 적용되지 않음',
+            'wait'     => ':time  에 활성화 됩니다. 기다려주세요!',
+            'unmet'    => '사용 조건 불충족',
+            'minimum'  => '本券最低使用金额为 :amount',
+            'overused' => '本券只能使用 :times 次',
+            'users'    => '账户不符合促销条件',
+            'services' => '商品不符合折扣条件,请查看促销条款',
+        ],
+    ],
+    'error_response'      => '오류가 발생했습니다. 나중에 시도하십시오.',
+    'invite'              => [
+        'attribute'       => '초대 코드',
+        'counts'          => '共 <code>:num</code> 个邀请码',
+        'tips'            => '< strong >: num < / strong > 초대장 코드를 생성할 수 있습니다.: days일 동안 유효합니다.',
+        'logs'            => '초대 기록',
+        'promotion'       => '당신의 초대 코드를 통해 등록하고 활성화하면, 양쪽 모두 <mark>:traffic</mark> 데이터 사용 인센티브를 받게 됩니다. 그들이 소비할 때, 당신은 그들의 소비 금액 <mark>:referral_percent%</mark>을 보상으로 받습니다.',
+        'generate_failed' => '생성 실패: 초대코드 생성 불가',
+    ],
+    'reset_data'          => [
+        ''          => '데이터 재설정',
+        'required'  => '필요',
+        'cost_tips' => '本次重置流量将扣除余额 :amount!',
+        'lack'      => '잔액 부족, 잔액을 충전해주세요',
+        'logs'      => '사용자 직접 용량을 초기화',
+        'success'   => '초기화 성공',
+    ],
+    'referral'            => [
+        'link'    => '홍보 링크',
+        'total'   => '合计返利 :amount( :total 次),满 :money 可以申请提现。',
+        'logs'    => '수수료 기록',
+        'failed'  => '신청 실패',
+        'success' => '신청 성공',
+        'msg'     => [
+            'account'     => '계정이 만료됨, 다시 서비스를 구매해주세요.',
+            'applied'     => '이미 신청이 존재하므로  이전 신청이 완료될 때까지 기다려주세요.',
+            'unfulfilled' => '满 :amount 才可以提现,继续努力吧',
+            'wait'        => '관리자의 승인을 기다려주세요',
+            'error'       => '반환 실패, 나중에 다시 시도하거나 관리자에게 문의해주세요',
+        ],
+    ],
+    'inviter'             => '초대자',
+    'invitee'             => '초대 받은 사람',
+    'registered_at'       => '회원가입 시간',
+    'bought_at'           => '구매 날짜',
+    'payment_method'      => '결제 방식',
+    'pay'                 => '결제',
+    'input_coupon'        => '쿠폰 번호를 입력해주세요',
+    'recharge'            => '충전',
+    'recharge_credit'     => '잔액 충전',
+    'recharging'          => '충전중...',
+    'withdraw_commission' => '결산 수수료',
+    'withdraw_at'         => '결산 날짜',
+    'withdraw_logs'       => '출금 기록',
+    'withdraw'            => '출금',
+    'scan_qrcode'         => '프로그램으로 QR코드를 스캔하세요',
+    'shop'                => [
+        'hot'                => '인기',
+        'limited'            => '한정판',
+        'change_amount'      => '금액 충전',
+        'change_amount_help' => '请输入充值金额',
+        'buy'                => '구매',
+        'description'        => '표시',
+        'service'            => '서비스',
+        'pay_credit'         => '잔액 결제',
+        'pay_online'         => '온라인 결제',
+        'price'              => '가격',
+        'quantity'           => '수량',
+        'subtotal'           => '소계',
+        'total'              => '합계',
+        'conflict'           => '패키지 중복 존재',
+        'conflict_tips'      => '< p> 현재 구매 패키지는 < code> 예약 패키지로 자동 설정됩니다. </ code> < p> <ol class="text- left" > < li> 예약 패키지는 발효 중인 패키지가 종료되면 자동으로 실행됩니다! </ li> < li> < li> > 결제 후 패키지를 수동으로 활성화할 수 있습니다! </ li> </ li>',
+        'call4help'          => '관리자에게 문의하세요',
+    ],
+    'service'             => [
+        'node_count'    => '<code>:num</code> 条优质线路',
+        'country_count' => '覆盖 <code>:num</code> 个国家或地区',
+        'unlimited'     => '속도 제한 없음',
+    ],
+    'payment'             => [
+        'error'           => '충전 잔액이 올바르지 않습니다',
+        'creating'        => '주문서 생성 중...',
+        'redirect_stripe' => 'Stripe 결제 페이지로 이동',
+        'qrcode_tips'     => '< strong class="red-600" >: software< > 을 사용하여 QR코드를 스캔하십시오.',
+        'close_tips'      => '< code>: minutes분 </ code> 안에 결제를 완료해 주십시오, 그렇지 않으면 주문이 자동으로 취소됩니다.',
+        'mobile_tips'     => '<strong > 모바일 사용자 </strong >:  QR코드를 길게 누름 - > 이미지 저장 - > 결제 프로그램 열기 - > 청소 - > 앨범 선택 그리고 결제하기',
+    ],
+    'invoice'             => [
+        'attribute'               => '주문서',
+        'detail'                  => '소비 기록',
+        'amount'                  => '금액',
+        'active_prepaid_question' => '미리 예비 결제를 신청하시겠습니까?',
+        'active_prepaid_tips'     => '상품이 활성화되면: <br> 이전 상품은 바로 효력을 잃습니다! <br> 만료일은 오늘 다시 시작됩니다!',
+    ],
+    'node'                => [
+        'info'     => '설정 정보',
+        'setting'  => '프록시 설정',
+        'unstable' => '회선 점검중',
+        'rate'     => ':ratio배 데이터 소비',
+    ],
+    'subscribe'           => [
+        'baned'            => '구독 기능이 비활성화되었습니다. 관리자에게 연락하세요.',
+        'link'             => '구독 주소',
+        'tips'             => '경고: 이 구독 링크는 개인에 한해서만 사용할 수 있습니다. 이 링크를 공유하지 마십시오. 그렇지 않으면 계정에 문제가 생길 수 있습니다.',
+        'exchange_warning' => '구독 주소를 변경 시 다음과 같습니다. \n1. 이전 주소는 즉시 비활성화됩니다 \n2. 연결 비밀번호가 변경됩니다.',
+        'custom'           => '自定义订阅',
+        'ss_only'          => '只订阅SS',
+        'ssr_only'         => '只订阅SSR (包含SS)',
+        'v2ray_only'       => 'V2Ray 만 구독',
+        'trojan_only'      => 'Trojan 만 구독',
+        'error'            => '구독 주소 변경 오류',
+    ],
+    'ticket'              => [
+        'attribute'           => '문의',
+        'submit_tips'         => '문의를 하시겠습니까?',
+        'reply_confirm'       => '문의 답변을 하시겠습니까?',
+        'close_tips'          => '문의를 종료하시겠습니까?',
+        'close'               => '문의 닫기',
+        'failed_closed'       => '오류: 문의가 이미 종료되었습니다.',
+        'reply_placeholder'   => '어떤 도움이 필요한가요?',
+        'reply'               => '답장',
+        'close_msg'           => '문의: 사용자 ID:id 가 수동으로 닫음',
+        'title_placeholder'   => '请简单表示你的问题类型,或者涉及的内容',
+        'content_placeholder' => '请详细的描述您遇到的问题,或者需要我们帮助的地方,以便我们快速帮助到您',
+        'new'                 => '새로 문의하기',
+        'working_hour'        => '영업시간',
+        'online_hour'         => '접속 시간',
+        'service_tips'        => '다양한 연락처가 있습니다. 이 중 < code > 의 </ code > 로 연락하십시오! 잦은 요청 시, 처리 시간이 자동으로 지연됩니다.',
+        'error'               => '알 수 없는 오류! 관리자에게 문의하세요',
+    ],
+    'traffic_logs'        => [
+        '24hours' => '오늘 데이터 사용 상황',
+        '30days'  => '이달 데이터 사용 상황',
+        'tips'    => '알림: 데이터 통계 업데이트가 지연될 수 있습니다. 일별 통계는 다음날 갱신, 시간별 갱신은 몇 시간 뒤 적용됩니다.',
+    ],
+    'client'              => '프로그램',
+    'tutorials'           => '教 程',
+    'current_role'        => '현재  정보',
+    'knowledge'           => [
+        'title' => '知 识 库',
+        'basic' => '基 础',
+    ],
+];

+ 25 - 3
resources/lang/ko/validation.php

@@ -106,10 +106,32 @@ return [
     'uploaded'             => ':attribute을(를) 업로드하지 못했습니다.',
     'url'                  => ':attribute 형식은 올바르지 않습니다.',
     'uuid'                 => ':attribute은(는) 유효한UUID여야합니다.',
-    'custom'               => [
+
+    'custom' => [
         'attribute-name' => [
-            'rule-name' => 'custom-message',
+            'rule-name' => '사용자 지정 메세지',
         ],
     ],
-    'attributes'           => [],
+
+    'attributes' => [
+        'name'                  => '이름',
+        'nickname'              => '닉네임',
+        'username'              => '사용자 이름',
+        'email'                 => '이메일',
+        'password'              => '비밀번호',
+        'password_confirmation' => '비밀번호 확인',
+        'phone'                 => '전화번호',
+        'day'                   => '일 | 일',
+        'month'                 => '월',
+        'year'                  => '년',
+        'hour'                  => '시',
+        'minute'                => '분',
+        'second'                => '초',
+        'title'                 => '제목',
+        'content'               => '내용',
+        'description'           => '표시',
+        'excerpt'               => '요약',
+        'date'                  => '날짜',
+        'time'                  => '시간',
+    ],
 ];

+ 28 - 0
resources/lang/vi.json

@@ -0,0 +1,28 @@
+{
+  "All rights reserved.": "版本所有。",
+  "Hello!": "您好:",
+  "If you did not create an account, no further action is required.": "如果您未注册帐号,请忽略此邮件。",
+  "If you did not request a password reset, no further action is required.": "如果您未申请重设密码,请忽略此邮件。",
+  "If you’re having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "如果您点击「:actionText」按钮时出现问题,请复制下方链接到浏览器中开启:",
+  "If your problem has not been solved, Feel free to open other one.": "如果您的问题尚未解决,请另开工单解决。",
+  "Invoice Detail": "订单明细",
+  "Nodes Daily Report": "线路每日流量报告",
+  "Payment for #:sn has been received! Total amount: :amount.": "您成功支付了订单#:sn,总金额为 :amount。",
+  "Payment Received": "账单付款成功",
+  "Please click the button below to verify your email address.": "请点击下面按钮验证您的 E-mail:",
+  "Please click the button below to reset your password.": "请点击下面按钮重置您的密码:",
+  "Regards": "致敬",
+  "Reset Password Notification": "重设密码通知",
+  "Reset Password": "重设密码",
+  "Send Password Reset Link": "发送重设密码链接",
+  "Thanks for signing up! Before getting started, could you verify your email address by clicking on the link we just emailed to you? If you didn't receive the email, we will gladly send you another.": "感谢您的注册! 在开始之前,您需要通过点击我们刚刚发送至您邮箱中的链接来验证您的电子邮件! 如果您没有收到电子邮件,我们很乐意再发送一封给您。",
+  "Too Many Attempts.": "尝试次数过多",
+  "Too Many Requests": "请求次数过多",
+  "Verify Email Address": "验证 E-mail",
+  "Verify Your Email Address": "验证 您的E-mail",
+  "We won't ask for your password again for a few hours.": "确认完成后,接下来几个小时内您不需再输入密码。",
+  "You are receiving this email because we received a password reset request for your account.": "您收到此电子邮件是因为我们收到了您帐户的密码重设请求。",
+  "Your email address is not verified.": "您的电子邮件尚未验证通过",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": "超过:num小时未回复工单,系统已自动关闭了您的工单",
+  "You must have a valid subscription to view the content in this area!": "您必须拥有有效套餐才可以查看该区域的内容!"
+}

+ 844 - 0
resources/lang/vi/admin.php

@@ -0,0 +1,844 @@
+<?php
+
+return [
+    'dashboard'           => [
+        'users'                   => '总用户',
+        'available_users'         => '有效用户',
+        'paid_users'              => '付费用户',
+        'active_days_users'       => ':days 日内活跃用户',
+        'inactive_days_users'     => ':days 日以上不活跃用户',
+        'online_users'            => '当前在线',
+        'expiring_users'          => '临近到期',
+        'overuse_users'           => '流量大户(超过90%的用户)',
+        'abnormal_users'          => '1小时内流量异常',
+        'nodes'                   => '节点',
+        'maintaining_nodes'       => '维护中的节点',
+        'traffic_consumed'        => '记录的消耗流量',
+        'traffic_days_consumed'   => ':days 日内消耗流量',
+        'orders'                  => '总订单数',
+        'online_orders'           => '在线支付订单数',
+        'succeed_orders'          => '支付成功订单数',
+        'credit'                  => '总余额',
+        'withdrawing_commissions' => '待提现佣金',
+        'withdrawn_commissions'   => '已支出佣金',
+    ],
+    'action'              => [
+        'edit_item' => '编辑:attribute',
+        'add_item'  => '添加:attribute',
+    ],
+    'confirm'             => [
+        'delete'    => [0 => '确定删除:attribute【', 1 => '】? '],
+        'continues' => '确定继续操作吗? ',
+        'export'    => '确定全部导出? ',
+    ],
+    'user_dashboard'      => '个人中心',
+    'menu'                => [
+        'dashboard'        => '管理中心',
+        'user'             => [
+            'attribute'  => '用户系统',
+            'list'       => '用户管理',
+            'oauth'      => '用户授权',
+            'group'      => '用戶分组',
+            'credit_log' => '余额变动',
+            'subscribe'  => '订阅管理',
+        ],
+        'rbac'             => [
+            'attribute'  => '权限系统',
+            'permission' => '权限列表',
+            'role'       => '角色列表',
+        ],
+        'customer_service' => [
+            'attribute' => '客服系统',
+            'ticket'    => '服务工单',
+            'article'   => '文章管理',
+            'push'      => '消息推送',
+            'mail'      => '邮件群发',
+        ],
+        'node'             => [
+            'attribute' => '线路系统',
+            'list'      => '线路管理',
+            'auth'      => '线路授权',
+            'cert'      => '证书列表',
+        ],
+        'rule'             => [
+            'attribute' => '审计规则',
+            'list'      => '规则列表',
+            'group'     => '规则分组',
+            'trigger'   => '触发记录',
+        ],
+        'shop'             => [
+            'attribute' => '商品系统',
+            'goods'     => '商品管理',
+            'coupon'    => '卡券管理',
+            'order'     => '商品订单',
+        ],
+        'promotion'        => [
+            'attribute'   => '推广系统',
+            'invite'      => '邀请管理',
+            'withdraw'    => '提现管理',
+            'rebate_flow' => '返利流水',
+        ],
+        'analysis'         => [
+            'attribute'  => '分析报告',
+            'accounting' => '流水账簿',
+            'user_flow'  => '用户分析',
+        ],
+        'log'              => [
+            'attribute'        => '日志系统',
+            'traffic'          => '流量使用',
+            'traffic_flow'     => '流量变动',
+            'service_ban'      => '封禁记录',
+            'online_logs'      => '在线记录',
+            'online_monitor'   => '在线监控',
+            'notify'           => '通知记录',
+            'payment_callback' => '支付回调',
+            'system'           => '系统日志',
+        ],
+        'tools'            => [
+            'attribute' => '工具箱',
+            'decompile' => '反解析',
+            'convert'   => '格式转换',
+            'import'    => '数据导入',
+            'analysis'  => '日志分析',
+        ],
+        'setting'          => [
+            'attribute'    => '设置',
+            'email_suffix' => '邮箱后缀管理',
+            'universal'    => '通用配置',
+            'system'       => '系统设置',
+        ],
+    ],
+    'user'                => [
+        'massive'         => [
+            'text'    => '用户生成数量',
+            'button'  => '批量生成',
+            'failed'  => '批量生成账号失败',
+            'succeed' => '批量生成账号成功',
+            'note'    => '后台批量生成用户',
+        ],
+        'proxy_info'      => '配置信息',
+        'traffic_monitor' => '流量统计',
+        'online_monitor'  => '在线巡查',
+        'reset_traffic'   => '重置流量',
+        'user_view'       => '用户视角',
+        'connection_test' => '联网测试',
+        'counts'          => '共 <code>:num</code> 个账号',
+        'reset_confirm'   => [0 => '确定重置 【', 1 => '】 流量吗?'],
+        'info'            => [
+            'account'              => '账号信息',
+            'proxy'                => '代理信息',
+            'switch'               => '切换身份',
+            'reset_date_hint'      => '账号流量下一个重置日期',
+            'expired_date_hint'    => '留空默认为一年',
+            'uuid_hint'            => 'V2Ray的账户ID',
+            'recharge_placeholder' => '填入负值则会扣余额',
+        ],
+        'update_help'     => '更新成功,是否返回?',
+        'proxies_config'  => '【:username】连接配置信息',
+        'group'           => [
+            'title'  => '用户分组控制<small>(同一节点可分配至多个分组,一个用户只能属于一个分组;对于用户可见/可用节点:先按分组后按等级)</small>',
+            'name'   => '分组名称',
+            'counts' => ' 共 <code>:num</code> 个分组',
+        ],
+    ],
+    'zero_unlimited_hint' => '不设置/0,即为无限制',
+    'node'                => [
+        'traffic_monitor' => '流量统计',
+        'refresh_geo'     => '刷新地理',
+        'ping'            => '检测延迟',
+        'connection_test' => '连通性检测',
+        'counts'          => '共 <code> :num </code> 条线路',
+        'reload_all'      => '重载【全部】后端',
+        'refresh_geo_all' => '刷新【全部】节点地理信息',
+        'reload_confirm'  => '确定重载节点?',
+        'info'            => [
+            'hint'                  => '<strong>注意:</strong> 添加节点后自动生成的<code>ID</code>,即为该节点部署ShadowsocksR Python版后端时<code>usermysql.json</code>中的<code>node_id</code>的值,同时也是部署V2Ray后端时的<code>nodeId</code>的值;',
+            'basic'                 => '基础信息',
+            'ddns_hint'             => '动态IP节点需要<a href="https://github.com/NewFuture/DDNS" target="_blank">配置DDNS</a>,对此类型节点,节点阻断功能会通过域名进行检测',
+            'domain_placeholder'    => '服务器域名地址,填则优先取域名地址',
+            'domain_hint'           => '系统设置中开启【DDNS模式】,域名将会自动与下方IP内容进行绑定操作!无需再前往域名注册商页面修改IP信息了哟',
+            'extend'                => '扩展信息',
+            'display'               => [
+                'invisible' => '完全不可见',
+                'node'      => '只显示于【:trans】页面',
+                'sub'       => '只显示于【订 阅】',
+                'all'       => '完全可见',
+                'hint'      => '用户是否可以订阅/看到本节点',
+            ],
+            'ipv4_hint'             => '多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8',
+            'ipv6_hint'             => '多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8',
+            'ipv4_placeholder'      => '服务器IPv4地址',
+            'ipv6_placeholder'      => '服务器IPv6地址,填写则用户可见,域名无效',
+            'push_port_hint'        => '必填且防火墙需放行,否则将导致消息推送异常',
+            'data_rate_hint'        => '举例:0.1用100M结算10M,5用100M结算500M',
+            'level_hint'            => '等级:0-无等级,全部可见',
+            'detection'             => [
+                'tcp'  => '只检测TCP',
+                'icmp' => '只检测ICMP',
+                'all'  => '检测全部',
+                'hint' => '每30~60分钟随机进行节点阻断检测',
+            ],
+            'obfs_param_hint'       => '混淆不为 [plain] 时可填入参数进行流量伪装;&#13;&#10;混淆为 [http_simple] 时,建议端口为 80;&#13;&#10;混淆为 [tls] 时,建议端口为 443;',
+            'additional_ports_hint' => '如果启用请配置服务端的<span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span>信息',
+            'v2_method_hint'        => '使用WebSocket传输协议时不要使用none',
+            'v2_net_hint'           => '使用WebSocket传输协议时请启用TLS',
+            'v2_cover'              => [
+                'none'      => '无伪装',
+                'http'      => 'HTTP数据流',
+                'srtp'      => '视频通话数据 (SRTP)',
+                'utp'       => 'BT下载数据 (uTP)',
+                'wechat'    => '微信视频通话',
+                'dtls'      => 'DTLS1.2数据包',
+                'wireguard' => 'WireGuard数据包',
+            ],
+            'v2_host_hint'          => '伪装类型为http时多个伪装域名逗号隔开,使用WebSocket传输协议时只允许单个',
+            'v2_tls_provider_hint'  => '不同后端配置不同:',
+            'single_hint'           => '推荐80或443,服务端需要配置 <br> 严格模式:用户的端口无法连接,只能通过以下指定的端口进行连接(<a href="javascript:showPortsOnlyConfig();">如何配置</a>)',
+        ],
+        'proxy_info'      => '*兼容 SS',
+        'proxy_info_hint' => '如果兼容请在服务端配置协议和混淆时加上<span class="red-700">_compatible</span>',
+        'reload'          => '重载后端',
+        'auth'            => [
+            'title'          => '节点授权列表<small>WEBAPI</small>',
+            'deploy'         => [
+                'title'          => '部署 :type_label 后端',
+                'attribute'      => '部署后端',
+                'command'        => '操作命令',
+                'update'         => '更新:',
+                'uninstall'      => '卸载:',
+                'start'          => '启动:',
+                'stop'           => '停止:',
+                'status'         => '状态:',
+                'recent_logs'    => '近期日志:',
+                'real_time_logs' => '实时日志:',
+                'restart'        => '重启:',
+                'same'           => '同上',
+                'trojan_hint'    => '请先<a href=":url" target="_blank">填写节点域名</a>并将域名解析到节点对应的IP上',
+            ],
+            'reset_auth'     => '重置密钥',
+            'counts'         => '共 <code>:num</code> 条授权',
+            'generating_all' => '确定生成所有节点的授权吗?',
+        ],
+        'cert'            => [
+            'title'           => '域名证书列表<small>(V2Ray节点的伪装域名)</small>',
+            'counts'          => '共 <code>:num</code> 个域名证书',
+            'key_placeholder' => '域名证书的KEY值,允许为空,VNET-V2Ray后端支持自动签证书',
+            'pem_placeholder' => '域名证书的PEM值,允许为空,VNET-V2Ray后端支持自动签证书',
+        ],
+    ],
+    'hint'                => '提示',
+    'oauth'               => [
+        'title'  => '用户OAuth授权',
+        'counts' => '共 <code>:num</code> 个授权',
+    ],
+    'select_all'          => '全 选',
+    'clear'               => '清 空',
+    'unselected_hint'     => '待分配规则,此处可搜索',
+    'selected_hint'       => '已分配规则,此处可搜索',
+    'clone'               => '克隆',
+    'monitor'             => [
+        'daily_chart'   => '每日流量图',
+        'monthly_chart' => '月流量图',
+        'node'          => '节点流量',
+        'user'          => '用户流量',
+        'hint'          => '<strong>提示:</strong> 如果无统计数据,请检查定时任务是否正常。',
+    ],
+    'tools'               => [
+        'analysis'  => [
+            'title'      => 'SSR日志分析<small>仅适用于单机单节点</small>',
+            'req_url'    => '近期请求地址',
+            'not_enough' => '访问记录不足15000条,无法分析数据',
+        ],
+        'convert'   => [
+            'title'               => '格式转换 <small>Shadowsocks 转 ShadowsocksR</small>',
+            'content_placeholder' => '请填入要转换的配置信息',
+        ],
+        'decompile' => [
+            'title'               => '反解析<small>配置转换</small>',
+            'attribute'           => '反解析',
+            'content_placeholder' => '请填入要反解析的ShadowsocksR链接,一行一条',
+        ],
+    ],
+    'ticket'              => [
+        'title'         => '工单列表',
+        'counts'        => '共 <code>:num</code> 个工单',
+        'send_to'       => '请填入目标用户信息!',
+        'user_info'     => '用户信息',
+        'inviter_info'  => '邀请人信息',
+        'close_confirm' => '确定关闭工单?',
+        'error'         => '未知错误!请查看运行日志',
+    ],
+    'logs'                => [
+        'subscribe'              => '订阅列表',
+        'counts'                 => '共 <code>:num</code> 条记录',
+        'rule'                   => [
+            'clear_all'     => '清空记录',
+            'title'         => '触发记录',
+            'name'          => '触发规则',
+            'reason'        => '触发原因',
+            'created_at'    => '触发时间',
+            'tag'           => '✅ 访问非规则允许内容',
+            'clear_confirm' => '确定清空所有记录吗?',
+        ],
+        'order'                  => [
+            'title'      => '订单列表',
+            'is_expired' => '是否过期',
+            'is_coupon'  => '是否使用优惠券',
+        ],
+        'user_traffic'           => [
+            'title'       => '流量使用记录',
+            'choose_node' => '选择节点',
+        ],
+        'user_data_modify_title' => '流量变动记录',
+        'callback'               => '回调日志 <small>(在线支付)</small>',
+        'notification'           => '邮件投递记录',
+        'ip_monitor'             => '在线IP监控 <small>2分钟内的实时数据</small>',
+        'user_ip'                => [
+            'title'   => '用户在线IP列表 <small>最近10分钟</small>',
+            'connect' => '连接IP',
+        ],
+        'ban'                    => [
+            'title'           => '用户封禁记录',
+            'time'            => '时长',
+            'reason'          => '理由',
+            'ban_time'        => '封禁时间',
+            'last_connect_at' => '最后连接时间',
+        ],
+        'credit_title'           => '余额变动记录',
+    ],
+    'start_time'          => '开始区间',
+    'end_time'            => '结束区间',
+    'goods'               => [
+        'title'         => '商品列表',
+        'type'          => [
+            'top_up'  => '充值',
+            'package' => '流量包',
+            'plan'    => '套餐',
+        ],
+        'info'          => [
+            'type_hint'           => '套餐与账号有效期有关,流量包只扣可用流量,不影响有效期',
+            'period_hint'         => '套餐流量会每N天重置',
+            'limit_num_hint'      => '每个用户可以购买该商品次数,为 0 时代表不限购',
+            'available_date_hint' => '到期后会自动从总流量扣减对应的流量',
+            'desc_placeholder'    => '商品的简单描述',
+            'list_placeholder'    => '商品的自定义列表添加',
+            'list_hint'           => '每行内容请以<code>&lt;li&gt;</code> 开头<code>&lt;/li&gt;</code> 结尾',
+        ],
+        'status'        => [
+            'yes' => '上架',
+            'no'  => '下架',
+        ],
+        'sell_and_used' => '使用 / 销售',
+        'counts'        => '共 <code>:num</code> 个商品',
+    ],
+    'sort_asc'            => '排序值越大排越前',
+    'yes'                 => '是',
+    'no'                  => '否',
+    'rule'                => [
+        'type'   => [
+            'reg'      => '正则表达式',
+            'domain'   => '域名',
+            'ip'       => 'IP',
+            'protocol' => '协议',
+        ],
+        'counts' => '共 <code>:num</code> 条审计规则',
+        'title'  => '规则列表',
+        'group'  => [
+            'type'   => [
+                'off' => '阻断',
+                'on'  => '放行',
+            ],
+            'title'  => '规则分组',
+            'counts' => '共 <code>:num</code> 个分组',
+        ],
+    ],
+    'role'                => [
+        'name_hint'        => '唯一标识名称,例如:Administrator',
+        'description_hint' => '面板显示名称,例如:管理员',
+        'title'            => '权限角色列表',
+        'permissions_all'  => '全部权限',
+        'counts'           => '共 <code>:num</code> 个权限角色',
+    ],
+    'report'              => [
+        'monthly_accounting'  => '月流水账簿',
+        'annually_accounting' => '年流水账簿',
+        'historic_accounting' => '历史流水账簿',
+        'current_month'       => ' 本 月 ',
+        'last_month'          => ' 上 月',
+        'current_year'        => ' 今 年 ',
+        'last_year'           => ' 去 年 ',
+        'hourly_traffic'      => '每时流量',
+        'daily_traffic'       => '每天流量',
+        'today'               => ' 本 日 ',
+    ],
+    'permission'          => [
+        'title'            => '权限行为列表',
+        'description_hint' => '填写描述,例:【A系统】编辑A',
+        'name_hint'        => '填写路由名称,例:admin.permission.create,update',
+        'counts'           => '共 <code>:num</code> 条权限行为',
+    ],
+    'marketing'           => [
+        'email'         => [
+            'title'      => '邮件群发列表',
+            'group_send' => '群发邮件',
+            'counts'     => '共 <code>:num</code> 条消息',
+        ],
+        'send_status'   => '发送状态',
+        'send_time'     => '发送时间',
+        'error_message' => '错误信息',
+        'push'          => [
+            'title'  => '推送消息列表',
+            'send'   => '推送消息',
+            'counts' => '共 <code>:num</code> 条推送消息',
+        ],
+    ],
+    'creating'            => '正在添加...',
+    'article'             => [
+        'type'          => [
+            'knowledge'    => '文章',
+            'announcement' => '公告',
+        ],
+        'category_hint' => '同一类别将归类与同一文件夹下',
+        'logo_hint'     => '推荐尺寸:100x75',
+        'title'         => '文章列表',
+        'counts'        => '共 <code>:num</code> 篇文章',
+    ],
+    'coupon'              => [
+        'title'                   => '卡券列表',
+        'name_hint'               => '会用于前端显示',
+        'sn_hint'                 => '提供给用户使用卡券的卡券,留空则默认为8位随机码',
+        'type'                    => [
+            'voucher'  => '抵用券',
+            'discount' => '折扣券',
+            'charge'   => '充值券',
+        ],
+        'type_hint'               => '抵用:抵扣商品金额,折扣:商品百分比打折,充值:充值用户账号余额',
+        'value'                   => '{1} ➖ :num|{2} :num 折|{3} ➕ :num',
+        'value_hint'              => '范围为 1% ~ 99% ',
+        'priority_hint'           => '同【使用券码】下,符合条件的高权重码将会被优先使用。最高为 255',
+        'minimum_hint'            => '当支付金额超过 <strong>:num</strong> 值时,才能使用本优惠劵;',
+        'used_hint'               => '符合条件的用户可以使用本券 <strong>:num</strong> 次;',
+        'levels_hint'             => '用户等级在选定等级内,方可使用本券',
+        'groups_hint'             => '选定的用户分组,方可使用本券',
+        'users_placeholder'       => '输入用户ID, 再回车',
+        'user_whitelist_hint'     => '涉及用户均可使用本券,留空为不使用此条件',
+        'users_blacklist_hint'    => '涉及用户均不可使用本券,空为不使用此条件',
+        'services_placeholder'    => '输入商品ID, 再回车',
+        'services_whitelist_hint' => '涉及商品方可使用本券,留空为不使用此条件',
+        'services_blacklist_hint' => '涉及商品不可使用本券,留空为不使用此条件',
+        'newbie'                  => [
+            'first_discount' => '首次用任意券',
+            'first_order'    => '首单',
+            'created_days'   => '创号',
+        ],
+        'created_days_hint'       => '且 创号 <code>:days</code> 天',
+        'limit_hint'              => '本项各条件为 <strong>并且</strong> 关系,请自行搭配使用',
+        'info_title'              => '卡券信息',
+        'counts'                  => '共 <code>:num</code> 张优惠券',
+        'discount'                => '优惠',
+        'export_title'            => '卡券导出',
+        'single_use'              => '一次性',
+    ],
+    'times'               => '次',
+    'massive_export'      => '批量导出',
+    'system_generate'     => '系统生成',
+    'aff'                 => [
+        'rebate_title'      => '返利流水记录',
+        'counts'            => '共 <code>:num</code> 个申请',
+        'title'             => '提现申请列表',
+        'apply_counts'      => '共 <code>:num</code> 个申请',
+        'referral'          => '推广返利',
+        'commission_title'  => '提现申请详情',
+        'commission_counts' => '本申请共涉及 <code>:num</code> 单',
+    ],
+    'setting'             => [
+        'common'        => [
+            'title'         => '通用配置',
+            'set_default'   => '设为默认',
+            'connect_nodes' => '关联节点数',
+        ],
+        'email'         => [
+            'title'            => '邮箱过滤列表 <small>(用于屏蔽注册邮箱后缀)</small>',
+            'tail'             => '邮箱后缀',
+            'rule'             => '规则',
+            'black'            => '黑名单',
+            'white'            => '白名单',
+            'tail_placeholder' => '请填入邮箱后缀',
+        ],
+        'system'        => [
+            'title'     => '系统配置',
+            'web'       => '网站常规',
+            'account'   => '账号设置',
+            'node'      => '节点设置',
+            'extend'    => '拓展功能',
+            'check_in'  => '签到系统',
+            'promotion' => '推广系统',
+            'notify'    => '通知系统',
+            'auto_job'  => '自动任务',
+            'other'     => 'LOGO|客服|统计',
+            'payment'   => '支付系统',
+            'menu'      => '菜单',
+        ],
+        'no_permission' => '您没有权限修改参数!',
+    ],
+    'system'              => [
+        'account_expire_notification'   => '账号过期通知',
+        'active_times'                  => '激活账号次数',
+        'admin_invite_days'             => '管理员-邀请码有效期',
+        'aff_salt'                      => '邀请链接 用户信息字符化',
+        'alipay_qrcode'                 => '支付宝二维码',
+        'AppStore_id'                   => '苹果账号',
+        'AppStore_password'             => '苹果密码',
+        'auto_release_port'             => '端口回收机制',
+        'bark_key'                      => 'Bark设备号',
+        'bitpay_secret',
+        'captcha_key'                   => '验证码 Key',
+        'captcha_secret'                => '验证码 Secret/ID',
+        'codepay_id'                    => '码支付ID',
+        'codepay_key'                   => '通信密钥',
+        'codepay_url'                   => '请求URL',
+        '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'                   => '禁止访问模式',
+        'invite_num'                    => '可生成邀请码数',
+        'is_activate_account'           => '激活账号',
+        'is_AliPay'                     => '支付宝支付',
+        'is_ban_status'                 => '过期自动封禁',
+        'is_captcha'                    => '验证码模式',
+        'is_checkin'                    => '签到加流量',
+        'is_clear_log'                  => '自动清除日志',
+        'is_custom_subscribe'           => '高级订阅',
+        'is_email_filtering'            => '邮箱过滤机制',
+        'is_forbid_robot'               => '阻止机器人访问',
+        'is_free_code'                  => '免费邀请码',
+        'is_invite_register'            => '邀请注册',
+        'is_otherPay'                   => '特殊支付',
+        'is_push_bear',
+        'is_QQPay'                      => 'QQ钱包',
+        'is_rand_port'                  => '随机端口',
+        'is_register'                   => '用户注册',
+        'is_subscribe_ban'              => '订阅异常自动封禁',
+        'is_traffic_ban'                => '异常自动封号',
+        'is_WeChatPay'                  => '微信支付',
+        'iYuu_token'                    => 'IYUU令牌',
+        'maintenance_content'           => '维护介绍内容',
+        'maintenance_mode'              => '维护模式',
+        'maintenance_time'              => '维护结束时间',
+        'max_port',
+        'max_rand_traffic',
+        'min_port'                      => '端口范围',
+        'min_rand_traffic'              => '流量范围',
+        'node_blocked_notification'     => '节点阻断提醒',
+        'node_daily_notification'       => '节点使用报告',
+        'node_offline_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_confirm_notification'  => '人工支付确认通知',
+        'payment_received_notification' => '支付成功通知',
+        'paypal_app_id'                 => '应用ID',
+        'paypal_certificate'            => '证书',
+        'paypal_password'               => 'API密码',
+        'paypal_secret'                 => '签名',
+        'paypal_username'               => 'API用户名',
+        'pushDeer_key'                  => 'PushDeer Key',
+        'pushplus_token'                => 'PushPlus Token',
+        'rand_subscribe'                => '随机订阅',
+        'redirect_url'                  => '重定向地址',
+        'referral_money'                => '提现限制',
+        'referral_percent'              => '返利比例',
+        'referral_status'               => '推广功能',
+        'referral_traffic'              => '注册送流量',
+        'referral_type'                 => '返利模式',
+        '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_ban_times'           => '订阅请求阈值
+',
+        'subscribe_domain'              => '节点订阅地址',
+        'subscribe_max'                 => '订阅节点数',
+        '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_ban_time'              => '封号时长',
+        'traffic_ban_value'             => '流量异常阈值',
+        'traffic_limit_time'            => '时间间隔',
+        'traffic_warning_percent'       => '流量警告阈值',
+        'trojan_license'                => 'Trojan授权',
+        'username_type'                 => '账号类型',
+        'user_invite_days'              => '用户-邀请码有效期',
+        'v2ray_license'                 => 'V2Ray授权',
+        'v2ray_tls_provider'            => 'V2Ray TLS配置',
+        'webmaster_email'               => '管理员邮箱',
+        'website_analytics'             => '统计代码',
+        'website_callback_url'          => '通用支付回调地址',
+        'website_customer_service'      => '客服代码',
+        'website_home_logo'             => '首页LOGO',
+        'website_logo'                  => '站内LOGO',
+        'website_name'                  => '网站名称',
+        'website_security_code'         => '网站安全码',
+        'website_url'                   => '网站地址',
+        'web_api_url'                   => '授权/后端访问域名',
+        'wechat_aid'                    => '微信企业应用ID',
+        'wechat_cid'                    => '微信企业ID',
+        'wechat_encodingAESKey'         => '微信企业应用EncodingAESKey',
+        'wechat_qrcode'                 => '微 信二维码',
+        'wechat_secret'                 => '微信企业应用密钥',
+        'wechat_token'                  => '微信企业应用TOKEN',
+
+        'hint'           => [
+            'account_expire_notification'   => '通知用户账号即将到期',
+            'active_times'                  => '24小时内可以通过邮件激活账号次数',
+            'admin_invite_days'             => '管理员生成邀请码的有效期',
+            'aff_salt'                      => '留空时,邀请链接将显示用户ID;填入任意英文/数字 即可对用户链接ID进行加密',
+            'alipay_qrcode',
+            'AppStore_id'                   => 'iOS软件设置教程中使用的苹果账号',
+            'AppStore_password'             => 'iOS软件设置教程中使用的苹果密码',
+            'auto_release_port'             => '被封禁/过期 <code>'.config('tasks.release_port').'</code> 天的账号端口自动释放',
+            'bark_key'                      => '推送消息到iOS设备,需要在iOS设备里装一个名为Bark的应用,取网址后的一长串字符串,启用Bark,请务必填入本值',
+            'bitpay_secret',
+            'captcha_key'                   => '浏览<a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">设置指南</a>来设置',
+            'captcha_secret',
+            'codepay_id',
+            'codepay_key',
+            'codepay_url',
+            'data_anomaly_notification'     => '1小时内流量超过异常阈值通知超管',
+            'data_exhaust_notification'     => '通知用户流量即将耗尽',
+            'ddns_key'                      => "浏览<a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>设置指南</a>来设置",
+            'ddns_mode'                     => '添加/编辑/删除节点的【域名、ipv4、ipv6】时,自动更新对应内容至DNS服务商',
+            'ddns_secret',
+            'default_days'                  => '用户注册时默认账户有效期,为0即当天到期',
+            'default_traffic'               => '用户注册时默认可用流量',
+            'detection_check_times'         => '提醒N次后自动下线节点,为0/留空时不限制,不超过12',
+            'dingTalk_access_token'         => '可以阅读<a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>钉钉手册</a>查阅步骤',
+            'dingTalk_secret'               => '可选填!开启机器人[加签]就是必填项目!',
+            'epay_key',
+            'epay_mch_id',
+            'epay_url',
+            'expire_days'                   => '【账号过期通知】开始阈值,每日通知用户',
+            'f2fpay_app_id'                 => '即:APPID',
+            'f2fpay_private_key'            => '生成秘钥软件生成时,产生的应用秘钥',
+            'f2fpay_public_key'             => '注意不是应用公钥!',
+            'forbid_mode'                   => '依据IP对对应地区进行阻拦,非阻拦地区可正常访问',
+            'invite_num'                    => '用户可以生成的邀请码数',
+            'is_activate_account'           => '启用后用户需要通过邮件来激活账号',
+            'is_AliPay',
+            'is_ban_status'                 => '(慎重)封禁整个账号会重置账号的所有数据且会导致用户无法登录,不开启状态下只封禁用户代理',
+            'is_captcha'                    => '启用后 登录/注册 需要进行验证码认证',
+            'is_checkin'                    => '登录时将根据流量范围随机得到流量',
+            'is_clear_log'                  => '(推荐)启用后自动清除无用日志',
+            'is_custom_subscribe'           => '启用后,订阅信息顶部将显示过期时间、剩余流量(只支持个别客户端)',
+            'is_email_filtering'            => '黑名单: 用户可使用任意黑名单外的邮箱注册;白名单:用户只能选择使用白名单中的邮箱后缀注册',
+            'is_forbid_robot'               => '如果是机器人、爬虫、代理访问网站则会抛出404错误',
+            'is_free_code'                  => '关闭后免费邀请码不可见',
+            'is_invite_register',
+            'is_otherPay',
+            'is_push_bear',
+            'is_QQPay',
+            'is_rand_port'                  => '注册、添加用户时随机生成端口',
+            'is_register'                   => '关闭后无法注册',
+            'is_subscribe_ban'              => '启用后用户订阅链接请求超过设定阈值则自动封禁',
+            'is_traffic_ban'                => '1小时内流量超过异常阈值则自动封号(仅禁用代理)',
+            'is_WeChatPay',
+            'iYuu_token'                    => '启用爱语飞飞,请务必填入本值(<a href=http://iyuu.cn target=_blank>申请 IYUU令牌</a>)',
+            'maintenance_content'           => '自定义维护内容信息',
+            'maintenance_mode'              => "启用后,用户访问转移至维护界面 | 管理员使用 <a href='javascript:(0)'>:url</a> 登录",
+            'maintenance_time'              => '用于维护界面倒计时',
+            'max_port',
+            'max_rand_traffic',
+            'min_port'                      => '端口范围:1000 - 65535',
+            'min_rand_traffic',
+            'node_blocked_notification'     => '每小时检测节点是否被阻断并提醒管理员',
+            'node_daily_notification'       => '报告各节点流量昨日消耗情况',
+            'node_offline_notification'     => '每10分钟检测节点离线并提醒管理员',
+            'oauth_path'                    => '请在.ENV中添加设置,再在此处开启平台',
+            'offline_check_times'           => '24小时内提醒n次后不再提醒',
+            'password_reset_notification'   => '启用后用户可以重置密码',
+            'paybeaver_app_id'              => '<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -> 开发者 -> App ID',
+            'paybeaver_app_secret'          => '<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -> 开发者 -> App Secret',
+            'payjs_key',
+            'payjs_mch_id'                  => '在<a href="https://payjs.cn/dashboard/member" target="_blank">本界面</a>获取信息',
+            'payment_confirm_notification'  => '用户使用人工支付后通知管理员处理订单',
+            'payment_received_notification' => '用户支付订单后通知用户订单状态',
+            'paypal_app_id',
+            'paypal_certificate',
+            'paypal_password',
+            'paypal_secret',
+            'paypal_username',
+            'pushDeer_key'                  => '启用PushDeer,请务必填入本值(<a href=http://www.pushdeer.com/official.html
+                                    target=_blank>申请 Push Key</a>)',
+            'pushplus_token'                => '启用PushPlus,请务必填入本值(<a href=https://www.pushplus.plus/push1.html target=_blank>申请 Token</a>)',
+            'rand_subscribe'                => '启用后,订阅时将随机返回节点信息,否则按节点排序返回',
+            'redirect_url'                  => '触发审计规则时访问请求被阻断并重定向至该地址',
+            'referral_money'                => '满多少元才可以申请提现',
+            'referral_percent'              => '根据推广链接注册的账号每笔消费推广人可以分成的比例',
+            'referral_status'               => '关闭后用户不可见,但是不影响其正常邀请返利',
+            'referral_traffic'              => '根据推广链接、邀请码注册则赠送相应的流量',
+            'referral_type'                 => '切换模式后旧数据不变,新的返利按新的模式计算',
+            'register_ip_limit'             => '同IP在24小时内允许注册数量,为0/留空时不限制',
+            'reset_password_times'          => '24小时内可以通过邮件重置密码次数',
+            'reset_traffic'                 => '用户会按其购买套餐的日期自动重置可用流量',
+            'server_chan_key'               => "启用ServerChan,请务必填入本值(<a href=https://sc.ftqq.com target=_blank>申请 SCKEY</a>)",
+            'standard_currency'             => '网站中涉及金钱部分的默认货币',
+            'stripe_public_key',
+            'stripe_secret_key',
+            'stripe_signing_secret',
+            'subject_name'                  => '用于在支付渠道的商品标题显示',
+            'subscribe_ban_times'           => '24小时内订阅链接请求次数限制',
+            'subscribe_domain'              => '(推荐)防止面板域名被DNS投毒后无法正常订阅,需带http://或https://"',
+            'subscribe_max'                 => '客户端订阅时取得几个节点,为0/留空时返回全部节点',
+            'telegram_token'                => '找 <a href=https://t.me/BotFather target=_blank>@BotFather</a> 申请机器人获取TOKEN',
+            'tg_chat_token'                 => '启用TG酱,请务必填入本值(<a href=https://t.me/realtgchat_bot target=_blank>申请 Token</a>)',
+            'theadpay_key',
+            'theadpay_mchid',
+            'theadpay_url',
+            'ticket_closed_notification'    => '工单关闭通知用户',
+            'ticket_created_notification'   => '新工单通知管理/用户,取决于谁创建了新工单',
+            'ticket_replied_notification'   => '工单回复通知对方',
+            'traffic_ban_time'              => '触发流量异常导致用户被封禁的时长,到期后自动解封',
+            'traffic_ban_value'             => '1小时内超过该值,则触发自动封号',
+            'traffic_limit_time'            => '间隔多久才可以再次签到',
+            'traffic_warning_percent'       => '【流量耗尽通知】开始阈值,每日通知用户',
+            'trojan_license',
+            'username_type'                 => '规范站点用户账号的类型,默认为电子邮箱',
+            'user_invite_days'              => '用户自行生成邀请的有效期',
+            'v2ray_license',
+            'v2ray_tls_provider'            => '后端自动签发/载入TLS证书时用(节点的设置值优先级高于此处)',
+            'webmaster_email'               => '错误提示时会提供管理员邮箱作为联系方式',
+            'website_analytics'             => '统计JS',
+            'website_callback_url'          => '防止因为网站域名被DNS投毒后导致支付无法正常回调,需带http://或https://',
+            'website_customer_service'      => '客服JS',
+            'website_home_logo',
+            'website_logo',
+            'website_name'                  => '发邮件时展示',
+            'website_security_code'         => '非空时必须通过<a href=":url" target="_blank">安全入口</a>加上安全码才可访问',
+            'website_url'                   => '生成重置密码、在线支付必备',
+            'web_api_url'                   => '例:https://demo.proxypanel.cf',
+            'wechat_aid'                    => '在<a href=https://work.weixin.qq.com/wework_admin/frame#apps arget=_blank>应用管理</a>自建中创建应用 - AgentId',
+            'wechat_cid'                    => '获取<a href=https://work.weixin.qq.com/wework_admin/frame#profile target=_blank>我的企业</a>中的企业ID',
+            'wechat_encodingAESKey'         => '应用管理->应用->设置API接收->EncodingAESKey',
+            'wechat_qrcode',
+            'wechat_secret'                 => '应用的Secret(可能需要下载企业微信才能查看)',
+            'wechat_token'                  => '应用管理->应用->设置API接收->TOKEN,URL设置::url',
+        ],
+        'placeholder'    => [
+            'default_url'           => '默认为 :url',
+            'server_chan_key'       => '填入ServerChan的SCKEY->再点击更新',
+            'pushDeer_key'          => '填入PushDeer的Push Key -> 再点击更新',
+            'iYuu_token'            => '填入爱语飞飞的IYUU令牌 -> 再点击更新',
+            'bark_key'              => '填入Bark的设备号 -> 再点击更新',
+            'telegram_token'        => '填入Telegram的 Token -> 再点击更新',
+            'pushplus_token'        => '请到ServerChan申请',
+            'dingTalk_access_token' => '自定义机器人的WebHook中的access_token',
+            'dingTalk_secret'       => '自定义机器人加签后出现的的密钥',
+            'wechat_aid'            => '应用的AgentId',
+            'wechat_cid'            => '填入微信企业ID -> 再点击更新',
+            'wechat_secret'         => '应用的Secret',
+            'tg_chat_token'         => '请到Telegram申请',
+            'codepay_url'           => 'https://codepay.fateqq.com/creat_order/?',
+        ],
+        'payment'        => [
+            'attribute' => '支付设置',
+            'channel'   => [
+                'alipay'    => '支付宝F2F',
+                'codepay'   => '码支付',
+                'epay'      => '易支付',
+                'payjs'     => 'PayJs',
+                'paypal'    => 'PayPal',
+                'stripe'    => 'Stripe',
+                'paybeaver' => '海狸支付',
+                'theadpay'  => '平头哥支付',
+                'manual'    => '人工支付',
+            ],
+            'hint'      => [
+                'alipay'    => '本功能需要<a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">蚂蚁金服开放平台</a>申请权限及应用',
+                'codepay'   => '请到 <a href="https://codepay.fateqq.com/i/377289" target="_blank">码支付</a>申请账号,然后下载登录其挂机软件',
+                'payjs'     => '请到<a href="https://payjs.cn/ref/zgxjnb" target="_blank">PayJs</a> 申请账号',
+                'paypal'    => '使用商家账号登录<a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">API凭证申请页</a>, 同意并获取设置信息',
+                'paybeaver' => '请到<a href="https://merchant.paybeaver.com/?aff_code=iK4GNuX8" target="_blank">海狸支付 PayBeaver</a>申请账号',
+                'theadpay'  => '请到<a href="https://theadpay.com/" target="_blank">平头哥支付 THeadPay</a>申请账号',
+                'manual'    => '设置后会自动开启对应显示',
+            ],
+        ],
+        'notification'   => [
+            'channel' => [
+                'telegram'   => 'TG电报',
+                'wechat'     => '微信企业',
+                'dingtalk'   => '钉钉',
+                'email'      => '邮箱',
+                'bark'       => 'Bark',
+                'serverchan' => 'ServerChan',
+                'pushdeer'   => 'PushDeer',
+                'pushplus'   => 'PushPlus',
+                'iyuu'       => '爱语飞飞',
+                'tg_chat'    => 'TG酱',
+                'site'       => '站内通知',
+            ],
+        ],
+        'forbid'         => [
+            'mainland' => '阻拦大陆',
+            'china'    => '阻拦中国',
+            'oversea'  => '阻拦海外',
+        ],
+        'username'       => [
+            'email'  => '电子邮箱',
+            'mobile' => '手机号码',
+            'any'    => '任意用户名',
+        ],
+        'active_account' => [
+            'before' => '注册前激活',
+            'after'  => '注册后激活',
+        ],
+        'ddns'           => [
+            'namesilo'   => 'Namesilo',
+            'aliyun'     => '阿里云(国际&国内)',
+            'dnspod'     => 'DNSPod',
+            'cloudflare' => 'CloudFlare',
+        ],
+        'captcha'        => [
+            'standard'  => '普通验证码',
+            'geetest'   => '极 验',
+            'recaptcha' => 'Google reCaptcha',
+            'hcaptcha'  => 'hCaptcha',
+        ],
+        'referral'       => [
+            'once' => '首购返利',
+            'loop' => '循环返利',
+        ],
+    ],
+    'set_to'              => '置 :attribute',
+    'minute'              => '分钟',
+    'query'               => '查 询',
+    'optional'            => '可选',
+    'require'             => '必须',
+];

+ 84 - 0
resources/lang/vi/auth.php

@@ -0,0 +1,84 @@
+<?php
+
+return [
+    'accept_term'     => '我已阅读并同意遵守',
+    'active'          => [
+        'attribute' => '激活',
+        'error'     => [
+            'activated' => '账号已激活,无需再次激活',
+            'disable'   => '本站关闭了账号激活子系统,您可以直接去登录!',
+            'throttle'  => '您已触发本站激活请求限制机制,请勿频繁操作!如有问题,请联系:email',
+        ],
+        'sent'      => '激活链接已发送至您的邮箱,请稍作等待或查看垃圾箱',
+        'promotion' => ['0' => '账号尚未激活,请点击', '1' => '启动激活程序!'],
+    ],
+    'aup'             => '可接受使用条款',
+    'captcha'         => [
+        'attribute' => '验证码',
+        'error'     => ['failed' => '验证码验证失败,请重新输入', 'timeout' => '验证码不合法!可能已过期,请刷新后重试'],
+        'required'  => '请正确完成验证码操作',
+        'sent'      => '验证码已发送至您的邮箱,请稍作等待或查看垃圾箱',
+    ],
+    'email'           => [
+        'error' => ['banned' => '本站屏蔽了您使用的邮箱服务商,请使用其他有效邮箱', 'invalid' => '使用邮箱不在本站支持邮箱列表内'],
+    ],
+    'error'           => [
+        'account_baned'  => '您的账号已被禁止登录!',
+        'login_error'    => '登录错误,请稍后重试!',
+        'login_failed'   => '登录失败,请检查邮箱或密码是否输入正确!',
+        'not_found_user' => '未找到关联账号,请使用其他方式登录',
+        'repeat_request' => '请勿重复请求,请刷新后重试',
+        'url_timeout'    => '链接已失效, 请重新操作',
+    ],
+    'invite'          => [
+        'attribute'    => '邀请码',
+        'error'        => ['unavailable' => '邀请码不可用,请重试'],
+        'get'          => '点击获取邀请码',
+        'not_required' => '无需邀请码,可直接注册!',
+    ],
+    'login'           => '登 录',
+    'logout'          => '登 出',
+    'maintenance'     => '维护',
+    'maintenance_tip' => '网站维护中',
+    'oauth'           => [
+        'bind_success'    => '绑定成功',
+        'bind_failed'     => '绑定失败',
+        'login_failed'    => '第三方登录失败!',
+        'register'        => '快速注册',
+        'registered'      => '已注册,请直接登录',
+        'register_failed' => '注册失败',
+        'rebind_success'  => '重新绑定成功',
+        'unbind_success'  => '解绑成功',
+        'unbind_failed'   => '解绑失败',
+    ],
+    'optional'        => '可选',
+    'password'        => [
+        'forget'   => '忘记密码?',
+        'new'      => '输入新密码',
+        'original' => '原密码',
+        'reset'    => [
+            'attribute' => '重置密码',
+            'error'     => [
+                'disabled' => '本站关闭了密码重置子系统,有事请联系 :email ',
+                'failed'   => '重设密码失败',
+                'throttle' => '24小时内只能重设密码 :time 次,请勿频繁操作',
+                'same'     => '新密码不可与旧密码一样,请重新输入',
+                'wrong'    => '旧密码错误,请重新输入',
+                'demo'     => '演示环境禁止修改管理员密码',
+            ],
+            'sent'      => '重置成功,请查看所用邮箱(邮件可能在垃圾箱中)',
+            'success'   => '新密码设置成功,请前往登录页面',
+        ],
+    ],
+    'register'        => [
+        'attribute' => '注 册',
+        'code'      => '注册验证码',
+        'error'     => ['disable' => '抱歉,本站关闭了注册通道', 'throttle' => '防刷机制已激活,请勿频繁注册'],
+        'promotion' => '还没有账号?请去',
+        'failed'    => '注册失败,请稍后尝试',
+        'success'   => '注册成功',
+    ],
+    'remember_me'     => '记住我',
+    'request'         => '获 取',
+    'tos'             => '用户条款',
+];

+ 144 - 0
resources/lang/vi/common.php

@@ -0,0 +1,144 @@
+<?php
+
+return [
+    'account'         => '账号',
+    'available_date'  => '有效期',
+    'created_at'      => '创建时间',
+    'expired_at'      => '到期时间',
+    'updated_at'      => '更新时间',
+    'latest_at'       => '最近时间',
+    'back'            => '返 回',
+    'cancel'          => '取 消',
+    'close'           => '关 闭',
+    'close_item'      => '关闭:attribute',
+    'confirm'         => '确 认',
+    'continues'       => '继 续',
+    'open'            => '打 开',
+    'send'            => '发 送',
+    'view'            => '查 看',
+    'reset'           => '重 置',
+    'copy'            => [
+        'attribute' => '复 制',
+        'success'   => '复制成功',
+        'failed'    => '复制失败,请手动复制',
+    ],
+    'add'             => '添 加',
+    'free'            => '免费',
+    'replace'         => '更换',
+    'submit'          => '提 交',
+    'submit_item'     => '提交:attribute',
+    'generate'        => '生 成',
+    'generate_item'   => '生成:attribute',
+    'to_safari'       => [0 => '点击右上角', 1 => ',选择在', 2 => 'Safari 中打开', 3 => '就可以正常访问本站了哟!'],
+    'update_browser'  => [0 => '您正在使用', 1 => '过时', 2 => ' 的浏览器。 请', 3 => '升级您的浏览器', 4 => '来获得最佳的浏览体验'],
+    'apply'           => '应 用',
+    'avatar'          => '头像',
+    'customize'       => '自定义',
+    'all'             => '全部',
+    'default'         => '默认',
+    'download'        => '下 载',
+    'goto'            => '前 往',
+    'warning'         => '警 告',
+    'success'         => '成功',
+    'failed'          => '失败',
+    'update'          => '更 新',
+    'update_action'   => '更新:action',
+    'none'            => '无',
+    'new'             => '新',
+    'sorry'           => '抱歉',
+    'applied'         => ':attribute生效',
+    'active_item'     => '激活:attribute',
+    'error'           => '错误',
+    'toggle'          => '切 换',
+    'toggle_action'   => '切换:action',
+    'request_url'     => '请求地址',
+    'function'        => [
+        'navigation' => '导航',
+        'menubar'    => '菜单栏',
+        'fullscreen' => '全屏',
+    ],
+    'days'            => [
+        'sun'     => '周日',
+        'mon'     => '周一',
+        'tue'     => '周二',
+        'wed'     => '周三',
+        'thu'     => '周四',
+        'fri'     => '周五',
+        'sat'     => '周六',
+        'weekend' => '周末',
+        'work'    => '工作日',
+        'next'    => '次日',
+    ],
+    'qrcode'          => ':attribute二维码',
+    'deleted'         => '已删除',
+    'deleted_item'    => ':attribute已删除',
+    'print'           => '打印',
+    'unlimited'       => '无限制',
+    'payment'         => [
+        'credit' => '余额',
+        'wechat' => '微信',
+        'alipay' => '支付宝',
+        'crypto' => '虚拟货币',
+        'manual' => '人工支付',
+        'status' => [
+            'wait'    => '待支付',
+            'fail'    => '支付失败',
+            'success' => '支付成功',
+        ],
+    ],
+    'order'           => [
+        'status' => [
+            'cancel'   => '取 消',
+            'complete' => '完 成',
+            'prepaid'  => '预支付',
+            'ongoing'  => '使用中',
+            'review'   => '待确认',
+        ],
+    ],
+    'recommend'       => '推荐',
+    'advance'         => '进阶',
+    'action'          => '操作',
+    'search'          => '搜 索',
+    'edit'            => '编 辑',
+    'delete'          => '删 除',
+    'status'          => [
+        'attribute'         => '状态',
+        'inactive'          => '未激活',
+        'disabled'          => '停 用',
+        'banned'            => '禁 用',
+        'normal'            => '正 常',
+        'enabled'           => '启 用',
+        'expire'            => '过 期',
+        'limited'           => '限 制',
+        'run_out'           => '流量耗尽',
+        'unused'            => '未使用',
+        'used'              => '已使用',
+        'closed'            => '关 闭',
+        'applying'          => '申请中',
+        'withdrawn'         => '已提现',
+        'unwithdrawn'       => '未提现',
+        'reply'             => '已回复',
+        'pending'           => '待处理',
+        'unknown'           => '未 知',
+        'available'         => '生效中',
+        'reject'            => '驳 回',
+        'rejected'          => '已驳回',
+        'review'            => '待审核',
+        'reviewed'          => '审核通过待打款',
+        'paid'              => '已打款',
+        'payment_pending'   => '待打款',
+        'pass'              => '通 过',
+        'send_to_credit'    => '打款至余额',
+        'waiting_tobe_send' => '等待投递',
+    ],
+    'stay_unchanged'  => '留空为不变',
+    'random_generate' => '留空则随机生成',
+    'request_failed'  => '请求错误,请重试',
+    'convert'         => '转 换',
+    'import'          => '导 入',
+    'or'              => '或',
+    'more'            => '更多',
+    'to'              => '至',
+    'to_be_send'      => '待发送',
+    'developing'      => '开发中!敬请期待',
+];

+ 36 - 0
resources/lang/vi/errors.php

@@ -0,0 +1,36 @@
+<?php
+
+return [
+    'forbidden'    => [
+        'access'  => '检测到未知IP或使用代理访问,禁止访问',
+        'bots'    => '检测到机器人访问,禁止访问',
+        'china'   => '检测到中国IP或使用代理访问,禁止访问',
+        'oversea' => '检测到海外IP或代理访问,禁止访问',
+    ],
+    'http'         => 'HTTP请求类型错误',
+    'log'          => '日志',
+    'missing_page' => '找不到网页',
+    'refresh'      => '刷 新',
+    'refresh_page' => '请刷新页面后,再访问',
+    'report'       => '错❌误携带了报告:',
+    'safe_enter'   => '安全入口访问',
+    'safe_code'    => '请输入安全码',
+    'system'       => '系统错误',
+    'title'        => '⚠️错误触发',
+    'unauthorized' => '未授权访问',
+    'unsafe_enter' => '非安全入口访问',
+    'visit'        => '请访问',
+    'whoops'       => '哎呦!',
+    'get_ip'       => '获取IP信息异常',
+    'subscribe'    => [
+        'unknown'      => '使用链接错误!请重新获取!',
+        'sub_baned'    => '链接已被封禁,请前往官网查询原因',
+        'user'         => '错误链接,账号不存在!请重新获取链接',
+        'user_disable' => '账号被禁用!',
+        'baned_until'  => '账号封禁至:time,请解封后再更新!',
+        'out'          => '流量耗尽!请重新购买或重置流量!',
+        'expired'      => '账号过期!请续费!',
+        'question'     => '账号存在问题,请前往官网查询!',
+        'none'         => '无可用节点',
+    ],
+];

+ 239 - 0
resources/lang/vi/model.php

@@ -0,0 +1,239 @@
+<?php
+
+return [
+    'user'             => [
+        'id'             => '用户ID',
+        'attribute'      => '用户',
+        'nickname'       => '昵称',
+        'username'       => '账号',
+        'password'       => '密码',
+        'credit'         => '余额',
+        'invite_num'     => '可用邀请码',
+        'reset_date'     => '重置日',
+        'port'           => '端口',
+        'traffic_used'   => '流量使用',
+        'service'        => '代理',
+        'group'          => '分组',
+        'level'          => '等级',
+        'account_status' => '账号状态',
+        'proxy_status'   => '代理状态',
+        'expired_date'   => '过期日',
+        'role'           => '角色权限',
+        'wechat'         => '微信',
+        'qq'             => 'QQ',
+        'remark'         => '备注',
+        'uuid'           => 'VMess UUID',
+        'proxy_passwd'   => '密码',
+        'proxy_method'   => '加密方式',
+        'usable_traffic' => '可用流量',
+        'proxy_protocol' => '协议',
+        'proxy_obfs'     => '混淆',
+        'speed_limit'    => '用户限速',
+        'inviter'        => '邀请人',
+        'created_date'   => '注册时间',
+    ],
+    'common'           => [
+        'extend'      => '扩展',
+        'sort'        => '排序',
+        'description' => '描述',
+    ],
+    'country'          => [
+        'code' => 'ISO国家代码',
+        'icon' => '图 标',
+        'name' => '国家/地区名称',
+    ],
+    'subscribe'        => [
+        'code'       => '订阅码',
+        'req_times'  => '请求次数',
+        'updated_at' => '最后请求时间',
+        'ban_time'   => '封禁时间',
+        'ban_desc'   => '封禁理由',
+        'req_ip'     => '请求IP',
+        'req_header' => '访问',
+    ],
+    'oauth'            => [
+        'type'       => '渠道',
+        'identifier' => ' 唯一标识',
+    ],
+    'user_group'       => [
+        'attribute' => '用戶分组',
+        'name'      => '分组名称',
+        'nodes'     => '选择节点',
+    ],
+    'node'             => [
+        'attribute'       => '节点',
+        'id'              => '节点ID',
+        'type'            => '类型',
+        'name'            => '名称',
+        'domain'          => '域名',
+        'static'          => '存活',
+        'online_user'     => '在线',
+        'data_consume'    => '产生流量',
+        'data_rate'       => '流量比例',
+        'ddns'            => 'DDNS',
+        'ipv4'            => 'IPv4地址',
+        'ipv6'            => 'IPv6地址',
+        'push_port'       => '消息推送端口',
+        'level'           => '等级',
+        'rule_group'      => '审计分组',
+        'traffic_limit'   => '节点限速',
+        'client_limit'    => '设备数限制',
+        'label'           => '标签',
+        'country'         => '国家/地区',
+        'udp'             => 'UDP',
+        'display'         => '显示 与 订阅',
+        'detection'       => '节点阻断检测',
+        'method'          => '加密方式',
+        'protocol'        => '协议',
+        'protocol_param'  => '协议参数',
+        'obfs'            => '混淆',
+        'obfs_param'      => '混淆参数',
+        'single'          => '单端口',
+        'transfer'        => '中 转',
+        'service_port'    => '服务端口',
+        'single_passwd'   => '[单] 密码',
+        'v2_alter_id'     => '额外ID',
+        'v2_net'          => '传输方式',
+        'v2_cover'        => '伪装类型',
+        'v2_host'         => '伪装域名',
+        'v2_path'         => '路径 | 密钥',
+        'v2_sni'          => 'SNI',
+        'v2_tls'          => '连接TLS',
+        'v2_tls_provider' => 'TLS配置',
+        'relay_port'      => '中转端口',
+    ],
+    'node_auth'        => [
+        'attribute' => '节点授权',
+        'key'       => '通信密钥<small>节点用</small>',
+        'secret'    => '反向通信密钥',
+    ],
+    'node_cert'        => [
+        'attribute'    => '域名证书',
+        'domain'       => '域名',
+        'key'          => 'KEY',
+        'pem'          => 'PEM',
+        'issuer'       => '签发机构',
+        'signed_date'  => '签发日期',
+        'expired_date' => '到期时间',
+    ],
+    'order'            => [
+        'attribute'      => '订单',
+        'id'             => '订单ID',
+        'original_price' => '原价',
+        'price'          => '实价',
+        'pay_way'        => '支付方式',
+        'status'         => '订单状态',
+    ],
+    'goods'            => [
+        'attribute'      => '商品',
+        'type'           => '类型',
+        'name'           => '名称',
+        'price'          => '售价',
+        'category'       => '分类',
+        'level'          => '等级',
+        'renew'          => '流量重置价格',
+        'user_limit'     => '用户限速',
+        'period'         => '重置周期',
+        'traffic'        => '流量额度',
+        'invite_num'     => '赠送邀请码数量',
+        'limit_num'      => '限购数量',
+        'available_date' => '有效期',
+        'hot'            => '热销',
+        'color'          => '颜色',
+        'logo'           => '商品图片',
+        'info'           => '自定义列表',
+    ],
+    'rule'             => [
+        'attribute' => '规则',
+        'type'      => '类型',
+        'name'      => '描述',
+        'pattern'   => '值',
+    ],
+    'rule_group'       => [
+        'attribute' => '规则分组',
+        'name'      => '分组名称',
+        'type'      => '审计模式',
+        'rules'     => '选择规则',
+    ],
+    'role'             => [
+        'attribute'   => '角色',
+        'name'        => '名称',
+        'permissions' => '权限',
+    ],
+    'permission'       => [
+        'attribute'   => '权限行为',
+        'description' => '行为描述',
+        'name'        => '路由名称',
+    ],
+    'article'          => [
+        'attribute'  => '文章',
+        'type'       => '类 型',
+        'category'   => '类 别',
+        'language'   => '语 言',
+        'logo'       => '头 图',
+        'created_at' => '发布日期',
+        'updated_at' => '最后更新',
+    ],
+    'coupon'           => [
+        'attribute'          => '卡券',
+        'name'               => '卡券名称',
+        'sn'                 => '使用券码',
+        'logo'               => '卡券图片',
+        'type'               => '类型',
+        'value'              => '优惠额度',
+        'priority'           => '权 重',
+        'usable_times'       => '使用次数',
+        'minimum'            => '满减条件',
+        'used'               => '个人限用',
+        'levels'             => '等级限定',
+        'groups'             => '分组限定',
+        'users_whitelist'    => '专属用户',
+        'users_blacklist'    => '禁用用户',
+        'services_whitelist' => '许可商品',
+        'services_blacklist' => '禁用商品',
+        'newbie'             => '新人专属',
+        'num'                => '数量',
+    ],
+    'aff'              => [
+        'invitee'    => '消费者',
+        'order_id'   => '订单号',
+        'amount'     => '消费金额',
+        'commission' => '返利金额',
+        'updated_at' => '处理时间',
+        'created_at' => '下单时间',
+    ],
+    'referral'         => [
+        'created_at' => '申请时间',
+        'user'       => '申请账号',
+        'amount'     => '申请提现金额',
+        'id'         => '申请单ID',
+    ],
+    'notification'     => [
+        'type'       => '类型',
+        'address'    => '收信地址',
+        'created_at' => '投递时间',
+        'status'     => '投递状态',
+    ],
+    'ip'               => [
+        'network_type' => '通讯类型',
+        'info'         => '归属地',
+    ],
+    'user_traffic'     => [
+        'upload'   => '上传流量',
+        'download' => '下载流量',
+        'total'    => '总流量',
+        'log_time' => '记录时间',
+    ],
+    'user_data_modify' => [
+        'before'      => '变动前流量',
+        'after'       => '变动后流量',
+        'description' => '描述',
+        'created_at'  => '发生时间',
+    ],
+    'user_credit'      => [
+        'before'     => '操作前余额',
+        'after'      => '操作后金额',
+        'amount'     => '发生金额',
+        'created_at' => '发生时间',
+    ],
+];

+ 35 - 0
resources/lang/vi/notification.php

@@ -0,0 +1,35 @@
+<?php
+
+return [
+    'attribute'               => '通知',
+    'new'                     => ':num条新消息',
+    'empty'                   => '目前未收到新消息',
+    'payment_received'        => '订单支付成功,金额::amount,查看详情',
+    'account_expired'         => '账号过期提醒',
+    'account_expired_content' => '您的账号将在【:days】天后过期,为了确保您可以继续正常使用我们的服务,请及时续费。',
+    'account_expired_blade'   => '账号将于【:days天】后过期,请及时续费',
+    'active_email'            => '请在30分钟内完成操作',
+    'close_ticket'            => '工单【:id】:title关闭',
+    'view_web'                => '访问官网',
+    'view_ticket'             => '访问工单',
+    'new_ticket'              => '收到新工单::title',
+    'reply_ticket'            => '工单回复::title',
+    'ticket_content'          => '工单内容:',
+    'node_block'              => '节点阻断警告',
+    'node_offline'            => '节点离线警告',
+    'node_offline_content'    => '以下节点存在异常:心跳异常,可能离线了:',
+    'block_report'            => '阻断日志:',
+    'traffic_warning'         => '流量提醒',
+    'traffic_remain'          => '流量已使用::percent%,请保持关注。',
+    'traffic_tips'            => '请注意套餐流量重置日,合理分配流量使用或在流量耗尽后,付费重置套餐流量',
+    'verification_account'    => '账号验证',
+    'verification'            => '您的验证码:',
+    'verification_limit'      => '请在:minutes分钟内完成验证操作',
+    'data_anomaly'            => '流量异常用户提醒',
+    'data_anomaly_content'    => '用户:id:最近1小时 [上行流量::upload | 下行流量::download | 共计::total]',
+    'node'                    => [
+        'upload'   => '上传',
+        'download' => '下载',
+        'total'    => '总计',
+    ],
+];

+ 6 - 0
resources/lang/vi/pagination.php

@@ -0,0 +1,6 @@
+<?php
+
+return [
+    'previous' => '&laquo; 上一页',
+    'next'     => '下一页 &raquo;',
+];

+ 9 - 0
resources/lang/vi/passwords.php

@@ -0,0 +1,9 @@
+<?php
+
+return [
+    'reset'     => '密码重置成功!',
+    'sent'      => '密码重置邮件已发送!',
+    'throttled' => '请稍候再试。',
+    'token'     => '密码重置令牌无效。',
+    'user'      => '找不到该邮箱对应的用户。',
+];

+ 219 - 0
resources/lang/vi/user.php

@@ -0,0 +1,219 @@
+<?php
+
+return [
+    'account'             => [
+        'credit'           => '账户余额',
+        'status'           => '账号状态',
+        'level'            => '账号等级',
+        'group'            => '所属分组',
+        'speed_limit'      => '限速',
+        'remain'           => '剩余流量',
+        'time'             => '套餐时长',
+        'last_login'       => '最近登录',
+        'reset'            => '{0} 还有 <code id="restTime">:days</code> 重置流量|[1,*] 还有 :days 天重置流量',
+        'connect_password' => '连接密码',
+        'reason'           => [
+            'normal'            => '账号一切正常',
+            'expired'           => '您的账号套餐已过期',
+            'overused'          => '本时段使用流量超过 <code>:data</code> GB触发系统限制<br/> <code id="banedTime">:min</code> 后解除限制',
+            'traffic_exhausted' => '您的账号[流量]消耗殆尽',
+            'unknown'           => '未知原因,请尝试[刷新]你的浏览器!多次无果后再请开工单联系管理',
+        ],
+    ],
+    'home'                => [
+        'attendance'         => [
+            'attribute' => '签 到',
+            'disable'   => '系统未开启签到功能',
+            'done'      => '已经签到过了,明天再来吧!',
+            'success'   => '您获得了 :data 流量',
+            'failed'    => '系统❌异常',
+        ],
+        'traffic_logs'       => '流量记录',
+        'announcement'       => '公告',
+        'wechat_push'        => '微信公告推送',
+        'chat_group'         => '聊天群',
+        'empty_announcement' => '暂无公告',
+    ],
+    'purchase_to_unlock'  => '购买服务后解锁',
+    'purchase_required'   => '本功能对非付费用户禁用!请',
+    'more'                => '更多',
+    'attribute'           => [
+        'node'    => '线路',
+        'data'    => '流量',
+        'ip'      => 'IP地址',
+        'isp'     => '运营商',
+        'address' => '地区',
+    ],
+    'purchase_promotion'  => '快 来 购 买 服 务 吧!',
+    'menu'                => [
+        'helps'           => '帮 助',
+        'home'            => '主 页',
+        'invites'         => '邀 请',
+        'invoices'        => '账 单',
+        'nodes'           => '线 路',
+        'referrals'       => '推 广',
+        'shop'            => '服 务',
+        'profile'         => '设 置',
+        'tickets'         => '工 单',
+        'admin_dashboard' => '管 理',
+    ],
+    'contact'             => '联系方式',
+    'oauth'               => [
+        'bind_title' => '绑定社交账号',
+        'not_bind'   => '尚未绑定',
+        'bind'       => '绑 定',
+        'rebind'     => '重新绑定',
+        'unbind'     => '解 绑',
+    ],
+    'coupon'              => [
+        'attribute' => '优惠券',
+        'voucher'   => '代金券',
+        'recharge'  => '充值券码',
+        'discount'  => '优惠',
+        'error'     => [
+            'unknown'  => '无效优惠券',
+            'used'     => '优惠券已被使用',
+            'expired'  => '优惠券已过期',
+            'run_out'  => '优惠券耗尽',
+            'inactive' => '优惠券尚未生效',
+            'wait'     => '活动将于:time生效,请耐心等待!',
+            'unmet'    => '使用条件未满足',
+            'minimum'  => '本券最低使用金额为 :amount',
+            'overused' => '本券只能使用 :times 次',
+            'users'    => '账户不符合促销条件',
+            'services' => '商品不符合折扣条件,请查看促销条款',
+        ],
+    ],
+    'error_response'      => '出现了错误,请稍后再试。',
+    'invite'              => [
+        'attribute'       => '邀请码',
+        'counts'          => '共 <code>:num</code> 个邀请码',
+        'tips'            => '可生成<strong> :num </strong>枚邀请码,:days 日内有效',
+        'logs'            => '邀请记录',
+        'promotion'       => '通过您的邀请码注册并激活,你们双方都将获得<mark>:traffic</mark>流量奖励;当他们消费时,您将获得他们消费金额的<mark>:referral_percent%</mark>作为奖励。',
+        'generate_failed' => '生成失败:已无邀请码生成名额',
+    ],
+    'reset_data'          => [
+        ''          => '重置流量',
+        'required'  => '需要',
+        'cost_tips' => '本次重置流量将扣除余额 :amount!',
+        'lack'      => '余额不足,请充值余额',
+        'logs'      => '用户自行重置流量',
+        'success'   => '重置成功',
+    ],
+    'referral'            => [
+        'link'    => '推广链接',
+        'total'   => '合计返利 :amount( :total 次),满 :money 可以申请提现。',
+        'logs'    => '佣金记录',
+        'failed'  => '申请失败',
+        'success' => '申请成功',
+        'msg'     => [
+            'account'     => '账号已过期,请先购买服务吧',
+            'applied'     => '已存在申请,请等待之前的申请处理完',
+            'unfulfilled' => '满 :amount 才可以提现,继续努力吧',
+            'wait'        => '请等待管理员审核',
+            'error'       => '返利单建立失败,请稍后尝试或通知管理员',
+        ],
+    ],
+    'inviter'             => '邀请者',
+    'invitee'             => '受邀者',
+    'registered_at'       => '注册时间',
+    'bought_at'           => '购买日期',
+    'payment_method'      => '支付方式',
+    'pay'                 => '支付',
+    'input_coupon'        => '请输入充值券码',
+    'recharge'            => '充值',
+    'recharge_credit'     => '余额充值',
+    'recharging'          => '充值中...',
+    'withdraw_commission' => '结算佣金',
+    'withdraw_at'         => '结算日期',
+    'withdraw_logs'       => '提现记录',
+    'withdraw'            => '提 现',
+    'scan_qrcode'         => '请使用客户端扫描二维码',
+    'shop'                => [
+        'hot'                => '热 销',
+        'limited'            => '限 购',
+        'change_amount'      => '充值金额',
+        'change_amount_help' => '请输入充值金额',
+        'buy'                => '购买',
+        'description'        => '描述',
+        'service'            => '服务',
+        'pay_credit'         => '余额支付',
+        'pay_online'         => '在线支付',
+        'price'              => '价格',
+        'quantity'           => '数量',
+        'subtotal'           => '小计',
+        'total'              => '合计',
+        'conflict'           => '套餐存在冲突',
+        'conflict_tips'      => '<p>当前购买套餐将自动设置为 <code>预支付套餐</code><p><ol class="text-left"><li> 预支付套餐会在生效中的套餐失效后自动开通!</li><li> 您可以在支付后手动激活套餐!</li></ol>',
+        'call4help'          => '请开工单通知客服',
+    ],
+    'service'             => [
+        'node_count'    => '<code>:num</code> 条优质线路',
+        'country_count' => '覆盖 <code>:num</code> 个国家或地区',
+        'unlimited'     => '不限速',
+    ],
+    'payment'             => [
+        'error'           => '充值余额不合规',
+        'creating'        => '创建支付单中...',
+        'redirect_stripe' => '转跳至Stripe支付界面',
+        'qrcode_tips'     => '请使用<strong class="red-600">:software</strong>扫描二维码',
+        'close_tips'      => '请在<code>:minutes分钟</code>内完成支付,否则订单将会自动关闭',
+        'mobile_tips'     => '<strong>手机用户</strong>:长按二维码 -> 保存图片 ->打开支付软件 -> 扫一扫 -> 选择相册 进行付款',
+    ],
+    'invoice'             => [
+        'attribute'               => '订单',
+        'detail'                  => '消费记录',
+        'amount'                  => '金额',
+        'active_prepaid_question' => '是否提前激活预支付套餐?',
+        'active_prepaid_tips'     => '套餐激活后:<br>先前套餐将直接失效!<br>过期日期将由本日重新开始计算!',
+    ],
+    'node'                => [
+        'info'     => '配置信息',
+        'setting'  => '代理设置',
+        'unstable' => '线路波动/维护中',
+        'rate'     => ':ratio倍流量消耗',
+    ],
+    'subscribe'           => [
+        'baned'            => '您的订阅功能被禁用,请联系管理员恢复',
+        'link'             => '订阅链接',
+        'tips'             => '警告:该订阅链接仅限个人使用,请勿传播该链接,否则会导致您的账号流量使用情况异常触发自动封号机制。',
+        'exchange_warning' => '更换订阅地址将导致:\n1.旧地址立即失效\n2.连接密码被更改',
+        'custom'           => '自定义订阅',
+        'ss_only'          => '只订阅SS',
+        'ssr_only'         => '只订阅SSR (包含SS)',
+        'v2ray_only'       => '只订阅V2Ray',
+        'trojan_only'      => '只订阅Trojan',
+        'error'            => '更换订阅地址异常',
+    ],
+    'ticket'              => [
+        'attribute'           => '工单',
+        'submit_tips'         => '确定提交工单?',
+        'reply_confirm'       => '确定回复工单?',
+        'close_tips'          => '您确定要关闭该工单吗?',
+        'close'               => '关闭工单',
+        'failed_closed'       => '错误:该工单已关闭',
+        'reply_placeholder'   => '说些什么呢?',
+        'reply'               => '回复',
+        'close_msg'           => '工单:ID:id用户已手动关闭',
+        'title_placeholder'   => '请简单表示你的问题类型,或者涉及的内容',
+        'content_placeholder' => '请详细的描述您遇到的问题,或者需要我们帮助的地方,以便我们快速帮助到您',
+        'new'                 => '创建新的工单',
+        'working_hour'        => '客服工作时间',
+        'online_hour'         => '在线时间',
+        'service_tips'        => '本站有多种联系方式,请使用其中<code>一种</code>联系客服! <br>重复请求,将会自动延迟处理时间',
+        'error'               => '未知错误!请通知客服',
+    ],
+    'traffic_logs'        => [
+        '24hours' => '今日流量使用情况',
+        '30days'  => '本月流量使用情况',
+        'tips'    => '提示:流量统计更新会有延迟。按天统计于次日更新,按小时统计于次小时更新。',
+    ],
+    'client'              => '客户端',
+    'tutorials'           => '教 程',
+    'current_role'        => '当前身份',
+    'knowledge'           => [
+        'title' => '知 识 库',
+        'basic' => '基 础',
+    ],
+];

+ 137 - 0
resources/lang/vi/validation.php

@@ -0,0 +1,137 @@
+<?php
+
+return [
+    'accepted'             => '您必须接受 :attribute。',
+    'active_url'           => ':attribute 不是一个有效的网址。',
+    'after'                => ':attribute 必须要晚于 :date。',
+    'after_or_equal'       => ':attribute 必须要等于 :date 或更晚。',
+    'alpha'                => ':attribute 只能由字母组成。',
+    'alpha_dash'           => ':attribute 只能由字母、数字、短划线(-)和下划线(_)组成。',
+    'alpha_num'            => ':attribute 只能由字母和数字组成。',
+    'array'                => ':attribute 必须是一个数组。',
+    'before'               => ':attribute 必须要早于 :date。',
+    'before_or_equal'      => ':attribute 必须要等于 :date 或更早。',
+    'between'              => [
+        'numeric' => ':attribute 必须介于 :min - :max 之间。',
+        'file'    => ':attribute 必须介于 :min - :max KB 之间。',
+        'string'  => ':attribute 必须介于 :min - :max 个字符之间。',
+        'array'   => ':attribute 必须只有 :min - :max 个单元。',
+    ],
+    'boolean'              => ':attribute 必须为布尔值。',
+    'confirmed'            => ':attribute 两次输入不一致。',
+    'date'                 => ':attribute 不是一个有效的日期。',
+    'date_equals'          => ':attribute 必须要等于 :date。',
+    'date_format'          => ':attribute 的格式必须为 :format。',
+    'different'            => ':attribute 和 :other 必须不同。',
+    'digits'               => ':attribute 必须是 :digits 位数字。',
+    'digits_between'       => ':attribute 必须是介于 :min 和 :max 位的数字。',
+    'dimensions'           => ':attribute 图片尺寸不正确。',
+    'distinct'             => ':attribute 已经存在。',
+    'email'                => ':attribute 不是一个合法的邮箱。',
+    'ends_with'            => ':attribute 必须以 :values 为结尾。',
+    'exists'               => ':attribute 不存在。',
+    'file'                 => ':attribute 必须是文件。',
+    'filled'               => ':attribute 不能为空。',
+    'gt'                   => [
+        'numeric' => ':attribute 必须大于 :value。',
+        'file'    => ':attribute 必须大于 :value KB。',
+        'string'  => ':attribute 必须多于 :value 个字符。',
+        'array'   => ':attribute 必须多于 :value 个元素。',
+    ],
+    'gte'                  => [
+        'numeric' => ':attribute 必须大于或等于 :value。',
+        'file'    => ':attribute 必须大于或等于 :value KB。',
+        'string'  => ':attribute 必须多于或等于 :value 个字符。',
+        'array'   => ':attribute 必须多于或等于 :value 个元素。',
+    ],
+    'image'                => ':attribute 必须是图片。',
+    'in'                   => '已选的属性 :attribute 无效。',
+    'in_array'             => ':attribute 必须在 :other 中。',
+    'integer'              => ':attribute 必须是整数。',
+    'ip'                   => ':attribute 必须是有效的 IP 地址。',
+    'ipv4'                 => ':attribute 必须是有效的 IPv4 地址。',
+    'ipv6'                 => ':attribute 必须是有效的 IPv6 地址。',
+    'json'                 => ':attribute 必须是正确的 JSON 格式。',
+    'lt'                   => [
+        'numeric' => ':attribute 必须小于 :value。',
+        'file'    => ':attribute 必须小于 :value KB。',
+        'string'  => ':attribute 必须少于 :value 个字符。',
+        'array'   => ':attribute 必须少于 :value 个元素。',
+    ],
+    'lte'                  => [
+        'numeric' => ':attribute 必须小于或等于 :value。',
+        'file'    => ':attribute 必须小于或等于 :value KB。',
+        'string'  => ':attribute 必须少于或等于 :value 个字符。',
+        'array'   => ':attribute 必须少于或等于 :value 个元素。',
+    ],
+    'max'                  => [
+        'numeric' => ':attribute 不能大于 :max。',
+        'file'    => ':attribute 不能大于 :max KB。',
+        'string'  => ':attribute 不能大于 :max 个字符。',
+        'array'   => ':attribute 最多只有 :max 个单元。',
+    ],
+    'mimes'                => ':attribute 必须是一个 :values 类型的文件。',
+    'mimetypes'            => ':attribute 必须是一个 :values 类型的文件。',
+    'min'                  => [
+        'numeric' => ':attribute 必须大于等于 :min。',
+        'file'    => ':attribute 大小不能小于 :min KB。',
+        'string'  => ':attribute 至少为 :min 个字符。',
+        'array'   => ':attribute 至少有 :min 个单元。',
+    ],
+    'multiple_of'          => 'The :attribute must be a multiple of :value',
+    'not_in'               => '已选的属性 :attribute 非法。',
+    'not_regex'            => ':attribute 的格式错误。',
+    'numeric'              => ':attribute 必须是一个数字。',
+    'password'             => '密码错误',
+    'present'              => ':attribute 必须存在。',
+    'regex'                => ':attribute 格式不正确。',
+    'required'             => ':attribute 不能为空。',
+    'required_if'          => '当 :other 为 :value 时 :attribute 不能为空。',
+    'required_unless'      => '当 :other 不为 :values 时 :attribute 不能为空。',
+    'required_with'        => '当 :values 存在时 :attribute 不能为空。',
+    'required_with_all'    => '当 :values 存在时 :attribute 不能为空。',
+    'required_without'     => '当 :values 不存在时 :attribute 不能为空。',
+    'required_without_all' => '当 :values 都不存在时 :attribute 不能为空。',
+    'same'                 => ':attribute 和 :other 必须相同。',
+    'size'                 => [
+        'numeric' => ':attribute 大小必须为 :size。',
+        'file'    => ':attribute 大小必须为 :size KB。',
+        'string'  => ':attribute 必须是 :size 个字符。',
+        'array'   => ':attribute 必须为 :size 个单元。',
+    ],
+    'starts_with'          => ':attribute 必须以 :values 为开头。',
+    'string'               => ':attribute 必须是一个字符串。',
+    'timezone'             => ':attribute 必须是一个合法的时区值。',
+    'unique'               => ':attribute 已经存在。',
+    'uploaded'             => ':attribute 上传失败。',
+    'url'                  => ':attribute 格式不正确。',
+    'uuid'                 => ':attribute 必须是有效的 UUID。',
+
+    'custom' => [
+        'attribute-name' => [
+            'rule-name' => 'custom-message',
+        ],
+    ],
+
+    'attributes' => [
+        'name'                  => '名称',
+        'nickname'              => '昵称',
+        'username'              => '用户名',
+        'email'                 => '邮箱',
+        'password'              => '密码',
+        'password_confirmation' => '确认密码',
+        'phone'                 => '电话',
+        'day'                   => '{1} 天|{2} 日',
+        'month'                 => '月',
+        'year'                  => '年',
+        'hour'                  => '{1} 时|{2} 点',
+        'minute'                => '分',
+        'second'                => '秒',
+        'title'                 => '标题',
+        'content'               => '内容',
+        'description'           => '描述',
+        'excerpt'               => '摘要',
+        'date'                  => '日期',
+        'time'                  => '时间',
+    ],
+];

+ 844 - 0
resources/lang/zh_CN/admin.php

@@ -0,0 +1,844 @@
+<?php
+
+return [
+    'dashboard'           => [
+        'users'                   => '总用户',
+        'available_users'         => '有效用户',
+        'paid_users'              => '付费用户',
+        'active_days_users'       => ':days 日内活跃用户',
+        'inactive_days_users'     => ':days 日以上不活跃用户',
+        'online_users'            => '当前在线',
+        'expiring_users'          => '临近到期',
+        'overuse_users'           => '流量大户(超过90%的用户)',
+        'abnormal_users'          => '1小时内流量异常',
+        'nodes'                   => '节点',
+        'maintaining_nodes'       => '维护中的节点',
+        'traffic_consumed'        => '记录的消耗流量',
+        'traffic_days_consumed'   => ':days 日内消耗流量',
+        'orders'                  => '总订单数',
+        'online_orders'           => '在线支付订单数',
+        'succeed_orders'          => '支付成功订单数',
+        'credit'                  => '总余额',
+        'withdrawing_commissions' => '待提现佣金',
+        'withdrawn_commissions'   => '已支出佣金',
+    ],
+    'action'              => [
+        'edit_item' => '编辑:attribute',
+        'add_item'  => '添加:attribute',
+    ],
+    'confirm'             => [
+        'delete'    => [0 => '确定删除:attribute【', 1 => '】? '],
+        'continues' => '确定继续操作吗? ',
+        'export'    => '确定全部导出? ',
+    ],
+    'user_dashboard'      => '个人中心',
+    'menu'                => [
+        'dashboard'        => '管理中心',
+        'user'             => [
+            'attribute'  => '用户系统',
+            'list'       => '用户管理',
+            'oauth'      => '用户授权',
+            'group'      => '用戶分组',
+            'credit_log' => '余额变动',
+            'subscribe'  => '订阅管理',
+        ],
+        'rbac'             => [
+            'attribute'  => '权限系统',
+            'permission' => '权限列表',
+            'role'       => '角色列表',
+        ],
+        'customer_service' => [
+            'attribute' => '客服系统',
+            'ticket'    => '服务工单',
+            'article'   => '文章管理',
+            'push'      => '消息推送',
+            'mail'      => '邮件群发',
+        ],
+        'node'             => [
+            'attribute' => '线路系统',
+            'list'      => '线路管理',
+            'auth'      => '线路授权',
+            'cert'      => '证书列表',
+        ],
+        'rule'             => [
+            'attribute' => '审计规则',
+            'list'      => '规则列表',
+            'group'     => '规则分组',
+            'trigger'   => '触发记录',
+        ],
+        'shop'             => [
+            'attribute' => '商品系统',
+            'goods'     => '商品管理',
+            'coupon'    => '卡券管理',
+            'order'     => '商品订单',
+        ],
+        'promotion'        => [
+            'attribute'   => '推广系统',
+            'invite'      => '邀请管理',
+            'withdraw'    => '提现管理',
+            'rebate_flow' => '返利流水',
+        ],
+        'analysis'         => [
+            'attribute'  => '分析报告',
+            'accounting' => '流水账簿',
+            'user_flow'  => '用户分析',
+        ],
+        'log'              => [
+            'attribute'        => '日志系统',
+            'traffic'          => '流量使用',
+            'traffic_flow'     => '流量变动',
+            'service_ban'      => '封禁记录',
+            'online_logs'      => '在线记录',
+            'online_monitor'   => '在线监控',
+            'notify'           => '通知记录',
+            'payment_callback' => '支付回调',
+            'system'           => '系统日志',
+        ],
+        'tools'            => [
+            'attribute' => '工具箱',
+            'decompile' => '反解析',
+            'convert'   => '格式转换',
+            'import'    => '数据导入',
+            'analysis'  => '日志分析',
+        ],
+        'setting'          => [
+            'attribute'    => '设置',
+            'email_suffix' => '邮箱后缀管理',
+            'universal'    => '通用配置',
+            'system'       => '系统设置',
+        ],
+    ],
+    'user'                => [
+        'massive'         => [
+            'text'    => '用户生成数量',
+            'button'  => '批量生成',
+            'failed'  => '批量生成账号失败',
+            'succeed' => '批量生成账号成功',
+            'note'    => '后台批量生成用户',
+        ],
+        'proxy_info'      => '配置信息',
+        'traffic_monitor' => '流量统计',
+        'online_monitor'  => '在线巡查',
+        'reset_traffic'   => '重置流量',
+        'user_view'       => '用户视角',
+        'connection_test' => '联网测试',
+        'counts'          => '共 <code>:num</code> 个账号',
+        'reset_confirm'   => [0 => '确定重置 【', 1 => '】 流量吗?'],
+        'info'            => [
+            'account'              => '账号信息',
+            'proxy'                => '代理信息',
+            'switch'               => '切换身份',
+            'reset_date_hint'      => '账号流量下一个重置日期',
+            'expired_date_hint'    => '留空默认为一年',
+            'uuid_hint'            => 'V2Ray的账户ID',
+            'recharge_placeholder' => '填入负值则会扣余额',
+        ],
+        'update_help'     => '更新成功,是否返回?',
+        'proxies_config'  => '【:username】连接配置信息',
+        'group'           => [
+            'title'  => '用户分组控制<small>(同一节点可分配至多个分组,一个用户只能属于一个分组;对于用户可见/可用节点:先按分组后按等级)</small>',
+            'name'   => '分组名称',
+            'counts' => ' 共 <code>:num</code> 个分组',
+        ],
+    ],
+    'zero_unlimited_hint' => '不设置/0,即为无限制',
+    'node'                => [
+        'traffic_monitor' => '流量统计',
+        'refresh_geo'     => '刷新地理',
+        'ping'            => '检测延迟',
+        'connection_test' => '连通性检测',
+        'counts'          => '共 <code> :num </code> 条线路',
+        'reload_all'      => '重载【全部】后端',
+        'refresh_geo_all' => '刷新【全部】节点地理信息',
+        'reload_confirm'  => '确定重载节点?',
+        'info'            => [
+            'hint'                  => '<strong>注意:</strong> 添加节点后自动生成的<code>ID</code>,即为该节点部署ShadowsocksR Python版后端时<code>usermysql.json</code>中的<code>node_id</code>的值,同时也是部署V2Ray后端时的<code>nodeId</code>的值;',
+            'basic'                 => '基础信息',
+            'ddns_hint'             => '动态IP节点需要<a href="https://github.com/NewFuture/DDNS" target="_blank">配置DDNS</a>,对此类型节点,节点阻断功能会通过域名进行检测',
+            'domain_placeholder'    => '服务器域名地址,填则优先取域名地址',
+            'domain_hint'           => '系统设置中开启【DDNS模式】,域名将会自动与下方IP内容进行绑定操作!无需再前往域名注册商页面修改IP信息了哟',
+            'extend'                => '扩展信息',
+            'display'               => [
+                'invisible' => '完全不可见',
+                'node'      => '只显示于【:trans】页面',
+                'sub'       => '只显示于【订 阅】',
+                'all'       => '完全可见',
+                'hint'      => '用户是否可以订阅/看到本节点',
+            ],
+            'ipv4_hint'             => '多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8',
+            'ipv6_hint'             => '多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8',
+            'ipv4_placeholder'      => '服务器IPv4地址',
+            'ipv6_placeholder'      => '服务器IPv6地址,填写则用户可见,域名无效',
+            'push_port_hint'        => '必填且防火墙需放行,否则将导致消息推送异常',
+            'data_rate_hint'        => '举例:0.1用100M结算10M,5用100M结算500M',
+            'level_hint'            => '等级:0-无等级,全部可见',
+            'detection'             => [
+                'tcp'  => '只检测TCP',
+                'icmp' => '只检测ICMP',
+                'all'  => '检测全部',
+                'hint' => '每30~60分钟随机进行节点阻断检测',
+            ],
+            'obfs_param_hint'       => '混淆不为 [plain] 时可填入参数进行流量伪装;&#13;&#10;混淆为 [http_simple] 时,建议端口为 80;&#13;&#10;混淆为 [tls] 时,建议端口为 443;',
+            'additional_ports_hint' => '如果启用请配置服务端的<span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span>信息',
+            'v2_method_hint'        => '使用WebSocket传输协议时不要使用none',
+            'v2_net_hint'           => '使用WebSocket传输协议时请启用TLS',
+            'v2_cover'              => [
+                'none'      => '无伪装',
+                'http'      => 'HTTP数据流',
+                'srtp'      => '视频通话数据 (SRTP)',
+                'utp'       => 'BT下载数据 (uTP)',
+                'wechat'    => '微信视频通话',
+                'dtls'      => 'DTLS1.2数据包',
+                'wireguard' => 'WireGuard数据包',
+            ],
+            'v2_host_hint'          => '伪装类型为http时多个伪装域名逗号隔开,使用WebSocket传输协议时只允许单个',
+            'v2_tls_provider_hint'  => '不同后端配置不同:',
+            'single_hint'           => '推荐80或443,服务端需要配置 <br> 严格模式:用户的端口无法连接,只能通过以下指定的端口进行连接(<a href="javascript:showPortsOnlyConfig();">如何配置</a>)',
+        ],
+        'proxy_info'      => '*兼容 SS',
+        'proxy_info_hint' => '如果兼容请在服务端配置协议和混淆时加上<span class="red-700">_compatible</span>',
+        'reload'          => '重载后端',
+        'auth'            => [
+            'title'          => '节点授权列表<small>WEBAPI</small>',
+            'deploy'         => [
+                'title'          => '部署 :type_label 后端',
+                'attribute'      => '部署后端',
+                'command'        => '操作命令',
+                'update'         => '更新:',
+                'uninstall'      => '卸载:',
+                'start'          => '启动:',
+                'stop'           => '停止:',
+                'status'         => '状态:',
+                'recent_logs'    => '近期日志:',
+                'real_time_logs' => '实时日志:',
+                'restart'        => '重启:',
+                'same'           => '同上',
+                'trojan_hint'    => '请先<a href=":url" target="_blank">填写节点域名</a>并将域名解析到节点对应的IP上',
+            ],
+            'reset_auth'     => '重置密钥',
+            'counts'         => '共 <code>:num</code> 条授权',
+            'generating_all' => '确定生成所有节点的授权吗?',
+        ],
+        'cert'            => [
+            'title'           => '域名证书列表<small>(V2Ray节点的伪装域名)</small>',
+            'counts'          => '共 <code>:num</code> 个域名证书',
+            'key_placeholder' => '域名证书的KEY值,允许为空,VNET-V2Ray后端支持自动签证书',
+            'pem_placeholder' => '域名证书的PEM值,允许为空,VNET-V2Ray后端支持自动签证书',
+        ],
+    ],
+    'hint'                => '提示',
+    'oauth'               => [
+        'title'  => '用户OAuth授权',
+        'counts' => '共 <code>:num</code> 个授权',
+    ],
+    'select_all'          => '全 选',
+    'clear'               => '清 空',
+    'unselected_hint'     => '待分配规则,此处可搜索',
+    'selected_hint'       => '已分配规则,此处可搜索',
+    'clone'               => '克隆',
+    'monitor'             => [
+        'daily_chart'   => '每日流量图',
+        'monthly_chart' => '月流量图',
+        'node'          => '节点流量',
+        'user'          => '用户流量',
+        'hint'          => '<strong>提示:</strong> 如果无统计数据,请检查定时任务是否正常。',
+    ],
+    'tools'               => [
+        'analysis'  => [
+            'title'      => 'SSR日志分析<small>仅适用于单机单节点</small>',
+            'req_url'    => '近期请求地址',
+            'not_enough' => '访问记录不足15000条,无法分析数据',
+        ],
+        'convert'   => [
+            'title'               => '格式转换 <small>Shadowsocks 转 ShadowsocksR</small>',
+            'content_placeholder' => '请填入要转换的配置信息',
+        ],
+        'decompile' => [
+            'title'               => '反解析<small>配置转换</small>',
+            'attribute'           => '反解析',
+            'content_placeholder' => '请填入要反解析的ShadowsocksR链接,一行一条',
+        ],
+    ],
+    'ticket'              => [
+        'title'         => '工单列表',
+        'counts'        => '共 <code>:num</code> 个工单',
+        'send_to'       => '请填入目标用户信息!',
+        'user_info'     => '用户信息',
+        'inviter_info'  => '邀请人信息',
+        'close_confirm' => '确定关闭工单?',
+        'error'         => '未知错误!请查看运行日志',
+    ],
+    'logs'                => [
+        'subscribe'              => '订阅列表',
+        'counts'                 => '共 <code>:num</code> 条记录',
+        'rule'                   => [
+            'clear_all'     => '清空记录',
+            'title'         => '触发记录',
+            'name'          => '触发规则',
+            'reason'        => '触发原因',
+            'created_at'    => '触发时间',
+            'tag'           => '✅ 访问非规则允许内容',
+            'clear_confirm' => '确定清空所有记录吗?',
+        ],
+        'order'                  => [
+            'title'      => '订单列表',
+            'is_expired' => '是否过期',
+            'is_coupon'  => '是否使用优惠券',
+        ],
+        'user_traffic'           => [
+            'title'       => '流量使用记录',
+            'choose_node' => '选择节点',
+        ],
+        'user_data_modify_title' => '流量变动记录',
+        'callback'               => '回调日志 <small>(在线支付)</small>',
+        'notification'           => '邮件投递记录',
+        'ip_monitor'             => '在线IP监控 <small>2分钟内的实时数据</small>',
+        'user_ip'                => [
+            'title'   => '用户在线IP列表 <small>最近10分钟</small>',
+            'connect' => '连接IP',
+        ],
+        'ban'                    => [
+            'title'           => '用户封禁记录',
+            'time'            => '时长',
+            'reason'          => '理由',
+            'ban_time'        => '封禁时间',
+            'last_connect_at' => '最后连接时间',
+        ],
+        'credit_title'           => '余额变动记录',
+    ],
+    'start_time'          => '开始区间',
+    'end_time'            => '结束区间',
+    'goods'               => [
+        'title'         => '商品列表',
+        'type'          => [
+            'top_up'  => '充值',
+            'package' => '流量包',
+            'plan'    => '套餐',
+        ],
+        'info'          => [
+            'type_hint'           => '套餐与账号有效期有关,流量包只扣可用流量,不影响有效期',
+            'period_hint'         => '套餐流量会每N天重置',
+            'limit_num_hint'      => '每个用户可以购买该商品次数,为 0 时代表不限购',
+            'available_date_hint' => '到期后会自动从总流量扣减对应的流量',
+            'desc_placeholder'    => '商品的简单描述',
+            'list_placeholder'    => '商品的自定义列表添加',
+            'list_hint'           => '每行内容请以<code>&lt;li&gt;</code> 开头<code>&lt;/li&gt;</code> 结尾',
+        ],
+        'status'        => [
+            'yes' => '上架',
+            'no'  => '下架',
+        ],
+        'sell_and_used' => '使用 / 销售',
+        'counts'        => '共 <code>:num</code> 个商品',
+    ],
+    'sort_asc'            => '排序值越大排越前',
+    'yes'                 => '是',
+    'no'                  => '否',
+    'rule'                => [
+        'type'   => [
+            'reg'      => '正则表达式',
+            'domain'   => '域名',
+            'ip'       => 'IP',
+            'protocol' => '协议',
+        ],
+        'counts' => '共 <code>:num</code> 条审计规则',
+        'title'  => '规则列表',
+        'group'  => [
+            'type'   => [
+                'off' => '阻断',
+                'on'  => '放行',
+            ],
+            'title'  => '规则分组',
+            'counts' => '共 <code>:num</code> 个分组',
+        ],
+    ],
+    'role'                => [
+        'name_hint'        => '唯一标识名称,例如:Administrator',
+        'description_hint' => '面板显示名称,例如:管理员',
+        'title'            => '权限角色列表',
+        'permissions_all'  => '全部权限',
+        'counts'           => '共 <code>:num</code> 个权限角色',
+    ],
+    'report'              => [
+        'monthly_accounting'  => '月流水账簿',
+        'annually_accounting' => '年流水账簿',
+        'historic_accounting' => '历史流水账簿',
+        'current_month'       => ' 本 月 ',
+        'last_month'          => ' 上 月',
+        'current_year'        => ' 今 年 ',
+        'last_year'           => ' 去 年 ',
+        'hourly_traffic'      => '每时流量',
+        'daily_traffic'       => '每天流量',
+        'today'               => ' 本 日 ',
+    ],
+    'permission'          => [
+        'title'            => '权限行为列表',
+        'description_hint' => '填写描述,例:【A系统】编辑A',
+        'name_hint'        => '填写路由名称,例:admin.permission.create,update',
+        'counts'           => '共 <code>:num</code> 条权限行为',
+    ],
+    'marketing'           => [
+        'email'         => [
+            'title'      => '邮件群发列表',
+            'group_send' => '群发邮件',
+            'counts'     => '共 <code>:num</code> 条消息',
+        ],
+        'send_status'   => '发送状态',
+        'send_time'     => '发送时间',
+        'error_message' => '错误信息',
+        'push'          => [
+            'title'  => '推送消息列表',
+            'send'   => '推送消息',
+            'counts' => '共 <code>:num</code> 条推送消息',
+        ],
+    ],
+    'creating'            => '正在添加...',
+    'article'             => [
+        'type'          => [
+            'knowledge'    => '文章',
+            'announcement' => '公告',
+        ],
+        'category_hint' => '同一类别将归类与同一文件夹下',
+        'logo_hint'     => '推荐尺寸:100x75',
+        'title'         => '文章列表',
+        'counts'        => '共 <code>:num</code> 篇文章',
+    ],
+    'coupon'              => [
+        'title'                   => '卡券列表',
+        'name_hint'               => '会用于前端显示',
+        'sn_hint'                 => '提供给用户使用卡券的卡券,留空则默认为8位随机码',
+        'type'                    => [
+            'voucher'  => '抵用券',
+            'discount' => '折扣券',
+            'charge'   => '充值券',
+        ],
+        'type_hint'               => '抵用:抵扣商品金额,折扣:商品百分比打折,充值:充值用户账号余额',
+        'value'                   => '{1} ➖ :num|{2} :num 折|{3} ➕ :num',
+        'value_hint'              => '范围为 1% ~ 99% ',
+        'priority_hint'           => '同【使用券码】下,符合条件的高权重码将会被优先使用。最高为 255',
+        'minimum_hint'            => '当支付金额超过 <strong>:num</strong> 值时,才能使用本优惠劵;',
+        'used_hint'               => '符合条件的用户可以使用本券 <strong>:num</strong> 次;',
+        'levels_hint'             => '用户等级在选定等级内,方可使用本券',
+        'groups_hint'             => '选定的用户分组,方可使用本券',
+        'users_placeholder'       => '输入用户ID, 再回车',
+        'user_whitelist_hint'     => '涉及用户均可使用本券,留空为不使用此条件',
+        'users_blacklist_hint'    => '涉及用户均不可使用本券,空为不使用此条件',
+        'services_placeholder'    => '输入商品ID, 再回车',
+        'services_whitelist_hint' => '涉及商品方可使用本券,留空为不使用此条件',
+        'services_blacklist_hint' => '涉及商品不可使用本券,留空为不使用此条件',
+        'newbie'                  => [
+            'first_discount' => '首次用任意券',
+            'first_order'    => '首单',
+            'created_days'   => '创号',
+        ],
+        'created_days_hint'       => '且 创号 <code>:days</code> 天',
+        'limit_hint'              => '本项各条件为 <strong>并且</strong> 关系,请自行搭配使用',
+        'info_title'              => '卡券信息',
+        'counts'                  => '共 <code>:num</code> 张优惠券',
+        'discount'                => '优惠',
+        'export_title'            => '卡券导出',
+        'single_use'              => '一次性',
+    ],
+    'times'               => '次',
+    'massive_export'      => '批量导出',
+    'system_generate'     => '系统生成',
+    'aff'                 => [
+        'rebate_title'      => '返利流水记录',
+        'counts'            => '共 <code>:num</code> 个申请',
+        'title'             => '提现申请列表',
+        'apply_counts'      => '共 <code>:num</code> 个申请',
+        'referral'          => '推广返利',
+        'commission_title'  => '提现申请详情',
+        'commission_counts' => '本申请共涉及 <code>:num</code> 单',
+    ],
+    'setting'             => [
+        'common'        => [
+            'title'         => '通用配置',
+            'set_default'   => '设为默认',
+            'connect_nodes' => '关联节点数',
+        ],
+        'email'         => [
+            'title'            => '邮箱过滤列表 <small>(用于屏蔽注册邮箱后缀)</small>',
+            'tail'             => '邮箱后缀',
+            'rule'             => '规则',
+            'black'            => '黑名单',
+            'white'            => '白名单',
+            'tail_placeholder' => '请填入邮箱后缀',
+        ],
+        'system'        => [
+            'title'     => '系统配置',
+            'web'       => '网站常规',
+            'account'   => '账号设置',
+            'node'      => '节点设置',
+            'extend'    => '拓展功能',
+            'check_in'  => '签到系统',
+            'promotion' => '推广系统',
+            'notify'    => '通知系统',
+            'auto_job'  => '自动任务',
+            'other'     => 'LOGO|客服|统计',
+            'payment'   => '支付系统',
+            'menu'      => '菜单',
+        ],
+        'no_permission' => '您没有权限修改参数!',
+    ],
+    'system'              => [
+        'account_expire_notification'   => '账号过期通知',
+        'active_times'                  => '激活账号次数',
+        'admin_invite_days'             => '管理员-邀请码有效期',
+        'aff_salt'                      => '邀请链接 用户信息字符化',
+        'alipay_qrcode'                 => '支付宝二维码',
+        'AppStore_id'                   => '苹果账号',
+        'AppStore_password'             => '苹果密码',
+        'auto_release_port'             => '端口回收机制',
+        'bark_key'                      => 'Bark设备号',
+        'bitpay_secret',
+        'captcha_key'                   => '验证码 Key',
+        'captcha_secret'                => '验证码 Secret/ID',
+        'codepay_id'                    => '码支付ID',
+        'codepay_key'                   => '通信密钥',
+        'codepay_url'                   => '请求URL',
+        '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'                   => '禁止访问模式',
+        'invite_num'                    => '可生成邀请码数',
+        'is_activate_account'           => '激活账号',
+        'is_AliPay'                     => '支付宝支付',
+        'is_ban_status'                 => '过期自动封禁',
+        'is_captcha'                    => '验证码模式',
+        'is_checkin'                    => '签到加流量',
+        'is_clear_log'                  => '自动清除日志',
+        'is_custom_subscribe'           => '高级订阅',
+        'is_email_filtering'            => '邮箱过滤机制',
+        'is_forbid_robot'               => '阻止机器人访问',
+        'is_free_code'                  => '免费邀请码',
+        'is_invite_register'            => '邀请注册',
+        'is_otherPay'                   => '特殊支付',
+        'is_push_bear',
+        'is_QQPay'                      => 'QQ钱包',
+        'is_rand_port'                  => '随机端口',
+        'is_register'                   => '用户注册',
+        'is_subscribe_ban'              => '订阅异常自动封禁',
+        'is_traffic_ban'                => '异常自动封号',
+        'is_WeChatPay'                  => '微信支付',
+        'iYuu_token'                    => 'IYUU令牌',
+        'maintenance_content'           => '维护介绍内容',
+        'maintenance_mode'              => '维护模式',
+        'maintenance_time'              => '维护结束时间',
+        'max_port',
+        'max_rand_traffic',
+        'min_port'                      => '端口范围',
+        'min_rand_traffic'              => '流量范围',
+        'node_blocked_notification'     => '节点阻断提醒',
+        'node_daily_notification'       => '节点使用报告',
+        'node_offline_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_confirm_notification'  => '人工支付确认通知',
+        'payment_received_notification' => '支付成功通知',
+        'paypal_app_id'                 => '应用ID',
+        'paypal_certificate'            => '证书',
+        'paypal_password'               => 'API密码',
+        'paypal_secret'                 => '签名',
+        'paypal_username'               => 'API用户名',
+        'pushDeer_key'                  => 'PushDeer Key',
+        'pushplus_token'                => 'PushPlus Token',
+        'rand_subscribe'                => '随机订阅',
+        'redirect_url'                  => '重定向地址',
+        'referral_money'                => '提现限制',
+        'referral_percent'              => '返利比例',
+        'referral_status'               => '推广功能',
+        'referral_traffic'              => '注册送流量',
+        'referral_type'                 => '返利模式',
+        '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_ban_times'           => '订阅请求阈值
+',
+        'subscribe_domain'              => '节点订阅地址',
+        'subscribe_max'                 => '订阅节点数',
+        '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_ban_time'              => '封号时长',
+        'traffic_ban_value'             => '流量异常阈值',
+        'traffic_limit_time'            => '时间间隔',
+        'traffic_warning_percent'       => '流量警告阈值',
+        'trojan_license'                => 'Trojan授权',
+        'username_type'                 => '账号类型',
+        'user_invite_days'              => '用户-邀请码有效期',
+        'v2ray_license'                 => 'V2Ray授权',
+        'v2ray_tls_provider'            => 'V2Ray TLS配置',
+        'webmaster_email'               => '管理员邮箱',
+        'website_analytics'             => '统计代码',
+        'website_callback_url'          => '通用支付回调地址',
+        'website_customer_service'      => '客服代码',
+        'website_home_logo'             => '首页LOGO',
+        'website_logo'                  => '站内LOGO',
+        'website_name'                  => '网站名称',
+        'website_security_code'         => '网站安全码',
+        'website_url'                   => '网站地址',
+        'web_api_url'                   => '授权/后端访问域名',
+        'wechat_aid'                    => '微信企业应用ID',
+        'wechat_cid'                    => '微信企业ID',
+        'wechat_encodingAESKey'         => '微信企业应用EncodingAESKey',
+        'wechat_qrcode'                 => '微 信二维码',
+        'wechat_secret'                 => '微信企业应用密钥',
+        'wechat_token'                  => '微信企业应用TOKEN',
+
+        'hint'           => [
+            'account_expire_notification'   => '通知用户账号即将到期',
+            'active_times'                  => '24小时内可以通过邮件激活账号次数',
+            'admin_invite_days'             => '管理员生成邀请码的有效期',
+            'aff_salt'                      => '留空时,邀请链接将显示用户ID;填入任意英文/数字 即可对用户链接ID进行加密',
+            'alipay_qrcode',
+            'AppStore_id'                   => 'iOS软件设置教程中使用的苹果账号',
+            'AppStore_password'             => 'iOS软件设置教程中使用的苹果密码',
+            'auto_release_port'             => '被封禁/过期 <code>'.config('tasks.release_port').'</code> 天的账号端口自动释放',
+            'bark_key'                      => '推送消息到iOS设备,需要在iOS设备里装一个名为Bark的应用,取网址后的一长串字符串,启用Bark,请务必填入本值',
+            'bitpay_secret',
+            'captcha_key'                   => '浏览<a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">设置指南</a>来设置',
+            'captcha_secret',
+            'codepay_id',
+            'codepay_key',
+            'codepay_url',
+            'data_anomaly_notification'     => '1小时内流量超过异常阈值通知超管',
+            'data_exhaust_notification'     => '通知用户流量即将耗尽',
+            'ddns_key'                      => "浏览<a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>设置指南</a>来设置",
+            'ddns_mode'                     => '添加/编辑/删除节点的【域名、ipv4、ipv6】时,自动更新对应内容至DNS服务商',
+            'ddns_secret',
+            'default_days'                  => '用户注册时默认账户有效期,为0即当天到期',
+            'default_traffic'               => '用户注册时默认可用流量',
+            'detection_check_times'         => '提醒N次后自动下线节点,为0/留空时不限制,不超过12',
+            'dingTalk_access_token'         => '可以阅读<a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>钉钉手册</a>查阅步骤',
+            'dingTalk_secret'               => '可选填!开启机器人[加签]就是必填项目!',
+            'epay_key',
+            'epay_mch_id',
+            'epay_url',
+            'expire_days'                   => '【账号过期通知】开始阈值,每日通知用户',
+            'f2fpay_app_id'                 => '即:APPID',
+            'f2fpay_private_key'            => '生成秘钥软件生成时,产生的应用秘钥',
+            'f2fpay_public_key'             => '注意不是应用公钥!',
+            'forbid_mode'                   => '依据IP对对应地区进行阻拦,非阻拦地区可正常访问',
+            'invite_num'                    => '用户可以生成的邀请码数',
+            'is_activate_account'           => '启用后用户需要通过邮件来激活账号',
+            'is_AliPay',
+            'is_ban_status'                 => '(慎重)封禁整个账号会重置账号的所有数据且会导致用户无法登录,不开启状态下只封禁用户代理',
+            'is_captcha'                    => '启用后 登录/注册 需要进行验证码认证',
+            'is_checkin'                    => '登录时将根据流量范围随机得到流量',
+            'is_clear_log'                  => '(推荐)启用后自动清除无用日志',
+            'is_custom_subscribe'           => '启用后,订阅信息顶部将显示过期时间、剩余流量(只支持个别客户端)',
+            'is_email_filtering'            => '黑名单: 用户可使用任意黑名单外的邮箱注册;白名单:用户只能选择使用白名单中的邮箱后缀注册',
+            'is_forbid_robot'               => '如果是机器人、爬虫、代理访问网站则会抛出404错误',
+            'is_free_code'                  => '关闭后免费邀请码不可见',
+            'is_invite_register',
+            'is_otherPay',
+            'is_push_bear',
+            'is_QQPay',
+            'is_rand_port'                  => '注册、添加用户时随机生成端口',
+            'is_register'                   => '关闭后无法注册',
+            'is_subscribe_ban'              => '启用后用户订阅链接请求超过设定阈值则自动封禁',
+            'is_traffic_ban'                => '1小时内流量超过异常阈值则自动封号(仅禁用代理)',
+            'is_WeChatPay',
+            'iYuu_token'                    => '启用爱语飞飞,请务必填入本值(<a href=http://iyuu.cn target=_blank>申请 IYUU令牌</a>)',
+            'maintenance_content'           => '自定义维护内容信息',
+            'maintenance_mode'              => "启用后,用户访问转移至维护界面 | 管理员使用 <a href='javascript:(0)'>:url</a> 登录",
+            'maintenance_time'              => '用于维护界面倒计时',
+            'max_port',
+            'max_rand_traffic',
+            'min_port'                      => '端口范围:1000 - 65535',
+            'min_rand_traffic',
+            'node_blocked_notification'     => '每小时检测节点是否被阻断并提醒管理员',
+            'node_daily_notification'       => '报告各节点流量昨日消耗情况',
+            'node_offline_notification'     => '每10分钟检测节点离线并提醒管理员',
+            'oauth_path'                    => '请在.ENV中添加设置,再在此处开启平台',
+            'offline_check_times'           => '24小时内提醒n次后不再提醒',
+            'password_reset_notification'   => '启用后用户可以重置密码',
+            'paybeaver_app_id'              => '<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -> 开发者 -> App ID',
+            'paybeaver_app_secret'          => '<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -> 开发者 -> App Secret',
+            'payjs_key',
+            'payjs_mch_id'                  => '在<a href="https://payjs.cn/dashboard/member" target="_blank">本界面</a>获取信息',
+            'payment_confirm_notification'  => '用户使用人工支付后通知管理员处理订单',
+            'payment_received_notification' => '用户支付订单后通知用户订单状态',
+            'paypal_app_id',
+            'paypal_certificate',
+            'paypal_password',
+            'paypal_secret',
+            'paypal_username',
+            'pushDeer_key'                  => '启用PushDeer,请务必填入本值(<a href=http://www.pushdeer.com/official.html
+                                    target=_blank>申请 Push Key</a>)',
+            'pushplus_token'                => '启用PushPlus,请务必填入本值(<a href=https://www.pushplus.plus/push1.html target=_blank>申请 Token</a>)',
+            'rand_subscribe'                => '启用后,订阅时将随机返回节点信息,否则按节点排序返回',
+            'redirect_url'                  => '触发审计规则时访问请求被阻断并重定向至该地址',
+            'referral_money'                => '满多少元才可以申请提现',
+            'referral_percent'              => '根据推广链接注册的账号每笔消费推广人可以分成的比例',
+            'referral_status'               => '关闭后用户不可见,但是不影响其正常邀请返利',
+            'referral_traffic'              => '根据推广链接、邀请码注册则赠送相应的流量',
+            'referral_type'                 => '切换模式后旧数据不变,新的返利按新的模式计算',
+            'register_ip_limit'             => '同IP在24小时内允许注册数量,为0/留空时不限制',
+            'reset_password_times'          => '24小时内可以通过邮件重置密码次数',
+            'reset_traffic'                 => '用户会按其购买套餐的日期自动重置可用流量',
+            'server_chan_key'               => "启用ServerChan,请务必填入本值(<a href=https://sc.ftqq.com target=_blank>申请 SCKEY</a>)",
+            'standard_currency'             => '网站中涉及金钱部分的默认货币',
+            'stripe_public_key',
+            'stripe_secret_key',
+            'stripe_signing_secret',
+            'subject_name'                  => '用于在支付渠道的商品标题显示',
+            'subscribe_ban_times'           => '24小时内订阅链接请求次数限制',
+            'subscribe_domain'              => '(推荐)防止面板域名被DNS投毒后无法正常订阅,需带http://或https://"',
+            'subscribe_max'                 => '客户端订阅时取得几个节点,为0/留空时返回全部节点',
+            'telegram_token'                => '找 <a href=https://t.me/BotFather target=_blank>@BotFather</a> 申请机器人获取TOKEN',
+            'tg_chat_token'                 => '启用TG酱,请务必填入本值(<a href=https://t.me/realtgchat_bot target=_blank>申请 Token</a>)',
+            'theadpay_key',
+            'theadpay_mchid',
+            'theadpay_url',
+            'ticket_closed_notification'    => '工单关闭通知用户',
+            'ticket_created_notification'   => '新工单通知管理/用户,取决于谁创建了新工单',
+            'ticket_replied_notification'   => '工单回复通知对方',
+            'traffic_ban_time'              => '触发流量异常导致用户被封禁的时长,到期后自动解封',
+            'traffic_ban_value'             => '1小时内超过该值,则触发自动封号',
+            'traffic_limit_time'            => '间隔多久才可以再次签到',
+            'traffic_warning_percent'       => '【流量耗尽通知】开始阈值,每日通知用户',
+            'trojan_license',
+            'username_type'                 => '规范站点用户账号的类型,默认为电子邮箱',
+            'user_invite_days'              => '用户自行生成邀请的有效期',
+            'v2ray_license',
+            'v2ray_tls_provider'            => '后端自动签发/载入TLS证书时用(节点的设置值优先级高于此处)',
+            'webmaster_email'               => '错误提示时会提供管理员邮箱作为联系方式',
+            'website_analytics'             => '统计JS',
+            'website_callback_url'          => '防止因为网站域名被DNS投毒后导致支付无法正常回调,需带http://或https://',
+            'website_customer_service'      => '客服JS',
+            'website_home_logo',
+            'website_logo',
+            'website_name'                  => '发邮件时展示',
+            'website_security_code'         => '非空时必须通过<a href=":url" target="_blank">安全入口</a>加上安全码才可访问',
+            'website_url'                   => '生成重置密码、在线支付必备',
+            'web_api_url'                   => '例:https://demo.proxypanel.cf',
+            'wechat_aid'                    => '在<a href=https://work.weixin.qq.com/wework_admin/frame#apps arget=_blank>应用管理</a>自建中创建应用 - AgentId',
+            'wechat_cid'                    => '获取<a href=https://work.weixin.qq.com/wework_admin/frame#profile target=_blank>我的企业</a>中的企业ID',
+            'wechat_encodingAESKey'         => '应用管理->应用->设置API接收->EncodingAESKey',
+            'wechat_qrcode',
+            'wechat_secret'                 => '应用的Secret(可能需要下载企业微信才能查看)',
+            'wechat_token'                  => '应用管理->应用->设置API接收->TOKEN,URL设置::url',
+        ],
+        'placeholder'    => [
+            'default_url'           => '默认为 :url',
+            'server_chan_key'       => '填入ServerChan的SCKEY->再点击更新',
+            'pushDeer_key'          => '填入PushDeer的Push Key -> 再点击更新',
+            'iYuu_token'            => '填入爱语飞飞的IYUU令牌 -> 再点击更新',
+            'bark_key'              => '填入Bark的设备号 -> 再点击更新',
+            'telegram_token'        => '填入Telegram的 Token -> 再点击更新',
+            'pushplus_token'        => '请到ServerChan申请',
+            'dingTalk_access_token' => '自定义机器人的WebHook中的access_token',
+            'dingTalk_secret'       => '自定义机器人加签后出现的的密钥',
+            'wechat_aid'            => '应用的AgentId',
+            'wechat_cid'            => '填入微信企业ID -> 再点击更新',
+            'wechat_secret'         => '应用的Secret',
+            'tg_chat_token'         => '请到Telegram申请',
+            'codepay_url'           => 'https://codepay.fateqq.com/creat_order/?',
+        ],
+        'payment'        => [
+            'attribute' => '支付设置',
+            'channel'   => [
+                'alipay'    => '支付宝F2F',
+                'codepay'   => '码支付',
+                'epay'      => '易支付',
+                'payjs'     => 'PayJs',
+                'paypal'    => 'PayPal',
+                'stripe'    => 'Stripe',
+                'paybeaver' => '海狸支付',
+                'theadpay'  => '平头哥支付',
+                'manual'    => '人工支付',
+            ],
+            'hint'      => [
+                'alipay'    => '本功能需要<a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">蚂蚁金服开放平台</a>申请权限及应用',
+                'codepay'   => '请到 <a href="https://codepay.fateqq.com/i/377289" target="_blank">码支付</a>申请账号,然后下载登录其挂机软件',
+                'payjs'     => '请到<a href="https://payjs.cn/ref/zgxjnb" target="_blank">PayJs</a> 申请账号',
+                'paypal'    => '使用商家账号登录<a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">API凭证申请页</a>, 同意并获取设置信息',
+                'paybeaver' => '请到<a href="https://merchant.paybeaver.com/?aff_code=iK4GNuX8" target="_blank">海狸支付 PayBeaver</a>申请账号',
+                'theadpay'  => '请到<a href="https://theadpay.com/" target="_blank">平头哥支付 THeadPay</a>申请账号',
+                'manual'    => '设置后会自动开启对应显示',
+            ],
+        ],
+        'notification'   => [
+            'channel' => [
+                'telegram'   => 'TG电报',
+                'wechat'     => '微信企业',
+                'dingtalk'   => '钉钉',
+                'email'      => '邮箱',
+                'bark'       => 'Bark',
+                'serverchan' => 'ServerChan',
+                'pushdeer'   => 'PushDeer',
+                'pushplus'   => 'PushPlus',
+                'iyuu'       => '爱语飞飞',
+                'tg_chat'    => 'TG酱',
+                'site'       => '站内通知',
+            ],
+        ],
+        'forbid'         => [
+            'mainland' => '阻拦大陆',
+            'china'    => '阻拦中国',
+            'oversea'  => '阻拦海外',
+        ],
+        'username'       => [
+            'email'  => '电子邮箱',
+            'mobile' => '手机号码',
+            'any'    => '任意用户名',
+        ],
+        'active_account' => [
+            'before' => '注册前激活',
+            'after'  => '注册后激活',
+        ],
+        'ddns'           => [
+            'namesilo'   => 'Namesilo',
+            'aliyun'     => '阿里云(国际&国内)',
+            'dnspod'     => 'DNSPod',
+            'cloudflare' => 'CloudFlare',
+        ],
+        'captcha'        => [
+            'standard'  => '普通验证码',
+            'geetest'   => '极 验',
+            'recaptcha' => 'Google reCaptcha',
+            'hcaptcha'  => 'hCaptcha',
+        ],
+        'referral'       => [
+            'once' => '首购返利',
+            'loop' => '循环返利',
+        ],
+    ],
+    'set_to'              => '置 :attribute',
+    'minute'              => '分钟',
+    'query'               => '查 询',
+    'optional'            => '可选',
+    'require'             => '必须',
+];

+ 115 - 57
resources/lang/zh_CN/common.php

@@ -1,61 +1,63 @@
 <?php
 
 return [
-    'account'        => '账号',
-    'available_date' => '有效期',
-    'created_at'     => '生成时间',
-    'expired_at'     => '到期时间',
-    'updated_at'     => '更新时间',
-    'back'           => '返 回',
-    'cancel'         => '取 消',
-    'close'          => '关 闭',
-    'close_item'     => '关闭:attribute',
-    'confirm'        => '确 认',
-    'continues'      => '继 续',
-    'open'           => '打 开',
-    'send'           => '发 送',
-    'view'           => '查 看',
-    'reset'          => '重 置',
-    'copy'           => [
+    'account'         => '账号',
+    'available_date'  => '有效期',
+    'created_at'      => '创建时间',
+    'expired_at'      => '到期时间',
+    'updated_at'      => '更新时间',
+    'latest_at'       => '最近时间',
+    'back'            => '返 回',
+    'cancel'          => '取 消',
+    'close'           => '关 闭',
+    'close_item'      => '关闭:attribute',
+    'confirm'         => '确 认',
+    'continues'       => '继 续',
+    'open'            => '打 开',
+    'send'            => '发 送',
+    'view'            => '查 看',
+    'reset'           => '重 置',
+    'copy'            => [
         'attribute' => '复 制',
         'success'   => '复制成功',
         'failed'    => '复制失败,请手动复制',
     ],
-    'free'           => '免费',
-    'replace'        => '更换',
-    'submit'         => '提 交',
-    'submit_item'    => '提交:attribute',
-    'generate'       => '生 成',
-    'generate_item'  => '生成:attribute',
-    'to_safari'      => ['0' => '点击右上角', '1' => ',选择在', '2' => 'Safari 中打开', '3' => '就可以正常访问本站了哟!'],
-    'update_browser' => ['0' => '您正在使用', '1' => '过时', '2' => ' 的浏览器。 请', '3' => '升级您的浏览器', '4' => '来获得最佳的浏览体验'],
-    'apply'          => '应 用',
-    'avatar'         => '头像',
-    'customize'      => '自定义',
-    'all'            => '全部',
-    'default'        => '默认',
-    'download'       => '下载',
-    'goto'           => '前 往',
-    'warning'        => '警 告',
-    'success'        => '成功',
-    'failed'         => '失败',
-    'update'         => '更 新',
-    'update_action'  => '更新:action',
-    'none'           => '无',
-    'new'            => '新',
-    'sorry'          => '抱歉',
-    'applied'        => ':attribute生效',
-    'active_item'    => '激活:attribute',
-    'error'          => '错误',
-    'toggle'         => '切 换',
-    'toggle_action'  => '切换:action',
-    'request_url'    => '请求地址',
-    'function'       => [
+    'add'             => '添 加',
+    'free'            => '免费',
+    'replace'         => '更换',
+    'submit'          => '提 交',
+    'submit_item'     => '提交:attribute',
+    'generate'        => '生 成',
+    'generate_item'   => '生成:attribute',
+    'to_safari'       => [0 => '点击右上角', 1 => ',选择在', 2 => 'Safari 中打开', 3 => '就可以正常访问本站了哟!'],
+    'update_browser'  => [0 => '您正在使用', 1 => '过时', 2 => ' 的浏览器。 请', 3 => '升级您的浏览器', 4 => '来获得最佳的浏览体验'],
+    'apply'           => '应 用',
+    'avatar'          => '头像',
+    'customize'       => '自定义',
+    'all'             => '全部',
+    'default'         => '默认',
+    'download'        => '下 载',
+    'goto'            => '前 往',
+    'warning'         => '警 告',
+    'success'         => '成功',
+    'failed'          => '失败',
+    'update'          => '更 新',
+    'update_action'   => '更新:action',
+    'none'            => '无',
+    'new'             => '新',
+    'sorry'           => '抱歉',
+    'applied'         => ':attribute生效',
+    'active_item'     => '激活:attribute',
+    'error'           => '错误',
+    'toggle'          => '切 换',
+    'toggle_action'   => '切换:action',
+    'request_url'     => '请求地址',
+    'function'        => [
         'navigation' => '导航',
         'menubar'    => '菜单栏',
         'fullscreen' => '全屏',
     ],
-    'days'           => [
+    'days'            => [
         'sun'     => '周日',
         'mon'     => '周一',
         'tue'     => '周二',
@@ -67,20 +69,76 @@ return [
         'work'    => '工作日',
         'next'    => '次日',
     ],
-    'qrcode'         => ':attribute二维码',
-    'deleted'        => '已删除',
-    'deleted_item'   => ':attribute已删除',
-    'print'          => '打印',
-    'unlimited'      => '无限制',
-    'payment'        => [
+    'qrcode'          => ':attribute二维码',
+    'deleted'         => '已删除',
+    'deleted_item'    => ':attribute已删除',
+    'print'           => '打印',
+    'unlimited'       => '无限制',
+    'payment'         => [
         'credit' => '余额',
         'wechat' => '微信',
         'alipay' => '支付宝',
         'crypto' => '虚拟货币',
         'manual' => '人工支付',
+        'status' => [
+            'wait'    => '待支付',
+            'fail'    => '支付失败',
+            'success' => '支付成功',
+        ],
     ],
-    'recommend'      => '推荐',
-    'advance'        => '进阶',
-    'status'         => '状态',
-    'action'         => '操作',
+    'order'           => [
+        'status' => [
+            'cancel'   => '取 消',
+            'complete' => '完 成',
+            'prepaid'  => '预支付',
+            'ongoing'  => '使用中',
+            'review'   => '待确认',
+        ],
+    ],
+    'recommend'       => '推荐',
+    'advance'         => '进阶',
+    'action'          => '操作',
+    'search'          => '搜 索',
+    'edit'            => '编 辑',
+    'delete'          => '删 除',
+    'status'          => [
+        'attribute'         => '状态',
+        'inactive'          => '未激活',
+        'disabled'          => '停 用',
+        'banned'            => '禁 用',
+        'normal'            => '正 常',
+        'enabled'           => '启 用',
+        'expire'            => '过 期',
+        'limited'           => '限 制',
+        'run_out'           => '流量耗尽',
+        'unused'            => '未使用',
+        'used'              => '已使用',
+        'closed'            => '关 闭',
+        'applying'          => '申请中',
+        'withdrawn'         => '已提现',
+        'unwithdrawn'       => '未提现',
+        'reply'             => '已回复',
+        'pending'           => '待处理',
+        'unknown'           => '未 知',
+        'available'         => '生效中',
+        'reject'            => '驳 回',
+        'rejected'          => '已驳回',
+        'review'            => '待审核',
+        'reviewed'          => '审核通过待打款',
+        'paid'              => '已打款',
+        'payment_pending'   => '待打款',
+        'pass'              => '通 过',
+        'send_to_credit'    => '打款至余额',
+        'waiting_tobe_send' => '等待投递',
+    ],
+    'stay_unchanged'  => '留空为不变',
+    'random_generate' => '留空则随机生成',
+    'request_failed'  => '请求错误,请重试',
+    'convert'         => '转 换',
+    'import'          => '导 入',
+    'or'              => '或',
+    'more'            => '更多',
+    'to'              => '至',
+    'to_be_send'      => '待发送',
+    'developing'      => '开发中!敬请期待',
 ];

+ 239 - 0
resources/lang/zh_CN/model.php

@@ -0,0 +1,239 @@
+<?php
+
+return [
+    'user'             => [
+        'id'             => '用户ID',
+        'attribute'      => '用户',
+        'nickname'       => '昵称',
+        'username'       => '账号',
+        'password'       => '密码',
+        'credit'         => '余额',
+        'invite_num'     => '可用邀请码',
+        'reset_date'     => '重置日',
+        'port'           => '端口',
+        'traffic_used'   => '流量使用',
+        'service'        => '代理',
+        'group'          => '分组',
+        'level'          => '等级',
+        'account_status' => '账号状态',
+        'proxy_status'   => '代理状态',
+        'expired_date'   => '过期日',
+        'role'           => '角色权限',
+        'wechat'         => '微信',
+        'qq'             => 'QQ',
+        'remark'         => '备注',
+        'uuid'           => 'VMess UUID',
+        'proxy_passwd'   => '密码',
+        'proxy_method'   => '加密方式',
+        'usable_traffic' => '可用流量',
+        'proxy_protocol' => '协议',
+        'proxy_obfs'     => '混淆',
+        'speed_limit'    => '用户限速',
+        'inviter'        => '邀请人',
+        'created_date'   => '注册时间',
+    ],
+    'common'           => [
+        'extend'      => '扩展',
+        'sort'        => '排序',
+        'description' => '描述',
+    ],
+    'country'          => [
+        'code' => 'ISO国家代码',
+        'icon' => '图 标',
+        'name' => '国家/地区名称',
+    ],
+    'subscribe'        => [
+        'code'       => '订阅码',
+        'req_times'  => '请求次数',
+        'updated_at' => '最后请求时间',
+        'ban_time'   => '封禁时间',
+        'ban_desc'   => '封禁理由',
+        'req_ip'     => '请求IP',
+        'req_header' => '访问',
+    ],
+    'oauth'            => [
+        'type'       => '渠道',
+        'identifier' => ' 唯一标识',
+    ],
+    'user_group'       => [
+        'attribute' => '用戶分组',
+        'name'      => '分组名称',
+        'nodes'     => '选择节点',
+    ],
+    'node'             => [
+        'attribute'       => '节点',
+        'id'              => '节点ID',
+        'type'            => '类型',
+        'name'            => '名称',
+        'domain'          => '域名',
+        'static'          => '存活',
+        'online_user'     => '在线',
+        'data_consume'    => '产生流量',
+        'data_rate'       => '流量比例',
+        'ddns'            => 'DDNS',
+        'ipv4'            => 'IPv4地址',
+        'ipv6'            => 'IPv6地址',
+        'push_port'       => '消息推送端口',
+        'level'           => '等级',
+        'rule_group'      => '审计分组',
+        'traffic_limit'   => '节点限速',
+        'client_limit'    => '设备数限制',
+        'label'           => '标签',
+        'country'         => '国家/地区',
+        'udp'             => 'UDP',
+        'display'         => '显示 与 订阅',
+        'detection'       => '节点阻断检测',
+        'method'          => '加密方式',
+        'protocol'        => '协议',
+        'protocol_param'  => '协议参数',
+        'obfs'            => '混淆',
+        'obfs_param'      => '混淆参数',
+        'single'          => '单端口',
+        'transfer'        => '中 转',
+        'service_port'    => '服务端口',
+        'single_passwd'   => '[单] 密码',
+        'v2_alter_id'     => '额外ID',
+        'v2_net'          => '传输方式',
+        'v2_cover'        => '伪装类型',
+        'v2_host'         => '伪装域名',
+        'v2_path'         => '路径 | 密钥',
+        'v2_sni'          => 'SNI',
+        'v2_tls'          => '连接TLS',
+        'v2_tls_provider' => 'TLS配置',
+        'relay_port'      => '中转端口',
+    ],
+    'node_auth'        => [
+        'attribute' => '节点授权',
+        'key'       => '通信密钥<small>节点用</small>',
+        'secret'    => '反向通信密钥',
+    ],
+    'node_cert'        => [
+        'attribute'    => '域名证书',
+        'domain'       => '域名',
+        'key'          => 'KEY',
+        'pem'          => 'PEM',
+        'issuer'       => '签发机构',
+        'signed_date'  => '签发日期',
+        'expired_date' => '到期时间',
+    ],
+    'order'            => [
+        'attribute'      => '订单',
+        'id'             => '订单ID',
+        'original_price' => '原价',
+        'price'          => '实价',
+        'pay_way'        => '支付方式',
+        'status'         => '订单状态',
+    ],
+    'goods'            => [
+        'attribute'      => '商品',
+        'type'           => '类型',
+        'name'           => '名称',
+        'price'          => '售价',
+        'category'       => '分类',
+        'level'          => '等级',
+        'renew'          => '流量重置价格',
+        'user_limit'     => '用户限速',
+        'period'         => '重置周期',
+        'traffic'        => '流量额度',
+        'invite_num'     => '赠送邀请码数量',
+        'limit_num'      => '限购数量',
+        'available_date' => '有效期',
+        'hot'            => '热销',
+        'color'          => '颜色',
+        'logo'           => '商品图片',
+        'info'           => '自定义列表',
+    ],
+    'rule'             => [
+        'attribute' => '规则',
+        'type'      => '类型',
+        'name'      => '描述',
+        'pattern'   => '值',
+    ],
+    'rule_group'       => [
+        'attribute' => '规则分组',
+        'name'      => '分组名称',
+        'type'      => '审计模式',
+        'rules'     => '选择规则',
+    ],
+    'role'             => [
+        'attribute'   => '角色',
+        'name'        => '名称',
+        'permissions' => '权限',
+    ],
+    'permission'       => [
+        'attribute'   => '权限行为',
+        'description' => '行为描述',
+        'name'        => '路由名称',
+    ],
+    'article'          => [
+        'attribute'  => '文章',
+        'type'       => '类 型',
+        'category'   => '类 别',
+        'language'   => '语 言',
+        'logo'       => '头 图',
+        'created_at' => '发布日期',
+        'updated_at' => '最后更新',
+    ],
+    'coupon'           => [
+        'attribute'          => '卡券',
+        'name'               => '卡券名称',
+        'sn'                 => '使用券码',
+        'logo'               => '卡券图片',
+        'type'               => '类型',
+        'value'              => '优惠额度',
+        'priority'           => '权 重',
+        'usable_times'       => '使用次数',
+        'minimum'            => '满减条件',
+        'used'               => '个人限用',
+        'levels'             => '等级限定',
+        'groups'             => '分组限定',
+        'users_whitelist'    => '专属用户',
+        'users_blacklist'    => '禁用用户',
+        'services_whitelist' => '许可商品',
+        'services_blacklist' => '禁用商品',
+        'newbie'             => '新人专属',
+        'num'                => '数量',
+    ],
+    'aff'              => [
+        'invitee'    => '消费者',
+        'order_id'   => '订单号',
+        'amount'     => '消费金额',
+        'commission' => '返利金额',
+        'updated_at' => '处理时间',
+        'created_at' => '下单时间',
+    ],
+    'referral'         => [
+        'created_at' => '申请时间',
+        'user'       => '申请账号',
+        'amount'     => '申请提现金额',
+        'id'         => '申请单ID',
+    ],
+    'notification'     => [
+        'type'       => '类型',
+        'address'    => '收信地址',
+        'created_at' => '投递时间',
+        'status'     => '投递状态',
+    ],
+    'ip'               => [
+        'network_type' => '通讯类型',
+        'info'         => '归属地',
+    ],
+    'user_traffic'     => [
+        'upload'   => '上传流量',
+        'download' => '下载流量',
+        'total'    => '总流量',
+        'log_time' => '记录时间',
+    ],
+    'user_data_modify' => [
+        'before'      => '变动前流量',
+        'after'       => '变动后流量',
+        'description' => '描述',
+        'created_at'  => '发生时间',
+    ],
+    'user_credit'      => [
+        'before'     => '操作前余额',
+        'after'      => '操作后金额',
+        'amount'     => '发生金额',
+        'created_at' => '发生时间',
+    ],
+];

+ 41 - 65
resources/lang/zh_CN/user.php

@@ -20,26 +20,6 @@ return [
             'unknown'           => '未知原因,请尝试[刷新]你的浏览器!多次无果后再请开工单联系管理',
         ],
     ],
-    'status'              => [
-        'disabled'        => '停用',
-        'enabled'         => '正常',
-        'expired'         => '已过期',
-        'limited'         => '限制',
-        'run_out'         => '流量耗尽',
-        'unused'          => '未使用',
-        'used'            => '已使用',
-        'closed'          => '关 闭',
-        'completed'       => '完 成',
-        'waiting_payment' => '待付款',
-        'using'           => '使用中',
-        'waiting_confirm' => '待确认',
-        'prepaid'         => '预支付',
-        'applying'        => '申请中',
-        'withdrawn'       => '已提现',
-        'not_withdrawn'   => '未提现',
-        'reply'           => '已回复',
-        'pending'         => '待处理',
-    ],
     'home'                => [
         'attendance'         => [
             'attribute' => '签 到',
@@ -100,14 +80,14 @@ return [
             'unmet'    => '使用条件未满足',
             'minimum'  => '本券最低使用金额为 :amount',
             'overused' => '本券只能使用 :times 次',
-            'users'    => '户不符合促销条件',
+            'users'    => '户不符合促销条件',
             'services' => '商品不符合折扣条件,请查看促销条款',
         ],
     ],
     'error_response'      => '出现了错误,请稍后再试。',
     'invite'              => [
         'attribute'       => '邀请码',
-        'total'           => '共 :num 个邀请码',
+        'counts'          => '共 <code>:num</code> 个邀请码',
         'tips'            => '可生成<strong> :num </strong>枚邀请码,:days 日内有效',
         'logs'            => '邀请记录',
         'promotion'       => '通过您的邀请码注册并激活,你们双方都将获得<mark>:traffic</mark>流量奖励;当他们消费时,您将获得他们消费金额的<mark>:referral_percent%</mark>作为奖励。',
@@ -122,14 +102,12 @@ return [
         'success'   => '重置成功',
     ],
     'referral'            => [
-        'link'       => '推广链接',
-        'total'      => '合计返利 :amount( :total 次),满 :money 可以申请提现。',
-        'amount'     => '消费金额',
-        'commission' => '返利金额',
-        'logs'       => '佣金记录',
-        'failed'     => '申请失败',
-        'success'    => '申请成功',
-        'msg'        => [
+        'link'    => '推广链接',
+        'total'   => '合计返利 :amount( :total 次),满 :money 可以申请提现。',
+        'logs'    => '佣金记录',
+        'failed'  => '申请失败',
+        'success' => '申请成功',
+        'msg'     => [
             'account'     => '账号已过期,请先购买服务吧',
             'applied'     => '已存在申请,请等待之前的申请处理完',
             'unfulfilled' => '满 :amount 才可以提现,继续努力吧',
@@ -139,8 +117,6 @@ return [
     ],
     'inviter'             => '邀请者',
     'invitee'             => '受邀者',
-    'consumer'            => '消费者',
-    'unknown'             => '未知',
     'registered_at'       => '注册时间',
     'bought_at'           => '购买日期',
     'payment_method'      => '支付方式',
@@ -155,21 +131,22 @@ return [
     'withdraw'            => '提 现',
     'scan_qrcode'         => '请使用客户端扫描二维码',
     'shop'                => [
-        'hot'           => '热 销',
-        'limited'       => '限 购',
-        'change_amount' => '充值金额',
-        'buy'           => '购买',
-        'description'   => '描述',
-        'service'       => '服务',
-        'pay_credit'    => '余额支付',
-        'pay_online'    => '在线支付',
-        'price'         => '价格',
-        'quantity'      => '数量',
-        'subtotal'      => '小计',
-        'total'         => '合计',
-        'conflict'      => '套餐存在冲突',
-        'conflict_tips' => '<p>当前购买套餐将自动设置为 <code>预支付套餐</code><p><ol class="text-left"><li> 预支付套餐会在生效中的套餐失效后自动开通!</li><li> 您可以在支付后手动激活套餐!</li></ol>',
-        'call4help'     => '请开工单通知客服',
+        'hot'                => '热 销',
+        'limited'            => '限 购',
+        'change_amount'      => '充值金额',
+        'change_amount_help' => '请输入充值金额',
+        'buy'                => '购买',
+        'description'        => '描述',
+        'service'            => '服务',
+        'pay_credit'         => '余额支付',
+        'pay_online'         => '在线支付',
+        'price'              => '价格',
+        'quantity'           => '数量',
+        'subtotal'           => '小计',
+        'total'              => '合计',
+        'conflict'           => '套餐存在冲突',
+        'conflict_tips'      => '<p>当前购买套餐将自动设置为 <code>预支付套餐</code><p><ol class="text-left"><li> 预支付套餐会在生效中的套餐失效后自动开通!</li><li> 您可以在支付后手动激活套餐!</li></ol>',
+        'call4help'          => '请开工单通知客服',
     ],
     'service'             => [
         'node_count'    => '<code>:num</code> 条优质线路',
@@ -186,7 +163,6 @@ return [
     ],
     'invoice'             => [
         'attribute'               => '订单',
-        'id'                      => '订单号',
         'detail'                  => '消费记录',
         'amount'                  => '金额',
         'active_prepaid_question' => '是否提前激活预支付套餐?',
@@ -211,22 +187,22 @@ return [
         'error'            => '更换订阅地址异常',
     ],
     'ticket'              => [
-        'attribute'         => '工单',
-        'submit_tips'       => '确定提交工单?',
-        'reply_confirm'     => '确定回复工单?',
-        'close_tips'        => '您确定要关闭该工单吗?',
-        'close'             => '关闭工单',
-        'failed_closed'     => '错误:该工单已关闭',
-        'reply_placeholder' => '说些什么呢?',
-        'reply'             => '回复',
-        'close_msg'         => '工单:ID:id用户已手动关闭',
-        'placeholder'       => '请详细的描述您遇到的问题,或者需要我们帮助的地方',
-        'title_placeholder' => '请详细的描述您遇到的问题,或者需要我们帮助的地方',
-        'new'               => '创建新的工单',
-        'working_hour'      => '客服工作时间',
-        'online_hour'       => '在线时间',
-        'service_tips'      => '本站有多种联系方式,请使用其中<code>一种</code>联系客服! <br>重复请求,将会自动延迟处理时间',
-        'error'             => '未知错误!请通知客服',
+        'attribute'           => '工单',
+        'submit_tips'         => '确定提交工单?',
+        'reply_confirm'       => '确定回复工单?',
+        'close_tips'          => '您确定要关闭该工单吗?',
+        'close'               => '关闭工单',
+        'failed_closed'       => '错误:该工单已关闭',
+        'reply_placeholder'   => '说些什么呢?',
+        'reply'               => '回复',
+        'close_msg'           => '工单:ID:id用户已手动关闭',
+        'title_placeholder'   => '请简单表示你的问题类型,或者涉及的内容',
+        'content_placeholder' => '请详细的描述您遇到的问题,或者需要我们帮助的地方,以便我们快速帮助到您',
+        'new'                 => '创建新的工单',
+        'working_hour'        => '客服工作时间',
+        'online_hour'         => '在线时间',
+        'service_tips'        => '本站有多种联系方式,请使用其中<code>一种</code>联系客服! <br>重复请求,将会自动延迟处理时间',
+        'error'               => '未知错误!请通知客服',
     ],
     'traffic_logs'        => [
         '24hours' => '今日流量使用情况',
@@ -234,7 +210,7 @@ return [
         'tips'    => '提示:流量统计更新会有延迟。按天统计于次日更新,按小时统计于次小时更新。',
     ],
     'client'              => '客户端',
-    'tutorials'           => '教程',
+    'tutorials'           => '教 程',
     'current_role'        => '当前身份',
     'knowledge'           => [
         'title' => '知 识 库',

+ 13 - 14
resources/views/_layout.blade.php

@@ -19,14 +19,13 @@
     <link href="{{asset('favicon.ico')}}" rel="shortcut icon apple-touch-icon">
     <!-- 样式表/Stylesheets -->
     <link href="/assets/bundle/app.min.css" rel="stylesheet">
-    <link rel="stylesheet" href="https://cdnjs.loli.net/ajax/libs/flag-icon-css/6.6.4/css/flag-icons.min.css" integrity="sha512-uvXdJud8WaOlQFjlz9B15Yy2Au/bMAvz79F7Xa6OakCl2jvQPdHD0hb3dEqZRdSwG4/sknePXlE7GiarwA/9Wg==" crossorigin="anonymous" referrerpolicy="no-referrer" />
+    <link rel="stylesheet" href="//cdn.staticfile.org/flag-icons/6.6.6/css/flag-icons.min.css"/>
     @yield('layout_css')
-<!-- 字体/Fonts -->
+    <!-- 字体/Fonts -->
     <link href="/assets/global/fonts/web-icons/web-icons.min.css" rel="stylesheet">
-    <link href="https://fonts.loli.net/css?family=Roboto:300,400,500,300italic" rel="stylesheet">
+    <link href="/assets/css/font.css" rel="stylesheet">
     <!--[if lt IE 9]>
-    <script src="https://cdnjs.loli.net/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"
-            integrity="sha512-UDJtJXfzfsiPPgnI5S1000FPLBHMhvzAMX15I+qG2E2OAzC9P1JzUwJOfnypXiOH7MRPaqzhPbBGDNNj7zBfoA==" crossorigin="anonymous"></script>
+    <script src="//cdn.staticfile.org/html5shiv/3.7.3/html5shiv.min.js"></script>
     <![endif]-->
     <!--[if lt IE 10]>
     <script src="/assets/global/vendor/media-match/media.match.min.js"></script>
@@ -35,7 +34,7 @@
     <!-- Scripts -->
     <script src="/assets/global/vendor/breakpoints/breakpoints.min.js"></script>
     <script>
-        Breakpoints();
+      Breakpoints();
     </script>
     @if (config('theme.skin'))
         <link id="skinStyle" href="/assets/css/skins/{{config('theme.skin')}}.min.css" rel="stylesheet" type="text/css">
@@ -69,20 +68,20 @@
 <!-- 设置/Config -->
 <script src="/assets/global/js/config/colors.js"></script>
 <script>
-    Config.set('assets', '/assets');
+  Config.set('assets', '/assets');
 </script>
 <!-- 页面/Page -->
 <script src="/assets/js/Site.js"></script>
 <script src="/assets/global/js/Plugin/asscrollable.js"></script>
 <script src="/assets/global/js/Plugin/slidepanel.js"></script>
 <script>
-    (function(document, window, $) {
-        'use strict';
-        const Site = window.Site;
-        $(document).ready(function() {
-            Site.run();
-        });
-    })(document, window, jQuery);
+  (function(document, window, $) {
+    'use strict';
+    const Site = window.Site;
+    $(document).ready(function() {
+      Site.run();
+    });
+  })(document, window, jQuery);
 </script>
 @yield('layout_javascript')
 </body>

+ 12 - 11
resources/views/admin/aff/detail.blade.php

@@ -6,14 +6,14 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">提现申请详情</h2>
+                <h2 class="panel-title">{{ trans('admin.aff.commission_title') }}</h2>
                 <div class="panel-actions">
                     @if($referral->status === -1)
-                        <span class="badge badge-lg badge-danger"> 已驳回 </span>
+                        <span class="badge badge-lg badge-danger"> {{ trans('common.status.rejected') }} </span>
                     @elseif($referral->status === 2)
-                        <span class="badge badge-lg badge-success"> 已打款 </span>
+                        <span class="badge badge-lg badge-success"> {{ trans('common.status.paid') }} </span>
                     @endif
-                    <a href="{{route('admin.aff.index')}}" class="btn btn-danger"> 返 回</a>
+                    <a href="{{route('admin.aff.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
                 </div>
             </div>
             <div class="panel-body">
@@ -22,16 +22,17 @@
                         <thead class="thead-default">
                         <tr>
                             <th colspan="6">
-                                申请单ID:{{$referral->id}} | 申请人:{{$referral->user->username}} | 申请提现金额:{{$referral->amount_tag}} | 申请时间:{{$referral->created_at}}
+                                {{ trans('model.referral.id') }}: {{$referral->id}} | {{ trans('model.referral.user') }}: {{$referral->user->username}} |
+                                {{ trans('model.referral.amount') }}: {{$referral->amount_tag}} | {{ trans('model.referral.created_at') }}: {{$referral->created_at}}
                             </th>
                         </tr>
                         <tr>
                             <th> #</th>
-                            <th> 关联人</th>
-                            <th> 关联订单</th>
-                            <th> 订单金额</th>
-                            <th> 佣金</th>
-                            <th> 下单时间</th>
+                            <th> {{ trans('model.aff.invitee') }}</th>
+                            <th> {{ trans('model.aff.order_id') }}</th>
+                            <th> {{ trans('model.aff.amount') }}</th>
+                            <th> {{ trans('model.aff.commission') }}</th>
+                            <th> {{ trans('model.aff.created_at') }}</th>
                         </tr>
                         </thead>
                         <tbody>
@@ -61,7 +62,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        本申请共涉及 <code>{{$commissions->total()}}</code> 单
+                        {!! trans('admin.aff.commission_counts', ['num' => $commissions->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">

+ 87 - 86
resources/views/admin/aff/index.blade.php

@@ -6,37 +6,37 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">提现申请列表</h3>
+                <h3 class="panel-title">{{ trans('admin.aff.title') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-2 col-sm-4">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="申请账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('model.user.username') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4">
                         <select class="form-control" name="status" id="status" onchange="this.form.submit()">
-                            <option value="" hidden>状态</option>
-                            <option value="-1">驳回</option>
-                            <option value="0">待审核</option>
-                            <option value="1">审核通过待打款</option>
-                            <option value="2">已打款</option>
+                            <option value="" hidden>{{ trans('common.status.attribute') }}</option>
+                            <option value="-1">{{ trans('common.status.rejected') }}</option>
+                            <option value="0">{{ trans('common.status.review') }}</option>
+                            <option value="1">{{ trans('common.status.reviewed') }}</option>
+                            <option value="2">{{ trans('common.status.paid') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-1 col-sm-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.aff.index')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.aff.index')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 申请时间</th>
-                        <th> 申请账号</th>
-                        <th> 申请提现金额</th>
-                        <th> {{trans('common.status')}}</th>
-                        <th> 处理时间</th>
-                        <th> {{trans('common.action')}}</th>
+                        <th> {{ trans('model.referral.created_at') }}</th>
+                        <th> {{ trans('model.referral.user') }}</th>
+                        <th> {{ trans('model.referral.amount') }}</th>
+                        <th> {{ trans('common.status.attribute') }}</th>
+                        <th> {{ trans('model.aff.updated_at') }}</th>
+                        <th> {{ trans('common.action') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -60,34 +60,35 @@
                             <td> {{$apply->amount_tag}} </td>
                             <td>
                                 @if($apply->status === -1)
-                                    <span class="badge badge-lg badge-danger"> 驳 回 </span>
+                                    <span class="badge badge-lg badge-danger"> {{ trans('common.status.rejected') }} </span>
                                 @elseif($apply->status === 0)
-                                    <span class="badge badge-lg badge-info"> 待审核 </span>
+                                    <span class="badge badge-lg badge-info"> {{ trans('common.status.review') }} </span>
                                 @elseif($apply->status === 2)
-                                    <span class="badge badge-lg badge-success"> 已打款 </span>
+                                    <span class="badge badge-lg badge-success"> {{ trans('common.status.paid') }} </span>
                                 @else
-                                    <span class="badge badge-lg badge-default"> 待打款 </span>
+                                    <span class="badge badge-lg badge-default"> {{ trans('common.status.payment_pending') }} </span>
                                 @endif
                             </td>
-                            <td> {{$apply->created_at == $apply->updated_at ? '' : $apply->updated_at}} </td>
+                            <td> {{$apply->created_at === $apply->updated_at ? '' : $apply->updated_at}} </td>
                             <td>
                                 @canany(['admin.aff.setStatus', 'admin.aff.detail'])
                                     <div class="btn-group">
                                         @can('admin.aff.setStatus')
                                             @if($apply->status === 0)
                                                 <a href="javascript:setStatus('{{$apply->id}}','1')" class="btn btn-sm btn-success">
-                                                    <i class="icon wb-check" aria-hidden="true"></i>通过</a>
+                                                    <i class="icon wb-check" aria-hidden="true"></i>{{ trans('common.status.pass') }}</a>
                                                 <a href="javascript:setStatus('{{$apply->id}}','-1')" class="btn btn-sm btn-danger">
-                                                    <i class="icon wb-close" aria-hidden="true"></i>驳回</a>
+                                                    <i class="icon wb-close" aria-hidden="true"></i>{{ trans('common.status.reject') }}</a>
                                             @elseif($apply->status === 1)
                                                 @can('admin.user.updateCredit')
                                                     <a href="javascript:handleUserCredit('{{$apply->user->id}}','{{$apply->amount}}', '{{$apply->id}}','2')" class="btn
                                                     btn-sm
                                                     btn-success">
-                                                        <i id="makePayment_{{$apply->id}}" class="icon wb-payment" aria-hidden="true"></i> 打款至余额 </a>
+                                                        <i id="makePayment_{{$apply->id}}" class="icon wb-payment"
+                                                           aria-hidden="true"></i> {{ trans('common.status.send_to_credit') }} </a>
                                                 @endcan
-                                                <a href="javascript:setStatus('{{$apply->id}}','2')" class="btn btn-sm btn-primary">
-                                                    <i class="icon wb-check-circle" aria-hidden="true"></i> 已 打 款 </a>
+                                                <a href="javascript:setStatus('{{$apply->id}}', '2')" class="btn btn-sm btn-primary">
+                                                    <i class="icon wb-check-circle" aria-hidden="true"></i> {{ trans('common.status.paid') }} </a>
                                             @endif
                                         @endcan
                                         @can('admin.aff.detail')
@@ -105,7 +106,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$applyList->total()}}</code> 个申请
+                        {!! trans('admin.aff.apply_counts', ['num' => $applyList->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -122,68 +123,68 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#status').val({{Request::query('status')}});
-        });
+      $(document).ready(function() {
+        $('#status').val({{Request::query('status')}});
+      });
 
-        @can('admin.aff.setStatus')
-        // 更改状态
-        function setStatus(id, status) {
-            $.ajax({
-                method: 'PUT',
-                url: '{{route('admin.aff.setStatus','')}}/' + id,
-                data: {
-                    _token: '{{csrf_token()}}',
-                    status: status,
-                },
-                dataType: 'json',
-                success: function(ret) {
-                    if (ret.status === 'success') {
-                        swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                    } else {
-                        swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                    }
-                },
-                error: function(data) {
-                    let str = '';
-                    const errors = data.responseJSON;
-                    if ($.isEmptyObject(errors) === false) {
-                        $.each(errors.errors, function(index, value) {
-                            str += '<li>' + value + '</li>';
-                        });
-                        swal.fire({title: '提示', html: str, icon: 'error', confirmButtonText: '{{trans('common.confirm')}}'});
-                    }
-                },
-            });
-        }
-        @endcan
+      @can('admin.aff.setStatus')
+      // 更改状态
+      function setStatus(id, status) {
+        $.ajax({
+          method: 'PUT',
+          url: '{{route('admin.aff.setStatus','')}}/' + id,
+          data: {
+            _token: '{{csrf_token()}}',
+            status: status,
+          },
+          dataType: 'json',
+          success: function(ret) {
+            if (ret.status === 'success') {
+              swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+            } else {
+              swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+            }
+          },
+          error: function(data) {
+            let str = '';
+            const errors = data.responseJSON;
+            if ($.isEmptyObject(errors) === false) {
+              $.each(errors.errors, function(index, value) {
+                str += '<li>' + value + '</li>';
+              });
+              swal.fire({title: '{{ trans('admin.hint') }}', html: str, icon: 'error', confirmButtonText: '{{ trans('common.confirm') }}'});
+            }
+          },
+        });
+      }
+      @endcan
 
-        @can('admin.user.updateCredit')
-        // 余额充值
-        function handleUserCredit(uid, amount, aid, status) {
-            $.ajax({
-                url: '{{route('admin.user.updateCredit', '')}}/' + uid,
-                method: 'POST',
-                data: {_token: '{{csrf_token()}}', amount: amount, description: '推广返利'},
-                beforeSend: function() {
-                    $('#makePayment_' + aid).removeClass('wb-payment').addClass('wb-loop icon-spin');
-                },
-                success: function(ret) {
-                    if (ret.status === 'success') {
-                        swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => {
-                            setStatus(aid, status)
-                        });
-                    } else {
-                        swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                    }
-                },
-                error: function() {
-                    $('#msg').show().html('请求错误,请重试');
-                },
-                complete: function() {
-                },
-            });
-        }
+      @can('admin.user.updateCredit')
+      // 余额充值
+      function handleUserCredit(uid, amount, aid, status) {
+        $.ajax({
+          url: '{{route('admin.user.updateCredit', '')}}/' + uid,
+          method: 'POST',
+          data: {_token: '{{csrf_token()}}', amount: amount, description: '{{ trans('admin.aff.referral') }}'},
+          beforeSend: function() {
+            $('#makePayment_' + aid).removeClass('wb-payment').addClass('wb-loop icon-spin');
+          },
+          success: function(ret) {
+            if (ret.status === 'success') {
+              swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => {
+                setStatus(aid, status);
+              });
+            } else {
+              swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+            }
+          },
+          error: function() {
+            $('#msg').show().html('{{ trans('common.request_failed') }}');
+          },
+          complete: function() {
+          },
+        });
+      }
         @endcan
     </script>
 @endsection

+ 49 - 49
resources/views/admin/inviteList.blade.php → resources/views/admin/aff/invite.blade.php

@@ -9,12 +9,12 @@
                 <div class="card">
                     <div class="card-block">
                         <h4 class="card-title cyan-600"><i class="icon wb-plus"></i>
-                            {{trans('common.generate_item', ['attribute' => trans('user.invite.attribute')])}}
+                            {{ trans('common.generate_item', ['attribute' => trans('user.invite.attribute')]) }}
                         </h4>
                         <x-alert type="info" :message="trans('user.invite.tips', ['num'=>10, 'days' => sysConfig('user_invite_days')])"/>
                         @can('admin.invite.create')
                             <button type="button" class="btn btn-primary btn-animate btn-animate-side" onclick="makeInvite()">
-                                <i class="icon wb-plus"></i> {{trans('common.generate')}}
+                                <i class="icon wb-plus"></i> {{ trans('common.generate') }}
                             </button>
                         @endcan
                     </div>
@@ -24,11 +24,11 @@
                 <div class="panel">
                     <div class="panel-heading">
                         <h4 class="panel-title cyan-600">
-                            <i class="icon wb-extension"></i>{{trans('user.invite.attribute')}}
+                            <i class="icon wb-extension"></i>{{ trans('user.invite.attribute') }}
                         </h4>
                         @can('admin.invite.export')
                             <div class="panel-actions">
-                                <button class="btn btn-primary" onclick="exportInvite()">批量导出</button>
+                                <button class="btn btn-primary" onclick="exportInvite()">{{ trans('admin.massive_export') }}</button>
                             </div>
                         @endcan
                     </div>
@@ -37,11 +37,11 @@
                             <thead class="thead-default">
                             <tr>
                                 <th> #</th>
-                                <th> {{trans('user.invite.attribute')}} </th>
-                                <th> {{trans('common.available_date')}} </th>
-                                <th> {{trans('user.inviter')}}</th>
-                                <th> {{trans('common.status')}} </th>
-                                <th> {{trans('user.invitee')}} </th>
+                                <th> {{ trans('user.invite.attribute') }} </th>
+                                <th> {{ trans('common.available_date') }} </th>
+                                <th> {{ trans('user.inviter') }}</th>
+                                <th> {{ trans('common.status.attribute') }} </th>
+                                <th> {{ trans('user.invitee') }} </th>
                             </tr>
                             </thead>
                             <tbody>
@@ -54,7 +54,7 @@
                                     </td>
                                     <td> {{$invite->dateline}} </td>
                                     <td>
-                                        {{$invite->inviter_id === null ? '系统生成' : ($invite->inviter->username ?? '【'.trans('common.deleted_item', ['attribute' => trans('common.account')]).'】')}}
+                                        {{$invite->inviter_id === null ? trans('admin.system_generate') : ($invite->inviter->username ?? '【'.trans('common.deleted_item', ['attribute' => trans('common.account')]).'】')}}
                                     </td>
                                     <td>
                                         {!!$invite->status_label!!}
@@ -70,7 +70,7 @@
                     <div class="panel-footer">
                         <div class="row">
                             <div class="col-md-4">
-                                {{trans('user.invite.total', ['num' => $inviteList->total()])}}
+                                {!! trans('user.invite.counts', ['num' => $inviteList->total()]) !!}
                             </div>
                             <div class="col-md-8">
                                 <nav class="Page navigation float-right">
@@ -93,58 +93,58 @@
         @can('admin.invite.create')
         // 生成邀请码
         function makeInvite() {
-            $.ajax({
-                method: 'POST',
-                url: '{{route('admin.invite.create')}}',
-                dataType: 'json',
-                data: {_token: '{{csrf_token()}}'},
-                success: function(ret) {
-                    if (ret.status === 'success') {
-                        swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                    } else {
-                        swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                    }
-                },
-            });
+          $.ajax({
+            method: 'POST',
+            url: '{{route('admin.invite.create')}}',
+            dataType: 'json',
+            data: {_token: '{{csrf_token()}}'},
+            success: function(ret) {
+              if (ret.status === 'success') {
+                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+              } else {
+                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+              }
+            },
+          });
 
-            return false;
+          return false;
         }
         @endcan
 
         @can('admin.invite.export')
         // 导出邀请码
         function exportInvite() {
-            swal.fire({
-                title: '提示',
-                text: '确定导出所有邀请码吗',
-                icon: 'question',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    window.location.href = '{{route('admin.invite.export')}}';
-                }
-            });
+          swal.fire({
+            title: '{{ trans('admin.hint') }}',
+            text: '{{ trans('admin.confirm.export') }}',
+            icon: 'question',
+            showCancelButton: true,
+            cancelButtonText: '{{ trans('common.close') }}',
+            confirmButtonText: '{{ trans('common.confirm') }}',
+          }).then((result) => {
+            if (result.value) {
+              window.location.href = '{{route('admin.invite.export')}}';
+            }
+          });
         }
         @endcan
 
         const clipboard = new ClipboardJS('.mt-clipboard');
         clipboard.on('success', function() {
-            swal.fire({
-                title: '{{trans('common.copy.success')}}',
-                icon: 'success',
-                timer: 1300,
-                showConfirmButton: false,
-            });
+          swal.fire({
+            title: '{{ trans('common.copy.success') }}',
+            icon: 'success',
+            timer: 1300,
+            showConfirmButton: false,
+          });
         });
         clipboard.on('error', function() {
-            swal.fire({
-                title: '{{trans('common.copy.failed')}}',
-                icon: 'error',
-                timer: 1500,
-                showConfirmButton: false,
-            });
+          swal.fire({
+            title: '{{ trans('common.copy.failed') }}',
+            icon: 'error',
+            timer: 1500,
+            showConfirmButton: false,
+          });
         });
     </script>
 @endsection

+ 26 - 24
resources/views/admin/aff/rebate.blade.php

@@ -6,41 +6,43 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">返利流水记录</h2>
+                <h2 class="panel-title">{{ trans('admin.aff.rebate_title') }}</h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-4 col-sm-6">
-                        <input type="text" class="form-control" name="invitee_username" value="{{Request::query('invitee_username')}}" placeholder="消费者"/>
+                        <input type="text" class="form-control" name="invitee_username" value="{{Request::query('invitee_username')}}"
+                               placeholder="{{ trans('model.aff.invitee') }}"/>
                     </div>
                     <div class="form-group col-lg-4 col-sm-6">
-                        <input type="text" class="form-control" name="inviter_username" value="{{Request::query('inviter_username')}}" placeholder="邀请人"/>
+                        <input type="text" class="form-control" name="inviter_username" value="{{Request::query('inviter_username')}}"
+                               placeholder="{{ trans('model.user.inviter') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
                         <select name="status" id="status" class="form-control" onchange="this.form.submit()">
-                            <option value="" hidden>状态</option>
-                            <option value="0">未提现</option>
-                            <option value="1">申请中</option>
-                            <option value="2">已提现</option>
+                            <option value="" hidden>{{ trans('common.status.attribute') }}</option>
+                            <option value="0">{{ trans('common.status.unwithdrawn') }}</option>
+                            <option value="1">{{ trans('common.status.applying') }}</option>
+                            <option value="2">{{ trans('common.status.withdrawn') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.aff.rebate')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.aff.rebate')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 消费者</th>
-                        <th> 邀请者</th>
-                        <th> 订单号</th>
-                        <th> 消费金额</th>
-                        <th> 返利金额</th>
-                        <th> 生成时间</th>
-                        <th> 处理时间</th>
-                        <th> {{trans('common.status')}}</th>
+                        <th> {{ trans('model.aff.invitee') }}</th>
+                        <th> {{ trans('model.user.inviter') }}</th>
+                        <th> {{ trans('model.aff.order_id') }}</th>
+                        <th> {{ trans('model.aff.amount') }}</th>
+                        <th> {{ trans('model.aff.commission') }}</th>
+                        <th> {{ trans('model.aff.created_at') }}</th>
+                        <th> {{ trans('model.aff.updated_at') }}</th>
+                        <th> {{ trans('common.status.attribute') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -68,11 +70,11 @@
                             <td> {{$referralLog->updated_at}} </td>
                             <td>
                                 @if ($referralLog->status === 1)
-                                    <span class="badge badge-danger">申请中</span>
+                                    <span class="badge badge-danger">{{ trans('common.status.applying') }}</span>
                                 @elseif($referralLog->status === 2)
-                                    <span class="badge badge-default">已提现</span>
+                                    <span class="badge badge-default">{{ trans('common.status.withdrawn') }}</span>
                                 @else
-                                    <span class="badge badge-info">未提现</span>
+                                    <span class="badge badge-info">{{ trans('common.status.unwithdrawn') }}</span>
                                 @endif
                             </td>
                         </tr>
@@ -83,7 +85,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$referralLogs->total()}}</code> 个申请
+                        {!! trans('admin.aff.counts', ['num' => $referralLogs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -100,8 +102,8 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#status').val({{Request::query('status')}});
-        });
+      $(document).ready(function() {
+        $('#status').val({{Request::query('status')}});
+      });
     </script>
 @endsection

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

@@ -6,10 +6,10 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">文章列表</h3>
+                <h3 class="panel-title">{{ trans('admin.article.title') }}</h3>
                 @can('admin.article.create')
                     <div class="panel-actions">
-                        <a href="{{route('admin.article.create')}}" class="btn btn-primary"><i class="icon wb-plus"></i>添加文章</a>
+                        <a href="{{route('admin.article.create')}}" class="btn btn-primary"><i class="icon wb-plus"></i> {{ trans('common.add') }}</a>
                     </div>
                 @endcan
             </div>
@@ -20,14 +20,14 @@
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4">
                         <select class="form-control" id="type" name="type">
-                            <option value="" hidden>类 型</option>
-                            <option value="1">文章</option>
-                            <option value="2">公告</option>
+                            <option value="" hidden>{{ trans('model.article.type') }}</option>
+                            <option value="1">{{ trans('admin.article.type.knowledge') }}</option>
+                            <option value="2">{{ trans('admin.article.type.announcement') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4">
                         <select class="form-control" id="category" name="category">
-                            <option value="" hidden>分 类</option>
+                            <option value="" hidden>{{ trans('model.article.category') }}</option>
                             @foreach($categories as $category)
                                 <option value="{{$category->category}}">{{$category->category}}</option>
                             @endforeach
@@ -35,7 +35,7 @@
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4">
                         <select class="form-control" id="language" name="language">
-                            <option value="" hidden>语 言</option>
+                            <option value="" hidden>{{ trans('model.article.language') }}</option>
                             @foreach (config('common.language') as $key => $value)
                                 <option value="{{$key}}">
                                     <i class="fi fi-{{$value[1]}}"></i> <span style="padding: inherit;">{{$value[0]}}</span>
@@ -44,21 +44,21 @@
                         </select>
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.article.index')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.article.index')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 类 型</th>
-                        <th> 分 类</th>
-                        <th> 标 题</th>
-                        <th> 语 言</th>
-                        <th> 排 序</th>
-                        <th> 发布日期</th>
-                        <th> {{trans('common.action')}}</th>
+                        <th> {{ trans('model.article.type') }}</th>
+                        <th> {{ trans('model.article.category') }}</th>
+                        <th> {{ trans('validation.attributes.title') }}</th>
+                        <th> {{ trans('model.article.language') }}</th>
+                        <th> {{ trans('model.common.sort') }}</th>
+                        <th> {{ trans('model.article.created_at') }}</th>
+                        <th> {{ trans('common.action') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -66,11 +66,11 @@
                         <tr>
                             <td> {{$article->id}} </td>
                             @if ($article->type === 1)
-                                <td> 文章</td>
+                                <td> {{ trans('admin.article.type.knowledge') }}</td>
                             @elseif ($article->type === 2)
-                                <td> 公告</td>
+                                <td> {{ trans('admin.article.type.announcement') }}</td>
                             @else
-                                <td> 未知</td>
+                                <td> {{ trans('common.status.unknown') }}</td>
                             @endif
                             <td class="text-left">
                                 {{ Str::limit($article->category, 30) }}
@@ -80,7 +80,7 @@
                             </td>
                             <td>
                             {!! isset(config('common.language')[$article->language]) ? '<i class="fi fi-'.config('common.language')[$article->language][1].'"></i>
-                             <span style="padding: inherit;">'.config('common.language')[$article->language][0].'</span>': __('user.unknown') !!}
+                             <span style="padding: inherit;">'.config('common.language')[$article->language][0].'</span>': __('common.status.unknown') !!}
                             <td> {{$article->sort}} </td>
                             <td> {{$article->created_at}} </td>
                             <td>
@@ -95,7 +95,7 @@
                                                 <i class="icon wb-edit"></i></a>
                                         @endcan
                                         @can('admin.article.destroy')
-                                            <a class="btn btn-outline-danger" href="javascript:delArticle('{{route('admin.article.destroy',$article->id)}}')">
+                                            <a class="btn btn-outline-danger" href="javascript:delArticle('{{route('admin.article.destroy',$article->id)}}', '{{$article->id}}')">
                                                 <i class="icon wb-close"></i></a>
                                         @endcan
                                     </div>
@@ -109,7 +109,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$articles->total()}}</code> 篇文章
+                        {{ trans('admin.article.counts', ['num' => $articles->total()]) }}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -135,13 +135,13 @@
           });
 
           // 删除文章
-          function delArticle(url) {
+          function delArticle(url, id) {
             swal.fire({
-              title: '确定删除文章?',
+              title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.article.attribute')]) }}' + id + '{{ trans('admin.confirm.delete.1') }}',
               icon: 'question',
               showCancelButton: true,
-              cancelButtonText: '{{trans('common.close')}}',
-              confirmButtonText: '{{trans('common.confirm')}}',
+              cancelButtonText: '{{ trans('common.close') }}',
+              confirmButtonText: '{{ trans('common.confirm') }}',
             }).then((result) => {
               if (result.value) {
                 $.ajax({

+ 17 - 15
resources/views/admin/article/info.blade.php

@@ -7,7 +7,9 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">{{isset($article)?'添加':'编辑'}} 文章</h2>
+                <h2 class="panel-title">
+                    {{ isset($article) ? trans('admin.action.edit_item', ['attribute' => trans('model.article.attribute')]) : trans('admin.action.add_item', ['attribute' => trans('model.article.attribute')]) }}
+                </h2>
             </div>
             @if($errors->any())
                 <x-alert type="danger" :message="$errors->all()"/>
@@ -22,26 +24,26 @@
                         @method('PUT')
                     @endisset
                     <div class="form-group row">
-                        <label class="col-form-label col-md-2" for="type"> 类 型 </label>
+                        <label class="col-form-label col-md-2" for="type"> {{ trans('model.article.type') }} </label>
                         <div class="col-md-10 d-flex align-items-center">
                             <div class="radio-custom radio-primary radio-inline">
                                 <input type="radio" name="type" value="1" checked/>
-                                <label for="type">文章</label>
+                                <label for="type">{{ trans('admin.article.type.knowledge') }}</label>
                             </div>
                             <div class="radio-custom radio-primary radio-inline">
                                 <input type="radio" name="type" value="2"/>
-                                <label for="type">公告</label>
+                                <label for="type">{{ trans('admin.article.type.announcement') }}</label>
                             </div>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-form-label col-md-2" for="title"> 标 题 </label>
+                        <label class="col-form-label col-md-2" for="title"> {{ trans('validation.attributes..title') }} </label>
                         <div class="col-md-4">
                             <input type="text" class="form-control" name="title" id="title" autofocus required/>
                         </div>
                     </div>
                     <div class="form-group row article">
-                        <label class="col-form-label col-md-2" for="category"> 类 别 </label>
+                        <label class="col-form-label col-md-2" for="category"> {{ trans('model.article.category') }} </label>
                         <div class="col-md-4">
                             @if(isset($categories))
                                 <input type="text" class="form-control" list="category_list" id="category" name="category"/>
@@ -53,11 +55,11 @@
                             @else
                                 <input type="text" class="form-control" id="category" name="category"/>
                             @endif
-                            <span class="text-help"> 同一类别将归类与同一文件夹下 </span>
+                            <span class="text-help"> {{ trans('admin.article.category_hint') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-form-label col-md-2" for="language"> 语 言 </label>
+                        <label class="col-form-label col-md-2" for="language"> {{ trans('model.article.language') }} </label>
                         <div class="col-md-4">
                             <select class="form-control" data-plugin="selectpicker" id="language" name="language" data-style="btn-outline btn-primary">
                                 @foreach (config('common.language') as $key => $value)
@@ -69,21 +71,21 @@
                         </div>
                     </div>
                     <div class="form-group row article">
-                        <label class="col-form-label col-md-2" for="sort"> 排 序 </label>
+                        <label class="col-form-label col-md-2" for="sort"> {{ trans('model.common.sort') }} </label>
                         <div class="col-md-2">
                             <input type="number" class="form-control" name="sort" id="sort" value="10" min="0" max="255" required/>
-                            <span class="text-help"> 值越高显示时越靠前 </span>
+                            <span class="text-help"> {{ trans('admin.sort_asc') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-form-label col-md-2" for="logo"> 头 图 </label>
+                        <label class="col-form-label col-md-2" for="logo"> {{ trans('model.article.logo') }} </label>
                         <div class="col-md-4" id="logoUpload">
                             <input type="file" id="logo" name="logo" data-plugin="dropify" data-default-file="{{asset($article->logo ?? '/assets/images/default.png')}}"/>
-                            <span class="text-help"> 推荐尺寸:100x75 </span>
+                            <span class="text-help"> {{ trans('admin.article.logo_hint') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-form-label col-md-2" for="content"> 内 容 </label>
+                        <label class="col-form-label col-md-2" for="content"> {{ trans('validation.attributes.content') }} </label>
                         <div class="col-md-10">
                             <textarea class="form-control" name="content">
                                 @isset($article)
@@ -94,8 +96,8 @@
                     </div>
                     <div class="form-actions text-right">
                         <div class="btn-group">
-                            <a href="{{route('admin.article.index')}}" class="btn btn-danger">返 回</a>
-                            <button type="submit" class="btn btn-success">提 交</button>
+                            <a href="{{route('admin.article.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
+                            <button type="submit" class="btn btn-success">{{ trans('common.submit') }}</button>
                         </div>
                     </div>
                 </form>

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

@@ -20,7 +20,7 @@
                     <div class="panel-body pt-0 pb-60">
                         <div style="padding: 10px;">{!! $article->content !!}</div>
                         <div class="panel-footer text-right">
-                            <a href="{{route('admin.article.index')}}" class="btn btn-primary">返 回</a>
+                            <a href="{{route('admin.article.index')}}" class="btn btn-primary">{{ trans('common.back') }}</a>
                         </div>
                     </div>
                 </div>
@@ -56,12 +56,12 @@
       // 更换订阅地址
       function exchangeSubscribe() {
         swal.fire({
-          title: '{{trans('common.warning')}}',
-          text: '{{trans('user.subscribe.exchange_warning')}}',
+          title: '{{ trans('common.warning') }}',
+          text: '{{ trans('user.subscribe.exchange_warning') }}',
           icon: 'warning',
           showCancelButton: true,
-          cancelButtonText: '{{trans('common.close')}}',
-          confirmButtonText: '{{trans('common.confirm')}}',
+          cancelButtonText: '{{ trans('common.close') }}',
+          confirmButtonText: '{{ trans('common.confirm') }}',
         }).then((result) => {
           if (result.value) {
             $.post('{{route('changeSub')}}', {_token: '{{csrf_token()}}'}, function(ret) {
@@ -77,7 +77,7 @@
 
       clipboard.on('success', function() {
         swal.fire({
-          title: '{{trans('common.copy.success')}}',
+          title: '{{ trans('common.copy.success') }}',
           icon: 'success',
           timer: 1300,
           showConfirmButton: false,
@@ -85,7 +85,7 @@
       });
       clipboard.on('error', function() {
         swal.fire({
-          title: '{{trans('common.copy.failed')}}',
+          title: '{{ trans('common.copy.failed') }}',
           icon: 'error',
           timer: 1500,
           showConfirmButton: false,

+ 117 - 119
resources/views/admin/config/common.blade.php

@@ -6,43 +6,43 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title"><i class="icon wb-settings" aria-hidden="true"></i>通用配置</h1>
+                <h1 class="panel-title"><i class="icon wb-settings" aria-hidden="true"></i>{{ trans('admin.setting.common.title') }}</h1>
             </div>
             <div class="panel-body container-fluid">
                 <div class="nav-tabs-vertical" data-plugin="tabs">
                     <ul class="nav nav-tabs mr-25" role="tablist">
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link active" data-toggle="tab" href="#method" aria-controls="method" role="tab">加密</a>
+                            <a class="nav-link active" data-toggle="tab" href="#method" aria-controls="method" role="tab">{{ trans('model.node.method') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#protocol" aria-controls="protocol" role="tab">协议</a>
+                            <a class="nav-link" data-toggle="tab" href="#protocol" aria-controls="protocol" role="tab">{{ trans('model.node.protocol') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#obfs" aria-controls="obfs" role="tab">混淆</a>
+                            <a class="nav-link" data-toggle="tab" href="#obfs" aria-controls="obfs" role="tab">{{ trans('model.node.obfs') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#level" aria-controls="level" role="tab">等级</a>
+                            <a class="nav-link" data-toggle="tab" href="#level" aria-controls="level" role="tab">{{ trans('model.node.level') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#country" aria-controls="country" role="tab">国家地区</a>
+                            <a class="nav-link" data-toggle="tab" href="#country" aria-controls="country" role="tab">{{ trans('model.node.country') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#label" aria-controls="label" role="tab">标签</a>
+                            <a class="nav-link" data-toggle="tab" href="#label" aria-controls="label" role="tab">{{ trans('model.node.label') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#category" aria-controls="category" role="tab">商品分类</a>
+                            <a class="nav-link" data-toggle="tab" href="#category" aria-controls="category" role="tab">{{ trans('model.goods.category') }}</a>
                         </li>
                     </ul>
                     <div class="tab-content py-15">
                         <div class="tab-pane active" id="method" role="tabpanel">
                             <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_config_modal">
-                                新增<i class="icon wb-plus"></i>
+                                <i class="icon wb-plus"></i>
                             </button>
                             <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
                                 <thead class="thead-default">
                                 <tr>
-                                    <th> 名称</th>
-                                    <th> {{trans('common.action')}}</th>
+                                    <th> {{ trans('validation.attributes.name') }}</th>
+                                    <th> {{ trans('common.action') }}</th>
                                 </tr>
                                 </thead>
                                 <tbody>
@@ -51,11 +51,11 @@
                                         <td> {{$method->name}}</td>
                                         <td>
                                             @if($method->is_default)
-                                                <span class='badge badge-lg badge-default'>默认</span>
+                                                <span class='badge badge-lg badge-default'>{{ trans('common.default') }}</span>
                                             @else
                                                 <div class="btn-group">
                                                     <button class="btn btn-primary" onclick="setDefault('{{$method->id}}')">
-                                                        默认
+                                                        {{ trans('admin.setting.common.set_default') }}
                                                     </button>
                                                     <button class="btn btn-danger" onclick="delConfig('{{$method->id}}','{{$method->name}}')">
                                                         <i class="icon wb-trash"></i>
@@ -70,13 +70,13 @@
                         </div>
                         <div class="tab-pane" id="protocol" role="tabpanel">
                             <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_config_modal">
-                                新增<i class="icon wb-plus"></i>
+                                <i class="icon wb-plus"></i>
                             </button>
                             <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
                                 <thead class="thead-default">
                                 <tr>
-                                    <th> 名称</th>
-                                    <th> {{trans('common.action')}}</th>
+                                    <th> {{ trans('validation.attributes.name') }}</th>
+                                    <th> {{ trans('common.action') }}</th>
                                 </tr>
                                 </thead>
                                 <tbody>
@@ -85,11 +85,11 @@
                                         <td> {{$protocol->name}}</td>
                                         <td>
                                             @if($protocol->is_default)
-                                                <span class="badge badge-lg badge-default">默认</span>
+                                                <span class="badge badge-lg badge-default">{{ trans('common.default') }}</span>
                                             @else
                                                 <div class="btn-group">
                                                     <button class="btn btn-primary" onclick="setDefault('{{$protocol->id}}')">
-                                                        默认
+                                                        {{ trans('admin.setting.common.set_default') }}
                                                     </button>
                                                     <button class="btn btn-danger" onclick="delConfig('{{$protocol->id}}','{{$protocol->name}}')">
                                                         <i class="icon wb-trash"></i>
@@ -104,13 +104,13 @@
                         </div>
                         <div class="tab-pane" id="obfs" role="tabpanel">
                             <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_config_modal">
-                                新增<i class="icon wb-plus"></i>
+                                <i class="icon wb-plus"></i>
                             </button>
                             <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
                                 <thead class="thead-default">
                                 <tr>
-                                    <th> 名称</th>
-                                    <th> {{trans('common.action')}}</th>
+                                    <th> {{ trans('validation.attributes.name') }}</th>
+                                    <th> {{ trans('common.action') }}</th>
                                 </tr>
                                 </thead>
                                 <tbody>
@@ -119,11 +119,11 @@
                                         <td> {{$obfs->name}}</td>
                                         <td>
                                             @if($obfs->is_default)
-                                                <span class="badge badge-lg badge-default">默认</span>
+                                                <span class="badge badge-lg badge-default">{{ trans('common.default') }}</span>
                                             @else
                                                 <div class="btn-group">
                                                     <button class="btn btn-primary" onclick="setDefault('{{$obfs->id}}')">
-                                                        默认
+                                                        {{ trans('admin.setting.common.set_default') }}
                                                     </button>
                                                     <button class="btn btn-danger" onclick="delConfig('{{$obfs->id}}','{{$obfs->name}}')">
                                                         <i class="icon wb-trash"></i>
@@ -138,14 +138,14 @@
                         </div>
                         <div class="tab-pane" id="level" role="tabpanel">
                             <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_level_modal">
-                                新增<i class="icon wb-plus"></i>
+                                <i class="icon wb-plus"></i>
                             </button>
                             <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
                                 <thead class="thead-default">
                                 <tr>
-                                    <th> 等级</th>
-                                    <th> 名称</th>
-                                    <th> {{trans('common.action')}}</th>
+                                    <th> {{ trans('model.node.level') }}</th>
+                                    <th> {{ trans('validation.attributes.name') }}</th>
+                                    <th> {{ trans('common.action') }}</th>
                                 </tr>
                                 </thead>
                                 <tbody>
@@ -172,14 +172,14 @@
                         </div>
                         <div class="tab-pane" id="category" role="tabpanel">
                             <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_category_modal">
-                                新增<i class="icon wb-plus"></i>
+                                <i class="icon wb-plus"></i>
                             </button>
                             <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
                                 <thead class="thead-default">
                                 <tr>
-                                    <th> 名称</th>
-                                    <th> 排序</th>
-                                    <th> {{trans('common.action')}}</th>
+                                    <th> {{ trans('validation.attributes.name') }}</th>
+                                    <th> {{ trans('model.common.sort') }}</th>
+                                    <th> {{ trans('common.action') }}</th>
                                 </tr>
                                 </thead>
                                 <tbody>
@@ -206,15 +206,15 @@
                         </div>
                         <div class="tab-pane" id="country" role="tabpanel">
                             <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_country_modal">
-                                新增<i class="icon wb-plus"></i>
+                                <i class="icon wb-plus"></i>
                             </button>
                             <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
                                 <thead class="thead-default">
                                 <tr>
-                                    <th> 图标</th>
-                                    <th> 代码</th>
-                                    <th> 国家/地区名称</th>
-                                    <th> {{trans('common.action')}}</th>
+                                    <th> {{ trans('model.country.icon') }}</th>
+                                    <th> {{ trans('model.country.code') }}</th>
+                                    <th> {{ trans('model.country.name') }}</th>
+                                    <th> {{ trans('common.action') }}</th>
                                 </tr>
                                 </thead>
                                 <tbody>
@@ -244,15 +244,15 @@
                         </div>
                         <div class="tab-pane" id="label" role="tabpanel">
                             <button class="btn btn-primary float-right mb-10" data-toggle="modal" data-target="#add_label_modal">
-                                新增<i class="icon wb-plus"></i>
+                                <i class="icon wb-plus"></i>
                             </button>
                             <table class="text-md-center" data-toggle="table" data-height="700" data-virtual-scroll="true" data-mobile-responsive="true">
                                 <thead class="thead-default">
                                 <tr>
-                                    <th> 名称</th>
-                                    <th> 关联节点数</th>
-                                    <th> 排序</th>
-                                    <th> {{trans('common.action')}}</th>
+                                    <th> {{ trans('validation.attributes.name') }}</th>
+                                    <th> {{ trans('admin.setting.common.connect_nodes') }}</th>
+                                    <th> {{ trans('model.common.sort') }}</th>
+                                    <th> {{ trans('common.action') }}</th>
                                 </tr>
                                 </thead>
                                 <tbody>
@@ -288,29 +288,29 @@
         <div class="modal-dialog modal-simple modal-center">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
-                    <h4 class="modal-title">新增配置</h4>
+                    <h4 class="modal-title">{{ trans('common.add') }}</h4>
                 </div>
                 <form action="#" method="post" class="modal-body">
                     <div class="alert alert-danger" style="display: none;" id="msg"></div>
                     <div class="row">
                         <div class="col-md-6 form-group">
-                            <select class="form-control" name="type" id="type" placeholder="类型">
-                                <option value="1" selected>加密方式</option>
-                                <option value="2">协议</option>
-                                <option value="3">混淆</option>
+                            <select class="form-control" name="type" id="type">
+                                <option value="1" selected>{{ trans('model.node.method') }}</option>
+                                <option value="2">{{ trans('model.node.protocol') }}</option>
+                                <option value="3">{{ trans('model.node.obfs') }}</option>
                             </select>
                         </div>
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="name" id="name" placeholder="名称">
+                            <input type="text" class="form-control" name="name" id="name" placeholder="{{ trans('validation.attributes.name') }}">
                         </div>
                     </div>
                 </form>
                 <div class="modal-footer">
-                    <button class="btn btn-danger mr-auto" data-dismiss="modal">关 闭</button>
-                    <button class="btn btn-primary" onclick="addConfig()">提 交</button>
+                    <button class="btn btn-danger mr-auto" data-dismiss="modal">{{ trans('common.close') }}</button>
+                    <button class="btn btn-primary" onclick="addConfig()">{{ trans('common.submit') }}</button>
                 </div>
             </div>
         </div>
@@ -320,25 +320,25 @@
         <div class="modal-dialog modal-simple modal-center">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
-                    <h4 class="modal-title">新增等级</h4>
+                    <h4 class="modal-title">{{ trans('admin.action.add_item', ['attribute' => trans('model.node.level')]) }}</h4>
                 </div>
                 <form action="#" method="post" class="modal-body">
                     <div class="alert alert-danger" style="display: none;" id="level_msg"></div>
                     <div class="row">
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="level" id="add_level" placeholder="等级">
+                            <input type="text" class="form-control" name="level" id="add_level" placeholder="{{ trans('model.node.level') }}">
                         </div>
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="level_name" id="add_level_name" placeholder="等级名称">
+                            <input type="text" class="form-control" name="level_name" id="add_level_name" placeholder="{{ trans('validation.attributes.name') }}">
                         </div>
                     </div>
                 </form>
                 <div class="modal-footer">
-                    <button data-dismiss="modal" class="btn btn-danger mr-auto">关 闭</button>
-                    <button class="btn btn-primary" onclick="addLevel()">提 交</button>
+                    <button data-dismiss="modal" class="btn btn-danger mr-auto">{{ trans('common.close') }}</button>
+                    <button class="btn btn-primary" onclick="addLevel()">{{ trans('common.submit') }}</button>
                 </div>
             </div>
         </div>
@@ -348,25 +348,25 @@
         <div class="modal-dialog modal-simple modal-center">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
-                    <h4 class="modal-title">新增分类</h4>
+                    <h4 class="modal-title">{{ trans('admin.action.add_item', ['attribute' => trans('model.goods.category')]) }}</h4>
                 </div>
                 <form action="#" method="post" class="modal-body">
                     <div class="alert alert-danger" style="display: none;" id="category_msg"></div>
                     <div class="row">
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="name" id="add_category_name" placeholder="分类名称">
+                            <input type="text" class="form-control" name="name" id="add_category_name" placeholder="{{ trans('validation.attributes.name') }}">
                         </div>
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="sort" id="add_category_sort" placeholder="分类排序">
+                            <input type="text" class="form-control" name="sort" id="add_category_sort" placeholder="{{ trans('model.common.sort') }}">
                         </div>
                     </div>
                 </form>
                 <div class="modal-footer">
-                    <button data-dismiss="modal" class="btn btn-danger mr-auto">关 闭</button>
-                    <button class="btn btn-primary" onclick="addCategory()">提 交</button>
+                    <button data-dismiss="modal" class="btn btn-danger mr-auto">{{ trans('common.close') }}</button>
+                    <button class="btn btn-primary" onclick="addCategory()">{{ trans('common.submit') }}</button>
                 </div>
             </div>
         </div>
@@ -376,25 +376,25 @@
         <div class="modal-dialog modal-simple modal-center">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
-                    <h4 class="modal-title">新增国家/地区</h4>
+                    <h4 class="modal-title">{{ trans('admin.action.add_item', ['attribute' => trans('model.country.name')]) }}</h4>
                 </div>
                 <form action="#" method="post" class="modal-body">
                     <div class="alert alert-danger" style="display: none;" id="country_msg"></div>
                     <div class="row">
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="country_code" id="add_country_code" placeholder="ISO国家代码">
+                            <input type="text" class="form-control" name="country_code" id="add_country_code" placeholder="{{ trans('model.country.code') }}">
                         </div>
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="country_name" id="add_country_name" placeholder=" 国家/地区名称">
+                            <input type="text" class="form-control" name="country_name" id="add_country_name" placeholder="{{ trans('model.country.name') }}">
                         </div>
                     </div>
                 </form>
                 <div class="modal-footer">
-                    <button data-dismiss="modal" class="btn btn-danger mr-auto">关 闭</button>
-                    <button class="btn btn-primary" onclick="addCountry()">提 交</button>
+                    <button data-dismiss="modal" class="btn btn-danger mr-auto">{{ trans('common.close') }}</button>
+                    <button class="btn btn-primary" onclick="addCountry()">{{ trans('common.submit') }}</button>
                 </div>
             </div>
         </div>
@@ -404,25 +404,25 @@
         <div class="modal-dialog modal-simple modal-center">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
+                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
-                    <h4 class="modal-title">新增标签</h4>
+                    <h4 class="modal-title">{{ trans('admin.action.add_item', ['attribute' => trans('model.node.label')]) }}</h4>
                 </div>
                 <form action="#" method="post" class="modal-body">
                     <div class="alert alert-danger" style="display: none;" id="lable_msg"></div>
                     <div class="row">
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="label" id="add_label" placeholder="标签">
+                            <input type="text" class="form-control" name="label" id="add_label" placeholder="{{ trans('validation.attributes.name') }}">
                         </div>
                         <div class="col-md-6 form-group">
-                            <input type="text" class="form-control" name="label_sort" id="add_label_sort" placeholder="排序">
+                            <input type="text" class="form-control" name="label_sort" id="add_label_sort" placeholder="{{ trans('model.common.sort') }}">
                         </div>
                     </div>
                 </form>
                 <div class="modal-footer">
-                    <button data-dismiss="modal" class="btn btn-danger mr-auto">关 闭</button>
-                    <button class="btn btn-primary" onclick="addLabel()">提 交</button>
+                    <button data-dismiss="modal" class="btn btn-danger mr-auto">{{ trans('common.close') }}</button>
+                    <button class="btn btn-primary" onclick="addLabel()">{{ trans('common.submit') }}</button>
                 </div>
             </div>
         </div>
@@ -439,13 +439,13 @@
         const level_name = $('#add_level_name').val();
 
         if (level.trim() === '') {
-          $('#level_msg').show().html('等级不能为空');
+          $('#level_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.node.level')]) }}');
           $('#level').focus();
           return false;
         }
 
         if (level_name.trim() === '') {
-          $('#level_msg').show().html('等级名称不能为空');
+          $('#level_msg').show().html('{{ trans('validation.required', ['attribute' => trans('validation.attributes.name')]) }}');
           $('#level_name').focus();
           return false;
         }
@@ -455,7 +455,7 @@
           method: 'POST',
           data: {_token: '{{csrf_token()}}', level: level, name: level_name},
           beforeSend: function() {
-            $('#level_msg').show().html('正在添加');
+            $('#level_msg').show().html('{{ trans('admin.creating') }}');
           },
           success: function(ret) {
             if (ret.status === 'fail') {
@@ -466,15 +466,15 @@
             window.location.reload();
           },
           error: function() {
-            $('#level_msg').show().html('请求错误,请重试');
+            $('#level_msg').show().html('{{ trans('common.request_failed') }}');
           },
           complete: function() {
-            swal.fire({title: '添加成功', icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+            swal.fire({icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
           },
         });
           @endcan
           @cannot('admin.config.level.store')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -499,14 +499,14 @@
           });
           @endcan
           @cannot('admin.config.level.update')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
       function delLevel(id, name) { // 删除等级
           @can('admin.config.level.destroy')
           swal.fire({
-            title: '确定删除等级 【' + name + '】 ?',
+            title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node.level')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
             icon: 'question',
             allowEnterKey: false,
             showCancelButton: true,
@@ -531,7 +531,7 @@
           });
           @endcan
           @cannot('admin.config.level.destroy')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -541,13 +541,13 @@
         const sort = $('#add_category_sort').val();
 
         if (name.trim() === '') {
-          $('#category_msg').show().html('分类名称不能为空');
+          $('#category_msg').show().html('{{ trans('validation.required', ['attribute' => trans('validation.attributes.name')]) }}');
           $('#category_name').focus();
           return false;
         }
 
         if (sort.trim() === '') {
-          $('#category_msg').show().html('分类排序不能为空');
+          $('#category_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.common.sort')]) }}');
           $('#category_sort').focus();
           return false;
         }
@@ -557,7 +557,7 @@
           method: 'POST',
           data: {_token: '{{csrf_token()}}', name: name, sort: sort},
           beforeSend: function() {
-            $('#category_msg').show().html('正在添加');
+            $('#category_msg').show().html('{{ trans('admin.creating') }}');
           },
           success: function(ret) {
             if (ret.status === 'fail') {
@@ -568,15 +568,15 @@
             window.location.reload();
           },
           error: function() {
-            $('#category_msg').show().html('请求错误,请重试');
+            $('#category_msg').show().html('{{ trans('common.request_failed') }}');
           },
           complete: function() {
-            swal.fire({title: '添加成功', icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+            swal.fire({icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
           },
         });
           @endcan
           @cannot('admin.config.category.store')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -601,14 +601,14 @@
           });
           @endcan
           @cannot('admin.config.category.update')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
       function delCategory(id, name) { // 删除分类
           @can('admin.config.category.destroy')
           swal.fire({
-            title: '确定删除分类 【' + name + '】 ?',
+            title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.goods.category')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
             icon: 'question',
             allowEnterKey: false,
             showCancelButton: true,
@@ -633,7 +633,7 @@
           });
           @endcan
           @cannot('admin.config.category.destroy')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -643,13 +643,13 @@
         const country_code = $('#add_country_code').val();
 
         if (country_code.trim() === '') {
-          $('#country_msg').show().html('国家/地区代码不能为空');
+          $('#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('国家/地区名称不能为空');
+          $('#country_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.country.name')]) }}');
           $('#add_country_name').focus();
           return false;
         }
@@ -659,7 +659,7 @@
           method: 'POST',
           data: {_token: '{{csrf_token()}}', code: country_code, name: country_name},
           beforeSend: function() {
-            $('#country_msg').show().html('正在添加');
+            $('#country_msg').show().html('{{ trans('admin.creating') }}');
           },
           success: function(ret) {
             if (ret.status === 'fail') {
@@ -670,11 +670,10 @@
             window.location.reload();
           },
           error: function() {
-            $('#country_msg').show().html('请求错误,请重试');
+            $('#country_msg').show().html('{{ trans('common.request_failed') }}');
           },
           complete: function() {
             swal.fire({
-              title: '添加成功',
               icon: 'success',
               timer: 1000,
               showConfirmButton: false,
@@ -683,7 +682,7 @@
         });
           @endcan
           @cannot('admin.config.country.store')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -704,14 +703,14 @@
           });
           @endcan
           @cannot('admin.config.country.update')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
       function delCountry(code, name) { // 删除国家/地区
           @can('admin.config.country.destroy')
           swal.fire({
-            title: '确定删除 【' + name + '】 信息?',
+            title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node.country')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
             icon: 'question',
             allowEnterKey: false,
             showCancelButton: true,
@@ -736,7 +735,7 @@
           });
           @endcan
           @cannot('admin.config.country.destroy')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -746,7 +745,7 @@
         const type = $('#type').val();
 
         if (name.trim() === '') {
-          $('#msg').show().html('名称不能为空');
+          $('#msg').show().html('{{ trans('validation.required', ['attribute' => trans('validation.attributes.name')]) }}');
           $('#name').focus();
           return false;
         }
@@ -757,7 +756,7 @@
           data: {_token: '{{csrf_token()}}', name: name, type: type},
           dataType: 'json',
           beforeSend: function() {
-            $('#msg').show().html('正在添加');
+            $('#msg').show().html('{{ trans('admin.creating') }}');
           },
           success: function(ret) {
             if (ret.status === 'fail') {
@@ -768,15 +767,15 @@
             $('#add_config_modal').modal('hide');
           },
           error: function() {
-            $('#msg').show().html('请求错误,请重试');
+            $('#msg').show().html('{{ trans('common.request_failed') }}');
           },
           complete: function() {
-            swal.fire({title: '添加成功', icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+            swal.fire({icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
           },
         });
           @endcan
           @cannot('admin.config.ss.store')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -797,14 +796,14 @@
           });
           @endcan
           @cannot('admin.config.ss.update')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
       function delConfig(id, name) { // 删除配置
           @can('admin.config.ss.destroy')
           swal.fire({
-            title: '确定删除配置 【' + name + '】 ?',
+            title: '{{ trans('admin.confirm.delete.0', ['attribute' => '']) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
             icon: 'question',
             allowEnterKey: false,
             showCancelButton: true,
@@ -829,7 +828,7 @@
           });
           @endcan
           @cannot('admin.config.ss.destroy')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -839,12 +838,12 @@
         const sort = $('#add_label_sort').val();
 
         if (name.trim() === '') {
-          $('#lable_msg').show().html('标签不能为空');
+          $('#lable_msg').show().html('{{ trans('validation.required', ['attribute' => trans('validation.attributes.name')]) }}');
           return false;
         }
 
         if (sort.trim() === '') {
-          $('#lable_msg').show().html('标签排序不能为空');
+          $('#lable_msg').show().html('{{ trans('validation.required', ['attribute' => trans('model.common.sort')]) }}');
           return false;
         }
 
@@ -853,7 +852,7 @@
           method: 'POST',
           data: {_token: '{{csrf_token()}}', name: name, sort: sort},
           beforeSend: function() {
-            $('#level_msg').show().html('正在添加');
+            $('#level_msg').show().html('{{ trans('admin.creating') }}');
           },
           success: function(ret) {
             if (ret.status === 'fail') {
@@ -864,11 +863,10 @@
             window.location.reload();
           },
           error: function() {
-            $('#lable_msg').show().html('请求错误,请重试');
+            $('#lable_msg').show().html('{{ trans('common.request_failed') }}');
           },
           complete: function() {
             swal.fire({
-              title: '添加成功',
               icon: 'success',
               timer: 1000,
               showConfirmButton: false,
@@ -877,7 +875,7 @@
         });
           @endcan
           @cannot('admin.config.label.store')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
@@ -902,15 +900,15 @@
           });
           @endcan
           @cannot('admin.config.label.update')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
 
       function delLabel(id, name) { // 删除标签
           @can('admin.config.label.destroy')
           swal.fire({
-            title: '{{trans('common.warning')}}',
-            text: '确定删除标签 【' + name + '】 ?',
+            title: '{{ trans('common.warning') }}',
+            text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node.label')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
             icon: 'warning',
             showCancelButton: true,
             cancelButtonText: '{{trans('common.close')}}',
@@ -932,7 +930,7 @@
           });
           @endcan
           @cannot('admin.config.label.destroy')
-          swal.fire({title: '您没有权限修改参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcannot
       }
     </script>

+ 57 - 57
resources/views/admin/config/emailFilter.blade.php

@@ -6,12 +6,12 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">邮箱过滤列表
-                    <small>(用于屏蔽注册邮箱后缀)</small>
+                <h2 class="panel-title">{!! trans('admin.setting.email.title') !!}
                 </h2>
                 @can('admin.config.filter.store')
                     <div class="panel-actions">
-                        <button class="btn btn-primary" data-toggle="modal" data-target="#add_email_suffix"> 添加邮箱后缀
+                        <button class="btn btn-primary" data-toggle="modal"
+                                data-target="#add_email_suffix"> {{ trans('admin.action.add_item', ['attribute' => trans('admin.setting.email.tail')]) }}
                         </button>
                     </div>
                 @endcan
@@ -21,16 +21,16 @@
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 类型</th>
-                        <th> 邮箱后缀</th>
-                        <th> {{trans('common.action')}}</th>
+                        <th> {{ trans('admin.setting.email.rule') }}</th>
+                        <th> {{ trans('admin.setting.email.tail') }}</th>
+                        <th> {{ trans('common.action') }}</th>
                     </tr>
                     </thead>
                     <tbody>
                     @foreach($filters as $filter)
                         <tr>
                             <td> {{$filter->id}} </td>
-                            <td> {{$filter->type === 1? '黑':'白'}} </td>
+                            <td> {{$filter->type === 1? trans('admin.setting.email.black') : trans('admin.setting.email.white')}} </td>
                             <td> {{$filter->words}} </td>
                             <td>
                                 @can('admin.config.filter.destroy')
@@ -47,7 +47,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$filters->total()}}</code> 条记录
+                        {!! trans('admin.logs.counts', ['num' => $filters->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -67,32 +67,32 @@
                         <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                             <span aria-hidden="true">×</span>
                         </button>
-                        <h4 class="modal-title"> 添加邮箱后缀 </h4>
+                        <h4 class="modal-title"> {{ trans('admin.action.add_item', ['attribute' => trans('admin.setting.email.tail')]) }} </h4>
                     </div>
                     <div class="modal-body">
                         <div class="form-group row">
-                            <label class="col-form-label col-md-2" for="type">类型</label>
+                            <label class="col-form-label col-md-2" for="type">{{ trans('admin.setting.email.rule') }}</label>
                             <div class="col-md-10 d-flex align-items-center">
                                 <div class="radio-custom radio-primary radio-inline">
                                     <input type="radio" name="type" value="1" checked/>
-                                    <label for="type">黑名单</label>
+                                    <label for="type">{{ trans('admin.setting.email.black') }}</label>
                                 </div>
                                 <div class="radio-custom radio-primary radio-inline">
                                     <input type="radio" name="type" value="2"/>
-                                    <label for="type">白名单</label>
+                                    <label for="type">{{ trans('admin.setting.email.white') }}</label>
                                 </div>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label class="col-form-label col-md-2" for="words">邮箱后缀</label>
+                            <label class="col-form-label col-md-2" for="words">{{ trans('admin.setting.email.tail') }}</label>
                             <div class="col-md-9">
-                                <input type="text" class="form-control" name="words" id="words" placeholder="请填入邮箱后缀"/>
+                                <input type="text" class="form-control" name="words" id="words" placeholder="{{ trans('admin.setting.email.tail_placeholder') }}"/>
                             </div>
                         </div>
                     </div>
                     <div class="modal-footer">
-                        <button data-dismiss="modal" class="btn btn-danger mr-auto"> 关 闭</button>
-                        <button data-dismiss="modal" class="btn btn-success" onclick="addEmailSuffix()"> 提 交</button>
+                        <button data-dismiss="modal" class="btn btn-danger mr-auto">{{ trans('common.close') }}</button>
+                        <button data-dismiss="modal" class="btn btn-success" onclick="addEmailSuffix()">{{ trans('common.submit') }}</button>
                     </div>
                 </div>
             </div>
@@ -106,54 +106,54 @@
         @can('admin.config.filter.store')
         // 添加邮箱后缀
         function addEmailSuffix() {
-            const words = $('#words').val();
-            if (words.trim() === '') {
-                swal.fire({title: '邮箱后缀不能为空', icon: 'warning', timer: 1000, showConfirmButton: false});
-                $('#words').focus();
-                return false;
-            }
+          const words = $('#words').val();
+          if (words.trim() === '') {
+            swal.fire({title: '{{ trans('validation.required', ['attribute' => trans('admin.setting.email.tail')]) }}', icon: 'warning', timer: 1000, showConfirmButton: false});
+            $('#words').focus();
+            return false;
+          }
 
-            $.post('{{route('admin.config.filter.store')}}', {
-                _token: '{{csrf_token()}}',
-                type: $('input:radio[name=\'type\']:checked').val(),
-                words: words,
-            }, function(ret) {
-                if (ret.status === 'success') {
-                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                } else {
-                    swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                }
-            });
+          $.post('{{route('admin.config.filter.store')}}', {
+            _token: '{{csrf_token()}}',
+            type: $('input:radio[name=\'type\']:checked').val(),
+            words: words,
+          }, function(ret) {
+            if (ret.status === 'success') {
+              swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+            } else {
+              swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+            }
+          });
         }
         @endcan
 
         @can('admin.config.filter.destroy')
         // 删除邮箱后缀
         function delSuffix(id, name) {
-            swal.fire({
-                title: '{{trans('common.warning')}}',
-                text: '确定删除邮箱后缀 【' + name + '】 ?',
-                icon: 'warning',
-                showCancelButton: true,
-                cancelButtonText: '取消',
-                confirmButtonText: '确定',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'DELETE',
-                        url: '{{route('admin.config.filter.destroy', '')}}/' + id,
-                        data: {_token: '{{csrf_token()}}'},
-                        dataType: 'json',
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                            } else {
-                                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                            }
-                        },
-                    });
-                }
-            });
+          swal.fire({
+            title: '{{ trans('common.warning') }}',
+            text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('admin.setting.email.tail')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
+            icon: 'warning',
+            showCancelButton: true,
+            cancelButtonText: '{{ trans('common.cancel') }}',
+            confirmButtonText: '{{ trans('common.confirm') }}',
+          }).then((result) => {
+            if (result.value) {
+              $.ajax({
+                method: 'DELETE',
+                url: '{{route('admin.config.filter.destroy', '')}}/' + id,
+                data: {_token: '{{csrf_token()}}'},
+                dataType: 'json',
+                success: function(ret) {
+                  if (ret.status === 'success') {
+                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                  } else {
+                    swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+                  }
+                },
+              });
+            }
+          });
         }
         @endcan
     </script>

+ 240 - 265
resources/views/admin/config/system.blade.php

@@ -8,243 +8,206 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title"><i class="icon wb-settings"></i>通用配置</h1>
+                <h1 class="panel-title"><i class="icon wb-settings"></i>{{ trans('admin.setting.system.title') }}</h1>
             </div>
             <div class="panel-body">
                 <div class="nav-tabs-horizontal" data-plugin="tabs">
                     <ul class="nav nav-tabs" role="tablist">
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link active" data-toggle="tab" href="#webSetting" aria-controls="webSetting" role="tab">网站常规</a>
+                            <a class="nav-link active" data-toggle="tab" href="#webSetting" aria-controls="webSetting" role="tab">{{ trans('admin.setting.system.web') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#account" aria-controls="account" role="tab">账号设置</a>
+                            <a class="nav-link" data-toggle="tab" href="#account" aria-controls="account" role="tab">{{ trans('admin.setting.system.account') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#node" aria-controls="node" role="tab">节点设置</a>
+                            <a class="nav-link" data-toggle="tab" href="#node" aria-controls="node" role="tab">{{ trans('admin.setting.system.node') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#extend" aria-controls="extend" role="tab">拓展功能</a>
+                            <a class="nav-link" data-toggle="tab" href="#extend" aria-controls="extend" role="tab">{{ trans('admin.setting.system.extend') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#checkIn" aria-controls="checkIn" role="tab">签到系统</a>
+                            <a class="nav-link" data-toggle="tab" href="#checkIn" aria-controls="checkIn" role="tab">{{ trans('admin.setting.system.check_in') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#promo" aria-controls="promo" role="tab">推广系统</a>
+                            <a class="nav-link" data-toggle="tab" href="#promo" aria-controls="promo" role="tab">{{ trans('admin.setting.system.promotion') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#notify" aria-controls="notify" role="tab">通知系统</a>
+                            <a class="nav-link" data-toggle="tab" href="#notify" aria-controls="notify" role="tab">{{ trans('admin.setting.system.notify') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#auto" aria-controls="auto" role="tab">自动任务</a>
+                            <a class="nav-link" data-toggle="tab" href="#auto" aria-controls="auto" role="tab">{{ trans('admin.setting.system.auto_job') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#other" aria-controls="other" role="tab">LOGO|客服|统计</a>
+                            <a class="nav-link" data-toggle="tab" href="#other" aria-controls="other" role="tab">{{ trans('admin.setting.system.other') }}</a>
                         </li>
                         <li class="nav-item" role="presentation">
-                            <a class="nav-link" data-toggle="tab" href="#payment" aria-controls="payment" role="tab">支付系统</a>
+                            <a class="nav-link" data-toggle="tab" href="#payment" aria-controls="payment" role="tab">{{ trans('admin.setting.system.payment') }}</a>
                         </li>
                         <li class="dropdown nav-item" role="presentation">
-                            <a class="dropdown-toggle nav-link" data-toggle="dropdown" href="#" aria-expanded="false">菜单</a>
+                            <a class="dropdown-toggle nav-link" data-toggle="dropdown" href="#" aria-expanded="false">{{ trans('admin.setting.system.menu') }}</a>
                             <div class="dropdown-menu" role="menu">
-                                <a class="dropdown-item active" data-toggle="tab" href="#webSetting" aria-controls="webSetting" role="tab">网站常规</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#account" aria-controls="account" role="tab">账号设置</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#node" aria-controls="node" role="tab">节点设置</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#extend" aria-controls="extend" role="tab">拓展功能</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#checkIn" aria-controls="checkIn" role="tab">签到系统</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#promo" aria-controls="promo" role="tab">推广系统</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#notify" aria-controls="notify" role="tab">通知系统</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#auto" aria-controls="auto" role="tab">自动任务</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#other" aria-controls="other" role="tab">LOGO|客服|统计</a>
-                                <a class="dropdown-item" data-toggle="tab" href="#payment" aria-controls="payment" role="tab">支付系统</a>
+                                <a class="dropdown-item active" data-toggle="tab" href="#webSetting" aria-controls="webSetting"
+                                   role="tab">{{ trans('admin.setting.system.web') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#account" aria-controls="account" role="tab">{{ trans('admin.setting.system.account') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#node" aria-controls="node" role="tab">{{ trans('admin.setting.system.node') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#extend" aria-controls="extend" role="tab">{{ trans('admin.setting.system.extend') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#checkIn" aria-controls="checkIn" role="tab">{{ trans('admin.setting.system.check_in') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#promo" aria-controls="promo" role="tab">{{ trans('admin.setting.system.promotion') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#notify" aria-controls="notify" role="tab">{{ trans('admin.setting.system.notify') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#auto" aria-controls="auto" role="tab">{{ trans('admin.setting.system.auto_job') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#other" aria-controls="other" role="tab">{{ trans('admin.setting.system.other') }}</a>
+                                <a class="dropdown-item" data-toggle="tab" href="#payment" aria-controls="payment" role="tab">{{ trans('admin.setting.system.payment') }}</a>
                             </div>
                         </li>
                     </ul>
                     <div class="tab-content py-35 px-35">
                         <x-system.tab-pane id="webSetting" :active="true">
-                            <x-system.input title="网站名称" :value="$website_name" code="website_name" help="发邮件时展示"/>
-                            <x-system.input title="网站地址" :value="$website_url" code="website_url" help="生成重置密码、在线支付必备" type="url"/>
-                            <x-system.select title="本位货币" code="standard_currency" :list="array_column(config('common.currency'), 'code', 'name')"
-                                             help="网站中涉及金钱部分的默认货币"/>
-                            <x-system.input title="苹果账号" :value="$AppStore_id" code="AppStore_id" help="iOS软件设置教程中使用的苹果账号" type="email"/>
-                            <x-system.input title="苹果密码" :value="$AppStore_password" code="AppStore_password" help="iOS软件设置教程中使用的苹果密码" type="password"/>
-                            <x-system.input title="管理员邮箱" :value="$webmaster_email" code="webmaster_email" help="错误提示时会提供管理员邮箱作为联系方式" type="email"/>
+                            <x-system.input code="website_name" :value="$website_name"/>
+                            <x-system.input code="website_url" :value="$website_url" type="url"/>
+                            <x-system.select code="standard_currency" :list="array_column(config('common.currency'), 'code', 'name')"/>
+                            <x-system.input code="AppStore_id" :value="$AppStore_id" type="email"/>
+                            <x-system.input code="AppStore_password" :value="$AppStore_password" type="password"/>
+                            <x-system.input code="webmaster_email" :value="$webmaster_email" type="email"/>
                             <div class="form-group col-lg-6">
                                 <div class="form-row">
-                                    <label class="col-md-3 col-form-label" for="website_security_code">网站安全码</label>
+                                    <label class="col-md-3 col-form-label" for="website_security_code">{{ trans('admin.system.website_security_code') }}</label>
                                     <div class="col-md-6">
                                         <div class="input-group">
                                             <input type="text" class="form-control" id="website_security_code" value="{{$website_security_code}}"/>
                                             <span class="input-group-append">
-                                                <button class="btn btn-info" type="button" onclick="makeWebsiteSecurityCode()">生成</button>
-                                                <button class="btn btn-primary" type="button" onclick="update('website_security_code')">{{trans('common.update')}}</button>
+                                                <button class="btn btn-info" type="button" onclick="makeWebsiteSecurityCode()">{{ trans('common.generate') }}</button>
+                                                <button class="btn btn-primary" type="button" onclick="update('website_security_code')">{{ trans('common.update') }}</button>
                                             </span>
                                         </div>
-                                        <span class="text-help">非空时必须通过<a href="{{route('login')}}?securityCode=" target="_blank">安全入口</a>加上安全码才可访问</span>
+                                        <span class="text-help">{!! trans('admin.system.hint.website_security_code', ['url' => route('login').'?securityCode=']) !!}</span>
                                     </div>
                                 </div>
                             </div>
-                            <x-system.select title="禁止访问模式" code="forbid_mode" help="依据IP对对应地区进行阻拦,非阻拦地区可正常访问"
-                                             :list="['关闭' => '', '阻拦大陆'=> 'ban_mainland', '阻拦中国' => 'ban_china', '阻拦海外' => 'ban_oversea']"/>
-                            <x-system.switch title="阻止机器人访问" code="is_forbid_robot" :check="$is_forbid_robot" help="如果是机器人、爬虫、代理访问网站则会抛出404错误"/>
-                            <x-system.switch title="维护模式" code="maintenance_mode" :check="$maintenance_mode"
-                                             help="启用后,用户访问转移至维护界面 | 管理员使用 <a href='javascript:(0)'>{{route('admin.login')}}</a> 登录"/>
-                            <x-system.input title="维护结束时间" :value="$maintenance_time" code="maintenance_time" help="用于维护界面倒计时" type="datetime-local"/>
-                            <x-system.textarea title="维护介绍内容" code="maintenance_content" :value="$maintenance_content" row="3" help="自定义维护内容信息"/>
-                            <x-system.input title="重定向地址" :value="$redirect_url" code="redirect_url" help="触发审计规则时访问请求被阻断并重定向至该地址" type="url"/>
+                            <x-system.select code="forbid_mode"
+                                             :list="[trans('common.status.closed') => '', trans('admin.system.forbid.mainland')=> 'ban_mainland', trans('admin.system.forbid.china') => 'ban_china', trans('admin.system.forbid.oversea') => 'ban_oversea']"/>
+                            <x-system.switch code="is_forbid_robot" :check="$is_forbid_robot"/>
+                            <x-system.switch code="maintenance_mode" :check="$maintenance_mode" :url="route('admin.login')"/>
+                            <x-system.input code="maintenance_time" :value="$maintenance_time" type="datetime-local"/>
+                            <x-system.textarea code="maintenance_content" :value="$maintenance_content" row="3"/>
+                            <x-system.input code="redirect_url" :value="$redirect_url" type="url"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="account">
-                            <x-system.switch title="用户注册" code="is_register" :check="$is_register" help="关闭后无法注册"/>
-                            <x-system.select title="第三方登录平台" code="oauth_path" help="请在.ENV中添加设置,再在此处开启平台" multiple="1"
-                                             :list="array_flip(config('common.oauth.labels'))"/>
-                            <x-system.select title="账号类型" help="规范站点用户账号的类型,默认为电子邮箱" code="username_type"
-                                             :list="['电子邮箱'=> 'email', '手机号码' => 'numeric', '任意用户名' => 'string']"/>
-                            <x-system.select title="邀请注册" code="is_invite_register" :list="['关闭' => '', '可选'=> 1, '必须' => 2]"/>
-                            <x-system.select title="激活账号" code="is_activate_account" :list="['关闭' => '', '注册前激活'=> 1, '注册后激活' => 2]"
-                                             help="启用后用户需要通过邮件来激活账号"/>
-                            <x-system.select title="重置密码" code="password_reset_notification" :list="['关闭' => '', '邮箱'=> 'mail']" help="启用后用户可以重置密码"/>
-                            <x-system.switch title="免费邀请码" code="is_free_code" :check="$is_free_code" help="关闭后免费邀请码不可见"/>
-                            <x-system.input title="邀请链接 用户信息字符化" :value="$aff_salt" code="aff_salt"
-                                            help="留空时,邀请链接将显示用户ID;填入任意英文/数字 即可对用户链接ID进行加密"/>
-                            <x-system.switch title="随机端口" code="is_rand_port" :check="$is_rand_port" help="注册、添加用户时随机生成端口"/>
-                            <x-system.input-limit title="端口范围" code="min_port" hcode="max_port" :value="$min_port" min="1000" max="$('#max_port').val()"
-                                                  :hvalue="$max_port" hmin="$('#min_port').val()" hmax="65535" help="端口范围:1000 - 65535"/>
-                            <x-system.input-limit title="初始有效期" code="default_days" :value="$default_days" unit="天" help="用户注册时默认账户有效期,为0即当天到期"/>
-                            <x-system.input-limit title="初始流量" code="default_traffic" :value="$default_traffic" unit="MB" help="用户注册时默认可用流量"/>
-                            <x-system.input-limit title="可生成邀请码数" code="invite_num" :value="$invite_num" help="用户可以生成的邀请码数"/>
-                            <x-system.input-limit title="重置密码次数" code="reset_password_times" :value="$reset_password_times" help="24小时内可以通过邮件重置密码次数"/>
-                            <x-system.select title="邮箱过滤机制" code="is_email_filtering" help="黑名单: 用户可使用任意黑名单外的邮箱注册;白名单:用户只能选择使用白名单中的邮箱后缀注册"
-                                             :list="['关闭' => '', '黑名单' => 1, '白名单' => 2]"/>
-                            <x-system.input-limit title="激活账号次数" code="active_times" :value="$active_times" help="24小时内可以通过邮件激活账号次数"/>
-                            <x-system.input-limit title="同IP注册限制" code="register_ip_limit" :value="$register_ip_limit" help="同IP在24小时内允许注册数量,为0/留空时不限制"/>
-                            <x-system.input-limit title="用户-邀请码有效期" code="user_invite_days" :value="$user_invite_days" min="1" unit="天" help="用户自行生成邀请的有效期"/>
-                            <x-system.input-limit title="管理员-邀请码有效期" code="admin_invite_days" :value="$admin_invite_days" min="1" unit="天"
-                                                  help="管理员生成邀请码的有效期"/>
+                            <x-system.switch code="is_register" :check="$is_register"/>
+                            <x-system.select code="oauth_path" multiple="1" :list="array_flip(config('common.oauth.labels'))"/>
+                            <x-system.select code="username_type" :list="[trans('admin.system.username.email') => 'email', trans('admin.system.username.mobile') => 'numeric',
+                            trans('admin.system.username.any') => 'string']"/>
+                            <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') => '', trans('admin.system.active_account.before') => 1, trans('admin.system.active_account.after') => 2]"/>
+                            <x-system.select code="password_reset_notification" :list="[trans('common.status.closed') => '', trans('admin.system.notification.channel.email') =>
+                            'mail']"/>
+                            <x-system.switch code="is_free_code" :check="$is_free_code"/>
+                            <x-system.input code="aff_salt" :value="$aff_salt"/>
+                            <x-system.switch code="is_rand_port" :check="$is_rand_port"/>
+                            <x-system.input-limit code="min_port" hcode="max_port" :value="$min_port" min="1000" max="$('#max_port').val()" :hvalue="$max_port" hmin="$
+                            ('#min_port').val()" hmax="65535"/>
+                            <x-system.input-limit code="default_days" :value="$default_days" unit="{{ trans_choice('validation.attributes.day', 1) }}"/>
+                            <x-system.input-limit code="default_traffic" :value="$default_traffic" unit="MB"/>
+                            <x-system.input-limit code="invite_num" :value="$invite_num"/>
+                            <x-system.input-limit code="reset_password_times" :value="$reset_password_times"/>
+                            <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.input-limit code="active_times" :value="$active_times"/>
+                            <x-system.input-limit code="register_ip_limit" :value="$register_ip_limit"/>
+                            <x-system.input-limit code="user_invite_days" :value="$user_invite_days" min="1" unit="{{ trans_choice('validation.attributes.day', 1) }}"/>
+                            <x-system.input-limit code="admin_invite_days" :value="$admin_invite_days" min="1" unit="{{ trans_choice('validation.attributes.day', 1) }}"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="node">
-                            <x-system.input title="节点订阅地址" :value="$subscribe_domain" code="subscribe_domain" help="(推荐)防止面板域名被DNS投毒后无法正常订阅,需带http://或https://"
-                                            :holder="'默认为 '.$website_url" type="url"/>
-                            <x-system.input-limit title="订阅节点数" code="subscribe_max" :value="$subscribe_max" help="客户端订阅时取得几个节点,为0/留空时返回全部节点"/>
-                            <x-system.switch title="随机订阅" code="rand_subscribe" :check="$rand_subscribe" help="启用后,订阅时将随机返回节点信息,否则按节点排序返回"/>
-                            <x-system.switch title="高级订阅" code="is_custom_subscribe" :check="$is_custom_subscribe"
-                                             help="启用后,订阅信息顶部将显示过期时间、剩余流量(只支持个别客户端)"/>
-                            <x-system.input title="授权/后端访问域名" :value="$web_api_url" code="web_api_url" help="例:https://demo.proxypanel.cf" type="url"/>
-                            <x-system.input title="V2Ray授权" :value="$v2ray_license" code="v2ray_license"/>
-                            <x-system.input title="Trojan授权" :value="$trojan_license" code="trojan_license"/>
-                            <x-system.input title="V2Ray TLS配置" :value="$v2ray_tls_provider" code="v2ray_tls_provider"
-                                            help="后端自动签发/载入TLS证书时用(节点的设置值优先级高于此处)"/>
+                            <x-system.input code="subscribe_domain" :value="$subscribe_domain" :holder="trans('admin.system.placeholder.default_url', ['url' => $website_url])"
+                                            type="url"/>
+                            <x-system.input-limit code="subscribe_max" :value="$subscribe_max"/>
+                            <x-system.switch code="rand_subscribe" :check="$rand_subscribe"/>
+                            <x-system.switch code="is_custom_subscribe" :check="$is_custom_subscribe"/>
+                            <x-system.input code="web_api_url" :value="$web_api_url" type="url"/>
+                            <x-system.input code="v2ray_license" :value="$v2ray_license"/>
+                            <x-system.input code="trojan_license" value="$trojan_license"/>
+                            <x-system.input code="v2ray_tls_provider" :value="$v2ray_tls_provider"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="extend">
-                            <x-system.select title="DDNS模式" code="ddns_mode" help="添加/编辑/删除节点的【域名、ipv4、ipv6】时,自动更新对应内容至DNS服务商"
-                                             :list="['关闭' => '', 'Namesilo' => 'namesilo', '阿里云(国际&国内)' => 'aliyun', 'DNSPod' => 'dnspod', 'CloudFlare' => 'cloudflare']"/>
-                            <x-system.input title="DNS服务商Key" :value="$ddns_key" code="ddns_key"
-                                            help="浏览<a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>设置指南</a>来设置"/>
-                            <x-system.input title="DNS服务商Secret" :value="$ddns_secret" code="ddns_secret"/>
+                            <x-system.select code="ddns_mode"
+                                             :list="[trans('common.status.closed') => '', trans('admin.system.ddns.namesilo') => 'namesilo', trans('admin.system.ddns.aliyun') => 'aliyun', trans('admin.system.ddns.dnspod') =>  'dnspod', trans('admin.system.ddns.cloudflare') => 'cloudflare']"/>
+                            <x-system.input code="ddns_key" :value="$ddns_key"/>
+                            <x-system.input code="ddns_secret" :value="$ddns_secret"/>
                             <hr class="col-lg-12">
-                            <x-system.select title="验证码模式" code="is_captcha"
-                                             :list="['关闭' => '', '普通验证码' => 1, '极验Geetest' => 2, 'Google reCaptcha' => 3, 'hCaptcha' => 4]"
-                                             help="启用后 登录/注册 需要进行验证码认证"/>
-                            <x-system.input title="验证码 Key" :value="$captcha_key" code="captcha_key"
-                                            help='浏览<a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">设置指南</a>来设置'/>
-                            <x-system.input title="验证码 Secret/ID" :value="$captcha_secret" code="captcha_secret"/>
+                            <x-system.select code="is_captcha"
+                                             :list="[trans('common.status.closed') => '', trans('admin.system.captcha.standard') => 1, trans('admin.system.captcha.geetest') => 2, trans('admin.system.captcha.recaptcha') => 3, trans('admin.system.captcha.hcaptcha') => 4]"/>
+                            <x-system.input code="captcha_key" :value="$captcha_key"/>
+                            <x-system.input code="captcha_secret" :value="$captcha_secret"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="checkIn">
-                            <x-system.switch title="签到加流量" code="is_checkin" :check="$is_checkin" help="登录时将根据流量范围随机得到流量"/>
-                            <x-system.input-limit title="时间间隔" code="traffic_limit_time" :value="$traffic_limit_time" help="间隔多久才可以再次签到"/>
-                            <x-system.input-limit title="流量范围" code="min_rand_traffic" hcode="max_rand_traffic" :value="$min_rand_traffic" :hvalue="$max_rand_traffic"
-                                                  :max="$max_rand_traffic" :hmin="$min_rand_traffic" unit="MB"/>
+                            <x-system.switch code="is_checkin" :check="$is_checkin"/>
+                            <x-system.input-limit code="traffic_limit_time" :value="$traffic_limit_time"/>
+                            <x-system.input-limit code="min_rand_traffic" hcode="max_rand_traffic" :value="$min_rand_traffic" :hvalue="$max_rand_traffic" :max="$max_rand_traffic"
+                                                  :hmin="$min_rand_traffic" unit="MB"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="promo">
-                            <x-system.switch title="推广功能" code="referral_status" :check="$referral_status" help="关闭后用户不可见,但是不影响其正常邀请返利"/>
-                            <x-system.select title="返利模式" code="referral_type" :list="['关闭' => '', '首购返利' => 1, '循环返利' => 2]"
-                                             help="切换模式后旧数据不变,新的返利按新的模式计算"/>
-                            <x-system.input-limit title="注册送流量" code="referral_traffic" :value="$referral_traffic" unit="MB" help="根据推广链接、邀请码注册则赠送相应的流量"/>
-                            <x-system.input-limit title="返利比例" code="referral_percent" :value="$referral_percent * 100" max="100" unit="%"
-                                                  help="根据推广链接注册的账号每笔消费推广人可以分成的比例 "/>
-                            <x-system.input-limit title="提现限制" code="referral_money" :value="$referral_money"
-                                                  unit="{{array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')]}}"
-                                                  help="满多少元才可以申请提现"/>
+                            <x-system.switch code="referral_status" :check="$referral_status"/>
+                            <x-system.select code="referral_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="$referral_traffic" unit="MB"/>
+                            <x-system.input-limit code="referral_percent" :value="$referral_percent * 100" max="100" unit="%"/>
+                            <x-system.input-limit code="referral_money" :value="$referral_money"
+                                                  unit="{{array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')]}}"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="notify">
-                            <x-system.input-test title="ServerChan SCKEY" :value="$server_chan_key" code="server_chan_key" help='启用ServerChan,请务必填入本值(<a href=https://sc.ftqq.com
-                                    target=_blank>申请 SCKEY</a>)' holder="填入ServerChan的SCKEY -> 再点击更新" test="serverChan"/>
-                            <x-system.input-test title="PushDeer Key" :value="$pushDeer_key" code="pushDeer_key" help='启用PushDeer,请务必填入本值(<a href=http://www.pushdeer.com/official.html
-                                    target=_blank>申请 Push Key</a>)' holder="填入PushDeer的Push Key -> 再点击更新" test="pushDeer"/>
-                            <x-system.input-test title="IYUU令牌" :value="$iYuu_token" code="iYuu_token" help='启用爱语飞飞,请务必填入本值(<a href=http://iyuu.cn
-                                    target=_blank>申请 IYUU令牌</a>)' holder="填入爱语飞飞的IYUU令牌 -> 再点击更新" test="iYuu"/>
-                            <x-system.input-test title="Bark设备号" :value="$bark_key" code="bark_key" holder="填入Bark的设备号 -> 再点击更新"
-                                                 help="推送消息到iOS设备,需要在iOS设备里装一个名为Bark的应用,取网址后的一长串字符串,启用Bark,请务必填入本值" test="bark"/>
-                            <x-system.input-test title="Telegram" :value="$telegram_token" code="telegram_token" holder="填入Telegram的 Token -> 再点击更新" help="找 <a href=https://t
-                            .me/BotFather
-                                    target=_blank>@BotFather</a> 申请机器人获取TOKEN" test="telegram"/>
-                            <x-system.input-test title="PushPlus Token" :value="$pushplus_token" code="pushplus_token" help='启用PushPlus,请务必填入本值(<a href=https://www.pushplus.plus/push1.html
-                                    target=_blank>申请 Token</a>)' holder="请到ServerChan申请" test="pushPlus"/>
-                            <x-system.input title="钉钉自定义机器人 Access Token" :value="$dingTalk_access_token" code="dingTalk_access_token" holder="自定义机器人的WebHook中的access_token"
-                                            help="可以阅读<a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>钉钉手册</a>查阅步骤"/>
-                            <x-system.input-test title="钉钉自定义机器人 密钥" :value="$dingTalk_secret" code="dingTalk_secret" help='可选填!开启机器人[加签]就是必填项目!'
-                                                 holder="自定义机器人加签后出现的的密钥" test="dingTalk"/>
-                            <x-system.input title="微信企业ID" :value="$wechat_cid" code="wechat_cid" holder="填入微信企业ID -> 再点击更新"
-                                            help="获取<a href=https://work.weixin.qq.com/wework_admin/frame#profile target=_blank>我的企业</a>中的企业ID"/>
-                            <x-system.input title="微信企业应用ID" :value="$wechat_aid" code="wechat_aid" holder="应用的AgentId"
-                                            help="在<a href=https://work.weixin.qq.com/wework_admin/frame#apps arget=_blank>应用管理</a>自建中创建应用 - AgentId"/>
-                            <x-system.input-test title="微信企业应用密钥" :value="$wechat_secret" code="wechat_secret" help='应用的Secret(可能需要下载企业微信才能查看)'
-                                                 holder="应用的Secret" test="weChat"/>
-                            <x-system.input title="微信企业应用TOKEN" :value="$wechat_token" code="wechat_token"
-                                            help="{{'应用管理->应用->设置API接收->TOKEN,URL设置:'.route('wechat.verify')}}"/>
-                            <x-system.input title="微信企业应用EncodingAESKey" :value="$wechat_encodingAESKey" code="wechat_encodingAESKey"
-                                            help='应用管理->应用->设置API接收->EncodingAESKey'/>
-                            <x-system.input-test title="TG酱Token" :value="$tg_chat_token" code="tg_chat_token" help='启用TG酱,请务必填入本值(<a href=https://t.me/realtgchat_bot
-                                    target=_blank>申请 Token</a>)' holder="请到Telegram申请" test="tgChat"/>
+                            <x-system.input-test code="server_chan_key" :value="$server_chan_key" holder="{{ trans('admin.system.placeholder.server_chan_key') }}"
+                                                 test="serverChan"/>
+                            <x-system.input-test code="pushDeer_key" :value="$pushDeer_key" holder="{{ trans('admin.system.placeholder.pushDeer_key') }}" test="pushDeer"/>
+                            <x-system.input-test code="iYuu_token" :value="$iYuu_token" holder="{{ trans('admin.system.placeholder.iYuu_token') }}" test="iYuu"/>
+                            <x-system.input-test code="bark_key" :value="$bark_key" holder="{{ trans('admin.system.placeholder.bark_key') }}" test="bark"/>
+                            <x-system.input-test code="telegram_token" :value="$telegram_token" holder="{{ trans('admin.system.placeholder.telegram_token') }}" test="telegram"/>
+                            <x-system.input-test code="pushplus_token" :value="$pushplus_token" holder="{{ trans('admin.system.placeholder.pushplus_token') }}" test="pushPlus"/>
+                            <x-system.input code="dingTalk_access_token" :value="$dingTalk_access_token" holder="{{ trans('admin.system.placeholder.dingTalk_access_token') }}"/>
+                            <x-system.input-test code="dingTalk_secret" :value="$dingTalk_secret" holder="{{ trans('admin.system.placeholder.dingTalk_secret') }}" test="dingTalk"/>
+                            <x-system.input code="wechat_cid" :value="$wechat_cid" holder="{{ trans('admin.system.placeholder.wechat_cid') }}"/>
+                            <x-system.input code="wechat_aid" :value="$wechat_aid" holder="{{ trans('admin.system.placeholder.wechat_aid') }}"/>
+                            <x-system.input-test code="wechat_secret" :value="$wechat_secret" holder="{{ trans('admin.system.placeholder.wechat_secret') }}" test="weChat"/>
+                            <x-system.input code="wechat_token" :value="$wechat_token" :url="route('wechat.verify')"/>
+                            <x-system.input code="wechat_encodingAESKey" :value="$wechat_encodingAESKey"/>
+                            <x-system.input-test code="tg_chat_token" :value="$tg_chat_token" holder="{{ trans('admin.system.placeholder.tg_chat_token') }}" test="tgChat"/>
                             <hr class="col-10"/>
-                            <x-system.select title="账号过期通知" code="account_expire_notification" help="通知用户账号即将到期" multiple="1"
-                                             :list="['邮箱' => 'mail', '站内通知' => 'database']"/>
-                            <x-system.input-limit title="过期警告阈值" code="expire_days" :value="$expire_days" unit="天" help="【账号过期通知】开始阈值,每日通知用户"/>
-                            <x-system.select title="流量耗尽通知" code="data_exhaust_notification" help="通知用户流量即将耗尽" multiple="1"
-                                             :list="['邮箱' => 'mail', '站内通知' => 'database']"/>
-                            <x-system.input-limit title="流量警告阈值" code="traffic_warning_percent" :value="$traffic_warning_percent" unit="%"
-                                                  help="【流量耗尽通知】开始阈值,每日通知用户"/>
-                            <x-system.select title="节点离线提醒" code="node_offline_notification" help="每10分钟检测节点离线并提醒管理员" multiple="1"
-                                             :list="['邮箱' => 'mail', 'Bark' => 'bark', 'ServerChan' => 'serverChan', 'PushDeer' => 'pushDear', '爱语飞飞' => 'iYuu', 'Telegram' =>
-                                             'telegram', '钉钉' => 'dingTalk', '微信企业' => 'weChat', 'TG酱' => 'tgChat', 'PushPlus' => 'pushPlus']"/>
-                            <x-system.input-limit title="离线提醒次数" code="offline_check_times" :value="$offline_check_times" unit="次" help="24小时内提醒n次后不再提醒"/>
-                            <x-system.select title="节点阻断提醒" code="node_blocked_notification" help="每小时检测节点是否被阻断并提醒管理员" multiple="1"
-                                             :list="['邮箱' => 'mail', 'ServerChan' => 'serverChan', 'PushDeer' => 'pushDear', '爱语飞飞' => 'iYuu', 'Telegram' => 'telegram', '微信企业' => 'weChat', 'TG酱' => 'tgChat', 'PushPlus'
-                                             => 'pushPlus']"/>
-                            <x-system.input-limit title="阻断检测提醒" code="detection_check_times" :value="$detection_check_times" max="12" unit="次"
-                                                  help="提醒N次后自动下线节点,为0/留空时不限制,不超过12"/>
-                            <x-system.select title="支付成功通知" code="payment_received_notification" help="用户支付订单后通知用户订单状态" multiple="1"
-                                             :list="['邮箱' => 'mail', '站内通知' => 'database', 'Telegram' => 'telegram']"/>
-                            <x-system.select title="人工支付确认通知" code="payment_confirm_notification" help="用户使用人工支付后通知管理员处理订单"
-                                             :list="['关闭' => '', 'Telegram' => 'telegram', '钉钉' => 'dingTalk', '微信企业' => 'weChat']"/>
-                            <x-system.select title="工单关闭通知" code="ticket_closed_notification" help="工单关闭通知用户" multiple="1"
-                                             :list="['邮箱' => 'mail', 'Bark' => 'bark', 'ServerChan' => 'serverChan', 'PushDeer' => 'pushDear', '爱语飞飞' => 'iYuu', 'Telegram' => 'telegram', '钉钉' => 'dingTalk', '微信企业' => 'weChat', 'TG酱' =>
-                                             'tgChat', 'PushPlus' => 'pushPlus']"/>
-                            <x-system.select title="新工单通知" code="ticket_created_notification" help="新工单通知管理/用户,取决于谁创建了新工单" multiple="1"
-                                             :list="['邮箱' => 'mail', 'Bark' => 'bark', 'ServerChan' => 'serverChan', 'PushDeer' => 'pushDear', '爱语飞飞' => 'iYuu', 'Telegram' => 'telegram', '钉钉' => 'dingTalk', '微信企业' => 'weChat', 'TG酱' =>
-                                             'tgChat', 'PushPlus' => 'pushPlus']"/>
-                            <x-system.select title="工单回复通知" code="ticket_replied_notification" help="工单回复通知对方" multiple="1"
-                                             :list="['邮箱' => 'mail', 'Bark' => 'bark', 'ServerChan' => 'serverChan', 'PushDeer' => 'pushDear', '爱语飞飞' => 'iYuu', 'Telegram' => 'telegram', '钉钉' => 'dingTalk', '微信企业' => 'weChat', 'TG酱' =>
-                                             'tgChat', 'PushPlus' => 'pushPlus']"/>
+                            <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="$expire_days" unit="{{ trans_choice('validation.attributes.day', 1) }}"/>
+                            <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="$traffic_warning_percent" unit="%"/>
+                            <x-system.select code="node_offline_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']"/>
+                            <x-system.input-limit code="offline_check_times" :value="$offline_check_times" 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.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.wechat') => 'weChat', trans('admin.system.notification.channel.tg_chat') => 'tgChat', trans('admin.system.notification.channel.pushplus') => 'pushPlus']"/>
+                            <x-system.input-limit code="detection_check_times" :value="$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', trans('admin.system.notification.channel.telegram') => 'telegram']"/>
+                            <x-system.select code="payment_confirm_notification"
+                                             :list="[trans('common.status.closed') => '', trans('admin.system.notification.channel.telegram')=> 'telegram', trans('admin.system.notification.channel.dingtalk') => 'dingTalk', trans('admin.system.notification.channel.wechat') => 'weChat']"/>
+                            <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', 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']"/>
+                            <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', 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']"/>
+                            <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', 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']"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="auto">
-                            <x-system.switch title="自动清除日志" code="is_clear_log" :check="$is_clear_log" help='(推荐)启用后自动清除无用日志'/>
-                            <x-system.switch title="流量自动重置" code="reset_traffic" :check="$reset_traffic" help='用户会按其购买套餐的日期自动重置可用流量'/>
-                            <x-system.switch title="订阅异常自动封禁" code="is_subscribe_ban" :check="$is_subscribe_ban" help='启用后用户订阅链接请求超过设定阈值则自动封禁'/>
-                            <x-system.input-limit title="订阅请求阈值" code="subscribe_ban_times" :value="$subscribe_ban_times" help="24小时内订阅链接请求次数限制"/>
-                            <x-system.switch title="异常自动封号" code="is_traffic_ban" :check="$is_traffic_ban" help='1小时内流量超过异常阈值则自动封号(仅禁用代理)'/>
-                            <x-system.select title="流量异常通知" code="data_anomaly_notification" help="1小时内流量超过异常阈值通知超管" multiple="1"
-                                             :list="['邮箱' => 'mail', 'Bark' => 'bark', 'ServerChan' => 'serverChan', 'PushDeer' => 'pushDear', '爱语飞飞' => 'iYuu', 'Telegram' => 'telegram', '钉钉' => 'dingTalk', '微信企业' => 'weChat', 'TG酱' =>
-                                             'tgChat', 'PushPlus' => 'pushPlus']"/>
-                            <x-system.input-limit title="流量异常阈值" code="traffic_ban_value" :value="$traffic_ban_value" min="1" unit="GB"
-                                                  help="1小时内超过该值,则触发自动封号"/>
-                            <x-system.input-limit title="封号时长" code="traffic_ban_time" :value="$traffic_ban_time" unit="分钟"
-                                                  help="触发流量异常导致用户被封禁的时长,到期后自动解封"/>
-                            <x-system.switch title="端口回收机制" code="auto_release_port" :check="$auto_release_port"
-                                             help="被封禁/过期{{config('tasks.release_port')}}天的账号端口自动释放"/>
-                            <x-system.switch title="过期自动封禁" code="is_ban_status" :check="$is_ban_status"
-                                             help="(慎重)封禁整个账号会重置账号的所有数据且会导致用户无法登录,不开启状态下只封禁用户代理"/>
-                            <x-system.select title="节点使用报告" code="node_daily_notification" help="报告各节点流量昨日消耗情况" multiple="1"
-                                             :list="['邮箱' => 'mail', 'ServerChan' => 'serverChan', 'PushDeer' => 'pushDear', '爱语飞飞' => 'iYuu', 'Telegram' => 'telegram', '钉钉' => 'dingTalk', '微信企业' => 'weChat', 'TG酱' =>
-                                             'tgChat', 'PushPlus' => 'pushPlus']"/>
+                            <x-system.switch code="is_clear_log" :check="$is_clear_log"/>
+                            <x-system.switch code="reset_traffic" :check="$reset_traffic"/>
+                            <x-system.switch code="is_subscribe_ban" :check="$is_subscribe_ban"/>
+                            <x-system.input-limit code="subscribe_ban_times" :value="$subscribe_ban_times"/>
+                            <x-system.switch code="is_traffic_ban" :check="$is_traffic_ban"/>
+                            <x-system.select code="data_anomaly_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']"/>
+                            <x-system.input-limit code="traffic_ban_value" :value="$traffic_ban_value" min="1" unit="GB"/>
+                            <x-system.input-limit code="traffic_ban_time" :value="$traffic_ban_time" unit="{{ trans('admin.minute') }}"/>
+                            <x-system.switch code="auto_release_port" :check="$auto_release_port"/>
+                            <x-system.switch code="is_ban_status" :check="$is_ban_status"/>
+                            <x-system.select code="node_daily_notification" multiple="1"
+                                             :list="[trans('admin.system.notification.channel.email') => 'mail', 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']"/>
                         </x-system.tab-pane>
                         <x-system.tab-pane id="other">
                             <div class="col-12">
@@ -255,125 +218,123 @@
                                     <x-alert type="success" :message="Session::get('successMsg')"/>
                                 @endif
                             </div>
-                            <x-system.input title="首页LOGO" :value="$website_home_logo" code="website_home_logo" type="url"/>
-                            <x-system.input title="站内LOGO" :value="$website_logo" code="website_logo" type="url"/>
+                            <x-system.input code="website_home_logo" :value="$website_home_logo" type="url"/>
+                            <x-system.input code="website_logo" :value="$website_logo" type="url"/>
                             <form action="{{route('admin.system.extend')}}" method="post" enctype="multipart/form-data" class="upload-form col-lg-12 row" role="form"
                                   id="setExtend">@csrf
-                                <x-system.input-file title="首页LOGO" code="website_home_logo" :value="$website_home_logo"/>
-                                <x-system.input-file title="站内LOGO" code="website_logo" :value="$website_logo"/>
+                                <x-system.input-file code="website_home_logo" :value="$website_home_logo"/>
+                                <x-system.input-file code="website_logo" :value="$website_logo"/>
                             </form>
-                            <x-system.textarea title="统计代码" code="website_analytics" :value="$website_analytics" help="统计JS"/>
-                            <x-system.textarea title="客服代码" code="website_customer_service" :value="$website_customer_service" help="客服JS"/>
+                            <x-system.textarea code="website_analytics" :value="$website_analytics"/>
+                            <x-system.textarea code="website_customer_service" :value="$website_customer_service"/>
                         </x-system.tab-pane>
                         <div class="tab-pane" id="payment" role="tabpanel">
                             <div class="tab-content pb-100">
                                 <x-system.tab-pane id="paymentSetting" :active="true">
-                                    <x-system.select title="支付宝支付" code="is_AliPay"
-                                                     :list="['关闭' => '', 'F2F' => 'f2fpay', '码支付' => 'codepay', '易支付' => 'epay', '海狸支付' => 'paybeaver', '平头哥支付' => 'theadpay', 'Stripe支付宝' => 'stripe']"/>
-                                    <x-system.select title="QQ钱包" code="is_QQPay" :list="['关闭' => '', '码支付' => 'codepay', '易支付' => 'epay']"/>
-                                    <x-system.select title="微信支付" code="is_WeChatPay"
-                                                     :list="['关闭' => '', '码支付' => 'codepay', 'PayJS' => 'payjs', '易支付' => 'epay', '海狸支付' => 'paybeaver', 'Stripe微信' => 'stripe']"/>
-                                    <x-system.select title="特殊支付" code="is_otherPay" multiple="1" :list="['麻瓜宝' => 'bitpayx', 'PayPal' => 'paypal', 'Stripe' => 'stripe']"/>
-                                    <x-system.input title="自定义商品名称" :value="$subject_name" code="subject_name" help="用于在支付渠道的商品标题显示"/>
-                                    <x-system.input title="通用支付回调地址" :value="$website_callback_url" code="website_callback_url"
-                                                    help="防止因为网站域名被DNS投毒后导致支付无法正常回调,需带http://或https://" :holder="'默认为 '.$website_url" type="url"/>
+                                    <x-system.select code="is_AliPay" :list="[trans('common.status.closed') => '', trans('admin.system.payment.channel.alipay') => 'f2fpay',
+                                    trans('admin.system.payment.channel.codepay') => 'codepay', trans('admin.system.payment.channel.epay') => 'epay', trans('admin.system.payment.channel.paybeaver') => 'paybeaver', trans('admin.system.payment.channel.theadpay') => 'theadpay', trans('admin.system.payment.channel.stripe') => 'stripe']"/>
+                                    <x-system.select code="is_QQPay" :list="[trans('common.status.closed') => '', trans('admin.system.payment.channel.codepay') => 'codepay',
+                                    trans('admin.system.payment.channel.epay') => 'epay']"/>
+                                    <x-system.select code="is_WeChatPay" :list="[trans('common.status.closed') => '', trans('admin.system.payment.channel.codepay') => 'codepay',
+                                     trans('admin.system.payment.channel.payjs') => 'payjs', trans('admin.system.payment.channel.epay') => 'epay', trans('admin.system.payment.channel.paybeaver') => 'paybeaver', trans('admin.system.payment.channel.stripe') => 'stripe']"/>
+                                    <x-system.select code="is_otherPay" multiple="1"
+                                                     :list="[trans('admin.system.payment.channel.paypal') => 'paypal', trans('admin.system.payment.channel.stripe') => 'stripe']"/>
+                                    <x-system.input code="subject_name" :value="$subject_name"/>
+                                    <x-system.input code="website_callback_url" :value="$website_callback_url" :holder="trans('admin.system.placeholder.default_url', ['url' =>
+                                    $website_url])" type="url"/>
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="AlipayF2F">
                                     <div class="form-group col-lg-6 d-flex">
-                                        <label class="col-md-3 col-form-label">支付宝F2F</label>
+                                        <label class="col-md-3 col-form-label">{{  trans('admin.system.payment.channel.alipay') }}</label>
                                         <div class="col-md-9">
-                                            本功能需要<a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">蚂蚁金服开放平台</a>申请权限及应用
+                                            {!! trans('admin.system.payment.hint.alipay') !!}
                                         </div>
                                     </div>
-                                    <x-system.input title="应用ID" :value="$f2fpay_app_id" code="f2fpay_app_id" help="即:APPID"/>
-                                    <x-system.input title="应用私钥" :value="$f2fpay_private_key" code="f2fpay_private_key" help="生成秘钥软件生成时,产生的应用秘钥"/>
-                                    <x-system.input title="支付宝公钥" :value="$f2fpay_public_key" code="f2fpay_public_key" help="注意不是应用公钥!"/>
+                                    <x-system.input code="f2fpay_app_id" :value="$f2fpay_app_id"/>
+                                    <x-system.input code="f2fpay_private_key" :value="$f2fpay_private_key"/>
+                                    <x-system.input code="f2fpay_public_key" :value="$f2fpay_public_key"/>
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="CodePay">
                                     <div class="form-group col-lg-6 d-flex">
-                                        <label class="col-md-3 col-form-label">码支付</label>
+                                        <label class="col-md-3 col-form-label">{{ trans('admin.system.payment.channel.codepay') }}</label>
                                         <div class="col-md-7">
-                                            请到 <a href="https://codepay.fateqq.com/i/377289" target="_blank">码支付</a>申请账号,然后下载登录其挂机软件
+                                            {!! trans('admin.system.payment.hint.codepay') !!}
                                         </div>
                                     </div>
-                                    <x-system.input title="请求URL" :value="$codepay_url" code="codepay_url" holder="https://codepay.fateqq.com/creat_order/?" type="url"/>
-                                    <x-system.input title="码支付ID" :value="$codepay_id" code="codepay_id"/>
-                                    <x-system.input title="通信密钥" :value="$codepay_key" code="codepay_key"/>
+                                    <x-system.input code="codepay_url" :value="$codepay_url" :holder="trans('admin.system.placeholder.codepay_url')" type="url"/>
+                                    <x-system.input code="codepay_id" :value="$codepay_id"/>
+                                    <x-system.input code="codepay_key" :value="$codepay_key"/>
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="EPay">
                                     <div class="form-group col-lg-6 d-flex">
-                                        <label class="col-md-3 col-form-label">易支付</label>
+                                        <label class="col-md-3 col-form-label">{{ trans('admin.system.payment.channel.epay') }}</label>
                                         @can('admin.test.epay')
                                             <div class="col-md-7">
-                                                <button class="btn btn-primary" type="button" onclick="epayInfo()">查询</button>
+                                                <button class="btn btn-primary" type="button" onclick="epayInfo()">{{ trans('admin.query') }}</button>
                                             </div>
                                         @endcan
                                     </div>
-                                    <x-system.input title="接口对接地址" :value="$epay_url" code="epay_url" holder="https://www.example.com" type="url"/>
-                                    <x-system.input title="商户ID" :value="$epay_mch_id" code="epay_mch_id"/>
-                                    <x-system.input title="商户密钥" :value="$epay_key" code="epay_key"/>
+                                    <x-system.input code="epay_url" :value="$epay_url" type="url"/>
+                                    <x-system.input code="epay_mch_id" :value="$epay_mch_id"/>
+                                    <x-system.input code="epay_key" :value="$epay_key"/>
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="PayJs">
                                     <div class="form-group col-lg-6 d-flex">
-                                        <label class="col-md-3 col-form-label">PayJs</label>
+                                        <label class="col-md-3 col-form-label">{{ trans('admin.system.payment.channel.payjs') }}</label>
                                         <div class="col-md-7">
-                                            请到<a href="https://payjs.cn/ref/zgxjnb" target="_blank">PayJs</a> 申请账号
+                                            {!! trans('admin.system.payment.hint.payjs') !!}
                                         </div>
                                     </div>
-                                    <x-system.input title="商户号" :value="$payjs_mch_id" code="payjs_mch_id"
-                                                    help='在<a href="https://payjs.cn/dashboard/member" target="_blank">本界面</a>获取信息'/>
-                                    <x-system.input title="通信密钥" :value="$payjs_key" code="payjs_key"/>
+                                    <x-system.input code="payjs_mch_id" :value="$payjs_mch_id"/>
+                                    <x-system.input code="payjs_key" :value="$payjs_key"/>
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="PayPal">
                                     <div class="form-group col-lg-6 d-flex">
-                                        <label class="col-md-3 col-form-label">PayPal</label>
+                                        <label class="col-md-3 col-form-label">{{ trans('admin.system.payment.channel.paypal') }}</label>
                                         <div class="col-md-7">
-                                            使用商家账号登录<a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">API凭证申请页</a>,
-                                            同意并获取设置信息
+                                            {!! trans('admin.system.payment.hint.paypal') !!}
                                         </div>
                                     </div>
-                                    <x-system.input title="API用户名" :value="$paypal_username" code="paypal_username"/>
-                                    <x-system.input title="API密码" :value="$paypal_password" code="paypal_password"/>
-                                    <x-system.input title="签名" :value="$paypal_secret" code="paypal_secret"/>
-                                    {{--<x-system.input title="证书" :value="$paypal_certificate" code="paypal_certificate"/>--}}
-                                    {{--<x-system.input title="应用ID" :value="$paypal_app_id" code="paypal_app_id"/>--}}
+                                    <x-system.input code="paypal_username" :value="$paypal_username"/>
+                                    <x-system.input code="paypal_password" :value="$paypal_password"/>
+                                    <x-system.input code="paypal_secret" :value="$paypal_secret"/>
+                                    {{--<x-system.input code="paypal_certificate" :value="$paypal_certificate"/>--}}
+                                    {{--<x-system.input code="paypal_app_id" :value="$paypal_app_id"/>--}}
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="Stripe">
                                     <div class="form-group col-lg-6 d-flex">
-                                        <label class="col-md-3 col-form-label">Stripe</label>
+                                        <label class="col-md-3 col-form-label">{{ trans('admin.system.payment.channel.stripe') }}</label>
                                     </div>
-                                    <x-system.input title="Public Key" :value="$stripe_public_key" code="stripe_public_key"/>
-                                    <x-system.input title="Secret Key" :value="$stripe_secret_key" code="stripe_secret_key"/>
-                                    <x-system.input title="WebHook Signing secret" :value="$stripe_signing_secret" code="stripe_signing_secret"/>
+                                    <x-system.input code="stripe_public_key" :value="$stripe_public_key"/>
+                                    <x-system.input code="stripe_secret_key" :value="$stripe_secret_key"/>
+                                    <x-system.input code="stripe_signing_secret" :value="$stripe_signing_secret"/>
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="PayBeaver">
                                     <div class="form-group col-lg-6 d-flex">
-                                        <label class="col-md-3 col-form-label">海狸支付 PayBeaver</label>
+                                        <label class="col-md-3 col-form-label">{{ trans('admin.system.payment.channel.paybeaver') }}</label>
                                         <div class="col-md-7">
-                                            请到<a href="https://merchant.paybeaver.com/?aff_code=iK4GNuX8" target="_blank">海狸支付 PayBeaver</a>申请账号
+                                            {!! trans('admin.system.payment.hint.paybeaver') !!}
                                         </div>
                                     </div>
-                                    <x-system.input title="App ID" :value="$paybeaver_app_id" code="paybeaver_app_id"
-                                                    help='<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -&gt; 开发者 -&gt; App ID'/>
-                                    <x-system.input title="App Secret" :value="$paybeaver_app_secret" code="paybeaver_app_secret"
-                                                    help='<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -&gt; 开发者 -&gt; App Secret'/>
+                                    <x-system.input code="paybeaver_app_id" :value="$paybeaver_app_id"/>
+                                    <x-system.input code="paybeaver_app_secret" :value="$paybeaver_app_secret"/>
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="THeadPay">
                                     <div class="form-group col-lg-6 d-flex">
-                                        <label class="col-md-3 col-form-label">平头哥支付 THeadPay</label>
+                                        <label class="col-md-3 col-form-label">{{ trans('admin.system.payment.channel.theadpay') }}</label>
                                         <div class="col-md-7">
-                                            请到<a href="https://theadpay.com/" target="_blank">平头哥支付 THeadPay</a>申请账号
+                                            {!! trans('admin.system.payment.hint.theadpay') !!}
                                         </div>
                                     </div>
-                                    <x-system.input title="接口地址" :value="$theadpay_url" code="theadpay_url" type="url"/>
-                                    <x-system.input title="商家ID" :value="$theadpay_mchid" code="theadpay_mchid"/>
-                                    <x-system.input title="商家密钥" :value="$theadpay_key" code="theadpay_key"/>
+                                    <x-system.input code="theadpay_url" :value="$theadpay_url" type="url"/>
+                                    <x-system.input code="theadpay_mchid" :value="$theadpay_mchid"/>
+                                    <x-system.input code="theadpay_key" :value="$theadpay_key"/>
                                 </x-system.tab-pane>
                                 <x-system.tab-pane id="Manual">
                                     <div class="form-group col-lg-12 d-flex">
-                                        <label class="col-md-3 col-form-label">人工支付</label>
+                                        <label class="col-md-3 col-form-label">{{ trans('admin.system.payment.channel.manual') }}</label>
                                         <div class="col-md-7">
-                                            设置后会自动开启对应显示
+                                            {!! trans('admin.system.payment.hint.manual') !!}
                                         </div>
                                     </div>
                                     <div class="col-12">
@@ -384,59 +345,73 @@
                                             <x-alert type="success" :message="Session::get('successMsg')"/>
                                         @endif
                                     </div>
-                                    <x-system.input title="支付宝二维码" :value="$alipay_qrcode" code="alipay_qrcode" type="url"/>
-                                    <x-system.input title="微 信二维码" :value="$wechat_qrcode" code="wechat_qrcode" type="url"/>
+                                    <x-system.input code="alipay_qrcode" :value="$alipay_qrcode" type="url"/>
+                                    <x-system.input code="wechat_qrcode" :value="$wechat_qrcode" type="url"/>
                                     <form action="{{route('admin.system.extend')}}" method="post" enctype="multipart/form-data" class="upload-form col-lg-12 row" role="form"
                                           id="setExtend">@csrf
-                                        <x-system.input-file title="支付宝二维码" code="alipay_qrcode" :value="$alipay_qrcode"/>
-                                        <x-system.input-file title="微 信二维码" code="wechat_qrcode" :value="$wechat_qrcode"/>
+                                        <x-system.input-file code="alipay_qrcode" :value="$alipay_qrcode"/>
+                                        <x-system.input-file code="wechat_qrcode" :value="$wechat_qrcode"/>
                                     </form>
                                 </x-system.tab-pane>
                             </div>
                             <ul class="nav nav-tabs nav-tabs-bottom nav-tabs-line dropup" role="tablist">
                                 <li class="nav-item">
-                                    <a class="nav-link active" data-toggle="tab" href="#paymentSetting" aria-controls="paymentSetting" role="tab">支付设置</a>
+                                    <a class="nav-link active" data-toggle="tab" href="#paymentSetting" aria-controls="paymentSetting"
+                                       role="tab">{{ trans('admin.system.payment.attribute') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#AlipayF2F" aria-controls="AlipayF2F" role="tab">支付宝F2F</a>
+                                    <a class="nav-link" data-toggle="tab" href="#AlipayF2F" aria-controls="AlipayF2F"
+                                       role="tab">{{ trans('admin.system.payment.channel.alipay') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#CodePay" aria-controls="CodePay" role="tab">码支付</a>
+                                    <a class="nav-link" data-toggle="tab" href="#CodePay" aria-controls="CodePay" role="tab">{{ trans('admin.system.payment.channel.codepay') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#EPay" aria-controls="EPay" role="tab">易支付</a>
+                                    <a class="nav-link" data-toggle="tab" href="#EPay" aria-controls="EPay" role="tab">{{ trans('admin.system.payment.channel.epay') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#PayJs" aria-controls="PayJs" role="tab">PayJs</a>
+                                    <a class="nav-link" data-toggle="tab" href="#PayJs" aria-controls="PayJs" role="tab">{{ trans('admin.system.payment.channel.payjs') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#PayPal" aria-controls="PayPal" role="tab">PayPal</a>
+                                    <a class="nav-link" data-toggle="tab" href="#PayPal" aria-controls="PayPal" role="tab">{{ trans('admin.system.payment.channel.paypal') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#Stripe" aria-controls="Stripe" role="tab">Stripe</a>
+                                    <a class="nav-link" data-toggle="tab" href="#Stripe" aria-controls="Stripe" role="tab">{{ trans('admin.system.payment.channel.stripe') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#PayBeaver" aria-controls="PayBeaver" role="tab">PayBeaver</a>
+                                    <a class="nav-link" data-toggle="tab" href="#PayBeaver" aria-controls="PayBeaver"
+                                       role="tab">{{ trans('admin.system.payment.channel.paybeaver') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#THeadPay" aria-controls="THeadPay" role="tab">平头哥支付</a>
+                                    <a class="nav-link" data-toggle="tab" href="#THeadPay" aria-controls="THeadPay"
+                                       role="tab">{{ trans('admin.system.payment.channel.theadpay') }}</a>
                                 </li>
                                 <li class="nav-item">
-                                    <a class="nav-link" data-toggle="tab" href="#Manual" aria-controls="Manual" role="tab">人工支付</a>
+                                    <a class="nav-link" data-toggle="tab" href="#Manual" aria-controls="Manual" role="tab">{{ trans('admin.system.payment.channel.manual') }}</a>
                                 </li>
                                 <li class="nav-item dropdown" style="display: none;">
-                                    <a class="dropdown-toggle nav-link" data-toggle="dropdown" href="#" aria-expanded="false" aria-haspopup="true">菜单</a>
+                                    <a class="dropdown-toggle nav-link" data-toggle="dropdown" href="#" aria-expanded="false"
+                                       aria-haspopup="true">{{ trans('admin.setting.system.menu') }}</a>
                                     <div class="dropdown-menu" role="menu">
-                                        <a class="dropdown-item active" data-toggle="tab" href="#paymentSetting" aria-controls="paymentSetting" role="tab">支付设置</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#AlipayF2F" aria-controls="AlipayF2F" role="tab">支付宝F2F</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#CodePay" aria-controls="CodePay" role="tab">码支付</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#EPay" aria-controls="EPay" role="tab">易支付</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#PayJs" aria-controls="PayJs" role="tab">PayJs</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#PayPal" aria-controls="PayPal" role="tab">PayPal</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#Stripe" aria-controls="Stripe" role="tab">Stripe</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#PayBeaver" aria-controls="PayBeaver" role="tab">PayBeaver</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#THeadPay" aria-controls="THeadPay" role="tab">平头哥支付</a>
-                                        <a class="dropdown-item" data-toggle="tab" href="#Manual" aria-controls="Manual" role="tab">人工支付</a>
+                                        <a class="dropdown-item active" data-toggle="tab" href="#paymentSetting" aria-controls="paymentSetting"
+                                           role="tab">{{ trans('admin.system.payment.attribute') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#AlipayF2F" aria-controls="AlipayF2F"
+                                           role="tab">{{ trans('admin.system.payment.channel.alipay') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#CodePay" aria-controls="CodePay"
+                                           role="tab">{{ trans('admin.system.payment.channel.codepay') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#EPay" aria-controls="EPay" role="tab">{{ trans('admin.system.payment.channel.epay') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#PayJs" aria-controls="PayJs"
+                                           role="tab">{{ trans('admin.system.payment.channel.payjs') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#PayPal" aria-controls="PayPal"
+                                           role="tab">{{ trans('admin.system.payment.channel.paypal') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#Stripe" aria-controls="Stripe"
+                                           role="tab">{{ trans('admin.system.payment.channel.stripe') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#PayBeaver" aria-controls="PayBeaver"
+                                           role="tab">{{ trans('admin.system.payment.channel.paybeaver') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#THeadPay" aria-controls="THeadPay"
+                                           role="tab">{{ trans('admin.system.payment.channel.theadpay') }}</a>
+                                        <a class="dropdown-item" data-toggle="tab" href="#Manual" aria-controls="Manual"
+                                           role="tab">{{ trans('admin.system.payment.channel.manual') }}</a>
                                     </div>
                                 </li>
                             </ul>
@@ -524,7 +499,7 @@
             }
           });
           @else
-          swal.fire({title: '您没有权限修改系统参数!', icon: 'error', timer: 1500, showConfirmButton: false});
+          swal.fire({title: '{{ trans('admin.setting.no_permission') }}', icon: 'error', timer: 1500, showConfirmButton: false});
           @endcan
       }
 

+ 50 - 51
resources/views/admin/coupon/create.blade.php

@@ -9,9 +9,9 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title">生成卡券</h1>
+                <h1 class="panel-title">{{ trans('admin.action.add_item', ['attribute' => trans('model.coupon.attribute')]) }}</h1>
                 <div class="panel-actions">
-                    <a href="{{route('admin.coupon.index')}}" class="btn btn-danger">返 回</a>
+                    <a href="{{route('admin.coupon.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
                 </div>
             </div>
             @if (Session::has('successMsg'))
@@ -23,45 +23,45 @@
             <div class="panel-body">
                 <form action="{{route('admin.coupon.store')}}" method="post" enctype="multipart/form-data" class="form-horizontal" role="form">@csrf
                     <div class="form-group row">
-                        <label class="col-md-2 col-form-label" for="name">卡券名称</label>
+                        <label class="col-md-2 col-form-label" for="name">{{ trans('model.coupon.name') }}</label>
                         <div class="col-md-10">
                             <input type="text" class="form-control col-md-4" name="name" id="name" value="{{old('name')}}" required/>
-                            <span class="text-help"> 会用于前端显示 </span>
+                            <span class="text-help"> {{ trans('admin.coupon.name_hint') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-form-label" for="sn">使用券码</label>
+                        <label class="col-md-2 col-form-label" for="sn">{{ trans('model.coupon.sn') }}</label>
                         <div class="col-md-10">
                             <input type="text" class="form-control col-md-4" name="sn" id="sn" value="{{old('sn')}}"/>
-                            <span class="text-help"> 提供给用户使用卡券的卡券,留空则默认为8位随机码 </span>
+                            <span class="text-help"> {{ trans('admin.coupon.sn_hint') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-form-label" for="logo">卡券图片</label>
+                        <label class="col-md-2 col-form-label" for="logo">{{ trans('model.coupon.logo') }}</label>
                         <div class="col-md-6">
                             <input type="file" id="logo" name="logo" data-plugin="dropify" data-default-file="{{asset('/assets/images/default.png')}}"/>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-form-label">类型</label>
+                        <label class="col-md-2 col-form-label">{{ trans('model.coupon.type') }}</label>
                         <div class="col-md-10 align-items-center">
                             <div class="radio-custom radio-primary radio-inline">
                                 <input type="radio" name="type" id="voucher" value="1" checked/>
-                                <label for="voucher">抵用券</label>
+                                <label for="voucher">{{ trans('admin.coupon.type.voucher') }}</label>
                             </div>
                             <div class="radio-custom radio-primary radio-inline">
                                 <input type="radio" name="type" id="discount" value="2"/>
-                                <label for="discount">折扣券</label>
+                                <label for="discount">{{ trans('admin.coupon.type.discount') }}</label>
                             </div>
                             <div class="radio-custom radio-primary radio-inline">
                                 <input type="radio" name="type" id="charge" value="3"/>
-                                <label for="charge">充值券</label>
+                                <label for="charge">{{ trans('admin.coupon.type.charge') }}</label>
                             </div>
-                            <span class="text-help"> 抵用:抵扣商品金额,折扣:商品百分比打折,充值:充值用户账号余额 </span>
+                            <span class="text-help"> {{ trans('admin.coupon.type_hint') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-form-label" for="value">优惠额度</label>
+                        <label class="col-md-2 col-form-label" for="value">{{ trans('model.coupon.value') }}</label>
                         <div class="col-md-10">
                             <div class="input-group">
                                 <div class="input-group-prepend" id="amount">
@@ -70,29 +70,29 @@
                                 <input type="number" class="form-control col-md-3" min="1" max="99" name="value" id="value" value="{{old('value')}}" required/>
                                 <span class="input-group-text discount" style="display: none;">%</span>
                             </div>
-                            <span class="text-help discount" style="display: none;"> 范围为 1% ~ 99% </span>
+                            <span class="text-help discount" style="display: none;"> {{ trans('admin.coupon.value_hint') }}</span>
                         </div>
                     </div>
                     <div class="usage">
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="priority"> 权 重 </label>
+                            <label class="col-md-2 col-form-label" for="priority"> {{ trans('model.coupon.priority') }} </label>
                             <div class="col-md-10">
                                 <div class="input-group">
                                     <input type="number" class="form-control col-md-2" min="0" max="255" name="priority" id="priority" value="{{old('priority')}}"/>
                                 </div>
-                                <span class="text-help"> 同【使用券码】下,符合条件的高权重码将会被优先使用。最高为 255 </span>
+                                <span class="text-help"> {{ trans('admin.coupon.priority_hint') }} </span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="usable_times">使用次数</label>
+                            <label class="col-md-2 col-form-label" for="usable_times">{{ trans('model.coupon.usable_times') }}</label>
                             <div class="col-md-4 input-group">
                                 <input type="number" class="form-control" min="1" name="usable_times" id="usable_times" value="{{old('usable_times', 1)}}"/>
-                                <span class="input-group-text"></span>
+                                <span class="input-group-text">{{ trans('admin.times') }}</span>
                             </div>
                         </div>
                         <hr>
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="minimum">满减条件</label>
+                            <label class="col-md-2 col-form-label" for="minimum">{{ trans('model.coupon.minimum') }}</label>
                             <div class="col-md-10">
                                 <div class="input-group">
                                     <div class="input-group-prepend">
@@ -100,21 +100,21 @@
                                     </div>
                                     <input type="number" class="form-control col-md-3" name="minimum" id="minimum" value="{{old('minimum')}}" step="0.01"/>
                                 </div>
-                                <span class="text-help"> 当支付金额超过N值时,才能使用本优惠劵;不设置/0,即为无限制 </span>
+                                <span class="text-help"> {!! trans('admin.coupon.minimum_hint', ['num' => 'N']).trans('admin.zero_unlimited_hint') !!} </span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="used">个人限用</label>
+                            <label class="col-md-2 col-form-label" for="used">{{ trans('model.coupon.used') }}</label>
                             <div class="col-md-10">
                                 <div class="input-group">
                                     <input type="number" class="form-control col-md-3" name="used" id="used" value="{{old('used')}}" step="1"/>
-                                    <span class="input-group-text"></span>
+                                    <span class="input-group-text">{{ trans('admin.times') }}</span>
                                 </div>
-                                <span class="text-help"> 符合条件的用户可以使用本券N次;不设置/0,即为无限制 </span>
+                                <span class="text-help"> {!! trans('admin.coupon.used_hint', ['num' => 'N']).trans('admin.zero_unlimited_hint') !!}</span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label for="levels" class="col-md-2 col-form-label">等级限定</label>
+                            <label for="levels" class="col-md-2 col-form-label">{{ trans('model.coupon.levels') }}</label>
                             <div class="col-md-10">
                                 <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control show-tick" id="levels" name="levels[]"
                                         multiple>
@@ -122,11 +122,11 @@
                                         <option value="{{$key}}">{{$level}}</option>
                                     @endforeach
                                 </select>
-                                <span class="text-help"> 用户等级在选定等级内,方可使用本券</span>
+                                <span class="text-help"> {{ trans('admin.coupon.levels_hint') }}</span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label for="groups" class="col-md-2 col-form-label">分组限定</label>
+                            <label for="groups" class="col-md-2 col-form-label">{{ trans('model.coupon.groups') }}</label>
                             <div class="col-md-10">
                                 <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control show-tick" id="groups" name="groups[]"
                                         multiple>
@@ -134,83 +134,82 @@
                                         <option value="{{$key}}">{{$group}}</option>
                                     @endforeach
                                 </select>
-                                <span class="text-help"> 选定的用户分组,方可使用本券</span>
+                                <span class="text-help"> {{ trans('admin.coupon.groups_hint') }}</span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="users_whitelist">专属用户</label>
+                            <label class="col-md-2 col-form-label" for="users_whitelist">{{ trans('model.coupon.users_whitelist') }}</label>
                             <div class="col-md-10">
                                 <input type="text" class="form-control col-md-6" data-plugin="tokenfield" id="users_whitelist" name="users_whitelist"
-                                       value="{{old('users_whitelist')}}" placeholder="输入用户ID, 再回车"/>
-                                <span class="text-help"> 涉及用户均可使用本券,留空为不使用此条件</span>
+                                       value="{{old('users_whitelist')}}" placeholder="{{ trans('admin.coupon.users_placeholder') }}"/>
+                                <span class="text-help"> {{ trans('admin.coupon.user_whitelist_hint') }}</span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="users_blacklist">禁用用户</label>
+                            <label class="col-md-2 col-form-label" for="users_blacklist">{{ trans('model.coupon.users_blacklist') }}</label>
                             <div class="col-md-10">
                                 <input type="text" class="form-control col-md-6" data-plugin="tokenfield" id="users_blacklist" name="users_blacklist"
-                                       value="{{old('users_blacklist')}}" placeholder="输入用户ID, 再回车"/>
-                                <span class="text-help"> 涉及用户均不可使用本券,空为不使用此条件</span>
+                                       value="{{old('users_blacklist')}}" placeholder="{{ trans('admin.coupon.users_placeholder') }}"/>
+                                <span class="text-help"> {{ trans('admin.coupon.users_blacklist_hint') }}</span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="services_whitelist">许可商品</label>
+                            <label class="col-md-2 col-form-label" for="services_whitelist">{{ trans('model.coupon.services_whitelist') }}</label>
                             <div class="col-md-10">
                                 <input type="text" class="form-control col-md-4" data-plugin="tokenfield" id="services_whitelist" name="services_whitelist"
-                                       value="{{old('services_whitelist')}}" placeholder="输入商品ID, 再回车"/>
-                                <span class="text-help"> 涉及商品方可使用本券,留空为不使用此条件</span>
+                                       value="{{old('services_whitelist')}}" placeholder="{{ trans('admin.coupon.services_placeholder') }}"/>
+                                <span class="text-help"> {{ trans('admin.coupon.services_whitelist_hint') }}</span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="services_blacklist">禁用商品</label>
+                            <label class="col-md-2 col-form-label" for="services_blacklist">{{ trans('model.coupon.services_blacklist') }}</label>
                             <div class="col-md-10">
                                 <input type="text" class="form-control col-md-4" data-plugin="tokenfield" id="services_blacklist" name="services_blacklist"
-                                       value="{{old('services_blacklist')}}" placeholder="输入商品ID, 再回车"/>
-                                <span class="text-help"> 涉及商品不可使用本券,留空为不使用此条件</span>
+                                       value="{{old('services_blacklist')}}" placeholder="{{ trans('admin.coupon.services_placeholder') }}"/>
+                                <span class="text-help"> {{ trans('admin.coupon.services_blacklist_hint') }}</span>
                             </div>
                         </div>
                         <div class="form-group row">
-                            <label for="newbie" class="col-md-2 col-form-label">新人专属</label>
+                            <label for="newbie" class="col-md-2 col-form-label">{{ trans('model.coupon.newbie') }}</label>
                             <div class="col-md-10">
                                 <ul class="list-unstyled">
                                     <li class="list-group-item p-0">
                                         <div class="checkbox-custom checkbox-primary">
                                             <input type="checkbox" id="coupon" name="coupon" {{ old('coupon') ? 'checked' : '' }}/>
-                                            <label for="coupon">首次用任意券</label>
+                                            <label for="coupon">{{ trans('admin.coupon.newbie.first_discount') }}</label>
                                         </div>
                                     </li>
                                     <li class="list-group-item p-0">
                                         <div class="checkbox-custom checkbox-primary">
                                             <input type="checkbox" id="order" name="order" {{ old('order') ? 'checked' : '' }}/>
-                                            <label for="order">首单</label>
+                                            <label for="order">{{ trans('admin.coupon.newbie.first_order') }}</label>
                                         </div>
                                     </li>
                                     <li class="list-group-item pb-0 pl-0">
                                         <div class="input-group">
                                             <div class="input-group-prepend">
-                                                <label class="input-group-text" for="days">创号</label>
+                                                <label class="input-group-text" for="days">{{ trans('admin.coupon.newbie.created_days') }}</label>
                                             </div>
                                             <input type="number" class="form-control col-md-3" name="days" id="days" value="{{old('days')}}"/>
                                             <div class="input-group-append">
-                                                <span class="input-group-text"></span>
+                                                <span class="input-group-text">{{ trans_choice('validation.attributes.day', 0) }}</span>
                                             </div>
                                         </div>
                                     </li>
                                 </ul>
-                                <span class="text-help"> 本项各条件为 <strong>并且</strong> 关系,请自行搭配使用 </span>
+                                <span class="text-help"> {!! trans('admin.coupon.limit_hint') !!} </span>
                             </div>
                         </div>
                         <hr>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-form-label" for="num">数量</label>
-                        <div class="col-md-4 input-group">
+                        <label class="col-md-2 col-form-label" for="num">{{ trans('model.coupon.num') }}</label>
+                        <div class="col-md-4">
                             <input type="number" class="form-control" name="num" id="num" value="{{old('num')}}" required/>
-                            <span class="input-group-text">张</span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-form-label">有效期</label>
+                        <label class="col-md-2 col-form-label">{{ trans('common.available_date') }}</label>
                         <div class="col-md-7 input-group input-daterange" data-plugin="datepicker">
                             <div class="input-group-prepend">
                                 <span class="input-group-text"><i class="icon wb-calendar" aria-hidden="true"></i></span>
@@ -219,7 +218,7 @@
                             <input type="text" class="form-control" name="start_time" id="start_time"
                                    value="{{old('start_time') ?? date("Y-m-d")}}" required/>
                             <div class="input-group-prepend">
-                                <span class="input-group-text"></span>
+                                <span class="input-group-text">{{ trans('common.to') }}</span>
                             </div>
                             <label for="end_time"></label>
                             <input type="text" class="form-control" name="end_time" id="end_time"
@@ -227,7 +226,7 @@
                         </div>
                     </div>
                     <div class="form-actions col-12 text-right">
-                        <button type="submit" class="btn btn-success">提 交</button>
+                        <button type="submit" class="btn btn-success">{{ trans('common.submit') }}</button>
                     </div>
                 </form>
             </div>

+ 41 - 37
resources/views/admin/coupon/index.blade.php

@@ -6,14 +6,14 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title">卡券列表</h1>
+                <h1 class="panel-title">{{ trans('admin.coupon.title') }}</h1>
                 @canany(['admin.coupon.export', 'admin.coupon.create'])
                     <div class="panel-actions btn-group">
                         @can('admin.coupon.export')
-                            <button class="btn btn-info" onclick="exportCoupon()"><i class="icon wb-code"></i>批量导出</button>
+                            <button class="btn btn-info" onclick="exportCoupon()"><i class="icon wb-code"></i>{{ trans('admin.massive_export') }}</button>
                         @endcan
                         @can('admin.coupon.create')
-                            <a href="{{route('admin.coupon.create')}}" class="btn btn-primary"><i class="icon wb-plus"></i>生成</a>
+                            <a href="{{route('admin.coupon.create')}}" class="btn btn-primary"><i class="icon wb-plus"></i> {{ trans('common.add') }}</a>
                         @endcan
                     </div>
                 @endcanany
@@ -21,43 +21,43 @@
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-3 col-sm-4">
-                        <input type="text" class="form-control" name="sn" value="{{Request::query('sn')}}" placeholder="券码" autocomplete="off"/>
+                        <input type="text" class="form-control" name="sn" value="{{Request::query('sn')}}" placeholder="{{ trans('model.coupon.sn') }}" autocomplete="off"/>
                     </div>
                     <div class="form-group col-lg-3 col-sm-4">
                         <select class="form-control" name="type" id="type">
-                            <option value="" hidden>类型</option>
-                            <option value="1">现金券</option>
-                            <option value="2">折扣券</option>
-                            <option value="3">充值券</option>
+                            <option value="" hidden>{{ trans('model.coupon.type') }}</option>
+                            <option value="1">{{ trans('admin.coupon.type.voucher') }}</option>
+                            <option value="2">{{ trans('admin.coupon.type.discount') }}</option>
+                            <option value="3">{{ trans('admin.coupon.type.charge') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-3 col-sm-4">
                         <select class="form-control" name="status" id="status">
-                            <option value="" hidden>状态</option>
-                            <option value="0">生效中</option>
-                            <option value="1">已使用</option>
-                            <option value="2">已失效</option>
+                            <option value="" hidden>{{ trans('common.status.attribute') }}</option>
+                            <option value="0">{{ trans('common.status.available') }}</option>
+                            <option value="1">{{ trans('common.status.used') }}</option>
+                            <option value="2">{{ trans('common.status.expire') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-3 col-sm-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.coupon.index')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.coupon.index')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 名称</th>
-                        <th> 券码</th>
-                        <th> 图片</th>
-                        <th> 类型</th>
-                        <th> 权重</th>
-                        <th> 使用次数</th>
-                        <th> 优惠</th>
-                        <th> 有效期</th>
-                        <th> {{trans('common.status')}}</th>
-                        <th> {{trans('common.action')}}</th>
+                        <th> {{ trans('model.coupon.name') }}</th>
+                        <th> {{ trans('model.coupon.sn') }}</th>
+                        <th> {{ trans('model.coupon.logo') }}</th>
+                        <th> {{ trans('model.coupon.type') }}</th>
+                        <th> {{ trans('model.coupon.priority') }}</th>
+                        <th> {{ trans('model.coupon.usable_times') }}</th>
+                        <th> {{ trans('admin.coupon.discount') }}</th>
+                        <th> {{ trans('common.available_date') }}</th>
+                        <th> {{ trans('common.status.attribute') }}</th>
+                        <th> {{ trans('common.action') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -66,18 +66,22 @@
                             <td> {{$coupon->id}} </td>
                             <td> {{$coupon->name}} </td>
                             <td> {{$coupon->sn}} </td>
-                            <td> @if($coupon->logo) <img src="{{asset($coupon->logo)}}" class="h-50" alt="优惠码logo"/> @endif </td>
+                            <td> @if($coupon->logo)
+                                    <img src="{{asset($coupon->logo)}}" class="h-50" alt="{{ trans('model.coupon.logo') }}"/>
+                                @endif </td>
                             <td>
-                                {{ ['未知卡券','抵用券','折扣券','充值券'][$coupon->type] }}
+                                {{ [trans('common.status.unknown'), trans('admin.coupon.type.voucher') , trans('admin.coupon.type.discount'), trans('admin.coupon.type.charge')][$coupon->type] }}
                             </td>
                             <td> {{$coupon->priority}} </td>
-                            <td> {{$coupon->type === 3 ? '一次性' : ($coupon->usable_times ?? '无限制')}} </td>
+                            <td> {{$coupon->type === 3 ? trans('admin.coupon.single_use') : ($coupon->usable_times ?? trans('common.unlimited'))}} </td>
                             <td>
-                                {{($coupon->type === 2 ?'减 ':'抵 ').($coupon->type === 2 ? $coupon->value.' %': \App\Components\Helpers::getPriceTag($coupon->value))}}
+                                {{ trans_choice('admin.coupon.value', $coupon->type, ['num' => $coupon->type === 2 ? $coupon->value : \App\Components\Helpers::getPriceTag($coupon->value)]) }}
                             </td>
                             <td> {{$coupon->start_time}} ~ {{$coupon->end_time}} </td>
                             <td>
-                                <span class="badge badge-lg @if($coupon->status) badge-default @else badge-success @endif">  {{['生效中','已使用','已失效'][$coupon->status]}} </span>
+                                <span class="badge badge-lg @if($coupon->status) badge-default @else badge-success @endif">
+                                    {{ [trans('common.status.available'), trans('common.status.used'), trans('common.status.expire')][$coupon->status] }}
+                                </span>
                             </td>
                             <td>
                                 <div class="btn-group">
@@ -103,7 +107,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$couponList->total()}}</code> 张优惠券
+                        {!! trans('admin.coupon.counts', ['num' => $couponList->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -130,12 +134,12 @@
       // 批量导出卡券
       function exportCoupon() {
         swal.fire({
-          title: '卡券导出',
-          text: '确定导出所有卡券吗?',
+          title: '{{ trans('admin.coupon.export_title') }}',
+          text: '{{ trans('admin.confirm.export') }}?',
           icon: 'question',
           showCancelButton: true,
-          cancelButtonText: '{{trans('common.close')}}',
-          confirmButtonText: '{{trans('common.confirm')}}',
+          cancelButtonText: '{{ trans('common.close') }}',
+          confirmButtonText: '{{ trans('common.confirm') }}',
         }).then((result) => {
           if (result.value) {
             window.location.href = '{{route('admin.coupon.export')}}';
@@ -148,12 +152,12 @@
       // 删除卡券
       function delCoupon(id, name) {
         swal.fire({
-          title: '确定删除卡券 【' + name + '】 吗?',
+          title: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.coupon.attribute')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
           icon: 'question',
           allowEnterKey: false,
           showCancelButton: true,
-          cancelButtonText: '{{trans('common.close')}}',
-          confirmButtonText: '{{trans('common.confirm')}}',
+          cancelButtonText: '{{ trans('common.close') }}',
+          confirmButtonText: '{{ trans('common.confirm') }}',
         }).then((result) => {
           if (result.value) {
             $.ajax({

+ 32 - 47
resources/views/admin/coupon/show.blade.php

@@ -13,66 +13,54 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title">卡券信息</h1>
+                <h1 class="panel-title">{{ trans('admin.coupon.info_title') }}</h1>
                 <div class="panel-actions">
-                    <a href="{{route('admin.coupon.index')}}" class="btn btn-danger">返 回</a>
+                    <a href="{{route('admin.coupon.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
                 </div>
             </div>
             <div class="panel-body">
                 <div class="form-group row">
-                    <label class="col-md-2 col-form-label" for="name">卡券名称</label>
+                    <label class="col-md-2 col-form-label" for="name">{{ trans('model.coupon.name') }}</label>
                     <div class="col-md-10">
                         <input class="form-control text-fit" id="name" value="{{$coupon->name}}" disabled/>
                     </div>
                 </div>
                 <div class="form-group row">
-                    <label class="col-md-2 col-form-label" for="sn">使用券码</label>
+                    <label class="col-md-2 col-form-label" for="sn">{{ trans('model.coupon.sn') }}</label>
                     <div class="col-md-10">
                         <input type="text" class="form-control text-fit" id="sn" value="{{$coupon->sn}}" disabled/>
                     </div>
                 </div>
                 @if($coupon->logo)
                     <div class="form-group row">
-                        <span class="col-md-2 col-form-label">卡券图片</span>
+                        <span class="col-md-2 col-form-label">{{ trans('model.coupon.logo') }}</span>
                         <div class="col-md-10">
-                            <img src="{{asset($coupon->logo)}}" class="h-100" alt="优惠码logo"/>
+                            <img src="{{asset($coupon->logo)}}" class="h-100" alt="{{ trans('model.coupon.logo') }}"/>
                         </div>
                     </div>
                 @endif
                 <div class="form-group row">
-                    <span class="col-md-2 col-form-label">类型</span>
+                    <span class="col-md-2 col-form-label">{{ trans('model.coupon.type') }}</span>
                     <div class="col-md-10 align-items-center">
                         <div class="radio-custom radio-primary radio-inline">
                             <input type="radio" id="voucher" checked/>
                             <label for="voucher">
-                                {{  ['未知卡券','抵用券','折扣券','充值券'][$coupon->type] }}
+                                {{  [trans('common.status.unknown'), trans('admin.coupon.type.voucher') , trans('admin.coupon.type.discount'), trans('admin.coupon.type.charge')][$coupon->type] }}
                             </label>
                         </div>
                     </div>
                 </div>
                 <div class="form-group row">
-                    <label class="col-md-2 col-form-label" for="value">优惠额度</label>
+                    <label class="col-md-2 col-form-label" for="value">{{ trans('model.coupon.value') }}</label>
                     <div class="col-md-10">
                         <p class="form-control text-fit">
-                            @switch ($coupon->type)
-                                @case(1)
-                                    抵用 <code>{{ \App\Components\Helpers::getPriceTag($coupon->value) }}</code>
-                                    @break
-                                @case(2)
-                                    减 <code>{{$coupon->value}}</code> %
-                                    @break
-                                @case(3)
-                                    充值 <code>{{ \App\Components\Helpers::getPriceTag($coupon->value) }}</code>
-                                    @break
-                                @default
-                                    未知卡券
-                            @endswitch
+                            {{ trans_choice('admin.coupon.value', $coupon->type, ['num' => $coupon->type === 2 ? $coupon->value : \App\Components\Helpers::getPriceTag($coupon->value)]) }}
                         </p>
                     </div>
                 </div>
                 @isset($coupon->priority)
                     <div class="form-group row">
-                        <span class="col-md-2 col-form-label"> 权 重 </span>
+                        <span class="col-md-2 col-form-label"> {{ trans('model.coupon.priority') }} </span>
                         <div class="col-md-10">
                             <span class="form-control text-fit"> {{$coupon->priority}} </span>
                         </div>
@@ -80,9 +68,9 @@
                 @endisset
                 @isset($coupon->usable_times)
                     <div class="form-group row">
-                        <span class="col-md-2 col-form-label">剩余使用次数</span>
+                        <span class="col-md-2 col-form-label">{{ trans('model.coupon.usable_times') }}</span>
                         <div class="col-md-10">
-                            <span class="form-control text-fit"><code>{{$coupon->usable_times}}</code> </span>
+                            <span class="form-control text-fit"><code>{{$coupon->usable_times}}</code> {{ trans('admin.times') }}</span>
                         </div>
                     </div>
                 @endisset
@@ -90,106 +78,103 @@
                     <hr>
                     @isset($coupon->limit['minimum'])
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="minimum">满减条件</label>
+                            <label class="col-md-2 col-form-label" for="minimum">{{ trans('model.coupon.minimum') }}</label>
                             <div class="col-md-10">
-                                <p class="form-control text-fit">当支付金额超过<strong> {{ \App\Components\Helpers::getPriceTag($coupon->limit['minimum']) }}</strong> 时,才能使用本优惠劵</p>
+                                <p class="form-control text-fit">{!! trans('admin.coupon.minimum_hint', ['num' => \App\Components\Helpers::getPriceTag($coupon->limit['minimum'])]) !!}</p>
                             </div>
                         </div>
                     @endisset
                     @isset($coupon->limit['used'])
                         <div class="form-group row">
-                            <span class="col-md-2 col-form-label">个人限用</span>
+                            <span class="col-md-2 col-form-label">{{ trans('model.coupon.used') }}</span>
                             <div class="col-md-10">
-                                <p class="form-control text-fit">符合条件的用户可以使用本券 <strong>{{$coupon->limit['used']}}次</strong></p>
+                                <p class="form-control text-fit">{!! trans('admin.coupon.used_hint', ['num' => $coupon->limit['used']]) !!}</p>
                             </div>
                         </div>
                     @endisset
                     @isset($coupon->limit['users']['levels'])
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="levels">等级限定</label>
+                            <label class="col-md-2 col-form-label" for="levels">{{ trans('model.coupon.levels') }}</label>
                             <div class="col-md-10">
                                 <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control show-tick" id="levels" multiple disabled>
                                     @foreach($levels as $key => $level)
                                         <option value="{{$key}}">{{$level}}</option>
                                     @endforeach
                                 </select>
-                                <span class="text-help"> 以上用户等级,方可使用本券</span>
+                                <span class="text-help"> {{ trans('admin.coupon.levels_hint') }}</span>
                             </div>
                         </div>
                     @endisset
                     @isset($coupon->limit['users']['groups'])
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="groups">分组限定</label>
+                            <label class="col-md-2 col-form-label" for="groups">{{ trans('model.coupon.groups') }}</label>
                             <div class="col-md-10">
                                 <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control show-tick" id="groups" multiple disabled>
                                     @foreach($userGroups as $key => $group)
                                         <option value="{{$key}}">{{$group}}</option>
                                     @endforeach
                                 </select>
-                                <span class="text-help"> 以上用户分组,方可使用本券</span>
+                                <span class="text-help"> {{ trans('admin.coupon.groups_hint') }}</span>
                             </div>
                         </div>
                     @endisset
                     @isset($coupon->limit['users']['white'])
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="users_whitelist">专属用户</label>
+                            <label class="col-md-2 col-form-label" for="users_whitelist">{{ trans('model.coupon.users_whitelist') }}</label>
                             <div class="col-md-6">
                                 <input class="form-control" data-plugin="tokenfield" id="users_whitelist" value="{{ implode(',', $coupon->limit['users']['white']) }}"
                                        disabled/>
-                                <span class="text-help"> 以上用户均可使用本券</span>
                             </div>
                         </div>
                     @endisset
                     @isset($coupon->limit['users']['black'])
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="users_blacklist">禁用用户</label>
+                            <label class="col-md-2 col-form-label" for="users_blacklist">{{ trans('model.coupon.users_blacklist') }}</label>
                             <div class="col-md-6">
                                 <input class="form-control" data-plugin="tokenfield" id="users_blacklist" value="{{ implode(',', $coupon->limit['users']['black']) }}"
                                        disabled/>
-                                <span class="text-help"> 以上用户均不可使用本券</span>
                             </div>
                         </div>
                     @endisset
                     @isset($coupon->limit['services']['white'])
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="services_whitelist">许可商品</label>
+                            <label class="col-md-2 col-form-label" for="services_whitelist">{{ trans('model.coupon.services_whitelist') }}</label>
                             <div class="col-md-6">
                                 <input class="form-control" data-plugin="tokenfield" id="services_whitelist" value="{{ implode(',', $coupon->limit['services']['white']) }}"
                                        disabled/>
-                                <span class="text-help"> 以上商品方可使用本券</span>
                             </div>
                         </div>
                     @endisset
                     @isset($coupon->limit['services']['black'])
                         <div class="form-group row">
-                            <label class="col-md-2 col-form-label" for="services_blacklist">禁用商品</label>
+                            <label class="col-md-2 col-form-label" for="services_blacklist">{{ trans('model.coupon.services_blacklist') }}</label>
                             <div class="col-md-6">
                                 <input class="form-control" data-plugin="tokenfield" id="services_blacklist" value="{{ implode(',', $coupon->limit['services']['black']) }}"
                                        disabled/>
-                                <span class="text-help"> 以上商品不可使用本券</span>
                             </div>
                         </div>
                     @endisset
                     @isset($coupon->limit['users']['newbie'])
                         <div class="form-group row">
-                            <label for="newbie" class="col-md-2 col-form-label">新人专属</label>
+                            <label for="newbie" class="col-md-2 col-form-label">{{ trans('model.coupon.newbie') }}</label>
                             <div class="col-md-10">
                                 <ul class="list-unstyled">
                                     <li class="list-group-item p-0">
                                         <div class="checkbox-custom checkbox-primary">
                                             <input type="checkbox" id="coupon" {{ isset($coupon->limit['users']['newbie']['coupon']) ? 'checked' : '' }} disabled/>
-                                            <label for="coupon">首次用任意券</label>
+                                            <label for="coupon">{{ trans('admin.coupon.newbie.first_discount') }}</label>
                                         </div>
                                     </li>
                                     <li class="list-group-item p-0">
                                         <div class="checkbox-custom checkbox-primary">
                                             <input type="checkbox" id="order" {{ isset($coupon->limit['users']['newbie']['order']) ? 'checked' : '' }} disabled/>
-                                            <label for="order">首单</label>
+                                            <label for="order">{{ trans('admin.coupon.newbie.first_order') }}</label>
                                         </div>
                                     </li>
                                     @isset($coupon->limit['users']['newbie']['days'])
                                         <li class="list-group-item p-0">
-                                            <span class="form-control text-fit">且 创号 <code>{{$coupon->limit['users']['newbie']['days']}}</code> 天</span>
+                                            <span class="form-control text-fit">{!! trans('admin.coupon.created_days_hint', ['days' => $coupon->limit['users']['newbie']['days']])
+                                            !!}</span>
                                         </li>
                                     @endisset
                                 </ul>
@@ -199,14 +184,14 @@
                     <hr>
                 @endif
                 <div class="form-group row">
-                    <label class="col-md-2 col-form-label">有效期</label>
+                    <label class="col-md-2 col-form-label">{{ trans('common.available_date') }}</label>
                     <div class="col-md-6 input-group">
                         <div class="input-group-prepend">
                             <span class="input-group-text"><i class="icon wb-calendar" aria-hidden="true"></i></span>
                         </div>
                         <span class="form-control"> {{$coupon->start_time}} </span>
                         <div class="input-group-prepend">
-                            <span class="input-group-text"></span>
+                            <span class="input-group-text">{{ trans('common.to') }}</span>
                         </div>
                         <span class="form-control"> {{$coupon->end_time}} </span>
                     </div>

+ 29 - 29
resources/views/admin/index.blade.php

@@ -12,7 +12,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-primary">
                                 <i class="icon md-account"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">总用户</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.users') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$totalUserCount}}</span>
                                 @if ($todayRegister)
@@ -25,12 +25,12 @@
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.user.index', ['enable'=>1])}}" class="card card-shadow">
+                    <a href="{{route('admin.user.index', ['enable' => 1])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-info">
                                 <i class="icon md-account"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">有效用户</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.available_users') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$enableUserCount}}</span>
                             </div>
@@ -38,12 +38,12 @@
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.user.index', ['paying'=>1])}}" class="card card-shadow">
+                    <a href="{{route('admin.user.index', ['paying' => 1])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-info">
                                 <i class="icon md-money-box"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">付费用户</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.paid_users') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$payingUserCount}}</span>
                             </div>
@@ -51,12 +51,12 @@
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.user.index', ['active'=>1])}}" class="card card-shadow">
+                    <a href="{{route('admin.user.index', ['active' => 1])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-success">
                                 <i class="icon md-account"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">{{$expireDays}}日内活跃用户</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.active_days_users', ['days' => $expireDays]) }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$activeUserCount}}</span>
                             </div>
@@ -64,25 +64,25 @@
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.user.index', ['unActive'=>1])}}" class="card card-shadow">
+                    <a href="{{route('admin.user.index', ['unActive' => 1])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-warning">
                                 <i class="icon md-account"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">{{$expireDays}}日以上不活跃用户</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.inactive_days_users', ['days' => $expireDays]) }}</span>
                             <div class="content-text text-center mb-0">
-                                <span class="font-size-40 font-weight-100">{{$unActiveUserCount}}</span>
+                                <span class="font-size-40 font-weight-100">{{$inactiveUserCount}}</span>
                             </div>
                         </div>
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.user.index', ['online'=>1])}}" class="card card-shadow">
+                    <a href="{{route('admin.user.index', ['online' => 1])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-success">
                                 <i class="icon md-account"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">当前在线</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.online_users') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$onlineUserCount}}</span>
                             </div>
@@ -90,12 +90,12 @@
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.user.index', ['expireWarning'=>1])}}" class="card card-shadow">
+                    <a href="{{route('admin.user.index', ['expireWarning' => 1])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-danger">
                                 <i class="icon md-account"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">临近到期</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.expiring_users') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$expireWarningUserCount}}</span>
                             </div>
@@ -103,12 +103,12 @@
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.user.index', ['largeTraffic'=>1])}}" class="card card-shadow">
+                    <a href="{{route('admin.user.index', ['largeTraffic' => 1])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-warning">
                                 <i class="icon md-account"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">流量大户(超过90%的用户)</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.overuse_users') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$largeTrafficUserCount}}</span>
                             </div>
@@ -116,12 +116,12 @@
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.user.index', ['flowAbnormal'=>1])}}" class="card card-shadow">
+                    <a href="{{route('admin.user.index', ['flowAbnormal' => 1])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-danger">
                                 <i class="icon md-account"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">1小时内流量异常</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.abnormal_users') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$flowAbnormalUserCount}}</span>
                             </div>
@@ -136,7 +136,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-primary">
                                 <i class="icon md-cloud"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">节点</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.nodes') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$nodeCount}}</span>
                             </div>
@@ -149,7 +149,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-info">
                                 <i class="icon md-cloud-off"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">维护中的节点</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.maintaining_nodes') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$unnormalNodeCount}}</span>
                             </div>
@@ -164,7 +164,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-primary">
                                 <i class="icon md-time-countdown"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">记录的消耗流量</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.traffic_consumed') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$totalFlowCount}}</span>
                             </div>
@@ -177,7 +177,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-primary">
                                 <i class="icon md-time-countdown"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">30日内消耗流量</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.traffic_days_consumed', ['days' => 30]) }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$flowCount}}</span>
                                 @if($todayFlowCount !== '0B')
@@ -197,7 +197,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-primary">
                                 <i class="icon md-ticket-star"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">总订单数</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.orders') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$totalOrder}}</span>
                                 @if($todayOrder)
@@ -215,7 +215,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-info">
                                 <i class="icon md-ticket-star"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">在线支付订单数</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.online_orders') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$totalOnlinePayOrder}}</span>
                                 @if($todayOnlinePayOrder)
@@ -228,12 +228,12 @@
                     </a>
                 </div>
                 <div class="col-xl-3 col-md-6 info-panel">
-                    <a href="{{route('admin.order', ['status'=>[1, 2]])}}" class="card card-shadow">
+                    <a href="{{route('admin.order', ['status' => [1, 2]])}}" class="card card-shadow">
                         <div class="card-block bg-white">
                             <button type="button" class="btn btn-floating btn-sm btn-success">
                                 <i class="icon md-ticket-star"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">支付成功订单数</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.succeed_orders') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$totalSuccessOrder}}</span>
                                 @if($todaySuccessOrder)
@@ -253,7 +253,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-primary">
                                 <i class="icon md-money"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">总余额</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.credit') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$totalCredit}}</span>
                             </div>
@@ -268,7 +268,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-warning">
                                 <i class="icon md-money"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">待提现佣金</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.withdrawing_commissions') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$totalWaitRefAmount}}</span>
                                 @if($todayWaitRefAmount)
@@ -288,7 +288,7 @@
                             <button type="button" class="btn btn-floating btn-sm btn-dark">
                                 <i class="icon md-money"></i>
                             </button>
-                            <span class="ml-15 font-weight-400">已支出佣金</span>
+                            <span class="ml-15 font-weight-400">{{ trans('admin.dashboard.withdrawn_commissions') }}</span>
                             <div class="content-text text-center mb-0">
                                 <span class="font-size-40 font-weight-100">{{$totalRefAmount}}</span>
                             </div>

+ 56 - 60
resources/views/admin/layouts.blade.php

@@ -54,14 +54,14 @@
                     <li class="nav-item dropdown">
                         <a class="nav-link navbar-avatar" data-toggle="dropdown" href="#" aria-expanded="false" data-animation="scale-up" role="button">
                         <span class="avatar avatar-online">
-                            <img src="{{Auth::getUser()->avatar}}" alt="{{trans('common.avatar')}}" />
+                            <img src="{{Auth::getUser()->avatar}}" alt="{{trans('common.avatar')}}"/>
                             <i></i>
                         </span>
                         </a>
                         <div class="dropdown-menu" role="menu">
                             <a class="dropdown-item" href="/" role="menuitem">
                                 <i class="icon wb-settings" aria-hidden="true"></i>
-                                个人中心
+                                {{ trans('admin.user_dashboard') }}
                             </a>
                             <div class="dropdown-divider" role="presentation"></div>
                             <a class="dropdown-item" href="{{route('logout')}}" role="menuitem">
@@ -81,7 +81,7 @@
                     <li class="site-menu-item {{request()->routeIs('admin.index') ? 'active open' : ''}}">
                         <a href="{{route('admin.index')}}">
                             <i class="site-menu-icon wb-dashboard" aria-hidden="true"></i>
-                            <span class="site-menu-title">管理中心</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.dashboard') }}</span>
                         </a>
                     </li>
                 @endcan
@@ -89,41 +89,41 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.user.*', 'admin.log.credit', 'admin.subscribe.*') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-user" aria-hidden="true"></i>
-                            <span class="site-menu-title">用户系统</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.user.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.user.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.user.index', 'admin.user.edit', 'admin.user.monitor', 'admin.user.online', 'admin.user.online', 'admin.user.export') ? 'active open' : ''}}">
                                     <a href="{{route('admin.user.index')}}">
-                                        <span class="site-menu-title">用户管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.user.list') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.user.oauth')
                                 <li class="site-menu-item {{request()->routeIs('admin.user.oauth') ? 'active open' : ''}}">
                                     <a href="{{route('admin.user.oauth')}}">
-                                        <span class="site-menu-title">用户授权</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.user.oauth') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.user.group.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.user.group.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.user.group.index')}}">
-                                        <span class="site-menu-title">用戶分组</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.user.group') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.credit')
                                 <li class="site-menu-item {{request()->routeIs('admin.log.credit') ? 'active open' : ''}}">
                                     <a href="{{route('admin.log.credit')}}">
-                                        <span class="site-menu-title">余额变动</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.user.credit_log') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.subscribe.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.subscribe.*')? 'active open' : ''}}">
                                     <a href="{{route('admin.subscribe.index')}}">
-                                        <span class="site-menu-title">订阅管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.user.subscribe') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -134,20 +134,20 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.permission.*', 'admin.role.*') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-users" aria-hidden="true"></i>
-                            <span class="site-menu-title">权限系统</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.rbac.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.permission.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.permission.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.permission.index')}}">
-                                        <span class="site-menu-title">权限列表</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.rbac.permission') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.role.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.role.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.role.index')}}">
-                                        <span class="site-menu-title">角色列表</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.rbac.role') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -158,7 +158,7 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.ticket.*', 'admin.article.*', 'admin.marketing.*')? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-chat-working" aria-hidden="true"></i>
-                            <span class="site-menu-title">客服系统</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.customer_service.attribute') }}</span>
                             @can('admin.ticket.index')
                                 @php
                                     $openTicket = App\Models\Ticket::whereStatus(0)->count()
@@ -174,7 +174,7 @@
                             @can('admin.ticket.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.ticket.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.ticket.index')}}">
-                                        <span class="site-menu-title">服务工单</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.customer_service.ticket') }}</span>
                                         @if($openTicket > 0)
                                             <div class="site-menu-label">
                                                 <span class="badge badge-danger badge-round mr-25">{{$openTicket}}</span>
@@ -186,21 +186,21 @@
                             @can('admin.article.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.article.*')? 'active open' : ''}}">
                                     <a href="{{route('admin.article.index')}}">
-                                        <span class="site-menu-title">文章管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.customer_service.article') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.marketing.push')
                                 <li class="site-menu-item {{request()->routeIs('admin.marketing.push') ? 'active open' : ''}}">
                                     <a href="{{route('admin.marketing.push')}}">
-                                        <span class="site-menu-title">消息推送</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.customer_service.push') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.marketing.email')
                                 <li class="site-menu-item {{request()->routeIs('admin.marketing.email') ? 'active open' : ''}}">
                                     <a href="{{route('admin.marketing.email')}}">
-                                        <span class="site-menu-title">邮件群发</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.customer_service.mail') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -211,27 +211,27 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.node.*') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-cloud" aria-hidden="true"></i>
-                            <span class="site-menu-title">线路系统</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.node.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.node.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.node.index', 'admin.node.create', 'admin.node.edit')? 'active open' : ''}}">
                                     <a href="{{route('admin.node.index')}}">
-                                        <span class="site-menu-title">线路管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.node.list') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.node.auth.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.node.auth.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.node.auth.index')}}">
-                                        <span class="site-menu-title">线路授权</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.node.auth') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.node.cert.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.node.cert.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.node.cert.index')}}">
-                                        <span class="site-menu-title">证书列表</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.node.cert') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -242,27 +242,27 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.rule.*') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-eye" aria-hidden="true"></i>
-                            <span class="site-menu-title">审计规则</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.rule.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.rule.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.rule.index') ? 'active open' : ''}}">
                                     <a href="{{route('admin.rule.index')}}">
-                                        <span class="site-menu-title">规则列表</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.rule.list') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.rule.group.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.rule.group.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.rule.group.index')}}">
-                                        <span class="site-menu-title">规则分组</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.rule.group') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.rule.log')
                                 <li class="site-menu-item {{request()->routeIs('admin.rule.log') ? 'active open' : ''}}">
                                     <a href="{{route('admin.rule.log')}}">
-                                        <span class="site-menu-title">触发记录</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.rule.trigger') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -273,27 +273,27 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.goods.*', 'admin.coupon.*', 'admin.order') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-shopping-cart" aria-hidden="true"></i>
-                            <span class="site-menu-title">商品系统</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.shop.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.goods.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.goods.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.goods.index')}}">
-                                        <span class="site-menu-title">商品管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.shop.goods') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.coupon.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.coupon.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.coupon.index')}}">
-                                        <span class="site-menu-title">卡券管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.shop.coupon') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.order')
                                 <li class="site-menu-item {{request()->routeIs('admin.order') ? 'active open' : ''}}">
                                     <a href="{{route('admin.order')}}">
-                                        <span class="site-menu-title">商品订单</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.shop.order') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -304,7 +304,7 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.invite.*', 'admin.aff.*') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-thumb-up" aria-hidden="true"></i>
-                            <span class="site-menu-title">推广系统</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.promotion.attribute') }}</span>
                             @can('admin.aff.index')
                                 @php
                                     $openApply = App\Models\ReferralApply::whereStatus(0)->count()
@@ -320,14 +320,14 @@
                             @can('admin.invite.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.invite.index') ? 'active open' : ''}}">
                                     <a href="{{route('admin.invite.index')}}">
-                                        <span class="site-menu-title">邀请管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.promotion.invite') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.aff.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.aff.index', 'admin.aff.detail') ? 'active open' : ''}}">
                                     <a href="{{route('admin.aff.index')}}">
-                                        <span class="site-menu-title">提现管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.promotion.withdraw') }}</span>
                                         @if($openApply > 0)
                                             <div class="site-menu-label">
                                                 <span class="badge badge-danger badge-round mr-25">{{$openApply}}</span>
@@ -339,7 +339,7 @@
                             @can('admin.aff.rebate')
                                 <li class="site-menu-item {{request()->routeIs('admin.aff.rebate') ? 'active open' : ''}}">
                                     <a href="{{route('admin.aff.rebate')}}">
-                                        <span class="site-menu-title">返利流水</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.promotion.rebate_flow') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -350,20 +350,20 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.report.*') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-stats-bars" aria-hidden="true"></i>
-                            <span class="site-menu-title">分析报告</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.analysis.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.report.accounting')
                                 <li class="site-menu-item {{request()->routeIs('admin.report.accounting') ? 'active open' : ''}}">
                                     <a href="{{route('admin.report.accounting')}}">
-                                        <span class="site-menu-title">流水账簿</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.analysis.accounting') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.report.userAnalysis')
                                 <li class="site-menu-item {{request()->routeIs('admin.report.userAnalysis') ? 'active open' : ''}}">
                                     <a href="{{route('admin.report.userAnalysis')}}">
-                                        <span class="site-menu-title">用户分析</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.analysis.user_flow') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -374,62 +374,62 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.log.traffic', 'admin.log.flow', 'admin.log.ban', 'admin.log.ip', 'admin.log.online', 'admin.log.notify', 'admin.payment.callback') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-calendar" aria-hidden="true"></i>
-                            <span class="site-menu-title">日志系统</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.log.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.log.traffic')
                                 <li class="site-menu-item {{request()->routeIs('admin.log.traffic') ? 'active open' : ''}}">
                                     <a href="{{route('admin.log.traffic')}}">
-                                        <span class="site-menu-title">流量使用</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.log.traffic') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.flow')
                                 <li class="site-menu-item {{request()->routeIs('admin.log.flow') ? 'active open' : ''}}">
                                     <a href="{{route('admin.log.flow')}}">
-                                        <span class="site-menu-title">流量变动</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.log.traffic_flow') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.ban')
                                 <li class="site-menu-item {{request()->routeIs('admin.log.ban') ? 'active open' : ''}}">
                                     <a href="{{route('admin.log.ban')}}">
-                                        <span class="site-menu-title">封禁记录</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.log.service_ban') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.ip')
                                 <li class="site-menu-item {{request()->routeIs('admin.log.ip') ? 'active open' : ''}}">
                                     <a href="{{route('admin.log.ip')}}">
-                                        <span class="site-menu-title">在线记录</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.log.online_logs') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.online')
                                 <li class="site-menu-item {{request()->routeIs('admin.log.online') ? 'active open' : ''}}">
                                     <a href="{{route('admin.log.online')}}">
-                                        <span class="site-menu-title">在线监控</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.log.online_monitor') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.log.notify')
                                 <li class="site-menu-item {{request()->routeIs('admin.log.notify') ? 'active open' : ''}}">
                                     <a href="{{route('admin.log.notify')}}">
-                                        <span class="site-menu-title">通知记录</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.log.notify') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.payment.callback')
                                 <li class="site-menu-item {{request()->routeIs('admin.payment.callback') ? 'active open' : ''}}">
                                     <a href="{{route('admin.payment.callback')}}">
-                                        <span class="site-menu-title">支付回调</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.log.payment_callback') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('log-viewer')
                                 <li class="site-menu-item">
                                     <a href="{{route('log-viewer::dashboard')}}" target="_blank">
-                                        <span class="site-menu-title">系统日志</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.log.system') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -440,34 +440,34 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.tools.*') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-briefcase" aria-hidden="true"></i>
-                            <span class="site-menu-title">工具箱</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.tools.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.tools.decompile')
                                 <li class="site-menu-item {{request()->routeIs('admin.tools.decompile') ? 'active open' : ''}}">
                                     <a href="{{route('admin.tools.decompile')}}">
-                                        <span class="site-menu-title">反解析</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.tools.decompile') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.tools.convert')
                                 <li class="site-menu-item {{request()->routeIs('admin.tools.convert') ? 'active open' : ''}}">
                                     <a href="{{route('admin.tools.convert')}}">
-                                        <span class="site-menu-title">格式转换</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.tools.convert') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.tools.import')
                                 <li class="site-menu-item {{request()->routeIs('admin.tools.import') ? 'active open' : ''}}">
                                     <a href="{{route('admin.tools.import')}}">
-                                        <span class="site-menu-title">数据导入</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.tools.import') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.tools.analysis')
                                 <li class="site-menu-item {{request()->routeIs('admin.tools.analysis') ? 'active open' : ''}}">
                                     <a href="{{route('admin.tools.analysis')}}">
-                                        <span class="site-menu-title">日志分析</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.tools.analysis') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -478,27 +478,27 @@
                     <li class="site-menu-item has-sub {{request()->routeIs('admin.config.*', 'admin.system.index') ? 'active open' : ''}}">
                         <a href="javascript:void(0)">
                             <i class="site-menu-icon wb-settings" aria-hidden="true"></i>
-                            <span class="site-menu-title">设置</span>
+                            <span class="site-menu-title">{{ trans('admin.menu.setting.attribute') }}</span>
                         </a>
                         <ul class="site-menu-sub">
                             @can('admin.config.filter.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.config.filter.index') ? 'active open' : ''}}">
                                     <a href="{{route('admin.config.filter.index')}}">
-                                        <span class="site-menu-title">邮箱后缀管理</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.setting.email_suffix') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.config.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.config.common.*') ? 'active open' : ''}}">
                                     <a href="{{route('admin.config.index')}}">
-                                        <span class="site-menu-title">通用配置</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.setting.universal') }}</span>
                                     </a>
                                 </li>
                             @endcan
                             @can('admin.system.index')
                                 <li class="site-menu-item {{request()->routeIs('admin.system.index') ? 'active open' : ''}}">
                                     <a href="{{route('admin.system.index')}}">
-                                        <span class="site-menu-title">系统设置</span>
+                                        <span class="site-menu-title">{{ trans('admin.menu.setting.system') }}</span>
                                     </a>
                                 </li>
                             @endcan
@@ -509,12 +509,8 @@
         </div>
     </div>
     <div class="page">
-        <!--[if lt IE 8]>
-        <p class="browserupgrade">您正在使用 <strong>过时/老旧</strong> 的浏览器。 为了您的使用体验,请
-            <a href="http://browsehappy.com/">升级您的浏览器</a> <br/>You are using an <strong>outdated</strong> browser. Please
-            <a href="http://browsehappy.com/">upgrade your browser</a> to improve your experience.
-        </p>
-        <![endif]-->
+        <!--[if lt IE 8]><p class="browserupgrade">{{trans('common.update_browser.0')}}<strong>{{trans('common.update_browser.1')}}</strong>
+{{trans('common.update_browser.2')}}<a href="http://browsehappy.com/" target="_blank">{{trans('common.update_browser.3')}}</a>{{trans('common.update_browser.4')}}</p><![endif]-->  
         @yield('content')
     </div>
     @endsection

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

@@ -6,8 +6,8 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">回调日志
-                    <small>(在线支付)</small>
+                <h2 class="panel-title">
+                    {!! trans('admin.logs.callback') !!}
                 </h2>
             </div>
             <div class="panel-body">
@@ -20,14 +20,14 @@
                     </div>
                     <div class="form-group col-lg-2 col-sm-4">
                         <select class="form-control" name="status" id="status" onchange="this.form.submit()">
-                            <option value="" hidden>交易状态</option>
-                            <option value="1">成功</option>
-                            <option value="0">失败</option>
+                            <option value="" hidden>{{ trans('common.status.attribute') }}</option>
+                            <option value="1">{{ trans('common.success') }}</option>
+                            <option value="0">{{ trans('common.failed') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.payment.callback')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.payment.callback')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
@@ -38,7 +38,7 @@
                         <th> 平台订单号</th>
                         <th> 本地订单号</th>
                         <th> 交易金额</th>
-                        <th> {{trans('common.status')}}</th>
+                        <th> {{trans('common.status.attribute')}}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -65,7 +65,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$callbackLogs->total()}}</code> 个账号
+                        {!! trans('admin.logs.counts', ['num' => $callbackLogs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -82,8 +82,8 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#status').val({{Request::query('status')}});
-        });
+      $(document).ready(function() {
+        $('#status').val({{Request::query('status')}});
+      });
     </script>
 @endsection

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

@@ -6,36 +6,36 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">邮件投递记录</h2>
+                <h2 class="panel-title">{{ trans('admin.logs.notification') }}</h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-3 col-sm-4">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('common.account') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4">
                         <select class="form-control" name="type" id="type" onchange="this.form.submit()">
-                            <option value="" hidden>类型</option>
+                            <option value="" hidden>{{ trans('model.notification.type') }}</option>
                             @foreach(config('common.notification.labels') as $key => $value)
                                 <option value="{{$key}}">{{$value}}</option>
                             @endforeach
                         </select>
                     </div>
                     <div class="form-group col-lg-1 col-sm-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.log.notify')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.log.notify')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 类型</th>
-                        <th> 收信地址</th>
-                        <th> 标题</th>
-                        <th> 内容</th>
-                        <th> 投递时间</th>
-                        <th> 投递状态</th>
+                        <th> {{ trans('model.notification.type') }}</th>
+                        <th> {{ trans('model.notification.address') }}</th>
+                        <th> {{ trans('validation.attributes.title') }}</th>
+                        <th> {{ trans('validation.attributes.content') }}</th>
+                        <th> {{ trans('model.notification.created_at') }}</th>
+                        <th> {{ trans('model.notification.status') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -51,9 +51,9 @@
                                 @if($log->status < 0)
                                     <p class="badge badge-danger text-break font-size-14"> {{$log->error}} </p>
                                 @elseif($log->status > 0)
-                                    <labe class="badge badge-success">投递成功</labe>
+                                    <labe class="badge badge-success">{{ trans('common.success') }}</labe>
                                 @else
-                                    <span class="badge badge-default"> 等待投递 </span>
+                                    <span class="badge badge-default"> {{ trans('common.status.waiting_tobe_send') }} </span>
                                 @endif
                             </td>
                         </tr>
@@ -64,7 +64,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$notificationLogs->total()}}</code> 条记录
+                        {!! trans('admin.logs.counts', ['num' => $notificationLogs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -80,8 +80,8 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#type').val({{Request::query('type')}});
-        });
+      $(document).ready(function() {
+        $('#type').val({{Request::query('type')}});
+      });
     </script>
 @endsection

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

@@ -6,47 +6,47 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">在线IP监控
-                    <small>2分钟内的实时数据</small>
-                </h3>
+                <h2 class="panel-title">
+                    {!! trans('admin.logs.ip_monitor') !!}
+                </h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-2 col-sm-2">
-                        <input type="number" class="form-control" name="id" value="{{Request::query('id')}}" placeholder="用户ID"/>
+                        <input type="number" class="form-control" name="id" value="{{Request::query('id')}}" placeholder="{{ trans('model.user.id') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-5">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('common.account') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-5">
                         <input type="text" class="form-control" name="ip" value="{{Request::query('ip')}}" placeholder="IP"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-3">
-                        <input type="number" class="form-control" name="port" value="{{Request::query('port')}}" placeholder="端口"/>
+                        <input type="number" class="form-control" name="port" value="{{Request::query('port')}}" placeholder="{{ trans('model.user.port') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-5">
                         <select name="node_id" id="node_id" class="form-control" onchange="this.form.submit()">
-                            <option value="" hidden>选择节点</option>
+                            <option value="" hidden>{{ trans('model.node.attribute') }}</option>
                             @foreach($nodes as $node)
                                 <option value="{{$node->id}}">{{$node->name}}</option>
                             @endforeach
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.log.online')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.log.online')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 类型</th>
-                        <th> 节点</th>
-                        <th> 用户</th>
+                        <th> {{ trans('model.ip.network_type') }}</th>
+                        <th> {{ trans('model.node.attribute') }}</th>
+                        <th> {{ trans('common.account') }}</th>
                         <th> IP</th>
-                        <th> 归属地</th>
-                        <th> 时间</th>
+                        <th> {{ trans('model.ip.info') }}</th>
+                        <th> {{ trans('validation.attributes.time') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -54,8 +54,8 @@
                         <tr>
                             <td>{{$log->id}}</td>
                             <td>{{$log->type}}</td>
-                            <td>{{$log->node->name ?? '【节点已删除】'}}</td>
-                            <td>{{$log->user->username ?? '【用户已删除】'}}</td>
+                            <td>{{$log->node->name ?? '【'.trans('common.deleted_item', ['attribute' => trans('model.node.attribute')]).'】'}}</td>
+                            <td>{{$log->user->username ?? '【'.trans('common.deleted_item', ['attribute' => trans('model.user.attribute')]).'】'}}</td>
                             <td>
                                 @if (strpos($log->ip, ',') !== false)
                                     @foreach (explode(',', $log->ip) as $ip)
@@ -75,7 +75,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$onlineIPLogs->total()}}</code> 个账号
+                        {!! trans('admin.logs.counts', ['num' => $onlineIPLogs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">

+ 39 - 36
resources/views/admin/logs/order.blade.php

@@ -14,15 +14,15 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">订单列表</h2>
+                <h2 class="panel-title">{{ trans('admin.logs.order.title') }}</h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-2 col-sm-6">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('common.account') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
-                        <input type="number" class="form-control" name="sn" value="{{Request::query('sn')}}" placeholder="订单号"/>
+                        <input type="number" class="form-control" name="sn" value="{{Request::query('sn')}}" placeholder="{{ trans('model.aff.order_id') }}"/>
                     </div>
                     <div class="form-group col-lg-6 col-sm-12">
                         <div class="input-group input-daterange" data-plugin="datepicker">
@@ -31,62 +31,62 @@
                             </div>
                             <input type="text" class="form-control" name="start" value="{{Request::query('start')}}" autocomplete="off"/>
                             <div class="input-group-prepend">
-                                <span class="input-group-text"></span>
+                                <span class="input-group-text">{{ trans('common.to') }}</span>
                             </div>
                             <input type="text" class="form-control" name="end" value="{{Request::query('end')}}" autocomplete="off"/>
                         </div>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
-                        <select data-plugin="selectpicker" class="form-control show-tick" name="is_expire" id="is_expire" data-style="btn-outline btn-primary" title="是否过期">
-                            <option value="0"></option>
-                            <option value="1"></option>
+                        <select data-plugin="selectpicker" class="form-control show-tick" name="is_expire" id="is_expire" data-style="btn-outline btn-primary" title="{{ trans('admin.logs.order.is_expired') }}">
+                            <option value="0"> {{ trans('admin.no') }}</option>
+                            <option value="1"> {{ trans('admin.yes') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
                         <select data-plugin="selectpicker" class="form-control show-tick" name="is_coupon" id="is_coupon" data-style="btn-outline btn-primary"
-                                title="是否使用优惠券">
-                            <option value="0"></option>
-                            <option value="1"></option>
+                                title="{{ trans('admin.logs.order.is_coupon') }}">
+                            <option value="0"> {{ trans('admin.no') }}</option>
+                            <option value="1"> {{ trans('admin.yes') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
-                        <select data-plugin="selectpicker" class="form-control show-tick" name="pay_way" id="pay_way" data-style="btn-outline byn-primary" title="支付方式">
+                        <select data-plugin="selectpicker" class="form-control show-tick" name="pay_way" id="pay_way" data-style="btn-outline byn-primary" title="{{ trans('model.order.pay_way') }}">
                             @foreach(config('common.payment.labels') as $key => $value)
                                 <option value="{{$key}}">{{$key.' - '.$value}}</option>
                             @endforeach
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
-                        <select data-plugin="selectpicker" class="form-control show-tick" name="status[]" id="status" data-style="btn-outline btn-primary" title="订单状态"
+                        <select data-plugin="selectpicker" class="form-control show-tick" name="status[]" id="status" data-style="btn-outline btn-primary" title="{{ trans('model.order.status') }}"
                                 multiple>
-                            <option value="-1">已关闭</option>
-                            <option value="0">待支付</option>
-                            <option value="1">已支付待确认</option>
-                            <option value="2">已完成</option>
-                            <option value="3">预支付</option>
+                            <option value="-1">{{ trans('common.order.status.cancel') }}</option>
+                            <option value="0">{{ trans('common.payment.status.wait') }}</option>
+                            <option value="1">{{ trans('common.order.status.review') }}</option>
+                            <option value="2">{{ trans('common.order.status.complete').'/'.trans('common.status.expire').'/'.trans('common.order.status.ongoing') }}</option>
+                            <option value="3">{{ trans('common.order.status.prepaid') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.order')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.order')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> @sortablelink('id', '#')</th>
-                        <th> 用户账号</th>
-                        <th> @sortablelink('sn', '订单号')</th>
-                        <th> 商品</th>
-                        <th> 优惠券</th>
-                        <th> 原价</th>
-                        <th> 实价</th>
-                        <th> 支付方式</th>
-                        <th> 订单状态</th>
-                        <th> @sortablelink('expired_at', '过期时间')</th>
-                        <th> @sortablelink('created_at', '创建时间')</th>
+                        <th> {{ trans('common.account') }}</th>
+                        <th> @sortablelink('sn', trans('model.aff.order_id'))</th>
+                        <th> {{ trans('model.goods.attribute') }}</th>
+                        <th> {{ trans('model.coupon.attribute') }}</th>
+                        <th> {{ trans('model.order.original_price') }}</th>
+                        <th> {{ trans('model.order.price') }}</th>
+                        <th> {{ trans('model.order.pay_way') }}</th>
+                        <th> {{ trans('model.order.status') }}</th>
+                        <th> @sortablelink('expired_at', trans('common.expired_at'))</th>
+                        <th> @sortablelink('created_at', trans('common.created_at'))</th>
                         @can(['admin.order.edit'])
-                            <th> 操作</th>
+                            <th> {{ trans('common.action') }}</th>
                         @endcan
                     </tr>
                     </thead>
@@ -96,7 +96,7 @@
                             <td> {{$order->id}} </td>
                             <td>
                                 @if(empty($order->user) )
-                                    【账号不存在
+                                    【{{ trans('common.deleted_item', ['attribute' => trans('common.account')]) }}
                                 @else
                                     @can('admin.user.index')
                                         <a href="{{route('admin.user.index', ['id'=>$order->user->id])}}" target="_blank">{{$order->user->username}} </a>
@@ -116,7 +116,7 @@
                             <td>
                                 {!! $order->status_label !!}
                             </td>
-                            <td> {{$order->is_expire ? '已过期' : $order->expired_at}} </td>
+                            <td> {{$order->is_expire ? trans('common.status.expire') : $order->expired_at}} </td>
                             <td> {{$order->created_at}} </td>
                             @can(['admin.order.edit'])
                                 <td>
@@ -126,17 +126,20 @@
                                     <div class="dropdown-menu" role="menu">
                                         @if ($order->status !== -1)
                                             <a class="dropdown-item" href="javascript:changeStatus('{{$order->id}}', -1)" role="menuitem">
-                                                <i class="icon wb-close" aria-hidden="true"></i> 置 过 期
+                                                <i class="icon wb-close" aria-hidden="true"></i>
+                                                {{ trans('admin.set_to', ['attribute' => trans('common.status.expire')]) }}
                                             </a>
                                         @endif
                                         @if ($order->status !== 2)
                                             <a class="dropdown-item" href="javascript:changeStatus('{{$order->id}}', 2)" role="menuitem">
-                                                <i class="icon wb-check" aria-hidden="true"></i> 置 完 成
+                                                <i class="icon wb-check" aria-hidden="true"></i>
+                                                {{ trans('admin.set_to', ['attribute' => trans('common.order.status.complete')]) }}
                                             </a>
                                         @endif
                                         @if ($order->status !== 3)
                                             <a class="dropdown-item" href="javascript:changeStatus('{{$order->id}}', 3)" role="menuitem">
-                                                <i class="icon wb-check-circle" aria-hidden="true"></i> 置 预支付
+                                                <i class="icon wb-check-circle" aria-hidden="true"></i>
+                                                {{ trans('admin.set_to', ['attribute' => trans('common.order.status.prepaid')]) }}
                                             </a>
                                         @endif
                                     </div>
@@ -150,7 +153,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$orders->total()}}</code> 个订单
+                        {!! trans('admin.logs.counts', ['num' => $orders->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">

+ 23 - 23
resources/views/admin/logs/traffic.blade.php

@@ -7,22 +7,22 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">流量日志</h2>
+                <h2 class="panel-title">{{ trans('admin.logs.user_traffic.title') }}</h2>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-2 col-sm-4">
-                        <input type="number" class="form-control" name="user_id" value="{{Request::query('user_id')}}" placeholder="用户ID"/>
+                        <input type="number" class="form-control" name="user_id" value="{{Request::query('user_id')}}" placeholder="{{ trans('model.user.id') }}"/>
                     </div>
                     <div class="form-group col-lg-3 col-sm-8">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('common.account') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4">
-                        <input type="number" class="form-control" name="port" value="{{Request::query('port')}}" placeholder="用户端口"/>
+                        <input type="number" class="form-control" name="port" value="{{Request::query('port')}}" placeholder="{{ trans('model.user.port') }}"/>
                     </div>
                     <div class="form-group col-lg-3 col-sm-8">
                         <select class="form-control" name="node_id" id="node_id" onchange="this.form.submit()">
-                            <option value="" hidden>选择节点</option>
+                            <option value="" hidden>{{ trans('admin.logs.user_traffic.choose_node') }}</option>
                             @foreach($nodes as $node)
                                 <option value="{{$node->id}}">{{$node->name}}</option>
                             @endforeach
@@ -37,27 +37,27 @@
                             </div>
                             <input type="text" class="form-control" name="start" value="{{Request::query('start')}}" autocomplete="off"/>
                             <div class="input-group-prepend">
-                                <span class="input-group-text"></span>
+                                <span class="input-group-text">{{ trans('common.to') }}</span>
                             </div>
                             <input type="text" class="form-control" name="end" value="{{Request::query('end')}}" autocomplete="off"/>
                         </div>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.log.traffic')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.log.traffic')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 用户</th>
-                        <th> 节点</th>
-                        <th> 流量比例</th>
-                        <th> 上传流量</th>
-                        <th> 下载流量</th>
-                        <th> 总流量</th>
-                        <th> 记录时间</th>
+                        <th> {{ trans('common.account') }}</th>
+                        <th> {{ trans('model.node.attribute') }}</th>
+                        <th> {{ trans('model.node.data_rate') }}</th>
+                        <th> {{ trans('model.user_traffic.upload') }}</th>
+                        <th> {{ trans('model.user_traffic.download') }}</th>
+                        <th> {{ trans('model.user_traffic.total') }}</th>
+                        <th> {{ trans('model.user_traffic.log_time') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -75,7 +75,7 @@
                                     @endcan
                                 @endif
                             </td>
-                            <td> {{$log->node->name ?? '【节点已删除】'}} </td>
+                            <td> {{$log->node->name ?? '【'.trans('common.deleted_item', ['attribute' => trans('model.node.attribute')]).'】'}} </td>
                             <td> {{$log->rate}} </td>
                             <td> {{$log->u}} </td>
                             <td> {{$log->d}} </td>
@@ -89,7 +89,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-6">
-                        共 <code>{{$dataFlowLogs->total()}} 条记录</code>,合计 <code>{{$totalTraffic}}</code>
+                        {!! trans('admin.logs.counts', ['num' => $dataFlowLogs->total()]) !!} | <code>{{$totalTraffic}}</code>
                     </div>
                     <div class="col-sm-6">
                         <nav class="Page navigation float-right">
@@ -108,12 +108,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').val({{Request::query('node_id')}});
-        });
+      $(document).ready(function() {
+        $('#node_id').val({{Request::query('node_id')}});
+      });
     </script>
 @endsection

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

@@ -6,27 +6,27 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">用户封禁记录</h3>
+                <h3 class="panel-title">{{ trans('admin.logs.ban.title') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-3 col-sm-6">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('common.account') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.log.ban')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.log.ban')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 用户账号</th>
-                        <th> 时长</th>
-                        <th> 理由</th>
-                        <th> 封禁时间</th>
-                        <th> 最后连接时间</th>
+                        <th> {{ trans('common.account') }}</th>
+                        <th> {{ trans('admin.logs.ban.time') }}</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>
                     </tr>
                     </thead>
                     <tbody>
@@ -46,7 +46,7 @@
                                     【{{trans('common.deleted_item', ['attribute' => trans('common.account')])}}】
                                 @endif
                             </td>
-                            <td> {{$log->time}}分钟</td>
+                            <td> {{$log->time}}{{ trans('admin.minute') }}</td>
                             <td> {{$log->description}} </td>
                             <td> {{$log->created_at}} </td>
                             <td> {{date('Y-m-d H:i:s', $log->user->t)}} </td>
@@ -58,7 +58,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$userBanLogs->total()}}</code> 条记录
+                        {!! trans('admin.logs.counts', ['num' => $userBanLogs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">

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

@@ -6,29 +6,29 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">余额变动记录</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.tools.import') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-3 col-sm-6">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('common.account') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.log.credit')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.log.credit')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 用户账号</th>
-                        <th> 订单ID</th>
-                        <th> 操作前余额</th>
-                        <th> 发生金额</th>
-                        <th> 操作后金额</th>
-                        <th> 描述</th>
-                        <th> 发生时间</th>
+                        <th> {{ trans('common.account') }}</th>
+                        <th> {{ trans('model.order.id') }}</th>
+                        <th> {{ trans('model.user_credit.before') }}</th>
+                        <th> {{ trans('model.user_credit.amount') }}</th>
+                        <th> {{ trans('model.user_credit.after') }}</th>
+                        <th> {{ trans('validation.attributes.description') }}</th>
+                        <th> {{ trans('model.user_credit.created_at') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -56,7 +56,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$userCreditLogs->total()}}</code> 条记录
+                        {!! trans('admin.logs.counts', ['num' => $userCreditLogs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">

+ 67 - 67
resources/views/admin/logs/userMonitor.blade.php

@@ -3,22 +3,22 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">用户流量</h2>
+                <h2 class="panel-title">{{ trans('admin.monitor.user') }}</h2>
             </div>
             <div class="alert alert-info alert-dismissible">
                 <button class="close" data-dismiss="alert" aria-label="Close">
                     <span aria-hidden="true">&times;</span><span class="sr-only">{{trans('common.close')}}</span>
                 </button>
                 <h4 class="block">{{$username}}</h4>
-                <strong>提示:</strong> 如果无统计数据,请检查定时任务是否正常。
+                {!! trans('admin.monitor.hint') !!}
             </div>
             <div class="panel-body">
                 <div class="row">
                     <div class="col-md-6">
-                        <canvas id="dailyChart" aria-label="小时流量图" role="img"></canvas>
+                        <canvas id="dailyChart" aria-label="{{ trans('admin.monitor.daily_chart') }}" role="img"></canvas>
                     </div>
                     <div class="col-md-6">
-                        <canvas id="monthlyChart" aria-label="月流量图" role="img"></canvas>
+                        <canvas id="monthlyChart" aria-label="{{ trans('admin.monitor.monthly_chart') }}" role="img"></canvas>
                     </div>
                 </div>
             </div>
@@ -28,74 +28,74 @@
 @section('javascript')
     <script src="/assets/global/vendor/chart-js/chart.min.js"></script>
     <script>
-        function common_options(tail) {
-            return {
-                responsive: true,
-                scales: {
-                    x: {
-                        ticks: {
-                            callback: function(value) {
-                                return this.getLabelForValue(value) + tail;
-                            },
-                        },
-                        grid: {
-                            display: false,
-                        },
-                    },
-                    y: {
-                        ticks: {
-                            callback: function(value) {
-                                return this.getLabelForValue(value) + ' GB';
-                            },
-                        },
-                        grid: {
-                            display: false,
-                        },
-                        min: 0,
-                    },
+      function common_options(tail) {
+        return {
+          responsive: true,
+          scales: {
+            x: {
+              ticks: {
+                callback: function(value) {
+                  return this.getLabelForValue(value) + tail;
+                },
+              },
+              grid: {
+                display: false,
+              },
+            },
+            y: {
+              ticks: {
+                callback: function(value) {
+                  return this.getLabelForValue(value) + ' GB';
+                },
+              },
+              grid: {
+                display: false,
+              },
+              min: 0,
+            },
 
+          },
+          plugins: {
+            legend: false,
+            tooltip: {
+              mode: 'index',
+              intersect: false,
+              callbacks: {
+                title: function(context) {
+                  return context[0].label + tail;
                 },
-                plugins: {
-                    legend: false,
-                    tooltip: {
-                        mode: 'index',
-                        intersect: false,
-                        callbacks: {
-                            title: function(context) {
-                                return context[0].label + tail;
-                            },
-                            label: function(context) {
-                                return context.parsed.y + ' GB';
-                            },
-                        },
-                    },
+                label: function(context) {
+                  return context.parsed.y + ' GB';
                 },
-            };
-        }
+              },
+            },
+          },
+        };
+      }
 
-        function datasets(label, data) {
-            return {
-                labels: label,
-                datasets: [
-                    {
-                        backgroundColor: 'rgba(184, 215, 255)',
-                        borderColor: 'rgba(184, 215, 255)',
-                        data: data,
-                        tension: 0.4,
-                    }],
-            };
-        }
+      function datasets(label, data) {
+        return {
+          labels: label,
+          datasets: [
+            {
+              backgroundColor: 'rgba(184, 215, 255)',
+              borderColor: 'rgba(184, 215, 255)',
+              data: data,
+              tension: 0.4,
+            }],
+        };
+      }
 
-        new Chart(document.getElementById('dailyChart'), {
-            type: 'line',
-            data: datasets(@json($dayHours), @json($trafficHourly)),
-            options: common_options(' {{trans_choice('validation.attributes.hour', 2)}}'),
-        });
+      new Chart(document.getElementById('dailyChart'), {
+        type: 'line',
+        data: datasets(@json($dayHours), @json($trafficHourly)),
+        options: common_options(' {{trans_choice('validation.attributes.hour', 2)}}'),
+      });
 
-        new Chart(document.getElementById('monthlyChart'), {
-            type: 'line',
-            data: datasets(@json($monthDays), @json($trafficDaily)),
-            options: common_options(' {{trans_choice('validation.attributes.day', 2)}}'),
-        });
+      new Chart(document.getElementById('monthlyChart'), {
+        type: 'line',
+        data: datasets(@json($monthDays), @json($trafficDaily)),
+        options: common_options(' {{trans_choice('validation.attributes.day', 2)}}'),
+      });
     </script>
 @endsection

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

@@ -6,41 +6,41 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">用户在线IP列表
-                    <small>最近10分钟</small>
+                <h3 class="panel-title">
+                    {!! trans('admin.logs.user_ip.title') !!}
                 </h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-1 col-sm-4">
-                        <input type="number" class="form-control" name="id" value="{{Request::query('id')}}" placeholder="ID"/>
+                        <input type="number" class="form-control" name="id" value="{{Request::query('id')}}" placeholder="{{ trans('model.user.id') }}"/>
                     </div>
                     <div class="form-group col-lg-3 col-sm-8">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('common.account') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
-                        <input type="text" class="form-control" name="wechat" value="{{Request::query('wechat')}}" placeholder="微信"/>
+                        <input type="text" class="form-control" name="wechat" value="{{Request::query('wechat')}}" placeholder="{{ trans('model.user.wechat') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
-                        <input type="number" class="form-control" name="qq" value="{{Request::query('qq')}}" placeholder="QQ"/>
+                        <input type="number" class="form-control" name="qq" value="{{Request::query('qq')}}" placeholder="{{ trans('model.user.qq') }}"/>
                     </div>
                     <div class="form-group col-lg-1 col-sm-6">
-                        <input type="number" class="form-control" name="port" value="{{Request::query('port')}}" placeholder="端口"/>
+                        <input type="number" class="form-control" name="port" value="{{Request::query('port')}}" placeholder="{{ trans('model.user.port') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.log.ip')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.log.ip')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 用户账号</th>
-                        <th> 端口</th>
-                        <th> {{trans('common.status')}}</th>
-                        <th> 代理</th>
-                        <th> 连接IP</th>
+                        <th> {{ trans('common.account') }}</th>
+                        <th> {{ trans('model.user.port') }}</th>
+                        <th> {{ trans('model.user.account_status') }}</th>
+                        <th> {{ trans('model.user.proxy_status') }}</th>
+                        <th> {{ trans('admin.logs.user_ip.connect') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -51,18 +51,18 @@
                             <td> {{$user->port}} </td>
                             <td>
                                 @if ($user->status > 0)
-                                    <span class="badge badge-lg badge-success">正常</span>
+                                    <span class="badge badge-lg badge-success">{{ trans('common.status.normal') }}</span>
                                 @elseif ($user->status < 0)
-                                    <span class="badge badge-lg badge-danger">禁用</span>
+                                    <span class="badge badge-lg badge-danger">{{ trans('common.status.banned') }}</span>
                                 @else
-                                    <span class="badge badge-lg badge-default">未激活</span>
+                                    <span class="badge badge-lg badge-default">{{ trans('common.status.inactive') }}</span>
                                 @endif
                             </td>
                             <td>
                                 @if ($user->enable)
-                                    <span class="badge badge-lg badge-success">启用</span>
+                                    <span class="badge badge-lg badge-success">{{ trans('common.status.enabled') }}</span>
                                 @else
-                                    <span class="badge badge-lg badge-danger">禁用</span>
+                                    <span class="badge badge-lg badge-danger">{{ trans('common.status.banned') }}</span>
                                 @endif
                             </td>
                             <td>
@@ -70,16 +70,16 @@
                                     <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                                         <thead>
                                         <tr>
-                                            <th> 节点</th>
-                                            <th> 类型</th>
+                                            <th> {{ trans('model.node.attribute') }}</th>
+                                            <th> {{ trans('model.ip.network_type') }}</th>
                                             <th> IP</th>
-                                            <th> 时间</th>
+                                            <th> {{ trans('validation.attributes.time') }}</th>
                                         </tr>
                                         </thead>
                                         <tbody>
                                         @foreach($user->onlineIPList as $log)
                                             <tr>
-                                                <td>{{$log->node->name ?? '【节点已删除】'}}</td>
+                                                <td>{{$log->node->name ?? '【'.trans('common.deleted_item', ['attribute' => trans('model.node.attribute')]).'】'}}</td>
                                                 <td>{{$log->type}}</td>
                                                 <td>
                                                     <a href="https://www.ipip.net/ip/{{$log->ip}}.html" target="_blank">{{$log->ip}}</a>
@@ -99,7 +99,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$userList->total()}}</code> 个账号
+                        {!! trans('admin.logs.counts', ['num' => $userList->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">

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

@@ -6,28 +6,28 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">流量变动记录</h3>
+                <h3 class="panel-title">{{ trans('admin.logs.user_data_modify_title') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-4 col-sm-6">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('common.account') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.log.flow')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.log.flow')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 用户账号</th>
-                        <th> 订单</th>
-                        <th> 变动前流量</th>
-                        <th> 变动后流量</th>
-                        <th> 描述</th>
-                        <th> 发生时间</th>
+                        <th> {{ trans('common.account') }}</th>
+                        <th> {{ trans('model.order.attribute') }}</th>
+                        <th> {{ trans('model.user_data_modify.before') }}</th>
+                        <th> {{ trans('model.user_data_modify.after') }}</th>
+                        <th> {{ trans('validation.attributes.description') }}</th>
+                        <th> {{ trans('model.user_data_modify.created_at') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -50,7 +50,7 @@
                                             {{$log->order->goods->name}}
                                         @endcan
                                     @else
-                                        【订单已删除
+                                        【{{trans('common.deleted_item', ['attribute' => trans('model.order.attribute')])}}
                                     @endif
                                 @endif
                             </td>
@@ -66,7 +66,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$userTrafficLogs->total()}}</code> 条记录
+                        {!! trans('admin.logs.counts', ['num' => $userTrafficLogs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">

+ 21 - 21
resources/views/admin/marketing/emailList.blade.php

@@ -6,35 +6,35 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">邮件群发列表</h3>
+                <h3 class="panel-title">{{ trans('admin.marketing.email.title') }}</h3>
                 <div class="panel-actions">
-                    <button class="btn btn-primary" onclick="send()"><i class="icon wb-envelope"></i>群发邮件</button>
+                    <button class="btn btn-primary" onclick="send()"><i class="icon wb-envelope"></i>{{ trans('admin.marketing.email.group_send') }}</button>
                 </div>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-3 col-sm-6">
                         <select class="form-control" name="status" id="status" onchange="this.form.submit()">
-                            <option value="" hidden>状态</option>
-                            <option value="0">待发送</option>
-                            <option value="-1">失败</option>
-                            <option value="1">成功</option>
+                            <option value="" hidden>{{ trans('common.status.attribute') }}</option>
+                            <option value="0">{{ trans('common.to_be_send') }}</option>
+                            <option value="-1">{{ trans('common.failed') }}</option>
+                            <option value="1">{{ trans('common.success') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-3 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.marketing.email')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.marketing.email')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 消息标题</th>
-                        <th> 消息内容</th>
-                        <th> 发送状态</th>
-                        <th> 发送时间</th>
-                        <th> 错误信息</th>
+                        <th> {{ trans('validation.attributes.title') }}</th>
+                        <th> {{ trans('validation.attributes.content') }}</th>
+                        <th> {{ trans('admin.marketing.send_status') }}</th>
+                        <th> {{ trans('admin.marketing.send_time') }}</th>
+                        <th> {{ trans('admin.marketing.error_message') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -54,7 +54,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$emails->total()}}</code> 条消息
+                        {!! trans('admin.marketing.email.counts', ['num' => $emails->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -70,13 +70,13 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#status').val({{Request::query('status')}});
-        });
+      $(document).ready(function() {
+        $('#status').val({{Request::query('status')}});
+      });
 
-        // 发送邮件
-        function send() {
-            swal.fire(@json(trans('common.sorry')), '开发中!敬请期待', 'info');
-        }
+      // 发送邮件
+      function send() {
+        swal.fire(@json(trans('common.sorry')), '{{ trans('common.developing') }}', 'info');
+      }
     </script>
 @endsection

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

@@ -7,10 +7,11 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">推送消息列表</h3>
+                <h3 class="panel-title">{{ trans('admin.marketing.push.title') }}</h3>
                 @can('admin.marketing.add')
                     <div class="panel-actions">
-                        <button type="button" class="btn btn-primary disabled" data-toggle="modal" data-target="#send_modal"><i class="icon wb-plus"></i>推送消息</button>
+                        <button type="button" class="btn btn-primary disabled" data-toggle="modal" data-target="#send_modal"><i
+                                    class="icon wb-plus"></i>{{ trans('admin.marketing.push.send') }}</button>
                     </div>
                 @endcan
             </div>
@@ -18,31 +19,31 @@
                 <form class="form-row">
                     <div class="form-group col-lg-3 col-sm-6">
                         <select class="form-control" name="status" id="status">
-                            <option value="" hidden>状态</option>
-                            <option value="0">待发送</option>
-                            <option value="-1">失败</option>
-                            <option value="1">成功</option>
+                            <option value="" hidden>{{ trans('common.status.attribute') }}</option>
+                            <option value="0">{{ trans('common.to_be_send') }}</option>
+                            <option value="-1">{{ trans('common.failed') }}</option>
+                            <option value="1">{{ trans('common.success') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.marketing.push')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.marketing.push')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
-{{--                <div class="alert alert-info alert-dismissible" role="alert">--}}
-{{--                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">--}}
-{{--                        <span aria-hidden="true">×</span></button>--}}
-{{--                    仅会推送给关注了您的消息通道的用户 @can('admin.system.index')<a href="{{route('admin.system.index')}}" class="alert-link" target="_blank">设置PushBear</a> @else 设置PushBear @endcan--}}
-{{--                </div>--}}
+                {{--                <div class="alert alert-info alert-dismissible" role="alert">--}}
+                {{--                    <button type="button" class="close" data-dismiss="alert" aria-label="Close">--}}
+                {{--                        <span aria-hidden="true">×</span></button>--}}
+                {{--                    仅会推送给关注了您的消息通道的用户 @can('admin.system.index')<a href="{{route('admin.system.index')}}" class="alert-link" target="_blank">设置PushBear</a> @else 设置PushBear @endcan--}}
+                {{--                </div>--}}
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 消息标题</th>
-                        <th> 消息内容</th>
-                        <th> 推送状态</th>
-                        <th> 推送时间</th>
-                        <th> 错误信息</th>
+                        <th> {{ trans('validation.attributes.title') }}</th>
+                        <th> {{ trans('validation.attributes.content') }}</th>
+                        <th> {{ trans('admin.marketing.send_status') }}</th>
+                        <th> {{ trans('admin.marketing.send_time') }}</th>
+                        <th> {{ trans('admin.marketing.error_message') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -62,7 +63,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$pushes->total()}}</code> 条推送消息
+                        {!! trans('admin.marketing.push.counts', ['num' => $pushes->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -84,7 +85,7 @@
                         <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                             <span aria-hidden="true">×</span>
                         </button>
-                        <h4 class="modal-title">推送消息</h4>
+                        <h4 class="modal-title">{{ trans('admin.marketing.push.send') }}</h4>
                     </div>
                     <div class="modal-body">
                         <div class="alert alert-danger" style="display: none;" id="msg"></div>
@@ -92,7 +93,7 @@
                             <div class="form-body">
                                 <div class="form-group">
                                     <div class="row">
-                                        <label for="title" class="col-md-2 control-label"> 标题 </label>
+                                        <label for="title" class="col-md-2 control-label"> {{ trans('validation.attributes.title') }} </label>
                                         <div class="col-md-6">
                                             <input type="text" class="form-control" name="title" id="title"/>
                                         </div>
@@ -100,7 +101,7 @@
                                 </div>
                                 <div class="form-group">
                                     <div class="row">
-                                        <label for="content" class="col-md-2 control-label"> 内容 </label>
+                                        <label for="content" class="col-md-2 control-label"> {{ trans('validation.attributes.content') }} </label>
                                         <div class="col-md-9">
                                             <textarea class="form-control" rows="10" name="content" id="content" data-provide="markdown" data-iconlibrary="fa"></textarea>
                                         </div>
@@ -110,8 +111,8 @@
                         </form>
                     </div>
                     <div class="modal-footer">
-                        <button class="btn btn-danger mr-auto" data-dismiss="modal">取消</button>
-                        <button type="button" class="btn btn-primary disabled" onclick="return send();">推送</button>
+                        <button class="btn btn-danger mr-auto" data-dismiss="modal">{{ trans('common.cancel') }}</button>
+                        <button type="button" class="btn btn-primary disabled" onclick="return send();">{{ trans('common.send') }}</button>
                     </div>
                 </div>
             </div>
@@ -124,49 +125,47 @@
     <script src="/assets/global/vendor/bootstrap-markdown/bootstrap-markdown.min.js"></script>
     <script src="/assets/global/vendor/marked/marked.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#status').val({{Request::query('status')}});
-        });
-
-        @can('admin.marketing.add')
-        // 发送通道消息
-        function send() {
-            const title = $('#title').val();
-
-            if (title.trim() === '') {
-                $('#msg').show().html('标题不能为空');
-                title.focus();
-                return false;
-            }
+      $(document).ready(function() {
+        $('#status').val({{Request::query('status')}});
+      });
 
-            $.ajax({
-                url: '{{route('admin.marketing.add')}}',
-                method: 'POST',
-                data: {_token: '{{csrf_token()}}', title: title, content: $('#content').val()},
-                beforeSend: function() {
-                    $('#msg').show().html('正在添加...');
-                },
-                success: function(ret) {
-                    if (ret.status === 'fail') {
-                        $('#msg').show().html(ret.message);
-                        return false;
-                    }
+      @can('admin.marketing.add')
+      // 发送通道消息
+      function send() {
+        const title = $('#title').val();
 
-                    $('#send_modal').modal('hide');
-
-                },
-                error: function() {
-                    $('#msg').show().html('请求错误,请重试');
-                },
-                complete: function() {
-                },
-            });
+        if (title.trim() === '') {
+          $('#msg').show().html('{{ trans('validation.filled', ['attribute' => trans('validation.attributes.title')]) }}');
+          title.focus();
+          return false;
         }
 
-        // 关闭modal触发
-        $('#send_modal').on('hide.bs.modal', function() {
-            window.location.reload();
+        $.ajax({
+          url: '{{route('admin.marketing.add')}}',
+          method: 'POST',
+          data: {_token: '{{csrf_token()}}', title: title, content: $('#content').val()},
+          beforeSend: function() {
+            $('#msg').show().html('{{ trans('admin.creating') }}');
+          },
+          success: function(ret) {
+            if (ret.status === 'fail') {
+              $('#msg').show().html(ret.message);
+              return false;
+            }
+            $('#send_modal').modal('hide');
+          },
+          error: function() {
+            $('#msg').show().html('{{ trans('common.request_failed') }}');
+          },
+          complete: function() {
+          },
         });
+      }
+
+      // 关闭modal触发
+      $('#send_modal').on('hide.bs.modal', function() {
+        window.location.reload();
+      });
         @endcan
     </script>
 @endsection

+ 125 - 124
resources/views/admin/node/auth.blade.php

@@ -6,11 +6,11 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">节点授权列表<small>WEBAPI</small></h2>
+                <h2 class="panel-title">{!! trans('admin.node.auth.title') !!}</h2>
                 @can('admin.node.auth.store')
                     <div class="panel-actions">
                         <button class="btn btn-primary" onclick="addAuth()">
-                            <i class="icon wb-plus" aria-hidden="true"></i>生成授权
+                            <i class="icon wb-plus" aria-hidden="true"></i> {{ trans('common.add') }}
                         </button>
                     </div>
                 @endcan
@@ -19,13 +19,13 @@
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
-                        <th> 节点ID</th>
-                        <th> 节点类型</th>
-                        <th> 节点名称</th>
-                        <th> 节点域名</th>
-                        <th> IPv4</th>
-                        <th> 通信密钥<small>节点用</small></th>
-                        <th> 反向通信密钥</th>
+                        <th> {{ trans('model.node.id') }}</th>
+                        <th> {{ trans('model.node.type') }}</th>
+                        <th> {{ trans('model.node.name') }}</th>
+                        <th> {{ trans('model.node.domain') }}</th>
+                        <th> {{ trans('model.node.ipv4') }}</th>
+                        <th> {!! trans('model.node_auth.key') !!}</th>
+                        <th> {{ trans('model.node_auth.secret') }}</th>
                         <th> {{trans('common.action')}}</th>
                     </tr>
                     </thead>
@@ -42,16 +42,16 @@
                             <td>
                                 <div class="btn-group">
                                     <button data-target="#install_{{$auth->node->type}}_{{$auth->id}}" data-toggle="modal" class="btn btn-primary">
-                                        <i class="icon wb-code" aria-hidden="true"></i>部署后端
+                                        <i class="icon wb-code" aria-hidden="true"></i> {{ trans('admin.node.auth.deploy.attribute') }}
                                     </button>
                                     @can('admin.node.auth.update')
                                         <button onclick="refreshAuth('{{$auth->id}}')" class="btn btn-danger">
-                                            <i class="icon wb-reload" aria-hidden="true"></i> 重置密钥
+                                            <i class="icon wb-reload" aria-hidden="true"></i> {{ trans('admin.node.auth.reset_auth') }}
                                         </button>
                                     @endcan
                                     @can('admin.node.auth.destroy')
                                         <button onclick="deleteAuth('{{$auth->id}}')" class="btn btn-primary">
-                                            <i class="icon wb-trash" aria-hidden="true"></i> 删除
+                                            <i class="icon wb-trash" aria-hidden="true"></i> {{ trans('common.delete') }}
                                         </button>
                                     @endcan
                                 </div>
@@ -64,11 +64,11 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$authorizations->total()}}</code> 条授权
+                        {!! trans('admin.node.auth.counts', ['num' => $authorizations->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
-                            {{$authorizations->links()}}
+                            {{ $authorizations->links() }}
                         </nav>
                     </div>
                 </div>
@@ -85,7 +85,7 @@
                             <span aria-hidden="true">×</span>
                         </button>
                         <h4 class="modal-title">
-                            部署 {{$auth->node->type_label}} 后端
+                            {{ trans('admin.node.auth.deploy.title', ['type_label' => $auth->node->type_label]) }}
                         </h4>
                     </div>
                     <div class="modal-body">
@@ -100,20 +100,20 @@
                                 bash
                                 <br>
                                 <br>
-                                <div class="text-center red-700 mb-5">操作命令</div>
-                                更新:同上
+                                <div class="text-center red-700 mb-5">{{ trans('admin.node.auth.deploy.command') }}</div>
+                                {{ trans('admin.node.auth.deploy.update') }}{{ trans('admin.node.auth.deploy.same') }}
                                 <br>
-                                卸载:curl -L -s https://bit.ly/3oO3HZy | bash -s -- --remove
+                                {{ trans('admin.node.auth.deploy.uninstall') }}curl -L -s https://bit.ly/3oO3HZy | bash -s -- --remove
                                 <br>
-                                启动:systemctl start vnet-v2ray
+                                {{ trans('admin.node.auth.deploy.start') }}systemctl start vnet-v2ray
                                 <br>
-                                停止:systemctl stop vnet-v2ray
+                                {{ trans('admin.node.auth.deploy.stop') }}systemctl stop vnet-v2ray
                                 <br>
-                                状态:systemctl status vnet-v2ray
+                                {{ trans('admin.node.auth.deploy.status') }}systemctl status vnet-v2ray
                                 <br>
-                                近期日志:journalctl -x -n 300 --no-pager -u vnet-v2ray
+                                {{ trans('admin.node.auth.deploy.recent_logs') }}journalctl -x -n 300 --no-pager -u vnet-v2ray
                                 <br>
-                                实时日志:journalctl -u vnet-v2ray -f
+                                {{ trans('admin.node.auth.deploy.real_time_logs') }}journalctl -u vnet-v2ray -f
                             </div>
                             <div class="alert alert-info text-break">
                                 <div class="text-center red-700 mb-5">V2Ray-Poseidon</div>
@@ -125,24 +125,25 @@
                                 bash
                                 <br>
                                 <br>
-                                <div class="text-center red-700 mb-5">操作命令</div>
-                                更新:curl -L -s https://bit.ly/2HswWko | bash
+                                <div class="text-center red-700 mb-5">{{ trans('admin.node.auth.deploy.command') }}</div>
+                                {{ trans('admin.node.auth.deploy.update') }}curl -L -s https://bit.ly/2HswWko | bash
                                 <br>
-                                卸载:curl -L -s http://mrw.so/5IHPR4 | bash
+                                {{ trans('admin.node.auth.deploy.uninstall') }}curl -L -s http://mrw.so/5IHPR4 | bash
                                 <br>
-                                启动:systemctl start v2ray
+                                {{ trans('admin.node.auth.deploy.start') }}systemctl start v2ray
                                 <br>
-                                停止:systemctl stop v2ray
+                                {{ trans('admin.node.auth.deploy.stop') }}systemctl stop v2ray
                                 <br>
-                                状态:systemctl status v2ray
+                                {{ trans('admin.node.auth.deploy.status') }}systemctl status v2ray
                                 <br>
-                                近期日志:journalctl -x -n 300 --no-pager -u v2ray
+                                {{ trans('admin.node.auth.deploy.recent_logs') }}journalctl -x -n 300 --no-pager -u v2ray
                                 <br>
-                                实时日志:journalctl -u v2ray -f
+                                {{ trans('admin.node.auth.deploy.real_time_logs') }}journalctl -u v2ray -f
                             </div>
                         @elseif($auth->node->type === 3)
                             @if(!$auth->node->server)
-                                <h3>请先<a href="{{route('admin.node.edit', $auth->node)}}" target="_blank">填写节点域名</a>并将域名解析到节点对应的IP上
+                                <h3>
+                                    {!! trans('admin.node.auth.deploy.trojan_hint', ['url' => route('admin.node.edit', $auth->node)]) !!}
                                 </h3>
                             @else
                                 <div class="alert alert-info text-break">
@@ -156,20 +157,20 @@
                                     bash
                                     <br>
                                     <br>
-                                    <div class="text-center red-700 mb-5">操作命令</div>
-                                    更新:curl -L -s http://mrw.so/6cMfGy | bash
+                                    <div class="text-center red-700 mb-5">{{ trans('admin.node.auth.deploy.command') }}</div>
+                                    {{ trans('admin.node.auth.deploy.update') }}curl -L -s http://mrw.so/6cMfGy | bash
                                     <br>
-                                    卸载:curl -L -s http://mrw.so/5ulpvu | bash
+                                    {{ trans('admin.node.auth.deploy.uninstall') }}curl -L -s http://mrw.so/5ulpvu | bash
                                     <br>
-                                    启动:systemctl start trojanp
+                                    {{ trans('admin.node.auth.deploy.start') }}systemctl start trojanp
                                     <br>
-                                    停止:systemctl stop trojanp
+                                    {{ trans('admin.node.auth.deploy.stop') }}systemctl stop trojanp
                                     <br>
-                                    状态:systemctl status trojanp
+                                    {{ trans('admin.node.auth.deploy.status') }}systemctl status trojanp
                                     <br>
-                                    近期日志:journalctl -x -n 300 --no-pager -u trojanp
+                                    {{ trans('admin.node.auth.deploy.recent_logs') }}journalctl -x -n 300 --no-pager -u trojanp
                                     <br>
-                                    实时日志:journalctl -u trojanp -f
+                                    {{ trans('admin.node.auth.deploy.real_time_logs') }}journalctl -u trojanp -f
                                 </div>
                             @endif
                         @else
@@ -183,22 +184,22 @@
                                 bash
                                 <br>
                                 <br>
-                                <div class="text-center red-700 mb-5">操作命令</div>
-                                更新:同上
+                                <div class="text-center red-700 mb-5">{{ trans('admin.node.auth.deploy.command') }}</div>
+                                {{ trans('admin.node.auth.deploy.update') }}{{ trans('admin.node.auth.deploy.same') }}
                                 <br>
-                                卸载:curl -L -s https://bit.ly/3828OP1 | bash -s -- --remove
+                                {{ trans('admin.node.auth.deploy.uninstall') }}curl -L -s https://bit.ly/3828OP1 | bash -s -- --remove
                                 <br>
-                                启动:systemctl start vnet
+                                {{ trans('admin.node.auth.deploy.start') }}systemctl start vnet
                                 <br>
-                                停止:systemctl stop vnet
+                                {{ trans('admin.node.auth.deploy.stop') }}systemctl stop vnet
                                 <br>
-                                重启:systemctl restart vnet
+                                {{ trans('admin.node.auth.deploy.restart') }}systemctl restart vnet
                                 <br>
-                                状态:systemctl status vnet
+                                {{ trans('admin.node.auth.deploy.status') }}systemctl status vnet
                                 <br>
-                                近期日志:journalctl -x -n 300 --no-pager -u vnet
+                                {{ trans('admin.node.auth.deploy.recent_logs') }}journalctl -x -n 300 --no-pager -u vnet
                                 <br>
-                                实时日志:journalctl -u vnet -f
+                                {{ trans('admin.node.auth.deploy.real_time_logs') }}journalctl -u vnet -f
                             </div>
                         @endif
                     </div>
@@ -212,88 +213,88 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        // 生成授权KEY
-        @can('admin.node.auth.store')
-        function addAuth() {
-            swal.fire({
-                title: '提示',
-                text: '确定生成所有节点的授权吗?',
-                icon: 'info',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.post('{{route('admin.node.auth.store')}}', {_token: '{{csrf_token()}}'}, function(ret) {
-                        if (ret.status === 'success') {
-                            swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                        } else {
-                            swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                        }
-                    });
-                }
+      // 生成授权KEY
+      @can('admin.node.auth.store')
+      function addAuth() {
+        swal.fire({
+          title: '{{ trans('admin.hint') }}',
+          text: '{{ trans('admin.node.auth.generating_all') }}',
+          icon: 'info',
+          showCancelButton: true,
+          cancelButtonText: '{{ trans('common.close') }}',
+          confirmButtonText: '{{ trans('common.confirm') }}',
+        }).then((result) => {
+          if (result.value) {
+            $.post('{{route('admin.node.auth.store')}}', {_token: '{{csrf_token()}}'}, function(ret) {
+              if (ret.status === 'success') {
+                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+              } else {
+                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+              }
             });
-        }
-        @endcan
+          }
+        });
+      }
+      @endcan
 
-        @can('admin.node.auth.destroy')
-        // 删除授权
-        function deleteAuth(id) {
-            swal.fire({
-                title: '提示',
-                text: '确定删除该授权吗?',
-                icon: 'info',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'DELETE',
-                        url: '{{route('admin.node.auth.destroy', '')}}/' + id,
-                        data: {_token: '{{csrf_token()}}'},
-                        dataType: 'json',
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                            } else {
-                                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                            }
-                        },
-                    });
+      @can('admin.node.auth.destroy')
+      // 删除授权
+      function deleteAuth(id) {
+        swal.fire({
+          title: '{{ trans('admin.hint') }}',
+          text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node_auth.attribute')]) }}' + id + '{{ trans('admin.confirm.delete.1') }}',
+          icon: 'info',
+          showCancelButton: true,
+          cancelButtonText: '{{trans('common.close')}}',
+          confirmButtonText: '{{trans('common.confirm')}}',
+        }).then((result) => {
+          if (result.value) {
+            $.ajax({
+              method: 'DELETE',
+              url: '{{route('admin.node.auth.destroy', '')}}/' + id,
+              data: {_token: '{{csrf_token()}}'},
+              dataType: 'json',
+              success: function(ret) {
+                if (ret.status === 'success') {
+                  swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                } else {
+                  swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
                 }
+              },
             });
-        }
-        @endcan
+          }
+        });
+      }
+      @endcan
 
-        @can('admin.node.auth.update')
-        // 重置授权认证KEY
-        function refreshAuth(id) {
-            swal.fire({
-                title: '提示',
-                text: '确定继续操作吗?',
-                icon: 'info',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'PUT',
-                        url: '{{route('admin.node.auth.update', '')}}/' + id,
-                        data: {_token: '{{csrf_token()}}'},
-                        dataType: 'json',
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                            } else {
-                                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                            }
-                        },
-                    });
+      @can('admin.node.auth.update')
+      // 重置授权认证KEY
+      function refreshAuth(id) {
+        swal.fire({
+          title: '{{ trans('admin.hint') }}',
+          text: '{{ trans('admin.confirm.continues') }}',
+          icon: 'info',
+          showCancelButton: true,
+          cancelButtonText: '{{trans('common.close')}}',
+          confirmButtonText: '{{trans('common.confirm')}}',
+        }).then((result) => {
+          if (result.value) {
+            $.ajax({
+              method: 'PUT',
+              url: '{{route('admin.node.auth.update', '')}}/' + id,
+              data: {_token: '{{csrf_token()}}'},
+              dataType: 'json',
+              success: function(ret) {
+                if (ret.status === 'success') {
+                  swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                } else {
+                  swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
                 }
+              },
             });
-        }
+          }
+        });
+      }
         @endcan
     </script>
 @endsection

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

@@ -6,11 +6,11 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">域名证书列表<small>(V2Ray节点的伪装域名)</small></h2>
+                <h2 class="panel-title">{!! trans('admin.node.cert.title') !!}</h2>
                 @can('admin.node.cert.create')
                     <div class="panel-actions">
                         <a href="{{route('admin.node.cert.create')}}" class="btn btn-primary">
-                            <i class="icon wb-plus" aria-hidden="true"></i>添加域名证书
+                            <i class="icon wb-plus" aria-hidden="true"></i> {{ trans('common.add') }}
                         </a>
                     </div>
                 @endcan
@@ -20,13 +20,13 @@
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 域名</th>
-                        <th> KEY</th>
-                        <th> PEM</th>
-                        <th> 签发机构</th>
-                        <th> 签发日期</th>
-                        <th> 到期时间</th>
-                        <th> {{trans('common.action')}}</th>
+                        <th> {{ trans('model.node_cert.domain') }}</th>
+                        <th> {{ trans('model.node_cert.key') }}</th>
+                        <th> {{ trans('model.node_cert.pem') }}</th>
+                        <th> {{ trans('model.node_cert.issuer') }}</th>
+                        <th> {{ trans('model.node_cert.signed_date') }}</th>
+                        <th> {{ trans('model.node_cert.expired_date') }}</th>
+                        <th> {{ trans('common.action') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -63,7 +63,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$certs->total()}}</code> 个域名证书
+                        {!! trans('admin.node.cert.counts', ['num' => $certs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -80,33 +80,33 @@
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     @can('admin.node.cert.destroy')
         <script>
-            // 删除授权
-            function delCertificate(id) {
-                swal.fire({
-                    title: '提示',
-                    text: '确定删除该证书吗?',
-                    icon: 'info',
-                    showCancelButton: true,
-                    cancelButtonText: '{{trans('common.close')}}',
-                    confirmButtonText: '{{trans('common.confirm')}}',
-                }).then((result) => {
-                    if (result.value) {
-                        $.ajax({
-                            method: 'DELETE',
-                            url: '{{route('admin.node.cert.destroy', '')}}/' + id,
-                            data: {_token: '{{csrf_token()}}'},
-                            dataType: 'json',
-                            success: function(ret) {
-                                if (ret.status === 'success') {
-                                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                                } else {
-                                    swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                                }
-                            },
-                        });
+          // 删除授权
+          function delCertificate(id) {
+            swal.fire({
+              title: '{{ trans('admin.hint') }}',
+              text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node_cert.attribute')]) }}' + id + '{{ trans('admin.confirm.delete.1') }}',
+              icon: 'info',
+              showCancelButton: true,
+              cancelButtonText: '{{ trans('common.close') }}',
+              confirmButtonText: '{{ trans('common.confirm') }}',
+            }).then((result) => {
+              if (result.value) {
+                $.ajax({
+                  method: 'DELETE',
+                  url: '{{route('admin.node.cert.destroy', '')}}/' + id,
+                  data: {_token: '{{csrf_token()}}'},
+                  dataType: 'json',
+                  success: function(ret) {
+                    if (ret.status === 'success') {
+                      swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                    } else {
+                      swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
                     }
+                  },
                 });
-            }
+              }
+            });
+          }
         </script>
     @endcan
 @endsection

+ 23 - 19
resources/views/admin/node/cert/info.blade.php

@@ -3,9 +3,11 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">@isset($cert) 编辑 @else 添加 @endisset域名证书</h2>
+                <h2 class="panel-title">
+                    {{ isset($cert) ? trans('admin.action.edit_item', ['attribute' => trans('model.node_cert.attribute')]) : trans('admin.action.add_item', ['attribute' => trans('model.node_cert.attribute')]) }}
+                </h2>
                 <div class="panel-actions">
-                    <a href="{{route('admin.node.cert.index')}}" class="btn btn-danger">返 回</a>
+                    <a href="{{route('admin.node.cert.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
                 </div>
             </div>
             @if (Session::has('successMsg'))
@@ -17,30 +19,32 @@
             <div class="panel-body">
                 <form action="@isset($cert) {{route('admin.node.cert.update', $cert)}} @else {{route('admin.node.cert.store')}} @endisset"
                       method="POST" enctype="multipart/form-data" class="form-horizontal">
-                    @isset($cert)@method('PUT')@endisset
+                    @isset($cert)
+                        @method('PUT')
+                    @endisset
                     @csrf
                     <div class="form-group row">
-                        <label for="domain" class="col-md-3 col-form-label">域名</label>
+                        <label for="domain" class="col-md-3 col-form-label">{{ trans('model.node_cert.domain') }}</label>
                         <div class="col-md-9">
                             <input type="text" class="form-control" name="domain" id="domain" required>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label for="key" class="col-md-3 col-form-label">Key</label>
+                        <label for="key" class="col-md-3 col-form-label">{{ trans('model.node_cert.key') }}</label>
                         <div class="col-md-9">
                             <textarea type="text" rows="10" class="form-control" name="key" id="key"
-                                      placeholder="域名证书的KEY值,允许为空,VNET-V2Ray后端支持自动签证书"></textarea>
+                                      placeholder="{{ trans('admin.node.cert.key_placeholder') }}"></textarea>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label for="pem" class="col-md-3 col-form-label">Pem</label>
+                        <label for="pem" class="col-md-3 col-form-label">{{ trans('model.node_cert.pem') }}</label>
                         <div class="col-md-9">
                             <textarea type="text" rows="10" class="form-control" name="pem" id="pem"
-                                      placeholder="域名证书的PEM值,允许为空,VNET-V2Ray后端支持自动签证书"></textarea>
+                                      placeholder="{{ trans('admin.node.cert.pem_placeholder') }}"></textarea>
                         </div>
                     </div>
                     <div class="form-actions">
-                        <button type="submit" class="btn btn-success">提 交</button>
+                        <button type="submit" class="btn btn-success">{{ trans('common.submit') }}</button>
                     </div>
                 </form>
             </div>
@@ -49,15 +53,15 @@
 @endsection
 @section('javascript')
     <script>
-        $(document).ready(function() {
-            $('#domain').val(@json(old('domain')));
-            $('#key').val(@json(old('key')));
-            $('#pem').val(@json(old('pem')));
-            @isset($cert)
-            $('#domain').val(@json(old('domain') ?? $cert->domain));
-            $('#key').val(@json(old('key') ?? $cert->key));
-            $('#pem').val(@json(old('pem') ?? $cert->pem));
-            @endisset
-        });
+      $(document).ready(function() {
+        $('#domain').val(@json(old('domain')));
+        $('#key').val(@json(old('key')));
+        $('#pem').val(@json(old('pem')));
+          @isset($cert)
+          $('#domain').val(@json(old('domain') ?? $cert->domain));
+        $('#key').val(@json(old('key') ?? $cert->key));
+        $('#pem').val(@json(old('pem') ?? $cert->pem));
+          @endisset
+      });
     </script>
 @endsection

+ 150 - 150
resources/views/admin/node/index.blade.php

@@ -15,23 +15,23 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">节点列表</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.node.list') }}</h3>
                 @canany(['admin.node.geo', 'admin.node.create'])
                     <div class="panel-actions btn-group">
                         @can('admin.node.reload')
                             @if($nodeList->where('type',4)->count())
                                 <button type="button" onclick="reload(0)" class="btn btn-info">
-                                    <i id="reload_0" class="icon wb-reload" aria-hidden="true"></i> 重载【全部】后端
+                                    <i id="reload_0" class="icon wb-reload" aria-hidden="true"></i> {{ trans('admin.node.reload_all') }}
                                 </button>
                             @endif
                         @endcan
                         @can('admin.node.geo')
                             <button type="button" onclick="refreshGeo(0)" class="btn btn-outline-default">
-                                <i id="geo_0" class="icon wb-map" aria-hidden="true"></i> 刷新【全部】节点地理信息
+                                <i id="geo_0" class="icon wb-map" aria-hidden="true"></i> {{ trans('admin.node.refresh_geo_all') }}
                             </button>
                         @endcan
                         @can('admin.node.create')
-                            <a href="{{route('admin.node.create')}}" class="btn btn-primary"><i class="icon wb-plus"></i> 添加节点</a>
+                            <a href="{{route('admin.node.create')}}" class="btn btn-primary"><i class="icon wb-plus"></i> {{ trans('common.add') }}</a>
                         @endcan
                     </div>
                 @endcan
@@ -41,17 +41,17 @@
                     <thead class="thead-default">
                     <tr>
                         <th> ID</th>
-                        <th> 类型</th>
-                        <th> 名称</th>
-                        <th> 域名</th>
+                        <th> {{ trans('model.node.type') }}</th>
+                        <th> {{ trans('model.node.name') }}</th>
+                        <th> {{ trans('model.node.domain') }}</th>
                         <th> IP</th>
-                        <th> 存活</th>
-                        <th> 在线</th>
-                        <th> 产生流量</th>
-                        <th> 流量比例</th>
-                        <th> 扩展</th>
-                        <th> {{trans('common.status')}}</th>
-                        <th> {{trans('common.action')}}</th>
+                        <th> {{ trans('model.node.static') }}</th>
+                        <th> {{ trans('model.node.online_user') }}</th>
+                        <th> {{ trans('model.node.data_consume') }}</th>
+                        <th> {{ trans('model.node.data_rate') }}</th>
+                        <th> {{ trans('model.common.extend') }}</th>
+                        <th> {{ trans('common.status.attribute') }}</th>
+                        <th> {{ trans('common.action') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -61,7 +61,7 @@
                             <td> {{$node->type_label}} </td>
                             <td> {{$node->name}} </td>
                             <td> {{$node->server}} </td>
-                            <td> {{$node->is_ddns ? 'DDNS' : $node->ip}} </td>
+                            <td> {{$node->is_ddns ? trans('model.node.ddns') : $node->ip}} </td>
                             <td> {{$node->uptime ?: '-'}} </td>
                             <td> {{$node->online_users ?: '-'}} </td>
                             <td> {{$node->transfer}} </td>
@@ -106,45 +106,45 @@
                                     <div class="dropdown-menu" role="menu">
                                         @can('admin.node.edit')
                                             <a class="dropdown-item" href="{{route('admin.node.edit', [$node->id, 'page' => Request::query('page', 1)])}}" role="menuitem">
-                                                <i class="icon wb-edit" aria-hidden="true"></i> 编辑
+                                                <i class="icon wb-edit" aria-hidden="true"></i> {{ trans('common.edit') }}
                                             </a>
                                         @endcan
                                         @can('admin.node.clone')
                                             <a class="dropdown-item" href="{{route('admin.node.clone', $node)}}" role="menuitem">
-                                                <i class="icon wb-copy" aria-hidden="true"></i> 克隆
+                                                <i class="icon wb-copy" aria-hidden="true"></i> {{ trans('admin.clone') }}
                                             </a>
                                         @endcan
                                         @can('admin.node.destroy')
                                             <a class="dropdown-item red-700" href="javascript:delNode('{{$node->id}}', '{{$node->name}}')" role="menuitem">
-                                                <i class="icon wb-trash" aria-hidden="true"></i> 删除
+                                                <i class="icon wb-trash" aria-hidden="true"></i> {{ trans('common.delete') }}
                                             </a>
                                         @endcan
                                         @can('admin.node.monitor')
                                             <a class="dropdown-item" href="{{route('admin.node.monitor', $node)}}" role="menuitem">
-                                                <i class="icon wb-stats-bars" aria-hidden="true"></i> 流量统计
+                                                <i class="icon wb-stats-bars" aria-hidden="true"></i> {{ trans('admin.node.traffic_monitor') }}
                                             </a>
                                         @endcan
                                         <hr/>
                                         @can('admin.node.geo')
                                             <a class="dropdown-item" href="javascript:refreshGeo('{{$node->id}}')" role="menuitem">
-                                                <i id="geo{{$node->id}}" class="icon wb-map" aria-hidden="true"></i> 刷新地理
+                                                <i id="geo{{$node->id}}" class="icon wb-map" aria-hidden="true"></i> {{ trans('admin.node.refresh_geo') }}
                                             </a>
                                         @endcan
                                         @can('admin.node.ping')
                                             <a class="dropdown-item" href="javascript:pingNode('{{$node->id}}')" role="menuitem">
-                                                <i id="ping_{{$node->id}}" class="icon wb-order" aria-hidden="true"></i> 检测延迟
+                                                <i id="ping_{{$node->id}}" class="icon wb-order" aria-hidden="true"></i> {{ trans('admin.node.ping') }}
                                             </a>
                                         @endcan
                                         @can('admin.node.check')
                                             <a class="dropdown-item" href="javascript:checkNode('{{$node->id}}')" role="menuitem">
-                                                <i id="node_{{$node->id}}" class="icon wb-signal" aria-hidden="true"></i> 连通性检测
+                                                <i id="node_{{$node->id}}" class="icon wb-signal" aria-hidden="true"></i> {{ trans('admin.node.connection_test') }}
                                             </a>
                                         @endcan
                                         @if($node->type === 4)
                                             @can('admin.node.reload')
                                                 <hr/>
                                                 <a class="dropdown-item" href="javascript:reload('{{$node->id}}')" role="menuitem">
-                                                    <i id="reload_{{$node->id}}" class="icon wb-reload" aria-hidden="true"></i> 重载后端
+                                                    <i id="reload_{{$node->id}}" class="icon wb-reload" aria-hidden="true"></i> {{ trans('admin.node.reload') }}
                                                 </a>
                                             @endcan
                                         @endif
@@ -156,10 +156,10 @@
                             @foreach($node->childNodes as $childNode)
                                 <tr class="bg-blue-grey-200 grey-700 table-borderless frontlin">
                                     <td></td>
-                                    <td><i class="float-left fa-solid fa-right-left" aria-hidden="true"></i> <strong>中 转</strong></td>
+                                    <td><i class="float-left fa-solid fa-right-left" aria-hidden="true"></i> <strong>{{ trans('model.node.transfer') }}</strong></td>
                                     <td> {{ $childNode->name }} </td>
                                     <td> {{ $childNode->server }} </td>
-                                    <td> {{ $childNode->is_ddns ? 'DDNS' : $childNode->ip }} </td>
+                                    <td> {{ $childNode->is_ddns ? trans('model.node.ddns') : $childNode->ip }} </td>
                                     <td colspan="2">
                                         @if($childNode->is_display === 0)
                                             {{-- 节点完全不可见 --}}
@@ -186,38 +186,38 @@
                                                 @can('admin.node.edit')
                                                     <a class="dropdown-item" href="{{route('admin.node.edit', [$childNode->id, 'page' => Request::query('page', 1)])}}"
                                                        role="menuitem">
-                                                        <i class="icon wb-edit" aria-hidden="true"></i> 编辑
+                                                        <i class="icon wb-edit" aria-hidden="true"></i> {{ trans('common.edit') }}
                                                     </a>
                                                 @endcan
                                                 @can('admin.node.clone')
                                                     <a class="dropdown-item" href="{{route('admin.node.clone', $childNode)}}" role="menuitem">
-                                                        <i class="icon wb-copy" aria-hidden="true"></i> 克隆
+                                                        <i class="icon wb-copy" aria-hidden="true"></i> {{ trans('admin.clone') }}
                                                     </a>
                                                 @endcan
                                                 @can('admin.node.destroy')
                                                     <a class="dropdown-item red-700" href="javascript:delNode('{{$childNode->id}}', '{{$childNode->name}}')" role="menuitem">
-                                                        <i class="icon wb-trash" aria-hidden="true"></i> 删除
+                                                        <i class="icon wb-trash" aria-hidden="true"></i> {{ trans('common.delete') }}
                                                     </a>
                                                 @endcan
                                                 @can('admin.node.monitor')
                                                     <a class="dropdown-item" href="{{route('admin.node.monitor', $childNode)}}" role="menuitem">
-                                                        <i class="icon wb-stats-bars" aria-hidden="true"></i> 流量统计
+                                                        <i class="icon wb-stats-bars" aria-hidden="true"></i> {{ trans('admin.node.traffic_monitor') }}
                                                     </a>
                                                 @endcan
                                                 <hr/>
                                                 @can('admin.node.geo')
                                                     <a class="dropdown-item" href="javascript:refreshGeo('{{$childNode->id}}')" role="menuitem">
-                                                        <i id="geo_{{$childNode->id}}" class="icon wb-map" aria-hidden="true"></i> 刷新地理
+                                                        <i id="geo_{{$childNode->id}}" class="icon wb-map" aria-hidden="true"></i> {{ trans('admin.node.refresh_geo') }}
                                                     </a>
                                                 @endcan
                                                 @can('admin.node.ping')
                                                     <a class="dropdown-item" href="javascript:pingNode('{{$childNode->id}}')" role="menuitem">
-                                                        <i id="ping_{{$childNode->id}}" class="icon wb-order" aria-hidden="true"></i> 检测延迟
+                                                        <i id="ping_{{$childNode->id}}" class="icon wb-order" aria-hidden="true"></i> {{ trans('admin.node.ping') }}
                                                     </a>
                                                 @endcan
                                                 @can('admin.node.check')
                                                     <a class="dropdown-item" href="javascript:checkNode('{{$childNode->id}}')" role="menuitem">
-                                                        <i id="node_{{$childNode->id}}" class="icon wb-signal" aria-hidden="true"></i> 连通性检测
+                                                        <i id="node_{{$childNode->id}}" class="icon wb-signal" aria-hidden="true"></i> {{ trans('admin.node.connection_test') }}
                                                     </a>
                                                 @endcan
                                             </div>
@@ -233,7 +233,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$nodeList->total()}}</code> 条线路
+                        {!! trans('admin.node.counts', ['num' => $nodeList->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -252,149 +252,149 @@
         @can('admin.node.check')
         // 节点连通性测试
         function checkNode(id) {
-            $.ajax({
-                method: 'POST',
-                url: '{{route('admin.node.check', '')}}/' + id,
-                data: {_token: '{{csrf_token()}}'},
-                beforeSend: function() {
-                    $('#node_' + id).removeClass('wb-signal').addClass('wb-loop icon-spin');
-                },
-                success: function(ret) {
-                    if (ret.status === 'success') {
-                        let str = '';
-                        for (let i in ret.message) {
-                            str += '<tr><td>' + i + '</td><td>' + ret.message[i][0] + '</td><td>' + ret.message[i][1] + '</td></tr>';
-                        }
-                        swal.fire({
-                            title: ret.title,
-                            icon: 'info',
-                            html: '<table class="my-20"><thead class="thead-default"><tr><th> IP </th><th> ICMP </th> <th> TCP </th></thead><tbody>' + str + '</tbody></table>',
-                            showConfirmButton: false,
-                        });
-                    } else {
-                        swal.fire({title: ret.title, text: ret.message, icon: 'error'});
-                    }
-                },
-                complete: function() {
-                    $('#node_' + id).removeClass('wb-loop icon-spin').addClass('wb-signal');
-                },
-            });
+          $.ajax({
+            method: 'POST',
+            url: '{{route('admin.node.check', '')}}/' + id,
+            data: {_token: '{{csrf_token()}}'},
+            beforeSend: function() {
+              $('#node_' + id).removeClass('wb-signal').addClass('wb-loop icon-spin');
+            },
+            success: function(ret) {
+              if (ret.status === 'success') {
+                let str = '';
+                for (let i in ret.message) {
+                  str += '<tr><td>' + i + '</td><td>' + ret.message[i][0] + '</td><td>' + ret.message[i][1] + '</td></tr>';
+                }
+                swal.fire({
+                  title: ret.title,
+                  icon: 'info',
+                  html: '<table class="my-20"><thead class="thead-default"><tr><th> IP </th><th> ICMP </th> <th> TCP </th></thead><tbody>' + str + '</tbody></table>',
+                  showConfirmButton: false,
+                });
+              } else {
+                swal.fire({title: ret.title, text: ret.message, icon: 'error'});
+              }
+            },
+            complete: function() {
+              $('#node_' + id).removeClass('wb-loop icon-spin').addClass('wb-signal');
+            },
+          });
         }
         @endcan
 
         @can('admin.node.ping')
         // Ping节点获取延迟
         function pingNode(id) {
-            $.ajax({
+          $.ajax({
+            method: 'POST',
+            url: '{{route('admin.node.ping', '')}}/' + id,
+            data: {_token: '{{csrf_token()}}'},
+            beforeSend: function() {
+              $('#ping_' + id).removeClass('wb-order').addClass('wb-loop icon-spin');
+            },
+            success: function(ret) {
+              if (ret.status === 'success') {
+                swal.fire({
+                  icon: 'info',
+                  html: ret.message,
+                  showConfirmButton: false,
+                });
+              } else {
+                swal.fire({title: ret.message, icon: 'error'});
+              }
+            },
+            complete: function() {
+              $('#ping_' + id).removeClass('wb-loop icon-spin').addClass('wb-order');
+            },
+          });
+        }
+        @endcan
+
+        @can('admin.node.reload')
+        // 发送节点重载请求
+        function reload(id) {
+          swal.fire({
+            text: '{{ trans('admin.node.reload_confirm') }}',
+            icon: 'question',
+            showCancelButton: true,
+            cancelButtonText: '{{trans('common.close')}}',
+            confirmButtonText: '{{trans('common.confirm')}}',
+          }).then((result) => {
+            if (result.value) {
+              $.ajax({
                 method: 'POST',
-                url: '{{route('admin.node.ping', '')}}/' + id,
+                url: '{{route('admin.node.reload', '')}}/' + id,
                 data: {_token: '{{csrf_token()}}'},
                 beforeSend: function() {
-                    $('#ping_' + id).removeClass('wb-order').addClass('wb-loop icon-spin');
+                  $('#reload_' + id).removeClass('wb-reload').addClass('wb-loop icon-spin');
                 },
                 success: function(ret) {
-                    if (ret.status === 'success') {
-                        swal.fire({
-                            icon: 'info',
-                            html: ret.message,
-                            showConfirmButton: false,
-                        });
-                    } else {
-                        swal.fire({title: ret.message, icon: 'error'});
-                    }
+                  if (ret.status === 'success') {
+                    swal.fire({title: ret.message, icon: 'info', showConfirmButton: false});
+                  } else {
+                    swal.fire({title: ret.message, icon: 'error'});
+                  }
                 },
                 complete: function() {
-                    $('#ping_' + id).removeClass('wb-loop icon-spin').addClass('wb-order');
+                  $('#reload_' + id).removeClass('wb-loop icon-spin').addClass('wb-reload');
                 },
-            });
-        }
-        @endcan
-
-        @can('admin.node.reload')
-        // 发送节点重载请求
-        function reload(id) {
-            swal.fire({
-                text: '确定重载节点?',
-                icon: 'question',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'POST',
-                        url: '{{route('admin.node.reload', '')}}/' + id,
-                        data: {_token: '{{csrf_token()}}'},
-                        beforeSend: function() {
-                            $('#reload_' + id).removeClass('wb-reload').addClass('wb-loop icon-spin');
-                        },
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                swal.fire({title: ret.message, icon: 'info', showConfirmButton: false});
-                            } else {
-                                swal.fire({title: ret.message, icon: 'error'});
-                            }
-                        },
-                        complete: function() {
-                            $('#reload_' + id).removeClass('wb-loop icon-spin').addClass('wb-reload');
-                        },
-                    });
-                }
-            });
+              });
+            }
+          });
         }
         @endcan
 
         @can('admin.node.geo')
         // 刷新节点地理信息
         function refreshGeo(id) {
-            $.ajax({
-                method: 'GET',
-                url: '{{route('admin.node.geo', '')}}/' + id,
-                data: {_token: '{{csrf_token()}}'},
-                beforeSend: function() {
-                    $('#geo_' + id).removeClass('wb-map').addClass('wb-loop icon-spin');
-                },
-                success: function(ret) {
-                    if (ret.status === 'success') {
-                        swal.fire({title: ret.message, icon: 'info', showConfirmButton: false});
-                    } else {
-                        swal.fire({title: ret.message, icon: 'error'});
-                    }
-                },
-                complete: function() {
-                    $('#geo_' + id).removeClass('wb-loop icon-spin').addClass('wb-map');
-                },
-            });
+          $.ajax({
+            method: 'GET',
+            url: '{{route('admin.node.geo', '')}}/' + id,
+            data: {_token: '{{csrf_token()}}'},
+            beforeSend: function() {
+              $('#geo_' + id).removeClass('wb-map').addClass('wb-loop icon-spin');
+            },
+            success: function(ret) {
+              if (ret.status === 'success') {
+                swal.fire({title: ret.message, icon: 'info', showConfirmButton: false});
+              } else {
+                swal.fire({title: ret.message, icon: 'error'});
+              }
+            },
+            complete: function() {
+              $('#geo_' + id).removeClass('wb-loop icon-spin').addClass('wb-map');
+            },
+          });
         }
         @endcan
 
         @can('admin.node.destroy')
         // 删除节点
         function delNode(id, name) {
-            swal.fire({
-                title: '{{trans('common.warning')}}',
-                text: '确定删除节点 【' + name + '】 ?',
-                icon: 'warning',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'DELETE',
-                        url: '{{route('admin.node.destroy', '')}}/' + id,
-                        data: {_token: '{{csrf_token()}}'},
-                        dataType: 'json',
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                            } else {
-                                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                            }
-                        },
-                    });
-                }
-            });
+          swal.fire({
+            title: '{{trans('common.warning')}}',
+            text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.node.attribute')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
+            icon: 'warning',
+            showCancelButton: true,
+            cancelButtonText: '{{trans('common.close')}}',
+            confirmButtonText: '{{trans('common.confirm')}}',
+          }).then((result) => {
+            if (result.value) {
+              $.ajax({
+                method: 'DELETE',
+                url: '{{route('admin.node.destroy', '')}}/' + id,
+                data: {_token: '{{csrf_token()}}'},
+                dataType: 'json',
+                success: function(ret) {
+                  if (ret.status === 'success') {
+                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                  } else {
+                    swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+                  }
+                },
+              });
+            }
+          });
         }
         @endcan
     </script>

+ 91 - 93
resources/views/admin/node/info.blade.php

@@ -12,96 +12,94 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">@isset($node)
-                        编辑节点
-                    @else
-                        添加节点
-                    @endisset</h2>
+                <h2 class="panel-title">
+                    {{ isset($node) ? trans('admin.action.edit_item', ['attribute' => trans('model.node.attribute')]) : trans('admin.action.add_item', ['attribute' => trans('model.node.attribute')]) }}
+                </h2>
             </div>
             <div class="alert alert-info" role="alert">
                 <button class="close" data-dismiss="alert" aria-label="Close">
                     <span aria-hidden="true">&times;</span>
                     <span class="sr-only">{{trans('common.close')}}</span>
                 </button>
-                <strong>注意:</strong> 添加节点后自动生成的<code>ID</code>,即为该节点部署ShadowsocksR Python版后端时<code>usermysql.json</code>中的<code>node_id</code>的值,同时也是部署V2Ray后端时的<code>nodeId</code>的值;
+                {!! trans('admin.node.info.hint') !!}
             </div>
             <div class="panel-body">
                 <form class="form-horizontal" onsubmit="return Submit()">
                     <div class="row">
                         <div class="col-lg-6">
                             <div class="example-wrap">
-                                <h4 class="example-title">基础信息</h4>
+                                <h4 class="example-title">{{ trans('admin.node.info.basic') }}</h4>
                                 <div class="example">
                                     <div class="form-group row">
-                                        <label for="is_ddns" class="col-md-3 col-form-label">DDNS</label>
+                                        <label for="is_ddns" class="col-md-3 col-form-label">{{ trans('model.node.ddns') }}</label>
                                         <div class="col-md-9">
                                             <input type="checkbox" id="is_ddns" name="is_ddns" data-plugin="switchery" onchange="switchSetting('is_ddns')">
                                         </div>
                                         <div class="text-help offset-md-3">
-                                            动态IP节点需要<a href="https://github.com/NewFuture/DDNS" target="_blank">配置DDNS</a>,对此类型节点,节点阻断功能会通过域名进行检测
+                                            {!! trans('admin.node.info.ddns_hint') !!}
                                         </div>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="name" class="col-md-3 col-form-label"> 节点名称 </label>
+                                        <label for="name" class="col-md-3 col-form-label"> {{ trans('model.node.name') }} </label>
                                         <input type="text" class="form-control col-md-4" name="name" id="name" required>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="server" class="col-md-3 col-form-label"> 域名 </label>
-                                        <input type="text" class="form-control col-md-4" name="server" id="server" placeholder="服务器域名地址,填则优先取域名地址">
-                                        <span class="text-help offset-md-3">系统设置中开启【DDNS模式】,域名将会自动与下方IP内容进行绑定操作!无需再前往域名注册商页面修改IP信息了哟</span>
+                                        <label for="server" class="col-md-3 col-form-label"> {{ trans('model.node.domain') }} </label>
+                                        <input type="text" class="form-control col-md-4" name="server" id="server" placeholder="{{ trans('admin.node.info.domain_placeholder') }}">
+                                        <span class="text-help offset-md-3">{{ trans('admin.node.info.domain_hint') }}</span>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="ip" class="col-md-3 col-form-label"> IPv4地址 </label>
-                                        <input type="text" class="form-control col-md-4" name="ip" id="ip" placeholder="服务器IPv4地址" required>
-                                        <span class="text-help offset-md-3">多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8</span>
+                                        <label for="ip" class="col-md-3 col-form-label"> {{ trans('model.node.ipv4') }} </label>
+                                        <input type="text" class="form-control col-md-4" name="ip" id="ip" placeholder="{{ trans('admin.node.info.ipv4_placeholder') }}" required>
+                                        <span class="text-help offset-md-3">{{ trans('admin.node.info.ipv4_hint') }}</span>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="ipv6" class="col-md-3 col-form-label"> IPv6地址 </label>
-                                        <input type="text" class="form-control col-md-4" name="ipv6" id="ipv6" placeholder="服务器IPv6地址,填写则用户可见,域名无效">
-                                        <span class="text-help offset-md-3">多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8</span>
+                                        <label for="ipv6" class="col-md-3 col-form-label"> {{ trans('model.node.ipv6') }} </label>
+                                        <input type="text" class="form-control col-md-4" name="ipv6" id="ipv6" placeholder="{{ trans('admin.node.info.ipv6_placeholder') }}">
+                                        <span class="text-help offset-md-3">{{ trans('admin.node.info.ipv6_hint') }}</span>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="push_port" class="col-md-3 col-form-label"> 消息推送端口 </label>
+                                        <label for="push_port" class="col-md-3 col-form-label"> {{ trans('model.node.push_port') }} </label>
                                         <input type="number" class="form-control col-md-4" name="push_port" value="1080" id="push_port">
-                                        <span class="text-help offset-md-3">必填且防火墙需放行,否则将导致消息推送异常</span>
+                                        <span class="text-help offset-md-3">{{ trans('admin.node.info.push_port_hint') }}</span>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="traffic_rate" class="col-md-3 col-form-label"> 流量比例 </label>
+                                        <label for="traffic_rate" class="col-md-3 col-form-label"> {{ trans('model.node.data_rate') }} </label>
                                         <input type="number" class="form-control col-md-4" name="traffic_rate" value="1.0" id="traffic_rate" step="0.01" required>
-                                        <div class="text-help offset-md-3"> 举例:0.1用100M结算10M,5用100M结算500M</div>
+                                        <div class="text-help offset-md-3">{{ trans('admin.node.info.data_rate_hint') }}</div>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="level" class="col-md-3 col-form-label">等级</label>
+                                        <label for="level" class="col-md-3 col-form-label">{{ trans('model.node.level') }}</label>
                                         <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control show-tick" id="level" name="level">
                                             @foreach($levels as $level)
                                                 <option value="{{$level->level}}">{{$level->name}}</option>
                                             @endforeach
                                         </select>
-                                        <div class="text-help offset-md-3"> 等级:0-无等级,全部可见</div>
+                                        <div class="text-help offset-md-3"> {{ trans('admin.node.info.level_hint') }}</div>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="ruleGroup" class="col-md-3 col-form-label">审计分组</label>
+                                        <label for="ruleGroup" class="col-md-3 col-form-label">{{ trans('model.node.rule_group') }}</label>
                                         <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control show-tick"
                                                 id="ruleGroup" name="ruleGroup">
-                                            <option value="">不使用</option>
+                                            <option value="">{{ trans('common.none') }}</option>
                                             @foreach($ruleGroups as $ruleGroup)
                                                 <option value="{{$ruleGroup->id}}">{{$ruleGroup->name}}</option>
                                             @endforeach
                                         </select>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="speed_limit" class="col-md-3 col-form-label">节点限速</label>
+                                        <label for="speed_limit" class="col-md-3 col-form-label">{{ trans('model.node.traffic_limit') }}</label>
                                         <div class="col-md-4 input-group p-0">
                                             <input type="number" class="form-control" id="speed_limit" name="speed_limit" value="1000" required>
                                             <span class="input-group-text">Mbps</span>
                                         </div>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="client_limit" class="col-md-3 col-form-label">设备数限制</label>
+                                        <label for="client_limit" class="col-md-3 col-form-label">{{ trans('model.node.client_limit') }}</label>
                                         <input type="number" class="form-control col-md-4" id="client_limit" name="client_limit" value="1000" required>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="labels" class="col-md-3 col-form-label">标签</label>
+                                        <label for="labels" class="col-md-3 col-form-label">{{ trans('model.node.label') }}</label>
                                         <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control show-tick" id="labels" name="labels"
                                                 multiple>
                                             @foreach($labels as $label)
@@ -110,7 +108,7 @@
                                         </select>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="country_code" class="col-md-3 col-form-label"> 国家/地区 </label>
+                                        <label for="country_code" class="col-md-3 col-form-label"> {{ trans('model.node.country') }} </label>
                                         <select data-plugin="selectpicker" data-style="btn-outline btn-primary"
                                                 class="col-md-5 form-control" name="country_code" id="country_code">
                                             @foreach($countries as $country)
@@ -119,22 +117,22 @@
                                         </select>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="description" class="col-md-3 col-form-label"> 描述 </label>
+                                        <label for="description" class="col-md-3 col-form-label"> {{ trans('model.common.description') }} </label>
                                         <input type="text" class="form-control col-md-6" name="description" id="description" placeholder="简单描述">
                                     </div>
                                     <div class="form-group row">
-                                        <label for="sort" class="col-md-3 col-form-label">排序</label>
+                                        <label for="sort" class="col-md-3 col-form-label">{{ trans('model.common.sort') }}</label>
                                         <input type="text" class="form-control col-md-4" name="sort" id="sort" value="1" required/>
-                                        <div class="text-help offset-md-3"> 排序值越大排越前 &emsp;&emsp;&emsp;&emsp;&emsp;&emsp;</div>
+                                        <div class="text-help offset-md-3"> {{ trans('admin.sort_asc') }}</div>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="is_udp" class="col-md-3 col-form-label">UDP</label>
+                                        <label for="is_udp" class="col-md-3 col-form-label">{{ trans('model.node.udp') }}</label>
                                         <div class="col-md-9">
                                             <input type="checkbox" id="is_udp" name="is_udp" data-plugin="switchery">
                                         </div>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="status" class="col-md-3 col-form-label">状态</label>
+                                        <label for="status" class="col-md-3 col-form-label">{{ trans('common.status.attribute') }}</label>
                                         <div class="col-md-9">
                                             <input type="checkbox" id="status" name="status" data-plugin="switchery">
                                         </div>
@@ -144,74 +142,74 @@
                         </div>
                         <div class="col-lg-6">
                             <div class="example-wrap">
-                                <h4 class="example-title">扩展信息</h4>
+                                <h4 class="example-title">{{ trans('admin.node.info.extend') }}</h4>
                                 <div class="example">
                                     <div class="form-group row">
-                                        <label for="is_display" class="col-md-3 col-form-label">显示 与 订阅</label>
+                                        <label for="is_display" class="col-md-3 col-form-label">{{ trans('model.node.display') }}</label>
                                         <ul class="col-md-9 list-unstyled list-inline">
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="invisible" name="is_display" value="0" checked/>
-                                                    <label for="invisible">完全不可见</label>
+                                                    <label for="invisible">{{ trans('admin.node.info.display.invisible') }}</label>
                                                 </div>
                                             </li>
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="page_only" name="is_display" value="1"/>
-                                                    <label for="page_only">只显示于【{{ trans('user.menu.nodes') }}】页面</label>
+                                                    <label for="page_only">{{ trans('admin.node.info.display.node', ['trans' => trans('user.menu.nodes')]) }}</label>
                                                 </div>
                                             </li>
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="sub_only" name="is_display" value="2"/>
-                                                    <label for="sub_only">只显示于【订 阅】</label>
+                                                    <label for="sub_only">{{ trans('admin.node.info.display.sub') }}</label>
                                                 </div>
                                             </li>
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="visible" name="is_display" value="3" checked/>
-                                                    <label for="visible">完全可见</label>
+                                                    <label for="visible">{{ trans('admin.node.info.display.all') }}</label>
                                                 </div>
                                             </li>
                                         </ul>
-                                        <div class="text-help offset-md-3"> 用户是否可以订阅/看到本节点</div>
+                                        <div class="text-help offset-md-3"> {{ trans('admin.node.info.display.hint') }}</div>
                                     </div>
                                     <div class="form-group row">
-                                        <label for="detection_type" class="col-md-3 col-form-label">节点阻断检测</label>
+                                        <label for="detection_type" class="col-md-3 col-form-label">{{ trans('model.node.detection') }}</label>
                                         <ul class="col-md-9 list-unstyled list-inline">
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="detect_disable" name="detection_type" value="0" checked/>
-                                                    <label for="detect_disable">关闭</label>
+                                                    <label for="detect_disable">{{ trans('common.close') }}</label>
                                                 </div>
                                             </li>
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="detect_tcp" name="detection_type" value="1"/>
-                                                    <label for="detect_tcp">只检测TCP</label>
+                                                    <label for="detect_tcp">{{ trans('admin.node.info.detection.tcp') }}</label>
                                                 </div>
                                             </li>
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="detect_icmp" name="detection_type" value="2"/>
-                                                    <label for="detect_icmp">只检测ICMP</label>
+                                                    <label for="detect_icmp">{{ trans('admin.node.info.detection.icmp') }}</label>
                                                 </div>
                                             </li>
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="detect_all" name="detection_type" value="3"/>
-                                                    <label for="detect_all">检测全部</label>
+                                                    <label for="detect_all">{{ trans('admin.node.info.detection.all') }}</label>
                                                 </div>
                                             </li>
                                         </ul>
-                                        <div class="text-help offset-md-3"> 每30~60分钟随机进行节点阻断检测</div>
+                                        <div class="text-help offset-md-3"> {{ trans('admin.node.info.detection.hint') }}</div>
                                     </div>
                                     <!-- 中转 设置部分 -->
                                     <div class="form-group row">
-                                        <label for="relay_node_id" class="col-md-3 col-form-label">中转</label>
+                                        <label for="relay_node_id" class="col-md-3 col-form-label">{{ trans('model.node.transfer') }}</label>
                                         <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control show-tick"
                                                 id="relay_node_id" name="relay_node_id">
-                                            <option value="">不使用</option>
+                                            <option value="">{{ trans('common.none') }}</option>
                                             @foreach($nodes as $name => $id)
                                                 <option value="{{$id}}">{{$id}} - {{$name}}</option>
                                             @endforeach
@@ -221,7 +219,7 @@
                                     <!-- 代理 设置部分 -->
                                     <div class="proxy-config">
                                         <div class="form-group row">
-                                            <label for="type" class="col-md-3 col-form-label">类型</label>
+                                            <label for="type" class="col-md-3 col-form-label">{{ trans('model.node.type') }}</label>
                                             <ul class="col-md-9 list-unstyled list-inline">
                                                 <li class="list-inline-item">
                                                     <div class="radio-custom radio-primary">
@@ -259,7 +257,7 @@
                                         <!-- SS/SSR 设置部分 -->
                                         <div class="ss-setting">
                                             <div class="form-group row">
-                                                <label for="method" class="col-md-3 col-form-label">加密方式</label>
+                                                <label for="method" class="col-md-3 col-form-label">{{ trans('model.node.method') }}</label>
                                                 <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control" name="method" id="method">
                                                     @foreach (Helpers::methodList() as $method)
                                                         <option value="{{$method->name}}" @if(!isset($node) && $method->is_default) selected @endif>{{$method->name}}</option>
@@ -268,7 +266,7 @@
                                             </div>
                                             <div class="ssr-setting">
                                                 <div class="form-group row">
-                                                    <label for="protocol" class="col-md-3 col-form-label">协议</label>
+                                                    <label for="protocol" class="col-md-3 col-form-label">{{ trans('model.node.protocol') }}</label>
                                                     <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control" name="protocol"
                                                             id="protocol">
                                                         @foreach (Helpers::protocolList() as $protocol)
@@ -278,11 +276,11 @@
                                                     </select>
                                                 </div>
                                                 <div class="form-group row">
-                                                    <label for="protocol_param" class="col-md-3 col-form-label"> 协议参数 </label>
+                                                    <label for="protocol_param" class="col-md-3 col-form-label"> {{ trans('model.node.protocol_param') }} </label>
                                                     <input type="text" class="form-control col-md-4" name="protocol_param" id="protocol_param">
                                                 </div>
                                                 <div class="form-group row">
-                                                    <label for="obfs" class="col-md-3 col-form-label">混淆</label>
+                                                    <label for="obfs" class="col-md-3 col-form-label">{{ trans('model.node.obfs') }}</label>
                                                     <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control" name="obfs" id="obfs">
                                                         @foreach (Helpers::obfsList() as $obfs)
                                                             <option value="{{$obfs->name}}" @if(!isset($node) && $obfs->is_default) selected @endif>{{$obfs->name}}</option>
@@ -290,52 +288,52 @@
                                                     </select>
                                                 </div>
                                                 <div class="form-group row obfs_param">
-                                                    <label for="obfs_param" class="col-md-3 col-form-label"> 混淆参数 </label>
+                                                    <label for="obfs_param" class="col-md-3 col-form-label"> {{ trans('model.node.obfs_param') }} </label>
                                                     <textarea class="form-control col-md-8" rows="5" name="obfs_param" id="obfs_param"
-                                                              placeholder="混淆不为 [plain] 时可填入参数进行流量伪装;&#13;&#10;混淆为 [http_simple] 时,建议端口为 80;&#13;&#10;混淆为 [tls] 时,建议端口为 443;"></textarea>
+                                                              placeholder="{{ trans('admin.node.info.obfs_param_hint') }}"></textarea>
                                                 </div>
                                                 <div class="form-group row">
-                                                    <label class="col-md-3 col-form-label">*兼容 SS</label>
+                                                    <label class="col-md-3 col-form-label">{{ trans('admin.node.proxy_info') }}</label>
                                                     <div class="text-help col-md-9">
-                                                        如果兼容请在服务端配置协议和混淆时加上<span class="red-700">_compatible</span>
+                                                        {!! trans('admin.node.proxy_info_hint') !!}
                                                     </div>
                                                 </div>
                                             </div>
                                             <hr/>
                                             <div class="form-group row">
-                                                <label for="single" class="col-md-3 col-form-label">单端口</label>
+                                                <label for="single" class="col-md-3 col-form-label">{{ trans('model.node.single') }}</label>
                                                 <div class="col-md-9">
                                                     <input type="checkbox" id="single" name="single" data-plugin="switchery" onchange="switchSetting('single')">
                                                 </div>
                                                 <div class="text-help offset-md-3">
-                                                    如果启用请配置服务端的<span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span>信息
+                                                    {!! trans('admin.node.info.additional_ports_hint') !!}
                                                 </div>
                                             </div>
                                             <div class="single-setting">
                                                 <div class="form-group row">
-                                                    <label for="single_port" class="col-md-3 col-form-label">[单] 端口</label>
+                                                    <label for="single_port" class="col-md-3 col-form-label">{{ trans('model.node.service_port') }}</label>
                                                     <input type="number" class="form-control col-md-4" name="port" id="single_port" value="443" hidden/>
-                                                    <span class="text-help offset-md-3"> 推荐80或443,服务端需要配置 <br>
-                                                    严格模式:用户的端口无法连接,只能通过以下指定的端口进行连接(<a href="javascript:showPortsOnlyConfig();">如何配置</a>)</span>
+                                                    <span class="text-help offset-md-3"> {!! trans('admin.node.info.single_hint') !!}</span>
                                                 </div>
                                                 <div class="form-group row ssr-setting">
-                                                    <label for="passwd" class="col-md-3 col-form-label">[单] 密码</label>
-                                                    <input type="text" class="form-control col-md-4" name="passwd" id="passwd" placeholder="password">
+                                                    <label for="passwd" class="col-md-3 col-form-label">{{ trans('model.node.single_passwd') }}</label>
+                                                    <input type="text" class="form-control col-md-4" name="passwd" id="passwd"
+                                                           placeholder="{{ trans('validation.attributes.password') }}">
                                                 </div>
                                             </div>
                                         </div>
                                         <!-- V2ray 设置部分 -->
                                         <div class="v2ray-setting">
                                             <div class="form-group row">
-                                                <label for="v2_alter_id" class="col-md-3 col-form-label">额外ID</label>
+                                                <label for="v2_alter_id" class="col-md-3 col-form-label">{{ trans('model.node.v2_alter_id') }}</label>
                                                 <input type="text" class="form-control col-md-4" name="v2_alter_id" value="16" id="v2_alter_id"/>
                                             </div>
                                             <div class="form-group row">
-                                                <label for="v2_port" class="col-md-3 col-form-label">服务端口</label>
+                                                <label for="v2_port" class="col-md-3 col-form-label">{{ trans('model.node.service_port') }}</label>
                                                 <input type="number" class="form-control col-md-4" name="port" id="v2_port" value="10053" hidden/>
                                             </div>
                                             <div class="form-group row">
-                                                <label for="v2_method" class="col-md-3 col-form-label">加密方式</label>
+                                                <label for="v2_method" class="col-md-3 col-form-label">{{ trans('model.node.method') }}</label>
                                                 <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control" id="v2_method">
                                                     <option value="none">none</option>
                                                     <option value="auto">auto</option>
@@ -343,10 +341,10 @@
                                                     <option value="aes-128-gcm">aes-128-gcm</option>
                                                     <option value="chacha20-poly1305">chacha20-poly1305</option>
                                                 </select>
-                                                <div class="text-help offset-md-3"> 使用WebSocket传输协议时不要使用none</div>
+                                                <div class="text-help offset-md-3"> {{ trans('admin.node.info.v2_method_hint') }}</div>
                                             </div>
                                             <div class="form-group row">
-                                                <label for="v2_net" class="col-md-3 col-form-label">传输方式</label>
+                                                <label for="v2_net" class="col-md-3 col-form-label">{{ trans('model.node.v2_net') }}</label>
                                                 <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control" id="v2_net">
                                                     <option value="tcp">TCP</option>
                                                     <option value="http">HTTP/2</option>
@@ -355,49 +353,49 @@
                                                     <option value="domainsocket">DomainSocket</option>
                                                     <option value="quic">QUIC</option>
                                                 </select>
-                                                <div class="text-help offset-md-3"> 使用WebSocket传输协议时请启用TLS</div>
+                                                <div class="text-help offset-md-3"> {{ trans('admin.node.info.v2_net_hint') }}</div>
                                             </div>
                                             <div class="form-group row v2_type">
-                                                <label for="v2_type" class="col-md-3 col-form-label">伪装类型</label>
+                                                <label for="v2_type" class="col-md-3 col-form-label">{{ trans('model.node.v2_cover') }}</label>
                                                 <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="col-md-5 form-control" id="v2_type">
-                                                    <option value="none">无伪装</option>
-                                                    <option value="http">HTTP数据流</option>
+                                                    <option value="none">{{ trans('admin.node.info.v2_cover.none') }}</option>
+                                                    <option value="http">{{ trans('admin.node.info.v2_cover.http') }}</option>
                                                     <optgroup id="type_option" label="">
-                                                        <option value="srtp">视频通话数据 (SRTP)</option>
-                                                        <option value="utp">BT下载数据 (uTP)</option>
-                                                        <option value="wechat-video">微信视频通话</option>
-                                                        <option value="dtls">DTLS1.2数据包</option>
-                                                        <option value="wireguard">WireGuard数据包</option>
+                                                        <option value="srtp">{{ trans('admin.node.info.v2_cover.srtp') }}</option>
+                                                        <option value="utp">{{ trans('admin.node.info.v2_cover.utp') }}</option>
+                                                        <option value="wechat-video">{{ trans('admin.node.info.v2_cover.wechat') }}</option>
+                                                        <option value="dtls">{{ trans('admin.node.info.v2_cover.dtls') }}</option>
+                                                        <option value="wireguard">{{ trans('admin.node.info.v2_cover.wireguard') }}</option>
                                                     </optgroup>
                                                 </select>
                                             </div>
                                             <div class="form-group row v2_host">
-                                                <label for="v2_host" class="col-md-3 col-form-label">伪装域名</label>
+                                                <label for="v2_host" class="col-md-3 col-form-label">{{ trans('model.node.v2_host') }}</label>
                                                 <div class="col-md-4 pl-0">
                                                     <input type="text" class="form-control" name="v2_other" id="v2_host">
                                                 </div>
                                                 <div class="text-help offset-md-3">
-                                                    伪装类型为http时多个伪装域名逗号隔开,使用WebSocket传输协议时只允许单个
+                                                    {{ trans('admin.node.info.v2_host_hint') }}
                                                 </div>
                                             </div>
                                             <div class="form-group row">
-                                                <label for="v2_path" class="col-md-3 col-form-label">路径 | 密钥</label>
+                                                <label for="v2_path" class="col-md-3 col-form-label">{{ trans('model.node.v2_path') }}</label>
                                                 <input type="text" class="form-control col-md-4" name="v2_path" id="v2_path">
                                             </div>
                                             <div class="form-group row">
-                                                <label for="v2_sni" class="col-md-3 col-form-label">SNI</label>
+                                                <label for="v2_sni" class="col-md-3 col-form-label">{{ trans('model.node.v2_sni') }}</label>
                                                 <input type="text" class="form-control col-md-4" name="v2_sni" id="v2_sni">
                                             </div>
                                             <div class="form-group row">
-                                                <label for="v2_tls" class="col-md-3 col-form-label">连接TLS</label>
+                                                <label for="v2_tls" class="col-md-3 col-form-label">{{ trans('model.node.v2_tls') }}</label>
                                                 <div class="col-md-9">
                                                     <input type="checkbox" id="v2_tls" name="v2_tls" data-plugin="switchery" onchange="switchSetting('v2_tls')">
                                                 </div>
                                             </div>
                                             <div class="form-group row">
-                                                <label for="tls_provider" class="col-md-3 col-form-label">TLS配置</label>
+                                                <label for="tls_provider" class="col-md-3 col-form-label">{{ trans('model.node.v2_tls_provider') }}</label>
                                                 <input type="text" class="form-control col-md-9" name="tls_provider" id="tls_provider"/>
-                                                <div class="text-help offset-md-3"> 不同后端配置不同:
+                                                <div class="text-help offset-md-3"> {{ trans('admin.node.info.v2_tls_provider_hint') }}
                                                     <a href="https://proxypanel.gitbook.io/wiki/webapi/webapi-basic-setting#vnet-v2-ray-hou-duan" target="_blank">VNET-V2Ray</a>、
                                                     <a href="https://proxypanel.gitbook.io/wiki/webapi/webapi-basic-setting#v-2-ray-poseidon-hou-duan"
                                                        target="_blank">V2Ray-Poseidon</a>
@@ -407,14 +405,14 @@
                                         <!-- Trojan 设置部分 -->
                                         <div class="trojan-setting">
                                             <div class="form-group row">
-                                                <label for="trojan_port" class="col-md-3 col-form-label">连接端口</label>
+                                                <label for="trojan_port" class="col-md-3 col-form-label">{{ trans('model.node.service_port') }}</label>
                                                 <input type="number" class="form-control col-md-4" name="port" id="trojan_port" value="443" hidden/>
                                             </div>
                                         </div>
                                     </div>
                                     <div class="relay-config">
                                         <div class="form-group row">
-                                            <label for="relay_port" class="col-md-3 col-form-label">中转端口</label>
+                                            <label for="relay_port" class="col-md-3 col-form-label">{{ trans('model.node.relay_port') }}</label>
                                             <input type="number" class="form-control col-md-4" name="port" id="relay_port" value="443" hidden/>
                                         </div>
                                     </div>
@@ -422,8 +420,8 @@
                             </div>
                             <div class="col-md-12 form-actions">
                                 <div class="float-right">
-                                    <a href="{{route('admin.node.index')}}" class="btn btn-danger">返 回</a>
-                                    <button type="submit" class="btn btn-success">提 交</button>
+                                    <a href="{{route('admin.node.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
+                                    <button type="submit" class="btn btn-success">{{ trans('common.submit') }}</button>
                                 </div>
                             </div>
                         </div>
@@ -592,7 +590,7 @@
               $.each(errors.errors, function(index, value) {
                 str += '<li>' + value + '</li>';
               });
-              swal.fire({title: '提示', html: str, icon: 'error', confirmButtonText: '{{trans('common.confirm')}}'});
+              swal.fire({title: '{{ trans('admin.hint') }}', html: str, icon: 'error', confirmButtonText: '{{ trans('common.confirm') }}'});
             }
           },
         });

+ 67 - 67
resources/views/admin/node/monitor.blade.php

@@ -3,7 +3,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">节点流量</h2>
+                <h2 class="panel-title">{{ trans('admin.monitor.node') }}</h2>
             </div>
             <div class="alert alert-info alert-dismissible">
                 <button class="close" data-dismiss="alert" aria-label="Close">
@@ -12,15 +12,15 @@
                 <h4 class="block">{{$nodeName}}
                     <small class="pl-10">{{$nodeServer}}</small>
                 </h4>
-                <strong>提示:</strong> 如果无统计数据,请检查定时任务是否正常。
+                {!! trans('admin.monitor.hint') !!}
             </div>
             <div class="panel-body">
                 <div class="row">
                     <div class="col-md-6">
-                        <canvas id="dailyChart" aria-label="小时流量图" role="img"></canvas>
+                        <canvas id="dailyChart" aria-label="{{ trans('admin.monitor.daily_chart') }}" role="img"></canvas>
                     </div>
                     <div class="col-md-6">
-                        <canvas id="monthlyChart" aria-label="月流量图" role="img"></canvas>
+                        <canvas id="monthlyChart" aria-label="{{ trans('admin.monitor.monthly_chart') }}" role="img"></canvas>
                     </div>
                 </div>
             </div>
@@ -30,74 +30,74 @@
 @section('javascript')
     <script src="/assets/global/vendor/chart-js/chart.min.js"></script>
     <script>
-        function common_options(tail) {
-            return {
-                responsive: true,
-                scales: {
-                    x: {
-                        ticks: {
-                            callback: function(value) {
-                                return this.getLabelForValue(value) + tail;
-                            },
-                        },
-                        grid: {
-                            display: false,
-                        },
-                    },
-                    y: {
-                        ticks: {
-                            callback: function(value) {
-                                return this.getLabelForValue(value) + ' GB';
-                            },
-                        },
-                        grid: {
-                            display: false,
-                        },
-                        min: 0,
-                    },
+      function common_options(tail) {
+        return {
+          responsive: true,
+          scales: {
+            x: {
+              ticks: {
+                callback: function(value) {
+                  return this.getLabelForValue(value) + tail;
+                },
+              },
+              grid: {
+                display: false,
+              },
+            },
+            y: {
+              ticks: {
+                callback: function(value) {
+                  return this.getLabelForValue(value) + ' GB';
+                },
+              },
+              grid: {
+                display: false,
+              },
+              min: 0,
+            },
 
+          },
+          plugins: {
+            legend: false,
+            tooltip: {
+              mode: 'index',
+              intersect: false,
+              callbacks: {
+                title: function(context) {
+                  return context[0].label + tail;
                 },
-                plugins: {
-                    legend: false,
-                    tooltip: {
-                        mode: 'index',
-                        intersect: false,
-                        callbacks: {
-                            title: function(context) {
-                                return context[0].label + tail;
-                            },
-                            label: function(context) {
-                                return context.parsed.y + ' GB';
-                            },
-                        },
-                    },
+                label: function(context) {
+                  return context.parsed.y + ' GB';
                 },
-            };
-        }
+              },
+            },
+          },
+        };
+      }
 
-        function datasets(label, data) {
-            return {
-                labels: label,
-                datasets: [
-                    {
-                        backgroundColor: 'rgba(184, 215, 255)',
-                        borderColor: 'rgba(184, 215, 255)',
-                        data: data,
-                        tension: 0.4,
-                    }],
-            };
-        }
+      function datasets(label, data) {
+        return {
+          labels: label,
+          datasets: [
+            {
+              backgroundColor: 'rgba(184, 215, 255)',
+              borderColor: 'rgba(184, 215, 255)',
+              data: data,
+              tension: 0.4,
+            }],
+        };
+      }
 
-        new Chart(document.getElementById('dailyChart'), {
-            type: 'line',
-            data: datasets(@json($dayHours), @json($trafficHourly)),
-            options: common_options(' {{trans_choice('validation.attributes.hour', 2)}}'),
-        });
+      new Chart(document.getElementById('dailyChart'), {
+        type: 'line',
+        data: datasets(@json($dayHours), @json($trafficHourly)),
+        options: common_options(' {{trans_choice('validation.attributes.hour', 2)}}'),
+      });
 
-        new Chart(document.getElementById('monthlyChart'), {
-            type: 'line',
-            data: datasets(@json($monthDays), @json($trafficDaily)),
-            options: common_options(' {{trans_choice('validation.attributes.day', 2)}}'),
-        });
+      new Chart(document.getElementById('monthlyChart'), {
+        type: 'line',
+        data: datasets(@json($monthDays), @json($trafficDaily)),
+        options: common_options(' {{trans_choice('validation.attributes.day', 2)}}'),
+      });
     </script>
 @endsection

+ 34 - 33
resources/views/admin/permission/index.blade.php

@@ -6,11 +6,11 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">权限行为列表</h2>
+                <h2 class="panel-title">{{ trans('admin.permission.title') }}</h2>
                 @can('admin.permission.create')
                     <div class="panel-actions">
                         <a href="{{route('admin.permission.create')}}" class="btn btn-outline-primary">
-                            <i class="icon wb-plus" aria-hidden="true"></i>添加权限行为
+                            <i class="icon wb-plus" aria-hidden="true"></i> {{ trans('common.add') }}
                         </a>
                     </div>
                 @endcan
@@ -18,22 +18,23 @@
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-5 col-sm-6">
-                        <input type="text" class="form-control" name="description" value="{{Request::query('description')}}" placeholder="名称"/>
+                        <input type="text" class="form-control" name="description" value="{{Request::query('description')}}"
+                               placeholder="{{ trans('model.permission.description') }}"/>
                     </div>
                     <div class="form-group col-lg-5 col-sm-6">
-                        <input type="text" class="form-control" name="name" value="{{Request::query('name')}}" placeholder="行为"/>
+                        <input type="text" class="form-control" name="name" value="{{Request::query('name')}}" placeholder="{{ trans('model.permission.name') }}"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.permission.index')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.permission.index')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 名称</th>
-                        <th> 行为</th>
+                        <th> {{ trans('model.permission.description') }}</th>
+                        <th> {{ trans('model.permission.name') }}</th>
                         <th> {{trans('common.action')}}</th>
                     </tr>
                     </thead>
@@ -66,7 +67,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$permissions->total()}}</code> 条权限行为
+                        {!! trans('admin.permission.counts', ['num' => $permissions->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -83,32 +84,32 @@
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     @can('admin.permission.destroy')
         <script>
-            function delPermission(url, name) {
-                swal.fire({
-                    title: '{{trans('common.warning')}}',
-                    text: '确定删除 【' + name + '】 权限行为?',
-                    icon: 'warning',
-                    showCancelButton: true,
-                    cancelButtonText: '{{trans('common.close')}}',
-                    confirmButtonText: '{{trans('common.confirm')}}',
-                }).then((result) => {
-                    if (result.value) {
-                        $.ajax({
-                            method: 'DELETE',
-                            url: url,
-                            data: {_token: '{{csrf_token()}}'},
-                            dataType: 'json',
-                            success: function(ret) {
-                                if (ret.status === 'success') {
-                                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                                } else {
-                                    swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                                }
-                            },
-                        });
+          function delPermission(url, name) {
+            swal.fire({
+              title: '{{trans('common.warning')}}',
+              text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.permission.attribute')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
+              icon: 'warning',
+              showCancelButton: true,
+              cancelButtonText: '{{ trans('common.close') }}',
+              confirmButtonText: '{{ trans('common.confirm') }}',
+            }).then((result) => {
+              if (result.value) {
+                $.ajax({
+                  method: 'DELETE',
+                  url: url,
+                  data: {_token: '{{csrf_token()}}'},
+                  dataType: 'json',
+                  success: function(ret) {
+                    if (ret.status === 'success') {
+                      swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                    } else {
+                      swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
                     }
+                  },
                 });
-            }
+              }
+            });
+          }
         </script>
     @endcan
 @endsection

+ 22 - 17
resources/views/admin/permission/info.blade.php

@@ -3,9 +3,12 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">@isset($permission)编辑@else添加@endisset权限行为</h2>
+                <h2 class="panel-title">
+                    {{ isset($permission) ? trans('admin.action.edit_item', ['attribute' => trans('model.permission.attribute')]) : trans('admin.action.add_item', ['attribute'
+                    => trans('model.permission.attribute')]) }}
+                </h2>
                 <div class="panel-actions">
-                    <a href="{{route('admin.permission.index')}}" class="btn btn-danger">返 回</a>
+                    <a href="{{route('admin.permission.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
                 </div>
             </div>
             @if (Session::has('successMsg'))
@@ -17,25 +20,27 @@
             <div class="panel-body">
                 <form action="@isset($permission){{route('admin.permission.update',$permission)}}@else{{route('admin.permission.store')}}@endisset"
                       method="POST" enctype="multipart/form-data" class="form-horizontal">
-                    @isset($permission)@method('PUT')@endisset
+                    @isset($permission)
+                        @method('PUT')
+                    @endisset
                     @csrf
                     <div class="form-group row">
-                        <label class="col-md-2 col-sm-3 col-form-label" for="description">行为描述</label>
+                        <label class="col-md-2 col-sm-3 col-form-label" for="description">{{ trans('model.permission.description') }}</label>
                         <div class="col-md-7 col-sm-8">
                             <input type="text" class="form-control" name="description" id="description" required/>
-                            <span class="text-help"> 填写描述,例:【A系统】编辑A </span>
+                            <span class="text-help"> {{ trans('admin.permission.description_hint') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-sm-3 col-form-label" for="name">路由名称</label>
+                        <label class="col-md-2 col-sm-3 col-form-label" for="name">{{ trans('model.permission.name') }}</label>
                         <div class="col-md-7 col-sm-8">
                             <input type="text" class="form-control" name="name" id="name" required/>
-                            <span class="text-help"> 填写路由名称,例:admin.permission.create,update </span>
+                            <span class="text-help"> {{ trans('admin.permission.name_hint') }} </span>
                         </div>
                     </div>
 
                     <div class="form-actions text-right">
-                        <button type="submit" class="btn btn-success">提 交</button>
+                        <button type="submit" class="btn btn-success">{{ trans('common.submit') }}</button>
                     </div>
                 </form>
             </div>
@@ -44,14 +49,14 @@
 @endsection
 @section('javascript')
     <script>
-        $(document).ready(function() {
-            @isset($permission)
-            $('#description').val(@json(old('description') ?? $permission->description));
-            $('#name').val(@json(old('name') ?? $permission->name));
-            @else
-            $('#description').val(@json(old('description')));
-            $('#name').val(@json(old('name')));
-            @endisset
-        });
+      $(document).ready(function() {
+          @isset($permission)
+          $('#description').val(@json(old('description') ?? $permission->description));
+        $('#name').val(@json(old('name') ?? $permission->name));
+          @else
+          $('#description').val(@json(old('description')));
+        $('#name').val(@json(old('name')));
+          @endisset
+      });
     </script>
 @endsection

+ 131 - 127
resources/views/admin/report/accounting.blade.php

@@ -5,7 +5,7 @@
             <div class="card-block p-30">
                 <div class="row pb-20">
                     <div class="col-md-8 col-sm-6">
-                        <div class="blue-grey-700 font-size-26 font-weight-500">月流水账簿</div>
+                        <div class="blue-grey-700 font-size-26 font-weight-500">{{ trans('admin.report.monthly_accounting') }}</div>
                     </div>
                 </div>
                 <canvas id="days"></canvas>
@@ -15,7 +15,7 @@
             <div class="card-block p-30">
                 <div class="row pb-20">
                     <div class="col-md-8 col-sm-6">
-                        <div class="blue-grey-700 font-size-26 font-weight-500">年流水账簿</div>
+                        <div class="blue-grey-700 font-size-26 font-weight-500">{{ trans('admin.report.annually_accounting') }}</div>
                     </div>
                 </div>
                 <canvas id="months"></canvas>
@@ -25,7 +25,7 @@
             <div class="card-block p-30">
                 <div class="row pb-20">
                     <div class="col-md-8 col-sm-6">
-                        <div class="blue-grey-700 font-size-26 font-weight-500">历史流水账簿</div>
+                        <div class="blue-grey-700 font-size-26 font-weight-500">{{ trans('admin.report.historic_accounting') }}</div>
                     </div>
                 </div>
                 <canvas id="years"></canvas>
@@ -36,138 +36,142 @@
 @section('javascript')
     <script src="/assets/global/vendor/chart-js/chart.min.js"></script>
     <script type="text/javascript">
-        function label_callbacks(tail) {
-            return {
-                mode: 'index',
-                intersect: false,
-                callbacks: {
-                    title: function(context) {
-                        return context[0].label + tail;
-                    },
-                    label: function(context) {
-                        let label = context.dataset.label || '';
+      function label_callbacks(tail) {
+        return {
+          mode: 'index',
+          intersect: false,
+          callbacks: {
+            title: function(context) {
+              return context[0].label + tail;
+            },
+            label: function(context) {
+              let label = context.dataset.label || '';
 
-                        if (label) {
-                            label += ': ';
-                        }
-                        if (context.parsed.y !== null) {
-                            label += new Intl.NumberFormat('ch-CN', {style: 'currency', currency: 'CNY'}).format(context.parsed.y);
-                        }
-                        return label;
-                    },
-                },
-            };
-        }
+              if (label) {
+                label += ': ';
+              }
+              if (context.parsed.y !== null) {
+                label += new Intl.NumberFormat('ch-CN', {style: 'currency', currency: '{{sysConfig('standard_currency')}}'}).format(context.parsed.y);
+              }
+              return label;
+            },
+          },
+        };
+      }
 
-        function common_options(label) {
-            return {
-                responsive: true,
-                scales: {
-                    x: {
-                        grid: {
-                            display: false,
-                        },
-                    },
-                    y: {
-                        grid: {
-                            display: false,
-                        },
-                        min: 0,
-                    },
-                },
-                plugins: {
-                    legend: {
-                        labels: {
-                            padding: 20,
-                            usePointStyle: true,
-                            pointStyle: 'circle',
-                            font: {size: 14},
-                        },
-                    },
-                    tooltip: label_callbacks(label),
-                },
-            };
-        }
+      function common_options(label) {
+        return {
+          responsive: true,
+          scales: {
+            x: {
+              grid: {
+                display: false,
+              },
+            },
+            y: {
+              grid: {
+                display: false,
+              },
+              min: 0,
+            },
+          },
+          plugins: {
+            legend: {
+              labels: {
+                padding: 20,
+                usePointStyle: true,
+                pointStyle: 'circle',
+                font: {size: 14},
+              },
+            },
+            tooltip: label_callbacks(label),
+          },
+        };
+      }
 
-        function area_a(label, data) {
-            return {
-                label: label,
-                backgroundColor: 'rgba(184, 215, 255)',
-                borderColor: 'rgba(184, 215, 255)',
-                data: data,
-                fill: {
-                    target: 'origin',
-                    above: 'rgba(184, 215, 255, 0.5)',
-                },
-                tension: 0.4,
-            };
-        }
+      function area_a(label, data) {
+        return {
+          label: label,
+          backgroundColor: 'rgba(184, 215, 255)',
+          borderColor: 'rgba(184, 215, 255)',
+          data: data,
+          fill: {
+            target: 'origin',
+            above: 'rgba(184, 215, 255, 0.5)',
+          },
+          tension: 0.4,
+        };
+      }
 
-        function area_b(label, data) {
-            return {
-                label: label,
-                backgroundColor: 'rgba(146, 240, 230)',
-                borderColor: 'rgba(146, 240, 230)',
-                data: data,
-                fill: {
-                    target: 'origin',
-                    above: 'rgba(146, 240, 230, 0.5)',
-                },
-                tension: 0.4,
-            };
-        }
+      function area_b(label, data) {
+        return {
+          label: label,
+          backgroundColor: 'rgba(146, 240, 230)',
+          borderColor: 'rgba(146, 240, 230)',
+          data: data,
+          fill: {
+            target: 'origin',
+            above: 'rgba(146, 240, 230, 0.5)',
+          },
+          tension: 0.4,
+        };
+      }
 
-        new Chart(document.getElementById('days'), {
-            type: 'line',
-            data: {
-                labels: @json($data['days']),
-                datasets: [area_a(' 本 月 ',@json($data['currentMonth'])), area_b(' 上 月 ',@json($data['lastMonth']))],
-            },
-            options: common_options(' 日'),
-        });
+      new Chart(document.getElementById('days'), {
+        type: 'line',
+        data: {
+          labels: @json($data['days']),
+          datasets: [
+            area_a('{{ trans('admin.report.current_month') }}',@json($data['currentMonth'])),
+            area_b('{{ trans('admin.report.last_month') }} ',@json($data['lastMonth']))],
+        },
+        options: common_options(' {{ trans_choice('validation.attributes.day', 1) }}'),
+      });
 
-        new Chart(document.getElementById('months'), {
-            type: 'line',
-            data: {
-                labels: @json($data['years']),
-                datasets: [area_a(' 今 年 ',@json($data['currentYear'])), area_b(' 去 年 ',@json($data['lastYear']))],
-            },
-            options: common_options(' 月'),
-        });
+      new Chart(document.getElementById('months'), {
+        type: 'line',
+        data: {
+          labels: @json($data['years']),
+          datasets: [
+            area_a('{{ trans('admin.report.current_year') }}',@json($data['currentYear'])),
+            area_b('{{ trans('admin.report.last_year') }}',@json($data['lastYear']))],
+        },
+        options: common_options(' {{ trans('validation.attributes.month') }}'),
+      });
 
-        new Chart(document.getElementById('years'), {
-            type: 'line',
-            data: {
-                labels: @json(array_keys($data['ordersByYear'])),
-                datasets: [
-                    {
-                        backgroundColor: 'rgba(184, 215, 255)',
-                        borderColor: 'rgba(184, 215, 255)',
-                        data: @json(array_values($data['ordersByYear'])),
-                        fill: {target: 'origin'},
-                        tension: 0.4,
-                    }],
+      new Chart(document.getElementById('years'), {
+        type: 'line',
+        data: {
+          labels: @json(array_keys($data['ordersByYear'])),
+          datasets: [
+            {
+              backgroundColor: 'rgba(184, 215, 255)',
+              borderColor: 'rgba(184, 215, 255)',
+              data: @json(array_values($data['ordersByYear'])),
+              fill: {target: 'origin'},
+              tension: 0.4,
+            }],
+        },
+        options: {
+          responsive: true,
+          scales: {
+            x: {
+              grid: {
+                display: false,
+              },
             },
-            options: {
-                responsive: true,
-                scales: {
-                    x: {
-                        grid: {
-                            display: false,
-                        },
-                    },
-                    y: {
-                        grid: {
-                            display: false,
-                        },
-                        min: 0,
-                    },
-                },
-                plugins: {
-                    legend: false,
-                    tooltip: label_callbacks(' 年'),
-                },
+            y: {
+              grid: {
+                display: false,
+              },
+              min: 0,
             },
-        });
+          },
+          plugins: {
+            legend: false,
+            tooltip: label_callbacks(' {{ trans('validation.attributes.year') }}'),
+          },
+        },
+      });
     </script>
 @endsection

+ 74 - 74
resources/views/admin/report/userDataAnalysis.blade.php

@@ -5,14 +5,14 @@
             <div class="card-block p-30">
                 <form class="form-row">
                     <div class="form-group col-xxl-1 col-lg-1 col-md-1 col-sm-4">
-                        <input type="number" class="form-control" name="uid" value="{{Request::query('uid')}}" placeholder="ID"/>
+                        <input type="number" class="form-control" name="uid" value="{{Request::query('uid')}}" placeholder="{{ trans('model.user.id') }}"/>
                     </div>
                     <div class="form-group col-xxl-2 col-lg-3 col-md-3 col-sm-4">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('model.user.username') }}"/>
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.report.userAnalysis')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.report.userAnalysis')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
             </div>
@@ -22,7 +22,7 @@
                 <div class="card-block p-30">
                     <div class="row pb-20">
                         <div class="col-md-8 col-sm-6">
-                            <div class="blue-grey-700 font-size-26 font-weight-500">每时流量</div>
+                            <div class="blue-grey-700 font-size-26 font-weight-500">{{ trans('admin.report.hourly_traffic') }}</div>
                         </div>
                     </div>
                     <canvas id="hourlyBar"></canvas>
@@ -33,7 +33,7 @@
                 <div class="card-block p-30">
                     <div class="row pb-20">
                         <div class="col-md-8 col-sm-6">
-                            <div class="blue-grey-700 font-size-26 font-weight-500">每天流量</div>
+                            <div class="blue-grey-700 font-size-26 font-weight-500">{{ trans('admin.report.daily_traffic') }}</div>
                         </div>
                     </div>
                     <canvas id="dailyBar"></canvas>
@@ -47,80 +47,80 @@
     @isset($data)
         <script src="/assets/global/vendor/chart-js/chart.min.js"></script>
         <script type="text/javascript">
-            function label_callbacks(tail) {
-                return {
-                    mode: 'index',
-                    intersect: false,
-                    callbacks: {
-                        title: function(context) {
-                            return context[0].label + tail;
-                        },
-                        label: function(context) {
-                            let label = context.dataset.label || '';
-
-                            if (label) {
-                                label += ': ';
-                            }
-                            if (context.parsed.y !== null) {
-                                label += context.parsed.y + ' GB';
-                            }
-                            return label;
-                        },
-                    },
-                };
-            }
-
-            const common_options = {
-                stack:'node_id',
-                parsing: {
-                    xAxisKey: 'date',
-                    yAxisKey: 'total',
+          function label_callbacks(tail) {
+            return {
+              mode: 'index',
+              intersect: false,
+              callbacks: {
+                title: function(context) {
+                  return context[0].label + tail;
                 },
-                responsive: true,
-                plugins: {
-                    legend: {
-                        labels: {
-                            padding: 20,
-                            usePointStyle: true,
-                            pointStyle: 'circle',
-                            font: {size: 14},
-                        },
-                    },
-                    tooltip: label_callbacks(' 日'),
+                label: function(context) {
+                  let label = context.dataset.label || '';
+
+                  if (label) {
+                    label += ': ';
+                  }
+                  if (context.parsed.y !== null) {
+                    label += context.parsed.y + ' GB';
+                  }
+                  return label;
                 },
+              },
             };
+          }
 
-            function area_a(label, data) {
-                return {
-                    label: label,
-                    backgroundColor: 'rgba(184, 215, 255)',
-                    borderColor: 'rgba(184, 215, 255)',
-                    data: data,
-                    fill: {
-                        target: 'origin',
-                        above: 'rgba(184, 215, 255, 0.5)',
-                    },
-                    tension: 0.4,
-                };
-            }
-
-            new Chart(document.getElementById('hourlyBar'), {
-                type: 'bar',
-                data: {
-                    labels: @json($data['hours']),
-                    datasets: [area_a(' 本 日 ',@json($data['hourlyFlow']))],
+          const common_options = {
+            stack: 'node_id',
+            parsing: {
+              xAxisKey: 'date',
+              yAxisKey: 'total',
+            },
+            responsive: true,
+            plugins: {
+              legend: {
+                labels: {
+                  padding: 20,
+                  usePointStyle: true,
+                  pointStyle: 'circle',
+                  font: {size: 14},
                 },
-                options: common_options,
-            });
+              },
+              tooltip: label_callbacks(' {{ trans_choice('validation.attributes.day', 1) }}'),
+            },
+          };
 
-            new Chart(document.getElementById('dailyBar'), {
-                type: 'bar',
-                data: {
-                    labels: @json($data['days']),
-                    datasets: [area_a(' 本 月 ',@json($data['dailyFlow']))],
-                },
-                options: common_options,
-            });
+          function area_a(label, data) {
+            return {
+              label: label,
+              backgroundColor: 'rgba(184, 215, 255)',
+              borderColor: 'rgba(184, 215, 255)',
+              data: data,
+              fill: {
+                target: 'origin',
+                above: 'rgba(184, 215, 255, 0.5)',
+              },
+              tension: 0.4,
+            };
+          }
+
+          new Chart(document.getElementById('hourlyBar'), {
+            type: 'bar',
+            data: {
+              labels: @json($data['hours']),
+              datasets: [area_a('{{ trans('admin.report.today') }}',@json($data['hourlyFlow']))],
+            },
+            options: common_options,
+          });
+
+          new Chart(document.getElementById('dailyBar'), {
+            type: 'bar',
+            data: {
+              labels: @json($data['days']),
+              datasets: [area_a('{{ trans('admin.report.current_month') }}',@json($data['dailyFlow']))],
+            },
+            options: common_options,
+          });
         </script>
     @endisset
 @endsection

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

@@ -6,11 +6,11 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">权限角色列表</h2>
+                <h2 class="panel-title">{{ trans('admin.role.title') }}</h2>
                 @can('admin.role.create')
                     <div class="panel-actions">
                         <a href="{{route('admin.role.create')}}" class="btn btn-outline-primary">
-                            <i class="icon wb-plus" aria-hidden="true"></i>添加角色
+                            <i class="icon wb-plus" aria-hidden="true"></i> {{ trans('common.add') }}
                         </a>
                     </div>
                 @endcan
@@ -20,8 +20,8 @@
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 名称</th>
-                        <th> 权限</th>
+                        <th> {{ trans('model.role.name') }}</th>
+                        <th> {{ trans('model.role.permissions') }}</th>
                         <th> {{trans('common.action')}}</th>
                     </tr>
                     </thead>
@@ -32,7 +32,7 @@
                             <td>{{$role->description}}</td>
                             <td>
                                 @if ($role->name === 'Super Admin')
-                                    <span class="badge badge-info">全部权限</span>
+                                    <span class="badge badge-info">{{ trans('admin.role.permissions_all') }}</span>
                                 @else
                                     @foreach($role->permissions()->pluck('description') as $description)
                                         <span class="badge badge-info">{{ $description }}</span>
@@ -61,7 +61,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$roles->total()}}</code> 个权限角色
+                        {!! trans('admin.role.counts', ['num' => $roles->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -78,32 +78,32 @@
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     @can('admin.role.destroy')
         <script>
-            function delRole(url, name) {
-                swal.fire({
-                    title: '{{trans('common.warning')}}',
-                    text: '确定删除 【' + name + '】 权限角色?',
-                    icon: 'warning',
-                    showCancelButton: true,
-                    cancelButtonText: '{{trans('common.close')}}',
-                    confirmButtonText: '{{trans('common.confirm')}}',
-                }).then((result) => {
-                    if (result.value) {
-                        $.ajax({
-                            method: 'DELETE',
-                            url: url,
-                            data: {_token: '{{csrf_token()}}'},
-                            dataType: 'json',
-                            success: function(ret) {
-                                if (ret.status === 'success') {
-                                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                                } else {
-                                    swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                                }
-                            },
-                        });
+          function delRole(url, name) {
+            swal.fire({
+              title: '{{ trans('common.warning') }}',
+              text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.role.attribute')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
+              icon: 'warning',
+              showCancelButton: true,
+              cancelButtonText: '{{ trans('common.close') }}',
+              confirmButtonText: '{{ trans('common.confirm') }}',
+            }).then((result) => {
+              if (result.value) {
+                $.ajax({
+                  method: 'DELETE',
+                  url: url,
+                  data: {_token: '{{csrf_token()}}'},
+                  dataType: 'json',
+                  success: function(ret) {
+                    if (ret.status === 'success') {
+                      swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                    } else {
+                      swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
                     }
+                  },
                 });
-            }
+              }
+            });
+          }
         </script>
     @endcan
 @endsection

+ 52 - 47
resources/views/admin/role/info.blade.php

@@ -11,9 +11,12 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">@isset($role)编辑@else添加@endisset角色</h2>
+                <h2 class="panel-title">
+                    {{ isset($role) ? trans('admin.action.edit_item', ['attribute' => trans('model.role.attribute')]) : trans('admin.action.add_item', ['attribute' =>
+                     trans('model.role.attribute')]) }}
+                </h2>
                 <div class="panel-actions">
-                    <a href="{{route('admin.role.index')}}" class="btn btn-danger">返 回</a>
+                    <a href="{{route('admin.role.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
                 </div>
             </div>
             @if (Session::has('successMsg'))
@@ -25,28 +28,30 @@
             <div class="panel-body">
                 <form action="@isset($role){{route('admin.role.update',$role)}}@else{{route('admin.role.store')}}@endisset"
                       method="POST" enctype="multipart/form-data" class="form-horizontal">
-                    @isset($role)@method('PUT')@endisset
+                    @isset($role)
+                        @method('PUT')
+                    @endisset
                     @csrf
                     <div class="form-group row">
-                        <label class="col-md-2 col-sm-3 col-form-label" for="name">名称</label>
+                        <label class="col-md-2 col-sm-3 col-form-label" for="name">{{ trans('model.role.name') }}</label>
                         <div class="col-md-5 col-sm-9">
                             <input type="text" class="form-control" name="name" id="name" required/>
-                            <span class="text-help"> 唯一标识名称,例如:Administrator </span>
+                            <span class="text-help"> {{ trans('admin.role.name_hint') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-sm-3 col-form-label" for="description">描述名称</label>
+                        <label class="col-md-2 col-sm-3 col-form-label" for="description">{{ trans('model.common.description') }}</label>
                         <div class="col-md-5 col-sm-9">
                             <input type="text" class="form-control" name="description" id="description" required/>
-                            <span class="text-help"> 面板显示名称,例如:管理员 </span>
+                            <span class="text-help"> {{ trans('admin.role.description_hint') }} </span>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-sm-3 col-form-label" for="permissions">选择权限</label>
+                        <label class="col-md-2 col-sm-3 col-form-label" for="permissions">{{ trans('model.role.permissions') }}</label>
                         <div class="col-md-9 col-sm-9">
                             <div class="btn-group mb-20">
-                                <button type="button" class="btn btn-primary" id="select-all">全 选</button>
-                                <button type="button" class="btn btn-danger" id="deselect-all">清 空</button>
+                                <button type="button" class="btn btn-primary" id="select-all">{{ trans('admin.select_all') }}</button>
+                                <button type="button" class="btn btn-danger" id="deselect-all">{{ trans('admin.clear') }}</button>
                             </div>
                             <select class="form-control mx-auto w-p100" name="permissions[]" id="permissions" data-plugin="multiSelect" multiple>
                                 @foreach($permissions as $key => $description)
@@ -56,7 +61,7 @@
                         </div>
                     </div>
                     <div class="form-actions text-right">
-                        <button type="submit" class="btn btn-success">提 交</button>
+                        <button type="submit" class="btn btn-success">{{ trans('common.submit') }}</button>
                     </div>
                 </form>
             </div>
@@ -70,56 +75,56 @@
     <script>
         @isset($role)
         $(document).ready(function() {
-            $('#description').val('{{$role->description}}');
-            $('#name').val('{{$role->name}}');
-            $('#permissions').multiSelect('select',@json($role->permissions->pluck('name')));
+          $('#description').val('{{$role->description}}');
+          $('#name').val('{{$role->name}}');
+          $('#permissions').multiSelect('select',@json($role->permissions->pluck('name')));
         });
         @endisset
         // 权限列表
         $('#permissions').multiSelect({
-            selectableHeader: '<input type=\'text\' class=\'search-input form-control\' autocomplete=\'off\' placeholder=\'待分配规则,此处可搜索\'>',
-            selectionHeader: '<input type=\'text\' class=\'search-input form-control\' autocomplete=\'off\' placeholder=\'已分配规则,此处可搜索\'>',
-            afterInit: function() {
-                const that = this,
-                    $selectableSearch = that.$selectableUl.prev(),
-                    $selectionSearch = that.$selectionUl.prev(),
-                    selectableSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selectable:not(.ms-selected)',
-                    selectionSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selection.ms-selected';
+          selectableHeader: '<input type=\'text\' class=\'search-input form-control\' autocomplete=\'off\' placeholder=\'{{ trans('admin.unselected_hint') }}\'>',
+          selectionHeader: '<input type=\'text\' class=\'search-input form-control\' autocomplete=\'off\' placeholder=\'{{ trans('admin.selected_hint') }}\'>',
+          afterInit: function() {
+            const that = this,
+                $selectableSearch = that.$selectableUl.prev(),
+                $selectionSearch = that.$selectionUl.prev(),
+                selectableSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selectable:not(.ms-selected)',
+                selectionSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selection.ms-selected';
 
-                that.qs1 = $selectableSearch.quicksearch(selectableSearchString).on('keydown', function(e) {
-                    if (e.which === 40) {
-                        that.$selectableUl.focus();
-                        return false;
-                    }
-                });
+            that.qs1 = $selectableSearch.quicksearch(selectableSearchString).on('keydown', function(e) {
+              if (e.which === 40) {
+                that.$selectableUl.focus();
+                return false;
+              }
+            });
 
-                that.qs2 = $selectionSearch.quicksearch(selectionSearchString).on('keydown', function(e) {
-                    if (e.which === 40) {
-                        that.$selectionUl.focus();
-                        return false;
-                    }
-                });
-            },
-            afterSelect: function() {
-                this.qs1.cache();
-                this.qs2.cache();
-            },
-            afterDeselect: function() {
-                this.qs1.cache();
-                this.qs2.cache();
-            },
+            that.qs2 = $selectionSearch.quicksearch(selectionSearchString).on('keydown', function(e) {
+              if (e.which === 40) {
+                that.$selectionUl.focus();
+                return false;
+              }
+            });
+          },
+          afterSelect: function() {
+            this.qs1.cache();
+            this.qs2.cache();
+          },
+          afterDeselect: function() {
+            this.qs1.cache();
+            this.qs2.cache();
+          },
         });
 
         // 全选
         $('#select-all').click(function() {
-            $('#permissions').multiSelect('select_all');
-            return false;
+          $('#permissions').multiSelect('select_all');
+          return false;
         });
 
         // 反选
         $('#deselect-all').click(function() {
-            $('#permissions').multiSelect('deselect_all');
-            return false;
+          $('#permissions').multiSelect('deselect_all');
+          return false;
         });
     </script>
 @endsection

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

@@ -6,11 +6,11 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">规则分组</h2>
+                <h2 class="panel-title">{{ trans('admin.rule.group.title') }}</h2>
                 @can('admin.rule.group.create')
                     <div class="panel-actions">
                         <a href="{{route('admin.rule.group.create')}}" class="btn btn-outline-primary">
-                            <i class="icon wb-plus" aria-hidden="true"></i>添加分组
+                            <i class="icon wb-plus" aria-hidden="true"></i> {{ trans('common.add') }}
                         </a>
                     </div>
                 @endcan
@@ -20,8 +20,8 @@
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 分组名称</th>
-                        <th> 审计模式</th>
+                        <th> {{ trans('model.rule_group.name') }}</th>
+                        <th> {{ trans('model.rule_group.type') }}</th>
                         <th> {{trans('common.action')}}</th>
                     </tr>
                     </thead>
@@ -36,13 +36,13 @@
                                     <div class="btn-group">
                                         @can('admin.rule.group.edit')
                                             <a href="{{route('admin.rule.group.edit', $ruleGroup)}}" class="btn btn-sm btn-outline-primary">
-                                                <i class="icon wb-edit"></i>编辑
+                                                <i class="icon wb-edit"></i> {{ trans('common.edit') }}
                                             </a>
                                         @endcan
                                         @can('admin.rule.group.destroy')
                                             <button onclick="delRuleGroup('{{route('admin.rule.group.destroy', $ruleGroup)}}', '{{$ruleGroup->name}}')"
                                                     class="btn btn-sm btn-outline-danger">
-                                                <i class="icon wb-trash"></i>删除
+                                                <i class="icon wb-trash"></i> {{ trans('common.delete') }}
                                             </button>
                                         @endcan
                                     </div>
@@ -56,7 +56,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$ruleGroups->total()}}</code> 个分组
+                        {!! trans('admin.rule.group.counts', ['num' => $ruleGroups->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -73,33 +73,33 @@
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     @can('admin.rule.group.destroy')
         <script>
-            // 删除规则分组
-            function delRuleGroup(url, name) {
-                swal.fire({
-                    title: '{{trans('common.warning')}}',
-                    text: '确定删除分组 【' + name + '】 ?',
-                    icon: 'warning',
-                    showCancelButton: true,
-                    cancelButtonText: '{{trans('common.close')}}',
-                    confirmButtonText: '{{trans('common.confirm')}}',
-                }).then((result) => {
-                    if (result.value) {
-                        $.ajax({
-                            method: 'DELETE',
-                            url: url,
-                            data: {_token: '{{csrf_token()}}'},
-                            dataType: 'json',
-                            success: function(ret) {
-                                if (ret.status === 'success') {
-                                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                                } else {
-                                    swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                                }
-                            },
-                        });
+          // 删除规则分组
+          function delRuleGroup(url, name) {
+            swal.fire({
+              title: '{{trans('common.warning')}}',
+              text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.rule_group.attribute')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
+              icon: 'warning',
+              showCancelButton: true,
+              cancelButtonText: '{{trans('common.close')}}',
+              confirmButtonText: '{{trans('common.confirm')}}',
+            }).then((result) => {
+              if (result.value) {
+                $.ajax({
+                  method: 'DELETE',
+                  url: url,
+                  data: {_token: '{{csrf_token()}}'},
+                  dataType: 'json',
+                  success: function(ret) {
+                    if (ret.status === 'success') {
+                      swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                    } else {
+                      swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
                     }
+                  },
                 });
-            }
+              }
+            });
+          }
         </script>
     @endcan
 @endsection

+ 52 - 47
resources/views/admin/rule/group/info.blade.php

@@ -6,9 +6,12 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">@isset($ruleGroup)编辑@else添加@endisset规则分组</h2>
+                <h2 class="panel-title">
+                    {{ isset($ruleGroup) ? trans('admin.action.edit_item', ['attribute' => trans('model.rule_group.attribute')]) : trans('admin.action.add_item', ['attribute' =>
+                     trans('model.rule_group.attribute')]) }}
+                </h2>
                 <div class="panel-actions">
-                    <a href="{{route('admin.rule.group.index')}}" class="btn btn-danger">返 回</a>
+                    <a href="{{route('admin.rule.group.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
                 </div>
             </div>
             @if (Session::has('successMsg'))
@@ -20,38 +23,40 @@
             <div class="panel-body">
                 <form action="{{isset($ruleGroup) ? route('admin.rule.group.update', $ruleGroup) : route('admin.rule.group.store')}}" method="post"
                       enctype="multipart/form-data" class="form-horizontal">
-                    @isset($ruleGroup)@method('PUT')@endisset @csrf
+                    @isset($ruleGroup)
+                        @method('PUT')
+                    @endisset @csrf
                     <div class="form-group row">
-                        <label class="col-md-2 col-sm-3 col-form-label" for="name">分组名称</label>
+                        <label class="col-md-2 col-sm-3 col-form-label" for="name">{{ trans('model.rule_group.name') }}</label>
                         <div class="col-md-9 col-sm-9">
                             <input type="text" class="form-control" name="name" id="name"/>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-sm-3 col-form-label" for="type">审计模式</label>
+                        <label class="col-md-2 col-sm-3 col-form-label" for="type">{{ trans('model.rule_group.type') }}</label>
                         <div class="col-md-10 col-sm-8">
                             <ul class="list-unstyled list-inline">
                                 <li class="list-inline-item">
                                     <div class="radio-custom radio-primary">
                                         <input type="radio" name="type" id="block" value="1" checked/>
-                                        <label for="block">阻断</label>
+                                        <label for="block">{{ trans('admin.rule.group.type.off') }}</label>
                                     </div>
                                 </li>
                                 <li class="list-inline-item">
                                     <div class="radio-custom radio-primary">
                                         <input type="radio" name="type" id="unblock" value="0"/>
-                                        <label for="unblock">放行</label>
+                                        <label for="unblock">{{ trans('admin.rule.group.type.on') }}</label>
                                     </div>
                                 </li>
                             </ul>
                         </div>
                     </div>
                     <div class="form-group row">
-                        <label class="col-md-2 col-sm-3 col-form-label" for="rules">选择规则</label>
+                        <label class="col-md-2 col-sm-3 col-form-label" for="rules">{{ trans('model.rule_group.rules') }}</label>
                         <div class="col-md-9 col-sm-9">
                             <div class="btn-group mb-20">
-                                <button type="button" class="btn btn-primary" id="select-all">全 选</button>
-                                <button type="button" class="btn btn-danger" id="deselect-all">清 空</button>
+                                <button type="button" class="btn btn-primary" id="select-all">{{ trans('admin.select_all') }}</button>
+                                <button type="button" class="btn btn-danger" id="deselect-all">{{ trans('admin.clear') }}</button>
                             </div>
                             <select class="form-control" name="rules[]" id="rules" data-plugin="multiSelect" multiple>
                                 @foreach($rules as $rule)
@@ -61,7 +66,7 @@
                         </div>
                     </div>
                     <div class="form-actions text-right">
-                        <button type="submit" class="btn btn-success">提 交</button>
+                        <button type="submit" class="btn btn-success">{{ trans('common.submit') }}</button>
                     </div>
                 </form>
             </div>
@@ -75,56 +80,56 @@
     <script>
         @isset($ruleGroup)
         $(document).ready(function() {
-            $('#name').val('{{$ruleGroup->name}}');
-            $("input[name='type'][value='{{$ruleGroup->type}}']").click();
-            $('#rules').multiSelect('select', @json(array_map('strval', $ruleGroup->rules()->get()->pluck('id')->toArray())));
+          $('#name').val('{{$ruleGroup->name}}');
+          $("input[name='type'][value='{{$ruleGroup->type}}']").click();
+          $('#rules').multiSelect('select', @json(array_map('strval', $ruleGroup->rules()->get()->pluck('id')->toArray())));
         });
         @endisset
         // 权限列表
         $('#rules').multiSelect({
-            selectableHeader: '<input type=\'text\' class=\'search-input form-control\' autocomplete=\'off\' placeholder=\'待分配规则,此处可搜索\'>',
-            selectionHeader: '<input type=\'text\' class=\'search-input form-control\' autocomplete=\'off\' placeholder=\'已分配规则,此处可搜索\'>',
-            afterInit: function() {
-                const that = this,
-                    $selectableSearch = that.$selectableUl.prev(),
-                    $selectionSearch = that.$selectionUl.prev(),
-                    selectableSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selectable:not(.ms-selected)',
-                    selectionSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selection.ms-selected';
+          selectableHeader: '<input type=\'text\' class=\'search-input form-control\' autocomplete=\'off\' placeholder=\'{{ trans('admin.unselected_hint') }}\'>',
+          selectionHeader: '<input type=\'text\' class=\'search-input form-control\' autocomplete=\'off\' placeholder=\'{{ trans('admin.selected_hint') }}\'>',
+          afterInit: function() {
+            const that = this,
+                $selectableSearch = that.$selectableUl.prev(),
+                $selectionSearch = that.$selectionUl.prev(),
+                selectableSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selectable:not(.ms-selected)',
+                selectionSearchString = '#' + that.$container.attr('id') + ' .ms-elem-selection.ms-selected';
 
-                that.qs1 = $selectableSearch.quicksearch(selectableSearchString).on('keydown', function(e) {
-                    if (e.which === 40) {
-                        that.$selectableUl.focus();
-                        return false;
-                    }
-                });
+            that.qs1 = $selectableSearch.quicksearch(selectableSearchString).on('keydown', function(e) {
+              if (e.which === 40) {
+                that.$selectableUl.focus();
+                return false;
+              }
+            });
 
-                that.qs2 = $selectionSearch.quicksearch(selectionSearchString).on('keydown', function(e) {
-                    if (e.which === 40) {
-                        that.$selectionUl.focus();
-                        return false;
-                    }
-                });
-            },
-            afterSelect: function() {
-                this.qs1.cache();
-                this.qs2.cache();
-            },
-            afterDeselect: function() {
-                this.qs1.cache();
-                this.qs2.cache();
-            },
+            that.qs2 = $selectionSearch.quicksearch(selectionSearchString).on('keydown', function(e) {
+              if (e.which === 40) {
+                that.$selectionUl.focus();
+                return false;
+              }
+            });
+          },
+          afterSelect: function() {
+            this.qs1.cache();
+            this.qs2.cache();
+          },
+          afterDeselect: function() {
+            this.qs1.cache();
+            this.qs2.cache();
+          },
         });
 
         // 全选
         $('#select-all').click(function() {
-            $('#rules').multiSelect('select_all');
-            return false;
+          $('#rules').multiSelect('select_all');
+          return false;
         });
 
         // 反选
         $('#deselect-all').click(function() {
-            $('#rules').multiSelect('deselect_all');
-            return false;
+          $('#rules').multiSelect('deselect_all');
+          return false;
         });
     </script>
 @endsection

+ 117 - 116
resources/views/admin/rule/index.blade.php

@@ -7,11 +7,11 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">规则列表</h2>
+                <h2 class="panel-title">{{ trans('admin.rule.title') }}</h2>
                 @can('admin.rule.store')
                     <div class="panel-actions">
                         <button data-toggle="modal" data-target="#add" class="btn btn-outline-primary">
-                            <i class="icon wb-plus" aria-hidden="true"></i>添加规则
+                            <i class="icon wb-plus" aria-hidden="true"></i> {{ trans('common.add') }}
                         </button>
                     </div>
                 @endcan
@@ -19,11 +19,12 @@
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4">
-                        <select class="form-control" name="type" data-plugin="selectpicker" data-style="btn-outline btn-primary" title="类型" onchange="this.form.submit()">
-                            <option value="1">正则表达式</option>
-                            <option value="2">域名</option>
-                            <option value="3">IP</option>
-                            <option value="4">协议</option>
+                        <select class="form-control" name="type" data-plugin="selectpicker" data-style="btn-outline btn-primary" title="{{ trans('model.rule.attribute') }}"
+                                onchange="this.form.submit()">
+                            <option value="1">{{ trans('admin.rule.type.reg') }}</option>
+                            <option value="2">{{ trans('admin.rule.type.domain') }}</option>
+                            <option value="3">{{ trans('admin.rule.type.ip') }}</option>
+                            <option value="4">{{ trans('admin.rule.type.protocol') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4">
@@ -34,9 +35,9 @@
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 类型</th>
-                        <th> 描述</th>
-                        <th> </th>
+                        <th> {{ trans('model.rule.type') }}</th>
+                        <th> {{ trans('model.rule.name') }}</th>
+                        <th> {{ trans('model.rule.pattern') }}</th>
                         <th> {{trans('common.action')}}</th>
                     </tr>
                     </thead>
@@ -73,7 +74,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$rules->total()}}</code> 条审计规则
+                        {!! trans('admin.rule.counts', ['num' => $rules->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -93,25 +94,25 @@
                         <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                             <span aria-hidden="true">×</span>
                         </button>
-                        <h4 class="modal-title">添加规则</h4>
+                        <h4 class="modal-title">{{ trans('admin.action.add_item', ['attribute' => trans('model.rule.attribute')]) }}</h4>
                     </div>
                     <form action="#" method="post" class="modal-body">
                         <div class="alert alert-danger" style="display: none;" id="msg"></div>
                         <div class="form-row">
                             <div class="col-12">
                                 <div class="form-group row">
-                                    <label class="col-md-2 col-sm-3 col-form-label" for="add_type">类型</label>
+                                    <label class="col-md-2 col-sm-3 col-form-label" for="add_type">{{ trans('model.rule.type') }}</label>
                                     <div class="col-xl-4 col-sm-8">
                                         <select class="form-control" name="add_type" id="add_type" data-plugin="selectpicker" data-style="btn-outline btn-primary">
-                                            <option value="1">正则表达式</option>
-                                            <option value="2">域名</option>
-                                            <option value="3">IP</option>
-                                            <option value="4">协议</option>
+                                            <option value="1">{{ trans('admin.rule.type.reg') }}</option>
+                                            <option value="2">{{ trans('admin.rule.type.domain') }}</option>
+                                            <option value="3">{{ trans('admin.rule.type.ip') }}</option>
+                                            <option value="4">{{ trans('admin.rule.type.protocol') }}</option>
                                         </select>
                                     </div>
                                 </div>
                                 <div class="form-group row">
-                                    <label class="col-md-2 col-sm-3 col-form-label" for="name">描述</label>
+                                    <label class="col-md-2 col-sm-3 col-form-label" for="name">{{ trans('model.rule.name') }}</label>
                                     <div class="col-xl-6 col-sm-8">
                                         <input type="text" class="form-control" name="name" id="name" required/>
                                     </div>
@@ -119,7 +120,7 @@
                             </div>
                             <div class="col-12">
                                 <div class="form-group row">
-                                    <label class="col-md-2 col-sm-3 col-form-label" for="pattern"></label>
+                                    <label class="col-md-2 col-sm-3 col-form-label" for="pattern">{{ trans('model.rule.pattern') }}</label>
                                     <div class="col-xl-6 col-sm-8">
                                         <input type="text" class="form-control" name="pattern" id="pattern" required/>
                                     </div>
@@ -128,8 +129,8 @@
                         </div>
                     </form>
                     <div class="modal-footer">
-                        <button data-dismiss="modal" class="btn btn-danger mr-auto">关 闭</button>
-                        <button type="button" class="btn btn-primary" onclick="addRule()">添 加</button>
+                        <button data-dismiss="modal" class="btn btn-danger mr-auto">{{ trans('common.close') }}</button>
+                        <button type="button" class="btn btn-primary" onclick="addRule()">{{ trans('common.add') }}</button>
                     </div>
                 </div>
             </div>
@@ -142,107 +143,107 @@
     <script src="/assets/global/vendor/bootstrap-select/bootstrap-select.min.js"></script>
     <script src="/assets/global/js/Plugin/bootstrap-select.js"></script>
     <script>
-        $(document).ready(function() {
-            $('select').selectpicker('val', {{Request::query('type')}});
+      $(document).ready(function() {
+        $('select').selectpicker('val', {{Request::query('type')}});
+      });
+
+      @can('admin.rule.store')
+      // 添加规则
+      function addRule() {
+        $.ajax({
+          method: 'POST',
+          url: "{{route('admin.rule.store')}}",
+          data: {
+            _token: '{{csrf_token()}}',
+            type: $('#add_type').val(),
+            name: $('#name').val(),
+            pattern: $('#pattern').val(),
+          },
+          dataType: 'json',
+          success: function(ret) {
+            $('#add').modal('hide');
+            if (ret.status === 'success') {
+              swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+            } else {
+              swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+            }
+          },
+          error: function(data) {
+            $('#add').modal('hide');
+            let str = '';
+            const errors = data.responseJSON;
+            if ($.isEmptyObject(errors) === false) {
+              $.each(errors.errors, function(index, value) {
+                str += '<li>' + value + '</li>';
+              });
+              swal.fire({title: '{{ trans('admin.hint') }}', html: str, icon: 'error', confirmButtonText: '{{ trans('common.confirm') }}'});
+            }
+          },
         });
+      }
+      @endcan
 
-        @can('admin.rule.store')
-        // 添加规则
-        function addRule() {
-            $.ajax({
-                method: 'POST',
-                url: "{{route('admin.rule.store')}}",
-                data: {
-                    _token: '{{csrf_token()}}',
-                    type: $('#add_type').val(),
-                    name: $('#name').val(),
-                    pattern: $('#pattern').val(),
-                },
-                dataType: 'json',
-                success: function(ret) {
-                    $('#add').modal('hide');
-                    if (ret.status === 'success') {
-                        swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                    } else {
-                        swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                    }
-                },
-                error: function(data) {
-                    $('#add').modal('hide');
-                    let str = '';
-                    const errors = data.responseJSON;
-                    if ($.isEmptyObject(errors) === false) {
-                        $.each(errors.errors, function(index, value) {
-                            str += '<li>' + value + '</li>';
-                        });
-                        swal.fire({title: '提示', html: str, icon: 'error', confirmButtonText: '{{trans('common.confirm')}}'});
-                    }
-                },
-            });
-        }
-        @endcan
+      @can('admin.rule.update')
+      // 编辑规则
+      function editRule(id) {
+        $.ajax({
+          method: 'PUT',
+          url: '{{route('admin.rule.update','')}}/' + id,
+          data: {
+            _token: '{{csrf_token()}}',
+            name: $('#name_' + id).val(),
+            pattern: $('#pattern_' + id).val(),
+          },
+          dataType: 'json',
+          success: function(ret) {
+            if (ret.status === 'success') {
+              swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+            } else {
+              swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+            }
+          },
+          error: function(data) {
+            let str = '';
+            const errors = data.responseJSON;
+            if ($.isEmptyObject(errors) === false) {
+              $.each(errors.errors, function(index, value) {
+                str += '<li>' + value + '</li>';
+              });
+              swal.fire({title: '{{ trans('admin.hint') }}', html: str, icon: 'error', confirmButtonText: '{{ trans('common.confirm') }}'});
+            }
+          },
+        });
+      }
+      @endcan
 
-        @can('admin.rule.update')
-        // 编辑规则
-        function editRule(id) {
+      @can('admin.rule.destroy')
+      // 删除规则
+      function delRule(url, name) {
+        swal.fire({
+          title: '{{trans('common.warning')}}',
+          text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.rule.attribute')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
+          icon: 'warning',
+          showCancelButton: true,
+          cancelButtonText: '{{trans('common.close')}}',
+          confirmButtonText: '{{trans('common.confirm')}}',
+        }).then((result) => {
+          if (result.value) {
             $.ajax({
-                method: 'PUT',
-                url: '{{route('admin.rule.update','')}}/' + id,
-                data: {
-                    _token: '{{csrf_token()}}',
-                    name: $('#name_' + id).val(),
-                    pattern: $('#pattern_' + id).val(),
-                },
-                dataType: 'json',
-                success: function(ret) {
-                    if (ret.status === 'success') {
-                        swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                    } else {
-                        swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                    }
-                },
-                error: function(data) {
-                    let str = '';
-                    const errors = data.responseJSON;
-                    if ($.isEmptyObject(errors) === false) {
-                        $.each(errors.errors, function(index, value) {
-                            str += '<li>' + value + '</li>';
-                        });
-                        swal.fire({title: '提示', html: str, icon: 'error', confirmButtonText: '{{trans('common.confirm')}}'});
-                    }
-                },
-            });
-        }
-        @endcan
-
-        @can('admin.rule.destroy')
-        // 删除规则
-        function delRule(url, name) {
-            swal.fire({
-                title: '{{trans('common.warning')}}',
-                text: '确定删除规则 【' + name + '】 ?',
-                icon: 'warning',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'DELETE',
-                        url: url,
-                        data: {_token: '{{csrf_token()}}'},
-                        dataType: 'json',
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                            } else {
-                                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                            }
-                        },
-                    });
+              method: 'DELETE',
+              url: url,
+              data: {_token: '{{csrf_token()}}'},
+              dataType: 'json',
+              success: function(ret) {
+                if (ret.status === 'success') {
+                  swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                } else {
+                  swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
                 }
+              },
             });
-        }
+          }
+        });
+      }
         @endcan
     </script>
 @endsection

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

@@ -6,11 +6,11 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">触发记录</h2>
+                <h2 class="panel-title">{{ trans('admin.logs.rule.title') }}</h2>
                 @can('admin.rule.clear')
                     <div class="panel-actions">
                         <button onclick="clearLog()" class="btn btn-outline-primary">
-                            <i class="icon wb-rubber" aria-hidden="true"></i>清空记录
+                            <i class="icon wb-rubber" aria-hidden="true"></i>{{ trans('admin.logs.rule.clear_all') }}
                         </button>
                     </div>
                 @endcan
@@ -18,14 +18,14 @@
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-xxl-1 col-lg-2 col-md-1 col-sm-4">
-                        <input type="number" class="form-control" name="user_id" value="{{Request::query('user_id')}}" placeholder="用户ID"/>
+                        <input type="number" class="form-control" name="user_id" value="{{Request::query('user_id')}}" placeholder="{{ trans('model.user.id') }}"/>
                     </div>
                     <div class="form-group col-xxl-2 col-lg-3 col-md-3 col-sm-4">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('model.user.username') }}"/>
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4">
                         <select class="form-control" id="node_id" name="node_id">
-                            <option value="" hidden>节点</option>
+                            <option value="" hidden>{{ trans('model.node.attribute') }}</option>
                             @foreach($nodes as $node)
                                 <option value="{{$node->id}}">{{$node->id . ' - ' . $node->name}}</option>
                             @endforeach
@@ -33,27 +33,27 @@
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4">
                         <select class="form-control" id="rule_id" name="rule_id">
-                            <option value="" hidden>规则</option>
+                            <option value="" hidden>{{ trans('model.rule.attribute') }}</option>
                             @foreach($rules as $rule)
                                 <option value="{{$rule->id}}">{{$rule->name}}</option>
                             @endforeach
                         </select>
                     </div>
                     <div class="form-group col-xxl-1 col-lg-3 col-md-3 col-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.rule.log')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.rule.log')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 用户ID</th>
-                        <th> 用户账号</th>
-                        <th> 节点</th>
-                        <th> 触发规则</th>
-                        <th> 触发原因</th>
-                        <th> 触发时间</th>
+                        <th> UID</th>
+                        <th> {{ trans('model.user.username') }}</th>
+                        <th> {{ trans('model.node.attribute') }}</th>
+                        <th> {{ trans('admin.logs.rule.name') }}</th>
+                        <th> {{ trans('admin.logs.rule.reason') }}</th>
+                        <th> {{ trans('admin.logs.rule.created_at') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -62,8 +62,8 @@
                             <td> {{$ruleLog->id}} </td>
                             <td> {{$ruleLog->user->id ?? '【'.trans('common.deleted_item', ['attribute' => trans('common.account')]).'】'}} </td>
                             <td> {{$ruleLog->user->username ?? '【'.trans('common.deleted_item', ['attribute' => trans('common.account')]).'】'}} </td>
-                            <td> {{empty($ruleLog->node) ? '【节点已删除】' : '【节点ID:' . $ruleLog->node_id . '】' . $ruleLog->node->name}} </td>
-                            <td> {{$ruleLog->rule_id ? '⛔  ' . ($ruleLog->rule->name ?? '【规则已删除】') : '✅  访问非规则允许内容'}} </td>
+                            <td> {{empty($ruleLog->node) ? '【'.trans('common.deleted_item', ['attribute' => trans('model.node.attribute')]).'】' : '【'.trans('model.node.attribute').'#: ' . $ruleLog->node_id . '】' . $ruleLog->node->name}} </td>
+                            <td> {{$ruleLog->rule_id ? '⛔  ' . ($ruleLog->rule->name ?? '【'.trans('common.deleted_item', ['attribute' => trans('model.rule.attribute')]).'】') : trans('admin.logs.rule.tag')}} </td>
                             <td> {{$ruleLog->reason}} </td>
                             <td> {{$ruleLog->created_at}} </td>
                         </tr>
@@ -74,7 +74,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$ruleLogs->total()}}</code> 条记录
+                        {!! trans('admin.logs.counts', ['num' => $ruleLogs->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -90,35 +90,35 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#node_id').val({{Request::query('node_id')}});
-            $('#rule_id').val({{Request::query('rule_id')}});
+      $(document).ready(function() {
+        $('#node_id').val({{Request::query('node_id')}});
+        $('#rule_id').val({{Request::query('rule_id')}});
 
-            $('select').on('change', function() { this.form.submit(); });
-        });
+        $('select').on('change', function() { this.form.submit(); });
+      });
 
-        @can('admin.rule.clear')
-        // 清除所有记录
-        function clearLog() {
-            swal.fire({
-                title: '{{trans('common.warning')}}',
-                text: '确定清空所有记录吗?',
-                icon: 'warning',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.post("{{route('admin.rule.clear')}}", {_token: '{{csrf_token()}}'}, function(ret) {
-                        if (ret.status === 'success') {
-                            swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                        } else {
-                            swal.fire({title: ret.message, icon: 'error'});
-                        }
-                    });
-                }
+      @can('admin.rule.clear')
+      // 清除所有记录
+      function clearLog() {
+        swal.fire({
+          title: '{{trans('common.warning')}}',
+          text: '{{ trans('admin.logs.rule.clear_confirm') }}',
+          icon: 'warning',
+          showCancelButton: true,
+          cancelButtonText: '{{trans('common.close')}}',
+          confirmButtonText: '{{trans('common.confirm')}}',
+        }).then((result) => {
+          if (result.value) {
+            $.post("{{route('admin.rule.clear')}}", {_token: '{{csrf_token()}}'}, function(ret) {
+              if (ret.status === 'success') {
+                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+              } else {
+                swal.fire({title: ret.message, icon: 'error'});
+              }
             });
-        }
+          }
+        });
+      }
         @endcan
     </script>
 @endsection

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

@@ -6,10 +6,10 @@
     <div class="page-content container-fluid">
         <div class="panel panel-bordered">
             <div class="panel-heading">
-                <h1 class="panel-title"><i class="icon wb-shopping-cart" aria-hidden="true"></i>商品列表</h1>
+                <h1 class="panel-title"><i class="icon wb-shopping-cart" aria-hidden="true"></i>{{ trans('admin.goods.title') }}</h1>
                 @can('admin.goods.create')
                     <div class="panel-actions">
-                        <a href="{{route('admin.goods.create')}}" class="btn btn-primary"><i class="icon wb-plus"></i>添加商品</a>
+                        <a href="{{route('admin.goods.create')}}" class="btn btn-primary"><i class="icon wb-plus"></i> {{ trans('common.add') }}</a>
                     </div>
                 @endcan
             </div>
@@ -17,37 +17,37 @@
                 <form class="form-row">
                     <div class="form-group col-lg-2 col-sm-4">
                         <select class="form-control" id="type" name="type">
-                            <option value="" hidden>类型</option>
-                            <option value="1">流量包</option>
-                            <option value="2">套餐</option>
+                            <option value="" hidden>{{ trans('model.goods.type') }}</option>
+                            <option value="1">{{ trans('admin.goods.type.package') }}</option>
+                            <option value="2">{{ trans('admin.goods.type.plan') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4">
                         <select class="form-control" id="status" name="status">
-                            <option value="" hidden>状态</option>
-                            <option value="1">上架</option>
-                            <option value="0">下架</option>
+                            <option value="" hidden>{{ trans('common.status.attribute') }}</option>
+                            <option value="1">{{ trans('admin.goods.status.yes') }}</option>
+                            <option value="0">{{ trans('admin.goods.status.no') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-4 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.goods.index')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.goods.index')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 名称</th>
-                        <th> 类型</th>
-                        <th> 图片</th>
-                        <th> 内含流量</th>
-                        <th> 售价</th>
-                        <th> 排序</th>
-                        <th> 使用 / 销售</th>
-                        <th> 热销</th>
-                        <th> 限购数</th>
-                        <th> {{trans('common.status')}}</th>
+                        <th> {{ trans('model.goods.name') }}</th>
+                        <th> {{ trans('model.goods.type') }}</th>
+                        <th> {{ trans('model.goods.logo') }}</th>
+                        <th> {{ trans('model.goods.traffic') }}</th>
+                        <th> {{ trans('model.goods.price') }}</th>
+                        <th> {{ trans('model.common.sort') }}</th>
+                        <th> {{ trans('admin.goods.sell_and_used') }}</th>
+                        <th> {{ trans('model.goods.hot') }}</th>
+                        <th> {{ trans('model.goods.limit_num') }}</th>
+                        <th> {{trans('common.status.attribute')}}</th>
                         <th> {{trans('common.action')}}</th>
                     </tr>
                     </thead>
@@ -58,11 +58,11 @@
                             <td> {{$goods->name}} </td>
                             <td>
                                 @if($goods->type === 1)
-                                    流量包
+                                    {{ trans('admin.goods.type.package') }}
                                 @elseif($goods->type === 2)
-                                    套餐
+                                    {{ trans('admin.goods.type.plan') }}
                                 @else
-                                    充值
+                                    {{ trans('admin.goods.type.top_up') }}
                                 @endif
                             </td>
                             <td style="background-color: {{$goods->color ?? 'white'}}" @if($goods->color)class="text-white"@endif>
@@ -71,7 +71,7 @@
                                         <img src="{{asset($goods->logo)}}" class="h-50" alt="logo"/>
                                     </a>
                                 @elseif($goods->color)
-                                    无 LOGO
+                                    {{ trans('common.none') }}
                                 @endif
                             </td>
                             <td> {{$goods->traffic_label}} </td>
@@ -84,13 +84,13 @@
                                 @endif
                             </td>
                             <td>
-                                {{$goods->limit_num ?: '无限制'}}
+                                {{$goods->limit_num ?: trans('common.unlimited')}}
                             </td>
                             <td>
                                 @if($goods->status)
-                                    <span class="badge badge-lg badge-success">上架</span>
+                                    <span class="badge badge-lg badge-success">{{ trans('admin.goods.status.yes') }}</span>
                                 @else
-                                    <span class="badge badge-lg badge-default">下架</span>
+                                    <span class="badge badge-lg badge-default">{{ trans('admin.goods.status.no') }}</span>
                                 @endif
                             </td>
                             <td>
@@ -117,7 +117,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$goodsList->total()}}</code> 个商品
+                        {!! trans('admin.goods.counts', ['num' => $goodsList->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -133,41 +133,41 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#type').val({{Request::query('type')}});
-            $('#status').val({{Request::query('status')}});
+      $(document).ready(function() {
+        $('#type').val({{Request::query('type')}});
+        $('#status').val({{Request::query('status')}});
 
-            $('select').on('change', function() { this.form.submit(); });
-        });
+        $('select').on('change', function() { this.form.submit(); });
+      });
 
-        @can('admin.goods.destroy')
-        // 删除商品
-        function delGoods(url, name) {
-            swal.fire({
-                title: '{{trans('common.warning')}}',
-                text: '确定删除商品 【' + name + '】 ?',
-                icon: 'warning',
-                showCancelButton: true,
-                cancelButtonText: '取消',
-                confirmButtonText: '确定',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        url: url,
-                        method: 'DELETE',
-                        data: {_token: '{{csrf_token()}}'},
-                        dataType: 'json',
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                            } else {
-                                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                            }
-                        },
-                    });
+      @can('admin.goods.destroy')
+      // 删除商品
+      function delGoods(url, name) {
+        swal.fire({
+          title: '{{ trans('common.warning') }}',
+          text: '{{ trans('admin.confirm.delete.0', ['attribute' => trans('model.goods.attribute')]) }}' + name + '{{ trans('admin.confirm.delete.1') }}',
+          icon: 'warning',
+          showCancelButton: true,
+          cancelButtonText: '{{ trans('common.cancel') }}',
+          confirmButtonText: '{{ trans('common.confirm') }}',
+        }).then((result) => {
+          if (result.value) {
+            $.ajax({
+              url: url,
+              method: 'DELETE',
+              data: {_token: '{{csrf_token()}}'},
+              dataType: 'json',
+              success: function(ret) {
+                if (ret.status === 'success') {
+                  swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                } else {
+                  swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
                 }
+              },
             });
-        }
+          }
+        });
+      }
         @endcan
     </script>
 @endsection

+ 131 - 127
resources/views/admin/shop/info.blade.php

@@ -11,10 +11,11 @@
             <div class="panel-heading">
                 <h1 class="panel-title">
                     <i class="icon wb-shopping-cart" aria-hidden="true"></i>
-                    @isset($good) 编辑商品 @else 添加商品 @endisset
+                    {{ isset($good) ? trans('admin.action.edit_item', ['attribute' => trans('model.goods.attribute')]) : trans('admin.action.add_item', ['attribute' => trans
+                    ('model.goods.attribute')]) }}
                 </h1>
                 <div class="panel-actions">
-                    <a href="{{route('admin.goods.index')}}" class="btn btn-danger">返 回</a>
+                    <a href="{{route('admin.goods.index')}}" class="btn btn-danger">{{ trans('common.back') }}</a>
                 </div>
             </div>
             @if (Session::has('successMsg'))
@@ -26,31 +27,33 @@
             <div class="panel-body">
                 <form action=@isset($good){{route('admin.goods.update', $good)}} @else {{route('admin.goods.store')}} @endisset method="post"
                       enctype="multipart/form-data" class="form-horizontal" role="form">@csrf
-                    @isset($good) @method('PUT') @endisset
+                    @isset($good)
+                        @method('PUT')
+                    @endisset
                     <div class="form-row">
                         <div class="col-lg-6 col-md-12">
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label">类型</label>
+                                <label class="col-md-2 col-form-label">{{ trans('model.goods.type') }}</label>
                                 <div class="col-md-10 align-items-center">
                                     <div class="radio-custom radio-primary radio-inline">
                                         <input type="radio" name="type" id="data_package" value="1"/>
-                                        <label for="data_package">流量包</label>
+                                        <label for="data_package">{{ trans('admin.goods.type.package') }}</label>
                                     </div>
                                     <div class="radio-custom radio-primary radio-inline">
                                         <input type="radio" name="type" id="data_plan" value="2" checked/>
-                                        <label for="data_plan">套餐</label>
+                                        <label for="data_plan">{{ trans('admin.goods.type.2') }}</label>
                                     </div>
-                                    <span class="text-help"> 套餐与账号有效期有关,流量包只扣可用流量,不影响有效期 </span>
+                                    <span class="text-help"> {{ trans('admin.goods.info.type_hint') }} </span>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="name">名称</label>
+                                <label class="col-md-2 col-form-label" for="name">{{ trans('model.goods.name') }}</label>
                                 <div class="col-md-4">
                                     <input type="text" class="form-control" name="name" id="name" required/>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="price">售价</label>
+                                <label class="col-md-2 col-form-label" for="price">{{ trans('model.goods.price') }}</label>
                                 <div class="col-md-4 input-group">
                                     <div class="input-group-prepend">
                                         <span class="input-group-text">{{array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')]}}</span>
@@ -59,17 +62,17 @@
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label for="level" class="col-md-2 col-form-label">分类</label>
+                                <label for="level" class="col-md-2 col-form-label">{{ trans('model.goods.category') }}</label>
                                 <div class="col-md-4">
                                     <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="form-control" name="category_id" id="category_id">
                                         @foreach ($categories as $category)
-                                        <option value="{{$category->id}}">{{$category->name}}</option>
+                                            <option value="{{$category->id}}">{{$category->name}}</option>
                                         @endforeach
                                     </select>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label for="level" class="col-md-2 col-form-label">等级</label>
+                                <label for="level" class="col-md-2 col-form-label">{{ trans('model.goods.level') }}</label>
                                 <div class="col-md-4">
                                     <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="form-control" name="level" id="level">
                                         @foreach ($levels as $level)
@@ -79,7 +82,7 @@
                                 </div>
                             </div>
                             <div class="form-group row package-renew">
-                                <label class="col-md-2 col-form-label" for="renew">流量重置价格</label>
+                                <label class="col-md-2 col-form-label" for="renew">{{ trans('model.goods.renew') }}</label>
                                 <div class="col-md-4 input-group">
                                     <div class="input-group-prepend">
                                         <span class="input-group-text">{{array_column(config('common.currency'), 'symbol', 'code')[sysConfig('standard_currency')]}}</span>
@@ -88,23 +91,23 @@
                                 </div>
                             </div>
                             <div class="form-group row package-renew">
-                                <label class="col-md-2 col-form-label" for="speed_limit">用户限速</label>
+                                <label class="col-md-2 col-form-label" for="speed_limit">{{ trans('model.goods.user_limit') }}</label>
                                 <div class="col-md-4 input-group">
                                     <input type="number" style="width: 30%" class="form-control" name="speed_limit" id="speed_limit" value="0"/>
                                     <span class="input-group-text"> Mbps</span>
-                                    <span class="text-help">为 0 时不限速 </span>
+                                    <span class="text-help"> {{ trans('admin.zero_unlimited_hint') }} </span>
                                 </div>
                             </div>
                             <div class="form-group row package-renew">
-                                <label class="col-md-2 col-form-label" for="period">重置周期</label>
+                                <label class="col-md-2 col-form-label" for="period">{{ trans('model.goods.period') }}</label>
                                 <div class="col-md-4 input-group">
                                     <input type="number" class="form-control" name="period" id="period" value="30"/>
-                                    <span class="input-group-text"></span>
-                                    <span class="text-help"> 套餐流量会每N天重置 </span>
+                                    <span class="input-group-text"> {{ trans_choice('validation.attributes.day', 1) }}</span>
+                                    <span class="text-help"> {{ trans('admin.goods.info.period_hint') }} </span>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="traffic">流量额度</label>
+                                <label class="col-md-2 col-form-label" for="traffic">{{ trans('model.goods.traffic') }}</label>
                                 <div class="col-md-4 input-group">
                                     <input type="number" class="form-control" name="traffic" id="traffic" value="100"/>
                                     <select data-plugin="selectpicker" data-style="btn-outline btn-primary" class="form-control" name="traffic_unit" id="traffic_unit">
@@ -116,78 +119,79 @@
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="invite_num">赠送邀请码数量</label>
+                                <label class="col-md-2 col-form-label" for="invite_num">{{ trans('model.goods.invite_num') }}</label>
                                 <div class="col-md-4 input-group">
                                     <input type="number" class="form-control" name="invite_num" id="invite_num" value="0" required/>
                                     <span class="input-group-text">枚</span>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="limit_num">限购数量</label>
+                                <label class="col-md-2 col-form-label" for="limit_num">{{ trans('model.goods.limit_num') }}</label>
                                 <div class="col-md-4 input-group">
                                     <input type="number" class="form-control" name="limit_num" id="limit_num" value="0" required/>
                                     <span class="input-group-text">次</span>
-                                    <span class="text-help"> 每个用户可以购买该商品次数,为 0 时代表不限购 </span>
+                                    <span class="text-help"> {{ trans('admin.goods.info.limit_num_hint') }} </span>
                                 </div>
                             </div>
                             <div class="form-group row package-renew">
-                                <label class="col-md-2 col-form-label" for="days">有效期</label>
+                                <label class="col-md-2 col-form-label" for="days">{{ trans('model.goods.available_date') }}</label>
                                 <div class="col-md-4 input-group">
                                     <input type="number" class="form-control" name="days" id="days" value="30"/>
-                                    <span class="input-group-text"></span>
-                                    <span class="text-help"> 到期后会自动从总流量扣减对应的流量 </span>
+                                    <span class="input-group-text">{{ trans_choice('validation.attributes.day', 1) }}</span>
+                                    <span class="text-help"> {{ trans('admin.goods.info.available_date_hint') }} </span>
                                 </div>
                             </div>
                         </div>
                         <div class="col-lg-6 col-md-12">
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="is_hot">热销</label>
+                                <label class="col-md-2 col-form-label" for="is_hot">{{ trans('model.goods.hot') }}</label>
                                 <div class="col-md-10">
                                     <input type="checkbox" data-toggle="switch" name="is_hot" id="is_hot" data-on-color="primary" data-off-color="default"
-                                           data-on-text="是" data-off-text="否" data-size="small">
+                                           data-on-text="{{ trans('admin.yes') }}" data-off-text="{{ trans('admin.no') }}" data-size="small">
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="status">状态</label>
+                                <label class="col-md-2 col-form-label" for="status">{{ trans('common.status.attribute') }}</label>
                                 <div class="col-md-10">
                                     <input type="checkbox" data-toggle="switch" name="status" id="status" data-on-color="primary" data-off-color="default"
-                                           data-on-text="上架" data-off-text="下架" data-size="small">
+                                           data-on-text="{{ trans('admin.goods.status.yes') }}" data-off-text="{{ trans('admin.goods.status.no') }}" data-size="small">
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="sort">排序</label>
+                                <label class="col-md-2 col-form-label" for="sort">{{ trans('model.common.sort') }}</label>
                                 <div class="col-md-4">
                                     <input type="number" class="form-control" name="sort" id="sort" value="0" min="0" max="255"/>
-                                    <span class="text-help"> 排序值越大排越前 </span>
+                                    <span class="text-help"> {{ trans('admin.sort_asc') }} </span>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="color">颜色</label>
+                                <label class="col-md-2 col-form-label" for="color">{{ trans('model.goods.color') }}</label>
                                 <div class="col-md-4">
                                     <input type="text" class="form-control" name="color" id="color" data-plugin="asColorPicker" data-mode="simple" value="#A57AFA"/>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="logo">商品图片</label>
+                                <label class="col-md-2 col-form-label" for="logo">{{ trans('model.goods.logo') }}</label>
                                 <div class="col-md-6">
                                     <input type="file" id="logo" name="logo" data-plugin="dropify" data-default-file="{{asset($good->logo ?? '/assets/images/default.png')}}"/>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="description">描述</label>
+                                <label class="col-md-2 col-form-label" for="description">{{ trans('model.common.description') }}</label>
                                 <div class="col-md-8">
-                                    <textarea class="form-control" rows="2" name="description" id="description" placeholder="商品的简单描述"></textarea>
+                                    <textarea class="form-control" rows="2" name="description" id="description"
+                                              placeholder="{{ trans('admin.goods.info.desc_placeholder') }}"></textarea>
                                 </div>
                             </div>
                             <div class="form-group row">
-                                <label class="col-md-2 col-form-label" for="info">自定义列表</label>
+                                <label class="col-md-2 col-form-label" for="info">{{ trans('model.goods.info') }}</label>
                                 <div class="col-md-8">
-                                    <textarea class="form-control" rows="6" name="info" id="info" placeholder="商品的自定义列表添加"></textarea>
-                                    <span class="text-help"> 每行内容请以<code>&lt;li&gt;</code> 开头<code>&lt;/li&gt;</code> 结尾</span>
+                                    <textarea class="form-control" rows="6" name="info" id="info" placeholder="{{ trans('admin.goods.info.list_placeholder') }}"></textarea>
+                                    <span class="text-help"> {!! trans('admin.goods.info.list_hint') !!}</span>
                                 </div>
                             </div>
                             <div class="form-actions col-12 text-right">
-                                <button type="submit" class="btn btn-success"><i class="icon wb-check"></i> 提 交</button>
+                                <button type="submit" class="btn btn-success"><i class="icon wb-check"></i>{{ trans('common.submit') }}</button>
                             </div>
                         </div>
                     </div>
@@ -207,97 +211,97 @@
     <script src="/assets/global/js/Plugin/ascolorpicker.js"></script>
     <script src="/assets/global/js/Plugin/dropify.js"></script>
     <script>
-        $('[data-toggle="switch"]').bootstrapSwitch();
-        @isset($good)
-        $(document).ready(function() {
-            const type = $('input[name=\'type\']');
-            $('#id').val('{{$good->id}}');
-            $("input[name='type'][value='{{$good->type}}']").click();
-            type.attr('disabled', true);
-            $('#name').val('{{$good->name}}');
-            $('#price').val('{{$good->price}}');
-            $('#level').selectpicker('val', '{{$good->level}}');
-            @if ($good->type == 2)
-            $('#renew').val('{{$good->renew}}');
-            $('#speed_limit').val('{{$good->speed_limit}}');
-            $('#period').val('{{$good->period}}');
-            $('#days').val('{{$good->days}}').attr('disabled', true);
-            @endif
-            $('#invite_num').val('{{$good->invite_num}}');
-            $('#limit_num').val('{{$good->limit_num}}');
-            @if ($good->is_hot)
-            $('#is_hot').click();
-            @endif
-            @if ($good->status)
-            $('#status').click();
-            @endif
-            $('#sort').val('{{$good->sort}}');
-            $('#color').asColorPicker('val', '{{$good->color}}');
-            $('#description').val(@json($good->description));
-            $('#info').val(@json($good->info));
-            $('#category_id').selectpicker('val', '{{$good->category_id}}');
-            const trafficUnit = $('#traffic_unit');
-            const traffic = $('#traffic');
-            @if($good->traffic >= 1073741824)
-            traffic.val('{{$good->traffic/1073741824}}');
-            trafficUnit.selectpicker('val', '1073741824');
-            @elseif($good->traffic >= 1048576)
-            traffic.val('{{$good->traffic/1048576}}');
-            trafficUnit.selectpicker('val', '1048576');
-            @elseif($good->traffic >= 1024)
-            traffic.val('{{$good->traffic/1024}}');
-            trafficUnit.selectpicker('val', '1024');
-            @else
-            traffic.val('{{$good->traffic}}');
-            @endif
-            traffic.attr('disabled', true);
-            trafficUnit.attr('disabled', true).selectpicker('refresh');
-        });
-        @elseif(old('type'))
-        $(document).ready(function() {
-            const type = $('input[name=\'type\']');
-            $('#id').val('{{old('id')}}');
-            $("input[name='type'][value='{{old('type')}}']").click();
-            $('#name').val('{{old('name')}}');
-            $('#price').val('{{old('price')}}');
-            $('#level').selectpicker('val', '{{old('level')}}');
-            @if (old('type') == 2)
-            $('#renew').val('{{old('renew',0)}}');
-            $('#speed_limit').val('{{old('speed_limit',0)}}');
-            $('#period').val('{{old('period',0)}}');
-            $('#days').val('{{old('days',0)}}');
-            @endif
-            $('#traffic').val('{{old('traffic')}}');
-            $('#traffic_unit').selectpicker('val', '{{old('traffic_unit')}}');
-            $('#invite_num').val('{{old('invite_num')}}');
-            $('#limit_num').val('{{old('limit_num')}}');
-            @if (old('is_hot'))
-            $('#is_hot').click();
-            @endif
-            @if (old('status'))
-            $('#status').click();
-            @endif
-            $('#sort').val('{{old('sort')}}');
-            $('#color').asColorPicker('val', '{{old('color')}}');
-            $('#description').val('{{old('description')}}');
-            $('#info').val('{{old('info')}}');
-        });
-        @else
-        $('#status').click();
+      $('[data-toggle="switch"]').bootstrapSwitch();
+      @isset($good)
+      $(document).ready(function() {
+        const type = $('input[name=\'type\']');
+        $('#id').val('{{$good->id}}');
+        $("input[name='type'][value='{{$good->type}}']").click();
+        type.attr('disabled', true);
+        $('#name').val('{{$good->name}}');
+        $('#price').val('{{$good->price}}');
+        $('#level').selectpicker('val', '{{$good->level}}');
+          @if ($good->type == 2)
+          $('#renew').val('{{$good->renew}}');
+        $('#speed_limit').val('{{$good->speed_limit}}');
+        $('#period').val('{{$good->period}}');
+        $('#days').val('{{$good->days}}').attr('disabled', true);
+          @endif
+          $('#invite_num').val('{{$good->invite_num}}');
+        $('#limit_num').val('{{$good->limit_num}}');
+          @if ($good->is_hot)
+          $('#is_hot').click();
+          @endif
+          @if ($good->status)
+          $('#status').click();
+          @endif
+          $('#sort').val('{{$good->sort}}');
+        $('#color').asColorPicker('val', '{{$good->color}}');
+        $('#description').val(@json($good->description));
+        $('#info').val(@json($good->info));
+        $('#category_id').selectpicker('val', '{{$good->category_id}}');
+        const trafficUnit = $('#traffic_unit');
+        const traffic = $('#traffic');
+          @if($good->traffic >= 1073741824)
+          traffic.val('{{$good->traffic/1073741824}}');
+        trafficUnit.selectpicker('val', '1073741824');
+          @elseif($good->traffic >= 1048576)
+          traffic.val('{{$good->traffic/1048576}}');
+        trafficUnit.selectpicker('val', '1048576');
+          @elseif($good->traffic >= 1024)
+          traffic.val('{{$good->traffic/1024}}');
+        trafficUnit.selectpicker('val', '1024');
+          @else
+          traffic.val('{{$good->traffic}}');
+          @endif
+          traffic.attr('disabled', true);
+        trafficUnit.attr('disabled', true).selectpicker('refresh');
+      });
+      @elseif(old('type'))
+      $(document).ready(function() {
+        const type = $('input[name=\'type\']');
+        $('#id').val('{{old('id')}}');
+        $("input[name='type'][value='{{old('type')}}']").click();
+        $('#name').val('{{old('name')}}');
+        $('#price').val('{{old('price')}}');
+        $('#level').selectpicker('val', '{{old('level')}}');
+          @if (old('type') == 2)
+          $('#renew').val('{{old('renew',0)}}');
+        $('#speed_limit').val('{{old('speed_limit',0)}}');
+        $('#period').val('{{old('period',0)}}');
+        $('#days').val('{{old('days',0)}}');
+          @endif
+          $('#traffic').val('{{old('traffic')}}');
+        $('#traffic_unit').selectpicker('val', '{{old('traffic_unit')}}');
+        $('#invite_num').val('{{old('invite_num')}}');
+        $('#limit_num').val('{{old('limit_num')}}');
+          @if (old('is_hot'))
+          $('#is_hot').click();
+          @endif
+          @if (old('status'))
+          $('#status').click();
+          @endif
+          $('#sort').val('{{old('sort')}}');
+        $('#color').asColorPicker('val', '{{old('color')}}');
+        $('#description').val('{{old('description')}}');
+        $('#info').val('{{old('info')}}');
+      });
+      @else
+      $('#status').click();
 
-        @endisset
+      @endisset
 
-        function itemControl(value) {
-            if (value === 1) {
-                $('.package-renew').hide();
-            } else {
-                $('.package-renew').show();
-            }
+      function itemControl(value) {
+        if (value === 1) {
+          $('.package-renew').hide();
+        } else {
+          $('.package-renew').show();
         }
+      }
 
-        // 选择商品类型
-        $('input[name=\'type\']').change(function() {
-            itemControl(parseInt($(this).val()));
-        });
+      // 选择商品类型
+      $('input[name=\'type\']').change(function() {
+        itemControl(parseInt($(this).val()));
+      });
     </script>
 @endsection

+ 38 - 38
resources/views/admin/subscribe/index.blade.php

@@ -12,41 +12,41 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">订阅列表</h3>
+                <h3 class="panel-title">{{ trans('admin.menu.user.subscribe') }}</h3>
             </div>
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-1 col-sm-6">
-                        <input type="number" class="form-control" name="user_id" value="{{Request::query('user_id')}}" placeholder="ID"/>
+                        <input type="number" class="form-control" name="user_id" value="{{Request::query('user_id')}}" placeholder="{{ trans('model.user.id') }}"/>
                     </div>
                     <div class="form-group col-lg-3 col-sm-6">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('model.user.username') }}"/>
                     </div>
                     <div class="form-group col-lg-3 col-sm-6">
-                        <input type="text" class="form-control" name="code" value="{{Request::query('code')}}" placeholder="订阅码"/>
+                        <input type="text" class="form-control" name="code" value="{{Request::query('code')}}" placeholder="{{ trans('model.subscribe.code') }}"/>
                     </div>
                     <div class="form-group col-lg-3 col-sm-6">
                         <select name="status" id="status" class="form-control" onchange="this.form.submit()">
-                            <option value="" hidden>状态</option>
-                            <option value="0">禁用</option>
-                            <option value="1">正常</option>
+                            <option value="" hidden>{{ trans('common.status.attribute') }}</option>
+                            <option value="0">{{ trans('common.status.banned') }}</option>
+                            <option value="1">{{ trans('common.status.normal') }}</option>
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.subscribe.index')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.subscribe.index')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> @sortablelink('id', '#')</th>
-                        <th> 用户</th>
-                        <th> 订阅码</th>
-                        <th> @sortablelink('times', '请求次数')</th>
-                        <th> 最后请求时间</th>
-                        <th> 封禁时间</th>
-                        <th> 封禁理由</th>
+                        <th> {{ trans('model.user.username') }}</th>
+                        <th> {{ trans('model.subscribe.code') }}</th>
+                        <th> @sortablelink('times', trans('model.subscribe.req_times'))</th>
+                        <th> {{ trans('model.subscribe.updated_at') }}</th>
+                        <th> {{ trans('model.subscribe.ban_time') }}</th>
+                        <th> {{ trans('model.subscribe.ban_desc') }}</th>
                         <th> {{trans('common.action')}}</th>
                     </tr>
                     </thead>
@@ -55,14 +55,14 @@
                         <tr>
                             <td> {{$subscribe->id}} </td>
                             <td>
-                                @if(empty($subscribe->user))
-                                    【{{trans('common.deleted_item', ['attribute' => trans('common.account')])}}】
-                                @else
+                                @if($subscribe->has('user'))
                                     @can('admin.user.index')
                                         <a href="{{route('admin.user.index', ['id'=>$subscribe->user->id])}}" target="_blank">{{$subscribe->user->username}}</a>
                                     @else
                                         {{$subscribe->user->username}}
                                     @endcan
+                                @else
+                                    【{{trans('common.deleted_item', ['attribute' => trans('common.account')])}}】
                                 @endif
                             </td>
                             <td> {{$subscribe->code}} </td>
@@ -79,9 +79,9 @@
                                     <button class="btn btn-sm @if($subscribe->status === 0) btn-outline-success @else btn-outline-danger @endif"
                                             onclick="setSubscribeStatus('{{route('admin.subscribe.set', $subscribe)}}')">
                                         @if($subscribe->status === 0)
-                                            启用
+                                            {{ trans('common.status.enabled') }}
                                         @else
-                                            禁用
+                                            {{ trans('common.status.banned') }}
                                         @endif
                                     </button>
                                 @endcan
@@ -94,7 +94,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$subscribeList->total()}}</code> 条记录
+                        {!! trans('admin.logs.counts', ['num' => $subscribeList->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -110,25 +110,25 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        $(document).ready(function() {
-            $('#status').val({{Request::query('status')}});
-        });
+      $(document).ready(function() {
+        $('#status').val({{Request::query('status')}});
+      });
 
-        @can('admin.subscribe.set')
-        // 启用禁用用户的订阅
-        function setSubscribeStatus(url) {
-            $.post(url, {_token: '{{csrf_token()}}'}, function(ret) {
-                if (ret.status === 'success') {
-                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => {
-                        window.location.reload();
-                    });
-                } else {
-                    swal.fire({title: ret.message, icon: 'error', timer: 1000, showConfirmButton: false}).then(() => {
-                        window.location.reload();
-                    });
-                }
+      @can('admin.subscribe.set')
+      // 启用禁用用户的订阅
+      function setSubscribeStatus(url) {
+        $.post(url, {_token: '{{csrf_token()}}'}, function(ret) {
+          if (ret.status === 'success') {
+            swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => {
+              window.location.reload();
             });
-        }
+          } else {
+            swal.fire({title: ret.message, icon: 'error', timer: 1000, showConfirmButton: false}).then(() => {
+              window.location.reload();
+            });
+          }
+        });
+      }
         @endcan
     </script>
 @endsection

+ 42 - 39
resources/views/admin/subscribe/log.blade.php

@@ -7,7 +7,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h1 class="panel-title">订阅列表</h1>
+                <h1 class="panel-title">{{ trans('admin.logs.subscribe') }}</h1>
             </div>
             <div class="panel-body row">
                 <form class="form-row col-12">
@@ -24,51 +24,54 @@
                                     <i class="icon wb-calendar" aria-hidden="true"></i>
                                 </span>
                             </div>
-                            <input type="text" class="form-control" name="start" value="{{Request::query('start')}}" placeholder="开始区间" autocomplete="off"/>
+                            <input type="text" class="form-control" name="start" value="{{Request::query('start')}}" placeholder="{{ trans('admin.start_time') }}" autocomplete="off"/>
                             <div class="input-group-prepend">
-                                <span class="input-group-text"></span>
+                                <span class="input-group-text">{{ trans('common.to') }}</span>
                             </div>
-                            <input type="text" class="form-control" name="end" value="{{Request::query('end')}}" placeholder="结束区间" autocomplete="off"/>
+                            <input type="text" class="form-control" name="end" value="{{Request::query('end')}}" placeholder="{{ trans('admin.end_time') }}" autocomplete="off"/>
                         </div>
                     </div>
                     <div class="form-group col-xxl-1 col-lg-2 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.subscribe.log', $subscribe->user->id)}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.subscribe.log', $subscribe->user->id)}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <div class="col-sm-12 col-xl-2">
                     <ul class="list-group list-group-gap">
                         <li class="list-group-item bg-blue-grey-100">
-                            <i class="icon wb-user-circle" aria-hidden="true"></i> 用 户: <span class="float-right">{{ $subscribe->user->nickname ?? '用户已删除' }}</span>
+                            <i class="icon wb-user-circle" aria-hidden="true"></i> {{ trans('model.user.nickname') }}: <span class="float-right">{{ $subscribe->user->nickname ??
+                             trans('common.deleted_item', ['attribute' => trans('common.account')])}}</span>
                         </li>
                         <li class="list-group-item bg-blue-grey-100">
-                            <i class="icon wb-envelope" aria-hidden="true"></i> 账 号: <span class="float-right">{{ $subscribe->user->username ?? '用户已删除' }}</span>
+                            <i class="icon wb-envelope" aria-hidden="true"></i> {{ trans('model.user.username') }}: <span class="float-right">{{ $subscribe->user->username ??
+                            trans('common.deleted_item', ['attribute' => trans('model.user.attribute')])}}</span>
                         </li>
                         <li class="list-group-item bg-blue-grey-100">
-                            <i class="icon wb-heart" aria-hidden="true"></i> 状 态: <span class="float-right">{!! $subscribe->status ? '<i class="green-600 icon wb-check" aria-hidden="true"></i>' : '<i
-                                class="red-600 icon wb-close" aria-hidden="true"></i>' !!}</span>
+                            <i class="icon wb-heart" aria-hidden="true"></i> {{ trans('common.status.attribute') }}: <span class="float-right">{!! $subscribe->status ? '<i class="green-600
+                             icon wb-check" aria-hidden="true"></i>' : '<i class="red-600 icon wb-close" aria-hidden="true"></i>' !!}</span>
                         </li>
                         <li class="list-group-item bg-blue-grey-100">
-                            <i class="icon wb-bell" aria-hidden="true"></i> 请求次数: <code class="float-right">{{ $subscribe->times }}</code>
+                            <i class="icon wb-bell" aria-hidden="true"></i> {{ trans('model.subscribe.req_times') }}: <code class="float-right">{{ $subscribe->times }}</code>
                         </li>
                         <li class="list-group-item bg-blue-grey-100">
-                            <i class="icon wb-time" aria-hidden="true"></i> 最后请求: <span class="float-right">{{ $subscribe->updated_at }}</span>
+                            <i class="icon wb-time" aria-hidden="true"></i> {{ trans('model.subscribe.updated_at') }}: <span class="float-right">{{ $subscribe->updated_at }}</span>
                         </li>
                         @if($subscribe->ban_time)
                             <li class="list-group-item bg-blue-grey-100">
-                                <i class="icon wb-power" aria-hidden="true"></i>封禁截至: <span class="float-right">{{ date('Y-m-d H:i', $subscribe->ban_time )}}</span>
+                                <i class="icon wb-power" aria-hidden="true"></i> {{ trans('model.subscribe.ban_time') }}: <span class="float-right">{{ date('Y-m-d H:i',
+                                $subscribe->ban_time ) }}</span>
                             </li>
                             <li class="list-group-item bg-blue-grey-100">
-                                <i class="icon wb-lock" aria-hidden="true"></i>封禁理由: <span class="float-right">{{ $subscribe->ban_desc }}</span>
+                                <i class="icon wb-lock" aria-hidden="true"></i> {{ trans('model.subscribe.ban_desc') }}: <span class="float-right">{{ $subscribe->ban_desc }}</span>
                             </li>
                         @endif
                         @can('admin.subscribe.set')
                             <button class="list-group-item btn btn-block @if($subscribe->status) btn-danger @else btn-success @endif"
                                     onclick="setSubscribeStatus('{{route('admin.subscribe.set', $subscribe)}}')">
-                                @if($subscribe->status == 0)
-                                    <i class="icon wb-unlock" aria-hidden="true"></i> 启  用
+                                @if($subscribe->status === 0)
+                                    <i class="icon wb-unlock" aria-hidden="true"></i> {{ trans('common.status.enabled') }}
                                 @else
-                                    <i class="icon wb-unlock" aria-hidden="true"></i> 禁  用
+                                    <i class="icon wb-unlock" aria-hidden="true"></i> {{ trans('common.status.disabled') }}
                                 @endif
                             </button>
                         @endcan
@@ -79,10 +82,10 @@
                         <thead class="thead-default">
                         <tr>
                             <th> #</th>
-                            <th> 请求IP</th>
-                            <th> 归属地</th>
-                            <th> 请求时间</th>
-                            <th> 访问</th>
+                            <th> {{ trans('model.subscribe.req_ip') }}</th>
+                            <th> {{ trans('model.ip.info') }}</th>
+                            <th> {{ trans('model.subscribe.req_times') }}</th>
+                            <th> {{ trans('model.subscribe.req_header') }}</th>
                         </tr>
                         </thead>
                         <tbody>
@@ -106,7 +109,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$subscribeLog->total()}}</code> 条记录
+                        {!! trans('admin.logs.counts', ['num' => $subscribeLog->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -124,25 +127,25 @@
     <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')
-        // 启用禁用用户的订阅
-        function setSubscribeStatus(url) {
-            $.post(url, {_token: '{{csrf_token()}}'}, function(ret) {
-                if (ret.status === 'success') {
-                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => {
-                        window.location.reload();
-                    });
-                } else {
-                    swal.fire({title: ret.message, icon: 'error', timer: 1000, showConfirmButton: false}).then(() => {
-                        window.location.reload();
-                    });
-                }
+      @can('admin.subscribe.set')
+      // 启用禁用用户的订阅
+      function setSubscribeStatus(url) {
+        $.post(url, {_token: '{{csrf_token()}}'}, function(ret) {
+          if (ret.status === 'success') {
+            swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => {
+              window.location.reload();
+            });
+          } else {
+            swal.fire({title: ret.message, icon: 'error', timer: 1000, showConfirmButton: false}).then(() => {
+              window.location.reload();
             });
-        }
+          }
+        });
+      }
         @endcan
     </script>
 @endsection

+ 75 - 74
resources/views/admin/ticket/index.blade.php

@@ -6,7 +6,7 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h3 class="panel-title">工单列表</h3>
+                <h3 class="panel-title">{{ trans('admin.ticket.title') }}</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">
@@ -20,21 +20,22 @@
             <div class="panel-body">
                 <form class="form-row">
                     <div class="form-group col-lg-3 col-sm-6">
-                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="用户账号" autocomplete="off"/>
+                        <input type="text" class="form-control" name="username" value="{{Request::query('username')}}" placeholder="{{ trans('model.user.username') }}"
+                               autocomplete="off"/>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6 btn-group">
-                        <button type="submit" class="btn btn-primary">搜 索</button>
-                        <a href="{{route('admin.ticket.index')}}" class="btn btn-danger">{{trans('common.reset')}}</a>
+                        <button type="submit" class="btn btn-primary">{{ trans('common.search') }}</button>
+                        <a href="{{route('admin.ticket.index')}}" class="btn btn-danger">{{ trans('common.reset') }}</a>
                     </div>
                 </form>
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th> #</th>
-                        <th> 用户账号</th>
-                        <th> 标题</th>
-                        <th> {{trans('common.status')}}</th>
-                        <th> {{trans('common.action')}}</th>
+                        <th> {{ trans('model.user.username') }}</th>
+                        <th> {{ trans('validation.attributes.title') }}</th>
+                        <th> {{ trans('common.status.attribute') }}</th>
+                        <th> {{ trans('common.action') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -46,7 +47,7 @@
                                     【{{trans('common.deleted_item', ['attribute' => trans('common.account')])}}】
                                 @else
                                     @can('admin.user.index')
-                                        <a href="{{route('admin.user.index', ['id'=>$ticket->user->id])}}" target="_blank">{{$ticket->user->username}}</a>
+                                        <a href="{{route('admin.user.index', ['id' => $ticket->user->id])}}" target="_blank">{{$ticket->user->username}}</a>
                                     @else
                                         {{$ticket->user->username}}
                                     @endcan
@@ -80,7 +81,7 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$ticketList->total()}}</code> 个工单
+                        {!! trans('admin.ticket.counts', ['num' => $ticketList->total()]) !!}
                     </div>
                     <div class="col-sm-8">
                         <nav class="Page navigation float-right">
@@ -104,25 +105,25 @@
                     </div>
                     <div class="modal-body">
                         <div class="form-group row">
-                            <label for="domain" class="col-2 col-form-label">域名</label>
+                            <label for="userId" class="col-2 col-form-label">{{ trans('model.user.attribute') }}</label>
                             <div class="input-group col-10">
-                                <input type="number" class="form-control col-md-4" name="uid" id="uid" placeholder="用户ID"/>
+                                <input type="number" class="form-control col-md-4" name="uid" id="uid" placeholder="{{ trans('model.user.id') }}"/>
                                 <div class="input-group-prepend">
-                                    <span class="input-group-text"></span>
+                                    <span class="input-group-text">{{ trans('common.or') }}</span>
                                 </div>
-                                <input type="text" class="form-control col-md-8" name="username" id="username" placeholder="用户邮箱"/>
+                                <input type="text" class="form-control col-md-8" name="username" id="username" placeholder="{{ trans('model.user.username') }}"/>
                             </div>
                         </div>
                         <div class="form-group">
-                            <input type="text" class="form-control" name="title" id="title" placeholder="标题">
+                            <input type="text" class="form-control" name="title" id="title" placeholder="{{ trans('validation.attributes.title') }}">
                         </div>
                         <div class="form-group">
-                            <textarea type="text" class="form-control" rows="5" name="content" id="content" placeholder="内容"></textarea>
+                            <textarea type="text" class="form-control" rows="5" name="content" id="content" placeholder="{{ trans('validation.attributes.content') }}"></textarea>
                         </div>
                     </div>
                     <div class="modal-footer">
-                        <button type="button" data-dismiss="modal" class="btn btn-danger mr-auto"> {{trans('common.cancel')}} </button>
-                        <button type="button" data-dismiss="modal" class="btn btn-success" onclick="createTicket()"> {{trans('common.confirm')}} </button>
+                        <button type="button" data-dismiss="modal" class="btn btn-danger mr-auto"> {{ trans('common.cancel') }} </button>
+                        <button type="button" data-dismiss="modal" class="btn btn-success" onclick="createTicket()"> {{ trans('common.confirm') }} </button>
                     </div>
                 </div>
             </div>
@@ -136,67 +137,67 @@
         @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() === '') {
-                swal.fire({title: '请填入目标用户信息!', icon: 'warning'});
-                return false;
-            }
+          if (uid.trim() === '' && username.trim() === '') {
+            swal.fire({title: '{{ trans('admin.ticket.send_to') }}', icon: 'warning'});
+            return false;
+          }
 
-            if (title.trim() === '') {
-                swal.fire({title: '{{trans('validation.required', ['attribute' => trans('validation.attributes.title')])}}', icon: 'warning'});
-                return false;
-            }
+          if (title.trim() === '') {
+            swal.fire({title: '{{ trans('validation.required', ['attribute' => trans('validation.attributes.title')]) }}', icon: 'warning'});
+            return false;
+          }
 
-            if (content.trim() === '') {
-                swal.fire({title: '{{trans('validation.required', ['attribute' => trans('validation.attributes.content')])}}', icon: 'warning'});
-                return false;
-            }
+          if (content.trim() === '') {
+            swal.fire({title: '{{ trans('validation.required', ['attribute' => trans('validation.attributes.content')]) }}', icon: 'warning'});
+            return false;
+          }
 
-            swal.fire({
-                title: '{{trans('user.ticket.submit_tips')}}',
-                icon: 'question',
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'POST',
-                        url: "{{route('admin.ticket.store')}}",
-                        data: {
-                            _token: '{{csrf_token()}}',
-                            uid: uid,
-                            username: username,
-                            title: title,
-                            content: content,
-                        },
-                        dataType: 'json',
-                        success: function(ret) {
-                            $('#add_ticket_modal').modal('hide');
-                            if (ret.status === 'success') {
-                                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
-                            } else {
-                                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-                            }
-                        },
-                        error: function(data) {
-                            $('#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>';
-                                });
-                                swal.fire({title: '提示', html: str, icon: 'error', confirmButtonText: '{{trans('common.confirm')}}'});
-                            }
-                        },
+          swal.fire({
+            title: '{{ trans('user.ticket.submit_tips') }}',
+            icon: 'question',
+            showCancelButton: true,
+            cancelButtonText: '{{ trans('common.close') }}',
+            confirmButtonText: '{{ trans('common.confirm') }}',
+          }).then((result) => {
+            if (result.value) {
+              $.ajax({
+                method: 'POST',
+                url: "{{route('admin.ticket.store')}}",
+                data: {
+                  _token: '{{csrf_token()}}',
+                  uid: uid,
+                  username: username,
+                  title: title,
+                  content: content,
+                },
+                dataType: 'json',
+                success: function(ret) {
+                  $('#add_ticket_modal').modal('hide');
+                  if (ret.status === 'success') {
+                    swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => window.location.reload());
+                  } else {
+                    swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
+                  }
+                },
+                error: function(data) {
+                  $('#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>';
                     });
-                }
-            });
+                    swal.fire({title: '{{ trans('admin.hint') }}', html: str, icon: 'error', confirmButtonText: '{{ trans('common.confirm') }}'});
+                  }
+                },
+              });
+            }
+          });
         }
         @endcan
     </script>

+ 34 - 33
resources/views/admin/ticket/reply.blade.php

@@ -7,8 +7,9 @@
                     <i class="icon wb-help-circle"></i> {{$ticket->title}}
                 </h1>
                 <div class="panel-actions btn-group">
-                    <button class="btn icon-1x btn-info btn-icon wb-user-circle" data-target="#userInfo" data-toggle="modal" type="button"> 用户信息</button>
-                    <a href="{{route('admin.ticket.index')}}" class="btn btn-default">返 回</a>
+                    <button class="btn icon-1x btn-info btn-icon wb-user-circle" data-target="#userInfo" data-toggle="modal"
+                            type="button"> {{ trans('admin.ticket.user_info') }}</button>
+                    <a href="{{route('admin.ticket.index')}}" class="btn btn-default">{{ trans('common.back') }}</a>
                     @if($ticket->status !== 2)
                         @can('admin.ticket.destroy')
                             <button class="btn btn-danger" onclick="closeTicket()"> {{trans('common.close')}} </button>
@@ -49,17 +50,17 @@
                         <span aria-hidden="true">×</span>
                     </button>
                     <h4 class="modal-title">
-                        <i class="wb-user" aria-hidden="true"></i> 用户信息</h4>
+                        <i class="wb-user" aria-hidden="true"></i> {{ trans('admin.ticket.user_info') }}</h4>
                 </div>
                 <div class="modal-body">
                     <ul class="list-group list-group-dividered px-20 mb-0">
-                        <h5>基础信息</h5>
+                        <h5>{{ trans('admin.node.info.basic') }}</h5>
                         <dl class="dl-horizontal row">
-                            <dt class="col-sm-3">昵称</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.nickname') }}</dt>
                             <dd class="col-sm-9">{{$user->nickname}}</dd>
-                            <dt class="col-sm-3">账号</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.username') }}</dt>
                             <dd class="col-sm-9">{{$user->username}}</dd>
-                            <dt class="col-sm-3">账号状态</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.account_status') }}</dt>
                             <dd class="col-sm-9">
                                 @if ($user->status > 0)
                                     <span class="badge badge-lg badge-primary">
@@ -75,21 +76,21 @@
                                     </span>
                                 @endif
                             </dd>
-                            <dt class="col-sm-3">等级</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.level') }}</dt>
                             <dd class="col-sm-9">{{$user->level}}</dd>
-                            <dt class="col-sm-3">分组</dt>
-                            <dd class="col-sm-9">{{$user->userGroup->name ?? '无分组'}}</dd>
-                            <dt class="col-sm-3">余额</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.group') }}</dt>
+                            <dd class="col-sm-9">{{$user->userGroup->name ?? trans('common.none')}}</dd>
+                            <dt class="col-sm-3">{{ trans('model.user.credit') }}</dt>
                             <dd class="col-sm-9">{{$user->credit}}</dd>
-                            <dt class="col-sm-3">流量</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.traffic_used') }}</dt>
                             <dd class="col-sm-9">{{flowAutoShow($user->used_traffic)}} / {{$user->transfer_enable_formatted}}</dd>
-                            <dt class="col-sm-3">重置日期</dt>
-                            <dd class="col-sm-9">{{$user->reset_date ?? '无'}}</dd>
-                            <dt class="col-sm-3">最近使用</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.reset_date') }}</dt>
+                            <dd class="col-sm-9">{{$user->reset_date ?? trans('common.none')}}</dd>
+                            <dt class="col-sm-3">{{ trans('common.latest_at') }}</dt>
                             <dd class="col-sm-9">
-                                {{$user->t? date('Y-m-d H:i', $user->t): '未使用'}}
+                                {{$user->t? date('Y-m-d H:i', $user->t) : trans('common.status.unused')}}
                             </dd>
-                            <dt class="col-sm-3">过期日期</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.expired_date') }}</dt>
                             <dd class="col-sm-9">
                                 @if($user->expiration_status() !== 3)
                                     <span class="badge badge-lg badge-{{['danger','warning','default'][$user->expiration_status()]}}"> {{ $user->expiration_date }} </span>
@@ -97,41 +98,41 @@
                                     {{ $user->expiration_date }}
                                 @endif
                             </dd>
-                            <dt class="col-sm-3">备注</dt>
+                            <dt class="col-sm-3">{{ trans('model.user.remark') }}</dt>
                             <dt class="col-sm-3">{!! $user->remark !!}</dt>
                         </dl>
-                        <h5>代理信息</h5>
+                        <h5>{{ trans('admin.user.info.proxy') }}</h5>
                         <dl class="dl-horizontal row">
-                            <dt class="col-sm-3">开启状态</dt>
+                            <dt class="col-sm-3">{{ trans('common.status.attribute') }}</dt>
                             <dd class="col-sm-9">
                                 <span class="badge badge-lg badge-{{$user->enable?'info':'danger'}}">
                                     <i class="wb-{{$user->enable?'check':'close'}}" aria-hidden="true"></i>
                                 </span>
                             </dd>
-                            <dt class="col-sm-3">端口</dt>
-                            <dd class="col-sm-9">{!!$user->port? : '<span class="badge badge-lg badge-danger"> 未分配 </span>'!!}</dd>
+                            <dt class="col-sm-3">{{ trans('model.user.port') }}</dt>
+                            <dd class="col-sm-9">{!! $user->port? : '<span class="badge badge-lg badge-danger"> '.trans('common.none').' </span>' !!}</dd>
                         </dl>
-                        <h5>其他</h5>
+                        <h5>{{ trans('common.more') }}</h5>
                         <dl class="dl-horizontal row">
-                            <dt class="col-sm-3">邀请人信息</dt>
+                            <dt class="col-sm-3">{{ trans('admin.ticket.inviter_info') }}</dt>
                             <dd class="col-sm-9">
-                                {{$user->inviter->nickname ?? '无'}}
+                                {{$user->inviter->nickname ?? trans('common.none')}}
                             </dd>
                             @isset ($user->inviter)
-                                <dt class="col-sm-3 offset-md-1">账号</dt>
+                                <dt class="col-sm-3 offset-md-1">{{ trans('model.user.username') }}</dt>
                                 <dd class="col-sm-8">{{$user->inviter->username}}</dd>
-                                <dt class="col-sm-3 offset-md-1">等级</dt>
+                                <dt class="col-sm-3 offset-md-1">{{ trans('model.user.level') }}</dt>
                                 <dd class="col-sm-8">{{$user->inviter->level}}</dd>
-                                <dt class="col-sm-3 offset-md-1">最近使用</dt>
+                                <dt class="col-sm-3 offset-md-1">{{ trans('common.latest_at') }}</dt>
                                 <dd class="col-sm-8">
-                                    {{$user->inviter->t? date('Y-m-d H:i', $user->inviter->t): '未使用'}}
+                                    {{$user->inviter->t? date('Y-m-d H:i', $user->inviter->t): trans('common.status.unused')}}
                                 </dd>
                             @endif
                         </dl>
                     </ul>
                 </div>
                 <div class="modal-footer">
-                    <button type="button" class="btn btn-default" data-dismiss="modal">@lang('common.close')</button>
+                    <button type="button" class="btn btn-default" data-dismiss="modal">{{ trans('common.close') }}</button>
                 </div>
             </div>
         </div>
@@ -143,7 +144,7 @@
         // 关闭工单
         function closeTicket() {
           swal.fire({
-            title: '确定关闭工单?',
+            title: '{{ trans('admin.ticket.close_confirm') }}',
             icon: 'question',
             showCancelButton: true,
             cancelButtonText: '{{trans('common.close')}}',
@@ -169,7 +170,7 @@
                   }
                 },
                 error: function() {
-                  swal.fire({title: '{{trans('user.ticket.error')}}', icon: 'error'});
+                  swal.fire({title: '{{  trans('user.ticket.error') }}', icon: 'error'});
                 },
               });
             }
@@ -216,7 +217,7 @@
                   }
                 },
                 error: function() {
-                  swal.fire({title: '未知错误!请查看运行日志', icon: 'error'});
+                  swal.fire({title: '{{ trans('admin.ticket.error') }}', icon: 'error'});
                 },
               });
             }

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

@@ -6,8 +6,8 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title"> SSR日志分析
-                    <small>仅适用于单机单节点</small>
+                <h2 class="panel-title">
+                    {!! trans('admin.tools.analysis.title') !!}
                 </h2>
             </div>
             @if (Session::has('analysisErrorMsg'))
@@ -17,20 +17,20 @@
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
-                        <th>近期请求地址</th>
+                        <th>{{ trans('admin.tools.analysis.req_url') }}</th>
                     </tr>
                     </thead>
                     <tbody>
-                    @if(empty($urlList))
-                        <tr>
-                            <td colspan="1">访问记录不足15000条,无法分析数据</td>
-                        </tr>
-                    @else
+                    @if(! empty($urlList))
                         @foreach($urlList as $url)
                             <tr>
                                 <td> {{$url}} </td>
                             </tr>
                         @endforeach
+                    @else
+                        <tr>
+                            <td colspan="1">{{ trans('admin.tools.analysis.not_enough') }}</td>
+                        </tr>
                     @endif
                     </tbody>
                 </table>
@@ -43,46 +43,46 @@
     <script src="/assets/global/vendor/bootstrap-table/bootstrap-table.min.js"></script>
     <script src="/assets/global/vendor/bootstrap-table/extensions/mobile/bootstrap-table-mobile.min.js"></script>
     <script>
-        const TableDatatablesScroller = function() {
-            const e = function() {
-                const e = $('#analysis');
-                e.dataTable({
-                    language: {
-                        aria: {
-                            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: '未找到',
-                    },
-                    buttons: [
-                        {extend: 'print', className: 'btn btn-outline-dark'},
-                        {extend: 'pdf', className: 'btn btn-outline-success'},
-                        {extend: 'csv', className: 'btn btn-outline-primary'},
-                    ],
-                    scrollY: 300,
-                    deferRender: !0,
-                    scroller: !0,
-                    stateSave: !0,
-                    order: [[0, 'asc']],
-                    lengthMenu: [[10, 15, 20, -1], [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>>',
-                });
-            };
-            return {
-                init: function() {
-                    jQuery().dataTable && (e());
-                },
-            };
-        }();
-        jQuery(document).ready(function() {
-            TableDatatablesScroller.init();
-        });
+      const TableDatatablesScroller = function() {
+        const e = function() {
+          const e = $('#analysis');
+          e.dataTable({
+            language: {
+              aria: {
+                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: '未找到',
+            },
+            buttons: [
+              {extend: 'print', className: 'btn btn-outline-dark'},
+              {extend: 'pdf', className: 'btn btn-outline-success'},
+              {extend: 'csv', className: 'btn btn-outline-primary'},
+            ],
+            scrollY: 300,
+            deferRender: !0,
+            scroller: !0,
+            stateSave: !0,
+            order: [[0, 'asc']],
+            lengthMenu: [[10, 15, 20, -1], [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>>',
+          });
+        };
+        return {
+          init: function() {
+            jQuery().dataTable && (e());
+          },
+        };
+      }();
+      jQuery(document).ready(function() {
+        TableDatatablesScroller.init();
+      });
     </script>
 @endsection

+ 52 - 51
resources/views/admin/tools/convert.blade.php

@@ -3,14 +3,14 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">格式转换
-                    <small>Shadowsocks 转 ShadowsocksR</small>
+                <h2 class="panel-title">
+                    {!! trans('admin.tools.convert.title') !!}
                 </h2>
             </div>
             <div class="panel-body">
                 <div class="row">
                     <div class="col-md-4 form-group">
-                        <label for="method">加密方式</label>
+                        <label for="method">{{ trans('model.node.method') }}</label>
                         <select class="form-control" name="method" id="method">
                             @foreach (Helpers::methodList() as $method)
                                 <option value="{{$method->name}}" @if($method->is_default) selected @endif>
@@ -20,14 +20,14 @@
                         </select>
                     </div>
                     <div class="col-md-4 form-group">
-                        <label for="transfer_enable">可用流量</label>
+                        <label for="transfer_enable">{{ trans('model.user.usable_traffic') }}</label>
                         <div class="input-group">
                             <input type="number" class="form-control" name="transfer_enable" value="1000" id="transfer_enable" placeholder="" required>
                             <span class="input-group-text">GB</span>
                         </div>
                     </div>
                     <div class="col-md-4 form-group">
-                        <label for="protocol">协议</label>
+                        <label for="protocol">{{ trans('model.node.protocol') }}</label>
                         <select class="form-control" name="protocol" id="protocol">
                             @foreach (Helpers::protocolList() as $protocol)
                                 <option value="{{$protocol->name}}" @if($protocol->is_default) selected @endif>
@@ -37,11 +37,11 @@
                         </select>
                     </div>
                     <div class="col-md-4 form-group">
-                        <label for="protocol_param">协议参数</label>
+                        <label for="protocol_param">{{ trans('model.node.protocol_param') }}</label>
                         <input type="text" class="form-control" name="protocol_param" id="protocol_param" placeholder="">
                     </div>
                     <div class="col-md-4 form-group">
-                        <label for="obfs">混淆</label>
+                        <label for="obfs">{{ trans('model.node.obfs') }}</label>
                         <select class="form-control" name="obfs" id="obfs">
                             @foreach (Helpers::obfsList() as $obfs)
                                 <option value="{{$obfs->name}}" @if($obfs->is_default) selected @endif>
@@ -51,20 +51,21 @@
                         </select>
                     </div>
                     <div class="col-md-4 form-group">
-                        <label for="obfs_param">混淆参数</label>
+                        <label for="obfs_param">{{ trans('model.node.obfs_param') }}</label>
                         <input type="text" class="form-control" name="obfs_param" id="obfs_param" placeholder="">
                     </div>
                     <div class="col-md-6">
-                        <textarea class="form-control" rows="22" name="content" id="content" placeholder="请填入要转换的配置信息" autofocus></textarea>
+                        <textarea class="form-control" rows="22" name="content" id="content" placeholder="{{ trans('admin.tools.convert.content_placeholder') }}"
+                                  autofocus></textarea>
                     </div>
                     <div class="col-md-6">
                         <textarea class="form-control" rows="22" name="result" id="result" onclick="this.focus();this.select()" readonly="readonly"></textarea>
                     </div>
                     <div class="col-md-6">
-                        <button class="btn btn-block btn-primary" onclick="Convert()">转 换</button>
+                        <button class="btn btn-block btn-primary" onclick="Convert()">{{ trans('common.convert') }}</button>
                     </div>
                     <div class="col-md-6">
-                        <a href="{{route('admin.tools.download', ['type' => 1])}}" class="btn btn-block btn-danger">下 载</a>
+                        <a href="{{route('admin.tools.download', ['type' => 1])}}" class="btn btn-block btn-danger">{{ trans('common.download') }}</a>
                     </div>
                 </div>
             </div>
@@ -74,48 +75,48 @@
 @endsection
 @section('javascript')
     <script>
-        // 转换
-        function Convert() {
-            const content = $('#content').val();
+      // 转换
+      function Convert() {
+        const content = $('#content').val();
 
-            if (content.trim() === '') {
-                swal.fire({title: '请填入要转换的配置信息', icon: 'warning', timer: 1000, showConfirmButton: false});
-                return;
-            }
-            swal.fire({
-                title: '确定继续转换吗?',
-                icon: 'question',
-                allowEnterKey: false,
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'POST',
-                        url: '{{route('admin.tools.convert')}}',
-                        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,
-                        },
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                $('#result').val(ret.data);
-                            } else {
-                                $('#result').val(ret.message);
-                            }
-                        },
-                    });
+        if (content.trim() === '') {
+          swal.fire({title: '{{ trans('admin.tools.convert.content_placeholder') }}', icon: 'warning', timer: 1000, showConfirmButton: false});
+          return;
+        }
+        swal.fire({
+          title: '{{ trans('admin.confirm.continues') }}',
+          icon: 'question',
+          allowEnterKey: false,
+          showCancelButton: true,
+          cancelButtonText: '{{ trans('common.close') }}',
+          confirmButtonText: '{{ trans('common.confirm') }}',
+        }).then((result) => {
+          if (result.value) {
+            $.ajax({
+              method: 'POST',
+              url: '{{route('admin.tools.convert')}}',
+              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,
+              },
+              success: function(ret) {
+                if (ret.status === 'success') {
+                  $('#result').val(ret.data);
+                } else {
+                  $('#result').val(ret.message);
                 }
+              },
             });
-            return false;
-        }
+          }
+        });
+        return false;
+      }
     </script>
 @endsection

+ 36 - 35
resources/views/admin/tools/decompile.blade.php

@@ -3,21 +3,22 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">反解析</h2>
+                <h2 class="panel-title">{!! trans('admin.tools.decompile.title') !!}</h2>
             </div>
             <div class="panel-body">
                 <div class="row">
                     <div class="col-md-6">
-                        <textarea class="form-control" rows="25" name="content" id="content" placeholder="请填入要反解析的ShadowsocksR链接,一行一条" autofocus></textarea>
+                        <textarea class="form-control" rows="25" name="content" id="content" placeholder="{{ trans('admin.tools.decompile.content_placeholder') }}"
+                                  autofocus></textarea>
                     </div>
                     <div class="col-md-6">
                         <textarea class="form-control" rows="25" name="result" id="result" readonly="readonly"></textarea>
                     </div>
                     <div class="col-md-6">
-                        <button class="btn btn-block btn-primary" onclick="Decompile()">反解析</button>
+                        <button class="btn btn-block btn-primary" onclick="Decompile()">{{ trans('admin.tools.decompile.attribute') }}</button>
                     </div>
                     <div class="col-md-6">
-                        <a href="{{route('admin.tools.download', ['type' => 2])}}" class="btn btn-block btn-danger">下 载</a>
+                        <a href="{{route('admin.tools.download', ['type' => 2])}}" class="btn btn-block btn-danger">{{ trans('common.download') }}</a>
                     </div>
                 </div>
             </div>
@@ -26,39 +27,39 @@
 @endsection
 @section('javascript')
     <script>
-        // 转换
-        function Decompile() {
-            const content = $('#content').val();
+      // 转换
+      function Decompile() {
+        const content = $('#content').val();
 
-            if (content.trim() === '') {
-                swal.fire({title: '请填入要反解析的链接信息', icon: 'warning', timer: 1000, showConfirmButton: false});
-                return;
-            }
-            swal.fire({
-                title: '确定继续反解析吗?',
-                icon: 'question',
-                allowEnterKey: false,
-                showCancelButton: true,
-                cancelButtonText: '{{trans('common.close')}}',
-                confirmButtonText: '{{trans('common.confirm')}}',
-            }).then((result) => {
-                if (result.value) {
-                    $.ajax({
-                        method: 'POST',
-                        url: '{{route('admin.tools.decompile')}}',
-                        dataType: 'json',
-                        data: {_token: '{{csrf_token()}}', content: content},
-                        success: function(ret) {
-                            if (ret.status === 'success') {
-                                $('#result').val(ret.data);
-                            } else {
-                                $('#result').val(ret.message);
-                            }
-                        },
-                    });
+        if (content.trim() === '') {
+          swal.fire({title: '{{ trans('admin.tools.decompile.content_placeholder') }}', icon: 'warning', timer: 1000, showConfirmButton: false});
+          return;
+        }
+        swal.fire({
+          title: '{{ trans('admin.confirm.continues') }}',
+          icon: 'question',
+          allowEnterKey: false,
+          showCancelButton: true,
+          cancelButtonText: '{{trans('common.close')}}',
+          confirmButtonText: '{{trans('common.confirm')}}',
+        }).then((result) => {
+          if (result.value) {
+            $.ajax({
+              method: 'POST',
+              url: '{{route('admin.tools.decompile')}}',
+              dataType: 'json',
+              data: {_token: '{{csrf_token()}}', content: content},
+              success: function(ret) {
+                if (ret.status === 'success') {
+                  $('#result').val(ret.data);
+                } else {
+                  $('#result').val(ret.message);
                 }
+              },
             });
-            return false;
-        }
+          }
+        });
+        return false;
+      }
     </script>
 @endsection

+ 2 - 2
resources/views/admin/tools/import.blade.php

@@ -6,7 +6,7 @@
     <div class="page-content container">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">数据导入</h2>
+                <h2 class="panel-title">{{ trans('admin.tools.import_title') }}</h2>
             </div>
             @if (Session::has('successMsg'))
                 <x-alert type="success" :message="Session::get('successMsg')"/>
@@ -18,7 +18,7 @@
                 <form action="{{route('admin.tools.import')}}" method="POST" enctype="multipart/form-data" class="upload-form">
                     @csrf
                     <input type="file" id="inputUpload" name="uploadFile" data-plugin="dropify" data-default-file="" required/>
-                    <button type="submit" class="btn btn-success float-right mt-10"> 导入</button>
+                    <button type="submit" class="btn btn-success float-right mt-10"> {{ trans('common.import') }}</button>
                 </form>
             </div>
         </div>

+ 64 - 51
resources/views/admin/user/export.blade.php

@@ -6,18 +6,18 @@
     <div class="page-content container-fluid">
         <div class="panel">
             <div class="panel-heading">
-                <h2 class="panel-title">【{{$user->username}}】连接配置信息</h2>
+                <h2 class="panel-title"> {{ trans('admin.user.proxies_config', ['username' => $user->username]) }}</h2>
             </div>
             <div class="panel-body">
                 <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                     <thead class="thead-default">
                     <tr>
                         <th>#</th>
-                        <th>节点</th>
-                        <th>扩展</th>
-                        <th>域名</th>
-                        <th>IPv4</th>
-                        <th>配置信息</th>
+                        <th>{{ trans('model.node.attribute') }}</th>
+                        <th>{{ trans('admin.node.info.extend') }}</th>
+                        <th>{{ trans('model.node.domain') }}</th>
+                        <th>{{ trans('model.node.ipv4') }}</th>
+                        <th>{{ trans('admin.user.proxy_info') }}</th>
                     </tr>
                     </thead>
                     <tbody>
@@ -32,8 +32,20 @@
                                 @endcan
                             </td>
                             <td>
-                                @if(!empty($node->profile['passwd'])) <span class="label label-danger">单</span> @endif
-                                @if($node->ipv6) <span class="label label-danger">IPv6</span> @endif
+                                @isset($node->profile['passwd'])
+                                    {{-- 单端口 --}}
+                                    <span class="badge badge-lg badge-info"><i class="fa-solid fa-arrows-left-right-to-line" aria-hidden="true"></i></span>
+                                @endisset
+                                @if($node->is_display === 0)
+                                    {{-- 节点完全不可见 --}}
+                                    <span class="badge badge-lg badge-danger"><i class="icon wb-eye-close" aria-hidden="true"></i></span>
+                                @elseif($node->is_display === 1)
+                                    {{-- 节点只在页面中显示 --}}
+                                    <span class="badge badge-lg badge-danger"><i class="fa-solid fa-link-slash" aria-hidden="true"></i></span>
+                                @elseif($node->is_display === 2)
+                                    {{-- 节点只可被订阅到 --}}
+                                    <span class="badge badge-lg badge-danger"><i class="fa-solid fa-store-slash" aria-hidden="true"></i></span>
+                                @endif
                             </td>
                             <td>{{$node->server}}</td>
                             <td>{{$node->ip}}</td>
@@ -60,12 +72,13 @@
             <div class="panel-footer">
                 <div class="row">
                     <div class="col-sm-4">
-                        共 <code>{{$nodeList->total()}}</code> 个账号
+                        {!! trans('admin.node.counts', ['num' => $nodeList->total()]) !!}
+                    </div>
+                    <div class="col-sm-8">
+                        <nav class="Page navigation float-right">
+                            {{$nodeList->links()}}
+                        </nav>
                     </div>
-
-                    <nav class="Page navigation float-right">
-                        {{$nodeList->links()}}
-                    </nav>
                 </div>
             </div>
         </div>
@@ -77,44 +90,44 @@
     <script src="/assets/custom/jquery-qrcode/jquery.qrcode.min.js"></script>
     @can('admin.user.exportProxy')
         <script>
-            function getInfo(id, type) {
-                $.post("{{route('admin.user.exportProxy', $user)}}", {_token: '{{csrf_token()}}', id: id, type: type},
-                    function(ret) {
-                        if (ret.status === 'success') {
-                            switch (type) {
-                                case 'code':
-                                    swal.fire({
-                                        html: '<textarea class="form-control" rows="8" readonly="readonly">' + ret.data +
-                                            '</textarea>' +
-                                            '<a href="' + ret.data + '" class="btn btn-danger btn-block mt-10">打开' +
-                                            ret.title + '</a>',
-                                        showConfirmButton: false,
-                                    });
-                                    break;
-                                case 'qrcode':
-                                    swal.fire({
-                                        title: '{{trans('user.scan_qrcode')}}',
-                                        html: '<div id="qrcode"></div>',
-                                        onBeforeOpen: () => {
-                                            $('#qrcode').qrcode({text: ret.data});
-                                        },
-                                        showConfirmButton: false,
-                                    });
-                                    break;
-                                case 'text':
-                                    swal.fire({
-                                        title: '{{trans('user.node.info')}}',
-                                        html: '<textarea class="form-control" rows="12" readonly="readonly">' + ret.data +
-                                            '</textarea>',
-                                        showConfirmButton: false,
-                                    });
-                                    break;
-                                default:
-                                    swal.fire({title: ret.title, text: ret.data});
-                            }
-                        }
-                    });
-            }
+          function getInfo(id, type) {
+            $.post("{{route('admin.user.exportProxy', $user)}}", {_token: '{{csrf_token()}}', id: id, type: type},
+                function(ret) {
+                  if (ret.status === 'success') {
+                    switch (type) {
+                      case 'code':
+                        swal.fire({
+                          html: '<textarea class="form-control" rows="8" readonly="readonly">' + ret.data +
+                              '</textarea>' +
+                              '<a href="' + ret.data + '" class="btn btn-danger btn-block mt-10">{{ trans('common.open') }} ' +
+                              ret.title + '</a>',
+                          showConfirmButton: false,
+                        });
+                        break;
+                      case 'qrcode':
+                        swal.fire({
+                          title: '{{trans('user.scan_qrcode')}}',
+                          html: '<div id="qrcode"></div>',
+                          onBeforeOpen: () => {
+                            $('#qrcode').qrcode({text: ret.data});
+                          },
+                          showConfirmButton: false,
+                        });
+                        break;
+                      case 'text':
+                        swal.fire({
+                          title: '{{trans('user.node.info')}}',
+                          html: '<textarea class="form-control" rows="12" readonly="readonly">' + ret.data +
+                              '</textarea>',
+                          showConfirmButton: false,
+                        });
+                        break;
+                      default:
+                        swal.fire({title: ret.title, text: ret.data});
+                    }
+                  }
+                });
+          }
         </script>
     @endcan
 @endsection

部分文件因为文件数量过多而无法显示