Преглед на файлове

🤖 Touching up English translation files with Claude2

BrettonYe преди 2 години
родител
ревизия
793eb3a755

+ 422 - 421
resources/lang/en/admin.php

@@ -1,25 +1,27 @@
 <?php
 
+declare(strict_types=1);
+
 return [
     'dashboard' => [
-        'users' => 'All Users',
+        'users' => 'Total Users',
         'available_users' => 'Active Users',
         'paid_users' => 'Paying Users',
-        'active_days_users' => 'Active Users Within :days Days',
-        'inactive_days_users' => 'Inactive Users Over :days Days',
-        'online_users' => 'Current Online Users',
-        'expiring_users' => 'Near Due Date',
-        'overuse_users' => 'Overuse (used ≥ 90% traffic)',
-        'abnormal_users' => 'Abnormal Traffic (last 1 hour)',
+        'active_days_users' => 'Active Users in Last :days Days',
+        'inactive_days_users' => 'Inactive Users for Over :days Days',
+        'online_users' => 'Online Now',
+        'expiring_users' => 'Expiring Soon',
+        'overuse_users' => 'Data Overuse [≥90%] Users',
+        'abnormal_users' => 'Abnormal Traffic in Past Hour',
         'nodes' => 'Nodes',
-        'maintaining_nodes' => 'Nodes Under Maintenance',
-        'current_month_traffic_consumed' => 'Current Month Traffic Consumed',
-        'days_traffic_consumed' => 'Traffic Consumed Within :days Days',
-        'orders' => 'Orders',
-        'online_orders' => 'Online Orders',
-        'succeed_orders' => 'Successful Orders',
-        'credit' => 'Total Balance',
-        'withdrawing_commissions' => 'Pending Commissions Withdrawal',
+        'maintaining_nodes' => 'Maintenance Mode Nodes',
+        'current_month_traffic_consumed' => 'Traffic Used This Month',
+        'days_traffic_consumed' => 'Traffic Used in Past :days Days',
+        'orders' => 'Total Orders',
+        'online_orders' => 'Online Payment Orders',
+        'succeed_orders' => 'Paid Orders',
+        'credit' => 'Total Credit',
+        'withdrawing_commissions' => 'Pending Commissions',
         'withdrawn_commissions' => 'Withdrawn Commissions',
     ],
     'action' => [
@@ -27,9 +29,9 @@ return [
         'add_item' => 'Add :attribute',
     ],
     'confirm' => [
-        'delete' => [0 => 'Do you want to delete :attribute [', 1 => '] ?'],
-        'continues' => 'Do you want to continue?',
-        'export' => 'Do you want to export all?',
+        'delete' => [0 => 'Confirm Delete :attribute [', 1 => ']?'],
+        'continues' => 'Confirm to continue?',
+        'export' => 'Confirm to export all?',
     ],
     'user_dashboard' => 'User Dashboard',
     'menu' => [
@@ -39,8 +41,8 @@ return [
             'list' => 'User Management',
             'oauth' => 'OAuth',
             'group' => 'User Groups',
-            'credit_log' => 'Balance History',
-            'subscribe' => 'Subscription Requests',
+            'credit_log' => 'Credit History',
+            'subscribe' => 'Subscriptions',
         ],
         'rbac' => [
             'attribute' => 'RBAC',
@@ -50,36 +52,36 @@ return [
         'customer_service' => [
             'attribute' => 'Helpdesk',
             'ticket' => 'Support Tickets',
-            'article' => 'Article Management',
+            'article' => 'Knowledge Base',
             'push' => 'Push Notifications',
-            'mail' => 'Mass Mailing',
+            'mail' => 'Email',
         ],
         'node' => [
             'attribute' => 'Nodes',
             'list' => 'Node Management',
             'auth' => 'API Authorization',
-            'cert' => 'Security Certificates',
+            'cert' => 'Certificates',
         ],
         'rule' => [
             'attribute' => 'Audit Rules',
-            'list' => 'Rule Management',
-            'group' => 'Rule Group',
+            'list' => 'Rules',
+            'group' => 'Rule Groups',
             'trigger' => 'Trigger Records',
         ],
         'shop' => [
             'attribute' => 'Shop',
-            'goods' => 'Product Management',
-            'coupon' => 'Coupon Management',
+            'goods' => 'Products',
+            'coupon' => 'Coupons',
             'order' => 'Orders',
         ],
         'promotion' => [
-            'attribute' => 'Promotions',
-            'invite' => 'Referral Management',
-            'withdraw' => 'Commission Withdrawals',
+            'attribute' => 'Affiliates',
+            'invite' => 'Referrals',
+            'withdraw' => 'Withdraws',
             'rebate_flow' => 'Rebate History',
         ],
         'analysis' => [
-            'attribute' => 'Report',
+            'attribute' => 'Analytics',
             'accounting' => 'Accounting',
             'user_flow' => 'User Flow',
         ],
@@ -90,12 +92,12 @@ return [
             'service_ban' => 'Ban Records',
             'online_logs' => 'Online Logs',
             'online_monitor' => 'Online Monitoring',
-            'notify' => 'Notification Logs',
+            'notify' => 'Notifications',
             'payment_callback' => 'Payment Callback',
-            'system' => 'System Report',
+            'system' => 'System Logs',
         ],
         'tools' => [
-            'attribute' => 'Toolbox',
+            'attribute' => 'Tools',
             'decompile' => 'Decompile',
             'convert' => 'Convert',
             'import' => 'Import',
@@ -103,206 +105,205 @@ return [
         ],
         'setting' => [
             'attribute' => 'Settings',
-            'email_suffix' => 'Email Suffix Management',
-            'universal' => 'General Settings',
-            'system' => 'System Settings',
+            'email_suffix' => 'Email Filters',
+            'universal' => 'General',
+            'system' => 'System',
         ],
     ],
     'user' => [
         'massive' => [
-            'text' => 'Number of Users to Generate',
-            'button' => 'Bulk Generation',
-            'failed' => 'Bulk generation failed',
-            'succeed' => 'Bulk accounts generated successfully',
-            'note' => 'Bulk users generated in background',
-        ],
-        'proxy_info' => 'Configuration information',
-        'traffic_monitor' => 'Usage Statistics',
-        'online_monitor' => 'Online Monitoring',
+            'text' => '# of Users to Generate',
+            'failed' => 'User Generation Failed',
+            'succeed' => 'User Generated Successfully',
+            'note' => 'Backend bulk user generate',
+        ],
+        'proxy_info' => 'Config Info',
+        'traffic_monitor' => 'Traffic Stats',
+        'online_monitor' => 'Online Monitor',
         'reset_traffic' => 'Reset Data',
-        'user_view' => 'Switch to User Profile',
-        'connection_test' => 'Networking Test',
-        'counts' => 'Total of <code>:num</code> accounts',
-        'reset_confirm' => [0 => 'Do you want to reset [', 1 => ']\'s data?'],
+        'user_view' => 'Switch to User View',
+        'connection_test' => 'Connection Test',
+        'counts' => '<code>:num</code> accounts total',
+        'reset_confirm' => [0 => 'Confirm Reset [', 1 => ']\'s data?'],
         'info' => [
-            'account' => 'Account Information',
-            'proxy' => 'Proxy Information',
+            'account' => 'Account Info',
+            'proxy' => 'Proxy Info',
             'switch' => 'Switch Identity',
             'reset_date_hint' => 'Next data reset date',
-            'expired_date_hint' => 'Leave empty for one year by default',
+            'expired_date_hint' => 'Leave empty for 1 year by default',
             'uuid_hint' => 'UUID for V2Ray',
-            'recharge_placeholder' => 'Filling in a negative value will deduct the balance',
+            'recharge_placeholder' => 'Input negative to deduct balance',
         ],
-        'update_help' => 'Successfully updated, do you want to return?',
-        'proxies_config' => ':username connection configuration information',
+        'update_help' => 'Update successful, go back?',
+        'proxies_config' => '[:username] Config Info',
         'group' => [
-            'title' => 'User Group Control<small>(same node can be assigned to more than one group, One user can only belong to one group; For visible/available nodes: filter by level first, then group)</small>',
+            'title' => 'User Groups <small>(Nodes can be in multiple groups, user only in one)</small>',
             'name' => 'Group Name',
-            'counts' => 'Total of <code>:num</code> groups',
+            'counts' => '<code>:num</code> groups total',
         ],
     ],
-    'zero_unlimited_hint' => 'Empty or 0 for unlimited',
+    'zero_unlimited_hint' => '0 or empty for unlimited',
     'node' => [
-        'traffic_monitor' => 'Usage Statistics',
-        'refresh_geo' => 'Refresh Geography',
-        'ping' => 'Detect Delay',
-        'connection_test' => 'Connectivity Test',
-        'counts' => 'Total of <code>:num</code> nodes',
-        'reload_all' => 'Reload All Backend',
-        'refresh_geo_all' => 'Refresh All Nodes\' Geographies',
-        'reload_confirm' => 'Do you want to reload the node?',
+        'traffic_monitor' => 'Traffic Stats',
+        'refresh_geo' => 'Refresh Geo Data',
+        'ping' => 'Latency Test',
+        'connection_test' => 'Connection Test',
+        'counts' => '<code>:num</code> nodes total',
+        'reload_all' => 'Reload All Backends',
+        'refresh_geo_all' => 'Refresh Geo Data',
+        'reload_confirm' => 'Confirm Reload Node?',
         'info' => [
-            'hint' => '<strong>Note: </strong> Nodes page\'s <code>ID</code> is used in ShadowsocksR Python backend as <code>node_id</code> in usermysql.json, in V2Ray backend as <code>nodeId</code>.',
-            'basic' => 'Basic Information',
-            'ddns_hint' => 'Dynamic IP nodes need to be configured with <a href="https://github.com/NewFuture/DDNS" target="_blank">DDNS</a>. For this type of node, the node connectivity test will use server domain to test',
-            'domain_placeholder' => 'Server domain address',
-            'domain_hint' => 'Enable DDNS in System Settings. Domain will be automatically create/bound to IP address! No longer need to go to the DNS registrant page to modify IP information.',
-            'extend' => 'Extended Information',
+            'hint' => '<strong>Note:</strong> The auto-generated <code>ID</code> is the <code>node_id</code> for ShadowsocksR backend and <code>nodeId</code> for V2Ray backend',
+            'basic' => 'Basic Info',
+            'ddns_hint' => 'Dynamic IP nodes need <a href="https://github.com/NewFuture/DDNS" target="_blank">DDNS</a>. Connection test will use domain name',
+            'domain_placeholder' => 'Server domain, will use first if filled',
+            'domain_hint' => 'With DDNS enabled, domain will auto bind IP! No longer need to modify DNS record manually.',
+            'extend' => 'Extended Info',
             'display' => [
-                'invisible' => 'Completely invisible',
-                'node' => 'Show only on :trans page',
-                'sub' => 'Show by Subscription only',
-                'all' => 'Visible for all',
-                'hint' => 'Whether users can subscribe/see this node',
+                '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' => 'Multi-IP uses \',\' partition; ex: 1.1.1.1, 8.8.8.8',
-            'ipv6_hint' => 'Multi-IP uses \',\' partition; ex: 1.1.1.1, 8.8.8.8',
+            'ipv4_hint' => 'Multiple IPs separated by "," ; e.g. 1.1.1.1, 8.8.8.8',
+            'ipv6_hint' => 'Multiple IPs separated by "," ; e.g. 1.1.1.1, 8.8.8.8',
             'ipv4_placeholder' => 'Server IPv4 Address',
-            'ipv6_placeholder' => 'Server IPv6 address',
-            'push_port_hint' => 'Required and server firewall needs to be set up correctly, otherwise it will cause an exception',
-            'data_rate_hint' => 'Ex: set to 0.1, 10M will be count as 100M and 500M count as 100M',
-            'level_hint' => 'Level: 0 = No ratings, all visible',
+            'ipv6_placeholder' => 'Server IPv6 Address',
+            'push_port_hint' => 'Required, open in firewall to avoid push failure',
+            '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 ratings, all nodes visible',
             'detection' => [
                 'tcp' => 'TCP only',
                 'icmp' => 'ICMP only',
                 'all' => 'Detect All',
-                'hint' => 'Nodes will be tested every 30-60 minutes',
+                'hint' => 'Random check every 30-60 mins',
             ],
-            'obfs_param_hint' => 'While obfs is not [plain], fill in parameters to traffic masquerading; &#13;&#10; While obfs is [http_simple], suggest set port to 80; &#13;&#10; While obfs is [tls], suggest set port to 443;',
-            'additional_ports_hint' => 'If enabled, please configure server<span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span>information',
-            'v2_method_hint' => 'Do not use none when using WebSocket',
-            'v2_net_hint' => 'Enable TLS when using WebSocket Transfer Protocol',
+            'obfs_param_hint' => 'Fill in parameters for traffic masquerading if obfs is not [plain]; &#13;&#10;Suggest port 80 if obfs is [http_simple]; &#13;&#10;Suggest port 443 if obfs is [tls];',
+            'additional_ports_hint' => 'If enabled, please configure server <span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span>',
+            'v2_method_hint' => 'Do not use none with WebSocket',
+            'v2_net_hint' => 'Enable TLS with WebSocket',
             'v2_cover' => [
                 'none' => 'None',
-                'http' => 'HTTP Transport',
-                'srtp' => 'Video call data (SRTP)',
-                'utp' => 'BT download data (uTP)',
-                'wechat' => 'WeChat video call',
-                'dtls' => 'DTLS1.2 packets',
-                'wireguard' => 'WireGuard packets',
+                'http' => 'HTTP',
+                'srtp' => 'SRTP',
+                'utp' => 'uTP',
+                'wechat' => 'WeChat Video',
+                'dtls' => 'DTLS 1.2',
+                'wireguard' => 'WireGuard',
             ],
-            'v2_host_hint' => 'Multiple domains are separated by \',\' when the spoofing type is HTTP transfer protocol, and only one domain is allowed when using the WebSocket transfer protocol.',
-            'v2_tls_provider_hint' => 'Different backend configurations are different:',
-            'single_hint' => 'Recommended 80 or 443. Backend needs to configure <br> strict mode: user\'s port cannot be connected, only via the following specified port. (<a href="javascript:showPortsOnlyConfig();">How to configure?</a>)',
+            'v2_host_hint' => 'For HTTP, separate multiple domains with ",". Only one allowed for WebSocket.',
+            'v2_tls_provider_hint' => 'Different backends have different configs:',
+            'single_hint' => 'Recommended port 80/443. Backend needs <br> strict mode config: only connect via specified ports. (<a href="javascript:showPortsOnlyConfig();">How to configure</a>)',
         ],
-        'proxy_info' => '*Compatibility SS',
-        'proxy_info_hint' => 'If compatible, please add<span class="red-700">_compatible</span> to server configuration protocol and obfuscation',
+        'proxy_info' => '*Compatibility with SS',
+        'proxy_info_hint' => 'For compatibility, please add <span class="red-700">_compatible</span> to protocol and obfuscation in server config',
         'reload' => 'Reload Backend',
         'auth' => [
-            'title' => 'Node Authorizations <small>WEBAPI</small>',
+            'title' => 'API Authorizations <small>WEBAPI</small>',
             'deploy' => [
-                'title' => 'Deploy :type_label backend',
+                'title' => 'Deploy :type_label Backend',
                 'attribute' => 'Backend Deployment',
-                'command' => 'Operating instructions',
+                'command' => 'Instructions',
                 'update' => 'Update: ',
                 'uninstall' => 'Uninstall: ',
-                'start' => 'Launch: ',
+                'start' => 'Start: ',
                 'stop' => 'Stop: ',
                 'status' => 'Status: ',
-                'recent_logs' => 'Recent Log: ',
-                'real_time_logs' => 'Real-time Log: ',
+                'recent_logs' => 'Recent Logs: ',
+                'real_time_logs' => 'Real-time Logs: ',
                 'restart' => 'Restart: ',
-                'same' => 'Same as above',
-                'trojan_hint' => 'Please fill in the node\'s<a href=":url" target="_blank">domain name</a> and resolve IP to this the domain',
+                'same' => 'Same Above',
+                'trojan_hint' => 'Please fill in node <a href=":url" target="_blank">domain</a> and resolve domain DNS to node IP',
             ],
             'reset_auth' => 'Reset Key',
-            'counts' => 'Total of <code>:num</code> authorizations',
-            'generating_all' => 'Do you want to generate authorization for all nodes?',
+            'counts' => '<code>:num</code> authorizations total',
+            'generating_all' => 'Generate authorization for all nodes?',
         ],
         'cert' => [
-            'title' => 'Domain Certificates <small>Spoofing Domain for V2Ray Nodes</small>',
-            'counts' => 'Total of <code>:num</code> domain certificates',
-            'key_placeholder' => 'The KEY value of the domain certificate. Allowed to be empty, VNET-V2Ray backend support auto-signing certificate',
-            'pem_placeholder' => 'The PEM value of the domain certificate. Allowed to be empty, VNET-V2Ray backend support auto-signing certificate',
+            'title' => 'Domain Certs <small>(For V2Ray node spoofing)</small>',
+            'counts' => '<code>:num</code> certs total',
+            'key_placeholder' => 'Domain cert KEY. Allow empty, VNET-V2Ray supports auto certs',
+            'pem_placeholder' => 'Domain cert PEM. Allow empty, VNET-V2Ray supports auto certs',
         ],
     ],
     'hint' => 'Hint',
     'oauth' => [
         'title' => 'User OAuth',
-        'counts' => 'Total of <code>:num</code> open authorizations',
+        'counts' => '<code>:num</code> authorizations total',
     ],
     'select_all' => 'Select All',
     'clear' => 'Clear',
-    'unselected_hint' => 'To be assigned, searchable here',
-    'selected_hint' => 'Assigned, searchable here',
+    'unselected_hint' => 'To Assign, Search Here',
+    'selected_hint' => 'Assigned, Search Here',
     'clone' => 'Clone',
     'monitor' => [
-        'daily_chart' => 'Daily traffic chart',
-        'monthly_chart' => 'Monthly traffic chart',
-        'node' => 'Node traffic',
-        'user' => 'User traffic',
-        'hint' => '<strong>Hint: </strong> If no statistics are available, please check is the scheduled task running correctly.',
+        'daily_chart' => 'Daily Traffic',
+        'monthly_chart' => 'Monthly Traffic',
+        'node' => 'Node Traffic',
+        'user' => 'User Traffic',
+        'hint' => '<strong>Hint:</strong> Check scheduled tasks if no data',
     ],
     'tools' => [
         'analysis' => [
-            'title' => 'SSR Log Analysis <small>For single node only</small>',
-            'req_url' => 'Recent Requests Address',
-            'not_enough' => 'Less than 15,000 records, unable to analyze data',
+            'title' => 'SSR Log Analysis <small>For single node</small>',
+            'req_url' => 'Recent Request URLs',
+            'not_enough' => 'Less than 15,000 records, unable to analyze',
         ],
         'convert' => [
-            'title' => 'Format Conversion <small>Shadowsocks to ShadowsocksR</small>',
-            'content_placeholder' => 'Please fill in the configuration information to be converted',
+            'title' => 'Format Conversion <small>SS to SSR</small>',
+            'content_placeholder' => 'Please fill in the config to convert',
         ],
         'decompile' => [
-            'title' => 'Decompile <small>Configuration Information</small>',
+            'title' => 'Decompile <small>Config Info</small>',
             'attribute' => 'Decompile',
-            'content_placeholder' => 'Please fill in the ShadowsocksR link that you want to decompile, one link per line',
+            'content_placeholder' => 'Please fill in the SSR links to decompile, one per line',
         ],
     ],
     'ticket' => [
         'title' => 'Tickets',
-        'counts' => 'Total of <code>:num</code> tickets',
-        'send_to' => 'Please fill in the target user information',
-        'user_info' => 'User Information',
-        'inviter_info' => 'Inviter Information',
-        'close_confirm' => 'Sure to close this ticket?',
-        'error' => 'Unknown error! Please check the logs',
+        'counts' => '<code>:num</code> tickets total',
+        'send_to' => 'Please fill in target user details',
+        'user_info' => 'User Info',
+        'inviter_info' => 'Inviter Info',
+        'close_confirm' => 'Confirm Close Ticket?',
+        'error' => 'Unknown error! Please check logs',
     ],
     'logs' => [
         'subscribe' => 'Subscriptions',
-        'counts' => 'Total of <code>:num</code> records',
+        'counts' => '<code>:num</code> records total',
         'rule' => [
-            'clear_all' => 'Clear all records',
-            'title' => 'Trigger record',
+            'clear_all' => 'Clear All Records',
+            'title' => 'Trigger Records',
             'name' => 'Trigger Rule',
-            'reason' => 'Trigger reason',
+            'reason' => 'Trigger Reason',
             'created_at' => 'Trigger Time',
-            'tag' => '✅ Access to non-permitted content',
-            'clear_confirm' => 'Sure to clear all records?',
+            'tag' => '✅ Non-permitted access',
+            'clear_confirm' => 'Confirm Clear All Records?',
         ],
         'order' => [
             'title' => 'Orders',
-            'is_expired' => 'Whether orders has expired',
-            'is_coupon' => 'Whether a coupon was used',
+            'is_expired' => 'Expired',
+            'is_coupon' => 'Used Coupon',
         ],
         'user_traffic' => [
             'title' => 'Data Usage Records',
             'choose_node' => 'Select Node',
         ],
-        'user_data_modify_title' => 'User Data Change Records',
-        'callback' => 'Callback Logs <small>For Online Payment</small>',
-        'notification' => 'Email Delivery Records',
-        'ip_monitor' => 'Online IP monitoring <small>Real-time data within 2 minutes</small>',
+        'user_data_modify_title' => 'Data Change Records',
+        'callback' => 'Callback Logs <small>(Payment)</small>',
+        'notification' => 'Email Logs',
+        'ip_monitor' => 'Online IPs <small>Real-time 2 mins</small>',
         'user_ip' => [
-            'title' => 'User Online IP List <small>Last 10 minutes</small>',
-            'connect' => 'IP of connection',
+            'title' => 'Online IPs <small>Last 10 mins</small>',
+            'connect' => 'Connected IP',
         ],
         'ban' => [
-            'title' => 'User Ban Records',
+            'title' => 'User Bans',
             'time' => 'Duration',
             'reason' => 'Reason',
-            'ban_time' => 'Banned Time',
-            'last_connect_at' => 'Last connection time',
+            'ban_time' => 'Banned On',
+            'last_connect_at' => 'Last Login Time',
         ],
         'credit_title' => 'Balance Change Records',
     ],
@@ -311,85 +312,85 @@ return [
     'goods' => [
         'title' => 'Products',
         'type' => [
-            'top_up' => 'Top-Up',
-            'package' => 'Data Pack',
-            'plan' => 'Plan',
+            'top_up' => 'Top Up',
+            'package' => 'Data Package',
+            'plan' => 'Subscription Plan',
         ],
         'info' => [
-            'type_hint' => 'Plan is related to the account expiration date, Data Pack only affect the available data that user has, does not affect the expiration date',
-            'period_hint' => 'Plan\'s data reset in every N days',
-            'limit_num_hint' => 'Number of times each user can purchase this product; 0 means no restriction on purchase',
-            'available_date_hint' => 'Automatically deduct data from total data when due',
-            'desc_placeholder' => 'Brief description of the product',
-            'list_placeholder' => 'Add custom lists to product',
-            'list_hint' => 'Please start each line with A and end with B<code>&lt;li&gt;</code> and end with <code>&lt;/li&gt;</code>',
+            '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 <code><li></code> and end with <code></li></code>',
         ],
         'status' => [
-            'yes' => 'Active',
-            'no' => 'Inactive',
+            'yes' => 'On Sale',
+            'no' => 'Off Sale',
         ],
-        'sell_and_used' => 'In Use/Sales',
-        'counts' => 'Total of <code>:num</code> products',
+        'sell_and_used' => 'Used / Sold',
+        'counts' => '<code>:num</code> goods total',
     ],
-    'sort_asc' => 'The larger the sort value, the higher the priority',
+    'sort_asc' => 'Larger sort value has higher priority',
     'yes' => 'Yes',
     'no' => 'No',
     'rule' => [
         'type' => [
-            'reg' => 'Regular expression',
-            'domain' => 'Domain Name',
+            'reg' => 'Regex',
+            'domain' => 'Domain',
             'ip' => 'IP',
             'protocol' => 'Protocol',
         ],
-        'counts' => 'Total of <code>:num</code> audit rules',
+        'counts' => '<code>:num</code> rules total',
         'title' => 'Rules',
         'group' => [
             'type' => [
                 'off' => 'Block',
                 'on' => 'Allow',
             ],
-            'title' => 'Audit Group',
-            'counts' => 'Total of <code>:num</code> audit groups',
+            'title' => 'Rule Groups',
+            'counts' => '<code>:num</code> groups total',
         ],
     ],
     'role' => [
-        'name_hint' => 'Unique identification name, ex: Administrator',
-        'description_hint' => 'Displays name, ex: Administrator',
-        'title' => 'Permission Roles',
+        'name_hint' => 'Unique identifier, e.g. admin',
+        'description_hint' => 'Display name, e.g. Administrator',
+        'title' => 'Roles',
         'permissions_all' => 'All Permissions',
-        'counts' => 'Total of <code>:num</code> permission roles',
+        'counts' => '<code>:num</code> roles total',
     ],
     'report' => [
-        'monthly_accounting' => 'Monthly Income',
-        'annually_accounting' => 'Annual Income',
-        'historic_accounting' => 'Historical Income',
-        'current_month' => 'Current month',
+        'monthly_accounting' => 'Monthly Accounting',
+        'annually_accounting' => 'Annual Accounting',
+        'historic_accounting' => 'Historic Accounting',
+        'current_month' => 'This Month',
         'last_month' => 'Last Month',
-        'current_year' => 'Current year',
-        'last_year' => 'Last year',
-        'hourly_traffic' => 'Hourly data traffic',
-        'daily_traffic' => 'Daily data traffic',
+        'current_year' => 'This Year',
+        'last_year' => 'Last Year',
+        'hourly_traffic' => 'Hourly Traffic',
+        'daily_traffic' => 'Daily Traffic',
         'today' => 'Today',
     ],
     'permission' => [
         'title' => 'Permissions',
-        'description_hint' => 'Description of permission, ex: [X system] Edit A',
-        'name_hint' => 'Fill in the route, ex: admin.permission.create,update',
-        'counts' => 'Total of <code>:num</code> permissions',
+        'description_hint' => 'Description, e.g. [X system] Edit A',
+        'name_hint' => 'Route name, e.g. admin.user.update',
+        'counts' => '<code>:num</code> permissions total',
     ],
     'marketing' => [
         'email' => [
-            'title' => 'Marketing Emails',
-            'group_send' => 'Send Group Email',
-            'counts' => 'Total of <code>:num</code> emails',
+            'title' => 'Email Marketing',
+            'group_send' => 'Send Email',
+            'counts' => '<code>:num</code> emails total',
         ],
-        'send_status' => 'Delivery Status',
-        'send_time' => 'Sending time',
+        'send_status' => 'Send Status',
+        'send_time' => 'Sent On',
         'error_message' => 'Error Messages',
         'push' => [
-            'title' => 'Marketing Push Messages',
-            'send' => 'Push Marketing Message',
-            'counts' => 'Total of <code>:num</code> push messages',
+            'title' => 'Push Notifications',
+            'send' => 'Send Notification',
+            'counts' => '<code>:num</code> messages total',
         ],
     ],
     'creating' => 'Adding...',
@@ -398,327 +399,327 @@ return [
             'knowledge' => 'Article',
             'announcement' => 'Announcement',
         ],
-        'category_hint' => 'Same category will be grouped under the same folder',
+        'category_hint' => 'Same category will be grouped together',
         'logo_hint' => 'Recommended size: 100x75',
         'title' => 'Articles',
-        'counts' => 'Total of <code>:num</code> articles',
+        'counts' => '<code>:num</code> articles total',
     ],
     'coupon' => [
         'title' => 'Coupons',
-        'name_hint' => 'For user-end display',
-        'sn_hint' => 'The code to use the coupon, leave it blank will generate 8-digit random code by default',
+        'name_hint' => 'For display',
+        'sn_hint' => 'Leave blank for 8-digit random code',
         'type' => [
             'voucher' => 'Voucher',
-            'discount' => 'Discount Coupon',
-            'charge' => 'Recharge Coupon',
+            'discount' => 'Discount',
+            'charge' => 'Recharge',
         ],
-        'type_hint' => 'Reduction: deduct the amount of the product; Discount: discount the percentage of the product; Recharge: add the amount to the user balance',
-        'value' => '{1} ➖ :num|{2} :num% discount |{3} ➕ :num',
+        'type_hint' => 'Reduction: deduct amount; Discount: percentage off; Recharge: add amount to balance',
+        'value' => '{1} ➖ :num|{2} :num% off|{3} ➕ :num',
         'value_hint' => 'Range 1% ~ 99%',
-        'priority_hint' => 'While Coupons have the same [Coupon Code], Eligible and highest priority coupon will be used first. The maximum is 255',
-        'minimum_hint' => 'Coupon can only be used when the payment amount exceeds <strong>:num</strong>',
-        'used_hint' => 'Eligible users may use this coupon no more than <strong>:num</strong> times',
-        'levels_hint' => 'Coupon can only be used if the user is within the selected levels',
-        'groups_hint' => 'Coupon can only be used by selected user groups',
-        'users_placeholder' => 'Enter the user ID, then press enter',
-        'user_whitelist_hint' => 'Involved users are allowed to use this coupon, leave blank for not using this condition',
-        'users_blacklist_hint' => 'Involved users are not allowed to use this coupon, leave blank for not using this condition',
-        'services_placeholder' => 'Enter the product ID, then press enter',
-        'services_whitelist_hint' => 'Coupon can only be used for products in this list, leave blank for not using this condition',
-        'services_blacklist_hint' => 'Coupon cannot be used for products in this list, leave blank for not using this condition',
+        'priority_hint' => 'Highest eligible priority coupon used first. Max 255',
+        'minimum_hint' => 'Only usable when payment exceeds <strong>:num</strong>',
+        'used_hint' => 'Each user can use this <strong>:num</strong> 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 using any coupon',
+            'first_discount' => 'First-time Discount',
             'first_order' => 'First Order',
-            'created_days' => 'Create Account',
+            'created_days' => 'Account Age',
         ],
-        'created_days_hint' => '<code>:day</code> days of account creation',
-        'limit_hint' => 'The rules of this restriction are <strong>and</strong> relation, please use them properly',
-        'info_title' => 'Coupon Information',
-        'counts' => 'Total of <code>:num</code> coupons',
+        'created_days_hint' => '<code>:day</code> days after registration',
+        'limit_hint' => 'Rules have <strong>AND</strong> relation, use properly',
+        'info_title' => 'Info',
+        'counts' => '<code>:num</code> coupons total',
         'discount' => 'Discount',
-        'export_title' => 'Coupon Export',
-        'single_use' => 'One-time',
+        'export_title' => 'Export',
+        'single_use' => 'One-time Use',
     ],
     'times' => 'Times',
     'massive_export' => 'Batch Export',
     'system_generate' => 'System Generated',
     'aff' => [
-        'rebate_title' => 'Referral Rebate History',
-        'counts' => 'Total of <code>:num</code> applications',
-        'title' => 'Withdrawal Requests',
-        'apply_counts' => 'Total of <code>:num</code> requests',
-        'referral' => 'Promotional Rebates',
-        'commission_title' => 'Withdrawal Request Details',
-        'commission_counts' => 'This application involves <code>:num</code> orders',
+        'rebate_title' => 'Rebate History',
+        'counts' => '<code>:num</code> rebates total',
+        'title' => 'Withdraw Requests',
+        'apply_counts' => '<code>:num</code> requests total',
+        'referral' => 'Referral Rebates',
+        'commission_title' => 'Request Details',
+        'commission_counts' => 'Involves <code>:num</code> orders',
     ],
     'setting' => [
         'common' => [
-            'title' => 'General Configuration',
-            'set_default' => 'Set as default',
-            'connect_nodes' => 'Number of associated nodes',
+            'title' => 'General Config',
+            'set_default' => 'Set as Default',
+            'connect_nodes' => '# of Nodes',
         ],
         'email' => [
-            'title' => 'Email Suffix Filters <small> used to limit the emails used for registration</small>',
+            'title' => 'Email Filters <small>(for registration)</small>',
             'tail' => 'Email Suffix',
             'rule' => 'Restriction Type',
             'black' => 'Blacklist',
             'white' => 'Whitelist',
-            'tail_placeholder' => 'Please fill in the email suffix',
+            'tail_placeholder' => 'Enter email suffix',
         ],
         'system' => [
             'title' => 'System Settings',
-            'web' => 'Website',
+            'web' => 'General',
             'account' => 'Account',
             'node' => 'Node',
             'extend' => 'Advanced',
             'check_in' => 'Check-in',
-            'promotion' => 'Promotion',
+            'promotion' => 'Affiliate',
             'notify' => 'Notification',
             'auto_job' => 'Automation',
-            'other' => 'LOGO|Customer Service|Statistics',
-            'payment' => 'Payment Gateway',
+            'other' => 'Logo|CS|Analytics',
+            'payment' => 'Payment',
             'menu' => 'Menu',
         ],
-        'no_permission' => 'You have no permission to change the setting!',
+        'no_permission' => 'No permission to change settings!',
     ],
     'system' => [
-        'account_expire_notification' => 'Account Expiration Notification',
-        'active_times' => 'Number of activation of account',
-        'admin_invite_days' => '[Admin] Expiration days of invitation code',
-        'aff_salt' => '[Invitation URL] Encrypt User Information',
-        'alipay_qrcode' => 'Alipay QrCode',
+        'account_expire_notification' => 'Account Expiration Notice',
+        '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 Token',
+        'bark_key' => '[Bark] Device Key',
         'captcha_key' => 'Captcha Key',
         'captcha_secret' => 'Captcha Secret/ID',
         'codepay_id' => '[CodePay] ID',
         'codepay_key' => '[CodePay] Key',
         'codepay_url' => '[CodePay] URL',
-        'data_anomaly_notification' => 'Data Abnormal Notification',
-        'data_exhaust_notification' => 'Data Exhaustion Notification',
-        'ddns_key' => '[DNS Provider] Key',
-        'ddns_mode' => 'DNS Provider',
-        'ddns_secret' => '[DNS Provider] Secret',
-        'default_days' => 'Account Initial Time',
-        'default_traffic' => 'Initial Data Traffic',
-        'detection_check_times' => 'Node Network Detection Alert',
-        'dingTalk_access_token' => '[DingTalk Robot] Access Token',
-        'dingTalk_secret' => '[DingTalk Robot] Secret',
+        'data_anomaly_notification' => 'Data Anomaly Notice',
+        'data_exhaust_notification' => 'Data Exhaustion Notice',
+        'ddns_key' => '[DNS] Key',
+        'ddns_mode' => 'DNS Sync',
+        'ddns_secret' => '[DNS] Secret',
+        'default_days' => 'Default Account Time',
+        'default_traffic' => 'Default Initial Data',
+        'detection_check_times' => 'Node Block Alerts',
+        'dingTalk_access_token' => '[DingTalk] Access Token',
+        'dingTalk_secret' => '[DingTalk] Secret',
         'epay_key' => '[ePay] Key',
         'epay_mch_id' => '[ePay] Merchant ID',
         'epay_url' => '[ePay] URL',
-        'expire_days' => 'Expiration Warning Threshold',
+        'expire_days' => 'Expiration Warning',
         'f2fpay_app_id' => '[Alipay] APP ID',
         'f2fpay_private_key' => '[Alipay] Private Key',
         'f2fpay_public_key' => '[Alipay] Public Key',
-        'forbid_mode' => 'Access Prohibited',
-        'invite_num' => 'Number of invitations can be generated',
+        'forbid_mode' => 'Access Restriction',
+        'invite_num' => 'Default Invitations',
         'is_activate_account' => 'Account Activation',
-        'is_AliPay' => 'Alipay Gateway',
+        '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',
-        'is_forbid_robot' => 'Forbid Bots Access',
-        'is_free_code' => 'Free Invitation Code',
-        'is_invite_register' => 'Invitation to Register',
-        'is_otherPay' => 'Special Gateway',
-        'is_QQPay' => 'QQ Wallet Gateway',
-        'is_rand_port' => 'Random Ports',
+        'is_forbid_robot' => 'Forbid Bots',
+        'is_free_code' => 'Free Invitation Codes',
+        'is_invite_register' => 'Invitation Registration',
+        'is_otherPay' => 'Custom Payment',
+        'is_QQPay' => 'QQ Pay',
+        'is_rand_port' => 'Random Port',
         'is_register' => 'Registration',
-        'is_subscribe_ban' => 'Subscription Abnormal Ban',
-        'is_traffic_ban' => 'Abnormal Data Use Ban',
-        'is_WeChatPay' => 'WeChat Pay Gateway',
+        'is_subscribe_ban' => 'Subscription Ban',
+        'is_traffic_ban' => 'Data Abuse Ban',
+        'is_WeChatPay' => 'WeChat Pay',
         'iYuu_token' => '[IYUU] Token',
-        'maintenance_content' => 'Maintenance Announcement',
+        'maintenance_content' => 'Maintenance Notice',
         'maintenance_mode' => 'Maintenance Mode',
-        'maintenance_time' => 'Maintenance End Time',
+        'maintenance_time' => 'Maintenance End',
         'min_port' => 'Port Range',
         'min_rand_traffic' => 'Data Range',
-        'node_blocked_notification' => 'Node Blocked Alert',
-        'node_daily_notification' => 'Node Data Usage Daily Report',
-        'node_offline_notification' => 'Node Offline Notification',
+        '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' => 'Number of Offline Notification',
-        'password_reset_notification' => 'Reset Password Notification',
+        '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 Pay Payment Confirmation',
-        'payment_received_notification' => 'Successful Payment Notification',
+        '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 Key',
+        'paypal_client_secret' => 'Client Secret',
         'pushDeer_key' => '[PushDeer] Key',
         'pushplus_token' => '[PushPlus] Token',
         'rand_subscribe' => 'Random Subscription',
         'redirect_url' => 'Redirect URL',
-        'referral_money' => 'Minimum Withdrawal Limit',
-        'referral_percent' => 'Rebate Rate',
-        'referral_status' => 'Promotion',
-        'referral_traffic' => 'Registration Bonus Data Traffic',
-        'referral_type' => 'Rebate Mode',
-        'register_ip_limit' => 'Same IP Registration Restriction',
-        'reset_password_times' => 'Password Reset Limitation',
-        'reset_traffic' => 'Data Traffic Reset',
+        '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 Signing secret',
+        'stripe_signing_secret' => 'Webhook Secret',
         'subject_name' => 'Custom Product Name',
-        'subscribe_ban_times' => 'Subscription Request Threshold',
-        'subscribe_domain' => 'Service Subscription URL',
-        'subscribe_max' => 'Maximum number of subscription nodes',
+        '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 Closure Notification',
-        'ticket_created_notification' => 'Ticket Creation Notification',
-        'ticket_replied_notification' => 'Ticket Response Notification',
-        'traffic_ban_time' => 'Ban Time',
-        'traffic_ban_value' => 'Data Abnormal Threshold',
-        'traffic_limit_time' => 'Time Interval',
-        'traffic_warning_percent' => 'Low Data Traffic Threshold',
-        'trojan_license' => 'Trojan Backend License',
+        '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] Expiration days of invitation code',
-        'v2ray_license' => 'V2Ray Backend License',
-        'v2ray_tls_provider' => 'V2Ray TLS Configuration',
-        'webmaster_email' => 'Administrator Email',
-        'website_analytics' => 'Statistics Code',
+        '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' => 'Customer Service Code',
+        'website_customer_service' => 'CS Code',
         'website_home_logo' => 'Homepage Logo',
-        'website_logo' => 'Site Logo',
+        'website_logo' => 'Inner Page Logo',
         'website_name' => 'Site Name',
-        'website_security_code' => 'Site Security Code',
-        'website_url' => 'Site Domain Address',
-        'web_api_url' => 'Authorization/Backend Access Domain',
-        'wechat_aid' => 'Enterprise WeChat AID',
-        'wechat_cid' => 'Enterprise WeChat CID',
-        'wechat_encodingAESKey' => 'Enterprise WeChat Encoding AESKey',
-        'wechat_qrcode' => 'WeChat QrCode',
-        'wechat_secret' => 'Enterprise WeChat Secret',
-        'wechat_token' => 'Enterprise WeChat Token',
+        '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' => [
-            'account_expire_notification' => 'Notify users that their accounts are about to expire',
-            'active_times' => 'The number of times a user can activate an account via email within 1 day',
-            'admin_invite_days' => 'Expiration date of the invitation code generated by the administrator',
-            'aff_salt' => 'If left blank, the invitation link will use user ID; Filling in any letters/numbers as key to encrypt user ID',
-            'AppStore_id' => 'Apple account that can be used in the articles',
-            'AppStore_password' => 'Apple password that can be used in the articles',
-            'auto_release_port' => 'Ports for accounts that have been banned/expired for <code>'.config('tasks.release_port').'</code> days will be released',
-            'bark_key' => 'Push messages to iOS devices. You need to install Bark on your iPhone first, then take the long string after [api.day.app]. Be sure to fill in this value before enable Bark',
-            'captcha_key' => 'Browse <a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">Setup Guide</a> to set up',
-            'data_anomaly_notification' => 'User hourly traffic exceeding data abnormal threshold notifies admin',
-            'data_exhaust_notification' => 'Notify users that their data is about to run out',
-            'ddns_key' => "Browse <a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>Setup Guide</a> to set up",
-            'ddns_mode' => 'Sync nodes\' domain and IP setting to DNS Provider',
-            'default_days' => 'Default expiration date for new registered accounts. 0 means same day expiration',
-            'default_traffic' => 'Default available data traffic for new registered accounts',
-            'detection_check_times' => 'Automatically offline node after N reminders. 0/empty mean do not offline node, Max 12',
-            'dingTalk_access_token' => 'Browse <a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>DingTalk Handbook</a> to see the set-up steps',
-            'dingTalk_secret' => 'Optional, unless DingTalk bot\'s [加签] function is selected!',
-            'expire_days' => '[Account Expiry Notice] Starting Threshold, notify users daily',
-            'f2fpay_app_id' => 'Alipay\'s APPID',
-            'f2fpay_private_key' => 'App Private key generated by the official secret key software',
-            'f2fpay_public_key' => 'Note that it is not the APP public key!',
-            'forbid_mode' => 'Blocking the corresponding area based on IP, non-blocked areas can be accessed normally',
-            'invite_num' => 'Number of invitation codes a user can generate by default',
-            'is_activate_account' => 'Once enabled, users need to activate their accounts via email',
-            'is_ban_status' => '(Caution!) Blocking the entire account will reset all data on the account and prevent users from logging in. Deactivate this to disable the user agent only.',
-            'is_captcha' => 'If enabled, Captcha will be required for login/registration action',
-            'is_checkin' => 'Random traffic will be awarded according to the traffic range when user check-in',
-            'is_clear_log' => '(Recommended) Automatically clean useless/outdated logs when enabled',
-            'is_custom_subscribe' => 'When enabled, the top of the subscription list will show the account expiration date, the amount of traffic left (only some clients are supported)',
-            'is_email_filtering' => 'Blacklist: users can use any email outside the blacklist to register; Whitelist: users can only use supported email in the white list to register',
-            'is_forbid_robot' => 'Bots, Crawlers, or Proxies access, Panel will throw a 404 error',
-            'is_free_code' => 'Free invitation code will not be visible if disabled',
-            'is_rand_port' => 'Randomly get ports when users register/add users',
-            'is_register' => 'Cannot register if disabled',
-            'is_subscribe_ban' => 'When enabled, subscription link will be blocked when user requests via subscription link exceed the set threshold',
-            'is_traffic_ban' => 'If the user\'s data usage exceeds the data abnormal threshold within 1 hour, Use\'s service will be disabled for fixed amount of time',
-            'iYuu_token' => 'Before enabling IYUU, Please make sure to fill in token that (<a href=https://iyuu.cn target=_blank>apply from IYUU</a>)',
-            'maintenance_content' => 'Customized maintenance announcement content',
-            'maintenance_mode' => "When enabled, user access will redirect to maintenance page| For Admin access using <a href='javascript:(0)'>:url</a>",
-            'maintenance_time' => 'For maintenance interface countdown',
-            'min_port' => 'Port range: 1000 ~ 65535',
-            'node_blocked_notification' => 'Detects node network connectivity hourly and alerts administrators when there is a situation',
-            'node_daily_notification' => 'Report traffic consumption data per node',
-            'node_offline_notification' => 'Detects nodes offline every 10 minutes and alerts administrator when any of them is offline',
-            'oauth_path' => 'Please add settings in .ENV, before using any of platforms',
-            'offline_check_times' => 'Stop alerts after N alerts within 24 hours',
-            'password_reset_notification' => 'Users can reset their passwords, if enabled',
+            '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 <code>'.config('tasks.release_port').'</code> days',
+            'bark_key' => 'Device key for iOS push',
+            'captcha_key' => 'Browse <a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">setup guide</a>',
+            'data_anomaly_notification' => 'Notify admin when hourly data exceeds threshold',
+            'data_exhaust_notification' => 'Notify when data is running out',
+            'ddns_key' => "Browse <a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>setup guide</a>",
+            'ddns_mode' => 'Sync domain & IP changes to DNS provider',
+            'default_days' => 'Default expiration for new accounts, 0 means expire today',
+            'default_traffic' => 'Default data for new accounts',
+            'detection_check_times' => 'Auto offline node after N alerts, 0 for unlimited, max 12',
+            'dingTalk_access_token' => 'Custom bot <a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>access token</a>',
+            'dingTalk_secret' => 'Custom bot secret when enabled sign',
+            'expire_days' => 'Start account expiration notice',
+            'f2fpay_app_id' => 'Alipay APPID',
+            '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',
+            'invite_num' => 'Default invitations per user',
+            'is_activate_account' => 'Require activation via email',
+            'is_ban_status' => '(Caution) Ban account will reset all user data',
+            'is_captcha' => 'Require captcha to login/register if enabled',
+            'is_checkin' => 'Random reward when check-in',
+            'is_clear_log' => '(Recommended) Auto clean useless/outdated logs when enabled',
+            'is_custom_subscribe' => 'Show expiration & data left on subscription list when enabled',
+            'is_email_filtering' => 'Blacklist: any other emails; Whitelist: only allowed emails',
+            'is_forbid_robot' => 'Return 404 error if accessed by bots/proxies',
+            'is_free_code' => 'Hide free invite codes if disabled',
+            'is_rand_port' => 'Random port when add/register user',
+            '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 <a href=https://iyuu.cn target=_blank>IYUU token</a> before enabling',
+            'maintenance_content' => 'Custom maintenance announcement',
+            'maintenance_mode' => "Redirect normal users to maintenance page if enabled| Admin can login via <a href='javascript:(0)'>:url</a>",
+            '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',
+            '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',
             'paybeaver_app_id' => '<a href="https://merchant.paybeaver.com/" target="_blank">Merchant Center</a> -> Developer -> App ID',
             'paybeaver_app_secret' => '<a href="https://merchant.paybeaver.com/" target="_blank">Merchant Center</a> -> Developer -> App Secret',
-            'payjs_mch_id' => 'Get configs from <a href="https://payjs.cn/dashboard/member" target="_blank">Member page</a>',
-            'payment_confirm_notification' => 'Users notify administrators to process orders that using Manual Pay',
-            'payment_received_notification' => 'Prompt the user with the latest status of the order',
-            'pushDeer_key' => 'Before enabling PushDeer, make sure to fill <a href=https://www.pushdeer.com/official.html target=_blank>Push Key</a>',
-            'pushplus_token' => 'Before enabling PushPlus, make sure to fill <a href=https://www.pushplus.plus/push1.html target=_blank>Token</a>',
-            'rand_subscribe' => 'When enabled, the system returns the node list randomly, otherwise, it will be available based on Node list order',
-            'redirect_url' => 'When an audit rule is triggered, blocked access requests are redirected to this address',
-            'referral_money' => 'The minimum amount that can be requested for withdrawal',
-            'referral_percent' => 'According to the account registered by the promotion link, the percentage of share that the inviter can get from each order',
-            'referral_status' => 'Not visible to users after closing, but does not affect the normal invitation rebate function',
-            'referral_traffic' => 'Free data traffic after registration with promotion link/invitation code',
-            'referral_type' => 'After switching modes the old data remains unchanged and the new rebate is calculated according to the new mode',
-            'register_ip_limit' => 'The number of registration requests allowed to be requested from the same IP within 24 hours. No limit for 0/empty',
-            'reset_password_times' => 'The number of times users can reset their passwords via email within 24 hours',
-            'reset_traffic' => 'Users reset their available data traffic according to the reset cycle of their purchased plan',
-            'server_chan_key' => 'Before enabling ServerChan, please fill in <a href=https://sc.ftqq.com target=_blank>SCKEY</a>',
-            'standard_currency' => 'For displaying product title in payment gateways',
-            'subject_name' => 'Display product title for payment channel',
-            'subscribe_ban_times' => 'Limit of subscription requests a user can send within 24 hours',
-            'subscribe_domain' => '(recommended) Prevent Main Domain abnormality, resulting in failure to subscribe properly start with [http:// or https://]',
-            'subscribe_max' => 'The number of nodes when the client subscribes, and return all nodes when 0/left blank',
-            'telegram_token' => 'Find <a href=https://t.me/BotFather target=_blank>@BotFather</a> to apply for robot\'s TOKEN',
-            'tg_chat_token' => 'Before enabling TG Chat, please fill in <a href=https://t.me/realtgchat_bot target=_blank> applied Token</a>',
-            'ticket_closed_notification' => 'Notify user when ticket closed',
-            'ticket_created_notification' => 'New ticket notification to manager/user, depending on who created the new ticket.',
-            'ticket_replied_notification' => 'Ticket reply notification to the other party',
-            'traffic_ban_time' => 'Any exception that causes the user/subscription to be banned for a period of time, automatically unban after expiration.',
-            'traffic_ban_value' => 'If it exceeds this value within 1 hour, it will trigger automatic account ban',
-            'traffic_limit_time' => 'Check-in Interval',
-            'traffic_warning_percent' => '[Traffic Exhaustion Notification] Start threshold, notify users daily',
-            'username_type' => 'Standardize the type of site user account, default is email address',
-            'user_invite_days' => 'Expiration date of user-generated invitations',
-            'v2ray_tls_provider' => 'For back-end auto-issue/loading of TLS certificates (Node\'s setting have higher priority than here)',
-            'webmaster_email' => 'Some error messages will provide the administrator\'s email as the contact information',
-            'website_analytics' => 'Statistics JavaScript',
-            'website_callback_url' => 'Prevent payment callback from being backsliding due to a DNS poisoning of main domain, start with http:// or https://',
-            'website_customer_service' => 'Customer Service JavaScript',
-            'website_name' => 'Show on email and etc.',
-            'website_security_code' => 'When not empty, must be accessed via <a href=":url" target="_blank">Secure Portal</a> to access the website',
-            'website_url' => 'Main domain that this panel will be using for everything links related as default',
-            'web_api_url' => 'For example: '.config('app.url'),
-            'wechat_aid' => 'Create an app in <a href=https://work.weixin.qq.com/wework_admin/frame#apps arget=_blank>app management page</a>, get AgentId',
-            'wechat_cid' => 'Get the CID in<a href=https://work.weixin.qq.com/wework_admin/frame#profile target=_blank>My Enterprise page</a>',
-            'wechat_encodingAESKey' => 'App Management ⇒ Application ⇒ Set API ⇒ EncodingAESKey',
-            'wechat_secret' => 'App Secret (may need to download enterprise WeChat to be able view it)',
-            'wechat_token' => 'App Management -> Application -> Set API -> TOKEN, URL set to :url',
+            'payjs_mch_id' => 'Get from <a href="https://payjs.cn/dashboard/member" target="_blank">member page</a>',
+            'payment_confirm_notification' => 'Notify admin to process manual payment orders',
+            'payment_received_notification' => 'Notify user when payment received',
+            'pushDeer_key' => 'Fill <a href=https://www.pushdeer.com/official.html target=_blank>PushDeer Push Key</a> before enabling',
+            'pushplus_token' => 'Fill <a href=https://www.pushplus.plus/push1.html target=_blank>PushPlus Token</a> before enabling',
+            'rand_subscribe' => 'Random order if enabled, otherwise by node list order',
+            'redirect_url' => 'Redirect blocked requests to this URL when rules triggered',
+            'referral_money' => 'The minimum amount that can be withdrawn',
+            'referral_percent' => 'The percentage of order amount the referrer gets',
+            'referral_status' => 'Close referral system without affecting existing data',
+            'referral_traffic' => 'Give free data traffic when registered via referral',
+            'referral_type' => 'New rebates calculated by new mode after switching',
+            'register_ip_limit' => 'Number of registrations allowed per IP in 24 hours, 0 for unlimited',
+            'reset_password_times' => 'Number of password resets allowed via email in 24 hours',
+            'reset_traffic' => 'Automatically reset data based on user plan cycle',
+            'server_chan_key' => 'Fill in <a href=https://sc.ftqq.com target=_blank>ServerChan SCKEY</a> before enabling',
+            'standard_currency' => 'Primary currency used in panel',
+            'subject_name' => 'Custom product name in payment gateways',
+            'subscribe_ban_times' => 'Maximum subscription requests allowed per user in 24 hours',
+            'subscribe_domain' => 'Start with http:// or https:// to avoid DNS poisoning failure',
+            'subscribe_max' => 'Max number of nodes returned in subscription list, 0 for all',
+            'telegram_token' => 'Get robot <a href=https://t.me/BotFather target=_blank>TOKEN</a> from @BotFather',
+            'tg_chat_token' => 'Fill <a href=https://t.me/realtgchat_bot target=_blank>TG Chat token</a> before enabling',
+            'ticket_closed_notification' => 'Notify user when ticket is closed',
+            'ticket_created_notification' => 'Notify manager/user depending on creator',
+            'ticket_replied_notification' => 'Notify the other party when ticket replied',
+            'traffic_ban_time' => 'Duration of auto ban for exceptions',
+            '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',
+            'v2ray_tls_provider' => 'Node settings override this TLS config',
+            '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',
+            'website_customer_service' => 'Customer service JavaScript code',
+            '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' => '<a href="https://work.weixin.qq.com/wework_admin/frame#apps" target="_blank">App Management</a> -> AgentId',
+            'wechat_cid' => 'Get from <a href="https://work.weixin.qq.com/wework_admin/frame#profile" target="_blank">Enterprise Info</a>',
+            '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 in ServerChan\'s SCKEY, then press Update',
-            'pushDeer_key' => 'Fill in Push Key, then press Update',
-            'iYuu_token' => 'Fill in IYUU Token, then press Update',
-            'bark_key' => 'Fill in Bark key, then press Update',
-            'telegram_token' => 'Fill in Telegram Token, then press Update',
+            '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' => 'Customize bot\'s access_token in WebHook',
-            'dingTalk_secret' => 'Customize key that will appear after robot is signed',
-            'wechat_aid' => 'WeChat AID',
-            'wechat_cid' => 'Fill in the WeChat CID, then press Update',
-            'wechat_secret' => 'WeChat Secret',
+            '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/?',
         ],

+ 44 - 45
resources/lang/en/auth.php

@@ -5,63 +5,62 @@ declare(strict_types=1);
 return [
     'accept_term' => 'I have read and accepted',
     'active' => [
-        'attribute' => 'Active',
+        'attribute' => 'Activate',
         'error' => [
-            'activated' => 'Your account has been activated, no need to re-activate',
-            'disable' => 'Account activation has been disabled, you can sign in directly!',
-            'throttle' => 'You have triggered the activation request restriction, please do not operate too frequent! If you have any questions, please contact: email',
+            'activated' => 'Account already activated, no need to reactivate',
+            'disable' => 'Account activation disabled, you can sign in directly!',
+            'throttle' => 'Activation request limit reached, please do not operate too frequently! Contact :email if you have any questions.',
         ],
         'promotion' => 'Account not yet activated, please [:action] first!',
-        'sent' => 'Activation Email has sent to your mailbox, please check your mailbox (Email may be in the Trash)',
+        'sent' => 'Activation email has been sent to your mailbox, please check including spam folder.',
     ],
     'aup' => 'Acceptable Use Policy',
     'captcha' => [
         'attribute' => 'Captcha',
         'error' => [
             'failed' => 'Captcha verification failed, please try again',
-            'timeout' => 'Invalid verification code! It maybe expired, please refresh and try again.',
+            'timeout' => 'Captcha expired, please refresh and retry.',
         ],
-        'required' => 'Please complete the Captcha operation!',
-        'sent' => 'Email has been sent! Please check your mailbox! (Email may be in the Trash)',
+        'required' => 'Please complete the captcha!',
+        'sent' => 'Captcha sent to your email, please check including spam folder.',
     ],
     'email' => [
         'error' => [
-            'banned' => 'Your email service provider was banned by our platform. Please use another valid email',
-            'invalid' => 'Your email service provider is not in our supported list. Please use another email
-',
+            'banned' => 'Your email provider is blocked, please use another email.',
+            'invalid' => 'Your email is not supported.',
         ],
     ],
     'error' => [
-        'account_baned' => 'Your account has been banned!',
-        'login_error' => 'Login error, please try again later!',
-        'login_failed' => 'Login failed, please check whether the email or password is entered correctly!',
-        'not_found_user' => 'No associated account found, please use other ways to login',
-        'repeat_request' => 'Please refresh the page and try again',
-        'url_timeout' => 'The link has expired, please try again',
+        'account_baned' => 'Your account is banned!',
+        'login_error' => 'Login error, please retry later!',
+        'login_failed' => 'Login failed, please check email and password!',
+        'not_found_user' => 'No account found, please try other login methods.',
+        'repeat_request' => 'Please refresh and try again.',
+        'url_timeout' => 'Link expired, please request again.',
     ],
-    'failed' => 'These credentials do not match our records.',
+    'failed' => 'Invalid credentials.',
     'invite' => [
-        'attribute' => 'Invitation code',
+        'attribute' => 'Invitation Code',
         'error' => [
-            'unavailable' => 'Invitation code is invalid!',
+            'unavailable' => 'Invalid invitation code, please retry.',
         ],
-        'get' => 'Click to get the invitation code',
-        'not_required' => 'No invitation code is required, you can sign up directly!',
+        'get' => 'Get invitation code',
+        'not_required' => 'No invitation code required, you can register directly!',
     ],
-    'login' => 'Sign in',
+    'login' => 'Login',
     'logout' => 'Logout',
     'maintenance' => 'Maintenance',
-    'maintenance_tip' => 'Maintenance in progress',
+    'maintenance_tip' => 'Under maintenance',
     'oauth' => [
         'bind_failed' => 'Binding failed',
-        'bind_success' => 'Binding successfully',
+        'bind_success' => 'Binding successful',
         'login_failed' => 'Third-party login failed!',
-        'rebind_success' => 'Re-binding successfully',
-        'register' => 'Quick Registration',
+        'rebind_success' => 'Rebinding successful',
+        'register' => 'Quick Register',
         'register_failed' => 'Registration failed',
-        'registered' => 'Already registered, please sign in directly',
+        'registered' => 'Already registered, please login directly.',
         'unbind_failed' => 'Unbinding failed',
-        'unbind_success' => 'Unbinding successfully',
+        'unbind_success' => 'Unbinding successful',
     ],
     'one-click_login' => 'One-Click Login',
     'optional' => 'Optional',
@@ -72,30 +71,30 @@ return [
         'reset' => [
             'attribute' => 'Reset Password',
             'error' => [
-                'demo' => 'You can not change administrator password under Demo environment',
-                'disabled' => 'We have disabled the password reset function, please contact :email for help',
-                'failed' => 'Password reset failed',
-                'same' => 'New password cannot be the same as old password, please re-enter',
-                'throttle' => 'You can only reset your password :time times within 24 hours, please do not operate frequently.',
-                'wrong' => 'Password incorrect, please try again',
+                'demo' => 'Cannot change admin password in demo.',
+                'disabled' => 'Password reset disabled, please contact :email for assistance.',
+                'failed' => 'Password reset failed.',
+                'same' => 'New password cannot be the same as old, 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.',
             ],
-            'sent' => 'Reset link has sent to your mailbox, please check the email (Email may be in the Trash)',
-            'success' => 'New password set successfully, you can sign in now',
+            'sent' => 'Reset link sent to your mailbox, please check including spam folder.',
+            'success' => 'New password reset successfully, you can now login.',
         ],
     ],
     'register' => [
-        'attribute' => 'Sign up',
+        'attribute' => 'Sign Up',
         'code' => 'Registration Code',
         'error' => [
-            'disable' => 'Sorry, we have temporarily stopped accepting new users',
-            'throttle' => 'Anti-bots is active! Please do not send register forms too frequently!',
+            'disable' => 'Sorry, we have temporarily stopped accepting new users.',
+            'throttle' => 'Anti-bot active! Please do not send registration forms too frequently!',
         ],
-        'failed' => 'Registration failed, please try later',
-        'promotion' => 'Still no account? Please go to ',
-        'success' => 'Registration successfully',
+        'failed' => 'Registration failed, please try later.',
+        'promotion' => 'No account yet? Please go to ',
+        'success' => 'Registration successful',
     ],
-    'remember_me' => 'Remember me',
+    'remember_me' => 'Remember Me',
     'request' => 'Request',
-    'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
+    'throttle' => 'Too many attempts, please try again in :seconds seconds.',
     'tos' => 'Terms of Service',
 ];

+ 46 - 44
resources/lang/en/common.php

@@ -1,27 +1,29 @@
 <?php
 
+declare(strict_types=1);
+
 return [
     'hour' => '{1} Hour|{2} O\'clock',
     'account' => 'Account',
-    'available_date' => 'Available Until/Period',
-    'created_at' => 'Created At',
-    'expired_at' => 'Expiration Date',
-    'updated_at' => 'Updated At',
-    'latest_at' => 'Latest Activity',
+    'available_date' => 'Available Until',
+    'created_at' => 'Created On',
+    'expired_at' => 'Expires On',
+    'updated_at' => 'Last Updated',
+    'latest_at' => 'Last Activity',
     'back' => 'Back',
     'back_to' => 'Back to :page',
     'cancel' => 'Cancel',
     'close' => 'Close',
     'close_item' => 'Close :attribute',
     'confirm' => 'Confirm',
-    'continues' => 'Continues',
+    'continues' => 'Continue',
     'open' => 'Open',
     'send' => 'Send',
     'view' => 'View',
     'reset' => 'Reset',
     'copy' => [
         'attribute' => 'Copy',
-        'success' => 'Copy successfully',
+        'success' => 'Copied successfully',
         'failed' => 'Copy failed, please copy manually',
     ],
     'add' => 'Add',
@@ -31,31 +33,31 @@ return [
     'submit_item' => 'Submit :attribute',
     'generate' => 'Generate',
     'generate_item' => 'Generate :attribute',
-    'to_safari' => [0 => 'Click on the upper right corner', 1 => ', Choose ', 2 => 'Open In Safari', 3 => ' to improve your experience.'],
-    'update_browser' => [0 => 'You are using an ', 1 => 'outdated', 2 => ' browser. Please', 3 => 'upgrade your browser', 4 => ' to improve your experience.'],
+    'to_safari' => [0 => 'Click the upper right corner', 1 => ', then choose', 2 => 'Open in Safari', 3 => ' to improve your experience!'],
+    'update_browser' => [0 => 'You are using an ', 1 => 'outdated', 2 => ' browser. Please', 3 => 'upgrade your browser', 4 => 'for the best experience'],
     'apply' => 'Apply',
     'avatar' => 'Avatar',
-    'customize' => 'Custom',
+    'customize' => 'Customize',
     'all' => 'All',
     'default' => 'Default',
     'download' => 'Download',
-    'goto' => 'Goto',
+    'goto' => 'Go to',
     'warning' => 'Warning',
-    'success' => 'Successfully',
-    'success_item' => 'Successful :attribute',
+    'success' => 'Success',
+    'success_item' => ':attribute succeeded',
     'failed' => 'Failed',
-    'failed_item' => ':attribute Failed',
+    'failed_item' => ':attribute failed',
     'update' => 'Update',
     'update_action' => 'Update :action',
     'none' => 'None',
     'new' => 'New',
     'sorry' => 'Sorry',
-    'applied' => ':attribute Applied',
-    'active_item' => 'Active :attribute',
+    'applied' => ':attribute applied',
+    'active_item' => 'Activate :attribute',
     'error' => 'Error',
     'toggle' => 'Toggle',
     'toggle_action' => 'Toggle :action',
-    'request_url' => 'Request Url',
+    'request_url' => 'Request URL',
     'function' => [
         'navigation' => 'Navigation',
         'menubar' => 'Menubar',
@@ -71,23 +73,23 @@ return [
         'fri' => 'Friday',
         'sat' => 'Saturday',
         'weekend' => 'Weekend',
-        'work' => 'Work Day',
-        'next' => 'Next Day',
+        'work' => 'Weekday',
+        'next' => 'Following Day',
     ],
     'qrcode' => ':attribute QrCode',
     'deleted' => 'Deleted',
-    'deleted_item' => ':attribute Deleted',
+    'deleted_item' => ':attribute deleted',
     'print' => 'Print',
     'unlimited' => 'Unlimited',
     'payment' => [
-        'credit' => 'Balance',
+        'credit' => 'Credit',
         'alipay' => 'Alipay',
         'qq' => 'QQ Wallet',
-        'wechat' => 'WeChat Pay ',
-        'crypto' => 'Crypto',
+        'wechat' => 'WeChat Pay',
+        'crypto' => 'Cryptocurrency',
         'manual' => 'Manual Payment',
         'status' => [
-            'wait' => 'Awaiting payment',
+            'wait' => 'Waiting for Payment',
         ],
     ],
     'order' => [
@@ -95,8 +97,8 @@ return [
             'cancel' => 'Canceled',
             'complete' => 'Completed',
             'prepaid' => 'Prepaid',
-            'ongoing' => 'Using',
-            'review' => 'Pending',
+            'ongoing' => 'Ongoing',
+            'review' => 'Pending Review',
         ],
     ],
     'recommend' => 'Recommend',
@@ -108,41 +110,41 @@ return [
     'status' => [
         'attribute' => 'Status',
         'inactive' => 'Inactive',
-        'disabled' => 'Disable',
+        'disabled' => 'Disabled',
         'banned' => 'Banned',
         'normal' => 'Normal',
-        'enabled' => 'Active',
+        'enabled' => 'Enabled',
         'expire' => 'Expired',
-        'limited' => 'Limitations',
-        'run_out' => 'Out of traffic',
+        'limited' => 'Limited',
+        'run_out' => 'Data Used Up',
         'unused' => 'Unused',
         'used' => 'Used',
         'closed' => 'Closed',
         'applying' => 'Applying',
         'withdrawn' => 'Withdrawn',
-        'unwithdrawn' => 'Not withdrawn',
+        'unwithdrawn' => 'Unwithdrawn',
         'reply' => 'Replied',
         'pending' => 'Pending',
         'unknown' => 'Unknown',
-        'available' => 'Active',
+        'available' => 'Available',
         'reject' => 'Reject',
         'rejected' => 'Rejected',
-        'review' => 'Pending approval',
-        'reviewed' => 'Approve pending payment',
-        'paid' => 'Waited',
-        'payment_pending' => 'To be paid',
-        'pass' => 'Passed',
-        'send_to_credit' => 'Credit to Balance',
-        'waiting_tobe_send' => 'Waiting for delivery',
+        'review' => 'Pending Review',
+        'reviewed' => 'Reviewed',
+        'paid' => 'Paid',
+        'payment_pending' => 'Payment Pending',
+        'pass' => 'Pass',
+        'send_to_credit' => 'Add to Credit',
+        'waiting_tobe_send' => 'Waiting to Send',
     ],
-    'stay_unchanged' => 'Leave blank for no change',
-    'random_generate' => 'Leave blank to randomly generate',
-    'request_failed' => 'Request error, please try again',
+    'stay_unchanged' => 'Keep empty to stay unchanged',
+    'random_generate' => 'Keep empty for random generate',
+    'request_failed' => 'Request failed, please retry',
     'convert' => 'Convert',
     'import' => 'Import',
     'or' => 'or',
     'more' => 'More',
-    'to' => 'To',
-    'to_be_send' => 'Pending',
+    'to' => 'to',
+    'to_be_send' => 'To be sent',
     'developing' => 'Developing! Stay tuned',
 ];

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

@@ -1,32 +1,34 @@
 <?php
 
+declare(strict_types=1);
+
 return [
     'forbidden' => [
-        'access' => 'IP or Proxy Access Forbidden',
-        'bots' => 'Bots Access Forbidden',
-        'china' => 'Chinese IP or Proxy Access Forbidden',
-        'oversea' => 'Oversea IP or Proxy Access Forbidden',
+        'access' => 'Unknown IP or proxy access detected, access denied',
+        'bots' => 'Bot access detected, access denied',
+        'china' => 'China IP or proxy access detected, access denied',
+        'oversea' => 'Overseas IP or proxy access detected, access denied',
     ],
-    'log' => 'Logs',
+    'log' => 'Log',
     'refresh' => 'Refresh',
-    'refresh_page' => 'Please Refresh Page, Then Try Again',
-    'report' => 'Error comes back with log:',
-    'safe_enter' => 'Secure Entrance',
-    'safe_code' => 'Please enter the security code',
-    'title' => '⚠️Error Detected',
-    'unsafe_enter' => 'Non-Secure Entrance',
+    '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',
+    'title' => '⚠️ Error Triggered',
+    'unsafe_enter' => 'Unsafe Entrance',
     'visit' => 'Please visit',
     'whoops' => 'Whoops!',
-    'get_ip' => 'Get IP information exception',
+    'get_ip' => 'Failed to get IP info',
     'subscribe' => [
-        'unknown' => 'Unknown subscribe URL! Please get a new one!',
-        'sub_baned' => 'Subscribe banned! Visit the web for detail',
-        'user' => 'Wrong URL, Account not exist!',
+        'unknown' => 'Unknown subscription link! Please obtain a new one!',
+        'sub_baned' => 'Subscription banned! Visit the website for details',
+        'user' => 'Wrong URL, account does not exist!',
         'user_disable' => 'Account Disabled! Contact Support!',
-        'baned_until' => 'Account has been banned until :time, Please wait to unlock!',
-        'out' => 'OUT OF DATA! Please consider to purchase new data or reset it!',
+        'baned_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 purchase!',
-        'question' => 'Account Error?! Visit web for detail',
-        'none' => 'No nodes Available',
+        'question' => 'Account Error!? Visit the website for details',
+        'none' => 'No available nodes',
     ],
 ];

+ 116 - 114
resources/lang/en/model.php

@@ -1,5 +1,7 @@
 <?php
 
+declare(strict_types=1);
+
 return [
     'user' => [
         'id' => 'User ID',
@@ -8,148 +10,148 @@ return [
         'username' => 'Username',
         'password' => 'Password',
         'credit' => 'Balance',
-        'invite_num' => 'Available Invitation Code',
-        'reset_date' => 'Reset date',
+        'invite_num' => 'Available Invitations',
+        'reset_date' => 'Data Reset Date',
         'port' => 'Port',
-        'traffic_used' => 'Data Usage',
+        'traffic_used' => 'Data Used',
         'service' => 'Proxy',
         'group' => 'Group',
         'account_status' => 'Account Status',
         'proxy_status' => 'Proxy Status',
         'expired_date' => 'Expiration Date',
-        'role' => 'Role Permissions',
+        'role' => 'Role',
         'wechat' => 'WeChat',
         'qq' => 'QQ',
         'remark' => 'Note',
         'uuid' => 'VMess UUID',
         'proxy_passwd' => 'Proxy Password',
-        'proxy_method' => 'Encryption Method',
-        'usable_traffic' => 'Available Data',
+        'proxy_method' => 'Encryption',
+        'usable_traffic' => 'Data Allowance',
         'proxy_protocol' => 'Protocol',
         'proxy_obfs' => 'Obfuscation',
-        'speed_limit' => 'Speed limit',
+        'speed_limit' => 'Speed Limit',
         'inviter' => 'Inviter',
-        'created_date' => 'Registered at',
+        'created_date' => 'Registration Date',
     ],
     'common' => [
-        'extend' => 'Extension',
-        'sort' => 'Priority',
+        'extend' => 'Extended Info',
+        'sort' => 'Sort',
         'description' => 'Description',
         'type' => 'Type',
         'level' => 'Level',
     ],
     'country' => [
-        'code' => 'ISO Territory Code',
-        'icon' => 'ICON',
-        'name' => 'Territory name',
+        'code' => 'Country Code',
+        'icon' => 'Flag',
+        'name' => 'Country Name',
     ],
     'subscribe' => [
-        'code' => 'Subscription Code',
-        'req_times' => 'Number of requests',
-        'updated_at' => 'Last Request Time',
-        'ban_time' => 'Banned Time',
-        'ban_desc' => 'Banned reason',
+        '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',
     ],
     'oauth' => [
-        'type' => 'Channels',
-        'identifier' => 'Unique identifier',
+        'type' => 'Channel',
+        'identifier' => 'Identifier',
     ],
     'user_group' => [
         'attribute' => 'User Group',
         'name' => 'Group Name',
-        'nodes' => 'Select Nodes',
+        'nodes' => 'Nodes',
     ],
     'node' => [
         'attribute' => 'Node',
         'id' => 'Node ID',
         'name' => 'Name',
-        'domain' => 'Domain Name',
-        'static' => 'Alive',
-        'online_user' => 'Online',
-        'data_consume' => 'Consumption Data',
-        'data_rate' => 'Data Consumption Ratio',
+        'domain' => 'Domain',
+        'static' => 'Alive Status',
+        'online_user' => 'Online Users',
+        'data_consume' => 'Data Usage',
+        'data_rate' => 'Data Ratio',
         'ddns' => 'DDNS',
-        'ipv4' => 'IPv4 Address',
-        'ipv6' => 'IPv6 Address',
-        'push_port' => 'Message Push Port',
-        'rule_group' => 'Audit Group',
+        'ipv4' => 'IPv4',
+        'ipv6' => 'IPv6',
+        'push_port' => 'Push Port',
+        'rule_group' => 'Rule Group',
         'traffic_limit' => 'Speed Limit',
-        'client_limit' => 'Devices Limit',
-        'label' => 'Tags',
-        'country' => 'Territory',
+        'client_limit' => 'Client Limit',
+        'label' => 'Label',
+        'country' => 'Country',
         'udp' => 'UDP',
-        'display' => 'Display & Subscription',
-        'detection' => 'Node Network Detection',
-        'method' => 'Encryption Method',
+        'display' => 'Display & Subscribe',
+        'detection' => 'Block Detection',
+        'method' => 'Encryption',
         'protocol' => 'Protocol',
-        'protocol_param' => 'Protocol parameters',
-        'obfs' => 'Obfuscation',
-        'obfs_param' => 'Obfuscation parameters',
-        'single' => 'Only Port',
-        'transfer' => 'Transit',
+        'protocol_param' => 'Protocol Param',
+        'obfs' => 'Obfs',
+        'obfs_param' => 'Obfs Param',
+        'single' => 'Single Port',
+        'transfer' => 'Relay',
         'service_port' => 'Service Port',
-        'single_passwd' => '[Only] Password',
+        'single_passwd' => '[Single] Password',
         'v2_alter_id' => 'Alter ID',
-        'v2_net' => 'Transport',
-        'v2_cover' => 'Spoofing type',
-        'v2_host' => 'Spoofing domain',
+        'v2_net' => 'Network',
+        'v2_cover' => 'Cover',
+        'v2_host' => 'Host',
         'v2_path' => 'Path | Key',
         'v2_sni' => 'SNI',
         'v2_tls' => 'TLS',
-        'v2_tls_provider' => 'TLS Configuration',
-        'relay_port' => 'Transit Port',
+        'v2_tls_provider' => 'TLS Config',
+        'relay_port' => 'Relay Port',
     ],
     'node_auth' => [
-        'attribute' => 'Node Authorization',
-        'key' => 'Communication key <small>For nodes</small>',
-        'secret' => 'Reverse Communication Key',
+        'attribute' => 'Node Auth',
+        'key' => 'Key <small>for node</small>',
+        'secret' => 'Reverse Secret',
     ],
     'node_cert' => [
-        'attribute' => 'Domain Certificate',
-        'domain' => 'Domain Name',
+        'attribute' => 'Domain Cert',
+        'domain' => 'Domain',
         'key' => 'KEY',
         'pem' => 'PEM',
-        'issuer' => 'Issuing agency',
-        'signed_date' => 'Issue Date',
-        'expired_date' => 'Expiration Date',
+        'issuer' => 'Issuer',
+        'signed_date' => 'Signed Date',
+        'expired_date' => 'Expired Date',
     ],
     'order' => [
         'attribute' => 'Order',
         'id' => 'Order ID',
-        'original_price' => 'Original price',
+        'original_price' => 'Original Price',
         'price' => 'Actual Price',
-        'pay_way' => 'Payment method',
-        'status' => 'Order Status',
+        'pay_way' => 'Payment',
+        'status' => 'Status',
     ],
     'goods' => [
-        'attribute' => 'Product',
+        'attribute' => 'Goods',
         'name' => 'Name',
         'price' => 'Price',
         'category' => 'Category',
-        'renew' => 'Data Reset Price',
-        'user_limit' => 'Speed limit',
-        'period' => 'Reset period',
-        'traffic' => 'Data limit',
-        'invite_num' => 'Gift Invitation Number',
-        'limit_num' => 'Limit purchase quantity',
-        'available_date' => 'Available Period',
-        'hot' => 'Best-selling',
-        'color' => 'Colors',
-        'logo' => 'Product Image',
-        'info' => 'Custom Info List',
+        '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',
     ],
     'rule' => [
-        'attribute' => 'Audit Rule',
+        'attribute' => 'Rule',
         'name' => 'Description',
         'pattern' => 'Value',
     ],
     'rule_group' => [
-        'attribute' => 'Audit Group',
-        'name' => 'Group Name',
-        'type' => 'Audit mode',
-        'rules' => 'Select Audit Rule',
+        'attribute' => 'Rule Group',
+        'name' => 'Name',
+        'type' => 'Type',
+        'rules' => 'Rules',
     ],
     'role' => [
         'attribute' => 'Role',
@@ -157,7 +159,7 @@ return [
         'permissions' => 'Permissions',
     ],
     'permission' => [
-        'attribute' => 'Permission Behavior',
+        'attribute' => 'Permission',
         'description' => 'Description',
         'name' => 'Route Name',
     ],
@@ -165,66 +167,66 @@ return [
         'attribute' => 'Article',
         'category' => 'Category',
         'language' => 'Language',
-        'logo' => 'Image',
-        'created_at' => 'Published Date',
-        'updated_at' => 'Last Update',
+        'logo' => 'Cover',
+        'created_at' => 'Published On',
+        'updated_at' => 'Updated On',
     ],
     'coupon' => [
         'attribute' => 'Coupon',
-        'name' => 'Coupon Name',
-        'sn' => 'Coupon Code',
-        'logo' => 'Coupon Image',
-        'value' => 'Amount of preference',
+        'name' => 'Name',
+        'sn' => 'Code',
+        'logo' => 'Logo',
+        'value' => 'Value',
         'priority' => 'Priority',
-        'usable_times' => 'Useable times',
-        'minimum' => 'Discount condition',
-        'used' => 'Number of individual useable times',
-        'levels' => 'Ranking limit',
+        'usable_times' => 'Usage Limit',
+        'minimum' => 'Minimum Spend',
+        'used' => 'Personal Limit',
+        'levels' => 'Level Limit',
         'groups' => 'Group Limit',
-        'users_whitelist' => 'Licensed User',
-        'users_blacklist' => 'Forbid User',
-        'services_whitelist' => 'Licensed Product',
-        'services_blacklist' => 'Forbid product',
-        'newbie' => 'Newcomer Exclusive',
+        'users_whitelist' => 'Whitelist Users',
+        'users_blacklist' => 'Blacklist Users',
+        'services_whitelist' => 'Whitelist Goods',
+        'services_blacklist' => 'Blacklist Goods',
+        'newbie' => 'New User Only',
         'num' => 'Quantity',
     ],
     'aff' => [
-        'invitee' => 'Consumer',
-        'amount' => 'Consumption Amount',
-        'commission' => 'Rebate amount',
-        'updated_at' => 'Processed at',
-        'created_at' => 'Order Time',
+        'invitee' => 'Buyer',
+        'amount' => 'Order Amount',
+        'commission' => 'Commission',
+        'updated_at' => 'Processed On',
+        'created_at' => 'Ordered On',
     ],
     'referral' => [
-        'created_at' => 'Application Time',
-        'user' => 'Request Account',
-        'amount' => 'Amount to cash-out',
-        'id' => 'Referral ID',
+        'created_at' => 'Applied On',
+        'user' => 'Applicant',
+        'amount' => 'Amount',
+        'id' => 'Application ID',
     ],
     'notification' => [
-        'address' => 'Receive Address',
-        'created_at' => 'Delivery Time',
-        'status' => 'Delivery Status',
+        'address' => 'Recipient',
+        'created_at' => 'Sent On',
+        'status' => 'Status',
     ],
     'ip' => [
-        'network_type' => 'Protocol Type',
-        'info' => 'Location Info',
+        'network_type' => 'Network Type',
+        'info' => 'Location',
     ],
     'user_traffic' => [
         'upload' => 'Upload',
         'download' => 'Download',
         'total' => 'Total',
-        'log_time' => 'Record Time',
+        'log_time' => 'Logged At',
     ],
     'user_data_modify' => [
-        'before' => 'Pre-change Data',
-        'after' => 'Data after change',
-        'created_at' => 'Operation Date/Time',
+        'before' => 'Before',
+        'after' => 'After',
+        'created_at' => 'Changed At',
     ],
     'user_credit' => [
-        'before' => 'Balance before operation',
-        'after' => 'Balance after operation',
-        'amount' => 'Amount of change',
-        'created_at' => 'Operation Date/Time',
+        'before' => 'Before',
+        'after' => 'After',
+        'amount' => 'Amount',
+        'created_at' => 'Changed At',
     ],
 ];

+ 29 - 27
resources/lang/en/notification.php

@@ -1,35 +1,37 @@
 <?php
 
+declare(strict_types=1);
+
 return [
-    'attribute' => 'NOTIFICATIONS',
-    'new' => ':num new message|:num new messages',
-    'empty' => 'No new message',
-    'payment_received' => 'Your order (Amount: :amount) is successfully paid. Click to view details',
-    'account_expired' => 'Account Going to Expire',
-    'account_expired_content' => 'Your account will be expired after [:days] days. For your server experience, please renew your account ahead of time.',
-    'account_expired_blade' => 'Account will be expired in [:day] days, Please renew it in time',
-    'active_email' => 'Please complete the operation within 30 minutes',
-    'close_ticket' => 'Ticket #:id - :title Closed',
-    'view_web' => 'View Our Website',
-    'view_ticket' => 'View The Ticket',
-    'new_ticket' => 'New Ticket Opened: :title',
-    'reply_ticket' => 'New Ticket Replied: :title',
-    'ticket_content' => 'Ticket Content:',
-    'node_block' => 'Node Blocked Warning',
-    'node_offline' => 'Node maybe offline!',
-    'node_offline_content' => 'Following Nodes abnormal: return heartbeats\' information are abnormal, Please pay attention.',
-    'block_report' => 'Blocked Report: ',
-    'traffic_warning' => 'Data Traffic Waring: ',
-    'traffic_remain' => 'Data used: :percent%, please stay tuned!',
-    'traffic_tips' => 'Please pay attention on the service reset day. You may also consider reset your data before the reset day.',
-    'verification_account' => 'Account Verification',
-    'verification' => 'Your verification code: ',
-    'verification_limit' => 'Please complete the operation within :minutes minutes',
-    'data_anomaly' => 'User Data Traffic Abnormal Warning',
-    'data_anomaly_content' => 'User :id: Recent Hourly Data Usage [Upload: :upload | Download: :download | Total: :total]',
+    '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',
+    'active_email' => 'Please complete verification within 30 minutes',
+    'close_ticket' => 'Ticket :id: :title closed',
+    'view_web' => 'View website',
+    'view_ticket' => 'View ticket',
+    'new_ticket' => 'New ticket received: :title',
+    'reply_ticket' => 'Ticket replied: :title',
+    'ticket_content' => 'Ticket content:',
+    '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',
+    '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',
+    'verification' => 'Your verification code:',
+    '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 last 1 hour',
     'node' => [
         'upload' => 'Upload',
-        'download' => 'download',
+        'download' => 'Download',
         'total' => 'Total',
     ],
 ];

+ 133 - 131
resources/lang/en/user.php

@@ -1,29 +1,31 @@
 <?php
 
+declare(strict_types=1);
+
 return [
     'account' => [
-        'credit' => 'Balance',
-        'status' => 'Status',
-        'level' => 'Level',
+        'credit' => 'Account Balance',
+        'status' => 'Account Status',
+        'level' => 'Account Level',
         'group' => 'Group',
         'speed_limit' => 'Speed Limit',
-        'remain' => 'Remaining Data',
-        'time' => 'Package Validity',
+        'remain' => 'Data Remaining',
+        'time' => 'Duration',
         'last_login' => 'Last Login',
-        'reset' => '{0}Data will be reset in <code id="restTime">:days</code>|{1} Data will be reset in :days day|restTime|[2,*] Data will be reset in :days days',
-        'connect_password' => 'Proxy Connect Password',
+        'reset' => '{0} Data will reset in <code id="restTime">:days</code> |{1} :days day left to reset data |[1,*] :days days left to reset data',
+        'connect_password' => 'Proxy Connection Password',
         'reason' => [
-            'normal' => 'Normal',
-            'expired' => 'Expired',
-            'overused' => 'You have reach the <code>:data</code> GB hourly data spend limit<br/> Wait <code id="banedTime">:min</code> to cool down',
+            'normal' => 'Account normal',
+            'expired' => 'Your plan has expired',
+            'overused' => 'You have reached the <code>:data</code> GB hourly data limit<br/> Wait <code id="banedTime">:min</code> to unthrottle',
             'traffic_exhausted' => 'OUT OF DATA',
-            'unknown' => 'UNKNOWN ERROR, Please try to refresh your browser first before contact admin for help',
+            'unknown' => 'UNKNOWN ERROR. Please try refreshing your browser first before contacting admin for help',
         ],
     ],
     'home' => [
         'attendance' => [
-            'attribute' => 'Attendance',
-            'disable' => 'Attendance System is disabled',
+            'attribute' => 'Check In',
+            'disable' => 'Check in disabled',
             'done' => 'Already checked in, come back tomorrow!',
             'success' => 'You got :data data',
             'failed' => 'System ❌ Error',
@@ -32,34 +34,34 @@ return [
         'announcement' => 'Announcements',
         'wechat_push' => 'WeChat Notification Service',
         'chat_group' => 'Chat Group',
-        'empty_announcement' => 'No Announcements',
+        'empty_announcement' => 'No announcements',
     ],
-    'purchase_to_unlock' => 'Unlock after purchasing service',
-    'purchase_required' => 'This feature is disabled for non-paying users! Please',
+    'purchase_to_unlock' => 'Purchase to unlock',
+    'purchase_required' => 'Disabled for non-paying users, please',
     'attribute' => [
         'node' => 'Node',
         'data' => 'Data',
-        'ip' => 'IP Address',
+        'ip' => 'IP',
         'isp' => 'ISP',
-        'address' => 'Address',
+        'address' => 'Location',
     ],
-    'purchase_promotion' => 'Purchase Now!',
+    'purchase_promotion' => 'Purchase service now!',
     'menu' => [
         'helps' => 'Help',
         'home' => 'Home',
         'invites' => 'Invite',
         'invoices' => 'Invoice',
-        'nodes' => 'Node',
-        'referrals' => 'Promotion',
+        'nodes' => 'Nodes',
+        'referrals' => 'Referral',
         'shop' => 'Shop',
-        'profile' => 'Settings',
+        'profile' => 'Profile',
         'tickets' => 'Ticket',
         'admin_dashboard' => 'Dashboard',
     ],
-    'contact' => 'Contact Info',
+    'contact' => 'Contact',
     'oauth' => [
-        'bind_title' => 'Binding Your Social Accounts',
-        'not_bind' => 'Not Yet Bound',
+        'bind_title' => 'Bind Social Account',
+        'not_bind' => 'Not bound',
         'bind' => 'Bind',
         'rebind' => 'Rebind',
         'unbind' => 'Unbind',
@@ -67,150 +69,150 @@ return [
     'coupon' => [
         'discount' => 'Discount',
         'error' => [
-            'unknown' => 'Unknown Coupon',
-            'used' => 'Coupon has been used',
-            'expired' => 'Expired',
-            'run_out' => 'Run Out of Usage',
-            'inactive' => 'Coupon Inactive yet',
-            'wait' => 'The Event will begin until :time, Please wait',
-            'unmet' => 'Conditions of use are not met',
-            'minimum' => 'The minimum requirement of this coupon is :amount',
-            'overused' => 'You can only use this coupon once|You can only use this coupon :times times',
-            'users' => 'This account is not eligible for promotions',
-            'services' => 'This item is not qualify for this discount, please check the promotion terms',
+            'unknown' => 'Invalid coupon',
+            'used' => 'Coupon used',
+            'expired' => 'Coupon expired',
+            'run_out' => 'Coupon exhausted',
+            'inactive' => 'Coupon inactive',
+            'wait' => 'Will be active at :time, please wait!',
+            'unmet' => 'Conditions unmet',
+            'minimum' => 'Minimum amount is :amount',
+            'overused' => 'Can only use :times times',
+            'users' => 'Account not eligible',
+            'services' => 'Goods not eligible, check terms',
         ],
     ],
-    'error_response' => 'Something went wrong, please try again later.',
+    'error_response' => 'Error occurred, please try again later.',
     'invite' => [
-        'attribute' => 'Invitation code',
+        'attribute' => 'Invitation Code',
         'counts' => 'Total <code>:num</code> invitation codes',
-        'tips' => 'Can generate <strong> :num </strong> invitation codes, valid within :days',
-        'logs' => 'Invitation Record',
-        'promotion' => 'Register and activate with your invitation code, Both sides will get <mark>:traffic</mark> traffic as rewards; when invitees purchase services, you will get <mark>:referral_percent%</mark> of their spend amount as commission.',
-        'generate_failed' => 'Failed to generate',
+        'tips' => '<strong>:num</strong> invitations remaining, invitation codes expire after :days days of creation',
+        'logs' => 'Invite Logs',
+        'promotion' => 'Both get :traffic data when registering via your code; You get :referral_percent% commission when invitee purchases',
+        'generate_failed' => 'Failed: Quota exceeded',
     ],
     'reset_data' => [
         'action' => 'Reset Data',
-        'cost' => 'Need <code>:amount</code>',
-        'cost_tips' => 'This following action will cost :amount!',
-        'lack' => 'Insufficient balance. Please recharge!',
-        'logs' => 'User purchase reset data',
-        'success' => 'Reset Successfully',
+        'cost' => 'Cost <code>:amount</code>',
+        'cost_tips' => 'Reset will deduct :amount!',
+        'lack' => 'Lack balance, please top up',
+        'logs' => 'User data reset',
+        'success' => 'Reset success',
     ],
     'referral' => [
-        'link' => 'Referral link',
-        'total' => 'Total rebate :amount (:total times), you can apply for cash withdrawal when it reaches :money.',
-        'logs' => 'Commission records',
-        'failed' => 'Application failed',
-        'success' => 'Application success',
+        'link' => 'Referral Link',
+        'total' => 'Total :amount (:total times), can withdraw over :money',
+        'logs' => 'Commission Logs',
+        'failed' => 'Failed',
+        'success' => 'Success',
         'msg' => [
-            'account' => 'Account has expired, please purchase to active service first',
-            'applied' => 'Application already exists, please wait for the previous application to be processed',
-            'unfulfilled' => 'A minimal amount to created application is :amount',
-            'wait' => 'Please wait for the administrator to review',
-            'error' => 'Rebate order creation failed, please try later or notify the administrator',
+            'account' => 'Account expired, please purchase first',
+            'applied' => 'Application exists, wait for processing',
+            'unfulfilled' => ':amount to withdraw, keep going!',
+            'wait' => 'Wait for admin approval',
+            'error' => 'Error creating order, try again later or contact admin',
         ],
     ],
     'inviter' => 'Inviter',
     'invitee' => 'Invitee',
-    'registered_at' => 'Registration at',
-    'bought_at' => 'Purchased at',
-    'payment_method' => 'Payment method',
+    'registered_at' => 'Register Date',
+    'bought_at' => 'Purchase Date',
+    'payment_method' => 'Payment',
     'pay' => 'Pay',
-    'input_coupon' => 'Please enter the gift code',
-    'recharge' => 'Pay',
-    'recharge_credit' => 'Add Funds',
-    'recharging' => 'Paying...',
+    'input_coupon' => 'Enter coupon',
+    'recharge' => 'Top Up',
+    'recharge_credit' => 'Credit Top Up',
+    'recharging' => 'Topping up...',
     'withdraw_commission' => 'Withdraw Commission',
     'withdraw_at' => 'Withdraw Date',
-    'withdraw_logs' => 'Withdrawal records',
+    'withdraw_logs' => 'Withdraw Logs',
     'withdraw' => 'Withdraw',
-    'scan_qrcode' => 'Please scan the QR code',
+    'scan_qrcode' => 'Scan QR code in client',
     'shop' => [
         'hot' => 'HOT',
-        'limited' => 'LIMIT',
-        'change_amount' => 'Amount',
-        'change_amount_help' => 'Please enter a recharge amount',
-        'buy' => 'Purchase',
+        'limited' => 'Limited',
+        'change_amount' => 'Top Up Amount',
+        'change_amount_help' => 'Enter top up amount',
+        'buy' => 'Buy',
         'description' => 'Description',
         'service' => 'Service',
-        'pay_credit' => 'Pay By Credit',
-        'pay_online' => 'Pay By Online payment',
+        'pay_credit' => 'Credit',
+        'pay_online' => 'Online Payment',
         'price' => 'Price',
         'quantity' => 'Quantity',
         'subtotal' => 'Subtotal',
         'total' => 'Total',
-        'conflict' => 'Service Conflict',
-        'conflict_tips' => '<p>Current order will be set as <code>Prepaid order</code>.<p><ol class="text-left"><li> Prepaid order will be activated after current service expired!</li><li> Your also can activate the order manually</li></ol>',
-        'call4help' => 'Please create a ticket to ask customer service',
+        'conflict' => 'Conflict',
+        'conflict_tips' => '<p>Current purchase will be <code>prepaid</code></p><ol><li>Will auto activate after current package expired!</li><li>Can manually activate after paid</li></ol>',
+        'call4help' => 'Please contact admin',
     ],
     'service' => [
-        'node_count' => 'Include <code>:num</code> Nodes',
-        'country_count' => 'Covered <code>:num</code> Countries or Areas',
-        'unlimited' => 'Unlimited Speed',
+        'node_count' => ':num quality nodes',
+        'country_count' => ':num countries covered',
+        'unlimited' => 'Unlimited',
     ],
     'payment' => [
-        'error' => 'The recharge balance is not compliant',
-        'creating' => 'Creating payment order...',
-        'redirect_stripe' => 'Redirect to Stripe',
-        'qrcode_tips' => 'Please using <strong class="red-600">:software</strong> to scan QrCode',
-        'close_tips' => 'Please complete payment in <code>:minutes minutes</code>, otherwise it will be auto-closed by system',
-        'mobile_tips' => '<strong>Mobile User</strong>: Press QrCode image for a short amount of time -> Save Images -> Open payment software -> Scan it',
+        'error' => 'Invalid top up amount',
+        'creating' => 'Creating payment...',
+        'redirect_stripe' => 'Redirecting to Stripe',
+        'qrcode_tips' => 'Scan with <strong class="red-600">:software</strong>',
+        'close_tips' => 'Complete in <code>:minutes mins</code> or order will close',
+        'mobile_tips' => '<strong>Mobile:</strong> long press QR code -> save image -> open payment app -> scan image to pay',
     ],
     'invoice' => [
         'attribute' => 'Order',
-        'detail' => 'Order Detail',
+        'detail' => 'Records',
         'amount' => 'Amount',
-        'active_prepaid_question' => 'Are you sure to active prepaid order?',
-        'active_prepaid_tips' => 'After active: <br>Current order will be set to  Expired! <br>  Expired dates will be recalculated!',
+        'active_prepaid_question' => 'Activate prepaid package in advance?',
+        'active_prepaid_tips' => 'After activated:<br>- Current package expire immediately!<br>- New expiration starts today!',
     ],
     'node' => [
-        'info' => 'Configuration information',
-        'setting' => 'Proxy settings',
-        'unstable' => 'Node fluctuation/under maintenance',
-        'rate' => ':ratio time data consumption',
+        'info' => 'Config',
+        'setting' => 'Settings',
+        'unstable' => 'Unstable/Maintaining',
+        'rate' => ':ratio X data usage',
     ],
     'subscribe' => [
-        'link' => 'Subscription Link',
-        'tips' => 'Warning: Subscribe Link is for personal used only, Please do not show to anyone else. Otherwise, they may use your service without your permission',
-        'exchange_warning' => 'Exchange Link:\n1. Old Link will be disabled\n2. Proxy connection password will be reset',
-        'custom' => 'Custom Subscribe',
-        'ss_only' => 'Subscribe SS Only',
-        'ssr_only' => 'Subscribe SS/SSR Only',
-        'v2ray_only' => 'Subscribe V2Ray Only',
-        'trojan_only' => 'Subscribe Trojan Only',
-        'error' => 'Exchange Link Error',
+        'link' => 'Subscribe Link',
+        'tips' => 'Warning: Personal use only, do not share to avoid abnormal traffic detection and ban',
+        'exchange_warning' => 'Changing subscription will:\n1. Disable current sub immediately\n2. Change connection password',
+        'custom' => 'Custom Sub',
+        'ss_only' => 'SS only',
+        'ssr_only' => 'SSR (incl. SS) only',
+        'v2ray_only' => 'V2Ray only',
+        'trojan_only' => 'Trojan only',
+        'error' => 'Error changing sub',
         'info' => [
-            'title' => 'Account Summary [Not Live]',
+            'title' => 'Account Summary [Non-Realtime]',
             'upload' => 'Upload',
             'download' => 'Download',
-            'total' => 'Plan Traffic',
+            'total' => 'Plan Data',
         ],
     ],
     'ticket' => [
         'attribute' => 'Ticket',
-        'submit_tips' => 'Submit Ticket?',
-        'reply_confirm' => 'Reply Ticket?',
-        'close_tips' => 'Are you sure to close this ticket?',
+        'submit_tips' => 'Confirm submit ticket?',
+        'reply_confirm' => 'Confirm reply ticket?',
+        'close_tips' => 'Confirm close ticket?',
         'close' => 'Close Ticket',
-        'failed_closed' => 'Error: Ticket has been closed',
-        'reply_placeholder' => 'Say something',
+        'failed_closed' => 'Error: Closed already',
+        'reply_placeholder' => 'Say something...',
         'reply' => 'Reply',
-        'close_msg' => 'Ticket #:id has been closed by user',
-        'title_placeholder' => 'Please describe your questions in short term',
-        'content_placeholder' => 'Please describe in detail the problems you have encountered or where we need our help so that we can help you quickly',
-        'new' => 'Create Ticket',
-        'working_hour' => 'Customer Service',
-        'online_hour' => 'Working Hours',
-        'service_tips' => 'We have different channels to contact, please choose <code> ONE </code> of them! <br> Duplicate requests cause further service delays',
-        'error' => 'Error! Please contact Customer Service',
+        'close_msg' => 'Ticket: ID :id closed by user',
+        'title_placeholder' => 'Briefly describe your issue',
+        'content_placeholder' => 'Describe your issue in details for us to assist quickly',
+        'new' => 'New Ticket',
+        'working_hour' => 'Working Hours',
+        'online_hour' => 'Online Hours',
+        'service_tips' => 'Please use only one contact method! Repeated requests will delay response',
+        'error' => 'Unknown error! Notify admin',
     ],
     'traffic_logs' => [
-        '24hours' => 'Today\'s usage',
-        '30days' => 'Daily Traffic Usage',
-        'tips' => 'Tip: Traffic logs are updated with delays!',
+        '24hours' => 'Today Usage',
+        '30days' => 'This Month Usage',
+        'tips' => 'Note: Data delayed, daily updated next day, hourly next hour',
     ],
-    'client' => 'Client ',
+    'client' => 'Client',
     'tutorials' => 'Tutorials',
     'current_role' => 'Current Role as',
     'knowledge' => [
@@ -218,18 +220,18 @@ return [
         'basic' => 'Basic',
     ],
     'manual' => [
-        'red_packet' => 'Alipay red packet',
-        'hint' => 'After scanning the code to pay, please continue to press 👇[Next]. After pressing 👇[Submit], the manual payment will be reviewed by the administrator!',
-        'step_1' => 'Information',
-        'step_1_title' => 'How to use manual payment correctly',
-        'step_2' => 'Pay',
-        'step_2_title' => 'Get the payment QR code and make payment',
-        'step_3' => 'Complete',
-        'step_3_title' => 'Waiting for payment to be manually confirmed',
-        'remark' => 'Remark Username',
-        'remark_content' => 'Fill in the account used for login to speed up the review of the payment!',
-        'payment_hint' => 'When you pay, please pay the corresponding amount',
-        'pre' => 'Previous',
+        'red_packet' => 'Alipay Red Packet',
+        'hint' => 'Continue to [Next] after scanning QR code until [Submit] to complete payment!!!',
+        'step_1' => 'Note',
+        'step_1_title' => 'How to Pay Manually',
+        'step_2' => 'Payment',
+        'step_2_title' => 'Get QR code and pay',
+        'step_3' => 'Done',
+        'step_3_title' => 'Wait for manual verification',
+        'remark' => 'Account Remark',
+        'remark_content' => 'Fill in your login account for verification',
+        'payment_hint' => 'Please pay exact amount, no refund for overpay, top up for underpay',
+        'pre' => 'Prev',
         'next' => 'Next',
     ],
 ];

+ 1 - 1
resources/lang/zh_CN/admin.php

@@ -161,7 +161,7 @@ return [
             'extend' => '扩展信息',
             'display' => [
                 'invisible' => '完全不可见',
-                'node' => '只显示于【:trans】页面',
+                'node' => '只显示于【线 路】页面',
                 'sub' => '只显示于【订 阅】',
                 'all' => '完全可见',
                 'hint' => '用户是否可订阅/查看本节点',

+ 2 - 2
resources/views/admin/node/info.blade.php

@@ -156,7 +156,7 @@
                                             <li class="list-inline-item">
                                                 <div class="radio-custom radio-primary">
                                                     <input type="radio" id="page_only" name="is_display" value="1"/>
-                                                    <label for="page_only">{{ trans('admin.node.info.display.node', ['trans' => trans('user.menu.nodes')]) }}</label>
+                                                    <label for="page_only">{{ trans('admin.node.info.display.node') }}</label>
                                                 </div>
                                             </li>
                                             <li class="list-inline-item">
@@ -290,7 +290,7 @@
                                                 <div class="form-group row obfs_param">
                                                     <label for="obfs_param" class="col-md-3 col-form-label"> {{ trans('model.node.obfs_param') }} </label>
                                                     <textarea class="form-control col-md-8" rows="5" name="obfs_param" id="obfs_param"
-                                                              placeholder="{{ trans('admin.node.info.obfs_param_hint') }}"></textarea>
+                                                              placeholder="{!! trans('admin.node.info.obfs_param_hint') !!}"></textarea>
                                                 </div>
                                                 <div class="form-group row">
                                                     <label class="col-md-3 col-form-label">{{ trans('admin.node.proxy_info') }}</label>