diff --git a/.env.example b/.env.example index 997c5fc4..0572bc1e 100644 --- a/.env.example +++ b/.env.example @@ -1,5 +1,5 @@ APP_NAME=ProxyPanel -APP_ENV=production +APP_ENV=local APP_KEY= APP_DEBUG= APP_DEMO= diff --git a/app/Channels/BarkChannel.php b/app/Channels/BarkChannel.php index c90123a9..c6728a78 100644 --- a/app/Channels/BarkChannel.php +++ b/app/Channels/BarkChannel.php @@ -42,7 +42,7 @@ class BarkChannel return false; } // 发送错误 - Log::critical('[Bark] 消息推送异常:'.var_export($response, true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.bark'), 'reason' => var_export($response, true)])); return false; } diff --git a/app/Channels/DingTalkChannel.php b/app/Channels/DingTalkChannel.php index 60b4286a..738cd315 100644 --- a/app/Channels/DingTalkChannel.php +++ b/app/Channels/DingTalkChannel.php @@ -22,7 +22,7 @@ class DingTalkChannel } if (Cache::get($cacheKey) > 20) { // 每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。 - Log::critical('[钉钉] 消息推送异常:每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。'); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.dingtalk'), 'reason' => trans('notification.ding_bot_limit')])); return false; } @@ -65,7 +65,7 @@ class DingTalkChannel 'msgtype' => 'link', 'link' => [ 'title' => $message['title'], - 'text' => '请点击下方按钮【查看详情】', + 'text' => trans('notification.details_btn'), 'messageUrl' => route('message.show', ['type' => $message['url_type'], $msgId]), ], ]; @@ -89,12 +89,12 @@ class DingTalkChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'] ?? var_export($message['body'], true), 10, -1, $ret ? $ret['errmsg'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'] ?? var_export($message['body'], true), 10, -1, $ret ? $ret['errmsg'] : trans('common.status.unknown')); return false; } // 发送错误 - Log::critical('[钉钉] 消息推送异常:'.var_export($response, true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.dingtalk'), 'reason' => var_export($response, true)])); return false; } diff --git a/app/Channels/Library/WeChat.php b/app/Channels/Library/WeChat.php index b0fcccbd..6d694c50 100644 --- a/app/Channels/Library/WeChat.php +++ b/app/Channels/Library/WeChat.php @@ -41,6 +41,34 @@ class WeChat return 0; } + public function prpcrypt_encrypt(string $data): array + { + try { + //拼接 + $data = Str::random().pack('N', strlen($data)).$data.sysConfig('wechat_cid'); + //添加PKCS#7填充 + $data = $this->pkcs7_encode($data); + //加密 + $encrypted = openssl_encrypt($data, 'AES-256-CBC', $this->key, OPENSSL_ZERO_PADDING, $this->iv); + + return [0, $encrypted]; + } catch (Exception $e) { + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.wechat'), 'reason' => var_export($e->getMessage(), true)])); + + return [-40006, null]; // EncryptAESError + } + } + + public function pkcs7_encode(string $data): string + {// 对需要加密的明文进行填充补位 + //计算需要填充的位数 + $padding = 32 - (strlen($data) % 32); + $padding = ($padding === 0) ? 32 : $padding; + $pattern = chr($padding); + + return $data.str_repeat($pattern, $padding); // 获得补位所用的字符 + } + public function getSHA1(string $timestamp, string $nonce, string $encryptMsg): array { $data = [$encryptMsg, sysConfig('wechat_token'), $timestamp, $nonce]; @@ -102,7 +130,7 @@ XML; return [0, $encrypt]; } catch (Exception $e) { - Log::critical('企业微信消息推送异常:'.var_export($e->getMessage(), true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.wechat'), 'reason' => var_export($e->getMessage(), true)])); return [-40002, null]; // ParseXmlError } @@ -128,7 +156,7 @@ XML; $signature = $array[1]; if ($sMsgSignature !== $signature) { - Log::critical('企业微信消息推送异常:安全签名验证失败'); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.wechat'), 'reason' => trans('notification.sign_failed')])); return -40004; // ValidateSignatureError } @@ -136,41 +164,13 @@ XML; $sMsg = $encrypt; } - public function prpcrypt_encrypt(string $data): array - { - try { - //拼接 - $data = Str::random().pack('N', strlen($data)).$data.sysConfig('wechat_cid'); - //添加PKCS#7填充 - $data = $this->pkcs7_encode($data); - //加密 - $encrypted = openssl_encrypt($data, 'AES-256-CBC', $this->key, OPENSSL_ZERO_PADDING, $this->iv); - - return [0, $encrypted]; - } catch (Exception $e) { - Log::critical('企业微信消息推送异常:'.var_export($e->getMessage(), true)); - - return [-40006, null]; // EncryptAESError - } - } - - public function pkcs7_encode(string $data): string - {// 对需要加密的明文进行填充补位 - //计算需要填充的位数 - $padding = 32 - (strlen($data) % 32); - $padding = ($padding === 0) ? 32 : $padding; - $pattern = chr($padding); - - return $data.str_repeat($pattern, $padding); // 获得补位所用的字符 - } - public function prpcrypt_decrypt(string $encrypted): array { try { //解密 $decrypted = openssl_decrypt($encrypted, 'AES-256-CBC', $this->key, OPENSSL_ZERO_PADDING, $this->iv); } catch (Exception $e) { - Log::critical('企业微信消息推送异常:'.var_export($e->getMessage(), true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.wechat'), 'reason' => var_export($e->getMessage(), true)])); return [-40007, null]; // DecryptAESError } @@ -188,7 +188,7 @@ XML; $from_receiveId = substr($content, $xml_len + 4); } catch (Exception $e) { // 发送错误 - Log::critical('企业微信消息推送异常:'.var_export($e->getMessage(), true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.wechat'), 'reason' => var_export($e->getMessage(), true)])); return [-40008, null]; // IllegalBuffer } diff --git a/app/Channels/PushDeerChannel.php b/app/Channels/PushDeerChannel.php index e6a0b5e2..1c306137 100644 --- a/app/Channels/PushDeerChannel.php +++ b/app/Channels/PushDeerChannel.php @@ -26,12 +26,12 @@ class PushDeerChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 9, -1, $ret ? $ret['error'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'], 9, -1, $ret ? $ret['error'] : trans('common.status.unknown')); return false; } // 发送错误 - Log::critical('[PushDeer] 消息推送异常:'.var_export($response, true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.pushdeer'), 'reason' => var_export($response, true)])); return false; } diff --git a/app/Channels/PushPlusChannel.php b/app/Channels/PushPlusChannel.php index 0c77fa95..ed9ef094 100644 --- a/app/Channels/PushPlusChannel.php +++ b/app/Channels/PushPlusChannel.php @@ -30,12 +30,12 @@ class PushPlusChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 7, -1, $ret ? $ret['msg'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'], 7, -1, $ret ? $ret['msg'] : trans('common.status.unknown')); return false; } // 发送错误 - Log::critical('[PushPlus] 消息推送异常:'.var_export($response, true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.pushplus'), 'reason' => var_export($response, true)])); return false; } diff --git a/app/Channels/ServerChanChannel.php b/app/Channels/ServerChanChannel.php index 66e50288..42a78f46 100644 --- a/app/Channels/ServerChanChannel.php +++ b/app/Channels/ServerChanChannel.php @@ -33,12 +33,12 @@ class ServerChanChannel $response = Http::timeout(15) ->post('https://sctapi.ftqq.com/'.sysConfig('server_chan_key').'.send?title='.urlencode($message['title']).'&desp='.urlencode($message['content'])); } else { - Log::critical('[ServerChan] 消息推送异常:分钟频率过高,请优化通知场景!'); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.serverchan'), 'reason' => trans('notification.serverChan_limit')])); return false; } } else { - Log::critical('[ServerChan] 消息推送异常:今日限额已耗尽!'); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.serverchan'), 'reason' => trans('notification.serverChan_exhausted')])); return false; } @@ -52,12 +52,12 @@ class ServerChanChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 2, -1, $ret ? $ret['errmsg'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'], 2, -1, $ret ? $ret['errmsg'] : trans('common.status.unknown')); return false; } // 发送错误 - Log::critical('[ServerChan] 消息推送异常:'.var_export($response, true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.serverchan'), 'reason' => var_export($response, true)])); return false; } diff --git a/app/Channels/TgChatChannel.php b/app/Channels/TgChatChannel.php index 0b14f69f..442864e2 100644 --- a/app/Channels/TgChatChannel.php +++ b/app/Channels/TgChatChannel.php @@ -24,12 +24,12 @@ class TgChatChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 6, -1, $ret ? $ret['message'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'], 6, -1, $ret ? $ret['message'] : trans('common.status.unknown')); return false; } // 发送错误 - Log::critical('[TG酱] 消息推送异常:'.var_export($response, true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.tg_chat'), 'reason' => var_export($response, true)])); return false; } diff --git a/app/Channels/WeChatChannel.php b/app/Channels/WeChatChannel.php index a1f74ef3..5efd011b 100644 --- a/app/Channels/WeChatChannel.php +++ b/app/Channels/WeChatChannel.php @@ -54,9 +54,9 @@ class WeChatChannel 'msgtype' => 'textcard', 'textcard' => [ 'title' => $message['title'], - 'description' => '请点击下方按钮【查看详情】', + 'description' => trans('notification.details_btn'), 'url' => route('message.show', ['type' => $message['url_type'], $msgId]), - 'btntxt' => '查看详情', + 'btntxt' => trans('notification.details'), ], ]; } else { // 文本消息 @@ -82,9 +82,9 @@ class WeChatChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'] ?? var_export($message['body'], true), 5, -1, $ret ? $ret['errmsg'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'] ?? var_export($message['body'], true), 5, -1, $ret ? $ret['errmsg'] : trans('common.status.unknown')); } else { - Log::critical('[企业微信] 消息推送异常:'.var_export($response, true)); // 发送错误 + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.wechat'), 'reason' => var_export($response, true)])); } return false; @@ -101,7 +101,7 @@ class WeChatChannel $access_token = $response->json()['access_token']; Cache::put('wechat_access_token', $access_token, 7189); // 2小时 } else { - Log::critical('[企业微信] 消息推送异常:获取access_token失败!'.PHP_EOL.'携带访问参数:'.$response->body()); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.wechat'), 'reason' => trans('notification.get_access_token_failed', ['body' => $response->body()])])); abort(400); } } @@ -116,6 +116,6 @@ class WeChatChannel exit($sEchoStr); } - Log::critical('[企业微信] 互动消息推送异常:'.var_export($errCode, true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.wechat'), 'reason' => trans('notification.sign_failed')]).var_export($errCode, true)); } } diff --git a/app/Channels/iYuuChannel.php b/app/Channels/iYuuChannel.php index 7f5c1e49..c37ed0c8 100644 --- a/app/Channels/iYuuChannel.php +++ b/app/Channels/iYuuChannel.php @@ -9,22 +9,11 @@ use Log; class iYuuChannel { - private ?string $token; - - public function __construct() - { - $this->token = sysConfig('iYuu_token'); - - if ($this->token) { - Log::critical('[爱语飞飞] TOKEN 为空'); - } - } - public function send($notifiable, Notification $notification) { $message = $notification->toCustom($notifiable); - $response = Http::timeout(15)->post('https://iyuu.cn/'.$this->token.'.send?title='.urlencode($message['title']).'&desp='.urlencode($message['content'])); + $response = Http::timeout(15)->post('https://iyuu.cn/'.sysConfig('iYuu_token').'.send?title='.urlencode($message['title']).'&desp='.urlencode($message['content'])); // 发送成功 if ($response->ok()) { @@ -35,12 +24,12 @@ class iYuuChannel return $ret; } // 发送失败 - Helpers::addNotificationLog($message['title'], $message['content'], 8, -1, $ret ? $ret['errmsg'] : '未知'); + Helpers::addNotificationLog($message['title'], $message['content'], 8, -1, $ret ? $ret['errmsg'] : trans('common.status.unknown')); return false; } // 发送错误 - Log::critical('[爱语飞飞] 消息推送异常:'.var_export($response, true)); + Log::critical(trans('notification.error', ['channel' => trans('admin.system.notification.channel.iyuu'), 'reason' => var_export($response, true)])); return false; } diff --git a/app/Console/Commands/AutoClearLogs.php b/app/Console/Commands/AutoClearLogs.php index 733c0790..737ab097 100644 --- a/app/Console/Commands/AutoClearLogs.php +++ b/app/Console/Commands/AutoClearLogs.php @@ -61,7 +61,7 @@ class AutoClearLogs extends Command UserDataFlowLog::where('log_time', '<=', strtotime(config('tasks.clean.traffic_logs')))->delete(); // 清除用户流量日志 } catch (Exception $e) { - Log::emergency('【清理日志】错误: '.$e->getMessage()); + Log::emergency(trans('common.error_item', ['attribute' => trans('admin.system.is_clear_log')]).': '.$e->getMessage()); } } } diff --git a/app/Console/Commands/NodeStatusDetection.php b/app/Console/Commands/NodeStatusDetection.php index dd78e9c1..d7b6f869 100644 --- a/app/Console/Commands/NodeStatusDetection.php +++ b/app/Console/Commands/NodeStatusDetection.php @@ -33,7 +33,7 @@ class NodeStatusDetection extends Command if (! $lastCheckTime || $lastCheckTime <= time()) { $this->checkNodeNetwork(); } else { - Log::info('下次节点阻断检测时间:'.date('Y-m-d H:i:s', $lastCheckTime)); + Log::info(trans('notification.next_check_time', ['time' => date('Y-m-d H:i:s', $lastCheckTime)])); } } @@ -110,7 +110,7 @@ class NodeStatusDetection extends Command if ($times > $detectionCheckTimes) { Cache::forget($cacheKey); $node->update(['status' => 0]); - $data[$node_id]['message'] = '自动进入维护状态'; + $data[$node_id]['message'] = trans('notification.into_maintenance'); } } @@ -122,7 +122,7 @@ class NodeStatusDetection extends Command if (! empty($data)) { //只有在出现阻断线路时,才会发出警报 Notification::send(User::find(1), new NodeBlocked($data)); - Log::notice("节点状态日志: \r\n".var_export($data, true)); + Log::notice(trans('notification.node_block').": \r\n".var_export($data, true)); } Cache::put('LastCheckTime', time() + random_int(3000, Hour), 3700); // 随机生成下次检测时间 diff --git a/app/Console/Commands/PanelUpdate.php b/app/Console/Commands/PanelUpdate.php index 0281b45d..a35f0994 100644 --- a/app/Console/Commands/PanelUpdate.php +++ b/app/Console/Commands/PanelUpdate.php @@ -17,14 +17,13 @@ class PanelUpdate extends Command $bar->minSecondsBetweenRedraws(0); $this->displayBanner(); $bar->start(); - $this->updateDatabase(); + $bar->advance(); - $this->updateCache(); - $bar->finish(); - $this->info(' 更新完毕! '); + $bar->finish(); + $this->info(trans('setup.update_complete')); } private function displayBanner(): void @@ -44,17 +43,17 @@ BANNER; private function updateDatabase(): void { - $this->line('更新数据库...'); + $this->line(trans('setup.update_db')); Artisan::call('migrate --force'); - if (config('app.env') === 'demo' && $this->confirm('检测到您在DEMO模式, 是否重置数据库?')) { + if (config('app.env') === 'demo' && $this->confirm(trans('setup.demo_reset'))) { Artisan::call('migrate:fresh --seed --force'); } } private function updateCache(): void { - $this->line('更新缓存...'); + $this->line(trans('setup.update_cache')); Artisan::call('optimize'); } } diff --git a/app/Console/Commands/TaskDaily.php b/app/Console/Commands/TaskDaily.php index d84a60ea..7b25e80e 100644 --- a/app/Console/Commands/TaskDaily.php +++ b/app/Console/Commands/TaskDaily.php @@ -100,9 +100,9 @@ class TaskDaily extends Command $oldData = $user->transfer_enable; // 重置流量与重置日期 if ($user->update((new OrderService($order))->resetTimeAndData($user->expired_at))) { - Helpers::addUserTrafficModifyLog($order->user_id, $oldData, $user->transfer_enable, __('[Daily Task] Reset Account Traffic, Next Reset Date: :date', ['date' => $user->reset_date]), $order->id); + Helpers::addUserTrafficModifyLog($order->user_id, $oldData, $user->transfer_enable, trans('[Daily Task] Reset Account Traffic, Next Reset Date: :date', ['date' => $user->reset_date]), $order->id); } else { - Log::error("[每日任务]用户ID: $user->id | 邮箱: $user->username 流量重置失败"); + Log::error(trans('notification.reset_failed', ['uid' => $user->id, 'username' => $user->username])); } }); }); diff --git a/app/Console/Commands/TaskMonthly.php b/app/Console/Commands/TaskMonthly.php index aa85c656..94fb7d78 100644 --- a/app/Console/Commands/TaskMonthly.php +++ b/app/Console/Commands/TaskMonthly.php @@ -52,7 +52,7 @@ class TaskMonthly extends Command Order::whereStatus(-1)->where('created_at', '<=', date('Y-m-d H:i:s', strtotime(config('tasks.clean.unpaid_orders'))))->delete(); // 清理用户未支付订单 } catch (Exception $e) { - Log::emergency('【清理日志】错误: '.$e->getMessage()); + Log::emergency(trans('common.error_item', ['attribute' => trans('admin.system.is_clear_log')]).': '.$e->getMessage()); } } } diff --git a/app/Http/Controllers/Admin/AffiliateController.php b/app/Http/Controllers/Admin/AffiliateController.php index 617612d0..945e64a2 100644 --- a/app/Http/Controllers/Admin/AffiliateController.php +++ b/app/Http/Controllers/Admin/AffiliateController.php @@ -42,17 +42,17 @@ class AffiliateController extends Controller $status = (int) $request->input('status'); if ($aff->update(['status' => $status])) { - // 审核申请的时候将关联的 + // 将关联的返现单更新状态 if ($status === 1 || $status === 2) { if ($aff->referral_logs()->update(['status' => $status])) { - return response()->json(['status' => 'success', 'message' => '操作成功']); + return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.action')])]); } } - return response()->json(['status' => 'success', 'message' => '操作成功']); + return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.action')])]); } - return response()->json(['status' => 'fail', 'message' => '操作失败']); + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.action')])]); } // 用户返利流水记录 diff --git a/app/Http/Controllers/Admin/ArticleController.php b/app/Http/Controllers/Admin/ArticleController.php index 42405db6..450e2e8b 100644 --- a/app/Http/Controllers/Admin/ArticleController.php +++ b/app/Http/Controllers/Admin/ArticleController.php @@ -42,21 +42,21 @@ class ArticleController extends Controller if ($data['type'] !== '4' && $request->hasFile('logo')) { $path = $this->fileUpload($request->file('logo')); if ($path === false) { - return redirect()->back()->withInput()->withErrors('Logo存储失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_action_item', ['action' => trans('common.store'), 'attribute' => trans('model.article.logo')])); } $data['logo'] = $path; } if ($article = Article::create($data)) { - return redirect(route('admin.article.edit', $article))->with('successMsg', '添加成功'); + return redirect(route('admin.article.edit', $article))->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')])); } } catch (Exception $e) { - Log::error('添加文章错误:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.add'), 'attribute' => trans('model.article.attribute')]).': '.$e->getMessage()); return redirect()->back()->withInput()->withErrors($e->getMessage()); } - return redirect()->back()->withInput()->withErrors('添加失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')])); } public function fileUpload(UploadedFile $file): string|bool @@ -98,7 +98,7 @@ class ArticleController extends Controller if ($data['type'] !== '4' && $request->hasFile('logo')) { $path = $this->fileUpload($request->file('logo')); if ($path === false) { - return redirect()->back()->withInput()->withErrors('Logo存储失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_action_item', ['action' => trans('common.store'), 'attribute' => trans('model.article.logo')])); } $data['logo'] = $path; } elseif (! $request->has('logo')) { @@ -106,10 +106,10 @@ class ArticleController extends Controller } if ($article->update($data)) { - return redirect()->back()->with('successMsg', '编辑成功'); + return redirect()->back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.edit')])); } - return redirect()->back()->withInput()->withErrors('编辑失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')])); } public function destroy(Article $article): JsonResponse @@ -118,11 +118,11 @@ class ArticleController extends Controller try { $article->delete(); } catch (Exception $e) { - Log::error('删除文章失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.article.attribute')]).', '.$e->getMessage()); - return response()->json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]); + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return response()->json(['status' => 'success', 'message' => '删除成功']); + return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/CertController.php b/app/Http/Controllers/Admin/CertController.php index 72af0fcd..d36b8287 100644 --- a/app/Http/Controllers/Admin/CertController.php +++ b/app/Http/Controllers/Admin/CertController.php @@ -32,10 +32,10 @@ class CertController extends Controller public function store(CertRequest $request) { if ($cert = NodeCertificate::create($request->validated())) { - return redirect(route('admin.node.cert.edit', $cert))->with('successMsg', trans('common.generate_item', ['attribute' => trans('common.success')])); + return redirect(route('admin.node.cert.edit', $cert))->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')])); } - return redirect()->back()->withInput()->withErrors('生成失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')])); } public function create() @@ -51,24 +51,24 @@ class CertController extends Controller public function update(CertRequest $request, NodeCertificate $cert): RedirectResponse { if ($cert->update($request->validated())) { - return redirect()->back()->with('successMsg', trans('common.update_action', ['action' => trans('common.success')])); + return redirect()->back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.edit')])); } - return redirect()->back()->withInput()->withErrors(trans('common.update_action', ['action' => trans('common.failed')])); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')])); } public function destroy(NodeCertificate $cert): JsonResponse { try { if ($cert->delete()) { - return response()->json(['status' => 'success', 'message' => '删除成功']); + return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除域名证书失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.node_cert.attribute')]).': '.$e->getMessage()); - return response()->json(['status' => 'fail', 'message' => '删除错误:'.$e->getMessage()]); + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return response()->json(['status' => 'fail', 'message' => '删除失败']); + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/Config/CategoryController.php b/app/Http/Controllers/Admin/Config/CategoryController.php index 84348369..9a93b722 100644 --- a/app/Http/Controllers/Admin/Config/CategoryController.php +++ b/app/Http/Controllers/Admin/Config/CategoryController.php @@ -23,10 +23,10 @@ class CategoryController extends Controller } if (GoodsCategory::create($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '提交成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } - return Response::json(['status' => 'fail', 'message' => '操作失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } // 编辑等级 @@ -41,10 +41,10 @@ class CategoryController extends Controller return Response::json(['status' => 'fail', 'message' => $validator->errors()->all()]); } if ($category->update($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.edit')])]); } - return Response::json(['status' => 'fail', 'message' => '操作失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')])]); } // 删除等级 @@ -52,19 +52,19 @@ class CategoryController extends Controller { // 校验该等级下是否存在关联账号 if ($category->goods()->exists()) { - return Response::json(['status' => 'fail', 'message' => '该分类下存在关联账号,请先取消关联']); + return Response::json(['status' => 'fail', 'message' => trans('common.exists_error', ['attribute' => trans('model.goods.category')])]); } try { if ($category->delete()) { - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除时报错:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.common.level')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/Config/CountryController.php b/app/Http/Controllers/Admin/Config/CountryController.php index bc4e8e6f..aa97e1f3 100644 --- a/app/Http/Controllers/Admin/Config/CountryController.php +++ b/app/Http/Controllers/Admin/Config/CountryController.php @@ -26,10 +26,10 @@ class CountryController extends Controller } if (Country::create($validator->validated())) { - return Response::json(['status' => 'success', 'message' => trans('common.generate_item', ['attribute' => trans('common.success')])]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } - return Response::json(['status' => 'fail', 'message' => '生成失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } // 编辑国家/地区 @@ -43,15 +43,15 @@ class CountryController extends Controller try { if ($country->update($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '编辑成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.edit')])]); } } catch (Exception $e) { - Log::error('编辑国家/地区时失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.edit'), 'attribute' => trans('model.node.country')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '编辑失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '编辑失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')])]); } // 删除国家/地区 @@ -59,19 +59,19 @@ class CountryController extends Controller { // 校验该国家/地区下是否存在关联节点 if ($country->nodes()->exists()) { - return Response::json(['status' => 'fail', 'message' => '该国家/地区下存在关联节点,请先取消关联']); + return Response::json(['status' => 'fail', 'message' => trans('common.exists_error', ['attribute' => trans('model.node.country')])]); } try { if ($country->delete()) { - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除国家/地区失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.node.country')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/Config/EmailFilterController.php b/app/Http/Controllers/Admin/Config/EmailFilterController.php index 2c14851f..be7b1e56 100644 --- a/app/Http/Controllers/Admin/Config/EmailFilterController.php +++ b/app/Http/Controllers/Admin/Config/EmailFilterController.php @@ -33,15 +33,15 @@ class EmailFilterController extends Controller try { if (EmailFilter::create($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '添加成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } } catch (Exception $e) { - Log::error('添加邮箱后缀时失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.add'), 'attribute' => trans('admin.setting.email.tail')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '添加失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '添加失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } // 删除邮箱后缀 @@ -49,14 +49,14 @@ class EmailFilterController extends Controller { try { if ($filter->delete()) { - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除邮箱后缀失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('admin.setting.email.tail')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/Config/LabelController.php b/app/Http/Controllers/Admin/Config/LabelController.php index 52b5e127..860a87ab 100644 --- a/app/Http/Controllers/Admin/Config/LabelController.php +++ b/app/Http/Controllers/Admin/Config/LabelController.php @@ -26,10 +26,10 @@ class LabelController extends Controller } if (Label::create($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '添加成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } - return Response::json(['status' => 'fail', 'message' => '添加失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } // 编辑标签 @@ -45,10 +45,10 @@ class LabelController extends Controller } if ($label->update($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '编辑成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.edit')])]); } - return Response::json(['status' => 'fail', 'message' => '编辑失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')])]); } // 删除标签 @@ -57,11 +57,11 @@ class LabelController extends Controller try { $label->delete(); - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } catch (Exception $e) { - Log::error('删除标签失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.node.label')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } } } diff --git a/app/Http/Controllers/Admin/Config/LevelController.php b/app/Http/Controllers/Admin/Config/LevelController.php index 145b6b57..5805ccb9 100644 --- a/app/Http/Controllers/Admin/Config/LevelController.php +++ b/app/Http/Controllers/Admin/Config/LevelController.php @@ -26,10 +26,10 @@ class LevelController extends Controller } if (Level::create($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '提交成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } - return Response::json(['status' => 'fail', 'message' => '操作失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } // 编辑等级 @@ -45,10 +45,10 @@ class LevelController extends Controller } if ($level->update($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.edit')])]); } - return Response::json(['status' => 'fail', 'message' => '操作失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')])]); } // 删除等级 @@ -56,19 +56,19 @@ class LevelController extends Controller { // 校验该等级下是否存在关联账号 if ($level->users()->exists()) { - return Response::json(['status' => 'fail', 'message' => '该等级下存在关联账号,请先取消关联']); + return Response::json(['status' => 'fail', 'message' => trans('common.exists_error', ['attribute' => trans('model.common.level')])]); } try { if ($level->delete()) { - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除等级时报错:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.common.level')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/Config/SsConfigController.php b/app/Http/Controllers/Admin/Config/SsConfigController.php index 7d017343..4c5ff740 100644 --- a/app/Http/Controllers/Admin/Config/SsConfigController.php +++ b/app/Http/Controllers/Admin/Config/SsConfigController.php @@ -26,18 +26,20 @@ class SsConfigController extends Controller } if (SsConfig::create($validator->validated())) { - return Response::json(['status' => 'success', 'message' => '添加成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } - return Response::json(['status' => 'fail', 'message' => '添加失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } // 设置SS默认配置 public function update(SsConfig $ss): JsonResponse { - $ss->setDefault(); + if ($ss->setDefault()) { + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.edit')])]); + } - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')])]); } // 删除SS配置 @@ -45,14 +47,14 @@ class SsConfigController extends Controller { try { if ($ss->delete()) { - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除SS配置时失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('user.node.info')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '删除失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/CouponController.php b/app/Http/Controllers/Admin/CouponController.php index 2ef23d36..807d3867 100644 --- a/app/Http/Controllers/Admin/CouponController.php +++ b/app/Http/Controllers/Admin/CouponController.php @@ -58,7 +58,7 @@ class CouponController extends Controller $file = $request->file('logo'); $fileName = Str::random(8).time().'.'.$file->getClientOriginalExtension(); if (! $file->storeAs('public', $fileName)) { - return Redirect::back()->withInput()->withErrors('LOGO不合法'); + return Redirect::back()->withInput()->withErrors(trans('common.failed_action_item', ['action' => trans('common.store'), 'attribute' => trans('model.coupon.logo')])); } $logo = 'upload/'.$fileName; } @@ -95,11 +95,11 @@ class CouponController extends Controller Coupon::create($data); } - return Redirect::route('admin.coupon.index')->with('successMsg', trans('common.generate_item', ['attribute' => trans('common.success')])); + return Redirect::route('admin.coupon.index')->with('successMsg', trans('common.success_item', ['attribute' => trans('common.generate')])); } catch (Exception $e) { - Log::error('生成优惠券失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.generate'), 'attribute' => trans('model.coupon.attribute')]).': '.$e->getMessage()); - return Redirect::back()->withInput()->withInput()->withErrors('生成优惠券失败:'.$e->getMessage()); + return Redirect::back()->withInput()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.generate')]).', '.$e->getMessage()); } } @@ -117,15 +117,15 @@ class CouponController extends Controller { try { if ($coupon->delete()) { - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除优惠券失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.coupon.attribute')]).': '.$e->getMessage()); - return Response::json(['status' => 'success', 'message' => '删除优惠券失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } // 导出卡券 @@ -133,37 +133,36 @@ class CouponController extends Controller { $couponList = Coupon::whereStatus(0)->get(); - try { - $filename = '卡券_Coupon_'.date('Ymd').'.xlsx'; - $spreadsheet = new Spreadsheet; - $spreadsheet->getProperties() - ->setCreator('ProxyPanel') - ->setLastModifiedBy('ProxyPanel') - ->setTitle('卡券') - ->setSubject('卡券'); + $filename = trans('model.coupon.attribute').'_'.date('Ymd').'.xlsx'; + $spreadsheet = new Spreadsheet; + $spreadsheet->getProperties() + ->setCreator('ProxyPanel') + ->setLastModifiedBy('ProxyPanel') + ->setTitle(trans('model.coupon.attribute')) + ->setSubject(trans('model.coupon.attribute')); - $sheet = $spreadsheet->getActiveSheet(); - $sheet->setTitle('卡券'); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->setTitle(trans('model.coupon.attribute')); + $sheet->fromArray([ + trans('model.common.type'), trans('model.coupon.name'), trans('model.coupon.usable_times'), trans('common.available_date'), trans('common.expired_at'), trans('model.coupon.sn'), trans('admin.coupon.discount'), + trans('model.coupon.priority'), trans('model.rule.attribute'), + ]); + + foreach ($couponList as $index => $coupon) { $sheet->fromArray([ - trans('model.common.type'), trans('model.coupon.name'), trans('model.coupon.usable_times'), trans('common.available_date'), trans('common.expired_at'), trans('model.coupon.sn'), trans('admin.coupon.discount'), - trans('model.coupon.priority'), trans('model.rule.attribute'), - ]); - - foreach ($couponList as $index => $coupon) { - $sheet->fromArray([ - [trans('common.status.unknown'), trans('admin.coupon.type.voucher'), trans('admin.coupon.type.discount'), trans('admin.coupon.type.charge')][$coupon->type], $coupon->name, - $coupon->type === 3 ? trans('admin.coupon.single_use') : ($coupon->usable_times ?? trans('common.unlimited')), $coupon->start_time, $coupon->end_time, $coupon->sn, - $coupon->type === 2 ? $coupon->value : Helpers::getPriceTag($coupon->value), $coupon->priority, json_encode($coupon->limit), - ], null, 'A'.($index + 2)); - } - - header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); - header('Content-Disposition: attachment;filename="'.$filename.'"'); - header('Cache-Control: max-age=0'); + [trans('common.status.unknown'), trans('admin.coupon.type.voucher'), trans('admin.coupon.type.discount'), trans('admin.coupon.type.charge')][$coupon->type], $coupon->name, + $coupon->type === 3 ? trans('admin.coupon.single_use') : ($coupon->usable_times ?? trans('common.unlimited')), $coupon->start_time, $coupon->end_time, $coupon->sn, + $coupon->type === 2 ? $coupon->value : Helpers::getPriceTag($coupon->value), $coupon->priority, json_encode($coupon->limit), + ], null, 'A'.($index + 2)); + } + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); + header('Content-Disposition: attachment;filename="'.$filename.'"'); + header('Cache-Control: max-age=0'); + try { $writer = IOFactory::createWriter($spreadsheet, 'Xlsx'); $writer->save('php://output'); } catch (\PhpOffice\PhpSpreadsheet\Exception $e) { - Log::error('导出优惠券时报错:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('admin.massive_export'), 'attribute' => trans('model.coupon.attribute')]).': '.$e->getMessage()); } } } diff --git a/app/Http/Controllers/Admin/LogsController.php b/app/Http/Controllers/Admin/LogsController.php index b6dc40d2..5c754335 100644 --- a/app/Http/Controllers/Admin/LogsController.php +++ b/app/Http/Controllers/Admin/LogsController.php @@ -72,14 +72,14 @@ class LogsController extends Controller $status = (int) $request->input('status'); if ($order->status === 3 && $status === 2 && $order->goods->type === 2 && Order::userActivePlan($order->user_id)->exists()) { - return Response::json(['status' => 'fail', 'message' => '更新失败, 订单冲突']); // 防止预支付订单假激活 + return Response::json(['status' => 'fail', 'message' => trans('admin.logs.order.update_conflict')]); // 防止预支付订单假激活 } if ($order->update(['is_expire' => 0, 'expired_at' => null, 'status' => $status])) { - return Response::json(['status' => 'success', 'message' => '更新成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.update')])]); } - return Response::json(['status' => 'fail', 'message' => '更新失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.update')])]); } // 流量日志 @@ -254,7 +254,6 @@ class LogsController extends Controller $nodeOnlineIPs = NodeOnlineIp::with('node:id,name')->where('created_at', '>=', strtotime('-10 minutes'))->latest()->distinct()->get(); foreach ($userList as $user) { - //Todo node_online_ip表 api可以用user_id // 最近5条在线IP记录,如果后端设置为60秒上报一次,则为10分钟内的在线IP $user->onlineIPList = $nodeOnlineIPs->where('port', $user->port)->take(5); } diff --git a/app/Http/Controllers/Admin/MarketingController.php b/app/Http/Controllers/Admin/MarketingController.php index 950a7132..181b7c64 100644 --- a/app/Http/Controllers/Admin/MarketingController.php +++ b/app/Http/Controllers/Admin/MarketingController.php @@ -9,7 +9,6 @@ use App\Models\User; use App\Models\UserGroup; use App\Models\UserHourlyDataFlow; use App\Notifications\Custom; -use Carbon; use Helpers; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; @@ -101,7 +100,7 @@ class MarketingController extends Controller // 最近N分钟活跃过 $request->whenFilled('lastAlive', function ($value) use ($users) { - $users->where('t', '>=', Carbon::now()->subMinutes($value)->timestamp); + $users->where('t', '>=', now()->subMinutes($value)->timestamp); }); $paidOrderCondition = function ($query) { diff --git a/app/Http/Controllers/Admin/NodeAuthController.php b/app/Http/Controllers/Admin/NodeAuthController.php index 9fe91432..e135f6df 100644 --- a/app/Http/Controllers/Admin/NodeAuthController.php +++ b/app/Http/Controllers/Admin/NodeAuthController.php @@ -7,6 +7,7 @@ use App\Models\Node; use App\Models\NodeAuth; use Exception; use Illuminate\Http\JsonResponse; +use Log; use Response; use Str; @@ -24,34 +25,38 @@ class NodeAuthController extends Controller $nodes = Node::whereStatus(1)->doesntHave('auth')->orderBy('id')->get(); if ($nodes->isEmpty()) { - return Response::json(['status' => 'success', 'message' => '没有需要生成授权的节点']); + return Response::json(['status' => 'success', 'message' => trans('admin.node.auth.empty')]); } $nodes->each(function ($node) { $node->auth()->create(['key' => Str::random(), 'secret' => Str::random(8)]); }); - return Response::json(['status' => 'success', 'message' => trans('common.generate_item', ['attribute' => trans('common.success')])]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.generate')])]); } // 重置节点授权 public function update(NodeAuth $auth): JsonResponse { if ($auth->update(['key' => Str::random(), 'secret' => Str::random(8)])) { - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.reset')])]); } - return Response::json(['status' => 'fail', 'message' => '操作失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.reset')])]); } // 删除节点授权 public function destroy(NodeAuth $auth): JsonResponse { try { - $auth->delete(); + if ($auth->delete()) { + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); + } } catch (Exception $e) { - return Response::json(['status' => 'fail', 'message' => '错误:'.var_export($e, true)]); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('admin.menu.node.auth')]).': '.$e->getMessage()); + + return Response::json(['status' => 'fail', 'message' => trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('admin.menu.node.auth')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/NodeController.php b/app/Http/Controllers/Admin/NodeController.php index f9b73fc9..a65d4619 100644 --- a/app/Http/Controllers/Admin/NodeController.php +++ b/app/Http/Controllers/Admin/NodeController.php @@ -51,20 +51,19 @@ class NodeController extends Controller { // 添加节点 try { if ($node = Node::create($this->nodeStore($request->validated()))) { - // 生成节点标签 - if ($request->has('labels')) { + if ($request->has('labels')) { // 生成节点标签 $node->labels()->attach($request->input('labels')); } - return Response::json(['status' => 'success', 'message' => '添加成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } } catch (Exception $e) { - Log::error('添加节点信息异常:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.add'), 'attribute' => trans('model.node.attribute')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '添加线路失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '添加线路失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } public function create() @@ -188,30 +187,30 @@ class NodeController extends Controller // 更新节点标签 $node->labels()->sync($request->input('labels')); - return Response::json(['status' => 'success', 'message' => '编辑成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.edit')])]); } } catch (Exception $e) { - Log::error('编辑节点信息异常:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.edit'), 'attribute' => trans('model.node.attribute')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '编辑失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '编辑失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')])]); } public function destroy(Node $node): JsonResponse { // 删除节点 try { if ($node->delete()) { - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除线路失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.node.attribute')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '删除线路失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除线路失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } public function checkNode(Node $node): JsonResponse @@ -221,7 +220,7 @@ class NodeController extends Controller $data[$ip] = [config('common.network_status')[$status['icmp']], config('common.network_status')[$status['tcp']]]; } - return Response::json(['status' => 'success', 'title' => '['.$node->name.']阻断信息', 'message' => $data ?? []]); + return Response::json(['status' => 'success', 'title' => '['.$node->name.'] '.trans('admin.node.connection_test'), 'message' => $data ?? []]); } public function refreshGeo($id): JsonResponse @@ -239,10 +238,10 @@ class NodeController extends Controller } if ($ret) { - return Response::json(['status' => 'success', 'message' => '获取地理位置更新成功!']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.update')])]); } - return Response::json(['status' => 'fail', 'message' => '【存在】获取地理位置更新失败!']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.update')])]); } public function reload($id): JsonResponse @@ -261,10 +260,10 @@ class NodeController extends Controller } if ($ret) { - return Response::json(['status' => 'success', 'message' => '重载成功!']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('admin.node.reload')])]); } - return Response::json(['status' => 'fail', 'message' => '【存在】重载失败!']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('admin.node.reload')])]); } public function nodeMonitor(Node $node) diff --git a/app/Http/Controllers/Admin/PermissionController.php b/app/Http/Controllers/Admin/PermissionController.php index ddaa3325..e584d8d8 100644 --- a/app/Http/Controllers/Admin/PermissionController.php +++ b/app/Http/Controllers/Admin/PermissionController.php @@ -8,6 +8,7 @@ use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; use Illuminate\Http\Request; +use Log; use Spatie\Permission\Models\Permission; class PermissionController extends Controller @@ -28,10 +29,10 @@ class PermissionController extends Controller public function store(PermissionRequest $request): RedirectResponse { if ($permission = Permission::create($request->validated())) { - return redirect()->route('admin.permission.edit', $permission)->with('successMsg', '操作成功'); + return redirect()->route('admin.permission.edit', $permission)->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')])); } - return redirect()->back()->withInput()->withErrors('操作失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')])); } public function create() @@ -47,20 +48,24 @@ class PermissionController extends Controller public function update(PermissionRequest $request, Permission $permission): RedirectResponse { if ($permission->update($request->validated())) { - return redirect()->back()->with('successMsg', '操作成功'); + return redirect()->back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.update')])); } - return redirect()->back()->withInput()->withErrors('操作失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.update')])); } public function destroy(Permission $permission): JsonResponse { try { - $permission->delete(); + if ($permission->delete()) { + return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); + } } catch (Exception $e) { - return response()->json(['status' => 'fail', 'message' => '删除失败,'.$e->getMessage()]); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('admin.logs.rule.title')]).': '.$e->getMessage()); + + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return response()->json(['status' => 'success', 'message' => '清理成功']); + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/RoleController.php b/app/Http/Controllers/Admin/RoleController.php index 1e66f328..30c097fd 100644 --- a/app/Http/Controllers/Admin/RoleController.php +++ b/app/Http/Controllers/Admin/RoleController.php @@ -7,6 +7,7 @@ use App\Http\Requests\Admin\RoleRequest; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; +use Log; use Spatie\Permission\Models\Permission; use Spatie\Permission\Models\Role; @@ -22,10 +23,10 @@ class RoleController extends Controller if ($role = Role::create($request->only(['name', 'description']))) { $role->givePermissionTo($request->input('permissions') ?? []); - return redirect()->route('admin.role.edit', $role)->with('successMsg', '操作成功'); + return redirect()->route('admin.role.edit', $role)->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')])); } - return redirect()->back()->withInput()->withErrors('操作失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')])); } public function create() @@ -44,29 +45,31 @@ class RoleController extends Controller public function update(RoleRequest $request, Role $role): RedirectResponse { if ($role->name === 'Super Admin') { - return redirect()->back()->withInput()->withErrors('请勿修改超级管理员'); + return redirect()->back()->withInput()->withErrors(trans('admin.role.modify_admin_error')); } if ($role->update($request->only(['name', 'description']))) { $role->syncPermissions($request->input('permissions') ?: []); - return redirect()->back()->with('successMsg', '操作成功'); + return redirect()->back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.edit')])); } - return redirect()->back()->withInput()->withErrors('操作失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')])); } public function destroy(Role $role): JsonResponse { try { if ($role->name === 'Super Admin') { - return response()->json(['status' => 'fail', 'message' => '请勿删除超级管理员']); + return response()->json(['status' => 'fail', 'message' => trans('admin.role.modify_admin_error')]); } $role->delete(); } catch (Exception $e) { - return response()->json(['status' => 'fail', 'message' => '删除失败,'.$e->getMessage()]); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.role.attribute')]).': '.$e->getMessage()); + + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return response()->json(['status' => 'success', 'message' => '清理成功']); + return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/RuleController.php b/app/Http/Controllers/Admin/RuleController.php index 0d12040f..5faca2ee 100644 --- a/app/Http/Controllers/Admin/RuleController.php +++ b/app/Http/Controllers/Admin/RuleController.php @@ -10,6 +10,7 @@ use App\Models\RuleLog; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\Request; +use Log; use Response; class RuleController extends Controller @@ -30,32 +31,36 @@ class RuleController extends Controller public function store(RuleRequest $request): JsonResponse { if (Rule::create($request->validated())) { - return Response::json(['status' => 'success', 'message' => '提交成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } - return Response::json(['status' => 'fail', 'message' => '操作失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } // 编辑审计规则 public function update(RuleRequest $request, Rule $rule): JsonResponse { if ($rule->update($request->validated())) { - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.edit')])]); } - return Response::json(['status' => 'fail', 'message' => '操作失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')])]); } // 删除审计规则 public function destroy(Rule $rule): JsonResponse { try { - $rule->delete(); + if ($rule->delete()) { + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); + } } catch (Exception $e) { - return Response::json(['status' => 'fail', 'message' => '操作失败, '.$e->getMessage()]); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.rule.attribute')]).': '.$e->getMessage()); + + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } // 用户触发审计规则日志 @@ -88,13 +93,15 @@ class RuleController extends Controller try { $ret = RuleLog::query()->delete(); } catch (Exception $e) { - return Response::json(['status' => 'fail', 'message' => '清理失败, '.$e->getMessage()]); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('admin.logs.rule.title')]).': '.$e->getMessage()); + + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } if ($ret || RuleLog::doesntExist()) { - return Response::json(['status' => 'success', 'message' => '清理成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } - return Response::json(['status' => 'fail', 'message' => '清理失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/RuleGroupController.php b/app/Http/Controllers/Admin/RuleGroupController.php index 42de91f1..23cfccf2 100644 --- a/app/Http/Controllers/Admin/RuleGroupController.php +++ b/app/Http/Controllers/Admin/RuleGroupController.php @@ -9,6 +9,7 @@ use App\Models\RuleGroup; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; +use Log; class RuleGroupController extends Controller { @@ -22,10 +23,10 @@ class RuleGroupController extends Controller if ($group = RuleGroup::create($request->only('name', 'type'))) { $group->rules()->attach($request->input('rules')); - return redirect(route('admin.rule.group.edit', $group))->with('successMsg', '操作成功'); + return redirect(route('admin.rule.group.edit', $group))->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')])); } - return redirect()->back()->withInput()->withErrors('操作失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')])); } public function create() @@ -46,20 +47,24 @@ class RuleGroupController extends Controller if ($group->update($request->only(['name', 'type']))) { $group->rules()->sync($request->input('rules')); - return redirect()->back()->with('successMsg', '操作成功'); + return redirect()->back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.edit')])); } - return redirect()->back()->withInput()->withErrors('操作失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')])); } public function destroy(RuleGroup $group): JsonResponse { try { - $group->delete(); + if ($group->delete()) { + return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); + } } catch (Exception $e) { - return response()->json(['status' => 'fail', 'message' => '删除失败,'.$e->getMessage()]); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.rule_group.attribute')]).': '.$e->getMessage()); + + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return response()->json(['status' => 'success', 'message' => '清理成功']); + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/ShopController.php b/app/Http/Controllers/Admin/ShopController.php index 4dbfba93..01e523ce 100644 --- a/app/Http/Controllers/Admin/ShopController.php +++ b/app/Http/Controllers/Admin/ShopController.php @@ -62,22 +62,22 @@ class ShopController extends Controller } try { if ($good = Goods::create($data)) { - return Redirect::route('admin.goods.edit', $good)->with('successMsg', '添加成功'); + return Redirect::route('admin.goods.edit', $good)->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')])); } } catch (Exception $e) { - Log::error('添加商品信息异常:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.add'), 'attribute' => trans('model.goods.attribute')]).': '.$e->getMessage()); - return Redirect::back()->withInput()->withErrors('添加商品信息失败:'.$e->getMessage()); + return Redirect::back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')]).', '.$e->getMessage()); } - return Redirect::back()->withInput()->withErrors('添加商品信息失败'); + return Redirect::back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')])); } public function fileUpload(UploadedFile $file) { // 图片上传 $fileName = Str::random(8).time().'.'.$file->getClientOriginalExtension(); if (! $file->storeAs('public', $fileName)) { - return Redirect::back()->withInput()->withErrors('Logo存储失败'); + return Redirect::back()->withInput()->withErrors(trans('common.failed_action_item', ['action' => trans('common.store'), 'attribute' => trans('model.goods.logo')])); } return 'upload/'.$fileName; @@ -115,29 +115,29 @@ class ShopController extends Controller $data['is_hot'] = array_key_exists('is_hot', $data) ? 1 : 0; $data['status'] = array_key_exists('status', $data) ? 1 : 0; if ($good->update($data)) { - return Redirect::back()->with('successMsg', '编辑成功'); + return Redirect::back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.edit')])); } } catch (Exception $e) { - Log::error('编辑商品信息失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.edit'), 'attribute' => trans('model.goods.attribute')]).': '.$e->getMessage()); - return Redirect::back()->withErrors('编辑商品信息失败:'.$e->getMessage()); + return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')]).', '.$e->getMessage()); } - return Redirect::back()->withInput()->withErrors('编辑失败'); + return Redirect::back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')])); } public function destroy(Goods $good): JsonResponse { try { if ($good->delete()) { - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('编辑商品失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.goods.attribute')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '编辑商品失败:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/Admin/SubscribeController.php b/app/Http/Controllers/Admin/SubscribeController.php index 7aede299..41a9ae2d 100644 --- a/app/Http/Controllers/Admin/SubscribeController.php +++ b/app/Http/Controllers/Admin/SubscribeController.php @@ -74,6 +74,6 @@ class SubscribeController extends Controller $subscribe->update(['status' => 1, 'ban_time' => null, 'ban_desc' => null]); } - return Response::json(['status' => 'success', 'message' => '操作成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.update')])]); } } diff --git a/app/Http/Controllers/Admin/TicketController.php b/app/Http/Controllers/Admin/TicketController.php index 4ab4f274..cfbaa2b5 100644 --- a/app/Http/Controllers/Admin/TicketController.php +++ b/app/Http/Controllers/Admin/TicketController.php @@ -39,16 +39,16 @@ class TicketController extends Controller $user = User::find($data['uid']) ?: User::whereUsername($data['username'])->first(); if ($user === Auth::user()) { - return Response::json(['status' => 'fail', 'message' => '不能对自己发起工单']); + return Response::json(['status' => 'fail', 'message' => trans('admin.ticket.self_send')]); } if ($ticket = Ticket::create(['user_id' => $user->id, 'admin_id' => auth()->id(), 'title' => $data['title'], 'content' => clean($data['content'])])) { $user->notify(new TicketCreated($ticket, route('replyTicket', ['id' => $ticket->id]))); - return Response::json(['status' => 'success', 'message' => '工单创建成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.create')])]); } - return Response::json(['status' => 'fail', 'message' => '工单创建失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.create')])]); } // 回复 @@ -69,30 +69,32 @@ class TicketController extends Controller $reply = $ticket->reply()->create(['admin_id' => Auth::id(), 'content' => $content]); if ($reply) { // 将工单置为已回复 - $ticket->update(['status' => 1]); + if ($ticket->status !== 1) { + $ticket->update(['status' => 1]); + } // 通知用户 if (sysConfig('ticket_replied_notification')) { $ticket->user->notify(new TicketReplied($reply, route('replyTicket', ['id' => $ticket->id]), true)); } - return Response::json(['status' => 'success', 'message' => '回复成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('user.ticket.reply')])]); } - return Response::json(['status' => 'fail', 'message' => '回复失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('user.ticket.reply')])]); } // 关闭工单 public function destroy(Ticket $ticket): JsonResponse { if (! $ticket->close()) { - return Response::json(['status' => 'fail', 'message' => '关闭失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.close')])]); } // 通知用户 if (sysConfig('ticket_closed_notification')) { $ticket->user->notify(new TicketClosed($ticket->id, $ticket->title, route('replyTicket', ['id' => $ticket->id]), \request('reason'), true)); } - return Response::json(['status' => 'success', 'message' => '关闭成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.close')])]); } } diff --git a/app/Http/Controllers/Admin/ToolsController.php b/app/Http/Controllers/Admin/ToolsController.php index a94c1b0f..ca7a23de 100644 --- a/app/Http/Controllers/Admin/ToolsController.php +++ b/app/Http/Controllers/Admin/ToolsController.php @@ -21,7 +21,7 @@ class ToolsController extends Controller $content = $request->input('content'); if (empty($content)) { - return Response::json(['status' => 'fail', 'message' => '请在左侧填入要反解析的SS(R)链接']); + return Response::json(['status' => 'fail', 'message' => trans('admin.tools.decompile.content_placeholder')]); } // 反解析处理 @@ -43,7 +43,7 @@ class ToolsController extends Controller // 生成转换好的JSON文件 //file_put_contents(public_path('downloads/decompile.json'), $txt); - return Response::json(['status' => 'success', 'data' => $txt, 'message' => '反解析成功']); + return Response::json(['status' => 'success', 'data' => $txt, 'message' => trans('common.success_item', ['attribute' => trans('admin.tools.decompile.attribute')])]); } return view('admin.tools.decompile'); @@ -62,13 +62,13 @@ class ToolsController extends Controller $content = $request->input('content'); if (empty($content)) { - return Response::json(['status' => 'fail', 'message' => '请在左侧填入要转换的内容']); + return Response::json(['status' => 'fail', 'message' => trans('admin.tools.convert.content_placeholder')]); } // 校验格式 $content = json_decode($content, true); if (empty($content->port_password)) { - return Response::json(['status' => 'fail', 'message' => '转换失败:配置信息里缺少【port_password】字段,或者该字段为空']); + return Response::json(['status' => 'fail', 'message' => trans('admin.tools.convert.missing_error')]); } // 转换成SSR格式JSON @@ -95,7 +95,7 @@ class ToolsController extends Controller // 生成转换好的JSON文件 file_put_contents(public_path('downloads/convert.json'), $json); - return Response::json(['status' => 'success', 'data' => $json, 'message' => '转换成功']); + return Response::json(['status' => 'success', 'data' => $json, 'message' => trans('common.success_item', ['attribute' => trans('common.convert')])]); } return view('admin.tools.convert'); @@ -104,19 +104,19 @@ class ToolsController extends Controller // 下载转换好的JSON文件 public function download(Request $request) { - $type = $request->input('type'); + $type = (int) $request->input('type'); if (empty($type)) { - exit('参数异常'); + exit(trans('admin.tools.convert.params_unknown')); } - if ($type == '1') { + if ($type === 1) { $filePath = public_path('downloads/convert.json'); } else { $filePath = public_path('downloads/decompile.json'); } if (! file_exists($filePath)) { - exit('文件不存在,请检查目录权限'); + exit(trans('admin.tools.convert.file_missing')); } return Response::download($filePath); @@ -127,18 +127,18 @@ class ToolsController extends Controller { if ($request->isMethod('POST')) { if (! $request->hasFile('uploadFile')) { - return Redirect::back()->withErrors('请选择要上传的文件'); + return Redirect::back()->withErrors(trans('admin.tools.import.file_required')); } $file = $request->file('uploadFile'); // 只能上传JSON文件 if ($file->getClientMimeType() !== 'application/json' || $file->getClientOriginalExtension() !== 'json') { - return Redirect::back()->withErrors('只允许上传JSON文件'); + return Redirect::back()->withErrors(trans('admin.tools.import.file_type_error', ['type' => 'JSON'])); } if (! $file->isValid()) { - return Redirect::back()->withErrors('产生未知错误,请重新上传'); + return Redirect::back()->withErrors(trans('admin.tools.import.file_error')); } $save_path = realpath(storage_path('uploads')); @@ -149,7 +149,7 @@ class ToolsController extends Controller $data = file_get_contents($save_path.'/'.$new_name); $data = json_decode($data, true); if (! $data) { - return Redirect::back()->withErrors('内容格式解析异常,请上传符合SSR(R)配置规范的JSON文件'); + return Redirect::back()->withErrors(trans('admin.tools.import.format_error', ['type' => 'JSON'])); } try { @@ -176,11 +176,12 @@ class ToolsController extends Controller DB::commit(); } catch (Exception $e) { DB::rollBack(); + Log::error(trans('common.error_action_item', ['action' => trans('common.import'), 'attribute' => trans('admin.menu.tools.import')]).': '.$e->getMessage()); - return Redirect::back()->withErrors('出错了,可能是导入的配置中有端口已经存在了'); + return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.import')]).', '.$e->getMessage()); } - return Redirect::back()->with('successMsg', '导入成功'); + return Redirect::back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.import')])); } return view('admin.tools.import'); @@ -191,7 +192,7 @@ class ToolsController extends Controller { $file = storage_path('app/ssserver.log'); if (! file_exists($file)) { - Session::flash('analysisErrorMsg', $file.' 不存在,请先创建文件'); + Session::flash('analysisErrorMsg', trans('admin.tools.analysis.file_missing', ['file_name' => $file])); return view('admin.tools.analysis'); } diff --git a/app/Http/Controllers/Admin/UserController.php b/app/Http/Controllers/Admin/UserController.php index 652a53c3..0e818287 100644 --- a/app/Http/Controllers/Admin/UserController.php +++ b/app/Http/Controllers/Admin/UserController.php @@ -103,23 +103,22 @@ class UserController extends Controller try { $adminUser = Auth::getUser(); if ($roles && ($adminUser->can('give roles') || (in_array('Super Admin', $roles, true) && $adminUser->hasRole('Super Admin')))) { - // 编辑用户权限 - // 只有超级管理员才有赋予超级管理的权限 + // 编辑用户权限, 只有超级管理员才有赋予超级管理的权限 $user->assignRole($roles); } if ($user) { - Helpers::addUserTrafficModifyLog($user->id, 0, $data['transfer_enable'], '后台手动添加用户'); + Helpers::addUserTrafficModifyLog($user->id, 0, $data['transfer_enable'], trans('Manually add in dashboard.')); - return Response::json(['status' => 'success', 'message' => '添加成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.add')])]); } } catch (Exception $e) { - Log::error('添加用户错误:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.add'), 'attribute' => trans('model.user.attribute')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => $e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '添加失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.add')])]); } public function create() @@ -156,20 +155,20 @@ class UserController extends Controller public function destroy(User $user): JsonResponse { if ($user->id === 1) { - return Response::json(['status' => 'fail', 'message' => '系统管理员不可删除']); + return Response::json(['status' => 'fail', 'message' => trans('admin.user.admin_deletion')]); } try { if ($user->delete()) { - return Response::json(['status' => 'success', 'message' => '删除成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); } } catch (Exception $e) { - Log::error('删除用户信息异常:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.user.attribute')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '删除失败'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return Response::json(['status' => 'fail', 'message' => '删除失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } public function batchAddUsers(): ?JsonResponse @@ -177,12 +176,14 @@ class UserController extends Controller try { for ($i = 0; $i < (int) request('amount', 1); $i++) { $user = Helpers::addUser(Str::random(8).'@auto.generate', Str::random(), MiB * sysConfig('default_traffic'), (int) sysConfig('default_days')); - Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, trans('admin.user.massive.note')); + Helpers::addUserTrafficModifyLog($user->id, 0, $user->transfer_enable, trans('Batch generate user accounts in dashboard.')); } - return Response::json(['status' => 'success', 'message' => trans('admin.user.massive.succeed')]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.generate')])]); } catch (Exception $e) { - return Response::json(['status' => 'fail', 'message' => trans('admin.user.massive.failed').':'.$e->getMessage()]); + Log::error(trans('common.error_action_item', ['action' => trans('common.generate'), 'attribute' => trans('model.user.attribute')]).': '.$e->getMessage()); + + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.generate')]).', '.$e->getMessage()]); } } @@ -192,20 +193,22 @@ class UserController extends Controller Session::put('admin', Auth::id()); Session::put('user', $user->id); - return Response::json(['status' => 'success', 'message' => '身份切换成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('admin.user.info.switch')])]); } public function resetTraffic(User $user): JsonResponse { try { - $user->update(['u' => 0, 'd' => 0]); + if ($user->update(['u' => 0, 'd' => 0])) { + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.reset')])]); + } } catch (Exception $e) { - Log::error('流量重置失败:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.reset'), 'attribute' => trans('model.user.usable_traffic')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '流量重置失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.reset').', '.$e->getMessage()])]); } - return Response::json(['status' => 'success', 'message' => '流量重置成功']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.reset')])]); } public function update(UserUpdateRequest $request, User $user): JsonResponse @@ -246,19 +249,19 @@ class UserController extends Controller } if ($user->transfer_enable !== $data['transfer_enable']) { - Helpers::addUserTrafficModifyLog($user->id, $user->transfer_enable, $data['transfer_enable'], '后台手动编辑用户'); + Helpers::addUserTrafficModifyLog($user->id, $user->transfer_enable, $data['transfer_enable'], trans('Manually edit in dashboard.')); } if ($user->update($data)) { - return Response::json(['status' => 'success', 'message' => '编辑成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.edit')])]); } } catch (Exception $e) { - Log::error('编辑用户信息异常:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.edit'), 'attribute' => trans('model.user.attribute')]).': '.$e->getMessage()); - return Response::json(['status' => 'fail', 'message' => '编辑用户信息错误:'.$e->getMessage()]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit').', '.$e->getMessage()])]); } - return Response::json(['status' => 'fail', 'message' => '编辑失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.edit')])]); } public function handleUserCredit(Request $request, User $user): JsonResponse @@ -266,17 +269,17 @@ class UserController extends Controller $amount = $request->input('amount'); if (empty($amount)) { - return Response::json(['status' => 'fail', 'message' => '充值异常']); + return Response::json(['status' => 'fail', 'message' => trans('common.error_item', ['attribute' => trans('user.recharge')])]); } // 加减余额 if ($user->updateCredit($amount)) { - Helpers::addUserCreditLog($user->id, null, $user->credit - $amount, $user->credit, $amount, $request->input('description') ?? '后台手动充值'); // 写入余额变动日志 + Helpers::addUserCreditLog($user->id, null, $user->credit - $amount, $user->credit, $amount, $request->input('description') ?? 'Manually edit in dashboard.'); // 写入余额变动日志 - return Response::json(['status' => 'success', 'message' => '充值成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('user.recharge')])]); } - return Response::json(['status' => 'fail', 'message' => '充值失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('user.recharge')])]); } public function export(User $user) diff --git a/app/Http/Controllers/Admin/UserGroupController.php b/app/Http/Controllers/Admin/UserGroupController.php index aad975f5..3d72e199 100644 --- a/app/Http/Controllers/Admin/UserGroupController.php +++ b/app/Http/Controllers/Admin/UserGroupController.php @@ -9,6 +9,7 @@ use App\Models\UserGroup; use Exception; use Illuminate\Http\JsonResponse; use Illuminate\Http\RedirectResponse; +use Log; class UserGroupController extends Controller { @@ -22,10 +23,10 @@ class UserGroupController extends Controller if ($userGroup = UserGroup::create($request->only(['name']))) { $userGroup->nodes()->attach($request->input('nodes')); - return redirect(route('admin.user.group.edit', $userGroup))->with('successMsg', '操作成功'); + return redirect(route('admin.user.group.edit', $userGroup))->with('successMsg', trans('common.success_item', ['attribute' => trans('common.add')])); } - return redirect()->back()->withInput()->withErrors('操作失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.add')])); } public function create() @@ -46,24 +47,28 @@ class UserGroupController extends Controller if ($group->update($request->only(['name']))) { $group->nodes()->sync($request->input('nodes')); - return redirect()->back()->with('successMsg', '操作成功'); + return redirect()->back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.edit')])); } - return redirect()->back()->withInput()->withErrors('操作失败'); + return redirect()->back()->withInput()->withErrors(trans('common.failed_item', ['attribute' => trans('common.edit')])); } public function destroy(UserGroup $group): JsonResponse { if ($group->users->isNotEmpty()) { // 校验该分组下是否存在关联账号 - return response()->json(['status' => 'fail', 'message' => '该分组下存在关联账号,请先取消关联!']); + return response()->json(['status' => 'fail', 'message' => trans('common.exists_error', ['attribute' => trans('model.user_group.attribute')])]); } try { - $group->delete(); + if ($group->delete()) { + return response()->json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.delete')])]); + } } catch (Exception $e) { - return response()->json(['status' => 'fail', 'message' => '删除失败,'.$e->getMessage()]); + Log::error(trans('common.error_action_item', ['action' => trans('common.delete'), 'attribute' => trans('model.user_group.attribute')]).': '.$e->getMessage()); + + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')]).', '.$e->getMessage()]); } - return response()->json(['status' => 'success', 'message' => '清理成功']); + return response()->json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.delete')])]); } } diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index 5ac682b7..fc498056 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -96,36 +96,35 @@ class AdminController extends Controller $obj->save(); } - return Response::json(['status' => 'success', 'message' => trans('common.generate_item', ['attribute' => trans('common.success')])]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.generate')])]); } // 导出邀请码 public function exportInvite(): void { $inviteList = Invite::whereStatus(0)->orderBy('id')->get(); - $filename = '邀请码'.date('Ymd').'.xlsx'; + $filename = trans('user.invite.attribute').'_'.date('Ymd').'.xlsx'; $spreadsheet = new Spreadsheet; - $spreadsheet->getProperties()->setCreator('ProxyPanel')->setLastModifiedBy('ProxyPanel')->setTitle('邀请码')->setSubject('邀请码'); + $spreadsheet->getProperties()->setCreator('ProxyPanel')->setLastModifiedBy('ProxyPanel')->setTitle(trans('user.invite.attribute'))->setSubject(trans('user.invite.attribute')); + $spreadsheet->setActiveSheetIndex(0); + $sheet = $spreadsheet->getActiveSheet(); + $sheet->setTitle(trans('user.invite.attribute')); + $sheet->fromArray([trans('user.invite.attribute'), trans('common.available_date')]); + foreach ($inviteList as $k => $vo) { + $sheet->fromArray([$vo->code, $vo->dateline], null, 'A'.($k + 2)); + } + + header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // 输出07Excel文件 + //header('Content-Type:application/vnd.ms-excel'); // 输出Excel03版本文件 + header('Content-Disposition: attachment;filename="'.$filename.'"'); + header('Cache-Control: max-age=0'); try { - $spreadsheet->setActiveSheetIndex(0); - $sheet = $spreadsheet->getActiveSheet(); - $sheet->setTitle('邀请码'); - $sheet->fromArray(['邀请码', '有效期']); - - foreach ($inviteList as $k => $vo) { - $sheet->fromArray([$vo->code, $vo->dateline], null, 'A'.($k + 2)); - } - - header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'); // 输出07Excel文件 - //header('Content-Type:application/vnd.ms-excel'); // 输出Excel03版本文件 - header('Content-Disposition: attachment;filename="'.$filename.'"'); - header('Cache-Control: max-age=0'); $writer = new Xlsx($spreadsheet); $writer->save('php://output'); } catch (Exception $e) { - Log::error('导出邀请码时报错:'.$e->getMessage()); + Log::error(trans('common.error_action_item', ['action' => trans('common.export'), 'attribute' => trans('user.invite.attribute')]).': '.$e->getMessage()); } } diff --git a/app/Http/Controllers/Api/Client/ClientController.php b/app/Http/Controllers/Api/Client/ClientController.php index c34889ba..10d0c8c2 100644 --- a/app/Http/Controllers/Api/Client/ClientController.php +++ b/app/Http/Controllers/Api/Client/ClientController.php @@ -63,7 +63,7 @@ class ClientController extends Controller 'user' => $userInfo, 'ssrSubToken' => $user->subscribe->code, 'user_expire' => $user_expire, - 'subUrl' => route('sub', $user->subscribe->code), + 'subUrl' => $user->subUrl(), 'baseUrl' => sysConfig('subscribe_domain') ?? sysConfig('website_url'), 'ann' => $ann, 'avatar' => $user->avatar, @@ -86,7 +86,7 @@ class ClientController extends Controller $data[] = [ 'id' => $order->id, 'total_amount' => $order->amount * 100, - 'plan' => ['name' => $order->goods()->value('name') ?? '余额充值'], + 'plan' => ['name' => $order->goods()->value('name') ?? trans('user.recharge_credit')], 'status' => [-1 => 2, 0 => 0, 1 => 1, 2 => 3, 3 => 4][$order->status], 'created_at' => strtotime($order->created_at), ]; diff --git a/app/Http/Controllers/AuthController.php b/app/Http/Controllers/AuthController.php index 0bc27b9f..96a144df 100644 --- a/app/Http/Controllers/AuthController.php +++ b/app/Http/Controllers/AuthController.php @@ -16,7 +16,6 @@ use App\Utils\Helpers; use App\Utils\IP; use Auth; use Cache; -use Captcha; use Cookie; use Hash; use Hashids\Hashids; @@ -98,43 +97,26 @@ class AuthController extends Controller } private function check_captcha(Request $request): RedirectResponse|bool - { // 校验验证码 - switch (sysConfig('is_captcha')) { - case 1: // 默认图形验证码 - if (! Captcha::check($request->input('captcha'))) { - return Redirect::back()->withInput()->withErrors(trans('auth.captcha.error.failed')); - } - break; - case 2: // Geetest - $validator = Validator::make($request->all(), ['geetest_challenge' => 'required|geetest']); + { + // Define the rules based on the captcha type + $rules = [ + 1 => ['captcha' => 'required|captcha'], // Mews\Captcha + 2 => ['geetest_challenge' => 'required|geetest'], // Geetest + 3 => ['g-recaptcha-response' => 'required|NoCaptcha'], // Google reCAPTCHA + 4 => ['h-captcha-response' => 'required|HCaptcha'], // hCaptcha + 5 => ['cf-turnstile-response' => ['required', 'string', new TurnstileCaptcha]], // Turnstile + ]; - if ($validator->fails()) { - return Redirect::back()->withInput()->withErrors(trans('auth.captcha.error.failed')); - } - break; - case 3: // Google reCAPTCHA - $validator = Validator::make($request->all(), ['g-recaptcha-response' => 'required|NoCaptcha']); + // Get the current captcha setting + $captchaType = sysConfig('is_captcha'); - if ($validator->fails()) { - return Redirect::back()->withInput()->withErrors(trans('auth.captcha.error.failed')); - } - break; - case 4: // hCaptcha - $validator = Validator::make($request->all(), ['h-captcha-response' => 'required|HCaptcha']); + // Check if the captcha is enabled and has a defined rule + if (isset($rules[$captchaType])) { + $validator = Validator::make($request->all(), $rules[$captchaType]); - if ($validator->fails()) { - return Redirect::back()->withInput()->withErrors(trans('auth.captcha.error.failed')); - } - break; - case 5: // Turnstile - $validator = Validator::make($request->all(), ['cf-turnstile-response' => ['required', 'string', new TurnstileCaptcha]]); - - if ($validator->fails()) { - return Redirect::back()->withInput()->withErrors($validator->errors()); - } - break; - default: // 不启用验证码 - break; + if ($validator->fails()) { + return Redirect::back()->withInput()->withErrors(trans('auth.captcha.error.failed')); + } } return true; @@ -189,10 +171,10 @@ class AuthController extends Controller // 校验邀请码合法性 if ($invite_code) { if (Invite::whereCode($invite_code)->whereStatus(0)->doesntExist()) { - return Redirect::back()->withInput($request->except('code'))->withErrors(trans('auth.invite.error.unavailable')); + return Redirect::back()->withInput($request->except('code'))->withErrors(trans('auth.invite.unavailable')); } } elseif ((int) sysConfig('is_invite_register') === 2) { // 必须使用邀请码 - return Redirect::back()->withInput()->withErrors(trans('validation.required', ['attribute' => trans('auth.invite.attribute')])); + return Redirect::back()->withInput()->withErrors(trans('validation.required', ['attribute' => trans('user.invite.attribute')])); } } @@ -283,7 +265,7 @@ class AuthController extends Controller $user->update(['status' => 1]); } - Session::flash('successMsg', trans('auth.register.success')); + Session::flash('successMsg', trans('common.success_item', ['attribute' => trans('auth.register.attribute')])); } return Redirect::route('login')->withInput(); @@ -457,7 +439,7 @@ class AuthController extends Controller // 更新密码 if (! $user->update(['password' => $password])) { - return Redirect::back()->withErrors(trans('auth.password.reset.error.failed')); + return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('auth.password.reset.attribute')])); } // 置为已使用 diff --git a/app/Http/Controllers/MessageController.php b/app/Http/Controllers/MessageController.php index 28005921..8bbac5d4 100644 --- a/app/Http/Controllers/MessageController.php +++ b/app/Http/Controllers/MessageController.php @@ -13,8 +13,10 @@ class MessageController extends Controller $log = NotificationLog::whereMsgId($msgId)->latest()->firstOrFail(); $title = $log->title; $content = Markdown::parse($log->content)->toHtml(); + + return view('components.message', compact('title', 'content')); } - return view('components.message', compact('title', 'content')); + return false; } } diff --git a/app/Http/Controllers/OAuthController.php b/app/Http/Controllers/OAuthController.php index e394b446..8bf70477 100644 --- a/app/Http/Controllers/OAuthController.php +++ b/app/Http/Controllers/OAuthController.php @@ -18,10 +18,10 @@ class OAuthController extends Controller $user = Auth::user(); if ($user && $user->userAuths()->whereType($provider)->delete()) { - return redirect()->route('profile')->with('successMsg', trans('auth.oauth.unbind_success')); + return redirect()->route('profile')->with('successMsg', trans('common.success_item', ['attribute' => trans('user.oauth.unbind')])); } - return redirect()->route('profile')->withErrors(trans('auth.oauth.unbind_failed')); + return redirect()->route('profile')->withErrors(trans('common.failed_item', ['attribute' => trans('user.oauth.unbind')])); } public function bind(string $provider): RedirectResponse @@ -36,7 +36,7 @@ class OAuthController extends Controller $user = Auth::user(); if (! $user) { - return redirect()->route('profile')->withErrors(trans('auth.oauth.bind_failed')); + return redirect()->route('profile')->withErrors(trans('common.failed_item', ['attribute' => trans('user.oauth.bind')])); } return $this->bindLogic($provider, $user, $authInfo); @@ -54,10 +54,10 @@ class OAuthController extends Controller if ($auth) { $user->userAuths()->whereType($provider)->update($data); - $message = trans('auth.oauth.rebind_success'); + $message = trans('common.success_item', ['attribute' => trans('user.oauth.rebind')]); } else { $user->userAuths()->create($data); - $message = trans('auth.oauth.bind_success'); + $message = trans('common.success_item', ['attribute' => trans('user.oauth.bind')]); } return redirect()->route('profile')->with('successMsg', $message); @@ -71,7 +71,7 @@ class OAuthController extends Controller } if ((int) sysConfig('is_invite_register') === 2) { - return redirect()->route('register')->withErrors(trans('validation.required', ['attribute' => trans('auth.invite.attribute')])); + return redirect()->route('register')->withErrors(trans('validation.required', ['attribute' => trans('user.invite.attribute')])); } $registerInfo = Socialite::driver($provider)->stateless()->user(); diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index e767d6ef..f8087fa5 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -33,38 +33,36 @@ class PaymentController extends Controller { self::$method = $request->query('method') ?: $request->input('method'); - Log::notice('[{method}] 回调接口:{body}', ['method' => self::$method, 'body' => var_export($request->all(), true)]); + Log::notice('[{method}] '.trans('admin.menu.log.payment_callback').': {body}', ['method' => self::$method, 'body' => var_export($request->all(), true)]); return self::getClient()->notify($request); } public static function getClient(): Gateway { - switch (self::$method) { - case 'credit': - return new Local; - case 'f2fpay': - return new F2Fpay; - case 'codepay': - return new Codepay; - case 'payjs': - return new PayJs; - case 'paypal': - return new PayPal; - case 'epay': - return new EPay; - case 'stripe': - return new Stripe; - case 'paybeaver': - return new PayBeaver; - case 'theadpay': - return new THeadPay; - case 'manual': - return new Manual; - default: - Log::emergency('未知支付:'.self::$method); - exit(404); + // Mapping of payment methods to their respective classes + $paymentMethods = [ + 'credit' => Local::class, + 'f2fpay' => F2Fpay::class, + 'codepay' => CodePay::class, + 'payjs' => PayJs::class, + 'paypal' => PayPal::class, + 'epay' => EPay::class, + 'stripe' => Stripe::class, + 'paybeaver' => PayBeaver::class, + 'theadpay' => THeadPay::class, + 'manual' => Manual::class, + ]; + + // Check if the method exists in the mapping + if (isset($paymentMethods[self::$method])) { + // Instantiate and return the corresponding class + return new $paymentMethods[self::$method]; } + + // Log an emergency message and exit if the method is unknown + Log::emergency(trans('user.payment.order_creation.unknown_payment').': '.self::$method); + exit(404); } public static function getStatus(Request $request): JsonResponse @@ -72,17 +70,17 @@ class PaymentController extends Controller $payment = Payment::whereTradeNo($request->input('trade_no'))->first(); if ($payment) { if ($payment->status === 1) { - return Response::json(['status' => 'success', 'message' => '支付成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('user.pay')])]); } if ($payment->status === -1) { - return Response::json(['status' => 'error', 'message' => '订单超时未支付,已自动关闭']); + return Response::json(['status' => 'error', 'message' => trans('user.payment.order_creation.order_timeout')]); } - return Response::json(['status' => 'fail', 'message' => '等待支付']); + return Response::json(['status' => 'fail', 'message' => trans('common.payment.status.wait')]); } - return Response::json(['status' => 'error', 'message' => '未知订单']); + return Response::json(['status' => 'error', 'message' => trans('user.payment.order_creation.unknown_order')]); } public function purchase(Request $request) // 创建支付订单 @@ -104,7 +102,7 @@ class PaymentController extends Controller } elseif ($goods_id && self::$method) { // 购买服务 $goods = Goods::find($goods_id); if (! $goods || ! $goods->status) { - return Response::json(['status' => 'fail', 'message' => '订单创建失败:商品已下架']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.product_unavailable')]); } $amount = $goods->price; @@ -113,14 +111,14 @@ class PaymentController extends Controller // 无生效套餐,禁止购买加油包 if ($goods->type === 1 && $activePlan) { - return Response::json(['status' => 'fail', 'message' => '购买加油包前,请先购买套餐']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.plan_required')]); } // 单个商品限购 if ($goods->limit_num) { $count = Order::uid()->where('status', '>=', 0)->whereGoodsId($goods_id)->count(); if ($count >= $goods->limit_num) { - return Response::json(['status' => 'fail', 'message' => '此商品限购'.$goods->limit_num.'次,您已购买'.$count.'次']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.order_limit', ['limit_num' => $goods->limit_num, 'count' => $count])]); } } @@ -141,24 +139,24 @@ class PaymentController extends Controller if (self::$method !== 'credit') { // 判断是否开启在线支付 if (! sysConfig('is_onlinePay') && ! sysConfig('wechat_qrcode') && ! sysConfig('alipay_qrcode')) { - return Response::json(['status' => 'fail', 'message' => '订单创建失败:系统并未开启在线支付功能']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.payment_disabled')]); } // 判断是否存在同个商品的未支付订单 if (Order::uid()->whereStatus(0)->exists()) { - return Response::json(['status' => 'fail', 'message' => '订单创建失败:尚有未支付的订单,请先去支付']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.pending_order')]); } } elseif (auth()->user()->credit < $amount) { // 验证账号余额是否充足 - return Response::json(['status' => 'fail', 'message' => '您的余额不足,请先充值']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.insufficient_balance')]); } // 价格异常判断 if ($amount < 0) { - return Response::json(['status' => 'fail', 'message' => '订单创建失败:订单总价异常']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.price_issue')]); } if ($amount === 0 && self::$method !== 'credit') { - return Response::json(['status' => 'fail', 'message' => '订单创建失败:订单总价为0,无需使用在线支付']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.price_zero')]); } } @@ -181,7 +179,7 @@ class PaymentController extends Controller $coupon->decrement('usable_times'); } - Helpers::addCouponLog('订单支付使用', $coupon->id, $goods_id, $newOrder->id); + Helpers::addCouponLog('Coupon used in order.', $coupon->id, $goods_id, $newOrder->id); } $request->merge(['id' => $newOrder->id, 'type' => $pay_type, 'amount' => $amount]); @@ -189,19 +187,19 @@ class PaymentController extends Controller // 生成支付单 return self::getClient()->purchase($request); } catch (Exception $e) { - Log::emergency('订单生成错误:'.$e->getMessage()); + Log::emergency(trans('common.failed_action_item', ['action' => trans('common.create'), 'attribute' => trans('model.order.attribute')]).': '.$e->getMessage()); } - return Response::json(['status' => 'fail', 'message' => '订单创建失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_action_item', ['action' => trans('common.create'), 'attribute' => trans('model.order.attribute')])]); } public function close(Order $order): JsonResponse { if (! $order->close()) { - return Response::json(['status' => 'fail', 'message' => '关闭订单失败']); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_action_item', ['action' => trans('common.close'), 'attribute' => trans('model.order.attribute')])]); } - return Response::json(['status' => 'success', 'message' => '关闭订单成功']); + return Response::json(['status' => 'success', 'message' => trans('common.success_action_item', ['action' => trans('common.close'), 'attribute' => trans('model.order.attribute')])]); } public function detail($trade_no) // 支付单详情 diff --git a/app/Http/Controllers/TelegramController.php b/app/Http/Controllers/TelegramController.php index 5188c931..3ef6964a 100644 --- a/app/Http/Controllers/TelegramController.php +++ b/app/Http/Controllers/TelegramController.php @@ -61,71 +61,20 @@ class TelegramController extends Controller private function fromSend(): void { - switch ($this->msg->command) { - case '/bind': - $this->bind(); - break; - case '/traffic': - $this->traffic(); - break; - case '/getLatestUrl': - $this->getLatestUrl(); - break; - case '/unbind': - $this->unbind(); - break; - default: - $this->help(); - } - } + $commands = [ + '/bind' => 'bind', + '/traffic' => 'traffic', + '/url' => 'getUrl', + '/unbind' => 'unbind', + ]; - private function bind(): void - { - $msg = $this->msg; - if (! $msg->is_private) { - return; - } - if (! isset($msg->args[0])) { - abort(500, '参数有误,请携带邮箱地址发送'); - } - $user = User::whereUsername($msg->args[0])->first(); - if (! $user) { - abort(500, '用户不存在'); - } - if ($user->telegram_user_id) { - abort(500, '该账号已经绑定了Telegram账号'); - } + $command = $this->msg->command; - if (! $user->userAuths()->create(['type' => 'telegram', 'identifier' => $msg->chat_id])) { - abort(500, '设置失败'); - } - $telegramService = new TelegramService; - $telegramService->sendMessage($msg->chat_id, '绑定成功'); - } - - private function traffic(): void - { - $msg = $this->msg; - if (! $msg->is_private) { - return; - } - $telegramService = new TelegramService; - if (! $oauth = UserOauth::query()->where([ - 'type' => 'telegram', - 'identifier' => $msg->chat_id, - ])->first()) { + if (isset($commands[$command])) { + $this->{$commands[$command]}(); + } else { $this->help(); - $telegramService->sendMessage($msg->chat_id, '没有查询到您的用户信息,请先绑定账号', 'markdown'); - - return; } - $user = $oauth->user; - $transferEnable = formatBytes($user->transfer_enable); - $up = formatBytes($user->u); - $down = formatBytes($user->d); - $remaining = formatBytes($user->transfer_enable - ($user->u + $user->d)); - $text = "🚥流量查询\n———————————————\n计划流量:`$transferEnable`\n已用上行:`$up`\n已用下行:`$down`\n剩余流量:`$remaining`"; - $telegramService->sendMessage($msg->chat_id, $text, 'markdown'); } private function help(): void @@ -134,52 +83,12 @@ class TelegramController extends Controller if (! $msg->is_private) { return; } + + $webName = sysConfig('website_name'); + $accountType = sysConfig('username_type') === 'email' || sysConfig('username_type') === null ? ucfirst(trans('validation.attributes.email')) : trans('model.user.username'); $telegramService = new TelegramService; - $commands = [ - '/bind 订阅地址 - 绑定你的'.sysConfig('website_name').'账号', - '/traffic - 查询流量信息', - '/getLatestUrl - 获取最新的'.sysConfig('website_name').'网址', - '/unbind - 解除绑定', - ]; - $text = implode(PHP_EOL, $commands); - $telegramService->sendMessage($msg->chat_id, "你可以使用以下命令进行操作:\n\n$text", 'markdown'); - } - - private function getLatestUrl(): void - { - $msg = $this->msg; - $telegramService = new TelegramService; - $text = sprintf( - '%s的最新网址是:%s', - sysConfig('website_name'), - sysConfig('website_url') - ); - $telegramService->sendMessage($msg->chat_id, $text, 'markdown'); - } - - private function unbind(): void - { - $msg = $this->msg; - if (! $msg->is_private) { - return; - } - $user = User::with([ - 'userAuths' => function ($query) use ($msg) { - $query->whereType('telegram')->whereIdentifier($msg->chat_id); - }, - ])->first(); - - $telegramService = new TelegramService; - if (! $user) { - $this->help(); - $telegramService->sendMessage($msg->chat_id, '没有查询到您的用户信息,请先绑定账号', 'markdown'); - - return; - } - if (! $user->userAuths()->whereType('telegram')->whereIdentifier($msg->chat_id)->delete()) { - abort(500, '解绑失败'); - } - $telegramService->sendMessage($msg->chat_id, '解绑成功', 'markdown'); + $commands = trans('user.telegram.command.intro').": \n\n/bind `$accountType` -[".trans('user.telegram.command.bind', ['web_name' => $webName])."]\n/traffic -[".trans('user.telegram.command.traffic')."]\n/url -[".trans('user.telegram.command.web_url', ['web_name' => $webName])."]\n/unbind -[".trans('user.telegram.command.unbind').']'; + $telegramService->sendMessage($msg->chat_id, $commands, 'markdown'); } private function fromReply(): void @@ -203,19 +112,98 @@ class TelegramController extends Controller ])->first(); if (! $user) { - abort(500, '用户不存在'); + abort(500, trans('user.telegram.params_missing')); } $admin = User::role('Super Admin')->whereId($user->id)->first(); if ($admin) { $ticket = Ticket::whereId($ticketId)->first(); if (! $ticket) { - abort(500, '工单不存在'); - } - if ($ticket->status) { - abort(500, '工单已关闭,无法回复'); + abort(500, trans('user.telegram.ticket_missing')); } + $ticket->reply()->create(['admin_id' => $admin->id, 'content' => $msg->text]); + if ($ticket->status !== 1) { + $ticket->update(['status' => 1]); + } } - (new TelegramService)->sendMessage($msg->chat_id, "#`$ticketId` 的工单已回复成功", 'markdown'); + (new TelegramService)->sendMessage($msg->chat_id, trans('user.telegram.ticket_reply', ['id' => $ticketId]), 'markdown'); + } + + private function bind(): void + { + $msg = $this->msg; + if (! $msg->is_private) { + return; + } + if (! isset($msg->args[0])) { + abort(500, trans('user.telegram.params_missing')); + } + $user = User::whereUsername($msg->args[0])->first(); + if (! $user) { + abort(500, trans('user.telegram.user_missing')); + } + if ($user->telegram_user_id) { + abort(500, trans('user.telegram.bind_exists')); + } + + if (! $user->userAuths()->create(['type' => 'telegram', 'identifier' => $msg->chat_id])) { + abort(500, trans('common.failed_item', ['attribute' => trans('user.oauth.bind')])); + } + $telegramService = new TelegramService; + $telegramService->sendMessage($msg->chat_id, trans('common.success_item', ['attribute' => trans('user.oauth.bind')])); + } + + private function traffic(): void + { + $msg = $this->msg; + if (! $msg->is_private) { + return; + } + $telegramService = new TelegramService; + if (! $oauth = UserOauth::query()->where(['type' => 'telegram', 'identifier' => $msg->chat_id])->first()) { + $this->help(); + $telegramService->sendMessage($msg->chat_id, trans('user.telegram.bind_missing'), 'markdown'); + + return; + } + $user = $oauth->user; + $transferEnable = formatBytes($user->transfer_enable); + $up = formatBytes($user->u); + $down = formatBytes($user->d); + $remaining = formatBytes($user->transfer_enable - ($user->u + $user->d)); + $text = '🚥'.trans('user.subscribe.info.title')."\n———————————————\n".trans('user.subscribe.info.total').": `$transferEnable`\n".trans('user.subscribe.info.upload').": `$up`\n".trans('user.subscribe.info.download').": `$down`\n".trans('user.account.remain').": `$remaining`"; + $telegramService->sendMessage($msg->chat_id, $text, 'markdown'); + } + + private function getUrl(): void + { + $msg = $this->msg; + $telegramService = new TelegramService; + $telegramService->sendMessage($msg->chat_id, trans('user.telegram.get_url', ['get_url' => sysConfig('website_name')]).': '.sysConfig('website_url'), 'markdown'); + } + + private function unbind(): void + { + $msg = $this->msg; + if (! $msg->is_private) { + return; + } + $user = User::with([ + 'userAuths' => function ($query) use ($msg) { + $query->whereType('telegram')->whereIdentifier($msg->chat_id); + }, + ])->first(); + + $telegramService = new TelegramService; + if (! $user) { + $this->help(); + $telegramService->sendMessage($msg->chat_id, trans('user.telegram.bind_missing'), 'markdown'); + + return; + } + if (! $user->userAuths()->whereType('telegram')->whereIdentifier($msg->chat_id)->delete()) { + abort(500, trans('common.failed_item', ['attribute' => trans('user.oauth.unbind')])); + } + $telegramService->sendMessage($msg->chat_id, trans('common.success_item', ['attribute' => trans('user.oauth.unbind')]), 'markdown'); } } diff --git a/app/Http/Controllers/User/AffiliateController.php b/app/Http/Controllers/User/AffiliateController.php index 3ff4ff4d..f357fb18 100644 --- a/app/Http/Controllers/User/AffiliateController.php +++ b/app/Http/Controllers/User/AffiliateController.php @@ -18,7 +18,7 @@ class AffiliateController extends Controller public function referral() { if (ReferralLog::uid()->doesntExist() && Order::uid()->whereStatus(2)->doesntExist()) { - return Response::view('auth.error', ['message' => trans('user.purchase_required').''.trans('common.back').''], 402); + return Response::view('auth.error', ['message' => trans('user.purchase.required').''.trans('common.back').''], 402); } return view('user.referral', [ @@ -39,12 +39,12 @@ class AffiliateController extends Controller { // 判断账户是否过期 if (Auth::getUser()->expiration_date < date('Y-m-d')) { - return Response::json(['status' => 'fail', 'title' => trans('user.referral.failed'), 'message' => trans('user.referral.msg.account')]); + return Response::json(['status' => 'fail', 'title' => trans('common.failed_item', ['attribute' => trans('common.request')]), 'message' => trans('user.referral.msg.account')]); } // 判断是否已存在申请 if (ReferralApply::uid()->whereIn('status', [0, 1])->first()) { - return Response::json(['status' => 'fail', 'title' => trans('user.referral.failed'), 'message' => trans('user.referral.msg.applied')]); + return Response::json(['status' => 'fail', 'title' => trans('common.failed_item', ['attribute' => trans('common.request')]), 'message' => trans('user.referral.msg.applied')]); } // 校验可以提现金额是否超过系统设置的阀值 @@ -52,7 +52,7 @@ class AffiliateController extends Controller $commission /= 100; if ($commission < sysConfig('referral_money')) { return Response::json([ - 'status' => 'fail', 'title' => trans('user.referral.failed'), 'message' => trans('user.referral.msg.unfulfilled', ['amount' => Helpers::getPriceTag(sysConfig('referral_money'))]), + 'status' => 'fail', 'title' => trans('common.failed_item', ['attribute' => trans('common.request')]), 'message' => trans('user.referral.msg.unfulfilled', ['amount' => Helpers::getPriceTag(sysConfig('referral_money'))]), ]); } @@ -62,9 +62,9 @@ class AffiliateController extends Controller $ref->amount = $commission; $ref->link_logs = ReferralLog::uid()->whereStatus(0)->pluck('id')->toArray(); if ($ref->save()) { - return Response::json(['status' => 'success', 'title' => trans('user.referral.success'), 'message' => trans('user.referral.msg.wait')]); + return Response::json(['status' => 'success', 'title' => trans('common.success_item', ['attribute' => trans('common.request')]), 'message' => trans('user.referral.msg.wait')]); } - return Response::json(['status' => 'fail', 'title' => trans('user.referral.failed'), 'message' => trans('user.referral.msg.error')]); + return Response::json(['status' => 'fail', 'title' => trans('common.failed_item', ['attribute' => trans('common.request')]), 'message' => trans('user.referral.msg.error')]); } } diff --git a/app/Http/Controllers/UserController.php b/app/Http/Controllers/UserController.php index d345f5ea..a13c742d 100644 --- a/app/Http/Controllers/UserController.php +++ b/app/Http/Controllers/UserController.php @@ -76,7 +76,7 @@ class UserController extends Controller 'subscribe_status' => $user->subscribe->status, 'subMsg' => $user->subscribe->ban_desc, 'subType' => $subType, - 'subUrl' => route('sub', $user->subscribe->code), + 'subUrl' => $user->subUrl(), ], $this->dataFlowChart($user->id))); } @@ -163,20 +163,20 @@ class UserController extends Controller } if (! $user->update(['password' => $data['new_password']])) { - return Redirect::back()->withErrors(trans('common.update_action', ['action' => trans('common.failed')])); + return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.update')])); } - return Redirect::back()->with('successMsg', trans('common.update_action', ['action' => trans('common.success')])); + return Redirect::back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.update')])); // 修改代理密码 } if ($request->has('passwd')) { $passwd = $request->input('passwd'); if (! $user->update(['passwd' => $passwd])) { - return Redirect::back()->withErrors(trans('common.update_action', ['action' => trans('common.failed')])); + return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.update')])); } - return Redirect::back()->with('successMsg', trans('common.update_action', ['action' => trans('common.success')])); + return Redirect::back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.update')])); } // 修改联系方式 @@ -187,11 +187,11 @@ class UserController extends Controller } if (! $user->update($data)) { - return Redirect::back()->withErrors(trans('common.update_action', ['action' => trans('common.failed')])); + return Redirect::back()->withErrors(trans('common.failed_item', ['attribute' => trans('common.update')])); } } - return Redirect::back()->with('successMsg', trans('common.update_action', ['action' => trans('common.success')])); + return Redirect::back()->with('successMsg', trans('common.success_item', ['attribute' => trans('common.update')])); } $auth = $user->userAuths()->pluck('type')->toArray(); @@ -235,18 +235,18 @@ class UserController extends Controller $order = Order::userActivePlan()->firstOrFail(); $renewCost = $order->goods->renew; if ($user->credit < $renewCost) { - return Response::json(['status' => 'fail', 'message' => trans('user.reset_data.insufficient')]); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.insufficient_balance')]); } $user->update(['u' => 0, 'd' => 0]); // 记录余额操作日志 - Helpers::addUserCreditLog($user->id, null, $user->credit, $user->credit - $renewCost, -1 * $renewCost, trans('user.reset_data.logs')); + Helpers::addUserCreditLog($user->id, null, $user->credit, $user->credit - $renewCost, -1 * $renewCost, 'The user manually reset the data.'); // 扣余额 $user->updateCredit(-$renewCost); - return Response::json(['status' => 'success', 'message' => trans('user.reset_data.success')]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.reset')])]); } // 工单 @@ -288,7 +288,7 @@ class UserController extends Controller } } - return Response::json(['status' => 'fail', 'message' => trans('common.close_item', ['attribute' => trans('common.failed')])]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.close')])]); } // 订单明细 @@ -313,11 +313,9 @@ class UserController extends Controller if ($ticket = $user->tickets()->create(compact('title', 'content'))) { // 通知相关管理员 Notification::send(User::find(1), new TicketCreated($ticket, route('admin.ticket.edit', $ticket))); - - return Response::json(['status' => 'success', 'message' => trans('common.submit_item', ['attribute' => trans('common.success')])]); } - return Response::json(['status' => 'fail', 'message' => trans('common.submit_item', ['attribute' => trans('common.failed')])]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.submit')])]); } // 回复工单 @@ -336,14 +334,12 @@ class UserController extends Controller ]); } - if ($ticket->status === 2) { - return Response::json(['status' => 'fail', 'message' => trans('user.ticket.failed_closed')]); - } $reply = $ticket->reply()->create(['user_id' => auth()->id(), 'content' => $content]); if ($reply) { // 重新打开工单 - $ticket->status = 0; - $ticket->save(); + if ($ticket->status === 2) { + $ticket->update(['status' => 0]); + } // 通知相关管理员 Notification::send(User::find(1), new TicketReplied($reply, route('admin.ticket.edit', $ticket))); @@ -366,17 +362,17 @@ class UserController extends Controller $id = $request->input('id'); if (Ticket::uid()->whereId($id)->firstOrFail()->close()) { - return Response::json(['status' => 'success', 'message' => trans('common.close_item', ['attribute' => trans('common.success')])]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.close')])]); } - return Response::json(['status' => 'fail', 'message' => trans('common.close_item', ['attribute' => trans('common.failed')])]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.close')])]); } // 邀请码 public function invite() { if (Order::uid()->active()->where('origin_amount', '>', 0)->doesntExist()) { - return Response::view('auth.error', ['message' => trans('user.purchase_required').' '.trans('common.back').''], 402); + return Response::view('auth.error', ['message' => trans('user.purchase.required').' '.trans('common.back').''], 402); } return view('user.invite', [ @@ -401,10 +397,10 @@ class UserController extends Controller if ($invite) { $user->decrement('invite_num'); - return Response::json(['status' => 'success', 'message' => trans('common.generate_item', ['attribute' => trans('common.success')])]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.generate')])]); } - return Response::json(['status' => 'fail', 'message' => trans('common.generate_item', ['attribute' => trans('common.failed')])]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.generate')])]); } // 使用优惠券 @@ -506,10 +502,10 @@ class UserController extends Controller // 管理员信息重新写入user $user = auth()->loginUsingId(Session::pull('admin')); if ($user) { - return Response::json(['status' => 'success', 'message' => trans('common.toggle_action', ['action' => trans('common.success')])]); + return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.toggle')])]); } - return Response::json(['status' => 'fail', 'message' => trans('common.toggle_action', ['action' => trans('common.failed')])]); + return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.toggle')])]); } public function charge(Request $request): ?JsonResponse diff --git a/app/Models/Marketing.php b/app/Models/Marketing.php index 47f5db0d..42369ccb 100644 --- a/app/Models/Marketing.php +++ b/app/Models/Marketing.php @@ -18,10 +18,10 @@ class Marketing extends Model { return Attribute::make( get: fn () => match ($this->status) { - -1 => '失败', - 0 => '待推送', - 1 => '成功', - default => '', + -1 => trans('common.failed'), + 0 => trans('common.status.pending_dispatch'), + 1 => trans('common.success'), + default => trans('common.status.unknown'), }, ); } diff --git a/app/Models/Order.php b/app/Models/Order.php index 30f7abf7..c57d3c38 100644 --- a/app/Models/Order.php +++ b/app/Models/Order.php @@ -207,6 +207,6 @@ class Order extends Model // 支付方式 public function getPayWayLabelAttribute(): string { - return config('common.payment.labels')[$this->pay_way] ?? '未知'; + return config('common.payment.labels')[$this->pay_way] ?? trans('common.status.unknown'); } } diff --git a/app/Models/ReferralLog.php b/app/Models/ReferralLog.php index 18239255..ac5de9a6 100644 --- a/app/Models/ReferralLog.php +++ b/app/Models/ReferralLog.php @@ -61,7 +61,7 @@ class ReferralLog extends Model get: fn () => match ($this->status) { 1 => ''.trans('common.status.applying').'', 2 => ''.trans('common.status.withdrawn').'', - default => ''.trans('common.status.unwithdrawn').'', + default => ''.trans('common.status.withdrawal_pending').'', }, ); } diff --git a/app/Notifications/Custom.php b/app/Notifications/Custom.php index e3ff296f..c02650ef 100644 --- a/app/Notifications/Custom.php +++ b/app/Notifications/Custom.php @@ -68,7 +68,7 @@ class Custom extends Notification implements ShouldQueue return [ 'title' => $this->title, 'content' => $this->content, - 'group' => '自定义信息', + 'group' => trans('common.bark.custom'), 'icon' => asset('assets/images/notification/custom.png'), 'sound' => 'newmail', 'url_type' => 'markdown', diff --git a/app/Notifications/NodeOffline.php b/app/Notifications/NodeOffline.php index 40a3ddb6..061efe7e 100644 --- a/app/Notifications/NodeOffline.php +++ b/app/Notifications/NodeOffline.php @@ -35,7 +35,7 @@ class NodeOffline extends Notification implements ShouldQueue { $content = ''; foreach ($this->data as $node) { - $content .= "- {$node['name']} {$node['host']}\r\n"; + $content .= "- {$node['name']} {$node['host']}".PHP_EOL; } return $content; @@ -55,7 +55,7 @@ class NodeOffline extends Notification implements ShouldQueue return [ 'title' => trans('notification.node_offline'), 'content' => $this->stringMessage(), - 'group' => '节点状态', + 'group' => trans('common.bark.node_status'), 'icon' => asset('assets/images/notification/offline.png'), ]; } diff --git a/app/Notifications/PaymentConfirm.php b/app/Notifications/PaymentConfirm.php index b6ffa553..1b9abf53 100644 --- a/app/Notifications/PaymentConfirm.php +++ b/app/Notifications/PaymentConfirm.php @@ -32,7 +32,8 @@ class PaymentConfirm extends Notification { $order = $this->order; $goods = $this->order->goods; - $message = sprintf("🛒 人工支付\n———————————————\n\t\tℹ️ 账号:%s\n\t\t💰 金额:%1.2f\n\t\t📦 商品:%s\n\t\t", $order->user->username, $order->amount, $goods->name ?? '余额充值'); + $message = sprintf('🛒 '.trans('common.payment.manual')."\n———————————————\n\t\tℹ️ ".trans('common.account').": %s\n\t\t💰 ".trans('user.shop.price').":%1.2f\n\t\t📦 ".trans('model.goods.attribute').": %s\n\t\t", $order->user->username, + $order->amount, $goods->name ?? trans('user.recharge_credit')); foreach (User::role('Super Admin')->get() as $admin) { if (! $admin->telegram_user_id) { continue; @@ -55,22 +56,22 @@ class PaymentConfirm extends Notification $goods = $this->order->goods; return [ - 'title' => '🛒 人工支付', + 'title' => '🛒 '.trans('common.payment.manual'), 'body' => [ [ - 'keyname' => 'ℹ️ 账号', + 'keyname' => 'ℹ️ '.trans('common.account'), 'value' => $order->user->username, ], [ - 'keyname' => '💰 金额', + 'keyname' => '💰 '.trans('user.shop.price'), 'value' => sprintf('%1.2f', $order->amount), ], [ - 'keyname' => '📦 商品', - 'value' => $goods->name ?? '余额充值', + 'keyname' => '📦 '.trans('model.goods.attribute'), + 'value' => $goods->name ?? trans('user.recharge_credit'), ], ], - 'markdown' => '- ℹ️ 账号: '.$order->user->username.PHP_EOL.'- 💰 金额: '.sprintf('%1.2f', $order->amount).PHP_EOL.'- 📦 商品: '.($goods->name ?? '余额充值'), + 'markdown' => '- ℹ️ '.trans('common.account').': '.$order->user->username.PHP_EOL.'- 💰 '.trans('user.shop.price').': '.sprintf('%1.2f', $order->amount).PHP_EOL.'- 📦 '.trans('user.shop.price').': '.($goods->name ?? trans('user.recharge_credit')), 'button' => [ route('payment.notify', ['method' => 'manual', 'sign' => $this->sign, 'status' => 0]), route('payment.notify', ['method' => 'manual', 'sign' => $this->sign, 'status' => 1]), diff --git a/app/Notifications/TicketClosed.php b/app/Notifications/TicketClosed.php index 03cacf67..d7f682a6 100644 --- a/app/Notifications/TicketClosed.php +++ b/app/Notifications/TicketClosed.php @@ -50,7 +50,7 @@ class TicketClosed extends Notification implements ShouldQueue return [ 'title' => trans('notification.close_ticket', ['id' => $this->ticketId, 'title' => $this->title]), 'content' => $this->reason, - 'group' => '工单', + 'group' => trans('user.ticket.attribute'), 'icon' => asset('assets/images/notification/ticket.png'), 'url' => $this->url, ]; diff --git a/app/Notifications/TicketCreated.php b/app/Notifications/TicketCreated.php index 73f7760c..a6a71667 100644 --- a/app/Notifications/TicketCreated.php +++ b/app/Notifications/TicketCreated.php @@ -58,7 +58,7 @@ class TicketCreated extends Notification implements ShouldQueue private function markdownMessage($ticket): string { - return "📮工单提醒 #$ticket->id\n———————————————\n主题:\n`$ticket->title`\n内容:\n`$ticket->content`"; + return '📮'.trans('admin.system.ticket_created_notification')." #$ticket->id\n———————————————\n".trans('validation.attributes.title').": \n`$ticket->title`\n".trans('validation.attributes.content').": \n`$ticket->content`"; } public function toBark($notifiable): array @@ -66,7 +66,7 @@ class TicketCreated extends Notification implements ShouldQueue return [ 'title' => trans('notification.new_ticket', ['title' => $this->ticket->title]), 'content' => trans('notification.ticket_content').strip_tags($this->ticket->content), - 'group' => '工单', + 'group' => trans('user.ticket.attribute'), 'icon' => asset('assets/images/notification/ticket.png'), 'url' => $this->url, ]; diff --git a/app/Notifications/TicketReplied.php b/app/Notifications/TicketReplied.php index 98fafd91..145148f9 100644 --- a/app/Notifications/TicketReplied.php +++ b/app/Notifications/TicketReplied.php @@ -58,7 +58,7 @@ class TicketReplied extends Notification implements ShouldQueue private function markdownMessage(TicketReply $reply): string { - return "📮工单回复提醒 #{$reply->ticket->id}\n———————————————\n主题:\n`{$reply->ticket->title}`\n内容:\n`$reply->content`"; + return '📮'.trans('admin.system.ticket_replied_notification')." #{$reply->ticket->id}\n———————————————\n".trans('validation.attributes.title').": \n`{$reply->ticket->title}`\n".trans('validation.attributes.content').": \n`$reply->content`"; } public function toBark($notifiable): array @@ -66,7 +66,7 @@ class TicketReplied extends Notification implements ShouldQueue return [ 'title' => trans('notification.reply_ticket', ['title' => $this->reply->ticket->title]), 'content' => trans('notification.ticket_content').strip_tags($this->reply->content), - 'group' => '工单', + 'group' => trans('user.ticket.attribute'), 'icon' => asset('assets/images/notification/ticket.png'), 'url' => $this->url, ]; diff --git a/app/Observers/OrderObserver.php b/app/Observers/OrderObserver.php index c41906d1..289c9604 100644 --- a/app/Observers/OrderObserver.php +++ b/app/Observers/OrderObserver.php @@ -27,7 +27,7 @@ class OrderObserver 'level' => 0, 'enable' => 0, ]); - Helpers::addUserTrafficModifyLog($user->id, $user->transfer_enable, 0, __('[Service Timer] Service Expiration'), $order->id); + Helpers::addUserTrafficModifyLog($user->id, $user->transfer_enable, 0, trans('[Service Timer] Service Expiration'), $order->id); Order::userActivePackage($order->user_id)->update(['is_expire' => 1]); // 过期生效中的加油包 $this->activatePrepaidPlan($order->user_id); // 激活预支付套餐 @@ -73,7 +73,7 @@ class OrderObserver private function returnCoupon(Order $order, Coupon $coupon): void { // 退回优惠券 if ($coupon->type !== 3 && ! $coupon->isExpired()) { - Helpers::addCouponLog('订单取消, 自动退回', $order->coupon_id, $order->goods_id, $order->id); + Helpers::addCouponLog('Order canceled, coupon reinstated.', $order->coupon_id, $order->goods_id, $order->id); $coupon->update(['usable_times' => $coupon->usable_times + 1, 'status' => 0]); } } diff --git a/app/Services/ArticleService.php b/app/Services/ArticleService.php index 5a2083e2..c829b596 100644 --- a/app/Services/ArticleService.php +++ b/app/Services/ArticleService.php @@ -12,8 +12,7 @@ class ArticleService { $siteName = sysConfig('website_name'); $siteUrl = sysConfig('website_url'); - $subscribe = auth()->user()->subscribe; - $subUrl = route('sub', $subscribe->code); + $subUrl = auth()->user()?->subUrl(); self::$valuables = [ '{{siteName}}' => $siteName, diff --git a/app/Services/CouponService.php b/app/Services/CouponService.php index 023d39e1..2bb89f0f 100644 --- a/app/Services/CouponService.php +++ b/app/Services/CouponService.php @@ -123,15 +123,15 @@ class CouponService $coupon = Coupon::whereSn($this->code)->whereType(3)->first(); if ($coupon && $coupon->status === 0) { try { - Helpers::addUserCreditLog($user->id, null, $user->credit, $user->credit + $coupon->value, $coupon->value, - trans('user.recharge').' - ['.trans('admin.coupon.type.charge').':'.$coupon->sn.']'); // 写入用户余额变动日志 $user->updateCredit($coupon->value); // 余额充值 + Helpers::addUserCreditLog($user->id, null, $user->credit, $user->credit + $coupon->value, $coupon->value, 'Recharge using a recharge voucher.'); // 写入用户余额变动日志 + $coupon->used(); // 更改卡券状态 - Helpers::addCouponLog(trans('user.recharge_credit'), $coupon->id); // 写入卡券使用日志 + Helpers::addCouponLog('Used for credit recharge.', $coupon->id); // 写入卡券使用日志 return true; } catch (Exception $exception) { - Log::emergency('[重置券处理出现错误] '.$exception->getMessage()); + Log::emergency(trans('common.error_action_item', ['action' => trans('common.apply'), 'attribute' => trans('model.coupon.attribute')]).': '.$exception->getMessage()); } } diff --git a/app/Services/OrderService.php b/app/Services/OrderService.php index ec0e9072..bdbd0f03 100644 --- a/app/Services/OrderService.php +++ b/app/Services/OrderService.php @@ -62,7 +62,7 @@ class OrderService $ret = self::$user->updateCredit($this->order->origin_amount); // 余额变动记录日志 if ($ret) { - Helpers::addUserCreditLog($this->order->user_id, $this->order->id, $credit, self::$user->credit, $this->order->amount, '用户通过'.$this->order->pay_way.'充值余额'); + Helpers::addUserCreditLog($this->order->user_id, $this->order->id, $credit, self::$user->credit, $this->order->amount, 'The user topped up the balance.'); } return $ret; @@ -71,7 +71,7 @@ class OrderService private function activatePackage(): bool { // 激活流量包 if (self::$user->incrementData(self::$goods->traffic * MiB)) { - return Helpers::addUserTrafficModifyLog($this->order->user_id, self::$user->transfer_enable - self::$goods->traffic * MiB, self::$user->transfer_enable, '['.$this->order->pay_way.']加上用户购买的套餐流量', $this->order->id); + return Helpers::addUserTrafficModifyLog($this->order->user_id, self::$user->transfer_enable - self::$goods->traffic * MiB, self::$user->transfer_enable, trans('[:payment] plus the user’s purchased data plan.', ['payment' => $this->order->pay_way])); } return false; @@ -94,7 +94,7 @@ class OrderService } if (self::$user->update(array_merge($this->resetTimeAndData(), $updateData))) { - return Helpers::addUserTrafficModifyLog($this->order->user_id, $oldData, self::$user->transfer_enable, '【'.$this->order->pay_way.'】加上用户购买的套餐流量', $this->order->id); + return Helpers::addUserTrafficModifyLog($this->order->user_id, $oldData, self::$user->transfer_enable, trans('[:payment] plus the user’s purchased data plan.', ['payment' => $this->order->pay_way]), $this->order->id); } return false; diff --git a/app/Utils/Clients/Surge.php b/app/Utils/Clients/Surge.php index add90ac4..241e976f 100644 --- a/app/Utils/Clients/Surge.php +++ b/app/Utils/Clients/Surge.php @@ -57,7 +57,7 @@ class Surge implements Client $subscribeInfo = "title=$webName, content="; } - return str_replace(['$subscribe_info', '$subs_link', '$subs_domain', '$proxies', '$proxy_group'], [$subscribeInfo, route('sub', $user->subscribe->code), $_SERVER['HTTP_HOST'], $proxyProfiles['proxies'], $proxyProfiles['names']], + return str_replace(['$subscribe_info', '$subs_link', '$subs_domain', '$proxies', '$proxy_group'], [$subscribeInfo, $user->subUrl(), $_SERVER['HTTP_HOST'], $proxyProfiles['proxies'], $proxyProfiles['names']], $config); } } diff --git a/app/Utils/Payments/CodePay.php b/app/Utils/Payments/CodePay.php index 0ada9418..925c25ff 100644 --- a/app/Utils/Payments/CodePay.php +++ b/app/Utils/Payments/CodePay.php @@ -32,7 +32,7 @@ class CodePay extends PaymentService implements Gateway $url = sysConfig('codepay_url').http_build_query($data); $payment->update(['url' => $url]); - return Response::json(['status' => 'success', 'url' => $url, 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'url' => $url, 'message' => trans('user.payment.order_creation.success')]); } public function notify(Request $request): void diff --git a/app/Utils/Payments/EPay.php b/app/Utils/Payments/EPay.php index ba76a826..b370c23c 100644 --- a/app/Utils/Payments/EPay.php +++ b/app/Utils/Payments/EPay.php @@ -33,7 +33,7 @@ class EPay extends PaymentService implements Gateway $url = sysConfig('epay_url').'submit.php?'.http_build_query($data); $payment->update(['url' => $url]); - return Response::json(['status' => 'success', 'url' => $url, 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'url' => $url, 'message' => trans('user.payment.order_creation.success')]); } public function notify(Request $request): void diff --git a/app/Utils/Payments/F2Fpay.php b/app/Utils/Payments/F2Fpay.php index 923211a1..f02ad7a8 100644 --- a/app/Utils/Payments/F2Fpay.php +++ b/app/Utils/Payments/F2Fpay.php @@ -46,7 +46,7 @@ class F2Fpay extends PaymentService implements Gateway exit; } - return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => trans('user.payment.order_creation.success')]); } public function notify(Request $request): void diff --git a/app/Utils/Payments/Local.php b/app/Utils/Payments/Local.php index 16512af6..9e30f306 100644 --- a/app/Utils/Payments/Local.php +++ b/app/Utils/Payments/Local.php @@ -22,12 +22,12 @@ class Local extends PaymentService implements Gateway if ($user && $goods) { $user->update(['credit' => $user->credit - $order->amount]); // 记录余额操作日志 - Helpers::addUserCreditLog($user->id, $order->id, $user->credit + $order->amount, $user->credit, -1 * $order->amount, '购买商品'.$goods->name); + Helpers::addUserCreditLog($user->id, $order->id, $user->credit + $order->amount, $user->credit, -1 * $order->amount, 'Purchased an item.'); } $order->complete(); - return Response::json(['status' => 'success', 'message' => '购买完成!']); + return Response::json(['status' => 'success', 'message' => trans('user.purchase.completed')]); } public function notify(Request $request): void diff --git a/app/Utils/Payments/Manual.php b/app/Utils/Payments/Manual.php index d3fa4666..3d8e2bc8 100644 --- a/app/Utils/Payments/Manual.php +++ b/app/Utils/Payments/Manual.php @@ -21,7 +21,7 @@ class Manual extends PaymentService implements Gateway $url = route('manual.checkout', ['payment' => $payment->trade_no]); $payment->update(['url' => $url]); - return Response::json(['status' => 'success', 'url' => $url, 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'url' => $url, 'message' => trans('user.payment.order_creation.success')]); } public function redirectPage(string $trade_no): View @@ -43,7 +43,7 @@ class Manual extends PaymentService implements Gateway $payment = Payment::uid()->with(['order'])->whereTradeNo($trade_no)->firstOrFail(); $payment->order->update(['status' => 1]); - return Response::json(['status' => 'success', 'message' => '我们将在【24小时】内对购买/充值的款项进行开通!请耐心等待']); + return Response::json(['status' => 'success', 'message' => trans('user.payment.order_creation.info')]); } public function notify(Request $request) diff --git a/app/Utils/Payments/PayBeaver.php b/app/Utils/Payments/PayBeaver.php index 1b136bf1..a282a81e 100644 --- a/app/Utils/Payments/PayBeaver.php +++ b/app/Utils/Payments/PayBeaver.php @@ -45,21 +45,21 @@ class PayBeaver extends PaymentService implements Gateway if (! isset($result['message']) && isset($result['data']['pay_url'])) { $payment->update(['url' => $result['data']['pay_url']]); - return Response::json(['status' => 'success', 'url' => $result['data']['pay_url'], 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'url' => $result['data']['pay_url'], 'message' => trans('user.payment.order_creation.success')]); } $payment->failed(); if (isset($result['message'])) { Log::alert('【海狸支付】创建订单错误:'.$result['message']); - return Response::json(['status' => 'fail', 'message' => '创建订单失败:'.$result['message']]); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.failed')]); } if (! isset($result['data']['pay_url'])) { Log::alert('【海狸支付】创建订单错误:未获取到支付链接'.var_export($result, true)); } - return Response::json(['status' => 'fail', 'message' => '创建订单失败:未知错误']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.failed')]); } private function createOrder(array $params): array diff --git a/app/Utils/Payments/PayJs.php b/app/Utils/Payments/PayJs.php index 9281244e..14849864 100644 --- a/app/Utils/Payments/PayJs.php +++ b/app/Utils/Payments/PayJs.php @@ -38,7 +38,7 @@ class PayJs extends PaymentService implements Gateway $payment->update(['qr_code' => 1, 'url' => $result]); //$this->addPamentCallback($payment->trade_no, null, $payment->amount * 100); - return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => trans('user.payment.order_creation.success')]); } public function notify(Request $request): void diff --git a/app/Utils/Payments/PayPal.php b/app/Utils/Payments/PayPal.php index a81b7470..9c141670 100644 --- a/app/Utils/Payments/PayPal.php +++ b/app/Utils/Payments/PayPal.php @@ -62,13 +62,13 @@ class PayPal extends PaymentService implements Gateway if (isset($response['id']) && $response['id'] != null) { Log::error('【Paypal】处理错误:'.var_export($response, true)); - return Response::json(['status' => 'fail', 'message' => '创建订单失败,请使用其他方式或通知管理员!']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.failed')]); } $payment->update(['url' => $response['paypal_link']]); foreach ($response['links'] as $links) { if ($links['rel'] === 'approve') { - return Response::json(['status' => 'success', 'url' => $links['href'], 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'url' => $links['href'], 'message' => trans('user.payment.order_creation.success')]); } } diff --git a/app/Utils/Payments/Stripe.php b/app/Utils/Payments/Stripe.php index 346436e2..1d034287 100644 --- a/app/Utils/Payments/Stripe.php +++ b/app/Utils/Payments/Stripe.php @@ -49,22 +49,22 @@ class Stripe extends PaymentService implements Gateway Log::warning('创建订单错误:未知错误'); $payment->failed(); - return Response::json(['status' => 'fail', 'message' => '创建订单失败:未知错误']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.failed')]); } $payment->update(['qr_code' => 1, 'url' => $source['wechat']['qr_code_url']]); - return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => trans('user.payment.order_creation.success')]); } if (! $source['redirect']['url']) { Log::warning('创建订单错误:未知错误'); $payment->failed(); - return response()->json(['code' => 0, 'msg' => '创建订单失败:未知错误']); + return response()->json(['code' => 0, 'msg' => trans('user.payment.order_creation.failed')]); } $payment->update(['url' => $source['redirect']['url']]); - return Response::json(['status' => 'success', 'url' => $source['redirect']['url'], 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'url' => $source['redirect']['url'], 'message' => trans('user.payment.order_creation.success')]); } $data = $this->getCheckoutSessionData($payment->trade_no, $payment->amount, $type); @@ -75,7 +75,7 @@ class Stripe extends PaymentService implements Gateway $url = route('stripe.checkout', ['session_id' => $session->id]); $payment->update(['url' => $url]); - return Response::json(['status' => 'success', 'url' => $url, 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'url' => $url, 'message' => trans('user.payment.order_creation.success')]); } catch (Exception $e) { Log::error('【Stripe】错误: '.$e->getMessage()); exit; diff --git a/app/Utils/Payments/THeadPay.php b/app/Utils/Payments/THeadPay.php index 359e30ea..b6d5b69f 100644 --- a/app/Utils/Payments/THeadPay.php +++ b/app/Utils/Payments/THeadPay.php @@ -31,7 +31,7 @@ class THeadPay extends PaymentService implements Gateway if ($result['status'] === 'success') { $payment->update(['qr_code' => 1, 'url' => $result['code_url']]); - return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => '创建订单成功!']); + return Response::json(['status' => 'success', 'data' => $payment->trade_no, 'message' => trans('user.payment.order_creation.success')]); } $payment->failed(); Log::error('【平头哥支付】 返回错误信息:'.$result['message']); @@ -39,7 +39,7 @@ class THeadPay extends PaymentService implements Gateway Log::alert('【平头哥支付】 支付渠道建立订单出现问题!'); - return Response::json(['status' => 'fail', 'message' => '创建在线订单失败,请工单通知管理员!']); + return Response::json(['status' => 'fail', 'message' => trans('user.payment.order_creation.failed')]); } private function sign(array $params): string diff --git a/resources/lang/de.json b/resources/lang/de.json index ccf7f713..80f3ec46 100644 --- a/resources/lang/de.json +++ b/resources/lang/de.json @@ -126,5 +126,16 @@ "You are receiving this email because we received a password reset request for your account.": "Sie erhalten diese E-Mail, weil wir einen Antrag auf eine Zurücksetzung Ihres Passworts bekommen haben.", "You have not responded this ticket in :num hours, System has closed your ticket.": "Sie haben auf dieses Ticket innerhalb von :num Stunden nicht geantwortet, das System hat Ihr Ticket geschlossen.", "You must have a valid subscription to view the content in this area!": "Sie müssen ein gültiges Abonnement haben, um den Inhalt in diesem Bereich zu sehen!", - "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Ihr Abonnement wurde vom Administrator deaktiviert, bitte kontaktieren Sie den Administrator, um es wiederherzustellen." + "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Ihr Abonnement wurde vom Administrator deaktiviert, bitte kontaktieren Sie den Administrator, um es wiederherzustellen.", + "Manually add in dashboard.": "Manuell im Dashboard hinzufügen", + "Manually edit in dashboard.": "Manuell im Dashboard bearbeiten", + "Batch generate user accounts in dashboard.": "Benutzerkonten im Hintergrund massenweise erstellen", + "Coupon used in order.": "Gutschein im Auftrag verwendet", + "Order canceled, coupon reinstated.": "Bestellung storniert, Gutschein wiederhergestellt", + "Used for credit recharge.": "Zur Aufladung des Guthabens verwendet", + "The user manually reset the data.": "Benutzer hat Daten zurückgesetzt", + "Recharge using a recharge voucher.": "Mit einem Aufladegutschein aufladen", + "The user topped up the balance.": "Der Benutzer hat das Guthaben aufgeladen", + "Purchased an item.": "Einen Artikel gekauft", + "[:payment] plus the user’s purchased data plan.": "[:payment] plus das vom Benutzer gekaufte Datenpaket" } \ No newline at end of file diff --git a/resources/lang/de/admin.php b/resources/lang/de/admin.php index 169eb707..2203b279 100644 --- a/resources/lang/de/admin.php +++ b/resources/lang/de/admin.php @@ -3,512 +3,468 @@ declare(strict_types=1); return [ + 'action' => [ + 'add_item' => 'Hinzufügen :attribute', + 'edit_item' => 'Bearbeiten :attribute', + ], + 'aff' => [ + 'apply_counts' => 'Insgesamt :num Auszahlungsanfragen', + 'commission_counts' => 'Diese Anwendung beinhaltet insgesamt :num Bestellungen', + 'commission_title' => 'Anfragedetails', + 'counts' => 'Insgesamt :num Aufzeichnungen', + 'rebate_title' => 'Rabattverlauf', + 'referral' => 'Empfehlungsrabatte', + 'title' => 'Auszahlungsanfragen', + ], + 'article' => [ + 'category_hint' => 'Gleiche Kategorie wird zusammengefasst', + 'counts' => 'Insgesamt :num Artikel', + 'logo_placeholder' => 'Oder Logo-URL eingeben', + 'title' => 'Artikel', + 'type' => [ + 'announcement' => 'Ankündigung', + 'knowledge' => 'Artikel', + ], + ], + 'clear' => 'Löschen', + 'clone' => 'Klonen', + 'confirm' => [ + 'continues' => 'Möchten Sie diese Aktion fortsetzen?', + 'delete' => [0 => 'Möchten Sie :attribute löschen', 1 => ']?'], + 'export' => 'Möchten Sie alles exportieren?', + ], + 'coupon' => [ + 'counts' => 'Insgesamt :num Gutscheine', + 'created_days_hint' => ':day Tage nach der Registrierung', + 'discount' => 'Rabatt', + 'export_title' => 'Exportieren', + 'groups_hint' => 'Nur für ausgewählte Benutzergruppen verwendbar', + 'info_title' => 'Informationen', + 'levels_hint' => 'Nur für ausgewählte Benutzerebenen verwendbar', + 'limit_hint' => 'Regeln haben eine UND-Beziehung, bitte richtig verwenden', + 'minimum_hint' => 'Nur verwendbar, wenn die Zahlung :num übersteigt', + 'name_hint' => 'Zur Anzeige', + 'newbie' => [ + 'created_days' => 'Kontodauer', + 'first_discount' => 'Erster Rabatt', + 'first_order' => 'Erste Bestellung', + ], + 'priority_hint' => 'Der höchste berechtigte Gutschein wird zuerst verwendet. Maximal 255', + 'services_blacklist_hint' => 'Nicht für Blacklist-Produkte verwendbar, leer lassen, wenn nicht verwendet', + 'services_placeholder' => 'Produkt-ID eingeben, Enter drücken', + 'services_whitelist_hint' => 'Nur für Whitelist-Produkte verwendbar, leer lassen, wenn nicht verwendet', + 'single_use' => 'Einmalige Verwendung', + 'sn_hint' => 'Leer lassen für 8-stelligen Zufallscode', + 'title' => 'Gutscheine', + 'type' => [ + 'charge' => 'Aufladen', + 'discount' => 'Rabatt', + 'voucher' => 'Gutschein', + ], + 'type_hint' => 'Reduktion: Betrag abziehen; Rabatt: Prozentsatz abziehen; Aufladen: Betrag zum Guthaben hinzufügen', + 'used_hint' => 'Jeder Benutzer kann diesen Gutschein maximal :num Mal verwenden', + 'user_whitelist_hint' => 'Whitelist-Benutzer können verwenden, leer lassen, wenn nicht verwendet', + 'users_blacklist_hint' => 'Blacklist-Benutzer können nicht verwenden, leer lassen, wenn nicht verwendet', + 'users_placeholder' => 'Benutzer-ID eingeben, Enter drücken', + 'value' => '{1} ➖ :num|{2} :num% Rabatt|{3} ➕ :num', + 'value_hint' => 'Bereich liegt zwischen 1% und 99%', + ], + 'creating' => 'Hinzufügen...', 'dashboard' => [ - 'users' => 'Gesamtanzahl der Benutzer', - 'available_users' => 'Aktive Benutzer', - 'paid_users' => 'Zahlende Benutzer', - 'active_days_users' => 'Aktive Benutzer in den letzten :days Tagen', - 'inactive_days_users' => 'Inaktive Benutzer seit über :days Tagen', - 'online_users' => 'Aktuell online', - 'expiring_users' => 'Bald ablaufende Benutzer', - 'overuse_users' => 'Benutzer mit Datenübernutzung [≥90%]', 'abnormal_users' => 'Abnormaler Datenverkehr in der letzten Stunde', - 'nodes' => 'Knoten', - 'maintaining_nodes' => 'Knoten im Wartungsmodus', + 'active_days_users' => 'Aktive Benutzer in den letzten :days Tagen', + 'available_users' => 'Aktive Benutzer', + 'credit' => 'Gesamtkredit', 'current_month_traffic_consumed' => 'In diesem Monat verbrauchter Datenverkehr', 'days_traffic_consumed' => 'In den letzten :days Tagen verbrauchter Datenverkehr', - 'orders' => 'Gesamtanzahl der Bestellungen', + 'expiring_users' => 'Bald ablaufende Benutzer', + 'inactive_days_users' => 'Inaktive Benutzer seit über :days Tagen', + 'maintaining_nodes' => 'Knoten im Wartungsmodus', + 'nodes' => 'Knoten', 'online_orders' => 'Online-Zahlungsbestellungen', + 'online_users' => 'Aktuell online', + 'orders' => 'Gesamtanzahl der Bestellungen', + 'overuse_users' => 'Benutzer mit Datenübernutzung [≥90%]', + 'paid_users' => 'Zahlende Benutzer', 'succeed_orders' => 'Bezahlte Bestellungen', - 'credit' => 'Gesamtkredit', + 'users' => 'Gesamtanzahl der Benutzer', 'withdrawing_commissions' => 'Ausstehende Provisionen', 'withdrawn_commissions' => 'Ausgezahlte Provisionen', ], - 'action' => [ - 'edit_item' => 'Bearbeiten :attribute', - 'add_item' => 'Hinzufügen :attribute', + 'end_time' => 'Ende', + 'goods' => [ + 'counts' => 'Insgesamt :num Artikel', + 'info' => [ + 'available_date_hint' => 'Daten werden automatisch vom Gesamtvolumen abgezogen, wenn fällig', + 'desc_placeholder' => 'Kurzbeschreibung', + 'limit_num_hint' => 'Maximale Anzahl von Käufen pro Benutzer, 0 für unbegrenzt', + 'list_hint' => 'Beginnen Sie jede Zeile mit
  • und enden Sie mit
  • ', + 'list_placeholder' => 'Benutzerdefinierte Inhalte hinzufügen', + 'period_hint' => 'Datenvolumen wird alle N Tage für Pläne zurückgesetzt', + 'type_hint' => 'Plan beeinflusst die Kontoablaufzeit, Paket zieht nur Daten ab, beeinflusst nicht die Ablaufzeit', + ], + 'sell_and_used' => 'Verwendet / Verkauft', + 'status' => [ + 'no' => 'Nicht zum Verkauf', + 'yes' => 'Zum Verkauf', + ], + 'title' => 'Produkte', + 'type' => [ + 'package' => 'Datenpaket', + 'plan' => 'Abonnementplan', + 'top_up' => 'Aufladen', + ], ], - 'confirm' => [ - 'delete' => [0 => 'Möchten Sie :attribute löschen', 1 => ']?'], - 'continues' => 'Möchten Sie diese Aktion fortsetzen?', - 'export' => 'Möchten Sie alles exportieren?', + 'hint' => 'Hinweis', + 'logs' => [ + 'ban' => [ + 'ban_time' => 'Gesperrt am', + 'last_connect_at' => 'Letzte Anmeldung', + 'reason' => 'Grund', + 'time' => 'Dauer', + 'title' => 'Benutzersperren', + ], + 'callback' => 'Callback-Protokolle (Zahlung)', + 'counts' => 'Insgesamt :num Aufzeichnungen', + 'credit_title' => 'Guthabenänderungsprotokolle', + 'ip_monitor' => 'Online-IPs Echtzeit 2 Minuten', + 'notification' => 'E-Mail-Protokolle', + 'order' => [ + 'is_coupon' => 'Gutschein verwendet', + 'is_expired' => 'Abgelaufen', + 'title' => 'Bestellungen', + 'update_conflict' => 'Aktualisierung fehlgeschlagen: Bestellkonflikt', + ], + 'rule' => [ + 'clear_all' => 'Alle Aufzeichnungen löschen', + 'clear_confirm' => 'Möchten Sie alle Auslöser-Aufzeichnungen löschen?', + 'created_at' => 'Auslösezeit', + 'name' => 'Name der ausgelösten Regel', + 'reason' => 'Auslösegrund', + 'tag' => '✅ Zugriff auf nicht autorisierte Inhalte', + 'title' => 'Regelauslöser-Aufzeichnungen', + ], + 'subscribe' => 'Abonnements', + 'user_data_modify_title' => 'Datenänderungsaufzeichnungen', + 'user_ip' => [ + 'connect' => 'Verbunden IP', + 'title' => 'Online-IPs Letzte 10 Minuten', + ], + 'user_traffic' => [ + 'choose_node' => 'Knoten auswählen', + 'title' => 'Datenverbrauchsaufzeichnungen', + ], ], - 'user_dashboard' => 'Benutzer-Dashboard', + 'marketing' => [ + 'counts' => 'Insgesamt :num E-Mails', + 'email' => [ + 'ever_paid' => 'Je Bezahlt', + 'expired_date' => 'Abgelaufene Datum', + 'filters' => 'Filter', + 'loading_statistics' => 'Lade Statistiken...', + 'never_paid' => 'Nie Bezahlt', + 'paid_servicing' => 'Bezahlte Dienste', + 'previously_paid' => 'Früher Bezahlt', + 'recent_traffic_abnormal' => 'Verkehr Abnormal in Letzter Stunde', + 'recently_active' => 'Kürzlich Aktiv', + 'targeted_users_count' => 'Zielgerichtete Benutzeranzahl', + 'traffic_usage_over' => 'Verkehrsnutzung Über N%', + 'will_expire_date' => 'Wird Ablaufen Datum', + ], + 'email_send' => 'E-Mail senden', + 'error_message' => 'Fehlermeldungen', + 'processed' => 'Anfrage Bearbeitet', + 'push_send' => 'Benachrichtigung senden', + 'send_status' => 'Sende-Status', + 'send_time' => 'Gesendet am', + 'targeted_users_not_found' => 'Zielgerichtete Benutzer Nicht Gefunden', + 'unknown_sending_type' => 'Unbekannter Sendetyp', + ], + 'massive_export' => 'Massenexport', 'menu' => [ + 'analysis' => [ + 'accounting' => 'Buchhaltung', + 'attribute' => 'Analytik', + 'node_flow' => 'Knotenverkehrsanalyse', + 'site_flow' => 'Seitenverkehrsanalyse', + 'user_flow' => 'Benutzerverkehrsanalyse', + ], + 'customer_service' => [ + 'article' => 'Wissensdatenbank', + 'attribute' => 'Helpdesk', + 'marketing' => 'Nachrichtenübermittlung', + 'ticket' => 'Support-Tickets', + ], 'dashboard' => 'Dashboard', - 'user' => [ - 'attribute' => 'Benutzer', - 'list' => 'Benutzerverwaltung', - 'oauth' => 'OAuth', - 'group' => 'Benutzergruppen', - 'credit_log' => 'Kreditverlauf', - 'subscribe' => 'Abonnements', + 'log' => [ + 'attribute' => 'Protokolle', + 'notify' => 'Benachrichtigungen', + 'online_logs' => 'Online-Protokolle', + 'online_monitor' => 'Online-Überwachung', + 'payment_callback' => 'Zahlungs-Callback', + 'service_ban' => 'Sperrprotokolle', + 'system' => 'Systemprotokolle', + 'traffic' => 'Datenverbrauch', + 'traffic_flow' => 'Datenfluss', + ], + 'node' => [ + 'attribute' => 'Knoten', + 'auth' => 'API-Autorisierung', + 'cert' => 'Zertifikate', + 'list' => 'Knotenverwaltung', + ], + 'promotion' => [ + 'attribute' => 'Promotion', + 'invite' => 'Empfehlungen', + 'rebate_flow' => 'Rabattverlauf', + 'withdraw' => 'Auszahlungen', ], 'rbac' => [ 'attribute' => 'RBAC', 'permission' => 'Berechtigungen', 'role' => 'Rollen', ], - 'customer_service' => [ - 'attribute' => 'Helpdesk', - 'ticket' => 'Support-Tickets', - 'article' => 'Wissensdatenbank', - 'marketing' => 'Nachrichtenübermittlung', - ], - 'node' => [ - 'attribute' => 'Knoten', - 'list' => 'Knotenverwaltung', - 'auth' => 'API-Autorisierung', - 'cert' => 'Zertifikate', - ], 'rule' => [ 'attribute' => 'Auditrichtlinien', - 'list' => 'Regeln', 'group' => 'Regelgruppen', + 'list' => 'Regeln', 'trigger' => 'Trigger-Aufzeichnungen', ], - 'shop' => [ - 'attribute' => 'Shop', - 'goods' => 'Produkte', - 'coupon' => 'Gutscheine', - 'order' => 'Bestellungen', - ], - 'promotion' => [ - 'attribute' => 'Promotion', - 'invite' => 'Empfehlungen', - 'withdraw' => 'Auszahlungen', - 'rebate_flow' => 'Rabattverlauf', - ], - 'analysis' => [ - 'attribute' => 'Analytik', - 'accounting' => 'Buchhaltung', - 'user_flow' => 'Benutzerverkehrsanalyse', - 'node_flow' => 'Knotenverkehrsanalyse', - 'site_flow' => 'Seitenverkehrsanalyse', - ], - 'log' => [ - 'attribute' => 'Protokolle', - 'traffic' => 'Datenverbrauch', - 'traffic_flow' => 'Datenfluss', - 'service_ban' => 'Sperrprotokolle', - 'online_logs' => 'Online-Protokolle', - 'online_monitor' => 'Online-Überwachung', - 'notify' => 'Benachrichtigungen', - 'payment_callback' => 'Zahlungs-Callback', - 'system' => 'Systemprotokolle', - ], - 'tools' => [ - 'attribute' => 'Werkzeuge', - 'decompile' => 'Dekompilieren', - 'convert' => 'Konvertieren', - 'import' => 'Importieren', - 'analysis' => 'Protokollanalyse', - ], 'setting' => [ 'attribute' => 'Einstellungen', 'email_suffix' => 'E-Mail-Filter', - 'universal' => 'Allgemein', 'system' => 'System', + 'universal' => 'Allgemein', + ], + 'shop' => [ + 'attribute' => 'Shop', + 'coupon' => 'Gutscheine', + 'goods' => 'Produkte', + 'order' => 'Bestellungen', + ], + 'tools' => [ + 'analysis' => 'Protokollanalyse', + 'attribute' => 'Werkzeuge', + 'convert' => 'Konvertieren', + 'decompile' => 'Dekompilieren', + 'import' => 'Importieren', + ], + 'user' => [ + 'attribute' => 'Benutzer', + 'credit_log' => 'Kreditverlauf', + 'group' => 'Benutzergruppen', + 'list' => 'Benutzerverwaltung', + 'oauth' => 'OAuth', + 'subscribe' => 'Abonnements', ], ], - 'user' => [ - 'massive' => [ - 'text' => 'Massenweise Kontoerstellung', - 'failed' => 'Benutzererstellung fehlgeschlagen', - 'succeed' => 'Benutzer erfolgreich erstellt', - 'note' => 'Benutzerkonten im Hintergrund massenweise erstellen', - ], - 'proxy_info' => 'Konfigurationsinformationen', - 'traffic_monitor' => 'Datenverkehrsstatistik', - 'online_monitor' => 'Online-Überwachung', - 'reset_traffic' => 'Daten zurücksetzen', - 'user_view' => 'Zur Benutzeransicht wechseln', - 'connection_test' => 'Verbindungstest', - 'counts' => 'Insgesamt :num Konten', - 'reset_confirm' => [0 => 'Möchten Sie den Datenverkehr von [', 1 => '] zurücksetzen?'], - 'info' => [ - 'account' => 'Kontoinformationen', - 'proxy' => 'Proxy-Informationen', - 'switch' => 'Identität wechseln', - 'reset_date_hint' => 'Nächstes Datum für Datenrücksetzung', - 'expired_date_hint' => 'Leer lassen für eine Standardgültigkeit von einem Jahr', - 'uuid_hint' => 'UUID für V2Ray', - 'recharge_placeholder' => 'Wenn negativ, wird das Guthaben abgezogen', - ], - 'update_help' => 'Aktualisierung erfolgreich, zurückkehren?', - 'proxies_config' => 'Verbindungsinformationen für :username', - 'group' => [ - 'title' => 'Benutzergruppensteuerung (Ein Knoten kann in mehreren Gruppen sein, aber der Benutzer kann nur einer Gruppe angehören; für Benutzer sichtbare/verfügbare Knoten hat die Gruppe Vorrang vor der Ebene)', - 'name' => 'Gruppenname', - 'counts' => 'Insgesamt :num Gruppen', - ], - ], - 'zero_unlimited_hint' => '0 oder leer für unbegrenzt', - 'node' => [ - 'traffic_monitor' => 'Datenverkehrsstatistik', - 'refresh_geo' => 'Geografie aktualisieren', - 'connection_test' => 'Konnektivitätstest', - 'counts' => 'Insgesamt :num Knoten', - 'reload_all' => 'Alle Backends neu laden', - 'refresh_geo_all' => 'Geodaten aktualisieren', - 'reload_confirm' => 'Möchten Sie das Server-Backend neu laden?', - 'info' => [ - 'hint' => 'Hinweis: Die automatisch generierte ID ist die node_id für das ShadowsocksR-Backend und die nodeId für das V2Ray-Backend', - 'basic' => 'Grundinformationen', - 'ddns_hint' => 'Dynamische IP-Knoten erfordern eine DDNS-Konfiguration. Für diesen Knotentyp wird der Konnektivitätstest über Domainnamen durchgeführt.', - 'domain_placeholder' => 'Server-Domain, wird zuerst verwendet, wenn ausgefüllt', - 'domain_hint' => 'Nach Aktivierung des DDNS in den Systemeinstellungen wird der Domainname und die IPs automatisch aktualisiert! Sie müssen diese Informationen nicht mehr auf der Website des Domain-Registrars bearbeiten.', - 'extend' => 'Erweiterte Informationen', - 'display' => [ - 'invisible' => 'Unsichtbar', - 'node' => 'Nur auf der Knoten-Seite sichtbar', - 'sub' => 'Nur in Abonnements sichtbar', - 'all' => 'Vollständig sichtbar', - 'hint' => 'Ob im Abonnement/Knotenliste sichtbar', - ], - 'ipv4_hint' => 'Mehrere IPs sollten durch Kommata getrennt werden, z.B.: 1.1.1.1,8.8.8.8', - 'ipv6_hint' => 'Mehrere IPs sollten durch Kommata getrennt werden, z.B.: 1.1.1.1,8.8.8.8', - 'ipv4_placeholder' => 'Server IPv4-Adresse', - 'ipv6_placeholder' => 'Server IPv6-Adresse', - 'push_port_hint' => 'Erforderlich. Stellen Sie sicher, dass dieser Port in der Server-Firewall geöffnet ist, andernfalls wird die Nachrichtenübermittlung abnormal sein.', - 'data_rate_hint' => 'Zum Beispiel: 0.1 bedeutet, dass 100M als 10M gezählt werden; 5 bedeutet, dass 100M als 500M gezählt werden', - 'level_hint' => 'Ebene: 0 - Keine Ebenenbeschränkung, alle sichtbar.', - 'detection' => [ - 'tcp' => 'Nur TCP', - 'icmp' => 'Nur ICMP', - 'all' => 'Beides', - 'hint' => 'Zufällige Überprüfung alle 30-60 Minuten', - ], - 'obfs_param_hint' => 'Parameter für die Datenverschleierung ausfüllen, wenn obfs nicht [plain] ist; Empfohlener Port 80, wenn obfs [http_simple] ist; Empfohlener Port 443, wenn obfs [tls] ist;', - 'additional_ports_hint' => 'Wenn aktiviert, bitte Server additional_ports konfigurieren', - 'v2_method_hint' => 'WebSocket-Übertragungsprotokoll sollte keine \'none\' Verschlüsselungsmethode verwenden.', - 'v2_net_hint' => 'Bitte aktivieren Sie TLS für WebSocket', - 'v2_cover' => [ - 'none' => 'Keine', - 'http' => 'HTTP', - 'srtp' => 'SRTP', - 'utp' => 'uTP', - 'wechat' => 'WeChat Video', - 'dtls' => 'DTLS 1.2', - 'wireguard' => 'WireGuard', - ], - 'v2_host_hint' => 'Bei Verwendung von HTTP-Tarnung sollten mehrere Domains durch Kommata getrennt werden, während WebSocket nur eine einzelne Domain zulässt.', - 'v2_tls_provider_hint' => 'Unterschiedliche Backends haben unterschiedliche Konfigurationen:', - 'single_hint' => 'Empfohlene Ports 80/443. Backend benötigt
    strikte Moduskonfiguration: nur über angegebene Ports verbinden. (Wie konfigurieren)', - ], - 'proxy_info' => '*Kompatibel mit Shadowsocks', - 'proxy_info_hint' => 'Zur Kompatibilität bitte _compatible zu Protokoll und Verschleierung in der Server-Konfiguration hinzufügen', - 'reload' => 'Backend neu laden', - 'auth' => [ - 'title' => 'API-Autorisierungen WEBAPI', - 'deploy' => [ - 'title' => 'Bereitstellen :type_label Backend', - 'attribute' => 'Backend-Bereitstellung', - 'command' => 'Anweisungen', - 'update' => 'Aktualisieren', - 'uninstall' => 'Deinstallieren', - 'start' => 'Starten', - 'stop' => 'Stoppen', - 'status' => 'Status', - 'recent_logs' => 'Aktuelle Protokolle', - 'real_time_logs' => 'Echtzeitprotokolle', - 'restart' => 'Neustarten', - 'same' => 'Gleiche wie oben', - 'trojan_hint' => 'Bitte füllen Sie den Knotennamenund analysieren Sie die entsprechende IP', - ], - 'reset_auth' => 'Autorisierungsschlüssel zurücksetzen', - 'counts' => 'Insgesamt :num Lizenzen', - 'generating_all' => 'Bestätigen Sie die Generierung von Autorisierungsschlüsseln für alle Knoten?', - ], - 'cert' => [ - 'title' => 'Domainzertifikate (Für V2Ray-Knotentarnung)', - 'counts' => 'Insgesamt :num Domainzertifikate', - 'key_placeholder' => 'Der Schlüsselwert des Zertifikats kann leer gelassen werden. Das VNET-V2Ray-Backend unterstützt die automatische Ausstellung', - 'pem_placeholder' => 'Das VNET-V2Ray-Backend unterstützt die automatische Ausstellung', - ], - ], - 'hint' => 'Hinweis', - 'oauth' => [ - 'title' => 'OAuth', - 'counts' => 'Insgesamt :num Autorisierungsaufzeichnungen', - ], - 'select_all' => 'Alle auswählen', - 'clear' => 'Löschen', - 'unselected_hint' => 'Zu verteilende Regeln können hier durchsucht werden', - 'selected_hint' => 'Die verteilten Regeln können hier durchsucht werden', - 'clone' => 'Klonen', + 'minute' => 'Minuten', 'monitor' => [ 'daily_chart' => 'Tägliche Datenverbrauch', + 'hint' => 'Hinweis: Überprüfen Sie geplante Aufgaben, wenn keine Daten vorhanden sind', 'monthly_chart' => 'Monatliche Datenverbrauch', 'node' => 'Knotenverkehr', 'user' => 'Benutzerverkehr', - 'hint' => 'Hinweis: Überprüfen Sie geplante Aufgaben, wenn keine Daten vorhanden sind', ], - 'tools' => [ - 'analysis' => [ - 'title' => 'SSR-Protokollanalyse Für einen einzelnen Knoten', - 'req_url' => 'Zuletzt angeforderte URL-Aufzeichnungen', - 'not_enough' => 'Weniger als 15.000 Aufzeichnungen, Analyse nicht möglich', - ], - 'convert' => [ - 'title' => 'Formatkonvertierung SS zu SSR', - 'content_placeholder' => 'Bitte füllen Sie die zu konvertierenden Konfigurationsinformationen aus.', - ], - 'decompile' => [ - 'title' => 'Dekompilieren Konfigurationsinformationen', - 'attribute' => 'Umgekehrte Parsing-Konfigurationslink', - 'content_placeholder' => 'Bitte füllen Sie die zu dekompilierenden ShadowsocksR-Links aus, getrennt durch Zeilenumbrüche.', - ], - ], - 'ticket' => [ - 'title' => 'Tickets', - 'counts' => 'Insgesamt :num Tickets', - 'send_to' => 'Bitte füllen Sie die Angaben des Zielbenutzers aus', - 'user_info' => 'Benutzerinformationen', - 'inviter_info' => 'Einlader-Informationen', - 'close_confirm' => 'Möchten Sie dieses Ticket schließen?', - 'error' => 'Unbekannter Fehler! Bitte überprüfen Sie die Protokolle', - ], - 'logs' => [ - 'subscribe' => 'Abonnements', - 'counts' => 'Insgesamt :num Aufzeichnungen', - 'rule' => [ - 'clear_all' => 'Alle Aufzeichnungen löschen', - 'title' => 'Regelauslöser-Aufzeichnungen', - 'name' => 'Name der ausgelösten Regel', - 'reason' => 'Auslösegrund', - 'created_at' => 'Auslösezeit', - 'tag' => '✅ Zugriff auf nicht autorisierte Inhalte', - 'clear_confirm' => 'Möchten Sie alle Auslöser-Aufzeichnungen löschen?', - ], - 'order' => [ - 'title' => 'Bestellungen', - 'is_expired' => 'Abgelaufen', - 'is_coupon' => 'Gutschein verwendet', - ], - 'user_traffic' => [ - 'title' => 'Datenverbrauchsaufzeichnungen', - 'choose_node' => 'Knoten auswählen', - ], - 'user_data_modify_title' => 'Datenänderungsaufzeichnungen', - 'callback' => 'Callback-Protokolle (Zahlung)', - 'notification' => 'E-Mail-Protokolle', - 'ip_monitor' => 'Online-IPs Echtzeit 2 Minuten', - 'user_ip' => [ - 'title' => 'Online-IPs Letzte 10 Minuten', - 'connect' => 'Verbunden IP', - ], - 'ban' => [ - 'title' => 'Benutzersperren', - 'time' => 'Dauer', - 'reason' => 'Grund', - 'ban_time' => 'Gesperrt am', - 'last_connect_at' => 'Letzte Anmeldung', - ], - 'credit_title' => 'Guthabenänderungsprotokolle', - ], - 'start_time' => 'Start', - 'end_time' => 'Ende', - 'goods' => [ - 'title' => 'Produkte', - 'type' => [ - 'top_up' => 'Aufladen', - 'package' => 'Datenpaket', - 'plan' => 'Abonnementplan', - ], - 'info' => [ - 'type_hint' => 'Plan beeinflusst die Kontoablaufzeit, Paket zieht nur Daten ab, beeinflusst nicht die Ablaufzeit', - 'period_hint' => 'Datenvolumen wird alle N Tage für Pläne zurückgesetzt', - 'limit_num_hint' => 'Maximale Anzahl von Käufen pro Benutzer, 0 für unbegrenzt', - 'available_date_hint' => 'Daten werden automatisch vom Gesamtvolumen abgezogen, wenn fällig', - 'desc_placeholder' => 'Kurzbeschreibung', - 'list_placeholder' => 'Benutzerdefinierte Inhalte hinzufügen', - 'list_hint' => 'Beginnen Sie jede Zeile mit
  • und enden Sie mit
  • ', - ], - 'status' => [ - 'yes' => 'Zum Verkauf', - 'no' => 'Nicht zum Verkauf', - ], - 'sell_and_used' => 'Verwendet / Verkauft', - 'counts' => 'Insgesamt :num Artikel', - ], - 'sort_asc' => 'Größerer Sortierwert hat höhere Priorität', - 'yes' => 'Ja', 'no' => 'Nein', - 'rule' => [ - 'type' => [ - 'reg' => 'Regex', - 'domain' => 'Domain', - 'ip' => 'IP', - 'protocol' => 'Protokoll', + 'node' => [ + 'auth' => [ + 'counts' => 'Insgesamt :num Lizenzen', + 'deploy' => [ + 'attribute' => 'Backend-Bereitstellung', + 'command' => 'Anweisungen', + 'real_time_logs' => 'Echtzeitprotokolle', + 'recent_logs' => 'Aktuelle Protokolle', + 'restart' => 'Neustarten', + 'same' => 'Gleiche wie oben', + 'start' => 'Starten', + 'status' => 'Status', + 'stop' => 'Stoppen', + 'title' => 'Bereitstellen :type_label Backend', + 'trojan_hint' => 'Bitte füllen Sie
    den Knotennamenund analysieren Sie die entsprechende IP', + 'uninstall' => 'Deinstallieren', + 'update' => 'Aktualisieren', + ], + 'empty' => 'Es gibt keine Knoten, die eine Autorisierungsgenerierung benötigen', + 'generating_all' => 'Bestätigen Sie die Generierung von Autorisierungsschlüsseln für alle Knoten?', + 'reset_auth' => 'Autorisierungsschlüssel zurücksetzen', + 'title' => 'API-Autorisierungen WEBAPI', ], + 'cert' => [ + 'counts' => 'Insgesamt :num Domainzertifikate', + 'key_placeholder' => 'Der Schlüsselwert des Zertifikats kann leer gelassen werden. Das VNET-V2Ray-Backend unterstützt die automatische Ausstellung', + 'pem_placeholder' => 'Das VNET-V2Ray-Backend unterstützt die automatische Ausstellung', + 'title' => 'Domainzertifikate (Für V2Ray-Knotentarnung)', + ], + 'connection_test' => 'Konnektivitätstest', + 'counts' => 'Insgesamt :num Knoten', + 'info' => [ + 'additional_ports_hint' => 'Wenn aktiviert, bitte Server additional_ports konfigurieren', + 'basic' => 'Grundinformationen', + 'data_rate_hint' => 'Zum Beispiel: 0.1 bedeutet, dass 100M als 10M gezählt werden; 5 bedeutet, dass 100M als 500M gezählt werden', + 'ddns_hint' => 'Dynamische IP-Knoten erfordern eine DDNS-Konfiguration. Für diesen Knotentyp wird der Konnektivitätstest über Domainnamen durchgeführt.', + 'detection' => [ + 'all' => 'Beides', + 'hint' => 'Zufällige Überprüfung alle 30-60 Minuten', + 'icmp' => 'Nur ICMP', + 'tcp' => 'Nur TCP', + ], + 'display' => [ + 'all' => 'Vollständig sichtbar', + 'hint' => 'Ob im Abonnement/Knotenliste sichtbar', + 'invisible' => 'Unsichtbar', + 'node' => 'Nur auf der Knoten-Seite sichtbar', + 'sub' => 'Nur in Abonnements sichtbar', + ], + 'domain_hint' => 'Nach Aktivierung des DDNS in den Systemeinstellungen wird der Domainname und die IPs automatisch aktualisiert! Sie müssen diese Informationen nicht mehr auf der Website des Domain-Registrars bearbeiten.', + 'domain_placeholder' => 'Server-Domain, wird zuerst verwendet, wenn ausgefüllt', + 'extend' => 'Erweiterte Informationen', + 'hint' => 'Hinweis: Die automatisch generierte ID ist die node_id für das ShadowsocksR-Backend und die nodeId für das V2Ray-Backend', + 'ipv4_hint' => 'Mehrere IPs sollten durch Kommata getrennt werden, z.B.: 1.1.1.1,8.8.8.8', + 'ipv4_placeholder' => 'Server IPv4-Adresse', + 'ipv6_hint' => 'Mehrere IPs sollten durch Kommata getrennt werden, z.B.: 1.1.1.1,8.8.8.8', + 'ipv6_placeholder' => 'Server IPv6-Adresse', + 'level_hint' => 'Ebene: 0 - Keine Ebenenbeschränkung, alle sichtbar.', + 'obfs_param_hint' => 'Parameter für die Datenverschleierung ausfüllen, wenn obfs nicht [plain] ist; Empfohlener Port 80, wenn obfs [http_simple] ist; Empfohlener Port 443, wenn obfs [tls] ist;', + 'push_port_hint' => 'Erforderlich. Stellen Sie sicher, dass dieser Port in der Server-Firewall geöffnet ist, andernfalls wird die Nachrichtenübermittlung abnormal sein.', + 'single_hint' => 'Empfohlene Ports 80/443. Backend benötigt
    strikte Moduskonfiguration: nur über angegebene Ports verbinden. (Wie konfigurieren)', + 'v2_cover' => [ + 'dtls' => 'DTLS 1.2', + 'http' => 'HTTP', + 'none' => 'Keine', + 'srtp' => 'SRTP', + 'utp' => 'uTP', + 'wechat' => 'WeChat Video', + 'wireguard' => 'WireGuard', + ], + 'v2_host_hint' => 'Bei Verwendung von HTTP-Tarnung sollten mehrere Domains durch Kommata getrennt werden, während WebSocket nur eine einzelne Domain zulässt.', + 'v2_method_hint' => 'WebSocket-Übertragungsprotokoll sollte keine \'none\' Verschlüsselungsmethode verwenden.', + 'v2_net_hint' => 'Bitte aktivieren Sie TLS für WebSocket', + 'v2_tls_provider_hint' => 'Unterschiedliche Backends haben unterschiedliche Konfigurationen:', + ], + 'proxy_info' => '*Kompatibel mit Shadowsocks', + 'proxy_info_hint' => 'Zur Kompatibilität bitte _compatible zu Protokoll und Verschleierung in der Server-Konfiguration hinzufügen', + 'refresh_geo' => 'Geografie aktualisieren', + 'refresh_geo_all' => 'Geodaten aktualisieren', + 'reload' => 'Backend neu laden', + 'reload_all' => 'Alle Backends neu laden', + 'reload_confirm' => 'Möchten Sie das Server-Backend neu laden?', + 'traffic_monitor' => 'Datenverkehrsstatistik', + ], + 'oauth' => [ + 'counts' => 'Insgesamt :num Autorisierungsaufzeichnungen', + 'title' => 'OAuth', + ], + 'optional' => 'Optional', + 'permission' => [ + 'counts' => 'Insgesamt :num Berechtigungen', + 'description_hint' => 'Beschreibung, z.B. [X-System] A bearbeiten', + 'name_hint' => 'Routenname, z.B. admin.user.update', + 'title' => 'Berechtigungen', + ], + 'query' => 'Abfrage', + 'report' => [ + 'annually_accounting' => 'Jährliche Transaktionen', + 'annually_site_flow' => 'Jährlicher Datenverbrauch', + 'avg_traffic_30d' => 'Durchschnittlicher täglicher Datenverkehr über 30 Tage', + 'current_month' => 'Dieser Monat', + 'current_year' => 'Dieses Jahr', + 'daily_accounting' => 'Tägliche Transaktionen', + 'daily_distribution' => 'Tägliche Verteilung', + 'daily_site_flow' => 'Täglicher Datenverbrauch', + 'daily_traffic' => 'Täglicher Datenverkehr', + 'hourly_traffic' => 'Stündlicher Datenverkehr', + 'last_month' => 'Letzter Monat', + 'last_year' => 'Letztes Jahr', + 'monthly_accounting' => 'Monatliche Transaktionen', + 'monthly_site_flow' => 'Monatlicher Datenverbrauch', + 'select_hourly_date' => 'Wählen Sie das Stunden-Datum', + 'sum_traffic_30d' => '30-Tage-Datenverkehrsverhältnis', + 'today' => 'Heute', + ], + 'require' => 'Erforderlich', + 'role' => [ + 'counts' => 'Insgesamt :num Rollen', + 'description_hint' => 'Anzeigename, z.B. Administrator', + 'modify_admin_error' => 'Bitte ändern Sie den Superadministrator nicht!', + 'name_hint' => 'Eindeutiger Bezeichner, z.B. admin', + 'permissions_all' => 'Alle Berechtigungen', + 'title' => 'Rollen', + ], + 'rule' => [ 'counts' => 'Insgesamt :num Regeln', - 'title' => 'Regeln', 'group' => [ + 'counts' => 'Insgesamt :num Gruppen', + 'title' => 'Regelgruppen', 'type' => [ 'off' => 'Blockieren', 'on' => 'Erlauben', ], - 'title' => 'Regelgruppen', - 'counts' => 'Insgesamt :num Gruppen', ], - ], - 'role' => [ - 'name_hint' => 'Eindeutiger Bezeichner, z.B. admin', - 'description_hint' => 'Anzeigename, z.B. Administrator', - 'title' => 'Rollen', - 'permissions_all' => 'Alle Berechtigungen', - 'counts' => 'Insgesamt :num Rollen', - ], - 'report' => [ - 'daily_accounting' => 'Tägliche Transaktionen', - 'monthly_accounting' => 'Monatliche Transaktionen', - 'annually_accounting' => 'Jährliche Transaktionen', - 'daily_site_flow' => 'Täglicher Datenverbrauch', - 'monthly_site_flow' => 'Monatlicher Datenverbrauch', - 'annually_site_flow' => 'Jährlicher Datenverbrauch', - 'current_month' => 'Dieser Monat', - 'last_month' => 'Letzter Monat', - 'current_year' => 'Dieses Jahr', - 'last_year' => 'Letztes Jahr', - 'hourly_traffic' => 'Stündlicher Datenverkehr', - 'daily_traffic' => 'Täglicher Datenverkehr', - 'daily_distribution' => 'Tägliche Verteilung', - 'today' => 'Heute', - 'avg_traffic_30d' => 'Durchschnittlicher täglicher Datenverkehr über 30 Tage', - 'sum_traffic_30d' => '30-Tage-Datenverkehrsverhältnis', - 'select_hourly_date' => 'Wählen Sie das Stunden-Datum', - ], - 'permission' => [ - 'title' => 'Berechtigungen', - 'description_hint' => 'Beschreibung, z.B. [X-System] A bearbeiten', - 'name_hint' => 'Routenname, z.B. admin.user.update', - 'counts' => 'Insgesamt :num Berechtigungen', - ], - 'marketing' => [ - 'push_send' => 'Benachrichtigung senden', - 'email_send' => 'E-Mail senden', - 'email' => [ - 'targeted_users_count' => 'Zielgerichtete Benutzeranzahl', - 'loading_statistics' => 'Lade Statistiken...', - 'filters' => 'Filter', - 'expired_date' => 'Abgelaufene Datum', - 'will_expire_date' => 'Wird Ablaufen Datum', - 'traffic_usage_over' => 'Verkehrsnutzung Über N%', - 'recently_active' => 'Kürzlich Aktiv', - 'paid_servicing' => 'Bezahlte Dienste', - 'previously_paid' => 'Früher Bezahlt', - 'ever_paid' => 'Je Bezahlt', - 'never_paid' => 'Nie Bezahlt', - 'recent_traffic_abnormal' => 'Verkehr Abnormal in Letzter Stunde', - ], - 'counts' => 'Insgesamt :num E-Mails', - 'send_status' => 'Sende-Status', - 'send_time' => 'Gesendet am', - 'error_message' => 'Fehlermeldungen', - 'processed' => 'Anfrage Bearbeitet', - 'targeted_users_not_found' => 'Zielgerichtete Benutzer Nicht Gefunden', - 'unknown_sending_type' => 'Unbekannter Versandtyp', - ], - 'creating' => 'Hinzufügen...', - 'article' => [ + 'title' => 'Regeln', 'type' => [ - 'knowledge' => 'Artikel', - 'announcement' => 'Ankündigung', + 'domain' => 'Domain', + 'ip' => 'IP', + 'protocol' => 'Protokoll', + 'reg' => 'Regex', ], - 'category_hint' => 'Gleiche Kategorie wird zusammengefasst', - 'logo_placeholder' => 'Oder Logo-URL eingeben', - 'title' => 'Artikel', - 'counts' => 'Insgesamt :num Artikel', - ], - 'coupon' => [ - 'title' => 'Gutscheine', - 'name_hint' => 'Zur Anzeige', - 'sn_hint' => 'Leer lassen für 8-stelligen Zufallscode', - 'type' => [ - 'voucher' => 'Gutschein', - 'discount' => 'Rabatt', - 'charge' => 'Aufladen', - ], - 'type_hint' => 'Reduktion: Betrag abziehen; Rabatt: Prozentsatz abziehen; Aufladen: Betrag zum Guthaben hinzufügen', - 'value' => '{1} ➖ :num|{2} :num% Rabatt|{3} ➕ :num', - 'value_hint' => 'Bereich liegt zwischen 1% und 99%', - 'priority_hint' => 'Der höchste berechtigte Gutschein wird zuerst verwendet. Maximal 255', - 'minimum_hint' => 'Nur verwendbar, wenn die Zahlung :num übersteigt', - 'used_hint' => 'Jeder Benutzer kann diesen Gutschein maximal :num Mal verwenden', - 'levels_hint' => 'Nur für ausgewählte Benutzerebenen verwendbar', - 'groups_hint' => 'Nur für ausgewählte Benutzergruppen verwendbar', - 'users_placeholder' => 'Benutzer-ID eingeben, Enter drücken', - 'user_whitelist_hint' => 'Whitelist-Benutzer können verwenden, leer lassen, wenn nicht verwendet', - 'users_blacklist_hint' => 'Blacklist-Benutzer können nicht verwenden, leer lassen, wenn nicht verwendet', - 'services_placeholder' => 'Produkt-ID eingeben, Enter drücken', - 'services_whitelist_hint' => 'Nur für Whitelist-Produkte verwendbar, leer lassen, wenn nicht verwendet', - 'services_blacklist_hint' => 'Nicht für Blacklist-Produkte verwendbar, leer lassen, wenn nicht verwendet', - 'newbie' => [ - 'first_discount' => 'Erster Rabatt', - 'first_order' => 'Erste Bestellung', - 'created_days' => 'Kontodauer', - ], - 'created_days_hint' => ':day Tage nach der Registrierung', - 'limit_hint' => 'Regeln haben eine UND-Beziehung, bitte richtig verwenden', - 'info_title' => 'Informationen', - 'counts' => 'Insgesamt :num Gutscheine', - 'discount' => 'Rabatt', - 'export_title' => 'Exportieren', - 'single_use' => 'Einmalige Verwendung', - ], - 'times' => 'Zeiten', - 'massive_export' => 'Massenexport', - 'system_generate' => 'Systemgeneriert', - 'aff' => [ - 'rebate_title' => 'Rabattverlauf', - 'counts' => 'Insgesamt :num Aufzeichnungen', - 'title' => 'Auszahlungsanfragen', - 'apply_counts' => 'Insgesamt :num Auszahlungsanfragen', - 'referral' => 'Empfehlungsrabatte', - 'commission_title' => 'Anfragedetails', - 'commission_counts' => 'Diese Anwendung beinhaltet insgesamt :num Bestellungen', ], + 'select_all' => 'Alle auswählen', + 'selected_hint' => 'Die verteilten Regeln können hier durchsucht werden', + 'set_to' => 'Setze als :attribute', 'setting' => [ 'common' => [ - 'title' => 'Allgemeine Konfiguration', - 'set_default' => 'Als Standard festlegen', 'connect_nodes' => '# der Knoten', + 'set_default' => 'Als Standard festlegen', + 'title' => 'Allgemeine Konfiguration', ], 'email' => [ - 'title' => 'E-Mail-Filter (für Registrierung)', - 'tail' => 'E-Mail-Suffix', - 'rule' => 'Einschränkungsart', 'black' => 'Blacklist', - 'white' => 'Whitelist', + 'rule' => 'Einschränkungsart', + 'tail' => 'E-Mail-Suffix', 'tail_placeholder' => 'E-Mail-Suffix eingeben', - ], - 'system' => [ - 'title' => 'Systemeinstellungen', - 'web' => 'Allgemein', - 'account' => 'Konto', - 'node' => 'Knoten', - 'extend' => 'Erweitert', - 'check_in' => 'Einchecken', - 'promotion' => 'Affiliate', - 'notify' => 'Benachrichtigung', - 'auto_job' => 'Automatisierung', - 'other' => 'Logo|CS|Analytics', - 'payment' => 'Zahlung', - 'menu' => 'Menü', + 'title' => 'E-Mail-Filter (für Registrierung)', + 'white' => 'Whitelist', ], 'no_permission' => 'Keine Berechtigung, Einstellungen zu ändern!', + 'system' => [ + 'account' => 'Konto', + 'auto_job' => 'Automatisierung', + 'check_in' => 'Einchecken', + 'extend' => 'Erweitert', + 'menu' => 'Menü', + 'node' => 'Knoten', + 'notify' => 'Benachrichtigung', + 'other' => 'Logo|CS|Analytics', + 'payment' => 'Zahlung', + 'promotion' => 'Affiliate', + 'title' => 'Systemeinstellungen', + 'web' => 'Allgemein', + ], ], + 'sort_asc' => 'Größerer Sortierwert hat höhere Priorität', + 'start_time' => 'Start', 'system' => [ + 'AppStore_id' => '[Apple] Konto', + 'AppStore_password' => '[Apple] Passwort', 'account_expire_notification' => 'Benachrichtigung über Kontoablauf', + 'active_account' => [ + 'after' => 'Aktivierung nach der Registrierung', + 'before' => 'Aktivierung vor der Registrierung', + ], 'active_times' => 'Maximale Kontoaktivierungen', 'admin_invite_days' => '[Admin] Einladungslaufzeit', 'aff_salt' => '[Empfehlungs-URL] Benutzer-ID verschlüsseln', 'alipay_qrcode' => 'Alipay QR-Code', - 'AppStore_id' => '[Apple] Konto', - 'AppStore_password' => '[Apple] Passwort', 'auto_release_port' => 'Port-Recycling', 'bark_key' => '[Bark] Geräteschlüssel', + 'captcha' => [ + 'geetest' => 'Geetest', + 'hcaptcha' => 'hCaptcha', + 'recaptcha' => 'Google ReCaptcha', + 'standard' => 'Standard', + 'turnstile' => 'Turnstile', + ], 'captcha_key' => 'Captcha-Schlüssel', 'captcha_secret' => 'Captcha-Geheimnis/ID', 'codepay_id' => '[CodePay] ID', @@ -521,6 +477,7 @@ return [ 'ddns_secret' => '[DNS] Geheimnis', 'default_days' => 'Standard-Kontodauer', 'default_traffic' => 'Standard-Anfangsdaten', + 'demo_restriction' => 'In der Demo-Umgebung ist das Ändern dieser Konfiguration untersagt!', 'detection_check_times' => 'Knotenblockierungswarnungen', 'dingTalk_access_token' => '[DingTalk] Zugriffstoken', 'dingTalk_secret' => '[DingTalk] Geheimnis', @@ -531,108 +488,19 @@ return [ 'f2fpay_app_id' => '[Alipay] APP ID', 'f2fpay_private_key' => '[Alipay] Privatschlüssel', 'f2fpay_public_key' => '[Alipay] Öffentlicher Schlüssel', + 'forbid' => [ + 'china' => 'Zugriff aus China verbieten', + 'mainland' => 'Zugriff aus dem chinesischen Festland verbieten', + 'oversea' => 'Übersee-Zugriff verbieten', + ], 'forbid_mode' => 'Zugriffsbeschränkung', - 'invite_num' => 'Standard-Einladungen', - 'is_activate_account' => 'Kontoaktivierung', - 'is_AliPay' => 'Alipay', - 'is_ban_status' => 'Ablauf-Sperre', - 'is_captcha' => 'Captcha', - 'is_checkin' => 'Check-in-Belohnung', - 'is_clear_log' => 'Protokolle bereinigen', - 'is_custom_subscribe' => 'Erweitertes Abonnement', - 'is_email_filtering' => 'E-Mail-Filterung für Benutzerregistrierung', - 'is_forbid_robot' => 'Bots verbieten', - 'is_free_code' => 'Kostenlose Einladungscodes', - 'is_invite_register' => 'Einladung zur Registrierung', - 'is_otherPay' => 'Benutzerdefinierte Zahlung', - 'is_QQPay' => 'QQ Pay', - 'is_rand_port' => 'Zufälliger Port', - 'is_register' => 'Registrierung', - 'is_subscribe_ban' => 'Abonnement-Sperre', - 'is_traffic_ban' => 'Datenmissbrauchs-Sperre', - 'is_WeChatPay' => 'WeChat Pay', - 'iYuu_token' => '[IYUU] Token', - 'maintenance_content' => 'Wartungsmitteilung', - 'maintenance_mode' => 'Wartungsmodus', - 'maintenance_time' => 'Wartungsende', - 'min_port' => 'Portrange', - 'min_rand_traffic' => 'Datenrange', - 'node_blocked_notification' => 'Benachrichtigung über Knotenblockierung', - 'node_daily_notification' => 'Täglicher Knotenbericht', - 'node_offline_notification' => 'Benachrichtigung über Knotenoffline', - 'oauth_path' => 'OAuth-Plattformen', - 'offline_check_times' => 'Offline-Benachrichtigungen', - 'password_reset_notification' => 'Benachrichtigung über Passwortzurücksetzung', - 'paybeaver_app_id' => '[PayBeaver] App ID', - 'paybeaver_app_secret' => '[PayBeaver] App-Geheimnis', - 'payjs_key' => '[PayJs] Schlüssel', - 'payjs_mch_id' => '[PayJs] Händler-ID', - 'payment_confirm_notification' => 'Benachrichtigung über Zahlungsbestätigung', - 'payment_received_notification' => 'Benachrichtigung über Zahlungseingang', - 'paypal_app_id' => 'App ID', - 'paypal_client_id' => 'Client-ID', - 'paypal_client_secret' => 'Client-Geheimnis', - 'pushDeer_key' => '[PushDeer] Schlüssel', - 'pushplus_token' => '[PushPlus] Token', - 'rand_subscribe' => 'Zufälliges Abonnement', - 'redirect_url' => 'Weiterleitungs-URL', - 'referral_money' => 'Minimale Auszahlungssumme', - 'referral_percent' => 'Rabattprozentsatz', - 'referral_status' => 'Affiliate', - 'referral_traffic' => 'Registrierungsbonus', - 'referral_type' => 'Rabattart', - 'register_ip_limit' => 'Registrierungs-IP-Beschränkung', - 'reset_password_times' => 'Passwortzurücksetzungsversuche', - 'reset_traffic' => 'Datenrücksetzung', - 'server_chan_key' => '[ServerChan] SCKEY', - 'standard_currency' => 'Primärwährung', - 'stripe_public_key' => 'Öffentlicher Schlüssel', - 'stripe_secret_key' => 'Geheimer Schlüssel', - 'stripe_signing_secret' => 'Webhook-Geheimnis', - 'subject_name' => 'Benutzerdefinierter Produktname', - 'subscribe_ban_times' => 'Abonnement-Beschränkung', - 'subscribe_domain' => 'Abonnement-URL', - 'subscribe_max' => 'Maximale Abonnement-Knoten', - 'telegram_token' => 'Telegram-Token', - 'tg_chat_token' => 'TG Chat Token', - 'theadpay_key' => '[THeadPay] Schlüssel', - 'theadpay_mchid' => '[THeadPay] Händler-ID', - 'theadpay_url' => '[THeadPay] URL', - 'ticket_closed_notification' => 'Benachrichtigung über Ticket-Schließung', - 'ticket_created_notification' => 'Benachrichtigung über Ticketerstellung', - 'ticket_replied_notification' => 'Benachrichtigung über Ticketantwort', - 'traffic_ban_time' => 'Sperrdauer', - 'traffic_ban_value' => 'Datenmissbrauchsgrenze', - 'traffic_limit_time' => 'Check-in-Intervall', - 'traffic_warning_percent' => 'Datenverbrauchswarnung', - 'trojan_license' => 'Trojan-Lizenz', - 'username_type' => 'Kontobenutzernamensart', - 'user_invite_days' => '[Benutzer] Einladungslaufzeit', - 'v2ray_license' => 'V2Ray-Lizenz', - 'v2ray_tls_provider' => 'V2Ray TLS-Konfiguration', - 'webmaster_email' => 'Admin-E-Mail', - 'website_analytics' => 'Analytik-Code', - 'website_callback_url' => 'Zahlungs-Callback-Domain', - 'website_customer_service' => 'Kundendienst-Code', - 'website_home_logo' => 'Startseiten-Logo', - 'website_logo' => 'Internes Seiten-Logo', - 'website_name' => 'Webseitenname', - 'website_security_code' => 'Sicherheitscode', - 'website_url' => 'Webseitendomäne', - 'web_api_url' => 'API-Domäne', - 'wechat_aid' => 'WeChat AID', - 'wechat_cid' => 'WeChat CID', - 'wechat_encodingAESKey' => 'WeChat Encoding-Schlüssel', - 'wechat_qrcode' => 'WeChat QR-Code', - 'wechat_secret' => 'WeChat Geheimnis', - 'wechat_token' => 'WeChat Token', 'hint' => [ + 'AppStore_id' => 'Verwendet in Artikeln', + 'AppStore_password' => 'Verwendet in Artikeln', 'account_expire_notification' => 'Benachrichtigung über Ablauf', 'active_times' => 'Über E-Mail in 24 Stunden', 'admin_invite_days' => 'Admin-Einladungslaufzeit', 'aff_salt' => 'Verschlüsselungssalt für Empfehlungs-URL', - 'AppStore_id' => 'Verwendet in Artikeln', - 'AppStore_password' => 'Verwendet in Artikeln', 'auto_release_port' => 'Automatische Freigabe des Ports nach '.config('tasks.release_port').' Tagen Sperre/Ablauf', 'bark_key' => 'Geräteschlüssel für iOS-Push', 'captcha_key' => 'Anleitung hier', @@ -650,6 +518,7 @@ return [ 'f2fpay_private_key' => 'Alipay Privatschlüssel vom Geheimschlüssel-Tool', 'f2fpay_public_key' => 'Nicht der öffentliche APP-Schlüssel!', 'forbid_mode' => 'Blockiere den Zugriff aus bestimmten Regionen', + 'iYuu_token' => 'Fülle IYUU Token aus, bevor aktiviert', 'invite_num' => 'Standardanzahl der Einladungen pro Benutzer', 'is_activate_account' => 'Aktivierung per E-Mail erforderlich', 'is_ban_status' => '(Vorsicht) Konto sperren setzt alle Benutzerdaten zurück', @@ -664,14 +533,14 @@ return [ 'is_register' => 'Registrierung deaktivieren, wenn nicht ausgewählt', 'is_subscribe_ban' => 'Automatische Sperre, wenn Abonnementanfragen den Schwellenwert überschreiten', 'is_traffic_ban' => 'Automatische Deaktivierung des Dienstes, wenn Daten den Schwellenwert in 1 Stunde überschreiten', - 'iYuu_token' => 'Fülle IYUU Token aus, bevor aktiviert', 'maintenance_content' => 'Benutzerdefinierte Wartungsmitteilung', - 'maintenance_mode' => "Leite normale Benutzer auf Wartungsseite um, wenn aktiviert | Admin kann sich über :url anmelden", + 'maintenance_mode' => 'Leite normale Benutzer auf Wartungsseite um, wenn aktiviert | Admin kann sich über :url anmelden', 'maintenance_time' => 'Für Countdown auf der Wartungsseite', 'min_port' => 'Portrange 1000 - 65535', 'node_blocked_notification' => 'Stündliche Erkennung von Knotenblockierungen, Benachrichtigung an Admins', 'node_daily_notification' => 'Täglicher Knotenbenutzungsbericht', 'node_offline_notification' => 'Alle 10 Minuten Offline-Erkennung, Benachrichtigung bei Offline-Knoten', + 'node_renewal_notification' => 'Erinnern Sie den Administrator 7 Tage, 3 Tage und 1 Tag vor Ablauf daran, den Knoten zu verlängern.', 'oauth_path' => 'Bitte Plattformen zuerst in .ENV aktivieren', 'offline_check_times' => 'Beende Benachrichtigung nach N Warnungen in 24 Stunden', 'password_reset_notification' => 'Erlaube Passwortzurücksetzung per E-Mail, wenn aktiviert', @@ -707,9 +576,10 @@ return [ 'traffic_ban_value' => 'Automatische Kontosperre, wenn dieser Wert in 1 Stunde überschritten wird', 'traffic_limit_time' => 'Zeitintervall zwischen Check-ins', 'traffic_warning_percent' => 'Sende Datenverbrauchswarnung, wenn tägliche Nutzung diesen Prozentsatz erreicht', - 'username_type' => 'Standard-Benutzernamensart für Benutzer', 'user_invite_days' => 'Ablauf von Benutzereinladungscodes', + 'username_type' => 'Standard-Benutzernamensart für Benutzer', 'v2ray_tls_provider' => 'Knoteneinstellungen überschreiben diese TLS-Konfiguration', + 'web_api_url' => 'Z.B. '.config('app.url'), 'webmaster_email' => 'Kontakt-E-Mail in einigen Fehlermeldungen', 'website_analytics' => 'Analytik-JavaScript-Code', 'website_callback_url' => 'Verhindere Zahlungs-Callback-Fehler durch DNS-Vergiftung', @@ -717,97 +587,247 @@ return [ 'website_name' => 'Webseitenname in E-Mails', 'website_security_code' => 'Erfordere Sicherheitscode zum Zugriff auf die Seite, wenn gesetzt', 'website_url' => 'Hauptdomäne für Links', - 'web_api_url' => 'Z.B. '.config('app.url'), 'wechat_aid' => 'App-Verwaltung -> AgentId', 'wechat_cid' => 'Erhalte von Unternehmensinfo', 'wechat_encodingAESKey' => 'App-Verwaltung -> App-Einstellungen -> EncodingAESKey', 'wechat_secret' => 'App-Geheimnis (möglicherweise muss die Unternehmens-WeChat-App heruntergeladen werden, um es anzuzeigen)', 'wechat_token' => 'App-Einstellungen -> TOKEN, Callback-URL: :url', ], - 'placeholder' => [ - 'default_url' => 'Standard ist :url', - 'server_chan_key' => 'Fülle ServerChan SCKEY aus und klicke auf Aktualisieren', - 'pushDeer_key' => 'Fülle PushDeer Push Key aus und klicke auf Aktualisieren', - 'iYuu_token' => 'Fülle IYUU Token aus und klicke auf Aktualisieren', - 'bark_key' => 'Fülle Bark Geräteschlüssel aus und klicke auf Aktualisieren', - 'telegram_token' => 'Fülle Telegram Token aus und klicke auf Aktualisieren', - 'pushplus_token' => 'Bitte bei ServerChan beantragen', - 'dingTalk_access_token' => 'Zugriffstoken des benutzerdefinierten Bots', - 'dingTalk_secret' => 'Geheimnis des benutzerdefinierten Bots nach Signierung', - 'wechat_aid' => 'WeChat Enterprise App AID', - 'wechat_cid' => 'Fülle WeChat CID aus und klicke auf Aktualisieren', - 'wechat_secret' => 'Geheimnis der WeChat Enterprise App', - 'tg_chat_token' => 'Bitte bei Telegram beantragen', - 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'iYuu_token' => '[IYUU] Token', + 'invite_num' => 'Standard-Einladungen', + 'is_AliPay' => 'Alipay', + 'is_QQPay' => 'QQ Pay', + 'is_WeChatPay' => 'WeChat Pay', + 'is_activate_account' => 'Kontoaktivierung', + 'is_ban_status' => 'Ablauf-Sperre', + 'is_captcha' => 'Captcha', + 'is_checkin' => 'Check-in-Belohnung', + 'is_clear_log' => 'Protokolle bereinigen', + 'is_custom_subscribe' => 'Erweitertes Abonnement', + 'is_email_filtering' => 'E-Mail-Filterung für Benutzerregistrierung', + 'is_forbid_robot' => 'Bots verbieten', + 'is_free_code' => 'Kostenlose Einladungscodes', + 'is_invite_register' => 'Einladung zur Registrierung', + 'is_otherPay' => 'Benutzerdefinierte Zahlung', + 'is_rand_port' => 'Zufälliger Port', + 'is_register' => 'Registrierung', + 'is_subscribe_ban' => 'Abonnement-Sperre', + 'is_traffic_ban' => 'Datenmissbrauchs-Sperre', + 'maintenance_content' => 'Wartungsmitteilung', + 'maintenance_mode' => 'Wartungsmodus', + 'maintenance_time' => 'Wartungsende', + 'min_port' => 'Portrange', + 'min_rand_traffic' => 'Datenrange', + 'node_blocked_notification' => 'Benachrichtigung über Knotenblockierung', + 'node_daily_notification' => 'Täglicher Knotenbericht', + 'node_offline_notification' => 'Benachrichtigung über Knotenoffline', + 'node_renewal_notification' => 'Knotenerneuerungsbenachrichtigung', + 'notification' => [ + 'channel' => [ + 'bark' => 'Bark', + 'dingtalk' => 'DingTalk', + 'email' => 'E-Mail', + 'iyuu' => 'IYUU', + 'pushdeer' => 'PushDeer', + 'pushplus' => 'PushPlus', + 'serverchan' => 'ServerChan', + 'site' => 'Seiten-Popup', + 'telegram' => 'Telegram', + 'tg_chat' => 'TG Chat', + 'wechat' => 'Enterprise WeChat', + ], + 'send_test' => 'Testnachricht senden', + 'test' => [ + 'content' => 'Testinhalt', + 'success' => 'Erfolgreich gesendet. Bitte prüfen Sie, ob die Push-Benachrichtigung auf Ihrem Handy eingegangen ist.', + 'title' => 'Dies ist ein Testtitel', + 'unknown_channel' => 'Unbekannter Kanal', + ], ], + 'oauth_path' => 'OAuth-Plattformen', + 'offline_check_times' => 'Offline-Benachrichtigungen', + 'params_required' => 'Bitte vervollständigen Sie zunächst die erforderlichen Parameter für dieses :attribute!', + 'password_reset_notification' => 'Benachrichtigung über Passwortzurücksetzung', + 'paybeaver_app_id' => '[PayBeaver] App ID', + 'paybeaver_app_secret' => '[PayBeaver] App-Geheimnis', + 'payjs_key' => '[PayJs] Schlüssel', + 'payjs_mch_id' => '[PayJs] Händler-ID', 'payment' => [ 'attribute' => 'Zahlungsgateway', 'channel' => [ 'alipay' => 'Alipay F2F', 'codepay' => 'CodePay', 'epay' => 'ePay', + 'manual' => 'Manuelle Zahlung', + 'paybeaver' => 'PayBeaver', 'payjs' => 'PayJs', 'paypal' => 'PayPal', 'stripe' => 'Stripe', - 'paybeaver' => 'PayBeaver', 'theadpay' => 'THeadPay', - 'manual' => 'Manuelle Zahlung', ], 'hint' => [ 'alipay' => 'Diese Funktion erfordert eine Bewerbung auf der Ant Financial Services Open Platform für Berechtigungen und Anwendungen', 'codepay' => 'Bitte bei CodePay ein Konto beantragen, dann die Software herunterladen und einrichten', + 'manual' => 'Nach dem Setzen und Auswählen des Gateways wird es auf der Benutzerseite angezeigt', + 'paybeaver' => 'Bitte bei PayBeaver ein Konto beantragen', 'payjs' => 'Bitte bei PayJs ein Konto beantragen', 'paypal' => 'Melden Sie sich mit Ihrem Händlerkonto bei der API-Zugangsseite an, stimmen Sie zu und erhalten Sie die Setup-Informationen', - 'paybeaver' => 'Bitte bei PayBeaver ein Konto beantragen', 'theadpay' => 'Bitte bei THeadPay ein Konto beantragen', - 'manual' => 'Nach dem Setzen und Auswählen des Gateways wird es auf der Benutzerseite angezeigt', ], ], - 'notification' => [ - 'channel' => [ - 'telegram' => 'Telegram', - 'wechat' => 'Enterprise WeChat', - 'dingtalk' => 'DingTalk', - 'email' => 'E-Mail', - 'bark' => 'Bark', - 'serverchan' => 'ServerChan', - 'pushdeer' => 'PushDeer', - 'pushplus' => 'PushPlus', - 'iyuu' => 'IYUU', - 'tg_chat' => 'TG Chat', - 'site' => 'Seiten-Popup', - ], - 'send_test' => 'Testnachricht senden', + 'payment_confirm_notification' => 'Benachrichtigung über Zahlungsbestätigung', + 'payment_received_notification' => 'Benachrichtigung über Zahlungseingang', + 'paypal_app_id' => 'App ID', + 'paypal_client_id' => 'Client-ID', + 'paypal_client_secret' => 'Client-Geheimnis', + 'placeholder' => [ + 'bark_key' => 'Fülle Bark Geräteschlüssel aus und klicke auf Aktualisieren', + 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'default_url' => 'Standard ist :url', + 'dingTalk_access_token' => 'Zugriffstoken des benutzerdefinierten Bots', + 'dingTalk_secret' => 'Geheimnis des benutzerdefinierten Bots nach Signierung', + 'iYuu_token' => 'Fülle IYUU Token aus und klicke auf Aktualisieren', + 'pushDeer_key' => 'Fülle PushDeer Push Key aus und klicke auf Aktualisieren', + 'pushplus_token' => 'Bitte bei ServerChan beantragen', + 'server_chan_key' => 'Fülle ServerChan SCKEY aus und klicke auf Aktualisieren', + 'telegram_token' => 'Fülle Telegram Token aus und klicke auf Aktualisieren', + 'tg_chat_token' => 'Bitte bei Telegram beantragen', + 'wechat_aid' => 'WeChat Enterprise App AID', + 'wechat_cid' => 'Fülle WeChat CID aus und klicke auf Aktualisieren', + 'wechat_secret' => 'Geheimnis der WeChat Enterprise App', ], - 'forbid' => [ - 'mainland' => 'Zugriff aus dem chinesischen Festland verbieten', - 'china' => 'Zugriff aus China verbieten', - 'oversea' => 'Übersee-Zugriff verbieten', + 'pushDeer_key' => '[PushDeer] Schlüssel', + 'pushplus_token' => '[PushPlus] Token', + 'rand_subscribe' => 'Zufälliges Abonnement', + 'redirect_url' => 'Weiterleitungs-URL', + 'referral' => [ + 'loop' => 'Dauerhafter Rabatt', + 'once' => 'Erstkaufrabatt', ], + 'referral_money' => 'Minimale Auszahlungssumme', + 'referral_percent' => 'Rabattprozentsatz', + 'referral_status' => 'Affiliate', + 'referral_traffic' => 'Registrierungsbonus', + 'referral_type' => 'Rabattart', + 'register_ip_limit' => 'Registrierungs-IP-Beschränkung', + 'reset_password_times' => 'Passwortzurücksetzungsversuche', + 'reset_traffic' => 'Datenrücksetzung', + 'server_chan_key' => '[ServerChan] SCKEY', + 'standard_currency' => 'Primärwährung', + 'stripe_public_key' => 'Öffentlicher Schlüssel', + 'stripe_secret_key' => 'Geheimer Schlüssel', + 'stripe_signing_secret' => 'Webhook-Geheimnis', + 'subject_name' => 'Benutzerdefinierter Produktname', + 'subscribe_ban_times' => 'Abonnement-Beschränkung', + 'subscribe_domain' => 'Abonnement-URL', + 'subscribe_max' => 'Maximale Abonnement-Knoten', + 'telegram_token' => 'Telegram-Token', + 'tg_chat_token' => 'TG Chat Token', + 'theadpay_key' => '[THeadPay] Schlüssel', + 'theadpay_mchid' => '[THeadPay] Händler-ID', + 'theadpay_url' => '[THeadPay] URL', + 'ticket_closed_notification' => 'Benachrichtigung über Ticket-Schließung', + 'ticket_created_notification' => 'Benachrichtigung über Ticketerstellung', + 'ticket_replied_notification' => 'Benachrichtigung über Ticketantwort', + 'traffic_ban_time' => 'Sperrdauer', + 'traffic_ban_value' => 'Datenmissbrauchsgrenze', + 'traffic_limit_time' => 'Check-in-Intervall', + 'traffic_warning_percent' => 'Datenverbrauchswarnung', + 'trojan_license' => 'Trojan-Lizenz', + 'user_invite_days' => '[Benutzer] Einladungslaufzeit', 'username' => [ + 'any' => 'Beliebiger Benutzername', 'email' => 'E-Mail', 'mobile' => 'Telefonnummer', - 'any' => 'Beliebiger Benutzername', ], - 'active_account' => [ - 'before' => 'Aktivierung vor der Registrierung', - 'after' => 'Aktivierung nach der Registrierung', + 'username_type' => 'Kontobenutzernamensart', + 'v2ray_license' => 'V2Ray-Lizenz', + 'v2ray_tls_provider' => 'V2Ray TLS-Konfiguration', + 'web_api_url' => 'API-Domäne', + 'webmaster_email' => 'Admin-E-Mail', + 'website_analytics' => 'Analytik-Code', + 'website_callback_url' => 'Zahlungs-Callback-Domain', + 'website_customer_service' => 'Kundendienst-Code', + 'website_home_logo' => 'Startseiten-Logo', + 'website_logo' => 'Internes Seiten-Logo', + 'website_name' => 'Webseitenname', + 'website_security_code' => 'Sicherheitscode', + 'website_url' => 'Webseitendomäne', + 'wechat_aid' => 'WeChat AID', + 'wechat_cid' => 'WeChat CID', + 'wechat_encodingAESKey' => 'WeChat Encoding-Schlüssel', + 'wechat_qrcode' => 'WeChat QR-Code', + 'wechat_secret' => 'WeChat Geheimnis', + 'wechat_token' => 'WeChat Token', + ], + 'system_generate' => 'Systemgeneriert', + 'ticket' => [ + 'close_confirm' => 'Möchten Sie dieses Ticket schließen?', + 'counts' => 'Insgesamt :num Tickets', + 'error' => 'Unbekannter Fehler! Bitte überprüfen Sie die Protokolle', + 'inviter_info' => 'Einlader-Informationen', + 'self_send' => 'Sie können kein Ticket für sich selbst erstellen!', + 'send_to' => 'Bitte füllen Sie die Angaben des Zielbenutzers aus', + 'title' => 'Tickets', + 'user_info' => 'Benutzerinformationen', + ], + 'times' => 'Zeiten', + 'tools' => [ + 'analysis' => [ + 'file_missing' => ':file_name existiert nicht. Bitte erstellen Sie die Datei zuerst.', + 'not_enough' => 'Weniger als 15.000 Aufzeichnungen, Analyse nicht möglich', + 'req_url' => 'Zuletzt angeforderte URL-Aufzeichnungen', + 'title' => 'SSR-Protokollanalyse Für einen einzelnen Knoten', ], - 'captcha' => [ - 'standard' => 'Standard', - 'geetest' => 'Geetest', - 'recaptcha' => 'Google ReCaptcha', - 'hcaptcha' => 'hCaptcha', - 'turnstile' => 'Turnstile', + 'convert' => [ + 'content_placeholder' => 'Bitte füllen Sie die zu konvertierenden Konfigurationsinformationen aus.', + 'file_missing' => 'Datei nicht gefunden. Bitte überprüfen Sie die Verzeichnisberechtigungen.', + 'missing_error' => 'Konvertierung fehlgeschlagen: Das Konfigurationsinfo fehlt das Feld [port_password] oder dieses Feld ist leer.', + 'params_unknown' => 'Parameterfehler', + 'title' => 'Formatkonvertierung SS zu SSR', ], - 'referral' => [ - 'once' => 'Erstkaufrabatt', - 'loop' => 'Dauerhafter Rabatt', + 'decompile' => [ + 'attribute' => 'Umgekehrte Parsing-Konfigurationslink', + 'content_placeholder' => 'Bitte füllen Sie die zu dekompilierenden ShadowsocksR-Links aus, getrennt durch Zeilenumbrüche.', + 'title' => 'Dekompilieren Konfigurationsinformationen', + ], + 'import' => [ + 'file_error' => 'Ein unbekannter Fehler ist aufgetreten. Bitte laden Sie die Datei erneut hoch.', + 'file_required' => 'Bitte wählen Sie eine Datei zum Hochladen aus', + 'file_type_error' => 'Nur :type-Dateien sind zum Hochladen erlaubt.', + 'format_error' => 'Fehler bei der Formatierung des Inhalts. Bitte laden Sie eine :type-Datei hoch, die dem angegebenen Format entspricht.', ], ], - 'set_to' => 'Setze als :attribute', - 'minute' => 'Minuten', - 'query' => 'Abfrage', - 'optional' => 'Optional', - 'require' => 'Erforderlich', + 'unselected_hint' => 'Zu verteilende Regeln können hier durchsucht werden', + 'user' => [ + 'admin_deletion' => 'Systemadministratoren können nicht gelöscht werden', + 'bulk_account_quantity' => 'Anzahl der in großen Mengen generierten Konten', + 'connection_test' => 'Verbindungstest', + 'counts' => 'Insgesamt :num Konten', + 'group' => [ + 'counts' => 'Insgesamt :num Gruppen', + 'name' => 'Gruppenname', + 'title' => 'Benutzergruppensteuerung (Ein Knoten kann in mehreren Gruppen sein, aber der Benutzer kann nur einer Gruppe angehören; für Benutzer sichtbare/verfügbare Knoten hat die Gruppe Vorrang vor der Ebene)', + ], + 'info' => [ + 'account' => 'Kontoinformationen', + 'expired_date_hint' => 'Leer lassen für eine Standardgültigkeit von einem Jahr', + 'proxy' => 'Proxy-Informationen', + 'recharge_placeholder' => 'Wenn negativ, wird das Guthaben abgezogen', + 'reset_date_hint' => 'Nächstes Datum für Datenrücksetzung', + 'switch' => 'Identität wechseln', + 'uuid_hint' => 'UUID für V2Ray', + ], + 'online_monitor' => 'Online-Überwachung', + 'proxies_config' => 'Verbindungsinformationen für :username', + 'proxy_info' => 'Konfigurationsinformationen', + 'reset_confirm' => [0 => 'Möchten Sie den Datenverkehr von [', 1 => '] zurücksetzen?'], + 'reset_traffic' => 'Daten zurücksetzen', + 'traffic_monitor' => 'Datenverkehrsstatistik', + 'update_help' => 'Aktualisierung erfolgreich, zurückkehren?', + 'user_view' => 'Zur Benutzeransicht wechseln', + ], + 'user_dashboard' => 'Benutzer-Dashboard', + 'yes' => 'Ja', + 'zero_unlimited_hint' => '0 oder leer für unbegrenzt', ]; diff --git a/resources/lang/de/auth.php b/resources/lang/de/auth.php index ec43f150..9372c09c 100644 --- a/resources/lang/de/auth.php +++ b/resources/lang/de/auth.php @@ -40,27 +40,18 @@ return [ ], 'failed' => 'Diese Kombination aus Zugangsdaten wurde nicht in unserer Datenbank gefunden.', 'invite' => [ - 'attribute' => 'Einladungscode', - 'error' => [ - 'unavailable' => 'Ungültiger Einladungscode, bitte erneut versuchen.', - ], 'get' => 'Einladungscode erhalten', 'not_required' => 'Kein Einladungscode erforderlich, Sie können sich direkt registrieren!', + 'unavailable' => 'Ungültiger Einladungscode, bitte erneut versuchen.', ], 'login' => 'Anmelden', 'logout' => 'Abmelden', 'maintenance' => 'Wartung', 'maintenance_tip' => 'In Wartung', 'oauth' => [ - 'bind_failed' => 'Bindung fehlgeschlagen', - 'bind_success' => 'Bindung erfolgreich', 'login_failed' => 'Drittanbieter-Anmeldung fehlgeschlagen!', - 'rebind_success' => 'Neubindung erfolgreich', 'register' => 'Schnellregistrierung', - 'register_failed' => 'Registrierung fehlgeschlagen', 'registered' => 'Bereits registriert, bitte direkt anmelden.', - 'unbind_failed' => 'Entbindung fehlgeschlagen', - 'unbind_success' => 'Entbindung erfolgreich', ], 'one-click_login' => 'Ein-Klick-Anmeldung', 'optional' => 'Optional', @@ -73,7 +64,6 @@ return [ 'error' => [ 'demo' => 'Ändern des Administratorpassworts im Demomodus nicht möglich.', 'disabled' => 'Passwortzurücksetzung deaktiviert, bitte kontaktieren Sie :email für Unterstützung.', - 'failed' => 'Passwortzurücksetzung fehlgeschlagen.', 'same' => 'Das neue Passwort darf nicht mit dem alten übereinstimmen, bitte erneut eingeben.', 'throttle' => 'Sie können das Passwort nur :time Mal in 24 Stunden zurücksetzen, bitte nicht zu häufig operieren.', 'wrong' => 'Falsches Passwort, bitte erneut versuchen.', @@ -91,7 +81,6 @@ return [ ], 'failed' => 'Registrierung fehlgeschlagen, bitte später erneut versuchen.', 'promotion' => 'Noch kein Konto? Bitte gehen Sie zu ', - 'success' => 'Erfolgreich registriert', ], 'remember_me' => 'Angemeldet bleiben', 'request' => 'Anfordern', diff --git a/resources/lang/de/common.php b/resources/lang/de/common.php index 2102a960..11dc3f4d 100644 --- a/resources/lang/de/common.php +++ b/resources/lang/de/common.php @@ -3,141 +3,149 @@ declare(strict_types=1); return [ - 'hour' => '{1} Stunde|{2} Uhr', 'account' => 'Konto', + 'action' => 'Aktion', + 'active_item' => 'Aktivieren :attribute', + 'add' => 'Hinzufügen', + 'advance' => 'Fortgeschritten', + 'all' => 'Alle', + 'applied' => ':attribute angewendet', + 'apply' => 'Anwenden', 'available_date' => 'Gültigkeitszeitraum', - 'created_at' => 'Erstellungsdatum', - 'expired_at' => 'Ablaufdatum', - 'updated_at' => 'Zuletzt aktualisiert', - 'latest_at' => 'Letzte Aktivität', + 'avatar' => 'Avatar', 'back' => 'Zurück', 'back_to' => 'Zurück zu :page', + 'bark' => [ + 'custom' => 'Benutzerdefinierte Informationen', + 'node_status' => 'Knotenzustand', + ], 'cancel' => 'Abbrechen', + 'change' => 'Ändern', 'close' => 'Schließen', 'close_item' => 'Schließen :attribute', 'confirm' => 'Bestätigen', 'continue' => 'Fortsetzen', - 'open' => 'Öffnen', - 'send' => 'Senden', - 'view' => 'Ansehen', - 'reset' => 'Zurücksetzen', + 'convert' => 'Konvertieren', 'copy' => [ 'attribute' => 'Kopieren', - 'success' => 'Erfolgreich kopiert', 'failed' => 'Kopieren fehlgeschlagen, bitte manuell kopieren', + 'success' => 'Erfolgreich kopiert', ], - 'add' => 'Hinzufügen', - 'free' => 'Kostenlos', - 'change' => 'Ändern', - 'submit' => 'Absenden', - 'submit_item' => 'Absenden :attribute', - 'generate' => 'Erzeugen', - 'generate_item' => 'Erzeugen :attribute', - 'to_safari' => [0 => 'Klicken Sie auf die obere rechte Ecke', 1 => ', dann wählen Sie', 2 => 'In Safari öffnen', 3 => ' um diese Seite korrekt anzuzeigen!'], - 'update_browser' => [0 => 'Sie verwenden einen ', 1 => 'veralteten', 2 => ' Browser. Bitte', 3 => 'aktualisieren Sie Ihren Browser', 4 => ' für das beste Erlebnis'], - 'apply' => 'Anwenden', - 'avatar' => 'Avatar', + 'create' => 'Erstellen', + 'created_at' => 'Erstellungsdatum', 'customize' => 'Anpassen', - 'all' => 'Alle', - 'default' => 'Standard', - 'download' => 'Herunterladen', - 'goto' => 'Gehe zu', - 'warning' => 'Warnung', - 'success' => 'Erfolg', - 'success_item' => ':attribute erfolgreich', - 'failed' => 'Fehlgeschlagen', - 'failed_item' => ':attribute fehlgeschlagen', - 'update' => 'Aktualisieren', - 'update_action' => 'Aktualisieren :action', - 'none' => 'Keine', - 'new' => 'Neu', - 'sorry' => 'Entschuldigung', - 'applied' => ':attribute angewendet', - 'active_item' => 'Aktivieren :attribute', - 'error' => 'Fehler', - 'toggle' => 'Umschalten', - 'toggle_action' => 'Umschalten :action', - 'request_url' => 'Anfrage-URL', - 'function' => [ - 'navigation' => 'Navigation', - 'menubar' => 'Menüleiste', - 'fullscreen' => 'Vollbild', - ], 'days' => [ 'attribute' => '{1} Tag|{2} Tage', + 'next' => 'Nächster Tag', 'weekend' => 'Wochenende', 'work' => 'Wochentag', - 'next' => 'Nächster Tag', ], - 'qrcode' => ':attribute QR-Code', + 'default' => 'Standard', + 'delete' => 'Löschen', 'deleted' => 'Gelöscht', 'deleted_item' => ':attribute gelöscht', - 'print' => 'Drucken', - 'unlimited' => 'Unbegrenzt', - 'payment' => [ - 'credit' => 'Guthaben', - 'alipay' => 'Alipay', - 'qq' => 'QQ Wallet', - 'wechat' => 'WeChat Pay', - 'crypto' => 'Kryptowährung', - 'manual' => 'Manuelle Zahlung', - 'status' => [ - 'wait' => 'Warten auf Zahlung', - ], + 'developing' => 'In Entwicklung! Bleiben Sie dran', + 'download' => 'Herunterladen', + 'edit' => 'Bearbeiten', + 'error' => 'Fehler', + 'error_action_item' => ':action:attribute-Fehler', + 'error_item' => ':attribute-Fehler', + 'exists_error' => 'Unter :attribute gibt es verknüpfte Konten. Bitte trennen Sie diese zuerst!', + 'expired_at' => 'Ablaufdatum', + 'export' => 'Exportieren', + 'failed' => 'Fehlgeschlagen', + 'failed_action_item' => ':action:attribute fehlgeschlagen', + 'failed_item' => ':attribute fehlgeschlagen', + 'free' => 'Kostenlos', + 'function' => [ + 'fullscreen' => 'Vollbild', + 'menubar' => 'Menüleiste', + 'navigation' => 'Navigation', ], + 'generate' => 'Erzeugen', + 'generate_item' => 'Erzeugen :attribute', + 'goto' => 'Gehe zu', + 'hour' => '{1} Stunde|{2} Uhr', + 'import' => 'Importieren', + 'latest_at' => 'Letzte Aktivität', + 'more' => 'Mehr', + 'new' => 'Neu', + 'none' => 'Keine', + 'open' => 'Öffnen', + 'or' => 'oder', 'order' => [ 'status' => [ 'canceled' => 'Storniert', 'completed' => 'Abgeschlossen', - 'prepaid' => 'Vorausbezahlt', 'ongoing' => 'Laufend', + 'prepaid' => 'Vorausbezahlt', 'review' => 'Zur Überprüfung', ], ], + 'payment' => [ + 'alipay' => 'Alipay', + 'credit' => 'Guthaben', + 'crypto' => 'Kryptowährung', + 'manual' => 'Manuelle Zahlung', + 'qq' => 'QQ Wallet', + 'wechat' => 'WeChat Pay', + ], + 'print' => 'Drucken', + 'qrcode' => ':attribute QR-Code', + 'random_generate' => 'Leer lassen, um zufällig zu generieren', 'recommend' => 'Empfehlen', - 'advance' => 'Fortgeschritten', - 'action' => 'Aktion', + 'request' => 'Anfrage', + 'request_failed' => 'Anfrage fehlgeschlagen, bitte erneut versuchen', + 'request_url' => 'Anfrage-URL', + 'reset' => 'Zurücksetzen', 'search' => 'Suchen', - 'edit' => 'Bearbeiten', - 'delete' => 'Löschen', + 'send' => 'Senden', + 'sorry' => 'Entschuldigung', 'status' => [ + 'applying' => 'Anwendung läuft', 'attribute' => 'Status', - 'inactive' => 'Inaktiv', - 'disabled' => 'Deaktiviert', + 'available' => 'Verfügbar', 'banned' => 'Gesperrt', - 'normal' => 'Normal', + 'closed' => 'Geschlossen', + 'disabled' => 'Deaktiviert', 'enabled' => 'Aktiviert', 'expire' => 'Abgelaufen', + 'inactive' => 'Inaktiv', 'limited' => 'Begrenzt', - 'run_out' => 'Datenverbrauch aufgebraucht', - 'unused' => 'Nicht verwendet', - 'used' => 'Verwendet', - 'closed' => 'Geschlossen', - 'applying' => 'Anwendung läuft', - 'withdrawn' => 'Abgehoben', - 'unwithdrawn' => 'Nicht abgehoben', - 'reply' => 'Beantwortet', + 'normal' => 'Normal', + 'paid' => 'Bezahlt', + 'pass' => 'Bestanden', + 'payment_pending' => 'Zahlung ausstehend', 'pending' => 'Ausstehend', - 'unknown' => 'Unbekannt', - 'available' => 'Verfügbar', + 'pending_dispatch' => 'Ausstehende Lieferung', 'reject' => 'Ablehnen', 'rejected' => 'Abgelehnt', + 'reply' => 'Beantwortet', 'review' => 'Zur Überprüfung', 'reviewed' => 'Überprüft', - 'paid' => 'Bezahlt', - 'payment_pending' => 'Zahlung ausstehend', - 'pass' => 'Bestanden', + 'run_out' => 'Datenverbrauch aufgebraucht', 'send_to_credit' => 'Zum Guthaben hinzufügen', - 'waiting_tobe_send' => 'Warten auf Versand', + 'unknown' => 'Unbekannt', + 'unused' => 'Nicht verwendet', + 'used' => 'Verwendet', + 'withdrawal_pending' => 'Nicht abgehoben', + 'withdrawn' => 'Abgehoben', ], 'stay_unchanged' => 'Leer lassen, um unverändert zu bleiben', - 'random_generate' => 'Leer lassen, um zufällig zu generieren', - 'request_failed' => 'Anfrage fehlgeschlagen, bitte erneut versuchen', - 'convert' => 'Konvertieren', - 'import' => 'Importieren', - 'or' => 'oder', - 'more' => 'Mehr', + 'storage_logo' => 'Logo-Speicher', + 'store' => 'Speicher', + 'submit' => 'Absenden', + 'success' => 'Erfolg', + 'success_action_item' => ':action:attribute erfolgreich', + 'success_item' => ':attribute erfolgreich', 'to' => 'zu', 'to_be_send' => 'Zu senden', - 'developing' => 'In Entwicklung! Bleiben Sie dran', + 'to_safari' => 'Klicken Sie auf das -Symbol in der oberen rechten Ecke und wählen Sie "In Safari Safari öffnen", um unsere Website ordnungsgemäß zu besuchen!', + 'toggle' => 'Umschalten', + 'toggle_action' => 'Umschalten :action', + 'unlimited' => 'Unbegrenzt', + 'update' => 'Aktualisieren', + 'updated_at' => 'Zuletzt aktualisiert', + 'view' => 'Ansehen', + 'warning' => 'Warnung', ]; diff --git a/resources/lang/de/errors.php b/resources/lang/de/errors.php index fb877a2e..3fff6d56 100644 --- a/resources/lang/de/errors.php +++ b/resources/lang/de/errors.php @@ -8,29 +8,29 @@ return [ 'bots' => 'Bot-Zugriff erkannt, Zugriff verweigert', 'china' => 'China-IP oder Proxy-Zugriff erkannt, Zugriff verweigert', 'oversea' => 'Übersee-IP oder Proxy-Zugriff erkannt, Zugriff verweigert', - 'unknown' => 'Unbekannter verbotener Zugriffsmodus! Bitte ändern Sie den [Zugriffsbeschränkung] in den Systemeinstellungen!', 'redirect' => '(:ip :url) wurde beim Zugriff über einen Abonnement-Link erkannt, erzwungene Weiterleitung.', + 'unknown' => 'Unbekannter verbotener Zugriffsmodus! Bitte ändern Sie den [Zugriffsbeschränkung] in den Systemeinstellungen!', ], + 'get_ip' => 'Fehler beim Abrufen der IP-Informationen', 'log' => 'Protokoll', 'refresh' => 'Aktualisieren', 'refresh_page' => 'Bitte aktualisieren Sie die Seite und versuchen Sie es erneut', 'report' => 'Der Fehler trug einen Bericht: ', - 'safe_enter' => 'Sicherer Eingang', 'safe_code' => 'Bitte geben Sie den Sicherheitscode ein', + 'safe_enter' => 'Sicherer Eingang', + 'subscribe' => [ + 'banned_until' => 'Konto bis :time gesperrt, bitte warten Sie auf die Freischaltung!', + 'expired' => 'Konto abgelaufen! Bitte erneuern Sie Ihr Abonnement!', + 'none' => 'Keine verfügbaren Knoten', + 'out' => 'KEINE DATEN MEHR! Bitte kaufen Sie mehr oder setzen Sie die Daten zurück!', + 'question' => 'Konto-Probleme!? Besuchen Sie die Website für Details', + 'sub_banned' => 'Abonnement gesperrt! Besuchen Sie die Website für Details', + 'unknown' => 'Ungültiger Abonnementlink! Bitte holen Sie sich einen neuen!', + 'user' => 'Ungültige URL, Konto existiert nicht!', + 'user_disabled' => 'Konto deaktiviert! Kontaktieren Sie den Support!', + ], 'title' => '⚠️ Fehler ausgelöst', 'unsafe_enter' => 'Unsicherer Eingang', 'visit' => 'Bitte besuchen Sie', 'whoops' => 'Hoppla!', - 'get_ip' => 'Fehler beim Abrufen der IP-Informationen', - 'subscribe' => [ - 'unknown' => 'Ungültiger Abonnementlink! Bitte holen Sie sich einen neuen!', - 'sub_banned' => 'Abonnement gesperrt! Besuchen Sie die Website für Details', - 'user' => 'Ungültige URL, Konto existiert nicht!', - 'user_disabled' => 'Konto deaktiviert! Kontaktieren Sie den Support!', - 'banned_until' => 'Konto bis :time gesperrt, bitte warten Sie auf die Freischaltung!', - 'out' => 'KEINE DATEN MEHR! Bitte kaufen Sie mehr oder setzen Sie die Daten zurück!', - 'expired' => 'Konto abgelaufen! Bitte erneuern Sie Ihr Abonnement!', - 'question' => 'Konto-Probleme!? Besuchen Sie die Website für Details', - 'none' => 'Keine verfügbaren Knoten', - ], ]; diff --git a/resources/lang/de/model.php b/resources/lang/de/model.php index 19182594..41050b3b 100644 --- a/resources/lang/de/model.php +++ b/resources/lang/de/model.php @@ -3,105 +3,114 @@ declare(strict_types=1); return [ - 'user' => [ - 'id' => 'Benutzer-ID', - 'attribute' => 'Benutzer', - 'nickname' => 'Spitzname', - 'username' => 'Benutzername', - 'password' => 'Passwort', - 'credit' => 'Guthaben', - 'invite_num' => 'Verfügbare Einladungen', - 'reset_date' => 'Datenrückstellungsdatum', - 'port' => 'Port', - 'traffic_used' => 'Verwendete Daten', - 'service' => 'Proxy-Dienst', - 'group' => 'Gruppe', - 'account_status' => 'Kontostatus', - 'proxy_status' => 'Proxy-Status', - 'expired_date' => 'Ablaufdatum', - 'role' => 'Rolle', - 'wechat' => 'WeChat', - 'qq' => 'QQ', - 'remark' => 'Bemerkung', - 'uuid' => 'VMess UUID', - 'proxy_passwd' => 'Proxy-Passwort', - 'proxy_method' => 'Verschlüsselung', - 'usable_traffic' => 'Verfügbare Daten', - 'proxy_protocol' => 'Protokoll', - 'proxy_obfs' => 'Verschleierung', - 'speed_limit' => 'Geschwindigkeitsbegrenzung', - 'inviter' => 'Einlader', - 'created_date' => 'Registrierungsdatum', + 'aff' => [ + 'amount' => 'Bestellbetrag', + 'commission' => 'Provision', + 'created_at' => 'Bestellt am', + 'invitee' => 'Käufer', + 'updated_at' => 'Bearbeitet am', + ], + 'article' => [ + 'attribute' => 'Artikel', + 'category' => 'Kategorie', + 'created_at' => 'Veröffentlicht am', + 'language' => 'Sprache', + 'logo' => 'Cover', + 'updated_at' => 'Aktualisiert am', ], 'common' => [ - 'extend' => 'Erweiterte Informationen', - 'sort' => 'Sortieren', 'description' => 'Beschreibung', - 'type' => 'Typ', + 'extend' => 'Erweiterte Informationen', 'level' => 'Stufe', + 'sort' => 'Sortieren', + 'type' => 'Typ', ], 'country' => [ 'code' => 'Ländercode', 'icon' => 'Flagge', 'name' => 'Ländername', ], - 'subscribe' => [ - 'code' => 'Abonnementcode', - 'req_times' => 'Anfragenanzahl', - 'updated_at' => 'Letzte Anfrage', - 'ban_time' => 'Sperrzeit', - 'ban_desc' => 'Sperrgrund', - 'req_ip' => 'Anfrage-IP', - 'req_header' => 'Anfrage-Header', + 'coupon' => [ + 'attribute' => 'Gutschein', + 'groups' => 'Gruppenbeschränkung', + 'levels' => 'Stufenbeschränkung', + 'logo' => 'Logo', + 'minimum' => 'Mindestbestellwert', + 'name' => 'Name', + 'newbie' => 'Nur für neue Benutzer', + 'num' => 'Anzahl', + 'priority' => 'Priorität', + 'services_blacklist' => 'Blacklist-Produkte', + 'services_whitelist' => 'Whitelist-Produkte', + 'sn' => 'Code', + 'usable_times' => 'Verwendungsbeschränkung', + 'used' => 'Persönliche Begrenzung', + 'users_blacklist' => 'Blacklist-Benutzer', + 'users_whitelist' => 'Whitelist-Benutzer', + 'value' => 'Wert', ], - 'oauth' => [ - 'type' => 'Kanal', - 'identifier' => 'Kennung', + 'goods' => [ + 'attribute' => 'Produkt', + 'available_date' => 'Gültigkeitszeitraum', + 'category' => 'Kategorie', + 'color' => 'Farbe', + 'hot' => 'Bestseller', + 'info' => 'Benutzerdefinierte Informationen', + 'invite_num' => 'Bonus-Einladungen', + 'limit_num' => 'Kaufbegrenzung', + 'logo' => 'Logo', + 'name' => 'Name', + 'period' => 'Reset-Zyklus', + 'price' => 'Preis', + 'renew' => 'Datenverlängerungspreis', + 'traffic' => 'Datenvolumen', + 'user_limit' => 'Benutzergeschwindigkeitsbegrenzung', ], - 'user_group' => [ - 'attribute' => 'Benutzergruppe', - 'name' => 'Gruppenname', - 'nodes' => 'Knoten', + 'ip' => [ + 'info' => 'Standort', + 'network_type' => 'Netzwerktyp', ], 'node' => [ 'attribute' => 'Knoten', - 'id' => 'Knoten-ID', - 'name' => 'Name', - 'domain' => 'Domain', - 'static' => 'Status', - 'online_user' => 'Online-Benutzer', + 'client_limit' => 'Gerätebegrenzung', + 'country' => 'Land', 'data_consume' => 'Datenverbrauch', 'data_rate' => 'Datenrate', 'ddns' => 'DDNS', + 'detection' => 'Blockierungserkennung', + 'display' => 'Anzeige & Abonnement', + 'domain' => 'Domain', + 'id' => 'Knoten-ID', 'ipv4' => 'IPv4', 'ipv6' => 'IPv6', - 'push_port' => 'Push-Port', - 'rule_group' => 'Regelgruppe', - 'traffic_limit' => 'Geschwindigkeitsbegrenzung', - 'client_limit' => 'Gerätebegrenzung', 'label' => 'Label', - 'country' => 'Land', - 'udp' => 'UDP', - 'display' => 'Anzeige & Abonnement', - 'detection' => 'Blockierungserkennung', 'method' => 'Verschlüsselung', - 'protocol' => 'Protokoll', - 'protocol_param' => 'Protokollparameter', + 'name' => 'Name', + 'next_renewal_date' => 'Nächstes Verlängerungsdatum', 'obfs' => 'Obfs', 'obfs_param' => 'Obfs-Parameter', - 'single' => 'Einzelport', - 'transfer' => 'Relay', + 'online_user' => 'Online-Benutzer', + 'protocol' => 'Protokoll', + 'protocol_param' => 'Protokollparameter', + 'push_port' => 'Push-Port', + 'relay_port' => 'Relay-Port', + 'renewal_cost' => 'Rechnungsbetrag', 'service_port' => 'Service-Port', + 'single' => 'Einzelport', 'single_passwd' => '[Einzel] Passwort', + 'static' => 'Status', + 'subscription_term' => 'Abonnementdauer', + 'traffic_limit' => 'Geschwindigkeitsbegrenzung', + 'transfer' => 'Relay', + 'udp' => 'UDP', 'v2_alter_id' => 'Alter ID', - 'v2_net' => 'Netzwerk', 'v2_cover' => 'Cover', 'v2_host' => 'Host', + 'v2_net' => 'Netzwerk', 'v2_path' => 'Pfad | Schlüssel', 'v2_sni' => 'SNI', 'v2_tls' => 'TLS', 'v2_tls_provider' => 'TLS-Konfiguration', - 'relay_port' => 'Relay-Port', ], 'node_auth' => [ 'attribute' => 'Knotenauthentifizierung', @@ -111,36 +120,44 @@ return [ 'node_cert' => [ 'attribute' => 'Domain-Zertifikat', 'domain' => 'Domain', + 'expired_date' => 'Ablaufdatum', + 'issuer' => 'Aussteller', 'key' => 'Schlüssel', 'pem' => 'PEM', - 'issuer' => 'Aussteller', 'signed_date' => 'Ausstellungsdatum', - 'expired_date' => 'Ablaufdatum', + ], + 'notification' => [ + 'address' => 'Empfänger', + 'created_at' => 'Gesendet am', + 'status' => 'Status', + ], + 'oauth' => [ + 'identifier' => 'Kennung', + 'type' => 'Kanal', ], 'order' => [ 'attribute' => 'Bestellung', 'id' => 'Bestellnummer', 'original_price' => 'Originalpreis', - 'price' => 'Tatsächlicher Preis', 'pay_way' => 'Zahlungsmethode', + 'price' => 'Tatsächlicher Preis', 'status' => 'Status', ], - 'goods' => [ - 'attribute' => 'Produkt', + 'permission' => [ + 'attribute' => 'Berechtigung', + 'description' => 'Beschreibung', + 'name' => 'Routenname', + ], + 'referral' => [ + 'amount' => 'Betrag', + 'created_at' => 'Beantragt am', + 'id' => 'Antragsnummer', + 'user' => 'Antragsteller', + ], + 'role' => [ + 'attribute' => 'Rolle', 'name' => 'Name', - 'price' => 'Preis', - 'category' => 'Kategorie', - 'renew' => 'Datenverlängerungspreis', - 'user_limit' => 'Benutzergeschwindigkeitsbegrenzung', - 'period' => 'Reset-Zyklus', - 'traffic' => 'Datenvolumen', - 'invite_num' => 'Bonus-Einladungen', - 'limit_num' => 'Kaufbegrenzung', - 'available_date' => 'Gültigkeitszeitraum', - 'hot' => 'Bestseller', - 'color' => 'Farbe', - 'logo' => 'Logo', - 'info' => 'Benutzerdefinierte Informationen', + 'permissions' => 'Berechtigungen', ], 'rule' => [ 'attribute' => 'Regel', @@ -150,83 +167,67 @@ return [ 'rule_group' => [ 'attribute' => 'Regelgruppe', 'name' => 'Name', - 'type' => 'Typ', 'rules' => 'Regeln', + 'type' => 'Typ', ], - 'role' => [ - 'attribute' => 'Rolle', - 'name' => 'Name', - 'permissions' => 'Berechtigungen', + 'subscribe' => [ + 'ban_desc' => 'Sperrgrund', + 'ban_time' => 'Sperrzeit', + 'code' => 'Abonnementcode', + 'req_header' => 'Anfrage-Header', + 'req_ip' => 'Anfrage-IP', + 'req_times' => 'Anfragenanzahl', + 'updated_at' => 'Letzte Anfrage', ], - 'permission' => [ - 'attribute' => 'Berechtigung', - 'description' => 'Beschreibung', - 'name' => 'Routenname', - ], - 'article' => [ - 'attribute' => 'Artikel', - 'category' => 'Kategorie', - 'language' => 'Sprache', - 'logo' => 'Cover', - 'created_at' => 'Veröffentlicht am', - 'updated_at' => 'Aktualisiert am', - ], - 'coupon' => [ - 'attribute' => 'Gutschein', - 'name' => 'Name', - 'sn' => 'Code', - 'logo' => 'Logo', - 'value' => 'Wert', - 'priority' => 'Priorität', - 'usable_times' => 'Verwendungsbeschränkung', - 'minimum' => 'Mindestbestellwert', - 'used' => 'Persönliche Begrenzung', - 'levels' => 'Stufenbeschränkung', - 'groups' => 'Gruppenbeschränkung', - 'users_whitelist' => 'Whitelist-Benutzer', - 'users_blacklist' => 'Blacklist-Benutzer', - 'services_whitelist' => 'Whitelist-Produkte', - 'services_blacklist' => 'Blacklist-Produkte', - 'newbie' => 'Nur für neue Benutzer', - 'num' => 'Anzahl', - ], - 'aff' => [ - 'invitee' => 'Käufer', - 'amount' => 'Bestellbetrag', - 'commission' => 'Provision', - 'updated_at' => 'Bearbeitet am', - 'created_at' => 'Bestellt am', - ], - 'referral' => [ - 'created_at' => 'Beantragt am', - 'user' => 'Antragsteller', - 'amount' => 'Betrag', - 'id' => 'Antragsnummer', - ], - 'notification' => [ - 'address' => 'Empfänger', - 'created_at' => 'Gesendet am', - 'status' => 'Status', - ], - 'ip' => [ - 'network_type' => 'Netzwerktyp', - 'info' => 'Standort', - ], - 'user_traffic' => [ - 'upload' => 'Upload', - 'download' => 'Download', - 'total' => 'Gesamt', - 'log_time' => 'Protokolliert am', - ], - 'user_data_modify' => [ - 'before' => 'Vorher', - 'after' => 'Nachher', - 'created_at' => 'Geändert am', + 'user' => [ + 'account_status' => 'Kontostatus', + 'attribute' => 'Benutzer', + 'created_date' => 'Registrierungsdatum', + 'credit' => 'Guthaben', + 'expired_date' => 'Ablaufdatum', + 'id' => 'Benutzer-ID', + 'invite_num' => 'Verfügbare Einladungen', + 'inviter' => 'Einlader', + 'nickname' => 'Spitzname', + 'password' => 'Passwort', + 'port' => 'Port', + 'proxy_method' => 'Verschlüsselung', + 'proxy_obfs' => 'Verschleierung', + 'proxy_passwd' => 'Proxy-Passwort', + 'proxy_protocol' => 'Protokoll', + 'proxy_status' => 'Proxy-Status', + 'qq' => 'QQ', + 'remark' => 'Bemerkung', + 'reset_date' => 'Datenrückstellungsdatum', + 'role' => 'Rolle', + 'service' => 'Proxy-Dienst', + 'speed_limit' => 'Geschwindigkeitsbegrenzung', + 'traffic_used' => 'Verwendete Daten', + 'usable_traffic' => 'Verfügbare Daten', + 'username' => 'Benutzername', + 'uuid' => 'VMess UUID', + 'wechat' => 'WeChat', ], 'user_credit' => [ - 'before' => 'Vorher', 'after' => 'Nachher', 'amount' => 'Betrag', + 'before' => 'Vorher', 'created_at' => 'Geändert am', ], + 'user_data_modify' => [ + 'after' => 'Nachher', + 'before' => 'Vorher', + 'created_at' => 'Geändert am', + ], + 'user_group' => [ + 'attribute' => 'Benutzergruppe', + 'name' => 'Gruppenname', + 'nodes' => 'Knoten', + ], + 'user_traffic' => [ + 'download' => 'Download', + 'log_time' => 'Protokolliert am', + 'total' => 'Gesamt', + 'upload' => 'Upload', + ], ]; diff --git a/resources/lang/de/notification.php b/resources/lang/de/notification.php index c558f724..99817dc1 100644 --- a/resources/lang/de/notification.php +++ b/resources/lang/de/notification.php @@ -3,35 +3,49 @@ declare(strict_types=1); return [ - 'attribute' => 'Benachrichtigung', - 'new' => '{1} Sie haben :num neue Nachricht|[1,*] Sie haben :num neue Nachrichten', - 'empty' => 'Sie haben keine neuen Nachrichten', - 'payment_received' => 'Zahlung erhalten, Betrag: :amount. Bestelldetails anzeigen', 'account_expired' => 'Erinnerung an das Ablaufen des Kontos', - 'account_expired_content' => 'Ihr Konto läuft in :days Tagen ab. Bitte erneuern Sie es rechtzeitig, um die Dienste weiterhin nutzen zu können.', 'account_expired_blade' => 'Ihr Konto läuft in :days Tagen ab, bitte erneuern Sie es rechtzeitig', + 'account_expired_content' => 'Ihr Konto läuft in :days Tagen ab. Bitte erneuern Sie es rechtzeitig, um die Dienste weiterhin nutzen zu können.', 'active_email' => 'Bitte verifizieren Sie innerhalb von 30 Minuten', + 'attribute' => 'Benachrichtigung', + 'block_report' => 'Blockierungsbericht:', 'close_ticket' => 'Ticket :id: :title wurde geschlossen', - 'view_web' => 'Website anzeigen', - 'view_ticket' => 'Ticket anzeigen', + 'data_anomaly' => 'Warnung: Datenanomalie', + 'data_anomaly_content' => 'Benutzer :id: [Upload: :upload | Download: :download | Gesamt: :total] in der letzten Stunde', + 'details' => 'Einzelheiten anzeigen', + 'details_btn' => 'Bitte klicken Sie auf die Schaltfläche unten, um die Einzelheiten anzuzeigen.', + 'ding_bot_limit' => 'Jeder Bot darf maximal 20 Nachrichten pro Minute in die Gruppe senden. Bei Überschreiten dieses Limits wird eine Drosselung von 10 Minuten angewendet.', + 'empty' => 'Sie haben keine neuen Nachrichten', + 'error' => '[:channel] Nachrichtenschub mit Ausnahme: :reason', + 'get_access_token_failed' => 'Fehler beim Abrufen des Zugriffstokens!\nMit Anforderungsparametern: :body', + 'into_maintenance' => 'Automatisch in den Wartungsmodus wechseln', + 'new' => '{1} Sie haben :num neue Nachricht|[1,*] Sie haben :num neue Nachrichten', 'new_ticket' => 'Neues Ticket erhalten: :title', - 'reply_ticket' => 'Ticket beantwortet: :title', - 'ticket_content' => 'Ticketinhalt:', + 'next_check_time' => 'Nächste Knotensperrungserkennung: :time', + 'node' => [ + 'download' => 'Download', + 'total' => 'Gesamt', + 'upload' => 'Upload', + ], 'node_block' => 'Warnung: Node-Blockierung', 'node_offline' => 'Warnung: Node offline', 'node_offline_content' => 'Folgende Nodes sind möglicherweise offline:', - 'block_report' => 'Blockierungsbericht:', - 'traffic_warning' => 'Warnung: Datenverbrauch', + 'node_renewal' => 'Erinnerung zur Verlängerung des Knotens', + 'node_renewal_blade' => 'Die folgenden Knoten stehen kurz vor dem Ablauf. Bitte verlängern Sie rechtzeitig: :nodes', + 'node_renewal_content' => 'Die folgenden Knoten stehen kurz vor dem Ablauf. Bitte verlängern Sie vor Ablauf, um Unterbrechungen des Dienstes zu vermeiden.', + 'payment_received' => 'Zahlung erhalten, Betrag: :amount. Bestelldetails anzeigen', + 'reply_ticket' => 'Ticket beantwortet: :title', + 'reset_failed' => '[Tägliche Aufgabe] Benutzer :uid - :username Datenrücksetzung fehlgeschlagen', + 'serverChan_exhausted' => 'Das heutige Limit wurde erschöpft!', + 'serverChan_limit' => 'Frequenz pro Minute zu hoch. Bitte optimieren Sie die Benachrichtigungseinstellungen!', + 'sign_failed' => 'Die sichere Signaturprüfung ist fehlgeschlagen', + 'ticket_content' => 'Ticketinhalt:', 'traffic_remain' => ':percent% des Datenvolumens verbraucht, bitte beachten', 'traffic_tips' => 'Bitte beachten Sie das Datum der Datenrücksetzung und nutzen Sie das Datenvolumen rational, oder erneuern Sie es nach dem Verbrauch', - 'verification_account' => 'Konto-Verifizierung', + 'traffic_warning' => 'Warnung: Datenverbrauch', 'verification' => 'Ihr Verifizierungscode lautet:', + 'verification_account' => 'Konto-Verifizierung', 'verification_limit' => 'Bitte innerhalb von :minutes Minuten verifizieren', - 'data_anomaly' => 'Warnung: Datenanomalie', - 'data_anomaly_content' => 'Benutzer :id: [Upload: :upload | Download: :download | Gesamt: :total] in der letzten Stunde', - 'node' => [ - 'upload' => 'Upload', - 'download' => 'Download', - 'total' => 'Gesamt', - ], + 'view_ticket' => 'Ticket anzeigen', + 'view_web' => 'Website anzeigen', ]; diff --git a/resources/lang/de/setup.php b/resources/lang/de/setup.php new file mode 100644 index 00000000..64329e8f --- /dev/null +++ b/resources/lang/de/setup.php @@ -0,0 +1,10 @@ + 'Sie sind im Demo-Modus. Möchten Sie die Datenbank zurücksetzen?', + 'update_cache' => 'Cache aktualisieren...', + 'update_complete' => 'Aktualisierung abgeschlossen!', + 'update_db' => 'Datenbank aktualisieren...', +]; diff --git a/resources/lang/de/user.php b/resources/lang/de/user.php index fa9e716d..b60a719f 100644 --- a/resources/lang/de/user.php +++ b/resources/lang/de/user.php @@ -4,234 +4,273 @@ declare(strict_types=1); return [ 'account' => [ - 'credit' => 'Kontoguthaben', - 'status' => 'Kontostatus', - 'level' => 'Kontolevel', - 'group' => 'Gruppe', - 'speed_limit' => 'Geschwindigkeitsbegrenzung', - 'remain' => 'Verbleibende Daten', - 'time' => 'Paketdauer', - 'last_login' => 'Letzte Anmeldung', - 'reset' => '{0} Daten werden in :days zurückgesetzt|{1} :days Tag bis zur Datenrücksetzung|[2,*] :days Tage bis zur Datenrücksetzung', 'connect_password' => 'Proxy-Verbindungspasswort', + 'credit' => 'Kontoguthaben', + 'group' => 'Gruppe', + 'last_login' => 'Letzte Anmeldung', + 'level' => 'Kontolevel', 'reason' => [ - 'normal' => 'Konto ist normal', 'expired' => 'Ihr Paket ist abgelaufen', + 'normal' => 'Konto ist normal', 'overused' => 'Sie haben das Limit von :data GB für diesen Zeitraum überschritten
    Die Begrenzung wird in :min Minuten aufgehoben', 'traffic_exhausted' => 'Datenvolumen ist aufgebraucht', 'unknown' => 'Unbekannter Grund, bitte versuchen Sie, den Browser zu aktualisieren! Wenn das Problem weiterhin besteht, kontaktieren Sie den Support.', ], + 'remain' => 'Verbleibende Daten', + 'reset' => '{0} Daten werden in :days zurückgesetzt|{1} :days Tag bis zur Datenrücksetzung|[2,*] :days Tage bis zur Datenrücksetzung', + 'speed_limit' => 'Geschwindigkeitsbegrenzung', + 'status' => 'Kontostatus', + 'time' => 'Paketdauer', ], + 'attribute' => [ + 'address' => 'Standort', + 'data' => 'Daten', + 'ip' => 'IP-Adresse', + 'isp' => 'ISP', + 'node' => 'Knoten', + ], + 'bought_at' => 'Kaufdatum', + 'clients' => 'Clients', + 'contact' => 'Kontakt', + 'coupon' => [ + 'discount' => 'Rabatt', + 'error' => [ + 'expired' => 'Gutschein abgelaufen', + 'inactive' => 'Gutschein nicht aktiv', + 'minimum' => 'Mindestbetrag ist :amount', + 'overused' => 'Kann nur :times mal verwendet werden', + 'run_out' => 'Gutschein aufgebraucht', + 'services' => 'Artikel nicht für Rabatt berechtigt, überprüfen Sie die Aktionsbedingungen', + 'unknown' => 'Ungültiger Gutschein', + 'unmet' => 'Bedingungen nicht erfüllt', + 'used' => 'Gutschein bereits verwendet', + 'users' => 'Konto nicht für die Aktion berechtigt', + 'wait' => 'Wird um :time aktiv, bitte warten!', + ], + 'input' => 'Gutscheincode eingeben', + ], + 'current_role' => 'Aktuelle Rolle als', + 'error_response' => 'Ein Fehler ist aufgetreten, bitte versuchen Sie es später erneut.', 'home' => [ + 'announcement' => 'Ankündigungen', 'attendance' => [ 'attribute' => 'Einchecken', 'disable' => 'Einchecken deaktiviert', 'done' => 'Sie haben bereits eingecheckt. Kommen Sie morgen wieder!', - 'success' => 'Sie haben :data Daten erhalten', 'failed' => 'Systemfehler', + 'success' => 'Sie haben :data Daten erhalten', ], - 'traffic_logs' => 'Datenprotokolle', - 'announcement' => 'Ankündigungen', - 'wechat_push' => 'WeChat-Benachrichtigungen', 'chat_group' => 'Chat-Gruppe', 'empty_announcement' => 'Keine Ankündigungen', + 'traffic_logs' => 'Datenprotokolle', + 'wechat_push' => 'WeChat-Benachrichtigungen', ], - 'purchase_to_unlock' => 'Zum Freischalten kaufen', - 'purchase_required' => 'Diese Funktion ist für nicht zahlende Benutzer deaktiviert. Bitte', - 'attribute' => [ - 'node' => 'Knoten', - 'data' => 'Daten', - 'ip' => 'IP-Adresse', - 'isp' => 'ISP', - 'address' => 'Standort', + 'invite' => [ + 'attribute' => 'Einladungscode', + 'counts' => 'Insgesamt :num Einladungscodes', + 'generate_failed' => 'Generierung fehlgeschlagen: Kontingent überschritten', + 'logs' => 'Einladungsprotokolle', + 'promotion' => 'Sowohl Sie als auch der Eingeladene erhalten :traffic Daten, wenn sie sich mit Ihrem Code registrieren; Sie erhalten :referral_percent% Provision, wenn sie einen Kauf tätigen.', + 'tips' => ':num Einladungen verbleiben, Codes verfallen :days Tage nach Erstellung', + ], + 'invitee' => 'Eingeladener', + 'inviter' => 'Einladender', + 'invoice' => [ + 'active_prepaid_question' => 'Prepaid-Paket frühzeitig aktivieren?', + 'active_prepaid_tips' => 'Nach der Aktivierung:
    Ihr aktueller Plan wird sofort ablaufen
    Das Ablaufdatum des neuen Plans wird ab heute neu berechnet', + 'amount' => 'Betrag', + 'attribute' => 'Bestellung', + 'detail' => 'Bestelldetails', + ], + 'knowledge' => [ + 'basic' => 'Grundlagen', + 'title' => 'Wissensdatenbank', ], - 'purchase_promotion' => 'Jetzt Dienst kaufen!', 'menu' => [ + 'admin_dashboard' => 'Dashboard', 'help' => 'Hilfe', 'home' => 'Startseite', 'invites' => 'Einladen', 'invoices' => 'Rechnungen', 'nodes' => 'Knoten', + 'profile' => 'Profil', 'promotion' => 'Empfehlung', 'shop' => 'Shop', - 'profile' => 'Profil', 'tickets' => 'Tickets', - 'admin_dashboard' => 'Dashboard', ], - 'contact' => 'Kontakt', + 'node' => [ + 'info' => 'Konfigurationsinfo', + 'rate' => ':ratio-facher Datenverbrauch', + 'setting' => 'Proxy-Einstellungen', + 'unstable' => 'Instabil/Wartung', + ], 'oauth' => [ + 'bind' => 'Binden', 'bind_title' => 'Soziales Konto binden', 'not_bind' => 'Nicht gebunden', - 'bind' => 'Binden', 'rebind' => 'Neu binden', 'unbind' => 'Entbinden', ], - 'coupon' => [ - 'discount' => 'Rabatt', - 'error' => [ - 'unknown' => 'Ungültiger Gutschein', - 'used' => 'Gutschein bereits verwendet', - 'expired' => 'Gutschein abgelaufen', - 'run_out' => 'Gutschein aufgebraucht', - 'inactive' => 'Gutschein nicht aktiv', - 'wait' => 'Wird um :time aktiv, bitte warten!', - 'unmet' => 'Bedingungen nicht erfüllt', - 'minimum' => 'Mindestbetrag ist :amount', - 'overused' => 'Kann nur :times mal verwendet werden', - 'users' => 'Konto nicht für die Aktion berechtigt', - 'services' => 'Artikel nicht für Rabatt berechtigt, überprüfen Sie die Aktionsbedingungen', + 'pay' => 'Bezahlen', + 'payment' => [ + 'close_tips' => 'Schließen Sie die Zahlung innerhalb von :minutes Minuten ab, sonst wird die Bestellung automatisch geschlossen', + 'creating' => 'Zahlung wird erstellt...', + 'error' => 'Ungültiger Aufladebetrag', + 'insufficient_balance' => 'Ihr Guthaben ist unzureichend. Bitte laden Sie es zuerst auf.', + 'manual' => [ + 'hint' => 'Nach dem Scannen des QR-Codes zur Zahlung folgen Sie bitte der Reihenfolge der Schritte, bis Sie auf „Abschicken“ klicken, um die Zahlung abzuschließen.', + 'next' => 'Weiter', + 'payment_tips' => 'Bitte den genauen Betrag zahlen (keine Rückerstattung bei Überzahlung, Nachzahlung bei Unterzahlung)', + 'pre' => 'Zurück', + 'red_packet' => 'Alipay-Rotpaket', + 'steps' => [ + 'complete' => [ + 'description' => 'Warten auf manuelle Zahlungsüberprüfung', + 'title' => 'Abschluss', + ], + 'notice' => [ + 'description' => 'Wie man manuell bezahlt', + 'title' => 'Hinweise', + ], + 'payment' => [ + 'description' => 'QR-Code erhalten und bezahlen', + 'title' => 'Bezahlen', + ], + 'remark' => [ + 'description' => 'Geben Sie Ihr Login-Konto zur manuellen Überprüfung ein', + 'title' => 'Kontobemerkung', + ], + ], ], + 'method' => 'Zahlungsmethode', + 'mobile_tips' => 'Mobile Benutzer: Halten Sie den QR-Code gedrückt -> Bild speichern -> Zahlungs-App öffnen -> Bild scannen, um zu bezahlen', + 'order_creation' => [ + 'failed' => 'Erstellung der Bestellung fehlgeschlagen. Bitte versuchen Sie eine andere Zahlungsmethode!', + 'info' => 'Wir werden Ihre Bestellung/Ihre Aufladung innerhalb von [24 Stunden] aktivieren! Bitte haben Sie Geduld.', + 'order_limit' => 'Dieser Artikel ist auf :limit_num Käufe begrenzt. Sie haben bereits :count Mal gekauft.', + 'order_timeout' => 'Die Bestellung ist abgelaufen und wurde aufgrund fehlender Zahlung automatisch geschlossen.', + 'payment_disabled' => 'Bestellerstellung fehlgeschlagen: Die Online-Zahlungsfunktion ist nicht aktiviert.', + 'pending_order' => 'Bestellerstellung fehlgeschlagen: Es gibt noch unbezahlte Bestellungen. Bitte schließen Sie diese Zahlungen zuerst ab.', + 'plan_required' => 'Bitte kaufen Sie ein Paket, bevor Sie das Aufladepaket erwerben.', + 'price_issue' => 'Bestellerstellung fehlgeschlagen: Ungewöhnlicher Gesamtpreis der Bestellung', + 'price_zero' => 'Bestellerstellung fehlgeschlagen: Der Gesamtpreis der Bestellung beträgt 0; eine Online-Zahlung ist nicht erforderlich.', + 'product_unavailable' => 'Bestellerstellung fehlgeschlagen: Der Artikel wurde aus dem Verkauf genommen.', + 'success' => 'Bestellung erfolgreich erstellt!', + 'unknown_order' => 'Unbekannte Bestellung', + 'unknown_payment' => 'Unbekannte Zahlungsmethode', + ], + 'qrcode_tips' => 'Bitte scannen Sie mit :software', + 'redirect_stripe' => 'Weiterleitung zu Stripe', ], - 'error_response' => 'Ein Fehler ist aufgetreten, bitte versuchen Sie es später erneut.', - 'invite' => [ - 'attribute' => 'Einladungscode', - 'counts' => 'Insgesamt :num Einladungscodes', - 'tips' => ':num Einladungen verbleiben, Codes verfallen :days Tage nach Erstellung', - 'logs' => 'Einladungsprotokolle', - 'promotion' => 'Sowohl Sie als auch der Eingeladene erhalten :traffic Daten, wenn sie sich mit Ihrem Code registrieren; Sie erhalten :referral_percent% Provision, wenn sie einen Kauf tätigen.', - 'generate_failed' => 'Generierung fehlgeschlagen: Kontingent überschritten', + 'purchase' => [ + 'completed' => 'Kauf abgeschlossen!', + 'promotion' => 'Jetzt Dienst kaufen!', + 'required' => 'Diese Funktion ist für nicht zahlende Benutzer deaktiviert. Bitte', + 'to_unlock' => 'Freischalten durch Kauf', ], + 'recharge' => 'Aufladen', + 'recharge_credit' => 'Guthaben aufladen', + 'recharging' => 'Aufladen...', + 'referral' => [ + 'link' => 'Empfehlungslink', + 'logs' => 'Provisionsprotokolle', + 'msg' => [ + 'account' => 'Konto abgelaufen, bitte zuerst ein Paket kaufen', + 'applied' => 'Bestehende Anfrage, bitte warten Sie auf die Bearbeitung', + 'error' => 'Fehler bei der Erstellung der Bestellung, versuchen Sie es später erneut oder kontaktieren Sie den Support', + 'unfulfilled' => 'Benötigt :amount zur Auszahlung, weiter so!', + 'wait' => 'Bitte warten Sie auf die Genehmigung des Administrators', + ], + 'total' => 'Gesamtprovision: :amount (:total Mal), kann ab :money ausgezahlt werden', + ], + 'registered_at' => 'Registrierungsdatum', 'reset_data' => [ 'action' => 'Daten zurücksetzen', 'cost' => 'Kosten: :amount', 'cost_tips' => 'Das Zurücksetzen wird :amount abziehen!', - 'insufficient' => 'Unzureichendes Guthaben, bitte aufladen', - 'logs' => 'Benutzer hat Daten zurückgesetzt', - 'success' => 'Zurücksetzung erfolgreich', ], - 'referral' => [ - 'link' => 'Empfehlungslink', - 'total' => 'Gesamtprovision: :amount (:total Mal), kann ab :money ausgezahlt werden', - 'logs' => 'Provisionsprotokolle', - 'failed' => 'Anfrage fehlgeschlagen', - 'success' => 'Anfrage erfolgreich', - 'msg' => [ - 'account' => 'Konto abgelaufen, bitte zuerst ein Paket kaufen', - 'applied' => 'Bestehende Anfrage, bitte warten Sie auf die Bearbeitung', - 'unfulfilled' => 'Benötigt :amount zur Auszahlung, weiter so!', - 'wait' => 'Bitte warten Sie auf die Genehmigung des Administrators', - 'error' => 'Fehler bei der Erstellung der Bestellung, versuchen Sie es später erneut oder kontaktieren Sie den Support', - ], - ], - 'inviter' => 'Einladender', - 'invitee' => 'Eingeladener', - 'registered_at' => 'Registrierungsdatum', - 'bought_at' => 'Kaufdatum', - 'payment_method' => 'Zahlungsmethode', - 'pay' => 'Bezahlen', - 'input_coupon' => 'Gutscheincode eingeben', - 'recharge' => 'Aufladen', - 'recharge_credit' => 'Guthaben aufladen', - 'recharging' => 'Aufladen...', - 'withdraw_commission' => 'Provision abheben', - 'withdraw_at' => 'Abhebungsdatum', - 'withdraw_logs' => 'Abhebungsprotokolle', - 'withdraw' => 'Abheben', 'scan_qrcode' => 'QR-Code mit Client scannen', + 'service' => [ + 'country_count' => 'Deckt :num Länder oder Regionen ab', + 'node_count' => ':num hochwertige Knoten', + 'unlimited' => 'Unbegrenzte Geschwindigkeit', + ], 'shop' => [ - 'hot' => 'Beliebt', - 'limited' => 'Begrenzt', + 'buy' => 'Kaufen', + 'call4help' => 'Kontaktieren Sie den Support, wenn Sie Fragen haben', 'change_amount' => 'Aufladebetrag', 'change_amount_help' => 'Aufladebetrag eingeben', - 'buy' => 'Kaufen', + 'conflict' => 'Konflikt', + 'conflict_tips' => '

    Der aktuelle Kauf wird als Prepaid-Paket festgelegt

    1. Das Prepaid-Paket wird automatisch aktiviert, nachdem das aktuelle Paket abläuft
    2. Sie können es nach der Zahlung manuell aktivieren
    ', 'description' => 'Beschreibung', - 'service' => 'Dienst', + 'hot' => 'Beliebt', + 'limited' => 'Begrenzt', 'pay_credit' => 'Mit Guthaben bezahlen', 'pay_online' => 'Online bezahlen', 'price' => 'Preis', 'quantity' => 'Menge', + 'service' => 'Dienst', 'subtotal' => 'Zwischensumme', 'total' => 'Gesamt', - 'conflict' => 'Konflikt', - 'conflict_tips' => '

    Der aktuelle Kauf wird als Prepaid-Paket festgelegt

    1. Das Prepaid-Paket wird automatisch aktiviert, nachdem das aktuelle Paket abläuft
    2. Sie können es nach der Zahlung manuell aktivieren
    ', - 'call4help' => 'Kontaktieren Sie den Support, wenn Sie Fragen haben', - ], - 'service' => [ - 'node_count' => ':num hochwertige Knoten', - 'country_count' => 'Deckt :num Länder oder Regionen ab', - 'unlimited' => 'Unbegrenzte Geschwindigkeit', - ], - 'payment' => [ - 'error' => 'Ungültiger Aufladebetrag', - 'creating' => 'Zahlung wird erstellt...', - 'redirect_stripe' => 'Weiterleitung zu Stripe', - 'qrcode_tips' => 'Bitte scannen Sie mit :software', - 'close_tips' => 'Schließen Sie die Zahlung innerhalb von :minutes Minuten ab, sonst wird die Bestellung automatisch geschlossen', - 'mobile_tips' => 'Mobile Benutzer: Halten Sie den QR-Code gedrückt -> Bild speichern -> Zahlungs-App öffnen -> Bild scannen, um zu bezahlen', - ], - 'invoice' => [ - 'attribute' => 'Bestellung', - 'detail' => 'Bestelldetails', - 'amount' => 'Betrag', - 'active_prepaid_question' => 'Prepaid-Paket frühzeitig aktivieren?', - 'active_prepaid_tips' => 'Nach der Aktivierung:
    Ihr aktueller Plan wird sofort ablaufen
    Das Ablaufdatum des neuen Plans wird ab heute neu berechnet', - ], - 'node' => [ - 'info' => 'Konfigurationsinfo', - 'setting' => 'Proxy-Einstellungen', - 'unstable' => 'Instabil/Wartung', - 'rate' => ':ratio-facher Datenverbrauch', ], 'subscribe' => [ - 'link' => 'Abonnement-Link', - 'tips' => 'Warnung: Dieser Link ist nur für den persönlichen Gebrauch. Bitte nicht weitergeben, sonst kann Ihr Konto wegen abnormaler Nutzung gesperrt werden.', - 'exchange_warning' => 'Das Ändern des Abonnement-Links wird:\n1. Den aktuellen Link sofort ungültig machen\n2. Das Verbindungspasswort ändern', 'custom' => 'Benutzerdefiniertes Abonnement', + 'error' => 'Fehler beim Ändern des Abonnement-Links', + 'exchange_warning' => 'Das Ändern des Abonnement-Links wird:\n1. Den aktuellen Link sofort ungültig machen\n2. Das Verbindungspasswort ändern', + 'info' => [ + 'download' => 'Download', + 'title' => 'Kontoübersicht [Nicht in Echtzeit]', + 'total' => 'Plan-Daten', + 'upload' => 'Upload', + ], + 'link' => 'Abonnement-Link', 'ss_only' => 'Nur SS abonnieren', 'ssr_only' => 'Nur SSR (inkl. SS) abonnieren', - 'v2ray_only' => 'Nur V2Ray abonnieren', + 'tips' => 'Warnung: Dieser Link ist nur für den persönlichen Gebrauch. Bitte nicht weitergeben, sonst kann Ihr Konto wegen abnormaler Nutzung gesperrt werden.', 'trojan_only' => 'Nur Trojan abonnieren', - 'error' => 'Fehler beim Ändern des Abonnement-Links', - 'info' => [ - 'title' => 'Kontoübersicht [Nicht in Echtzeit]', - 'upload' => 'Upload', - 'download' => 'Download', - 'total' => 'Plan-Daten', + 'v2ray_only' => 'Nur V2Ray abonnieren', + ], + 'telegram' => [ + 'bind_exists' => 'Dieses Konto ist bereits mit einem Telegram-Konto verknüpft.', + 'bind_missing' => 'Keine Benutzerinformationen gefunden. Bitte verknüpfen Sie zuerst Ihr Konto.', + 'command' => [ + 'bind' => 'Verknüpfen Sie Ihr :web_name-Konto', + 'intro' => 'Sie können die folgenden Befehle verwenden', + 'traffic' => 'Datenverbrauch überprüfen', + 'unbind' => 'Trennen', + 'web_url' => 'Holen Sie sich die neueste :web_name-URL', ], + 'get_url' => 'Die neueste URL für :web_name lautet', + 'params_missing' => 'Ungültige Parameter. Bitte fügen Sie Ihre E-Mail-Adresse bei und senden Sie erneut.', + 'ticket_missing' => 'Ticket existiert nicht', + 'ticket_reply' => 'Antwort auf Ticket #`:id` war erfolgreich', + 'traffic_query' => 'Datenverbrauchsanfrage', + 'user_missing' => 'Benutzer existiert nicht', ], 'ticket' => [ 'attribute' => 'Ticket', - 'submit_tips' => 'Ticket wirklich einreichen?', - 'reply_confirm' => 'Antwort auf Ticket wirklich senden?', - 'close_tips' => 'Ticket wirklich schließen?', - 'close' => 'Ticket schließen', - 'failed_closed' => 'Fehler: Bereits geschlossen', - 'reply_placeholder' => 'Schreiben Sie etwas...', - 'reply' => 'Antworten', 'close_msg' => 'Ticket ID :id vom Benutzer geschlossen', - 'title_placeholder' => 'Beschreiben Sie kurz Ihr Problem', + 'close_tips' => 'Ticket wirklich schließen?', 'content_placeholder' => 'Beschreiben Sie Ihr Problem detailliert, damit wir Ihnen besser helfen können', - 'new' => 'Neues Ticket erstellen', - 'service_hours' => 'Kundendienstzeiten', - 'online_hour' => 'Online-Zeiten', - 'service_tips' => 'Bitte verwenden Sie nur eine Kontaktmethode, um den Support zu erreichen! Mehrfache Anfragen verzögern die Antwortzeit.', 'error' => 'Unbekannter Fehler! Bitte kontaktieren Sie den Support', + 'new' => 'Neues Ticket erstellen', + 'online_hour' => 'Online-Zeiten', + 'reply' => 'Antworten', + 'reply_confirm' => 'Antwort auf Ticket wirklich senden?', + 'reply_placeholder' => 'Schreiben Sie etwas...', + 'service_hours' => 'Kundendienstzeiten', + 'service_tips' => 'Bitte verwenden Sie nur eine Kontaktmethode, um den Support zu erreichen! Mehrfache Anfragen verzögern die Antwortzeit.', + 'submit_tips' => 'Ticket wirklich einreichen?', + 'title_placeholder' => 'Beschreiben Sie kurz Ihr Problem', ], 'traffic_logs' => [ - 'hourly' => 'Heutiger Datenverbrauch', 'daily' => 'Datenverbrauch diesen Monat', + 'hourly' => 'Heutiger Datenverbrauch', 'tips' => 'Hinweis: Es gibt eine Verzögerung bei der Aktualisierung der Datenstatistiken.', ], - 'clients' => 'Clients', 'tutorials' => 'Anleitungen', - 'current_role' => 'Aktuelle Rolle als', - 'knowledge' => [ - 'title' => 'Wissensdatenbank', - 'basic' => 'Grundlagen', - ], - 'manual' => [ - 'red_packet' => 'Alipay-Rotpaket', - 'hint' => 'Nach dem Scannen des QR-Codes klicken Sie weiter auf [Weiter], bis Sie auf [Einreichen] klicken, um die Zahlung abzuschließen!', - 'step_1' => 'Hinweise', - 'step_1_title' => 'Wie man manuell bezahlt', - 'step_2' => 'Zahlung', - 'step_2_title' => 'QR-Code erhalten und bezahlen', - 'step_3' => 'Abschluss', - 'step_3_title' => 'Auf manuelle Überprüfung warten', - 'remark' => 'Kontobemerkung', - 'remark_content' => 'Bitte geben Sie Ihren Kontobenutzernamen an, um eine genaue manuelle Überprüfung zu gewährleisten', - 'payment_hint' => 'Bitte den genauen Betrag zahlen (keine Rückerstattung bei Überzahlung, Nachzahlung bei Unterzahlung)', - 'pre' => 'Zurück', - 'next' => 'Weiter', - ], + 'withdraw' => 'Abheben', + 'withdraw_at' => 'Abhebungsdatum', + 'withdraw_commission' => 'Provision abheben', + 'withdraw_logs' => 'Abhebungsprotokolle', ]; diff --git a/resources/lang/en.json b/resources/lang/en.json index 2b456b00..63618f07 100644 --- a/resources/lang/en.json +++ b/resources/lang/en.json @@ -126,5 +126,16 @@ "You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account.", "You have not responded this ticket in :num hours, System has closed your ticket.": "You have not responded this ticket in :num hours, System has closed your ticket.", "You must have a valid subscription to view the content in this area!": "You must have a valid subscription to view the content in this area!", - "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Your subscription has been disabled by the administrator, please contact the administrator to restore it." + "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Your subscription has been disabled by the administrator, please contact the administrator to restore it.", + "Manually add in dashboard.": "Manually add in dashboard.", + "Manually edit in dashboard.": "Manually edit in dashboard.", + "Batch generate user accounts in dashboard.": "Batch generate user accounts in dashboard.", + "Coupon used in order.": "Coupon used in order.", + "Order canceled, coupon reinstated.": "Order canceled, coupon reinstated.", + "Used for credit recharge.": "Used for credit recharge.", + "The user manually reset the data.": "The user manually reset the data.", + "Recharge using a recharge voucher.": "Recharge using a recharge voucher.", + "The user topped up the balance.": "The user topped up the balance.", + "Purchased an item.": "Purchased an item.", + "[:payment] plus the user’s purchased data plan.": "[:payment] plus the user’s purchased data plan." } \ No newline at end of file diff --git a/resources/lang/en/admin.php b/resources/lang/en/admin.php index 4999ddf6..51a50e76 100644 --- a/resources/lang/en/admin.php +++ b/resources/lang/en/admin.php @@ -3,512 +3,468 @@ declare(strict_types=1); return [ + 'action' => [ + 'add_item' => 'Add :attribute', + 'edit_item' => 'Edit :attribute', + ], + 'aff' => [ + 'apply_counts' => 'Total :num Withdrawal Requests', + 'commission_counts' => 'This application involves a total of :num orders', + 'commission_title' => 'Request Details', + 'counts' => 'Total :num Records', + 'rebate_title' => 'Rebate History', + 'referral' => 'Referral Rebates', + 'title' => 'Withdraw Requests', + ], + 'article' => [ + 'category_hint' => 'Same category will be grouped together', + 'counts' => 'Total :num Articles', + 'logo_placeholder' => 'Or enter logo URL', + 'title' => 'Articles', + 'type' => [ + 'announcement' => 'Announcement', + 'knowledge' => 'Article', + ], + ], + 'clear' => 'Clear', + 'clone' => 'Clone', + 'confirm' => [ + 'continues' => 'Do you want to continue this action?', + 'delete' => [0 => 'Do you want to delete :attributes', 1 => ']?'], + 'export' => 'Do you want to export all?', + ], + 'coupon' => [ + 'counts' => 'Total :num Coupons', + 'created_days_hint' => ':day days after registration', + 'discount' => 'Discount', + 'export_title' => 'Export', + 'groups_hint' => 'Only usable for selected user groups', + 'info_title' => 'Info', + 'levels_hint' => 'Only usable for selected user levels', + 'limit_hint' => 'Rules have AND relation, use properly', + 'minimum_hint' => 'Only usable when payment exceeds :num', + 'name_hint' => 'For display', + 'newbie' => [ + 'created_days' => 'Account Age', + 'first_discount' => 'First-time Discount', + 'first_order' => 'First Order', + ], + 'priority_hint' => 'Highest eligible priority coupon used first. Max 255', + 'services_blacklist_hint' => 'Not usable for blacklisted products, leave blank if unused', + 'services_placeholder' => 'Enter product ID, press Enter', + 'services_whitelist_hint' => 'Only usable for whitelisted products, leave blank if unused', + 'single_use' => 'One-time Use', + 'sn_hint' => 'Leave blank for 8-digit random code', + 'title' => 'Coupons', + 'type' => [ + 'charge' => 'Recharge', + 'discount' => 'Discount', + 'voucher' => 'Voucher', + ], + 'type_hint' => 'Reduction: deduct amount; Discount: percentage off; Recharge: add amount to balance', + 'used_hint' => 'Each user can use this :num times max', + 'user_whitelist_hint' => 'Whitelisted users can use, leave blank if unused', + 'users_blacklist_hint' => 'Blacklisted users cannot use, leave blank if unused', + 'users_placeholder' => 'Enter user ID, press Enter', + 'value' => '{1} ➖ :num|{2} :num% off|{3} ➕ :num', + 'value_hint' => 'Range is 1% to 99%', + ], + 'creating' => 'Adding...', 'dashboard' => [ - 'users' => 'Total Users', - 'available_users' => 'Active Users', - 'paid_users' => 'Paying Users', - 'active_days_users' => 'Active Users in the Last :days Days', - 'inactive_days_users' => 'Inactive Users over :days Days', - 'online_users' => 'Online Now', - 'expiring_users' => 'Expiring Soon', - 'overuse_users' => 'Data Overuse [≥90%] Users', 'abnormal_users' => 'Abnormal Traffic in the Last Hour', - 'nodes' => 'Nodes', - 'maintaining_nodes' => 'Nodes in Maintenance Mode', + 'active_days_users' => 'Active Users in the Last :days Days', + 'available_users' => 'Active Users', + 'credit' => 'Total Credit', 'current_month_traffic_consumed' => 'Traffic Used This Month', 'days_traffic_consumed' => 'Traffic Used in the Last :days Days', - 'orders' => 'Total Orders', + 'expiring_users' => 'Expiring Soon', + 'inactive_days_users' => 'Inactive Users over :days Days', + 'maintaining_nodes' => 'Nodes in Maintenance Mode', + 'nodes' => 'Nodes', 'online_orders' => 'Online Payment Orders', + 'online_users' => 'Online Now', + 'orders' => 'Total Orders', + 'overuse_users' => 'Data Overuse [≥90%] Users', + 'paid_users' => 'Paying Users', 'succeed_orders' => 'Paid Orders', - 'credit' => 'Total Credit', + 'users' => 'Total Users', 'withdrawing_commissions' => 'Pending Commissions', 'withdrawn_commissions' => 'Withdrawn Commissions', ], - 'action' => [ - 'edit_item' => 'Edit :attribute', - 'add_item' => 'Add :attribute', + 'end_time' => 'End', + 'goods' => [ + 'counts' => 'Total :num Items', + 'info' => [ + 'available_date_hint' => 'Auto deduct data from total when due', + 'desc_placeholder' => 'Brief description', + 'limit_num_hint' => 'Max number of purchases per user, 0 for unlimited', + 'list_hint' => 'Start each line with
  • and end with
  • ', + 'list_placeholder' => 'Add custom content', + 'period_hint' => 'Data allowance resets every N days for plans', + 'type_hint' => 'Plan affects account expiration, Package only deducts data, does not affect expiration', + ], + 'sell_and_used' => 'Used / Sold', + 'status' => [ + 'no' => 'Off Sale', + 'yes' => 'On Sale', + ], + 'title' => 'Products', + 'type' => [ + 'package' => 'Data Package', + 'plan' => 'Subscription Plan', + 'top_up' => 'Top Up', + ], ], - 'confirm' => [ - 'delete' => [0 => 'Do you want to delete :attributes', 1 => ']?'], - 'continues' => 'Do you want to continue this action?', - 'export' => 'Do you want to export all?', + 'hint' => 'Hint', + 'logs' => [ + 'ban' => [ + 'ban_time' => 'Banned On', + 'last_connect_at' => 'Last Login Time', + 'reason' => 'Reason', + 'time' => 'Duration', + 'title' => 'User Bans', + ], + 'callback' => 'Callback Logs (Payment)', + 'counts' => 'Total :num Records', + 'credit_title' => 'Balance Change Logs', + 'ip_monitor' => 'Online IPs Real-time 2 mins', + 'notification' => 'Email Logs', + 'order' => [ + 'is_coupon' => 'Used Coupon', + 'is_expired' => 'Expired', + 'title' => 'Orders', + 'update_conflict' => 'Update failed: Order conflict', + ], + 'rule' => [ + 'clear_all' => 'Clear all records', + 'clear_confirm' => 'Do you want to clear all trigger records?', + 'created_at' => 'Trigger Time', + 'name' => 'Triggered Rule Name', + 'reason' => 'Trigger Reason', + 'tag' => '✅ Accessing Unauthorized Content', + 'title' => 'Rule Trigger Records', + ], + 'subscribe' => 'Subscriptions', + 'user_data_modify_title' => 'Data Change Records', + 'user_ip' => [ + 'connect' => 'Connected IP', + 'title' => 'Online IPs Last 10 mins', + ], + 'user_traffic' => [ + 'choose_node' => 'Select Node', + 'title' => 'Data Usage Records', + ], ], - 'user_dashboard' => 'User Dashboard', + 'marketing' => [ + 'counts' => 'Total :num Messages', + 'email' => [ + 'ever_paid' => 'Ever Paid', + 'expired_date' => 'Expired Date', + 'filters' => 'Filters', + 'loading_statistics' => 'Loading Statistics...', + 'never_paid' => 'Never Paid', + 'paid_servicing' => 'Paid Servicing', + 'previously_paid' => 'Used to Pay', + 'recent_traffic_abnormal' => 'Traffic Abnormal in Last Hour', + 'recently_active' => 'Recently Active', + 'targeted_users_count' => 'Targeted Users Count', + 'traffic_usage_over' => 'Traffic Usage Over N%', + 'will_expire_date' => 'Will Expire Date', + ], + 'email_send' => 'Send Email', + 'error_message' => 'Error Messages', + 'processed' => 'Request Processed', + 'push_send' => 'Send Notification', + 'send_status' => 'Send Status', + 'send_time' => 'Sent On', + 'targeted_users_not_found' => 'Targeted Users Not Found', + 'unknown_sending_type' => 'Unknown Sending Type', + ], + 'massive_export' => 'Batch Export', 'menu' => [ + 'analysis' => [ + 'accounting' => 'Accounting', + 'attribute' => 'Analytics', + 'node_flow' => 'Node Traffic Analysis', + 'site_flow' => 'Site Traffic Analysis', + 'user_flow' => 'User Traffic Analysis', + ], + 'customer_service' => [ + 'article' => 'Knowledge Base', + 'attribute' => 'Helpdesk', + 'marketing' => 'Message Broadcasting', + 'ticket' => 'Support Tickets', + ], 'dashboard' => 'Dashboard', - 'user' => [ - 'attribute' => 'Users', - 'list' => 'User Management', - 'oauth' => 'OAuth', - 'group' => 'User Groups', - 'credit_log' => 'Credit History', - 'subscribe' => 'Subscriptions', + 'log' => [ + 'attribute' => 'Logs', + 'notify' => 'Notifications', + 'online_logs' => 'Online Logs', + 'online_monitor' => 'Online Monitoring', + 'payment_callback' => 'Payment Callback', + 'service_ban' => 'Ban Records', + 'system' => 'System Logs', + 'traffic' => 'Data Usage', + 'traffic_flow' => 'Data Flow', + ], + 'node' => [ + 'attribute' => 'Nodes', + 'auth' => 'API Authorization', + 'cert' => 'Certificates', + 'list' => 'Node Management', + ], + 'promotion' => [ + 'attribute' => 'Promote', + 'invite' => 'Referrals', + 'rebate_flow' => 'Rebate History', + 'withdraw' => 'Withdraws', ], 'rbac' => [ 'attribute' => 'RBAC', 'permission' => 'Permissions', 'role' => 'Roles', ], - 'customer_service' => [ - 'attribute' => 'Helpdesk', - 'ticket' => 'Support Tickets', - 'article' => 'Knowledge Base', - 'marketing' => 'Message Broadcasting', - ], - 'node' => [ - 'attribute' => 'Nodes', - 'list' => 'Node Management', - 'auth' => 'API Authorization', - 'cert' => 'Certificates', - ], 'rule' => [ 'attribute' => 'Audit Rules', - 'list' => 'Rules', 'group' => 'Rule Groups', + 'list' => 'Rules', 'trigger' => 'Trigger Records', ], - 'shop' => [ - 'attribute' => 'Shop', - 'goods' => 'Products', - 'coupon' => 'Coupons', - 'order' => 'Orders', - ], - 'promotion' => [ - 'attribute' => 'Promote', - 'invite' => 'Referrals', - 'withdraw' => 'Withdraws', - 'rebate_flow' => 'Rebate History', - ], - 'analysis' => [ - 'attribute' => 'Analytics', - 'accounting' => 'Accounting', - 'user_flow' => 'User Traffic Analysis', - 'node_flow' => 'Node Traffic Analysis', - 'site_flow' => 'Site Traffic Analysis', - ], - 'log' => [ - 'attribute' => 'Logs', - 'traffic' => 'Data Usage', - 'traffic_flow' => 'Data Flow', - 'service_ban' => 'Ban Records', - 'online_logs' => 'Online Logs', - 'online_monitor' => 'Online Monitoring', - 'notify' => 'Notifications', - 'payment_callback' => 'Payment Callback', - 'system' => 'System Logs', - ], - 'tools' => [ - 'attribute' => 'Toolkit', - 'decompile' => 'Decompile', - 'convert' => 'Convert', - 'import' => 'Import', - 'analysis' => 'Log Analysis', - ], 'setting' => [ 'attribute' => 'Settings', 'email_suffix' => 'Email Filters', - 'universal' => 'General', 'system' => 'System', + 'universal' => 'General', + ], + 'shop' => [ + 'attribute' => 'Shop', + 'coupon' => 'Coupons', + 'goods' => 'Products', + 'order' => 'Orders', + ], + 'tools' => [ + 'analysis' => 'Log Analysis', + 'attribute' => 'Toolkit', + 'convert' => 'Convert', + 'decompile' => 'Decompile', + 'import' => 'Import', + ], + 'user' => [ + 'attribute' => 'Users', + 'credit_log' => 'Credit History', + 'group' => 'User Groups', + 'list' => 'User Management', + 'oauth' => 'OAuth', + 'subscribe' => 'Subscriptions', ], ], - 'user' => [ - 'massive' => [ - 'text' => 'Batch Generate Account Quantity', - 'failed' => 'User Generation Failed', - 'succeed' => 'User Generated Successfully', - 'note' => 'Batch generate user accounts in background', - ], - 'proxy_info' => 'Config Info', - 'traffic_monitor' => 'Traffic Stats', - 'online_monitor' => 'Online Monitoring', - 'reset_traffic' => 'Reset Data', - 'user_view' => 'Switch to User View', - 'connection_test' => 'Connection Test', - 'counts' => 'Total :num Accounts', - 'reset_confirm' => [0 => 'Do you want to reset [', 1 => ']\'s traffic?'], - 'info' => [ - 'account' => 'Account Info', - 'proxy' => 'Proxy Info', - 'switch' => 'Switch Identity', - 'reset_date_hint' => 'Next data reset date', - 'expired_date_hint' => 'Leave blank for a default validity of one year', - 'uuid_hint' => 'UUID for V2Ray', - 'recharge_placeholder' => 'If negative, deducts balance', - ], - 'update_help' => 'Update successful, go back?', - 'proxies_config' => 'Connection Info for :username', - 'group' => [ - 'title' => 'User Group Control (A node can be in multiple groups, but the user can only belong to one group; for nodes visible/available to users, group has more priority than level)', - 'name' => 'Group Name', - 'counts' => 'Total :num Groups', - ], - ], - 'zero_unlimited_hint' => '0 or empty for unlimited', - 'node' => [ - 'traffic_monitor' => 'Traffic Stats', - 'refresh_geo' => 'Refresh Geography', - 'connection_test' => 'Connectivity Test', - 'counts' => 'Total :num Nodes', - 'reload_all' => 'Reload All Backends', - 'refresh_geo_all' => 'Refresh Geo Data', - 'reload_confirm' => 'Do you want to reload the server backend?', - 'info' => [ - 'hint' => 'Note: The auto-generated ID is the node_id for ShadowsocksR backend and nodeId for V2Ray backend', - 'basic' => 'Basic Information', - 'ddns_hint' => 'Dynamic IP nodes require DDNS configuration. For this type of node, Connectivity Test will be conducted through domain names.', - 'domain_placeholder' => 'Server domain, will use first if filled', - 'domain_hint' => 'After enabling the DDNS in system settings, the domain name and the IPs will automatically update! You no longer need to edit this information at the domain registrar website.', - 'extend' => 'Extended Info', - 'display' => [ - 'invisible' => 'Invisible', - 'node' => 'Visible only in Node Page', - 'sub' => 'Visible only in Subscriptions', - 'all' => 'Fully Visible', - 'hint' => 'Whether visible in subscription/node list', - ], - 'ipv4_hint' => 'Multiple IPs should be separated by commas in English, for example: 1.1.1.1,8.8.8.8', - 'ipv6_hint' => 'Multiple ips should be separated by commas in English, for example: 1.1.1.1,8.8.8.8', - 'ipv4_placeholder' => 'Server IPv4 Address', - 'ipv6_placeholder' => 'Server IPv6 Address', - 'push_port_hint' => 'Required. Make sure this port is opened in the server firewall, otherwise message push will be abnormal.', - 'data_rate_hint' => 'E. g. 0.1 means 100M will be count as 10M; 5 means 100M will be count as 500M', - 'level_hint' => 'Level: 0 - No level restriction, all visible.', - 'detection' => [ - 'tcp' => 'Only TCP', - 'icmp' => 'Only ICMP', - 'all' => 'Both', - 'hint' => 'Random check every 30-60 mins', - ], - 'obfs_param_hint' => 'Fill in parameters for traffic masquerading if obfs is not [plain]; Suggest port 80 if obfs is [http_simple]; Suggest port 443 if obfs is [tls];', - 'additional_ports_hint' => 'If enabled, please configure server additional_ports', - 'v2_method_hint' => 'WebSocket transmission protocol should not use \'none\' encryption method.', - 'v2_net_hint' => 'Please enable TLS for WebSocket', - 'v2_cover' => [ - 'none' => 'None', - 'http' => 'HTTP', - 'srtp' => 'SRTP', - 'utp' => 'uTP', - 'wechat' => 'WeChat Video', - 'dtls' => 'DTLS 1.2', - 'wireguard' => 'WireGuard', - ], - 'v2_host_hint' => 'When using HTTP camouflage, multiple domains should be separated by commas, while WebSocket only allows a single domain.', - 'v2_tls_provider_hint' => 'Different backends have different configs:', - 'single_hint' => 'Recommended port 80/443. Backend needs
    strict mode config: only connect via specified ports. (How to configure)', - ], - 'proxy_info' => '*Compatible with the Shadowsocks', - 'proxy_info_hint' => 'For compatibility, please add _compatible to protocol and obfuscation in server config', - 'reload' => 'Reload Backend', - 'auth' => [ - 'title' => 'API Authorizations WEBAPI', - 'deploy' => [ - 'title' => 'Deploy :type_label Backend', - 'attribute' => 'Backend Deployment', - 'command' => 'Instructions', - 'update' => 'Update', - 'uninstall' => 'Uninstall', - 'start' => 'Start', - 'stop' => 'Stop', - 'status' => 'Status', - 'recent_logs' => 'Recent Logs', - 'real_time_logs' => 'Real-time Logs', - 'restart' => 'Restart', - 'same' => 'Same Above', - 'trojan_hint' => 'Please fill in the node nameand parse to the corresponding IP', - ], - 'reset_auth' => 'Reset Authorization Key', - 'counts' => 'Total :num Licenses', - 'generating_all' => 'Confirm to generate authorization keys for all nodes?', - ], - 'cert' => [ - 'title' => 'Domain Certs (For V2Ray node spoofing)', - 'counts' => 'Total :num Domain Certificates', - 'key_placeholder' => 'The KEY value of the certificate can be left empty. VNET-V2Ray backend supports auto-issue', - 'pem_placeholder' => 'VNET-V2Ray backend supports auto-issuer', - ], - ], - 'hint' => 'Hint', - 'oauth' => [ - 'title' => 'OAuth', - 'counts' => 'Total :num Authorization Records', - ], - 'select_all' => 'Select All', - 'clear' => 'Clear', - 'unselected_hint' => 'Rules to be allocated can be searched here', - 'selected_hint' => 'The allocated rules can be searched here', - 'clone' => 'Clone', + 'minute' => 'minutes', 'monitor' => [ 'daily_chart' => 'Daily Traffic Usage', + 'hint' => 'Hint: Check scheduled tasks if no data', 'monthly_chart' => 'Monthly Traffic Usage', 'node' => 'Node Traffic', 'user' => 'User Traffic', - 'hint' => 'Hint: Check scheduled tasks if no data', ], - 'tools' => [ - 'analysis' => [ - 'title' => 'SSR Log Analysis For single node', - 'req_url' => 'Recent Request URL Records', - 'not_enough' => 'Less than 15,000 records, unable to analyze', - ], - 'convert' => [ - 'title' => 'Format Conversion SS to SSR', - 'content_placeholder' => 'Please fill in the configuration information that needs to be converted.', - ], - 'decompile' => [ - 'title' => 'Decompile Config Info', - 'attribute' => 'Reverse Parsing Configuration Link', - 'content_placeholder' => 'Please fill in the ShadowsocksR links that need to be reverse-parsed, separated by line breaks.', - ], - ], - 'ticket' => [ - 'title' => 'Tickets', - 'counts' => 'Total :num Tickets', - 'send_to' => 'Please fill in target user details', - 'user_info' => 'User Info', - 'inviter_info' => 'Inviter Info', - 'close_confirm' => 'Do you want to close this ticket?', - 'error' => 'Unknown error! Please check logs', - ], - 'logs' => [ - 'subscribe' => 'Subscriptions', - 'counts' => 'Total :num Records', - 'rule' => [ - 'clear_all' => 'Clear all records', - 'title' => 'Rule Trigger Records', - 'name' => 'Triggered Rule Name', - 'reason' => 'Trigger Reason', - 'created_at' => 'Trigger Time', - 'tag' => '✅ Accessing Unauthorized Content', - 'clear_confirm' => 'Do you want to clear all trigger records?', - ], - 'order' => [ - 'title' => 'Orders', - 'is_expired' => 'Expired', - 'is_coupon' => 'Used Coupon', - ], - 'user_traffic' => [ - 'title' => 'Data Usage Records', - 'choose_node' => 'Select Node', - ], - 'user_data_modify_title' => 'Data Change Records', - 'callback' => 'Callback Logs (Payment)', - 'notification' => 'Email Logs', - 'ip_monitor' => 'Online IPs Real-time 2 mins', - 'user_ip' => [ - 'title' => 'Online IPs Last 10 mins', - 'connect' => 'Connected IP', - ], - 'ban' => [ - 'title' => 'User Bans', - 'time' => 'Duration', - 'reason' => 'Reason', - 'ban_time' => 'Banned On', - 'last_connect_at' => 'Last Login Time', - ], - 'credit_title' => 'Balance Change Logs', - ], - 'start_time' => 'Start', - 'end_time' => 'End', - 'goods' => [ - 'title' => 'Products', - 'type' => [ - 'top_up' => 'Top Up', - 'package' => 'Data Package', - 'plan' => 'Subscription Plan', - ], - 'info' => [ - 'type_hint' => 'Plan affects account expiration, Package only deducts data, does not affect expiration', - 'period_hint' => 'Data allowance resets every N days for plans', - 'limit_num_hint' => 'Max number of purchases per user, 0 for unlimited', - 'available_date_hint' => 'Auto deduct data from total when due', - 'desc_placeholder' => 'Brief description', - 'list_placeholder' => 'Add custom content', - 'list_hint' => 'Start each line with
  • and end with
  • ', - ], - 'status' => [ - 'yes' => 'On Sale', - 'no' => 'Off Sale', - ], - 'sell_and_used' => 'Used / Sold', - 'counts' => 'Total :num Items', - ], - 'sort_asc' => 'Larger sort value has higher priority', - 'yes' => 'Yes', 'no' => 'No', - 'rule' => [ - 'type' => [ - 'reg' => 'Regex', - 'domain' => 'Domain', - 'ip' => 'IP', - 'protocol' => 'Protocol', + 'node' => [ + 'auth' => [ + 'counts' => 'Total :num Licenses', + 'deploy' => [ + 'attribute' => 'Backend Deployment', + 'command' => 'Instructions', + 'real_time_logs' => 'Real-time Logs', + 'recent_logs' => 'Recent Logs', + 'restart' => 'Restart', + 'same' => 'Same Above', + 'start' => 'Start', + 'status' => 'Status', + 'stop' => 'Stop', + 'title' => 'Deploy :type_label Backend', + 'trojan_hint' => 'Please fill in
    the node nameand parse to the corresponding IP', + 'uninstall' => 'Uninstall', + 'update' => 'Update', + ], + 'empty' => 'No nodes need authorization generation', + 'generating_all' => 'Confirm to generate authorization keys for all nodes?', + 'reset_auth' => 'Reset Authorization Key', + 'title' => 'API Authorizations WEBAPI', ], + 'cert' => [ + 'counts' => 'Total :num Domain Certificates', + 'key_placeholder' => 'The KEY value of the certificate can be left empty. VNET-V2Ray backend supports auto-issue', + 'pem_placeholder' => 'VNET-V2Ray backend supports auto-issuer', + 'title' => 'Domain Certs (For V2Ray node spoofing)', + ], + 'connection_test' => 'Connectivity Test', + 'counts' => 'Total :num Nodes', + 'info' => [ + 'additional_ports_hint' => 'If enabled, please configure server additional_ports', + 'basic' => 'Basic Information', + 'data_rate_hint' => 'E. g. 0.1 means 100M will be count as 10M; 5 means 100M will be count as 500M', + 'ddns_hint' => 'Dynamic IP nodes require DDNS configuration. For this type of node, Connectivity Test will be conducted through domain names.', + 'detection' => [ + 'all' => 'Both', + 'hint' => 'Random check every 30-60 mins', + 'icmp' => 'Only ICMP', + 'tcp' => 'Only TCP', + ], + 'display' => [ + 'all' => 'Fully Visible', + 'hint' => 'Whether visible in subscription/node list', + 'invisible' => 'Invisible', + 'node' => 'Visible only in Node Page', + 'sub' => 'Visible only in Subscriptions', + ], + 'domain_hint' => 'After enabling the DDNS in system settings, the domain name and the IPs will automatically update! You no longer need to edit this information at the domain registrar website.', + 'domain_placeholder' => 'Server domain, will use first if filled', + 'extend' => 'Extended Info', + 'hint' => 'Note: The auto-generated ID is the node_id for ShadowsocksR backend and nodeId for V2Ray backend', + 'ipv4_hint' => 'Multiple IPs should be separated by commas in English, for example: 1.1.1.1,8.8.8.8', + 'ipv4_placeholder' => 'Server IPv4 Address', + 'ipv6_hint' => 'Multiple IPs should be separated by commas in English, for example: 1.1.1.1,8.8.8.8', + 'ipv6_placeholder' => 'Server IPv6 Address', + 'level_hint' => 'Level: 0 - No level restriction, all visible.', + 'obfs_param_hint' => 'Fill in parameters for traffic masquerading if obfs is not [plain]; Suggest port 80 if obfs is [http_simple]; Suggest port 443 if obfs is [tls];', + 'push_port_hint' => 'Required. Make sure this port is opened in the server firewall, otherwise message push will be abnormal.', + 'single_hint' => 'Recommended port 80/443. Backend needs
    strict mode config: only connect via specified ports. (How to configure)', + 'v2_cover' => [ + 'dtls' => 'DTLS 1.2', + 'http' => 'HTTP', + 'none' => 'None', + 'srtp' => 'SRTP', + 'utp' => 'uTP', + 'wechat' => 'WeChat Video', + 'wireguard' => 'WireGuard', + ], + 'v2_host_hint' => 'When using HTTP camouflage, multiple domains should be separated by commas, while WebSocket only allows a single domain.', + 'v2_method_hint' => 'WebSocket transmission protocol should not use \'none\' encryption method.', + 'v2_net_hint' => 'Please enable TLS for WebSocket', + 'v2_tls_provider_hint' => 'Different backends have different configs:', + ], + 'proxy_info' => '*Compatible with the Shadowsocks', + 'proxy_info_hint' => 'For compatibility, please add _compatible to protocol and obfuscation in server config', + 'refresh_geo' => 'Refresh Geography', + 'refresh_geo_all' => 'Refresh Geo Data', + 'reload' => 'Reload Backend', + 'reload_all' => 'Reload All Backends', + 'reload_confirm' => 'Do you want to reload the server backend?', + 'traffic_monitor' => 'Traffic Stats', + ], + 'oauth' => [ + 'counts' => 'Total :num Authorization Records', + 'title' => 'OAuth', + ], + 'optional' => 'Optional', + 'permission' => [ + 'counts' => 'Total :num Permissions', + 'description_hint' => 'Description, e.g. [X system] Edit A', + 'name_hint' => 'Route name, e.g. admin.user.update', + 'title' => 'Permissions', + ], + 'query' => 'Query', + 'report' => [ + 'annually_accounting' => 'Annual Transactions', + 'annually_site_flow' => 'Annual Traffic Consumption', + 'avg_traffic_30d' => 'Avg Daily Traffic Over 30 Days', + 'current_month' => 'This Month', + 'current_year' => 'This Year', + 'daily_accounting' => 'Daily Transactions', + 'daily_distribution' => 'Daily distribution', + 'daily_site_flow' => 'Daily Traffic Consumption', + 'daily_traffic' => 'Daily Traffic', + 'hourly_traffic' => 'Hourly Traffic', + 'last_month' => 'Last Month', + 'last_year' => 'Last Year', + 'monthly_accounting' => 'Monthly Transactions', + 'monthly_site_flow' => 'Monthly Traffic Consumption', + 'select_hourly_date' => 'Select Hourly Date', + 'sum_traffic_30d' => '30-Day Traffic Ratio', + 'today' => 'Today', + ], + 'require' => 'Required', + 'role' => [ + 'counts' => 'Total :num Roles', + 'description_hint' => 'Display name, e.g. Administrator', + 'modify_admin_error' => 'Do not modify the super admin!', + 'name_hint' => 'Unique identifier, e.g. admin', + 'permissions_all' => 'All Permissions', + 'title' => 'Roles', + ], + 'rule' => [ 'counts' => 'Total :num Rules', - 'title' => 'Rules', 'group' => [ + 'counts' => 'Total :num Groups', + 'title' => 'Rule Groups', 'type' => [ 'off' => 'Block', 'on' => 'Allow', ], - 'title' => 'Rule Groups', - 'counts' => 'Total :num Groups', ], - ], - 'role' => [ - 'name_hint' => 'Unique identifier, e.g. admin', - 'description_hint' => 'Display name, e.g. Administrator', - 'title' => 'Roles', - 'permissions_all' => 'All Permissions', - 'counts' => 'Total :num Roles', - ], - 'report' => [ - 'daily_accounting' => 'Daily Transactions', - 'monthly_accounting' => 'Monthly Transactions', - 'annually_accounting' => 'Annual Transactions', - 'daily_site_flow' => 'Daily Traffic Consumption', - 'monthly_site_flow' => 'Monthly Traffic Consumption', - 'annually_site_flow' => 'Annual Traffic Consumption', - 'current_month' => 'This Month', - 'last_month' => 'Last Month', - 'current_year' => 'This Year', - 'last_year' => 'Last Year', - 'hourly_traffic' => 'Hourly Traffic', - 'daily_traffic' => 'Daily Traffic', - 'daily_distribution' => 'Daily distribution', - 'today' => 'Today', - 'avg_traffic_30d' => 'Avg Daily Traffic Over 30 Days', - 'sum_traffic_30d' => '30-Day Traffic Ratio', - 'select_hourly_date' => 'Select Hourly Date', - ], - 'permission' => [ - 'title' => 'Permissions', - 'description_hint' => 'Description, e.g. [X system] Edit A', - 'name_hint' => 'Route name, e.g. admin.user.update', - 'counts' => 'Total :num Permissions', - ], - 'marketing' => [ - 'push_send' => 'Send Notification', - 'email_send' => 'Send Email', - 'email' => [ - 'targeted_users_count' => 'Targeted Users Count', - 'loading_statistics' => 'Loading Statistics...', - 'filters' => 'Filters', - 'expired_date' => 'Expired Date', - 'will_expire_date' => 'Will Expire Date', - 'traffic_usage_over' => 'Traffic Usage Over N%', - 'recently_active' => 'Recently Active', - 'paid_servicing' => 'Paid Servicing', - 'previously_paid' => 'Used to Pay', - 'ever_paid' => 'Ever Paid', - 'never_paid' => 'Never Paid', - 'recent_traffic_abnormal' => 'Traffic Abnormal in Last Hour', - ], - 'counts' => 'Total :num Emails', - 'send_status' => 'Send Status', - 'send_time' => 'Sent On', - 'error_message' => 'Error Messages', - 'processed' => 'Request Processed', - 'targeted_users_not_found' => 'Targeted Users Not Found', - 'unknown_sending_type' => 'Unknown Sending Type', - ], - 'creating' => 'Adding...', - 'article' => [ + 'title' => 'Rules', 'type' => [ - 'knowledge' => 'Article', - 'announcement' => 'Announcement', + 'domain' => 'Domain', + 'ip' => 'IP', + 'protocol' => 'Protocol', + 'reg' => 'Regex', ], - 'category_hint' => 'Same category will be grouped together', - 'logo_placeholder' => 'Or enter logo URL', - 'title' => 'Articles', - 'counts' => 'Total :num Articles', - ], - 'coupon' => [ - 'title' => 'Coupons', - 'name_hint' => 'For display', - 'sn_hint' => 'Leave blank for 8-digit random code', - 'type' => [ - 'voucher' => 'Voucher', - 'discount' => 'Discount', - 'charge' => 'Recharge', - ], - 'type_hint' => 'Reduction: deduct amount; Discount: percentage off; Recharge: add amount to balance', - 'value' => '{1} ➖ :num|{2} :num% off|{3} ➕ :num', - 'value_hint' => 'Range is 1% to 99%', - 'priority_hint' => 'Highest eligible priority coupon used first. Max 255', - 'minimum_hint' => 'Only usable when payment exceeds :num', - 'used_hint' => 'Each user can use this :num times max', - 'levels_hint' => 'Only usable for selected user levels', - 'groups_hint' => 'Only usable for selected user groups', - 'users_placeholder' => 'Enter user ID, press Enter', - 'user_whitelist_hint' => 'Whitelisted users can use, leave blank if unused', - 'users_blacklist_hint' => 'Blacklisted users cannot use, leave blank if unused', - 'services_placeholder' => 'Enter product ID, press Enter', - 'services_whitelist_hint' => 'Only usable for whitelisted products, leave blank if unused', - 'services_blacklist_hint' => 'Not usable for blacklisted products, leave blank if unused', - 'newbie' => [ - 'first_discount' => 'First-time Discount', - 'first_order' => 'First Order', - 'created_days' => 'Account Age', - ], - 'created_days_hint' => ':day days after registration', - 'limit_hint' => 'Rules have AND relation, use properly', - 'info_title' => 'Info', - 'counts' => 'Total :num Coupons', - 'discount' => 'Discount', - 'export_title' => 'Export', - 'single_use' => 'One-time Use', - ], - 'times' => 'Times', - 'massive_export' => 'Batch Export', - 'system_generate' => 'System Generated', - 'aff' => [ - 'rebate_title' => 'Rebate History', - 'counts' => 'Total :num Records', - 'title' => 'Withdraw Requests', - 'apply_counts' => 'Total :num Withdrawal Requests', - 'referral' => 'Referral Rebates', - 'commission_title' => 'Request Details', - 'commission_counts' => 'This application involves a total of :num orders', ], + 'select_all' => 'Select All', + 'selected_hint' => 'The allocated rules can be searched here', + 'set_to' => 'Set as :attribute', 'setting' => [ 'common' => [ - 'title' => 'General Config', - 'set_default' => 'Set as Default', 'connect_nodes' => '# of Nodes', + 'set_default' => 'Set as Default', + 'title' => 'General Config', ], 'email' => [ - 'title' => 'Email Filters (for registration)', - 'tail' => 'Email Suffix', - 'rule' => 'Restriction Type', 'black' => 'Blacklist', - 'white' => 'Whitelist', + 'rule' => 'Restriction Type', + 'tail' => 'Email Suffix', 'tail_placeholder' => 'Enter email suffix', - ], - 'system' => [ - 'title' => 'System Settings', - 'web' => 'General', - 'account' => 'Account', - 'node' => 'Node', - 'extend' => 'Advanced', - 'check_in' => 'Check-in', - 'promotion' => 'Affiliate', - 'notify' => 'Notification', - 'auto_job' => 'Automation', - 'other' => 'Logo|CS|Analytics', - 'payment' => 'Payment', - 'menu' => 'Menu', + 'title' => 'Email Filters (for registration)', + 'white' => 'Whitelist', ], 'no_permission' => 'No permission to change settings!', + 'system' => [ + 'account' => 'Account', + 'auto_job' => 'Automation', + 'check_in' => 'Check-in', + 'extend' => 'Advanced', + 'menu' => 'Menu', + 'node' => 'Node', + 'notify' => 'Notification', + 'other' => 'Logo|CS|Analytics', + 'payment' => 'Payment', + 'promotion' => 'Affiliate', + 'title' => 'System Settings', + 'web' => 'General', + ], ], + 'sort_asc' => 'Larger sort value has higher priority', + 'start_time' => 'Start', 'system' => [ + 'AppStore_id' => '[Apple] Account', + 'AppStore_password' => '[Apple] Password', 'account_expire_notification' => 'Account Expiration Notice', + 'active_account' => [ + 'after' => 'Activate after registration', + 'before' => 'Pre-registration activation', + ], 'active_times' => 'Max Account Activations', 'admin_invite_days' => '[Admin] Invitation Expiration', 'aff_salt' => '[Referral URL] Encrypt User ID', 'alipay_qrcode' => 'Alipay QR Code', - 'AppStore_id' => '[Apple] Account', - 'AppStore_password' => '[Apple] Password', 'auto_release_port' => 'Port Recycle', 'bark_key' => '[Bark] Device Key', + 'captcha' => [ + 'geetest' => 'Geetest', + 'hcaptcha' => 'hCaptcha', + 'recaptcha' => 'Google ReCaptcha', + 'standard' => 'Standard', + 'turnstile' => 'Turnstile', + ], 'captcha_key' => 'Captcha Key', 'captcha_secret' => 'Captcha Secret/ID', 'codepay_id' => '[CodePay] ID', @@ -521,6 +477,7 @@ return [ 'ddns_secret' => '[DNS] Secret', 'default_days' => 'Default Account Time', 'default_traffic' => 'Default Initial Data', + 'demo_restriction' => 'Modification of this configuration is prohibited in the demo environment!', 'detection_check_times' => 'Node Block Alerts', 'dingTalk_access_token' => '[DingTalk] Access Token', 'dingTalk_secret' => '[DingTalk] Secret', @@ -531,108 +488,19 @@ return [ 'f2fpay_app_id' => '[Alipay] APP ID', 'f2fpay_private_key' => '[Alipay] Private Key', 'f2fpay_public_key' => '[Alipay] Public Key', + 'forbid' => [ + 'china' => 'Forbid China Access', + 'mainland' => 'Forbid Chinese Mainland Access', + 'oversea' => 'Forbid Oversea Access', + ], 'forbid_mode' => 'Access Restriction', - 'invite_num' => 'Default Invitations', - 'is_activate_account' => 'Account Activation', - 'is_AliPay' => 'Alipay', - 'is_ban_status' => 'Expiration Ban', - 'is_captcha' => 'Captcha', - 'is_checkin' => 'Check-in Reward', - 'is_clear_log' => 'Clean Logs', - 'is_custom_subscribe' => 'Advanced Subscription', - 'is_email_filtering' => 'Email Filtering for User Registration', - 'is_forbid_robot' => 'Forbid Bots', - 'is_free_code' => 'Free Invitation Codes', - 'is_invite_register' => 'Invitation to Register', - 'is_otherPay' => 'Custom Payment', - 'is_QQPay' => 'QQ Pay', - 'is_rand_port' => 'Random Port', - 'is_register' => 'Registration', - 'is_subscribe_ban' => 'Subscription Ban', - 'is_traffic_ban' => 'Data Abuse Ban', - 'is_WeChatPay' => 'WeChat Pay', - 'iYuu_token' => '[IYUU] Token', - 'maintenance_content' => 'Maintenance Notice', - 'maintenance_mode' => 'Maintenance Mode', - 'maintenance_time' => 'Maintenance End', - 'min_port' => 'Port Range', - 'min_rand_traffic' => 'Data Range', - 'node_blocked_notification' => 'Node Blocked Notice', - 'node_daily_notification' => 'Daily Node Report', - 'node_offline_notification' => 'Node Offline Notice', - 'oauth_path' => 'OAuth Platforms', - 'offline_check_times' => 'Offline Notifications', - 'password_reset_notification' => 'Reset Password Notice', - 'paybeaver_app_id' => '[PayBeaver] App ID', - 'paybeaver_app_secret' => '[PayBeaver] App Secret', - 'payjs_key' => '[PayJs] Key', - 'payjs_mch_id' => '[PayJs] Merchant ID', - 'payment_confirm_notification' => 'Manual Payment Confirmation', - 'payment_received_notification' => 'Payment Success Notice', - 'paypal_app_id' => 'App ID', - 'paypal_client_id' => 'Client ID', - 'paypal_client_secret' => 'Client Secret', - 'pushDeer_key' => '[PushDeer] Key', - 'pushplus_token' => '[PushPlus] Token', - 'rand_subscribe' => 'Random Subscription', - 'redirect_url' => 'Redirect URL', - 'referral_money' => 'Min Withdrawal Limit', - 'referral_percent' => 'Rebate Percentage', - 'referral_status' => 'Affiliate', - 'referral_traffic' => 'Registration Bonus', - 'referral_type' => 'Rebate Type', - 'register_ip_limit' => 'Registration IP Limit', - 'reset_password_times' => 'Reset Limit', - 'reset_traffic' => 'Auto Reset Data', - 'server_chan_key' => '[ServerChan] SCKEY', - 'standard_currency' => 'Primary Currency', - 'stripe_public_key' => 'Public Key', - 'stripe_secret_key' => 'Secret Key', - 'stripe_signing_secret' => 'Webhook Secret', - 'subject_name' => 'Custom Product Name', - 'subscribe_ban_times' => 'Subscription Limit', - 'subscribe_domain' => 'Subscription URL', - 'subscribe_max' => 'Max Subscription Nodes', - 'telegram_token' => 'Telegram Token', - 'tg_chat_token' => 'TG Chat Token', - 'theadpay_key' => '[THeadPay] Key', - 'theadpay_mchid' => '[THeadPay] Merchant ID', - 'theadpay_url' => '[THeadPay] URL', - 'ticket_closed_notification' => 'Ticket Closed Notice', - 'ticket_created_notification' => 'Ticket Creation Notice', - 'ticket_replied_notification' => 'Ticket Reply Notice', - 'traffic_ban_time' => 'Ban Duration', - 'traffic_ban_value' => 'Data Abuse Threshold', - 'traffic_limit_time' => 'Check-in Interval', - 'traffic_warning_percent' => 'Data Usage Warning', - 'trojan_license' => 'Trojan License', - 'username_type' => 'Account Username Type', - 'user_invite_days' => '[User] Invitation Expiry', - 'v2ray_license' => 'V2Ray License', - 'v2ray_tls_provider' => 'V2Ray TLS Config', - 'webmaster_email' => 'Admin Email', - 'website_analytics' => 'Analytics Code', - 'website_callback_url' => 'Payment Callback Domain', - 'website_customer_service' => 'CS Code', - 'website_home_logo' => 'Homepage Logo', - 'website_logo' => 'Inner Page Logo', - 'website_name' => 'Site Name', - 'website_security_code' => 'Security Code', - 'website_url' => 'Site Domain', - 'web_api_url' => 'API Domain', - 'wechat_aid' => 'WeChat AID', - 'wechat_cid' => 'WeChat CID', - 'wechat_encodingAESKey' => 'WeChat Encoding Key', - 'wechat_qrcode' => 'WeChat QR Code', - 'wechat_secret' => 'WeChat Secret', - 'wechat_token' => 'WeChat Token', 'hint' => [ + 'AppStore_id' => 'Used in articles', + 'AppStore_password' => 'Used in articles', 'account_expire_notification' => 'Notify expiration', 'active_times' => 'Via email in 24 hours', 'admin_invite_days' => 'Admin invitation expiration', 'aff_salt' => 'Encryption salt for referral URL', - 'AppStore_id' => 'Used in articles', - 'AppStore_password' => 'Used in articles', 'auto_release_port' => 'Auto release port after being banned/expired for '.config('tasks.release_port').' days', 'bark_key' => 'Device key for iOS push', 'captcha_key' => 'Browse setup guide', @@ -650,6 +518,7 @@ return [ 'f2fpay_private_key' => 'Alipay private key from secret key tool', 'f2fpay_public_key' => 'Not the APP public key!', 'forbid_mode' => 'Block access from specified regions', + 'iYuu_token' => 'Fill IYUU token before enabling', 'invite_num' => 'Default number of invitations per user', 'is_activate_account' => 'Require activation via email', 'is_ban_status' => '(Caution) Ban account will reset all user data', @@ -664,14 +533,14 @@ return [ 'is_register' => 'Disable registration if unchecked', 'is_subscribe_ban' => 'Auto ban if subscription requests exceed threshold', 'is_traffic_ban' => 'Auto disable service if data exceeds threshold in 1 hour', - 'iYuu_token' => 'Fill IYUU token before enabling', 'maintenance_content' => 'Custom maintenance announcement', - 'maintenance_mode' => "Redirect normal users to maintenance page if enabled| Admin can login via :url", + 'maintenance_mode' => 'Redirect normal users to maintenance page if enabled| Admin can login via :url', 'maintenance_time' => 'For maintenance page countdown', 'min_port' => 'Port range 1000 - 65535', 'node_blocked_notification' => 'Detect node block hourly, notify admins', 'node_daily_notification' => 'Daily node usage report', 'node_offline_notification' => 'Detect offline every 10 mins, notify if any node is offline', + 'node_renewal_notification' => 'Remind the administrator to renew the node 7 days, 3 days, and 1 day before expiration', 'oauth_path' => 'Please enable platforms in .ENV first', 'offline_check_times' => 'Stop notification after N alerts in 24 hours', 'password_reset_notification' => 'Allow password reset via email if enabled', @@ -707,9 +576,10 @@ return [ 'traffic_ban_value' => 'Trigger auto account ban if exceeds this value in 1 hour', 'traffic_limit_time' => 'Time interval between check-ins', 'traffic_warning_percent' => 'Send traffic exhaustion notice when daily usage reaches this percentage', - 'username_type' => 'Default username type for users', 'user_invite_days' => 'Expiration of user-generated invitation codes', + 'username_type' => 'Default username type for users', 'v2ray_tls_provider' => 'Node settings override this TLS config', + 'web_api_url' => 'E.g. '.config('app.url'), 'webmaster_email' => 'Contact email shown in some error messages', 'website_analytics' => 'Analytics JavaScript code', 'website_callback_url' => 'Prevent payment callback failure due to DNS poisoning', @@ -717,97 +587,247 @@ return [ 'website_name' => 'Website name in emails', 'website_security_code' => 'Require security code to access site if set', 'website_url' => 'Main domain used for links', - 'web_api_url' => 'E.g. '.config('app.url'), 'wechat_aid' => 'App Management -> AgentId', 'wechat_cid' => 'Get from Enterprise Info', 'wechat_encodingAESKey' => 'App Management -> App Settings -> EncodingAESKey', 'wechat_secret' => 'App secret (need enterprise WeChat to view)', 'wechat_token' => 'App Settings -> TOKEN, callback URL: :url', ], - 'placeholder' => [ - 'default_url' => 'Default as :url', - 'server_chan_key' => 'Fill ServerChan SCKEY then click Update', - 'pushDeer_key' => 'Fill PushDeer Push Key then click Update', - 'iYuu_token' => 'Fill IYUU token then click Update', - 'bark_key' => 'Fill Bark device key then click Update', - 'telegram_token' => 'Fill Telegram token then click Update', - 'pushplus_token' => 'Please apply at ServerChan', - 'dingTalk_access_token' => 'Custom bot access token', - 'dingTalk_secret' => 'Custom bot secret after signing', - 'wechat_aid' => 'WeChat Enterprise App AID', - 'wechat_cid' => 'Fill WeChat CID then click Update', - 'wechat_secret' => 'WeChat Enterprise App secret', - 'tg_chat_token' => 'Please apply at Telegram', - 'codepay_url' => 'https://codepay.fatq.com/create_order/?', + 'iYuu_token' => '[IYUU] Token', + 'invite_num' => 'Default Invitations', + 'is_AliPay' => 'Alipay', + 'is_QQPay' => 'QQ Pay', + 'is_WeChatPay' => 'WeChat Pay', + 'is_activate_account' => 'Account Activation', + 'is_ban_status' => 'Expiration Ban', + 'is_captcha' => 'Captcha', + 'is_checkin' => 'Check-in Reward', + 'is_clear_log' => 'Clean Logs', + 'is_custom_subscribe' => 'Advanced Subscription', + 'is_email_filtering' => 'Email Filtering for User Registration', + 'is_forbid_robot' => 'Forbid Bots', + 'is_free_code' => 'Free Invitation Codes', + 'is_invite_register' => 'Invitation to Register', + 'is_otherPay' => 'Custom Payment', + 'is_rand_port' => 'Random Port', + 'is_register' => 'Registration', + 'is_subscribe_ban' => 'Subscription Ban', + 'is_traffic_ban' => 'Data Abuse Ban', + 'maintenance_content' => 'Maintenance Notice', + 'maintenance_mode' => 'Maintenance Mode', + 'maintenance_time' => 'Maintenance End', + 'min_port' => 'Port Range', + 'min_rand_traffic' => 'Data Range', + 'node_blocked_notification' => 'Node Blocked Notice', + 'node_daily_notification' => 'Daily Node Report', + 'node_offline_notification' => 'Node Offline Notice', + 'node_renewal_notification' => 'Node Renewal Notice', + 'notification' => [ + 'channel' => [ + 'bark' => 'Bark', + 'dingtalk' => 'DingTalk', + 'email' => 'Email', + 'iyuu' => 'IYUU', + 'pushdeer' => 'PushDeer', + 'pushplus' => 'PushPlus', + 'serverchan' => 'ServerChan', + 'site' => 'Site Popup', + 'telegram' => 'Telegram', + 'tg_chat' => 'TG Chat', + 'wechat' => 'Enterprise WeChat', + ], + 'send_test' => 'Send Test Message', + 'test' => [ + 'content' => 'Test content', + 'success' => 'Sent successfully. Please check your phone for the push notification.', + 'title' => 'This is a test title', + 'unknown_channel' => 'Unknown channel', + ], ], + 'oauth_path' => 'OAuth Platforms', + 'offline_check_times' => 'Offline Notifications', + 'params_required' => 'Please complete the necessary parameters for this :attribute first!', + 'password_reset_notification' => 'Reset Password Notice', + 'paybeaver_app_id' => '[PayBeaver] App ID', + 'paybeaver_app_secret' => '[PayBeaver] App Secret', + 'payjs_key' => '[PayJs] Key', + 'payjs_mch_id' => '[PayJs] Merchant ID', 'payment' => [ 'attribute' => 'Payment Gateway', 'channel' => [ 'alipay' => 'Alipay F2F', 'codepay' => 'CodePay', 'epay' => 'ePay', + 'manual' => 'Manual Pay', + 'paybeaver' => 'PayBeaver', 'payjs' => 'PayJs', 'paypal' => 'PayPal', 'stripe' => 'Stripe', - 'paybeaver' => 'PayBeaver', 'theadpay' => 'THeadPay', - 'manual' => 'Manual Pay', ], 'hint' => [ 'alipay' => 'This feature requires going to Ant Financial Services Open Platform to apply for permission and application', 'codepay' => 'Please go to CodePay. Apply for an account, download and set up its software', + 'manual' => 'After the gateway is set and selected, it will be displayed on the user-end', + 'paybeaver' => 'Please go to PayBeaver to apply an account', 'payjs' => 'Please go to PayJs to apply an account', 'paypal' => 'Login to the API credentials application page with your merchant account, agree and get setup information', - 'paybeaver' => 'Please go to PayBeaver to apply an account', 'theadpay' => 'Please go to THeadPay to request an account', - 'manual' => 'After the gateway is set and selected, it will be displayed on the user-end', ], ], - 'notification' => [ - 'channel' => [ - 'telegram' => 'Telegram', - 'wechat' => 'Enterprise WeChat', - 'dingtalk' => 'DingTalk', - 'email' => 'Email', - 'bark' => 'Bark', - 'serverchan' => 'ServerChan', - 'pushdeer' => 'PushDeer', - 'pushplus' => 'PushPlus', - 'iyuu' => 'IYUU', - 'tg_chat' => 'TG Chat', - 'site' => 'Site Popup', - ], - 'send_test' => 'Send Test Message', + 'payment_confirm_notification' => 'Manual Payment Confirmation', + 'payment_received_notification' => 'Payment Success Notice', + 'paypal_app_id' => 'App ID', + 'paypal_client_id' => 'Client ID', + 'paypal_client_secret' => 'Client Secret', + 'placeholder' => [ + 'bark_key' => 'Fill Bark device key then click Update', + 'codepay_url' => 'https://codepay.fatq.com/create_order/?', + 'default_url' => 'Default as :url', + 'dingTalk_access_token' => 'Custom bot access token', + 'dingTalk_secret' => 'Custom bot secret after signing', + 'iYuu_token' => 'Fill IYUU token then click Update', + 'pushDeer_key' => 'Fill PushDeer Push Key then click Update', + 'pushplus_token' => 'Please apply at ServerChan', + 'server_chan_key' => 'Fill ServerChan SCKEY then click Update', + 'telegram_token' => 'Fill Telegram token then click Update', + 'tg_chat_token' => 'Please apply at Telegram', + 'wechat_aid' => 'WeChat Enterprise App AID', + 'wechat_cid' => 'Fill WeChat CID then click Update', + 'wechat_secret' => 'WeChat Enterprise App secret', ], - 'forbid' => [ - 'mainland' => 'Forbid Chinese Mainland Access', - 'china' => 'Forbid China Access', - 'oversea' => 'Forbid Oversea Access', + 'pushDeer_key' => '[PushDeer] Key', + 'pushplus_token' => '[PushPlus] Token', + 'rand_subscribe' => 'Random Subscription', + 'redirect_url' => 'Redirect URL', + 'referral' => [ + 'loop' => 'Always Rebate', + 'once' => 'First Purchase Rebate', ], + 'referral_money' => 'Min Withdrawal Limit', + 'referral_percent' => 'Rebate Percentage', + 'referral_status' => 'Affiliate', + 'referral_traffic' => 'Registration Bonus', + 'referral_type' => 'Rebate Type', + 'register_ip_limit' => 'Registration IP Limit', + 'reset_password_times' => 'Reset Limit', + 'reset_traffic' => 'Auto Reset Data', + 'server_chan_key' => '[ServerChan] SCKEY', + 'standard_currency' => 'Primary Currency', + 'stripe_public_key' => 'Public Key', + 'stripe_secret_key' => 'Secret Key', + 'stripe_signing_secret' => 'Webhook Secret', + 'subject_name' => 'Custom Product Name', + 'subscribe_ban_times' => 'Subscription Limit', + 'subscribe_domain' => 'Subscription URL', + 'subscribe_max' => 'Max Subscription Nodes', + 'telegram_token' => 'Telegram Token', + 'tg_chat_token' => 'TG Chat Token', + 'theadpay_key' => '[THeadPay] Key', + 'theadpay_mchid' => '[THeadPay] Merchant ID', + 'theadpay_url' => '[THeadPay] URL', + 'ticket_closed_notification' => 'Ticket Closed Notice', + 'ticket_created_notification' => 'Ticket Creation Notice', + 'ticket_replied_notification' => 'Ticket Reply Notice', + 'traffic_ban_time' => 'Ban Duration', + 'traffic_ban_value' => 'Data Abuse Threshold', + 'traffic_limit_time' => 'Check-in Interval', + 'traffic_warning_percent' => 'Data Usage Warning', + 'trojan_license' => 'Trojan License', + 'user_invite_days' => '[User] Invitation Expiry', 'username' => [ + 'any' => 'Any Username', 'email' => 'Email', 'mobile' => 'Phone number', - 'any' => 'Any Username', ], - 'active_account' => [ - 'before' => 'Pre-registration activation', - 'after' => 'Activate after registration', + 'username_type' => 'Account Username Type', + 'v2ray_license' => 'V2Ray License', + 'v2ray_tls_provider' => 'V2Ray TLS Config', + 'web_api_url' => 'API Domain', + 'webmaster_email' => 'Admin Email', + 'website_analytics' => 'Analytics Code', + 'website_callback_url' => 'Payment Callback Domain', + 'website_customer_service' => 'CS Code', + 'website_home_logo' => 'Homepage Logo', + 'website_logo' => 'Inner Page Logo', + 'website_name' => 'Site Name', + 'website_security_code' => 'Security Code', + 'website_url' => 'Site Domain', + 'wechat_aid' => 'WeChat AID', + 'wechat_cid' => 'WeChat CID', + 'wechat_encodingAESKey' => 'WeChat Encoding Key', + 'wechat_qrcode' => 'WeChat QR Code', + 'wechat_secret' => 'WeChat Secret', + 'wechat_token' => 'WeChat Token', + ], + 'system_generate' => 'System Generated', + 'ticket' => [ + 'close_confirm' => 'Do you want to close this ticket?', + 'counts' => 'Total :num Tickets', + 'error' => 'Unknown error! Please check logs', + 'inviter_info' => 'Inviter Info', + 'self_send' => 'You cannot create a ticket for yourself!', + 'send_to' => 'Please fill in target user details', + 'title' => 'Tickets', + 'user_info' => 'User Info', + ], + 'times' => 'Times', + 'tools' => [ + 'analysis' => [ + 'file_missing' => ':file_name does not exist. Please create the file first.', + 'not_enough' => 'Less than 15,000 records, unable to analyze', + 'req_url' => 'Recent Request URL Records', + 'title' => 'SSR Log Analysis For single node', ], - 'captcha' => [ - 'standard' => 'Standard', - 'geetest' => 'Geetest', - 'recaptcha' => 'Google ReCaptcha', - 'hcaptcha' => 'hCaptcha', - 'turnstile' => 'Turnstile', + 'convert' => [ + 'content_placeholder' => 'Please fill in the configuration information that needs to be converted.', + 'file_missing' => 'File not found. Please check directory permissions.', + 'missing_error' => 'Conversion failed: The configuration information is missing the [port_password] field, or this field is empty.', + 'params_unknown' => 'Parameter exception', + 'title' => 'Format Conversion SS to SSR', ], - 'referral' => [ - 'once' => 'First Purchase Rebate', - 'loop' => 'Always Rebate', + 'decompile' => [ + 'attribute' => 'Reverse Parsing Configuration Link', + 'content_placeholder' => 'Please fill in the ShadowsocksR links that need to be reverse-parsed, separated by line breaks.', + 'title' => 'Decompile Config Info', + ], + 'import' => [ + 'file_error' => 'An unknown error occurred. Please re-upload.', + 'file_required' => 'Please select a file to upload', + 'file_type_error' => 'Only :type files are allowed for upload.', + 'format_error' => 'Content format parsing error. Please upload a :type file that meets the specified format.', ], ], - 'set_to' => 'Set as :attribute', - 'minute' => 'minutes', - 'query' => 'Query', - 'optional' => 'Optional', - 'require' => 'Required', + 'unselected_hint' => 'Rules to be allocated can be searched here', + 'user' => [ + 'admin_deletion' => 'System administrators cannot be deleted', + 'bulk_account_quantity' => 'Number of accounts generated in bulk', + 'connection_test' => 'Connection Test', + 'counts' => 'Total :num Accounts', + 'group' => [ + 'counts' => 'Total :num Groups', + 'name' => 'Group Name', + 'title' => 'User Group Control (A node can be in multiple groups, but the user can only belong to one group; for nodes visible/available to users, group has more priority than level)', + ], + 'info' => [ + 'account' => 'Account Info', + 'expired_date_hint' => 'Leave blank for a default validity of one year', + 'proxy' => 'Proxy Info', + 'recharge_placeholder' => 'If negative, deducts balance', + 'reset_date_hint' => 'Next data reset date', + 'switch' => 'Switch Identity', + 'uuid_hint' => 'UUID for V2Ray', + ], + 'online_monitor' => 'Online Monitoring', + 'proxies_config' => 'Connection Info for :username', + 'proxy_info' => 'Config Info', + 'reset_confirm' => [0 => 'Do you want to reset [', 1 => ']\'s traffic?'], + 'reset_traffic' => 'Reset Data', + 'traffic_monitor' => 'Traffic Stats', + 'update_help' => 'Update successful, go back?', + 'user_view' => 'Switch to User View', + ], + 'user_dashboard' => 'User Dashboard', + 'yes' => 'Yes', + 'zero_unlimited_hint' => '0 or empty for unlimited', ]; diff --git a/resources/lang/en/auth.php b/resources/lang/en/auth.php index 3bb1fb3e..7a130837 100644 --- a/resources/lang/en/auth.php +++ b/resources/lang/en/auth.php @@ -40,27 +40,18 @@ return [ ], 'failed' => 'Invalid credentials.', 'invite' => [ - 'attribute' => 'Invitation Code', - 'error' => [ - 'unavailable' => 'Invalid invitation code, please try again.', - ], 'get' => 'Get invitation code', 'not_required' => 'No invitation code required, you can register directly!', + 'unavailable' => 'Invalid invitation code, please try again.', ], 'login' => 'Login', 'logout' => 'Logout', 'maintenance' => 'Maintenance', 'maintenance_tip' => 'Under maintenance', 'oauth' => [ - 'bind_failed' => 'Binding failed', - 'bind_success' => 'Binding successful', 'login_failed' => 'Third-party login failed!', - 'rebind_success' => 'Rebinding successful', 'register' => 'Quick Register', - 'register_failed' => 'Registration failed', 'registered' => 'Already registered, please login directly.', - 'unbind_failed' => 'Unbinding failed', - 'unbind_success' => 'Unbinding successful', ], 'one-click_login' => 'One-Click Login', 'optional' => 'Optional', @@ -73,7 +64,6 @@ return [ 'error' => [ 'demo' => 'Cannot change admin password in demo mode.', 'disabled' => 'Password reset disabled, please contact :email for assistance.', - 'failed' => 'Password reset failed.', 'same' => 'New password cannot be the same as old one, please re-enter.', 'throttle' => 'You can only reset password :time times in 24 hours, do not operate too frequently.', 'wrong' => 'Incorrect password, please try again.', @@ -91,7 +81,6 @@ return [ ], 'failed' => 'Registration failed, please try again later.', 'promotion' => 'No account yet? Please go to ', - 'success' => 'Registration successful', ], 'remember_me' => 'Remember Me', 'request' => 'Request', diff --git a/resources/lang/en/common.php b/resources/lang/en/common.php index 9bd19f00..41899e44 100644 --- a/resources/lang/en/common.php +++ b/resources/lang/en/common.php @@ -3,141 +3,149 @@ declare(strict_types=1); return [ - 'hour' => '{1} Hour|{2} O\'clock', 'account' => 'Account', + 'action' => 'Action', + 'active_item' => 'Activate :attribute', + 'add' => 'Add', + 'advance' => 'Advance', + 'all' => 'All', + 'applied' => ':attribute applied', + 'apply' => 'Apply', 'available_date' => 'Validity Period', - 'created_at' => 'Date Created', - 'expired_at' => 'Expiry Date', - 'updated_at' => 'Last Updated', - 'latest_at' => 'Last Activity', + 'avatar' => 'Avatar', 'back' => 'Back', 'back_to' => 'Back to :page', + 'bark' => [ + 'custom' => 'Custom message', + 'node_status' => 'Node Status', + ], 'cancel' => 'Cancel', + 'change' => 'Change', 'close' => 'Close', 'close_item' => 'Close :attribute', 'confirm' => 'Confirm', 'continue' => 'Continue', - 'open' => 'Open', - 'send' => 'Send', - 'view' => 'View', - 'reset' => 'Reset', + 'convert' => 'Convert', 'copy' => [ 'attribute' => 'Copy', - 'success' => 'Copied successfully', 'failed' => 'Copy failed, please copy manually', + 'success' => 'Copied successfully', ], - 'add' => 'Add', - 'free' => 'Free', - 'change' => 'Change', - 'submit' => 'Submit', - 'submit_item' => 'Submit :attribute', - 'generate' => 'Generate', - 'generate_item' => 'Generate :attribute', - 'to_safari' => [0 => 'Click the upper right corner', 1 => ', then choose', 2 => 'Open in Safari', 3 => ' to properly access this site!'], - 'update_browser' => [0 => 'You are using an ', 1 => 'outdated', 2 => ' browser. Please', 3 => 'upgrade your browser', 4 => 'for the best experience'], - 'apply' => 'Apply', - 'avatar' => 'Avatar', + 'create' => 'Create', + 'created_at' => 'Date Created', 'customize' => 'Customize', - 'all' => 'All', - 'default' => 'Default', - 'download' => 'Download', - 'goto' => 'Go to', - 'warning' => 'Warning', - 'success' => 'Success', - 'success_item' => ':attribute succeeded', - 'failed' => 'Failed', - 'failed_item' => ':attribute failed', - 'update' => 'Update', - 'update_action' => 'Update :action', - 'none' => 'None', - 'new' => 'New', - 'sorry' => 'Sorry', - 'applied' => ':attribute applied', - 'active_item' => 'Activate :attribute', - 'error' => 'Error', - 'toggle' => 'Toggle', - 'toggle_action' => 'Toggle :action', - 'request_url' => 'Request URL', - 'function' => [ - 'navigation' => 'Navigation', - 'menubar' => 'Menubar', - 'fullscreen' => 'Fullscreen', - ], 'days' => [ 'attribute' => '{1} Days|{2} Day', + 'next' => 'Next Day', 'weekend' => 'Weekend', 'work' => 'Weekday', - 'next' => 'Next Day', ], - 'qrcode' => ':attribute QR Code', + 'default' => 'Default', + 'delete' => 'Delete', 'deleted' => 'Deleted', 'deleted_item' => ':attribute deleted', - 'print' => 'Print', - 'unlimited' => 'Unlimited', - 'payment' => [ - 'credit' => 'Credit', - 'alipay' => 'Alipay', - 'qq' => 'QQ Wallet', - 'wechat' => 'WeChat Pay', - 'crypto' => 'Cryptocurrency', - 'manual' => 'Manual Payment', - 'status' => [ - 'wait' => 'Pending Payment', - ], + 'developing' => 'Under development! Stay tuned', + 'download' => 'Download', + 'edit' => 'Edit', + 'error' => 'Error', + 'error_action_item' => ':action :attribute error', + 'error_item' => ':attribute Error', + 'exists_error' => 'There are associated accounts under this :attribute. Please remove the associations first!', + 'expired_at' => 'Expiry Date', + 'export' => 'Export', + 'failed' => 'Failed', + 'failed_action_item' => ':action :attribute failed', + 'failed_item' => ':attribute failed', + 'free' => 'Free', + 'function' => [ + 'fullscreen' => 'Fullscreen', + 'menubar' => 'Menubar', + 'navigation' => 'Navigation', ], + 'generate' => 'Generate', + 'generate_item' => 'Generate :attribute', + 'goto' => 'Go to', + 'hour' => '{1} Hour|{2} O\'clock', + 'import' => 'Import', + 'latest_at' => 'Last Activity', + 'more' => 'More', + 'new' => 'New', + 'none' => 'None', + 'open' => 'Open', + 'or' => 'or', 'order' => [ 'status' => [ 'canceled' => 'Canceled', 'completed' => 'Completed', - 'prepaid' => 'Prepaid', 'ongoing' => 'Ongoing', + 'prepaid' => 'Prepaid', 'review' => 'Pending Review', ], ], + 'payment' => [ + 'alipay' => 'Alipay', + 'credit' => 'Credit', + 'crypto' => 'Cryptocurrency', + 'manual' => 'Manual Payment', + 'qq' => 'QQ Wallet', + 'wechat' => 'WeChat Pay', + ], + 'print' => 'Print', + 'qrcode' => ':attribute QR Code', + 'random_generate' => 'Leave empty to generate randomly', 'recommend' => 'Recommend', - 'advance' => 'Advance', - 'action' => 'Action', + 'request' => 'Request', + 'request_failed' => 'Request failed, please retry', + 'request_url' => 'Request URL', + 'reset' => 'Reset', 'search' => 'Search', - 'edit' => 'Edit', - 'delete' => 'Delete', + 'send' => 'Send', + 'sorry' => 'Sorry', 'status' => [ + 'applying' => 'Applying', 'attribute' => 'Status', - 'inactive' => 'Inactive', - 'disabled' => 'Disabled', + 'available' => 'Available', 'banned' => 'Banned', - 'normal' => 'Normal', + 'closed' => 'Closed', + 'disabled' => 'Disabled', 'enabled' => 'Enabled', 'expire' => 'Expired', + 'inactive' => 'Inactive', 'limited' => 'Limited', - 'run_out' => 'Data Used Up', - 'unused' => 'Unused', - 'used' => 'Used', - 'closed' => 'Closed', - 'applying' => 'Applying', - 'withdrawn' => 'Withdrawn', - 'unwithdrawn' => 'Unwithdrawn', - 'reply' => 'Replied', + 'normal' => 'Normal', + 'paid' => 'Paid', + 'pass' => 'Pass', + 'payment_pending' => 'Payment Pending', 'pending' => 'Pending', - 'unknown' => 'Unknown', - 'available' => 'Available', + 'pending_dispatch' => 'Pending delivery', 'reject' => 'Reject', 'rejected' => 'Rejected', + 'reply' => 'Replied', 'review' => 'Pending Review', 'reviewed' => 'Reviewed', - 'paid' => 'Paid', - 'payment_pending' => 'Payment Pending', - 'pass' => 'Pass', + 'run_out' => 'Data Used Up', 'send_to_credit' => 'Add to Credit', - 'waiting_tobe_send' => 'Waiting to be Sent', + 'unknown' => 'Unknown', + 'unused' => 'Unused', + 'used' => 'Used', + 'withdrawal_pending' => 'Unwithdrawn', + 'withdrawn' => 'Withdrawn', ], 'stay_unchanged' => 'Leave empty to stay unchanged', - 'random_generate' => 'Leave empty to generate randomly', - 'request_failed' => 'Request failed, please retry', - 'convert' => 'Convert', - 'import' => 'Import', - 'or' => 'or', - 'more' => 'More', + 'storage_logo' => 'Logo Storage', + 'store' => 'Storage', + 'submit' => 'Submit', + 'success' => 'Success', + 'success_action_item' => ':action :attribute success', + 'success_item' => ':attribute succeeded', 'to' => 'to', 'to_be_send' => 'To be sent', - 'developing' => 'Under development! Stay tuned', + 'to_safari' => 'Click the icon in the upper right corner, then select Open in Safari Safari to access our site properly!', + 'toggle' => 'Toggle', + 'toggle_action' => 'Toggle :action', + 'unlimited' => 'Unlimited', + 'update' => 'Update', + 'updated_at' => 'Last Updated', + 'view' => 'View', + 'warning' => 'Warning', ]; diff --git a/resources/lang/en/errors.php b/resources/lang/en/errors.php index 6b988eda..a6b7af64 100644 --- a/resources/lang/en/errors.php +++ b/resources/lang/en/errors.php @@ -8,29 +8,29 @@ return [ 'bots' => 'Detected bot access, access denied', 'china' => 'Detected China IP or proxy access, access denied', 'oversea' => 'Detected overseas IP or proxy access, access denied', - 'unknown' => 'Unknown forbidden access mode! Please modify the [Access Restriction] in the system settings!', 'redirect' => 'Detected (:ip :url) accessing through a subscription link, forcing a redirect.', + 'unknown' => 'Unknown forbidden access mode! Please modify the [Access Restriction] in the system settings!', ], + 'get_ip' => 'Failed to retrieve IP information', 'log' => 'Log', 'refresh' => 'Refresh', 'refresh_page' => 'Please refresh the page and try again', 'report' => 'The error carried a report: ', - 'safe_enter' => 'Safe Entrance', 'safe_code' => 'Please enter the safe code', + 'safe_enter' => 'Safe Entrance', + 'subscribe' => [ + 'banned_until' => 'Account banned until :time, please wait for unlock!', + 'expired' => 'Account expired! Please renew your subscription!', + 'none' => 'No available nodes', + 'out' => 'OUT OF DATA! Please purchase more or reset data!', + 'question' => 'Account issues!? Visit the website for details', + 'sub_banned' => 'Subscription banned! Visit the website for details', + 'unknown' => 'Invalid subscription link! Please obtain a new one!', + 'user' => 'Invalid URL, account does not exist!', + 'user_disabled' => 'Account Disabled! Contact Support!', + ], 'title' => '⚠️ Error Triggered', 'unsafe_enter' => 'Unsafe Entrance', 'visit' => 'Please visit', 'whoops' => 'Whoops!', - 'get_ip' => 'Failed to retrieve IP information', - 'subscribe' => [ - 'unknown' => 'Invalid subscription link! Please obtain a new one!', - 'sub_banned' => 'Subscription banned! Visit the website for details', - 'user' => 'Invalid URL, account does not exist!', - 'user_disabled' => 'Account Disabled! Contact Support!', - 'banned_until' => 'Account banned until :time, please wait for unlock!', - 'out' => 'OUT OF DATA! Please purchase more or reset data!', - 'expired' => 'Account expired! Please renew your subscription!', - 'question' => 'Account issues!? Visit the website for details', - 'none' => 'No available nodes', - ], ]; diff --git a/resources/lang/en/model.php b/resources/lang/en/model.php index 0cab622b..582f662b 100644 --- a/resources/lang/en/model.php +++ b/resources/lang/en/model.php @@ -3,105 +3,114 @@ declare(strict_types=1); return [ - 'user' => [ - 'id' => 'User ID', - 'attribute' => 'User', - 'nickname' => 'Nickname', - 'username' => 'Username', - 'password' => 'Password', - 'credit' => 'Balance', - 'invite_num' => 'Available Invitations', - 'reset_date' => 'Data Reset Date', - 'port' => 'Port', - 'traffic_used' => 'Data Used', - 'service' => 'Proxy', - 'group' => 'Group', - 'account_status' => 'Account Status', - 'proxy_status' => 'Proxy Status', - 'expired_date' => 'Expiration Date', - 'role' => 'Role', - 'wechat' => 'WeChat', - 'qq' => 'QQ', - 'remark' => 'Note', - 'uuid' => 'VMess UUID', - 'proxy_passwd' => 'Proxy Password', - 'proxy_method' => 'Encryption', - 'usable_traffic' => 'Data Allowance', - 'proxy_protocol' => 'Protocol', - 'proxy_obfs' => 'Obfuscation', - 'speed_limit' => 'Speed Limit', - 'inviter' => 'Inviter', - 'created_date' => 'Registration Date', + 'aff' => [ + 'amount' => 'Order Amount', + 'commission' => 'Commission', + 'created_at' => 'Ordered On', + 'invitee' => 'Buyer', + 'updated_at' => 'Processed On', + ], + 'article' => [ + 'attribute' => 'Article', + 'category' => 'Category', + 'created_at' => 'Published On', + 'language' => 'Language', + 'logo' => 'Cover', + 'updated_at' => 'Updated On', ], 'common' => [ - 'extend' => 'Extended Info', - 'sort' => 'Sort', 'description' => 'Description', - 'type' => 'Type', + 'extend' => 'Extended Info', 'level' => 'Level', + 'sort' => 'Sort', + 'type' => 'Type', ], 'country' => [ 'code' => 'Country Code', 'icon' => 'Flag', 'name' => 'Country Name', ], - 'subscribe' => [ - 'code' => 'Sub Code', - 'req_times' => 'Request Times', - 'updated_at' => 'Last Request', - 'ban_time' => 'Ban Time', - 'ban_desc' => 'Ban Reason', - 'req_ip' => 'Request IP', - 'req_header' => 'Access Header', + 'coupon' => [ + 'attribute' => 'Coupon', + 'groups' => 'Group Limit', + 'levels' => 'Level Limit', + 'logo' => 'Logo', + 'minimum' => 'Minimum Spend', + 'name' => 'Name', + 'newbie' => 'New User Only', + 'num' => 'Quantity', + 'priority' => 'Priority', + 'services_blacklist' => 'Blacklist Goods', + 'services_whitelist' => 'Whitelist Goods', + 'sn' => 'Code', + 'usable_times' => 'Usage Limit', + 'used' => 'Personal Limit', + 'users_blacklist' => 'Blacklist Users', + 'users_whitelist' => 'Whitelist Users', + 'value' => 'Value', ], - 'oauth' => [ - 'type' => 'Channel', - 'identifier' => 'Identifier', + 'goods' => [ + 'attribute' => 'Goods', + 'available_date' => 'Validity Period', + 'category' => 'Category', + 'color' => 'Color', + 'hot' => 'Bestseller', + 'info' => 'Custom Info', + 'invite_num' => 'Bonus Invitations', + 'limit_num' => 'Purchase Limit', + 'logo' => 'Logo', + 'name' => 'Name', + 'period' => 'Reset Cycle', + 'price' => 'Price', + 'renew' => 'Data Renewal Price', + 'traffic' => 'Data Allowance', + 'user_limit' => 'User Speed Limit', ], - 'user_group' => [ - 'attribute' => 'User Group', - 'name' => 'Group Name', - 'nodes' => 'Nodes', + 'ip' => [ + 'info' => 'Location', + 'network_type' => 'Network Type', ], 'node' => [ 'attribute' => 'Node', - 'id' => 'Node ID', - 'name' => 'Name', - 'domain' => 'Domain', - 'static' => 'Alive Status', - 'online_user' => 'Online Users', + 'client_limit' => 'Client Limit', + 'country' => 'Country', 'data_consume' => 'Data Usage', 'data_rate' => 'Data Ratio', 'ddns' => 'DDNS', + 'detection' => 'Block Detection', + 'display' => 'Display & Subscribe', + 'domain' => 'Domain', + 'id' => 'Node ID', 'ipv4' => 'IPv4', 'ipv6' => 'IPv6', - 'push_port' => 'Push Port', - 'rule_group' => 'Rule Group', - 'traffic_limit' => 'Speed Limit', - 'client_limit' => 'Client Limit', 'label' => 'Label', - 'country' => 'Country', - 'udp' => 'UDP', - 'display' => 'Display & Subscribe', - 'detection' => 'Block Detection', 'method' => 'Encryption', - 'protocol' => 'Protocol', - 'protocol_param' => 'Protocol Param', + 'name' => 'Name', + 'next_renewal_date' => 'Next Renewal Date', 'obfs' => 'Obfs', 'obfs_param' => 'Obfs Param', - 'single' => 'Single Port', - 'transfer' => 'Relay', + 'online_user' => 'Online Users', + 'protocol' => 'Protocol', + 'protocol_param' => 'Protocol Param', + 'push_port' => 'Push Port', + 'relay_port' => 'Relay Port', + 'renewal_cost' => 'Renewal Cost', 'service_port' => 'Service Port', + 'single' => 'Single Port', 'single_passwd' => '[Single] Password', + 'static' => 'Alive Status', + 'subscription_term' => 'Subscription Term', + 'traffic_limit' => 'Speed Limit', + 'transfer' => 'Relay', + 'udp' => 'UDP', 'v2_alter_id' => 'Alter ID', - 'v2_net' => 'Network', 'v2_cover' => 'Cover', 'v2_host' => 'Host', + 'v2_net' => 'Network', 'v2_path' => 'Path | Key', 'v2_sni' => 'SNI', 'v2_tls' => 'TLS', 'v2_tls_provider' => 'TLS Config', - 'relay_port' => 'Relay Port', ], 'node_auth' => [ 'attribute' => 'Node Auth', @@ -111,36 +120,44 @@ return [ 'node_cert' => [ 'attribute' => 'Domain Cert', 'domain' => 'Domain', + 'expired_date' => 'Expired Date', + 'issuer' => 'Issuer', 'key' => 'KEY', 'pem' => 'PEM', - 'issuer' => 'Issuer', 'signed_date' => 'Signed Date', - 'expired_date' => 'Expired Date', + ], + 'notification' => [ + 'address' => 'Recipient', + 'created_at' => 'Sent On', + 'status' => 'Status', + ], + 'oauth' => [ + 'identifier' => 'Identifier', + 'type' => 'Channel', ], 'order' => [ 'attribute' => 'Order', 'id' => 'Order ID', 'original_price' => 'Original Price', - 'price' => 'Actual Price', 'pay_way' => 'Payment', + 'price' => 'Actual Price', 'status' => 'Status', ], - 'goods' => [ - 'attribute' => 'Goods', + 'permission' => [ + 'attribute' => 'Permission', + 'description' => 'Description', + 'name' => 'Route Name', + ], + 'referral' => [ + 'amount' => 'Amount', + 'created_at' => 'Applied On', + 'id' => 'Application ID', + 'user' => 'Applicant', + ], + 'role' => [ + 'attribute' => 'Role', 'name' => 'Name', - 'price' => 'Price', - 'category' => 'Category', - 'renew' => 'Data Renewal Price', - 'user_limit' => 'User Speed Limit', - 'period' => 'Reset Cycle', - 'traffic' => 'Data Allowance', - 'invite_num' => 'Bonus Invitations', - 'limit_num' => 'Purchase Limit', - 'available_date' => 'Validity Period', - 'hot' => 'Bestseller', - 'color' => 'Color', - 'logo' => 'Logo', - 'info' => 'Custom Info', + 'permissions' => 'Permissions', ], 'rule' => [ 'attribute' => 'Rule', @@ -150,83 +167,67 @@ return [ 'rule_group' => [ 'attribute' => 'Rule Group', 'name' => 'Name', - 'type' => 'Type', 'rules' => 'Rules', + 'type' => 'Type', ], - 'role' => [ - 'attribute' => 'Role', - 'name' => 'Name', - 'permissions' => 'Permissions', + 'subscribe' => [ + 'ban_desc' => 'Ban Reason', + 'ban_time' => 'Ban Time', + 'code' => 'Sub Code', + 'req_header' => 'Access Header', + 'req_ip' => 'Request IP', + 'req_times' => 'Request Times', + 'updated_at' => 'Last Request', ], - 'permission' => [ - 'attribute' => 'Permission', - 'description' => 'Description', - 'name' => 'Route Name', - ], - 'article' => [ - 'attribute' => 'Article', - 'category' => 'Category', - 'language' => 'Language', - 'logo' => 'Cover', - 'created_at' => 'Published On', - 'updated_at' => 'Updated On', - ], - 'coupon' => [ - 'attribute' => 'Coupon', - 'name' => 'Name', - 'sn' => 'Code', - 'logo' => 'Logo', - 'value' => 'Value', - 'priority' => 'Priority', - 'usable_times' => 'Usage Limit', - 'minimum' => 'Minimum Spend', - 'used' => 'Personal Limit', - 'levels' => 'Level Limit', - 'groups' => 'Group Limit', - 'users_whitelist' => 'Whitelist Users', - 'users_blacklist' => 'Blacklist Users', - 'services_whitelist' => 'Whitelist Goods', - 'services_blacklist' => 'Blacklist Goods', - 'newbie' => 'New User Only', - 'num' => 'Quantity', - ], - 'aff' => [ - 'invitee' => 'Buyer', - 'amount' => 'Order Amount', - 'commission' => 'Commission', - 'updated_at' => 'Processed On', - 'created_at' => 'Ordered On', - ], - 'referral' => [ - 'created_at' => 'Applied On', - 'user' => 'Applicant', - 'amount' => 'Amount', - 'id' => 'Application ID', - ], - 'notification' => [ - 'address' => 'Recipient', - 'created_at' => 'Sent On', - 'status' => 'Status', - ], - 'ip' => [ - 'network_type' => 'Network Type', - 'info' => 'Location', - ], - 'user_traffic' => [ - 'upload' => 'Upload', - 'download' => 'Download', - 'total' => 'Total', - 'log_time' => 'Logged At', - ], - 'user_data_modify' => [ - 'before' => 'Before', - 'after' => 'After', - 'created_at' => 'Changed At', + 'user' => [ + 'account_status' => 'Account Status', + 'attribute' => 'User', + 'created_date' => 'Registration Date', + 'credit' => 'Balance', + 'expired_date' => 'Expiration Date', + 'id' => 'User ID', + 'invite_num' => 'Available Invitations', + 'inviter' => 'Inviter', + 'nickname' => 'Nickname', + 'password' => 'Password', + 'port' => 'Port', + 'proxy_method' => 'Encryption', + 'proxy_obfs' => 'Obfuscation', + 'proxy_passwd' => 'Proxy Password', + 'proxy_protocol' => 'Protocol', + 'proxy_status' => 'Proxy Status', + 'qq' => 'QQ', + 'remark' => 'Note', + 'reset_date' => 'Data Reset Date', + 'role' => 'Role', + 'service' => 'Proxy', + 'speed_limit' => 'Speed Limit', + 'traffic_used' => 'Data Used', + 'usable_traffic' => 'Data Allowance', + 'username' => 'Username', + 'uuid' => 'VMess UUID', + 'wechat' => 'WeChat', ], 'user_credit' => [ - 'before' => 'Before', 'after' => 'After', 'amount' => 'Amount', + 'before' => 'Before', 'created_at' => 'Changed At', ], + 'user_data_modify' => [ + 'after' => 'After', + 'before' => 'Before', + 'created_at' => 'Changed At', + ], + 'user_group' => [ + 'attribute' => 'User Group', + 'name' => 'Group Name', + 'nodes' => 'Nodes', + ], + 'user_traffic' => [ + 'download' => 'Download', + 'log_time' => 'Logged At', + 'total' => 'Total', + 'upload' => 'Upload', + ], ]; diff --git a/resources/lang/en/notification.php b/resources/lang/en/notification.php index f8cc6379..70e17401 100644 --- a/resources/lang/en/notification.php +++ b/resources/lang/en/notification.php @@ -3,35 +3,49 @@ declare(strict_types=1); return [ - 'attribute' => 'Notification', - 'new' => '{1} :num new message|[1,*] :num new messages', - 'empty' => 'You have no new messages', - 'payment_received' => 'Payment received, amount: :amount. View order details', 'account_expired' => 'Account expiration reminder', - 'account_expired_content' => 'Your account will expire in :days days. Please renew promptly to continue using our services.', 'account_expired_blade' => 'Account will expire in :days days, please renew promptly', + 'account_expired_content' => 'Your account will expire in :days days. Please renew promptly to continue using our services.', 'active_email' => 'Please complete verification within 30 minutes', + 'attribute' => 'Notification', + 'block_report' => 'Block report:', 'close_ticket' => 'Ticket :id: :title closed', - 'view_web' => 'View website', - 'view_ticket' => 'View ticket', + 'data_anomaly' => 'Data anomaly user warning', + 'data_anomaly_content' => 'User :id: [Upload: :upload | Download: :download | Total: :total] in the last hour', + 'details' => 'View Details', + 'details_btn' => 'Please click the button below to view the details.', + 'ding_bot_limit' => 'Each bot can send up to 20 messages per minute to the group. If this limit is exceeded, throttling will be applied for 10 minutes.', + 'empty' => 'You have no new messages', + 'error' => '[:channel] Message push with exception: :reason', + 'get_access_token_failed' => 'Failed to obtain access token!\nWith request parameters: :body', + 'into_maintenance' => 'Automatically enter maintenance mode', + 'new' => '{1} :num new message|[1,*] :num new messages', 'new_ticket' => 'New ticket received: :title', - 'reply_ticket' => 'Ticket replied: :title', - 'ticket_content' => 'Ticket content:', + 'next_check_time' => 'Next node blockage detection time: :time', + 'node' => [ + 'download' => 'Download', + 'total' => 'Total', + 'upload' => 'Upload', + ], 'node_block' => 'Node block warning', 'node_offline' => 'Node offline warning', 'node_offline_content' => 'Abnormal nodes, may be offline:', - 'block_report' => 'Block report:', - 'traffic_warning' => 'Data usage warning', + 'node_renewal' => 'Node Renewal Reminder', + 'node_renewal_blade' => 'The following nodes are about to expire. Please renew in advance:', + 'node_renewal_content' => 'The following nodes are about to expire. Please renew before the expiration to avoid service interruption.', + 'payment_received' => 'Payment received, amount: :amount. View order details', + 'reply_ticket' => 'Ticket replied: :title', + 'reset_failed' => '[Daily Task]User :uid - :username Data Reset Failed', + 'serverChan_exhausted' => 'Today\'s limit has been exhausted!', + 'serverChan_limit' => 'Frequency too high per minute. Please optimize the notification settings!', + 'sign_failed' => 'Secure signature verification failed', + 'ticket_content' => 'Ticket content:', 'traffic_remain' => ':percent% of data used, please pay attention', 'traffic_tips' => 'Please note the data reset date and use data rationally, or renew after exhausted', - 'verification_account' => 'Account verification', + 'traffic_warning' => 'Data usage warning', 'verification' => 'Your verification code:', + 'verification_account' => 'Account verification', 'verification_limit' => 'Please verify within :minutes minutes', - 'data_anomaly' => 'Data anomaly user warning', - 'data_anomaly_content' => 'User :id: [Upload: :upload | Download: :download | Total: :total] in the last hour', - 'node' => [ - 'upload' => 'Upload', - 'download' => 'Download', - 'total' => 'Total', - ], + 'view_ticket' => 'View ticket', + 'view_web' => 'View website', ]; diff --git a/resources/lang/en/setup.php b/resources/lang/en/setup.php new file mode 100644 index 00000000..a7245dd9 --- /dev/null +++ b/resources/lang/en/setup.php @@ -0,0 +1,10 @@ + 'You have been detected in Demo mode, do you reset the database?', + 'update_cache' => 'Update cache...', + 'update_complete' => 'Update Completed! ', + 'update_db' => 'Update Database...', +]; diff --git a/resources/lang/en/user.php b/resources/lang/en/user.php index 79bfc621..d4491cc1 100644 --- a/resources/lang/en/user.php +++ b/resources/lang/en/user.php @@ -4,234 +4,273 @@ declare(strict_types=1); return [ 'account' => [ - 'credit' => 'Account Balance', - 'status' => 'Account Status', - 'level' => 'Account Level', - 'group' => 'Group', - 'speed_limit' => 'Speed Limit', - 'remain' => 'Remaining Data', - 'time' => 'Plan Duration', - 'last_login' => 'Last Login', - 'reset' => '{0} Data will reset in :days |{1} :days day left to reset data |[2,*] :days days left to reset data', 'connect_password' => 'Proxy Connection Password', + 'credit' => 'Account Balance', + 'group' => 'Group', + 'last_login' => 'Last Login', + 'level' => 'Account Level', 'reason' => [ - 'normal' => 'Account is normal', 'expired' => 'Your plan has expired', + 'normal' => 'Account is normal', 'overused' => 'You have exceeded the :data GB limit for this period
    Limit will be lifted in :min minutes', 'traffic_exhausted' => 'Data has been exhausted', 'unknown' => 'Unknown reason, please try refreshing the browser! If the problem persists, contact support.', ], + 'remain' => 'Remaining Data', + 'reset' => '{0} Data will reset in :days |{1} :days day left to reset data |[2,*] :days days left to reset data', + 'speed_limit' => 'Speed Limit', + 'status' => 'Account Status', + 'time' => 'Plan Duration', ], + 'attribute' => [ + 'address' => 'Location', + 'data' => 'Data', + 'ip' => 'IP Address', + 'isp' => 'ISP', + 'node' => 'Node', + ], + 'bought_at' => 'Purchase Date', + 'clients' => 'Clients', + 'contact' => 'Contact', + 'coupon' => [ + 'discount' => 'Discount', + 'error' => [ + 'expired' => 'Coupon expired', + 'inactive' => 'Coupon not active', + 'minimum' => 'Minimum amount is :amount', + 'overused' => 'Can only be used :times times', + 'run_out' => 'Coupon exhausted', + 'services' => 'Goods not eligible for discount, check promotional terms', + 'unknown' => 'Invalid coupon', + 'unmet' => 'Conditions not met', + 'used' => 'Coupon already used', + 'users' => 'Account not eligible for promotion', + 'wait' => 'Will be active at :time, please wait!', + ], + 'input' => 'Please enter the recharge coupon code', + ], + 'current_role' => 'Current Role as', + 'error_response' => 'An error occurred, please try again later.', 'home' => [ + 'announcement' => 'Announcements', 'attendance' => [ 'attribute' => 'Check In', 'disable' => 'Check-in disabled', 'done' => 'You have already checked in. Come back tomorrow!', - 'success' => 'You received :data data', 'failed' => 'System error', + 'success' => 'You received :data data', ], - 'traffic_logs' => 'Data Records', - 'announcement' => 'Announcements', - 'wechat_push' => 'WeChat Notifications', 'chat_group' => 'Chat Group', 'empty_announcement' => 'No announcements', + 'traffic_logs' => 'Data Records', + 'wechat_push' => 'WeChat Notifications', ], - 'purchase_to_unlock' => 'Purchase to Unlock', - 'purchase_required' => 'This feature is disabled for non-paying users. Please', - 'attribute' => [ - 'node' => 'Node', - 'data' => 'Data', - 'ip' => 'IP Address', - 'isp' => 'ISP', - 'address' => 'Location', + 'invite' => [ + 'attribute' => 'Invitation Code', + 'counts' => 'Total of :num invitation codes', + 'generate_failed' => 'Failed to generate: Quota exceeded', + 'logs' => 'Invitation Logs', + 'promotion' => 'Both you and the invitee will receive :traffic data when they register with your code; You will earn :referral_percent% commission when they make a purchase.', + 'tips' => ':num invitations remaining, codes expire :days days after creation', + ], + 'invitee' => 'Invitee', + 'inviter' => 'Inviter', + 'invoice' => [ + 'active_prepaid_question' => 'Activate prepaid package early?', + 'active_prepaid_tips' => 'After activation:
    Your current plan will immediately expire
    The new plan\'s expiration date will be recalculated from today', + 'amount' => 'Amount', + 'attribute' => 'Order', + 'detail' => 'Order Details', + ], + 'knowledge' => [ + 'basic' => 'Basic', + 'title' => 'Knowledge Base', ], - 'purchase_promotion' => 'Purchase Service Now!', 'menu' => [ + 'admin_dashboard' => 'Dashboard', 'help' => 'Help', 'home' => 'Home', 'invites' => 'Invite', 'invoices' => 'Invoice', 'nodes' => 'Nodes', + 'profile' => 'Profile', 'promotion' => 'Referral', 'shop' => 'Shop', - 'profile' => 'Profile', 'tickets' => 'Tickets', - 'admin_dashboard' => 'Dashboard', ], - 'contact' => 'Contact', + 'node' => [ + 'info' => 'Configuration Info', + 'rate' => ':ratio times data consumption', + 'setting' => 'Proxy Settings', + 'unstable' => 'Unstable/Maintenance', + ], 'oauth' => [ - 'bind_title' => 'Bind Social Account', - 'not_bind' => 'Not Bound', - 'bind' => 'Bind', - 'rebind' => 'Rebind', - 'unbind' => 'Unbind', + 'bind' => 'Link', + 'bind_title' => 'Link Your Social Account', + 'not_bind' => 'Not Linked', + 'rebind' => 'Re-link', + 'unbind' => 'Unlink', ], - 'coupon' => [ - 'discount' => 'Discount', - 'error' => [ - 'unknown' => 'Invalid coupon', - 'used' => 'Coupon already used', - 'expired' => 'Coupon expired', - 'run_out' => 'Coupon exhausted', - 'inactive' => 'Coupon not active', - 'wait' => 'Will be active at :time, please wait!', - 'unmet' => 'Conditions not met', - 'minimum' => 'Minimum amount is :amount', - 'overused' => 'Can only be used :times times', - 'users' => 'Account not eligible for promotion', - 'services' => 'Goods not eligible for discount, check promotional terms', + 'pay' => 'Pay', + 'payment' => [ + 'close_tips' => 'Complete the payment within :minutes minutes, or the order will close automatically', + 'creating' => 'Creating payment...', + 'error' => 'Invalid recharge amount', + 'insufficient_balance' => 'Your balance is insufficient. Please recharge first.', + 'manual' => [ + 'hint' => 'After scanning the QR code to pay, please follow the steps until you click Submit to complete the payment.', + 'next' => 'Next', + 'payment_tips' => 'When making the payment, please pay the exact amount (no refunds for overpayment, additional payment required if underpaid).', + 'pre' => 'Previous', + 'red_packet' => 'Alipay Red Packet', + 'steps' => [ + 'complete' => [ + 'description' => 'Waiting for manual payment verification', + 'title' => 'Completion', + ], + 'notice' => [ + 'description' => 'How to make a manual payment', + 'title' => 'Notes', + ], + 'payment' => [ + 'description' => 'Get the payment QR code and pay', + 'title' => 'Payment', + ], + 'remark' => [ + 'description' => 'Enter your login account for manual verification', + 'title' => 'Add a note', + ], + ], ], + 'method' => 'Payment Method', + 'mobile_tips' => 'Mobile Users: Long press the QR code -> Save image -> Open payment app -> Scan image to pay', + 'order_creation' => [ + 'failed' => 'Order creation failed. Please try a different payment method!', + 'info' => 'We will review your purchase/recharge within [24 hours]! Please be patient.', + 'order_limit' => 'This item is limited to :limit_num purchases. You have already bought :count times.', + 'order_timeout' => 'The order timed out and was automatically closed due to non-payment.', + 'payment_disabled' => 'Order creation failed: Online payment feature is not enabled.', + 'pending_order' => 'Order creation failed: There are pending orders. Please complete those payments first.', + 'plan_required' => 'Please purchase a plan before buying the recharge package.', + 'price_issue' => 'Order creation failed: Abnormal total order price', + 'price_zero' => 'Order creation failed: The total order price is 0; online payment is not required.', + 'product_unavailable' => 'Order creation failed: The item has been removed from sale.', + 'success' => 'Order created successfully!', + 'unknown_order' => 'Unknown order', + 'unknown_payment' => 'Unknown payment method', + ], + 'qrcode_tips' => 'Please scan with :software', + 'redirect_stripe' => 'Redirecting to Stripe', ], - 'error_response' => 'An error occurred, please try again later.', - 'invite' => [ - 'attribute' => 'Invitation Code', - 'counts' => 'Total of :num invitation codes', - 'tips' => ':num invitations remaining, codes expire :days days after creation', - 'logs' => 'Invitation Logs', - 'promotion' => 'Both you and the invitee will receive :traffic data when they register with your code; You will earn :referral_percent% commission when they make a purchase.', - 'generate_failed' => 'Failed to generate: Quota exceeded', + 'purchase' => [ + 'completed' => 'Purchase completed!', + 'promotion' => 'Don\'t miss out—buy our services today!', + 'required' => 'This feature is available to paid users only. Please', + 'to_unlock' => 'Unlock with Purchase', ], + 'recharge' => 'Recharge', + 'recharge_credit' => 'Credit Recharge', + 'recharging' => 'Recharging...', + 'referral' => [ + 'link' => 'Referral Link', + 'logs' => 'Commission Logs', + 'msg' => [ + 'account' => 'Account expired, please purchase a plan first', + 'applied' => 'Existing request, please wait for processing', + 'error' => 'Error creating order, try again later or contact support', + 'unfulfilled' => 'Need :amount to withdraw, keep going!', + 'wait' => 'Please wait for admin approval', + ], + 'total' => 'Total commission: :amount (:total times), can withdraw when over :money', + ], + 'registered_at' => 'Registration Date', 'reset_data' => [ 'action' => 'Reset Data', 'cost' => 'Cost: :amount', 'cost_tips' => 'The reset will deduct :amount!', - 'insufficient' => 'Insufficient balance, please top up', - 'logs' => 'User reset data', - 'success' => 'Reset successful', ], - 'referral' => [ - 'link' => 'Referral Link', - 'total' => 'Total commission: :amount (:total times), can withdraw when over :money', - 'logs' => 'Commission Logs', - 'failed' => 'Request failed', - 'success' => 'Request successful', - 'msg' => [ - 'account' => 'Account expired, please purchase a plan first', - 'applied' => 'Existing request, please wait for processing', - 'unfulfilled' => 'Need :amount to withdraw, keep going!', - 'wait' => 'Please wait for admin approval', - 'error' => 'Error creating order, try again later or contact support', - ], - ], - 'inviter' => 'Inviter', - 'invitee' => 'Invitee', - 'registered_at' => 'Registration Date', - 'bought_at' => 'Purchase Date', - 'payment_method' => 'Payment Method', - 'pay' => 'Pay', - 'input_coupon' => 'Enter coupon code', - 'recharge' => 'Recharge', - 'recharge_credit' => 'Credit Recharge', - 'recharging' => 'Recharging...', - 'withdraw_commission' => 'Withdraw Commission', - 'withdraw_at' => 'Withdrawal Date', - 'withdraw_logs' => 'Withdrawal Logs', - 'withdraw' => 'Withdraw', 'scan_qrcode' => 'Scan QR code with client', + 'service' => [ + 'country_count' => 'Covers :num countries or regions', + 'node_count' => ':num high-quality nodes', + 'unlimited' => 'Unlimited speed', + ], 'shop' => [ - 'hot' => 'Hot', - 'limited' => 'Limited', + 'buy' => 'Buy', + 'call4help' => 'Contact support if you have any questions', 'change_amount' => 'Recharge Amount', 'change_amount_help' => 'Enter recharge amount', - 'buy' => 'Buy', + 'conflict' => 'Conflict', + 'conflict_tips' => '

    The current purchase will be set as a prepaid plan

    1. Prepaid plan will automatically activate after current plan expires
    2. You can manually activate it after payment
    ', 'description' => 'Description', - 'service' => 'Service', + 'hot' => 'Hot', + 'limited' => 'Limited', 'pay_credit' => 'Pay with Credit', 'pay_online' => 'Pay Online', 'price' => 'Price', 'quantity' => 'Quantity', + 'service' => 'Service', 'subtotal' => 'Subtotal', 'total' => 'Total', - 'conflict' => 'Conflict', - 'conflict_tips' => '

    The current purchase will be set as a prepaid plan

    1. Prepaid plan will automatically activate after current plan expires
    2. You can manually activate it after payment
    ', - 'call4help' => 'Contact support if you have any questions', - ], - 'service' => [ - 'node_count' => ':num high-quality nodes', - 'country_count' => 'Covers :num countries or regions', - 'unlimited' => 'Unlimited speed', - ], - 'payment' => [ - 'error' => 'Invalid recharge amount', - 'creating' => 'Creating payment...', - 'redirect_stripe' => 'Redirecting to Stripe', - 'qrcode_tips' => 'Please scan with :software', - 'close_tips' => 'Complete the payment within :minutes minutes, or the order will close automatically', - 'mobile_tips' => 'Mobile Users: Long press the QR code -> Save image -> Open payment app -> Scan image to pay', - ], - 'invoice' => [ - 'attribute' => 'Order', - 'detail' => 'Order Details', - 'amount' => 'Amount', - 'active_prepaid_question' => 'Activate prepaid package early?', - 'active_prepaid_tips' => 'After activation:
    Your current plan will immediately expire
    The new plan\'s expiration date will be recalculated from today', - ], - 'node' => [ - 'info' => 'Configuration Info', - 'setting' => 'Proxy Settings', - 'unstable' => 'Unstable/Maintenance', - 'rate' => ':ratio times data consumption', ], 'subscribe' => [ - 'link' => 'Subscription Link', - 'tips' => 'Warning: This link is for personal use only. Do not share it, or your account may be banned for abnormal usage.', - 'exchange_warning' => 'Changing the subscription link will:\n1. Revoke the current link immediately\n2. Change the connection password', 'custom' => 'Custom Subscription', + 'error' => 'Error changing subscription link', + 'exchange_warning' => 'Changing the subscription link will:\n1. Revoke the current link immediately\n2. Change the connection password', + 'info' => [ + 'download' => 'Download', + 'title' => 'Account Summary [Non-Realtime]', + 'total' => 'Plan Data', + 'upload' => 'Upload', + ], + 'link' => 'Subscription Link', 'ss_only' => 'Subscribe SS only', 'ssr_only' => 'Subscribe SSR (incl. SS) only', - 'v2ray_only' => 'Subscribe V2Ray only', + 'tips' => 'Warning: This link is for personal use only. Do not share it, or your account may be banned for abnormal usage.', 'trojan_only' => 'Subscribe Trojan only', - 'error' => 'Error changing subscription link', - 'info' => [ - 'title' => 'Account Summary [Non-Realtime]', - 'upload' => 'Upload', - 'download' => 'Download', - 'total' => 'Plan Data', + 'v2ray_only' => 'Subscribe V2Ray only', + ], + 'telegram' => [ + 'bind_exists' => 'This account is already linked to a Telegram account.', + 'bind_missing' => 'No user information found. Please link your account first.', + 'command' => [ + 'bind' => 'Link your :web_name account', + 'intro' => 'You can use the following commands', + 'traffic' => 'Check data usage', + 'unbind' => 'Unlink', + 'web_url' => 'Get the latest :web_name URL', ], + 'get_url' => 'The latest URL for :web_name is', + 'params_missing' => 'Invalid parameters. Please include your email address and resend.', + 'ticket_missing' => 'Ticket does not exist', + 'ticket_reply' => 'Reply to ticket #`:id` was successful', + 'traffic_query' => 'Data usage query', + 'user_missing' => 'User does not exist', ], 'ticket' => [ 'attribute' => 'Ticket', - 'submit_tips' => 'Confirm submit ticket?', - 'reply_confirm' => 'Confirm reply ticket?', - 'close_tips' => 'Confirm close ticket?', - 'close' => 'Close Ticket', - 'failed_closed' => 'Error: Already closed', - 'reply_placeholder' => 'Write something...', - 'reply' => 'Reply', 'close_msg' => 'Ticket ID :id closed by user', - 'title_placeholder' => 'Briefly describe your issue', + 'close_tips' => 'Confirm close ticket?', 'content_placeholder' => 'Provide detailed description of your issue to help us assist you better', - 'new' => 'Create New Ticket', - 'service_hours' => 'Customer Service Hours', - 'online_hour' => 'Online Hours', - 'service_tips' => 'Please use only one contact method to reach support! Repeated requests will delay response time.', 'error' => 'Unknown error! Please contact support', + 'new' => 'Create New Ticket', + 'online_hour' => 'Online Hours', + 'reply' => 'Reply', + 'reply_confirm' => 'Confirm reply ticket?', + 'reply_placeholder' => 'Write something...', + 'service_hours' => 'Customer Service Hours', + 'service_tips' => 'Please use only one contact method to reach support! Repeated requests will delay response time.', + 'submit_tips' => 'Confirm submit ticket?', + 'title_placeholder' => 'Briefly describe your issue', ], 'traffic_logs' => [ - 'hourly' => 'Today\'s Data Usage', 'daily' => 'This Month\'s Data Usage', + 'hourly' => 'Today\'s Data Usage', 'tips' => 'Note: There is a delay in data statistics updates.', ], - 'clients' => 'Clients', 'tutorials' => 'Tutorials', - 'current_role' => 'Current Role as', - 'knowledge' => [ - 'title' => 'Knowledge Base', - 'basic' => 'Basic', - ], - 'manual' => [ - 'red_packet' => 'Alipay Red Packet', - 'hint' => 'After scanning the QR code, continue clicking [Next] until [Submit] to complete the payment!', - 'step_1' => 'Notes', - 'step_1_title' => 'How to Pay Manually', - 'step_2' => 'Payment', - 'step_2_title' => 'Get QR code and pay', - 'step_3' => 'Completion', - 'step_3_title' => 'Wait for manual verification', - 'remark' => 'Account Remark', - 'remark_content' => 'Please provide your account username for accurate manual verification', - 'payment_hint' => 'Please pay the exact amount (no refund for overpayment, top up for underpayment)', - 'pre' => 'Previous', - 'next' => 'Next', - ], + 'withdraw' => 'Withdraw', + 'withdraw_at' => 'Withdrawal Date', + 'withdraw_commission' => 'Withdraw Commission', + 'withdraw_logs' => 'Withdrawal Logs', ]; diff --git a/resources/lang/fa.json b/resources/lang/fa.json index 58a9289d..7ca4e078 100644 --- a/resources/lang/fa.json +++ b/resources/lang/fa.json @@ -126,5 +126,16 @@ "You are receiving this email because we received a password reset request for your account.": "شما این ایمیل را به دلیل درخواست رمزعبور جدید دریافت کرده‌اید.", "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!": "برای مشاهده محتوای این منطقه باید اشتراک معتبر داشته باشید!", - "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "اشتراک شما توسط مدیر غیرفعال شده است، لطفاً برای بازیابی آن با مدیر تماس بگیرید." + "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "اشتراک شما توسط مدیر غیرفعال شده است، لطفاً برای بازیابی آن با مدیر تماس بگیرید.", + "Manually add in dashboard.": "به صورت دستی در داشبورد اضافه کنید", + "Manually edit in dashboard.": "به صورت دستی در داشبورد ویرایش کنید", + "Batch generate user accounts in dashboard.": "ایجاد حساب‌های کاربری به صورت گروهی در پس‌زمینه", + "Coupon used in order.": "کوپن در سفارش استفاده شده است", + "Order canceled, coupon reinstated.": "سفارش لغو شد و کوپن بازگردانی شد", + "Used for credit recharge.": "برای شارژ اعتبار استفاده می‌شود", + "The user manually reset the data.": "کاربر داده را بازنشانی کرد", + "Recharge using a recharge voucher.": "با استفاده از کوپن شارژ، اعتبار را شارژ کنید", + "The user topped up the balance.": "کاربر اعتبار را شارژ کرد", + "Purchased an item.": "کالایی خریداری شد", + "[:payment] plus the user’s purchased data plan.": "[:payment] به همراه بسته داده‌ای که کاربر خریداری کرده است" } \ No newline at end of file diff --git a/resources/lang/fa/admin.php b/resources/lang/fa/admin.php index 329ad3c6..135afea3 100644 --- a/resources/lang/fa/admin.php +++ b/resources/lang/fa/admin.php @@ -3,512 +3,468 @@ declare(strict_types=1); return [ + 'action' => [ + 'add_item' => 'افزودن :attribute', + 'edit_item' => 'ویرایش :attribute', + ], + 'aff' => [ + 'apply_counts' => 'مجموع :num درخواست برداشت', + 'commission_counts' => 'این درخواست شامل مجموع :num سفارش است', + 'commission_title' => 'جزئیات درخواست', + 'counts' => 'مجموع :num رکورد بازگشت وجه', + 'rebate_title' => 'تاریخچه بازگشت وجه', + 'referral' => 'بازگشت وجه معرفی', + 'title' => 'لیست درخواست‌های برداشت', + ], + 'article' => [ + 'category_hint' => 'همه مقالات در یک دسته‌بندی در یک پوشه قرار می‌گیرند', + 'counts' => 'مجموع :num مقاله', + 'logo_placeholder' => 'یا آدرس URL لوگو را وارد کنید', + 'title' => 'مقالات', + 'type' => [ + 'announcement' => 'اعلان', + 'knowledge' => 'مقاله', + ], + ], + 'clear' => 'پاک کردن', + 'clone' => 'کلون', + 'confirm' => [ + 'continues' => 'آیا می‌خواهید این عملیات را ادامه دهید؟', + 'delete' => [0 => 'آیا می‌خواهید :attribute【', 1 => '】را حذف کنید؟'], + 'export' => 'آیا می‌خواهید همه را صادر کنید؟', + ], + 'coupon' => [ + 'counts' => 'مجموع :num کوپن', + 'created_days_hint' => ':days روز پس از ثبت‌نام', + 'discount' => 'تخفیف', + 'export_title' => 'صادرات', + 'groups_hint' => 'فقط برای گروه‌های کاربری انتخاب شده قابل استفاده است', + 'info_title' => 'اطلاعات', + 'levels_hint' => 'فقط برای سطوح کاربری انتخاب شده قابل استفاده است', + 'limit_hint' => 'قوانین دارای رابطه و هستند، به‌درستی استفاده کنید', + 'minimum_hint' => 'فقط زمانی قابل استفاده است که مبلغ پرداختی بیش از :num باشد', + 'name_hint' => 'برای نمایش', + 'newbie' => [ + 'created_days' => 'عمر حساب', + 'first_discount' => 'تخفیف اولین بار', + 'first_order' => 'اولین سفارش', + ], + 'priority_hint' => 'کوپن با اولویت بالاتر ابتدا استفاده می‌شود. حداکثر 255', + 'services_blacklist_hint' => 'برای محصولات سیاه لیست قابل استفاده نیست، خالی بگذارید اگر استفاده نمی‌شود', + 'services_placeholder' => 'شناسه محصول را وارد کنید، سپس Enter را فشار دهید', + 'services_whitelist_hint' => 'فقط برای محصولات سفید لیست قابل استفاده است، خالی بگذارید اگر استفاده نمی‌شود', + 'single_use' => 'استفاده یک‌باره', + 'sn_hint' => 'برای استفاده کاربران از کوپن، خالی بگذارید تا به صورت تصادفی یک کد 8 رقمی تولید شود', + 'title' => 'کوپن‌ها', + 'type' => [ + 'charge' => 'شارژ', + 'discount' => 'تخفیف', + 'voucher' => 'کوپن', + ], + 'type_hint' => 'کاهش: کسر مبلغ؛ تخفیف: درصد تخفیف؛ شارژ: افزودن مبلغ به موجودی', + 'used_hint' => 'هر کاربر می‌تواند این کوپن را حداکثر :num بار استفاده کند', + 'user_whitelist_hint' => 'کاربران سفید لیست می‌توانند استفاده کنند، خالی بگذارید اگر استفاده نمی‌شود', + 'users_blacklist_hint' => 'کاربران سیاه لیست نمی‌توانند استفاده کنند، خالی بگذارید اگر استفاده نمی‌شود', + 'users_placeholder' => 'شناسه کاربر را وارد کنید، سپس Enter را فشار دهید', + 'value' => '{1} ➖ :num|{2} :num% تخفیف|{3} ➕ :num', + 'value_hint' => 'محدوده 1٪ تا 99٪', + ], + 'creating' => 'در حال افزودن...', 'dashboard' => [ - 'users' => 'تعداد کل کاربران', - 'available_users' => 'تعداد کاربران فعال', - 'paid_users' => 'تعداد کاربران پرداخت کننده', - 'active_days_users' => 'کاربران فعال در :days روز گذشته', - 'inactive_days_users' => 'کاربران غیرفعال برای بیش از :days روز', - 'online_users' => 'کاربران آنلاین کنونی', - 'expiring_users' => 'کاربران در حال انقضا', - 'overuse_users' => 'کاربرانی که بیش از 90٪ از داده استفاده کرده‌اند', 'abnormal_users' => 'کاربرانی که در یک ساعت گذشته ترافیک غیرعادی داشته‌اند', - 'nodes' => 'تعداد گره‌ها', - 'maintaining_nodes' => 'گره‌های در حالت نگهداری', + 'active_days_users' => 'کاربران فعال در :days روز گذشته', + 'available_users' => 'تعداد کاربران فعال', + 'credit' => 'کل موجودی', 'current_month_traffic_consumed' => 'ترافیک مصرفی این ماه', 'days_traffic_consumed' => 'ترافیک مصرفی در :days روز گذشته', - 'orders' => 'تعداد کل سفارش‌ها', + 'expiring_users' => 'کاربران در حال انقضا', + 'inactive_days_users' => 'کاربران غیرفعال برای بیش از :days روز', + 'maintaining_nodes' => 'گره‌های در حالت نگهداری', + 'nodes' => 'تعداد گره‌ها', 'online_orders' => 'تعداد سفارش‌های پرداخت آنلاین', + 'online_users' => 'کاربران آنلاین کنونی', + 'orders' => 'تعداد کل سفارش‌ها', + 'overuse_users' => 'کاربرانی که بیش از 90٪ از داده استفاده کرده‌اند', + 'paid_users' => 'تعداد کاربران پرداخت کننده', 'succeed_orders' => 'تعداد سفارش‌های پرداخت شده', - 'credit' => 'کل موجودی', + 'users' => 'تعداد کل کاربران', 'withdrawing_commissions' => 'کمیسیون‌های در حال برداشت', 'withdrawn_commissions' => 'کمیسیون‌های برداشت شده', ], - 'action' => [ - 'edit_item' => 'ویرایش :attribute', - 'add_item' => 'افزودن :attribute', + 'end_time' => 'پایان', + 'goods' => [ + 'counts' => 'مجموع :num محصول', + 'info' => [ + 'available_date_hint' => 'هنگام انقضا به‌طور خودکار از کل داده کسر می‌شود', + 'desc_placeholder' => 'توضیحات مختصر', + 'limit_num_hint' => 'حداکثر تعداد خریدها برای هر کاربر، 0 برای نامحدود', + 'list_hint' => 'هر خط را با
  • شروع کنید و با
  • پایان دهید', + 'list_placeholder' => 'افزودن محتوای سفارشی', + 'period_hint' => 'مقدار داده هر N روز برای طرح‌ها بازنشانی می‌شود', + 'type_hint' => 'طرح‌ها بر انقضای حساب تأثیر می‌گذارند، بسته‌ها فقط از داده کسر می‌کنند و بر انقضا تأثیر نمی‌گذارند', + ], + 'sell_and_used' => 'استفاده شده / فروخته شده', + 'status' => [ + 'no' => 'خارج از فروش', + 'yes' => 'در حال فروش', + ], + 'title' => 'محصولات', + 'type' => [ + 'package' => 'بسته داده', + 'plan' => 'طرح اشتراک', + 'top_up' => 'شارژ', + ], ], - 'confirm' => [ - 'delete' => [0 => 'آیا می‌خواهید :attribute【', 1 => '】را حذف کنید؟'], - 'continues' => 'آیا می‌خواهید این عملیات را ادامه دهید؟', - 'export' => 'آیا می‌خواهید همه را صادر کنید؟', + 'hint' => 'نکته', + 'logs' => [ + 'ban' => [ + 'ban_time' => 'زمان مسدودسازی', + 'last_connect_at' => 'آخرین زمان ورود', + 'reason' => 'دلیل', + 'time' => 'مدت زمان', + 'title' => 'سوابق مسدودسازی کاربران', + ], + 'callback' => 'لاگ‌های بازگشت (پرداخت)', + 'counts' => 'مجموع :num رکورد', + 'credit_title' => 'سوابق تغییر موجودی', + 'ip_monitor' => 'IP‌های آنلاین داده‌های زمان واقعی 2 دقیقه‌ای', + 'notification' => 'لاگ‌های ایمیل', + 'order' => [ + 'is_coupon' => 'کوپن استفاده شده', + 'is_expired' => 'منقضی شده', + 'title' => 'سفارش‌ها', + 'update_conflict' => 'به‌روزرسانی ناموفق: تعارض سفارش', + ], + 'rule' => [ + 'clear_all' => 'پاک کردن همه رکوردها', + 'clear_confirm' => 'آیا می‌خواهید همه سوابق فعال‌سازی قوانین را پاک کنید؟', + 'created_at' => 'زمان فعال‌سازی', + 'name' => 'نام قانون فعال شده', + 'reason' => 'دلیل فعال‌سازی', + 'tag' => '✅ دسترسی به محتوای غیرمجاز', + 'title' => 'سوابق فعال‌سازی قوانین', + ], + 'subscribe' => 'اشتراک‌ها', + 'user_data_modify_title' => 'سوابق تغییر داده‌ها', + 'user_ip' => [ + 'connect' => 'IP متصل شده', + 'title' => 'IP‌های آنلاین 10 دقیقه گذشته', + ], + 'user_traffic' => [ + 'choose_node' => 'انتخاب گره', + 'title' => 'سوابق استفاده از داده‌ها', + ], ], - 'user_dashboard' => 'مرکز کاربری', + 'marketing' => [ + 'counts' => 'مجموع :num ایمیل', + 'email' => [ + 'ever_paid' => 'پرداخت شده', + 'expired_date' => 'تاریخ انقضا', + 'filters' => 'فیلترها', + 'loading_statistics' => 'در حال بارگذاری آمار...', + 'never_paid' => 'هرگز پرداخت نشده', + 'paid_servicing' => 'خدمات پرداختی', + 'previously_paid' => 'قبلاً پرداخت شده', + 'recent_traffic_abnormal' => 'ناهنجاری ترافیک در ساعت اخیر', + 'recently_active' => 'فعالیت اخیر', + 'targeted_users_count' => 'تعداد کاربران هدف', + 'traffic_usage_over' => 'استفاده از ترافیک بیش از N%', + 'will_expire_date' => 'تاریخ انقضا آینده', + ], + 'email_send' => 'ارسال ایمیل گروهی', + 'error_message' => 'پیام‌های خطا', + 'processed' => 'درخواست پردازش شده', + 'push_send' => 'ارسال پیام فشاری', + 'send_status' => 'وضعیت ارسال', + 'send_time' => 'زمان ارسال', + 'targeted_users_not_found' => 'کاربران هدف یافت نشد', + 'unknown_sending_type' => 'نوع ارسال ناشناخته', + ], + 'massive_export' => 'صادرات گروهی', 'menu' => [ + 'analysis' => [ + 'accounting' => 'حسابداری', + 'attribute' => 'تحلیل داده‌ها', + 'node_flow' => 'تحلیل ترافیک گره', + 'site_flow' => 'تحلیل ترافیک سایت', + 'user_flow' => 'تحلیل ترافیک کاربران', + ], + 'customer_service' => [ + 'article' => 'مدیریت مقالات', + 'attribute' => 'سیستم پشتیبانی', + 'marketing' => 'پخش پیام‌ها', + 'ticket' => 'تیکت‌های پشتیبانی', + ], 'dashboard' => 'مدیریت', - 'user' => [ - 'attribute' => 'سیستم کاربران', - 'list' => 'مدیریت کاربران', - 'oauth' => 'مجوزهای شخص ثالث', - 'group' => 'گروه‌های کاربری', - 'credit_log' => 'تاریخچه موجودی', - 'subscribe' => 'مدیریت اشتراک‌ها', + 'log' => [ + 'attribute' => 'سیستم لاگ‌ها', + 'notify' => 'سوابق اعلان‌ها', + 'online_logs' => 'لاگ‌های آنلاین', + 'online_monitor' => 'نظارت آنلاین', + 'payment_callback' => 'بازگشت پرداخت', + 'service_ban' => 'سوابق مسدودسازی', + 'system' => 'لاگ‌های سیستم', + 'traffic' => 'استفاده از ترافیک', + 'traffic_flow' => 'تغییرات ترافیک', + ], + 'node' => [ + 'attribute' => 'سیستم گره‌ها', + 'auth' => 'مجوزهای گره', + 'cert' => 'لیست گواهینامه‌ها', + 'list' => 'مدیریت گره‌ها', + ], + 'promotion' => [ + 'attribute' => 'بازاریابی', + 'invite' => 'مدیریت دعوت‌ها', + 'rebate_flow' => 'تاریخچه تخفیف‌ها', + 'withdraw' => 'مدیریت برداشت‌ها', ], 'rbac' => [ 'attribute' => 'سیستم دسترسی', 'permission' => 'مدیریت دسترسی‌ها', 'role' => 'لیست نقش‌ها', ], - 'customer_service' => [ - 'attribute' => 'سیستم پشتیبانی', - 'ticket' => 'تیکت‌های پشتیبانی', - 'article' => 'مدیریت مقالات', - 'marketing' => 'پخش پیام‌ها', - ], - 'node' => [ - 'attribute' => 'سیستم گره‌ها', - 'list' => 'مدیریت گره‌ها', - 'auth' => 'مجوزهای گره', - 'cert' => 'لیست گواهینامه‌ها', - ], 'rule' => [ 'attribute' => 'قوانین بررسی', - 'list' => 'لیست قوانین', 'group' => 'گروه‌های قوانین', + 'list' => 'لیست قوانین', 'trigger' => 'سوابق فعال‌سازی', ], - 'shop' => [ - 'attribute' => 'سیستم فروشگاه', - 'goods' => 'مدیریت محصولات', - 'coupon' => 'مدیریت کوپن‌ها', - 'order' => 'سفارش‌های محصول', - ], - 'promotion' => [ - 'attribute' => 'بازاریابی', - 'invite' => 'مدیریت دعوت‌ها', - 'withdraw' => 'مدیریت برداشت‌ها', - 'rebate_flow' => 'تاریخچه تخفیف‌ها', - ], - 'analysis' => [ - 'attribute' => 'تحلیل داده‌ها', - 'accounting' => 'حسابداری', - 'user_flow' => 'تحلیل ترافیک کاربران', - 'node_flow' => 'تحلیل ترافیک گره', - 'site_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' => 'پارامترهای سیستم', + 'universal' => 'تنظیمات عمومی', + ], + 'shop' => [ + 'attribute' => 'سیستم فروشگاه', + 'coupon' => 'مدیریت کوپن‌ها', + 'goods' => 'مدیریت محصولات', + 'order' => 'سفارش‌های محصول', + ], + 'tools' => [ + 'analysis' => 'تحلیل لاگ‌ها', + 'attribute' => 'ابزارها', + 'convert' => 'تبدیل فرمت', + 'decompile' => 'دی‌کامپایل', + 'import' => 'وارد کردن داده‌ها', + ], + 'user' => [ + 'attribute' => 'سیستم کاربران', + 'credit_log' => 'تاریخچه موجودی', + 'group' => 'گروه‌های کاربری', + 'list' => 'مدیریت کاربران', + 'oauth' => 'مجوزهای شخص ثالث', + 'subscribe' => 'مدیریت اشتراک‌ها', ], ], - 'user' => [ - 'massive' => [ - 'text' => 'تعداد حساب‌های ایجاد شده به صورت گروهی', - 'failed' => 'ایجاد حساب گروهی ناموفق بود', - 'succeed' => 'ایجاد حساب گروهی موفقیت‌آمیز بود', - 'note' => 'ایجاد حساب‌های کاربری به صورت گروهی در پس‌زمینه', - ], - 'proxy_info' => 'اطلاعات پیکربندی', - 'traffic_monitor' => 'آمار ترافیک', - 'online_monitor' => 'نظارت آنلاین', - 'reset_traffic' => 'بازنشانی ترافیک', - 'user_view' => 'تغییر به نمای کاربر', - 'connection_test' => 'تست اتصال', - 'counts' => 'مجموع :num حساب', - 'reset_confirm' => [0 => 'آیا می‌خواهید ترافیک [', 1 => '] را بازنشانی کنید؟'], - 'info' => [ - 'account' => 'اطلاعات حساب', - 'proxy' => 'اطلاعات پروکسی', - 'switch' => 'تغییر هویت', - 'reset_date_hint' => 'تاریخ بازنشانی بعدی ترافیک', - 'expired_date_hint' => 'اگر خالی بماند، پیش‌فرض یک سال اعتبار دارد', - 'uuid_hint' => 'UUID برای V2Ray', - 'recharge_placeholder' => 'اگر منفی باشد، موجودی کسر می‌شود', - ], - 'update_help' => 'به‌روزرسانی موفقیت‌آمیز بود، بازگردید؟', - 'proxies_config' => 'اطلاعات اتصال برای :username', - 'group' => [ - 'title' => 'کنترل گروه‌های کاربری (یک گره می‌تواند در چندین گروه باشد، اما کاربر فقط می‌تواند در یک گروه باشد؛ برای گره‌های قابل مشاهده/قابل استفاده برای کاربران، گروه اولویت بیشتری نسبت به سطح دارد)', - 'name' => 'نام گروه', - 'counts' => 'مجموع :num گروه', - ], - ], - 'zero_unlimited_hint' => '0 یا خالی برای نامحدود', - 'node' => [ - 'traffic_monitor' => 'آمار ترافیک', - 'refresh_geo' => 'تازه‌سازی جغرافیا', - 'connection_test' => 'تست اتصال', - 'counts' => 'مجموع :num گره', - 'reload_all' => 'بارگذاری مجدد همه سرورها', - 'refresh_geo_all' => 'تازه‌سازی داده‌های جغرافیا', - 'reload_confirm' => 'آیا می‌خواهید سرور را بارگذاری مجدد کنید؟', - 'info' => [ - 'hint' => 'توجه: ID به‌طور خودکار تولید شده، node_id برای بک‌اند ShadowsocksR و nodeId برای بک‌اند V2Ray است', - 'basic' => 'اطلاعات پایه', - 'ddns_hint' => 'گره‌های داینامیک IP نیاز به پیکربندی DDNS دارند. برای این نوع گره، تست اتصال از طریق نام دامنه انجام می‌شود.', - 'domain_placeholder' => 'دامنه سرور، در صورت پر شدن ابتدا استفاده می‌شود', - 'domain_hint' => 'پس از فعال‌سازی DDNS در تنظیمات سیستم، نام دامنه و IPها به‌طور خودکار به‌روزرسانی می‌شوند! دیگر نیازی به ویرایش این اطلاعات در وب‌سایت ثبت دامنه نیست.', - 'extend' => 'اطلاعات اضافی', - 'display' => [ - 'invisible' => 'کاملاً نامرئی', - 'node' => 'فقط در صفحه گره‌ها قابل مشاهده است', - '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' => 'اگر obfs [plain] نیست، پارامترها را برای پنهان‌سازی ترافیک وارد کنید؛ پورت 80 را پیشنهاد می‌کنیم اگر obfs [http_simple] است؛ پورت 443 را پیشنهاد می‌کنیم اگر obfs [tls] است؛', - 'additional_ports_hint' => 'اگر فعال است، لطفاً پیکربندی سرور additional_ports را انجام دهید', - 'v2_method_hint' => 'پروتکل انتقال WebSocket نباید از روش رمزنگاری \'none\' استفاده کند.', - 'v2_net_hint' => 'لطفاً TLS را برای WebSocket فعال کنید', - 'v2_cover' => [ - 'none' => 'بدون پنهان‌سازی', - 'http' => 'HTTP', - 'srtp' => 'SRTP', - 'utp' => 'uTP', - 'wechat' => 'تماس ویدیویی WeChat', - 'dtls' => 'DTLS 1.2', - 'wireguard' => 'WireGuard', - ], - 'v2_host_hint' => 'هنگام استفاده از پنهان‌سازی HTTP، چندین دامنه باید با کاما جدا شوند، در حالی که WebSocket فقط یک دامنه را مجاز می‌داند.', - 'v2_tls_provider_hint' => 'پیکربندی‌های مختلف برای بک‌اندهای مختلف:', - 'single_hint' => 'پورت 80/443 را پیشنهاد می‌کنیم. بک‌اند نیاز به پیکربندی حالت سختگیرانه دارد: فقط از طریق پورت‌های مشخص شده متصل شوید. (چگونه پیکربندی کنیم)', - ], - 'proxy_info' => '*سازگار با Shadowsocks', - 'proxy_info_hint' => 'برای سازگاری، لطفاً _compatible را به پروتکل و obfuscation در پیکربندی سرور اضافه کنید', - 'reload' => 'بارگذاری مجدد بک‌اند', - 'auth' => [ - 'title' => 'مجوزهای API WEBAPI', - 'deploy' => [ - 'title' => 'استقرار بک‌اند :type_label', - 'attribute' => 'استقرار بک‌اند', - 'command' => 'دستورات', - 'update' => 'به‌روزرسانی', - 'uninstall' => 'حذف', - 'start' => 'شروع', - 'stop' => 'توقف', - 'status' => 'وضعیت', - 'recent_logs' => 'لاگ‌های اخیر', - 'real_time_logs' => 'لاگ‌های زمان واقعی', - 'restart' => 'راه‌اندازی مجدد', - 'same' => 'همان بالا', - 'trojan_hint' => 'لطفاً نام گره را وارد کنید و به IP مربوطه تجزیه کنید', - ], - 'reset_auth' => 'بازنشانی کلید مجوز', - 'counts' => 'مجموع :num مجوز', - 'generating_all' => 'آیا می‌خواهید کلیدهای مجوز را برای همه گره‌ها تولید کنید؟', - ], - 'cert' => [ - 'title' => 'گواهینامه‌های دامنه (برای پنهان‌سازی دامنه V2Ray)', - 'counts' => 'مجموع :num گواهینامه دامنه', - 'key_placeholder' => 'مقدار KEY گواهینامه، می‌تواند خالی بماند. بک‌اند VNET-V2Ray از صدور خودکار پشتیبانی می‌کند', - 'pem_placeholder' => 'بک‌اند VNET-V2Ray از صدور خودکار پشتیبانی می‌کند', - ], - ], - 'hint' => 'نکته', - 'oauth' => [ - 'title' => 'مجوزهای شخص ثالث', - 'counts' => 'مجموع :num رکورد مجوز', - ], - 'select_all' => 'انتخاب همه', - 'clear' => 'پاک کردن', - 'unselected_hint' => 'قوانینی که باید تخصیص داده شوند، اینجا قابل جستجو هستند', - 'selected_hint' => 'قوانین تخصیص داده شده، اینجا قابل جستجو هستند', - 'clone' => 'کلون', + 'minute' => 'دقیقه', 'monitor' => [ 'daily_chart' => 'نمودار مصرف روزانه ترافیک', + 'hint' => 'نکته: اگر داده‌ای وجود ندارد، بررسی کنید که وظایف زمان‌بندی شده به درستی اجرا می‌شوند.', 'monthly_chart' => 'نمودار مصرف ماهانه ترافیک', 'node' => 'ترافیک گره', 'user' => 'ترافیک کاربر', - 'hint' => 'نکته: اگر داده‌ای وجود ندارد، بررسی کنید که وظایف زمان‌بندی شده به درستی اجرا می‌شوند.', ], - 'tools' => [ - 'analysis' => [ - 'title' => 'تحلیل لاگ SSR فقط برای یک گره', - 'req_url' => 'سوابق URL درخواست‌های اخیر', - 'not_enough' => 'کمتر از 15000 رکورد، قادر به تحلیل نیست', - ], - 'convert' => [ - 'title' => 'تبدیل فرمت SS به SSR', - 'content_placeholder' => 'لطفاً اطلاعات پیکربندی که نیاز به تبدیل دارند را وارد کنید.', - ], - 'decompile' => [ - 'title' => 'دی‌کامپایل اطلاعات پیکربندی', - 'attribute' => 'لینک پیکربندی دی‌کامپایل', - 'content_placeholder' => 'لطفاً لینک‌های ShadowsocksR که نیاز به دی‌کامپایل دارند را وارد کنید، با خط جدا شوند.', - ], - ], - 'ticket' => [ - 'title' => 'تیکت‌ها', - 'counts' => 'مجموع :num تیکت', - 'send_to' => 'لطفاً جزئیات کاربر هدف را وارد کنید', - 'user_info' => 'اطلاعات کاربر', - 'inviter_info' => 'اطلاعات دعوت‌کننده', - 'close_confirm' => 'آیا می‌خواهید این تیکت را ببندید؟', - 'error' => 'خطای ناشناخته! لطفاً لاگ‌ها را بررسی کنید', - ], - 'logs' => [ - 'subscribe' => 'اشتراک‌ها', - 'counts' => 'مجموع :num رکورد', - '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' => 'لاگ‌های بازگشت (پرداخت)', - 'notification' => 'لاگ‌های ایمیل', - 'ip_monitor' => 'IP‌های آنلاین داده‌های زمان واقعی 2 دقیقه‌ای', - 'user_ip' => [ - 'title' => 'IP‌های آنلاین 10 دقیقه گذشته', - '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' => 'هر خط را با
  • شروع کنید و با
  • پایان دهید', - ], - 'status' => [ - 'yes' => 'در حال فروش', - 'no' => 'خارج از فروش', - ], - 'sell_and_used' => 'استفاده شده / فروخته شده', - 'counts' => 'مجموع :num محصول', - ], - 'sort_asc' => 'مقدار مرتب‌سازی بزرگتر اولویت بالاتری دارد', - 'yes' => 'بله', 'no' => 'خیر', - 'rule' => [ - 'type' => [ - 'reg' => 'عبارت با قاعده', - 'domain' => 'دامنه', - 'ip' => 'IP', - 'protocol' => 'پروتکل', + 'node' => [ + 'auth' => [ + 'counts' => 'مجموع :num مجوز', + 'deploy' => [ + 'attribute' => 'استقرار بک‌اند', + 'command' => 'دستورات', + 'real_time_logs' => 'لاگ‌های زمان واقعی', + 'recent_logs' => 'لاگ‌های اخیر', + 'restart' => 'راه‌اندازی مجدد', + 'same' => 'همان بالا', + 'start' => 'شروع', + 'status' => 'وضعیت', + 'stop' => 'توقف', + 'title' => 'استقرار بک‌اند :type_label', + 'trojan_hint' => 'لطفاً نام گره را وارد کنید و به IP مربوطه تجزیه کنید', + 'uninstall' => 'حذف', + 'update' => 'به‌روزرسانی', + ], + 'empty' => 'هیچ گره‌ای نیاز به تولید مجوز ندارد', + 'generating_all' => 'آیا می‌خواهید کلیدهای مجوز را برای همه گره‌ها تولید کنید؟', + 'reset_auth' => 'بازنشانی کلید مجوز', + 'title' => 'مجوزهای API WEBAPI', ], + 'cert' => [ + 'counts' => 'مجموع :num گواهینامه دامنه', + 'key_placeholder' => 'مقدار KEY گواهینامه، می‌تواند خالی بماند. بک‌اند VNET-V2Ray از صدور خودکار پشتیبانی می‌کند', + 'pem_placeholder' => 'بک‌اند VNET-V2Ray از صدور خودکار پشتیبانی می‌کند', + 'title' => 'گواهینامه‌های دامنه (برای پنهان‌سازی دامنه V2Ray)', + ], + 'connection_test' => 'تست اتصال', + 'counts' => 'مجموع :num گره', + 'info' => [ + 'additional_ports_hint' => 'اگر فعال است، لطفاً پیکربندی سرور additional_ports را انجام دهید', + 'basic' => 'اطلاعات پایه', + 'data_rate_hint' => 'مثال: 0.1 به معنای 100M به عنوان 10M محاسبه می‌شود؛ 5 به معنای 100M به عنوان 500M محاسبه می‌شود', + 'ddns_hint' => 'گره‌های داینامیک IP نیاز به پیکربندی DDNS دارند. برای این نوع گره، تست اتصال از طریق نام دامنه انجام می‌شود.', + 'detection' => [ + 'all' => 'هر دو', + 'hint' => 'بررسی تصادفی هر 30-60 دقیقه', + 'icmp' => 'فقط ICMP', + 'tcp' => 'فقط TCP', + ], + 'display' => [ + 'all' => 'کاملاً قابل مشاهده', + 'hint' => 'آیا در لیست اشتراک/گره قابل مشاهده است', + 'invisible' => 'کاملاً نامرئی', + 'node' => 'فقط در صفحه گره‌ها قابل مشاهده است', + 'sub' => 'فقط در اشتراک‌ها قابل مشاهده است', + ], + 'domain_hint' => 'پس از فعال‌سازی DDNS در تنظیمات سیستم، نام دامنه و IPها به‌طور خودکار به‌روزرسانی می‌شوند! دیگر نیازی به ویرایش این اطلاعات در وب‌سایت ثبت دامنه نیست.', + 'domain_placeholder' => 'دامنه سرور، در صورت پر شدن ابتدا استفاده می‌شود', + 'extend' => 'اطلاعات اضافی', + 'hint' => 'توجه: ID به‌طور خودکار تولید شده، node_id برای بک‌اند ShadowsocksR و nodeId برای بک‌اند V2Ray است', + 'ipv4_hint' => 'چندین IP باید با کاما انگلیسی جدا شوند، برای مثال: 1.1.1.1,8.8.8.8', + 'ipv4_placeholder' => 'آدرس IPv4 سرور', + 'ipv6_hint' => 'چندین IP باید با کاما انگلیسی جدا شوند، برای مثال: 1.1.1.1,8.8.8.8', + 'ipv6_placeholder' => 'آدرس IPv6 سرور', + 'level_hint' => 'سطح: 0 - بدون محدودیت سطح، همه قابل مشاهده هستند.', + 'obfs_param_hint' => 'اگر obfs [plain] نیست، پارامترها را برای پنهان‌سازی ترافیک وارد کنید؛ پورت 80 را پیشنهاد می‌کنیم اگر obfs [http_simple] است؛ پورت 443 را پیشنهاد می‌کنیم اگر obfs [tls] است؛', + 'push_port_hint' => 'الزامی است. مطمئن شوید که این پورت در فایروال سرور باز است، در غیر این صورت ارسال پیام‌ها غیرعادی خواهد بود.', + 'single_hint' => 'پورت 80/443 را پیشنهاد می‌کنیم. بک‌اند نیاز به پیکربندی حالت سختگیرانه دارد: فقط از طریق پورت‌های مشخص شده متصل شوید. (چگونه پیکربندی کنیم)', + 'v2_cover' => [ + 'dtls' => 'DTLS 1.2', + 'http' => 'HTTP', + 'none' => 'بدون پنهان‌سازی', + 'srtp' => 'SRTP', + 'utp' => 'uTP', + 'wechat' => 'تماس ویدیویی WeChat', + 'wireguard' => 'WireGuard', + ], + 'v2_host_hint' => 'هنگام استفاده از پنهان‌سازی HTTP، چندین دامنه باید با کاما جدا شوند، در حالی که WebSocket فقط یک دامنه را مجاز می‌داند.', + 'v2_method_hint' => 'پروتکل انتقال WebSocket نباید از روش رمزنگاری \'none\' استفاده کند.', + 'v2_net_hint' => 'لطفاً TLS را برای WebSocket فعال کنید', + 'v2_tls_provider_hint' => 'پیکربندی‌های مختلف برای بک‌اندهای مختلف:', + ], + 'proxy_info' => '*سازگار با Shadowsocks', + 'proxy_info_hint' => 'برای سازگاری، لطفاً _compatible را به پروتکل و obfuscation در پیکربندی سرور اضافه کنید', + 'refresh_geo' => 'تازه‌سازی جغرافیا', + 'refresh_geo_all' => 'تازه‌سازی داده‌های جغرافیا', + 'reload' => 'بارگذاری مجدد بک‌اند', + 'reload_all' => 'بارگذاری مجدد همه سرورها', + 'reload_confirm' => 'آیا می‌خواهید سرور را بارگذاری مجدد کنید؟', + 'traffic_monitor' => 'آمار ترافیک', + ], + 'oauth' => [ + 'counts' => 'مجموع :num رکورد مجوز', + 'title' => 'مجوزهای شخص ثالث', + ], + 'optional' => 'اختیاری', + 'permission' => [ + 'counts' => 'مجموع :num دسترسی', + 'description_hint' => 'توضیحات، برای مثال: [سیستم X] ویرایش A', + 'name_hint' => 'نام مسیر، برای مثال: admin.user.update', + 'title' => 'دسترسی‌ها', + ], + 'query' => 'جستجو', + 'report' => [ + 'annually_accounting' => 'تراکنش‌های سالانه', + 'annually_site_flow' => 'مصرف سالانه ترافیک', + 'avg_traffic_30d' => 'میانگین ترافیک روزانه در 30 روز', + 'current_month' => 'این ماه', + 'current_year' => 'امسال', + 'daily_accounting' => 'تراکنش‌های روزانه', + 'daily_distribution' => 'توزیع روزانه', + 'daily_site_flow' => 'مصرف روزانه ترافیک', + 'daily_traffic' => 'ترافیک روزانه', + 'hourly_traffic' => 'ترافیک ساعتی', + 'last_month' => 'ماه گذشته', + 'last_year' => 'سال گذشته', + 'monthly_accounting' => 'تراکنش‌های ماهانه', + 'monthly_site_flow' => 'مصرف ماهانه ترافیک', + 'select_hourly_date' => 'انتخاب تاریخ ساعتی', + 'sum_traffic_30d' => 'نسبت ترافیک 30 روزه', + 'today' => 'امروز', + ], + 'require' => 'ضروری', + 'role' => [ + 'counts' => 'مجموع :num نقش', + 'description_hint' => 'نام نمایشی، برای مثال: مدیر', + 'modify_admin_error' => 'لطفاً سرپرست ارشد را تغییر ندهید!', + 'name_hint' => 'شناسه منحصر به فرد، برای مثال: admin', + 'permissions_all' => 'همه دسترسی‌ها', + 'title' => 'نقش‌ها', + ], + 'rule' => [ 'counts' => 'مجموع :num قانون', - 'title' => 'قوانین', 'group' => [ + 'counts' => 'مجموع :num گروه', + 'title' => 'گروه‌های قوانین', 'type' => [ 'off' => 'مسدود', 'on' => 'مجاز', ], - 'title' => 'گروه‌های قوانین', - 'counts' => 'مجموع :num گروه', ], - ], - 'role' => [ - 'name_hint' => 'شناسه منحصر به فرد، برای مثال: admin', - 'description_hint' => 'نام نمایشی، برای مثال: مدیر', - 'title' => 'نقش‌ها', - 'permissions_all' => 'همه دسترسی‌ها', - 'counts' => 'مجموع :num نقش', - ], - 'report' => [ - 'daily_accounting' => 'تراکنش‌های روزانه', - 'monthly_accounting' => 'تراکنش‌های ماهانه', - 'annually_accounting' => 'تراکنش‌های سالانه', - 'daily_site_flow' => 'مصرف روزانه ترافیک', - 'monthly_site_flow' => 'مصرف ماهانه ترافیک', - 'annually_site_flow' => 'مصرف سالانه ترافیک', - 'current_month' => 'این ماه', - 'last_month' => 'ماه گذشته', - 'current_year' => 'امسال', - 'last_year' => 'سال گذشته', - 'hourly_traffic' => 'ترافیک ساعتی', - 'daily_traffic' => 'ترافیک روزانه', - 'daily_distribution' => 'توزیع روزانه', - 'today' => 'امروز', - 'avg_traffic_30d' => 'میانگین ترافیک روزانه در 30 روز', - 'sum_traffic_30d' => 'نسبت ترافیک 30 روزه', - 'select_hourly_date' => 'انتخاب تاریخ ساعتی', - ], - 'permission' => [ - 'title' => 'دسترسی‌ها', - 'description_hint' => 'توضیحات، برای مثال: [سیستم X] ویرایش A', - 'name_hint' => 'نام مسیر، برای مثال: admin.user.update', - 'counts' => 'مجموع :num دسترسی', - ], - 'marketing' => [ - 'push_send' => 'ارسال پیام فشاری', - 'email_send' => 'ارسال ایمیل گروهی', - 'email' => [ - 'targeted_users_count' => 'تعداد کاربران هدف', - 'loading_statistics' => 'در حال بارگذاری آمار...', - 'filters' => 'فیلترها', - 'expired_date' => 'تاریخ انقضا', - 'will_expire_date' => 'تاریخ انقضا آینده', - 'traffic_usage_over' => 'استفاده از ترافیک بیش از N%', - 'recently_active' => 'فعالیت اخیر', - 'paid_servicing' => 'خدمات پرداختی', - 'previously_paid' => 'قبلاً پرداخت شده', - 'ever_paid' => 'پرداخت شده', - 'never_paid' => 'هرگز پرداخت نشده', - 'recent_traffic_abnormal' => 'ناهنجاری ترافیک در ساعت اخیر', - ], - 'counts' => 'مجموع :num ایمیل', - 'send_status' => 'وضعیت ارسال', - 'send_time' => 'زمان ارسال', - 'error_message' => 'پیام‌های خطا', - 'processed' => 'درخواست پردازش شده', - 'targeted_users_not_found' => 'کاربران هدف یافت نشد', - 'unknown_sending_type' => 'نوع ارسال ناشناخته', - ], - 'creating' => 'در حال افزودن...', - 'article' => [ + 'title' => 'قوانین', 'type' => [ - 'knowledge' => 'مقاله', - 'announcement' => 'اعلان', + 'domain' => 'دامنه', + 'ip' => 'IP', + 'protocol' => 'پروتکل', + 'reg' => 'عبارت با قاعده', ], - 'category_hint' => 'همه مقالات در یک دسته‌بندی در یک پوشه قرار می‌گیرند', - 'logo_placeholder' => 'یا آدرس URL لوگو را وارد کنید', - 'title' => 'مقالات', - 'counts' => 'مجموع :num مقاله', - ], - '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' => 'فقط زمانی قابل استفاده است که مبلغ پرداختی بیش از :num باشد', - 'used_hint' => 'هر کاربر می‌تواند این کوپن را حداکثر :num بار استفاده کند', - 'levels_hint' => 'فقط برای سطوح کاربری انتخاب شده قابل استفاده است', - 'groups_hint' => 'فقط برای گروه‌های کاربری انتخاب شده قابل استفاده است', - 'users_placeholder' => 'شناسه کاربر را وارد کنید، سپس Enter را فشار دهید', - 'user_whitelist_hint' => 'کاربران سفید لیست می‌توانند استفاده کنند، خالی بگذارید اگر استفاده نمی‌شود', - 'users_blacklist_hint' => 'کاربران سیاه لیست نمی‌توانند استفاده کنند، خالی بگذارید اگر استفاده نمی‌شود', - 'services_placeholder' => 'شناسه محصول را وارد کنید، سپس Enter را فشار دهید', - 'services_whitelist_hint' => 'فقط برای محصولات سفید لیست قابل استفاده است، خالی بگذارید اگر استفاده نمی‌شود', - 'services_blacklist_hint' => 'برای محصولات سیاه لیست قابل استفاده نیست، خالی بگذارید اگر استفاده نمی‌شود', - 'newbie' => [ - 'first_discount' => 'تخفیف اولین بار', - 'first_order' => 'اولین سفارش', - 'created_days' => 'عمر حساب', - ], - 'created_days_hint' => ':days روز پس از ثبت‌نام', - 'limit_hint' => 'قوانین دارای رابطه و هستند، به‌درستی استفاده کنید', - 'info_title' => 'اطلاعات', - 'counts' => 'مجموع :num کوپن', - 'discount' => 'تخفیف', - 'export_title' => 'صادرات', - 'single_use' => 'استفاده یک‌باره', - ], - 'times' => 'بار', - 'massive_export' => 'صادرات گروهی', - 'system_generate' => 'تولید شده توسط سیستم', - 'aff' => [ - 'rebate_title' => 'تاریخچه بازگشت وجه', - 'counts' => 'مجموع :num رکورد بازگشت وجه', - 'title' => 'لیست درخواست‌های برداشت', - 'apply_counts' => 'مجموع :num درخواست برداشت', - 'referral' => 'بازگشت وجه معرفی', - 'commission_title' => 'جزئیات درخواست', - 'commission_counts' => 'این درخواست شامل مجموع :num سفارش است', ], + 'select_all' => 'انتخاب همه', + 'selected_hint' => 'قوانین تخصیص داده شده، اینجا قابل جستجو هستند', + 'set_to' => 'تنظیم به :attribute', 'setting' => [ 'common' => [ - 'title' => 'تنظیمات عمومی', - 'set_default' => 'تنظیم به عنوان پیش‌فرض', 'connect_nodes' => 'تعداد گره‌های متصل', + 'set_default' => 'تنظیم به عنوان پیش‌فرض', + 'title' => 'تنظیمات عمومی', ], 'email' => [ - 'title' => 'لیست فیلتر ایمیل (برای جلوگیری از ثبت‌نام با پسوندهای خاص ایمیل)', - 'tail' => 'پسوند ایمیل', - 'rule' => 'قانون', 'black' => 'لیست سیاه', - 'white' => 'لیست سفید', + 'rule' => 'قانون', + 'tail' => 'پسوند ایمیل', 'tail_placeholder' => 'لطفاً پسوند ایمیل را وارد کنید', - ], - 'system' => [ - 'title' => 'تنظیمات سیستم', - 'web' => 'تنظیمات سایت', - 'account' => 'تنظیمات حساب', - 'node' => 'تنظیمات گره', - 'extend' => 'ویژگی‌های اضافی', - 'check_in' => 'سیستم چک‌این', - 'promotion' => 'سیستم معرفی', - 'notify' => 'سیستم اطلاع‌رسانی', - 'auto_job' => 'وظایف خودکار', - 'other' => 'لوگو | خدمات مشتری | آمار', - 'payment' => 'سیستم پرداخت', - 'menu' => 'منو', + 'title' => 'لیست فیلتر ایمیل (برای جلوگیری از ثبت‌نام با پسوندهای خاص ایمیل)', + 'white' => 'لیست سفید', ], 'no_permission' => 'شما اجازه تغییر پارامترها را ندارید!', + 'system' => [ + 'account' => 'تنظیمات حساب', + 'auto_job' => 'وظایف خودکار', + 'check_in' => 'سیستم چک‌این', + 'extend' => 'ویژگی‌های اضافی', + 'menu' => 'منو', + 'node' => 'تنظیمات گره', + 'notify' => 'سیستم اطلاع‌رسانی', + 'other' => 'لوگو | خدمات مشتری | آمار', + 'payment' => 'سیستم پرداخت', + 'promotion' => 'سیستم معرفی', + 'title' => 'تنظیمات سیستم', + 'web' => 'تنظیمات سایت', + ], ], + 'sort_asc' => 'مقدار مرتب‌سازی بزرگتر اولویت بالاتری دارد', + 'start_time' => 'شروع', 'system' => [ + 'AppStore_id' => 'حساب اپل', + 'AppStore_password' => 'رمز عبور اپل', 'account_expire_notification' => 'اطلاع‌رسانی انقضای حساب', + 'active_account' => [ + 'after' => 'فعال‌سازی پس از ثبت‌نام', + 'before' => 'فعال‌سازی قبل از ثبت‌نام', + ], 'active_times' => 'تعداد فعال‌سازی حساب', 'admin_invite_days' => 'مدت اعتبار دعوت‌نامه مدیر', 'aff_salt' => 'رمزنگاری اطلاعات کاربر در لینک معرفی', 'alipay_qrcode' => 'کد QR علی‌پی', - 'AppStore_id' => 'حساب اپل', - 'AppStore_password' => 'رمز عبور اپل', 'auto_release_port' => 'مکانیزم بازیابی پورت', 'bark_key' => 'کلید دستگاه Bark', + 'captcha' => [ + 'geetest' => 'Geetest', + 'hcaptcha' => 'hCaptcha', + 'recaptcha' => 'Google reCaptcha', + 'standard' => 'کد امنیتی استاندارد', + 'turnstile' => 'Turnstile', + ], 'captcha_key' => 'کلید کد امنیتی', 'captcha_secret' => 'رمز/شناسه کد امنیتی', 'codepay_id' => 'شناسه CodePay', @@ -521,6 +477,7 @@ return [ 'ddns_secret' => 'رمز DNS', 'default_days' => 'مدت اعتبار پیش‌فرض', 'default_traffic' => 'داده اولیه پیش‌فرض', + 'demo_restriction' => 'در محیط نمایشی، تغییر این پیکربندی ممنوع است!', 'detection_check_times' => 'اطلاع‌رسانی تشخیص انسداد', 'dingTalk_access_token' => 'توکن دسترسی DingTalk', 'dingTalk_secret' => 'رمز DingTalk', @@ -531,108 +488,19 @@ return [ 'f2fpay_app_id' => 'شناسه برنامه Alipay', 'f2fpay_private_key' => 'کلید خصوصی Alipay', 'f2fpay_public_key' => 'کلید عمومی Alipay', + 'forbid' => [ + 'china' => 'مسدودسازی دسترسی از چین', + 'mainland' => 'مسدودسازی دسترسی از سرزمین اصلی چین', + 'oversea' => 'مسدودسازی دسترسی از خارج از کشور', + ], '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_QQPay' => 'پرداخت QQ', - 'is_rand_port' => 'پورت تصادفی', - 'is_register' => 'ثبت‌نام کاربران', - 'is_subscribe_ban' => 'مسدودسازی خودکار درخواست‌های اشتراک غیرعادی', - 'is_traffic_ban' => 'مسدودسازی خودکار در صورت استفاده غیرعادی از داده', - 'is_WeChatPay' => 'پرداخت WeChat', - 'iYuu_token' => 'توکن IYUU', - 'maintenance_content' => 'محتوای معرفی نگهداری', - 'maintenance_mode' => 'حالت نگهداری', - 'maintenance_time' => 'زمان پایان نگهداری', - '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' => 'شناسه برنامه PayBeaver', - 'paybeaver_app_secret' => 'رمز برنامه PayBeaver', - 'payjs_key' => 'کلید PayJs', - 'payjs_mch_id' => 'شناسه بازرگان PayJs', - 'payment_confirm_notification' => 'اطلاع‌رسانی تأیید پرداخت دستی', - 'payment_received_notification' => 'اطلاع‌رسانی موفقیت پرداخت', - 'paypal_app_id' => 'شناسه برنامه PayPal', - 'paypal_client_id' => 'شناسه مشتری PayPal', - 'paypal_client_secret' => 'کلید مخفی PayPal', - 'pushDeer_key' => 'کلید PushDeer', - 'pushplus_token' => 'توکن PushPlus', - 'rand_subscribe' => 'اشتراک تصادفی', - 'redirect_url' => 'URL تغییر مسیر', - 'referral_money' => 'حداقل مبلغ برداشت', - 'referral_percent' => 'درصد بازگشت وجه', - 'referral_status' => 'وضعیت معرفی', - 'referral_traffic' => 'هدیه داده برای ثبت‌نام با لینک معرفی', - 'referral_type' => 'نوع بازگشت وجه', - 'register_ip_limit' => 'محدودیت ثبت‌نام با IP مشابه', - 'reset_password_times' => 'تعداد بازنشانی رمز عبور', - 'reset_traffic' => 'بازنشانی خودکار داده', - 'server_chan_key' => 'کلید ServerChan', - 'standard_currency' => 'واحد پول اصلی', - 'stripe_public_key' => 'کلید عمومی Stripe', - 'stripe_secret_key' => 'کلید مخفی Stripe', - 'stripe_signing_secret' => 'رمز امضای WebHook', - 'subject_name' => 'نام محصول سفارشی', - 'subscribe_ban_times' => 'حداکثر تعداد درخواست‌های اشتراک', - 'subscribe_domain' => 'آدرس اشتراک', - 'subscribe_max' => 'حداکثر تعداد گره‌های اشتراک', - 'telegram_token' => 'توکن Telegram', - 'tg_chat_token' => 'توکن TG Chat', - 'theadpay_key' => 'کلید THeadPay', - 'theadpay_mchid' => 'شناسه بازرگان THeadPay', - 'theadpay_url' => 'URL THeadPay', - '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' => 'تنظیمات TLS برای V2Ray', - 'webmaster_email' => 'ایمیل مدیر سایت', - 'website_analytics' => 'کد آمار وب‌سایت', - 'website_callback_url' => 'آدرس بازگشت پرداخت', - 'website_customer_service' => 'کد خدمات مشتری', - 'website_home_logo' => 'لوگو صفحه اصلی', - 'website_logo' => 'لوگو سایت', - 'website_name' => 'نام وب‌سایت', - 'website_security_code' => 'کد امنیتی وب‌سایت', - 'website_url' => 'آدرس وب‌سایت', - 'web_api_url' => 'آدرس API', - 'wechat_aid' => 'شناسه برنامه WeChat', - 'wechat_cid' => 'شناسه شرکت WeChat', - 'wechat_encodingAESKey' => 'کلید رمزنگاری AES WeChat', - 'wechat_qrcode' => 'کد QR WeChat', - 'wechat_secret' => 'رمز WeChat', - 'wechat_token' => 'توکن WeChat', 'hint' => [ + 'AppStore_id' => 'حساب اپل استفاده شده در آموزش‌ها', + 'AppStore_password' => 'رمز عبور اپل استفاده شده در آموزش‌ها', 'account_expire_notification' => 'اطلاع‌رسانی انقضای حساب', 'active_times' => 'تعداد فعال‌سازی حساب از طریق ایمیل در 24 ساعت', 'admin_invite_days' => 'مدت اعتبار کدهای دعوت ایجاد شده توسط مدیر', 'aff_salt' => 'رمزنگاری لینک دعوت با استفاده از متن مخفی', - 'AppStore_id' => 'حساب اپل استفاده شده در آموزش‌ها', - 'AppStore_password' => 'رمز عبور اپل استفاده شده در آموزش‌ها', 'auto_release_port' => 'پورت‌های مسدود شده/منقضی شده پس از '.config('tasks.release_port').' روز به‌صورت خودکار آزاد می‌شوند', 'bark_key' => 'کلید دستگاه برای ارسال پیام به iOS', 'captcha_key' => 'راهنمای تنظیمات اینجا', @@ -650,6 +518,7 @@ return [ 'f2fpay_private_key' => 'کلید خصوصی Alipay از ابزار تولید کلید', 'f2fpay_public_key' => 'توجه: این کلید عمومی برنامه نیست!', 'forbid_mode' => 'مسدودسازی دسترسی از مناطق مشخص', + 'iYuu_token' => 'پر کردن توکن IYUU قبل از فعال‌سازی', 'invite_num' => 'تعداد دعوت‌نامه‌های پیش‌فرض برای هر کاربر', 'is_activate_account' => 'نیاز به فعال‌سازی حساب از طریق ایمیل', 'is_ban_status' => '(احتیاط) مسدودسازی کل حساب باعث بازنشانی تمام داده‌های کاربر می‌شود', @@ -664,14 +533,14 @@ return [ 'is_register' => 'غیرفعال‌سازی ثبت‌نام در صورت عدم انتخاب', 'is_subscribe_ban' => 'مسدودسازی خودکار در صورت درخواست‌های اشتراک بیش از حد', 'is_traffic_ban' => 'غیرفعال‌سازی خودکار سرویس در صورت استفاده غیرعادی از داده در یک ساعت', - 'iYuu_token' => 'پر کردن توکن IYUU قبل از فعال‌سازی', 'maintenance_content' => 'اطلاع‌رسانی سفارشی نگهداری', - 'maintenance_mode' => "انتقال کاربران عادی به صفحه نگهداری در صورت فعال‌سازی | مدیر می‌تواند از طریق :url وارد شود", + 'maintenance_mode' => 'انتقال کاربران عادی به صفحه نگهداری در صورت فعال‌سازی | مدیر می‌تواند از طریق :url وارد شود', 'maintenance_time' => 'برای شمارش معکوس صفحه نگهداری', 'min_port' => 'محدوده پورت 1000 - 65535', 'node_blocked_notification' => 'تشخیص انسداد گره ساعتی و اطلاع‌رسانی به مدیران', 'node_daily_notification' => 'گزارش روزانه استفاده از گره', 'node_offline_notification' => 'تشخیص آفلاین شدن هر 10 دقیقه و اطلاع‌رسانی در صورت آفلاین بودن گره', + 'node_renewal_notification' => '7 روز، 3 روز و 1 روز قبل از انقضا به مدیر یادآوری کنید که گره را تمدید کند.', 'oauth_path' => 'لطفاً ابتدا پلتفرم‌ها را در .ENV فعال کنید', 'offline_check_times' => 'توقف اطلاع‌رسانی پس از N هشدار در 24 ساعت', 'password_reset_notification' => 'اجازه بازنشانی رمز عبور از طریق ایمیل در صورت فعال‌سازی', @@ -707,9 +576,10 @@ return [ 'traffic_ban_value' => 'مسدودسازی خودکار حساب در صورت تجاوز از این مقدار در یک ساعت', 'traffic_limit_time' => 'فاصله زمانی بین چک‌این‌ها', 'traffic_warning_percent' => 'ارسال اطلاع‌رسانی اتمام داده هنگامی که استفاده روزانه به این درصد برسد', - 'username_type' => 'نوع نام کاربری پیش‌فرض برای کاربران', 'user_invite_days' => 'مدت اعتبار کدهای دعوت ایجاد شده توسط کاربر', + 'username_type' => 'نوع نام کاربری پیش‌فرض برای کاربران', 'v2ray_tls_provider' => 'تنظیمات گره این پیکربندی TLS را نادیده می‌گیرد', + 'web_api_url' => 'مثال: '.config('app.url'), 'webmaster_email' => 'ایمیل تماس نمایش داده شده در برخی از پیام‌های خطا', 'website_analytics' => 'کد جاوا اسکریپت تحلیل وب‌سایت', 'website_callback_url' => 'جلوگیری از شکست بازگشت پرداخت به دلیل DNS poisoning', @@ -717,97 +587,247 @@ return [ 'website_name' => 'نام وب‌سایت در ایمیل‌ها', 'website_security_code' => 'نیاز به کد امنیتی برای دسترسی به سایت در صورت تنظیم', 'website_url' => 'دامنه اصلی مورد استفاده برای لینک‌ها', - 'web_api_url' => 'مثال: '.config('app.url'), 'wechat_aid' => 'مدیریت برنامه -> AgentId', 'wechat_cid' => 'دریافت از اطلاعات شرکت', 'wechat_encodingAESKey' => 'مدیریت برنامه -> تنظیمات برنامه -> EncodingAESKey', 'wechat_secret' => 'رمز برنامه (ممکن است نیاز به دانلود WeChat Enterprise باشد)', 'wechat_token' => 'تنظیمات برنامه -> TOKEN، آدرس بازگشت: :url', ], - 'placeholder' => [ - 'default_url' => 'پیش‌فرض به عنوان :url', - 'server_chan_key' => 'پر کردن SCKEY ServerChan سپس کلیک بر روی به‌روزرسانی', - 'pushDeer_key' => 'پر کردن کلید PushDeer سپس کلیک بر روی به‌روزرسانی', - 'iYuu_token' => 'پر کردن توکن IYUU سپس کلیک بر روی به‌روزرسانی', - 'bark_key' => 'پر کردن کلید دستگاه Bark سپس کلیک بر روی به‌روزرسانی', - 'telegram_token' => 'پر کردن توکن Telegram سپس کلیک بر روی به‌روزرسانی', - 'pushplus_token' => 'لطفاً در ServerChan درخواست دهید', - 'dingTalk_access_token' => 'توکن دسترسی ربات سفارشی', - 'dingTalk_secret' => 'رمز ربات سفارشی پس از امضا', - 'wechat_aid' => 'شناسه برنامه WeChat Enterprise', - 'wechat_cid' => 'پر کردن CID WeChat سپس کلیک بر روی به‌روزرسانی', - 'wechat_secret' => 'رمز برنامه WeChat Enterprise', - 'tg_chat_token' => 'لطفاً در Telegram درخواست دهید', - 'codepay_url' => 'https://codepay.fatq.com/create_order/?', + 'iYuu_token' => 'توکن IYUU', + 'invite_num' => 'تعداد دعوت‌نامه‌های پیش‌فرض', + 'is_AliPay' => 'پرداخت علی‌پی', + 'is_QQPay' => 'پرداخت QQ', + 'is_WeChatPay' => 'پرداخت WeChat', + 'is_activate_account' => 'فعال‌سازی حساب', + '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_rand_port' => 'پورت تصادفی', + 'is_register' => 'ثبت‌نام کاربران', + 'is_subscribe_ban' => 'مسدودسازی خودکار درخواست‌های اشتراک غیرعادی', + 'is_traffic_ban' => 'مسدودسازی خودکار در صورت استفاده غیرعادی از داده', + 'maintenance_content' => 'محتوای معرفی نگهداری', + 'maintenance_mode' => 'حالت نگهداری', + 'maintenance_time' => 'زمان پایان نگهداری', + 'min_port' => 'محدوده پورت', + 'min_rand_traffic' => 'محدوده داده', + 'node_blocked_notification' => 'اطلاع‌رسانی انسداد گره', + 'node_daily_notification' => 'گزارش روزانه مصرف گره', + 'node_offline_notification' => 'اطلاع‌رسانی آفلاین شدن گره', + 'node_renewal_notification' => 'اطلاعیه تمدید گره', + 'notification' => [ + 'channel' => [ + 'bark' => 'Bark', + 'dingtalk' => 'DingTalk', + 'email' => 'ایمیل', + 'iyuu' => 'IYUU', + 'pushdeer' => 'PushDeer', + 'pushplus' => 'PushPlus', + 'serverchan' => 'ServerChan', + 'site' => 'اعلان درون سایت', + 'telegram' => 'تلگرام', + 'tg_chat' => 'TG Chat', + 'wechat' => 'WeChat Enterprise', + ], + 'send_test' => 'ارسال پیام آزمایشی', + 'test' => [ + 'content' => 'محتوای آزمون', + 'success' => 'ارسال با موفقیت انجام شد. لطفاً تلفن خود را برای دریافت اعلان پوش بررسی کنید.', + 'title' => 'این یک عنوان آزمایشی است', + 'unknown_channel' => 'کانال ناشناخته', + ], ], + 'oauth_path' => 'پلتفرم‌های ورود شخص ثالث', + 'offline_check_times' => 'تعداد اطلاع‌رسانی‌های آفلاین', + 'params_required' => 'لطفاً ابتدا پارامترهای ضروری برای این :attribute را کامل کنید!', + 'password_reset_notification' => 'اطلاع‌رسانی بازنشانی رمز عبور', + 'paybeaver_app_id' => 'شناسه برنامه PayBeaver', + 'paybeaver_app_secret' => 'رمز برنامه PayBeaver', + 'payjs_key' => 'کلید PayJs', + 'payjs_mch_id' => 'شناسه بازرگان PayJs', 'payment' => [ 'attribute' => 'درگاه پرداخت', 'channel' => [ 'alipay' => 'Alipay F2F', 'codepay' => 'CodePay', 'epay' => 'ePay', + 'manual' => 'پرداخت دستی', + 'paybeaver' => 'PayBeaver', 'payjs' => 'PayJs', 'paypal' => 'PayPal', 'stripe' => 'Stripe', - 'paybeaver' => 'PayBeaver', 'theadpay' => 'THeadPay', - 'manual' => 'پرداخت دستی', ], 'hint' => [ 'alipay' => 'این ویژگی نیاز به رفتن به پلتفرم باز خدمات مالی Ant برای درخواست مجوز و برنامه دارد', 'codepay' => 'لطفاً به CodePay بروید و یک حساب کاربری درخواست دهید، سپس نرم‌افزار آن را دانلود و تنظیم کنید', + 'manual' => 'پس از تنظیم و انتخاب درگاه پرداخت، در سمت کاربر نمایش داده می‌شود', + 'paybeaver' => 'لطفاً به PayBeaver بروید و یک حساب کاربری درخواست دهید', 'payjs' => 'لطفاً به PayJs بروید و یک حساب کاربری درخواست دهید', 'paypal' => 'با حساب بازرگانی خود وارد صفحه درخواست اعتبار API شوید، موافقت کنید و اطلاعات تنظیمات را دریافت کنید', - 'paybeaver' => 'لطفاً به PayBeaver بروید و یک حساب کاربری درخواست دهید', 'theadpay' => 'لطفاً به THeadPay بروید و یک حساب کاربری درخواست دهید', - 'manual' => 'پس از تنظیم و انتخاب درگاه پرداخت، در سمت کاربر نمایش داده می‌شود', ], ], - 'notification' => [ - 'channel' => [ - 'telegram' => 'تلگرام', - 'wechat' => 'WeChat Enterprise', - 'dingtalk' => 'DingTalk', - 'email' => 'ایمیل', - 'bark' => 'Bark', - 'serverchan' => 'ServerChan', - 'pushdeer' => 'PushDeer', - 'pushplus' => 'PushPlus', - 'iyuu' => 'IYUU', - 'tg_chat' => 'TG Chat', - 'site' => 'اعلان درون سایت', - ], - 'send_test' => 'ارسال پیام آزمایشی', + 'payment_confirm_notification' => 'اطلاع‌رسانی تأیید پرداخت دستی', + 'payment_received_notification' => 'اطلاع‌رسانی موفقیت پرداخت', + 'paypal_app_id' => 'شناسه برنامه PayPal', + 'paypal_client_id' => 'شناسه مشتری PayPal', + 'paypal_client_secret' => 'کلید مخفی PayPal', + 'placeholder' => [ + 'bark_key' => 'پر کردن کلید دستگاه Bark سپس کلیک بر روی به‌روزرسانی', + 'codepay_url' => 'https://codepay.fatq.com/create_order/?', + 'default_url' => 'پیش‌فرض به عنوان :url', + 'dingTalk_access_token' => 'توکن دسترسی ربات سفارشی', + 'dingTalk_secret' => 'رمز ربات سفارشی پس از امضا', + 'iYuu_token' => 'پر کردن توکن IYUU سپس کلیک بر روی به‌روزرسانی', + 'pushDeer_key' => 'پر کردن کلید PushDeer سپس کلیک بر روی به‌روزرسانی', + 'pushplus_token' => 'لطفاً در ServerChan درخواست دهید', + 'server_chan_key' => 'پر کردن SCKEY ServerChan سپس کلیک بر روی به‌روزرسانی', + 'telegram_token' => 'پر کردن توکن Telegram سپس کلیک بر روی به‌روزرسانی', + 'tg_chat_token' => 'لطفاً در Telegram درخواست دهید', + 'wechat_aid' => 'شناسه برنامه WeChat Enterprise', + 'wechat_cid' => 'پر کردن CID WeChat سپس کلیک بر روی به‌روزرسانی', + 'wechat_secret' => 'رمز برنامه WeChat Enterprise', ], - 'forbid' => [ - 'mainland' => 'مسدودسازی دسترسی از سرزمین اصلی چین', - 'china' => 'مسدودسازی دسترسی از چین', - 'oversea' => 'مسدودسازی دسترسی از خارج از کشور', + 'pushDeer_key' => 'کلید PushDeer', + 'pushplus_token' => 'توکن PushPlus', + 'rand_subscribe' => 'اشتراک تصادفی', + 'redirect_url' => 'URL تغییر مسیر', + 'referral' => [ + 'loop' => 'بازگشت وجه دائمی', + 'once' => 'بازگشت وجه اولین خرید', ], + 'referral_money' => 'حداقل مبلغ برداشت', + 'referral_percent' => 'درصد بازگشت وجه', + 'referral_status' => 'وضعیت معرفی', + 'referral_traffic' => 'هدیه داده برای ثبت‌نام با لینک معرفی', + 'referral_type' => 'نوع بازگشت وجه', + 'register_ip_limit' => 'محدودیت ثبت‌نام با IP مشابه', + 'reset_password_times' => 'تعداد بازنشانی رمز عبور', + 'reset_traffic' => 'بازنشانی خودکار داده', + 'server_chan_key' => 'کلید ServerChan', + 'standard_currency' => 'واحد پول اصلی', + 'stripe_public_key' => 'کلید عمومی Stripe', + 'stripe_secret_key' => 'کلید مخفی Stripe', + 'stripe_signing_secret' => 'رمز امضای WebHook', + 'subject_name' => 'نام محصول سفارشی', + 'subscribe_ban_times' => 'حداکثر تعداد درخواست‌های اشتراک', + 'subscribe_domain' => 'آدرس اشتراک', + 'subscribe_max' => 'حداکثر تعداد گره‌های اشتراک', + 'telegram_token' => 'توکن Telegram', + 'tg_chat_token' => 'توکن TG Chat', + 'theadpay_key' => 'کلید THeadPay', + 'theadpay_mchid' => 'شناسه بازرگان THeadPay', + 'theadpay_url' => 'URL THeadPay', + 'ticket_closed_notification' => 'اطلاع‌رسانی بسته شدن تیکت', + 'ticket_created_notification' => 'اطلاع‌رسانی ایجاد تیکت جدید', + 'ticket_replied_notification' => 'اطلاع‌رسانی پاسخ به تیکت', + 'traffic_ban_time' => 'مدت زمان مسدودسازی', + 'traffic_ban_value' => 'آستانه استفاده غیرعادی از داده', + 'traffic_limit_time' => 'فاصله زمانی بین چک‌این‌ها', + 'traffic_warning_percent' => 'آستانه هشدار استفاده از داده', + 'trojan_license' => 'مجوز Trojan', + 'user_invite_days' => 'مدت اعتبار دعوت‌نامه کاربر', 'username' => [ + 'any' => 'هر نام کاربری', 'email' => 'ایمیل', 'mobile' => 'شماره تلفن', - 'any' => 'هر نام کاربری', ], - 'active_account' => [ - 'before' => 'فعال‌سازی قبل از ثبت‌نام', - 'after' => 'فعال‌سازی پس از ثبت‌نام', + 'username_type' => 'نوع نام کاربری', + 'v2ray_license' => 'مجوز V2Ray', + 'v2ray_tls_provider' => 'تنظیمات TLS برای V2Ray', + 'web_api_url' => 'آدرس API', + 'webmaster_email' => 'ایمیل مدیر سایت', + 'website_analytics' => 'کد آمار وب‌سایت', + 'website_callback_url' => 'آدرس بازگشت پرداخت', + 'website_customer_service' => 'کد خدمات مشتری', + 'website_home_logo' => 'لوگو صفحه اصلی', + 'website_logo' => 'لوگو سایت', + 'website_name' => 'نام وب‌سایت', + 'website_security_code' => 'کد امنیتی وب‌سایت', + 'website_url' => 'آدرس وب‌سایت', + 'wechat_aid' => 'شناسه برنامه WeChat', + 'wechat_cid' => 'شناسه شرکت WeChat', + 'wechat_encodingAESKey' => 'کلید رمزنگاری AES WeChat', + 'wechat_qrcode' => 'کد QR WeChat', + 'wechat_secret' => 'رمز WeChat', + 'wechat_token' => 'توکن WeChat', + ], + 'system_generate' => 'تولید شده توسط سیستم', + 'ticket' => [ + 'close_confirm' => 'آیا می‌خواهید این تیکت را ببندید؟', + 'counts' => 'مجموع :num تیکت', + 'error' => 'خطای ناشناخته! لطفاً لاگ‌ها را بررسی کنید', + 'inviter_info' => 'اطلاعات دعوت‌کننده', + 'self_send' => 'نمی‌توانید برای خودتان تیکت ایجاد کنید!', + 'send_to' => 'لطفاً جزئیات کاربر هدف را وارد کنید', + 'title' => 'تیکت‌ها', + 'user_info' => 'اطلاعات کاربر', + ], + 'times' => 'بار', + 'tools' => [ + 'analysis' => [ + 'file_missing' => ':file_name وجود ندارد. لطفاً ابتدا فایل را ایجاد کنید.', + 'not_enough' => 'کمتر از 15000 رکورد، قادر به تحلیل نیست', + 'req_url' => 'سوابق URL درخواست‌های اخیر', + 'title' => 'تحلیل لاگ SSR فقط برای یک گره', ], - 'captcha' => [ - 'standard' => 'کد امنیتی استاندارد', - 'geetest' => 'Geetest', - 'recaptcha' => 'Google reCaptcha', - 'hcaptcha' => 'hCaptcha', - 'turnstile' => 'Turnstile', + 'convert' => [ + 'content_placeholder' => 'لطفاً اطلاعات پیکربندی که نیاز به تبدیل دارند را وارد کنید.', + 'file_missing' => 'فایل پیدا نشد. لطفاً مجوزهای دایرکتوری را بررسی کنید.', + 'missing_error' => 'تبدیل ناموفق: اطلاعات پیکربندی فاقد فیلد [port_password] است یا این فیلد خالی است.', + 'params_unknown' => 'استثنای پارامتر', + 'title' => 'تبدیل فرمت SS به SSR', ], - 'referral' => [ - 'once' => 'بازگشت وجه اولین خرید', - 'loop' => 'بازگشت وجه دائمی', + 'decompile' => [ + 'attribute' => 'لینک پیکربندی دی‌کامپایل', + 'content_placeholder' => 'لطفاً لینک‌های ShadowsocksR که نیاز به دی‌کامپایل دارند را وارد کنید، با خط جدا شوند.', + 'title' => 'دی‌کامپایل اطلاعات پیکربندی', + ], + 'import' => [ + 'file_error' => 'خطای ناشناخته‌ای رخ داده است. لطفاً دوباره بارگذاری کنید.', + 'file_required' => 'لطفاً فایلی را برای بارگذاری انتخاب کنید', + 'file_type_error' => 'فقط فایل‌های نوع :type برای بارگذاری مجاز هستند.', + 'format_error' => 'خطای تجزیه فرمت محتوا. لطفاً فایلی از نوع :type که با فرمت مشخص شده مطابقت دارد بارگذاری کنید.', ], ], - 'set_to' => 'تنظیم به :attribute', - 'minute' => 'دقیقه', - 'query' => 'جستجو', - 'optional' => 'اختیاری', - 'require' => 'ضروری', + 'unselected_hint' => 'قوانینی که باید تخصیص داده شوند، اینجا قابل جستجو هستند', + 'user' => [ + 'admin_deletion' => 'مدیران سیستم را نمی‌توان حذف کرد', + 'bulk_account_quantity' => 'تعداد حساب‌های تولید شده به‌صورت عمده', + 'connection_test' => 'تست اتصال', + 'counts' => 'مجموع :num حساب', + 'group' => [ + 'counts' => 'مجموع :num گروه', + 'name' => 'نام گروه', + 'title' => 'کنترل گروه‌های کاربری (یک گره می‌تواند در چندین گروه باشد، اما کاربر فقط می‌تواند در یک گروه باشد؛ برای گره‌های قابل مشاهده/قابل استفاده برای کاربران، گروه اولویت بیشتری نسبت به سطح دارد)', + ], + 'info' => [ + 'account' => 'اطلاعات حساب', + 'expired_date_hint' => 'اگر خالی بماند، پیش‌فرض یک سال اعتبار دارد', + 'proxy' => 'اطلاعات پروکسی', + 'recharge_placeholder' => 'اگر منفی باشد، موجودی کسر می‌شود', + 'reset_date_hint' => 'تاریخ بازنشانی بعدی ترافیک', + 'switch' => 'تغییر هویت', + 'uuid_hint' => 'UUID برای V2Ray', + ], + 'online_monitor' => 'نظارت آنلاین', + 'proxies_config' => 'اطلاعات اتصال برای :username', + 'proxy_info' => 'اطلاعات پیکربندی', + 'reset_confirm' => [0 => 'آیا می‌خواهید ترافیک [', 1 => '] را بازنشانی کنید؟'], + 'reset_traffic' => 'بازنشانی ترافیک', + 'traffic_monitor' => 'آمار ترافیک', + 'update_help' => 'به‌روزرسانی موفقیت‌آمیز بود، بازگردید؟', + 'user_view' => 'تغییر به نمای کاربر', + ], + 'user_dashboard' => 'مرکز کاربری', + 'yes' => 'بله', + 'zero_unlimited_hint' => '0 یا خالی برای نامحدود', ]; diff --git a/resources/lang/fa/auth.php b/resources/lang/fa/auth.php index 62e6c4c0..c84d862a 100644 --- a/resources/lang/fa/auth.php +++ b/resources/lang/fa/auth.php @@ -40,27 +40,18 @@ return [ ], 'failed' => 'مشخصات وارد شده با اطلاعات ما سازگار نیست.', 'invite' => [ - 'attribute' => 'کد دعوت', - 'error' => [ - 'unavailable' => 'کد دعوت نامعتبر است، لطفاً دوباره تلاش کنید.', - ], 'get' => 'دریافت کد دعوت', 'not_required' => 'نیازی به کد دعوت نیست، می‌توانید مستقیماً ثبت نام کنید!', + 'unavailable' => 'کد دعوت نامعتبر است، لطفاً دوباره تلاش کنید.', ], 'login' => 'ورود', 'logout' => 'خروج', 'maintenance' => 'نگهداری', 'maintenance_tip' => 'در حال نگهداری', 'oauth' => [ - 'bind_failed' => 'اتصال ناموفق بود', - 'bind_success' => 'اتصال موفقیت‌آمیز بود', 'login_failed' => 'ورود با شخص ثالث ناموفق بود!', - 'rebind_success' => 'اتصال مجدد موفقیت‌آمیز بود', 'register' => 'ثبت نام سریع', - 'register_failed' => 'ثبت نام ناموفق بود', 'registered' => 'قبلاً ثبت نام کرده‌اید، لطفاً مستقیماً وارد شوید.', - 'unbind_failed' => 'قطع اتصال ناموفق بود', - 'unbind_success' => 'قطع اتصال موفقیت‌آمیز بود', ], 'one-click_login' => 'ورود با یک کلیک', 'optional' => 'اختیاری', @@ -73,7 +64,6 @@ return [ 'error' => [ 'demo' => 'در حالت دمو نمی‌توان رمز عبور ادمین را تغییر داد.', 'disabled' => 'بازنشانی رمز عبور غیر فعال شده است، لطفاً برای کمک با :email تماس بگیرید.', - 'failed' => 'بازنشانی رمز عبور ناموفق بود.', 'same' => 'رمز عبور جدید نمی‌تواند با رمز عبور قدیمی یکسان باشد، لطفاً دوباره وارد کنید.', 'throttle' => 'شما می‌توانید فقط :time بار در 24 ساعت رمز عبور را بازنشانی کنید، لطفاً عملیات را تکرار نکنید.', 'wrong' => 'رمز عبور اشتباه است، لطفاً دوباره تلاش کنید.', @@ -91,7 +81,6 @@ return [ ], 'failed' => 'ثبت نام ناموفق بود، لطفاً بعداً دوباره تلاش کنید.', 'promotion' => 'هنوز حساب کاربری ندارید؟ لطفاً به ', - 'success' => 'ثبت نام موفقیت‌آمیز بود', ], 'remember_me' => 'مرا به خاطر بسپار', 'request' => 'درخواست', diff --git a/resources/lang/fa/common.php b/resources/lang/fa/common.php index a3e60045..7eb7f77a 100644 --- a/resources/lang/fa/common.php +++ b/resources/lang/fa/common.php @@ -3,141 +3,149 @@ declare(strict_types=1); return [ - 'hour' => '{1} ساعت|{2} ساعت', 'account' => 'حساب', + 'action' => 'عملیات', + 'active_item' => 'فعال کردن :attribute', + 'add' => 'اضافه کردن', + 'advance' => 'پیشرفته', + 'all' => 'همه', + 'applied' => ':attribute اعمال شد', + 'apply' => 'اعمال', 'available_date' => 'دوره اعتبار', - 'created_at' => 'تاریخ ایجاد', - 'expired_at' => 'تاریخ انقضا', - 'updated_at' => 'آخرین بروزرسانی', - 'latest_at' => 'آخرین فعالیت', + 'avatar' => 'آواتار', 'back' => 'بازگشت', 'back_to' => 'بازگشت به :page', + 'bark' => [ + 'custom' => 'اطلاعات سفارشی', + 'node_status' => 'وضعیت گره', + ], 'cancel' => 'لغو', + 'change' => 'تغییر', 'close' => 'بستن', 'close_item' => 'بستن :attribute', 'confirm' => 'تأیید', 'continue' => 'ادامه', - 'open' => 'باز کردن', - 'send' => 'ارسال', - 'view' => 'مشاهده', - 'reset' => 'بازنشانی', + 'convert' => 'تبدیل', 'copy' => [ 'attribute' => 'کپی', - 'success' => 'کپی با موفقیت انجام شد', 'failed' => 'کپی ناموفق بود، لطفاً دستی کپی کنید', + 'success' => 'کپی با موفقیت انجام شد', ], - 'add' => 'اضافه کردن', - 'free' => 'رایگان', - 'change' => 'تغییر', - 'submit' => 'ارسال', - 'submit_item' => 'ارسال :attribute', - 'generate' => 'تولید', - 'generate_item' => 'تولید :attribute', - 'to_safari' => [0 => 'روی گوشه بالا سمت راست کلیک کنید', 1 => '، سپس انتخاب کنید', 2 => 'باز کردن در Safari', 3 => ' تا بتوانید به درستی به این سایت دسترسی پیدا کنید!'], - 'update_browser' => [0 => 'شما از یک مرورگر', 1 => 'قدیمی', 2 => ' استفاده می‌کنید. لطفاً', 3 => 'مرورگر خود را ارتقا دهید', 4 => 'برای بهترین تجربه'], - 'apply' => 'اعمال', - 'avatar' => 'آواتار', + 'create' => 'ایجاد کردن', + 'created_at' => 'تاریخ ایجاد', 'customize' => 'شخصی‌سازی', - 'all' => 'همه', - 'default' => 'پیش‌فرض', - 'download' => 'دانلود', - 'goto' => 'برو به', - 'warning' => 'هشدار', - 'success' => 'موفقیت', - 'success_item' => ':attribute موفق شد', - 'failed' => 'ناموفق', - 'failed_item' => ':attribute ناموفق بود', - 'update' => 'بروزرسانی', - 'update_action' => 'بروزرسانی :action', - 'none' => 'هیچ', - 'new' => 'جدید', - 'sorry' => 'متأسفیم', - 'applied' => ':attribute اعمال شد', - 'active_item' => 'فعال کردن :attribute', - 'error' => 'خطا', - 'toggle' => 'تغییر وضعیت', - 'toggle_action' => 'تغییر وضعیت :action', - 'request_url' => 'آدرس درخواست', - 'function' => [ - 'navigation' => 'ناوبری', - 'menubar' => 'نوار منو', - 'fullscreen' => 'تمام صفحه', - ], 'days' => [ 'attribute' => '{1} روز|{2} روز', + 'next' => 'روز بعد', 'weekend' => 'آخر هفته', 'work' => 'روز کاری', - 'next' => 'روز بعد', ], - 'qrcode' => 'کد QR :attribute', + 'default' => 'پیش‌فرض', + 'delete' => 'حذف', 'deleted' => 'حذف شد', 'deleted_item' => ':attribute حذف شد', - 'print' => 'چاپ', - 'unlimited' => 'نامحدود', - 'payment' => [ - 'credit' => 'اعتبار', - 'alipay' => 'علی‌پی', - 'qq' => 'کیف پول QQ', - 'wechat' => 'پرداخت وی‌چت', - 'crypto' => 'ارز دیجیتال', - 'manual' => 'پرداخت دستی', - 'status' => [ - 'wait' => 'در انتظار پرداخت', - ], + 'developing' => 'در حال توسعه! منتظر بمانید', + 'download' => 'دانلود', + 'edit' => 'ویرایش', + 'error' => 'خطا', + 'error_action_item' => 'خطای:action:attribute', + 'error_item' => 'خطای :attribute', + 'exists_error' => 'حساب‌های مرتبطی تحت :attribute وجود دارد. لطفاً ابتدا ارتباطات را لغو کنید!', + 'expired_at' => 'تاریخ انقضا', + 'export' => 'صادر کردن', + 'failed' => 'ناموفق', + 'failed_action_item' => ':action :attribute ناموفق بود', + 'failed_item' => ':attribute ناموفق بود', + 'free' => 'رایگان', + 'function' => [ + 'fullscreen' => 'تمام صفحه', + 'menubar' => 'نوار منو', + 'navigation' => 'ناوبری', ], + 'generate' => 'تولید', + 'generate_item' => 'تولید :attribute', + 'goto' => 'برو به', + 'hour' => '{1} ساعت|{2} ساعت', + 'import' => 'وارد کردن', + 'latest_at' => 'آخرین فعالیت', + 'more' => 'بیشتر', + 'new' => 'جدید', + 'none' => 'هیچ', + 'open' => 'باز کردن', + 'or' => 'یا', 'order' => [ 'status' => [ 'canceled' => 'لغو شده', 'completed' => 'تکمیل شده', - 'prepaid' => 'پیش‌پرداخت', 'ongoing' => 'در حال استفاده', + 'prepaid' => 'پیش‌پرداخت', 'review' => 'در انتظار بررسی', ], ], + 'payment' => [ + 'alipay' => 'علی‌پی', + 'credit' => 'اعتبار', + 'crypto' => 'ارز دیجیتال', + 'manual' => 'پرداخت دستی', + 'qq' => 'کیف پول QQ', + 'wechat' => 'پرداخت وی‌چت', + ], + 'print' => 'چاپ', + 'qrcode' => 'کد QR :attribute', + 'random_generate' => 'خالی بگذارید تا به صورت تصادفی تولید شود', 'recommend' => 'توصیه', - 'advance' => 'پیشرفته', - 'action' => 'عملیات', + 'request' => 'درخواست', + 'request_failed' => 'درخواست ناموفق بود، لطفاً دوباره تلاش کنید', + 'request_url' => 'آدرس درخواست', + 'reset' => 'بازنشانی', 'search' => 'جستجو', - 'edit' => 'ویرایش', - 'delete' => 'حذف', + 'send' => 'ارسال', + 'sorry' => 'متأسفیم', 'status' => [ + 'applying' => 'در حال درخواست', 'attribute' => 'وضعیت', - 'inactive' => 'غیرفعال', - 'disabled' => 'غیرفعال', + 'available' => 'در دسترس', 'banned' => 'ممنوع', - 'normal' => 'عادی', + 'closed' => 'بسته شده', + 'disabled' => 'غیرفعال', 'enabled' => 'فعال', 'expire' => 'منقضی شده', + 'inactive' => 'غیرفعال', 'limited' => 'محدود', - 'run_out' => 'تمام شده', - 'unused' => 'استفاده نشده', - 'used' => 'استفاده شده', - 'closed' => 'بسته شده', - 'applying' => 'در حال درخواست', - 'withdrawn' => 'برداشت شده', - 'unwithdrawn' => 'برداشت نشده', - 'reply' => 'پاسخ داده شده', + 'normal' => 'عادی', + 'paid' => 'پرداخت شده', + 'pass' => 'قبول', + 'payment_pending' => 'در انتظار پرداخت', 'pending' => 'در انتظار', - 'unknown' => 'ناشناخته', - 'available' => 'در دسترس', + 'pending_dispatch' => 'در انتظار تحویل', 'reject' => 'رد', 'rejected' => 'رد شده', + 'reply' => 'پاسخ داده شده', 'review' => 'در انتظار بررسی', 'reviewed' => 'بررسی شده', - 'paid' => 'پرداخت شده', - 'payment_pending' => 'در انتظار پرداخت', - 'pass' => 'قبول', + 'run_out' => 'تمام شده', 'send_to_credit' => 'اضافه به اعتبار', - 'waiting_tobe_send' => 'در انتظار ارسال', + 'unknown' => 'ناشناخته', + 'unused' => 'استفاده نشده', + 'used' => 'استفاده شده', + 'withdrawal_pending' => 'برداشت نشده', + 'withdrawn' => 'برداشت شده', ], 'stay_unchanged' => 'خالی بگذارید تا تغییر نکند', - 'random_generate' => 'خالی بگذارید تا به صورت تصادفی تولید شود', - 'request_failed' => 'درخواست ناموفق بود، لطفاً دوباره تلاش کنید', - 'convert' => 'تبدیل', - 'import' => 'وارد کردن', - 'or' => 'یا', - 'more' => 'بیشتر', + 'storage_logo' => 'ذخیره‌سازی لوگو', + 'store' => 'ذخیره‌سازی', + 'submit' => 'ارسال', + 'success' => 'موفقیت', + 'success_action_item' => ':action :attribute با موفقیت', + 'success_item' => ':attribute موفق شد', 'to' => 'به', 'to_be_send' => 'در انتظار ارسال', - 'developing' => 'در حال توسعه! منتظر بمانید', + 'to_safari' => 'روی آیکون در بالای سمت راست کلیک کنید، سپس انتخاب کنید "باز کردن در Safari Safari" تا به درستی به سایت ما دسترسی پیدا کنید!', + 'toggle' => 'تغییر وضعیت', + 'toggle_action' => 'تغییر وضعیت :action', + 'unlimited' => 'نامحدود', + 'update' => 'بروزرسانی', + 'updated_at' => 'آخرین بروزرسانی', + 'view' => 'مشاهده', + 'warning' => 'هشدار', ]; diff --git a/resources/lang/fa/errors.php b/resources/lang/fa/errors.php index 0ef3591a..102a05bb 100644 --- a/resources/lang/fa/errors.php +++ b/resources/lang/fa/errors.php @@ -8,29 +8,29 @@ return [ 'bots' => 'دسترسی ربات شناسایی شد، دسترسی ممنوع', 'china' => 'دسترسی IP یا پروکسی چین شناسایی شد، دسترسی ممنوع', 'oversea' => 'دسترسی IP یا پروکسی خارج از کشور شناسایی شد، دسترسی ممنوع', - 'unknown' => 'حالت دسترسی ممنوع ناشناخته! لطفاً [حالت مسدودسازی] را در تنظیمات سیستم تغییر دهید!', 'redirect' => '(:ip :url) از طریق پیوند اشتراک دسترسی شناسایی شد، تغییر مسیر اجباری.', + 'unknown' => 'حالت دسترسی ممنوع ناشناخته! لطفاً [حالت مسدودسازی] را در تنظیمات سیستم تغییر دهید!', ], + 'get_ip' => 'دریافت اطلاعات IP ناموفق بود', 'log' => 'لاگ', 'refresh' => 'تازه‌سازی', 'refresh_page' => 'لطفاً صفحه را تازه‌سازی کنید و دوباره تلاش کنید', 'report' => 'خطا حاوی گزارشی بود: ', - 'safe_enter' => 'ورود امن', 'safe_code' => 'لطفاً کد ایمنی را وارد کنید', + 'safe_enter' => 'ورود امن', + 'subscribe' => [ + 'banned_until' => 'حساب تا :time ممنوع شده، لطفاً برای باز شدن صبر کنید!', + 'expired' => 'حساب منقضی شده! لطفاً اشتراک خود را تمدید کنید!', + 'none' => 'هیچ گره‌ای در دسترس نیست', + 'out' => 'داده تمام شده! لطفاً بیشتر خریداری کنید یا داده را بازنشانی کنید!', + 'question' => 'مشکلات حساب؟! برای جزئیات به وب‌سایت مراجعه کنید', + 'sub_banned' => 'اشتراک ممنوع شده! برای جزئیات به وب‌سایت مراجعه کنید', + 'unknown' => 'لینک اشتراک نامعتبر است! لطفاً لینک جدیدی دریافت کنید!', + 'user' => 'URL نامعتبر است، حساب وجود ندارد!', + 'user_disabled' => 'حساب غیرفعال شده است! با پشتیبانی تماس بگیرید!', + ], 'title' => '⚠️ خطا رخ داد', 'unsafe_enter' => 'ورود ناامن', 'visit' => 'لطفاً مراجعه کنید به', 'whoops' => 'اوپس!', - 'get_ip' => 'دریافت اطلاعات IP ناموفق بود', - 'subscribe' => [ - 'unknown' => 'لینک اشتراک نامعتبر است! لطفاً لینک جدیدی دریافت کنید!', - 'sub_banned' => 'اشتراک ممنوع شده! برای جزئیات به وب‌سایت مراجعه کنید', - 'user' => 'URL نامعتبر است، حساب وجود ندارد!', - 'user_disabled' => 'حساب غیرفعال شده است! با پشتیبانی تماس بگیرید!', - 'banned_until' => 'حساب تا :time ممنوع شده، لطفاً برای باز شدن صبر کنید!', - 'out' => 'داده تمام شده! لطفاً بیشتر خریداری کنید یا داده را بازنشانی کنید!', - 'expired' => 'حساب منقضی شده! لطفاً اشتراک خود را تمدید کنید!', - 'question' => 'مشکلات حساب؟! برای جزئیات به وب‌سایت مراجعه کنید', - 'none' => 'هیچ گره‌ای در دسترس نیست', - ], ]; diff --git a/resources/lang/fa/model.php b/resources/lang/fa/model.php index 460a404d..c94eaf7e 100644 --- a/resources/lang/fa/model.php +++ b/resources/lang/fa/model.php @@ -3,105 +3,114 @@ declare(strict_types=1); return [ - 'user' => [ - 'id' => 'شناسه کاربر', - 'attribute' => 'کاربر', - 'nickname' => 'نام مستعار', - 'username' => 'نام کاربری', - 'password' => 'رمز عبور', - 'credit' => 'اعتبار', - 'invite_num' => 'تعداد دعوت‌های موجود', - 'reset_date' => 'تاریخ بازنشانی داده', - 'port' => 'پورت', - 'traffic_used' => 'داده استفاده شده', - 'service' => 'پروکسی', - 'group' => 'گروه', - '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' => 'تاریخ ثبت‌نام', + 'aff' => [ + 'amount' => 'مقدار سفارش', + 'commission' => 'کمیسیون', + 'created_at' => 'سفارش شده در', + 'invitee' => 'خریدار', + 'updated_at' => 'پردازش شده در', + ], + 'article' => [ + 'attribute' => 'مقاله', + 'category' => 'دسته‌بندی', + 'created_at' => 'منتشر شده در', + 'language' => 'زبان', + 'logo' => 'کاور', + 'updated_at' => 'بروزرسانی شده در', ], 'common' => [ - 'extend' => 'اطلاعات گسترش یافته', - 'sort' => 'مرتب‌سازی', 'description' => 'توضیحات', - 'type' => 'نوع', + 'extend' => 'اطلاعات گسترش یافته', 'level' => 'سطح', + 'sort' => 'مرتب‌سازی', + 'type' => 'نوع', ], 'country' => [ 'code' => 'کد کشور', 'icon' => 'پرچم', 'name' => 'نام کشور', ], - 'subscribe' => [ - 'code' => 'کد اشتراک', - 'req_times' => 'تعداد درخواست‌ها', - 'updated_at' => 'آخرین درخواست', - 'ban_time' => 'زمان ممنوعیت', - 'ban_desc' => 'دلیل ممنوعیت', - 'req_ip' => 'IP درخواست', - 'req_header' => 'هدر دسترسی', + 'coupon' => [ + 'attribute' => 'کوپن', + 'groups' => 'محدودیت گروه', + 'levels' => 'محدودیت سطح', + 'logo' => 'لوگو', + 'minimum' => 'حداقل هزینه', + 'name' => 'نام', + 'newbie' => 'فقط برای کاربران جدید', + 'num' => 'تعداد', + 'priority' => 'اولویت', + 'services_blacklist' => 'کالاهای ممنوع', + 'services_whitelist' => 'کالاهای مجاز', + 'sn' => 'کد', + 'usable_times' => 'تعداد استفاده', + 'used' => 'محدودیت شخصی', + 'users_blacklist' => 'کاربران ممنوع', + 'users_whitelist' => 'کاربران مجاز', + 'value' => 'مقدار', ], - 'oauth' => [ - 'type' => 'کانال', - 'identifier' => 'شناسه', + 'goods' => [ + 'attribute' => 'کالا', + 'available_date' => 'دوره اعتبار', + 'category' => 'دسته‌بندی', + 'color' => 'رنگ', + 'hot' => 'پرفروش', + 'info' => 'اطلاعات سفارشی', + 'invite_num' => 'دعوت‌نامه‌های اضافی', + 'limit_num' => 'محدودیت خرید', + 'logo' => 'لوگو', + 'name' => 'نام', + 'period' => 'دوره بازنشانی', + 'price' => 'قیمت', + 'renew' => 'قیمت بازنشانی داده', + 'traffic' => 'مقدار داده مجاز', + 'user_limit' => 'محدودیت سرعت کاربر', ], - 'user_group' => [ - 'attribute' => 'گروه کاربری', - 'name' => 'نام گروه', - 'nodes' => 'گره‌ها', + 'ip' => [ + 'info' => 'مکان', + 'network_type' => 'نوع شبکه', ], 'node' => [ 'attribute' => 'گره', - 'id' => 'شناسه گره', - 'name' => 'نام', - 'domain' => 'دامنه', - 'static' => 'وضعیت زنده بودن', - 'online_user' => 'کاربران آنلاین', + 'client_limit' => 'محدودیت کاربر', + 'country' => 'کشور', 'data_consume' => 'مصرف داده', 'data_rate' => 'نسبت داده', 'ddns' => 'DDNS', + 'detection' => 'تشخیص مسدود شدن', + 'display' => 'نمایش و اشتراک', + 'domain' => 'دامنه', + 'id' => 'شناسه گره', 'ipv4' => 'IPv4', 'ipv6' => 'IPv6', - 'push_port' => 'پورت ارسال', - 'rule_group' => 'گروه قوانین', - 'traffic_limit' => 'محدودیت سرعت', - 'client_limit' => 'محدودیت کاربر', 'label' => 'برچسب', - 'country' => 'کشور', - 'udp' => 'UDP', - 'display' => 'نمایش و اشتراک', - 'detection' => 'تشخیص مسدود شدن', 'method' => 'رمزنگاری', - 'protocol' => 'پروتکل', - 'protocol_param' => 'پارامتر پروتکل', + 'name' => 'نام', + 'next_renewal_date' => 'تاریخ تمدید بعدی', 'obfs' => 'پنهان‌سازی', 'obfs_param' => 'پارامتر پنهان‌سازی', - 'single' => 'پورت تکی', - 'transfer' => 'رله', + 'online_user' => 'کاربران آنلاین', + 'protocol' => 'پروتکل', + 'protocol_param' => 'پارامتر پروتکل', + 'push_port' => 'پورت ارسال', + 'relay_port' => 'پورت رله', + 'renewal_cost' => 'مبلغ صورتحساب', 'service_port' => 'پورت سرویس', + 'single' => 'پورت تکی', 'single_passwd' => '[تکی] رمز عبور', + 'static' => 'وضعیت زنده بودن', + 'subscription_term' => 'مدت اشتراک', + 'traffic_limit' => 'محدودیت سرعت', + 'transfer' => 'رله', + 'udp' => 'UDP', 'v2_alter_id' => 'شناسه جایگزین', - 'v2_net' => 'شبکه', 'v2_cover' => 'پوشش', 'v2_host' => 'میزبان', + 'v2_net' => 'شبکه', 'v2_path' => 'مسیر | کلید', 'v2_sni' => 'SNI', 'v2_tls' => 'TLS', 'v2_tls_provider' => 'پیکربندی TLS', - 'relay_port' => 'پورت رله', ], 'node_auth' => [ 'attribute' => 'احراز هویت گره', @@ -111,36 +120,44 @@ return [ 'node_cert' => [ 'attribute' => 'گواهینامه دامنه', 'domain' => 'دامنه', + 'expired_date' => 'تاریخ انقضا', + 'issuer' => 'صادر کننده', 'key' => 'کلید', 'pem' => 'PEM', - 'issuer' => 'صادر کننده', 'signed_date' => 'تاریخ امضا', - 'expired_date' => 'تاریخ انقضا', + ], + 'notification' => [ + 'address' => 'گیرنده', + 'created_at' => 'ارسال شده در', + 'status' => 'وضعیت', + ], + 'oauth' => [ + 'identifier' => 'شناسه', + 'type' => 'کانال', ], 'order' => [ 'attribute' => 'سفارش', 'id' => 'شناسه سفارش', 'original_price' => 'قیمت اولیه', - 'price' => 'قیمت واقعی', 'pay_way' => 'روش پرداخت', + 'price' => 'قیمت واقعی', 'status' => 'وضعیت', ], - 'goods' => [ - 'attribute' => 'کالا', + 'permission' => [ + 'attribute' => 'مجوز', + 'description' => 'توضیحات', + 'name' => 'نام مسیر', + ], + 'referral' => [ + 'amount' => 'مقدار', + 'created_at' => 'درخواست شده در', + 'id' => 'شناسه درخواست', + 'user' => 'درخواست کننده', + ], + 'role' => [ + 'attribute' => 'نقش', 'name' => 'نام', - 'price' => 'قیمت', - 'category' => 'دسته‌بندی', - 'renew' => 'قیمت بازنشانی داده', - 'user_limit' => 'محدودیت سرعت کاربر', - 'period' => 'دوره بازنشانی', - 'traffic' => 'مقدار داده مجاز', - 'invite_num' => 'دعوت‌نامه‌های اضافی', - 'limit_num' => 'محدودیت خرید', - 'available_date' => 'دوره اعتبار', - 'hot' => 'پرفروش', - 'color' => 'رنگ', - 'logo' => 'لوگو', - 'info' => 'اطلاعات سفارشی', + 'permissions' => 'مجوزها', ], 'rule' => [ 'attribute' => 'قانون', @@ -150,83 +167,67 @@ return [ 'rule_group' => [ 'attribute' => 'گروه قوانین', 'name' => 'نام', - 'type' => 'نوع', 'rules' => 'قوانین', + 'type' => 'نوع', ], - 'role' => [ - 'attribute' => 'نقش', - 'name' => 'نام', - 'permissions' => 'مجوزها', + 'subscribe' => [ + 'ban_desc' => 'دلیل ممنوعیت', + 'ban_time' => 'زمان ممنوعیت', + 'code' => 'کد اشتراک', + 'req_header' => 'هدر دسترسی', + 'req_ip' => 'IP درخواست', + 'req_times' => 'تعداد درخواست‌ها', + 'updated_at' => 'آخرین درخواست', ], - 'permission' => [ - 'attribute' => 'مجوز', - 'description' => 'توضیحات', - 'name' => 'نام مسیر', - ], - 'article' => [ - 'attribute' => 'مقاله', - 'category' => 'دسته‌بندی', - 'language' => 'زبان', - 'logo' => 'کاور', - 'created_at' => 'منتشر شده در', - 'updated_at' => 'بروزرسانی شده در', - ], - 'coupon' => [ - 'attribute' => 'کوپن', - 'name' => 'نام', - 'sn' => 'کد', - 'logo' => 'لوگو', - 'value' => 'مقدار', - 'priority' => 'اولویت', - 'usable_times' => 'تعداد استفاده', - 'minimum' => 'حداقل هزینه', - 'used' => 'محدودیت شخصی', - 'levels' => 'محدودیت سطح', - 'groups' => 'محدودیت گروه', - 'users_whitelist' => 'کاربران مجاز', - 'users_blacklist' => 'کاربران ممنوع', - 'services_whitelist' => 'کالاهای مجاز', - 'services_blacklist' => 'کالاهای ممنوع', - 'newbie' => 'فقط برای کاربران جدید', - 'num' => 'تعداد', - ], - 'aff' => [ - 'invitee' => 'خریدار', - 'amount' => 'مقدار سفارش', - 'commission' => 'کمیسیون', - 'updated_at' => 'پردازش شده در', - 'created_at' => 'سفارش شده در', - ], - 'referral' => [ - 'created_at' => 'درخواست شده در', - 'user' => 'درخواست کننده', - 'amount' => 'مقدار', - 'id' => 'شناسه درخواست', - ], - 'notification' => [ - 'address' => 'گیرنده', - 'created_at' => 'ارسال شده در', - 'status' => 'وضعیت', - ], - 'ip' => [ - 'network_type' => 'نوع شبکه', - 'info' => 'مکان', - ], - 'user_traffic' => [ - 'upload' => 'آپلود', - 'download' => 'دانلود', - 'total' => 'کل', - 'log_time' => 'زمان ثبت', - ], - 'user_data_modify' => [ - 'before' => 'قبل از تغییر', - 'after' => 'بعد از تغییر', - 'created_at' => 'زمان تغییر', + 'user' => [ + 'account_status' => 'وضعیت حساب', + 'attribute' => 'کاربر', + 'created_date' => 'تاریخ ثبت‌نام', + 'credit' => 'اعتبار', + 'expired_date' => 'تاریخ انقضا', + 'id' => 'شناسه کاربر', + 'invite_num' => 'تعداد دعوت‌های موجود', + 'inviter' => 'دعوت‌کننده', + 'nickname' => 'نام مستعار', + 'password' => 'رمز عبور', + 'port' => 'پورت', + 'proxy_method' => 'رمزنگاری', + 'proxy_obfs' => 'پنهان‌سازی', + 'proxy_passwd' => 'رمز پروکسی', + 'proxy_protocol' => 'پروتکل', + 'proxy_status' => 'وضعیت پروکسی', + 'qq' => 'QQ', + 'remark' => 'یادداشت', + 'reset_date' => 'تاریخ بازنشانی داده', + 'role' => 'نقش', + 'service' => 'پروکسی', + 'speed_limit' => 'محدودیت سرعت', + 'traffic_used' => 'داده استفاده شده', + 'usable_traffic' => 'مقدار داده مجاز', + 'username' => 'نام کاربری', + 'uuid' => 'VMess UUID', + 'wechat' => 'وی‌چت', ], 'user_credit' => [ - 'before' => 'قبل از تغییر', 'after' => 'بعد از تغییر', 'amount' => 'مقدار تغییر', + 'before' => 'قبل از تغییر', 'created_at' => 'زمان تغییر', ], + 'user_data_modify' => [ + 'after' => 'بعد از تغییر', + 'before' => 'قبل از تغییر', + 'created_at' => 'زمان تغییر', + ], + 'user_group' => [ + 'attribute' => 'گروه کاربری', + 'name' => 'نام گروه', + 'nodes' => 'گره‌ها', + ], + 'user_traffic' => [ + 'download' => 'دانلود', + 'log_time' => 'زمان ثبت', + 'total' => 'کل', + 'upload' => 'آپلود', + ], ]; diff --git a/resources/lang/fa/notification.php b/resources/lang/fa/notification.php index e13ec246..ec8c4e76 100644 --- a/resources/lang/fa/notification.php +++ b/resources/lang/fa/notification.php @@ -3,35 +3,49 @@ declare(strict_types=1); return [ - 'attribute' => 'اعلان', - 'new' => 'شما :num پیام جدید دارید', - 'empty' => 'شما در حال حاضر هیچ پیام جدیدی ندارید', - 'payment_received' => 'پرداخت سفارش شما با مبلغ :amount با موفقیت انجام شد، لطفاً برای مشاهده جزئیات سفارش کلیک کنید', 'account_expired' => 'یادآوری انقضای حساب', - 'account_expired_content' => 'حساب شما در :days روز آینده منقضی خواهد شد، لطفاً برای جلوگیری از هرگونه مشکل در استفاده به موقع تمدید کنید', 'account_expired_blade' => 'حساب شما در :days روز آینده منقضی خواهد شد، لطفاً به موقع تمدید کنید', + 'account_expired_content' => 'حساب شما در :days روز آینده منقضی خواهد شد، لطفاً برای جلوگیری از هرگونه مشکل در استفاده به موقع تمدید کنید', 'active_email' => 'لطفاً در عرض 30 دقیقه تأیید را تکمیل کنید', + 'attribute' => 'اعلان', + 'block_report' => 'گزارش مسدود شدن:', 'close_ticket' => 'تیکت شماره :id با عنوان :title بسته شده است', - 'view_web' => 'بازدید از وب‌سایت ما', - 'view_ticket' => 'مشاهده وضعیت این تیکت', + 'data_anomaly' => 'هشدار کاربر با داده غیرعادی', + 'data_anomaly_content' => 'کاربر :id: [آپلود: :upload | دانلود: :download | مجموع: :total] در ساعت گذشته', + 'details' => 'مشاهده جزئیات', + 'details_btn' => 'لطفاً روی دکمه زیر کلیک کنید تا جزئیات را مشاهده کنید.', + 'ding_bot_limit' => 'هر ربات می‌تواند حداکثر 20 پیام در دقیقه به گروه ارسال کند. اگر این حد تجاوز شود، محدودیت برای 10 دقیقه اعمال می‌شود.', + 'empty' => 'شما در حال حاضر هیچ پیام جدیدی ندارید', + 'error' => '[:channel] ارسال پیام با استثنا: :reason', + 'get_access_token_failed' => 'دریافت توکن دسترسی با شکست مواجه شد!\nبا پارامترهای درخواست: :body', + 'into_maintenance' => 'به‌طور خودکار وارد حالت نگهداری شوید', + 'new' => 'شما :num پیام جدید دارید', 'new_ticket' => 'تیکت جدید شما با عنوان :title دریافت شد، لطفاً برای مشاهده مراجعه کنید', - 'reply_ticket' => 'پاسخ تیکت: :title', - 'ticket_content' => 'محتوای تیکت:', + 'next_check_time' => 'زمان بعدی بررسی انسداد گره: :time', + 'node' => [ + 'download' => 'دانلود', + 'total' => 'مجموع', + 'upload' => 'آپلود', + ], 'node_block' => 'هشدار مسدود شدن گره', 'node_offline' => 'هشدار آفلاین بودن گره', 'node_offline_content' => 'گره‌های زیر غیرعادی هستند و ممکن است آفلاین باشند:', - 'block_report' => 'گزارش مسدود شدن:', - 'traffic_warning' => 'هشدار استفاده از داده', + 'node_renewal' => 'یادآوری تمدید گره', + 'node_renewal_blade' => 'گره‌های زیر در حال نزدیک شدن به تاریخ انقضا هستند. لطفاً به‌موقع تمدید کنید: :nodes', + 'node_renewal_content' => 'گره‌های زیر در حال نزدیک شدن به تاریخ انقضا هستند. لطفاً قبل از انقضا تمدید کنید تا از قطع خدمات جلوگیری شود.', + 'payment_received' => 'پرداخت سفارش شما با مبلغ :amount با موفقیت انجام شد، لطفاً برای مشاهده جزئیات سفارش کلیک کنید', + 'reply_ticket' => 'پاسخ تیکت: :title', + 'reset_failed' => '[وظیفه روزانه] کاربر :uid - :username بازنشانی داده‌ها ناموفق بود', + 'serverChan_exhausted' => 'حد مجاز امروز به پایان رسید!', + 'serverChan_limit' => 'فرکانس در هر دقیقه بیش از حد بالا است. لطفاً تنظیمات اعلان را بهینه کنید!', + 'sign_failed' => 'تأیید امضای امنیتی ناموفق بود', + 'ticket_content' => 'محتوای تیکت:', 'traffic_remain' => 'شما :percent% از داده خود را استفاده کرده‌اید، لطفاً توجه کنید', 'traffic_tips' => 'لطفاً به تاریخ بازنشانی داده توجه کنید و داده‌ها را به صورت منطقی استفاده کنید یا پس از اتمام، مجدداً شارژ کنید', - 'verification_account' => 'تأیید حساب', + 'traffic_warning' => 'هشدار استفاده از داده', 'verification' => 'کد تأیید شما:', + 'verification_account' => 'تأیید حساب', 'verification_limit' => 'لطفاً در عرض :minutes دقیقه تأیید را تکمیل کنید', - 'data_anomaly' => 'هشدار کاربر با داده غیرعادی', - 'data_anomaly_content' => 'کاربر :id: [آپلود: :upload | دانلود: :download | مجموع: :total] در ساعت گذشته', - 'node' => [ - 'upload' => 'آپلود', - 'download' => 'دانلود', - 'total' => 'مجموع', - ], + 'view_ticket' => 'مشاهده وضعیت این تیکت', + 'view_web' => 'بازدید از وب‌سایت ما', ]; diff --git a/resources/lang/fa/setup.php b/resources/lang/fa/setup.php new file mode 100644 index 00000000..a407e540 --- /dev/null +++ b/resources/lang/fa/setup.php @@ -0,0 +1,10 @@ + 'شناسایی شد که شما در حالت دمو هستید. آیا می‌خواهید پایگاه داده را بازنشانی کنید؟', + 'update_cache' => 'به‌روزرسانی کش...', + 'update_complete' => 'به‌روزرسانی کامل شد!', + 'update_db' => 'به‌روزرسانی پایگاه داده...', +]; diff --git a/resources/lang/fa/user.php b/resources/lang/fa/user.php index eb005986..9ab3f3cc 100644 --- a/resources/lang/fa/user.php +++ b/resources/lang/fa/user.php @@ -4,234 +4,273 @@ declare(strict_types=1); return [ 'account' => [ - 'credit' => 'موجودی حساب', - 'status' => 'وضعیت حساب', - 'level' => 'سطح حساب', - 'group' => 'گروه', - 'speed_limit' => 'محدودیت سرعت', - 'remain' => 'داده باقیمانده', - 'time' => 'مدت طرح', - 'last_login' => 'آخرین ورود', - 'reset' => '{0} داده در :days بازنشانی می‌شود |{1} :days روز تا بازنشانی داده باقی مانده است |[2,*] :days روز تا بازنشانی داده باقی مانده است', 'connect_password' => 'رمز اتصال پروکسی', + 'credit' => 'موجودی حساب', + 'group' => 'گروه', + 'last_login' => 'آخرین ورود', + 'level' => 'سطح حساب', 'reason' => [ - 'normal' => 'حساب عادی است', 'expired' => 'طرح شما منقضی شده است', + 'normal' => 'حساب عادی است', 'overused' => 'شما از حد :data گیگابایت برای این دوره فراتر رفته‌اید
    محدودیت در :min دقیقه برداشته می‌شود', 'traffic_exhausted' => 'داده تمام شده است', 'unknown' => 'دلیل ناشناخته، لطفاً مرورگر را تازه‌سازی کنید! اگر مشکل ادامه داشت، با پشتیبانی تماس بگیرید.', ], + 'remain' => 'داده باقیمانده', + 'reset' => '{0} داده در :days بازنشانی می‌شود |{1} :days روز تا بازنشانی داده باقی مانده است |[2,*] :days روز تا بازنشانی داده باقی مانده است', + 'speed_limit' => 'محدودیت سرعت', + 'status' => 'وضعیت حساب', + 'time' => 'مدت طرح', ], + 'attribute' => [ + 'address' => 'مکان', + 'data' => 'داده', + 'ip' => 'آدرس IP', + 'isp' => 'ISP', + 'node' => 'گره', + ], + 'bought_at' => 'تاریخ خرید', + 'clients' => 'کلاینت‌ها', + 'contact' => 'تماس', + 'coupon' => [ + 'discount' => 'تخفیف', + 'error' => [ + 'expired' => 'کوپن منقضی شده', + 'inactive' => 'کوپن فعال نیست', + 'minimum' => 'حداقل مبلغ :amount است', + 'overused' => 'فقط می‌توان :times بار استفاده کرد', + 'run_out' => 'کوپن تمام شده', + 'services' => 'کالاها واجد شرایط تخفیف نیستند، شرایط تبلیغ را بررسی کنید', + 'unknown' => 'کوپن نامعتبر', + 'unmet' => 'شرایط استفاده رعایت نشده', + 'used' => 'کوپن قبلاً استفاده شده', + 'users' => 'حساب واجد شرایط برای تبلیغ نیست', + 'wait' => 'در :time فعال خواهد شد، لطفاً صبر کنید!', + ], + 'input' => 'کد کوپن را وارد کنید', + ], + 'current_role' => 'نقش فعلی به عنوان', + 'error_response' => 'خطایی رخ داده است، لطفاً بعداً دوباره امتحان کنید.', 'home' => [ + 'announcement' => 'اعلانات', 'attendance' => [ 'attribute' => 'ثبت حضور', 'disable' => 'ثبت حضور غیرفعال است', 'done' => 'شما قبلاً ثبت حضور کرده‌اید. فردا برگردید!', - 'success' => 'شما :data داده دریافت کردید', 'failed' => 'خطای سیستم', + 'success' => 'شما :data داده دریافت کردید', ], - 'traffic_logs' => 'سوابق داده', - 'announcement' => 'اعلانات', - 'wechat_push' => 'اعلانات وی‌چت', 'chat_group' => 'گروه چت', 'empty_announcement' => 'هیچ اعلانی وجود ندارد', + 'traffic_logs' => 'سوابق داده', + 'wechat_push' => 'اعلانات وی‌چت', ], - 'purchase_to_unlock' => 'خرید برای باز کردن', - 'purchase_required' => 'این ویژگی برای کاربران غیرپرداختی غیرفعال است. لطفاً', - 'attribute' => [ - 'node' => 'گره', - 'data' => 'داده', - 'ip' => 'آدرس IP', - 'isp' => 'ISP', - 'address' => 'مکان', + 'invite' => [ + 'attribute' => 'کد دعوت', + 'counts' => 'مجموع :num کد دعوت', + 'generate_failed' => 'تولید ناموفق: سهمیه تمام شده', + 'logs' => 'سوابق دعوت', + 'promotion' => 'هم شما و هم دعوت‌شونده :traffic داده دریافت خواهید کرد وقتی که با کد شما ثبت نام کنند؛ شما :referral_percent% کمیسیون دریافت خواهید کرد وقتی که آنها خرید کنند.', + 'tips' => ':num دعوت باقی مانده، کدها :days روز پس از ایجاد منقضی می‌شوند', + ], + 'invitee' => 'دعوت‌شونده', + 'inviter' => 'دعوت‌کننده', + 'invoice' => [ + 'active_prepaid_question' => 'فعال سازی بسته پیش پرداخت زودتر؟', + 'active_prepaid_tips' => 'پس از فعال‌سازی:
    طرح فعلی شما بلافاصله منقضی می‌شود
    تاریخ انقضای طرح جدید از امروز محاسبه می‌شود', + 'amount' => 'مقدار', + 'attribute' => 'سفارش', + 'detail' => 'جزئیات سفارش', + ], + 'knowledge' => [ + 'basic' => 'پایه', + 'title' => 'پایگاه دانش', ], - 'purchase_promotion' => 'همین حالا خدمات را خریداری کنید!', 'menu' => [ + 'admin_dashboard' => 'داشبورد', 'help' => 'کمک', 'home' => 'خانه', 'invites' => 'دعوت', 'invoices' => 'فاکتور', 'nodes' => 'گره‌ها', + 'profile' => 'پروفایل', 'promotion' => 'ارجاع', 'shop' => 'فروشگاه', - 'profile' => 'پروفایل', 'tickets' => 'تیکت‌ها', - 'admin_dashboard' => 'داشبورد', ], - 'contact' => 'تماس', + 'node' => [ + 'info' => 'اطلاعات پیکربندی', + 'rate' => ':ratio برابر مصرف داده', + 'setting' => 'تنظیمات پروکسی', + 'unstable' => 'ناپایدار/در حال نگهداری', + ], 'oauth' => [ + 'bind' => 'اتصال', 'bind_title' => 'اتصال حساب اجتماعی', 'not_bind' => 'متصل نشده', - 'bind' => 'اتصال', 'rebind' => 'اتصال مجدد', 'unbind' => 'لغو اتصال', ], - 'coupon' => [ - 'discount' => 'تخفیف', - 'error' => [ - 'unknown' => 'کوپن نامعتبر', - 'used' => 'کوپن قبلاً استفاده شده', - 'expired' => 'کوپن منقضی شده', - 'run_out' => 'کوپن تمام شده', - 'inactive' => 'کوپن فعال نیست', - 'wait' => 'در :time فعال خواهد شد، لطفاً صبر کنید!', - 'unmet' => 'شرایط استفاده رعایت نشده', - 'minimum' => 'حداقل مبلغ :amount است', - 'overused' => 'فقط می‌توان :times بار استفاده کرد', - 'users' => 'حساب واجد شرایط برای تبلیغ نیست', - 'services' => 'کالاها واجد شرایط تخفیف نیستند، شرایط تبلیغ را بررسی کنید', + 'pay' => 'پرداخت', + 'payment' => [ + 'close_tips' => 'پرداخت را در عرض :minutes دقیقه کامل کنید، در غیر این صورت سفارش به‌طور خودکار بسته می‌شود', + 'creating' => 'در حال ایجاد پرداخت...', + 'error' => 'مبلغ شارژ نامعتبر', + 'insufficient_balance' => 'موجودی شما کافی نیست. لطفاً ابتدا اعتبار خود را شارژ کنید.', + 'manual' => [ + 'hint' => 'پس از اسکن کد QR برای پرداخت، لطفاً مراحل را دنبال کنید تا زمانی که بر روی "ارسال" کلیک کنید و پرداخت را تکمیل کنید.', + 'next' => 'بعدی', + 'payment_tips' => 'لطفاً مبلغ دقیق را پرداخت کنید (بازپرداخت برای پرداخت اضافی وجود ندارد، برای پرداخت کمتر باید شارژ کنید)', + 'pre' => 'قبلی', + 'red_packet' => 'بسته قرمز Alipay', + 'steps' => [ + 'complete' => [ + 'description' => 'در انتظار تأیید دستی پرداخت', + 'title' => 'تکمیل', + ], + 'notice' => [ + 'description' => 'چگونه به صورت دستی پرداخت کنیم', + 'title' => 'توجهات', + ], + 'payment' => [ + 'description' => 'دریافت کد QR و پرداخت', + 'title' => 'پرداخت', + ], + 'remark' => [ + 'description' => 'نام کاربری خود را برای تأیید دستی وارد کنید', + 'title' => 'یادداشت حساب', + ], + ], ], + 'method' => 'روش پرداخت', + 'mobile_tips' => 'کاربران موبایل: کد QR را فشار طولانی دهید -> تصویر را ذخیره کنید -> برنامه پرداخت را باز کنید -> تصویر را برای پرداخت اسکن کنید', + 'order_creation' => [ + 'failed' => 'ایجاد سفارش ناموفق بود. لطفاً روش پرداخت دیگری را امتحان کنید!', + 'info' => 'ما در مدت [24 ساعت] پرداخت/شارژ شما را فعال خواهیم کرد! لطفاً صبور باشید.', + 'order_limit' => 'این کالا محدود به :limit_num خرید است. شما تاکنون :count بار خرید کرده‌اید.', + 'order_timeout' => 'سفارش به دلیل عدم پرداخت به طور خودکار بسته شد.', + 'payment_disabled' => 'ایجاد سفارش ناموفق بود: قابلیت پرداخت آنلاین فعال نیست.', + 'pending_order' => 'ایجاد سفارش ناموفق بود: سفارشات پرداخت نشده وجود دارد. لطفاً ابتدا آن‌ها را تکمیل کنید.', + 'plan_required' => 'لطفاً قبل از خرید بسته شارژ، یک پلن خریداری کنید.', + 'price_issue' => 'ایجاد سفارش ناموفق بود: قیمت کل سفارش غیرعادی است', + 'price_zero' => 'ایجاد سفارش ناموفق بود: قیمت کل سفارش 0 است؛ نیازی به پرداخت آنلاین نیست.', + 'product_unavailable' => 'ایجاد سفارش ناموفق بود: کالا از فروش خارج شده است.', + 'success' => 'سفارش با موفقیت ایجاد شد!', + 'unknown_order' => 'سفارش نامشخص', + 'unknown_payment' => 'روش پرداخت ناشناخته', + ], + 'qrcode_tips' => 'لطفاً با :software اسکن کنید', + 'redirect_stripe' => 'انتقال به صفحه پرداخت Stripe', ], - 'error_response' => 'خطایی رخ داده است، لطفاً بعداً دوباره امتحان کنید.', - 'invite' => [ - 'attribute' => 'کد دعوت', - 'counts' => 'مجموع :num کد دعوت', - 'tips' => ':num دعوت باقی مانده، کدها :days روز پس از ایجاد منقضی می‌شوند', - 'logs' => 'سوابق دعوت', - 'promotion' => 'هم شما و هم دعوت‌شونده :traffic داده دریافت خواهید کرد وقتی که با کد شما ثبت نام کنند؛ شما :referral_percent% کمیسیون دریافت خواهید کرد وقتی که آنها خرید کنند.', - 'generate_failed' => 'تولید ناموفق: سهمیه تمام شده', + 'purchase' => [ + 'completed' => 'خرید با موفقیت انجام شد!', + 'promotion' => 'همین حالا خدمات را خریداری کنید!', + 'required' => 'این ویژگی برای کاربران غیرپرداختی غیرفعال است. لطفاً', + 'to_unlock' => 'خرید برای باز کردن قفل', ], + 'recharge' => 'شارژ', + 'recharge_credit' => 'شارژ اعتبار', + 'recharging' => 'در حال شارژ...', + 'referral' => [ + 'link' => 'لینک ارجاع', + 'logs' => 'سوابق کمیسیون', + 'msg' => [ + 'account' => 'حساب منقضی شده، لطفاً ابتدا یک طرح خریداری کنید', + 'applied' => 'درخواست موجود است، لطفاً منتظر پردازش باشید', + 'error' => 'خطا در ایجاد سفارش، بعداً دوباره امتحان کنید یا با پشتیبانی تماس بگیرید', + 'unfulfilled' => 'نیاز به :amount برای برداشت، ادامه بده!', + 'wait' => 'لطفاً منتظر تأیید مدیر باشید', + ], + 'total' => 'مجموع کمیسیون: :amount (:total بار)، می‌توانید پس از رسیدن به :money برداشت کنید', + ], + 'registered_at' => 'تاریخ ثبت‌نام', 'reset_data' => [ 'action' => 'بازنشانی داده', 'cost' => 'هزینه: :amount', 'cost_tips' => 'بازنشانی داده :amount کسر خواهد کرد!', - 'insufficient' => 'موجودی کافی نیست، لطفاً موجودی خود را شارژ کنید', - '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 را اسکن کنید', + 'service' => [ + 'country_count' => 'پوشش :num کشور یا منطقه', + 'node_count' => ':num گره با کیفیت بالا', + 'unlimited' => 'بدون محدودیت سرعت', + ], 'shop' => [ - 'hot' => 'داغ', - 'limited' => 'محدود', + 'buy' => 'خرید', + 'call4help' => 'اگر سوالی دارید با پشتیبانی تماس بگیرید', 'change_amount' => 'مبلغ شارژ', 'change_amount_help' => 'مبلغ شارژ را وارد کنید', - 'buy' => 'خرید', + 'conflict' => 'تضاد', + 'conflict_tips' => '

    خرید فعلی به عنوان طرح پیش پرداخت تنظیم خواهد شد

    1. طرح پیش پرداخت پس از انقضای طرح فعلی به طور خودکار فعال می‌شود
    2. شما می‌توانید پس از پرداخت آن را به صورت دستی فعال کنید
    ', 'description' => 'توضیحات', - 'service' => 'خدمات', + 'hot' => 'داغ', + 'limited' => 'محدود', 'pay_credit' => 'پرداخت با اعتبار', 'pay_online' => 'پرداخت آنلاین', 'price' => 'قیمت', 'quantity' => 'تعداد', + 'service' => 'خدمات', 'subtotal' => 'جمع کل', 'total' => 'مجموع', - 'conflict' => 'تضاد', - 'conflict_tips' => '

    خرید فعلی به عنوان طرح پیش پرداخت تنظیم خواهد شد

    1. طرح پیش پرداخت پس از انقضای طرح فعلی به طور خودکار فعال می‌شود
    2. شما می‌توانید پس از پرداخت آن را به صورت دستی فعال کنید
    ', - 'call4help' => 'اگر سوالی دارید با پشتیبانی تماس بگیرید', - ], - 'service' => [ - 'node_count' => ':num گره با کیفیت بالا', - 'country_count' => 'پوشش :num کشور یا منطقه', - 'unlimited' => 'بدون محدودیت سرعت', - ], - 'payment' => [ - 'error' => 'مبلغ شارژ نامعتبر', - 'creating' => 'در حال ایجاد پرداخت...', - 'redirect_stripe' => 'انتقال به صفحه پرداخت Stripe', - 'qrcode_tips' => 'لطفاً با :software اسکن کنید', - 'close_tips' => 'پرداخت را در عرض :minutes دقیقه کامل کنید، در غیر این صورت سفارش به‌طور خودکار بسته می‌شود', - 'mobile_tips' => 'کاربران موبایل: کد QR را فشار طولانی دهید -> تصویر را ذخیره کنید -> برنامه پرداخت را باز کنید -> تصویر را برای پرداخت اسکن کنید', - ], - 'invoice' => [ - 'attribute' => 'سفارش', - 'detail' => 'جزئیات سفارش', - 'amount' => 'مقدار', - 'active_prepaid_question' => 'فعال سازی بسته پیش پرداخت زودتر؟', - 'active_prepaid_tips' => 'پس از فعال‌سازی:
    طرح فعلی شما بلافاصله منقضی می‌شود
    تاریخ انقضای طرح جدید از امروز محاسبه می‌شود', - ], - 'node' => [ - 'info' => 'اطلاعات پیکربندی', - 'setting' => 'تنظیمات پروکسی', - 'unstable' => 'ناپایدار/در حال نگهداری', - 'rate' => ':ratio برابر مصرف داده', ], 'subscribe' => [ - 'link' => 'لینک اشتراک', - 'tips' => 'هشدار: این لینک فقط برای استفاده شخصی است. آن را به اشتراک نگذارید، در غیر این صورت حساب شما به دلیل استفاده غیرعادی مسدود می‌شود.', - 'exchange_warning' => 'تغییر لینک اشتراک باعث می‌شود:\n1. لینک فعلی بلافاصله لغو شود\n2. رمز اتصال تغییر کند', 'custom' => 'اشتراک سفارشی', + 'error' => 'خطا در تغییر لینک اشتراک', + 'exchange_warning' => 'تغییر لینک اشتراک باعث می‌شود:\n1. لینک فعلی بلافاصله لغو شود\n2. رمز اتصال تغییر کند', + 'info' => [ + 'download' => 'دانلود', + 'title' => 'خلاصه حساب [غیر زمان واقعی]', + 'total' => 'داده طرح', + 'upload' => 'آپلود', + ], + 'link' => 'لینک اشتراک', 'ss_only' => 'فقط اشتراک SS', 'ssr_only' => 'فقط اشتراک SSR (شامل SS)', - 'v2ray_only' => 'فقط اشتراک V2Ray', + 'tips' => 'هشدار: این لینک فقط برای استفاده شخصی است. آن را به اشتراک نگذارید، در غیر این صورت حساب شما به دلیل استفاده غیرعادی مسدود می‌شود.', 'trojan_only' => 'فقط اشتراک Trojan', - 'error' => 'خطا در تغییر لینک اشتراک', - 'info' => [ - 'title' => 'خلاصه حساب [غیر زمان واقعی]', - 'upload' => 'آپلود', - 'download' => 'دانلود', - 'total' => 'داده طرح', + 'v2ray_only' => 'فقط اشتراک V2Ray', + ], + 'telegram' => [ + 'bind_exists' => 'این حساب قبلاً به یک حساب تلگرام متصل است.', + 'bind_missing' => 'اطلاعات کاربر شما پیدا نشد. لطفاً ابتدا حساب خود را پیوند دهید.', + 'command' => [ + 'bind' => 'حساب :web_name خود را پیوند دهید', + 'intro' => 'شما می‌توانید از دستورات زیر استفاده کنید', + 'traffic' => 'بررسی مصرف داده‌ها', + 'unbind' => 'قطع ارتباط', + 'web_url' => 'دریافت جدیدترین URL :web_name', ], + 'get_url' => 'جدیدترین URL برای :web_name عبارت است از', + 'params_missing' => 'پارامترها نامعتبر هستند. لطفاً آدرس ایمیل خود را ضمیمه کرده و دوباره ارسال کنید.', + 'ticket_missing' => 'تیکت وجود ندارد', + 'ticket_reply' => 'پاسخ به تیکت #`:id` با موفقیت انجام شد', + 'traffic_query' => 'بررسی مصرف داده‌ها', + 'user_missing' => 'کاربر وجود ندارد', ], 'ticket' => [ 'attribute' => 'تیکت', - 'submit_tips' => 'تأیید ارسال تیکت؟', - 'reply_confirm' => 'تأیید پاسخ به تیکت؟', - 'close_tips' => 'تأیید بستن تیکت؟', - 'close' => 'بستن تیکت', - 'failed_closed' => 'خطا: قبلاً بسته شده است', - 'reply_placeholder' => 'چیزی بنویسید...', - 'reply' => 'پاسخ', 'close_msg' => 'تیکت ID :id توسط کاربر بسته شد', - 'title_placeholder' => 'به طور خلاصه مشکل خود را توضیح دهید', + 'close_tips' => 'تأیید بستن تیکت؟', 'content_placeholder' => 'توضیحات دقیق مشکل خود را ارائه دهید تا ما بتوانیم بهتر به شما کمک کنیم', - 'new' => 'ایجاد تیکت جدید', - 'service_hours' => 'ساعات خدمات مشتری', - 'online_hour' => 'ساعات آنلاین', - 'service_tips' => 'لطفاً فقط از یک روش تماس برای تماس با پشتیبانی استفاده کنید! درخواست‌های مکرر زمان پاسخگویی را به تأخیر می‌اندازد.', 'error' => 'خطای ناشناخته! لطفاً با پشتیبانی تماس بگیرید', + 'new' => 'ایجاد تیکت جدید', + 'online_hour' => 'ساعات آنلاین', + 'reply' => 'پاسخ', + 'reply_confirm' => 'تأیید پاسخ به تیکت؟', + 'reply_placeholder' => 'چیزی بنویسید...', + 'service_hours' => 'ساعات خدمات مشتری', + 'service_tips' => 'لطفاً فقط از یک روش تماس برای تماس با پشتیبانی استفاده کنید! درخواست‌های مکرر زمان پاسخگویی را به تأخیر می‌اندازد.', + 'submit_tips' => 'تأیید ارسال تیکت؟', + 'title_placeholder' => 'به طور خلاصه مشکل خود را توضیح دهید', ], 'traffic_logs' => [ - 'hourly' => 'مصرف داده امروز', 'daily' => 'مصرف داده این ماه', + 'hourly' => 'مصرف داده امروز', 'tips' => 'توجه: به‌روزرسانی آمار داده‌ها با تأخیر انجام می‌شود.', ], - 'clients' => 'کلاینت‌ها', 'tutorials' => 'آموزش‌ها', - 'current_role' => 'نقش فعلی به عنوان', - 'knowledge' => [ - 'title' => 'پایگاه دانش', - 'basic' => 'پایه', - ], - 'manual' => [ - 'red_packet' => 'بسته قرمز Alipay', - 'hint' => 'پس از اسکن کد QR، ادامه دهید و روی [بعدی] کلیک کنید تا زمانی که روی [ارسال] کلیک کنید تا پرداخت تکمیل شود!', - 'step_1' => 'توجهات', - 'step_1_title' => 'چگونه به صورت دستی پرداخت کنیم', - 'step_2' => 'پرداخت', - 'step_2_title' => 'دریافت کد QR و پرداخت', - 'step_3' => 'تکمیل', - 'step_3_title' => 'منتظر تأیید دستی باشید', - 'remark' => 'یادداشت حساب', - 'remark_content' => 'لطفاً نام کاربری حساب خود را برای تأیید دقیق دستی ارائه دهید', - 'payment_hint' => 'لطفاً مبلغ دقیق را پرداخت کنید (بازپرداخت برای پرداخت اضافی وجود ندارد، برای پرداخت کمتر باید شارژ کنید)', - 'pre' => 'قبلی', - 'next' => 'بعدی', - ], + 'withdraw' => 'برداشت', + 'withdraw_at' => 'تاریخ برداشت', + 'withdraw_commission' => 'برداشت کمیسیون', + 'withdraw_logs' => 'سوابق برداشت', ]; diff --git a/resources/lang/ja.json b/resources/lang/ja.json index 2d447c28..bc1e169a 100644 --- a/resources/lang/ja.json +++ b/resources/lang/ja.json @@ -126,5 +126,16 @@ "You are receiving this email because we received a password reset request for your account.": "パスワード再設定のリクエストを受け付けました。", "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!": "このエリアのコンテンツを表示するには、有効なサブスクリプションが必要です!", - "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "お客様のサブスクリプションは管理者によって無効にされました。復元するには管理者に連絡してください。" + "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "お客様のサブスクリプションは管理者によって無効にされました。復元するには管理者に連絡してください。", + "Manually add in dashboard.": "ダッシュボードで手動で追加", + "Manually edit in dashboard.": "ダッシュボードで手動で編集", + "Batch generate user accounts in dashboard.": "バックグラウンドでユーザーアカウントを一括生成", + "Coupon used in order.": "注文でクーポンが使用されました", + "Order canceled, coupon reinstated.": "注文がキャンセルされ、クーポンが復元されました", + "Used for credit recharge.": "残高のチャージに使用される", + "The user manually reset the data.": "ユーザーデータリセット記録", + "Recharge using a recharge voucher.": "チャージ券を使ってチャージする", + "The user topped up the balance.": "ユーザーが残高をチャージしました", + "Purchased an item.": "商品を購入しました", + "[:payment] plus the user’s purchased data plan.": "[:payment] にユーザーが購入したデータプランを追加" } \ No newline at end of file diff --git a/resources/lang/ja/admin.php b/resources/lang/ja/admin.php index 08a6aad5..82a858c2 100644 --- a/resources/lang/ja/admin.php +++ b/resources/lang/ja/admin.php @@ -3,512 +3,468 @@ declare(strict_types=1); return [ + 'action' => [ + 'add_item' => ':attribute を追加', + 'edit_item' => ':attribute を編集', + ], + 'aff' => [ + 'apply_counts' => '合計 :num 引き出し申請', + 'commission_counts' => 'この申請には合計 :num の注文が含まれます', + 'commission_title' => '申請詳細', + 'counts' => '合計 :num リベート履歴', + 'rebate_title' => 'リベート履歴', + 'referral' => '紹介リベート', + 'title' => '引き出し申請リスト', + ], + 'article' => [ + 'category_hint' => '同じカテゴリは一緒にグループ化されます', + 'counts' => '合計 :num 記事', + 'logo_placeholder' => 'またはロゴのURLを入力してください', + 'title' => '記事リスト', + 'type' => [ + 'announcement' => 'お知らせ', + 'knowledge' => '記事', + ], + ], + 'clear' => 'クリア', + 'clone' => 'クローン', + 'confirm' => [ + 'continues' => 'この操作を続行しますか?', + 'delete' => [0 => ':attribute を削除してもよろしいですか【', 1 => '】?'], + 'export' => 'すべてをエクスポートしてもよろしいですか?', + ], + 'coupon' => [ + 'counts' => '合計 :num クーポン', + 'created_days_hint' => '登録後 :days 日', + 'discount' => '割引', + 'export_title' => 'クーポンエクスポート', + 'groups_hint' => '選択されたユーザーグループのみ使用可能', + 'info_title' => 'クーポン情報', + 'levels_hint' => '選択されたユーザーレベルのみ使用可能', + 'limit_hint' => '条件は AND 関係にあります。適切に使用してください。', + 'minimum_hint' => '支払いが:numを超える場合のみ使用可能', + 'name_hint' => '表示用', + 'newbie' => [ + 'created_days' => 'アカウント年齢', + 'first_discount' => '初回割引', + 'first_order' => '初回注文', + ], + 'priority_hint' => '適格な最高優先度のクーポンが最初に使用されます。最大255', + 'services_blacklist_hint' => 'ブラックリストの商品には使用不可、未使用の場合は空白のまま', + 'services_placeholder' => '商品IDを入力し、Enterキーを押します', + 'services_whitelist_hint' => 'ホワイトリストの商品にのみ使用可能、未使用の場合は空白のまま', + 'single_use' => '一度きりの使用', + 'sn_hint' => '空白の場合、8桁のランダムコード', + 'title' => 'クーポンリスト', + 'type' => [ + 'charge' => 'チャージ', + 'discount' => '割引', + 'voucher' => 'バウチャー', + ], + 'type_hint' => '割引:金額を控除、割引率:パーセンテージ割引、チャージ:残高に追加', + 'used_hint' => '各ユーザーはこのクーポンを最大:num回使用できます', + 'user_whitelist_hint' => 'ホワイトリストのユーザーは使用可能、未使用の場合は空白のまま', + 'users_blacklist_hint' => 'ブラックリストのユーザーは使用不可、未使用の場合は空白のまま', + 'users_placeholder' => 'ユーザーIDを入力し、Enterキーを押します', + 'value' => '{1} ➖ :num|{2} :num% 割引|{3} ➕ :num', + 'value_hint' => '範囲は1%から99%', + ], + 'creating' => '追加中...', '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' => 'メンテナンス中のノード', + 'active_days_users' => '過去 :days 日間のアクティブユーザー', + 'available_users' => '有効ユーザー数', + 'credit' => '総残高', 'current_month_traffic_consumed' => '今月のデータ使用量', 'days_traffic_consumed' => '過去 :days 日間のデータ使用量', - 'orders' => '総注文数', + 'expiring_users' => '間もなく有効期限が切れるユーザー', + 'inactive_days_users' => '過去 :days 日間非アクティブなユーザー', + 'maintaining_nodes' => 'メンテナンス中のノード', + 'nodes' => 'ノード数', 'online_orders' => 'オンライン決済注文数', + 'online_users' => '現在オンラインのユーザー', + 'orders' => '総注文数', + 'overuse_users' => 'データ使用量が90%を超えるユーザー', + 'paid_users' => '有料ユーザー数', 'succeed_orders' => '支払い成功の注文数', - 'credit' => '総残高', + 'users' => '総ユーザー数', 'withdrawing_commissions' => '引き出し待ちのコミッション', 'withdrawn_commissions' => '引き出されたコミッション', ], - 'action' => [ - 'edit_item' => ':attribute を編集', - 'add_item' => ':attribute を追加', + 'end_time' => '終了時間', + 'goods' => [ + 'counts' => '合計 :num 商品', + 'info' => [ + 'available_date_hint' => '期限が切れると、合計データから対応するデータが自動的に控除されます', + 'desc_placeholder' => '簡単な商品説明', + 'limit_num_hint' => 'ユーザーごとの購入回数の上限、0は無制限', + 'list_hint' => '各行の内容は<li>で始まり</li>で終わります', + 'list_placeholder' => 'カスタムコンテンツを追加', + 'period_hint' => 'プランのデータ許容量はN日ごとにリセットされます', + 'type_hint' => 'プランはアカウントの有効期限に影響し、パッケージはデータのみを控除し、有効期限には影響しません', + ], + 'sell_and_used' => '使用 / 販売', + 'status' => [ + 'no' => '販売停止', + 'yes' => '販売中', + ], + 'title' => '商品リスト', + 'type' => [ + 'package' => 'データパッケージ', + 'plan' => 'サブスクリプションプラン', + 'top_up' => 'チャージ', + ], ], - 'confirm' => [ - 'delete' => [0 => ':attribute を削除してもよろしいですか【', 1 => '】?'], - 'continues' => 'この操作を続行しますか?', - 'export' => 'すべてをエクスポートしてもよろしいですか?', + 'hint' => 'ヒント', + 'logs' => [ + 'ban' => [ + 'ban_time' => '禁止時間', + 'last_connect_at' => '最終接続時間', + 'reason' => '理由', + 'time' => '期間', + 'title' => 'ユーザー禁止履歴', + ], + 'callback' => 'コールバックログ (支払い)', + 'counts' => '合計 :num 記録', + 'credit_title' => '残高変更履歴', + 'ip_monitor' => 'オンラインIP監視 リアルタイム2分', + 'notification' => 'メール送信履歴', + 'order' => [ + 'is_coupon' => 'クーポン使用', + 'is_expired' => '期限切れ', + 'title' => '注文リスト', + 'update_conflict' => '更新失敗:注文の競合', + ], + 'rule' => [ + 'clear_all' => 'すべての記録をクリア', + 'clear_confirm' => 'すべてのトリガー記録をクリアしてもよろしいですか?', + 'created_at' => 'トリガー時間', + 'name' => 'トリガールール名', + 'reason' => 'トリガー理由', + 'tag' => '✅ 許可されていないコンテンツへのアクセス', + 'title' => 'ルールトリガー記録', + ], + 'subscribe' => 'サブスクリプションリスト', + 'user_data_modify_title' => 'データ変更履歴', + 'user_ip' => [ + 'connect' => '接続IP', + 'title' => 'ユーザーオンラインIPリスト 直近10分', + ], + 'user_traffic' => [ + 'choose_node' => 'ノードを選択', + 'title' => 'データ使用履歴', + ], ], - 'user_dashboard' => 'ユーザーダッシュボード', + 'marketing' => [ + 'counts' => '合計 :num メール', + 'email' => [ + 'ever_paid' => '支払い済み', + 'expired_date' => '期限切れの日付', + 'filters' => 'フィルター', + 'loading_statistics' => '統計情報を読み込み中...', + 'never_paid' => '支払いなし', + 'paid_servicing' => '有料サービス', + 'previously_paid' => '以前に支払い済み', + 'recent_traffic_abnormal' => '直近1時間のトラフィック異常', + 'recently_active' => '最近アクティブ', + 'targeted_users_count' => 'ターゲットユーザー数', + 'traffic_usage_over' => 'トラフィック使用量がN%を超えました', + 'will_expire_date' => '期限が切れる日付', + ], + 'email_send' => 'メール送信', + 'error_message' => 'エラーメッセージ', + 'processed' => 'リクエストが処理されました', + 'push_send' => '通知送信', + 'send_status' => '送信状態', + 'send_time' => '送信時間', + 'targeted_users_not_found' => 'ターゲットユーザーが見つかりません', + 'unknown_sending_type' => '未知の送信タイプ', + ], + 'massive_export' => '一括エクスポート', 'menu' => [ + 'analysis' => [ + 'accounting' => '会計', + 'attribute' => 'データ分析', + 'node_flow' => 'ノードトラフィック分析', + 'site_flow' => 'サイトトラフィック', + 'user_flow' => 'ユーザートラフィック', + ], + 'customer_service' => [ + 'article' => '記事管理', + 'attribute' => 'カスタマーサービスシステム', + 'marketing' => 'メッセージの配信', + 'ticket' => 'サポートチケット', + ], 'dashboard' => 'ダッシュボード', - 'user' => [ - 'attribute' => 'ユーザーシステム', - 'list' => 'ユーザー管理', - 'oauth' => 'サードパーティ認証', - 'group' => 'ユーザーグループ', - 'credit_log' => '残高変動履歴', - 'subscribe' => 'サブスクリプション管理', + 'log' => [ + 'attribute' => 'ログシステム', + 'notify' => '通知履歴', + 'online_logs' => 'オンライン履歴', + 'online_monitor' => 'オンラインモニタリング', + 'payment_callback' => '支払いコールバック', + 'service_ban' => '禁止履歴', + 'system' => 'システムログ', + 'traffic' => 'データ使用', + 'traffic_flow' => 'データ変動', + ], + 'node' => [ + 'attribute' => 'ノードシステム', + 'auth' => 'ノード認証', + 'cert' => '証明書リスト', + 'list' => 'ノード管理', + ], + 'promotion' => [ + 'attribute' => 'プロモーション', + 'invite' => '招待管理', + 'rebate_flow' => 'リベート履歴', + 'withdraw' => '引き出し管理', ], 'rbac' => [ 'attribute' => '権限システム', 'permission' => '権限管理', 'role' => '役割リスト', ], - 'customer_service' => [ - 'attribute' => 'カスタマーサービスシステム', - 'ticket' => 'サポートチケット', - 'article' => '記事管理', - 'marketing' => 'メッセージの配信', - ], - 'node' => [ - 'attribute' => 'ノードシステム', - 'list' => 'ノード管理', - 'auth' => 'ノード認証', - 'cert' => '証明書リスト', - ], 'rule' => [ 'attribute' => '監査ルール', - 'list' => 'ルールリスト', 'group' => 'ルールグループ', + 'list' => 'ルールリスト', 'trigger' => 'トリガー履歴', ], - 'shop' => [ - 'attribute' => '商品システム', - 'goods' => '商品管理', - 'coupon' => 'クーポン管理', - 'order' => '商品注文', - ], - 'promotion' => [ - 'attribute' => 'プロモーション', - 'invite' => '招待管理', - 'withdraw' => '引き出し管理', - 'rebate_flow' => 'リベート履歴', - ], - 'analysis' => [ - 'attribute' => 'データ分析', - 'accounting' => '会計', - 'user_flow' => 'ユーザートラフィック', - 'node_flow' => 'ノードトラフィック分析', - 'site_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' => 'システム設定', + 'universal' => '共通設定', + ], + 'shop' => [ + 'attribute' => '商品システム', + 'coupon' => 'クーポン管理', + 'goods' => '商品管理', + 'order' => '商品注文', + ], + 'tools' => [ + 'analysis' => 'ログ分析', + 'attribute' => 'ツールセット', + 'convert' => 'フォーマット変換', + 'decompile' => '逆コンパイル', + 'import' => 'データインポート', + ], + 'user' => [ + 'attribute' => 'ユーザーシステム', + 'credit_log' => '残高変動履歴', + 'group' => 'ユーザーグループ', + 'list' => 'ユーザー管理', + 'oauth' => 'サードパーティ認証', + 'subscribe' => 'サブスクリプション管理', ], ], - 'user' => [ - 'massive' => [ - 'text' => 'アカウント一括生成数', - 'failed' => 'アカウント一括生成に失敗しました', - 'succeed' => 'アカウント一括生成に成功しました', - 'note' => 'バックグラウンドでユーザーアカウントを一括生成', - ], - 'proxy_info' => '構成情報', - 'traffic_monitor' => 'トラフィック統計', - 'online_monitor' => 'オンラインモニタリング', - 'reset_traffic' => 'データリセット', - 'user_view' => 'ユーザー視点に切り替え', - 'connection_test' => '接続テスト', - 'counts' => '合計 :num アカウント', - 'reset_confirm' => [0 => '【', 1 => '】のデータをリセットしてもよろしいですか?'], - 'info' => [ - 'account' => 'アカウント情報', - 'proxy' => 'プロキシ情報', - 'switch' => 'アイデンティティを切り替え', - 'reset_date_hint' => '次回のデータリセット日', - 'expired_date_hint' => '空白の場合、デフォルトで1年間有効', - 'uuid_hint' => 'V2RayのUUID', - 'recharge_placeholder' => '負の値を入力すると残高が減少します', - ], - 'update_help' => '更新に成功しました。戻りますか?', - 'proxies_config' => '【:username】の接続構成情報', - 'group' => [ - 'title' => 'ユーザーグループコントロール(ノードは複数のグループに属することができますが、ユーザーは1つのグループにのみ属することができます。ユーザーが表示/利用できるノードについては、グループがレベルより優先されます)', - 'name' => 'グループ名', - 'counts' => '合計 :num グループ', - ], - ], - 'zero_unlimited_hint' => '設定しない/0の場合、無制限', - 'node' => [ - 'traffic_monitor' => 'トラフィック統計', - 'refresh_geo' => '地理情報を更新', - 'connection_test' => '接続テスト', - 'counts' => '合計 :num ノード', - 'reload_all' => 'すべてのバックエンドをリロード', - 'refresh_geo_all' => 'すべてのノード地理情報を更新', - 'reload_confirm' => 'ノードのバックエンドをリロードしてもよろしいですか?', - 'info' => [ - 'hint' => '注意: 自動生成されたIDはShadowsocksRのnode_idおよびV2RayのnodeIdです。', - 'basic' => '基本情報', - 'ddns_hint' => '動的IPノードにはDDNS設定が必要です。このタイプのノードはドメイン名を通じて接続テストが行われます。', - 'domain_placeholder' => 'サーバードメイン、入力されている場合は優先的に使用されます', - 'domain_hint' => 'システム設定でDDNSモードが有効になっている場合、ドメイン名とIPは自動的に更新されます。ドメインレジストラのウェブサイトで情報を編集する必要はありません。', - 'extend' => '拡張情報', - 'display' => [ - 'invisible' => '完全に不可視', - 'node' => '【ノード】ページにのみ表示', - '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' => 'obfsが[plain]でない場合、トラフィック偽装のためのパラメータを入力します; obfsが[http_simple]の場合、ポート80を推奨します; obfsが[tls]の場合、ポート443を推奨します。', - 'additional_ports_hint' => '有効にする場合は、サーバーのadditional_portsを設定してください。', - 'v2_method_hint' => 'WebSocket伝送プロトコルは「none」暗号化方式を使用しないでください。', - 'v2_net_hint' => 'WebSocket用にTLSを有効にしてください。', - 'v2_cover' => [ - 'none' => '偽装なし', - 'http' => 'HTTPデータストリーム', - 'srtp' => 'ビデオ通話データ (SRTP)', - 'utp' => 'BTダウンロードデータ (uTP)', - 'wechat' => 'WeChatビデオ通話', - 'dtls' => 'DTLS1.2データパケット', - 'wireguard' => 'WireGuardデータパケット', - ], - 'v2_host_hint' => 'http偽装の場合、複数のドメインはコンマで区切りますが、WebSocketは単一のドメインのみを許可します。', - 'v2_tls_provider_hint' => '異なるバックエンドには異なる設定があります:', - 'single_hint' => '推奨ポートは80または443。バックエンドには
    厳格モード設定が必要です:ユーザーのポートは接続できず、指定されたポートのみで接続できます(設定方法)', - ], - 'proxy_info' => '*Shadowsocksプロトコルと互換性があります', - 'proxy_info_hint' => '互換性のために、サーバー構成でプロトコルとobfsに_compatibleを追加してください。', - 'reload' => 'バックエンドをリロード', - 'auth' => [ - 'title' => 'ノード認証リストWEBAPI', - 'deploy' => [ - 'title' => ':type_label バックエンドのデプロイ', - 'attribute' => 'バックエンドデプロイ', - 'command' => 'コマンド', - 'update' => '更新', - 'uninstall' => 'アンインストール', - 'start' => '開始', - 'stop' => '停止', - 'status' => '状態', - 'recent_logs' => '最近のログ', - 'real_time_logs' => 'リアルタイムログ', - 'restart' => '再起動', - 'same' => '上記と同じ', - 'trojan_hint' => 'ノード名を入力し、対応するIPに解決してください。', - ], - 'reset_auth' => '認証キーをリセット', - 'counts' => '合計 :num 認証記録', - 'generating_all' => 'すべてのノードの認証キーを生成してもよろしいですか?', - ], - 'cert' => [ - 'title' => 'ドメイン証明書リスト(V2Rayノードの偽装ドメイン)', - 'counts' => '合計 :num ドメイン証明書', - 'key_placeholder' => '証明書のKEY値。空白でも可。VNET-V2Rayバックエンドは自動発行をサポート。', - 'pem_placeholder' => '証明書のPEM値。空白でも可。VNET-V2Rayバックエンドは自動発行をサポート。', - ], - ], - 'hint' => 'ヒント', - 'oauth' => [ - 'title' => 'サードパーティ認証', - 'counts' => '合計 :num 認証記録', - ], - 'select_all' => 'すべて選択', - 'clear' => 'クリア', - 'unselected_hint' => '割り当てられるルールはここで検索できます', - 'selected_hint' => '割り当てられたルールはここで検索できます', - 'clone' => 'クローン', + 'minute' => '分', 'monitor' => [ 'daily_chart' => '日次トラフィック使用量', + 'hint' => 'ヒント: データがない場合はスケジュールタスクを確認してください。', 'monthly_chart' => '月次トラフィック使用量', 'node' => 'ノードトラフィック', 'user' => 'ユーザートラフィック', - 'hint' => 'ヒント: データがない場合はスケジュールタスクを確認してください。', ], - 'tools' => [ - 'analysis' => [ - 'title' => 'SSRログ分析シングルノード用', - 'req_url' => '最近のリクエストURL記録', - 'not_enough' => '記録が15,000未満のため、分析できません。', - ], - 'convert' => [ - 'title' => 'フォーマット変換ShadowsocksからShadowsocksRへ', - 'content_placeholder' => '変換する構成情報を入力してください。', - ], - 'decompile' => [ - 'title' => '逆コンパイル構成情報', - 'attribute' => '逆コンパイル構成リンク', - 'content_placeholder' => '逆コンパイルするShadowsocksRリンクを入力してください。行区切りで入力。', - ], - ], - 'ticket' => [ - 'title' => 'チケットリスト', - 'counts' => '合計 :num チケット', - 'send_to' => 'ターゲットユーザーの情報を入力してください', - 'user_info' => 'ユーザー情報', - 'inviter_info' => '招待者情報', - 'close_confirm' => 'このチケットを閉じてもよろしいですか?', - 'error' => '不明なエラーです。ログを確認してください。', - ], - 'logs' => [ - 'subscribe' => 'サブスクリプションリスト', - 'counts' => '合計 :num 記録', - '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' => 'コールバックログ (支払い)', - 'notification' => 'メール送信履歴', - 'ip_monitor' => 'オンラインIP監視 リアルタイム2分', - 'user_ip' => [ - 'title' => 'ユーザーオンラインIPリスト 直近10分', - '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' => '各行の内容は<li>で始まり</li>で終わります', - ], - 'status' => [ - 'yes' => '販売中', - 'no' => '販売停止', - ], - 'sell_and_used' => '使用 / 販売', - 'counts' => '合計 :num 商品', - ], - 'sort_asc' => 'ソート値が大きいほど優先度が高くなります', - 'yes' => 'はい', 'no' => 'いいえ', - 'rule' => [ - 'type' => [ - 'reg' => '正規表現', - 'domain' => 'ドメイン', - 'ip' => 'IP', - 'protocol' => 'プロトコル', + 'node' => [ + 'auth' => [ + 'counts' => '合計 :num 認証記録', + 'deploy' => [ + 'attribute' => 'バックエンドデプロイ', + 'command' => 'コマンド', + 'real_time_logs' => 'リアルタイムログ', + 'recent_logs' => '最近のログ', + 'restart' => '再起動', + 'same' => '上記と同じ', + 'start' => '開始', + 'status' => '状態', + 'stop' => '停止', + 'title' => ':type_label バックエンドのデプロイ', + 'trojan_hint' => 'ノード名を入力し、対応するIPに解決してください。', + 'uninstall' => 'アンインストール', + 'update' => '更新', + ], + 'empty' => '認証生成が必要なノードはありません', + 'generating_all' => 'すべてのノードの認証キーを生成してもよろしいですか?', + 'reset_auth' => '認証キーをリセット', + 'title' => 'ノード認証リストWEBAPI', ], + 'cert' => [ + 'counts' => '合計 :num ドメイン証明書', + 'key_placeholder' => '証明書のKEY値。空白でも可。VNET-V2Rayバックエンドは自動発行をサポート。', + 'pem_placeholder' => '証明書のPEM値。空白でも可。VNET-V2Rayバックエンドは自動発行をサポート。', + 'title' => 'ドメイン証明書リスト(V2Rayノードの偽装ドメイン)', + ], + 'connection_test' => '接続テスト', + 'counts' => '合計 :num ノード', + 'info' => [ + 'additional_ports_hint' => '有効にする場合は、サーバーのadditional_portsを設定してください。', + 'basic' => '基本情報', + 'data_rate_hint' => '例:0.1は100Mを10Mとしてカウントすることを意味します。5は100Mを500Mとしてカウントします。', + 'ddns_hint' => '動的IPノードにはDDNS設定が必要です。このタイプのノードはドメイン名を通じて接続テストが行われます。', + 'detection' => [ + 'all' => '両方', + 'hint' => '30〜60分ごとにランダムにチェック', + 'icmp' => 'ICMPのみ', + 'tcp' => 'TCPのみ', + ], + 'display' => [ + 'all' => '完全に可視', + 'hint' => 'サブスクリプション/ノードリストに表示されるかどうか', + 'invisible' => '完全に不可視', + 'node' => '【ノード】ページにのみ表示', + 'sub' => '【サブスクリプション】にのみ表示', + ], + 'domain_hint' => 'システム設定でDDNSモードが有効になっている場合、ドメイン名とIPは自動的に更新されます。ドメインレジストラのウェブサイトで情報を編集する必要はありません。', + 'domain_placeholder' => 'サーバードメイン、入力されている場合は優先的に使用されます', + 'extend' => '拡張情報', + 'hint' => '注意: 自動生成されたIDはShadowsocksRのnode_idおよびV2RayのnodeIdです。', + 'ipv4_hint' => '複数のIPは英語のコンマで区切ります。例: 1.1.1.1,8.8.8.8', + 'ipv4_placeholder' => 'サーバーのIPv4アドレス', + 'ipv6_hint' => '複数のIPは英語のコンマで区切ります。例: 1.1.1.1,8.8.8.8', + 'ipv6_placeholder' => 'サーバーのIPv6アドレス', + 'level_hint' => 'レベル:0 - レベル制限なし、すべて可視。', + 'obfs_param_hint' => 'obfsが[plain]でない場合、トラフィック偽装のためのパラメータを入力します; obfsが[http_simple]の場合、ポート80を推奨します; obfsが[tls]の場合、ポート443を推奨します。', + 'push_port_hint' => '必須。サーバーファイアウォールでこのポートが開かれていることを確認してください。そうしないと、メッセージプッシュが異常になります。', + 'single_hint' => '推奨ポートは80または443。バックエンドには
    厳格モード設定が必要です:ユーザーのポートは接続できず、指定されたポートのみで接続できます(設定方法)', + 'v2_cover' => [ + 'dtls' => 'DTLS1.2データパケット', + 'http' => 'HTTPデータストリーム', + 'none' => '偽装なし', + 'srtp' => 'ビデオ通話データ (SRTP)', + 'utp' => 'BTダウンロードデータ (uTP)', + 'wechat' => 'WeChatビデオ通話', + 'wireguard' => 'WireGuardデータパケット', + ], + 'v2_host_hint' => 'http偽装の場合、複数のドメインはコンマで区切りますが、WebSocketは単一のドメインのみを許可します。', + 'v2_method_hint' => 'WebSocket伝送プロトコルは「none」暗号化方式を使用しないでください。', + 'v2_net_hint' => 'WebSocket用にTLSを有効にしてください。', + 'v2_tls_provider_hint' => '異なるバックエンドには異なる設定があります:', + ], + 'proxy_info' => '*Shadowsocksプロトコルと互換性があります', + 'proxy_info_hint' => '互換性のために、サーバー構成でプロトコルとobfsに_compatibleを追加してください。', + 'refresh_geo' => '地理情報を更新', + 'refresh_geo_all' => 'すべてのノード地理情報を更新', + 'reload' => 'バックエンドをリロード', + 'reload_all' => 'すべてのバックエンドをリロード', + 'reload_confirm' => 'ノードのバックエンドをリロードしてもよろしいですか?', + 'traffic_monitor' => 'トラフィック統計', + ], + 'oauth' => [ + 'counts' => '合計 :num 認証記録', + 'title' => 'サードパーティ認証', + ], + 'optional' => 'オプション', + 'permission' => [ + 'counts' => '合計 :num 権限行動', + 'description_hint' => '説明を入力、例:【システムA】Aの編集', + 'name_hint' => 'ルート名を入力、例:admin.permission.create,update', + 'title' => '権限行動リスト', + ], + 'query' => 'クエリ', + 'report' => [ + 'annually_accounting' => '年次取引', + 'annually_site_flow' => '年次トラフィック消費', + 'avg_traffic_30d' => '過去30日間の平均日次トラフィック', + 'current_month' => '今月', + 'current_year' => '今年', + 'daily_accounting' => '日次取引', + 'daily_distribution' => '日次分布', + 'daily_site_flow' => '日次トラフィック消費', + 'daily_traffic' => '日次トラフィック', + 'hourly_traffic' => '毎時トラフィック', + 'last_month' => '先月', + 'last_year' => '去年', + 'monthly_accounting' => '月次取引', + 'monthly_site_flow' => '月次トラフィック消費', + 'select_hourly_date' => '時間別の日付を選択', + 'sum_traffic_30d' => '過去30日間のトラフィック比率', + 'today' => '今日', + ], + 'require' => '必須', + 'role' => [ + 'counts' => '合計 :num 権限ロール', + 'description_hint' => '表示名、例:管理者', + 'modify_admin_error' => 'スーパ管理者を変更しないでください!', + 'name_hint' => 'ユニークな識別名、例:Admin', + 'permissions_all' => 'すべての権限', + 'title' => '権限ロールリスト', + ], + 'rule' => [ 'counts' => '合計 :num ルール', - 'title' => 'ルールリスト', 'group' => [ + 'counts' => '合計 :num グループ', + 'title' => 'ルールグループ', 'type' => [ 'off' => 'ブロック', 'on' => '許可', ], - 'title' => 'ルールグループ', - 'counts' => '合計 :num グループ', ], - ], - 'role' => [ - 'name_hint' => 'ユニークな識別名、例:Admin', - 'description_hint' => '表示名、例:管理者', - 'title' => '権限ロールリスト', - 'permissions_all' => 'すべての権限', - 'counts' => '合計 :num 権限ロール', - ], - 'report' => [ - 'daily_accounting' => '日次取引', - 'monthly_accounting' => '月次取引', - 'annually_accounting' => '年次取引', - 'daily_site_flow' => '日次トラフィック消費', - 'monthly_site_flow' => '月次トラフィック消費', - 'annually_site_flow' => '年次トラフィック消費', - 'current_month' => '今月', - 'last_month' => '先月', - 'current_year' => '今年', - 'last_year' => '去年', - 'hourly_traffic' => '毎時トラフィック', - 'daily_traffic' => '日次トラフィック', - 'daily_distribution' => '日次分布', - 'today' => '今日', - 'avg_traffic_30d' => '過去30日間の平均日次トラフィック', - 'sum_traffic_30d' => '過去30日間のトラフィック比率', - 'select_hourly_date' => '時間別の日付を選択', - ], - 'permission' => [ - 'title' => '権限行動リスト', - 'description_hint' => '説明を入力、例:【システムA】Aの編集', - 'name_hint' => 'ルート名を入力、例:admin.permission.create,update', - 'counts' => '合計 :num 権限行動', - ], - 'marketing' => [ - 'push_send' => '通知送信', - 'email_send' => 'メール送信', - 'email' => [ - 'targeted_users_count' => 'ターゲットユーザー数', - 'loading_statistics' => '統計情報を読み込み中...', - 'filters' => 'フィルター', - 'expired_date' => '期限切れの日付', - 'will_expire_date' => '期限が切れる日付', - 'traffic_usage_over' => 'トラフィック使用量がN%を超えました', - 'recently_active' => '最近アクティブ', - 'paid_servicing' => '有料サービス', - 'previously_paid' => '以前に支払い済み', - 'ever_paid' => '支払い済み', - 'never_paid' => '支払いなし', - 'recent_traffic_abnormal' => '直近1時間のトラフィック異常', - ], - 'counts' => '合計 :num メール', - 'send_status' => '送信状態', - 'send_time' => '送信時間', - 'error_message' => 'エラーメッセージ', - 'processed' => 'リクエストが処理されました', - 'targeted_users_not_found' => 'ターゲットユーザーが見つかりません', - 'unknown_sending_type' => '不明な送信タイプ', - ], - 'creating' => '追加中...', - 'article' => [ + 'title' => 'ルールリスト', 'type' => [ - 'knowledge' => '記事', - 'announcement' => 'お知らせ', + 'domain' => 'ドメイン', + 'ip' => 'IP', + 'protocol' => 'プロトコル', + 'reg' => '正規表現', ], - 'category_hint' => '同じカテゴリは一緒にグループ化されます', - 'logo_placeholder' => 'またはロゴのURLを入力してください', - 'title' => '記事リスト', - 'counts' => '合計 :num 記事', - ], - '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' => '支払いが:numを超える場合のみ使用可能', - 'used_hint' => '各ユーザーはこのクーポンを最大:num回使用できます', - 'levels_hint' => '選択されたユーザーレベルのみ使用可能', - 'groups_hint' => '選択されたユーザーグループのみ使用可能', - 'users_placeholder' => 'ユーザーIDを入力し、Enterキーを押します', - 'user_whitelist_hint' => 'ホワイトリストのユーザーは使用可能、未使用の場合は空白のまま', - 'users_blacklist_hint' => 'ブラックリストのユーザーは使用不可、未使用の場合は空白のまま', - 'services_placeholder' => '商品IDを入力し、Enterキーを押します', - 'services_whitelist_hint' => 'ホワイトリストの商品にのみ使用可能、未使用の場合は空白のまま', - 'services_blacklist_hint' => 'ブラックリストの商品には使用不可、未使用の場合は空白のまま', - 'newbie' => [ - 'first_discount' => '初回割引', - 'first_order' => '初回注文', - 'created_days' => 'アカウント年齢', - ], - 'created_days_hint' => '登録後 :days 日', - 'limit_hint' => '条件は AND 関係にあります。適切に使用してください。', - 'info_title' => 'クーポン情報', - 'counts' => '合計 :num クーポン', - 'discount' => '割引', - 'export_title' => 'クーポンエクスポート', - 'single_use' => '一度きりの使用', - ], - 'times' => '回', - 'massive_export' => '一括エクスポート', - 'system_generate' => 'システム生成', - 'aff' => [ - 'rebate_title' => 'リベート履歴', - 'counts' => '合計 :num リベート履歴', - 'title' => '引き出し申請リスト', - 'apply_counts' => '合計 :num 引き出し申請', - 'referral' => '紹介リベート', - 'commission_title' => '申請詳細', - 'commission_counts' => 'この申請には合計 :num の注文が含まれます', ], + 'select_all' => 'すべて選択', + 'selected_hint' => '割り当てられたルールはここで検索できます', + 'set_to' => ':attributeに設定', 'setting' => [ 'common' => [ - 'title' => '共通設定', - 'set_default' => 'デフォルトに設定', 'connect_nodes' => '関連ノード数', + 'set_default' => 'デフォルトに設定', + 'title' => '共通設定', ], 'email' => [ - 'title' => 'メールフィルタリスト (特定のメールドメインの登録をブロックするため)', - 'tail' => 'メールドメイン', - 'rule' => 'ルール', 'black' => 'ブラックリスト', - 'white' => 'ホワイトリスト', + 'rule' => 'ルール', + 'tail' => 'メールドメイン', 'tail_placeholder' => 'メールドメインを入力してください', - ], - 'system' => [ - 'title' => 'システム設定', - 'web' => 'ウェブ一般', - 'account' => 'アカウント設定', - 'node' => 'ノード設定', - 'extend' => '拡張機能', - 'check_in' => 'チェックインシステム', - 'promotion' => 'プロモーションシステム', - 'notify' => '通知システム', - 'auto_job' => '自動タスク', - 'other' => 'ロゴ|カスタマーサービス|統計', - 'payment' => '支払いシステム', - 'menu' => 'メニュー', + 'title' => 'メールフィルタリスト (特定のメールドメインの登録をブロックするため)', + 'white' => 'ホワイトリスト', ], 'no_permission' => 'パラメータを変更する権限がありません!', + 'system' => [ + 'account' => 'アカウント設定', + 'auto_job' => '自動タスク', + 'check_in' => 'チェックインシステム', + 'extend' => '拡張機能', + 'menu' => 'メニュー', + 'node' => 'ノード設定', + 'notify' => '通知システム', + 'other' => 'ロゴ|カスタマーサービス|統計', + 'payment' => '支払いシステム', + 'promotion' => 'プロモーションシステム', + 'title' => 'システム設定', + 'web' => 'ウェブ一般', + ], ], + 'sort_asc' => 'ソート値が大きいほど優先度が高くなります', + 'start_time' => '開始時間', 'system' => [ + 'AppStore_id' => 'Appleアカウント', + 'AppStore_password' => 'Appleパスワード', 'account_expire_notification' => 'アカウント有効期限通知', + 'active_account' => [ + 'after' => '登録後に有効化', + 'before' => '登録前に有効化', + ], 'active_times' => 'アカウント有効化回数', 'admin_invite_days' => '管理者-招待コード有効期', 'aff_salt' => '招待リンク ユーザーID暗号化', 'alipay_qrcode' => 'Alipay QRコード', - 'AppStore_id' => 'Appleアカウント', - 'AppStore_password' => 'Appleパスワード', 'auto_release_port' => 'ポート回収メカニズム', 'bark_key' => 'Barkデバイスキー', + 'captcha' => [ + 'geetest' => 'Geetest', + 'hcaptcha' => 'hCaptcha', + 'recaptcha' => 'Google reCaptcha', + 'standard' => '標準Captcha', + 'turnstile' => 'Turnstile', + ], 'captcha_key' => 'Captchaキー', 'captcha_secret' => 'Captchaシークレット/ID', 'codepay_id' => 'CodePay ID', @@ -521,6 +477,7 @@ return [ 'ddns_secret' => 'DNSプロバイダーシークレット', 'default_days' => '初期有効期限', 'default_traffic' => '初期データ量', + 'demo_restriction' => 'デモ環境では、この設定の変更は許可されていません!', 'detection_check_times' => 'ブロック検出通知', 'dingTalk_access_token' => 'DingTalkカスタムボット Access Token', 'dingTalk_secret' => 'DingTalkカスタムボット シークレット', @@ -531,108 +488,19 @@ return [ 'f2fpay_app_id' => 'アプリID', 'f2fpay_private_key' => 'アプリプライベートキー', 'f2fpay_public_key' => 'Alipayパブリックキー', + 'forbid' => [ + 'china' => '中国を禁止', + 'mainland' => '中国本土を禁止', + 'oversea' => '海外を禁止', + ], 'forbid_mode' => 'アクセス禁止モード', - 'invite_num' => 'デフォルト招待数', - 'is_activate_account' => 'アカウント有効化', - 'is_AliPay' => 'Alipay支払い', - 'is_ban_status' => '有効期限自動禁止', - 'is_captcha' => 'Captchaモード', - 'is_checkin' => 'チェックインデータ追加', - 'is_clear_log' => 'ログ自動クリア', - 'is_custom_subscribe' => 'カスタムサブスクリプション', - 'is_email_filtering' => 'メールフィルタリング', - 'is_forbid_robot' => 'ロボットアクセス禁止', - 'is_free_code' => '無料招待コード', - 'is_invite_register' => '招待登録', - 'is_otherPay' => 'カスタム支払い', - 'is_QQPay' => 'QQウォレット', - 'is_rand_port' => 'ランダムポート', - 'is_register' => 'ユーザー登録', - 'is_subscribe_ban' => '異常サブスクリプションリクエスト自動禁止', - 'is_traffic_ban' => '異常データ使用自動禁止', - 'is_WeChatPay' => 'WeChat支払い', - 'iYuu_token' => 'IYUUトークン', - 'maintenance_content' => 'メンテナンス内容', - 'maintenance_mode' => 'メンテナンスモード', - 'maintenance_time' => 'メンテナンス終了時間', - '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シークレット', - 'payjs_key' => '通信キー', - 'payjs_mch_id' => '商人ID', - 'payment_confirm_notification' => '手動支払い確認通知', - 'payment_received_notification' => '支払い成功通知', - 'paypal_app_id' => 'App ID', - 'paypal_client_id' => 'クライアントID', - 'paypal_client_secret' => 'クライアントシークレット', - 'pushDeer_key' => 'PushDeerキー', - 'pushplus_token' => 'PushPlusトークン', - 'rand_subscribe' => 'ランダムサブスクリプション', - 'redirect_url' => 'リダイレクト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' => 'パブリックキー', - 'stripe_secret_key' => 'シークレットキー', - 'stripe_signing_secret' => 'Webhook署名シークレット', - 'subject_name' => 'カスタム商品名', - 'subscribe_ban_times' => 'サブスクリプションリクエストしきい値', - 'subscribe_domain' => 'ノードサブスクリプションURL', - 'subscribe_max' => 'サブスクリプションノード数', - 'telegram_token' => 'Telegramトークン', - 'tg_chat_token' => 'TGチャットトークン', - 'theadpay_key' => 'THeadPayキー', - 'theadpay_mchid' => 'THeadPay商人ID', - 'theadpay_url' => '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' => '支払いコールバックURL', - 'website_customer_service' => 'カスタマーサービスコード', - 'website_home_logo' => 'ホームページロゴ', - 'website_logo' => 'サイトロゴ', - 'website_name' => 'ウェブサイト名', - 'website_security_code' => 'ウェブサイトセキュリティコード', - 'website_url' => 'ウェブサイトURL', - 'web_api_url' => 'APIアクセスURL', - 'wechat_aid' => 'WeChatアプリID', - 'wechat_cid' => 'WeChat企業ID', - 'wechat_encodingAESKey' => 'WeChatエンコーディングキー', - 'wechat_qrcode' => 'WeChat QRコード', - 'wechat_secret' => 'WeChatシークレット', - 'wechat_token' => 'WeChatトークン', 'hint' => [ + 'AppStore_id' => 'iOSソフトウェア設定ガイドで使用するAppleアカウント', + 'AppStore_password' => 'iOSソフトウェア設定ガイドで使用するAppleパスワード', 'account_expire_notification' => 'ユーザーにアカウントの有効期限を通知', 'active_times' => '24時間以内にメールでアカウントを有効化できる回数', 'admin_invite_days' => '管理者が生成する招待コードの有効期限', 'aff_salt' => '空白の場合、招待リンクにユーザーIDが表示されます。任意の英数字を入力すると、ユーザーIDが暗号化されます。', - 'AppStore_id' => 'iOSソフトウェア設定ガイドで使用するAppleアカウント', - 'AppStore_password' => 'iOSソフトウェア設定ガイドで使用するAppleパスワード', 'auto_release_port' => '封鎖/有効期限切れ '.config('tasks.release_port').' 日後に自動的にポートを解放', 'bark_key' => 'iOSデバイスにBarkアプリをインストールし、URLの後に続く一連の文字列を入力。Barkを有効にするには、この値を必ず入力してください。', 'captcha_key' => '設定ガイドはこちらを参照してください。', @@ -650,6 +518,7 @@ return [ 'f2fpay_private_key' => '生成された秘密鍵ソフトウェアから得られるアプリの秘密鍵。', 'f2fpay_public_key' => '注意:これはアプリの公開鍵ではありません。', 'forbid_mode' => '指定された地域のIPをブロックします。ブロックされていない地域は通常アクセスできます。', + 'iYuu_token' => 'IYUUを有効にするには、この値を必ず入力してください(IYUUトークンを申請)。', 'invite_num' => 'ユーザーがデフォルトで持っている招待数。', 'is_activate_account' => '有効にすると、ユーザーはメールでアカウントを有効化する必要があります。', 'is_ban_status' => '(慎重に)アカウント全体を禁止すると、アカウントのすべてのデータがリセットされ、ユーザーはログインできなくなります。無効にした場合、ユーザーの代理のみを禁止します。', @@ -664,14 +533,14 @@ return [ 'is_register' => '無効にすると、登録できません。', 'is_subscribe_ban' => '有効にすると、ユーザーのサブスクリプションリンクリクエストが設定された閾値を超えた場合、自動的に禁止されます。', 'is_traffic_ban' => '1時間以内にデータ使用量が異常な閾値を超えた場合、自動的にアカウントを禁止します(代理のみ禁止)。', - 'iYuu_token' => 'IYUUを有効にするには、この値を必ず入力してください(IYUUトークンを申請)。', 'maintenance_content' => 'カスタムメンテナンス情報。', - 'maintenance_mode' => "有効にすると、ユーザーはメンテナンスページにリダイレクトされます。管理者は:urlでログインできます。", + 'maintenance_mode' => '有効にすると、ユーザーはメンテナンスページにリダイレクトされます。管理者は:urlでログインできます。', 'maintenance_time' => 'メンテナンスページのカウントダウンに使用されます。', 'min_port' => 'ポート範囲:1000〜65535。', 'node_blocked_notification' => '毎時ノードのブロックを検出し、管理者に通知します。', 'node_daily_notification' => '各ノードの前日のデータ使用量を報告します。', 'node_offline_notification' => '10分ごとにノードのオフライン状況を検出し、管理者に通知します。', + 'node_renewal_notification' => 'ノードの有効期限が切れる7日前、3日前、1日前に管理者に更新をリマインドします。', 'oauth_path' => 'まず.ENVにプラットフォームを追加し、有効にしてください。', 'offline_check_times' => '24時間以内にN回通知された後、通知を停止します。', 'password_reset_notification' => '有効にすると、ユーザーはパスワードをリセットできます。', @@ -707,9 +576,10 @@ return [ 'traffic_ban_value' => '1時間以内にこの値を超えた場合、自動的にアカウントが禁止されます。', 'traffic_limit_time' => '再度チェックインできるまでの時間間隔。', 'traffic_warning_percent' => '【データ使用量通知】の開始閾値。毎日ユーザーに通知します。', - 'username_type' => 'ユーザーアカウントのデフォルトのタイプ。デフォルトはメールアドレスです。', 'user_invite_days' => 'ユーザーが生成する招待コードの有効期限。', + 'username_type' => 'ユーザーアカウントのデフォルトのタイプ。デフォルトはメールアドレスです。', 'v2ray_tls_provider' => 'ノードの設定がこのTLS設定を上書きします。', + 'web_api_url' => '例:'.config('app.url'), 'webmaster_email' => 'エラーメッセージに表示される管理者の連絡先メールアドレス。', 'website_analytics' => 'ウェブサイトの分析JavaScriptコード。', 'website_callback_url' => 'DNS汚染による支払いコールバックの失敗を防ぐために、http://またはhttps://を含める必要があります。', @@ -717,97 +587,247 @@ return [ 'website_name' => 'メール送信時に表示されるウェブサイト名。', 'website_security_code' => '空白でない場合、セキュリティエントリにセキュリティコードを追加してアクセスする必要があります。', 'website_url' => 'パスワードリセットやオンライン支払いに必要なURL。', - 'web_api_url' => '例:'.config('app.url'), 'wechat_aid' => 'WeChatのアプリ管理で作成されたアプリのAgentId。', 'wechat_cid' => 'WeChatの企業情報から取得した企業ID。', 'wechat_encodingAESKey' => 'アプリ管理 -> アプリ設定 -> API受信設定 -> EncodingAESKey。', 'wechat_secret' => 'アプリのシークレット(企業WeChatをダウンロードする必要があります)。', '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のトークンを入力 -> 更新をクリック', - 'pushplus_token' => 'ServerChanで申請してください。', - 'dingTalk_access_token' => 'カスタムボットのWebHookのaccess_token', - 'dingTalk_secret' => 'カスタムボットのサイン後に表示されるシークレット', - 'wechat_aid' => 'アプリのAgentId', - 'wechat_cid' => 'WeChatの企業IDを入力 -> 更新をクリック', - 'wechat_secret' => 'アプリのシークレット', - 'tg_chat_token' => 'Telegramで申請してください。', - 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'iYuu_token' => 'IYUUトークン', + 'invite_num' => 'デフォルト招待数', + 'is_AliPay' => 'Alipay支払い', + 'is_QQPay' => 'QQウォレット', + 'is_WeChatPay' => 'WeChat支払い', + 'is_activate_account' => 'アカウント有効化', + 'is_ban_status' => '有効期限自動禁止', + 'is_captcha' => 'Captchaモード', + 'is_checkin' => 'チェックインデータ追加', + 'is_clear_log' => 'ログ自動クリア', + 'is_custom_subscribe' => 'カスタムサブスクリプション', + 'is_email_filtering' => 'メールフィルタリング', + 'is_forbid_robot' => 'ロボットアクセス禁止', + 'is_free_code' => '無料招待コード', + 'is_invite_register' => '招待登録', + 'is_otherPay' => 'カスタム支払い', + 'is_rand_port' => 'ランダムポート', + 'is_register' => 'ユーザー登録', + 'is_subscribe_ban' => '異常サブスクリプションリクエスト自動禁止', + 'is_traffic_ban' => '異常データ使用自動禁止', + 'maintenance_content' => 'メンテナンス内容', + 'maintenance_mode' => 'メンテナンスモード', + 'maintenance_time' => 'メンテナンス終了時間', + 'min_port' => 'ポート範囲', + 'min_rand_traffic' => 'データ範囲', + 'node_blocked_notification' => 'ノードブロック通知', + 'node_daily_notification' => 'ノード使用レポート', + 'node_offline_notification' => 'ノードオフライン通知', + 'node_renewal_notification' => 'ノード更新通知', + 'notification' => [ + 'channel' => [ + 'bark' => 'Bark', + 'dingtalk' => 'DingTalk', + 'email' => 'メール', + 'iyuu' => 'IYUU', + 'pushdeer' => 'PushDeer', + 'pushplus' => 'PushPlus', + 'serverchan' => 'ServerChan', + 'site' => 'サイト内通知', + 'telegram' => 'Telegram', + 'tg_chat' => 'TGチャット', + 'wechat' => '企業WeChat', + ], + 'send_test' => 'テストメッセージを送信', + 'test' => [ + 'content' => 'テスト内容', + 'success' => '送信が成功しました。携帯電話でプッシュ通知を確認してください。', + 'title' => 'これはテストのタイトルです', + 'unknown_channel' => '不明なチャネル', + ], ], + 'oauth_path' => 'サードパーティログインプラットフォーム', + 'offline_check_times' => 'オフライン通知回数', + 'params_required' => 'この:attributeの必要なパラメータを先に完了してください!', + 'password_reset_notification' => 'パスワードリセット通知', + 'paybeaver_app_id' => 'App ID', + 'paybeaver_app_secret' => 'Appシークレット', + 'payjs_key' => '通信キー', + 'payjs_mch_id' => '商人ID', 'payment' => [ 'attribute' => '支払い設定', 'channel' => [ 'alipay' => 'Alipay F2F', 'codepay' => 'CodePay', 'epay' => 'ePay', + 'manual' => '手動支払い', + 'paybeaver' => 'PayBeaver', 'payjs' => 'PayJs', 'paypal' => 'PayPal', 'stripe' => 'Stripe', - 'paybeaver' => 'PayBeaver', 'theadpay' => 'THeadPay', - 'manual' => '手動支払い', ], 'hint' => [ 'alipay' => 'この機能を使用するには、Ant Financial Services Open Platformで権限とアプリケーションを申請する必要があります。', 'codepay' => 'CodePayにこちらから登録し、ソフトウェアをダウンロードして設定してください。', + 'manual' => '設定後、ユーザーエンドに対応する表示が自動的に表示されます。', + 'paybeaver' => 'PayBeaverにこちらから登録してください。', 'payjs' => 'PayJsにこちらから登録してください。', 'paypal' => '商人アカウントでAPI資格情報申請ページにログインし、同意して設定情報を取得してください。', - 'paybeaver' => 'PayBeaverにこちらから登録してください。', 'theadpay' => 'THeadPayにこちらから登録してください。', - 'manual' => '設定後、ユーザーエンドに対応する表示が自動的に表示されます。', ], ], - 'notification' => [ - 'channel' => [ - 'telegram' => 'Telegram', - 'wechat' => '企業WeChat', - 'dingtalk' => 'DingTalk', - 'email' => 'メール', - 'bark' => 'Bark', - 'serverchan' => 'ServerChan', - 'pushdeer' => 'PushDeer', - 'pushplus' => 'PushPlus', - 'iyuu' => 'IYUU', - 'tg_chat' => 'TGチャット', - 'site' => 'サイト内通知', - ], - 'send_test' => 'テストメッセージを送信', + 'payment_confirm_notification' => '手動支払い確認通知', + 'payment_received_notification' => '支払い成功通知', + 'paypal_app_id' => 'App ID', + 'paypal_client_id' => 'クライアントID', + 'paypal_client_secret' => 'クライアントシークレット', + 'placeholder' => [ + 'bark_key' => 'Barkのデバイスキーを入力 -> 更新をクリック', + 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'default_url' => 'デフォルトは :url', + 'dingTalk_access_token' => 'カスタムボットのWebHookのaccess_token', + 'dingTalk_secret' => 'カスタムボットのサイン後に表示されるシークレット', + 'iYuu_token' => 'IYUUトークンを入力 -> 更新をクリック', + 'pushDeer_key' => 'PushDeerのPush Keyを入力 -> 更新をクリック', + 'pushplus_token' => 'ServerChanで申請してください。', + 'server_chan_key' => 'ServerChanのSCKEYを入力 -> 更新をクリック', + 'telegram_token' => 'Telegramのトークンを入力 -> 更新をクリック', + 'tg_chat_token' => 'Telegramで申請してください。', + 'wechat_aid' => 'アプリのAgentId', + 'wechat_cid' => 'WeChatの企業IDを入力 -> 更新をクリック', + 'wechat_secret' => 'アプリのシークレット', ], - 'forbid' => [ - 'mainland' => '中国本土を禁止', - 'china' => '中国を禁止', - 'oversea' => '海外を禁止', + 'pushDeer_key' => 'PushDeerキー', + 'pushplus_token' => 'PushPlusトークン', + 'rand_subscribe' => 'ランダムサブスクリプション', + 'redirect_url' => 'リダイレクトURL', + 'referral' => [ + 'loop' => '継続リベート', + 'once' => '初回購入リベート', ], + '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' => 'パブリックキー', + 'stripe_secret_key' => 'シークレットキー', + 'stripe_signing_secret' => 'Webhook署名シークレット', + 'subject_name' => 'カスタム商品名', + 'subscribe_ban_times' => 'サブスクリプションリクエストしきい値', + 'subscribe_domain' => 'ノードサブスクリプションURL', + 'subscribe_max' => 'サブスクリプションノード数', + 'telegram_token' => 'Telegramトークン', + 'tg_chat_token' => 'TGチャットトークン', + 'theadpay_key' => 'THeadPayキー', + 'theadpay_mchid' => 'THeadPay商人ID', + 'theadpay_url' => '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ライセンス', + 'user_invite_days' => 'ユーザー-招待コード有効期', 'username' => [ + 'any' => '任意のユーザー名', 'email' => 'メールアドレス', 'mobile' => '携帯電話番号', - 'any' => '任意のユーザー名', ], - 'active_account' => [ - 'before' => '登録前に有効化', - 'after' => '登録後に有効化', + 'username_type' => 'ユーザー名タイプ', + 'v2ray_license' => 'V2Rayライセンス', + 'v2ray_tls_provider' => 'V2Ray TLS設定', + 'web_api_url' => 'APIアクセスURL', + 'webmaster_email' => '管理者メール', + 'website_analytics' => 'ウェブサイト分析コード', + 'website_callback_url' => '支払いコールバックURL', + 'website_customer_service' => 'カスタマーサービスコード', + 'website_home_logo' => 'ホームページロゴ', + 'website_logo' => 'サイトロゴ', + 'website_name' => 'ウェブサイト名', + 'website_security_code' => 'ウェブサイトセキュリティコード', + 'website_url' => 'ウェブサイトURL', + 'wechat_aid' => 'WeChatアプリID', + 'wechat_cid' => 'WeChat企業ID', + 'wechat_encodingAESKey' => 'WeChatエンコーディングキー', + 'wechat_qrcode' => 'WeChat QRコード', + 'wechat_secret' => 'WeChatシークレット', + 'wechat_token' => 'WeChatトークン', + ], + 'system_generate' => 'システム生成', + 'ticket' => [ + 'close_confirm' => 'このチケットを閉じてもよろしいですか?', + 'counts' => '合計 :num チケット', + 'error' => '不明なエラーです。ログを確認してください。', + 'inviter_info' => '招待者情報', + 'self_send' => '自分自身のためにチケットを作成することはできません!', + 'send_to' => 'ターゲットユーザーの情報を入力してください', + 'title' => 'チケットリスト', + 'user_info' => 'ユーザー情報', + ], + 'times' => '回', + 'tools' => [ + 'analysis' => [ + 'file_missing' => ':file_name が存在しません。先にファイルを作成してください。', + 'not_enough' => '記録が15,000未満のため、分析できません。', + 'req_url' => '最近のリクエストURL記録', + 'title' => 'SSRログ分析シングルノード用', ], - 'captcha' => [ - 'standard' => '標準Captcha', - 'geetest' => 'Geetest', - 'recaptcha' => 'Google reCaptcha', - 'hcaptcha' => 'hCaptcha', - 'turnstile' => 'Turnstile', + 'convert' => [ + 'content_placeholder' => '変換する構成情報を入力してください。', + 'file_missing' => 'ファイルが見つかりません。ディレクトリのアクセス権を確認してください。', + 'missing_error' => '変換に失敗しました:設定情報に [port_password] フィールドが欠落しているか、またはこのフィールドが空です。', + 'params_unknown' => 'パラメータ例外', + 'title' => 'フォーマット変換ShadowsocksからShadowsocksRへ', ], - 'referral' => [ - 'once' => '初回購入リベート', - 'loop' => '継続リベート', + 'decompile' => [ + 'attribute' => '逆コンパイル構成リンク', + 'content_placeholder' => '逆コンパイルするShadowsocksRリンクを入力してください。行区切りで入力。', + 'title' => '逆コンパイル構成情報', + ], + 'import' => [ + 'file_error' => '未知のエラーが発生しました。再度アップロードしてください。', + 'file_required' => 'アップロードするファイルを選択してください', + 'file_type_error' => ':type ファイルのみアップロードが許可されています。', + 'format_error' => 'コンテンツフォーマットの解析エラーが発生しました。指定されたフォーマットに準拠した:typeファイルをアップロードしてください。', ], ], - 'set_to' => ':attributeに設定', - 'minute' => '分', - 'query' => 'クエリ', - 'optional' => 'オプション', - 'require' => '必須', + 'unselected_hint' => '割り当てられるルールはここで検索できます', + 'user' => [ + 'admin_deletion' => 'システム管理者は削除できません', + 'bulk_account_quantity' => '一括生成されたアカウントの数', + 'connection_test' => '接続テスト', + 'counts' => '合計 :num アカウント', + 'group' => [ + 'counts' => '合計 :num グループ', + 'name' => 'グループ名', + 'title' => 'ユーザーグループコントロール(ノードは複数のグループに属することができますが、ユーザーは1つのグループにのみ属することができます。ユーザーが表示/利用できるノードについては、グループがレベルより優先されます)', + ], + 'info' => [ + 'account' => 'アカウント情報', + 'expired_date_hint' => '空白の場合、デフォルトで1年間有効', + 'proxy' => 'プロキシ情報', + 'recharge_placeholder' => '負の値を入力すると残高が減少します', + 'reset_date_hint' => '次回のデータリセット日', + 'switch' => 'アイデンティティを切り替え', + 'uuid_hint' => 'V2RayのUUID', + ], + 'online_monitor' => 'オンラインモニタリング', + 'proxies_config' => '【:username】の接続構成情報', + 'proxy_info' => '構成情報', + 'reset_confirm' => [0 => '【', 1 => '】のデータをリセットしてもよろしいですか?'], + 'reset_traffic' => 'データリセット', + 'traffic_monitor' => 'トラフィック統計', + 'update_help' => '更新に成功しました。戻りますか?', + 'user_view' => 'ユーザー視点に切り替え', + ], + 'user_dashboard' => 'ユーザーダッシュボード', + 'yes' => 'はい', + 'zero_unlimited_hint' => '設定しない/0の場合、無制限', ]; diff --git a/resources/lang/ja/auth.php b/resources/lang/ja/auth.php index 3e2c932d..38bf9148 100644 --- a/resources/lang/ja/auth.php +++ b/resources/lang/ja/auth.php @@ -40,27 +40,18 @@ return [ ], 'failed' => '無効な資格情報です。', 'invite' => [ - 'attribute' => '招待コード', - 'error' => [ - 'unavailable' => '無効な招待コードです、再試行してください。', - ], 'get' => '招待コードを取得', 'not_required' => '招待コードは不要です、直接登録できます!', + 'unavailable' => '無効な招待コードです、再試行してください。', ], 'login' => 'ログイン', 'logout' => 'ログアウト', 'maintenance' => 'メンテナンス', 'maintenance_tip' => 'メンテナンス中', 'oauth' => [ - 'bind_failed' => 'バインドに失敗しました', - 'bind_success' => 'バインドに成功しました', 'login_failed' => 'サードパーティのログインに失敗しました!', - 'rebind_success' => '再バインドに成功しました', 'register' => 'クイック登録', - 'register_failed' => '登録に失敗しました', 'registered' => '既に登録されています、直接ログインしてください。', - 'unbind_failed' => 'バインド解除に失敗しました', - 'unbind_success' => 'バインド解除に成功しました', ], 'one-click_login' => 'ソーシャルログイン', 'optional' => 'オプション', @@ -73,7 +64,6 @@ return [ 'error' => [ 'demo' => 'デモモードでは管理者パスワードを変更できません。', 'disabled' => 'パスワードリセットは無効です、サポートが必要な場合は:emailに連絡してください。', - 'failed' => 'パスワードリセットに失敗しました。', 'same' => '新しいパスワードは古いパスワードと同じにできません、再入力してください。', 'throttle' => '24時間以内に:time回しかパスワードをリセットできません、頻繁な操作は避けてください。', 'wrong' => 'パスワードが間違っています、再試行してください。', @@ -91,7 +81,6 @@ return [ ], 'failed' => '登録に失敗しました、後でもう一度お試しください。', 'promotion' => 'アカウントをお持ちでない方は、まず', - 'success' => '登録に成功しました', ], 'remember_me' => 'ログイン状態を保持する', 'request' => 'リクエスト', diff --git a/resources/lang/ja/common.php b/resources/lang/ja/common.php index 14df00fd..3f0f0644 100644 --- a/resources/lang/ja/common.php +++ b/resources/lang/ja/common.php @@ -3,141 +3,149 @@ declare(strict_types=1); return [ - 'hour' => '{1} 時間|{2} 時', 'account' => 'アカウント', + 'action' => 'アクション', + 'active_item' => ':attributeを有効化', + 'add' => '追加', + 'advance' => '進む', + 'all' => 'すべて', + 'applied' => ':attributeが適用されました', + 'apply' => '適用', 'available_date' => '有効期間', - 'created_at' => '作成日', - 'expired_at' => '有効期限', - 'updated_at' => '更新日', - 'latest_at' => '最近の活動', + 'avatar' => 'アバター', 'back' => '戻る', 'back_to' => ':pageに戻る', + 'bark' => [ + 'custom' => 'カスタム情報', + 'node_status' => 'ノードステータス', + ], 'cancel' => 'キャンセル', + 'change' => '変更', 'close' => '閉じる', 'close_item' => ':attributeを閉じる', 'confirm' => '確認', 'continue' => '続ける', - 'open' => '開く', - 'send' => '送信', - 'view' => '表示', - 'reset' => 'リセット', + 'convert' => '変換', 'copy' => [ 'attribute' => 'コピー', - 'success' => 'コピー成功', 'failed' => 'コピー失敗、手動でコピーしてください', + 'success' => 'コピー成功', ], - 'add' => '追加', - 'free' => '無料', - 'change' => '変更', - 'submit' => '送信', - 'submit_item' => ':attributeを送信', - 'generate' => '生成', - 'generate_item' => ':attributeを生成', - 'to_safari' => [0 => '右上のボタンをクリック', 1 => 'し、', 2 => 'Safariで開く', 3 => 'を選択して正常にアクセスしてください!'], - 'update_browser' => [0 => 'お使いの', 1 => 'ブラウザは古いです', 2 => '。ブラウザを', 3 => 'アップグレードしてください', 4 => '。'], - 'apply' => '適用', - 'avatar' => 'アバター', + 'create' => '作成する', + 'created_at' => '作成日', 'customize' => 'カスタマイズ', - 'all' => 'すべて', - 'default' => 'デフォルト', - 'download' => 'ダウンロード', - 'goto' => '移動', - 'warning' => '警告', - 'success' => '成功', - 'success_item' => ':attributeが成功しました', - 'failed' => '失敗', - 'failed_item' => ':attributeが失敗しました', - 'update' => '更新', - 'update_action' => ':actionを更新', - 'none' => 'なし', - 'new' => '新しい', - 'sorry' => '申し訳ありません', - 'applied' => ':attributeが適用されました', - 'active_item' => ':attributeを有効化', - 'error' => 'エラー', - 'toggle' => '切り替え', - 'toggle_action' => ':actionを切り替え', - 'request_url' => 'リクエストURL', - 'function' => [ - 'navigation' => 'ナビゲーション', - 'menubar' => 'メニューバー', - 'fullscreen' => '全画面表示', - ], 'days' => [ 'attribute' => '{1} 日間|{2} 日目', + 'next' => '翌日', 'weekend' => '週末', 'work' => '平日', - 'next' => '翌日', ], - 'qrcode' => ':attribute QRコード', + 'default' => 'デフォルト', + 'delete' => '削除', 'deleted' => '削除されました', 'deleted_item' => ':attributeが削除されました', - 'print' => '印刷', - 'unlimited' => '無制限', - 'payment' => [ - 'credit' => '残高', - 'alipay' => 'アリペイ', - 'qq' => 'QQウォレット', - 'wechat' => 'ウィーチャットペイ', - 'crypto' => '暗号通貨', - 'manual' => '手動支払い', - 'status' => [ - 'wait' => '支払い待ち', - ], + 'developing' => '開発中です、お楽しみに!', + 'download' => 'ダウンロード', + 'edit' => '編集', + 'error' => 'エラー', + 'error_action_item' => ':action:attribute エラー', + 'error_item' => ':attribute エラー', + 'exists_error' => ':attribute の下に関連アカウントがあります。先に関連付けを解除してください!', + 'expired_at' => '有効期限', + 'export' => 'エクスポートする', + 'failed' => '失敗', + 'failed_action_item' => ':action:attribute 失敗', + 'failed_item' => ':attributeが失敗しました', + 'free' => '無料', + 'function' => [ + 'fullscreen' => '全画面表示', + 'menubar' => 'メニューバー', + 'navigation' => 'ナビゲーション', ], + 'generate' => '生成', + 'generate_item' => ':attributeを生成', + 'goto' => '移動', + 'hour' => '{1} 時間|{2} 時', + 'import' => 'インポート', + 'latest_at' => '最近の活動', + 'more' => 'もっと', + 'new' => '新しい', + 'none' => 'なし', + 'open' => '開く', + 'or' => 'または', 'order' => [ 'status' => [ 'canceled' => 'キャンセルされました', 'completed' => '完了しました', - 'prepaid' => '前払い', 'ongoing' => '進行中', + 'prepaid' => '前払い', 'review' => '審査中', ], ], + 'payment' => [ + 'alipay' => 'アリペイ', + 'credit' => '残高', + 'crypto' => '暗号通貨', + 'manual' => '手動支払い', + 'qq' => 'QQウォレット', + 'wechat' => 'ウィーチャットペイ', + ], + 'print' => '印刷', + 'qrcode' => ':attribute QRコード', + 'random_generate' => 'ランダム生成するには空のままにしてください', 'recommend' => '推奨', - 'advance' => '進む', - 'action' => 'アクション', + 'request' => 'リクエスト', + 'request_failed' => 'リクエストに失敗しました、再試行してください', + 'request_url' => 'リクエストURL', + 'reset' => 'リセット', 'search' => '検索', - 'edit' => '編集', - 'delete' => '削除', + 'send' => '送信', + 'sorry' => '申し訳ありません', 'status' => [ + 'applying' => '申請中', 'attribute' => 'ステータス', - 'inactive' => '非アクティブ', - 'disabled' => '無効', + 'available' => '利用可能', 'banned' => '禁止', - 'normal' => '正常', + 'closed' => '閉じた', + 'disabled' => '無効', 'enabled' => '有効', 'expire' => '期限切れ', + 'inactive' => '非アクティブ', 'limited' => '制限付き', - 'run_out' => 'データ使用済み', - 'unused' => '未使用', - 'used' => '使用済み', - 'closed' => '閉じた', - 'applying' => '申請中', - 'withdrawn' => '引き出し済み', - 'unwithdrawn' => '未引き出し', - 'reply' => '返信済み', + 'normal' => '正常', + 'paid' => '支払い済み', + 'pass' => '合格', + 'payment_pending' => '支払い待ち', 'pending' => '保留中', - 'unknown' => '不明', - 'available' => '利用可能', + 'pending_dispatch' => '配送待ち', 'reject' => '拒否', 'rejected' => '却下されました', + 'reply' => '返信済み', 'review' => '審査中', 'reviewed' => '審査済み', - 'paid' => '支払い済み', - 'payment_pending' => '支払い待ち', - 'pass' => '合格', + 'run_out' => 'データ使用済み', 'send_to_credit' => '残高への支払い', - 'waiting_tobe_send' => '送信待ち', + 'unknown' => '不明', + 'unused' => '未使用', + 'used' => '使用済み', + 'withdrawal_pending' => '未引き出し', + 'withdrawn' => '引き出し済み', ], 'stay_unchanged' => '変更しない場合は空のままにしてください', - 'random_generate' => 'ランダム生成するには空のままにしてください', - 'request_failed' => 'リクエストに失敗しました、再試行してください', - 'convert' => '変換', - 'import' => 'インポート', - 'or' => 'または', - 'more' => 'もっと', + 'storage_logo' => 'ロゴストレージ', + 'store' => 'ストレージ', + 'submit' => '送信', + 'success' => '成功', + 'success_action_item' => ':action:attribute 成功', + 'success_item' => ':attributeが成功しました', 'to' => 'へ', 'to_be_send' => '送信待ち', - 'developing' => '開発中です、お楽しみに!', + 'to_safari' => '右上隅のアイコンをクリックし、Safari Safari で開くを選択すると、当サイトに正常にアクセスできます!', + 'toggle' => '切り替え', + 'toggle_action' => ':actionを切り替え', + 'unlimited' => '無制限', + 'update' => '更新', + 'updated_at' => '更新日', + 'view' => '表示', + 'warning' => '警告', ]; diff --git a/resources/lang/ja/errors.php b/resources/lang/ja/errors.php index e19e3c84..09eff367 100644 --- a/resources/lang/ja/errors.php +++ b/resources/lang/ja/errors.php @@ -8,29 +8,29 @@ return [ 'bots' => 'ボットアクセスが検出されました。アクセス禁止', 'china' => '中国のIPまたはプロキシアクセスが検出されました。アクセス禁止', 'oversea' => '海外のIPまたはプロキシアクセスが検出されました。アクセス禁止', - 'unknown' => '不明な禁止アクセスモード!システム設定で[アクセス禁止モード]を変更してください!', 'redirect' => '(:ip :url)がサブスクリプションリンクを通じてアクセスしていることを検出しました。強制リダイレクトを実行します。', + 'unknown' => '不明な禁止アクセスモード!システム設定で[アクセス禁止モード]を変更してください!', ], + 'get_ip' => 'IP情報の取得に失敗しました', 'log' => 'ログ', 'refresh' => 'リフレッシュ', 'refresh_page' => 'ページをリフレッシュしてから再度アクセスしてください', 'report' => 'エラーにレポートが含まれています:', - 'safe_enter' => '安全な入口', 'safe_code' => '安全コードを入力してください', + 'safe_enter' => '安全な入口', + 'subscribe' => [ + 'banned_until' => 'アカウントは:timeまで禁止されています。解除後に更新してください!', + 'expired' => 'アカウントの有効期限が切れています。更新してください!', + 'none' => '利用可能なノードがありません', + 'out' => 'データが不足しています。再購入またはデータをリセットしてください!', + 'question' => 'アカウントに問題があります。公式サイトをご覧ください!', + 'sub_banned' => 'リンクが禁止されました。詳細は公式サイトをご覧ください', + 'unknown' => '無効なリンクです。新しいリンクを取得してください!', + 'user' => '無効なリンクです。アカウントが存在しません!新しいリンクを取得してください!', + 'user_disabled' => 'アカウントが無効です!', + ], 'title' => '⚠️ エラーが発生しました', 'unsafe_enter' => '安全でない入口', 'visit' => 'アクセスしてください', 'whoops' => 'おっと!', - 'get_ip' => 'IP情報の取得に失敗しました', - 'subscribe' => [ - 'unknown' => '無効なリンクです。新しいリンクを取得してください!', - 'sub_banned' => 'リンクが禁止されました。詳細は公式サイトをご覧ください', - 'user' => '無効なリンクです。アカウントが存在しません!新しいリンクを取得してください!', - 'user_disabled' => 'アカウントが無効です!', - 'banned_until' => 'アカウントは:timeまで禁止されています。解除後に更新してください!', - 'out' => 'データが不足しています。再購入またはデータをリセットしてください!', - 'expired' => 'アカウントの有効期限が切れています。更新してください!', - 'question' => 'アカウントに問題があります。公式サイトをご覧ください!', - 'none' => '利用可能なノードがありません', - ], ]; diff --git a/resources/lang/ja/model.php b/resources/lang/ja/model.php index 526bcf71..5ed5e50e 100644 --- a/resources/lang/ja/model.php +++ b/resources/lang/ja/model.php @@ -3,105 +3,114 @@ declare(strict_types=1); return [ - 'user' => [ - 'id' => 'ユーザーID', - 'attribute' => 'ユーザー', - 'nickname' => 'ニックネーム', - 'username' => 'ユーザー名', - 'password' => 'パスワード', - 'credit' => '残高', - 'invite_num' => '利用可能な招待数', - 'reset_date' => 'データリセット日', - 'port' => 'ポート', - 'traffic_used' => '使用済みデータ', - 'service' => 'プロキシサービス', - 'group' => 'ユーザーグループ', - 'account_status' => 'アカウントステータス', - 'proxy_status' => 'プロキシステータス', - 'expired_date' => '有効期限', - 'role' => '権限', - 'wechat' => 'WeChat', - 'qq' => 'QQ', - 'remark' => '備考', - 'uuid' => 'VMess UUID', - 'proxy_passwd' => 'プロキシパスワード', - 'proxy_method' => '暗号化方式', - 'usable_traffic' => '利用可能なデータ', - 'proxy_protocol' => 'プロトコル', - 'proxy_obfs' => '難読化', - 'speed_limit' => '速度制限', - 'inviter' => '招待者', - 'created_date' => '登録日', + 'aff' => [ + 'amount' => '注文金額', + 'commission' => 'コミッション', + 'created_at' => '注文日', + 'invitee' => '購入者', + 'updated_at' => '処理日', + ], + 'article' => [ + 'attribute' => '記事', + 'category' => 'カテゴリー', + 'created_at' => '公開日', + 'language' => '言語', + 'logo' => 'カバー', + 'updated_at' => '更新日', ], 'common' => [ - 'extend' => '拡張情報', - 'sort' => 'ソート', 'description' => '説明', - 'type' => 'タイプ', + 'extend' => '拡張情報', 'level' => 'レベル', + 'sort' => 'ソート', + 'type' => 'タイプ', ], 'country' => [ 'code' => '国コード', 'icon' => '国旗', 'name' => '国名', ], - 'subscribe' => [ - 'code' => 'サブスクリプションコード', - 'req_times' => 'リクエスト回数', - 'updated_at' => '最終リクエスト時間', - 'ban_time' => '禁止時間', - 'ban_desc' => '禁止理由', - 'req_ip' => 'リクエストIP', - 'req_header' => 'リクエストヘッダー', + 'coupon' => [ + 'attribute' => 'クーポン', + 'groups' => 'グループ制限', + 'levels' => 'レベル制限', + 'logo' => 'ロゴ', + 'minimum' => '最低利用額', + 'name' => '名前', + 'newbie' => '新規ユーザー専用', + 'num' => '数量', + 'priority' => '優先度', + 'services_blacklist' => 'ブラックリスト商品', + 'services_whitelist' => 'ホワイトリスト商品', + 'sn' => 'コード', + 'usable_times' => '使用制限', + 'used' => '個人制限', + 'users_blacklist' => 'ブラックリストユーザー', + 'users_whitelist' => 'ホワイトリストユーザー', + 'value' => '価値', ], - 'oauth' => [ - 'type' => 'チャンネル', - 'identifier' => '識別子', + 'goods' => [ + 'attribute' => '商品', + 'available_date' => '有効期間', + 'category' => 'カテゴリー', + 'color' => '色', + 'hot' => 'ベストセラー', + 'info' => 'カスタム情報', + 'invite_num' => 'ボーナス招待数', + 'limit_num' => '購入制限', + 'logo' => 'ロゴ', + 'name' => '名前', + 'period' => 'リセットサイクル', + 'price' => '価格', + 'renew' => 'データ更新価格', + 'traffic' => 'データ許容量', + 'user_limit' => 'ユーザー速度制限', ], - 'user_group' => [ - 'attribute' => 'ユーザーグループ', - 'name' => 'グループ名', - 'nodes' => 'ノード', + 'ip' => [ + 'info' => '位置情報', + 'network_type' => 'ネットワークタイプ', ], 'node' => [ 'attribute' => 'ノード', - 'id' => 'ノードID', - 'name' => '名前', - 'domain' => 'ドメイン', - 'static' => 'ステータス', - 'online_user' => 'オンラインユーザー', + 'client_limit' => 'クライアント制限', + 'country' => '国', 'data_consume' => 'データ消費', 'data_rate' => 'データ比率', 'ddns' => 'DDNS', + 'detection' => 'ブロック検出', + 'display' => '表示とサブスクリプション', + 'domain' => 'ドメイン', + 'id' => 'ノードID', 'ipv4' => 'IPv4アドレス', 'ipv6' => 'IPv6アドレス', - 'push_port' => 'プッシュポート', - 'rule_group' => 'ルールグループ', - 'traffic_limit' => '速度制限', - 'client_limit' => 'クライアント制限', 'label' => 'ラベル', - 'country' => '国', - 'udp' => 'UDP', - 'display' => '表示とサブスクリプション', - 'detection' => 'ブロック検出', 'method' => '暗号化方式', - 'protocol' => 'プロトコル', - 'protocol_param' => 'プロトコルパラメータ', + 'name' => '名前', + 'next_renewal_date' => '次回更新日', 'obfs' => '難読化', 'obfs_param' => '難読化パラメータ', - 'single' => 'シングルポート', - 'transfer' => 'リレー', + 'online_user' => 'オンラインユーザー', + 'protocol' => 'プロトコル', + 'protocol_param' => 'プロトコルパラメータ', + 'push_port' => 'プッシュポート', + 'relay_port' => 'リレーポート', + 'renewal_cost' => '請求額', 'service_port' => 'サービスポート', + 'single' => 'シングルポート', 'single_passwd' => 'シングルポートパスワード', + 'static' => 'ステータス', + 'subscription_term' => '契約期間', + 'traffic_limit' => '速度制限', + 'transfer' => 'リレー', + 'udp' => 'UDP', 'v2_alter_id' => '代替ID', - 'v2_net' => 'ネットワーク', 'v2_cover' => 'カバー', 'v2_host' => 'ホスト', + 'v2_net' => 'ネットワーク', 'v2_path' => 'パスまたはキー', 'v2_sni' => 'SNI', 'v2_tls' => 'TLS', 'v2_tls_provider' => 'TLS設定', - 'relay_port' => 'リレーポート', ], 'node_auth' => [ 'attribute' => 'ノード認証', @@ -111,36 +120,44 @@ return [ 'node_cert' => [ 'attribute' => '証明書', 'domain' => 'ドメイン', + 'expired_date' => '有効期限', + 'issuer' => '発行者', 'key' => 'キー', 'pem' => '証明書', - 'issuer' => '発行者', 'signed_date' => '発行日', - 'expired_date' => '有効期限', + ], + 'notification' => [ + 'address' => '受信者', + 'created_at' => '送信日', + 'status' => 'ステータス', + ], + 'oauth' => [ + 'identifier' => '識別子', + 'type' => 'チャンネル', ], 'order' => [ 'attribute' => '注文', 'id' => '注文ID', 'original_price' => '元の価格', - 'price' => '支払金額', 'pay_way' => '支払い方法', + 'price' => '支払金額', 'status' => 'ステータス', ], - 'goods' => [ - 'attribute' => '商品', + 'permission' => [ + 'attribute' => '権限', + 'description' => '説明', + 'name' => 'ルート名', + ], + 'referral' => [ + 'amount' => '金額', + 'created_at' => '申請日', + 'id' => '申請ID', + 'user' => '申請者', + ], + 'role' => [ + 'attribute' => '役割', 'name' => '名前', - 'price' => '価格', - 'category' => 'カテゴリー', - 'renew' => 'データ更新価格', - 'user_limit' => 'ユーザー速度制限', - 'period' => 'リセットサイクル', - 'traffic' => 'データ許容量', - 'invite_num' => 'ボーナス招待数', - 'limit_num' => '購入制限', - 'available_date' => '有効期間', - 'hot' => 'ベストセラー', - 'color' => '色', - 'logo' => 'ロゴ', - 'info' => 'カスタム情報', + 'permissions' => '権限', ], 'rule' => [ 'attribute' => 'ルール', @@ -150,83 +167,67 @@ return [ 'rule_group' => [ 'attribute' => 'ルールグループ', 'name' => '名前', - 'type' => 'タイプ', 'rules' => 'ルール', + 'type' => 'タイプ', ], - 'role' => [ - 'attribute' => '役割', - 'name' => '名前', - 'permissions' => '権限', + 'subscribe' => [ + 'ban_desc' => '禁止理由', + 'ban_time' => '禁止時間', + 'code' => 'サブスクリプションコード', + 'req_header' => 'リクエストヘッダー', + 'req_ip' => 'リクエストIP', + 'req_times' => 'リクエスト回数', + 'updated_at' => '最終リクエスト時間', ], - 'permission' => [ - 'attribute' => '権限', - 'description' => '説明', - 'name' => 'ルート名', - ], - 'article' => [ - 'attribute' => '記事', - 'category' => 'カテゴリー', - 'language' => '言語', - 'logo' => 'カバー', - 'created_at' => '公開日', - 'updated_at' => '更新日', - ], - 'coupon' => [ - 'attribute' => 'クーポン', - 'name' => '名前', - 'sn' => 'コード', - 'logo' => 'ロゴ', - 'value' => '価値', - 'priority' => '優先度', - 'usable_times' => '使用制限', - 'minimum' => '最低利用額', - 'used' => '個人制限', - 'levels' => 'レベル制限', - 'groups' => 'グループ制限', - 'users_whitelist' => 'ホワイトリストユーザー', - 'users_blacklist' => 'ブラックリストユーザー', - 'services_whitelist' => 'ホワイトリスト商品', - 'services_blacklist' => 'ブラックリスト商品', - 'newbie' => '新規ユーザー専用', - 'num' => '数量', - ], - 'aff' => [ - 'invitee' => '購入者', - 'amount' => '注文金額', - 'commission' => 'コミッション', - 'updated_at' => '処理日', - 'created_at' => '注文日', - ], - 'referral' => [ - 'created_at' => '申請日', - 'user' => '申請者', - 'amount' => '金額', - 'id' => '申請ID', - ], - 'notification' => [ - 'address' => '受信者', - 'created_at' => '送信日', - 'status' => 'ステータス', - ], - 'ip' => [ - 'network_type' => 'ネットワークタイプ', - 'info' => '位置情報', - ], - 'user_traffic' => [ - 'upload' => 'アップロード', - 'download' => 'ダウンロード', - 'total' => '合計', - 'log_time' => '記録時間', - ], - 'user_data_modify' => [ - 'before' => '変更前のデータ', - 'after' => '変更後のデータ', - 'created_at' => '変更日時', + 'user' => [ + 'account_status' => 'アカウントステータス', + 'attribute' => 'ユーザー', + 'created_date' => '登録日', + 'credit' => '残高', + 'expired_date' => '有効期限', + 'id' => 'ユーザーID', + 'invite_num' => '利用可能な招待数', + 'inviter' => '招待者', + 'nickname' => 'ニックネーム', + 'password' => 'パスワード', + 'port' => 'ポート', + 'proxy_method' => '暗号化方式', + 'proxy_obfs' => '難読化', + 'proxy_passwd' => 'プロキシパスワード', + 'proxy_protocol' => 'プロトコル', + 'proxy_status' => 'プロキシステータス', + 'qq' => 'QQ', + 'remark' => '備考', + 'reset_date' => 'データリセット日', + 'role' => '権限', + 'service' => 'プロキシサービス', + 'speed_limit' => '速度制限', + 'traffic_used' => '使用済みデータ', + 'usable_traffic' => '利用可能なデータ', + 'username' => 'ユーザー名', + 'uuid' => 'VMess UUID', + 'wechat' => 'WeChat', ], 'user_credit' => [ - 'before' => '変更前の残高', 'after' => '変更後の残高', 'amount' => '変更金額', + 'before' => '変更前の残高', 'created_at' => '変更日時', ], + 'user_data_modify' => [ + 'after' => '変更後のデータ', + 'before' => '変更前のデータ', + 'created_at' => '変更日時', + ], + 'user_group' => [ + 'attribute' => 'ユーザーグループ', + 'name' => 'グループ名', + 'nodes' => 'ノード', + ], + 'user_traffic' => [ + 'download' => 'ダウンロード', + 'log_time' => '記録時間', + 'total' => '合計', + 'upload' => 'アップロード', + ], ]; diff --git a/resources/lang/ja/notification.php b/resources/lang/ja/notification.php index a28530a5..4ebd469e 100644 --- a/resources/lang/ja/notification.php +++ b/resources/lang/ja/notification.php @@ -3,35 +3,49 @@ declare(strict_types=1); return [ - 'attribute' => '通知', - 'new' => '新しいメッセージが:num件あります', - 'empty' => '現在、新しいメッセージはありません', - 'payment_received' => '支払いを受け取りました。金額: :amount。注文の詳細を見る', 'account_expired' => 'アカウントの有効期限通知', - 'account_expired_content' => 'あなたのアカウントは:days日後に有効期限が切れます。サービスの継続利用のため、早めに更新してください。', 'account_expired_blade' => 'アカウントは:days日後に有効期限が切れます。早めに更新してください', + 'account_expired_content' => 'あなたのアカウントは:days日後に有効期限が切れます。サービスの継続利用のため、早めに更新してください。', 'active_email' => '30分以内に認証を完了してください', + 'attribute' => '通知', + 'block_report' => '詳細なブロックログ:', 'close_ticket' => 'チケット番号:id、タイトル:titleがクローズされました', - 'view_web' => '公式サイトを見る', - 'view_ticket' => 'このチケットの進捗を見る', + 'data_anomaly' => 'データ異常ユーザー通知', + 'data_anomaly_content' => 'ユーザー:id、最近1時間のデータ(アップロード:upload、ダウンロード:download、合計:total)', + 'details' => '詳細を表示', + 'details_btn' => '下のボタンをクリックして、詳細をご覧ください。', + 'ding_bot_limit' => '各ボットは、グループに対して1分あたり最大20件のメッセージを送信できます。これを超えると、10分間のレート制限が適用されます。', + 'empty' => '現在、新しいメッセージはありません', + 'error' => '[:channel] メッセージプッシュの例外: :reason', + 'get_access_token_failed' => 'アクセストークンの取得に失敗しました!\nリクエストパラメーター: :body', + 'into_maintenance' => '自動的にメンテナンスモードに入る', + 'new' => '新しいメッセージが:num件あります', 'new_ticket' => '新しい返信があります。チケット:titleを確認してください', - 'reply_ticket' => 'チケットの返信::title', - 'ticket_content' => 'チケット内容:', + 'next_check_time' => '次回ノードブロック検出時間: :time', + 'node' => [ + 'download' => 'ダウンロードデータ', + 'total' => '総データ', + 'upload' => 'アップロードデータ', + ], 'node_block' => 'ノードブロック警告通知', 'node_offline' => 'ノードオフライン警告', 'node_offline_content' => '以下のノードが異常です。オフラインの可能性があります:', - 'block_report' => '詳細なブロックログ:', - 'traffic_warning' => 'データ使用警告', + 'node_renewal' => 'ノード更新のリマインダー', + 'node_renewal_blade' => '以下のノードがまもなく期限切れになります。事前に更新してください: :nodes', + 'node_renewal_content' => '以下のノードがまもなく期限切れになります。サービス中断を避けるために、期限前に更新してください。', + 'payment_received' => '支払いを受け取りました。金額: :amount。注文の詳細を見る', + 'reply_ticket' => 'チケットの返信::title', + 'reset_failed' => '[毎日タスク] ユーザー :uid - :username のデータリセットに失敗しました', + 'serverChan_exhausted' => '今日の制限が使い切られました!', + 'serverChan_limit' => '分単位の頻度が高すぎます。通知設定を最適化してください!', + 'sign_failed' => 'セキュアサイン確認に失敗しました', + 'ticket_content' => 'チケット内容:', 'traffic_remain' => 'データ使用率が:percent%に達しました。ご注意ください', 'traffic_tips' => 'データリセット日を確認し、合理的にデータを使用するか、使用後にリチャージしてください', - 'verification_account' => 'アカウント認証通知', + 'traffic_warning' => 'データ使用警告', 'verification' => 'あなたの認証コードは:', + 'verification_account' => 'アカウント認証通知', 'verification_limit' => ':minutes分以内に認証を完了してください', - 'data_anomaly' => 'データ異常ユーザー通知', - 'data_anomaly_content' => 'ユーザー:id、最近1時間のデータ(アップロード:upload、ダウンロード:download、合計:total)', - 'node' => [ - 'upload' => 'アップロードデータ', - 'download' => 'ダウンロードデータ', - 'total' => '総データ', - ], + 'view_ticket' => 'このチケットの進捗を見る', + 'view_web' => '公式サイトを見る', ]; diff --git a/resources/lang/ja/setup.php b/resources/lang/ja/setup.php new file mode 100644 index 00000000..5ba84602 --- /dev/null +++ b/resources/lang/ja/setup.php @@ -0,0 +1,10 @@ + 'DEMOモードであることが検出されました。データベースをリセットしますか?', + 'update_cache' => 'キャッシュを更新しています...', + 'update_complete' => '업데이트 완료!', + 'update_db' => 'データベースを更新しています...', +]; diff --git a/resources/lang/ja/user.php b/resources/lang/ja/user.php index 189451a3..1dc93ff3 100644 --- a/resources/lang/ja/user.php +++ b/resources/lang/ja/user.php @@ -4,234 +4,273 @@ declare(strict_types=1); return [ 'account' => [ - 'credit' => 'アカウント残高', - 'status' => 'アカウント状態', - 'level' => 'アカウントレベル', - 'group' => 'グループ', - 'speed_limit' => '速度制限', - 'remain' => '残りデータ', - 'time' => 'プラン期間', - 'last_login' => '最終ログイン', - 'reset' => '{0} データは :days 後にリセットされます |{1} データリセットまで :days 日 |[2,*] データリセットまで :days 日', 'connect_password' => 'プロキシ接続パスワード', + 'credit' => 'アカウント残高', + 'group' => 'グループ', + 'last_login' => '最終ログイン', + 'level' => 'アカウントレベル', 'reason' => [ - 'normal' => 'アカウントは正常です', 'expired' => 'プランの有効期限が切れています', + 'normal' => 'アカウントは正常です', 'overused' => 'この期間の :data GB 制限を超えました。
    制限は :min 分後に解除されます', 'traffic_exhausted' => 'データが使い果たされました', 'unknown' => '不明な理由です。ブラウザをリフレッシュしてみてください。問題が続く場合はサポートに連絡してください。', ], + 'remain' => '残りデータ', + 'reset' => '{0} データは :days 後にリセットされます |{1} データリセットまで :days 日 |[2,*] データリセットまで :days 日', + 'speed_limit' => '速度制限', + 'status' => 'アカウント状態', + 'time' => 'プラン期間', ], + 'attribute' => [ + 'address' => '所在地', + 'data' => 'データ', + 'ip' => 'IPアドレス', + 'isp' => 'ISP', + 'node' => 'ノード', + ], + 'bought_at' => '購入日', + 'clients' => 'クライアント', + 'contact' => 'お問い合わせ', + 'coupon' => [ + 'discount' => '割引', + 'error' => [ + 'expired' => 'クーポンの有効期限が切れています', + 'inactive' => 'クーポンはまだ有効ではありません', + 'minimum' => '最低利用金額は :amount です', + 'overused' => 'クーポンの利用可能回数は :times 回です', + 'run_out' => 'クーポンの利用回数が制限に達しました', + 'services' => '商品は割引対象外です。キャンペーン規約をご確認ください。', + 'unknown' => '無効なクーポン', + 'unmet' => '利用条件を満たしていません', + 'used' => 'クーポンは使用済みです', + 'users' => 'アカウントはキャンペーン対象外です', + 'wait' => ':timeに有効になりますので、お待ちください。', + ], + 'input' => 'クーポンコードを入力', + ], + 'current_role' => '現在のロール', + 'error_response' => 'エラーが発生しました。時間をおいて再度お試しください。', 'home' => [ + 'announcement' => 'お知らせ', 'attendance' => [ 'attribute' => 'チェックイン', 'disable' => 'チェックイン機能が無効です', 'done' => '既にチェックイン済みです。明日また来てください!', - 'success' => ':data データを受け取りました', 'failed' => 'システムエラー', + 'success' => ':data データを受け取りました', ], - 'traffic_logs' => 'データ記録', - 'announcement' => 'お知らせ', - 'wechat_push' => 'WeChat通知', 'chat_group' => 'チャットグループ', 'empty_announcement' => 'お知らせはありません', + 'traffic_logs' => 'データ記録', + 'wechat_push' => 'WeChat通知', ], - 'purchase_to_unlock' => '購入してアンロック', - 'purchase_required' => 'この機能は無料ユーザーには利用できません。まずは', - 'attribute' => [ - 'node' => 'ノード', - 'data' => 'データ', - 'ip' => 'IPアドレス', - 'isp' => 'ISP', - 'address' => '所在地', + 'invite' => [ + 'attribute' => '招待コード', + 'counts' => '招待コード総数 :num', + 'generate_failed' => '生成失敗: 招待コードの上限に達しました', + 'logs' => '招待履歴', + 'promotion' => '招待コードで登録すると、招待元と被招待者の両方に:trafficデータが付与されます。被招待者が購入した場合、購入金額の:referral_percent%が報酬として付与されます。', + 'tips' => '残招待コード :num 個。招待コードは発行後:days日で失効します。', + ], + 'invitee' => '被招待者', + 'inviter' => '招待者', + 'invoice' => [ + 'active_prepaid_question' => '前払いパッケージをすぐにアクティブにしますか?', + 'active_prepaid_tips' => 'アクティブ後:
    - 現在のパッケージはすぐに失効!
    - 有効期限は本日から再開!', + 'amount' => '金額', + 'attribute' => '注文', + 'detail' => '購入履歴', + ], + 'knowledge' => [ + 'basic' => '基本', + 'title' => 'ナレッジベース', ], - 'purchase_promotion' => '今すぐサービスを購入!', 'menu' => [ + 'admin_dashboard' => 'ダッシュボード', 'help' => 'ヘルプ', 'home' => 'ホーム', 'invites' => '招待', 'invoices' => '請求書', 'nodes' => 'ノード', + 'profile' => 'プロフィール', 'promotion' => 'プロモーション', 'shop' => 'ショップ', - 'profile' => 'プロフィール', 'tickets' => 'チケット', - 'admin_dashboard' => 'ダッシュボード', ], - 'contact' => 'お問い合わせ', + 'node' => [ + 'info' => '構成情報', + 'rate' => ':ratio 倍のデータ使用', + 'setting' => 'プロキシ設定', + 'unstable' => 'ノードが不安定/メンテナンス中', + ], 'oauth' => [ + 'bind' => '連携する', 'bind_title' => 'ソーシャルアカウントを連携', 'not_bind' => '未連携', - 'bind' => '連携する', 'rebind' => '再連携する', 'unbind' => '連携解除', ], - 'coupon' => [ - 'discount' => '割引', - 'error' => [ - 'unknown' => '無効なクーポン', - 'used' => 'クーポンは使用済みです', - 'expired' => 'クーポンの有効期限が切れています', - 'run_out' => 'クーポンの利用回数が制限に達しました', - 'inactive' => 'クーポンはまだ有効ではありません', - 'wait' => ':timeに有効になりますので、お待ちください。', - 'unmet' => '利用条件を満たしていません', - 'minimum' => '最低利用金額は :amount です', - 'overused' => 'クーポンの利用可能回数は :times 回です', - 'users' => 'アカウントはキャンペーン対象外です', - 'services' => '商品は割引対象外です。キャンペーン規約をご確認ください。', + 'pay' => '支払う', + 'payment' => [ + 'close_tips' => ':minutes分以内に支払いを完了してください。そうしないと注文は自動的にキャンセルされます。', + 'creating' => '支払いを作成中...', + 'error' => 'チャージ金額が正しくありません', + 'insufficient_balance' => '残高が不足しています。先にチャージしてください。', + 'manual' => [ + 'hint' => 'QRコードで支払いをスキャンした後、指示に従って【次へ】を順番にクリックし、最後に【送信】をクリックして支払いを完了してください。', + 'next' => '次のステップ', + 'payment_tips' => '正確な金額を支払ってください。オーバーペイの返金はなく、アンダーペイの場合は差額をチャージ', + 'pre' => '前のステップ', + 'red_packet' => 'Alipayレッドパケット', + 'steps' => [ + 'complete' => [ + 'description' => '支払いの手動確認を待っています', + 'title' => '完了', + ], + 'notice' => [ + 'description' => '手動支払いの方法', + 'title' => '注意', + ], + 'payment' => [ + 'description' => '支払いQRコードを取得', + 'title' => '支払う', + ], + 'remark' => [ + 'description' => '手動確認のためにログインアカウントを入力してください', + 'title' => 'アカウント備考', + ], + ], ], + 'method' => '決済方法', + 'mobile_tips' => 'モバイルユーザー: QRコードを長押し -> 画像を保存 -> 支払アプリを開く -> アルバムから読み取る', + 'order_creation' => [ + 'failed' => '注文の作成に失敗しました。他の支払い方法をお試しください!', + 'info' => 'ご購入/ご入金の処理は【24時間】以内に行いますので、しばらくお待ちください。', + 'order_limit' => 'この商品は :limit_num 回まで購入可能です。すでに :count 回購入しています。', + 'order_timeout' => '注文がタイムアウトし、未払いのため自動的にキャンセルされました。', + 'payment_disabled' => '注文の作成に失敗しました:システムでオンライン支払い機能が有効になっていません。', + 'pending_order' => '注文の作成に失敗しました:未払いの注文があります。先にそれらの支払いを完了してください。', + 'plan_required' => '追加パッケージを購入する前に、まずプランを購入してください。', + 'price_issue' => '注文の作成に失敗しました:注文の総額が異常です', + 'price_zero' => '注文の作成に失敗しました:注文の総額が0です。オンライン支払いは不要です。', + 'product_unavailable' => '注文の作成に失敗しました:商品は販売終了しました。', + 'success' => '注文が正常に作成されました!', + 'unknown_order' => '不明な注文', + 'unknown_payment' => '不明な支払い方法', + ], + 'qrcode_tips' => ':softwareでQRコードをスキャンしてください', + 'redirect_stripe' => 'Stripeの支払ページに移動中', ], - 'error_response' => 'エラーが発生しました。時間をおいて再度お試しください。', - 'invite' => [ - 'attribute' => '招待コード', - 'counts' => '招待コード総数 :num', - 'tips' => '残招待コード :num 個。招待コードは発行後:days日で失効します。', - 'logs' => '招待履歴', - 'promotion' => '招待コードで登録すると、招待元と被招待者の両方に:trafficデータが付与されます。被招待者が購入した場合、購入金額の:referral_percent%が報酬として付与されます。', - 'generate_failed' => '生成失敗: 招待コードの上限に達しました', + 'purchase' => [ + 'completed' => '購入が完了しました!', + 'promotion' => '今すぐサービスを購入!', + 'required' => 'この機能は無料ユーザーには利用できません。まずは', + 'to_unlock' => '購入して解放', ], + 'recharge' => 'チャージ', + 'recharge_credit' => '残高チャージ', + 'recharging' => 'チャージ中...', + 'referral' => [ + 'link' => '紹介リンク', + 'logs' => '報酬履歴', + 'msg' => [ + 'account' => 'アカウントの有効期限が切れています。まずはサービスを購入してください。', + 'applied' => '申請はすでに存在しています。処理完了をお待ちください。', + 'error' => '申請の作成に失敗しました。時間をおいて再度試すか、管理者にお問い合わせください。', + 'unfulfilled' => '出金には :amount が必要です。頑張ってください!', + 'wait' => '管理者による承認をお待ちください。', + ], + 'total' => '総報酬 :amount(:total 回)。:money 以上になると出金できます。', + ], + 'registered_at' => '登録日', 'reset_data' => [ 'action' => 'データリセット', 'cost' => 'コスト :amount', 'cost_tips' => 'データリセットには :amount が差し引かれます!', - 'insufficient' => '残高が足りません。チャージしてください。', - '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コードをスキャン', + 'service' => [ + 'country_count' => ':num カ国をカバー', + 'node_count' => ':num 本の高品質ノード', + 'unlimited' => '無制限', + ], 'shop' => [ - 'hot' => '人気', - 'limited' => '限定', + 'buy' => '購入', + 'call4help' => 'お問い合わせはチケットにてお願いします', 'change_amount' => 'チャージ金額', 'change_amount_help' => 'チャージ金額を入力', - 'buy' => '購入', + 'conflict' => 'プラン競合', + 'conflict_tips' => '

    現在の購入は前払いプランとして設定されます

    1. 前払いプランは、現在のプラン終了後に自動で開始されます!
    2. 支払い後に手動でプランを開始することができます!
    ', 'description' => '説明', - 'service' => 'サービス', + 'hot' => '人気', + 'limited' => '限定', 'pay_credit' => '残高支払い', 'pay_online' => 'オンライン支払い', 'price' => '価格', 'quantity' => '数量', + 'service' => 'サービス', 'subtotal' => '小計', 'total' => '合計', - 'conflict' => 'プラン競合', - 'conflict_tips' => '

    現在の購入は前払いプランとして設定されます

    1. 前払いプランは、現在のプラン終了後に自動で開始されます!
    2. 支払い後に手動でプランを開始することができます!
    ', - 'call4help' => 'お問い合わせはチケットにてお願いします', - ], - 'service' => [ - 'node_count' => ':num 本の高品質ノード', - 'country_count' => ':num カ国をカバー', - 'unlimited' => '無制限', - ], - 'payment' => [ - 'error' => 'チャージ金額が正しくありません', - 'creating' => '支払いを作成中...', - 'redirect_stripe' => 'Stripeの支払ページに移動中', - 'qrcode_tips' => ':softwareでQRコードをスキャンしてください', - 'close_tips' => ':minutes分以内に支払いを完了してください。そうしないと注文は自動的にキャンセルされます。', - 'mobile_tips' => 'モバイルユーザー: QRコードを長押し -> 画像を保存 -> 支払アプリを開く -> アルバムから読み取る', - ], - 'invoice' => [ - 'attribute' => '注文', - 'detail' => '購入履歴', - 'amount' => '金額', - 'active_prepaid_question' => '前払いパッケージをすぐにアクティブにしますか?', - 'active_prepaid_tips' => 'アクティブ後:
    - 現在のパッケージはすぐに失効!
    - 有効期限は本日から再開!', - ], - 'node' => [ - 'info' => '構成情報', - 'setting' => 'プロキシ設定', - 'unstable' => 'ノードが不安定/メンテナンス中', - 'rate' => ':ratio 倍のデータ使用', ], 'subscribe' => [ - 'link' => 'サブスクリプションリンク', - 'tips' => '警告: このサブスクリプションリンクは個人利用目的でのみ共有可。アカウントの異常なデータ使用を検知し、自動的にBANする可能性があるため、リンクは共有しないでください。', - 'exchange_warning' => 'サブスクリプション変更により:\n1. 現在のサブはすぐに無効になる\n2. 接続パスワードが変更される', 'custom' => 'カスタムサブスクリプション', + 'error' => 'サブスクリプション変更エラー', + 'exchange_warning' => 'サブスクリプション変更により:\n1. 現在のサブはすぐに無効になる\n2. 接続パスワードが変更される', + 'info' => [ + 'download' => 'ダウンロードデータ', + 'title' => 'アカウント概要 [リアルタイムではない]', + 'total' => 'プランデータ', + 'upload' => 'アップロードデータ', + ], + 'link' => 'サブスクリプションリンク', 'ss_only' => 'SSのみ', 'ssr_only' => 'SSRのみ(SS含む)', - 'v2ray_only' => 'V2Rayのみ', + 'tips' => '警告: このサブスクリプションリンクは個人利用目的でのみ共有可。アカウントの異常なデータ使用を検知し、自動的にBANする可能性があるため、リンクは共有しないでください。', 'trojan_only' => 'Trojanのみ', - 'error' => 'サブスクリプション変更エラー', - 'info' => [ - 'title' => 'アカウント概要 [リアルタイムではない]', - 'upload' => 'アップロードデータ', - 'download' => 'ダウンロードデータ', - 'total' => 'プランデータ', + 'v2ray_only' => 'V2Rayのみ', + ], + 'telegram' => [ + 'bind_exists' => 'このアカウントはすでにTelegramアカウントにリンクされています。', + 'bind_missing' => 'ユーザー情報が見つかりません。先にアカウントをリンクしてください。', + 'command' => [ + 'bind' => 'あなたの:web_nameアカウントをリンクしてください', + 'intro' => '次のコマンドを使用できます', + 'traffic' => 'データ使用量を確認する', + 'unbind' => 'リンク解除', + 'web_url' => '最新の:web_name URLを取得する', ], + 'get_url' => ':web_nameの最新URLは', + 'params_missing' => 'パラメーターに誤りがあります。メールアドレスを含めて再送信してください。', + 'ticket_missing' => 'チケットが存在しません', + 'ticket_reply' => 'チケット #`:id` への返信が成功しました', + 'traffic_query' => 'データ使用量の確認', + 'user_missing' => 'ユーザーが存在しません', ], 'ticket' => [ 'attribute' => 'チケット', - 'submit_tips' => 'チケットを提出しますか?', - 'reply_confirm' => 'チケットへの返信を確定しますか?', - 'close_tips' => 'このチケットを閉じますか?', - 'close' => 'チケットを閉じる', - 'failed_closed' => 'エラー: チケットはすでに閉じられています', - 'reply_placeholder' => 'ここにコメントを入力...', - 'reply' => '返信', 'close_msg' => 'チケット: ID :id がユーザーによって閉じられました', - 'title_placeholder' => '簡単に問題を説明してください', + 'close_tips' => 'このチケットを閉じますか?', 'content_placeholder' => '問題を詳細に説明して助けを得ることができるようにしてください', - 'new' => '新規チケット', - 'service_hours' => '営業時間', - 'online_hour' => 'オンライン時間', - 'service_tips' => 'ご連絡は1つの方法のみでお願いします。
    重複したリクエストは対応を遅らせます。', 'error' => '不明なエラーです。スタッフに通知してください。', + 'new' => '新規チケット', + 'online_hour' => 'オンライン時間', + 'reply' => '返信', + 'reply_confirm' => 'チケットへの返信を確定しますか?', + 'reply_placeholder' => 'ここにコメントを入力...', + 'service_hours' => '営業時間', + 'service_tips' => 'ご連絡は1つの方法のみでお願いします。
    重複したリクエストは対応を遅らせます。', + 'submit_tips' => 'チケットを提出しますか?', + 'title_placeholder' => '簡単に問題を説明してください', ], 'traffic_logs' => [ - 'hourly' => '今日のデータ使用', 'daily' => '今月のデータ使用', + 'hourly' => '今日のデータ使用', 'tips' => ':トラフィックのデータは遅延を提供します。', ], - 'clients' => 'クライアント', 'tutorials' => 'チュートリアル', - 'current_role' => '現在のロール', - 'knowledge' => [ - 'title' => 'ナレッジベース', - 'basic' => '基本', - ], - 'manual' => [ - 'red_packet' => 'Alipayレッドパケット', - 'hint' => 'QRコードをスキャン後、【次へ】をクリックし、【送信】まで完了してください!', - 'step_1' => '注意', - 'step_1_title' => '手動支払いの方法', - 'step_2' => '支払い', - 'step_2_title' => '支払いQRコードを取得', - 'step_3' => '完了', - 'step_3_title' => '手動確認待ち', - 'remark' => 'アカウント備考', - 'remark_content' => 'ログインアカウントを入力して確認', - 'payment_hint' => '正確な金額を支払ってください。オーバーペイの返金はなく、アンダーペイの場合は差額をチャージ', - 'pre' => '前のステップ', - 'next' => '次のステップ', - ], + 'withdraw' => '出金', + 'withdraw_at' => '出金日', + 'withdraw_commission' => '報酬出金', + 'withdraw_logs' => '出金記録', ]; diff --git a/resources/lang/ko.json b/resources/lang/ko.json index 3777dbb8..3a16d582 100644 --- a/resources/lang/ko.json +++ b/resources/lang/ko.json @@ -126,5 +126,16 @@ "You are receiving this email because we received a password reset request for your account.": "귀하의 계정에 대한 비밀번호 재설정이 요청되어 이 메일이 발송되었습니다.", "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!": "이 영역의 내용을 보려면 유효한 구독이 있어야 합니다!", - "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "관리자에 의해 구독이 비활성화되었습니다. 복원하려면 관리자에게 문의하세요." + "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "관리자에 의해 구독이 비활성화되었습니다. 복원하려면 관리자에게 문의하세요.", + "Manually add in dashboard.": "대시보드에서 수동으로 추가", + "Manually edit in dashboard.": "대시보드에서 수동으로 편집", + "Batch generate user accounts in dashboard.": "백그라운드에서 대량 사용자 계정 생성", + "Coupon used in order.": "주문에서 쿠폰이 사용되었습니다", + "Order canceled, coupon reinstated.": "주문이 취소되었으며, 쿠폰이 복원되었습니다", + "Used for credit recharge.": "잔액 충전에 사용됨", + "The user manually reset the data.": "사용자 데이터 초기화", + "Recharge using a recharge voucher.": "충전권을 사용하여 충전하다", + "The user topped up the balance.": "사용자가 잔액을 충전했습니다", + "Purchased an item.": "상품을 구매했습니다", + "[:payment] plus the user’s purchased data plan.": "[:payment] 에 사용자가 구매한 데이터 플랜을 추가" } \ No newline at end of file diff --git a/resources/lang/ko/admin.php b/resources/lang/ko/admin.php index e2d386b4..df95f1ff 100644 --- a/resources/lang/ko/admin.php +++ b/resources/lang/ko/admin.php @@ -3,512 +3,468 @@ declare(strict_types=1); return [ + 'action' => [ + 'add_item' => ':attribute 추가', + 'edit_item' => ':attribute 편집', + ], + 'aff' => [ + 'apply_counts' => '총 :num 출금 신청', + 'commission_counts' => '이 신청에는 총 :num 주문이 포함됩니다', + 'commission_title' => '출금 신청 세부 사항', + 'counts' => '총 :num 기록', + 'rebate_title' => '리베이트 기록', + 'referral' => '추천 리베이트', + 'title' => '출금 신청 목록', + ], + 'article' => [ + 'category_hint' => '동일한 카테고리는 동일한 폴더에 분류됩니다', + 'counts' => '총 :num 기사', + 'logo_placeholder' => '또는 로고 URL을 입력하세요', + 'title' => '기사 목록', + 'type' => [ + 'announcement' => '공지사항', + 'knowledge' => '기사', + ], + ], + 'clear' => '지우기', + 'clone' => '복제', + 'confirm' => [ + 'continues' => '이 작업을 계속 진행하시겠습니까?', + 'delete' => [0 => '정말로 :attribute', 1 => '를 삭제하시겠습니까?'], + 'export' => '모두 내보내기를 진행하시겠습니까?', + ], + 'coupon' => [ + 'counts' => '총 :num 쿠폰', + 'created_days_hint' => '계정 생성 후 :day일', + 'discount' => '할인', + 'export_title' => '쿠폰 내보내기', + 'groups_hint' => '선택한 사용자 그룹에만 사용 가능', + 'info_title' => '쿠폰 정보', + 'levels_hint' => '선택한 사용자 레벨에만 사용 가능', + 'limit_hint' => '이 항목의 각 조건은 AND 관계를 가지므로 적절히 사용하세요', + 'minimum_hint' => '결제 금액이 :num을 초과해야 사용 가능', + 'name_hint' => '전면 표시용', + 'newbie' => [ + 'created_days' => '계정 생성 일수', + 'first_discount' => '첫 구매 할인', + 'first_order' => '첫 주문', + ], + 'priority_hint' => '최고 우선 순위 쿠폰이 먼저 사용됩니다. 최대 255', + 'services_blacklist_hint' => '블랙리스트에 있는 상품에는 사용 불가, 사용하지 않으려면 비워 두십시오', + 'services_placeholder' => '상품 ID를 입력하고 Enter를 누르세요', + 'services_whitelist_hint' => '화이트리스트에 있는 상품에만 사용 가능, 사용하지 않으려면 비워 두십시오', + 'single_use' => '일회용', + 'sn_hint' => '8자리 랜덤 코드로 기본 설정', + 'title' => '쿠폰 목록', + 'type' => [ + 'charge' => '충전 쿠폰', + 'discount' => '할인 쿠폰', + 'voucher' => '바우처', + ], + 'type_hint' => '감액: 상품 금액 차감, 할인: 상품 퍼센트 할인, 충전: 계정 잔액 추가', + 'used_hint' => '사용자는 이 쿠폰을 최대 :num회 사용할 수 있습니다', + 'user_whitelist_hint' => '화이트리스트에 있는 사용자는 사용할 수 있습니다. 사용하지 않으려면 비워 두십시오', + 'users_blacklist_hint' => '블랙리스트에 있는 사용자는 사용할 수 없습니다. 사용하지 않으려면 비워 두십시오', + 'users_placeholder' => '사용자 ID를 입력하고 Enter를 누르세요', + 'value' => '{1} ➖ :num|{2} :num% 할인|{3} ➕ :num', + 'value_hint' => '범위는 1% ~ 99%', + ], + 'creating' => '추가 중...', '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' => '유지보수 중인 노드', + 'active_days_users' => ':days일 이내 활성 사용자', + 'available_users' => '활성 사용자 수', + 'credit' => '총 잔액', 'current_month_traffic_consumed' => '이번 달 사용된 데이터', 'days_traffic_consumed' => ':days일 내 사용된 데이터', - 'orders' => '총 주문 수', + 'expiring_users' => '곧 만료될 사용자', + 'inactive_days_users' => ':days일 이상 비활성화된 사용자', + 'maintaining_nodes' => '유지보수 중인 노드', + 'nodes' => '노드 수', 'online_orders' => '온라인 결제 주문 수', + 'online_users' => '현재 온라인 사용자', + 'orders' => '총 주문 수', + 'overuse_users' => '데이터 사용량이 90% 이상인 사용자', + 'paid_users' => '유료 사용자 수', 'succeed_orders' => '결제 완료된 주문 수', - 'credit' => '총 잔액', + 'users' => '총 사용자 수', 'withdrawing_commissions' => '출금 대기 중인 커미션', 'withdrawn_commissions' => '출금된 커미션', ], - 'action' => [ - 'edit_item' => ':attribute 편집', - 'add_item' => ':attribute 추가', + 'end_time' => '종료 시간', + 'goods' => [ + 'counts' => '총 :num 상품', + 'info' => [ + 'available_date_hint' => '만료 후 총 데이터에서 해당 데이터를 자동으로 차감합니다', + 'desc_placeholder' => '상품의 간단한 설명', + 'limit_num_hint' => '사용자가 이 상품을 구매할 수 있는 최대 횟수, 0은 무제한', + 'list_hint' => '각 행의 내용은 <li>로 시작하고 </li>로 끝나야 합니다', + 'list_placeholder' => '상품의 사용자 정의 목록 추가', + 'period_hint' => '플랜의 데이터는 N일마다 초기화됩니다', + 'type_hint' => '플랜은 계정 만료와 관련이 있으며, 패키지는 데이터만 차감하고 만료에 영향을 미치지 않습니다', + ], + 'sell_and_used' => '사용/판매', + 'status' => [ + 'no' => '판매 중지', + 'yes' => '판매 중', + ], + 'title' => '상품 목록', + 'type' => [ + 'package' => '데이터 패키지', + 'plan' => '구독 플랜', + 'top_up' => '충전', + ], ], - 'confirm' => [ - 'delete' => [0 => '정말로 :attribute', 1 => '를 삭제하시겠습니까?'], - 'continues' => '이 작업을 계속 진행하시겠습니까?', - 'export' => '모두 내보내기를 진행하시겠습니까?', + 'hint' => '힌트', + 'logs' => [ + 'ban' => [ + 'ban_time' => '차단 시간', + 'last_connect_at' => '마지막 로그인 시간', + 'reason' => '이유', + 'time' => '기간', + 'title' => '사용자 차단 기록', + ], + 'callback' => '콜백 로그 (결제)', + 'counts' => '총 :num 기록', + 'credit_title' => '잔액 변동 기록', + 'ip_monitor' => '온라인 IP 모니터링 실시간 2분', + 'notification' => '이메일 로그', + 'order' => [ + 'is_coupon' => '쿠폰 사용 여부', + 'is_expired' => '만료 여부', + 'title' => '주문 목록', + 'update_conflict' => '업데이트 실패: 주문 충돌', + ], + 'rule' => [ + 'clear_all' => '모든 기록 지우기', + 'clear_confirm' => '모든 트리거 기록을 지우시겠습니까?', + 'created_at' => '트리거 시간', + 'name' => '트리거된 규칙 이름', + 'reason' => '트리거 이유', + 'tag' => '✅ 허가되지 않은 콘텐츠 접근', + 'title' => '규칙 트리거 기록', + ], + 'subscribe' => '구독 목록', + 'user_data_modify_title' => '데이터 변경 기록', + 'user_ip' => [ + 'connect' => '연결된 IP', + 'title' => '사용자 온라인 IP 목록 최근 10분', + ], + 'user_traffic' => [ + 'choose_node' => '노드 선택', + 'title' => '데이터 사용 기록', + ], ], - 'user_dashboard' => '개인 센터', + 'marketing' => [ + 'counts' => '총 :num 메시지', + 'email' => [ + 'ever_paid' => '결제됨', + 'expired_date' => '만료된 날짜', + 'filters' => '필터', + 'loading_statistics' => '통계 정보를 로드 중...', + 'never_paid' => '결제하지 않음', + 'paid_servicing' => '유료 서비스', + 'previously_paid' => '이전에 결제됨', + 'recent_traffic_abnormal' => '최근 1시간 내 트래픽 이상', + 'recently_active' => '최근 활동', + 'targeted_users_count' => '대상 사용자 수', + 'traffic_usage_over' => '트래픽 사용량이 N%를 초과함', + 'will_expire_date' => '만료될 날짜', + ], + 'email_send' => '이메일 그룹 발송', + 'error_message' => '오류 메시지', + 'processed' => '요청 처리됨', + 'push_send' => '푸시 메시지 발송', + 'send_status' => '발송 상태', + 'send_time' => '발송 시간', + 'targeted_users_not_found' => '대상 사용자를 찾을 수 없음', + 'unknown_sending_type' => '알 수 없는 발송 유형', + ], + 'massive_export' => '대량 내보내기', 'menu' => [ + 'analysis' => [ + 'accounting' => '회계', + 'attribute' => '데이터 분석', + 'node_flow' => '노드 트래픽 분석', + 'site_flow' => '사이트 트래픽', + 'user_flow' => '사용자 트래픽', + ], + 'customer_service' => [ + 'article' => '기사 관리', + 'attribute' => '고객 서비스 시스템', + 'marketing' => '메시지 방송', + 'ticket' => '서비스 티켓', + ], 'dashboard' => '관리 센터', - 'user' => [ - 'attribute' => '사용자 시스템', - 'list' => '사용자 관리', - 'oauth' => '제3자 인증', - 'group' => '사용자 그룹', - 'credit_log' => '잔액 변동 기록', - 'subscribe' => '구독 관리', + 'log' => [ + 'attribute' => '로그 시스템', + 'notify' => '알림 기록', + 'online_logs' => '온라인 기록', + 'online_monitor' => '온라인 모니터링', + 'payment_callback' => '결제 콜백', + 'service_ban' => '차단 기록', + 'system' => '시스템 로그', + 'traffic' => '트래픽 사용', + 'traffic_flow' => '트래픽 변동', + ], + 'node' => [ + 'attribute' => '노드 시스템', + 'auth' => '노드 인증', + 'cert' => '인증서 목록', + 'list' => '노드 관리', + ], + 'promotion' => [ + 'attribute' => '프로모션', + 'invite' => '초대 관리', + 'rebate_flow' => '리베이트 기록', + 'withdraw' => '출금 관리', ], 'rbac' => [ 'attribute' => '권한 시스템', 'permission' => '권한 관리', 'role' => '역할 목록', ], - 'customer_service' => [ - 'attribute' => '고객 서비스 시스템', - 'ticket' => '서비스 티켓', - 'article' => '기사 관리', - 'marketing' => '메시지 방송', - ], - 'node' => [ - 'attribute' => '노드 시스템', - 'list' => '노드 관리', - 'auth' => '노드 인증', - 'cert' => '인증서 목록', - ], 'rule' => [ 'attribute' => '감사 규칙', - 'list' => '규칙 목록', 'group' => '규칙 그룹', + 'list' => '규칙 목록', 'trigger' => '트리거 기록', ], - 'shop' => [ - 'attribute' => '상품 시스템', - 'goods' => '상품 관리', - 'coupon' => '쿠폰 관리', - 'order' => '상품 주문', - ], - 'promotion' => [ - 'attribute' => '프로모션', - 'invite' => '초대 관리', - 'withdraw' => '출금 관리', - 'rebate_flow' => '리베이트 기록', - ], - 'analysis' => [ - 'attribute' => '데이터 분석', - 'accounting' => '회계', - 'user_flow' => '사용자 트래픽', - 'node_flow' => '노드 트래픽 분석', - 'site_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' => '시스템 매개변수', + 'universal' => '일반 설정', + ], + 'shop' => [ + 'attribute' => '상품 시스템', + 'coupon' => '쿠폰 관리', + 'goods' => '상품 관리', + 'order' => '상품 주문', + ], + 'tools' => [ + 'analysis' => '로그 분석', + 'attribute' => '도구 모음', + 'convert' => '포맷 변환', + 'decompile' => '디컴파일', + 'import' => '데이터 가져오기', + ], + 'user' => [ + 'attribute' => '사용자 시스템', + 'credit_log' => '잔액 변동 기록', + 'group' => '사용자 그룹', + 'list' => '사용자 관리', + 'oauth' => '제3자 인증', + 'subscribe' => '구독 관리', ], ], - 'user' => [ - 'massive' => [ - 'text' => '계정 대량 생성 수량', - 'failed' => '계정 대량 생성 실패', - 'succeed' => '계정 대량 생성 성공', - 'note' => '백그라운드에서 대량 사용자 계정 생성', - ], - 'proxy_info' => '설정 정보', - 'traffic_monitor' => '트래픽 통계', - 'online_monitor' => '온라인 모니터링', - 'reset_traffic' => '트래픽 초기화', - 'user_view' => '사용자 뷰로 전환', - 'connection_test' => '연결 테스트', - 'counts' => '총 :num 계정', - 'reset_confirm' => [0 => '【', 1 => '】의 트래픽을 초기화하시겠습니까?'], - 'info' => [ - 'account' => '계정 정보', - 'proxy' => '프록시 정보', - 'switch' => '역할 전환', - 'reset_date_hint' => '다음 데이터 초기화 날짜', - 'expired_date_hint' => '비워두면 기본 유효 기간은 1년입니다', - 'uuid_hint' => 'V2Ray의 UUID', - 'recharge_placeholder' => '음수 입력 시 잔액 차감', - ], - 'update_help' => '업데이트 성공, 돌아가시겠습니까?', - 'proxies_config' => '【:username】의 연결 설정 정보', - 'group' => [ - 'title' => '사용자 그룹 제어 (동일 노드는 여러 그룹에 속할 수 있지만, 사용자는 하나의 그룹에만 속할 수 있습니다. 사용자에게 보이는/사용 가능한 노드의 경우, 그룹이 레벨보다 우선합니다)', - 'name' => '그룹 이름', - 'counts' => '총 :num 그룹', - ], - ], - 'zero_unlimited_hint' => '설정하지 않음/0, 무제한', - 'node' => [ - 'traffic_monitor' => '트래픽 통계', - 'refresh_geo' => '지리 정보 새로고침', - 'connection_test' => '연결성 테스트', - 'counts' => '총 :num 노드', - 'reload_all' => '【모든】 백엔드 다시 로드', - 'refresh_geo_all' => '【모든】 노드 지리 정보 새로고침', - 'reload_confirm' => '노드 백엔드를 다시 로드하시겠습니까?', - 'info' => [ - 'hint' => '주의: 노드 추가 후 자동 생성된 ID는 ShadowsocksR Python 버전 백엔드의 usermysql.json 파일의 node_id 값이며, V2Ray 백엔드의 nodeId 값입니다.', - 'basic' => '기본 정보', - 'ddns_hint' => '동적 IP 노드는 DDNS 설정이 필요합니다. 이 유형의 노드는 도메인 이름을 통해 노드 차단 감지를 수행합니다.', - 'domain_placeholder' => '서버 도메인 주소, 입력 시 도메인 주소가 우선 사용됩니다', - 'domain_hint' => '시스템에서 【DDNS 모드】를 활성화하면 도메인이 아래의 IP와 자동으로 연결됩니다. 도메인 등록자 웹사이트에서 IP 정보를 수정할 필요가 없습니다.', - 'extend' => '확장 정보', - 'display' => [ - 'invisible' => '완전히 보이지 않음', - 'node' => '【노드】 페이지에만 표시', - '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]이 아닐 때 트래픽 위장을 위한 매개변수를 입력합니다. 혼란이 [http_simple]일 때, 포트 80을 권장합니다. 혼란이 [tls]일 때, 포트 443을 권장합니다.', - 'additional_ports_hint' => '활성화된 경우, 서버의 additional_ports 정보를 설정하십시오', - '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입니다. 서버는
    엄격 모드 구성: 사용자는 지정된 포트를 통해서만 연결할 수 있습니다. (구성 방법)', - ], - 'proxy_info' => '*SS 프로토콜과 호환', - 'proxy_info_hint' => '호환성을 위해 서버 구성에서 프로토콜과 혼란에 _compatible을 추가하십시오', - 'reload' => '백엔드 다시 로드', - 'auth' => [ - 'title' => '노드 인증 WEBAPI', - 'deploy' => [ - 'title' => ':type_label 백엔드 배포', - 'attribute' => '백엔드 배포', - 'command' => '명령어', - 'update' => '업데이트', - 'uninstall' => '제거', - 'start' => '시작', - 'stop' => '중지', - 'status' => '상태', - 'recent_logs' => '최근 로그', - 'real_time_logs' => '실시간 로그', - 'restart' => '재시작', - 'same' => '위와 동일', - 'trojan_hint' => '먼저 노드 도메인을 입력하고 해당 IP로 해석하십시오', - ], - 'reset_auth' => '인증 키 재설정', - 'counts' => '총 :num 인증 기록', - 'generating_all' => '모든 노드에 대해 인증 키를 생성하시겠습니까?', - ], - 'cert' => [ - 'title' => '도메인 인증서 (V2Ray 노드 위장용)', - 'counts' => '총 :num 도메인 인증서', - 'key_placeholder' => '인증서의 KEY 값, 비워둘 수 있으며 VNET-V2Ray 백엔드는 자동 발급을 지원합니다', - 'pem_placeholder' => '인증서의 PEM 값, 비워둘 수 있으며 VNET-V2Ray 백엔드는 자동 발급을 지원합니다', - ], - ], - 'hint' => '힌트', - 'oauth' => [ - 'title' => '제3자 인증', - 'counts' => '총 :num 인증 기록', - ], - 'select_all' => '전체 선택', - 'clear' => '지우기', - 'unselected_hint' => '할당할 규칙을 여기서 검색할 수 있습니다', - 'selected_hint' => '할당된 규칙을 여기서 검색할 수 있습니다', - 'clone' => '복제', + 'minute' => '분', 'monitor' => [ 'daily_chart' => '일일 트래픽 사용량', + 'hint' => '힌트: 데이터가 없으면 예약 작업을 확인하십시오', 'monthly_chart' => '월간 트래픽 사용량', 'node' => '노드 트래픽', 'user' => '사용자 트래픽', - 'hint' => '힌트: 데이터가 없으면 예약 작업을 확인하십시오', ], - 'tools' => [ - 'analysis' => [ - 'title' => 'SSR 로그 분석 단일 노드에만 해당', - 'req_url' => '최근 요청 URL 기록', - 'not_enough' => '15,000개 미만의 기록으로 인해 분석 불가', - ], - 'convert' => [ - 'title' => '포맷 변환 SS에서 SSR로', - 'content_placeholder' => '변환할 구성 정보를 입력하십시오.', - ], - 'decompile' => [ - 'title' => '디컴파일 구성 정보', - 'attribute' => '역구성 링크', - 'content_placeholder' => '역구성할 ShadowsocksR 링크를 입력하십시오. 줄 바꿈으로 구분합니다.', - ], - ], - 'ticket' => [ - 'title' => '티켓 목록', - 'counts' => '총 :num 티켓', - 'send_to' => '대상 사용자 정보를 입력하십시오', - 'user_info' => '사용자 정보', - 'inviter_info' => '초대자 정보', - 'close_confirm' => '이 티켓을 닫으시겠습니까?', - 'error' => '알 수 없는 오류! 로그를 확인하십시오', - ], - 'logs' => [ - 'subscribe' => '구독 목록', - 'counts' => '총 :num 기록', - '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' => '콜백 로그 (결제)', - 'notification' => '이메일 로그', - 'ip_monitor' => '온라인 IP 모니터링 실시간 2분', - 'user_ip' => [ - 'title' => '사용자 온라인 IP 목록 최근 10분', - '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' => '각 행의 내용은 <li>로 시작하고 </li>로 끝나야 합니다', - ], - 'status' => [ - 'yes' => '판매 중', - 'no' => '판매 중지', - ], - 'sell_and_used' => '사용/판매', - 'counts' => '총 :num 상품', - ], - 'sort_asc' => '정렬 값이 클수록 우선순위가 높습니다', - 'yes' => '예', 'no' => '아니요', - 'rule' => [ - 'type' => [ - 'reg' => '정규 표현식', - 'domain' => '도메인', - 'ip' => 'IP', - 'protocol' => '프로토콜', + 'node' => [ + 'auth' => [ + 'counts' => '총 :num 인증 기록', + 'deploy' => [ + 'attribute' => '백엔드 배포', + 'command' => '명령어', + 'real_time_logs' => '실시간 로그', + 'recent_logs' => '최근 로그', + 'restart' => '재시작', + 'same' => '위와 동일', + 'start' => '시작', + 'status' => '상태', + 'stop' => '중지', + 'title' => ':type_label 백엔드 배포', + 'trojan_hint' => '먼저 노드 도메인을 입력하고 해당 IP로 해석하십시오', + 'uninstall' => '제거', + 'update' => '업데이트', + ], + 'empty' => '권한 생성을 필요로 하는 노드가 없습니다', + 'generating_all' => '모든 노드에 대해 인증 키를 생성하시겠습니까?', + 'reset_auth' => '인증 키 재설정', + 'title' => '노드 인증 WEBAPI', ], + 'cert' => [ + 'counts' => '총 :num 도메인 인증서', + 'key_placeholder' => '인증서의 KEY 값, 비워둘 수 있으며 VNET-V2Ray 백엔드는 자동 발급을 지원합니다', + 'pem_placeholder' => '인증서의 PEM 값, 비워둘 수 있으며 VNET-V2Ray 백엔드는 자동 발급을 지원합니다', + 'title' => '도메인 인증서 (V2Ray 노드 위장용)', + ], + 'connection_test' => '연결성 테스트', + 'counts' => '총 :num 노드', + 'info' => [ + 'additional_ports_hint' => '활성화된 경우, 서버의 additional_ports 정보를 설정하십시오', + 'basic' => '기본 정보', + 'data_rate_hint' => '예: 0.1은 100M를 10M로 계산, 5는 100M를 500M로 계산', + 'ddns_hint' => '동적 IP 노드는 DDNS 설정이 필요합니다. 이 유형의 노드는 도메인 이름을 통해 노드 차단 감지를 수행합니다.', + 'detection' => [ + 'all' => '모두 감지', + 'hint' => '30~60분마다 무작위로 노드 차단 감지', + 'icmp' => 'ICMP 연결성만 감지', + 'tcp' => 'TCP 연결성만 감지', + ], + 'display' => [ + 'all' => '완전히 보임', + 'hint' => '사용자가 이 노드를 구독/볼 수 있는지 여부', + 'invisible' => '완전히 보이지 않음', + 'node' => '【노드】 페이지에만 표시', + 'sub' => '【구독】에만 표시', + ], + 'domain_hint' => '시스템에서 【DDNS 모드】를 활성화하면 도메인이 아래의 IP와 자동으로 연결됩니다. 도메인 등록자 웹사이트에서 IP 정보를 수정할 필요가 없습니다.', + 'domain_placeholder' => '서버 도메인 주소, 입력 시 도메인 주소가 우선 사용됩니다', + 'extend' => '확장 정보', + 'hint' => '주의: 노드 추가 후 자동 생성된 ID는 ShadowsocksR Python 버전 백엔드의 usermysql.json 파일의 node_id 값이며, V2Ray 백엔드의 nodeId 값입니다.', + 'ipv4_hint' => '여러 IP는 영어 쉼표로 구분합니다. 예: 1.1.1.1,8.8.8.8', + 'ipv4_placeholder' => '서버 IPv4 주소', + 'ipv6_hint' => '여러 IP는 영어 쉼표로 구분합니다. 예: 1.1.1.1,8.8.8.8', + 'ipv6_placeholder' => '서버 IPv6 주소', + 'level_hint' => '레벨: 0 - 레벨 제한 없음, 모두 보임', + 'obfs_param_hint' => '혼란이 [plain]이 아닐 때 트래픽 위장을 위한 매개변수를 입력합니다. 혼란이 [http_simple]일 때, 포트 80을 권장합니다. 혼란이 [tls]일 때, 포트 443을 권장합니다.', + 'push_port_hint' => '필수 항목이며 방화벽 포트를 열어야 합니다. 그렇지 않으면 메시지 푸시가 비정상적으로 동작합니다.', + 'single_hint' => '권장 포트는 80 또는 443입니다. 서버는
    엄격 모드 구성: 사용자는 지정된 포트를 통해서만 연결할 수 있습니다. (구성 방법)', + 'v2_cover' => [ + 'dtls' => 'DTLS1.2 데이터 패킷', + 'http' => 'HTTP 데이터 스트림', + 'none' => '위장 없음', + 'srtp' => '비디오 통화 데이터 (SRTP)', + 'utp' => 'BT 다운로드 데이터 (uTP)', + 'wechat' => '위챗 비디오 통화 데이터', + 'wireguard' => 'WireGuard 데이터 패킷', + ], + 'v2_host_hint' => 'http 위장 시 여러 도메인은 쉼표로 구분하고, WebSocket은 단일 도메인만 허용합니다.', + 'v2_method_hint' => 'WebSocket 전송 프로토콜은 none 암호화 방식을 사용하지 마십시오.', + 'v2_net_hint' => 'WebSocket을 위해 TLS를 활성화하십시오', + 'v2_tls_provider_hint' => '다른 백엔드는 다른 구성을 가집니다:', + ], + 'proxy_info' => '*SS 프로토콜과 호환', + 'proxy_info_hint' => '호환성을 위해 서버 구성에서 프로토콜과 혼란에 _compatible을 추가하십시오', + 'refresh_geo' => '지리 정보 새로고침', + 'refresh_geo_all' => '【모든】 노드 지리 정보 새로고침', + 'reload' => '백엔드 다시 로드', + 'reload_all' => '【모든】 백엔드 다시 로드', + 'reload_confirm' => '노드 백엔드를 다시 로드하시겠습니까?', + 'traffic_monitor' => '트래픽 통계', + ], + 'oauth' => [ + 'counts' => '총 :num 인증 기록', + 'title' => '제3자 인증', + ], + 'optional' => '선택 사항', + 'permission' => [ + 'counts' => '총 :num 권한 행동', + 'description_hint' => '설명 작성, 예: [A 시스템] A 편집', + 'name_hint' => '라우트 이름 작성, 예: admin.permission.create,update', + 'title' => '권한 행동 목록', + ], + 'query' => '쿼리', + 'report' => [ + 'annually_accounting' => '연간 거래', + 'annually_site_flow' => '연간 트래픽 소비', + 'avg_traffic_30d' => '30일 평균 일일 트래픽', + 'current_month' => '이번 달', + 'current_year' => '올해', + 'daily_accounting' => '일일 거래', + 'daily_distribution' => '일일 분포', + 'daily_site_flow' => '일일 트래픽 소비', + 'daily_traffic' => '일일 트래픽', + 'hourly_traffic' => '시간별 트래픽', + 'last_month' => '지난 달', + 'last_year' => '작년', + 'monthly_accounting' => '월간 거래', + 'monthly_site_flow' => '월간 트래픽 소비', + 'select_hourly_date' => '시간별 날짜 선택', + 'sum_traffic_30d' => '30일 총 트래픽 비율', + 'today' => '오늘', + ], + 'require' => '필수 사항', + 'role' => [ + 'counts' => '총 :num 권한 역할', + 'description_hint' => '패널에 표시할 이름, 예: 관리자', + 'modify_admin_error' => '슈퍼 관리자를 수정하지 마세요!', + 'name_hint' => '고유 식별 이름, 예: 관리자', + 'permissions_all' => '모든 권한', + 'title' => '권한 역할 목록', + ], + 'rule' => [ 'counts' => '총 :num 감사 규칙', - 'title' => '규칙 목록', 'group' => [ + 'counts' => '총 :num 그룹', + 'title' => '규칙 그룹', 'type' => [ 'off' => '차단', 'on' => '허용', ], - 'title' => '규칙 그룹', - 'counts' => '총 :num 그룹', ], - ], - 'role' => [ - 'name_hint' => '고유 식별 이름, 예: 관리자', - 'description_hint' => '패널에 표시할 이름, 예: 관리자', - 'title' => '권한 역할 목록', - 'permissions_all' => '모든 권한', - 'counts' => '총 :num 권한 역할', - ], - 'report' => [ - 'daily_accounting' => '일일 거래', - 'monthly_accounting' => '월간 거래', - 'annually_accounting' => '연간 거래', - 'daily_site_flow' => '일일 트래픽 소비', - 'monthly_site_flow' => '월간 트래픽 소비', - 'annually_site_flow' => '연간 트래픽 소비', - 'current_month' => '이번 달', - 'last_month' => '지난 달', - 'current_year' => '올해', - 'last_year' => '작년', - 'hourly_traffic' => '시간별 트래픽', - 'daily_traffic' => '일일 트래픽', - 'daily_distribution' => '일일 분포', - 'today' => '오늘', - 'avg_traffic_30d' => '30일 평균 일일 트래픽', - 'sum_traffic_30d' => '30일 총 트래픽 비율', - 'select_hourly_date' => '시간별 날짜 선택', - ], - 'permission' => [ - 'title' => '권한 행동 목록', - 'description_hint' => '설명 작성, 예: [A 시스템] A 편집', - 'name_hint' => '라우트 이름 작성, 예: admin.permission.create,update', - 'counts' => '총 :num 권한 행동', - ], - 'marketing' => [ - 'push_send' => '푸시 메시지 발송', - 'email_send' => '이메일 그룹 발송', - 'email' => [ - 'targeted_users_count' => '대상 사용자 수', - 'loading_statistics' => '통계 정보를 로드 중...', - 'filters' => '필터', - 'expired_date' => '만료된 날짜', - 'will_expire_date' => '만료될 날짜', - 'traffic_usage_over' => '트래픽 사용량이 N%를 초과함', - 'recently_active' => '최근 활동', - 'paid_servicing' => '유료 서비스', - 'previously_paid' => '이전에 결제됨', - 'ever_paid' => '결제됨', - 'never_paid' => '결제하지 않음', - 'recent_traffic_abnormal' => '최근 1시간 내 트래픽 이상', - ], - 'counts' => '총 :num 메시지', - 'send_status' => '발송 상태', - 'send_time' => '발송 시간', - 'error_message' => '오류 메시지', - 'processed' => '요청 처리됨', - 'targeted_users_not_found' => '대상 사용자를 찾을 수 없음', - 'unknown_sending_type' => '알 수 없는 발송 유형', - ], - 'creating' => '추가 중...', - 'article' => [ + 'title' => '규칙 목록', 'type' => [ - 'knowledge' => '기사', - 'announcement' => '공지사항', + 'domain' => '도메인', + 'ip' => 'IP', + 'protocol' => '프로토콜', + 'reg' => '정규 표현식', ], - 'category_hint' => '동일한 카테고리는 동일한 폴더에 분류됩니다', - 'logo_placeholder' => '또는 로고 URL을 입력하세요', - 'title' => '기사 목록', - 'counts' => '총 :num 기사', - ], - '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' => '결제 금액이 :num을 초과해야 사용 가능', - 'used_hint' => '사용자는 이 쿠폰을 최대 :num회 사용할 수 있습니다', - 'levels_hint' => '선택한 사용자 레벨에만 사용 가능', - 'groups_hint' => '선택한 사용자 그룹에만 사용 가능', - 'users_placeholder' => '사용자 ID를 입력하고 Enter를 누르세요', - 'user_whitelist_hint' => '화이트리스트에 있는 사용자는 사용할 수 있습니다. 사용하지 않으려면 비워 두십시오', - 'users_blacklist_hint' => '블랙리스트에 있는 사용자는 사용할 수 없습니다. 사용하지 않으려면 비워 두십시오', - 'services_placeholder' => '상품 ID를 입력하고 Enter를 누르세요', - 'services_whitelist_hint' => '화이트리스트에 있는 상품에만 사용 가능, 사용하지 않으려면 비워 두십시오', - 'services_blacklist_hint' => '블랙리스트에 있는 상품에는 사용 불가, 사용하지 않으려면 비워 두십시오', - 'newbie' => [ - 'first_discount' => '첫 구매 할인', - 'first_order' => '첫 주문', - 'created_days' => '계정 생성 일수', - ], - 'created_days_hint' => '계정 생성 후 :day일', - 'limit_hint' => '이 항목의 각 조건은 AND 관계를 가지므로 적절히 사용하세요', - 'info_title' => '쿠폰 정보', - 'counts' => '총 :num 쿠폰', - 'discount' => '할인', - 'export_title' => '쿠폰 내보내기', - 'single_use' => '일회용', - ], - 'times' => '회', - 'massive_export' => '대량 내보내기', - 'system_generate' => '시스템 생성', - 'aff' => [ - 'rebate_title' => '리베이트 기록', - 'counts' => '총 :num 기록', - 'title' => '출금 신청 목록', - 'apply_counts' => '총 :num 출금 신청', - 'referral' => '추천 리베이트', - 'commission_title' => '출금 신청 세부 사항', - 'commission_counts' => '이 신청에는 총 :num 주문이 포함됩니다', ], + 'select_all' => '전체 선택', + 'selected_hint' => '할당된 규칙을 여기서 검색할 수 있습니다', + 'set_to' => ':attribute로 설정', 'setting' => [ 'common' => [ - 'title' => '일반 설정', - 'set_default' => '기본값으로 설정', 'connect_nodes' => '연결된 노드 수', + 'set_default' => '기본값으로 설정', + 'title' => '일반 설정', ], 'email' => [ - 'title' => '이메일 필터 목록 (등록 시 사용)', - 'tail' => '이메일 접미사', - 'rule' => '제한 유형', 'black' => '블랙리스트', - 'white' => '화이트리스트', + 'rule' => '제한 유형', + 'tail' => '이메일 접미사', 'tail_placeholder' => '이메일 접미사를 입력하세요', - ], - 'system' => [ - 'title' => '시스템 설정', - 'web' => '웹사이트 일반', - 'account' => '계정 설정', - 'node' => '노드 설정', - 'extend' => '확장 기능', - 'check_in' => '체크인 시스템', - 'promotion' => '프로모션 시스템', - 'notify' => '알림 시스템', - 'auto_job' => '자동 작업', - 'other' => '로고|고객 서비스|통계', - 'payment' => '결제 시스템', - 'menu' => '메뉴', + 'title' => '이메일 필터 목록 (등록 시 사용)', + 'white' => '화이트리스트', ], 'no_permission' => '매개변수를 수정할 권한이 없습니다!', + 'system' => [ + 'account' => '계정 설정', + 'auto_job' => '자동 작업', + 'check_in' => '체크인 시스템', + 'extend' => '확장 기능', + 'menu' => '메뉴', + 'node' => '노드 설정', + 'notify' => '알림 시스템', + 'other' => '로고|고객 서비스|통계', + 'payment' => '결제 시스템', + 'promotion' => '프로모션 시스템', + 'title' => '시스템 설정', + 'web' => '웹사이트 일반', + ], ], + 'sort_asc' => '정렬 값이 클수록 우선순위가 높습니다', + 'start_time' => '시작 시간', 'system' => [ + 'AppStore_id' => '애플 계정', + 'AppStore_password' => '애플 비밀번호', 'account_expire_notification' => '계정 만료 알림', + 'active_account' => [ + 'after' => '등록 후 활성화', + 'before' => '등록 전 활성화', + ], 'active_times' => '계정 활성화 횟수', 'admin_invite_days' => '관리자 초대 유효 기간', 'aff_salt' => '초대 링크 사용자 정보 암호화', 'alipay_qrcode' => '알리페이 QR 코드', - 'AppStore_id' => '애플 계정', - 'AppStore_password' => '애플 비밀번호', 'auto_release_port' => '포트 회수 메커니즘', 'bark_key' => 'Bark 장치 키', + 'captcha' => [ + 'geetest' => 'Geetest', + 'hcaptcha' => 'hCaptcha', + 'recaptcha' => 'Google ReCaptcha', + 'standard' => '일반 캡차', + 'turnstile' => 'Turnstile', + ], 'captcha_key' => '캡차 키', 'captcha_secret' => '캡차 시크릿/ID', 'codepay_id' => '코드페이 ID', @@ -521,6 +477,7 @@ return [ 'ddns_secret' => 'DNS 서비스 제공자 시크릿', 'default_days' => '기본 유효 기간', 'default_traffic' => '기본 초기 데이터', + 'demo_restriction' => '데모 환경에서는 이 구성 변경이 금지되어 있습니다!', 'detection_check_times' => '차단 감지 알림', 'dingTalk_access_token' => '딩톡 커스텀 봇 액세스 토큰', 'dingTalk_secret' => '딩톡 커스텀 봇 시크릿', @@ -531,108 +488,19 @@ return [ 'f2fpay_app_id' => '애플리케이션 ID', 'f2fpay_private_key' => '애플리케이션 개인 키', 'f2fpay_public_key' => '알리페이 공개 키', + 'forbid' => [ + 'china' => '중국 차단', + 'mainland' => '중국 본토 차단', + 'oversea' => '해외 차단', + ], '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_QQPay' => 'QQ 지갑', - 'is_rand_port' => '랜덤 포트', - 'is_register' => '사용자 등록', - 'is_subscribe_ban' => '이상 구독 요청 자동 차단', - 'is_traffic_ban' => '이상 데이터 사용 자동 차단', - 'is_WeChatPay' => '위챗 결제', - 'iYuu_token' => 'IYUU 토큰', - 'maintenance_content' => '유지 보수 내용', - 'maintenance_mode' => '유지 보수 모드', - 'maintenance_time' => '유지 보수 종료 시간', - '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' => '앱 ID', - 'paybeaver_app_secret' => '앱 시크릿', - 'payjs_key' => '통신 키', - 'payjs_mch_id' => '상점 번호', - 'payment_confirm_notification' => '수동 결제 확인 알림', - 'payment_received_notification' => '결제 성공 알림', - 'paypal_app_id' => '앱 ID', - 'paypal_client_id' => '클라이언트 ID', - 'paypal_client_secret' => '클라이언트 시크릿 키', - 'pushDeer_key' => 'PushDeer 키', - 'pushplus_token' => 'PushPlus 토큰', - 'rand_subscribe' => '랜덤 구독', - 'redirect_url' => '리디렉션 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' => '공개 키', - 'stripe_secret_key' => '시크릿 키', - 'stripe_signing_secret' => '웹훅 서명 시크릿', - 'subject_name' => '맞춤 상품 이름', - 'subscribe_ban_times' => '구독 요청 임계값', - 'subscribe_domain' => '노드 구독 주소', - 'subscribe_max' => '구독 노드 수', - 'telegram_token' => '텔레그램 토큰', - 'tg_chat_token' => 'TG Chat 토큰', - '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' => '홈페이지 로고', - 'website_logo' => '웹사이트 로고', - 'website_name' => '웹사이트 이름', - 'website_security_code' => '웹사이트 보안 코드', - 'website_url' => '웹사이트 주소', - 'web_api_url' => 'API 접근 도메인', - 'wechat_aid' => '위챗 앱 ID', - 'wechat_cid' => '위챗 기업 ID', - 'wechat_encodingAESKey' => '위챗 앱 EncodingAESKey', - 'wechat_qrcode' => '위챗 QR 코드', - 'wechat_secret' => '위챗 앱 시크릿', - 'wechat_token' => '위챗 앱 토큰', 'hint' => [ + 'AppStore_id' => 'iOS 소프트웨어 설정 가이드에 사용된 애플 계정', + 'AppStore_password' => 'iOS 소프트웨어 설정 가이드에 사용된 애플 비밀번호', 'account_expire_notification' => '사용자에게 계정 만료 알림', 'active_times' => '24시간 내 이메일을 통해 계정 활성화 횟수', 'admin_invite_days' => '관리자가 생성한 초대 코드의 유효 기간', 'aff_salt' => '비워두면 초대 링크에 사용자 ID가 표시됩니다; 임의의 영문/숫자를 입력하면 사용자 링크 ID가 암호화됩니다', - 'AppStore_id' => 'iOS 소프트웨어 설정 가이드에 사용된 애플 계정', - 'AppStore_password' => 'iOS 소프트웨어 설정 가이드에 사용된 애플 비밀번호', 'auto_release_port' => '차단/만료된 계정의 포트를 자동으로 회수합니다 '.config('tasks.release_port').' 일 후 자동으로 포트를 회수합니다', 'bark_key' => 'iOS 장치로 푸시 메시지를 보내려면 Bark라는 앱을 설치하고, URL 뒤에 있는 긴 문자열을 입력해야 합니다. Bark를 활성화하려면 반드시 이 값을 입력해야 합니다.', 'captcha_key' => '설정 가이드를 보려면 여기를 클릭하세요', @@ -650,6 +518,7 @@ return [ 'f2fpay_private_key' => '키 생성 소프트웨어로 생성된 애플리케이션 개인 키', 'f2fpay_public_key' => '애플리케이션 공개 키가 아닙니다!', 'forbid_mode' => '지정된 지역의 IP를 차단, 차단되지 않은 지역은 정상 접근 가능', + 'iYuu_token' => 'IYUU를 활성화하려면 반드시 이 값을 입력해야 합니다(IYUU 토큰 신청)', 'invite_num' => '사용자가 기본적으로 초대할 수 있는 인원 수', 'is_activate_account' => '활성화 후 사용자가 이메일을 통해 계정을 활성화해야 합니다', 'is_ban_status' => '(신중하게) 전체 계정을 차단하면 모든 데이터가 초기화되고 사용자가 로그인할 수 없게 됩니다. 활성화하지 않으면 사용자 에이전트만 차단됩니다.', @@ -664,14 +533,14 @@ return [ 'is_register' => '비활성화 시 등록 불가', 'is_subscribe_ban' => '활성화 후 사용자 구독 링크 요청이 설정된 임계값을 초과하면 자동 차단', 'is_traffic_ban' => '1시간 내 데이터 이상 임계값을 초과하면 자동으로 계정 차단(프록시만 차단)', - 'iYuu_token' => 'IYUU를 활성화하려면 반드시 이 값을 입력해야 합니다(IYUU 토큰 신청)', 'maintenance_content' => '맞춤 유지 보수 내용 정보', - 'maintenance_mode' => "활성화 후 사용자가 유지 보수 페이지로 이동 | 관리자는 :url로 로그인", + 'maintenance_mode' => '활성화 후 사용자가 유지 보수 페이지로 이동 | 관리자는 :url로 로그인', 'maintenance_time' => '유지 보수 페이지 카운트다운에 사용', 'min_port' => '포트 범위: 1000~65535', 'node_blocked_notification' => '매 시간 노드 차단 여부를 감지하고 관리자에게 알림', 'node_daily_notification' => '각 노드의 전날 데이터 사용량 보고', 'node_offline_notification' => '10분마다 노드 오프라인 상태를 감지하고 관리자에게 알림', + 'node_renewal_notification' => '노드 만료 7일, 3일, 1일 전에 관리자가 갱신하도록 알립니다.', 'oauth_path' => '.ENV에 설정을 추가한 후 이곳에서 플랫폼을 활성화하세요', 'offline_check_times' => '24시간 내 n회 알림 후 더 이상 알림 없음', 'password_reset_notification' => '활성화 후 사용자가 비밀번호를 재설정할 수 있습니다', @@ -707,9 +576,10 @@ return [ 'traffic_ban_value' => '1시간 내 이 값을 초과하면 자동으로 계정 차단', 'traffic_limit_time' => '체크인 간격 시간', 'traffic_warning_percent' => '데이터 소진 알림 시작 임계값, 매일 사용자에게 알림', - 'username_type' => '사이트 사용자 계정 유형, 기본값은 이메일', 'user_invite_days' => '사용자가 생성한 초대 코드의 유효 기간', + 'username_type' => '사이트 사용자 계정 유형, 기본값은 이메일', 'v2ray_tls_provider' => '백엔드에서 자동으로 TLS 인증서를 발급/로드할 때 사용(노드 설정 값이 이 설정보다 우선)', + 'web_api_url' => '예: '.config('app.url'), 'webmaster_email' => '오류 메시지 표시 시 관리자 이메일을 연락처로 제공', 'website_analytics' => '분석 JS 코드', 'website_callback_url' => '웹사이트 도메인이 DNS 독에 의해 감염된 경우 결제 콜백 실패를 방지하기 위해 http:// 또는 https://로 시작해야 합니다', @@ -717,97 +587,247 @@ return [ 'website_name' => '이메일 발송 시 표시되는 웹사이트 이름', 'website_security_code' => '비워두지 않으면 보안 입구를 통해 보안 코드로 접근해야 합니다', 'website_url' => '비밀번호 재설정, 온라인 결제 생성에 필수', - 'web_api_url' => '예: '.config('app.url'), 'wechat_aid' => '응용 프로그램 관리에서 자가 생성 응용 프로그램 - AgentId', 'wechat_cid' => '내 기업에서 기업 ID 얻기', 'wechat_encodingAESKey' => '응용 프로그램 관리 -> 응용 프로그램 -> API 수신 설정 -> EncodingAESKey', 'wechat_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 토큰 입력 -> 업데이트 클릭', - 'pushplus_token' => 'ServerChan에서 신청', - 'dingTalk_access_token' => '커스텀 봇 WebHook의 access_token', - 'dingTalk_secret' => '커스텀 봇 서명 후 나타나는 시크릿', - 'wechat_aid' => '응용 프로그램의 AgentId', - 'wechat_cid' => 'WeChat 기업 ID 입력 -> 업데이트 클릭', - 'wechat_secret' => '응용 프로그램의 시크릿', - 'tg_chat_token' => 'Telegram에서 신청', - 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'iYuu_token' => 'IYUU 토큰', + 'invite_num' => '기본 초대 가능 인원', + 'is_AliPay' => '알리페이 결제', + 'is_QQPay' => 'QQ 지갑', + 'is_WeChatPay' => '위챗 결제', + 'is_activate_account' => '계정 활성화', + '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_rand_port' => '랜덤 포트', + 'is_register' => '사용자 등록', + 'is_subscribe_ban' => '이상 구독 요청 자동 차단', + 'is_traffic_ban' => '이상 데이터 사용 자동 차단', + 'maintenance_content' => '유지 보수 내용', + 'maintenance_mode' => '유지 보수 모드', + 'maintenance_time' => '유지 보수 종료 시간', + 'min_port' => '포트 범위', + 'min_rand_traffic' => '데이터 범위', + 'node_blocked_notification' => '노드 차단 알림', + 'node_daily_notification' => '노드 사용 보고서', + 'node_offline_notification' => '노드 오프라인 알림', + 'node_renewal_notification' => '노드 갱신 알림', + 'notification' => [ + 'channel' => [ + 'bark' => 'Bark', + 'dingtalk' => '딩톡', + 'email' => '이메일', + 'iyuu' => 'IYUU', + 'pushdeer' => 'PushDeer', + 'pushplus' => 'PushPlus', + 'serverchan' => 'ServerChan', + 'site' => '사이트 팝업', + 'telegram' => '텔레그램', + 'tg_chat' => 'TG Chat', + 'wechat' => '기업 위챗', + ], + 'send_test' => '테스트 메시지 보내기', + 'test' => [ + 'content' => '테스트 내용', + 'success' => '성공적으로 전송되었습니다. 휴대폰에서 푸시 알림을 확인하세요.', + 'title' => '이것은 테스트 제목입니다', + 'unknown_channel' => '알 수 없는 채널', + ], ], + 'oauth_path' => '타사 로그인 플랫폼', + 'offline_check_times' => '오프라인 알림 횟수', + 'params_required' => '먼저 이 :attribute의 필수 매개변수를 완료해 주세요!', + 'password_reset_notification' => '비밀번호 재설정 알림', + 'paybeaver_app_id' => '앱 ID', + 'paybeaver_app_secret' => '앱 시크릿', + 'payjs_key' => '통신 키', + 'payjs_mch_id' => '상점 번호', 'payment' => [ 'attribute' => '결제 설정', 'channel' => [ 'alipay' => '알리페이 F2F', 'codepay' => '코드페이', 'epay' => 'ePay', + 'manual' => '수동 결제', + 'paybeaver' => 'PayBeaver', 'payjs' => 'PayJs', 'paypal' => 'PayPal', 'stripe' => 'Stripe', - 'paybeaver' => 'PayBeaver', 'theadpay' => 'THeadPay', - 'manual' => '수동 결제', ], 'hint' => [ 'alipay' => '이 기능은 알리페이 오픈 플랫폼에서 권한 및 애플리케이션을 신청해야 합니다', 'codepay' => '코드페이에서 계정을 신청한 후 소프트웨어를 다운로드하고 설정합니다', + 'manual' => '게이트웨이를 설정하고 선택하면 사용자 인터페이스에 표시됩니다', + 'paybeaver' => 'PayBeaver에서 계정을 신청하세요', 'payjs' => 'PayJs에서 계정을 신청하세요', 'paypal' => 'API 자격 증명 신청 페이지에 상점 계정으로 로그인하여 설정 정보를 얻으세요', - 'paybeaver' => 'PayBeaver에서 계정을 신청하세요', 'theadpay' => 'THeadPay에서 계정을 신청하세요', - 'manual' => '게이트웨이를 설정하고 선택하면 사용자 인터페이스에 표시됩니다', ], ], - 'notification' => [ - 'channel' => [ - 'telegram' => '텔레그램', - 'wechat' => '기업 위챗', - 'dingtalk' => '딩톡', - 'email' => '이메일', - 'bark' => 'Bark', - 'serverchan' => 'ServerChan', - 'pushdeer' => 'PushDeer', - 'pushplus' => 'PushPlus', - 'iyuu' => 'IYUU', - 'tg_chat' => 'TG Chat', - 'site' => '사이트 팝업', - ], - 'send_test' => '테스트 메시지 보내기', + 'payment_confirm_notification' => '수동 결제 확인 알림', + 'payment_received_notification' => '결제 성공 알림', + 'paypal_app_id' => '앱 ID', + 'paypal_client_id' => '클라이언트 ID', + 'paypal_client_secret' => '클라이언트 시크릿 키', + 'placeholder' => [ + 'bark_key' => 'Bark 장치 키 입력 -> 업데이트 클릭', + 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'default_url' => '기본값: :url', + 'dingTalk_access_token' => '커스텀 봇 WebHook의 access_token', + 'dingTalk_secret' => '커스텀 봇 서명 후 나타나는 시크릿', + 'iYuu_token' => 'IYUU 토큰 입력 -> 업데이트 클릭', + 'pushDeer_key' => 'PushDeer Push Key 입력 -> 업데이트 클릭', + 'pushplus_token' => 'ServerChan에서 신청', + 'server_chan_key' => 'ServerChan SCKEY 입력 -> 업데이트 클릭', + 'telegram_token' => 'Telegram 토큰 입력 -> 업데이트 클릭', + 'tg_chat_token' => 'Telegram에서 신청', + 'wechat_aid' => '응용 프로그램의 AgentId', + 'wechat_cid' => 'WeChat 기업 ID 입력 -> 업데이트 클릭', + 'wechat_secret' => '응용 프로그램의 시크릿', ], - 'forbid' => [ - 'mainland' => '중국 본토 차단', - 'china' => '중국 차단', - 'oversea' => '해외 차단', + 'pushDeer_key' => 'PushDeer 키', + 'pushplus_token' => 'PushPlus 토큰', + 'rand_subscribe' => '랜덤 구독', + 'redirect_url' => '리디렉션 URL', + 'referral' => [ + 'loop' => '반복 리베이트', + 'once' => '첫 구매 리베이트', ], + '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' => '공개 키', + 'stripe_secret_key' => '시크릿 키', + 'stripe_signing_secret' => '웹훅 서명 시크릿', + 'subject_name' => '맞춤 상품 이름', + 'subscribe_ban_times' => '구독 요청 임계값', + 'subscribe_domain' => '노드 구독 주소', + 'subscribe_max' => '구독 노드 수', + 'telegram_token' => '텔레그램 토큰', + 'tg_chat_token' => 'TG Chat 토큰', + '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 라이센스', + 'user_invite_days' => '사용자 초대 유효 기간', 'username' => [ + 'any' => '임의 사용자 이름', 'email' => '이메일', 'mobile' => '전화번호', - 'any' => '임의 사용자 이름', ], - 'active_account' => [ - 'before' => '등록 전 활성화', - 'after' => '등록 후 활성화', + 'username_type' => '사용자 이름 유형', + 'v2ray_license' => 'V2Ray 라이센스', + 'v2ray_tls_provider' => 'V2Ray TLS 설정', + 'web_api_url' => 'API 접근 도메인', + 'webmaster_email' => '관리자 이메일', + 'website_analytics' => '웹사이트 분석 코드', + 'website_callback_url' => '일반 결제 콜백 주소', + 'website_customer_service' => '웹사이트 고객 서비스 코드', + 'website_home_logo' => '홈페이지 로고', + 'website_logo' => '웹사이트 로고', + 'website_name' => '웹사이트 이름', + 'website_security_code' => '웹사이트 보안 코드', + 'website_url' => '웹사이트 주소', + 'wechat_aid' => '위챗 앱 ID', + 'wechat_cid' => '위챗 기업 ID', + 'wechat_encodingAESKey' => '위챗 앱 EncodingAESKey', + 'wechat_qrcode' => '위챗 QR 코드', + 'wechat_secret' => '위챗 앱 시크릿', + 'wechat_token' => '위챗 앱 토큰', + ], + 'system_generate' => '시스템 생성', + 'ticket' => [ + 'close_confirm' => '이 티켓을 닫으시겠습니까?', + 'counts' => '총 :num 티켓', + 'error' => '알 수 없는 오류! 로그를 확인하십시오', + 'inviter_info' => '초대자 정보', + 'self_send' => '자신에게 티켓을 생성할 수 없습니다!', + 'send_to' => '대상 사용자 정보를 입력하십시오', + 'title' => '티켓 목록', + 'user_info' => '사용자 정보', + ], + 'times' => '회', + 'tools' => [ + 'analysis' => [ + 'file_missing' => ':file_name이 존재하지 않습니다. 먼저 파일을 생성하세요.', + 'not_enough' => '15,000개 미만의 기록으로 인해 분석 불가', + 'req_url' => '최근 요청 URL 기록', + 'title' => 'SSR 로그 분석 단일 노드에만 해당', ], - 'captcha' => [ - 'standard' => '일반 캡차', - 'geetest' => 'Geetest', - 'recaptcha' => 'Google ReCaptcha', - 'hcaptcha' => 'hCaptcha', - 'turnstile' => 'Turnstile', + 'convert' => [ + 'content_placeholder' => '변환할 구성 정보를 입력하십시오.', + 'file_missing' => '파일을 찾을 수 없습니다. 디렉터리 권한을 확인하세요.', + 'missing_error' => '변환 실패: 구성 정보에 [port_password] 필드가 누락되었거나 이 필드가 비어 있습니다.', + 'params_unknown' => '매개변수 예외', + 'title' => '포맷 변환 SS에서 SSR로', ], - 'referral' => [ - 'once' => '첫 구매 리베이트', - 'loop' => '반복 리베이트', + 'decompile' => [ + 'attribute' => '역구성 링크', + 'content_placeholder' => '역구성할 ShadowsocksR 링크를 입력하십시오. 줄 바꿈으로 구분합니다.', + 'title' => '디컴파일 구성 정보', + ], + 'import' => [ + 'file_error' => '알 수 없는 오류가 발생했습니다. 다시 업로드해 주세요.', + 'file_required' => '업로드할 파일을 선택하세요', + 'file_type_error' => ':type 파일만 업로드가 허용됩니다.', + 'format_error' => '콘텐츠 형식 분석 오류가 발생했습니다. 지정된 형식에 맞는 :type 파일을 업로드해 주세요.', ], ], - 'set_to' => ':attribute로 설정', - 'minute' => '분', - 'query' => '쿼리', - 'optional' => '선택 사항', - 'require' => '필수 사항', + 'unselected_hint' => '할당할 규칙을 여기서 검색할 수 있습니다', + 'user' => [ + 'admin_deletion' => '시스템 관리자는 삭제할 수 없습니다', + 'bulk_account_quantity' => '일괄 생성된 계정 수', + 'connection_test' => '연결 테스트', + 'counts' => '총 :num 계정', + 'group' => [ + 'counts' => '총 :num 그룹', + 'name' => '그룹 이름', + 'title' => '사용자 그룹 제어 (동일 노드는 여러 그룹에 속할 수 있지만, 사용자는 하나의 그룹에만 속할 수 있습니다. 사용자에게 보이는/사용 가능한 노드의 경우, 그룹이 레벨보다 우선합니다)', + ], + 'info' => [ + 'account' => '계정 정보', + 'expired_date_hint' => '비워두면 기본 유효 기간은 1년입니다', + 'proxy' => '프록시 정보', + 'recharge_placeholder' => '음수 입력 시 잔액 차감', + 'reset_date_hint' => '다음 데이터 초기화 날짜', + 'switch' => '역할 전환', + 'uuid_hint' => 'V2Ray의 UUID', + ], + 'online_monitor' => '온라인 모니터링', + 'proxies_config' => '【:username】의 연결 설정 정보', + 'proxy_info' => '설정 정보', + 'reset_confirm' => [0 => '【', 1 => '】의 트래픽을 초기화하시겠습니까?'], + 'reset_traffic' => '트래픽 초기화', + 'traffic_monitor' => '트래픽 통계', + 'update_help' => '업데이트 성공, 돌아가시겠습니까?', + 'user_view' => '사용자 뷰로 전환', + ], + 'user_dashboard' => '개인 센터', + 'yes' => '예', + 'zero_unlimited_hint' => '설정하지 않음/0, 무제한', ]; diff --git a/resources/lang/ko/auth.php b/resources/lang/ko/auth.php index 70f6599f..6eddcc90 100644 --- a/resources/lang/ko/auth.php +++ b/resources/lang/ko/auth.php @@ -40,27 +40,18 @@ return [ ], 'failed' => '제출된 인증 정보가 레코드와 일치하지 않습니다.', 'invite' => [ - 'attribute' => '초대 코드', - 'error' => [ - 'unavailable' => '유효하지 않은 초대 코드입니다. 다시 시도해 주세요.', - ], 'get' => '초대 코드 받기', 'not_required' => '초대 코드가 필요 없습니다. 바로 등록할 수 있습니다!', + 'unavailable' => '유효하지 않은 초대 코드입니다. 다시 시도해 주세요.', ], 'login' => '로그인', 'logout' => '로그아웃', 'maintenance' => '유지 보수', 'maintenance_tip' => '유지 보수 중', 'oauth' => [ - 'bind_failed' => '연동 실패', - 'bind_success' => '연동 성공', 'login_failed' => '서드파티 로그인 실패!', - 'rebind_success' => '재연동 성공', 'register' => '빠른 등록', - 'register_failed' => '등록 실패', 'registered' => '이미 등록되었습니다. 바로 로그인해 주세요.', - 'unbind_failed' => '연동 해제 실패', - 'unbind_success' => '연동 해제 성공', ], 'one-click_login' => '원클릭 로그인', 'optional' => '선택 사항', @@ -73,7 +64,6 @@ return [ 'error' => [ 'demo' => '데모 모드에서는 관리자 비밀번호를 변경할 수 없습니다.', 'disabled' => '비밀번호 재설정이 비활성화되었습니다. 도움이 필요하면 :email로 연락해 주세요.', - 'failed' => '비밀번호 재설정 실패.', 'same' => '새 비밀번호는 기존 비밀번호와 다르게 설정해 주세요.', 'throttle' => '24시간 내에 :time회만 비밀번호를 재설정할 수 있습니다. 너무 자주 시도하지 마세요.', 'wrong' => '잘못된 비밀번호입니다. 다시 입력해 주세요.', @@ -91,7 +81,6 @@ return [ ], 'failed' => '등록 실패, 나중에 다시 시도해 주세요.', 'promotion' => '계정이 없으신가요? ', - 'success' => '등록 성공', ], 'remember_me' => '기억하기', 'request' => '요청', diff --git a/resources/lang/ko/common.php b/resources/lang/ko/common.php index a7e90fdc..d6c40ac3 100644 --- a/resources/lang/ko/common.php +++ b/resources/lang/ko/common.php @@ -3,141 +3,150 @@ declare(strict_types=1); return [ - 'hour' => '{1} 시간|{2} 시', 'account' => '계정', + 'action' => '작업', + 'active_item' => ':attribute 활성화', + 'add' => '추가', + 'advance' => '고급', + 'all' => '전체', + 'applied' => ':attribute 적용됨', + 'apply' => '적용', 'available_date' => '유효 기간', - 'created_at' => '생성 날짜', - 'expired_at' => '만료 날짜', - 'updated_at' => '마지막 업데이트', - 'latest_at' => '최근 활동', + 'avatar' => '아바타', 'back' => '뒤로', 'back_to' => ':page로 돌아가기', + 'bark' => [ + 'custom' => '사용자 정의 정보', + 'node_status' => '노드 상태', + ], 'cancel' => '취소', + 'change' => '변경', 'close' => '닫기', 'close_item' => ':attribute 닫기', 'confirm' => '확인', 'continue' => '계속', - 'open' => '열기', - 'send' => '보내기', - 'view' => '보기', - 'reset' => '재설정', + 'convert' => '변환', 'copy' => [ 'attribute' => '복사', - 'success' => '복사 성공', 'failed' => '복사 실패, 수동으로 복사해 주세요', + 'success' => '복사 성공', ], - 'add' => '추가', - 'free' => '무료', - 'change' => '변경', - 'submit' => '제출', - 'submit_item' => ':attribute 제출', - 'generate' => '생성', - 'generate_item' => ':attribute 생성', - 'to_safari' => [0 => '오른쪽 상단을 클릭', 1 => ', 그런 다음', 2 => 'Safari에서 열기', 3 => '를 선택하여 이 사이트에 정상적으로 접근하세요!'], - 'update_browser' => [0 => '현재', 1 => '구식', 2 => ' 브라우저를 사용 중입니다. ', 3 => '브라우저를 업데이트', 4 => '하여 최상의 경험을 누리세요'], - 'apply' => '적용', - 'avatar' => '아바타', + 'create' => '생성하다', + 'created_at' => '생성 날짜', 'customize' => '사용자 정의', - 'all' => '전체', - 'default' => '기본값', - 'download' => '다운로드', - 'goto' => '이동', - 'warning' => '경고', - 'success' => '성공', - 'success_item' => ':attribute 성공', - 'failed' => '실패', - 'failed_item' => ':attribute 실패', - 'update' => '업데이트', - 'update_action' => ':action 업데이트', - 'none' => '없음', - 'new' => '새로운', - 'sorry' => '죄송합니다', - 'applied' => ':attribute 적용됨', - 'active_item' => ':attribute 활성화', - 'error' => '오류', - 'toggle' => '전환', - 'toggle_action' => ':action 전환', - 'request_url' => '요청 URL', - 'function' => [ - 'navigation' => '탐색', - 'menubar' => '메뉴바', - 'fullscreen' => '전체 화면', - ], 'days' => [ 'attribute' => '{1} 일|{2} 일', + 'next' => '다음 날', 'weekend' => '주말', 'work' => '평일', - 'next' => '다음 날', ], - 'qrcode' => ':attribute QR 코드', + 'default' => '기본값', + 'delete' => '삭제', 'deleted' => '삭제됨', 'deleted_item' => ':attribute 삭제됨', - 'print' => '인쇄', - 'unlimited' => '무제한', - 'payment' => [ - 'credit' => '크레딧', - 'alipay' => '알리페이', - 'qq' => 'QQ 지갑', - 'wechat' => '위챗 페이', - 'crypto' => '암호화폐', - 'manual' => '수동 결제', - 'status' => [ - 'wait' => '결제 대기 중', - ], + 'developing' => '개발 중입니다! 기대해 주세요', + 'download' => '다운로드', + 'edit' => '편집', + 'error' => '오류', + 'error_action_item' => ':action:attribute 오류', + 'error_item' => ':attribute 오류', + 'exists_error' => ':attribute 아래에 연관된 계정이 있습니다. 먼저 연관을 해제해 주세요!', + 'expired_at' => '만료 날짜', + 'export' => '내보내기', + 'failed' => '실패', + 'failed_action_item' => ':action:attribute 실패', + 'failed_item' => ':attribute 실패', + 'free' => '무료', + 'function' => [ + 'fullscreen' => '전체 화면', + 'menubar' => '메뉴바', + 'navigation' => '탐색', ], + 'generate' => '생성', + 'generate_item' => ':attribute 생성', + 'goto' => '이동', + 'hour' => '{1} 시간|{2} 시', + 'import' => '가져오기', + 'latest_at' => '최근 활동', + 'more' => '더보기', + 'new' => '새로운', + 'none' => '없음', + 'open' => '열기', + 'or' => '또는', 'order' => [ 'status' => [ 'canceled' => '취소됨', 'completed' => '완료됨', - 'prepaid' => '선불', 'ongoing' => '진행 중', + 'prepaid' => '선불', 'review' => '검토 대기 중', ], ], + 'payment' => [ + 'alipay' => '알리페이', + 'credit' => '크레딧', + 'crypto' => '암호화폐', + 'manual' => '수동 결제', + 'qq' => 'QQ 지갑', + 'wechat' => '위챗 페이', + ], + 'print' => '인쇄', + 'qrcode' => ':attribute QR 코드', + 'random_generate' => '무작위로 생성하려면 비워 두세요', 'recommend' => '추천', - 'advance' => '고급', - 'action' => '작업', + 'request' => '요청', + 'request_failed' => '요청 실패, 다시 시도해 주세요', + 'request_url' => '요청 URL', + 'reset' => '재설정', 'search' => '검색', - 'edit' => '편집', - 'delete' => '삭제', + 'send' => '보내기', + 'sorry' => '죄송합니다', 'status' => [ + 'applying' => '신청 중', 'attribute' => '상태', - 'inactive' => '비활성화', - 'disabled' => '비활성화됨', + 'available' => '사용 가능', 'banned' => '금지됨', - 'normal' => '정상', + 'closed' => '닫힘', + 'disabled' => '비활성화됨', 'enabled' => '활성화됨', 'expire' => '만료됨', + 'inactive' => '비활성화', 'limited' => '제한됨', - 'run_out' => '데이터 소진', - 'unused' => '미사용', - 'used' => '사용됨', - 'closed' => '닫힘', - 'applying' => '신청 중', - 'withdrawn' => '철회됨', - 'unwithdrawn' => '미철회', - 'reply' => '답변됨', + 'normal' => '정상', + 'paid' => '지불됨', + 'pass' => '통과', + 'payment_pending' => '지불 대기 중', 'pending' => '보류 중', - 'unknown' => '알 수 없음', - 'available' => '사용 가능', + 'pending_dispatch' => '배송 대기 중', 'reject' => '거부', 'rejected' => '거부됨', + 'reply' => '답변됨', 'review' => '검토 중', 'reviewed' => '검토 완료', - 'paid' => '지불됨', - 'payment_pending' => '지불 대기 중', - 'pass' => '통과', + 'run_out' => '데이터 소진', 'send_to_credit' => '크레딧으로 추가', - 'waiting_tobe_send' => '발송 대기 중', + 'unknown' => '알 수 없음', + 'unused' => '미사용', + 'used' => '사용됨', + 'withdrawal_pending' => '미철회', + 'withdrawn' => '철회됨', ], 'stay_unchanged' => '변경하지 않으려면 비워 두세요', - 'random_generate' => '무작위로 생성하려면 비워 두세요', - 'request_failed' => '요청 실패, 다시 시도해 주세요', - 'convert' => '변환', - 'import' => '가져오기', - 'or' => '또는', - 'more' => '더보기', + 'storage_logo' => '로고 저장소', + 'store' => '저장소', + 'submit' => '제출', + 'success' => '성공', + 'success_action_item' => ':action:attribute 성공', + 'success_item' => ':attribute 성공', 'to' => '까지', 'to_be_send' => '발송 예정', - 'developing' => '개발 중입니다! 기대해 주세요', + 'to_safari' => '오른쪽 상단의 아이콘을 클릭한 다음 Safari Safari에서 열기를 선택하면 웹사이트에 정상적으로 접근할 수 있습니다! +', + 'toggle' => '전환', + 'toggle_action' => ':action 전환', + 'unlimited' => '무제한', + 'update' => '업데이트', + 'updated_at' => '마지막 업데이트', + 'view' => '보기', + 'warning' => '경고', ]; diff --git a/resources/lang/ko/errors.php b/resources/lang/ko/errors.php index ee817668..bdb9b263 100644 --- a/resources/lang/ko/errors.php +++ b/resources/lang/ko/errors.php @@ -8,29 +8,29 @@ return [ 'bots' => '봇 접근이 감지되었습니다. 접근이 거부되었습니다.', 'china' => '중국 IP 또는 프록시 접근이 감지되었습니다. 접근이 거부되었습니다.', 'oversea' => '해외 IP 또는 프록시 접근이 감지되었습니다. 접근이 거부되었습니다.', - 'unknown' => '알 수 없는 금지 액세스 모드입니다! 시스템 설정에서 [접근 제한 모드]를 수정하십시오!', 'redirect' => '(:ip :url) 구독 링크를 통해 접근이 감지되어 강제 리디렉션 중입니다.', + 'unknown' => '알 수 없는 금지 액세스 모드입니다! 시스템 설정에서 [접근 제한 모드]를 수정하십시오!', ], + 'get_ip' => 'IP 정보를 가져오지 못했습니다', 'log' => '로그', 'refresh' => '새로 고침', 'refresh_page' => '페이지를 새로 고친 후 다시 시도해 주세요', 'report' => '오류 보고서 포함: ', - 'safe_enter' => '안전한 입구', 'safe_code' => '안전 코드를 입력해 주세요', + 'safe_enter' => '안전한 입구', + 'subscribe' => [ + 'banned_until' => '계정이 :time까지 차단되었습니다. 잠금 해제될 때까지 기다려 주세요!', + 'expired' => '계정이 만료되었습니다! 구독을 갱신해 주세요!', + 'none' => '사용 가능한 노드가 없습니다', + 'out' => '데이터가 소진되었습니다! 더 구매하거나 데이터를 재설정해 주세요!', + 'question' => '계정에 문제가 있습니다! 자세한 내용은 웹사이트를 방문해 주세요', + 'sub_banned' => '구독이 차단되었습니다! 자세한 내용은 웹사이트를 방문해 주세요', + 'unknown' => '잘못된 구독 링크입니다! 새 링크를 받아 주세요!', + 'user' => '잘못된 URL입니다. 계정이 존재하지 않습니다!', + 'user_disabled' => '계정이 비활성화되었습니다! 지원팀에 문의해 주세요!', + ], 'title' => '⚠️ 오류 발생', 'unsafe_enter' => '안전하지 않은 입구', 'visit' => '방문해 주세요', 'whoops' => '이런!', - 'get_ip' => 'IP 정보를 가져오지 못했습니다', - 'subscribe' => [ - 'unknown' => '잘못된 구독 링크입니다! 새 링크를 받아 주세요!', - 'sub_banned' => '구독이 차단되었습니다! 자세한 내용은 웹사이트를 방문해 주세요', - 'user' => '잘못된 URL입니다. 계정이 존재하지 않습니다!', - 'user_disabled' => '계정이 비활성화되었습니다! 지원팀에 문의해 주세요!', - 'banned_until' => '계정이 :time까지 차단되었습니다. 잠금 해제될 때까지 기다려 주세요!', - 'out' => '데이터가 소진되었습니다! 더 구매하거나 데이터를 재설정해 주세요!', - 'expired' => '계정이 만료되었습니다! 구독을 갱신해 주세요!', - 'question' => '계정에 문제가 있습니다! 자세한 내용은 웹사이트를 방문해 주세요', - 'none' => '사용 가능한 노드가 없습니다', - ], ]; diff --git a/resources/lang/ko/model.php b/resources/lang/ko/model.php index a596ac43..d73c4490 100644 --- a/resources/lang/ko/model.php +++ b/resources/lang/ko/model.php @@ -3,105 +3,114 @@ declare(strict_types=1); return [ - 'user' => [ - 'id' => '사용자 ID', - 'attribute' => '사용자', - 'nickname' => '닉네임', - 'username' => '사용자 이름', - 'password' => '비밀번호', - 'credit' => '잔액', - 'invite_num' => '초대 가능 수', - 'reset_date' => '데이터 초기화 날짜', - 'port' => '포트', - 'traffic_used' => '사용된 데이터', - 'service' => '프록시 서비스', - 'group' => '그룹', - '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' => '등록 날짜', + 'aff' => [ + 'amount' => '주문 금액', + 'commission' => '커미션', + 'created_at' => '주문 날짜', + 'invitee' => '구매자', + 'updated_at' => '처리 날짜', + ], + 'article' => [ + 'attribute' => '기사', + 'category' => '카테고리', + 'created_at' => '게시 날짜', + 'language' => '언어', + 'logo' => '표지', + 'updated_at' => '업데이트 날짜', ], 'common' => [ - 'extend' => '확장 정보', - 'sort' => '정렬', 'description' => '설명', - 'type' => '유형', + 'extend' => '확장 정보', 'level' => '레벨', + 'sort' => '정렬', + 'type' => '유형', ], 'country' => [ 'code' => '국가 코드', 'icon' => '국기', 'name' => '국가 이름', ], - 'subscribe' => [ - 'code' => '구독 코드', - 'req_times' => '요청 횟수', - 'updated_at' => '마지막 요청', - 'ban_time' => '차단 시간', - 'ban_desc' => '차단 이유', - 'req_ip' => '요청 IP', - 'req_header' => '요청 헤더', + 'coupon' => [ + 'attribute' => '쿠폰', + 'groups' => '그룹 제한', + 'levels' => '레벨 제한', + 'logo' => '로고', + 'minimum' => '최소 사용 금액', + 'name' => '이름', + 'newbie' => '신규 사용자 전용', + 'num' => '수량', + 'priority' => '우선순위', + 'services_blacklist' => '차단 상품', + 'services_whitelist' => '허용 상품', + 'sn' => '코드', + 'usable_times' => '사용 제한', + 'used' => '개인 제한', + 'users_blacklist' => '차단 사용자', + 'users_whitelist' => '허용 사용자', + 'value' => '가치', ], - 'oauth' => [ - 'type' => '채널', - 'identifier' => '식별자', + 'goods' => [ + 'attribute' => '상품', + 'available_date' => '유효 기간', + 'category' => '카테고리', + 'color' => '색상', + 'hot' => '베스트셀러', + 'info' => '사용자 정의 정보', + 'invite_num' => '보너스 초대 수', + 'limit_num' => '구매 제한', + 'logo' => '로고', + 'name' => '이름', + 'period' => '초기화 주기', + 'price' => '가격', + 'renew' => '데이터 갱신 가격', + 'traffic' => '데이터 허용량', + 'user_limit' => '사용자 속도 제한', ], - 'user_group' => [ - 'attribute' => '사용자 그룹', - 'name' => '그룹 이름', - 'nodes' => '노드', + 'ip' => [ + 'info' => '위치', + 'network_type' => '네트워크 유형', ], 'node' => [ 'attribute' => '노드', - 'id' => '노드 ID', - 'name' => '이름', - 'domain' => '도메인', - 'static' => '상태', - 'online_user' => '온라인 사용자', + 'client_limit' => '클라이언트 제한', + 'country' => '국가', 'data_consume' => '데이터 사용량', 'data_rate' => '데이터 비율', 'ddns' => 'DDNS', + 'detection' => '차단 감지', + 'display' => '표시 및 구독', + 'domain' => '도메인', + 'id' => '노드 ID', 'ipv4' => 'IPv4', 'ipv6' => 'IPv6', - 'push_port' => '푸시 포트', - 'rule_group' => '규칙 그룹', - 'traffic_limit' => '속도 제한', - 'client_limit' => '클라이언트 제한', 'label' => '라벨', - 'country' => '국가', - 'udp' => 'UDP', - 'display' => '표시 및 구독', - 'detection' => '차단 감지', 'method' => '암호화', - 'protocol' => '프로토콜', - 'protocol_param' => '프로토콜 매개변수', + 'name' => '이름', + 'next_renewal_date' => '다음 갱신 날짜', 'obfs' => '혼란', 'obfs_param' => '혼란 매개변수', - 'single' => '단일 포트', - 'transfer' => '전송', + 'online_user' => '온라인 사용자', + 'protocol' => '프로토콜', + 'protocol_param' => '프로토콜 매개변수', + 'push_port' => '푸시 포트', + 'relay_port' => '릴레이 포트', + 'renewal_cost' => '청구 금액', 'service_port' => '서비스 포트', + 'single' => '단일 포트', 'single_passwd' => '[단일] 비밀번호', + 'static' => '상태', + 'subscription_term' => '구독 기간', + 'traffic_limit' => '속도 제한', + 'transfer' => '전송', + 'udp' => 'UDP', 'v2_alter_id' => '대체 ID', - 'v2_net' => '네트워크', 'v2_cover' => '커버', 'v2_host' => '호스트', + 'v2_net' => '네트워크', 'v2_path' => '경로 | 키', 'v2_sni' => 'SNI', 'v2_tls' => 'TLS', 'v2_tls_provider' => 'TLS 구성', - 'relay_port' => '릴레이 포트', ], 'node_auth' => [ 'attribute' => '노드 인증', @@ -111,36 +120,44 @@ return [ 'node_cert' => [ 'attribute' => '도메인 인증서', 'domain' => '도메인', + 'expired_date' => '만료 날짜', + 'issuer' => '발급자', 'key' => '키', 'pem' => 'PEM', - 'issuer' => '발급자', 'signed_date' => '발급 날짜', - 'expired_date' => '만료 날짜', + ], + 'notification' => [ + 'address' => '수신자', + 'created_at' => '발송 날짜', + 'status' => '상태', + ], + 'oauth' => [ + 'identifier' => '식별자', + 'type' => '채널', ], 'order' => [ 'attribute' => '주문', 'id' => '주문 ID', 'original_price' => '원래 가격', - 'price' => '실제 가격', 'pay_way' => '결제 방식', + 'price' => '실제 가격', 'status' => '상태', ], - 'goods' => [ - 'attribute' => '상품', + 'permission' => [ + 'attribute' => '권한', + 'description' => '설명', + 'name' => '경로 이름', + ], + 'referral' => [ + 'amount' => '금액', + 'created_at' => '신청 날짜', + 'id' => '신청 ID', + 'user' => '신청자', + ], + 'role' => [ + 'attribute' => '역할', 'name' => '이름', - 'price' => '가격', - 'category' => '카테고리', - 'renew' => '데이터 갱신 가격', - 'user_limit' => '사용자 속도 제한', - 'period' => '초기화 주기', - 'traffic' => '데이터 허용량', - 'invite_num' => '보너스 초대 수', - 'limit_num' => '구매 제한', - 'available_date' => '유효 기간', - 'hot' => '베스트셀러', - 'color' => '색상', - 'logo' => '로고', - 'info' => '사용자 정의 정보', + 'permissions' => '권한', ], 'rule' => [ 'attribute' => '규칙', @@ -150,83 +167,67 @@ return [ 'rule_group' => [ 'attribute' => '규칙 그룹', 'name' => '이름', - 'type' => '유형', 'rules' => '규칙', + 'type' => '유형', ], - 'role' => [ - 'attribute' => '역할', - 'name' => '이름', - 'permissions' => '권한', + 'subscribe' => [ + 'ban_desc' => '차단 이유', + 'ban_time' => '차단 시간', + 'code' => '구독 코드', + 'req_header' => '요청 헤더', + 'req_ip' => '요청 IP', + 'req_times' => '요청 횟수', + 'updated_at' => '마지막 요청', ], - 'permission' => [ - 'attribute' => '권한', - 'description' => '설명', - 'name' => '경로 이름', - ], - 'article' => [ - 'attribute' => '기사', - 'category' => '카테고리', - 'language' => '언어', - 'logo' => '표지', - 'created_at' => '게시 날짜', - 'updated_at' => '업데이트 날짜', - ], - 'coupon' => [ - 'attribute' => '쿠폰', - 'name' => '이름', - 'sn' => '코드', - 'logo' => '로고', - 'value' => '가치', - 'priority' => '우선순위', - 'usable_times' => '사용 제한', - 'minimum' => '최소 사용 금액', - 'used' => '개인 제한', - 'levels' => '레벨 제한', - 'groups' => '그룹 제한', - 'users_whitelist' => '허용 사용자', - 'users_blacklist' => '차단 사용자', - 'services_whitelist' => '허용 상품', - 'services_blacklist' => '차단 상품', - 'newbie' => '신규 사용자 전용', - 'num' => '수량', - ], - 'aff' => [ - 'invitee' => '구매자', - 'amount' => '주문 금액', - 'commission' => '커미션', - 'updated_at' => '처리 날짜', - 'created_at' => '주문 날짜', - ], - 'referral' => [ - 'created_at' => '신청 날짜', - 'user' => '신청자', - 'amount' => '금액', - 'id' => '신청 ID', - ], - 'notification' => [ - 'address' => '수신자', - 'created_at' => '발송 날짜', - 'status' => '상태', - ], - 'ip' => [ - 'network_type' => '네트워크 유형', - 'info' => '위치', - ], - 'user_traffic' => [ - 'upload' => '업로드', - 'download' => '다운로드', - 'total' => '총 데이터', - 'log_time' => '기록 시간', - ], - 'user_data_modify' => [ - 'before' => '변경 전', - 'after' => '변경 후', - 'created_at' => '변경 날짜', + 'user' => [ + 'account_status' => '계정 상태', + 'attribute' => '사용자', + 'created_date' => '등록 날짜', + 'credit' => '잔액', + 'expired_date' => '만료 날짜', + 'id' => '사용자 ID', + 'invite_num' => '초대 가능 수', + 'inviter' => '초대자', + 'nickname' => '닉네임', + 'password' => '비밀번호', + 'port' => '포트', + 'proxy_method' => '암호화 방식', + 'proxy_obfs' => '혼란 방식', + 'proxy_passwd' => '프록시 비밀번호', + 'proxy_protocol' => '프록시 프로토콜', + 'proxy_status' => '프록시 상태', + 'qq' => 'QQ', + 'remark' => '비고', + 'reset_date' => '데이터 초기화 날짜', + 'role' => '역할', + 'service' => '프록시 서비스', + 'speed_limit' => '속도 제한', + 'traffic_used' => '사용된 데이터', + 'usable_traffic' => '사용 가능한 데이터', + 'username' => '사용자 이름', + 'uuid' => 'VMess UUID', + 'wechat' => '위챗', ], 'user_credit' => [ - 'before' => '변경 전 잔액', 'after' => '변경 후 잔액', 'amount' => '변경 금액', + 'before' => '변경 전 잔액', 'created_at' => '변경 날짜', ], + 'user_data_modify' => [ + 'after' => '변경 후', + 'before' => '변경 전', + 'created_at' => '변경 날짜', + ], + 'user_group' => [ + 'attribute' => '사용자 그룹', + 'name' => '그룹 이름', + 'nodes' => '노드', + ], + 'user_traffic' => [ + 'download' => '다운로드', + 'log_time' => '기록 시간', + 'total' => '총 데이터', + 'upload' => '업로드', + ], ]; diff --git a/resources/lang/ko/notification.php b/resources/lang/ko/notification.php index 108db8a8..20015846 100644 --- a/resources/lang/ko/notification.php +++ b/resources/lang/ko/notification.php @@ -3,35 +3,49 @@ declare(strict_types=1); return [ - 'attribute' => '알림', - 'new' => '새 메시지가 :num개 있습니다', - 'empty' => '현재 새 메시지가 없습니다', - 'payment_received' => '주문 결제가 완료되었습니다. 금액: :amount, 주문 세부사항을 확인하세요', 'account_expired' => '계정 만료 알림', - 'account_expired_content' => '귀하의 계정이 :days일 후에 만료됩니다. 정상적인 사용을 위해 즉시 갱신해 주세요', 'account_expired_blade' => '귀하의 계정이 :days일 후에 만료됩니다. 즉시 갱신해 주세요', + 'account_expired_content' => '귀하의 계정이 :days일 후에 만료됩니다. 정상적인 사용을 위해 즉시 갱신해 주세요', 'active_email' => '30분 내에 인증을 완료해 주세요', + 'attribute' => '알림', + 'block_report' => '상세 차단 로그:', 'close_ticket' => '티켓 번호:id, 제목:title이(가) 닫혔습니다', - 'view_web' => '우리의 웹사이트 방문', - 'view_ticket' => '이 티켓의 진행 상황 보기', + 'data_anomaly' => '데이터 이상 사용자 알림', + 'data_anomaly_content' => '사용자:id, 최근 1시간 데이터 사용량 (업로드: :upload, 다운로드: :download, 총계: :total)', + 'details' => '세부정보 보기', + 'details_btn' => '아래 버튼을 클릭하여 세부정보를 확인하십시오.', + 'ding_bot_limit' => '각 봇은 그룹에 1분당 최대 20개의 메시지를 보낼 수 있습니다. 이 제한을 초과하면 10분 동안 속도 제한이 적용됩니다.', + 'empty' => '현재 새 메시지가 없습니다', + 'error' => '[:channel] 메시지 푸시 예외: :reason', + 'get_access_token_failed' => 'access_token을 가져오는 데 실패했습니다!\n요청 파라미터: :body', + 'into_maintenance' => '자동으로 유지 관리 모드로 전환', + 'new' => '새 메시지가 :num개 있습니다', 'new_ticket' => '새 티켓:title에 대한 답변이 있습니다. 확인해 주세요', - 'reply_ticket' => '티켓 답변: :title', - 'ticket_content' => '티켓 내용:', + 'next_check_time' => '다음 노드 차단 탐지 시간: :time', + 'node' => [ + 'download' => '다운로드 트래픽', + 'total' => '총 트래픽', + 'upload' => '업로드 트래픽', + ], 'node_block' => '노드 차단 경고 알림', 'node_offline' => '노드 오프라인 경고', 'node_offline_content' => '다음 노드가 비정상적일 수 있습니다. 오프라인일 가능성이 있습니다:', - 'block_report' => '상세 차단 로그:', - 'traffic_warning' => '데이터 사용량 경고', + 'node_renewal' => '노드 갱신 알림', + 'node_renewal_blade' => '다음 노드가 곧 만료됩니다. 사전에 갱신해 주시기 바랍니다: :nodes', + 'node_renewal_content' => '다음 노드가 곧 만료됩니다. 서비스 중단을 방지하기 위해 만료 전 갱신해 주시기 바랍니다.', + 'payment_received' => '주문 결제가 완료되었습니다. 금액: :amount, 주문 세부사항을 확인하세요', + 'reply_ticket' => '티켓 답변: :title', + 'reset_failed' => '[일일 작업] 사용자 :uid - :username 데이터 재설정 실패', + 'serverChan_exhausted' => '오늘의 한도가 소진되었습니다!', + 'serverChan_limit' => '분당 빈도가 너무 높습니다. 알림 설정을 최적화하세요!', + 'sign_failed' => '보안 서명 검증 실패', + 'ticket_content' => '티켓 내용:', 'traffic_remain' => '귀하의 데이터 사용량이 :percent%입니다. 합리적으로 사용해 주세요', 'traffic_tips' => '데이터 초기화 날짜에 유의하고, 합리적으로 사용하거나 소진 후 충전해 주세요', - 'verification_account' => '계정 인증 알림', + 'traffic_warning' => '데이터 사용량 경고', 'verification' => '귀하의 인증 코드는:', + 'verification_account' => '계정 인증 알림', 'verification_limit' => ':minutes분 내에 인증을 완료해 주세요', - 'data_anomaly' => '데이터 이상 사용자 알림', - 'data_anomaly_content' => '사용자:id, 최근 1시간 데이터 사용량 (업로드: :upload, 다운로드: :download, 총계: :total)', - 'node' => [ - 'upload' => '업로드 트래픽', - 'download' => '다운로드 트래픽', - 'total' => '총 트래픽', - ], + 'view_ticket' => '이 티켓의 진행 상황 보기', + 'view_web' => '우리의 웹사이트 방문', ]; diff --git a/resources/lang/ko/setup.php b/resources/lang/ko/setup.php new file mode 100644 index 00000000..6a0c8687 --- /dev/null +++ b/resources/lang/ko/setup.php @@ -0,0 +1,10 @@ + '데모 모드가 감지되었습니다. 데이터베이스를 재설정하시겠습니까?', + 'update_cache' => '캐시 업데이트 중...', + 'update_complete' => '업데이트 완료!', + 'update_db' => '데이터베이스 업데이트 중...', +]; diff --git a/resources/lang/ko/user.php b/resources/lang/ko/user.php index 15a63e08..8283dbc7 100644 --- a/resources/lang/ko/user.php +++ b/resources/lang/ko/user.php @@ -4,234 +4,273 @@ declare(strict_types=1); return [ 'account' => [ - 'credit' => '계정 잔액', - 'status' => '계정 상태', - 'level' => '계정 등급', - 'group' => '소속 그룹', - 'speed_limit' => '속도 제한', - 'remain' => '남은 데이터', - 'time' => '플랜 유효 기간', - 'last_login' => '최근 로그인', - 'reset' => '{0} 데이터가 :days 후에 초기화됩니다 |{1} 데이터 초기화까지 :days 일 남았습니다 |[2,*] 데이터 초기화까지 :days 일 남았습니다', 'connect_password' => '프록시 연결 비밀번호', + 'credit' => '계정 잔액', + 'group' => '소속 그룹', + 'last_login' => '최근 로그인', + 'level' => '계정 등급', 'reason' => [ - 'normal' => '계정이 정상입니다', 'expired' => '플랜이 만료되었습니다', + 'normal' => '계정이 정상입니다', 'overused' => '이 기간 동안 :data GB를 초과 사용했습니다
    제한은 :min 분 후 해제됩니다', 'traffic_exhausted' => '데이터가 소진되었습니다', 'unknown' => '알 수 없는 이유입니다. 브라우저를 새로 고침해 보세요! 문제가 지속되면 지원팀에 문의하세요.', ], + 'remain' => '남은 데이터', + 'reset' => '{0} 데이터가 :days 후에 초기화됩니다 |{1} 데이터 초기화까지 :days 일 남았습니다 |[2,*] 데이터 초기화까지 :days 일 남았습니다', + 'speed_limit' => '속도 제한', + 'status' => '계정 상태', + 'time' => '플랜 유효 기간', ], + 'attribute' => [ + 'address' => '위치', + 'data' => '데이터', + 'ip' => 'IP 주소', + 'isp' => 'ISP', + 'node' => '노드', + ], + 'bought_at' => '구매 날짜', + 'clients' => '클라이언트', + 'contact' => '연락처', + 'coupon' => [ + 'discount' => '할인', + 'error' => [ + 'expired' => '만료된 쿠폰', + 'inactive' => '활성화되지 않은 쿠폰', + 'minimum' => '최소 금액은 :amount입니다', + 'overused' => ':times회만 사용할 수 있습니다', + 'run_out' => '소진된 쿠폰', + 'services' => '상품이 할인 조건에 맞지 않습니다. 프로모션 약관을 확인하세요', + 'unknown' => '유효하지 않은 쿠폰', + 'unmet' => '조건을 충족하지 않음', + 'used' => '이미 사용된 쿠폰', + 'users' => '계정이 프로모션 조건에 맞지 않습니다', + 'wait' => ':time에 활성화됩니다. 기다려 주세요!', + ], + 'input' => '쿠폰 코드를 입력하세요', + ], + 'current_role' => '현재 역할', + 'error_response' => '오류가 발생했습니다. 나중에 다시 시도하세요.', 'home' => [ + 'announcement' => '공지사항', 'attendance' => [ 'attribute' => '출석 체크', 'disable' => '출석 체크 비활성화', 'done' => '이미 출석 체크를 완료했습니다. 내일 다시 시도하세요!', - 'success' => ':data 데이터를 받았습니다', 'failed' => '시스템 오류', + 'success' => ':data 데이터를 받았습니다', ], - 'traffic_logs' => '데이터 기록', - 'announcement' => '공지사항', - 'wechat_push' => 'WeChat 알림', 'chat_group' => '채팅 그룹', 'empty_announcement' => '공지사항이 없습니다', + 'traffic_logs' => '데이터 기록', + 'wechat_push' => 'WeChat 알림', ], - 'purchase_to_unlock' => '구매하여 잠금 해제', - 'purchase_required' => '이 기능은 유료 사용자만 사용할 수 있습니다. 먼저', - 'attribute' => [ - 'node' => '노드', - 'data' => '데이터', - 'ip' => 'IP 주소', - 'isp' => 'ISP', - 'address' => '위치', + 'invite' => [ + 'attribute' => '초대 코드', + 'counts' => '총 :num 개의 초대 코드', + 'generate_failed' => '생성 실패: 할당량 초과', + 'logs' => '초대 로그', + 'promotion' => '귀하와 초대된 사용자는 등록 시 :traffic 데이터를 받습니다. 그들이 구매할 때마다 귀하는 구매 금액의 :referral_percent%를 커미션으로 받습니다.', + 'tips' => ':num 개의 초대 가능, 코드 생성 후 :days 일 내에 만료됩니다', + ], + 'invitee' => '초대된 사람', + 'inviter' => '초대자', + 'invoice' => [ + 'active_prepaid_question' => '선불 패키지를 조기 활성화하시겠습니까?', + 'active_prepaid_tips' => '활성화 후:
    현재 계정 플랜이 즉시 만료됩니다
    새 플랜의 만료 날짜가 오늘부터 다시 계산됩니다', + 'amount' => '금액', + 'attribute' => '주문', + 'detail' => '주문 내역', + ], + 'knowledge' => [ + 'basic' => '기본', + 'title' => '지식 베이스', ], - 'purchase_promotion' => '지금 서비스를 구매하세요!', 'menu' => [ + 'admin_dashboard' => '관리 대시보드', 'help' => '도움말', 'home' => '홈', 'invites' => '초대', 'invoices' => '청구서', 'nodes' => '노드', + 'profile' => '프로필', 'promotion' => '추천', 'shop' => '상점', - 'profile' => '프로필', 'tickets' => '티켓', - 'admin_dashboard' => '관리 대시보드', ], - 'contact' => '연락처', + 'node' => [ + 'info' => '구성 정보', + 'rate' => ':ratio 배 데이터 소비', + 'setting' => '프록시 설정', + 'unstable' => '불안정/유지보수 중', + ], 'oauth' => [ + 'bind' => '연결', 'bind_title' => '소셜 계정 연결', 'not_bind' => '연결되지 않음', - 'bind' => '연결', 'rebind' => '다시 연결', 'unbind' => '연결 해제', ], - 'coupon' => [ - 'discount' => '할인', - 'error' => [ - 'unknown' => '유효하지 않은 쿠폰', - 'used' => '이미 사용된 쿠폰', - 'expired' => '만료된 쿠폰', - 'run_out' => '소진된 쿠폰', - 'inactive' => '활성화되지 않은 쿠폰', - 'wait' => ':time에 활성화됩니다. 기다려 주세요!', - 'unmet' => '조건을 충족하지 않음', - 'minimum' => '최소 금액은 :amount입니다', - 'overused' => ':times회만 사용할 수 있습니다', - 'users' => '계정이 프로모션 조건에 맞지 않습니다', - 'services' => '상품이 할인 조건에 맞지 않습니다. 프로모션 약관을 확인하세요', + 'pay' => '지불', + 'payment' => [ + 'close_tips' => ':minutes 분 내에 결제를 완료하세요, 그렇지 않으면 주문이 자동으로 닫힙니다', + 'creating' => '결제 생성 중...', + 'error' => '유효하지 않은 충전 금액', + 'insufficient_balance' => '잔액이 부족합니다. 먼저 충전해 주세요.', + 'manual' => [ + 'hint' => 'QR 코드를 스캔하여 결제한 후, 순서대로 [다음]을 클릭하고 [제출]을 클릭하여 결제를 완료해 주세요.', + 'next' => '다음', + 'payment_tips' => '정확한 금액을 결제하세요 (초과 결제는 환불되지 않으며, 부족한 금액은 추가 결제 필요)', + 'pre' => '이전', + 'red_packet' => '알리페이 레드 패킷', + 'steps' => [ + 'complete' => [ + 'description' => '수동 결제 확인 대기 중', + 'title' => '완료', + ], + 'notice' => [ + 'description' => '수동 결제 방법', + 'title' => '주의사항', + ], + 'payment' => [ + 'description' => 'QR 코드를 받아 결제하기', + 'title' => '결제', + ], + 'remark' => [ + 'description' => '수동 확인을 위해 로그인 계정을 입력하세요', + 'title' => '계정 비고', + ], + ], ], + 'method' => '결제 방식', + 'mobile_tips' => '모바일 사용자: QR 코드를 길게 눌러 -> 이미지 저장 -> 결제 앱 열기 -> 이미지 스캔하여 결제', + 'order_creation' => [ + 'failed' => '주문 생성에 실패했습니다. 다른 결제 방법을 시도해 주세요!', + 'info' => '구매/충전 금액은 [24시간] 이내에 처리됩니다. 조금만 기다려 주세요.', + 'order_limit' => '이 상품은 :limit_num 번만 구매할 수 있습니다. 현재 :count 번 구매하셨습니다.', + 'order_timeout' => '주문이 시간 초과로 인해 자동으로 취소되었습니다.', + 'payment_disabled' => '주문 생성 실패: 시스템에서 온라인 결제 기능이 활성화되지 않았습니다.', + 'pending_order' => '주문 생성 실패: 결제되지 않은 주문이 있습니다. 먼저 해당 결제를 완료하세요.', + 'plan_required' => '충전 패키지를 구매하기 전에 먼저 요금제를 구매하세요.', + 'price_issue' => '주문 생성 실패: 주문 총 가격이 이상합니다', + 'price_zero' => '주문 생성 실패: 주문 총 가격이 0입니다. 온라인 결제가 필요하지 않습니다.', + 'product_unavailable' => '주문 생성 실패: 상품이 판매 중단되었습니다.', + 'success' => '주문이 성공적으로 생성되었습니다!', + 'unknown_order' => '알 수 없는 주문', + 'unknown_payment' => '알 수 없는 결제 방법', + ], + 'qrcode_tips' => ':software로 QR 코드를 스캔하세요', + 'redirect_stripe' => 'Stripe 결제 페이지로 이동 중', ], - 'error_response' => '오류가 발생했습니다. 나중에 다시 시도하세요.', - 'invite' => [ - 'attribute' => '초대 코드', - 'counts' => '총 :num 개의 초대 코드', - 'tips' => ':num 개의 초대 가능, 코드 생성 후 :days 일 내에 만료됩니다', - 'logs' => '초대 로그', - 'promotion' => '귀하와 초대된 사용자는 등록 시 :traffic 데이터를 받습니다. 그들이 구매할 때마다 귀하는 구매 금액의 :referral_percent%를 커미션으로 받습니다.', - 'generate_failed' => '생성 실패: 할당량 초과', + 'purchase' => [ + 'completed' => '구매 완료!', + 'promotion' => '지금 서비스를 구매하세요!', + 'required' => '이 기능은 유료 사용자만 사용할 수 있습니다. 먼저', + 'to_unlock' => '구매로 잠금 해제', ], + 'recharge' => '충전', + 'recharge_credit' => '잔액 충전', + 'recharging' => '충전 중...', + 'referral' => [ + 'link' => '추천 링크', + 'logs' => '커미션 로그', + 'msg' => [ + 'account' => '계정이 만료되었습니다. 먼저 플랜을 구매하세요', + 'applied' => '이미 요청이 있습니다. 처리 대기 중입니다', + 'error' => '주문 생성 오류. 나중에 다시 시도하거나 지원팀에 문의하세요', + 'unfulfilled' => ':amount 이상 필요합니다. 계속 노력하세요!', + 'wait' => '관리자 승인을 기다려 주세요', + ], + 'total' => '총 커미션: :amount (:total 회), :money 이상일 때 인출 가능', + ], + 'registered_at' => '등록 날짜', 'reset_data' => [ 'action' => '데이터 초기화', 'cost' => '비용: :amount', 'cost_tips' => '초기화 시 :amount가 차감됩니다!', - 'insufficient' => '잔액 부족, 충전해 주세요', - '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 코드를 스캔하세요', + 'service' => [ + 'country_count' => ':num 개국 또는 지역을 커버', + 'node_count' => ':num 개의 고품질 노드', + 'unlimited' => '속도 제한 없음', + ], 'shop' => [ - 'hot' => '인기', - 'limited' => '한정', + 'buy' => '구매', + 'call4help' => '질문이 있으면 지원팀에 문의하세요', 'change_amount' => '충전 금액', 'change_amount_help' => '충전 금액을 입력하세요', - 'buy' => '구매', + 'conflict' => '충돌', + 'conflict_tips' => '

    현재 구매는 선불 플랜으로 설정됩니다

    1. 선불 플랜은 현재 플랜이 만료된 후 자동으로 활성화됩니다
    2. 결제 후 주문 페이지에서 수동으로 활성화할 수 있습니다
    ', 'description' => '설명', - 'service' => '서비스', + 'hot' => '인기', + 'limited' => '한정', 'pay_credit' => '잔액으로 결제', 'pay_online' => '온라인 결제', 'price' => '가격', 'quantity' => '수량', + 'service' => '서비스', 'subtotal' => '소계', 'total' => '합계', - 'conflict' => '충돌', - 'conflict_tips' => '

    현재 구매는 선불 플랜으로 설정됩니다

    1. 선불 플랜은 현재 플랜이 만료된 후 자동으로 활성화됩니다
    2. 결제 후 주문 페이지에서 수동으로 활성화할 수 있습니다
    ', - 'call4help' => '질문이 있으면 지원팀에 문의하세요', - ], - 'service' => [ - 'node_count' => ':num 개의 고품질 노드', - 'country_count' => ':num 개국 또는 지역을 커버', - 'unlimited' => '속도 제한 없음', - ], - 'payment' => [ - 'error' => '유효하지 않은 충전 금액', - 'creating' => '결제 생성 중...', - 'redirect_stripe' => 'Stripe 결제 페이지로 이동 중', - 'qrcode_tips' => ':software로 QR 코드를 스캔하세요', - 'close_tips' => ':minutes 분 내에 결제를 완료하세요, 그렇지 않으면 주문이 자동으로 닫힙니다', - 'mobile_tips' => '모바일 사용자: QR 코드를 길게 눌러 -> 이미지 저장 -> 결제 앱 열기 -> 이미지 스캔하여 결제', - ], - 'invoice' => [ - 'attribute' => '주문', - 'detail' => '주문 내역', - 'amount' => '금액', - 'active_prepaid_question' => '선불 패키지를 조기 활성화하시겠습니까?', - 'active_prepaid_tips' => '활성화 후:
    현재 계정 플랜이 즉시 만료됩니다
    새 플랜의 만료 날짜가 오늘부터 다시 계산됩니다', - ], - 'node' => [ - 'info' => '구성 정보', - 'setting' => '프록시 설정', - 'unstable' => '불안정/유지보수 중', - 'rate' => ':ratio 배 데이터 소비', ], 'subscribe' => [ - 'link' => '구독 링크', - 'tips' => '경고: 이 링크는 개인용으로만 사용하세요. 공유하지 마세요, 그렇지 않으면 계정이 비정상적인 사용으로 인해 차단될 수 있습니다.', - 'exchange_warning' => '구독 링크를 변경하면:\n1. 기존 링크가 즉시 무효화됩니다\n2. 연결 비밀번호가 변경됩니다', 'custom' => '맞춤 구독', + 'error' => '구독 링크 변경 실패', + 'exchange_warning' => '구독 링크를 변경하면:\n1. 기존 링크가 즉시 무효화됩니다\n2. 연결 비밀번호가 변경됩니다', + 'info' => [ + 'download' => '다운로드 데이터', + 'title' => '계정 요약 [실시간 아님]', + 'total' => '플랜 데이터', + 'upload' => '업로드 데이터', + ], + 'link' => '구독 링크', 'ss_only' => 'SS만 구독', 'ssr_only' => 'SSR(SS 포함)만 구독', - 'v2ray_only' => 'V2Ray만 구독', + 'tips' => '경고: 이 링크는 개인용으로만 사용하세요. 공유하지 마세요, 그렇지 않으면 계정이 비정상적인 사용으로 인해 차단될 수 있습니다.', 'trojan_only' => 'Trojan만 구독', - 'error' => '구독 링크 변경 실패', - 'info' => [ - 'title' => '계정 요약 [실시간 아님]', - 'upload' => '업로드 데이터', - 'download' => '다운로드 데이터', - 'total' => '플랜 데이터', + 'v2ray_only' => 'V2Ray만 구독', + ], + 'telegram' => [ + 'bind_exists' => '이 계정은 이미 Telegram 계정에 연결되어 있습니다.', + 'bind_missing' => '사용자 정보를 찾을 수 없습니다. 먼저 계정을 연결해 주세요.', + 'command' => [ + 'bind' => '당신의 :web_name 계정을 연결하세요', + 'intro' => '다음 명령어를 사용할 수 있습니다', + 'traffic' => '데이터 사용량 확인', + 'unbind' => '연결 해제', + 'web_url' => '최신 :web_name URL을 가져오세요', ], + 'get_url' => ':web_name의 최신 URL은', + 'params_missing' => '매개변수에 오류가 있습니다. 이메일 주소를 포함하여 다시 보내주세요.', + 'ticket_missing' => '티켓이 존재하지 않습니다', + 'ticket_reply' => '티켓 #`:id`에 대한 답변이 성공적으로 완료되었습니다', + 'traffic_query' => '데이터 사용량 조회', + 'user_missing' => '사용자가 존재하지 않습니다', ], 'ticket' => [ 'attribute' => '티켓', - 'submit_tips' => '티켓을 제출하시겠습니까?', - 'reply_confirm' => '티켓에 답변하시겠습니까?', - 'close_tips' => '티켓을 닫으시겠습니까?', - 'close' => '티켓 닫기', - 'failed_closed' => '오류: 이미 닫힌 티켓', - 'reply_placeholder' => '무엇인가 적어보세요...', - 'reply' => '답변', 'close_msg' => '티켓 ID :id 사용자가 수동으로 닫았습니다', - 'title_placeholder' => '문제 유형 또는 관련 내용을 간단히 설명하세요', + 'close_tips' => '티켓을 닫으시겠습니까?', 'content_placeholder' => '문제 또는 도움이 필요한 부분을 자세히 설명해 주세요, 저희가 빠르게 해결할 수 있도록 도와드립니다', - 'new' => '새 티켓 생성', - 'service_hours' => '고객 서비스 시간', - 'online_hour' => '온라인 시간', - 'service_tips' => '지원팀에 연락하려면 하나의 연락 방법만 사용하세요! 반복된 요청은 응답 시간을 지연시킵니다.', 'error' => '알 수 없는 오류가 발생했습니다! 지원팀에 문의하세요', + 'new' => '새 티켓 생성', + 'online_hour' => '온라인 시간', + 'reply' => '답변', + 'reply_confirm' => '티켓에 답변하시겠습니까?', + 'reply_placeholder' => '무엇인가 적어보세요...', + 'service_hours' => '고객 서비스 시간', + 'service_tips' => '지원팀에 연락하려면 하나의 연락 방법만 사용하세요! 반복된 요청은 응답 시간을 지연시킵니다.', + 'submit_tips' => '티켓을 제출하시겠습니까?', + 'title_placeholder' => '문제 유형 또는 관련 내용을 간단히 설명하세요', ], 'traffic_logs' => [ - 'hourly' => '오늘 데이터 사용량', 'daily' => '이번 달 데이터 사용량', + 'hourly' => '오늘 데이터 사용량', 'tips' => '참고: 데이터 통계 업데이트에는 지연이 있습니다.', ], - 'clients' => '클라이언트', 'tutorials' => '튜토리얼', - 'current_role' => '현재 역할', - 'knowledge' => [ - 'title' => '지식 베이스', - 'basic' => '기본', - ], - 'manual' => [ - 'red_packet' => '알리페이 레드 패킷', - 'hint' => 'QR 코드를 스캔한 후, 계속 [다음]을 클릭하여 [제출]을 클릭해야 결제가 완료됩니다!', - 'step_1' => '주의사항', - 'step_1_title' => '수동 결제 방법', - 'step_2' => '결제', - 'step_2_title' => 'QR 코드를 받아 결제하기', - 'step_3' => '완료', - 'step_3_title' => '수동 확인 대기', - 'remark' => '계정 비고', - 'remark_content' => '정확한 수동 확인을 위해 로그인 계정을 입력하세요', - 'payment_hint' => '정확한 금액을 결제하세요 (초과 결제는 환불되지 않으며, 부족한 금액은 추가 결제 필요)', - 'pre' => '이전', - 'next' => '다음', - ], + 'withdraw' => '인출', + 'withdraw_at' => '인출 날짜', + 'withdraw_commission' => '커미션 인출', + 'withdraw_logs' => '인출 로그', ]; diff --git a/resources/lang/vi.json b/resources/lang/vi.json index e80ee87e..41a5d828 100644 --- a/resources/lang/vi.json +++ b/resources/lang/vi.json @@ -126,5 +126,16 @@ "You are receiving this email because we received a password reset request for your account.": "Bạn nhận được email này vì chúng tôi đã nhận được yêu cầu đặt lại mật khẩu cho tài khoản của bạn.", "You have not responded this ticket in :num hours, System has closed your ticket.": "Bạn đã không trả lời phiếu hỗ trợ này trong :num giờ, hệ thống đã tự động đóng phiếu hỗ trợ của bạn.", "You must have a valid subscription to view the content in this area!": "Bạn phải có đăng ký hợp lệ để xem nội dung trong khu vực này!", - "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Đăng ký của bạn đã bị quản trị viên vô hiệu hóa, vui lòng liên hệ với quản trị viên để khôi phục." + "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Đăng ký của bạn đã bị quản trị viên vô hiệu hóa, vui lòng liên hệ với quản trị viên để khôi phục.", + "Manually add in dashboard.": "Thêm thủ công trong bảng điều khiển", + "Manually edit in dashboard.": "Chỉnh sửa thủ công trong bảng điều khiển", + "Batch generate user accounts in dashboard.": "Tạo tài khoản người dùng hàng loạt trong nền", + "Coupon used in order.": "Phiếu giảm giá đã được sử dụng trong đơn hàng", + "Order canceled, coupon reinstated.": "Đơn hàng bị hủy, phiếu giảm giá đã được khôi phục", + "Used for credit recharge.": "Được sử dụng để nạp tiền vào số dư", + "The user manually reset the data.": "Người dùng đặt lại dữ liệu", + "Recharge using a recharge voucher.": "Nạp tiền bằng phiếu nạp", + "The user topped up the balance.": "Người dùng đã nạp tiền vào số dư", + "Purchased an item.": "Đã mua một mặt hàng", + "[:payment] plus the user’s purchased data plan.": "[:payment] cộng với gói dữ liệu mà người dùng đã mua" } \ No newline at end of file diff --git a/resources/lang/vi/admin.php b/resources/lang/vi/admin.php index caf07e26..efbc622d 100644 --- a/resources/lang/vi/admin.php +++ b/resources/lang/vi/admin.php @@ -3,512 +3,468 @@ declare(strict_types=1); return [ + 'action' => [ + 'add_item' => 'Thêm :attribute', + 'edit_item' => 'Chỉnh sửa :attribute', + ], + 'aff' => [ + 'apply_counts' => 'Tổng cộng có :num yêu cầu rút tiền', + 'commission_counts' => 'Yêu cầu này liên quan đến tổng cộng :num đơn hàng', + 'commission_title' => 'Chi tiết yêu cầu rút tiền', + 'counts' => 'Tổng cộng có :num bản ghi hoàn tiền', + 'rebate_title' => 'Lịch sử hoàn tiền', + 'referral' => 'Hoàn tiền giới thiệu', + 'title' => 'Danh sách yêu cầu rút tiền', + ], + 'article' => [ + 'category_hint' => 'Cùng một danh mục sẽ được nhóm vào cùng một thư mục', + 'counts' => 'Tổng cộng có :num bài viết', + 'logo_placeholder' => 'Hoặc nhập URL logo', + 'title' => 'Danh sách bài viết', + 'type' => [ + 'announcement' => 'Thông báo', + 'knowledge' => 'Bài viết', + ], + ], + 'clear' => 'Xóa', + 'clone' => 'Nhân bản', + 'confirm' => [ + 'continues' => 'Bạn có chắc chắn muốn tiếp tục hành động này không?', + 'delete' => [0 => 'Bạn có chắc chắn muốn xóa :attribute', 1 => ']?'], + 'export' => 'Bạn có chắc chắn muốn xuất toàn bộ?', + ], + 'coupon' => [ + 'counts' => 'Tổng cộng có :num phiếu giảm giá', + 'created_days_hint' => ':days ngày sau khi đăng ký', + 'discount' => 'Giảm giá', + 'export_title' => 'Xuất phiếu giảm giá', + 'groups_hint' => 'Chỉ có thể sử dụng cho các nhóm người dùng đã chọn', + 'info_title' => 'Thông tin phiếu giảm giá', + 'levels_hint' => 'Chỉ có thể sử dụng cho các cấp độ người dùng đã chọn', + 'limit_hint' => 'Các điều kiện này có quan hệ , vui lòng sử dụng đúng cách', + 'minimum_hint' => 'Chỉ có thể sử dụng khi số tiền thanh toán vượt quá :num', + 'name_hint' => 'Sẽ hiển thị trên giao diện người dùng', + 'newbie' => [ + 'created_days' => 'Ngày tạo tài khoản', + 'first_discount' => 'Giảm giá lần đầu', + 'first_order' => 'Đơn hàng đầu tiên', + ], + 'priority_hint' => 'Mã phiếu giảm giá có ưu tiên cao nhất sẽ được sử dụng trước. Tối đa là 255', + 'services_blacklist_hint' => 'Không thể sử dụng cho các sản phẩm trong danh sách đen, để trống nếu không sử dụng điều kiện này', + 'services_placeholder' => 'Nhập ID sản phẩm, sau đó nhấn Enter', + 'services_whitelist_hint' => 'Chỉ có thể sử dụng cho các sản phẩm trong danh sách trắng, để trống nếu không sử dụng điều kiện này', + 'single_use' => 'Sử dụng một lần', + 'sn_hint' => 'Cung cấp mã phiếu giảm giá cho người dùng, để trống sẽ mặc định là mã ngẫu nhiên 8 ký tự', + 'title' => 'Danh sách phiếu giảm giá', + 'type' => [ + 'charge' => 'Phiếu nạp tiền', + 'discount' => 'Phiếu giảm giá', + 'voucher' => 'Phiếu mua hàng', + ], + 'type_hint' => 'Giảm giá: giảm số tiền sản phẩm, Giảm phần trăm: giảm giá theo phần trăm sản phẩm, Nạp tiền: nạp tiền vào tài khoản người dùng', + 'used_hint' => 'Mỗi người dùng có thể sử dụng tối đa :num lần', + 'user_whitelist_hint' => 'Người dùng trong danh sách trắng có thể sử dụng, để trống nếu không sử dụng điều kiện này', + 'users_blacklist_hint' => 'Người dùng trong danh sách đen không thể sử dụng, để trống nếu không sử dụng điều kiện này', + 'users_placeholder' => 'Nhập ID người dùng, sau đó nhấn Enter', + 'value' => '{1} ➖ :num|{2} :num% giảm giá|{3} ➕ :num', + 'value_hint' => 'Phạm vi từ 1% đến 99%', + ], + 'creating' => 'Đang thêm...', 'dashboard' => [ - 'users' => 'Tổng số người dùng', - 'available_users' => 'Người dùng hoạt động', - 'paid_users' => 'Người dùng trả phí', - 'active_days_users' => 'Người dùng hoạt động trong :days ngày qua', - 'inactive_days_users' => 'Người dùng không hoạt động hơn :days ngày', - 'online_users' => 'Người dùng trực tuyến', - 'expiring_users' => 'Người dùng sắp hết hạn', - 'overuse_users' => 'Người dùng sử dụng dữ liệu vượt quá 90%', 'abnormal_users' => 'Người dùng có lưu lượng bất thường trong 1 giờ qua', - 'nodes' => 'Số nút', - 'maintaining_nodes' => 'Nút đang bảo trì', + 'active_days_users' => 'Người dùng hoạt động trong :days ngày qua', + 'available_users' => 'Người dùng hoạt động', + 'credit' => 'Tổng số dư', 'current_month_traffic_consumed' => 'Lưu lượng tiêu thụ trong tháng này', 'days_traffic_consumed' => 'Lưu lượng tiêu thụ trong :days ngày qua', - 'orders' => 'Tổng số đơn hàng', + 'expiring_users' => 'Người dùng sắp hết hạn', + 'inactive_days_users' => 'Người dùng không hoạt động hơn :days ngày', + 'maintaining_nodes' => 'Nút đang bảo trì', + 'nodes' => 'Số nút', 'online_orders' => 'Đơn hàng thanh toán trực tuyến', + 'online_users' => 'Người dùng trực tuyến', + 'orders' => 'Tổng số đơn hàng', + 'overuse_users' => 'Người dùng sử dụng dữ liệu vượt quá 90%', + 'paid_users' => 'Người dùng trả phí', 'succeed_orders' => 'Đơn hàng thanh toán thành công', - 'credit' => 'Tổng số dư', + 'users' => 'Tổng số người dùng', 'withdrawing_commissions' => 'Hoa hồng đang chờ rút', 'withdrawn_commissions' => 'Hoa hồng đã rút', ], - 'action' => [ - 'edit_item' => 'Chỉnh sửa :attribute', - 'add_item' => 'Thêm :attribute', + 'end_time' => 'Thời gian kết thúc', + 'goods' => [ + 'counts' => 'Tổng cộng :num sản phẩm', + 'info' => [ + 'available_date_hint' => 'Tự động trừ dữ liệu từ tổng khi đến hạn', + 'desc_placeholder' => 'Mô tả ngắn gọn sản phẩm', + 'limit_num_hint' => 'Số lần mua tối đa mỗi người dùng, 0 là không giới hạn', + 'list_hint' => 'Bắt đầu mỗi dòng bằng <li> và kết thúc bằng </li>', + 'list_placeholder' => 'Thêm nội dung tùy chỉnh', + 'period_hint' => 'Dữ liệu gói sẽ được đặt lại mỗi N ngày', + 'type_hint' => 'Gói đăng ký ảnh hưởng đến thời hạn tài khoản, gói dữ liệu chỉ trừ dữ liệu, không ảnh hưởng đến thời hạn', + ], + 'sell_and_used' => 'Đã sử dụng / Đã bán', + 'status' => [ + 'no' => 'Ngừng bán', + 'yes' => 'Đang bán', + ], + 'title' => 'Danh sách sản phẩm', + 'type' => [ + 'package' => 'Gói dữ liệu', + 'plan' => 'Gói đăng ký', + 'top_up' => 'Nạp tiền', + ], ], - 'confirm' => [ - 'delete' => [0 => 'Bạn có chắc chắn muốn xóa :attribute', 1 => ']?'], - 'continues' => 'Bạn có chắc chắn muốn tiếp tục hành động này không?', - 'export' => 'Bạn có chắc chắn muốn xuất toàn bộ?', + 'hint' => 'Gợi ý', + 'logs' => [ + 'ban' => [ + 'ban_time' => 'Thời gian cấm', + 'last_connect_at' => 'Thời gian kết nối cuối cùng', + 'reason' => 'Lý do', + 'time' => 'Thời gian', + 'title' => 'Hồ sơ cấm người dùng', + ], + 'callback' => 'Nhật ký hồi đáp (Thanh toán)', + 'counts' => 'Tổng cộng :num bản ghi', + 'credit_title' => 'Hồ sơ thay đổi số dư', + 'ip_monitor' => 'Giám sát IP trực tuyến Dữ liệu thời gian thực trong 2 phút', + 'notification' => 'Nhật ký email', + 'order' => [ + 'is_coupon' => 'Sử dụng mã giảm giá', + 'is_expired' => 'Hết hạn', + 'title' => 'Danh sách đơn hàng', + 'update_conflict' => 'Cập nhật thất bại: Xung đột đơn hàng', + ], + 'rule' => [ + 'clear_all' => 'Xóa tất cả các bản ghi', + 'clear_confirm' => 'Bạn có muốn xóa tất cả các hồ sơ kích hoạt không?', + 'created_at' => 'Thời gian kích hoạt', + 'name' => 'Tên quy tắc kích hoạt', + 'reason' => 'Lý do kích hoạt', + 'tag' => '✅ Truy cập nội dung không được phép', + 'title' => 'Hồ sơ kích hoạt quy tắc', + ], + 'subscribe' => 'Danh sách đăng ký', + 'user_data_modify_title' => 'Hồ sơ thay đổi dữ liệu', + 'user_ip' => [ + 'connect' => 'Kết nối IP', + 'title' => 'Danh sách IP trực tuyến 10 phút gần đây', + ], + 'user_traffic' => [ + 'choose_node' => 'Chọn nút', + 'title' => 'Hồ sơ sử dụng dữ liệu', + ], ], - 'user_dashboard' => 'Bảng điều khiển người dùng', + 'marketing' => [ + 'counts' => 'Tổng cộng có :num email', + 'email' => [ + 'ever_paid' => 'Đã thanh toán', + 'expired_date' => 'Ngày hết hạn', + 'filters' => 'Bộ lọc', + 'loading_statistics' => 'Đang tải thống kê...', + 'never_paid' => 'Chưa thanh toán', + 'paid_servicing' => 'Dịch vụ trả phí', + 'previously_paid' => 'Đã từng thanh toán', + 'recent_traffic_abnormal' => 'Lưu lượng bất thường trong giờ qua', + 'recently_active' => 'Hoạt động gần đây', + 'targeted_users_count' => 'Số lượng người dùng mục tiêu', + 'traffic_usage_over' => 'Sử dụng lưu lượng vượt quá N%', + 'will_expire_date' => '', + ], + 'email_send' => 'Gửi email nhóm', + 'error_message' => 'Thông báo lỗi', + 'processed' => 'Yêu cầu đã được xử lý', + 'push_send' => 'Gửi thông báo', + 'send_status' => 'Trạng thái gửi', + 'send_time' => 'Thời gian gửi', + 'targeted_users_not_found' => 'Không tìm thấy người dùng mục tiêu', + 'unknown_sending_type' => 'Loại gửi không xác định', + ], + 'massive_export' => 'Xuất hàng loạt', 'menu' => [ + 'analysis' => [ + 'accounting' => 'Sổ kế toán', + 'attribute' => 'Phân tích dữ liệu', + 'node_flow' => 'Phân tích lưu lượng của nút', + 'site_flow' => 'Lưu lượng trang web', + 'user_flow' => 'Lưu lượng người dùng', + ], + 'customer_service' => [ + 'article' => 'Quản lý bài viết', + 'attribute' => 'Dịch vụ khách hàng', + 'marketing' => 'Phát sóng tin nhắn', + 'ticket' => 'Yêu cầu hỗ trợ', + ], 'dashboard' => 'Bảng điều khiển', - 'user' => [ - 'attribute' => 'Người dùng', - 'list' => 'Quản lý người dùng', - 'oauth' => 'OAuth', - 'group' => 'Nhóm người dùng', - 'credit_log' => 'Lịch sử số dư', - 'subscribe' => 'Quản lý đăng ký', + 'log' => [ + 'attribute' => 'Hệ thống nhật ký', + 'notify' => 'Hồ sơ thông báo', + 'online_logs' => 'Nhật ký trực tuyến', + 'online_monitor' => 'Giám sát trực tuyến', + 'payment_callback' => 'Hồi đáp thanh toán', + 'service_ban' => 'Hồ sơ cấm', + 'system' => 'Nhật ký hệ thống', + 'traffic' => 'Sử dụng lưu lượng', + 'traffic_flow' => 'Thay đổi lưu lượng', + ], + 'node' => [ + 'attribute' => 'Hệ thống nút', + 'auth' => 'Ủy quyền nút', + 'cert' => 'Danh sách chứng chỉ', + 'list' => 'Quản lý nút', + ], + 'promotion' => [ + 'attribute' => 'Khuyến mãi', + 'invite' => 'Quản lý lời mời', + 'rebate_flow' => 'Lịch sử hoàn tiền', + 'withdraw' => 'Quản lý rút tiền', ], 'rbac' => [ 'attribute' => 'RBAC', 'permission' => 'Quyền hạn', 'role' => 'Vai trò', ], - 'customer_service' => [ - 'attribute' => 'Dịch vụ khách hàng', - 'ticket' => 'Yêu cầu hỗ trợ', - 'article' => 'Quản lý bài viết', - 'marketing' => 'Phát sóng tin nhắn', - ], - 'node' => [ - 'attribute' => 'Hệ thống nút', - 'list' => 'Quản lý nút', - 'auth' => 'Ủy quyền nút', - 'cert' => 'Danh sách chứng chỉ', - ], 'rule' => [ 'attribute' => 'Quy tắc kiểm toán', - 'list' => 'Danh sách quy tắc', 'group' => 'Nhóm quy tắc', + 'list' => 'Danh sách quy tắc', 'trigger' => 'Hồ sơ kích hoạt', ], - 'shop' => [ - 'attribute' => 'Hệ thống sản phẩm', - 'goods' => 'Quản lý sản phẩm', - 'coupon' => 'Quản lý mã giảm giá', - 'order' => 'Đơn hàng sản phẩm', - ], - 'promotion' => [ - 'attribute' => 'Khuyến mãi', - 'invite' => 'Quản lý lời mời', - 'withdraw' => 'Quản lý rút tiền', - 'rebate_flow' => 'Lịch sử hoàn tiền', - ], - 'analysis' => [ - 'attribute' => 'Phân tích dữ liệu', - 'accounting' => 'Sổ kế toán', - 'user_flow' => 'Lưu lượng người dùng', - 'node_flow' => 'Phân tích lưu lượng của nút', - 'site_flow' => 'Lưu lượng trang web', - ], - 'log' => [ - 'attribute' => 'Hệ thống nhật ký', - 'traffic' => 'Sử dụng lưu lượng', - 'traffic_flow' => 'Thay đổi lưu lượng', - 'service_ban' => 'Hồ sơ cấm', - 'online_logs' => 'Nhật ký trực tuyến', - 'online_monitor' => 'Giám sát trực tuyến', - 'notify' => 'Hồ sơ thông báo', - 'payment_callback' => 'Hồi đáp thanh toán', - 'system' => 'Nhật ký hệ thống', - ], - 'tools' => [ - 'attribute' => 'Bộ công cụ', - 'decompile' => 'Giải mã', - 'convert' => 'Chuyển đổi định dạng', - 'import' => 'Nhập dữ liệu', - 'analysis' => 'Phân tích nhật ký', - ], 'setting' => [ 'attribute' => 'Cài đặt hệ thống', 'email_suffix' => 'Quản lý hậu tố email', - 'universal' => 'Cài đặt chung', 'system' => 'Tham số hệ thống', + 'universal' => 'Cài đặt chung', + ], + 'shop' => [ + 'attribute' => 'Hệ thống sản phẩm', + 'coupon' => 'Quản lý mã giảm giá', + 'goods' => 'Quản lý sản phẩm', + 'order' => 'Đơn hàng sản phẩm', + ], + 'tools' => [ + 'analysis' => 'Phân tích nhật ký', + 'attribute' => 'Bộ công cụ', + 'convert' => 'Chuyển đổi định dạng', + 'decompile' => 'Giải mã', + 'import' => 'Nhập dữ liệu', + ], + 'user' => [ + 'attribute' => 'Người dùng', + 'credit_log' => 'Lịch sử số dư', + 'group' => 'Nhóm người dùng', + 'list' => 'Quản lý người dùng', + 'oauth' => 'OAuth', + 'subscribe' => 'Quản lý đăng ký', ], ], - 'user' => [ - 'massive' => [ - 'text' => 'Số lượng tài khoản tạo hàng loạt', - 'failed' => 'Tạo tài khoản hàng loạt thất bại', - 'succeed' => 'Tạo tài khoản hàng loạt thành công', - 'note' => 'Tạo tài khoản người dùng hàng loạt trong nền', - ], - 'proxy_info' => 'Thông tin cấu hình', - 'traffic_monitor' => 'Thống kê lưu lượng', - 'online_monitor' => 'Giám sát trực tuyến', - 'reset_traffic' => 'Đặt lại lưu lượng', - 'user_view' => 'Chuyển sang chế độ người dùng', - 'connection_test' => 'Kiểm tra kết nối', - 'counts' => 'Tổng cộng :num tài khoản', - 'reset_confirm' => [0 => 'Bạn có muốn đặt lại lưu lượng của [', 1 => '] không?'], - 'info' => [ - 'account' => 'Thông tin tài khoản', - 'proxy' => 'Thông tin proxy', - 'switch' => 'Chuyển đổi danh tính', - 'reset_date_hint' => 'Ngày đặt lại lưu lượng tiếp theo', - 'expired_date_hint' => 'Để trống để mặc định thời hạn một năm', - 'uuid_hint' => 'UUID cho V2Ray', - 'recharge_placeholder' => 'Nếu là số âm, sẽ trừ vào số dư', - ], - 'update_help' => 'Cập nhật thành công, quay lại?', - 'proxies_config' => 'Thông tin kết nối cho :username', - 'group' => [ - 'title' => 'Kiểm soát nhóm người dùng (Một nút có thể thuộc nhiều nhóm, nhưng người dùng chỉ có thể thuộc một nhóm; đối với các nút hiển thị/có sẵn cho người dùng, nhóm có ưu tiên cao hơn cấp độ)', - 'name' => 'Tên nhóm', - 'counts' => 'Tổng cộng :num nhóm', - ], - ], - 'zero_unlimited_hint' => '0 hoặc để trống cho không giới hạn', - 'node' => [ - 'traffic_monitor' => 'Thống kê lưu lượng', - 'refresh_geo' => 'Làm mới vị trí địa lý', - 'connection_test' => 'Kiểm tra kết nối', - 'counts' => 'Tổng cộng :num nút', - 'reload_all' => 'Tải lại tất cả backend', - 'refresh_geo_all' => 'Làm mới thông tin địa lý', - 'reload_confirm' => 'Bạn có muốn tải lại backend của nút không?', - 'info' => [ - 'hint' => 'Lưu ý: ID tự động tạo là node_id cho backend ShadowsocksR và nodeId cho backend V2Ray', - 'basic' => 'Thông tin cơ bản', - 'ddns_hint' => 'Các nút IP động yêu cầu cấu hình DDNS. Đối với loại nút này, Kiểm tra kết nối sẽ được thực hiện qua tên miền.', - 'domain_placeholder' => 'Tên miền máy chủ, sẽ sử dụng trước nếu điền', - 'domain_hint' => 'Sau khi bật DDNS trong cài đặt hệ thống, tên miền và các IP sẽ tự động cập nhật! Bạn không cần chỉnh sửa thông tin này tại trang web đăng ký tên miền.', - 'extend' => 'Thông tin mở rộng', - 'display' => [ - 'invisible' => 'Không hiển thị', - 'node' => 'Chỉ hiển thị trong Trang Nút', - 'sub' => 'Chỉ hiển thị trong Đăng ký', - 'all' => 'Hiển thị hoàn toàn', - 'hint' => 'Người dùng có thể xem/đăng ký nút này hay không', - ], - 'ipv4_hint' => 'Nhiều IP nên được phân cách bằng dấu phẩy, ví dụ: 1.1.1.1,8.8.8.8', - 'ipv6_hint' => 'Nhiều IP nên được phân cách bằng dấu phẩy, ví dụ: 1.1.1.1,8.8.8.8', - 'ipv4_placeholder' => 'Địa chỉ IPv4 của máy chủ', - 'ipv6_placeholder' => 'Địa chỉ IPv6 của máy chủ', - 'push_port_hint' => 'Bắt buộc. Đảm bảo rằng cổng này đã được mở trong tường lửa của máy chủ, nếu không thông báo đẩy sẽ bị lỗi.', - 'data_rate_hint' => 'Ví dụ: 0.1 có nghĩa là 100M sẽ được tính là 10M; 5 có nghĩa là 100M sẽ được tính là 500M', - 'level_hint' => 'Cấp độ: 0 - Không giới hạn cấp độ, tất cả đều có thể xem.', - 'detection' => [ - 'tcp' => 'Chỉ TCP', - 'icmp' => 'Chỉ ICMP', - 'all' => 'Cả hai', - 'hint' => 'Kiểm tra ngẫu nhiên mỗi 30-60 phút', - ], - 'obfs_param_hint' => 'Điền vào tham số để ngụy trang lưu lượng nếu obfs không phải là [plain]; Đề xuất cổng 80 nếu obfs là [http_simple]; Đề xuất cổng 443 nếu obfs là [tls];', - 'additional_ports_hint' => 'Nếu bật, vui lòng cấu hình additional_ports của máy chủ', - 'v2_method_hint' => 'Giao thức truyền tải WebSocket không nên sử dụng phương pháp mã hóa \'none\'.', - 'v2_net_hint' => 'Vui lòng bật TLS cho WebSocket', - 'v2_cover' => [ - 'none' => 'Không ngụy trang', - 'http' => 'HTTP', - 'srtp' => 'SRTP', - 'utp' => 'uTP', - 'wechat' => 'Video WeChat', - 'dtls' => 'DTLS 1.2', - 'wireguard' => 'WireGuard', - ], - 'v2_host_hint' => 'Khi sử dụng ngụy trang HTTP, nhiều tên miền nên được phân cách bằng dấu phẩy, trong khi WebSocket chỉ cho phép một tên miền.', - 'v2_tls_provider_hint' => 'Các backend khác nhau có cấu hình khác nhau:', - 'single_hint' => 'Đề xuất cổng 80/443. Backend cần
    cấu hình chế độ nghiêm ngặt: chỉ kết nối qua các cổng được chỉ định. (Cách cấu hình)', - ], - 'proxy_info' => '*Tương thích với giao thức Shadowsocks', - 'proxy_info_hint' => 'Để tương thích, vui lòng thêm _compatible vào giao thức và ngụy trang trong cấu hình máy chủ', - 'reload' => 'Tải lại Backend', - 'auth' => [ - 'title' => 'Danh sách ủy quyền nút WEBAPI', - 'deploy' => [ - 'title' => 'Triển khai Backend :type_label', - 'attribute' => 'Triển khai Backend', - 'command' => 'Lệnh', - 'update' => 'Cập nhật', - 'uninstall' => 'Gỡ cài đặt', - 'start' => 'Khởi động', - 'stop' => 'Dừng', - 'status' => 'Trạng thái', - 'recent_logs' => 'Nhật ký gần đây', - 'real_time_logs' => 'Nhật ký thời gian thực', - 'restart' => 'Khởi động lại', - 'same' => 'Giống trên', - 'trojan_hint' => 'Vui lòng điền tên nút và phân giải đến IP tương ứng', - ], - 'reset_auth' => 'Đặt lại khóa ủy quyền', - 'counts' => 'Tổng cộng :num bản ghi ủy quyền', - 'generating_all' => 'Xác nhận tạo khóa ủy quyền cho tất cả các nút?', - ], - 'cert' => [ - 'title' => 'Danh sách chứng chỉ tên miền (Đối với ngụy trang tên miền của nút V2Ray)', - 'counts' => 'Tổng cộng :num chứng chỉ tên miền', - 'key_placeholder' => 'Giá trị KEY của chứng chỉ, có thể để trống. Backend VNET-V2Ray hỗ trợ cấp phát tự động', - 'pem_placeholder' => 'Giá trị PEM của chứng chỉ, có thể để trống. Backend VNET-V2Ray hỗ trợ cấp phát tự động', - ], - ], - 'hint' => 'Gợi ý', - 'oauth' => [ - 'title' => 'Ủy quyền bên thứ ba', - 'counts' => 'Tổng cộng :num bản ghi ủy quyền', - ], - 'select_all' => 'Chọn tất cả', - 'clear' => 'Xóa', - 'unselected_hint' => 'Các quy tắc chưa được phân bổ có thể tìm kiếm tại đây', - 'selected_hint' => 'Các quy tắc đã được phân bổ có thể tìm kiếm tại đây', - 'clone' => 'Nhân bản', + 'minute' => 'phút', 'monitor' => [ 'daily_chart' => 'Biểu đồ lưu lượng hàng ngày', + 'hint' => 'Gợi ý: Nếu không có dữ liệu, hãy kiểm tra các tác vụ theo lịch trình', 'monthly_chart' => 'Biểu đồ lưu lượng hàng tháng', 'node' => 'Lưu lượng nút', 'user' => 'Lưu lượng người dùng', - 'hint' => 'Gợi ý: Nếu không có dữ liệu, hãy kiểm tra các tác vụ theo lịch trình', ], - 'tools' => [ - 'analysis' => [ - 'title' => 'Phân tích nhật ký SSR Chỉ dành cho một nút', - 'req_url' => 'Nhật ký URL yêu cầu gần đây', - 'not_enough' => 'Ít hơn 15,000 bản ghi, không thể phân tích', - ], - 'convert' => [ - 'title' => 'Chuyển đổi định dạng SS sang SSR', - 'content_placeholder' => 'Vui lòng điền thông tin cấu hình cần chuyển đổi.', - ], - 'decompile' => [ - 'title' => 'Giải mã Thông tin cấu hình', - 'attribute' => 'Giải mã liên kết cấu hình', - 'content_placeholder' => 'Vui lòng điền các liên kết ShadowsocksR cần giải mã, cách nhau bằng dòng mới.', - ], - ], - 'ticket' => [ - 'title' => 'Danh sách yêu cầu hỗ trợ', - 'counts' => 'Tổng cộng :num yêu cầu hỗ trợ', - 'send_to' => 'Vui lòng điền thông tin người dùng mục tiêu', - 'user_info' => 'Thông tin người dùng', - 'inviter_info' => 'Thông tin người mời', - 'close_confirm' => 'Bạn có muốn đóng yêu cầu hỗ trợ này không?', - 'error' => 'Lỗi không xác định! Vui lòng kiểm tra nhật ký', - ], - 'logs' => [ - 'subscribe' => 'Danh sách đăng ký', - 'counts' => 'Tổng cộng :num bản ghi', - 'rule' => [ - 'clear_all' => 'Xóa tất cả các bản ghi', - 'title' => 'Hồ sơ kích hoạt quy tắc', - 'name' => 'Tên quy tắc kích hoạt', - 'reason' => 'Lý do kích hoạt', - 'created_at' => 'Thời gian kích hoạt', - 'tag' => '✅ Truy cập nội dung không được phép', - 'clear_confirm' => 'Bạn có muốn xóa tất cả các hồ sơ kích hoạt không?', - ], - 'order' => [ - 'title' => 'Danh sách đơn hàng', - 'is_expired' => 'Hết hạn', - 'is_coupon' => 'Sử dụng mã giảm giá', - ], - 'user_traffic' => [ - 'title' => 'Hồ sơ sử dụng dữ liệu', - 'choose_node' => 'Chọn nút', - ], - 'user_data_modify_title' => 'Hồ sơ thay đổi dữ liệu', - 'callback' => 'Nhật ký hồi đáp (Thanh toán)', - 'notification' => 'Nhật ký email', - 'ip_monitor' => 'Giám sát IP trực tuyến Dữ liệu thời gian thực trong 2 phút', - 'user_ip' => [ - 'title' => 'Danh sách IP trực tuyến 10 phút gần đây', - 'connect' => 'Kết nối IP', - ], - 'ban' => [ - 'title' => 'Hồ sơ cấm người dùng', - 'time' => 'Thời gian', - 'reason' => 'Lý do', - 'ban_time' => 'Thời gian cấm', - 'last_connect_at' => 'Thời gian kết nối cuối cùng', - ], - 'credit_title' => 'Hồ sơ thay đổi số dư', - ], - 'start_time' => 'Thời gian bắt đầu', - 'end_time' => 'Thời gian kết thúc', - 'goods' => [ - 'title' => 'Danh sách sản phẩm', - 'type' => [ - 'top_up' => 'Nạp tiền', - 'package' => 'Gói dữ liệu', - 'plan' => 'Gói đăng ký', - ], - 'info' => [ - 'type_hint' => 'Gói đăng ký ảnh hưởng đến thời hạn tài khoản, gói dữ liệu chỉ trừ dữ liệu, không ảnh hưởng đến thời hạn', - 'period_hint' => 'Dữ liệu gói sẽ được đặt lại mỗi N ngày', - 'limit_num_hint' => 'Số lần mua tối đa mỗi người dùng, 0 là không giới hạn', - 'available_date_hint' => 'Tự động trừ dữ liệu từ tổng khi đến hạn', - 'desc_placeholder' => 'Mô tả ngắn gọn sản phẩm', - 'list_placeholder' => 'Thêm nội dung tùy chỉnh', - 'list_hint' => 'Bắt đầu mỗi dòng bằng <li> và kết thúc bằng </li>', - ], - 'status' => [ - 'yes' => 'Đang bán', - 'no' => 'Ngừng bán', - ], - 'sell_and_used' => 'Đã sử dụng / Đã bán', - 'counts' => 'Tổng cộng :num sản phẩm', - ], - 'sort_asc' => 'Giá trị sắp xếp càng lớn, càng ưu tiên', - 'yes' => 'Có', 'no' => 'Không', - 'rule' => [ - 'type' => [ - 'reg' => 'Biểu thức chính quy', - 'domain' => 'Tên miền', - 'ip' => 'IP', - 'protocol' => 'Giao thức', + 'node' => [ + 'auth' => [ + 'counts' => 'Tổng cộng :num bản ghi ủy quyền', + 'deploy' => [ + 'attribute' => 'Triển khai Backend', + 'command' => 'Lệnh', + 'real_time_logs' => 'Nhật ký thời gian thực', + 'recent_logs' => 'Nhật ký gần đây', + 'restart' => 'Khởi động lại', + 'same' => 'Giống trên', + 'start' => 'Khởi động', + 'status' => 'Trạng thái', + 'stop' => 'Dừng', + 'title' => 'Triển khai Backend :type_label', + 'trojan_hint' => 'Vui lòng điền tên nút và phân giải đến IP tương ứng', + 'uninstall' => 'Gỡ cài đặt', + 'update' => 'Cập nhật', + ], + 'empty' => 'Không có nút nào cần tạo quyền ủy quyền', + 'generating_all' => 'Xác nhận tạo khóa ủy quyền cho tất cả các nút?', + 'reset_auth' => 'Đặt lại khóa ủy quyền', + 'title' => 'Danh sách ủy quyền nút WEBAPI', ], + 'cert' => [ + 'counts' => 'Tổng cộng :num chứng chỉ tên miền', + 'key_placeholder' => 'Giá trị KEY của chứng chỉ, có thể để trống. Backend VNET-V2Ray hỗ trợ cấp phát tự động', + 'pem_placeholder' => 'Giá trị PEM của chứng chỉ, có thể để trống. Backend VNET-V2Ray hỗ trợ cấp phát tự động', + 'title' => 'Danh sách chứng chỉ tên miền (Đối với ngụy trang tên miền của nút V2Ray)', + ], + 'connection_test' => 'Kiểm tra kết nối', + 'counts' => 'Tổng cộng :num nút', + 'info' => [ + 'additional_ports_hint' => 'Nếu bật, vui lòng cấu hình additional_ports của máy chủ', + 'basic' => 'Thông tin cơ bản', + 'data_rate_hint' => 'Ví dụ: 0.1 có nghĩa là 100M sẽ được tính là 10M; 5 có nghĩa là 100M sẽ được tính là 500M', + 'ddns_hint' => 'Các nút IP động yêu cầu cấu hình DDNS. Đối với loại nút này, Kiểm tra kết nối sẽ được thực hiện qua tên miền.', + 'detection' => [ + 'all' => 'Cả hai', + 'hint' => 'Kiểm tra ngẫu nhiên mỗi 30-60 phút', + 'icmp' => 'Chỉ ICMP', + 'tcp' => 'Chỉ TCP', + ], + 'display' => [ + 'all' => 'Hiển thị hoàn toàn', + 'hint' => 'Người dùng có thể xem/đăng ký nút này hay không', + 'invisible' => 'Không hiển thị', + 'node' => 'Chỉ hiển thị trong Trang Nút', + 'sub' => 'Chỉ hiển thị trong Đăng ký', + ], + 'domain_hint' => 'Sau khi bật DDNS trong cài đặt hệ thống, tên miền và các IP sẽ tự động cập nhật! Bạn không cần chỉnh sửa thông tin này tại trang web đăng ký tên miền.', + 'domain_placeholder' => 'Tên miền máy chủ, sẽ sử dụng trước nếu điền', + 'extend' => 'Thông tin mở rộng', + 'hint' => 'Lưu ý: ID tự động tạo là node_id cho backend ShadowsocksR và nodeId cho backend V2Ray', + 'ipv4_hint' => 'Nhiều IP nên được phân cách bằng dấu phẩy, ví dụ: 1.1.1.1,8.8.8.8', + 'ipv4_placeholder' => 'Địa chỉ IPv4 của máy chủ', + 'ipv6_hint' => 'Nhiều IP nên được phân cách bằng dấu phẩy, ví dụ: 1.1.1.1,8.8.8.8', + 'ipv6_placeholder' => 'Địa chỉ IPv6 của máy chủ', + 'level_hint' => 'Cấp độ: 0 - Không giới hạn cấp độ, tất cả đều có thể xem.', + 'obfs_param_hint' => 'Điền vào tham số để ngụy trang lưu lượng nếu obfs không phải là [plain]; Đề xuất cổng 80 nếu obfs là [http_simple]; Đề xuất cổng 443 nếu obfs là [tls];', + 'push_port_hint' => 'Bắt buộc. Đảm bảo rằng cổng này đã được mở trong tường lửa của máy chủ, nếu không thông báo đẩy sẽ bị lỗi.', + 'single_hint' => 'Đề xuất cổng 80/443. Backend cần
    cấu hình chế độ nghiêm ngặt: chỉ kết nối qua các cổng được chỉ định. (Cách cấu hình)', + 'v2_cover' => [ + 'dtls' => 'DTLS 1.2', + 'http' => 'HTTP', + 'none' => 'Không ngụy trang', + 'srtp' => 'SRTP', + 'utp' => 'uTP', + 'wechat' => 'Video WeChat', + 'wireguard' => 'WireGuard', + ], + 'v2_host_hint' => 'Khi sử dụng ngụy trang HTTP, nhiều tên miền nên được phân cách bằng dấu phẩy, trong khi WebSocket chỉ cho phép một tên miền.', + 'v2_method_hint' => 'Giao thức truyền tải WebSocket không nên sử dụng phương pháp mã hóa \'none\'.', + 'v2_net_hint' => 'Vui lòng bật TLS cho WebSocket', + 'v2_tls_provider_hint' => 'Các backend khác nhau có cấu hình khác nhau:', + ], + 'proxy_info' => '*Tương thích với giao thức Shadowsocks', + 'proxy_info_hint' => 'Để tương thích, vui lòng thêm _compatible vào giao thức và ngụy trang trong cấu hình máy chủ', + 'refresh_geo' => 'Làm mới vị trí địa lý', + 'refresh_geo_all' => 'Làm mới thông tin địa lý', + 'reload' => 'Tải lại Backend', + 'reload_all' => 'Tải lại tất cả backend', + 'reload_confirm' => 'Bạn có muốn tải lại backend của nút không?', + 'traffic_monitor' => 'Thống kê lưu lượng', + ], + 'oauth' => [ + 'counts' => 'Tổng cộng :num bản ghi ủy quyền', + 'title' => 'Ủy quyền bên thứ ba', + ], + 'optional' => 'Tùy chọn', + 'permission' => [ + 'counts' => 'Tổng cộng có :num quyền hạn', + 'description_hint' => 'Mô tả, ví dụ: [Hệ thống A] Chỉnh sửa A', + 'name_hint' => 'Tên định tuyến, ví dụ: admin.permission.create,update', + 'title' => 'Danh sách quyền hạn', + ], + 'query' => 'Truy vấn', + 'report' => [ + 'annually_accounting' => 'Giao dịch hàng năm', + 'annually_site_flow' => 'Lưu lượng hàng năm', + 'avg_traffic_30d' => 'Lưu lượng trung bình 30 ngày', + 'current_month' => 'Tháng này', + 'current_year' => 'Năm nay', + 'daily_accounting' => 'Giao dịch hàng ngày', + 'daily_distribution' => 'Phân phối hàng ngày', + 'daily_site_flow' => 'Lưu lượng hàng ngày', + 'daily_traffic' => 'Lưu lượng hàng ngày', + 'hourly_traffic' => 'Lưu lượng hàng giờ', + 'last_month' => 'Tháng trước', + 'last_year' => 'Năm trước', + 'monthly_accounting' => 'Giao dịch hàng tháng', + 'monthly_site_flow' => 'Lưu lượng hàng tháng', + 'select_hourly_date' => 'Chọn ngày theo giờ', + 'sum_traffic_30d' => 'Tỷ lệ lưu lượng 30 ngày', + 'today' => 'Hôm nay', + ], + 'require' => 'Bắt buộc', + 'role' => [ + 'counts' => 'Tổng cộng có :num vai trò', + 'description_hint' => 'Tên hiển thị trên bảng điều khiển, ví dụ: Quản trị viên', + 'modify_admin_error' => 'Vui lòng không sửa đổi quản trị viên cấp cao!', + 'name_hint' => 'Tên định danh duy nhất, ví dụ: Administrator', + 'permissions_all' => 'Tất cả quyền hạn', + 'title' => 'Danh sách vai trò', + ], + 'rule' => [ 'counts' => 'Tổng cộng có :num quy tắc kiểm tra', - 'title' => 'Danh sách quy tắc', 'group' => [ + 'counts' => 'Tổng cộng có :num nhóm', + 'title' => 'Nhóm quy tắc', 'type' => [ 'off' => 'Chặn', 'on' => 'Cho phép', ], - 'title' => 'Nhóm quy tắc', - 'counts' => 'Tổng cộng có :num nhóm', ], - ], - 'role' => [ - 'name_hint' => 'Tên định danh duy nhất, ví dụ: Administrator', - 'description_hint' => 'Tên hiển thị trên bảng điều khiển, ví dụ: Quản trị viên', - 'title' => 'Danh sách vai trò', - 'permissions_all' => 'Tất cả quyền hạn', - 'counts' => 'Tổng cộng có :num vai trò', - ], - 'report' => [ - 'daily_accounting' => 'Giao dịch hàng ngày', - 'monthly_accounting' => 'Giao dịch hàng tháng', - 'annually_accounting' => 'Giao dịch hàng năm', - 'daily_site_flow' => 'Lưu lượng hàng ngày', - 'monthly_site_flow' => 'Lưu lượng hàng tháng', - 'annually_site_flow' => 'Lưu lượng hàng năm', - 'current_month' => 'Tháng này', - 'last_month' => 'Tháng trước', - 'current_year' => 'Năm nay', - 'last_year' => 'Năm trước', - 'hourly_traffic' => 'Lưu lượng hàng giờ', - 'daily_traffic' => 'Lưu lượng hàng ngày', - 'daily_distribution' => 'Phân phối hàng ngày', - 'today' => 'Hôm nay', - 'avg_traffic_30d' => 'Lưu lượng trung bình 30 ngày', - 'sum_traffic_30d' => 'Tỷ lệ lưu lượng 30 ngày', - 'select_hourly_date' => 'Chọn ngày theo giờ', - ], - 'permission' => [ - 'title' => 'Danh sách quyền hạn', - 'description_hint' => 'Mô tả, ví dụ: [Hệ thống A] Chỉnh sửa A', - 'name_hint' => 'Tên định tuyến, ví dụ: admin.permission.create,update', - 'counts' => 'Tổng cộng có :num quyền hạn', - ], - 'marketing' => [ - 'push_send' => 'Gửi thông báo', - 'email_send' => 'Gửi email nhóm', - 'email' => [ - 'targeted_users_count' => 'Số lượng người dùng mục tiêu', - 'loading_statistics' => 'Đang tải thống kê...', - 'filters' => 'Bộ lọc', - 'expired_date' => 'Ngày hết hạn', - 'will_expire_date' => '', - 'traffic_usage_over' => 'Sử dụng lưu lượng vượt quá N%', - 'recently_active' => 'Hoạt động gần đây', - 'paid_servicing' => '\'Dịch vụ trả phí', - 'previously_paid' => 'Đã từng thanh toán', - 'ever_paid' => 'Đã thanh toán', - 'never_paid' => 'Chưa thanh toán', - 'recent_traffic_abnormal' => 'Lưu lượng bất thường trong giờ qua', - ], - 'counts' => 'Tổng cộng có :num email', - 'send_status' => 'Trạng thái gửi', - 'send_time' => 'Thời gian gửi', - 'error_message' => 'Thông báo lỗi', - 'processed' => 'Yêu cầu đã được xử lý', - 'targeted_users_not_found' => 'Không tìm thấy người dùng mục tiêu', - 'unknown_sending_type' => 'Loại gửi không xác định', - ], - 'creating' => 'Đang thêm...', - 'article' => [ + 'title' => 'Danh sách quy tắc', 'type' => [ - 'knowledge' => 'Bài viết', - 'announcement' => 'Thông báo', + 'domain' => 'Tên miền', + 'ip' => 'IP', + 'protocol' => 'Giao thức', + 'reg' => 'Biểu thức chính quy', ], - 'category_hint' => 'Cùng một danh mục sẽ được nhóm vào cùng một thư mục', - 'logo_placeholder' => 'Hoặc nhập URL logo', - 'title' => 'Danh sách bài viết', - 'counts' => 'Tổng cộng có :num bài viết', - ], - 'coupon' => [ - 'title' => 'Danh sách phiếu giảm giá', - 'name_hint' => 'Sẽ hiển thị trên giao diện người dùng', - 'sn_hint' => 'Cung cấp mã phiếu giảm giá cho người dùng, để trống sẽ mặc định là mã ngẫu nhiên 8 ký tự', - 'type' => [ - 'voucher' => 'Phiếu mua hàng', - 'discount' => 'Phiếu giảm giá', - 'charge' => 'Phiếu nạp tiền', - ], - 'type_hint' => 'Giảm giá: giảm số tiền sản phẩm, Giảm phần trăm: giảm giá theo phần trăm sản phẩm, Nạp tiền: nạp tiền vào tài khoản người dùng', - 'value' => '{1} ➖ :num|{2} :num% giảm giá|{3} ➕ :num', - 'value_hint' => 'Phạm vi từ 1% đến 99%', - 'priority_hint' => 'Mã phiếu giảm giá có ưu tiên cao nhất sẽ được sử dụng trước. Tối đa là 255', - 'minimum_hint' => 'Chỉ có thể sử dụng khi số tiền thanh toán vượt quá :num', - 'used_hint' => 'Mỗi người dùng có thể sử dụng tối đa :num lần', - 'levels_hint' => 'Chỉ có thể sử dụng cho các cấp độ người dùng đã chọn', - 'groups_hint' => 'Chỉ có thể sử dụng cho các nhóm người dùng đã chọn', - 'users_placeholder' => 'Nhập ID người dùng, sau đó nhấn Enter', - 'user_whitelist_hint' => 'Người dùng trong danh sách trắng có thể sử dụng, để trống nếu không sử dụng điều kiện này', - 'users_blacklist_hint' => 'Người dùng trong danh sách đen không thể sử dụng, để trống nếu không sử dụng điều kiện này', - 'services_placeholder' => 'Nhập ID sản phẩm, sau đó nhấn Enter', - 'services_whitelist_hint' => 'Chỉ có thể sử dụng cho các sản phẩm trong danh sách trắng, để trống nếu không sử dụng điều kiện này', - 'services_blacklist_hint' => 'Không thể sử dụng cho các sản phẩm trong danh sách đen, để trống nếu không sử dụng điều kiện này', - 'newbie' => [ - 'first_discount' => 'Giảm giá lần đầu', - 'first_order' => 'Đơn hàng đầu tiên', - 'created_days' => 'Ngày tạo tài khoản', - ], - 'created_days_hint' => ':days ngày sau khi đăng ký', - 'limit_hint' => 'Các điều kiện này có quan hệ , vui lòng sử dụng đúng cách', - 'info_title' => 'Thông tin phiếu giảm giá', - 'counts' => 'Tổng cộng có :num phiếu giảm giá', - 'discount' => 'Giảm giá', - 'export_title' => 'Xuất phiếu giảm giá', - 'single_use' => 'Sử dụng một lần', - ], - 'times' => 'Lần', - 'massive_export' => 'Xuất hàng loạt', - 'system_generate' => 'Hệ thống tạo ra', - 'aff' => [ - 'rebate_title' => 'Lịch sử hoàn tiền', - 'counts' => 'Tổng cộng có :num bản ghi hoàn tiền', - 'title' => 'Danh sách yêu cầu rút tiền', - 'apply_counts' => 'Tổng cộng có :num yêu cầu rút tiền', - 'referral' => 'Hoàn tiền giới thiệu', - 'commission_title' => 'Chi tiết yêu cầu rút tiền', - 'commission_counts' => 'Yêu cầu này liên quan đến tổng cộng :num đơn hàng', ], + 'select_all' => 'Chọn tất cả', + 'selected_hint' => 'Các quy tắc đã được phân bổ có thể tìm kiếm tại đây', + 'set_to' => 'Đặt thành :attribute', 'setting' => [ 'common' => [ - 'title' => 'Cấu hình chung', - 'set_default' => 'Đặt làm mặc định', 'connect_nodes' => 'Số lượng nút kết nối', + 'set_default' => 'Đặt làm mặc định', + 'title' => 'Cấu hình chung', ], 'email' => [ - 'title' => 'Danh sách lọc email (dùng để chặn đăng ký email cụ thể)', - 'tail' => 'Hậu tố email', - 'rule' => 'Quy tắc', 'black' => 'Danh sách đen', - 'white' => 'Danh sách trắng', + 'rule' => 'Quy tắc', + 'tail' => 'Hậu tố email', 'tail_placeholder' => 'Vui lòng nhập hậu tố email', - ], - 'system' => [ - 'title' => 'Cấu hình hệ thống', - 'web' => 'Cấu hình chung', - 'account' => 'Cấu hình tài khoản', - 'node' => 'Cấu hình nút', - 'extend' => 'Chức năng mở rộng', - 'check_in' => 'Hệ thống điểm danh', - 'promotion' => 'Hệ thống khuyến mãi', - 'notify' => 'Hệ thống thông báo', - 'auto_job' => 'Nhiệm vụ tự động', - 'other' => 'LOGO|CS|Thống kê', - 'payment' => 'Hệ thống thanh toán', - 'menu' => 'Menu', + 'title' => 'Danh sách lọc email (dùng để chặn đăng ký email cụ thể)', + 'white' => 'Danh sách trắng', ], 'no_permission' => 'Bạn không có quyền thay đổi tham số!', + 'system' => [ + 'account' => 'Cấu hình tài khoản', + 'auto_job' => 'Nhiệm vụ tự động', + 'check_in' => 'Hệ thống điểm danh', + 'extend' => 'Chức năng mở rộng', + 'menu' => 'Menu', + 'node' => 'Cấu hình nút', + 'notify' => 'Hệ thống thông báo', + 'other' => 'LOGO|CS|Thống kê', + 'payment' => 'Hệ thống thanh toán', + 'promotion' => 'Hệ thống khuyến mãi', + 'title' => 'Cấu hình hệ thống', + 'web' => 'Cấu hình chung', + ], ], + 'sort_asc' => 'Giá trị sắp xếp càng lớn, càng ưu tiên', + 'start_time' => 'Thời gian bắt đầu', 'system' => [ + 'AppStore_id' => 'Tài khoản Apple', + 'AppStore_password' => 'Mật khẩu Apple', 'account_expire_notification' => 'Thông báo hết hạn tài khoản', + 'active_account' => [ + 'after' => 'Kích hoạt sau khi đăng ký', + 'before' => 'Kích hoạt trước khi đăng ký', + ], 'active_times' => 'Số lần kích hoạt tài khoản', 'admin_invite_days' => 'Thời hạn hiệu lực mã mời của quản trị viên', 'aff_salt' => 'Mã hóa thông tin người dùng trong liên kết giới thiệu', 'alipay_qrcode' => 'Mã QR Alipay', - 'AppStore_id' => 'Tài khoản Apple', - 'AppStore_password' => 'Mật khẩu Apple', 'auto_release_port' => 'Cơ chế thu hồi cổng', 'bark_key' => 'Khóa thiết bị Bark', + 'captcha' => [ + 'geetest' => 'Geetest', + 'hcaptcha' => 'hCaptcha', + 'recaptcha' => 'Google reCaptcha', + 'standard' => 'Captcha tiêu chuẩn', + 'turnstile' => 'Turnstile', + ], 'captcha_key' => 'Khóa Captcha', 'captcha_secret' => 'Bí mật/ID Captcha', 'codepay_id' => 'ID CodePay', @@ -521,6 +477,7 @@ return [ 'ddns_secret' => 'Bí mật nhà cung cấp DNS', 'default_days' => 'Thời hạn mặc định', 'default_traffic' => 'Lưu lượng mặc định', + 'demo_restriction' => 'Không được phép thay đổi cấu hình này trong môi trường demo!', 'detection_check_times' => 'Thông báo kiểm tra chặn', 'dingTalk_access_token' => 'Token truy cập DingTalk', 'dingTalk_secret' => 'Bí mật DingTalk', @@ -531,108 +488,19 @@ return [ 'f2fpay_app_id' => 'ID ứng dụng Alipay', 'f2fpay_private_key' => 'Khóa riêng tư Alipay', 'f2fpay_public_key' => 'Khóa công khai Alipay', + 'forbid' => [ + 'china' => 'Chặn truy cập từ Trung Quốc', + 'mainland' => 'Chặn truy cập từ Trung Quốc đại lục', + 'oversea' => 'Chặn truy cập từ nước ngoài', + ], 'forbid_mode' => 'Chế độ cấm truy cập', - 'invite_num' => 'Số lượng lời mời mặc định', - 'is_activate_account' => 'Kích hoạt tài khoản', - 'is_AliPay' => 'Thanh toán Alipay', - 'is_ban_status' => 'Tự động cấm khi hết hạn', - 'is_captcha' => 'Chế độ Captcha', - 'is_checkin' => 'Điểm danh nhận lưu lượng', - 'is_clear_log' => 'Tự động xóa nhật ký', - 'is_custom_subscribe' => 'Đăng ký nâng cao', - 'is_email_filtering' => 'Cơ chế lọc email', - 'is_forbid_robot' => 'Cấm robot truy cập', - 'is_free_code' => 'Mã mời miễn phí', - 'is_invite_register' => 'Mời đăng ký', - 'is_otherPay' => 'Thanh toán đặc biệt', - 'is_QQPay' => 'Thanh toán QQ', - 'is_rand_port' => 'Cổng ngẫu nhiên', - 'is_register' => 'Đăng ký người dùng', - 'is_subscribe_ban' => 'Tự động cấm yêu cầu đăng ký bất thường', - 'is_traffic_ban' => 'Tự động cấm sử dụng lưu lượng bất thường', - 'is_WeChatPay' => 'Thanh toán WeChat', - 'iYuu_token' => 'Token IYUU', - 'maintenance_content' => 'Nội dung thông báo bảo trì', - 'maintenance_mode' => 'Chế độ bảo trì', - 'maintenance_time' => 'Thời gian kết thúc bảo trì', - 'min_port' => 'Phạm vi cổng', - 'min_rand_traffic' => 'Phạm vi lưu lượng', - 'node_blocked_notification' => 'Thông báo chặn nút', - 'node_daily_notification' => 'Báo cáo sử dụng nút hàng ngày', - 'node_offline_notification' => 'Thông báo nút ngoại tuyến', - 'oauth_path' => 'Nền tảng đăng nhập bên thứ ba', - 'offline_check_times' => 'Số lần thông báo ngoại tuyến', - 'password_reset_notification' => 'Thông báo đặt lại mật khẩu', - 'paybeaver_app_id' => 'ID ứng dụng PayBeaver', - 'paybeaver_app_secret' => 'Bí mật ứng dụng PayBeaver', - 'payjs_key' => 'Khóa giao tiếp PayJs', - 'payjs_mch_id' => 'ID thương gia PayJs', - 'payment_confirm_notification' => 'Thông báo xác nhận thanh toán thủ công', - 'payment_received_notification' => 'Thông báo thanh toán thành công', - 'paypal_app_id' => 'ID ứng dụng PayPal', - 'paypal_client_id' => 'ID khách hàng PayPal', - 'paypal_client_secret' => 'Bí mật khách hàng PayPal', - 'pushDeer_key' => 'Khóa PushDeer', - 'pushplus_token' => 'Token PushPlus', - 'rand_subscribe' => 'Đăng ký ngẫu nhiên', - 'redirect_url' => 'URL chuyển hướng', - 'referral_money' => 'Giới hạn rút tiền tối thiểu', - 'referral_percent' => 'Tỷ lệ hoàn tiền', - 'referral_status' => 'Chức năng giới thiệu', - 'referral_traffic' => 'Thưởng lưu lượng khi đăng ký', - 'referral_type' => 'Loại hoàn tiền', - 'register_ip_limit' => 'Giới hạn đăng ký cùng IP', - 'reset_password_times' => 'Số lần đặt lại mật khẩu', - 'reset_traffic' => 'Tự động đặt lại lưu lượng', - 'server_chan_key' => 'Khóa ServerChan', - 'standard_currency' => 'Tiền tệ chính', - 'stripe_public_key' => 'Khóa công khai Stripe', - 'stripe_secret_key' => 'Khóa bí mật Stripe', - 'stripe_signing_secret' => 'Bí mật ký WebHook Stripe', - 'subject_name' => 'Tên sản phẩm tùy chỉnh', - 'subscribe_ban_times' => 'Giới hạn yêu cầu đăng ký', - 'subscribe_domain' => 'URL đăng ký nút', - 'subscribe_max' => 'Số lượng nút đăng ký tối đa', - 'telegram_token' => 'Token Telegram', - 'tg_chat_token' => 'Token TG Chat', - 'theadpay_key' => 'Khóa thương gia THeadPay', - 'theadpay_mchid' => 'ID thương gia THeadPay', - 'theadpay_url' => 'URL giao diện THeadPay', - 'ticket_closed_notification' => 'Thông báo đóng vé', - 'ticket_created_notification' => 'Thông báo tạo vé mới', - 'ticket_replied_notification' => 'Thông báo trả lời vé', - 'traffic_ban_time' => 'Thời gian cấm', - 'traffic_ban_value' => 'Ngưỡng lưu lượng bất thường', - 'traffic_limit_time' => 'Khoảng thời gian kiểm tra', - 'traffic_warning_percent' => 'Ngưỡng cảnh báo lưu lượng', - 'trojan_license' => 'Giấy phép Trojan', - 'username_type' => 'Loại tên người dùng', - 'user_invite_days' => 'Thời hạn hiệu lực mã mời của người dùng', - 'v2ray_license' => 'Giấy phép V2Ray', - 'v2ray_tls_provider' => 'Cấu hình TLS V2Ray', - 'webmaster_email' => 'Email quản trị viên', - 'website_analytics' => 'Mã phân tích trang web', - 'website_callback_url' => 'URL callback thanh toán', - 'website_customer_service' => 'Mã dịch vụ khách hàng', - 'website_home_logo' => 'Logo trang chủ', - 'website_logo' => 'Logo trang nội bộ', - 'website_name' => 'Tên trang web', - 'website_security_code' => 'Mã bảo mật trang web', - 'website_url' => 'URL trang web', - 'web_api_url' => 'URL API', - 'wechat_aid' => 'ID ứng dụng WeChat', - 'wechat_cid' => 'ID WeChat', - 'wechat_encodingAESKey' => 'Khóa mã hóa WeChat', - 'wechat_qrcode' => 'Mã QR WeChat', - 'wechat_secret' => 'Bí mật WeChat', - 'wechat_token' => 'Token WeChat', 'hint' => [ + 'AppStore_id' => 'Dùng trong bài viết hướng dẫn iOS', + 'AppStore_password' => 'Dùng trong bài viết hướng dẫn iOS', 'account_expire_notification' => 'Thông báo hết hạn tài khoản', 'active_times' => 'Số lần kích hoạt tài khoản qua email trong 24 giờ', 'admin_invite_days' => 'Thời hạn hiệu lực mã mời của quản trị viên', 'aff_salt' => 'Muối mã hóa cho URL giới thiệu', - 'AppStore_id' => 'Dùng trong bài viết hướng dẫn iOS', - 'AppStore_password' => 'Dùng trong bài viết hướng dẫn iOS', 'auto_release_port' => 'Tự động giải phóng cổng sau khi bị cấm hoặc hết hạn '.config('tasks.release_port').' ngày', 'bark_key' => 'Khóa thiết bị cho thông báo đẩy iOS', 'captcha_key' => 'Xem hướng dẫn cài đặt', @@ -650,6 +518,7 @@ return [ 'f2fpay_private_key' => 'Khóa riêng tư Alipay từ công cụ tạo khóa bí mật', 'f2fpay_public_key' => 'Không phải khóa công khai APP!', 'forbid_mode' => 'Chặn truy cập từ các khu vực cụ thể', + 'iYuu_token' => 'Điền token IYUU trước khi bật', 'invite_num' => 'Số lượng lời mời mặc định cho mỗi người dùng', 'is_activate_account' => 'Yêu cầu kích hoạt qua email', 'is_ban_status' => '(Cẩn thận) Cấm tài khoản sẽ đặt lại mọi dữ liệu người dùng', @@ -664,14 +533,14 @@ return [ 'is_register' => 'Tắt đăng ký nếu bỏ chọn', 'is_subscribe_ban' => 'Tự động cấm nếu yêu cầu đăng ký vượt quá ngưỡng', 'is_traffic_ban' => 'Tự động vô hiệu hóa dịch vụ nếu lưu lượng vượt quá ngưỡng trong 1 giờ', - 'iYuu_token' => 'Điền token IYUU trước khi bật', 'maintenance_content' => 'Thông báo bảo trì tùy chỉnh', - 'maintenance_mode' => "Chuyển hướng người dùng bình thường đến trang bảo trì nếu bật | Quản trị viên có thể đăng nhập qua :url", + 'maintenance_mode' => 'Chuyển hướng người dùng bình thường đến trang bảo trì nếu bật | Quản trị viên có thể đăng nhập qua :url', 'maintenance_time' => 'Dùng cho đồng hồ đếm ngược trên trang bảo trì', 'min_port' => 'Phạm vi cổng 1000 - 65535', 'node_blocked_notification' => 'Phát hiện nút bị chặn hàng giờ, thông báo cho quản trị viên', 'node_daily_notification' => 'Báo cáo sử dụng nút hàng ngày', 'node_offline_notification' => 'Phát hiện ngoại tuyến mỗi 10 phút, thông báo nếu có nút nào ngoại tuyến', + 'node_renewal_notification' => 'Nhắc nhở quản trị viên gia hạn nút trước 7 ngày, 3 ngày và 1 ngày trước khi hết hạn.', 'oauth_path' => 'Vui lòng bật nền tảng trong .ENV trước', 'offline_check_times' => 'Ngừng thông báo sau N lần cảnh báo trong 24 giờ', 'password_reset_notification' => 'Cho phép đặt lại mật khẩu qua email nếu bật', @@ -707,9 +576,10 @@ return [ 'traffic_ban_value' => 'Kích hoạt cấm tài khoản tự động nếu vượt quá giá trị này trong 1 giờ', 'traffic_limit_time' => 'Khoảng thời gian giữa các lần điểm danh', 'traffic_warning_percent' => 'Gửi thông báo hết lưu lượng khi sử dụng hàng ngày đạt đến tỷ lệ phần trăm này', - 'username_type' => 'Loại tên người dùng mặc định cho người dùng', 'user_invite_days' => 'Thời hạn hiệu lực của mã mời do người dùng tạo', + 'username_type' => 'Loại tên người dùng mặc định cho người dùng', 'v2ray_tls_provider' => 'Cấu hình TLS của V2Ray, cấu hình nút sẽ ghi đè', + 'web_api_url' => 'Ví dụ: '.config('app.url'), 'webmaster_email' => 'Email liên hệ hiển thị trong một số thông báo lỗi', 'website_analytics' => 'Mã JavaScript phân tích trang web', 'website_callback_url' => 'Ngăn chặn lỗi callback thanh toán do DNS poisoning', @@ -717,97 +587,247 @@ return [ 'website_name' => 'Tên trang web trong email', 'website_security_code' => 'Yêu cầu mã bảo mật để truy cập trang web nếu được thiết lập', 'website_url' => 'Tên miền chính sử dụng cho các liên kết', - 'web_api_url' => 'Ví dụ: '.config('app.url'), 'wechat_aid' => 'Quản lý ứng dụng -> AgentId', 'wechat_cid' => 'Lấy từ Thông tin doanh nghiệp', 'wechat_encodingAESKey' => 'Quản lý ứng dụng -> Cài đặt ứng dụng -> EncodingAESKey', 'wechat_secret' => 'Bí mật ứng dụng (cần WeChat doanh nghiệp để xem)', 'wechat_token' => 'Cài đặt ứng dụng -> TOKEN, URL callback: :url', ], - 'placeholder' => [ - 'default_url' => 'Mặc định là :url', - 'server_chan_key' => 'Điền SCKEY của ServerChan rồi nhấn Cập nhật', - 'pushDeer_key' => 'Điền Push Key của PushDeer rồi nhấn Cập nhật', - 'iYuu_token' => 'Điền token IYUU rồi nhấn Cập nhật', - 'bark_key' => 'Điền mã thiết bị Bark rồi nhấn Cập nhật', - 'telegram_token' => 'Điền token Telegram rồi nhấn Cập nhật', - 'pushplus_token' => 'Vui lòng đăng ký tại ServerChan', - 'dingTalk_access_token' => 'Token truy cập bot tùy chỉnh', - 'dingTalk_secret' => 'Bí mật bot tùy chỉnh sau khi ký', - 'wechat_aid' => 'AID ứng dụng WeChat doanh nghiệp', - 'wechat_cid' => 'Điền CID WeChat rồi nhấn Cập nhật', - 'wechat_secret' => 'Bí mật ứng dụng WeChat doanh nghiệp', - 'tg_chat_token' => 'Vui lòng đăng ký tại Telegram', - 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'iYuu_token' => 'Token IYUU', + 'invite_num' => 'Số lượng lời mời mặc định', + 'is_AliPay' => 'Thanh toán Alipay', + 'is_QQPay' => 'Thanh toán QQ', + 'is_WeChatPay' => 'Thanh toán WeChat', + 'is_activate_account' => 'Kích hoạt tài khoản', + 'is_ban_status' => 'Tự động cấm khi hết hạn', + 'is_captcha' => 'Chế độ Captcha', + 'is_checkin' => 'Điểm danh nhận lưu lượng', + 'is_clear_log' => 'Tự động xóa nhật ký', + 'is_custom_subscribe' => 'Đăng ký nâng cao', + 'is_email_filtering' => 'Cơ chế lọc email', + 'is_forbid_robot' => 'Cấm robot truy cập', + 'is_free_code' => 'Mã mời miễn phí', + 'is_invite_register' => 'Mời đăng ký', + 'is_otherPay' => 'Thanh toán đặc biệt', + 'is_rand_port' => 'Cổng ngẫu nhiên', + 'is_register' => 'Đăng ký người dùng', + 'is_subscribe_ban' => 'Tự động cấm yêu cầu đăng ký bất thường', + 'is_traffic_ban' => 'Tự động cấm sử dụng lưu lượng bất thường', + 'maintenance_content' => 'Nội dung thông báo bảo trì', + 'maintenance_mode' => 'Chế độ bảo trì', + 'maintenance_time' => 'Thời gian kết thúc bảo trì', + 'min_port' => 'Phạm vi cổng', + 'min_rand_traffic' => 'Phạm vi lưu lượng', + 'node_blocked_notification' => 'Thông báo chặn nút', + 'node_daily_notification' => 'Báo cáo sử dụng nút hàng ngày', + 'node_offline_notification' => 'Thông báo nút ngoại tuyến', + 'node_renewal_notification' => 'Thông báo gia hạn nút', + 'notification' => [ + 'channel' => [ + 'bark' => 'Bark', + 'dingtalk' => 'DingTalk', + 'email' => 'Email', + 'iyuu' => 'IYUU', + 'pushdeer' => 'PushDeer', + 'pushplus' => 'PushPlus', + 'serverchan' => 'ServerChan', + 'site' => 'Thông báo trên trang', + 'telegram' => 'Telegram', + 'tg_chat' => 'TG Chat', + 'wechat' => 'WeChat doanh nghiệp', + ], + 'send_test' => 'Gửi tin nhắn thử nghiệm', + 'test' => [ + 'content' => 'Nội dung kiểm tra', + 'success' => 'Gửi thành công. Vui lòng kiểm tra điện thoại của bạn để nhận thông báo đẩy.', + 'title' => 'Đây là tiêu đề kiểm tra', + 'unknown_channel' => 'Kênh không xác định', + ], ], + 'oauth_path' => 'Nền tảng đăng nhập bên thứ ba', + 'offline_check_times' => 'Số lần thông báo ngoại tuyến', + 'params_required' => 'Vui lòng hoàn thiện các tham số cần thiết cho :attribute trước!', + 'password_reset_notification' => 'Thông báo đặt lại mật khẩu', + 'paybeaver_app_id' => 'ID ứng dụng PayBeaver', + 'paybeaver_app_secret' => 'Bí mật ứng dụng PayBeaver', + 'payjs_key' => 'Khóa giao tiếp PayJs', + 'payjs_mch_id' => 'ID thương gia PayJs', 'payment' => [ 'attribute' => 'Cổng thanh toán', 'channel' => [ 'alipay' => 'Alipay F2F', 'codepay' => 'CodePay', 'epay' => 'ePay', + 'manual' => 'Thanh toán thủ công', + 'paybeaver' => 'PayBeaver', 'payjs' => 'PayJs', 'paypal' => 'PayPal', 'stripe' => 'Stripe', - 'paybeaver' => 'PayBeaver', 'theadpay' => 'THeadPay', - 'manual' => 'Thanh toán thủ công', ], 'hint' => [ 'alipay' => 'Chức năng này yêu cầu đi đến Nền tảng mở của Ant Financial Services để đăng ký quyền và ứng dụng', 'codepay' => 'Vui lòng đi đến CodePay. Đăng ký tài khoản, tải xuống và cài đặt phần mềm của nó', + 'manual' => 'Sau khi cổng thanh toán được cài đặt và chọn, nó sẽ hiển thị trên giao diện người dùng', + 'paybeaver' => 'Vui lòng đi đến PayBeaver để đăng ký tài khoản', 'payjs' => 'Vui lòng đi đến PayJs để đăng ký tài khoản', 'paypal' => 'Đăng nhập vào trang đăng ký API với tài khoản thương gia của bạn, đồng ý và nhận thông tin cài đặt', - 'paybeaver' => 'Vui lòng đi đến PayBeaver để đăng ký tài khoản', 'theadpay' => 'Vui lòng đi đến THeadPay để yêu cầu tài khoản', - 'manual' => 'Sau khi cổng thanh toán được cài đặt và chọn, nó sẽ hiển thị trên giao diện người dùng', ], ], - 'notification' => [ - 'channel' => [ - 'telegram' => 'Telegram', - 'wechat' => 'WeChat doanh nghiệp', - 'dingtalk' => 'DingTalk', - 'email' => 'Email', - 'bark' => 'Bark', - 'serverchan' => 'ServerChan', - 'pushdeer' => 'PushDeer', - 'pushplus' => 'PushPlus', - 'iyuu' => 'IYUU', - 'tg_chat' => 'TG Chat', - 'site' => 'Thông báo trên trang', - ], - 'send_test' => 'Gửi tin nhắn thử nghiệm', + 'payment_confirm_notification' => 'Thông báo xác nhận thanh toán thủ công', + 'payment_received_notification' => 'Thông báo thanh toán thành công', + 'paypal_app_id' => 'ID ứng dụng PayPal', + 'paypal_client_id' => 'ID khách hàng PayPal', + 'paypal_client_secret' => 'Bí mật khách hàng PayPal', + 'placeholder' => [ + 'bark_key' => 'Điền mã thiết bị Bark rồi nhấn Cập nhật', + 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'default_url' => 'Mặc định là :url', + 'dingTalk_access_token' => 'Token truy cập bot tùy chỉnh', + 'dingTalk_secret' => 'Bí mật bot tùy chỉnh sau khi ký', + 'iYuu_token' => 'Điền token IYUU rồi nhấn Cập nhật', + 'pushDeer_key' => 'Điền Push Key của PushDeer rồi nhấn Cập nhật', + 'pushplus_token' => 'Vui lòng đăng ký tại ServerChan', + 'server_chan_key' => 'Điền SCKEY của ServerChan rồi nhấn Cập nhật', + 'telegram_token' => 'Điền token Telegram rồi nhấn Cập nhật', + 'tg_chat_token' => 'Vui lòng đăng ký tại Telegram', + 'wechat_aid' => 'AID ứng dụng WeChat doanh nghiệp', + 'wechat_cid' => 'Điền CID WeChat rồi nhấn Cập nhật', + 'wechat_secret' => 'Bí mật ứng dụng WeChat doanh nghiệp', ], - 'forbid' => [ - 'mainland' => 'Chặn truy cập từ Trung Quốc đại lục', - 'china' => 'Chặn truy cập từ Trung Quốc', - 'oversea' => 'Chặn truy cập từ nước ngoài', + 'pushDeer_key' => 'Khóa PushDeer', + 'pushplus_token' => 'Token PushPlus', + 'rand_subscribe' => 'Đăng ký ngẫu nhiên', + 'redirect_url' => 'URL chuyển hướng', + 'referral' => [ + 'loop' => 'Hoàn tiền liên tục', + 'once' => 'Hoàn tiền lần đầu', ], + 'referral_money' => 'Giới hạn rút tiền tối thiểu', + 'referral_percent' => 'Tỷ lệ hoàn tiền', + 'referral_status' => 'Chức năng giới thiệu', + 'referral_traffic' => 'Thưởng lưu lượng khi đăng ký', + 'referral_type' => 'Loại hoàn tiền', + 'register_ip_limit' => 'Giới hạn đăng ký cùng IP', + 'reset_password_times' => 'Số lần đặt lại mật khẩu', + 'reset_traffic' => 'Tự động đặt lại lưu lượng', + 'server_chan_key' => 'Khóa ServerChan', + 'standard_currency' => 'Tiền tệ chính', + 'stripe_public_key' => 'Khóa công khai Stripe', + 'stripe_secret_key' => 'Khóa bí mật Stripe', + 'stripe_signing_secret' => 'Bí mật ký WebHook Stripe', + 'subject_name' => 'Tên sản phẩm tùy chỉnh', + 'subscribe_ban_times' => 'Giới hạn yêu cầu đăng ký', + 'subscribe_domain' => 'URL đăng ký nút', + 'subscribe_max' => 'Số lượng nút đăng ký tối đa', + 'telegram_token' => 'Token Telegram', + 'tg_chat_token' => 'Token TG Chat', + 'theadpay_key' => 'Khóa thương gia THeadPay', + 'theadpay_mchid' => 'ID thương gia THeadPay', + 'theadpay_url' => 'URL giao diện THeadPay', + 'ticket_closed_notification' => 'Thông báo đóng vé', + 'ticket_created_notification' => 'Thông báo tạo vé mới', + 'ticket_replied_notification' => 'Thông báo trả lời vé', + 'traffic_ban_time' => 'Thời gian cấm', + 'traffic_ban_value' => 'Ngưỡng lưu lượng bất thường', + 'traffic_limit_time' => 'Khoảng thời gian kiểm tra', + 'traffic_warning_percent' => 'Ngưỡng cảnh báo lưu lượng', + 'trojan_license' => 'Giấy phép Trojan', + 'user_invite_days' => 'Thời hạn hiệu lực mã mời của người dùng', 'username' => [ + 'any' => 'Tên người dùng bất kỳ', 'email' => 'Email', 'mobile' => 'Số điện thoại', - 'any' => 'Tên người dùng bất kỳ', ], - 'active_account' => [ - 'before' => 'Kích hoạt trước khi đăng ký', - 'after' => 'Kích hoạt sau khi đăng ký', + 'username_type' => 'Loại tên người dùng', + 'v2ray_license' => 'Giấy phép V2Ray', + 'v2ray_tls_provider' => 'Cấu hình TLS V2Ray', + 'web_api_url' => 'URL API', + 'webmaster_email' => 'Email quản trị viên', + 'website_analytics' => 'Mã phân tích trang web', + 'website_callback_url' => 'URL callback thanh toán', + 'website_customer_service' => 'Mã dịch vụ khách hàng', + 'website_home_logo' => 'Logo trang chủ', + 'website_logo' => 'Logo trang nội bộ', + 'website_name' => 'Tên trang web', + 'website_security_code' => 'Mã bảo mật trang web', + 'website_url' => 'URL trang web', + 'wechat_aid' => 'ID ứng dụng WeChat', + 'wechat_cid' => 'ID WeChat', + 'wechat_encodingAESKey' => 'Khóa mã hóa WeChat', + 'wechat_qrcode' => 'Mã QR WeChat', + 'wechat_secret' => 'Bí mật WeChat', + 'wechat_token' => 'Token WeChat', + ], + 'system_generate' => 'Hệ thống tạo ra', + 'ticket' => [ + 'close_confirm' => 'Bạn có muốn đóng yêu cầu hỗ trợ này không?', + 'counts' => 'Tổng cộng :num yêu cầu hỗ trợ', + 'error' => 'Lỗi không xác định! Vui lòng kiểm tra nhật ký', + 'inviter_info' => 'Thông tin người mời', + 'self_send' => 'Bạn không thể tạo vé cho chính mình!', + 'send_to' => 'Vui lòng điền thông tin người dùng mục tiêu', + 'title' => 'Danh sách yêu cầu hỗ trợ', + 'user_info' => 'Thông tin người dùng', + ], + 'times' => 'Lần', + 'tools' => [ + 'analysis' => [ + 'file_missing' => ':file_name không tồn tại. Vui lòng tạo tệp trước.', + 'not_enough' => 'Ít hơn 15,000 bản ghi, không thể phân tích', + 'req_url' => 'Nhật ký URL yêu cầu gần đây', + 'title' => 'Phân tích nhật ký SSR Chỉ dành cho một nút', ], - 'captcha' => [ - 'standard' => 'Captcha tiêu chuẩn', - 'geetest' => 'Geetest', - 'recaptcha' => 'Google reCaptcha', - 'hcaptcha' => 'hCaptcha', - 'turnstile' => 'Turnstile', + 'convert' => [ + 'content_placeholder' => 'Vui lòng điền thông tin cấu hình cần chuyển đổi.', + 'file_missing' => 'Tệp không tồn tại. Vui lòng kiểm tra quyền truy cập thư mục.', + 'missing_error' => 'Chuyển đổi không thành công: Thông tin cấu hình thiếu trường [port_password] hoặc trường này bị trống.', + 'params_unknown' => 'Ngoại lệ tham số', + 'title' => 'Chuyển đổi định dạng SS sang SSR', ], - 'referral' => [ - 'once' => 'Hoàn tiền lần đầu', - 'loop' => 'Hoàn tiền liên tục', + 'decompile' => [ + 'attribute' => 'Giải mã liên kết cấu hình', + 'content_placeholder' => 'Vui lòng điền các liên kết ShadowsocksR cần giải mã, cách nhau bằng dòng mới.', + 'title' => 'Giải mã Thông tin cấu hình', + ], + 'import' => [ + 'file_error' => 'Đã xảy ra lỗi không xác định. Vui lòng tải lại lên.', + 'file_required' => 'Vui lòng chọn tệp để tải lên', + 'file_type_error' => 'Chỉ cho phép tải lên các tệp loại :type.', + 'format_error' => 'Lỗi phân tích định dạng nội dung. Vui lòng tải lên tệp :type đáp ứng định dạng quy định.', ], ], - 'set_to' => 'Đặt thành :attribute', - 'minute' => 'phút', - 'query' => 'Truy vấn', - 'optional' => 'Tùy chọn', - 'require' => 'Bắt buộc', + 'unselected_hint' => 'Các quy tắc chưa được phân bổ có thể tìm kiếm tại đây', + 'user' => [ + 'admin_deletion' => 'Quản trị viên hệ thống không thể bị xóa', + 'bulk_account_quantity' => 'Số lượng tài khoản được tạo hàng loạt', + 'connection_test' => 'Kiểm tra kết nối', + 'counts' => 'Tổng cộng :num tài khoản', + 'group' => [ + 'counts' => 'Tổng cộng :num nhóm', + 'name' => 'Tên nhóm', + 'title' => 'Kiểm soát nhóm người dùng (Một nút có thể thuộc nhiều nhóm, nhưng người dùng chỉ có thể thuộc một nhóm; đối với các nút hiển thị/có sẵn cho người dùng, nhóm có ưu tiên cao hơn cấp độ)', + ], + 'info' => [ + 'account' => 'Thông tin tài khoản', + 'expired_date_hint' => 'Để trống để mặc định thời hạn một năm', + 'proxy' => 'Thông tin proxy', + 'recharge_placeholder' => 'Nếu là số âm, sẽ trừ vào số dư', + 'reset_date_hint' => 'Ngày đặt lại lưu lượng tiếp theo', + 'switch' => 'Chuyển đổi danh tính', + 'uuid_hint' => 'UUID cho V2Ray', + ], + 'online_monitor' => 'Giám sát trực tuyến', + 'proxies_config' => 'Thông tin kết nối cho :username', + 'proxy_info' => 'Thông tin cấu hình', + 'reset_confirm' => [0 => 'Bạn có muốn đặt lại lưu lượng của [', 1 => '] không?'], + 'reset_traffic' => 'Đặt lại lưu lượng', + 'traffic_monitor' => 'Thống kê lưu lượng', + 'update_help' => 'Cập nhật thành công, quay lại?', + 'user_view' => 'Chuyển sang chế độ người dùng', + ], + 'user_dashboard' => 'Bảng điều khiển người dùng', + 'yes' => 'Có', + 'zero_unlimited_hint' => '0 hoặc để trống cho không giới hạn', ]; diff --git a/resources/lang/vi/auth.php b/resources/lang/vi/auth.php index c1efdf50..f6d85b07 100644 --- a/resources/lang/vi/auth.php +++ b/resources/lang/vi/auth.php @@ -40,27 +40,18 @@ return [ ], 'failed' => 'Thông tin tài khoản không tìm thấy trong hệ thống.', 'invite' => [ - 'attribute' => 'Mã lời mời', - 'error' => [ - 'unavailable' => 'Mã lời mời không hợp lệ, vui lòng thử lại.', - ], 'get' => 'Nhận mã lời mời', 'not_required' => 'Không cần mã lời mời, bạn có thể đăng ký trực tiếp!', + 'unavailable' => 'Mã lời mời không hợp lệ, vui lòng thử lại.', ], 'login' => 'Đăng nhập', 'logout' => 'Đăng xuất', 'maintenance' => 'Bảo trì', 'maintenance_tip' => 'Đang bảo trì', 'oauth' => [ - 'bind_failed' => 'Liên kết thất bại', - 'bind_success' => 'Liên kết thành công', 'login_failed' => 'Đăng nhập bên thứ ba thất bại!', - 'rebind_success' => 'Liên kết lại thành công', 'register' => 'Đăng ký nhanh', - 'register_failed' => 'Đăng ký thất bại', 'registered' => 'Đã đăng ký, vui lòng đăng nhập trực tiếp.', - 'unbind_failed' => 'Hủy liên kết thất bại', - 'unbind_success' => 'Hủy liên kết thành công', ], 'one-click_login' => 'Đăng nhập một chạm', 'optional' => 'Tùy chọn', @@ -73,7 +64,6 @@ return [ 'error' => [ 'demo' => 'Không thể thay đổi mật khẩu quản trị viên trong chế độ demo.', 'disabled' => 'Chức năng đặt lại mật khẩu đã bị tắt, vui lòng liên hệ :email để được hỗ trợ.', - 'failed' => 'Đặt lại mật khẩu thất bại.', 'same' => 'Mật khẩu mới không thể giống mật khẩu cũ, vui lòng nhập lại.', 'throttle' => 'Bạn chỉ có thể đặt lại mật khẩu :time lần trong 24 giờ, vui lòng không thực hiện quá thường xuyên.', 'wrong' => 'Sai mật khẩu, vui lòng thử lại.', @@ -91,7 +81,6 @@ return [ ], 'failed' => 'Đăng ký thất bại, vui lòng thử lại sau.', 'promotion' => 'Chưa có tài khoản? Vui lòng đến ', - 'success' => 'Đăng ký thành công', ], 'remember_me' => 'Ghi nhớ tôi', 'request' => 'Yêu cầu', diff --git a/resources/lang/vi/common.php b/resources/lang/vi/common.php index 38a28059..159d9de5 100644 --- a/resources/lang/vi/common.php +++ b/resources/lang/vi/common.php @@ -3,141 +3,149 @@ declare(strict_types=1); return [ - 'hour' => '{1} Giờ|{2} Giờ', 'account' => 'Tài khoản', + 'action' => 'Hành động', + 'active_item' => 'Kích hoạt :attribute', + 'add' => 'Thêm', + 'advance' => 'Nâng cao', + 'all' => 'Tất cả', + 'applied' => ':attribute đã được áp dụng', + 'apply' => 'Áp dụng', 'available_date' => 'Thời hạn hiệu lực', - 'created_at' => 'Ngày tạo', - 'expired_at' => 'Ngày hết hạn', - 'updated_at' => 'Cập nhật lần cuối', - 'latest_at' => 'Hoạt động gần đây', + 'avatar' => 'Hình đại diện', 'back' => 'Quay lại', 'back_to' => 'Quay lại :page', + 'bark' => [ + 'custom' => 'Thông tin tùy chỉnh', + 'node_status' => 'Trạng thái nút', + ], 'cancel' => 'Hủy', + 'change' => 'Thay đổi', 'close' => 'Đóng', 'close_item' => 'Đóng :attribute', 'confirm' => 'Xác nhận', 'continue' => 'Tiếp tục', - 'open' => 'Mở', - 'send' => 'Gửi', - 'view' => 'Xem', - 'reset' => 'Đặt lại', + 'convert' => 'Chuyển đổi', 'copy' => [ 'attribute' => 'Sao chép', - 'success' => 'Sao chép thành công', 'failed' => 'Sao chép thất bại, vui lòng sao chép thủ công', + 'success' => 'Sao chép thành công', ], - 'add' => 'Thêm', - 'free' => 'Miễn phí', - 'change' => 'Thay đổi', - 'submit' => 'Gửi', - 'submit_item' => 'Gửi :attribute', - 'generate' => 'Tạo', - 'generate_item' => 'Tạo :attribute', - 'to_safari' => [0 => 'Nhấp vào góc trên bên phải', 1 => ', sau đó chọn', 2 => 'Mở trong Safari', 3 => ' để truy cập trang web này!'], - 'update_browser' => [0 => 'Bạn đang sử dụng một trình duyệt', 1 => 'lỗi thời', 2 => '. Vui lòng', 3 => 'nâng cấp trình duyệt của bạn', 4 => ' để có trải nghiệm tốt nhất'], - 'apply' => 'Áp dụng', - 'avatar' => 'Hình đại diện', + 'create' => 'Tạo', + 'created_at' => 'Ngày tạo', 'customize' => 'Tùy chỉnh', - 'all' => 'Tất cả', - 'default' => 'Mặc định', - 'download' => 'Tải xuống', - 'goto' => 'Đi tới', - 'warning' => 'Cảnh báo', - 'success' => 'Thành công', - 'success_item' => ':attribute thành công', - 'failed' => 'Thất bại', - 'failed_item' => ':attribute thất bại', - 'update' => 'Cập nhật', - 'update_action' => 'Cập nhật :action', - 'none' => 'Không có', - 'new' => 'Mới', - 'sorry' => 'Xin lỗi', - 'applied' => ':attribute đã được áp dụng', - 'active_item' => 'Kích hoạt :attribute', - 'error' => 'Lỗi', - 'toggle' => 'Chuyển đổi', - 'toggle_action' => 'Chuyển đổi :action', - 'request_url' => 'URL yêu cầu', - 'function' => [ - 'navigation' => 'Điều hướng', - 'menubar' => 'Thanh menu', - 'fullscreen' => 'Toàn màn hình', - ], 'days' => [ 'attribute' => '{1} Ngày|{2} Ngày', + 'next' => 'Ngày tiếp theo', 'weekend' => 'Cuối tuần', 'work' => 'Ngày làm việc', - 'next' => 'Ngày tiếp theo', ], - 'qrcode' => 'Mã QR :attribute', + 'default' => 'Mặc định', + 'delete' => 'Xóa', 'deleted' => 'Đã xóa', 'deleted_item' => ':attribute đã xóa', - 'print' => 'In', - 'unlimited' => 'Không giới hạn', - 'payment' => [ - 'credit' => 'Số dư', - 'alipay' => 'Alipay', - 'qq' => 'Ví QQ', - 'wechat' => 'WeChat Pay', - 'crypto' => 'Tiền điện tử', - 'manual' => 'Thanh toán thủ công', - 'status' => [ - 'wait' => 'Đang chờ thanh toán', - ], + 'developing' => 'Đang phát triển! Hãy đón chờ', + 'download' => 'Tải xuống', + 'edit' => 'Chỉnh sửa', + 'error' => 'Lỗi', + 'error_action_item' => 'Lỗi :action :attribute', + 'error_item' => 'Lỗi :attribute', + 'exists_error' => 'Có tài khoản liên kết dưới :attribute. Vui lòng hủy liên kết trước!', + 'expired_at' => 'Ngày hết hạn', + 'export' => 'Xuất khẩu', + 'failed' => 'Thất bại', + 'failed_action_item' => ':action :attribute không thành công', + 'failed_item' => ':attribute thất bại', + 'free' => 'Miễn phí', + 'function' => [ + 'fullscreen' => 'Toàn màn hình', + 'menubar' => 'Thanh menu', + 'navigation' => 'Điều hướng', ], + 'generate' => 'Tạo', + 'generate_item' => 'Tạo :attribute', + 'goto' => 'Đi tới', + 'hour' => '{1} Giờ|{2} Giờ', + 'import' => 'Nhập khẩu', + 'latest_at' => 'Hoạt động gần đây', + 'more' => 'Thêm', + 'new' => 'Mới', + 'none' => 'Không có', + 'open' => 'Mở', + 'or' => 'hoặc', 'order' => [ 'status' => [ 'canceled' => 'Đã hủy', 'completed' => 'Đã hoàn thành', - 'prepaid' => 'Trả trước', 'ongoing' => 'Đang sử dụng', + 'prepaid' => 'Trả trước', 'review' => 'Đang chờ duyệt', ], ], + 'payment' => [ + 'alipay' => 'Alipay', + 'credit' => 'Số dư', + 'crypto' => 'Tiền điện tử', + 'manual' => 'Thanh toán thủ công', + 'qq' => 'Ví QQ', + 'wechat' => 'WeChat Pay', + ], + 'print' => 'In', + 'qrcode' => 'Mã QR :attribute', + 'random_generate' => 'Để trống để tạo ngẫu nhiên', 'recommend' => 'Đề xuất', - 'advance' => 'Nâng cao', - 'action' => 'Hành động', + 'request' => 'Yêu cầu', + 'request_failed' => 'Yêu cầu thất bại, vui lòng thử lại', + 'request_url' => 'URL yêu cầu', + 'reset' => 'Đặt lại', 'search' => 'Tìm kiếm', - 'edit' => 'Chỉnh sửa', - 'delete' => 'Xóa', + 'send' => 'Gửi', + 'sorry' => 'Xin lỗi', 'status' => [ + 'applying' => 'Đang áp dụng', 'attribute' => 'Trạng thái', - 'inactive' => 'Chưa kích hoạt', - 'disabled' => 'Vô hiệu hóa', + 'available' => 'Có hiệu lực', 'banned' => 'Bị cấm', - 'normal' => 'Bình thường', + 'closed' => 'Đã đóng', + 'disabled' => 'Vô hiệu hóa', 'enabled' => 'Đã kích hoạt', 'expire' => 'Hết hạn', + 'inactive' => 'Chưa kích hoạt', 'limited' => 'Hạn chế', - 'run_out' => 'Hết dữ liệu', - 'unused' => 'Chưa sử dụng', - 'used' => 'Đã sử dụng', - 'closed' => 'Đã đóng', - 'applying' => 'Đang áp dụng', - 'withdrawn' => 'Đã rút', - 'unwithdrawn' => 'Chưa rút', - 'reply' => 'Đã trả lời', + 'normal' => 'Bình thường', + 'paid' => 'Đã thanh toán', + 'pass' => 'Thông qua', + 'payment_pending' => 'Đang chờ thanh toán', 'pending' => 'Đang chờ xử lý', - 'unknown' => 'Không rõ', - 'available' => 'Có hiệu lực', + 'pending_dispatch' => 'Đang chờ giao hàng', 'reject' => 'Từ chối', 'rejected' => 'Đã từ chối', + 'reply' => 'Đã trả lời', 'review' => 'Đang chờ duyệt', 'reviewed' => 'Đã duyệt', - 'paid' => 'Đã thanh toán', - 'payment_pending' => 'Đang chờ thanh toán', - 'pass' => 'Thông qua', + 'run_out' => 'Hết dữ liệu', 'send_to_credit' => 'Chuyển vào số dư', - 'waiting_tobe_send' => 'Đang chờ gửi', + 'unknown' => 'Không rõ', + 'unused' => 'Chưa sử dụng', + 'used' => 'Đã sử dụng', + 'withdrawal_pending' => 'Chưa rút', + 'withdrawn' => 'Đã rút', ], 'stay_unchanged' => 'Để trống nếu không thay đổi', - 'random_generate' => 'Để trống để tạo ngẫu nhiên', - 'request_failed' => 'Yêu cầu thất bại, vui lòng thử lại', - 'convert' => 'Chuyển đổi', - 'import' => 'Nhập khẩu', - 'or' => 'hoặc', - 'more' => 'Thêm', + 'storage_logo' => 'Lưu trữ Logo', + 'store' => 'Lưu trữ', + 'submit' => 'Gửi', + 'success' => 'Thành công', + 'success_action_item' => ':action :attribute thành công', + 'success_item' => ':attribute thành công', 'to' => 'đến', 'to_be_send' => 'Đang chờ gửi', - 'developing' => 'Đang phát triển! Hãy đón chờ', + 'to_safari' => 'Nhấp vào biểu tượng ở góc trên bên phải, sau đó chọn Mở trong Safari Safari để truy cập trang web của chúng tôi một cách chính xác!', + 'toggle' => 'Chuyển đổi', + 'toggle_action' => 'Chuyển đổi :action', + 'unlimited' => 'Không giới hạn', + 'update' => 'Cập nhật', + 'updated_at' => 'Cập nhật lần cuối', + 'view' => 'Xem', + 'warning' => 'Cảnh báo', ]; diff --git a/resources/lang/vi/errors.php b/resources/lang/vi/errors.php index 89c6b975..1725c7f8 100644 --- a/resources/lang/vi/errors.php +++ b/resources/lang/vi/errors.php @@ -8,29 +8,29 @@ return [ 'bots' => 'Phát hiện truy cập từ robot, từ chối truy cập', 'china' => 'Phát hiện truy cập từ IP hoặc proxy Trung Quốc, từ chối truy cập', 'oversea' => 'Phát hiện truy cập từ IP hoặc proxy nước ngoài, từ chối truy cập', - 'unknown' => 'Chế độ truy cập bị cấm không xác định! Vui lòng sửa đổi [Chế độ cấm truy cập] trong cài đặt hệ thống!', 'redirect' => 'Phát hiện (:ip :url) truy cập thông qua liên kết đăng ký, buộc chuyển hướng.', + 'unknown' => 'Chế độ truy cập bị cấm không xác định! Vui lòng sửa đổi [Chế độ cấm truy cập] trong cài đặt hệ thống!', ], + 'get_ip' => 'Không thể lấy thông tin IP', 'log' => 'Nhật ký', 'refresh' => 'Làm mới', 'refresh_page' => 'Vui lòng làm mới trang và thử lại', 'report' => 'Lỗi kèm theo báo cáo: ', - 'safe_enter' => 'Lối vào an toàn', 'safe_code' => 'Vui lòng nhập mã an toàn', + 'safe_enter' => 'Lối vào an toàn', + 'subscribe' => [ + 'banned_until' => 'Tài khoản bị cấm đến :time, vui lòng chờ mở khóa!', + 'expired' => 'Tài khoản đã hết hạn! Vui lòng gia hạn đăng ký!', + 'none' => 'Không có nút nào khả dụng', + 'out' => 'HẾT DỮ LIỆU! Vui lòng mua thêm hoặc đặt lại dữ liệu!', + 'question' => 'Có vấn đề với tài khoản!? Truy cập trang web để biết chi tiết', + 'sub_banned' => 'Đăng ký bị cấm! Truy cập trang web để biết chi tiết', + 'unknown' => 'Liên kết đăng ký không hợp lệ! Vui lòng lấy lại liên kết mới!', + 'user' => 'URL không hợp lệ, tài khoản không tồn tại!', + 'user_disabled' => 'Tài khoản bị vô hiệu hóa! Liên hệ hỗ trợ!', + ], 'title' => '⚠️ Lỗi đã được kích hoạt', 'unsafe_enter' => 'Lối vào không an toàn', 'visit' => 'Vui lòng truy cập', 'whoops' => 'Rất tiếc!', - 'get_ip' => 'Không thể lấy thông tin IP', - 'subscribe' => [ - 'unknown' => 'Liên kết đăng ký không hợp lệ! Vui lòng lấy lại liên kết mới!', - 'sub_banned' => 'Đăng ký bị cấm! Truy cập trang web để biết chi tiết', - 'user' => 'URL không hợp lệ, tài khoản không tồn tại!', - 'user_disabled' => 'Tài khoản bị vô hiệu hóa! Liên hệ hỗ trợ!', - 'banned_until' => 'Tài khoản bị cấm đến :time, vui lòng chờ mở khóa!', - 'out' => 'HẾT DỮ LIỆU! Vui lòng mua thêm hoặc đặt lại dữ liệu!', - 'expired' => 'Tài khoản đã hết hạn! Vui lòng gia hạn đăng ký!', - 'question' => 'Có vấn đề với tài khoản!? Truy cập trang web để biết chi tiết', - 'none' => 'Không có nút nào khả dụng', - ], ]; diff --git a/resources/lang/vi/model.php b/resources/lang/vi/model.php index 897088ff..4a4741ad 100644 --- a/resources/lang/vi/model.php +++ b/resources/lang/vi/model.php @@ -3,105 +3,114 @@ declare(strict_types=1); return [ - 'user' => [ - 'id' => 'ID Người dùng', - 'attribute' => 'Người dùng', - 'nickname' => 'Biệt danh', - 'username' => 'Tên đăng nhập', - 'password' => 'Mật Khẩu', - 'credit' => 'Số dư', - 'invite_num' => 'Lời mời khả dụng', - 'reset_date' => 'Ngày đặt lại dữ liệu', - 'port' => 'Cổng', - 'traffic_used' => 'Dữ liệu đã sử dụng', - 'service' => 'Dịch vụ Proxy', - 'group' => 'Nhóm', - 'account_status' => 'Trạng Thái Tài Khoản', - 'proxy_status' => 'Trạng thái Proxy', - 'expired_date' => 'Ngày hết hạn', - 'role' => 'Vai trò', - 'wechat' => 'WeChat', - 'qq' => 'QQ', - 'remark' => 'Ghi chú', - 'uuid' => 'VMess UUID', - 'proxy_passwd' => 'Mật khẩu Proxy', - 'proxy_method' => 'Mã hóa', - 'usable_traffic' => 'Lưu lượng có sẵn', - 'proxy_protocol' => 'Giao thức Proxy', - 'proxy_obfs' => 'Phương pháp làm rối', - 'speed_limit' => 'Giới hạn tốc độ', - 'inviter' => 'Người mời', - 'created_date' => 'Ngày đăng ký', + 'aff' => [ + 'amount' => 'Số tiền đơn hàng', + 'commission' => 'Hoa hồng', + 'created_at' => 'Đặt hàng vào', + 'invitee' => 'Người mua', + 'updated_at' => 'Xử lý vào', + ], + 'article' => [ + 'attribute' => 'Bài viết', + 'category' => 'Danh mục', + 'created_at' => 'Ngày đăng', + 'language' => 'Ngôn ngữ', + 'logo' => 'Bìa', + 'updated_at' => 'Ngày cập nhật', ], 'common' => [ - 'extend' => 'Thông tin mở rộng', - 'sort' => 'Sắp xếp', 'description' => 'Mô tả', - 'type' => 'Loại', + 'extend' => 'Thông tin mở rộng', 'level' => 'Cấp độ', + 'sort' => 'Sắp xếp', + 'type' => 'Loại', ], 'country' => [ 'code' => 'Mã quốc gia', 'icon' => 'Cờ', 'name' => 'Tên quốc gia', ], - 'subscribe' => [ - 'code' => 'Mã đăng ký', - 'req_times' => 'Số lần yêu cầu', - 'updated_at' => 'Lần yêu cầu cuối', - 'ban_time' => 'Thời gian cấm', - 'ban_desc' => 'Lý do cấm', - 'req_ip' => 'IP yêu cầu', - 'req_header' => 'Header yêu cầu', + 'coupon' => [ + 'attribute' => 'Phiếu giảm giá', + 'groups' => 'Giới hạn nhóm', + 'levels' => 'Giới hạn cấp độ', + 'logo' => 'Ảnh', + 'minimum' => 'Điều kiện giảm giá', + 'name' => 'Tên', + 'newbie' => 'Chỉ dành cho người dùng mới', + 'num' => 'Số lượng', + 'priority' => 'Ưu tiên', + 'services_blacklist' => 'Danh sách đen sản phẩm', + 'services_whitelist' => 'Danh sách trắng sản phẩm', + 'sn' => 'Mã', + 'usable_times' => 'Số lần sử dụng', + 'used' => 'Giới hạn cá nhân', + 'users_blacklist' => 'Danh sách đen người dùng', + 'users_whitelist' => 'Danh sách trắng người dùng', + 'value' => 'Giá trị', ], - 'oauth' => [ - 'type' => 'Kênh', - 'identifier' => 'Định danh', + 'goods' => [ + 'attribute' => 'Sản phẩm', + 'available_date' => 'Thời hạn hiệu lực', + 'category' => 'Danh mục', + 'color' => 'Màu sắc', + 'hot' => 'Bán chạy', + 'info' => 'Thông tin tùy chỉnh', + 'invite_num' => 'Lời mời tặng kèm', + 'limit_num' => 'Giới hạn mua', + 'logo' => 'Ảnh sản phẩm', + 'name' => 'Tên', + 'period' => 'Chu kỳ đặt lại', + 'price' => 'Giá', + 'renew' => 'Giá gia hạn dữ liệu', + 'traffic' => 'Dữ liệu khả dụng', + 'user_limit' => 'Giới hạn tốc độ người dùng', ], - 'user_group' => [ - 'attribute' => 'Nhóm người dùng', - 'name' => 'Tên nhóm', - 'nodes' => 'Nút', + 'ip' => [ + 'info' => 'Thông tin vị trí', + 'network_type' => 'Loại mạng', ], 'node' => [ 'attribute' => 'Node', - 'id' => 'ID Nút', - 'name' => 'Tên', - 'domain' => 'Tên miền', - 'static' => 'Trạng thái hoạt động', - 'online_user' => 'Người dùng trực tuyến', + 'client_limit' => 'Giới hạn thiết bị', + 'country' => 'Quốc gia', 'data_consume' => 'Sử dụng dữ liệu', 'data_rate' => 'Tỷ lệ dữ liệu', 'ddns' => 'DDNS', + 'detection' => 'Phát hiện chặn', + 'display' => 'Hiển thị & Đăng ký', + 'domain' => 'Tên miền', + 'id' => 'ID Nút', 'ipv4' => 'IPv4', 'ipv6' => 'IPv6', - 'push_port' => 'Cổng đẩy', - 'rule_group' => 'Nhóm quy tắc', - 'traffic_limit' => 'Giới hạn tốc độ', - 'client_limit' => 'Giới hạn thiết bị', 'label' => 'Nhãn', - 'country' => 'Quốc gia', - 'udp' => 'UDP', - 'display' => 'Hiển thị & Đăng ký', - 'detection' => 'Phát hiện chặn', 'method' => 'Phương pháp mã hóa', - 'protocol' => 'Giao thức', - 'protocol_param' => 'Tham số giao thức', + 'name' => 'Tên', + 'next_renewal_date' => 'Ngày gia hạn tiếp theo', 'obfs' => 'Làm rối', 'obfs_param' => 'Tham số làm rối', - 'single' => 'Cổng đơn', - 'transfer' => 'Chuyển tiếp', + 'online_user' => 'Người dùng trực tuyến', + 'protocol' => 'Giao thức', + 'protocol_param' => 'Tham số giao thức', + 'push_port' => 'Cổng đẩy', + 'relay_port' => 'Cổng chuyển tiếp', + 'renewal_cost' => 'Số tiền thanh toán', 'service_port' => 'Cổng dịch vụ', + 'single' => 'Cổng đơn', 'single_passwd' => 'Mật khẩu cổng đơn', + 'static' => 'Trạng thái hoạt động', + 'subscription_term' => 'Thời gian đăng ký', + 'traffic_limit' => 'Giới hạn tốc độ', + 'transfer' => 'Chuyển tiếp', + 'udp' => 'UDP', 'v2_alter_id' => 'ID thay thế', - 'v2_net' => 'Mạng', 'v2_cover' => 'Loại giả mạo', 'v2_host' => 'Tên miền giả mạo', + 'v2_net' => 'Mạng', 'v2_path' => 'Đường dẫn hoặc khóa', 'v2_sni' => 'SNI', 'v2_tls' => 'Kết nối TLS', 'v2_tls_provider' => 'Cấu hình TLS', - 'relay_port' => 'Cổng chuyển tiếp', ], 'node_auth' => [ 'attribute' => 'Xác thực nút', @@ -111,36 +120,44 @@ return [ 'node_cert' => [ 'attribute' => 'Chứng chỉ', 'domain' => 'Tên miền', + 'expired_date' => 'Ngày hết hạn', + 'issuer' => 'Tổ chức cấp phát', 'key' => 'Khóa', 'pem' => 'Chứng chỉ PEM', - 'issuer' => 'Tổ chức cấp phát', 'signed_date' => 'Ngày cấp', - 'expired_date' => 'Ngày hết hạn', + ], + 'notification' => [ + 'address' => 'Người nhận', + 'created_at' => 'Gửi vào', + 'status' => 'Trạng thái', + ], + 'oauth' => [ + 'identifier' => 'Định danh', + 'type' => 'Kênh', ], 'order' => [ 'attribute' => 'Đơn hàng', 'id' => 'ID Đơn hàng', 'original_price' => 'Giá gốc', - 'price' => 'Giá thực tế', 'pay_way' => 'Phương thức thanh toán', + 'price' => 'Giá thực tế', 'status' => 'Trạng thái', ], - 'goods' => [ - 'attribute' => 'Sản phẩm', + 'permission' => [ + 'attribute' => 'Quyền hạn', + 'description' => 'Mô tả', + 'name' => 'Tên tuyến', + ], + 'referral' => [ + 'amount' => 'Số tiền', + 'created_at' => 'Đăng ký vào', + 'id' => 'ID Đơn đăng ký', + 'user' => 'Người đăng ký', + ], + 'role' => [ + 'attribute' => 'Vai trò', 'name' => 'Tên', - 'price' => 'Giá', - 'category' => 'Danh mục', - 'renew' => 'Giá gia hạn dữ liệu', - 'user_limit' => 'Giới hạn tốc độ người dùng', - 'period' => 'Chu kỳ đặt lại', - 'traffic' => 'Dữ liệu khả dụng', - 'invite_num' => 'Lời mời tặng kèm', - 'limit_num' => 'Giới hạn mua', - 'available_date' => 'Thời hạn hiệu lực', - 'hot' => 'Bán chạy', - 'color' => 'Màu sắc', - 'logo' => 'Ảnh sản phẩm', - 'info' => 'Thông tin tùy chỉnh', + 'permissions' => 'Quyền hạn', ], 'rule' => [ 'attribute' => 'Quy tắc', @@ -150,83 +167,67 @@ return [ 'rule_group' => [ 'attribute' => 'Nhóm quy tắc', 'name' => 'Tên', - 'type' => 'Loại', 'rules' => 'Quy tắc', + 'type' => 'Loại', ], - 'role' => [ - 'attribute' => 'Vai trò', - 'name' => 'Tên', - 'permissions' => 'Quyền hạn', + 'subscribe' => [ + 'ban_desc' => 'Lý do cấm', + 'ban_time' => 'Thời gian cấm', + 'code' => 'Mã đăng ký', + 'req_header' => 'Header yêu cầu', + 'req_ip' => 'IP yêu cầu', + 'req_times' => 'Số lần yêu cầu', + 'updated_at' => 'Lần yêu cầu cuối', ], - 'permission' => [ - 'attribute' => 'Quyền hạn', - 'description' => 'Mô tả', - 'name' => 'Tên tuyến', - ], - 'article' => [ - 'attribute' => 'Bài viết', - 'category' => 'Danh mục', - 'language' => 'Ngôn ngữ', - 'logo' => 'Bìa', - 'created_at' => 'Ngày đăng', - 'updated_at' => 'Ngày cập nhật', - ], - 'coupon' => [ - 'attribute' => 'Phiếu giảm giá', - 'name' => 'Tên', - 'sn' => 'Mã', - 'logo' => 'Ảnh', - 'value' => 'Giá trị', - 'priority' => 'Ưu tiên', - 'usable_times' => 'Số lần sử dụng', - 'minimum' => 'Điều kiện giảm giá', - 'used' => 'Giới hạn cá nhân', - 'levels' => 'Giới hạn cấp độ', - 'groups' => 'Giới hạn nhóm', - 'users_whitelist' => 'Danh sách trắng người dùng', - 'users_blacklist' => 'Danh sách đen người dùng', - 'services_whitelist' => 'Danh sách trắng sản phẩm', - 'services_blacklist' => 'Danh sách đen sản phẩm', - 'newbie' => 'Chỉ dành cho người dùng mới', - 'num' => 'Số lượng', - ], - 'aff' => [ - 'invitee' => 'Người mua', - 'amount' => 'Số tiền đơn hàng', - 'commission' => 'Hoa hồng', - 'updated_at' => 'Xử lý vào', - 'created_at' => 'Đặt hàng vào', - ], - 'referral' => [ - 'created_at' => 'Đăng ký vào', - 'user' => 'Người đăng ký', - 'amount' => 'Số tiền', - 'id' => 'ID Đơn đăng ký', - ], - 'notification' => [ - 'address' => 'Người nhận', - 'created_at' => 'Gửi vào', - 'status' => 'Trạng thái', - ], - 'ip' => [ - 'network_type' => 'Loại mạng', - 'info' => 'Thông tin vị trí', - ], - 'user_traffic' => [ - 'upload' => 'Lưu lượng tải lên', - 'download' => 'Lưu lượng tải xuống', - 'total' => 'Tổng lưu lượng', - 'log_time' => 'Thời gian ghi nhận', - ], - 'user_data_modify' => [ - 'before' => 'Lưu lượng trước khi thay đổi', - 'after' => 'Lưu lượng sau khi thay đổi', - 'created_at' => 'Thời gian thay đổi', + 'user' => [ + 'account_status' => 'Trạng Thái Tài Khoản', + 'attribute' => 'Người dùng', + 'created_date' => 'Ngày đăng ký', + 'credit' => 'Số dư', + 'expired_date' => 'Ngày hết hạn', + 'id' => 'ID Người dùng', + 'invite_num' => 'Lời mời khả dụng', + 'inviter' => 'Người mời', + 'nickname' => 'Biệt danh', + 'password' => 'Mật Khẩu', + 'port' => 'Cổng', + 'proxy_method' => 'Mã hóa', + 'proxy_obfs' => 'Phương pháp làm rối', + 'proxy_passwd' => 'Mật khẩu Proxy', + 'proxy_protocol' => 'Giao thức Proxy', + 'proxy_status' => 'Trạng thái Proxy', + 'qq' => 'QQ', + 'remark' => 'Ghi chú', + 'reset_date' => 'Ngày đặt lại dữ liệu', + 'role' => 'Vai trò', + 'service' => 'Dịch vụ Proxy', + 'speed_limit' => 'Giới hạn tốc độ', + 'traffic_used' => 'Dữ liệu đã sử dụng', + 'usable_traffic' => 'Lưu lượng có sẵn', + 'username' => 'Tên đăng nhập', + 'uuid' => 'VMess UUID', + 'wechat' => 'WeChat', ], 'user_credit' => [ - 'before' => 'Số dư trước khi thay đổi', 'after' => 'Số dư sau khi thay đổi', 'amount' => 'Số tiền thay đổi', + 'before' => 'Số dư trước khi thay đổi', 'created_at' => 'Thời gian thay đổi', ], + 'user_data_modify' => [ + 'after' => 'Lưu lượng sau khi thay đổi', + 'before' => 'Lưu lượng trước khi thay đổi', + 'created_at' => 'Thời gian thay đổi', + ], + 'user_group' => [ + 'attribute' => 'Nhóm người dùng', + 'name' => 'Tên nhóm', + 'nodes' => 'Nút', + ], + 'user_traffic' => [ + 'download' => 'Lưu lượng tải xuống', + 'log_time' => 'Thời gian ghi nhận', + 'total' => 'Tổng lưu lượng', + 'upload' => 'Lưu lượng tải lên', + ], ]; diff --git a/resources/lang/vi/notification.php b/resources/lang/vi/notification.php index a541f172..5c25c200 100644 --- a/resources/lang/vi/notification.php +++ b/resources/lang/vi/notification.php @@ -3,35 +3,49 @@ declare(strict_types=1); return [ - 'attribute' => 'Thông báo', - 'new' => '{1} :num tin nhắn mới|[1,*] :num tin nhắn mới', - 'empty' => 'Bạn không có tin nhắn mới', - 'payment_received' => 'Thanh toán đã nhận, số tiền: :amount. Xem chi tiết đơn hàng', 'account_expired' => 'Nhắc nhở hết hạn tài khoản', - 'account_expired_content' => 'Tài khoản của bạn sẽ hết hạn trong :days ngày. Vui lòng gia hạn kịp thời để tiếp tục sử dụng dịch vụ của chúng tôi.', 'account_expired_blade' => 'Tài khoản sẽ hết hạn trong :days ngày, vui lòng gia hạn kịp thời', + 'account_expired_content' => 'Tài khoản của bạn sẽ hết hạn trong :days ngày. Vui lòng gia hạn kịp thời để tiếp tục sử dụng dịch vụ của chúng tôi.', 'active_email' => 'Vui lòng hoàn thành xác minh trong vòng 30 phút', + 'attribute' => 'Thông báo', + 'block_report' => 'Báo cáo chặn:', 'close_ticket' => 'Yêu cầu :id: :title đã đóng', - 'view_web' => 'Xem trang web', - 'view_ticket' => 'Xem yêu cầu', + 'data_anomaly' => 'Cảnh báo người dùng dữ liệu bất thường', + 'data_anomaly_content' => 'Người dùng :id: [Tải lên: :upload | Tải xuống: :download | Tổng cộng: :total] trong giờ qua', + 'details' => 'Xem chi tiết', + 'details_btn' => 'Vui lòng nhấp vào nút dưới đây để xem chi tiết.', + 'ding_bot_limit' => 'Mỗi bot có thể gửi tối đa 20 tin nhắn mỗi phút vào nhóm. Nếu vượt quá giới hạn này, sẽ áp dụng hạn chế tốc độ trong 10 phút.', + 'empty' => 'Bạn không có tin nhắn mới', + 'error' => '[:channel] Lỗi đẩy tin nhắn: :reason', + 'get_access_token_failed' => 'Lấy access_token thất bại!\nVới các tham số yêu cầu: :body', + 'into_maintenance' => 'Tự động chuyển vào chế độ bảo trì', + 'new' => '{1} :num tin nhắn mới|[1,*] :num tin nhắn mới', 'new_ticket' => 'Yêu cầu mới nhận được: :title', - 'reply_ticket' => 'Yêu cầu đã trả lời: :title', - 'ticket_content' => 'Nội dung yêu cầu:', + 'next_check_time' => 'Thời gian phát hiện chặn nút tiếp theo: :time', + 'node' => [ + 'download' => 'Tải xuống', + 'total' => 'Tổng cộng', + 'upload' => 'Tải lên', + ], 'node_block' => 'Cảnh báo chặn nút', 'node_offline' => 'Cảnh báo nút ngoại tuyến', 'node_offline_content' => 'Các nút bất thường, có thể đã ngoại tuyến:', - 'block_report' => 'Báo cáo chặn:', - 'traffic_warning' => 'Cảnh báo sử dụng dữ liệu', + 'node_renewal' => 'Nhắc nhở gia hạn nút', + 'node_renewal_blade' => 'Các nút sau đây sắp hết hạn. Vui lòng gia hạn trước: :nodes', + 'node_renewal_content' => 'Các nút sau đây sắp hết hạn. Vui lòng gia hạn trước khi hết hạn để tránh gián đoạn dịch vụ.', + 'payment_received' => 'Thanh toán đã nhận, số tiền: :amount. Xem chi tiết đơn hàng', + 'reply_ticket' => 'Yêu cầu đã trả lời: :title', + 'reset_failed' => '[Nhiệm vụ hàng ngày] Người dùng :uid - :username Đặt lại dữ liệu không thành công', + 'serverChan_exhausted' => 'Hạn mức hôm nay đã hết!', + 'serverChan_limit' => 'Tần suất mỗi phút quá cao. Vui lòng tối ưu hóa cài đặt thông báo!', + 'sign_failed' => 'Xác thực chữ ký bảo mật thất bại', + 'ticket_content' => 'Nội dung yêu cầu:', 'traffic_remain' => 'Đã sử dụng :percent% dữ liệu, vui lòng chú ý', 'traffic_tips' => 'Vui lòng lưu ý ngày đặt lại dữ liệu và sử dụng dữ liệu hợp lý, hoặc gia hạn sau khi hết', - 'verification_account' => 'Xác minh tài khoản', + 'traffic_warning' => 'Cảnh báo sử dụng dữ liệu', 'verification' => 'Mã xác minh của bạn:', + 'verification_account' => 'Xác minh tài khoản', 'verification_limit' => 'Vui lòng xác minh trong vòng :minutes phút', - 'data_anomaly' => 'Cảnh báo người dùng dữ liệu bất thường', - 'data_anomaly_content' => 'Người dùng :id: [Tải lên: :upload | Tải xuống: :download | Tổng cộng: :total] trong giờ qua', - 'node' => [ - 'upload' => 'Tải lên', - 'download' => 'Tải xuống', - 'total' => 'Tổng cộng', - ], + 'view_ticket' => 'Xem yêu cầu', + 'view_web' => 'Xem trang web', ]; diff --git a/resources/lang/vi/setup.php b/resources/lang/vi/setup.php new file mode 100644 index 00000000..7a6cd38b --- /dev/null +++ b/resources/lang/vi/setup.php @@ -0,0 +1,10 @@ + 'Phát hiện bạn đang ở chế độ Demo, bạn có muốn đặt lại cơ sở dữ liệu không?', + 'update_cache' => 'Cập nhật bộ nhớ đệm...', + 'update_complete' => 'Cập nhật hoàn tất!', + 'update_db' => 'Cập nhật cơ sở dữ liệu...', +]; diff --git a/resources/lang/vi/user.php b/resources/lang/vi/user.php index 233a7dcb..935aad8f 100644 --- a/resources/lang/vi/user.php +++ b/resources/lang/vi/user.php @@ -4,234 +4,273 @@ declare(strict_types=1); return [ 'account' => [ - 'credit' => 'Số dư tài khoản', - 'status' => 'Trạng thái tài khoản', - 'level' => 'Cấp độ tài khoản', - 'group' => 'Nhóm', - 'speed_limit' => 'Giới hạn tốc độ', - 'remain' => 'Dữ liệu còn lại', - 'time' => 'Thời hạn gói', - 'last_login' => 'Đăng nhập lần cuối', - 'reset' => '{0} Dữ liệu sẽ được đặt lại trong :days ngày|[1,*] Còn :days ngày để đặt lại dữ liệu', 'connect_password' => 'Mật khẩu kết nối Proxy', + 'credit' => 'Số dư tài khoản', + 'group' => 'Nhóm', + 'last_login' => 'Đăng nhập lần cuối', + 'level' => 'Cấp độ tài khoản', 'reason' => [ - 'normal' => 'Tài khoản bình thường', 'expired' => 'Gói của bạn đã hết hạn', + 'normal' => 'Tài khoản bình thường', 'overused' => 'Bạn đã sử dụng quá giới hạn :data GB cho giai đoạn này
    Giới hạn sẽ được gỡ bỏ sau :min phút', 'traffic_exhausted' => 'Dữ liệu đã hết', 'unknown' => 'Lý do không rõ, hãy thử làm mới trình duyệt! Nếu vấn đề vẫn tiếp tục, liên hệ hỗ trợ.', ], + 'remain' => 'Dữ liệu còn lại', + 'reset' => '{0} Dữ liệu sẽ được đặt lại trong :days ngày|[1,*] Còn :days ngày để đặt lại dữ liệu', + 'speed_limit' => 'Giới hạn tốc độ', + 'status' => 'Trạng thái tài khoản', + 'time' => 'Thời hạn gói', ], + 'attribute' => [ + 'address' => 'Vị trí', + 'data' => 'Dữ liệu', + 'ip' => 'Địa chỉ IP', + 'isp' => 'ISP', + 'node' => 'Nút', + ], + 'bought_at' => 'Ngày mua', + 'clients' => 'Ứng dụng khách', + 'contact' => 'Liên hệ', + 'coupon' => [ + 'discount' => 'Giảm giá', + 'error' => [ + 'expired' => 'Mã giảm giá đã hết hạn', + 'inactive' => 'Mã giảm giá chưa có hiệu lực', + 'minimum' => 'Số tiền tối thiểu là :amount', + 'overused' => 'Chỉ có thể sử dụng :times lần', + 'run_out' => 'Mã giảm giá đã hết', + 'services' => 'Sản phẩm không đủ điều kiện giảm giá, kiểm tra điều khoản khuyến mãi', + 'unknown' => 'Mã giảm giá không hợp lệ', + 'unmet' => 'Không đủ điều kiện sử dụng', + 'used' => 'Mã giảm giá đã được sử dụng', + 'users' => 'Tài khoản không đủ điều kiện khuyến mãi', + 'wait' => 'Sẽ có hiệu lực vào :time, vui lòng chờ!', + ], + 'input' => 'Nhập mã giảm giá', + ], + 'current_role' => 'Vai trò hiện tại', + 'error_response' => 'Đã xảy ra lỗi, vui lòng thử lại sau.', 'home' => [ + 'announcement' => 'Thông báo', 'attendance' => [ 'attribute' => 'Điểm danh', 'disable' => 'Điểm danh bị vô hiệu hóa', 'done' => 'Bạn đã điểm danh hôm nay. Hãy quay lại vào ngày mai!', - 'success' => 'Bạn đã nhận được :data dữ liệu', 'failed' => 'Lỗi hệ thống', + 'success' => 'Bạn đã nhận được :data dữ liệu', ], - 'traffic_logs' => 'Nhật ký dữ liệu', - 'announcement' => 'Thông báo', - 'wechat_push' => 'Thông báo WeChat', 'chat_group' => 'Nhóm chat', 'empty_announcement' => 'Không có thông báo', + 'traffic_logs' => 'Nhật ký dữ liệu', + 'wechat_push' => 'Thông báo WeChat', ], - 'purchase_to_unlock' => 'Mua để mở khóa', - 'purchase_required' => 'Tính năng này bị vô hiệu hóa cho người dùng không trả phí. Vui lòng', - 'attribute' => [ - 'node' => 'Nút', - 'data' => 'Dữ liệu', - 'ip' => 'Địa chỉ IP', - 'isp' => 'ISP', - 'address' => 'Vị trí', + 'invite' => [ + 'attribute' => 'Mã mời', + 'counts' => 'Tổng cộng :num mã mời', + 'generate_failed' => 'Tạo thất bại: Hết hạn ngạch mã mời', + 'logs' => 'Nhật ký mời', + 'promotion' => 'Cả bạn và người được mời sẽ nhận được :traffic dữ liệu khi họ đăng ký bằng mã của bạn; Bạn sẽ nhận được :referral_percent% hoa hồng khi họ mua hàng.', + 'tips' => 'Còn lại :num mã mời khả dụng, mã mời hết hạn sau :days ngày kể từ khi tạo', + ], + 'invitee' => 'Người được mời', + 'inviter' => 'Người mời', + 'invoice' => [ + 'active_prepaid_question' => 'Kích hoạt gói trả trước sớm?', + 'active_prepaid_tips' => 'Sau khi kích hoạt:
    Gói hiện tại của bạn sẽ hết hạn ngay lập tức
    Ngày hết hạn của gói mới sẽ được tính lại từ hôm nay', + 'amount' => 'Số tiền', + 'attribute' => 'Đơn hàng', + 'detail' => 'Chi tiết đơn hàng', + ], + 'knowledge' => [ + 'basic' => 'Cơ bản', + 'title' => 'Kiến thức cơ bản', ], - 'purchase_promotion' => 'Mua dịch vụ ngay!', 'menu' => [ + 'admin_dashboard' => 'Bảng điều khiển', 'help' => 'Trợ giúp', 'home' => 'Trang chủ', 'invites' => 'Mời', 'invoices' => 'Hóa đơn', 'nodes' => 'Nút', + 'profile' => 'Hồ sơ', 'promotion' => 'Giới thiệu', 'shop' => 'Cửa hàng', - 'profile' => 'Hồ sơ', 'tickets' => 'Yêu cầu hỗ trợ', - 'admin_dashboard' => 'Bảng điều khiển', ], - 'contact' => 'Liên hệ', + 'node' => [ + 'info' => 'Thông tin cấu hình', + 'rate' => ':ratio lần tiêu thụ dữ liệu', + 'setting' => 'Cài đặt Proxy', + 'unstable' => 'Không ổn định/Bảo trì', + ], 'oauth' => [ + 'bind' => 'Liên kết', 'bind_title' => 'Liên kết tài khoản xã hội', 'not_bind' => 'Chưa liên kết', - 'bind' => 'Liên kết', 'rebind' => 'Liên kết lại', 'unbind' => 'Hủy liên kết', ], - 'coupon' => [ - 'discount' => 'Giảm giá', - 'error' => [ - 'unknown' => 'Mã giảm giá không hợp lệ', - 'used' => 'Mã giảm giá đã được sử dụng', - 'expired' => 'Mã giảm giá đã hết hạn', - 'run_out' => 'Mã giảm giá đã hết', - 'inactive' => 'Mã giảm giá chưa có hiệu lực', - 'wait' => 'Sẽ có hiệu lực vào :time, vui lòng chờ!', - 'unmet' => 'Không đủ điều kiện sử dụng', - 'minimum' => 'Số tiền tối thiểu là :amount', - 'overused' => 'Chỉ có thể sử dụng :times lần', - 'users' => 'Tài khoản không đủ điều kiện khuyến mãi', - 'services' => 'Sản phẩm không đủ điều kiện giảm giá, kiểm tra điều khoản khuyến mãi', + 'pay' => 'Thanh toán', + 'payment' => [ + 'close_tips' => 'Hoàn thành thanh toán trong :minutes phút, nếu không đơn hàng sẽ tự động đóng', + 'creating' => 'Đang tạo thanh toán...', + 'error' => 'Số tiền nạp không hợp lệ', + 'insufficient_balance' => 'Số dư của bạn không đủ. Vui lòng nạp tiền trước.', + 'manual' => [ + 'hint' => 'Sau khi quét mã QR để thanh toán, vui lòng nhấn vào [Tiếp theo] theo thứ tự cho đến khi nhấn [Gửi] để hoàn tất thanh toán.', + 'next' => 'Tiếp theo', + 'payment_tips' => 'Vui lòng thanh toán số tiền chính xác (không hoàn lại tiền thừa, nạp thêm nếu thiếu)', + 'pre' => 'Trước', + 'red_packet' => 'Bao lì xì Alipay', + 'steps' => [ + 'complete' => [ + 'description' => 'Đang chờ xác minh thanh toán thủ công', + 'title' => 'Hoàn thành', + ], + 'notice' => [ + 'description' => 'Cách thanh toán thủ công', + 'title' => 'Lưu ý', + ], + 'payment' => [ + 'description' => 'Nhận mã QR và thanh toán', + 'title' => 'Thanh toán', + ], + 'remark' => [ + 'description' => 'Nhập tài khoản đăng nhập của bạn để xác minh thủ công', + 'title' => 'Ghi chú tài khoản', + ], + ], ], + 'method' => 'Phương thức thanh toán', + 'mobile_tips' => 'Người dùng di động: Nhấn giữ mã QR -> Lưu hình ảnh -> Mở ứng dụng thanh toán -> Quét hình ảnh để thanh toán', + 'order_creation' => [ + 'failed' => 'Tạo đơn hàng không thành công. Vui lòng thử phương thức thanh toán khác!', + 'info' => 'Chúng tôi sẽ kích hoạt khoản thanh toán/mua hàng của bạn trong vòng [24 giờ]! Vui lòng kiên nhẫn chờ đợi.', + 'order_limit' => 'Sản phẩm này giới hạn mua tối đa :limit_num lần. Bạn đã mua :count lần.', + 'order_timeout' => 'Đơn hàng đã hết thời gian và bị đóng tự động do không thanh toán.', + 'payment_disabled' => 'Tạo đơn hàng thất bại: Tính năng thanh toán trực tuyến chưa được kích hoạt.', + 'pending_order' => 'Tạo đơn hàng thất bại: Có đơn hàng chưa thanh toán. Vui lòng hoàn tất các thanh toán đó trước.', + 'plan_required' => 'Vui lòng mua gói cước trước khi mua gói nạp tiền.', + 'price_issue' => 'Tạo đơn hàng thất bại: Tổng giá trị đơn hàng bất thường', + 'price_zero' => 'Tạo đơn hàng thất bại: Tổng giá trị đơn hàng là 0; không cần thanh toán trực tuyến.', + 'product_unavailable' => 'Tạo đơn hàng thất bại: Sản phẩm đã bị gỡ khỏi danh sách bán.', + 'success' => 'Tạo đơn hàng thành công!', + 'unknown_order' => 'Đơn hàng không xác định', + 'unknown_payment' => 'Phương thức thanh toán không xác định', + ], + 'qrcode_tips' => 'Vui lòng quét bằng :software', + 'redirect_stripe' => 'Chuyển hướng đến Stripe', ], - 'error_response' => 'Đã xảy ra lỗi, vui lòng thử lại sau.', - 'invite' => [ - 'attribute' => 'Mã mời', - 'counts' => 'Tổng cộng :num mã mời', - 'tips' => 'Còn lại :num mã mời khả dụng, mã mời hết hạn sau :days ngày kể từ khi tạo', - 'logs' => 'Nhật ký mời', - 'promotion' => 'Cả bạn và người được mời sẽ nhận được :traffic dữ liệu khi họ đăng ký bằng mã của bạn; Bạn sẽ nhận được :referral_percent% hoa hồng khi họ mua hàng.', - 'generate_failed' => 'Tạo thất bại: Hết hạn ngạch mã mời', + 'purchase' => [ + 'completed' => 'Mua hàng hoàn tất!', + 'promotion' => 'Mua dịch vụ ngay!', + 'required' => 'Tính năng này bị vô hiệu hóa cho người dùng không trả phí. Vui lòng', + 'to_unlock' => 'Mua để mở khóa', ], + 'recharge' => 'Nạp tiền', + 'recharge_credit' => 'Nạp số dư', + 'recharging' => 'Đang nạp...', + 'referral' => [ + 'link' => 'Liên kết giới thiệu', + 'logs' => 'Nhật ký hoa hồng', + 'msg' => [ + 'account' => 'Tài khoản hết hạn, vui lòng mua gói trước', + 'applied' => 'Yêu cầu hiện tại, vui lòng chờ xử lý', + 'error' => 'Lỗi tạo đơn hàng, thử lại sau hoặc liên hệ hỗ trợ', + 'unfulfilled' => 'Cần :amount để rút, tiếp tục cố gắng!', + 'wait' => 'Vui lòng chờ quản trị viên phê duyệt', + ], + 'total' => 'Tổng hoa hồng: :amount (:total lần), có thể rút khi trên :money', + ], + 'registered_at' => 'Ngày đăng ký', 'reset_data' => [ 'action' => 'Đặt lại dữ liệu', 'cost' => 'Chi phí: :amount', 'cost_tips' => 'Việc đặt lại sẽ trừ :amount!', - 'insufficient' => 'Số dư không đủ, vui lòng nạp thêm', - 'logs' => 'Người dùng đặt lại dữ liệu', - 'success' => 'Đặt lại thành công', ], - 'referral' => [ - 'link' => 'Liên kết giới thiệu', - 'total' => 'Tổng hoa hồng: :amount (:total lần), có thể rút khi trên :money', - 'logs' => 'Nhật ký hoa hồng', - 'failed' => 'Yêu cầu thất bại', - 'success' => 'Yêu cầu thành công', - 'msg' => [ - 'account' => 'Tài khoản hết hạn, vui lòng mua gói trước', - 'applied' => 'Yêu cầu hiện tại, vui lòng chờ xử lý', - 'unfulfilled' => 'Cần :amount để rút, tiếp tục cố gắng!', - 'wait' => 'Vui lòng chờ quản trị viên phê duyệt', - 'error' => 'Lỗi tạo đơn hàng, thử lại sau hoặc liên hệ hỗ trợ', - ], - ], - 'inviter' => 'Người mời', - 'invitee' => 'Người được mời', - 'registered_at' => 'Ngày đăng ký', - 'bought_at' => 'Ngày mua', - 'payment_method' => 'Phương thức thanh toán', - 'pay' => 'Thanh toán', - 'input_coupon' => 'Nhập mã giảm giá', - 'recharge' => 'Nạp tiền', - 'recharge_credit' => 'Nạp số dư', - 'recharging' => 'Đang nạp...', - 'withdraw_commission' => 'Rút hoa hồng', - 'withdraw_at' => 'Ngày rút', - 'withdraw_logs' => 'Nhật ký rút', - 'withdraw' => 'Rút tiền', 'scan_qrcode' => 'Quét mã QR bằng ứng dụng khách', + 'service' => [ + 'country_count' => 'Phủ sóng :num quốc gia hoặc khu vực', + 'node_count' => ':num nút chất lượng cao', + 'unlimited' => 'Không giới hạn tốc độ', + ], 'shop' => [ - 'hot' => 'Bán chạy', - 'limited' => 'Giới hạn', + 'buy' => 'Mua', + 'call4help' => 'Liên hệ hỗ trợ nếu bạn có bất kỳ câu hỏi nào', 'change_amount' => 'Số tiền nạp', 'change_amount_help' => 'Nhập số tiền nạp', - 'buy' => 'Mua', + 'conflict' => 'Xung đột', + 'conflict_tips' => '

    Gói mua hiện tại sẽ được thiết lập là gói trả trước

    1. Gói trả trước sẽ tự động kích hoạt sau khi gói hiện tại hết hạn
    2. Bạn có thể kích hoạt thủ công sau khi thanh toán
    ', 'description' => 'Mô tả', - 'service' => 'Dịch vụ', + 'hot' => 'Bán chạy', + 'limited' => 'Giới hạn', 'pay_credit' => 'Thanh toán bằng số dư', 'pay_online' => 'Thanh toán trực tuyến', 'price' => 'Giá', 'quantity' => 'Số lượng', + 'service' => 'Dịch vụ', 'subtotal' => 'Tổng phụ', 'total' => 'Tổng cộng', - 'conflict' => 'Xung đột', - 'conflict_tips' => '

    Gói mua hiện tại sẽ được thiết lập là gói trả trước

    1. Gói trả trước sẽ tự động kích hoạt sau khi gói hiện tại hết hạn
    2. Bạn có thể kích hoạt thủ công sau khi thanh toán
    ', - 'call4help' => 'Liên hệ hỗ trợ nếu bạn có bất kỳ câu hỏi nào', - ], - 'service' => [ - 'node_count' => ':num nút chất lượng cao', - 'country_count' => 'Phủ sóng :num quốc gia hoặc khu vực', - 'unlimited' => 'Không giới hạn tốc độ', - ], - 'payment' => [ - 'error' => 'Số tiền nạp không hợp lệ', - 'creating' => 'Đang tạo thanh toán...', - 'redirect_stripe' => 'Chuyển hướng đến Stripe', - 'qrcode_tips' => 'Vui lòng quét bằng :software', - 'close_tips' => 'Hoàn thành thanh toán trong :minutes phút, nếu không đơn hàng sẽ tự động đóng', - 'mobile_tips' => 'Người dùng di động: Nhấn giữ mã QR -> Lưu hình ảnh -> Mở ứng dụng thanh toán -> Quét hình ảnh để thanh toán', - ], - 'invoice' => [ - 'attribute' => 'Đơn hàng', - 'detail' => 'Chi tiết đơn hàng', - 'amount' => 'Số tiền', - 'active_prepaid_question' => 'Kích hoạt gói trả trước sớm?', - 'active_prepaid_tips' => 'Sau khi kích hoạt:
    Gói hiện tại của bạn sẽ hết hạn ngay lập tức
    Ngày hết hạn của gói mới sẽ được tính lại từ hôm nay', - ], - 'node' => [ - 'info' => 'Thông tin cấu hình', - 'setting' => 'Cài đặt Proxy', - 'unstable' => 'Không ổn định/Bảo trì', - 'rate' => ':ratio lần tiêu thụ dữ liệu', ], 'subscribe' => [ - 'link' => 'Liên kết đăng ký', - 'tips' => 'Cảnh báo: Liên kết này chỉ dành cho cá nhân sử dụng. Không chia sẻ nó, nếu không tài khoản của bạn có thể bị cấm do sử dụng bất thường.', - 'exchange_warning' => 'Thay đổi liên kết đăng ký sẽ:\n1. Thu hồi liên kết hiện tại ngay lập tức\n2. Thay đổi mật khẩu kết nối', 'custom' => 'Đăng ký tùy chỉnh', + 'error' => 'Lỗi thay đổi liên kết đăng ký', + 'exchange_warning' => 'Thay đổi liên kết đăng ký sẽ:\n1. Thu hồi liên kết hiện tại ngay lập tức\n2. Thay đổi mật khẩu kết nối', + 'info' => [ + 'download' => 'Tải xuống', + 'title' => 'Tóm tắt tài khoản [Không theo thời gian thực]', + 'total' => 'Dữ liệu gói', + 'upload' => 'Tải lên', + ], + 'link' => 'Liên kết đăng ký', 'ss_only' => 'Chỉ đăng ký SS', 'ssr_only' => 'Chỉ đăng ký SSR (bao gồm SS)', - 'v2ray_only' => 'Chỉ đăng ký V2Ray', + 'tips' => 'Cảnh báo: Liên kết này chỉ dành cho cá nhân sử dụng. Không chia sẻ nó, nếu không tài khoản của bạn có thể bị cấm do sử dụng bất thường.', 'trojan_only' => 'Chỉ đăng ký Trojan', - 'error' => 'Lỗi thay đổi liên kết đăng ký', - 'info' => [ - 'title' => 'Tóm tắt tài khoản [Không theo thời gian thực]', - 'upload' => 'Tải lên', - 'download' => 'Tải xuống', - 'total' => 'Dữ liệu gói', + 'v2ray_only' => 'Chỉ đăng ký V2Ray', + ], + 'telegram' => [ + 'bind_exists' => 'Tài khoản này đã được liên kết với một tài khoản Telegram.', + 'bind_missing' => 'Không tìm thấy thông tin người dùng của bạn. Vui lòng liên kết tài khoản của bạn trước.', + 'command' => [ + 'bind' => 'Liên kết tài khoản :web_name của bạn', + 'intro' => 'Bạn có thể sử dụng các lệnh sau', + 'traffic' => 'Kiểm tra thông tin dữ liệu', + 'unbind' => 'Hủy liên kết', + 'web_url' => 'Lấy URL :web_name mới nhất', ], + 'get_url' => 'URL mới nhất của :web_name là', + 'params_missing' => 'Tham số không hợp lệ. Vui lòng kèm theo địa chỉ email và gửi lại.', + 'ticket_missing' => 'Vé không tồn tại', + 'ticket_reply' => 'Phản hồi cho vé #`:id` thành công', + 'traffic_query' => 'Tra cứu dữ liệu', + 'user_missing' => 'Người dùng không tồn tại', ], 'ticket' => [ 'attribute' => 'Yêu cầu hỗ trợ', - 'submit_tips' => 'Xác nhận gửi yêu cầu hỗ trợ?', - 'reply_confirm' => 'Xác nhận trả lời yêu cầu hỗ trợ?', - 'close_tips' => 'Xác nhận đóng yêu cầu hỗ trợ?', - 'close' => 'Đóng yêu cầu hỗ trợ', - 'failed_closed' => 'Lỗi: Đã đóng', - 'reply_placeholder' => 'Viết gì đó...', - 'reply' => 'Trả lời', 'close_msg' => 'Yêu cầu hỗ trợ ID :id đã đóng bởi người dùng', - 'title_placeholder' => 'Mô tả ngắn gọn vấn đề của bạn', + 'close_tips' => 'Xác nhận đóng yêu cầu hỗ trợ?', 'content_placeholder' => 'Cung cấp mô tả chi tiết về vấn đề của bạn để chúng tôi có thể hỗ trợ bạn tốt hơn', - 'new' => 'Tạo yêu cầu hỗ trợ mới', - 'service_hours' => 'Giờ làm việc của bộ phận hỗ trợ', - 'online_hour' => 'Giờ trực tuyến', - 'service_tips' => 'Vui lòng chỉ sử dụng một phương thức liên hệ để liên hệ hỗ trợ! Yêu cầu lặp lại sẽ làm chậm thời gian phản hồi.', 'error' => 'Lỗi không xác định! Vui lòng liên hệ hỗ trợ', + 'new' => 'Tạo yêu cầu hỗ trợ mới', + 'online_hour' => 'Giờ trực tuyến', + 'reply' => 'Trả lời', + 'reply_confirm' => 'Xác nhận trả lời yêu cầu hỗ trợ?', + 'reply_placeholder' => 'Viết gì đó...', + 'service_hours' => 'Giờ làm việc của bộ phận hỗ trợ', + 'service_tips' => 'Vui lòng chỉ sử dụng một phương thức liên hệ để liên hệ hỗ trợ! Yêu cầu lặp lại sẽ làm chậm thời gian phản hồi.', + 'submit_tips' => 'Xác nhận gửi yêu cầu hỗ trợ?', + 'title_placeholder' => 'Mô tả ngắn gọn vấn đề của bạn', ], 'traffic_logs' => [ - 'hourly' => 'Sử dụng dữ liệu hôm nay', 'daily' => 'Sử dụng dữ liệu tháng này', + 'hourly' => 'Sử dụng dữ liệu hôm nay', 'tips' => 'Lưu ý: Có độ trễ trong cập nhật thống kê dữ liệu.', ], - 'clients' => 'Ứng dụng khách', 'tutorials' => 'Hướng dẫn', - 'current_role' => 'Vai trò hiện tại', - 'knowledge' => [ - 'title' => 'Kiến thức cơ bản', - 'basic' => 'Cơ bản', - ], - 'manual' => [ - 'red_packet' => 'Bao lì xì Alipay', - 'hint' => 'Sau khi quét mã QR, tiếp tục nhấn [Tiếp theo] cho đến khi nhấn [Gửi] để hoàn tất thanh toán!', - 'step_1' => 'Lưu ý', - 'step_1_title' => 'Cách thanh toán thủ công', - 'step_2' => 'Thanh toán', - 'step_2_title' => 'Nhận mã QR và thanh toán', - 'step_3' => 'Hoàn thành', - 'step_3_title' => 'Chờ xác minh thủ công', - 'remark' => 'Ghi chú tài khoản', - 'remark_content' => 'Vui lòng cung cấp tên đăng nhập của bạn để xác minh thủ công chính xác', - 'payment_hint' => 'Vui lòng thanh toán số tiền chính xác (không hoàn lại tiền thừa, nạp thêm nếu thiếu)', - 'pre' => 'Trước', - 'next' => 'Tiếp theo', - ], + 'withdraw' => 'Rút tiền', + 'withdraw_at' => 'Ngày rút', + 'withdraw_commission' => 'Rút hoa hồng', + 'withdraw_logs' => 'Nhật ký rút', ]; diff --git a/resources/lang/zh_CN.json b/resources/lang/zh_CN.json index 6f4e939a..ff72c5d3 100644 --- a/resources/lang/zh_CN.json +++ b/resources/lang/zh_CN.json @@ -126,5 +126,16 @@ "You are receiving this email because we received a password reset request for your account.": "您收到此电子邮件是因为我们收到了您帐户的密码重设请求。", "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!": "您必须拥有有效订阅才能查看此区域的内容!", - "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "您的订阅已被管理员禁用,请联系管理员恢复订阅。" + "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "您的订阅已被管理员禁用,请联系管理员恢复订阅。", + "Manually add in dashboard.": "后台手动添加", + "Manually edit in dashboard.": "后台手动编辑", + "Batch generate user accounts in dashboard.": "后台批量生成用户账号", + "Coupon used in order.": "订单中使用了优惠券", + "Order canceled, coupon reinstated.": "订单取消,优惠券恢复", + "Used for credit recharge.": "用于余额充值", + "The user manually reset the data.": "用户自行重置流量", + "Recharge using a recharge voucher.":"使用充值券充值", + "The user topped up the balance.":"用户充值了余额", + "Purchased an item.":"购买了商品", + "[:payment] plus the user’s purchased data plan." : "【:payment】加上用户购买的套餐流量" } \ No newline at end of file diff --git a/resources/lang/zh_CN/admin.php b/resources/lang/zh_CN/admin.php index c03b3c4a..3b02c5d0 100644 --- a/resources/lang/zh_CN/admin.php +++ b/resources/lang/zh_CN/admin.php @@ -3,512 +3,468 @@ declare(strict_types=1); return [ + 'action' => [ + 'add_item' => '添加 :attribute', + 'edit_item' => '编辑 :attribute', + ], + 'aff' => [ + 'apply_counts' => '共有 :num 个提现申请', + 'commission_counts' => '本申请共有涉及 :num 单', + 'commission_title' => '提现申请详情', + 'counts' => '共有 :num 条返利记录', + 'rebate_title' => '返利流水记录', + 'referral' => '推广返利', + 'title' => '提现申请列表', + ], + 'article' => [ + 'category_hint' => '同一类别将归类与同一文件夹下', + 'counts' => '共有 :num 篇文章', + 'logo_placeholder' => '或输入 logo 链接', + 'title' => '文章列表', + 'type' => [ + 'announcement' => '公告', + 'knowledge' => '文章', + ], + ], + 'clear' => '清空', + 'clone' => '克隆', + 'confirm' => [ + 'continues' => '确定继续执行此操作吗?', + 'delete' => [0 => '确定删除 :attribute【', 1 => '】?'], + 'export' => '确定全部导出吗?', + ], + 'coupon' => [ + 'counts' => '共有 :num 张优惠券', + 'created_days_hint' => '且 创号 :days 天', + 'discount' => '优惠', + 'export_title' => '卡券导出', + 'groups_hint' => '选定的用户分组,方可使用本券', + 'info_title' => '卡券信息', + 'levels_hint' => '用户等级在选定等级内,方可使用本券', + 'limit_hint' => '本项各条件为 并且 关系,请自行搭配使用', + 'minimum_hint' => '当支付金额超过 :num 值时,才能使用本优惠劵;', + 'name_hint' => '会用于前端显示', + 'newbie' => [ + 'created_days' => '创号', + 'first_discount' => '首次用任意券', + 'first_order' => '首单', + ], + 'priority_hint' => '同【使用券码】下,符合条件的高权重码将会被优先使用。最高为 255', + 'services_blacklist_hint' => '涉及商品不可使用本券,留空为不使用此条件', + 'services_placeholder' => '输入商品ID,再回车', + 'services_whitelist_hint' => '涉及商品方可使用本券,留空为不使用此条件', + 'single_use' => '一次性', + 'sn_hint' => '提供给用户使用卡券的卡券,留空则默认为8位随机码', + 'title' => '卡券列表', + 'type' => [ + 'charge' => '充值券', + 'discount' => '折扣券', + 'voucher' => '代金券', + ], + 'type_hint' => '抵用:抵扣商品金额,折扣:商品百分比打折,充值:充值用户账号余额', + 'used_hint' => '符合条件的用户可以使用本券 :num 次;', + 'user_whitelist_hint' => '涉及用户均可使用本券,留空为不使用此条件', + 'users_blacklist_hint' => '涉及用户均不可使用本券,空为不使用此条件', + 'users_placeholder' => '输入用户ID,再回车', + 'value' => '{1} ➖ :num|{2} :num 折|{3} ➕ :num', + 'value_hint' => '范围为 1% ~ 99% ', + ], + 'creating' => '正在添加...', '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' => '维护中节点', + 'active_days_users' => ':days 天内活跃用户', + 'available_users' => '有效用户数', + 'credit' => '总余额', 'current_month_traffic_consumed' => '本月消耗流量', 'days_traffic_consumed' => ':days 天消耗流量', - 'orders' => '总订单数', + 'expiring_users' => '即将到期用户', + 'inactive_days_users' => '超过 :days 天未活跃的用户', + 'maintaining_nodes' => '维护中节点', + 'nodes' => '节点数', 'online_orders' => '在线支付订单数', + 'online_users' => '当前在线用户', + 'orders' => '总订单数', + 'overuse_users' => '流量使用超过90%的用户', + 'paid_users' => '付费用户数', 'succeed_orders' => '支付成功订单数', - 'credit' => '总余额', + 'users' => '总用户数', 'withdrawing_commissions' => '待提现佣金', 'withdrawn_commissions' => '已支出佣金', ], - 'action' => [ - 'edit_item' => '编辑 :attribute', - 'add_item' => '添加 :attribute', + 'end_time' => '结束区间', + 'goods' => [ + 'counts' => '共有 :num 个商品', + 'info' => [ + 'available_date_hint' => '到期后会自动从总流量扣减对应的流量', + 'desc_placeholder' => '商品的简单描述', + 'limit_num_hint' => '每个用户可以购买该商品次数,为 0 时代表不限购', + 'list_hint' => '每行内容请以<li> 开头</li> 结尾', + 'list_placeholder' => '商品的自定义列表添加', + 'period_hint' => '套餐流量会每N天重置', + 'type_hint' => '套餐与账号有效期有关,流量包只扣可用流量,不影响有效期', + ], + 'sell_and_used' => '使用/销售', + 'status' => [ + 'no' => '下架', + 'yes' => '上架', + ], + 'title' => '商品列表', + 'type' => [ + 'package' => '流量包', + 'plan' => '套餐', + 'top_up' => '充值', + ], ], - 'confirm' => [ - 'delete' => [0 => '确定删除 :attribute【', 1 => '】?'], - 'continues' => '确定继续执行此操作吗?', - 'export' => '确定全部导出吗?', + 'hint' => '提示', + 'logs' => [ + 'ban' => [ + 'ban_time' => '封禁时间', + 'last_connect_at' => '最后连接时间', + 'reason' => '理由', + 'time' => '时长', + 'title' => '用户封禁记录', + ], + 'callback' => '回调日志 (在线支付)', + 'counts' => '共有 :num 条记录', + 'credit_title' => '余额变动记录', + 'ip_monitor' => '在线IP监控 2分钟内的实时数据', + 'notification' => '邮件投递记录', + 'order' => [ + 'is_coupon' => '是否使用优惠券', + 'is_expired' => '是否过期', + 'title' => '订单列表', + 'update_conflict' => '更新失败, 订单冲突', + ], + 'rule' => [ + 'clear_all' => '清空所有记录', + 'clear_confirm' => '确定清空所有触发记录吗?', + 'created_at' => '触发时间', + 'name' => '触发规则名称', + 'reason' => '触发原因', + 'tag' => '✅ 访问非许可内容', + 'title' => '规则触发记录', + ], + 'subscribe' => '订阅列表', + 'user_data_modify_title' => '流量变动记录', + 'user_ip' => [ + 'connect' => '连接IP', + 'title' => '用户在线IP列表 最近10分钟', + ], + 'user_traffic' => [ + 'choose_node' => '选择节点', + 'title' => '流量使用记录', + ], ], - 'user_dashboard' => '个人中心', + 'marketing' => [ + 'counts' => '共有 :num 条消息', + 'email' => [ + 'ever_paid' => '曾经付费', + 'expired_date' => '已过期时间', + 'filters' => '过滤条件', + 'loading_statistics' => '正在加载统计信息...', + 'never_paid' => '从未付费', + 'paid_servicing' => '当前付费服务中', + 'previously_paid' => '曾付费但当前无服务', + 'recent_traffic_abnormal' => '小时内流量异常', + 'recently_active' => '最近活跃过', + 'targeted_users_count' => '目标用户数', + 'traffic_usage_over' => '流量使用超过N%', + 'will_expire_date' => '将到期时间', + ], + 'email_send' => '群发邮件', + 'error_message' => '错误信息', + 'processed' => '发送请求已受理', + 'push_send' => '推送消息', + 'send_status' => '发送状态', + 'send_time' => '发送时间', + 'targeted_users_not_found' => '目标用户未找到', + 'unknown_sending_type' => '未知发送类型', + ], + 'massive_export' => '批量导出', 'menu' => [ + 'analysis' => [ + 'accounting' => '流水账', + 'attribute' => '数据分析', + 'node_flow' => '节点流量', + 'site_flow' => '本站流量', + 'user_flow' => '用户流量', + ], + 'customer_service' => [ + 'article' => '文章管理', + 'attribute' => '客服系统', + 'marketing' => '消息广播', + 'ticket' => '服务工单', + ], 'dashboard' => '管理中心', - 'user' => [ - 'attribute' => '用户系统', - 'list' => '用户管理', - 'oauth' => '第三方授权', - 'group' => '用户分组', - 'credit_log' => '余额变动记录', - 'subscribe' => '订阅管理', + 'log' => [ + 'attribute' => '日志系统', + 'notify' => '通知记录', + 'online_logs' => '在线记录', + 'online_monitor' => '在线监控', + 'payment_callback' => '支付回调', + 'service_ban' => '封禁记录', + 'system' => '系统日志', + 'traffic' => '流量使用', + 'traffic_flow' => '流量变动', + ], + 'node' => [ + 'attribute' => '节点系统', + 'auth' => '节点授权', + 'cert' => '证书列表', + 'list' => '节点管理', + ], + 'promotion' => [ + 'attribute' => '推广营销', + 'invite' => '邀请管理', + 'rebate_flow' => '返利流水', + 'withdraw' => '提现管理', ], 'rbac' => [ 'attribute' => '权限系统', 'permission' => '权限管理', 'role' => '角色列表', ], - 'customer_service' => [ - 'attribute' => '客服系统', - 'ticket' => '服务工单', - 'article' => '文章管理', - 'marketing' => '消息广播', - ], - 'node' => [ - 'attribute' => '节点系统', - 'list' => '节点管理', - 'auth' => '节点授权', - 'cert' => '证书列表', - ], 'rule' => [ 'attribute' => '审计规则', - 'list' => '规则列表', 'group' => '规则分组', + 'list' => '规则列表', 'trigger' => '触发记录', ], - 'shop' => [ - 'attribute' => '商品系统', - 'goods' => '商品管理', - 'coupon' => '优惠券管理', - 'order' => '商品订单', - ], - 'promotion' => [ - 'attribute' => '推广营销', - 'invite' => '邀请管理', - 'withdraw' => '提现管理', - 'rebate_flow' => '返利流水', - ], - 'analysis' => [ - 'attribute' => '数据分析', - 'accounting' => '流水账', - 'user_flow' => '用户流量', - 'node_flow' => '节点流量', - 'site_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' => '系统参数', + 'universal' => '通用设置', + ], + 'shop' => [ + 'attribute' => '商品系统', + 'coupon' => '优惠券管理', + 'goods' => '商品管理', + 'order' => '商品订单', + ], + 'tools' => [ + 'analysis' => '日志分析', + 'attribute' => '工具集', + 'convert' => '格式转换', + 'decompile' => '反解析', + 'import' => '数据导入', + ], + 'user' => [ + 'attribute' => '用户系统', + 'credit_log' => '余额变动记录', + 'group' => '用户分组', + 'list' => '用户管理', + 'oauth' => '第三方授权', + 'subscribe' => '订阅管理', ], ], - 'user' => [ - 'massive' => [ - 'text' => '批量生成账号数量', - 'failed' => '批量生成账号失败', - 'succeed' => '批量生成账号成功', - 'note' => '后台批量生成用户账号', - ], - 'proxy_info' => '配置信息', - 'traffic_monitor' => '流量统计', - 'online_monitor' => '在线监测', - 'reset_traffic' => '重置流量', - 'user_view' => '用户视角', - 'connection_test' => '连接测试', - 'counts' => '共有 :num 个账号', - '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' => '用户分组控制(同节点可以属于多个分组,但用户只能属于一个分组;对于用户可见/可用的节点,分组优先于等级)', - 'name' => '分组名称', - 'counts' => '共有 :num 个分组', - ], - ], - 'zero_unlimited_hint' => '不设置/0,即为无限制', - 'node' => [ - 'traffic_monitor' => '流量统计', - 'refresh_geo' => '刷新地理位置', - 'connection_test' => '连通性测试', - 'counts' => '共有 :num 条线路', - 'reload_all' => '重载【全部】后端', - 'refresh_geo_all' => '刷新【全部】节点地理信息', - 'reload_confirm' => '确定重载节点后端吗?', - 'info' => [ - 'hint' => '注意: 添加节点后自动生成的ID是该节点部署 ShadowsocksR Python版后端时usermysql.json中的node_id值,同时也是部署 V2Ray 后端时的nodeId值。', - 'basic' => '基本信息', - 'ddns_hint' => '动态IP节点需要配置DDNS,这种类型的节点会通过域名进行节点阻断检测。', - 'domain_placeholder' => '服务器域名地址,填则优先取域名地址', - 'domain_hint' => '系统开启【DDNS模式】后,域名将自动与下方的IP绑定,不需要再去域名注册商修改IP信息。', - 'extend' => '扩展信息', - 'display' => [ - 'invisible' => '完全不可见', - 'node' => '只显示于【线 路】页面', - '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] 时可填入参数进行流量伪装; 混淆为 [http_simple] 时,建议端口为 80; 混淆为 [tls] 时,建议端口为 443;', - 'additional_ports_hint' => '如果启用请配置服务端的additional_ports信息', - '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端口,服务端需要配置
    严格模式:用户的端口无法连接,只能通过以下指定的端口进行连接(如何配置)', - ], - 'proxy_info' => '*兼容SS协议', - 'proxy_info_hint' => '如果兼容请在服务端配置协议和混淆时加上_compatible', - 'reload' => '重载后端', - 'auth' => [ - 'title' => '节点授权列表WEBAPI', - 'deploy' => [ - 'title' => '部署 :type_label 后端', - 'attribute' => '部署后端', - 'command' => '操作命令', - 'update' => '更新', - 'uninstall' => '卸载', - 'start' => '启动', - 'stop' => '停止', - 'status' => '状态', - 'recent_logs' => '近期日志', - 'real_time_logs' => '实时日志', - 'restart' => '重启', - 'same' => '同上', - 'trojan_hint' => '请先填写节点域名并解析到对应IP', - ], - 'reset_auth' => '重置密钥', - 'counts' => '共有 :num 条授权记录', - 'generating_all' => '确定是否为所有节点生成授权密钥?', - ], - 'cert' => [ - 'title' => '域名证书列表(V2Ray节点的伪装域名)', - 'counts' => '共有 :num 个域名证书', - 'key_placeholder' => '证书的KEY值,允许为空,VNET-V2Ray后端支持自动签发', - 'pem_placeholder' => '证书的PEM值,允许为空,VNET-V2Ray后端支持自动签发', - ], - ], - 'hint' => '提示', - 'oauth' => [ - 'title' => '第三方授权', - 'counts' => '共有 :num 条授权记录', - ], - 'select_all' => '全选', - 'clear' => '清空', - 'unselected_hint' => '待分配的规则,此处可搜索', - 'selected_hint' => '已分配的规则,此处可搜索', - 'clone' => '克隆', + 'minute' => '分钟', 'monitor' => [ 'daily_chart' => '每日流量图', + 'hint' => '提示: 如果没有统计数据,请检查定时任务是否正常运行。', 'monthly_chart' => '月流量图', 'node' => '节点流量', 'user' => '用户流量', - 'hint' => '提示: 如果没有统计数据,请检查定时任务是否正常运行。', ], - 'tools' => [ - 'analysis' => [ - 'title' => 'SSR日志分析仅适用于单机单节点', - 'req_url' => '近期请求URL记录', - 'not_enough' => '访问记录不足15000条,无法分析数据', - ], - 'convert' => [ - 'title' => '格式转换 Shadowsocks 转 ShadowsocksR', - 'content_placeholder' => '请填入需要转换的配置信息', - ], - 'decompile' => [ - 'title' => '反解析配置转换', - 'attribute' => '反解析配置链接', - 'content_placeholder' => '请填入需要反解析的ShadowsocksR链接,换行分隔', - ], - ], - 'ticket' => [ - 'title' => '工单列表', - 'counts' => '共有 :num 个工单', - 'send_to' => '请填入目标用户信息', - 'user_info' => '用户信息', - 'inviter_info' => '邀请人信息', - 'close_confirm' => '确定关闭该工单吗?', - 'error' => '未知错误!请查看运行日志', - ], - 'logs' => [ - 'subscribe' => '订阅列表', - 'counts' => '共有 :num 条记录', - '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' => '回调日志 (在线支付)', - 'notification' => '邮件投递记录', - 'ip_monitor' => '在线IP监控 2分钟内的实时数据', - 'user_ip' => [ - 'title' => '用户在线IP列表 最近10分钟', - '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' => '每行内容请以<li> 开头</li> 结尾', - ], - 'status' => [ - 'yes' => '上架', - 'no' => '下架', - ], - 'sell_and_used' => '使用/销售', - 'counts' => '共有 :num 个商品', - ], - 'sort_asc' => '排序值越大排越前', - 'yes' => '是', 'no' => '否', - 'rule' => [ - 'type' => [ - 'reg' => '正则表达式', - 'domain' => '域名', - 'ip' => 'IP', - 'protocol' => '协议', + 'node' => [ + 'auth' => [ + 'counts' => '共有 :num 条授权记录', + 'deploy' => [ + 'attribute' => '部署后端', + 'command' => '操作命令', + 'real_time_logs' => '实时日志', + 'recent_logs' => '近期日志', + 'restart' => '重启', + 'same' => '同上', + 'start' => '启动', + 'status' => '状态', + 'stop' => '停止', + 'title' => '部署 :type_label 后端', + 'trojan_hint' => '请先填写节点域名并解析到对应IP', + 'uninstall' => '卸载', + 'update' => '更新', + ], + 'empty' => '没有需要生成授权的节点', + 'generating_all' => '确定是否为所有节点生成授权密钥?', + 'reset_auth' => '重置密钥', + 'title' => '节点授权列表WEBAPI', ], + 'cert' => [ + 'counts' => '共有 :num 个域名证书', + 'key_placeholder' => '证书的KEY值,允许为空,VNET-V2Ray后端支持自动签发', + 'pem_placeholder' => '证书的PEM值,允许为空,VNET-V2Ray后端支持自动签发', + 'title' => '域名证书列表(V2Ray节点的伪装域名)', + ], + 'connection_test' => '连通性测试', + 'counts' => '共有 :num 条线路', + 'info' => [ + 'additional_ports_hint' => '如果启用请配置服务端的additional_ports信息', + 'basic' => '基本信息', + 'data_rate_hint' => '示例:0.1表示100M结算10M,5表示100M结算500M', + 'ddns_hint' => '动态IP节点需要配置DDNS,这种类型的节点会通过域名进行节点阻断检测。', + 'detection' => [ + 'all' => '检测全部连通性', + 'hint' => '每30~60分钟随机进行节点阻断检测', + 'icmp' => '只检测ICMP连通性', + 'tcp' => '只检测TCP连通性', + ], + 'display' => [ + 'all' => '完全可见', + 'hint' => '用户是否可订阅/查看本节点', + 'invisible' => '完全不可见', + 'node' => '只显示于【线 路】页面', + 'sub' => '只显示于【订 阅】', + ], + 'domain_hint' => '系统开启【DDNS模式】后,域名将自动与下方的IP绑定,不需要再去域名注册商修改IP信息。', + 'domain_placeholder' => '服务器域名地址,填则优先取域名地址', + 'extend' => '扩展信息', + 'hint' => '注意: 添加节点后自动生成的ID是该节点部署 ShadowsocksR Python版后端时usermysql.json中的node_id值,同时也是部署 V2Ray 后端时的nodeId值。', + 'ipv4_hint' => '多IP使用英文逗号分隔,例:1.1.1.1,8.8.8.8', + 'ipv4_placeholder' => '服务器IPv4地址', + 'ipv6_hint' => '多IP使用英文逗号分隔,例:1.1.1.1,8.8.8.8', + 'ipv6_placeholder' => '服务器IPv6地址', + 'level_hint' => '等级:0-无等级限制,全部可见', + 'obfs_param_hint' => '混淆不为 [plain] 时可填入参数进行流量伪装; 混淆为 [http_simple] 时,建议端口为 80; 混淆为 [tls] 时,建议端口为 443;', + 'push_port_hint' => '必填且需开放防火墙端口,否则消息推送将异常', + 'single_hint' => '推荐80或443端口,服务端需要配置
    严格模式:用户的端口无法连接,只能通过以下指定的端口进行连接(如何配置)', + 'v2_cover' => [ + 'dtls' => 'DTLS1.2数据包', + 'http' => 'HTTP数据流', + 'none' => '无伪装', + 'srtp' => '视频通话数据 (SRTP)', + 'utp' => 'BT下载数据 (uTP)', + 'wechat' => '微信视频通话', + 'wireguard' => 'WireGuard数据包', + ], + 'v2_host_hint' => 'http伪装时多个域名用逗号分隔,WebSocket只允许单个域名', + 'v2_method_hint' => 'WebSocket传输协议不要使用none加密方式', + 'v2_net_hint' => 'WebSocket传输协议请启用TLS', + 'v2_tls_provider_hint' => '不同后端的配置不同:', + ], + 'proxy_info' => '*兼容SS协议', + 'proxy_info_hint' => '如果兼容请在服务端配置协议和混淆时加上_compatible', + 'refresh_geo' => '刷新地理位置', + 'refresh_geo_all' => '刷新【全部】节点地理信息', + 'reload' => '重载后端', + 'reload_all' => '重载【全部】后端', + 'reload_confirm' => '确定重载节点后端吗?', + 'traffic_monitor' => '流量统计', + ], + 'oauth' => [ + 'counts' => '共有 :num 条授权记录', + 'title' => '第三方授权', + ], + 'optional' => '可选', + 'permission' => [ + 'counts' => '共有 :num 条权限行为', + 'description_hint' => '填写描述,例:【A系统】编辑A', + 'name_hint' => '填写路由名称,例:admin.permission.create,update', + 'title' => '权限行为列表', + ], + 'query' => '查询', + 'report' => [ + 'annually_accounting' => '年流水', + 'annually_site_flow' => '年流量', + 'avg_traffic_30d' => '30天日均流量', + 'current_month' => '本 月', + 'current_year' => '今 年', + 'daily_accounting' => '日流水', + 'daily_distribution' => '日分布', + 'daily_site_flow' => '日流量', + 'daily_traffic' => '日流量', + 'hourly_traffic' => '小时流量', + 'last_month' => '上 月', + 'last_year' => '去 年', + 'monthly_accounting' => '月流水', + 'monthly_site_flow' => '月流量', + 'select_hourly_date' => '选择小时日期', + 'sum_traffic_30d' => '30天占总流量比', + 'today' => '本 日', + ], + 'require' => '必须', + 'role' => [ + 'counts' => '共有 :num 个权限角色', + 'description_hint' => '面板显示名称,例如:管理员', + 'modify_admin_error' => '请勿修改超级管理员!', + 'name_hint' => '唯一标识名称,例如:Administrator', + 'permissions_all' => '全部权限', + 'title' => '权限角色列表', + ], + 'rule' => [ 'counts' => '共有 :num 条审计规则', - 'title' => '规则列表', 'group' => [ + 'counts' => '共有 :num 个分组', + 'title' => '规则分组', 'type' => [ 'off' => '阻断', 'on' => '放行', ], - 'title' => '规则分组', - 'counts' => '共有 :num 个分组', ], - ], - 'role' => [ - 'name_hint' => '唯一标识名称,例如:Administrator', - 'description_hint' => '面板显示名称,例如:管理员', - 'title' => '权限角色列表', - 'permissions_all' => '全部权限', - 'counts' => '共有 :num 个权限角色', - ], - 'report' => [ - 'daily_accounting' => '日流水', - 'monthly_accounting' => '月流水', - 'annually_accounting' => '年流水', - 'daily_site_flow' => '日流量', - 'monthly_site_flow' => '月流量', - 'annually_site_flow' => '年流量', - 'current_month' => '本 月', - 'last_month' => '上 月', - 'current_year' => '今 年', - 'last_year' => '去 年', - 'hourly_traffic' => '小时流量', - 'daily_traffic' => '日流量', - 'daily_distribution' => '日分布', - 'today' => '本 日', - 'avg_traffic_30d' => '30天日均流量', - 'sum_traffic_30d' => '30天占总流量比', - 'select_hourly_date' => '选择小时日期', - ], - 'permission' => [ - 'title' => '权限行为列表', - 'description_hint' => '填写描述,例:【A系统】编辑A', - 'name_hint' => '填写路由名称,例:admin.permission.create,update', - 'counts' => '共有 :num 条权限行为', - ], - 'marketing' => [ - 'push_send' => '推送消息', - 'email_send' => '群发邮件', - 'email' => [ - 'targeted_users_count' => '目标用户数', - 'loading_statistics' => '正在加载统计信息...', - 'filters' => '过滤条件', - 'expired_date' => '已过期时间', - 'will_expire_date' => '将到期时间', - 'traffic_usage_over' => '流量使用超过N%', - 'recently_active' => '最近活跃过', - 'paid_servicing' => '当前付费服务中', - 'previously_paid' => '曾付费但当前无服务', - 'ever_paid' => '曾经付费', - 'never_paid' => '从未付费', - 'recent_traffic_abnormal' => '小时内流量异常', - ], - 'counts' => '共有 :num 条消息', - 'send_status' => '发送状态', - 'send_time' => '发送时间', - 'error_message' => '错误信息', - 'processed' => '发送请求已受理', - 'targeted_users_not_found' => '目标用户未找到', - 'unknown_sending_type' => '未知发送类型', - ], - 'creating' => '正在添加...', - 'article' => [ + 'title' => '规则列表', 'type' => [ - 'knowledge' => '文章', - 'announcement' => '公告', + 'domain' => '域名', + 'ip' => 'IP', + 'protocol' => '协议', + 'reg' => '正则表达式', ], - 'category_hint' => '同一类别将归类与同一文件夹下', - 'logo_placeholder' => '或输入 logo 链接', - 'title' => '文章列表', - 'counts' => '共有 :num 篇文章', - ], - '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' => '当支付金额超过 :num 值时,才能使用本优惠劵;', - 'used_hint' => '符合条件的用户可以使用本券 :num 次;', - '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' => '且 创号 :days 天', - 'limit_hint' => '本项各条件为 并且 关系,请自行搭配使用', - 'info_title' => '卡券信息', - 'counts' => '共有 :num 张优惠券', - 'discount' => '优惠', - 'export_title' => '卡券导出', - 'single_use' => '一次性', - ], - 'times' => '次', - 'massive_export' => '批量导出', - 'system_generate' => '系统生成', - 'aff' => [ - 'rebate_title' => '返利流水记录', - 'counts' => '共有 :num 条返利记录', - 'title' => '提现申请列表', - 'apply_counts' => '共有 :num 个提现申请', - 'referral' => '推广返利', - 'commission_title' => '提现申请详情', - 'commission_counts' => '本申请共有涉及 :num 单', ], + 'select_all' => '全选', + 'selected_hint' => '已分配的规则,此处可搜索', + 'set_to' => '置 :attribute', 'setting' => [ 'common' => [ - 'title' => '通用配置', - 'set_default' => '设为默认', 'connect_nodes' => '关联节点数', + 'set_default' => '设为默认', + 'title' => '通用配置', ], 'email' => [ - 'title' => '邮箱过滤列表 (用于屏蔽特定邮箱后缀注册)', - 'tail' => '邮箱后缀', - 'rule' => '规则', 'black' => '黑名单', - 'white' => '白名单', + 'rule' => '规则', + 'tail' => '邮箱后缀', 'tail_placeholder' => '请填入邮箱后缀', - ], - 'system' => [ - 'title' => '系统配置', - 'web' => '网站常规', - 'account' => '账号设置', - 'node' => '节点设置', - 'extend' => '拓展功能', - 'check_in' => '签到系统', - 'promotion' => '推广系统', - 'notify' => '通知系统', - 'auto_job' => '自动任务', - 'other' => 'LOGO|客服|统计', - 'payment' => '支付系统', - 'menu' => '菜单', + 'title' => '邮箱过滤列表 (用于屏蔽特定邮箱后缀注册)', + 'white' => '白名单', ], 'no_permission' => '您没有权限修改参数!', + 'system' => [ + 'account' => '账号设置', + 'auto_job' => '自动任务', + 'check_in' => '签到系统', + 'extend' => '拓展功能', + 'menu' => '菜单', + 'node' => '节点设置', + 'notify' => '通知系统', + 'other' => 'LOGO|客服|统计', + 'payment' => '支付系统', + 'promotion' => '推广系统', + 'title' => '系统配置', + 'web' => '网站常规', + ], ], + 'sort_asc' => '排序值越大排越前', + 'start_time' => '开始区间', 'system' => [ + 'AppStore_id' => '苹果账号', + 'AppStore_password' => '苹果密码', 'account_expire_notification' => '账号过期通知', + 'active_account' => [ + 'after' => '注册后激活', + 'before' => '注册前激活', + ], 'active_times' => '激活账号次数', 'admin_invite_days' => '管理员-邀请码有效期', 'aff_salt' => '邀请链接 用户信息字符化', 'alipay_qrcode' => '支付宝二维码', - 'AppStore_id' => '苹果账号', - 'AppStore_password' => '苹果密码', 'auto_release_port' => '端口回收机制', 'bark_key' => 'Bark设备号', + 'captcha' => [ + 'geetest' => '极 验', + 'hcaptcha' => 'hCaptcha', + 'recaptcha' => 'Google reCaptcha', + 'standard' => '普通验证码', + 'turnstile' => 'Turnstile', + ], 'captcha_key' => '验证码 Key', 'captcha_secret' => '验证码 Secret/ID', 'codepay_id' => '码支付ID', @@ -521,6 +477,7 @@ return [ 'ddns_secret' => 'DNS服务商Secret', 'default_days' => '初始有效期', 'default_traffic' => '初始流量', + 'demo_restriction' => '演示环境禁止修改该配置!', 'detection_check_times' => '阻断检测通知', 'dingTalk_access_token' => '钉钉自定义机器人 Access Token', 'dingTalk_secret' => '钉钉自定义机器人 密钥', @@ -531,108 +488,19 @@ return [ 'f2fpay_app_id' => '应用ID', 'f2fpay_private_key' => '应用私钥', 'f2fpay_public_key' => '支付宝公钥', + 'forbid' => [ + 'china' => '阻拦中国', + 'mainland' => '阻拦大陆', + 'oversea' => '阻拦海外', + ], '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_QQPay' => 'QQ钱包', - 'is_rand_port' => '随机端口', - 'is_register' => '用户注册', - 'is_subscribe_ban' => '异常订阅请求自动封禁', - 'is_traffic_ban' => '异常流量使用自动封号', - 'is_WeChatPay' => '微信支付', - 'iYuu_token' => 'IYUU令牌', - 'maintenance_content' => '维护介绍内容', - 'maintenance_mode' => '维护模式', - 'maintenance_time' => '维护结束时间', - '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' => 'APP ID', - 'paypal_client_id' => 'Client ID', - 'paypal_client_secret' => 'Client Secret key', - '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' => [ + 'AppStore_id' => 'iOS软件设置教程中使用的苹果账号', + 'AppStore_password' => 'iOS软件设置教程中使用的苹果密码', 'account_expire_notification' => '通知用户账号即将到期', 'active_times' => '24小时内可以通过邮件激活账号次数', 'admin_invite_days' => '管理员生成邀请码的有效期', 'aff_salt' => '留空时,邀请链接将显示用户ID;填入任意英文/数字 即可对用户链接ID进行加密', - 'AppStore_id' => 'iOS软件设置教程中使用的苹果账号', - 'AppStore_password' => 'iOS软件设置教程中使用的苹果密码', 'auto_release_port' => '被封禁/过期 '.config('tasks.release_port').' 天的账号端口自动释放', 'bark_key' => '推送消息到iOS设备,需要在iOS设备里装一个名为Bark的应用,取网址后的一长串字符串,启用Bark,请务必填入本值', 'captcha_key' => '浏览设置指南来设置', @@ -650,6 +518,7 @@ return [ 'f2fpay_private_key' => '生成秘钥软件生成时,产生的应用秘钥', 'f2fpay_public_key' => '注意不是应用公钥!', 'forbid_mode' => '根据IP阻拦指定地区,非阻拦地区可正常访问', + 'iYuu_token' => '启用爱语飞飞,请务必填入本值(申请 IYUU令牌)', 'invite_num' => '用户默认拥有可以邀请的名额', 'is_activate_account' => '启用后用户需要通过邮件来激活账号', 'is_ban_status' => '(慎重)封禁整个账号会重置账号的所有数据且会导致用户无法登录,不开启状态下只封禁用户代理', @@ -664,14 +533,14 @@ return [ 'is_register' => '关闭后无法注册', 'is_subscribe_ban' => '启用后用户订阅链接请求超过设定阈值则自动封禁', 'is_traffic_ban' => '1小时内流量超过异常阈值则自动封号(仅禁用代理)', - 'iYuu_token' => '启用爱语飞飞,请务必填入本值(申请 IYUU令牌)', 'maintenance_content' => '自定义维护内容信息', - 'maintenance_mode' => "启用后,用户访问转移至维护界面 | 管理员使用 :url 登录", + 'maintenance_mode' => '启用后,用户访问转移至维护界面 | 管理员使用 :url 登录', 'maintenance_time' => '用于维护界面倒计时', 'min_port' => '端口范围:1000~65535', 'node_blocked_notification' => '每小时检测节点是否被阻断并通知管理员', 'node_daily_notification' => '报告各节点前一天的流量消耗情况', 'node_offline_notification' => '每10分钟检测节点离线情况并通知管理员', + 'node_renewal_notification' => '在节点到期前7天、3天和1天分别提醒管理员续约', 'oauth_path' => '请在.ENV中添加设置,再在此处开启平台', 'offline_check_times' => '24小时内通知n次后不再通知', 'password_reset_notification' => '启用后用户可以重置密码', @@ -707,9 +576,10 @@ return [ 'traffic_ban_value' => '1小时内超过该值,则触发自动封号', 'traffic_limit_time' => '间隔多久才可以再次签到', 'traffic_warning_percent' => '【流量耗尽通知】开始阈值,每日通知用户', - 'username_type' => '规范站点用户账号的类型,默认为电子邮箱', 'user_invite_days' => '用户自行生成邀请的有效期', + 'username_type' => '规范站点用户账号的类型,默认为电子邮箱', 'v2ray_tls_provider' => '后端自动签发/载入TLS证书时用(节点的设置值优先级高于此处)', + 'web_api_url' => '例:'.config('app.url'), 'webmaster_email' => '错误提示时会提供管理员邮箱作为联系方式', 'website_analytics' => '统计JS', 'website_callback_url' => '防止因为网站域名被DNS投毒后导致支付无法正常回调,需带http://或https://', @@ -717,97 +587,247 @@ return [ 'website_name' => '发邮件时展示', 'website_security_code' => '非空时必须通过安全入口加上安全码才可访问', 'website_url' => '生成重置密码、在线支付必备', - 'web_api_url' => '例:'.config('app.url'), 'wechat_aid' => '在应用管理自建中创建应用 - AgentId', 'wechat_cid' => '获取我的企业中的企业ID', 'wechat_encodingAESKey' => '应用管理->应用->设置API接收->EncodingAESKey', '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/?', + 'iYuu_token' => 'IYUU令牌', + 'invite_num' => '默认可邀请名额', + 'is_AliPay' => '支付宝支付', + 'is_QQPay' => 'QQ钱包', + 'is_WeChatPay' => '微信支付', + 'is_activate_account' => '激活账号', + '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_rand_port' => '随机端口', + 'is_register' => '用户注册', + 'is_subscribe_ban' => '异常订阅请求自动封禁', + 'is_traffic_ban' => '异常流量使用自动封号', + 'maintenance_content' => '维护介绍内容', + 'maintenance_mode' => '维护模式', + 'maintenance_time' => '维护结束时间', + 'min_port' => '端口范围', + 'min_rand_traffic' => '流量范围', + 'node_blocked_notification' => '节点阻断通知', + 'node_daily_notification' => '节点使用报告', + 'node_offline_notification' => '节点离线通知', + 'node_renewal_notification' => '节点续费通知', + 'notification' => [ + 'channel' => [ + 'bark' => 'Bark', + 'dingtalk' => '钉钉', + 'email' => '邮箱', + 'iyuu' => '爱语飞飞', + 'pushdeer' => 'PushDeer', + 'pushplus' => 'PushPlus', + 'serverchan' => 'ServerChan', + 'site' => '站内通知', + 'telegram' => 'TG电报', + 'tg_chat' => 'TG酱', + 'wechat' => '企业微信', + ], + 'send_test' => '发送测试消息', + 'test' => [ + 'content' => '测试内容', + 'success' => '发送成功,请查看手机是否收到推送消息', + 'title' => '这是测试的标题', + 'unknown_channel' => '未知渠道', + ], ], + 'oauth_path' => '第三方登录平台', + 'offline_check_times' => '离线通知次数', + 'params_required' => '请先完善该:attribute的必要参数!', + 'password_reset_notification' => '重置密码', + 'paybeaver_app_id' => 'App ID', + 'paybeaver_app_secret' => 'App Secret', + 'payjs_key' => '通信密钥', + 'payjs_mch_id' => '商户号', 'payment' => [ 'attribute' => '支付设置', 'channel' => [ 'alipay' => '支付宝F2F', 'codepay' => '码支付', 'epay' => '易支付', + 'manual' => '人工支付', + 'paybeaver' => '海狸支付', 'payjs' => 'PayJs', 'paypal' => 'PayPal', 'stripe' => 'Stripe', - 'paybeaver' => '海狸支付', 'theadpay' => '平头哥支付', - 'manual' => '人工支付', ], 'hint' => [ 'alipay' => '本功能需要从蚂蚁金服开放平台申请权限及应用', 'codepay' => '请到 码支付申请账号,然后下载登录其挂机软件', + 'manual' => '设置后会自动开启对应显示', + 'paybeaver' => '请到海狸支付 PayBeaver申请账号', 'payjs' => '请到PayJs 申请账号', 'paypal' => '使用商家账号登录API凭证申请页,同意并获取设置信息', - 'paybeaver' => '请到海狸支付 PayBeaver申请账号', 'theadpay' => '请到平头哥支付 THeadPay申请账号', - 'manual' => '设置后会自动开启对应显示', ], ], - 'notification' => [ - 'channel' => [ - 'telegram' => 'TG电报', - 'wechat' => '微信企业', - 'dingtalk' => '钉钉', - 'email' => '邮箱', - 'bark' => 'Bark', - 'serverchan' => 'ServerChan', - 'pushdeer' => 'PushDeer', - 'pushplus' => 'PushPlus', - 'iyuu' => '爱语飞飞', - 'tg_chat' => 'TG酱', - 'site' => '站内通知', - ], - 'send_test' => '发送测试消息', + 'payment_confirm_notification' => '人工支付确认通知', + 'payment_received_notification' => '支付成功通知', + 'paypal_app_id' => 'APP ID', + 'paypal_client_id' => 'Client ID', + 'paypal_client_secret' => 'Client Secret key', + 'placeholder' => [ + 'bark_key' => '填入Bark的设备号 -> 再点击更新', + 'codepay_url' => 'https://codepay.fateqq.com/creat_order/?', + 'default_url' => '默认为 :url', + 'dingTalk_access_token' => '自定义机器人的WebHook中的access_token', + 'dingTalk_secret' => '自定义机器人加签后出现的的密钥', + 'iYuu_token' => '填入爱语飞飞的IYUU令牌 -> 再点击更新', + 'pushDeer_key' => '填入PushDeer的Push Key -> 再点击更新', + 'pushplus_token' => '请到ServerChan申请', + 'server_chan_key' => '填入ServerChan的SCKEY -> 再点击更新', + 'telegram_token' => '填入Telegram的Token -> 再点击更新', + 'tg_chat_token' => '请到Telegram申请', + 'wechat_aid' => '应用的AgentId', + 'wechat_cid' => '填入微信企业ID -> 再点击更新', + 'wechat_secret' => '应用的Secret', ], - 'forbid' => [ - 'mainland' => '阻拦大陆', - 'china' => '阻拦中国', - 'oversea' => '阻拦海外', + 'pushDeer_key' => 'PushDeer Key', + 'pushplus_token' => 'PushPlus Token', + 'rand_subscribe' => '随机订阅', + 'redirect_url' => '重定向地址', + 'referral' => [ + 'loop' => '循环返利', + 'once' => '首购返利', ], + '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授权', + 'user_invite_days' => '用户-邀请码有效期', 'username' => [ + 'any' => '任意用户名', 'email' => '电子邮箱', 'mobile' => '手机号码', - 'any' => '任意用户名', ], - 'active_account' => [ - 'before' => '注册前激活', - 'after' => '注册后激活', + 'username_type' => '用户名类型', + 'v2ray_license' => 'V2Ray授权', + 'v2ray_tls_provider' => 'V2Ray TLS配置', + 'web_api_url' => '授权/后端访问域名', + 'webmaster_email' => '管理员邮箱', + 'website_analytics' => '网站统计代码', + 'website_callback_url' => '通用支付回调地址', + 'website_customer_service' => '网站客服代码', + 'website_home_logo' => '首页LOGO', + 'website_logo' => '站内LOGO', + 'website_name' => '网站名称', + 'website_security_code' => '网站安全码', + 'website_url' => '网站地址', + 'wechat_aid' => '微信企业应用ID', + 'wechat_cid' => '微信企业ID', + 'wechat_encodingAESKey' => '微信企业应用EncodingAESKey', + 'wechat_qrcode' => '微 信二维码', + 'wechat_secret' => '微信企业应用密钥', + 'wechat_token' => '微信企业应用TOKEN', + ], + 'system_generate' => '系统生成', + 'ticket' => [ + 'close_confirm' => '确定关闭该工单吗?', + 'counts' => '共有 :num 个工单', + 'error' => '未知错误!请查看运行日志', + 'inviter_info' => '邀请人信息', + 'self_send' => '不能对自己发起工单!', + 'send_to' => '请填入目标用户信息', + 'title' => '工单列表', + 'user_info' => '用户信息', + ], + 'times' => '次', + 'tools' => [ + 'analysis' => [ + 'file_missing' => ':file_name 不存在,请先创建文件', + 'not_enough' => '访问记录不足15000条,无法分析数据', + 'req_url' => '近期请求URL记录', + 'title' => 'SSR日志分析仅适用于单机单节点', ], - 'captcha' => [ - 'standard' => '普通验证码', - 'geetest' => '极 验', - 'recaptcha' => 'Google reCaptcha', - 'hcaptcha' => 'hCaptcha', - 'turnstile' => 'Turnstile', + 'convert' => [ + 'content_placeholder' => '请填入需要转换的配置信息', + 'file_missing' => '文件不存在,请检查目录权限', + 'missing_error' => '转换失败:配置信息里缺少【port_password】字段,或者该字段为空', + 'params_unknown' => '参数异常', + 'title' => '格式转换 Shadowsocks 转 ShadowsocksR', ], - 'referral' => [ - 'once' => '首购返利', - 'loop' => '循环返利', + 'decompile' => [ + 'attribute' => '反解析配置链接', + 'content_placeholder' => '请填入需要反解析的ShadowsocksR链接,换行分隔', + 'title' => '反解析配置转换', + ], + 'import' => [ + 'file_error' => '产生未知错误,请重新上传', + 'file_required' => '请选择要上传的文件', + 'file_type_error' => '只允许上传:type文件', + 'format_error' => '内容格式解析异常,请上传符合规范配置的:type文件', ], ], - 'set_to' => '置 :attribute', - 'minute' => '分钟', - 'query' => '查询', - 'optional' => '可选', - 'require' => '必须', + 'unselected_hint' => '待分配的规则,此处可搜索', + 'user' => [ + 'admin_deletion' => '系统管理员不可删除', + 'bulk_account_quantity' => '批量生成的账号数量', + 'connection_test' => '连接测试', + 'counts' => '共有 :num 个账号', + 'group' => [ + 'counts' => '共有 :num 个分组', + 'name' => '分组名称', + 'title' => '用户分组控制(同节点可以属于多个分组,但用户只能属于一个分组;对于用户可见/可用的节点,分组优先于等级)', + ], + 'info' => [ + 'account' => '账号信息', + 'expired_date_hint' => '留空则默认为一年有效期', + 'proxy' => '代理信息', + 'recharge_placeholder' => '填入负值可扣减余额', + 'reset_date_hint' => '账号流量下次重置日期', + 'switch' => '切换身份', + 'uuid_hint' => 'V2Ray 的账户 ID', + ], + 'online_monitor' => '在线监测', + 'proxies_config' => '【:username】的连接配置信息', + 'proxy_info' => '配置信息', + 'reset_confirm' => [0 => '确定重置 【', 1 => '】 的可用流量吗?'], + 'reset_traffic' => '重置流量', + 'traffic_monitor' => '流量统计', + 'update_help' => '更新成功,是否返回?', + 'user_view' => '用户视角', + ], + 'user_dashboard' => '个人中心', + 'yes' => '是', + 'zero_unlimited_hint' => '不设置/0,即为无限制', ]; diff --git a/resources/lang/zh_CN/auth.php b/resources/lang/zh_CN/auth.php index 41bc387c..a03558c1 100644 --- a/resources/lang/zh_CN/auth.php +++ b/resources/lang/zh_CN/auth.php @@ -40,27 +40,18 @@ return [ ], 'failed' => '用户名或密码错误。', 'invite' => [ - 'attribute' => '邀请码', - 'error' => [ - 'unavailable' => '邀请码不可用,请重试', - ], 'get' => '点击获取邀请码', 'not_required' => '无需邀请码,可直接注册!', + 'unavailable' => '邀请码不可用,请重试', ], 'login' => '登录', 'logout' => '登出', 'maintenance' => '维护', 'maintenance_tip' => '网站维护中', 'oauth' => [ - 'bind_failed' => '绑定失败', - 'bind_success' => '绑定成功', 'login_failed' => '第三方登录失败!', - 'rebind_success' => '重新绑定成功', 'register' => '快速注册', - 'register_failed' => '注册失败', 'registered' => '已注册,请直接登录', - 'unbind_failed' => '解绑失败', - 'unbind_success' => '解绑成功', ], 'one-click_login' => '一键登录', 'optional' => '可选', @@ -73,7 +64,6 @@ return [ 'error' => [ 'demo' => '演示环境禁止修改管理员密码', 'disabled' => '本站关闭了密码重置功能,如遇问题请联系:email', - 'failed' => '重置密码失败', 'same' => '新密码不能与旧密码相同,请重新输入', 'throttle' => '24小时内只能重设密码:time次,请勿频繁操作', 'wrong' => '旧密码错误,请重新输入', @@ -91,7 +81,6 @@ return [ ], 'failed' => '注册失败,请稍后再试', 'promotion' => '还没有账号?请先', - 'success' => '注册成功', ], 'remember_me' => '记住我', 'request' => '获取', diff --git a/resources/lang/zh_CN/common.php b/resources/lang/zh_CN/common.php index 3a3e57b7..4710c409 100644 --- a/resources/lang/zh_CN/common.php +++ b/resources/lang/zh_CN/common.php @@ -3,141 +3,149 @@ declare(strict_types=1); return [ - 'hour' => '{1} 小时|{2} 点', 'account' => '账户', + 'action' => '操作', + 'active_item' => '激活:attribute', + 'add' => '添加', + 'advance' => '进阶', + 'all' => '全部', + 'applied' => ':attribute已生效', + 'apply' => '应用', 'available_date' => '有效期', - 'created_at' => '创建时间', - 'expired_at' => '到期时间', - 'updated_at' => '更新时间', - 'latest_at' => '最近更新', + 'avatar' => '头像', 'back' => '返回', 'back_to' => '返回至:page', + 'bark' => [ + 'custom' => '自定义信息', + 'node_status' => '节点状态', + ], 'cancel' => '取消', + 'change' => '更换', 'close' => '关闭', 'close_item' => '关闭:attribute', 'confirm' => '确认', 'continue' => '继续', - 'open' => '打开', - 'send' => '发送', - 'view' => '查看', - 'reset' => '重置', + 'convert' => '转换', 'copy' => [ 'attribute' => '复制', - 'success' => '复制成功', 'failed' => '复制失败,请手动复制', + 'success' => '复制成功', ], - 'add' => '添加', - 'free' => '免费', - 'change' => '更换', - 'submit' => '提交', - 'submit_item' => '提交:attribute', - 'generate' => '生成', - 'generate_item' => '生成:attribute', - 'to_safari' => [0 => '点击右上角', 1 => ',选择在', 2 => 'Safari 中打开', 3 => '即可正常访问本站!'], - 'update_browser' => [0 => '您正在使用', 1 => '过时的', 2 => '浏览器。请', 3 => '升级您的浏览器', 4 => '以获得最佳浏览体验'], - 'apply' => '应用', - 'avatar' => '头像', + 'create' => '创建', + 'created_at' => '创建时间', 'customize' => '自定义', - 'all' => '全部', - 'default' => '默认', - 'download' => '下载', - 'goto' => '前往', - 'warning' => '警告', - 'success' => '成功', - 'success_item' => ':attribute成功', - 'failed' => '失败', - 'failed_item' => ':attribute失败', - 'update' => '更新', - 'update_action' => '更新:action', - 'none' => '无', - 'new' => '新', - 'sorry' => '抱歉', - 'applied' => ':attribute已生效', - 'active_item' => '激活:attribute', - 'error' => '错误', - 'toggle' => '切换', - 'toggle_action' => '切换:action', - 'request_url' => '请求地址', - 'function' => [ - 'navigation' => '导航', - 'menubar' => '菜单栏', - 'fullscreen' => '全屏', - ], 'days' => [ 'attribute' => '{1} 天|{2} 日', + 'next' => '次日', 'weekend' => '周末', 'work' => '工作日', - 'next' => '次日', ], - 'qrcode' => ':attribute二维码', + 'default' => '默认', + 'delete' => '删除', 'deleted' => '已删除', 'deleted_item' => ':attribute已删除', - 'print' => '打印', - 'unlimited' => '无限制', - 'payment' => [ - 'credit' => '余额', - 'alipay' => '支付宝', - 'qq' => 'QQ钱包', - 'wechat' => '微信支付', - 'crypto' => '虚拟货币', - 'manual' => '人工支付', - 'status' => [ - 'wait' => '待支付', - ], + 'developing' => '开发中,敬请期待!', + 'download' => '下载', + 'edit' => '编辑', + 'error' => '错误', + 'error_action_item' => ':action:attribute错误', + 'error_item' => ':attribute错误', + 'exists_error' => '该:attribute下存在关联账号,请先取消关联!', + 'expired_at' => '到期时间', + 'export' => '导出', + 'failed' => '失败', + 'failed_action_item' => ':action:attribute失败', + 'failed_item' => ':attribute失败', + 'free' => '免费', + 'function' => [ + 'fullscreen' => '全屏', + 'menubar' => '菜单栏', + 'navigation' => '导航', ], + 'generate' => '生成', + 'generate_item' => '生成:attribute', + 'goto' => '前往', + 'hour' => '{1} 小时|{2} 点', + 'import' => '导入', + 'latest_at' => '最近更新', + 'more' => '更多', + 'new' => '新', + 'none' => '无', + 'open' => '打开', + 'or' => '或', 'order' => [ 'status' => [ 'canceled' => '已取消', 'completed' => '已完成', - 'prepaid' => '预支付', 'ongoing' => '使用中', + 'prepaid' => '预支付', 'review' => '待确认', ], ], + 'payment' => [ + 'alipay' => '支付宝', + 'credit' => '余额', + 'crypto' => '虚拟货币', + 'manual' => '人工支付', + 'qq' => 'QQ钱包', + 'wechat' => '微信支付', + ], + 'print' => '打印', + 'qrcode' => ':attribute二维码', + 'random_generate' => '留空则随机生成', 'recommend' => '推荐', - 'advance' => '进阶', - 'action' => '操作', + 'request' => '请求', + 'request_failed' => '请求失败,请重试', + 'request_url' => '请求地址', + 'reset' => '重置', 'search' => '搜索', - 'edit' => '编辑', - 'delete' => '删除', + 'send' => '发送', + 'sorry' => '抱歉', 'status' => [ + 'applying' => '申请中', 'attribute' => '状态', - 'inactive' => '未激活', - 'disabled' => '停用', + 'available' => '生效中', 'banned' => '禁用', - 'normal' => '正常', + 'closed' => '关闭', + 'disabled' => '停用', 'enabled' => '启用', 'expire' => '过期', + 'inactive' => '未激活', 'limited' => '限制', - 'run_out' => '流量耗尽', - 'unused' => '未使用', - 'used' => '已使用', - 'closed' => '关闭', - 'applying' => '申请中', - 'withdrawn' => '已提现', - 'unwithdrawn' => '未提现', - 'reply' => '已回复', + 'normal' => '正常', + 'paid' => '已打款', + 'pass' => '通过', + 'payment_pending' => '待支付', 'pending' => '待处理', - 'unknown' => '未知', - 'available' => '生效中', + 'pending_dispatch' => '待投递', 'reject' => '否决', 'rejected' => '已驳回', + 'reply' => '已回复', 'review' => '待审核', 'reviewed' => '审核通过待打款', - 'paid' => '已打款', - 'payment_pending' => '待打款', - 'pass' => '通过', + 'run_out' => '流量耗尽', 'send_to_credit' => '打款至余额', - 'waiting_tobe_send' => '等待投递', + 'unknown' => '未知', + 'unused' => '未使用', + 'used' => '已使用', + 'withdrawal_pending' => '未提现', + 'withdrawn' => '已提现', ], 'stay_unchanged' => '留空为不变', - 'random_generate' => '留空则随机生成', - 'request_failed' => '请求错误,请重试', - 'convert' => '转换', - 'import' => '导入', - 'or' => '或', - 'more' => '更多', + 'storage_logo' => 'Logo存储', + 'store' => '存储', + 'submit' => '提交', + 'success' => '成功', + 'success_action_item' => ':action:attribute成功', + 'success_item' => ':attribute成功', 'to' => '至', 'to_be_send' => '待发送', - 'developing' => '开发中,敬请期待!', + 'to_safari' => '点击右上角,选择在SafariSafari 中打开
    即可正常访问本站!', + 'toggle' => '切换', + 'toggle_action' => '切换:action', + 'unlimited' => '无限制', + 'update' => '更新', + 'updated_at' => '更新时间', + 'view' => '查看', + 'warning' => '警告', ]; diff --git a/resources/lang/zh_CN/errors.php b/resources/lang/zh_CN/errors.php index f84cad0f..47f04482 100644 --- a/resources/lang/zh_CN/errors.php +++ b/resources/lang/zh_CN/errors.php @@ -8,29 +8,29 @@ return [ 'bots' => '检测到机器人访问,禁止访问', 'china' => '检测到中国IP或代理访问,禁止访问', 'oversea' => '检测到海外IP或代理访问,禁止访问', - 'unknown' => '未知禁止访问模式!请在系统设置中修改【禁止访问模式】!', 'redirect' => '识别到(:ip :url)通过订阅链接访问,强制重定向', + 'unknown' => '未知禁止访问模式!请在系统设置中修改【禁止访问模式】!', ], + 'get_ip' => '获取IP信息异常', 'log' => '日志', 'refresh' => '刷新', 'refresh_page' => '请刷新页面后,再访问', 'report' => '错❌误携带了报告:', - 'safe_enter' => '安全入口访问', 'safe_code' => '请输入安全码', + 'safe_enter' => '安全入口访问', + 'subscribe' => [ + 'banned_until' => '账号封禁至:time,请解封后再更新!', + 'expired' => '账号已过期,请续费!', + 'none' => '无可用节点', + 'out' => '流量耗尽,请重新购买或重置流量!', + 'question' => '账号存在问题,请前往官网查询!', + 'sub_banned' => '链接已被封禁,请前往官网查询原因', + 'unknown' => '使用了错误的链接,请重新获取链接!', + 'user' => '使用了错误的链接,账号不存在!请重新获取链接!', + 'user_disabled' => '账号被禁用!', + ], 'title' => '⚠️错误触发', 'unsafe_enter' => '非安全入口访问', 'visit' => '请访问', 'whoops' => '哎呦!', - 'get_ip' => '获取IP信息异常', - 'subscribe' => [ - 'unknown' => '使用了错误的链接,请重新获取链接!', - 'sub_banned' => '链接已被封禁,请前往官网查询原因', - 'user' => '使用了错误的链接,账号不存在!请重新获取链接!', - 'user_disabled' => '账号被禁用!', - 'banned_until' => '账号封禁至:time,请解封后再更新!', - 'out' => '流量耗尽,请重新购买或重置流量!', - 'expired' => '账号已过期,请续费!', - 'question' => '账号存在问题,请前往官网查询!', - 'none' => '无可用节点', - ], ]; diff --git a/resources/lang/zh_CN/model.php b/resources/lang/zh_CN/model.php index 81a717fe..98e1f374 100644 --- a/resources/lang/zh_CN/model.php +++ b/resources/lang/zh_CN/model.php @@ -3,105 +3,114 @@ declare(strict_types=1); return [ - 'user' => [ - 'id' => '用户ID', - 'attribute' => '用户', - 'nickname' => '昵称', - 'username' => '用户名', - 'password' => '密码', - 'credit' => '余额', - 'invite_num' => '可用邀请名额', - 'reset_date' => '流量重置日', - 'port' => '端口', - 'traffic_used' => '已用流量', - 'service' => '代理服务', - 'group' => '用户组', - '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' => '注册时间', + 'aff' => [ + 'amount' => '消费金额', + 'commission' => '返利', + 'created_at' => '下单时间', + 'invitee' => '消费者', + 'updated_at' => '处理时间', + ], + 'article' => [ + 'attribute' => '文章', + 'category' => '分类', + 'created_at' => '发布时间', + 'language' => '语言', + 'logo' => '封面', + 'updated_at' => '更新时间', ], 'common' => [ - 'extend' => '扩展信息', - 'sort' => '排序', 'description' => '描述', - 'type' => '类型', + 'extend' => '扩展信息', 'level' => '等级', + 'sort' => '排序', + 'type' => '类型', ], 'country' => [ 'code' => '国家/地区代码', 'icon' => '国旗', 'name' => '国家/地区名称', ], - 'subscribe' => [ - 'code' => '订阅码', - 'req_times' => '请求次数', - 'updated_at' => '最后请求时间', - 'ban_time' => '封禁时间', - 'ban_desc' => '封禁原因', - 'req_ip' => '请求IP', - 'req_header' => '请求头', - ], - 'oauth' => [ - 'type' => '渠道', - 'identifier' => '标识', - ], - 'user_group' => [ - 'attribute' => '用户组', + 'coupon' => [ + 'attribute' => '卡券', + 'groups' => '分组限制', + 'levels' => '等级限制', + 'logo' => '图片', + 'minimum' => '满减条件', 'name' => '名称', - 'nodes' => '节点', + 'newbie' => '新用户专享', + 'num' => '数量', + 'priority' => '权重', + 'services_blacklist' => '禁用商品', + 'services_whitelist' => '适用商品', + 'sn' => '卡号', + 'usable_times' => '使用次数', + 'used' => '个人限制', + 'users_blacklist' => '禁止用户', + 'users_whitelist' => '允许用户', + 'value' => '面值', + ], + 'goods' => [ + 'attribute' => '商品', + 'available_date' => '有效期', + 'category' => '分类', + 'color' => '颜色', + 'hot' => '热销', + 'info' => '自定义信息', + 'invite_num' => '赠送邀请码名额', + 'limit_num' => '限购数量', + 'logo' => '商品图片', + 'name' => '名称', + 'period' => '周期', + 'price' => '售价', + 'renew' => '流量重置价格', + 'traffic' => '流量', + 'user_limit' => '用户限速', + ], + 'ip' => [ + 'info' => '归属地', + 'network_type' => '网络类型', ], 'node' => [ 'attribute' => '节点', - 'id' => '节点 ID', - 'name' => '名称', - 'domain' => '域名', - 'static' => '存活状态', - 'online_user' => '在线人数', + 'client_limit' => '设备限制', + 'country' => '国家/地区', 'data_consume' => '产生流量', 'data_rate' => '流量计算系数', 'ddns' => 'DDNS', + 'detection' => '阻断检测', + 'display' => '显示与订阅', + 'domain' => '域名', + 'id' => '节点 ID', 'ipv4' => 'IPv4 地址', 'ipv6' => 'IPv6 地址', - 'push_port' => '推送端口', - 'rule_group' => '规则组', - 'traffic_limit' => '限速', - 'client_limit' => '设备限制', 'label' => '标签', - 'country' => '国家/地区', - 'udp' => 'UDP', - 'display' => '显示与订阅', - 'detection' => '阻断检测', 'method' => '加密方式', - 'protocol' => '协议', - 'protocol_param' => '协议参数', + 'name' => '名称', + 'next_renewal_date' => '下次续费日期', 'obfs' => '混淆', 'obfs_param' => '混淆参数', - 'single' => '单端口', - 'transfer' => '中继', + 'online_user' => '在线人数', + 'protocol' => '协议', + 'protocol_param' => '协议参数', + 'push_port' => '推送端口', + 'relay_port' => '中转端口', + 'renewal_cost' => '续费金额', 'service_port' => '服务端口', + 'single' => '单端口', 'single_passwd' => '单端口密码', + 'static' => '存活状态', + 'subscription_term' => '订阅周期', + 'traffic_limit' => '限速', + 'transfer' => '中继', + 'udp' => 'UDP', 'v2_alter_id' => '额外 ID', - 'v2_net' => '传输方式', 'v2_cover' => '伪装类型', 'v2_host' => '伪装域名', + 'v2_net' => '传输方式', 'v2_path' => '路径或密钥', 'v2_sni' => 'SNI', 'v2_tls' => 'TLS连接', 'v2_tls_provider' => 'TLS 配置', - 'relay_port' => '中转端口', ], 'node_auth' => [ 'attribute' => '节点授权', @@ -111,36 +120,44 @@ return [ 'node_cert' => [ 'attribute' => '证书', 'domain' => '域名', + 'expired_date' => '终止时间', + 'issuer' => '签发机构', 'key' => '密钥', 'pem' => '证书', - 'issuer' => '签发机构', 'signed_date' => '颁发时间', - 'expired_date' => '终止时间', + ], + 'notification' => [ + 'address' => '收件地址', + 'created_at' => '投递时间', + 'status' => '状态', + ], + 'oauth' => [ + 'identifier' => '标识', + 'type' => '渠道', ], 'order' => [ 'attribute' => '订单', 'id' => '订单号', 'original_price' => '原价', - 'price' => '实付', 'pay_way' => '支付方式', + 'price' => '实付', 'status' => '状态', ], - 'goods' => [ - 'attribute' => '商品', + 'permission' => [ + 'attribute' => '权限', + 'description' => '描述', + 'name' => '路由名称', + ], + 'referral' => [ + 'amount' => '申请金额', + 'created_at' => '申请时间', + 'id' => '申请单号', + 'user' => '申请账号', + ], + 'role' => [ + 'attribute' => '角色', 'name' => '名称', - 'price' => '售价', - 'category' => '分类', - 'renew' => '流量重置价格', - 'user_limit' => '用户限速', - 'period' => '周期', - 'traffic' => '流量', - 'invite_num' => '赠送邀请码名额', - 'limit_num' => '限购数量', - 'available_date' => '有效期', - 'hot' => '热销', - 'color' => '颜色', - 'logo' => '商品图片', - 'info' => '自定义信息', + 'permissions' => '权限', ], 'rule' => [ 'attribute' => '规则', @@ -150,83 +167,67 @@ return [ 'rule_group' => [ 'attribute' => '规则组', 'name' => '名称', - 'type' => '模式', 'rules' => '规则', + 'type' => '模式', ], - 'role' => [ - 'attribute' => '角色', - 'name' => '名称', - 'permissions' => '权限', + 'subscribe' => [ + 'ban_desc' => '封禁原因', + 'ban_time' => '封禁时间', + 'code' => '订阅码', + 'req_header' => '请求头', + 'req_ip' => '请求IP', + 'req_times' => '请求次数', + 'updated_at' => '最后请求时间', ], - 'permission' => [ - 'attribute' => '权限', - 'description' => '描述', - 'name' => '路由名称', - ], - 'article' => [ - 'attribute' => '文章', - 'category' => '分类', - 'language' => '语言', - 'logo' => '封面', - 'created_at' => '发布时间', - 'updated_at' => '更新时间', - ], - 'coupon' => [ - 'attribute' => '卡券', - 'name' => '名称', - 'sn' => '卡号', - 'logo' => '图片', - 'value' => '面值', - 'priority' => '权重', - 'usable_times' => '使用次数', - 'minimum' => '满减条件', - 'used' => '个人限制', - 'levels' => '等级限制', - 'groups' => '分组限制', - 'users_whitelist' => '允许用户', - 'users_blacklist' => '禁止用户', - 'services_whitelist' => '适用商品', - 'services_blacklist' => '禁用商品', - 'newbie' => '新用户专享', - 'num' => '数量', - ], - 'aff' => [ - 'invitee' => '消费者', - 'amount' => '消费金额', - 'commission' => '返利', - 'updated_at' => '处理时间', - 'created_at' => '下单时间', - ], - 'referral' => [ - 'created_at' => '申请时间', - 'user' => '申请账号', - 'amount' => '申请金额', - 'id' => '申请单号', - ], - 'notification' => [ - 'address' => '收件地址', - 'created_at' => '投递时间', - 'status' => '状态', - ], - 'ip' => [ - 'network_type' => '网络类型', - 'info' => '归属地', - ], - 'user_traffic' => [ - 'upload' => '上传流量', - 'download' => '下载流量', - 'total' => '总流量', - 'log_time' => '记录时间', - ], - 'user_data_modify' => [ - 'before' => '变更前流量', - 'after' => '变更后流量', - 'created_at' => '变更时间', + 'user' => [ + 'account_status' => '账号状态', + 'attribute' => '用户', + 'created_date' => '注册时间', + 'credit' => '余额', + 'expired_date' => '过期时间', + 'id' => '用户ID', + 'invite_num' => '可用邀请名额', + 'inviter' => '邀请人', + 'nickname' => '昵称', + 'password' => '密码', + 'port' => '端口', + 'proxy_method' => '加密方式', + 'proxy_obfs' => '混淆方式', + 'proxy_passwd' => '代理密码', + 'proxy_protocol' => '代理协议', + 'proxy_status' => '代理状态', + 'qq' => 'QQ', + 'remark' => '备注', + 'reset_date' => '流量重置日', + 'role' => '用户角色', + 'service' => '代理服务', + 'speed_limit' => '速度限制', + 'traffic_used' => '已用流量', + 'usable_traffic' => '可用流量', + 'username' => '用户名', + 'uuid' => 'VMess UUID', + 'wechat' => '微信', ], 'user_credit' => [ - 'before' => '变更前余额', 'after' => '变更后余额', 'amount' => '变更金额', + 'before' => '变更前余额', 'created_at' => '变更时间', ], + 'user_data_modify' => [ + 'after' => '变更后流量', + 'before' => '变更前流量', + 'created_at' => '变更时间', + ], + 'user_group' => [ + 'attribute' => '用户组', + 'name' => '名称', + 'nodes' => '节点', + ], + 'user_traffic' => [ + 'download' => '下载流量', + 'log_time' => '记录时间', + 'total' => '总流量', + 'upload' => '上传流量', + ], ]; diff --git a/resources/lang/zh_CN/notification.php b/resources/lang/zh_CN/notification.php index 48b80c26..0d5b6026 100644 --- a/resources/lang/zh_CN/notification.php +++ b/resources/lang/zh_CN/notification.php @@ -3,35 +3,49 @@ declare(strict_types=1); return [ - 'attribute' => '通知', - 'new' => '您有:num条新消息', - 'empty' => '您当前没有新消息', - 'payment_received' => '您的订单支付成功,金额为:amount,请点击查看订单详情', 'account_expired' => '账号过期提醒', - 'account_expired_content' => '您的账号将在:days天后过期,请及时续费以避免影响正常使用', - 'account_expired_blade' => '您的账号将于:days天后过期,请及时续费', + 'account_expired_blade' => '您的账号将在 :days 天后过期,请及时续费', + 'account_expired_content' => '您的账号将在 :days 天后过期。请及时续费,以确保您的服务不中断', 'active_email' => '请在30分钟内完成验证', + 'attribute' => '通知', + 'block_report' => '详细阻断日志:', 'close_ticket' => '工单编号:id,标题:title已被关闭', - 'view_web' => '访问我们的官网', - 'view_ticket' => '查看此工单进度', + 'data_anomaly' => '流量异常用户提醒', + 'data_anomaly_content' => '用户:id,最近1小时流量(上传:upload,下载:download,总计:total)', + 'details' => '查看详情', + 'details_btn' => '请点击下方按钮【查看详情】', + 'ding_bot_limit' => '每个机器人每分钟最多发送20条消息到群里,如果超过20条,会限流10分钟。', + 'empty' => '您当前没有新消息', + 'error' => '[:channel] 消息推送异常: :reason', + 'get_access_token_failed' => '获取access_token失败!\n携带访问参数: :body', + 'into_maintenance' => '自动进入维护状态', + 'new' => '您有:num条新消息', 'new_ticket' => '您的工单:title收到新的回复,请前往查看', - 'reply_ticket' => '工单回复::title', - 'ticket_content' => '工单内容:', + 'next_check_time' => '下次节点阻断检测时间::time', + 'node' => [ + 'download' => '下载流量', + 'total' => '总流量', + 'upload' => '上传流量', + ], 'node_block' => '节点阻断警告通知', 'node_offline' => '节点离线警告', 'node_offline_content' => '以下节点异常,可能已经离线:', - 'block_report' => '详细阻断日志:', - 'traffic_warning' => '流量使用提醒', + 'node_renewal' => '节点续费提醒', + 'node_renewal_blade' => '节点即将到期,请及时续费::nodes', + 'node_renewal_content' => '以下节点即将到期,请在到期前续费,以避免服务中断。', + 'payment_received' => '您的订单支付成功,金额为:amount,请点击查看订单详情', + 'reply_ticket' => '工单回复::title', + 'reset_failed' => '[每日任务]用户:uid - :username 流量重置失败', + 'serverChan_exhausted' => '今日限额已耗尽!', + 'serverChan_limit' => '分钟频率过高,请优化通知场景!', + 'sign_failed' => '安全签名验证失败', + 'ticket_content' => '工单内容:', 'traffic_remain' => '您的流量已使用:percent%,请合理安排使用', 'traffic_tips' => '请注意流量重置日,合理使用流量或在耗尽后充值', - 'verification_account' => '账号验证通知', + 'traffic_warning' => '流量使用提醒', 'verification' => '您的验证码为:', + 'verification_account' => '账号验证通知', 'verification_limit' => '请在:minutes分钟内完成验证', - 'data_anomaly' => '流量异常用户提醒', - 'data_anomaly_content' => '用户:id,最近1小时流量(上传:upload,下载:download,总计:total)', - 'node' => [ - 'upload' => '上传流量', - 'download' => '下载流量', - 'total' => '总流量', - ], + 'view_ticket' => '查看此工单进度', + 'view_web' => '访问我们的官网', ]; diff --git a/resources/lang/zh_CN/setup.php b/resources/lang/zh_CN/setup.php new file mode 100644 index 00000000..c346b363 --- /dev/null +++ b/resources/lang/zh_CN/setup.php @@ -0,0 +1,10 @@ + '检测到您在DEMO模式, 是否重置数据库?', + 'update_cache' => '更新缓存...', + 'update_complete' => '更新完毕!', + 'update_db' => '更新数据库...', +]; diff --git a/resources/lang/zh_CN/user.php b/resources/lang/zh_CN/user.php index b6f3ae8a..2543bde6 100644 --- a/resources/lang/zh_CN/user.php +++ b/resources/lang/zh_CN/user.php @@ -4,234 +4,273 @@ declare(strict_types=1); return [ 'account' => [ - 'credit' => '账户余额', - 'status' => '账号状态', - 'level' => '账号等级', - 'group' => '所属分组', - 'speed_limit' => '限速', - 'remain' => '剩余流量', - 'time' => '套餐有效期', - 'last_login' => '最近登录', - 'reset' => '{0} 还有 :days 重置流量|[1,*] 还有 :days 天重置流量', 'connect_password' => '代理连接密码', + 'credit' => '账户余额', + 'group' => '所属分组', + 'last_login' => '最近登录', + 'level' => '账号等级', 'reason' => [ - 'normal' => '账号一切正常', 'expired' => '账号套餐已过期', + 'normal' => '账号一切正常', 'overused' => '本时段使用流量超过 :data GB,触发限制
    :min 后解除', 'traffic_exhausted' => '套餐流量已用完', 'unknown' => '未知原因,请刷新浏览器后重试。如问题持续,请联系客服', ], + 'remain' => '剩余流量', + 'reset' => '{0} 还有 :days 重置流量|[1,*] 还有 :days 天重置流量', + 'speed_limit' => '限速', + 'status' => '账号状态', + 'time' => '套餐有效期', ], + 'attribute' => [ + 'address' => '地区', + 'data' => '流量', + 'ip' => 'IP地址', + 'isp' => '运营商', + 'node' => '线路', + ], + 'bought_at' => '购买日期', + 'clients' => '客户端', + 'contact' => '联系方式', + 'coupon' => [ + 'discount' => '优惠', + 'error' => [ + 'expired' => '优惠券已过期', + 'inactive' => '优惠券尚未生效', + 'minimum' => '本券最低使用金额为 :amount', + 'overused' => '本券只能使用 :times 次', + 'run_out' => '优惠券已用完', + 'services' => '商品不符合折扣条件,请查看促销条款', + 'unknown' => '无效优惠券', + 'unmet' => '不满足使用条件', + 'used' => '优惠券已被使用', + 'users' => '账户不符合促销条件', + 'wait' => '活动将于 :time 生效,请耐心等待!', + ], + 'input' => '请输入充值券码', + ], + 'current_role' => '当前身份', + 'error_response' => '出现了错误,请稍后再试。', 'home' => [ + 'announcement' => '公告', 'attendance' => [ 'attribute' => '签到', 'disable' => '系统未开启签到功能', 'done' => '今天已经签到过了,请明天再试!', - 'success' => '签到成功,获得 :data 流量', 'failed' => '系统❌异常', + 'success' => '签到成功,获得 :data 流量', ], - 'traffic_logs' => '流量记录', - 'announcement' => '公告', - 'wechat_push' => '微信公告推送', - 'chat_group' => '聊天群', + 'chat_group' => '聊天群组', 'empty_announcement' => '暂无公告', + 'traffic_logs' => '流量记录', + 'wechat_push' => '微信推送', ], - 'purchase_to_unlock' => '购买服务', - 'purchase_required' => '此功能仅限付费用户,请先', - 'attribute' => [ - 'node' => '线路', - 'data' => '流量', - 'ip' => 'IP地址', - 'isp' => '运营商', - 'address' => '地区', + 'invite' => [ + 'attribute' => '邀请码', + 'counts' => '共计 :num 枚邀请码', + 'generate_failed' => '生成失败:已无邀请码生成名额', + 'logs' => '邀请记录', + 'promotion' => '通过您的邀请码注册并激活,您和受邀用户将获得 :traffic 流量奖励;当他们消费时,您将获得他们消费金额的 :referral_percent% 作为奖励。', + 'tips' => '剩余 :num 枚可用邀请名额,邀请码创建后 :days 天内有效', + ], + 'invitee' => '受邀者', + 'inviter' => '邀请者', + 'invoice' => [ + 'active_prepaid_question' => '是否提前启用预付套餐?', + 'active_prepaid_tips' => '启用后:
    现有账号套餐将失效
    账号过期日期将重新计算', + 'amount' => '金额', + 'attribute' => '订单', + 'detail' => '消费记录', + ], + 'knowledge' => [ + 'basic' => '基础', + 'title' => '知识库', ], - 'purchase_promotion' => '快来购买服务吧!', 'menu' => [ + 'admin_dashboard' => '管理', 'help' => '帮助', 'home' => '主页', 'invites' => '邀请', 'invoices' => '账单', 'nodes' => '线路', + 'profile' => '设置', 'promotion' => '推广', 'shop' => '服务', - 'profile' => '设置', 'tickets' => '工单', - 'admin_dashboard' => '管理', ], - 'contact' => '联系方式', + 'node' => [ + 'info' => '配置信息', + 'rate' => ':ratio 倍流量消耗', + 'setting' => '代理设置', + 'unstable' => '线路波动中/维护中', + ], 'oauth' => [ + 'bind' => '绑定', 'bind_title' => '绑定社交账号', 'not_bind' => '尚未绑定', - 'bind' => '绑定', 'rebind' => '重新绑定', 'unbind' => '解绑', ], - 'coupon' => [ - 'discount' => '优惠', - 'error' => [ - 'unknown' => '无效优惠券', - 'used' => '优惠券已被使用', - 'expired' => '优惠券已过期', - 'run_out' => '优惠券已用完', - 'inactive' => '优惠券尚未生效', - 'wait' => '活动将于 :time 生效,请耐心等待!', - 'unmet' => '不满足使用条件', - 'minimum' => '本券最低使用金额为 :amount', - 'overused' => '本券只能使用 :times 次', - 'users' => '账户不符合促销条件', - 'services' => '商品不符合折扣条件,请查看促销条款', + 'pay' => '支付', + 'payment' => [ + 'close_tips' => '请在 :minutes 分钟内完成支付,否则订单将被取消', + 'creating' => '正在创建支付订单...', + 'error' => '充值金额不合法', + 'insufficient_balance' => '您的余额不足,请先充值', + 'manual' => [ + 'hint' => '扫码支付后,请按顺序点击【下一步】,直到点击【提交】完成支付', + 'next' => '下一步', + 'payment_tips' => '支付时,请充值对应金额(多不退,少需补)', + 'pre' => '上一步', + 'red_packet' => '支付宝领红包', + 'steps' => [ + 'complete' => [ + 'description' => '等待支付人工核对', + 'title' => '完成', + ], + 'notice' => [ + 'description' => '如何正确人工支付', + 'title' => '须知', + ], + 'payment' => [ + 'description' => '获取支付二维码,进行支付', + 'title' => '支付', + ], + 'remark' => [ + 'description' => '填写登录账号,以便人工核对', + 'title' => '备注账号', + ], + ], ], + 'method' => '支付方式', + 'mobile_tips' => '手机用户:长按二维码 -> 保存图片 -> 打开支付应用 -> 扫一扫 -> 选择相册 -> 选择图片付款', + 'order_creation' => [ + 'failed' => '创建订单失败,请尝试其他支付方式!', + 'info' => '我们将在【24小时】内对购买/充值的款项进行开通!请耐心等待', + 'order_limit' => '此商品限购 :limit_num 次,您已购买 :count 次', + 'order_timeout' => '订单超时未支付,已自动关闭', + 'payment_disabled' => '订单创建失败:系统未开启在线支付功能', + 'pending_order' => '订单创建失败:尚有未支付的订单,请先完成支付', + 'plan_required' => '购买加油包前,请先购买套餐', + 'price_issue' => '订单创建失败:订单总价异常', + 'price_zero' => '订单创建失败:订单总价为0,无需使用在线支付', + 'product_unavailable' => '订单创建失败:商品已下架', + 'success' => '创建订单成功!', + 'unknown_order' => '未知订单', + 'unknown_payment' => '未知支付方式', + ], + 'qrcode_tips' => '请使用 :software 扫描此二维码', + 'redirect_stripe' => '跳转至 Stripe 支付界面', ], - 'error_response' => '出现了错误,请稍后再试。', - 'invite' => [ - 'attribute' => '邀请码', - 'counts' => '共计 :num 枚邀请码', - 'tips' => '剩余 :num 枚可用邀请名额,邀请码创建后 :days 天内有效', - 'logs' => '邀请记录', - 'promotion' => '通过您的邀请码注册并激活,您和受邀用户将获得 :traffic 流量奖励;当他们消费时,您将获得他们消费金额的 :referral_percent% 作为奖励。', - 'generate_failed' => '生成失败:已无邀请码生成名额', + 'purchase' => [ + 'completed' => '购买完成!', + 'promotion' => '快来购买服务吧!', + 'required' => '此功能仅限付费用户,请先', + 'to_unlock' => '购买服务解锁', ], + 'recharge' => '充值', + 'recharge_credit' => '余额充值', + 'recharging' => '充值中...', + 'referral' => [ + 'link' => '推广链接', + 'logs' => '佣金记录', + 'msg' => [ + 'account' => '账号已过期,请先购买服务', + 'applied' => '已有申请,请等待之前的申请处理完', + 'error' => '返利单建立失败,请稍后尝试或联系管理员', + 'unfulfilled' => '满 :amount 才可提现,请继续努力', + 'wait' => '请等待管理员审核', + ], + 'total' => '合计返利 :amount(:total 次),满 :money 可提现。', + ], + 'registered_at' => '注册时间', 'reset_data' => [ 'action' => '重置流量', 'cost' => '需要 :amount', 'cost_tips' => '本次重置流量将扣除余额 :amount!', - 'insufficient' => '余额不足,请充值余额', - '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' => '请使用客户端扫描二维码', + 'service' => [ + 'country_count' => '覆盖 :num 个国家或地区', + 'node_count' => ':num 条优质线路', + 'unlimited' => '不限速', + ], 'shop' => [ - 'hot' => '热销', - 'limited' => '限购', + 'buy' => '购买', + 'call4help' => '如有疑问请开工单联系客服', 'change_amount' => '充值金额', 'change_amount_help' => '请输入充值金额', - 'buy' => '购买', + 'conflict' => '套餐冲突', + 'conflict_tips' => '

    当前购买套餐将设置为 预付套餐

    1. 预付套餐将在当前套餐失效后自动生效
    2. 您也可以在支付后在订单页面手动激活预付套餐
    ', 'description' => '描述', - 'service' => '服务', + 'hot' => '热销', + 'limited' => '限购', 'pay_credit' => '余额支付', 'pay_online' => '在线支付', 'price' => '价格', 'quantity' => '数量', + 'service' => '服务', 'subtotal' => '小计', 'total' => '合计', - 'conflict' => '套餐冲突', - 'conflict_tips' => '

    当前购买套餐将设置为 预付套餐

    1. 预付套餐将在当前套餐失效后自动生效
    2. 您也可以在支付后在订单页面手动激活预付套餐
    ', - 'call4help' => '如有疑问请开工单联系客服', - ], - 'service' => [ - 'node_count' => ':num 条优质线路', - 'country_count' => '覆盖 :num 个国家或地区', - 'unlimited' => '不限速', - ], - 'payment' => [ - 'error' => '充值金额不合法', - 'creating' => '创建支付单中...', - 'redirect_stripe' => '跳转至 Stripe 支付界面', - 'qrcode_tips' => '请使用 :software 扫描二维码', - 'close_tips' => '请在 :minutes 分钟内完成支付,否则订单将被取消', - 'mobile_tips' => '手机用户:长按二维码 -> 保存图片 -> 打开支付软件 -> 扫一扫 -> 选择相册 -> 选择照片进行付款', - ], - 'invoice' => [ - 'attribute' => '订单', - 'detail' => '消费记录', - 'amount' => '金额', - 'active_prepaid_question' => '是否提前启用预付套餐?', - 'active_prepaid_tips' => '启用后:
    现有账号套餐将失效
    账号过期日期将重新计算', - ], - 'node' => [ - 'info' => '配置信息', - 'setting' => '代理设置', - 'unstable' => '线路波动中/维护中', - 'rate' => ':ratio 倍流量消耗', ], 'subscribe' => [ - 'link' => '订阅链接', - 'tips' => '警告:该订阅链接仅限个人使用,请勿传播,否则将导致账号流量异常并触发封号机制。', - 'exchange_warning' => '更换订阅地址将导致:\n1.旧地址立即失效\n2.连接密码被更改', 'custom' => '自定义订阅', + 'error' => '更换订阅地址失败', + 'exchange_warning' => '更换订阅地址将导致:\n1.旧地址立即失效\n2.连接密码被更改', + 'info' => [ + 'download' => '已用下行', + 'title' => '账户摘要 [非实时]', + 'total' => '套餐流量', + 'upload' => '已用上行', + ], + 'link' => '订阅链接', 'ss_only' => '只订阅SS', 'ssr_only' => '只订阅SSR(包含SS)', - 'v2ray_only' => '只订阅V2Ray', + 'tips' => '警告:该订阅链接仅限个人使用,请勿传播,否则将导致账号流量异常并触发封号机制。', 'trojan_only' => '只订阅Trojan', - 'error' => '更换订阅地址失败', - 'info' => [ - 'title' => '账号摘要 [非实时]', - 'upload' => '上传流量', - 'download' => '下载流量', - 'total' => '套餐流量', + 'v2ray_only' => '只订阅V2Ray', + ], + 'telegram' => [ + 'bind_exists' => '该账号已经绑定了Telegram账号', + 'bind_missing' => '没有查询到您的用户信息,请先绑定账号', + 'command' => [ + 'bind' => '绑定你的:web_name账号', + 'intro' => '你可以使用以下指令', + 'traffic' => '查询流量信息', + 'unbind' => '解除绑定', + 'web_url' => '获取最新:web_name网址', ], + 'get_url' => ':web_name的最新网址是', + 'params_missing' => '参数有误,请携带邮箱地址发送', + 'ticket_missing' => '工单不存在', + 'ticket_reply' => '#`:id` 工单回复成功', + 'traffic_query' => '流量查询', + 'user_missing' => '用户不存在', ], 'ticket' => [ 'attribute' => '工单', - 'submit_tips' => '确定提交工单吗?', - 'reply_confirm' => '确定回复工单吗?', - 'close_tips' => '确定要关闭该工单吗?', - 'close' => '关闭工单', - 'failed_closed' => '错误:该工单已关闭', - 'reply_placeholder' => '说点什么吧?', - 'reply' => '回复', 'close_msg' => '工单:ID:id 用户已手动关闭', - 'title_placeholder' => '请简单描述您的问题类型或涉及的内容', + 'close_tips' => '确定要关闭该工单吗?', 'content_placeholder' => '请详细描述您的问题或需要帮助的地方,以便我们快速解决', - 'new' => '创建新工单', - 'service_hours' => '客服工作时间', - 'online_hour' => '在线时间', - 'service_tips' => '本站有多种联系方式,请使用其中 一种 联系客服!
    重复请求会影响客服处理。', 'error' => '出现未知错误,请联系客服处理', + 'new' => '创建新工单', + 'online_hour' => '在线时间', + 'reply' => '回复', + 'reply_confirm' => '确定回复工单吗?', + 'reply_placeholder' => '说点什么吧?', + 'service_hours' => '客服工作时间', + 'service_tips' => '本站有多种联系方式,请使用其中 一种 联系客服!
    重复请求会影响客服处理。', + 'submit_tips' => '确定提交工单吗?', + 'title_placeholder' => '请简单描述您的问题类型或涉及的内容', ], 'traffic_logs' => [ - 'hourly' => '今日流量使用情况', 'daily' => '本月流量使用情况', + 'hourly' => '今日流量使用情况', 'tips' => '提示:流量统计更新有一定延迟。', ], - 'clients' => '客户端', 'tutorials' => '教程', - 'current_role' => '当前身份', - 'knowledge' => [ - 'title' => '知识库', - 'basic' => '基础', - ], - 'manual' => [ - 'red_packet' => '支付宝领红包', - 'hint' => '扫码支付后,请依次点击【下一步】,直到点击【提交】才算正式支付完成哦!', - 'step_1' => '须知', - 'step_1_title' => '如何正确人工支付', - 'step_2' => '支付', - 'step_2_title' => '获取支付二维码,进行支付', - 'step_3' => '完成', - 'step_3_title' => '等待支付被人工核对', - 'remark' => '备注账号', - 'remark_content' => '填写登录账号,以便人工核对时准确审核', - 'payment_hint' => '支付时,请充值对应金额(多不退,少需补)', - 'pre' => '上一步', - 'next' => '下一步', - ], + 'withdraw' => '提现', + 'withdraw_at' => '提现日期', + 'withdraw_commission' => '提取佣金', + 'withdraw_logs' => '提现记录', ]; diff --git a/resources/views/_layout.blade.php b/resources/views/_layout.blade.php index abe97511..0e26da74 100644 --- a/resources/views/_layout.blade.php +++ b/resources/views/_layout.blade.php @@ -14,7 +14,7 @@ - + @yield('layout_css') diff --git a/resources/views/admin/aff/rebate.blade.php b/resources/views/admin/aff/rebate.blade.php index 95abf492..ecdb34f1 100644 --- a/resources/views/admin/aff/rebate.blade.php +++ b/resources/views/admin/aff/rebate.blade.php @@ -18,7 +18,7 @@
    @@ -67,15 +67,7 @@ {{ $referralLog->commission }} {{ $referralLog->created_at }} {{ $referralLog->updated_at }} - - @if ($referralLog->status === 1) - {{ trans('common.status.applying') }} - @elseif($referralLog->status === 2) - {{ trans('common.status.withdrawn') }} - @else - {{ trans('common.status.unwithdrawn') }} - @endif - + {!! $referralLog->status_label !!} @endforeach diff --git a/resources/views/admin/article/marketing.blade.php b/resources/views/admin/article/marketing.blade.php index 37ac6f4a..3922d41f 100644 --- a/resources/views/admin/article/marketing.blade.php +++ b/resources/views/admin/article/marketing.blade.php @@ -185,7 +185,7 @@ @if ($userGroups)
    + title="{{ trans('model.user_group.attribute') }}"> @foreach ($userGroups as $key => $group) @endforeach @@ -235,7 +235,7 @@ // 批量生成账号 function batchAddUsers() { swal.fire({ - title: '{{ trans('admin.user.massive.text') }}', + title: '{{ trans('admin.user.bulk_account_quantity') }}', input: 'range', inputAttributes: { min: 1, diff --git a/resources/views/admin/user/info.blade.php b/resources/views/admin/user/info.blade.php index 2afb81e4..b981a6ad 100644 --- a/resources/views/admin/user/info.blade.php +++ b/resources/views/admin/user/info.blade.php @@ -53,7 +53,7 @@
    - +
    diff --git a/resources/views/components/payment/detail.blade.php b/resources/views/components/payment/detail.blade.php index 4dc704dc..d4b61f1a 100644 --- a/resources/views/components/payment/detail.blade.php +++ b/resources/views/components/payment/detail.blade.php @@ -41,7 +41,7 @@ {{ trans('model.order.price') }}: {{ $order->origin_amount_tag }}
  • - {{ trans('user.payment_method') }}: + {{ trans('user.payment.method') }}: {{ $order->pay_way === 1 ? trans('user.shop.pay_credit') : trans('user.shop.pay_online') }}
  • diff --git a/resources/views/user/components/payment/manual.blade.php b/resources/views/user/components/payment/manual.blade.php index 0b9499df..1674d75b 100644 --- a/resources/views/user/components/payment/manual.blade.php +++ b/resources/views/user/components/payment/manual.blade.php @@ -64,7 +64,7 @@ @section('content')
    @@ -75,28 +75,28 @@
    -

    {{ trans('user.manual.hint') }}

    +

    {{ trans('user.payment.manual.hint') }}

    1
    - {{ trans('user.manual.step_1') }} -

    {{ trans('user.manual.step_1_title') }}

    + {{ trans('user.payment.manual.steps.notice.title') }} +

    {{ trans('user.payment.manual.steps.notice.description') }}

    2
    - {{ trans('user.manual.step_2') }} -

    {{ trans('user.manual.step_2_title') }}

    + {{ trans('user.payment.manual.steps.payment.title') }} +

    {{ trans('user.payment.manual.steps.payment.description') }}

    3
    - {{ trans('user.manual.step_3') }} -

    {{ trans('user.manual.step_3_title') }}

    + {{ trans('user.payment.manual.steps.complete.title') }} +

    {{ trans('user.payment.manual.steps.complete.description') }}

    @@ -114,17 +114,17 @@
    -

    {{ trans('user.manual.remark') }}

    +

    {{ trans('user.payment.manual.steps.remark.title') }}

    -

    {{ trans('user.manual.remark_content') }}

    +

    {{ trans('user.payment.manual.steps.remark.description') }}

    -

    {{ trans('user.manual.remark') }}

    +

    {{ trans('user.payment.manual.steps.remark.title') }}

    -

    {{ trans('user.manual.remark_content') }}

    +

    {{ trans('user.payment.manual.steps.remark.description') }}

    @@ -154,7 +154,7 @@
    - {{ trans('user.manual.payment_hint') }} + {{ trans('user.payment.manual.payment_tips') }}
      @@ -168,8 +168,10 @@
    - - + +
    @@ -200,7 +202,7 @@ document.getElementById('nextBtn').innerHTML = '{{ trans('common.submit') }}'; } else { document.getElementById('payment-group').style.display = 'inline-flex'; - document.getElementById('nextBtn').innerHTML = '下一步'; + document.getElementById('nextBtn').innerHTML = '{{ trans('user.payment.manual.next') }}'; document.getElementById('nextBtn').classList.remove('btn-success'); document.getElementById('nextBtn').classList.add('btn-primary'); document.getElementById('nextBtn').style.display = 'inline'; @@ -220,7 +222,6 @@ }, function(ret) { if (ret.status === 'success') { swal.fire({ - title: '已受理', text: ret.message, icon: 'success', }).then(() => window.location.href = '{{ route('invoice') }}'); diff --git a/resources/views/user/index.blade.php b/resources/views/user/index.blade.php index d34b37ce..bbb69098 100644 --- a/resources/views/user/index.blade.php +++ b/resources/views/user/index.blade.php @@ -34,7 +34,7 @@

    {{ trans('common.more') }} {{ trans('user.attribute.node') }}

    - {{ trans('user.purchase_promotion') }} + {{ trans('user.purchase.promotion') }} @elseif(Auth::user()->enable) {{ trans('common.status.normal') }} @@ -232,7 +232,7 @@
    @else @endif
    diff --git a/resources/views/user/invoiceDetail.blade.php b/resources/views/user/invoiceDetail.blade.php index fd1de413..886947e8 100644 --- a/resources/views/user/invoiceDetail.blade.php +++ b/resources/views/user/invoiceDetail.blade.php @@ -19,7 +19,7 @@

    {{ trans('model.order.id') }} :{{ $order->sn }}

    -

    {{ trans('user.payment_method') }} +

    {{ trans('user.payment.method') }} : {{ $order->pay_way === 1 ? trans('user.shop.pay_credit') : trans('user.shop.pay_online') }}

    {{ trans('user.bought_at') }}: {{ $order->created_at }}

    @if ($order->expired_at) diff --git a/resources/views/user/invoices.blade.php b/resources/views/user/invoices.blade.php index 62fdd7d1..9818d1e3 100644 --- a/resources/views/user/invoices.blade.php +++ b/resources/views/user/invoices.blade.php @@ -21,7 +21,7 @@ # {{ trans('model.order.id') }} {{ trans('user.shop.service') }} - {{ trans('user.payment_method') }} + {{ trans('user.payment.method') }} {{ trans('user.invoice.amount') }} {{ trans('user.bought_at') }} {{ trans('common.expired_at') }} diff --git a/resources/views/user/replyTicket.blade.php b/resources/views/user/replyTicket.blade.php index a6f83253..e5837764 100644 --- a/resources/views/user/replyTicket.blade.php +++ b/resources/views/user/replyTicket.blade.php @@ -50,7 +50,7 @@ // 关闭工单 function closeTicket() { swal.fire({ - title: '{{ trans('user.ticket.close') }}', + title: '{{ trans('common.close_item', ['attribute' => trans('user.ticket.attribute')]) }}', text: '{{ trans('user.ticket.close_tips') }}', icon: 'question', showCancelButton: true, diff --git a/resources/views/user/services.blade.php b/resources/views/user/services.blade.php index c2fa2bf4..7afcf4b2 100644 --- a/resources/views/user/services.blade.php +++ b/resources/views/user/services.blade.php @@ -131,7 +131,7 @@
    + placeholder="{{ trans('user.coupon.input') }}">