瀏覽代碼

Update translation files

BrettonYe 1 年之前
父節點
當前提交
3b5177e99a
共有 74 個文件被更改,包括 6254 次插入5362 次删除
  1. 3 3
      app/Http/Controllers/User/SubscribeController.php
  2. 3 3
      app/Http/Controllers/UserController.php
  3. 3 3
      config/common.php
  4. 129 56
      resources/lang/de.json
  5. 403 398
      resources/lang/de/admin.php
  6. 37 37
      resources/lang/de/auth.php
  7. 37 44
      resources/lang/de/common.php
  8. 14 14
      resources/lang/de/errors.php
  9. 1 1
      resources/lang/de/http-statuses.php
  10. 63 63
      resources/lang/de/model.php
  11. 18 18
      resources/lang/de/notification.php
  12. 121 121
      resources/lang/de/user.php
  13. 49 0
      resources/lang/de/validation.php
  14. 129 58
      resources/lang/en.json
  15. 92 87
      resources/lang/en/admin.php
  16. 17 17
      resources/lang/en/auth.php
  17. 15 22
      resources/lang/en/common.php
  18. 13 13
      resources/lang/en/errors.php
  19. 1 1
      resources/lang/en/notification.php
  20. 101 101
      resources/lang/en/user.php
  21. 49 0
      resources/lang/en/validation.php
  22. 129 56
      resources/lang/fa.json
  23. 531 534
      resources/lang/fa/admin.php
  24. 48 48
      resources/lang/fa/auth.php
  25. 48 55
      resources/lang/fa/common.php
  26. 19 19
      resources/lang/fa/errors.php
  27. 70 70
      resources/lang/fa/model.php
  28. 25 25
      resources/lang/fa/notification.php
  29. 122 122
      resources/lang/fa/user.php
  30. 49 0
      resources/lang/fa/validation.php
  31. 129 56
      resources/lang/ja.json
  32. 432 427
      resources/lang/ja/admin.php
  33. 53 53
      resources/lang/ja/auth.php
  34. 51 58
      resources/lang/ja/common.php
  35. 18 18
      resources/lang/ja/errors.php
  36. 54 54
      resources/lang/ja/model.php
  37. 25 25
      resources/lang/ja/notification.php
  38. 30 30
      resources/lang/ja/user.php
  39. 49 0
      resources/lang/ja/validation.php
  40. 129 56
      resources/lang/ko.json
  41. 453 448
      resources/lang/ko/admin.php
  42. 44 44
      resources/lang/ko/auth.php
  43. 52 59
      resources/lang/ko/common.php
  44. 22 22
      resources/lang/ko/errors.php
  45. 58 58
      resources/lang/ko/model.php
  46. 24 24
      resources/lang/ko/notification.php
  47. 120 120
      resources/lang/ko/user.php
  48. 49 0
      resources/lang/ko/validation.php
  49. 129 56
      resources/lang/vi.json
  50. 431 426
      resources/lang/vi/admin.php
  51. 32 32
      resources/lang/vi/auth.php
  52. 39 46
      resources/lang/vi/common.php
  53. 13 13
      resources/lang/vi/errors.php
  54. 71 71
      resources/lang/vi/model.php
  55. 17 17
      resources/lang/vi/notification.php
  56. 113 113
      resources/lang/vi/user.php
  57. 49 0
      resources/lang/vi/validation.php
  58. 129 58
      resources/lang/zh_CN.json
  59. 117 118
      resources/lang/zh_CN/admin.php
  60. 22 22
      resources/lang/zh_CN/auth.php
  61. 10 17
      resources/lang/zh_CN/common.php
  62. 6 6
      resources/lang/zh_CN/errors.php
  63. 8 8
      resources/lang/zh_CN/model.php
  64. 1 1
      resources/lang/zh_CN/notification.php
  65. 76 76
      resources/lang/zh_CN/user.php
  66. 49 0
      resources/lang/zh_CN/validation.php
  67. 6 4
      resources/views/admin/logs/order.blade.php
  68. 158 141
      resources/views/user/buy.blade.php
  69. 282 253
      resources/views/user/index.blade.php
  70. 1 1
      resources/views/user/knowledge.blade.php
  71. 2 2
      resources/views/user/layouts.blade.php
  72. 145 133
      resources/views/user/nodeList.blade.php
  73. 130 125
      resources/views/user/referral.blade.php
  74. 87 82
      resources/views/user/ticketList.blade.php

+ 3 - 3
app/Http/Controllers/User/SubscribeController.php

@@ -37,7 +37,7 @@ class SubscribeController extends Controller
         }
 
         if ($subscribe->status !== 1) {
-            return $this->failed(trans('errors.subscribe.sub_baned'));
+            return $this->failed(trans('errors.subscribe.sub_banned'));
         }
 
         // 检查用户是否有效
@@ -48,12 +48,12 @@ class SubscribeController extends Controller
         }
 
         if ($user->status === -1) {
-            return $this->failed(trans('errors.subscribe.user_disable'));
+            return $this->failed(trans('errors.subscribe.user_disabled'));
         }
 
         if ($user->enable !== 1) {
             if ($user->ban_time) {
-                return $this->failed(trans('errors.subscribe.baned_until', ['time' => $user->ban_time]));
+                return $this->failed(trans('errors.subscribe.banned_until', ['time' => $user->ban_time]));
             }
 
             $unusedTraffic = $user->transfer_enable - $user->used_traffic;

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

@@ -235,7 +235,7 @@ class UserController extends Controller
         $order = Order::userActivePlan()->firstOrFail();
         $renewCost = $order->goods->renew;
         if ($user->credit < $renewCost) {
-            return Response::json(['status' => 'fail', 'message' => trans('user.reset_data.lack')]);
+            return Response::json(['status' => 'fail', 'message' => trans('user.reset_data.insufficient')]);
         }
 
         $user->update(['u' => 0, 'd' => 0]);
@@ -487,13 +487,13 @@ class UserController extends Controller
 
             DB::commit();
 
-            return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.replace')])]);
+            return Response::json(['status' => 'success', 'message' => trans('common.success_item', ['attribute' => trans('common.change')])]);
         } catch (Exception $e) {
             DB::rollBack();
 
             Log::error(trans('user.subscribe.error').':'.$e->getMessage());
 
-            return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.replace')]).$e->getMessage()]);
+            return Response::json(['status' => 'fail', 'message' => trans('common.failed_item', ['attribute' => trans('common.change')]).$e->getMessage()]);
         }
     }
 

+ 3 - 3
config/common.php

@@ -86,10 +86,10 @@ return [
     ],
 
     'currency' => [
-        'ca' => ['name' => 'Canadian dollar', 'code' => 'CAD', 'symbol' => 'C$'],
+        'ca' => ['name' => 'Canadian Dollar', 'code' => 'CAD', 'symbol' => 'C$'],
         'eu' => ['name' => 'Euro', 'code' => 'EUR', 'symbol' => '€'],
-        'gb' => ['name' => 'Pound sterling', 'code' => 'GBP', 'symbol' => '£'],
-        'sg' => ['name' => 'Singapore dollar', 'code' => 'SGD', 'symbol' => 'S$'],
+        'gb' => ['name' => 'Pound Sterling', 'code' => 'GBP', 'symbol' => '£'],
+        'sg' => ['name' => 'Singapore Dollar', 'code' => 'SGD', 'symbol' => 'S$'],
         'us' => ['name' => 'US Dollar', 'code' => 'USD', 'symbol' => '$'],
         'cn' => ['name' => '人民币', 'code' => 'CNY', 'symbol' => '¥'],
         'tw' => ['name' => '新臺幣', 'code' => 'TWD', 'symbol' => 'NT$'],

+ 129 - 56
resources/lang/de.json

@@ -1,57 +1,130 @@
 {
-    "(and :count more error)": "(und :count weiterer Fehler)",
-    "(and :count more errors)": "(und :count weitere Fehler)",
-    "All rights reserved.": "Alle Rechte vorbehalten.",
-    "Forbidden": "Verboten",
-    "Go to page :page": "Gehe zur Seite :page",
-    "Hello!": "Hallo!",
-    "If you did not create an account, no further action is required.": "Wenn Sie kein Konto erstellt haben, sind keine weiteren Handlungen nötig.",
-    "If you did not request a password reset, no further action is required.": "Wenn Sie kein Zurücksetzen des Passworts beantragt haben, sind keine weiteren Handlungen nötig.",
-    "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Sollten Sie Schwierigkeiten haben, die Schaltfläche \":actionText\" zu klicken, kopieren Sie den nachfolgenden Link\n in Ihre Adresszeile des Browsers.",
-    "Invalid JSON was returned from the route.": "Von der Route wurde ein ungültiger JSON-Code zurückgegeben.",
-    "Login": "Anmelden",
-    "Logout": "Abmelden",
-    "Not Found": "Nicht gefunden",
-    "of": "von",
-    "Page Expired": "Seite abgelaufen",
-    "Pagination Navigation": "Seitennummerierungsnavigation",
-    "Payment Required": "Zahlung erforderlich",
-    "Please click the button below to verify your email address.": "Bitte klicken Sie auf die Schaltfläche, um Ihre E-Mail-Adresse zu bestätigen.",
-    "Regards": "Mit freundlichen Grüßen",
-    "Register": "Registrieren",
-    "Reset Password": "Passwort zurücksetzen",
-    "Reset Password Notification": "Benachrichtigung zum Zurücksetzen des Passworts",
-    "results": "Ergebnisse",
-    "Server Error": "Interner Fehler",
-    "Service Unavailable": "Service nicht verfügbar",
-    "Showing": "Zeigen",
-    "The given data was invalid.": "Die gegebenen Daten waren ungültig.",
-    "The response is not a streamed response.": "Die Antwort ist keine gestreamte Antwort.",
-    "The response is not a view.": "Die Antwort ist keine Ansicht.",
-    "This password reset link will expire in :count minutes.": "Dieser Link zum Zurücksetzen des Passworts läuft in :count Minuten ab.",
-    "to": "bis",
-    "Toggle navigation": "Navigation umschalten",
-    "Too Many Requests": "Zu viele Anfragen",
-    "Unauthorized": "Nicht autorisiert",
-    "Verify Email Address": "E-Mail-Adresse bestätigen",
-    "Whoops!": "Ups!",
-    "You are receiving this email because we received a password reset request for your account.": "Sie erhalten diese E-Mail, weil wir einen Antrag auf eine Zurücksetzung Ihres Passworts bekommen haben.",
-    "----「:job」Completed, Used :time seconds ----": "----「:job」Abgeschlossen, :time Sekunden benötigt----",
-    "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[Auto Task] Service gesperrt: Anormaler Datenverkehr innerhalb von 1 Stunde",
-    "[Auto Task] Blocked service: Run out of traffic": "[Auto Task] Service gesperrt: Kein Datenvolumen mehr verfügbar",
-    "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[Auto Task] Abo gesperrt: Abo mit anormalen Anfragen innerhalb von 24 Stunden",
-    "[Daily Task] Account Expiration: Block Login & Clear Account": "[Tägliche Aufgabe] Account Ablauf: Login blockiert & Account gelöscht",
-    "[Daily Task] Account Expiration: Stop Service": "[Tägliche Aufgabe] Account Ablauf: Service gestoppt",
-    "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[Tägliche Aufgabe] Account Datenverbrauch zurückgesetzt, nächstes Zurücksetzen am: :date",
-    "[Service Timer] Service Expiration": "[Zeitgesteuerter Service] Service Ablauf",
-    "Daily Data Usage Report": "Täglicher Datenverbrauchsbericht",
-    "Invoice Detail": "Rechnungsdetails",
-    "Payment for #:sn has been received! Total amount: :amount.": "Zahlung für #:sn wurde erhalten! Gesamtbetrag: :amount.",
-    "Payment Received": "Zahlung erhalten",
-    "Subscription link receive abnormal access and banned by the system": "Zugriff auf Abonnement-Link war anomal und wurde vom System gesperrt",
-    "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "Vielen Dank für Ihre Registrierung! Bevor Sie starten, müssen Sie Ihre E-Mail Adresse bestätigen, indem Sie auf den Link klicken, den wir Ihnen geschickt haben. Sollten Sie keine E-Mail erhalten haben, schicken wir Ihnen gerne eine neue.",
-    "Verify Your Email Address": "Bestätigen Sie Ihre E-Mail Adresse",
-    "You have not responded this ticket in :num hours, System has closed your ticket.": "Sie haben dieses Ticket für :num Stunden nicht beantwortet, das System hat Ihr Ticket geschlossen.",
-    "You must have a valid subscription to view the content in this area!": "Sie benötigen ein gültiges Abonnement um den Inhalt anzusehen!",
-    "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Ihr Abonnement wurde von einem Administrator deaktiviert, bitte kontaktieren Sie den Administrator um es wiederherzustellen."
-}
+  "(and :count more error)": "(und :count weiterer Fehler)",
+  "(and :count more errors)": "(und :count weitere Fehler)",
+  "----「:job」Completed, Used :time seconds ----": "----「:job」abgeschlossen, benötigte :time Sekunden ----",
+  "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[Automatische Aufgabe] Dienst blockiert: Ungewöhnlicher Datenverkehr innerhalb von 1 Stunde",
+  "[Auto Task] Blocked service: Run out of traffic": "[Automatische Aufgabe] Dienst blockiert: Datenvolumen aufgebraucht",
+  "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[Automatische Aufgabe] Abonnement blockiert: Ungewöhnliche Anfragen innerhalb von 24 Stunden",
+  "[Auto Task] Unblocked Service: Account ban expired": "[Automatische Aufgabe] Dienst freigegeben: Kontosperre abgelaufen",
+  "[Auto Task] Unblocked Service: Account has available data traffic": "[Automatische Aufgabe] Dienst freigegeben: Konto hat verfügbares Datenvolumen",
+  "[Daily Task] Account Expiration: Block Login & Clear Account": "[Tägliche Aufgabe] Konto abgelaufen: Login blockieren und Konto löschen",
+  "[Daily Task] Account Expiration: Stop Service": "[Tägliche Aufgabe] Konto abgelaufen: Dienst stoppen",
+  "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[Tägliche Aufgabe] Kontodatenvolumen zurücksetzen, nächstes Rücksetzdatum: :date",
+  "[Service Timer] Service Expiration": "[Dienst-Timer] Dienst abgelaufen",
+  "A Timeout Occurred": "Ein Timeout ist aufgetreten",
+  "Accepted": "Akzeptiert",
+  "All rights reserved.": "Alle Rechte vorbehalten.",
+  "Already Reported": "Bereits gemeldet",
+  "Bad Gateway": "Schlechtes Tor",
+  "Bad Request": "Schlechte Anfrage",
+  "Bandwidth Limit Exceeded": "Bandbreitengrenze überschritten",
+  "Client Closed Request": "Client-Closed-Request",
+  "Conflict": "Konflikt",
+  "Connection Closed Without Response": "Verbindung ohne Antwort geschlossen",
+  "Connection Timed Out": "Verbindung abgelaufen",
+  "Continue": "Weiter",
+  "Created": "Erstellt",
+  "Daily Data Usage Report": "Täglicher Datenverbrauchsbericht",
+  "Expectation Failed": "Erwartung gescheitert",
+  "Failed Dependency": "Fehlgeschlagene Abhängigkeit",
+  "Forbidden": "Verboten",
+  "Found": "Gefunden",
+  "Gateway Timeout": "Gateway-Zeitüberschreitung",
+  "Go to page :page": "Gehe zur Seite :page",
+  "Gone": "Gegangen",
+  "Hello!": "Hallo!",
+  "HTTP Version Not Supported": "HTTP Version nicht unterstützt",
+  "I'm a teapot": "Ich bin eine Teekanne",
+  "If you did not create an account, no further action is required.": "Wenn Sie kein Konto erstellt haben, sind keine weiteren Handlungen nötig.",
+  "If you did not request a password reset, no further action is required.": "Wenn Sie kein Zurücksetzen des Passworts beantragt haben, sind keine weiteren Handlungen nötig.",
+  "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Sollten Sie Schwierigkeiten haben, die Schaltfläche \":actionText\" zu klicken, kopieren Sie den nachfolgenden Link\n in Ihre Adresszeile des Browsers.",
+  "IM Used": "IM verwendet",
+  "Insufficient Storage": "Ungenügende Speicherung",
+  "Internal Server Error": "Interner Serverfehler",
+  "Invalid JSON was returned from the route.": "Von der Route wurde ein ungültiger JSON-Code zurückgegeben.",
+  "Invalid SSL Certificate": "Ungültiges SSL-Zertifikat",
+  "Invoice Detail": "Rechnungsdetails",
+  "Length Required": "Länge erforderlich",
+  "Locked": "Gesperrt",
+  "Login": "Anmelden",
+  "Logout": "Abmelden",
+  "Loop Detected": "Schleife erkannt",
+  "Maintenance Mode": "Wartungsmodus",
+  "Method Not Allowed": "Methode nicht erlaubt",
+  "Misdirected Request": "Fehlgeleitete Anfrage",
+  "Moved Permanently": "Permanent verschoben",
+  "Multi-Status": "Multistatus",
+  "Multiple Choices": "Mehrfachauswahl",
+  "Network Authentication Required": "Netzwerkauthentifizierung erforderlich",
+  "Network Connect Timeout Error": "Zeitüberschreitungsfehler bei Netzwerkverbindung",
+  "Network Read Timeout Error": "Zeitüberschreitungsfehler beim Lesen des Netzwerks",
+  "No Content": "Kein Inhalt",
+  "Non-Authoritative Information": "Nicht maßgebende Informationen",
+  "Not Acceptable": "Nicht annehmbar",
+  "Not Extended": "Nicht erweitert",
+  "Not Found": "Nicht gefunden",
+  "Not Implemented": "Nicht implementiert",
+  "Not Modified": "Nicht modifiziert",
+  "of": "von",
+  "OK": "OK",
+  "Origin Is Unreachable": "Ursprung ist nicht erreichbar",
+  "Page Expired": "Seite abgelaufen",
+  "Pagination Navigation": "Seitennummerierungsnavigation",
+  "Partial Content": "Teilinhalt",
+  "Payload Too Large": "Nutzlast zu groß",
+  "Payment for #:sn has been received! Total amount: :amount.": "Zahlung für #:sn wurde erhalten! Gesamtbetrag: :amount.",
+  "Payment Received": "Zahlung erhalten",
+  "Payment Required": "Zahlung erforderlich",
+  "Permanent Redirect": "Permanente Weiterleitung",
+  "Please click the button below to verify your email address.": "Bitte klicken Sie auf die Schaltfläche, um Ihre E-Mail-Adresse zu bestätigen.",
+  "Precondition Failed": "Vorbedingung fehlgeschlagen",
+  "Precondition Required": "Voraussetzung erforderlich",
+  "Processing": "Verarbeitung",
+  "Proxy Authentication Required": "Proxy-Authentifizierung erforderlich",
+  "Railgun Error": "Railgun-Fehler",
+  "Range Not Satisfiable": "Bereich nicht erfüllbar",
+  "Regards": "Mit freundlichen Grüßen",
+  "Register": "Registrieren",
+  "Request Header Fields Too Large": "Kopfzeilenfelder zu groß anfordern",
+  "Request Timeout": "Zeitüberschreitung anfordern",
+  "Reset Content": "Inhalt zurücksetzen",
+  "Reset Password": "Passwort zurücksetzen",
+  "Reset Password Notification": "Benachrichtigung zum Zurücksetzen des Passworts",
+  "results": "Ergebnisse",
+  "Retry With": "Wiederhole mit",
+  "See Other": "Andere sehen",
+  "Server Error": "Interner Fehler",
+  "Service Unavailable": "Service nicht verfügbar",
+  "Session Has Expired": "Sitzung ist abgelaufen",
+  "Showing": "Zeigen",
+  "SSL Handshake Failed": "SSL Handshake fehlgeschlagen",
+  "Subscription link receive abnormal access and banned by the system": "Abonnementlink erhält ungewöhnlichen Zugriff und wurde vom System gesperrt",
+  "Switching Protocols": "Schaltprotokolle",
+  "Temporary Redirect": "Temporäre Weiterleitung",
+  "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "Vielen Dank für Ihre Anmeldung! Bevor Sie beginnen, müssen Sie Ihre E-Mail-Adresse bestätigen, indem Sie auf den Link klicken, den wir gerade an Ihre E-Mail gesendet haben! Wenn Sie keine E-Mail erhalten haben, senden wir Ihnen gerne eine weitere.",
+  "The given data was invalid.": "Die gegebenen Daten waren ungültig.",
+  "The response is not a streamed response.": "Die Antwort ist keine gestreamte Antwort.",
+  "The response is not a view.": "Die Antwort ist keine Ansicht.",
+  "This password reset link will expire in :count minutes.": "Dieser Link zum Zurücksetzen des Passworts läuft in :count Minuten ab.",
+  "to": "bis",
+  "Toggle navigation": "Navigation umschalten",
+  "Too Early": "Zu früh",
+  "Too Many Requests": "Zu viele Anfragen",
+  "Unauthorized": "Nicht autorisiert",
+  "Unavailable For Legal Reasons": "Aus rechtlichen Gründen nicht verfügbar",
+  "Unknown Error": "Unbekannter Fehler",
+  "Unprocessable Entity": "Unverfügbare Entität",
+  "Unsupported Media Type": "Nicht unterstützter Medientyp",
+  "Upgrade Required": "Upgrade erforderlich",
+  "URI Too Long": "URI zu lang",
+  "Use Proxy": "Proxy verwenden",
+  "Variant Also Negotiates": "Variante verhandelt auch",
+  "Verify Email Address": "E-Mail-Adresse bestätigen",
+  "Verify Your Email Address": "Verifizieren Sie Ihre E-Mail-Adresse",
+  "Web Server is Down": "Webserver ist ausgefallen",
+  "Whoops!": "Ups!",
+  "You are receiving this email because we received a password reset request for your account.": "Sie erhalten diese E-Mail, weil wir einen Antrag auf eine Zurücksetzung Ihres Passworts bekommen haben.",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": "Sie haben auf dieses Ticket innerhalb von :num Stunden nicht geantwortet, das System hat Ihr Ticket geschlossen.",
+  "You must have a valid subscription to view the content in this area!": "Sie müssen ein gültiges Abonnement haben, um den Inhalt in diesem Bereich zu sehen!",
+  "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Ihr Abonnement wurde vom Administrator deaktiviert, bitte kontaktieren Sie den Administrator, um es wiederherzustellen."
+}

File diff suppressed because it is too large
+ 403 - 398
resources/lang/de/admin.php


+ 37 - 37
resources/lang/de/auth.php

@@ -3,40 +3,40 @@
 declare(strict_types=1);
 
 return [
-    'accept_term' => 'Ich habe gelesen und akzeptiert',
+    'accept_term' => 'Ich habe gelesen und akzeptiere',
     'active' => [
         'attribute' => 'Aktivieren',
         'error' => [
-            'activated' => 'Konto bereits aktiviert, keine erneute Aktivierung erforderlich',
-            'disable' => 'Kontoaktivierung deaktiviert, Sie können sich direkt anmelden!',
-            'throttle' => 'Limit für Aktivierungsanfragen erreicht, bitte nicht zu häufig ausführen! Kontaktieren Sie bei Fragen: :email',
+            'activated' => 'Konto bereits aktiviert, erneute Aktivierung nicht erforderlich',
+            'disable' => 'Die Kontoaktivierung ist deaktiviert, Sie können sich direkt anmelden!',
+            'throttle' => 'Sie haben das Aktivierungsanfragelimit erreicht, bitte versuchen Sie es später erneut! Bei Fragen kontaktieren Sie :email.',
         ],
         'promotion' => 'Konto noch nicht aktiviert, bitte zuerst [:action]!',
-        'sent' => 'Aktivierungslink wurde an Ihre E-Mail gesendet, bitte auch Spam-Ordner prüfen.',
+        'sent' => 'Aktivierungs-E-Mail wurde an Ihr Postfach gesendet, bitte überprüfen Sie es (einschließlich des Spam-Ordners).',
     ],
-    'aup' => 'Akzeptable Nutzungsbedingungen',
+    'aup' => 'Akzeptable Nutzungsrichtlinien',
     'captcha' => [
         'attribute' => 'Captcha',
         'error' => [
-            'failed' => 'Captcha-Verifizierung fehlgeschlagen, bitte erneut versuchen',
-            'timeout' => 'Captcha abgelaufen, bitte aktualisieren und erneut versuchen.',
+            'failed' => 'Captcha-Überprüfung fehlgeschlagen, bitte erneut versuchen',
+            'timeout' => 'Captcha ist abgelaufen, bitte aktualisieren und erneut versuchen.',
         ],
-        'required' => 'Bitte Captcha ausfüllen!',
-        'sent' => 'Captcha an Ihre E-Mail gesendet, bitte auch Spam-Ordner prüfen.',
+        'required' => 'Bitte vervollständigen Sie das Captcha!',
+        'sent' => 'Captcha wurde an Ihre E-Mail gesendet, bitte überprüfen Sie es (einschließlich des Spam-Ordners).',
     ],
     'email' => [
         'error' => [
-            'banned' => 'Ihr E-Mail-Anbieter ist gesperrt, bitte eine andere E-Mail verwenden.',
+            'banned' => 'Ihr E-Mail-Anbieter ist blockiert, bitte verwenden Sie eine andere E-Mail.',
             'invalid' => 'Ihre E-Mail wird nicht unterstützt.',
         ],
     ],
     'error' => [
-        'account_baned' => 'Ihr Konto ist gesperrt!',
-        'login_error' => 'Login-Fehler, bitte später erneut versuchen!',
-        'login_failed' => 'Login fehlgeschlagen, bitte E-Mail und Passwort prüfen!',
-        'not_found_user' => 'Kein Konto gefunden, bitte andere Login-Methode versuchen.',
-        'repeat_request' => 'Bitte aktualisieren und erneut versuchen.',
-        'url_timeout' => 'Link abgelaufen, bitte erneut anfordern.',
+        'account_baned' => 'Ihr Konto wurde gesperrt!',
+        'login_error' => 'Anmeldefehler, bitte versuchen Sie es später erneut!',
+        'login_failed' => 'Anmeldung fehlgeschlagen, bitte überprüfen Sie Ihren Benutzernamen und Ihr Passwort!',
+        'not_found_user' => 'Kein Konto gefunden, bitte versuchen Sie andere Anmeldemethoden.',
+        'repeat_request' => 'Bitte keine wiederholten Anfragen, aktualisieren und erneut versuchen.',
+        'url_timeout' => 'Der Link ist abgelaufen, bitte erneut anfordern.',
     ],
     'failed' => 'Diese Kombination aus Zugangsdaten wurde nicht in unserer Datenbank gefunden.',
     'invite' => [
@@ -44,25 +44,25 @@ return [
         'error' => [
             'unavailable' => 'Ungültiger Einladungscode, bitte erneut versuchen.',
         ],
-        'get' => 'Einladungscode anfordern',
+        'get' => 'Einladungscode erhalten',
         'not_required' => 'Kein Einladungscode erforderlich, Sie können sich direkt registrieren!',
     ],
-    'login' => 'Login',
-    'logout' => 'Logout',
+    'login' => 'Anmelden',
+    'logout' => 'Abmelden',
     'maintenance' => 'Wartung',
     'maintenance_tip' => 'In Wartung',
     'oauth' => [
         'bind_failed' => 'Bindung fehlgeschlagen',
         'bind_success' => 'Bindung erfolgreich',
-        'login_failed' => 'Social-Login fehlgeschlagen!',
-        'rebind_success' => 'Erneute Bindung erfolgreich',
+        'login_failed' => 'Drittanbieter-Anmeldung fehlgeschlagen!',
+        'rebind_success' => 'Neubindung erfolgreich',
         'register' => 'Schnellregistrierung',
         'register_failed' => 'Registrierung fehlgeschlagen',
         'registered' => 'Bereits registriert, bitte direkt anmelden.',
-        'unbind_failed' => 'Aufhebung der Bindung fehlgeschlagen',
-        'unbind_success' => 'Bindung aufgehoben',
+        'unbind_failed' => 'Entbindung fehlgeschlagen',
+        'unbind_success' => 'Entbindung erfolgreich',
     ],
-    'one-click_login' => 'Ein-Klick-Login',
+    'one-click_login' => 'Ein-Klick-Anmeldung',
     'optional' => 'Optional',
     'password' => [
         'forget' => 'Passwort vergessen?',
@@ -71,29 +71,29 @@ return [
         'reset' => [
             'attribute' => 'Passwort zurücksetzen',
             'error' => [
-                'demo' => 'Änderung des Admin-Passworts in Demo nicht möglich.',
-                'disabled' => 'Passwortzurücksetzung deaktiviert, bitte kontaktieren Sie für Hilfe: :email',
-                'failed' => 'Zurücksetzen des Passworts fehlgeschlagen.',
-                'same' => 'Neues Passwort darf nicht gleich wie altes sein, bitte erneut eingeben.',
-                'throttle' => 'Sie können Ihr Passwort nur :time Mal in 24 Stunden zurücksetzen, bitte nicht zu häufig ausführen.',
+                'demo' => 'Ändern des Administratorpassworts im Demomodus nicht möglich.',
+                'disabled' => 'Passwortzurücksetzung deaktiviert, bitte kontaktieren Sie :email für Unterstützung.',
+                'failed' => 'Passwortzurücksetzung fehlgeschlagen.',
+                'same' => 'Das neue Passwort darf nicht mit dem alten übereinstimmen, bitte erneut eingeben.',
+                'throttle' => 'Sie können das Passwort nur :time Mal in 24 Stunden zurücksetzen, bitte nicht zu häufig operieren.',
                 'wrong' => 'Falsches Passwort, bitte erneut versuchen.',
             ],
-            'sent' => 'Link zum Zurücksetzen an Ihre E-Mail gesendet, bitte auch Spam-Ordner prüfen.',
-            'success' => 'Neues Passwort erfolgreich gesetzt, Sie können sich nun anmelden.',
+            'sent' => 'Zurücksetzungslink wurde an Ihr Postfach gesendet, bitte überprüfen Sie es (einschließlich des Spam-Ordners).',
+            'success' => 'Neues Passwort erfolgreich zurückgesetzt, Sie können sich jetzt anmelden.',
         ],
     ],
     'register' => [
         'attribute' => 'Registrieren',
         'code' => 'Registrierungscode',
         'error' => [
-            'disable' => 'Die Registrierung ist derzeit geschlossen.',
-            'throttle' => 'Anti-Bot aktiv! Bitte senden Sie keine Registrierungsformulare zu häufig!',
+            'disable' => 'Entschuldigung, wir nehmen derzeit keine neuen Benutzer auf.',
+            'throttle' => 'Anti-Bot-System aktiviert! Bitte vermeiden Sie häufige Einreichungen!',
         ],
         'failed' => 'Registrierung fehlgeschlagen, bitte später erneut versuchen.',
-        'promotion' => 'Noch kein Konto? Bitte gehen Sie zu',
-        'success' => 'Registrierung erfolgreich',
+        'promotion' => 'Noch kein Konto? Bitte gehen Sie zu ',
+        'success' => 'Erfolgreich registriert',
     ],
-    'remember_me' => 'Eingeloggt bleiben',
+    'remember_me' => 'Angemeldet bleiben',
     'request' => 'Anfordern',
     'throttle' => 'Zu viele Loginversuche. Versuchen Sie es bitte in :seconds Sekunden nochmal.',
     'tos' => 'Nutzungsbedingungen',

+ 37 - 44
resources/lang/de/common.php

@@ -3,20 +3,20 @@
 declare(strict_types=1);
 
 return [
-    'hour' => '{1} Stunde | {2} Uhr',
+    'hour' => '{1} Stunde|{2} Uhr',
     'account' => 'Konto',
-    'available_date' => 'Verfügbar bis',
-    'created_at' => 'Erstellt am',
-    'expired_at' => 'Läuft ab am',
+    'available_date' => 'Gültigkeitszeitraum',
+    'created_at' => 'Erstellungsdatum',
+    'expired_at' => 'Ablaufdatum',
     'updated_at' => 'Zuletzt aktualisiert',
     'latest_at' => 'Letzte Aktivität',
     'back' => 'Zurück',
     'back_to' => 'Zurück zu :page',
     'cancel' => 'Abbrechen',
     'close' => 'Schließen',
-    'close_item' => ':attribute schließen',
+    'close_item' => 'Schließen :attribute',
     'confirm' => 'Bestätigen',
-    'continues' => 'Fortsetzen',
+    'continue' => 'Fortsetzen',
     'open' => 'Öffnen',
     'send' => 'Senden',
     'view' => 'Ansehen',
@@ -28,13 +28,13 @@ return [
     ],
     'add' => 'Hinzufügen',
     'free' => 'Kostenlos',
-    'replace' => 'Ersetzen',
+    'change' => 'Ändern',
     'submit' => 'Absenden',
-    'submit_item' => ':attribute absenden',
-    'generate' => 'Generieren',
-    'generate_item' => ':attribute generieren',
-    'to_safari' => [0 => 'Klicke oben rechts', 1 => ', dann wähle', 2 => 'In Safari öffnen', 3 => ', um die Seite korrekt anzuzeigen!'],
-    'update_browser' => [0 => 'Sie verwenden einen', 1 => 'veralteten', 2 => 'Browser. Bitte', 3 => 'aktualisieren Sie Ihren Browser', 4 => 'für die beste Erfahrung.'],
+    'submit_item' => 'Absenden :attribute',
+    'generate' => 'Erzeugen',
+    'generate_item' => 'Erzeugen :attribute',
+    'to_safari' => [0 => 'Klicken Sie auf die obere rechte Ecke', 1 => ', dann wählen Sie', 2 => 'In Safari öffnen', 3 => ' um diese Seite korrekt anzuzeigen!'],
+    'update_browser' => [0 => 'Sie verwenden einen ', 1 => 'veralteten', 2 => ' Browser. Bitte', 3 => 'aktualisieren Sie Ihren Browser', 4 => ' für das beste Erlebnis'],
     'apply' => 'Anwenden',
     'avatar' => 'Avatar',
     'customize' => 'Anpassen',
@@ -48,15 +48,15 @@ return [
     'failed' => 'Fehlgeschlagen',
     'failed_item' => ':attribute fehlgeschlagen',
     'update' => 'Aktualisieren',
-    'update_action' => ':action aktualisieren',
+    'update_action' => 'Aktualisieren :action',
     'none' => 'Keine',
     'new' => 'Neu',
     'sorry' => 'Entschuldigung',
     'applied' => ':attribute angewendet',
-    'active_item' => ':attribute aktivieren',
+    'active_item' => 'Aktivieren :attribute',
     'error' => 'Fehler',
     'toggle' => 'Umschalten',
-    'toggle_action' => ':action umschalten',
+    'toggle_action' => 'Umschalten :action',
     'request_url' => 'Anfrage-URL',
     'function' => [
         'navigation' => 'Navigation',
@@ -64,17 +64,10 @@ return [
         'fullscreen' => 'Vollbild',
     ],
     'days' => [
-        'attribute' => '{1} Tage | {2} Tag',
-        'sun' => 'Sonntag',
-        'mon' => 'Montag',
-        'tue' => 'Dienstag',
-        'wed' => 'Mittwoch',
-        'thu' => 'Donnerstag',
-        'fri' => 'Freitag',
-        'sat' => 'Samstag',
+        'attribute' => '{1} Tag|{2} Tage',
         'weekend' => 'Wochenende',
-        'work' => 'Werktag',
-        'next' => 'Folgender Tag',
+        'work' => 'Wochentag',
+        'next' => 'Nächster Tag',
     ],
     'qrcode' => ':attribute QR-Code',
     'deleted' => 'Gelöscht',
@@ -89,20 +82,20 @@ return [
         'crypto' => 'Kryptowährung',
         'manual' => 'Manuelle Zahlung',
         'status' => [
-            'wait' => 'Warte auf Zahlung',
+            'wait' => 'Warten auf Zahlung',
         ],
     ],
     'order' => [
         'status' => [
-            'cancel' => 'Abgebrochen',
-            'complete' => 'Abgeschlossen',
+            'canceled' => 'Storniert',
+            'completed' => 'Abgeschlossen',
             'prepaid' => 'Vorausbezahlt',
             'ongoing' => 'Laufend',
-            'review' => 'Warte auf Prüfung',
+            'review' => 'Zur Überprüfung',
         ],
     ],
     'recommend' => 'Empfehlen',
-    'advance' => 'Erweitert',
+    'advance' => 'Fortgeschritten',
     'action' => 'Aktion',
     'search' => 'Suchen',
     'edit' => 'Bearbeiten',
@@ -115,36 +108,36 @@ return [
         'normal' => 'Normal',
         'enabled' => 'Aktiviert',
         'expire' => 'Abgelaufen',
-        'limited' => 'Eingeschränkt',
-        'run_out' => 'Daten aufgebraucht',
-        'unused' => 'Ungenutzt',
-        'used' => 'Genutzt',
+        'limited' => 'Begrenzt',
+        'run_out' => 'Datenverbrauch aufgebraucht',
+        'unused' => 'Nicht verwendet',
+        'used' => 'Verwendet',
         'closed' => 'Geschlossen',
-        'applying' => 'Wird beantragt',
-        'withdrawn' => 'Ausgezahlt',
-        'unwithdrawn' => 'Nicht ausgezahlt',
+        'applying' => 'Anwendung läuft',
+        'withdrawn' => 'Abgehoben',
+        'unwithdrawn' => 'Nicht abgehoben',
         'reply' => 'Beantwortet',
         'pending' => 'Ausstehend',
         'unknown' => 'Unbekannt',
         'available' => 'Verfügbar',
         'reject' => 'Ablehnen',
         'rejected' => 'Abgelehnt',
-        'review' => 'Wartet auf Prüfung',
-        'reviewed' => 'Geprüft',
+        'review' => 'Zur Überprüfung',
+        'reviewed' => 'Überprüft',
         'paid' => 'Bezahlt',
         'payment_pending' => 'Zahlung ausstehend',
         'pass' => 'Bestanden',
         'send_to_credit' => 'Zum Guthaben hinzufügen',
-        'waiting_tobe_send' => 'Wartet auf Versand',
+        'waiting_tobe_send' => 'Warten auf Versand',
     ],
-    'stay_unchanged' => 'Leer lassen um unverändert zu bleiben',
-    'random_generate' => 'Leer lassen für zufällige Generierung',
+    'stay_unchanged' => 'Leer lassen, um unverändert zu bleiben',
+    'random_generate' => 'Leer lassen, um zufällig zu generieren',
     'request_failed' => 'Anfrage fehlgeschlagen, bitte erneut versuchen',
     'convert' => 'Konvertieren',
     'import' => 'Importieren',
     'or' => 'oder',
     'more' => 'Mehr',
-    'to' => 'bis',
+    'to' => 'zu',
     'to_be_send' => 'Zu senden',
-    'developing' => 'In Entwicklung! Bleibt dran.',
+    'developing' => 'In Entwicklung! Bleiben Sie dran',
 ];

+ 14 - 14
resources/lang/de/errors.php

@@ -6,29 +6,29 @@ return [
     'forbidden' => [
         'access' => 'Unbekannte IP oder Proxy-Zugriff erkannt, Zugriff verweigert',
         'bots' => 'Bot-Zugriff erkannt, Zugriff verweigert',
-        'china' => 'China IP oder Proxy-Zugriff erkannt, Zugriff verweigert',
-        'oversea' => 'Ausländische IP oder Proxy-Zugriff erkannt, Zugriff verweigert',
+        'china' => 'China-IP oder Proxy-Zugriff erkannt, Zugriff verweigert',
+        'oversea' => 'Übersee-IP oder Proxy-Zugriff erkannt, Zugriff verweigert',
     ],
     'log' => 'Protokoll',
     'refresh' => 'Aktualisieren',
     'refresh_page' => 'Bitte aktualisieren Sie die Seite und versuchen Sie es erneut',
-    'report' => 'Der Fehler enthielt einen Bericht: ',
+    'report' => 'Der Fehler trug einen Bericht: ',
     'safe_enter' => 'Sicherer Eingang',
     'safe_code' => 'Bitte geben Sie den Sicherheitscode ein',
     'title' => '⚠️ Fehler ausgelöst',
     'unsafe_enter' => 'Unsicherer Eingang',
-    'visit' => 'Besuchen Sie bitte',
+    'visit' => 'Bitte besuchen Sie',
     'whoops' => 'Hoppla!',
-    'get_ip' => 'IP-Informationen konnten nicht abgerufen werden',
+    'get_ip' => 'Fehler beim Abrufen der IP-Informationen',
     'subscribe' => [
-        'unknown' => 'Unbekannter Abonnement-Link! Bitte einen neuen besorgen!',
-        'sub_baned' => 'Abonnement gesperrt! Website für Details besuchen!',
-        'user' => 'Falscher Link, Account existiert nicht!',
-        'user_disable' => 'Account deaktiviert! Support kontaktieren!',
-        'baned_until' => 'Account gesperrt bis :time, bitte auf Entsperrung warten!',
-        'out' => 'KEINE DATEN MEHR VERFÜGBAR! Bitte mehr kaufen oder Daten zurücksetzen!',
-        'expired' => 'Account abgelaufen! Bitte Kauf verlängern!',
-        'question' => 'Account-Fehler!? Website für Details besuchen!',
-        'none' => 'Keine verfügbaren Server',
+        'unknown' => 'Ungültiger Abonnementlink! Bitte holen Sie sich einen neuen!',
+        'sub_banned' => 'Abonnement gesperrt! Besuchen Sie die Website für Details',
+        'user' => 'Ungültige URL, Konto existiert nicht!',
+        'user_disabled' => 'Konto deaktiviert! Kontaktieren Sie den Support!',
+        'banned_until' => 'Konto bis :time gesperrt, bitte warten Sie auf die Freischaltung!',
+        'out' => 'KEINE DATEN MEHR! Bitte kaufen Sie mehr oder setzen Sie die Daten zurück!',
+        'expired' => 'Konto abgelaufen! Bitte erneuern Sie Ihr Abonnement!',
+        'question' => 'Konto-Probleme!? Besuchen Sie die Website für Details',
+        'none' => 'Keine verfügbaren Knoten',
     ],
 ];

+ 1 - 1
resources/lang/de/http-statuses.php

@@ -14,7 +14,7 @@ return [
     '204' => 'Kein Inhalt',
     '205' => 'Inhalt zurücksetzen',
     '206' => 'Teilinhalt',
-    '207' => 'Multi-Status',
+    '207' => 'Multistatus',
     '208' => 'Bereits gemeldet',
     '226' => 'IM verwendet',
     '300' => 'Mehrfachauswahl',

+ 63 - 63
resources/lang/de/model.php

@@ -4,41 +4,41 @@ declare(strict_types=1);
 
 return [
     'user' => [
-        'id' => 'Benutzer ID',
+        'id' => 'Benutzer-ID',
         'attribute' => 'Benutzer',
         'nickname' => 'Spitzname',
         'username' => 'Benutzername',
         'password' => 'Passwort',
         'credit' => 'Guthaben',
         'invite_num' => 'Verfügbare Einladungen',
-        'reset_date' => 'Datenrücksetzungsdatum',
+        'reset_date' => 'Datenrückstellungsdatum',
         'port' => 'Port',
-        'traffic_used' => 'Verbrauchte Daten',
-        'service' => 'Proxy Service',
-        'group' => 'Benutzergruppe',
+        'traffic_used' => 'Verwendete Daten',
+        'service' => 'Proxy-Dienst',
+        'group' => 'Gruppe',
         'account_status' => 'Kontostatus',
-        'proxy_status' => 'Proxystatus',
+        'proxy_status' => 'Proxy-Status',
         'expired_date' => 'Ablaufdatum',
-        'role' => 'Benutzerrolle',
+        'role' => 'Rolle',
         'wechat' => 'WeChat',
         'qq' => 'QQ',
-        'remark' => 'Anmerkung',
+        'remark' => 'Bemerkung',
         'uuid' => 'VMess UUID',
-        'proxy_passwd' => 'Proxy Passwort',
+        'proxy_passwd' => 'Proxy-Passwort',
         'proxy_method' => 'Verschlüsselung',
-        'usable_traffic' => 'Verfügbares Datenvolumen',
+        'usable_traffic' => 'Verfügbare Daten',
         'proxy_protocol' => 'Protokoll',
-        'proxy_obfs' => 'Obfuscation',
-        'speed_limit' => 'Geschwindigkeitslimit',
+        'proxy_obfs' => 'Verschleierung',
+        'speed_limit' => 'Geschwindigkeitsbegrenzung',
         'inviter' => 'Einlader',
         'created_date' => 'Registrierungsdatum',
     ],
     'common' => [
         'extend' => 'Erweiterte Informationen',
-        'sort' => 'Sortierung',
+        'sort' => 'Sortieren',
         'description' => 'Beschreibung',
         'type' => 'Typ',
-        'level' => 'Level',
+        'level' => 'Stufe',
     ],
     'country' => [
         'code' => 'Ländercode',
@@ -46,17 +46,17 @@ return [
         'name' => 'Ländername',
     ],
     'subscribe' => [
-        'code' => 'Abocode',
-        'req_times' => 'Anzahl Anfragen',
+        'code' => 'Abonnementcode',
+        'req_times' => 'Anfragenanzahl',
         'updated_at' => 'Letzte Anfrage',
-        'ban_time' => 'Bannzeit',
-        'ban_desc' => 'Banngrund',
+        'ban_time' => 'Sperrzeit',
+        'ban_desc' => 'Sperrgrund',
         'req_ip' => 'Anfrage-IP',
-        'req_header' => 'Zugriffsheader',
+        'req_header' => 'Anfrage-Header',
     ],
     'oauth' => [
         'type' => 'Kanal',
-        'identifier' => 'Bezeichner',
+        'identifier' => 'Kennung',
     ],
     'user_group' => [
         'attribute' => 'Benutzergruppe',
@@ -65,11 +65,11 @@ return [
     ],
     'node' => [
         'attribute' => 'Knoten',
-        'id' => 'Knoten ID',
+        'id' => 'Knoten-ID',
         'name' => 'Name',
         'domain' => 'Domain',
         'static' => 'Status',
-        'online_user' => 'Online Nutzer',
+        'online_user' => 'Online-Benutzer',
         'data_consume' => 'Datenverbrauch',
         'data_rate' => 'Datenrate',
         'ddns' => 'DDNS',
@@ -77,22 +77,22 @@ return [
         'ipv6' => 'IPv6',
         'push_port' => 'Push-Port',
         'rule_group' => 'Regelgruppe',
-        'traffic_limit' => 'Geschwindigkeitslimit',
-        'client_limit' => 'Client Limit',
+        'traffic_limit' => 'Geschwindigkeitsbegrenzung',
+        'client_limit' => 'Gerätebegrenzung',
         'label' => 'Label',
         'country' => 'Land',
         'udp' => 'UDP',
         'display' => 'Anzeige & Abonnement',
-        'detection' => 'Blockerkennung',
+        'detection' => 'Blockierungserkennung',
         'method' => 'Verschlüsselung',
         'protocol' => 'Protokoll',
         'protocol_param' => 'Protokollparameter',
-        'obfs' => 'Obfuscation',
-        'obfs_param' => 'Obfuscation Parameter',
-        'single' => 'Einzelner Port',
-        'transfer' => 'Relais',
-        'service_port' => 'Service Port',
-        'single_passwd' => '[Single] Passwort',
+        'obfs' => 'Obfs',
+        'obfs_param' => 'Obfs-Parameter',
+        'single' => 'Einzelport',
+        'transfer' => 'Relay',
+        'service_port' => 'Service-Port',
+        'single_passwd' => '[Einzel] Passwort',
         'v2_alter_id' => 'Alter ID',
         'v2_net' => 'Netzwerk',
         'v2_cover' => 'Cover',
@@ -100,29 +100,29 @@ return [
         'v2_path' => 'Pfad | Schlüssel',
         'v2_sni' => 'SNI',
         'v2_tls' => 'TLS',
-        'v2_tls_provider' => 'TLS Konfig',
-        'relay_port' => 'Relay Port',
+        'v2_tls_provider' => 'TLS-Konfiguration',
+        'relay_port' => 'Relay-Port',
     ],
     'node_auth' => [
-        'attribute' => 'Knoten Auth',
+        'attribute' => 'Knotenauthentifizierung',
         'key' => 'Schlüssel <small>für Knoten</small>',
-        'secret' => 'Geheimer Schlüssel',
+        'secret' => 'Rückwärtsschlüssel',
     ],
     'node_cert' => [
-        'attribute' => 'Domain Zertifikat',
+        'attribute' => 'Domain-Zertifikat',
         'domain' => 'Domain',
         'key' => 'Schlüssel',
         'pem' => 'PEM',
         'issuer' => 'Aussteller',
-        'signed_date' => 'Signiert am',
-        'expired_date' => 'Läuft ab am',
+        'signed_date' => 'Ausstellungsdatum',
+        'expired_date' => 'Ablaufdatum',
     ],
     'order' => [
         'attribute' => 'Bestellung',
         'id' => 'Bestellnummer',
         'original_price' => 'Originalpreis',
-        'price' => 'Preis',
-        'pay_way' => 'Zahlungsart',
+        'price' => 'Tatsächlicher Preis',
+        'pay_way' => 'Zahlungsmethode',
         'status' => 'Status',
     ],
     'goods' => [
@@ -130,17 +130,17 @@ return [
         'name' => 'Name',
         'price' => 'Preis',
         'category' => 'Kategorie',
-        'renew' => 'Daten Reset Preis',
-        'user_limit' => 'Benutzer Geschwindigkeitslimit',
-        'period' => 'Reset Zyklus',
+        'renew' => 'Datenverlängerungspreis',
+        'user_limit' => 'Benutzergeschwindigkeitsbegrenzung',
+        'period' => 'Reset-Zyklus',
         'traffic' => 'Datenvolumen',
-        'invite_num' => 'Bonus Einladungen',
-        'limit_num' => 'Kauflimit',
-        'available_date' => 'Gültigkeitsdauer',
+        'invite_num' => 'Bonus-Einladungen',
+        'limit_num' => 'Kaufbegrenzung',
+        'available_date' => 'Gültigkeitszeitraum',
         'hot' => 'Bestseller',
         'color' => 'Farbe',
         'logo' => 'Logo',
-        'info' => 'Benutzerdefinierte Info',
+        'info' => 'Benutzerdefinierte Informationen',
     ],
     'rule' => [
         'attribute' => 'Regel',
@@ -178,30 +178,30 @@ return [
         'logo' => 'Logo',
         'value' => 'Wert',
         'priority' => 'Priorität',
-        'usable_times' => 'Nutzungslimit',
+        'usable_times' => 'Verwendungsbeschränkung',
         'minimum' => 'Mindestbestellwert',
-        'used' => 'Persönliches Limit',
-        'levels' => 'Level Limit',
-        'groups' => 'Gruppen Limit',
-        'users_whitelist' => 'Whitelist Benutzer',
-        'users_blacklist' => 'Blacklist Benutzer',
-        'services_whitelist' => 'Whitelist Produkte',
-        'services_blacklist' => 'Blacklist Produkte',
-        'newbie' => 'Nur Neukunden',
+        'used' => 'Persönliche Begrenzung',
+        'levels' => 'Stufenbeschränkung',
+        'groups' => 'Gruppenbeschränkung',
+        'users_whitelist' => 'Whitelist-Benutzer',
+        'users_blacklist' => 'Blacklist-Benutzer',
+        'services_whitelist' => 'Whitelist-Produkte',
+        'services_blacklist' => 'Blacklist-Produkte',
+        'newbie' => 'Nur für neue Benutzer',
         'num' => 'Anzahl',
     ],
     'aff' => [
         'invitee' => 'Käufer',
         'amount' => 'Bestellbetrag',
         'commission' => 'Provision',
-        'updated_at' => 'Verarbeitet am',
+        'updated_at' => 'Bearbeitet am',
         'created_at' => 'Bestellt am',
     ],
     'referral' => [
         'created_at' => 'Beantragt am',
         'user' => 'Antragsteller',
         'amount' => 'Betrag',
-        'id' => 'Antrags-ID',
+        'id' => 'Antragsnummer',
     ],
     'notification' => [
         'address' => 'Empfänger',
@@ -216,16 +216,16 @@ return [
         'upload' => 'Upload',
         'download' => 'Download',
         'total' => 'Gesamt',
-        'log_time' => 'Protokollzeitpunkt',
+        'log_time' => 'Protokolliert am',
     ],
     'user_data_modify' => [
-        'before' => 'Daten vorher',
-        'after' => 'Daten nachher',
+        'before' => 'Vorher',
+        'after' => 'Nachher',
         'created_at' => 'Geändert am',
     ],
     'user_credit' => [
-        'before' => 'Guthaben vorher',
-        'after' => 'Guthaben nachher',
+        'before' => 'Vorher',
+        'after' => 'Nachher',
         'amount' => 'Betrag',
         'created_at' => 'Geändert am',
     ],

+ 18 - 18
resources/lang/de/notification.php

@@ -4,31 +4,31 @@ declare(strict_types=1);
 
 return [
     'attribute' => 'Benachrichtigung',
-    'new' => 'Sie haben :num neue Nachricht|[1,*] Sie haben :num neue Nachrichten',
+    'new' => '{1} Sie haben :num neue Nachricht|[1,*] Sie haben :num neue Nachrichten',
     'empty' => 'Sie haben keine neuen Nachrichten',
-    'payment_received' => 'Zahlung erhalten, Betrag: :amount. Bestelldetails ansehen',
-    'account_expired' => 'Kontoablauf Erinnerung',
-    'account_expired_content' => 'Ihr Konto läuft in :days Tagen ab. Bitte verlängern Sie rechtzeitig um den Service weiter nutzen zu können.',
-    'account_expired_blade' => 'Ihr Konto läuft in :days Tagen ab, bitte rechtzeitig verlängern',
+    'payment_received' => 'Zahlung erhalten, Betrag: :amount. Bestelldetails anzeigen',
+    'account_expired' => 'Erinnerung an das Ablaufen des Kontos',
+    'account_expired_content' => 'Ihr Konto läuft in :days Tagen ab. Bitte erneuern Sie es rechtzeitig, um die Dienste weiterhin nutzen zu können.',
+    'account_expired_blade' => 'Ihr Konto läuft in :days Tagen ab, bitte erneuern Sie es rechtzeitig',
     'active_email' => 'Bitte verifizieren Sie innerhalb von 30 Minuten',
-    'close_ticket' => 'Ticket :id: :title geschlossen',
-    'view_web' => 'Website ansehen',
-    'view_ticket' => 'Ticket ansehen',
+    'close_ticket' => 'Ticket :id: :title wurde geschlossen',
+    'view_web' => 'Website anzeigen',
+    'view_ticket' => 'Ticket anzeigen',
     'new_ticket' => 'Neues Ticket erhalten: :title',
     'reply_ticket' => 'Ticket beantwortet: :title',
     'ticket_content' => 'Ticketinhalt:',
-    'node_block' => 'Knoten Blockierung Warnung',
-    'node_offline' => 'Knoten Offline Warnung',
-    'node_offline_content' => 'Anormale Knoten, eventuell offline:',
+    'node_block' => 'Warnung: Node-Blockierung',
+    'node_offline' => 'Warnung: Node offline',
+    'node_offline_content' => 'Folgende Nodes sind möglicherweise offline:',
     'block_report' => 'Blockierungsbericht:',
-    'traffic_warning' => 'Datenverbrauch Warnung',
-    'traffic_remain' => ':percent% der Daten genutzt, bitte beachten',
-    'traffic_tips' => 'Bitte Datenneusetzungsdatum beachten und Daten rational nutzen, oder nach Verbrauch aufladen',
-    'verification_account' => 'Kontoverifizierung',
-    'verification' => 'Ihr Verifizierungscode:',
+    'traffic_warning' => 'Warnung: Datenverbrauch',
+    'traffic_remain' => ':percent% des Datenvolumens verbraucht, bitte beachten',
+    'traffic_tips' => 'Bitte beachten Sie das Datum der Datenrücksetzung und nutzen Sie das Datenvolumen rational, oder erneuern Sie es nach dem Verbrauch',
+    'verification_account' => 'Konto-Verifizierung',
+    'verification' => 'Ihr Verifizierungscode lautet:',
     'verification_limit' => 'Bitte innerhalb von :minutes Minuten verifizieren',
-    'data_anomaly' => 'Datenanomalie Benutzerwarnung',
-    'data_anomaly_content' => 'Benutzer:id: [Upload: :upload | Download: :download | Gesamt: :total] in der letzten Stunde',
+    'data_anomaly' => 'Warnung: Datenanomalie',
+    'data_anomaly_content' => 'Benutzer :id: [Upload: :upload | Download: :download | Gesamt: :total] in der letzten Stunde',
     'node' => [
         'upload' => 'Upload',
         'download' => 'Download',

+ 121 - 121
resources/lang/de/user.php

@@ -4,215 +4,215 @@ declare(strict_types=1);
 
 return [
     'account' => [
-        'credit' => 'Konto Guthaben',
+        'credit' => 'Kontoguthaben',
         'status' => 'Kontostatus',
-        'level' => 'Konto Level',
+        'level' => 'Kontolevel',
         'group' => 'Gruppe',
-        'speed_limit' => 'Geschwindigkeitslimit',
-        'remain' => 'Verbleibendes Datenvolumen',
-        'time' => 'Laufzeit',
+        'speed_limit' => 'Geschwindigkeitsbegrenzung',
+        'remain' => 'Verbleibende Daten',
+        'time' => 'Paketdauer',
         'last_login' => 'Letzte Anmeldung',
-        'reset' => '{0} Daten werden in <code id="restTime">:days</code> zurückgesetzt |[1,*] Noch :days Tage bis zur Datenrücksetzung',
-        'connect_password' => 'Proxy Verbindungspasswort',
+        'reset' => '{0} Daten werden in <code id="restTime">:days</code> zurückgesetzt|{1} :days Tag bis zur Datenrücksetzung|[2,*] :days Tage bis zur Datenrücksetzung',
+        'connect_password' => 'Proxy-Verbindungspasswort',
         'reason' => [
-            'normal' => 'Konto normal',
+            'normal' => 'Konto ist normal',
             'expired' => 'Ihr Paket ist abgelaufen',
-            'overused' => 'Das stündliche Datenlimit von <code>:data</code> GB wurde erreicht<br/> Warte <code id="banedTime">:min</code> zum Aufheben der Drosselung',
-            'traffic_exhausted' => 'DATEN AUFGEBRAUCHT',
-            'unknown' => 'UNBEKANNTER FEHLER. Bitte Seite neu laden. Falls Problem weiter besteht, kontaktieren Sie den Admin.',
+            'overused' => 'Sie haben das Limit von <code>:data</code> GB für diesen Zeitraum überschritten<br/> Die Begrenzung wird in <code id="banedTime">:min</code> Minuten aufgehoben',
+            'traffic_exhausted' => 'Datenvolumen ist aufgebraucht',
+            'unknown' => 'Unbekannter Grund, bitte versuchen Sie, den Browser zu aktualisieren! Wenn das Problem weiterhin besteht, kontaktieren Sie den Support.',
         ],
     ],
     'home' => [
         'attendance' => [
             'attribute' => 'Einchecken',
             'disable' => 'Einchecken deaktiviert',
-            'done' => 'Bereits eingecheckt, kommen Sie morgen wieder!',
+            'done' => 'Sie haben bereits eingecheckt. Kommen Sie morgen wieder!',
             'success' => 'Sie haben :data Daten erhalten',
-            'failed' => 'System ❌ Fehler',
+            'failed' => 'Systemfehler',
         ],
-        'traffic_logs' => 'Datenaufzeichnungen',
+        'traffic_logs' => 'Datenprotokolle',
         'announcement' => 'Ankündigungen',
-        'wechat_push' => 'WeChat Benachrichtigungsdienst',
-        'chat_group' => 'Chatgruppe',
+        'wechat_push' => 'WeChat-Benachrichtigungen',
+        'chat_group' => 'Chat-Gruppe',
         'empty_announcement' => 'Keine Ankündigungen',
     ],
-    'purchase_to_unlock' => 'Kaufen um freizuschalten',
-    'purchase_required' => 'Deaktiviert für nicht zahlende Benutzer. Bitte',
+    'purchase_to_unlock' => 'Zum Freischalten kaufen',
+    'purchase_required' => 'Diese Funktion ist für nicht zahlende Benutzer deaktiviert. Bitte',
     'attribute' => [
         'node' => 'Knoten',
         'data' => 'Daten',
-        'ip' => 'IP',
+        'ip' => 'IP-Adresse',
         'isp' => 'ISP',
         'address' => 'Standort',
     ],
-    'purchase_promotion' => 'Jetzt Service kaufen!',
+    'purchase_promotion' => 'Jetzt Dienst kaufen!',
     'menu' => [
-        'helps' => 'Hilfe',
-        'home' => 'Start',
+        'help' => 'Hilfe',
+        'home' => 'Startseite',
         'invites' => 'Einladen',
-        'invoices' => 'Rechnung',
+        'invoices' => 'Rechnungen',
         'nodes' => 'Knoten',
-        'referrals' => 'Empfehlung',
+        'promotion' => 'Empfehlung',
         'shop' => 'Shop',
         'profile' => 'Profil',
-        'tickets' => 'Ticket',
+        'tickets' => 'Tickets',
         'admin_dashboard' => 'Dashboard',
     ],
     'contact' => 'Kontakt',
     'oauth' => [
-        'bind_title' => 'Soziales Konto verbinden',
-        'not_bind' => 'Nicht verbunden',
-        'bind' => 'Verbinden',
-        'rebind' => 'Erneut verbinden',
-        'unbind' => 'Verbindung aufheben',
+        'bind_title' => 'Soziales Konto binden',
+        'not_bind' => 'Nicht gebunden',
+        'bind' => 'Binden',
+        'rebind' => 'Neu binden',
+        'unbind' => 'Entbinden',
     ],
     'coupon' => [
         'discount' => 'Rabatt',
         'error' => [
-            'unknown' => 'Ungültiger Coupon',
-            'used' => 'Coupon verwendet',
-            'expired' => 'Coupon abgelaufen',
-            'run_out' => 'Coupon aufgebraucht',
-            'inactive' => 'Coupon inaktiv',
+            'unknown' => 'Ungültiger Gutschein',
+            'used' => 'Gutschein bereits verwendet',
+            'expired' => 'Gutschein abgelaufen',
+            'run_out' => 'Gutschein aufgebraucht',
+            'inactive' => 'Gutschein nicht aktiv',
             'wait' => 'Wird um :time aktiv, bitte warten!',
             'unmet' => 'Bedingungen nicht erfüllt',
             'minimum' => 'Mindestbetrag ist :amount',
             'overused' => 'Kann nur :times mal verwendet werden',
-            'users' => 'Konto nicht berechtigt',
-            'services' => 'Produkte nicht berechtigt, Bedingungen prüfen',
+            'users' => 'Konto nicht für die Aktion berechtigt',
+            'services' => 'Artikel nicht für Rabatt berechtigt, überprüfen Sie die Aktionsbedingungen',
         ],
     ],
-    'error_response' => 'Fehler aufgetreten, bitte später nochmal versuchen.',
+    'error_response' => 'Ein Fehler ist aufgetreten, bitte versuchen Sie es später erneut.',
     'invite' => [
         'attribute' => 'Einladungscode',
-        'counts' => 'Total <code>:num</code> Einladungscodes',
-        'tips' => '<strong>:num</strong> Einladungen verbleibend, Einladungscodes verfallen nach :days Tagen',
+        'counts' => 'Insgesamt <code>:num</code> Einladungscodes',
+        'tips' => '<strong>:num</strong> Einladungen verbleiben, Codes verfallen :days Tage nach Erstellung',
         'logs' => 'Einladungsprotokolle',
-        'promotion' => 'Registrierung über Ihren Code gibt Ihnen beiden :traffic Daten; Sie erhalten :referral_percent% Provision bei Käufen des Eingeladenen',
-        'generate_failed' => 'Fehler: Kontingent erreicht',
+        'promotion' => 'Sowohl Sie als auch der Eingeladene erhalten <mark>:traffic</mark> Daten, wenn sie sich mit Ihrem Code registrieren; Sie erhalten <mark>:referral_percent%</mark> Provision, wenn sie einen Kauf tätigen.',
+        'generate_failed' => 'Generierung fehlgeschlagen: Kontingent überschritten',
     ],
     'reset_data' => [
         'action' => 'Daten zurücksetzen',
-        'cost' => 'Kosten <code>:amount</code>',
-        'cost_tips' => 'Zurücksetzen zieht :amount vom Guthaben ab!',
-        'lack' => 'Nicht genug Guthaben, bitte aufladen',
-        'logs' => 'Benutzerdaten zurückgesetzt',
-        'success' => 'Zurücksetzen erfolgreich',
+        'cost' => 'Kosten: <code>:amount</code>',
+        'cost_tips' => 'Das Zurücksetzen wird :amount abziehen!',
+        'insufficient' => 'Unzureichendes Guthaben, bitte aufladen',
+        'logs' => 'Benutzer hat Daten zurückgesetzt',
+        'success' => 'Zurücksetzung erfolgreich',
     ],
     'referral' => [
         'link' => 'Empfehlungslink',
-        'total' => 'Gesamt :amount (:total mal), kann über :money auszahlen',
+        'total' => 'Gesamtprovision: :amount (:total Mal), kann ab :money ausgezahlt werden',
         'logs' => 'Provisionsprotokolle',
-        'failed' => 'Fehlgeschlagen',
-        'success' => 'Erfolg',
+        'failed' => 'Anfrage fehlgeschlagen',
+        'success' => 'Anfrage erfolgreich',
         'msg' => [
-            'account' => 'Konto abgelaufen, bitte zuerst kaufen',
-            'applied' => 'Antrag existiert bereits, warte auf Bearbeitung',
-            'unfulfilled' => ':amount zum Auszahlen, weiter so!',
-            'wait' => 'Warte auf Admin Genehmigung',
-            'error' => 'Fehler beim Erstellen der Bestellung, später nochmal versuchen oder Admin kontaktieren',
+            'account' => 'Konto abgelaufen, bitte zuerst ein Paket kaufen',
+            'applied' => 'Bestehende Anfrage, bitte warten Sie auf die Bearbeitung',
+            'unfulfilled' => 'Benötigt :amount zur Auszahlung, weiter so!',
+            'wait' => 'Bitte warten Sie auf die Genehmigung des Administrators',
+            'error' => 'Fehler bei der Erstellung der Bestellung, versuchen Sie es später erneut oder kontaktieren Sie den Support',
         ],
     ],
-    'inviter' => 'Einlader',
+    'inviter' => 'Einladender',
     'invitee' => 'Eingeladener',
     'registered_at' => 'Registrierungsdatum',
     'bought_at' => 'Kaufdatum',
-    'payment_method' => 'Zahlung',
+    'payment_method' => 'Zahlungsmethode',
     'pay' => 'Bezahlen',
-    'input_coupon' => 'Coupon eingeben',
+    'input_coupon' => 'Gutscheincode eingeben',
     'recharge' => 'Aufladen',
     'recharge_credit' => 'Guthaben aufladen',
     'recharging' => 'Aufladen...',
-    'withdraw_commission' => 'Provision auszahlen',
-    'withdraw_at' => 'Auszahlungsdatum',
-    'withdraw_logs' => 'Auszahlsprotokolle',
-    'withdraw' => 'Auszahlen',
-    'scan_qrcode' => 'QR Code im Client scannen',
+    'withdraw_commission' => 'Provision abheben',
+    'withdraw_at' => 'Abhebungsdatum',
+    'withdraw_logs' => 'Abhebungsprotokolle',
+    'withdraw' => 'Abheben',
+    'scan_qrcode' => 'QR-Code mit Client scannen',
     'shop' => [
-        'hot' => 'HEISS',
-        'limited' => 'Limitiert',
-        'change_amount' => 'Aufladebetrag ändern',
+        'hot' => 'Beliebt',
+        'limited' => 'Begrenzt',
+        'change_amount' => 'Aufladebetrag',
         'change_amount_help' => 'Aufladebetrag eingeben',
         'buy' => 'Kaufen',
         'description' => 'Beschreibung',
-        'service' => 'Service',
-        'pay_credit' => 'Guthaben',
-        'pay_online' => 'Online Bezahlung',
+        'service' => 'Dienst',
+        'pay_credit' => 'Mit Guthaben bezahlen',
+        'pay_online' => 'Online bezahlen',
         'price' => 'Preis',
         'quantity' => 'Menge',
         'subtotal' => 'Zwischensumme',
         'total' => 'Gesamt',
         'conflict' => 'Konflikt',
-        'conflict_tips' => '<p>Aktueller Kauf wird <code>vorausbezahlt</code></p><ol><li>Wird nach Ablauf des aktuellen Pakets automatisch aktiviert!</li><li>Kann nach Bezahlung manuell aktiviert werden</li></ol>',
-        'call4help' => 'Bitte Admin kontaktieren',
+        'conflict_tips' => '<p>Der aktuelle Kauf wird als <code>Prepaid-Paket</code> festgelegt</p><ol><li>Das Prepaid-Paket wird automatisch aktiviert, nachdem das aktuelle Paket abläuft</li><li>Sie können es nach der Zahlung manuell aktivieren</li></ol>',
+        'call4help' => 'Kontaktieren Sie den Support, wenn Sie Fragen haben',
     ],
     'service' => [
-        'node_count' => ':num qualitativ hochwertige Knoten',
-        'country_count' => ':num Länder abgedeckt',
-        'unlimited' => 'Unbegrenzt',
+        'node_count' => '<code>:num</code> hochwertige Knoten',
+        'country_count' => 'Deckt <code>:num</code> Länder oder Regionen ab',
+        'unlimited' => 'Unbegrenzte Geschwindigkeit',
     ],
     'payment' => [
         'error' => 'Ungültiger Aufladebetrag',
-        'creating' => 'Erstelle Zahlung...',
-        'redirect_stripe' => 'Leite um zu Stripe',
-        'qrcode_tips' => 'Scannen Sie mit <strong class="red-600">:software</strong>',
-        'close_tips' => 'Innerhalb von <code>:minutes Min.</code> abschließen, sonst schließt die Bestellung',
-        'mobile_tips' => '<strong>Handy:</strong> QR Code lange drücken -> Bild speichern -> Zahlungs-App öffnen -> Bild scannen zum Bezahlen',
+        'creating' => 'Zahlung wird erstellt...',
+        'redirect_stripe' => 'Weiterleitung zu Stripe',
+        'qrcode_tips' => 'Bitte scannen Sie mit <strong class="red-600">:software</strong>',
+        'close_tips' => 'Schließen Sie die Zahlung innerhalb von <code>:minutes</code> Minuten ab, sonst wird die Bestellung automatisch geschlossen',
+        'mobile_tips' => '<strong>Mobile Benutzer:</strong> Halten Sie den QR-Code gedrückt -> Bild speichern -> Zahlungs-App öffnen -> Bild scannen, um zu bezahlen',
     ],
     'invoice' => [
         'attribute' => 'Bestellung',
-        'detail' => 'Aufzeichnungen',
+        'detail' => 'Bestelldetails',
         'amount' => 'Betrag',
-        'active_prepaid_question' => 'Vorausbezahltes Paket vorzeitig aktivieren?',
-        'active_prepaid_tips' => 'Nach Aktivierung:<br>- Aktuelles Paket läuft sofort ab!<br>- Neues Ablaufdatum beginnt heute!',
+        'active_prepaid_question' => 'Prepaid-Paket frühzeitig aktivieren?',
+        'active_prepaid_tips' => 'Nach der Aktivierung:<br>Ihr aktueller Plan wird sofort ablaufen<br>Das Ablaufdatum des neuen Plans wird ab heute neu berechnet',
     ],
     'node' => [
-        'info' => 'Konfig',
-        'setting' => 'Einstellungen',
+        'info' => 'Konfigurationsinfo',
+        'setting' => 'Proxy-Einstellungen',
         'unstable' => 'Instabil/Wartung',
-        'rate' => ':ratio X Datenverbrauch',
+        'rate' => ':ratio-facher Datenverbrauch',
     ],
     'subscribe' => [
-        'link' => 'Abonnement Link',
-        'tips' => 'Warnung: Nur für persönliche Nutzung, nicht teilen um Missbrauch zu vermeiden',
-        'exchange_warning' => 'Ändern des Abos führt zu:\n1. Sofortige Deaktivierung des aktuellen Abos\n2. Änderung des Verbindungspassworts',
-        'custom' => 'Benutzerdefiniertes Abo',
-        'ss_only' => 'Nur SS',
-        'ssr_only' => 'Nur SSR (inkl. SS)',
-        'v2ray_only' => 'Nur V2Ray',
-        'trojan_only' => 'Nur Trojan',
-        'error' => 'Fehler beim Ändern des Abos',
+        'link' => 'Abonnement-Link',
+        'tips' => 'Warnung: Dieser Link ist nur für den persönlichen Gebrauch. Bitte nicht weitergeben, sonst kann Ihr Konto wegen abnormaler Nutzung gesperrt werden.',
+        'exchange_warning' => 'Das Ändern des Abonnement-Links wird:\n1. Den aktuellen Link sofort ungültig machen\n2. Das Verbindungspasswort ändern',
+        'custom' => 'Benutzerdefiniertes Abonnement',
+        'ss_only' => 'Nur SS abonnieren',
+        'ssr_only' => 'Nur SSR (inkl. SS) abonnieren',
+        'v2ray_only' => 'Nur V2Ray abonnieren',
+        'trojan_only' => 'Nur Trojan abonnieren',
+        'error' => 'Fehler beim Ändern des Abonnement-Links',
         'info' => [
-            'title' => 'Kontozusammenfassung [Nicht Echtzeit]',
+            'title' => 'Kontoübersicht [Nicht in Echtzeit]',
             'upload' => 'Upload',
             'download' => 'Download',
-            'total' => 'Paket Datenvolumen',
+            'total' => 'Plan-Daten',
         ],
     ],
     'ticket' => [
         'attribute' => 'Ticket',
-        'submit_tips' => 'Ticketabschicken bestätigen?',
-        'reply_confirm' => 'Ticketantwort bestätigen?',
-        'close_tips' => 'Ticket schließen bestätigen?',
+        'submit_tips' => 'Ticket wirklich einreichen?',
+        'reply_confirm' => 'Antwort auf Ticket wirklich senden?',
+        'close_tips' => 'Ticket wirklich schließen?',
         'close' => 'Ticket schließen',
         'failed_closed' => 'Fehler: Bereits geschlossen',
-        'reply_placeholder' => 'Was möchten Sie sagen...',
+        'reply_placeholder' => 'Schreiben Sie etwas...',
         'reply' => 'Antworten',
-        'close_msg' => 'Ticket: ID :id von Benutzer geschlossen',
-        'title_placeholder' => 'Beschreiben Sie Ihr Problem kurz',
-        'content_placeholder' => 'Beschreiben Sie Ihr Problem ausführlich damit wir Ihnen schnell helfen können',
-        'new' => 'Neues Ticket',
-        'working_hour' => 'Arbeitszeiten',
-        'online_hour' => 'Online Zeiten',
-        'service_tips' => 'Bitte nur eine Kontaktmethode verwenden! Mehrfachanfragen verzögern die Bearbeitung.',
-        'error' => 'Unbekannter Fehler! Admin benachrichtigen.',
+        'close_msg' => 'Ticket ID :id vom Benutzer geschlossen',
+        'title_placeholder' => 'Beschreiben Sie kurz Ihr Problem',
+        'content_placeholder' => 'Beschreiben Sie Ihr Problem detailliert, damit wir Ihnen besser helfen können',
+        'new' => 'Neues Ticket erstellen',
+        'service_hours' => 'Kundendienstzeiten',
+        'online_hour' => 'Online-Zeiten',
+        'service_tips' => 'Bitte verwenden Sie nur <code>eine</code> Kontaktmethode, um den Support zu erreichen! Mehrfache Anfragen verzögern die Antwortzeit.',
+        'error' => 'Unbekannter Fehler! Bitte kontaktieren Sie den Support',
     ],
     'traffic_logs' => [
-        '24hours' => 'Heutige Nutzung',
-        '30days' => 'Diesen Monat Nutzung',
-        'tips' => 'Hinweis: Verzögerte Daten, täglich am nächsten Tag aktualisiert, stündlich nächste Stunde',
+        'hourly' => 'Heutiger Datenverbrauch',
+        'daily' => 'Datenverbrauch diesen Monat',
+        'tips' => 'Hinweis: Es gibt eine Verzögerung bei der Aktualisierung der Datenstatistiken.',
     ],
-    'client' => 'Client',
+    'clients' => 'Clients',
     'tutorials' => 'Anleitungen',
     'current_role' => 'Aktuelle Rolle als',
     'knowledge' => [
@@ -220,18 +220,18 @@ return [
         'basic' => 'Grundlagen',
     ],
     'manual' => [
-        'red_packet' => 'Alipay Red Packet',
-        'hint' => 'Nach QR Code Scannen auf [Weiter] klicken bis [Abschicken] um Zahlung abzuschließen!',
-        'step_1' => 'Hinweis',
+        'red_packet' => 'Alipay-Rotpaket',
+        'hint' => 'Nach dem Scannen des QR-Codes klicken Sie weiter auf [Weiter], bis Sie auf [Einreichen] klicken, um die Zahlung abzuschließen!',
+        'step_1' => 'Hinweise',
         'step_1_title' => 'Wie man manuell bezahlt',
         'step_2' => 'Zahlung',
-        'step_2_title' => 'QR Code abrufen und bezahlen',
-        'step_3' => 'Fertig',
+        'step_2_title' => 'QR-Code erhalten und bezahlen',
+        'step_3' => 'Abschluss',
         'step_3_title' => 'Auf manuelle Überprüfung warten',
         'remark' => 'Kontobemerkung',
-        'remark_content' => 'Login-Konto eintragen für Verifizierung',
-        'payment_hint' => 'Bitte exakten Betrag bezahlen, keine Rückzahlung bei Überzahlung, Aufladen bei Unterzahlung',
-        'pre' => 'Vorheriger Schritt',
-        'next' => 'Nächster Schritt',
+        'remark_content' => 'Bitte geben Sie Ihren Kontobenutzernamen an, um eine genaue manuelle Überprüfung zu gewährleisten',
+        'payment_hint' => 'Bitte den genauen Betrag zahlen (keine Rückerstattung bei Überzahlung, Nachzahlung bei Unterzahlung)',
+        'pre' => 'Zurück',
+        'next' => 'Weiter',
     ],
 ];

+ 49 - 0
resources/lang/de/validation.php

@@ -143,37 +143,62 @@ return [
     'uuid' => ':Attribute muss ein UUID sein.',
     'attributes' => [
         'address' => 'Adresse',
+        'affiliate_url' => 'Affiliate-URL',
         'age' => 'Alter',
         'amount' => 'Höhe',
+        'announcement' => 'Bekanntmachung',
         'area' => 'Gebiet',
+        'audience_prize' => 'Publikumspreis',
         'available' => 'Verfügbar',
         'birthday' => 'Geburtstag',
         'body' => 'Körper',
         'city' => 'Stadt',
+        'compilation' => 'Zusammenstellung',
+        'concept' => 'Konzept',
+        'conditions' => 'Bedingungen',
         'content' => 'Inhalt',
         'country' => 'Land',
+        'cover' => 'Abdeckung',
         'created_at' => 'Erstellt am',
         'creator' => 'Ersteller',
+        'currency' => 'Währung',
         'current_password' => 'Derzeitiges Passwort',
+        'customer' => 'Kunde',
         'date' => 'Datum',
         'date_of_birth' => 'Geburtsdatum',
+        'dates' => 'Termine',
         'day' => 'Tag',
         'deleted_at' => 'Gelöscht am',
         'description' => 'Beschreibung',
+        'display_type' => 'Anzeigetyp',
         'district' => 'Bezirk',
         'duration' => 'Dauer',
         'email' => 'E-Mail-Adresse',
         'excerpt' => 'Auszug',
         'filter' => 'Filter',
+        'finished_at' => 'fertig um',
         'first_name' => 'Vorname',
         'gender' => 'Geschlecht',
+        'grand_prize' => 'Hauptpreis',
         'group' => 'Gruppe',
         'hour' => 'Stunde',
         'image' => 'Bild',
+        'image_desktop' => 'Desktop-Bild',
+        'image_main' => 'Hauptbild',
+        'image_mobile' => 'mobiles Bild',
+        'images' => 'Bilder',
+        'is_audience_winner' => 'ist Publikumssieger',
+        'is_hidden' => 'ist versteckt',
+        'is_subscribed' => 'ist abonniert',
+        'is_visible' => 'ist sichtbar',
+        'is_winner' => 'ist Gewinner',
+        'items' => 'Artikel',
+        'key' => 'Schlüssel',
         'last_name' => 'Nachname',
         'lesson' => 'Lektion',
         'line_address_1' => 'Adresszeile 1',
         'line_address_2' => 'Adresszeile 2',
+        'login' => 'Anmeldung',
         'message' => 'Nachricht',
         'middle_name' => 'Zweitname',
         'minute' => 'Minute',
@@ -186,22 +211,43 @@ return [
         'password_confirmation' => 'Passwortbestätigung',
         'phone' => 'Telefonnummer',
         'photo' => 'Foto',
+        'portfolio' => 'Portfolio',
         'postal_code' => 'Postleitzahl',
+        'preview' => 'Vorschau',
         'price' => 'Preis',
+        'product_id' => 'Produkt ID',
+        'product_uid' => 'Produkt-UID',
+        'product_uuid' => 'Produkt-UUID',
+        'promo_code' => 'Aktionscode',
         'province' => 'Provinz',
+        'quantity' => 'Menge',
+        'reason' => 'Grund',
         'recaptcha_response_field' => 'Captcha-Feld',
+        'referee' => 'Schiedsrichter',
+        'referees' => 'Schiedsrichter',
+        'reject_reason' => 'Ablehnungsgrund',
         'remember' => 'Erinnern',
         'restored_at' => 'Wiederhergestellt am',
         'result_text_under_image' => 'Ergebnistext unter Bild',
         'role' => 'Rolle',
+        'rule' => 'Regel',
+        'rules' => 'Regeln',
         'second' => 'Sekunde',
         'sex' => 'Geschlecht',
+        'shipment' => 'Sendung',
         'short_text' => 'Kurzer Text',
         'size' => 'Größe',
+        'skills' => 'Fähigkeiten',
+        'slug' => 'Schnecke',
+        'specialization' => 'Spezialisierung',
+        'started_at' => 'fing an bei',
         'state' => 'Bundesland',
+        'status' => 'Status',
         'street' => 'Straße',
         'student' => 'Schüler/Student',
         'subject' => 'Gegenstand',
+        'tag' => 'Etikett',
+        'tags' => 'Stichworte',
         'teacher' => 'Lehrer',
         'terms' => 'Bedingungen',
         'test_description' => 'Test Beschreibung',
@@ -210,8 +256,11 @@ return [
         'text' => 'Text',
         'time' => 'Uhrzeit',
         'title' => 'Titel',
+        'type' => 'Typ',
         'updated_at' => 'Aktualisiert am',
+        'user' => 'Benutzer',
         'username' => 'Benutzername',
+        'value' => 'Wert',
         'year' => 'Jahr',
     ],
 ];

+ 129 - 58
resources/lang/en.json

@@ -1,59 +1,130 @@
 {
-    "(and :count more error)": "(and :count more error)",
-    "(and :count more errors)": "(and :count more errors)",
-    "All rights reserved.": "All rights reserved.",
-    "Forbidden": "Forbidden",
-    "Go to page :page": "Go to page :page",
-    "Hello!": "Hello!",
-    "If you did not create an account, no further action is required.": "If you did not create an account, no further action is required.",
-    "If you did not request a password reset, no further action is required.": "If you did not request a password reset, no further action is required.",
-    "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:",
-    "Invalid JSON was returned from the route.": "Invalid JSON was returned from the route.",
-    "Login": "Login",
-    "Logout": "Logout",
-    "Not Found": "Not Found",
-    "of": "of",
-    "Page Expired": "Page Expired",
-    "Pagination Navigation": "Pagination Navigation",
-    "Payment Required": "Payment Required",
-    "Please click the button below to verify your email address.": "Please click the button below to verify your email address.",
-    "Regards": "Regards",
-    "Register": "Register",
-    "Reset Password": "Reset Password",
-    "Reset Password Notification": "Reset Password Notification",
-    "results": "results",
-    "Server Error": "Server Error",
-    "Service Unavailable": "Service Unavailable",
-    "Showing": "Showing",
-    "The given data was invalid.": "The given data was invalid.",
-    "The response is not a streamed response.": "The response is not a streamed response.",
-    "The response is not a view.": "The response is not a view.",
-    "This password reset link will expire in :count minutes.": "This password reset link will expire in :count minutes.",
-    "to": "to",
-    "Toggle navigation": "Toggle navigation",
-    "Too Many Requests": "Too Many Requests",
-    "Unauthorized": "Unauthorized",
-    "Verify Email Address": "Verify Email Address",
-    "Whoops!": "Whoops!",
-    "You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account.",
-    "----「:job」Completed, Used :time seconds ----": "----「:job」Completed, Used :time seconds ----",
-    "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[Auto Task] Blocked service: Abnormal traffic within 1 hour",
-    "[Auto Task] Blocked service: Run out of traffic": "[Auto Task] Blocked service: Run out of traffic",
-    "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours",
-    "[Auto Task] Unblocked Service: Account ban expired": "[Auto Task] Unblocked service: Account ban expired",
-    "[Auto Task] Unblocked Service: Account has available data traffic": "[Auto Task] Unblocked service: Account has available data traffic",
-    "[Daily Task] Account Expiration: Block Login & Clear Account": "[Daily Task] Account Expiration: Block Login & Clear Account",
-    "[Daily Task] Account Expiration: Stop Service": "[Daily Task] Account Expiration: Stop Service",
-    "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[Daily Task] Reset Account Traffic, Next Reset Date: :date",
-    "[Service Timer] Service Expiration": "[Service Timer] Service Expiration",
-    "Daily Data Usage Report": "Daily Data Usage Report",
-    "Invoice Detail": "Invoice Detail",
-    "Payment for #:sn has been received! Total amount: :amount.": "Payment for #:sn has been received! Total amount: :amount.",
-    "Payment Received": "Payment Received",
-    "Subscription link receive abnormal access and banned by the system": "Subscription link receive abnormal access and banned by the system",
-    "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.",
-    "Verify Your Email Address": "Verify Your Email Address",
-    "You have not responded this ticket in :num hours, System has closed your ticket.": "You have not responded this ticket in :num hours, System has closed your ticket.",
-    "You must have a valid subscription to view the content in this area!": "You must have a valid subscription to view the content in this area!",
-    "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Your subscription has been disabled by the administrator, please contact the administrator to restore it"
-}
+  "(and :count more error)": "(and :count more error)",
+  "(and :count more errors)": "(and :count more errors)",
+  "----「:job」Completed, Used :time seconds ----": "----「:job」Completed, Used :time seconds ----",
+  "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[Auto Task] Blocked service: Abnormal traffic within 1 hour",
+  "[Auto Task] Blocked service: Run out of traffic": "[Auto Task] Blocked service: Run out of traffic",
+  "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours",
+  "[Auto Task] Unblocked Service: Account ban expired": "[Auto Task] Unblocked Service: Account ban expired",
+  "[Auto Task] Unblocked Service: Account has available data traffic": "[Auto Task] Unblocked Service: Account has available data traffic",
+  "[Daily Task] Account Expiration: Block Login & Clear Account": "[Daily Task] Account Expiration: Block Login & Clear Account",
+  "[Daily Task] Account Expiration: Stop Service": "[Daily Task] Account Expiration: Stop Service",
+  "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[Daily Task] Reset Account Traffic, Next Reset Date: :date",
+  "[Service Timer] Service Expiration": "[Service Timer] Service Expiration",
+  "A Timeout Occurred": "A Timeout Occurred",
+  "Accepted": "Accepted",
+  "All rights reserved.": "All rights reserved.",
+  "Already Reported": "Already Reported",
+  "Bad Gateway": "Bad Gateway",
+  "Bad Request": "Bad Request",
+  "Bandwidth Limit Exceeded": "Bandwidth Limit Exceeded",
+  "Client Closed Request": "Client Closed Request",
+  "Conflict": "Conflict",
+  "Connection Closed Without Response": "Connection Closed Without Response",
+  "Connection Timed Out": "Connection Timed Out",
+  "Continue": "Continue",
+  "Created": "Created",
+  "Daily Data Usage Report": "Daily Data Usage Report",
+  "Expectation Failed": "Expectation Failed",
+  "Failed Dependency": "Failed Dependency",
+  "Forbidden": "Forbidden",
+  "Found": "Found",
+  "Gateway Timeout": "Gateway Timeout",
+  "Go to page :page": "Go to page :page",
+  "Gone": "Gone",
+  "Hello!": "Hello!",
+  "HTTP Version Not Supported": "HTTP Version Not Supported",
+  "I'm a teapot": "I'm a teapot",
+  "If you did not create an account, no further action is required.": "If you did not create an account, no further action is required.",
+  "If you did not request a password reset, no further action is required.": "If you did not request a password reset, no further action is required.",
+  "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:",
+  "IM Used": "IM Used",
+  "Insufficient Storage": "Insufficient Storage",
+  "Internal Server Error": "Internal Server Error",
+  "Invalid JSON was returned from the route.": "Invalid JSON was returned from the route.",
+  "Invalid SSL Certificate": "Invalid SSL Certificate",
+  "Invoice Detail": "Invoice Detail",
+  "Length Required": "Length Required",
+  "Locked": "Locked",
+  "Login": "Login",
+  "Logout": "Logout",
+  "Loop Detected": "Loop Detected",
+  "Maintenance Mode": "Maintenance Mode",
+  "Method Not Allowed": "Method Not Allowed",
+  "Misdirected Request": "Misdirected Request",
+  "Moved Permanently": "Moved Permanently",
+  "Multi-Status": "Multi-Status",
+  "Multiple Choices": "Multiple Choices",
+  "Network Authentication Required": "Network Authentication Required",
+  "Network Connect Timeout Error": "Network Connect Timeout Error",
+  "Network Read Timeout Error": "Network Read Timeout Error",
+  "No Content": "No Content",
+  "Non-Authoritative Information": "Non-Authoritative Information",
+  "Not Acceptable": "Not Acceptable",
+  "Not Extended": "Not Extended",
+  "Not Found": "Not Found",
+  "Not Implemented": "Not Implemented",
+  "Not Modified": "Not Modified",
+  "of": "of",
+  "OK": "OK",
+  "Origin Is Unreachable": "Origin Is Unreachable",
+  "Page Expired": "Page Expired",
+  "Pagination Navigation": "Pagination Navigation",
+  "Partial Content": "Partial Content",
+  "Payload Too Large": "Payload Too Large",
+  "Payment for #:sn has been received! Total amount: :amount.": "Payment for #:sn has been received! Total amount: :amount.",
+  "Payment Received": "Payment Received",
+  "Payment Required": "Payment Required",
+  "Permanent Redirect": "Permanent Redirect",
+  "Please click the button below to verify your email address.": "Please click the button below to verify your email address.",
+  "Precondition Failed": "Precondition Failed",
+  "Precondition Required": "Precondition Required",
+  "Processing": "Processing",
+  "Proxy Authentication Required": "Proxy Authentication Required",
+  "Railgun Error": "Railgun Error",
+  "Range Not Satisfiable": "Range Not Satisfiable",
+  "Regards": "Regards",
+  "Register": "Register",
+  "Request Header Fields Too Large": "Request Header Fields Too Large",
+  "Request Timeout": "Request Timeout",
+  "Reset Content": "Reset Content",
+  "Reset Password": "Reset Password",
+  "Reset Password Notification": "Reset Password Notification",
+  "results": "results",
+  "Retry With": "Retry With",
+  "See Other": "See Other",
+  "Server Error": "Server Error",
+  "Service Unavailable": "Service Unavailable",
+  "Session Has Expired": "Session Has Expired",
+  "Showing": "Showing",
+  "SSL Handshake Failed": "SSL Handshake Failed",
+  "Subscription link receive abnormal access and banned by the system": "Subscription link receive abnormal access and banned by the system",
+  "Switching Protocols": "Switching Protocols",
+  "Temporary Redirect": "Temporary Redirect",
+  "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.",
+  "The given data was invalid.": "The given data was invalid.",
+  "The response is not a streamed response.": "The response is not a streamed response.",
+  "The response is not a view.": "The response is not a view.",
+  "This password reset link will expire in :count minutes.": "This password reset link will expire in :count minutes.",
+  "to": "to",
+  "Toggle navigation": "Toggle navigation",
+  "Too Early": "Too Early",
+  "Too Many Requests": "Too Many Requests",
+  "Unauthorized": "Unauthorized",
+  "Unavailable For Legal Reasons": "Unavailable For Legal Reasons",
+  "Unknown Error": "Unknown Error",
+  "Unprocessable Entity": "Unprocessable Entity",
+  "Unsupported Media Type": "Unsupported Media Type",
+  "Upgrade Required": "Upgrade Required",
+  "URI Too Long": "URI Too Long",
+  "Use Proxy": "Use Proxy",
+  "Variant Also Negotiates": "Variant Also Negotiates",
+  "Verify Email Address": "Verify Email Address",
+  "Verify Your Email Address": "Verify Your Email Address",
+  "Web Server is Down": "Web Server is Down",
+  "Whoops!": "Whoops!",
+  "You are receiving this email because we received a password reset request for your account.": "You are receiving this email because we received a password reset request for your account.",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": "You have not responded this ticket in :num hours, System has closed your ticket.",
+  "You must have a valid subscription to view the content in this area!": "You must have a valid subscription to view the content in this area!",
+  "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Your subscription has been disabled by the administrator, please contact the administrator to restore it."
+}

+ 92 - 87
resources/lang/en/admin.php

@@ -7,16 +7,16 @@ return [
         'users' => 'Total Users',
         'available_users' => 'Active Users',
         'paid_users' => 'Paying Users',
-        'active_days_users' => 'Active Users in Last :days Days',
-        'inactive_days_users' => 'Inactive Users for Over :days Days',
+        'active_days_users' => 'Active Users in the Last :days Days',
+        'inactive_days_users' => 'Inactive Users over :days Days',
         'online_users' => 'Online Now',
         'expiring_users' => 'Expiring Soon',
         'overuse_users' => 'Data Overuse [≥90%] Users',
-        'abnormal_users' => 'Abnormal Traffic in Past Hour',
+        'abnormal_users' => 'Abnormal Traffic in the Last Hour',
         'nodes' => 'Nodes',
-        'maintaining_nodes' => 'Maintenance Mode Nodes',
+        'maintaining_nodes' => 'Nodes in Maintenance Mode',
         'current_month_traffic_consumed' => 'Traffic Used This Month',
-        'days_traffic_consumed' => 'Traffic Used in Past :days Days',
+        'days_traffic_consumed' => 'Traffic Used in the Last :days Days',
         'orders' => 'Total Orders',
         'online_orders' => 'Online Payment Orders',
         'succeed_orders' => 'Paid Orders',
@@ -29,9 +29,9 @@ return [
         'add_item' => 'Add :attribute',
     ],
     'confirm' => [
-        'delete' => [0 => 'Confirm Delete :attribute [', 1 => ']?'],
-        'continues' => 'Confirm to continue?',
-        'export' => 'Confirm to export all?',
+        'delete' => [0 => 'Do you want to delete :attributes', 1 => ']?'],
+        'continues' => 'Do you want to continue this action?',
+        'export' => 'Do you want to export all?',
     ],
     'user_dashboard' => 'User Dashboard',
     'menu' => [
@@ -75,7 +75,7 @@ return [
             'order' => 'Orders',
         ],
         'promotion' => [
-            'attribute' => 'Affiliates',
+            'attribute' => 'Promote',
             'invite' => 'Referrals',
             'withdraw' => 'Withdraws',
             'rebate_flow' => 'Rebate History',
@@ -83,7 +83,8 @@ return [
         'analysis' => [
             'attribute' => 'Analytics',
             'accounting' => 'Accounting',
-            'user_flow' => 'User Flow',
+            'user_flow' => 'User Traffic Analysis',
+            'site_flow' => 'Site Traffic Analysis',
         ],
         'log' => [
             'attribute' => 'Logs',
@@ -97,7 +98,7 @@ return [
             'system' => 'System Logs',
         ],
         'tools' => [
-            'attribute' => 'Tools',
+            'attribute' => 'Toolkit',
             'decompile' => 'Decompile',
             'convert' => 'Convert',
             'import' => 'Import',
@@ -112,52 +113,51 @@ return [
     ],
     'user' => [
         'massive' => [
-            'text' => '# of Users to Generate',
+            'text' => 'Batch Generate Account Quantity',
             'failed' => 'User Generation Failed',
             'succeed' => 'User Generated Successfully',
-            'note' => 'Backend bulk user generate',
+            'note' => 'Batch generate user accounts in background',
         ],
         'proxy_info' => 'Config Info',
         'traffic_monitor' => 'Traffic Stats',
-        'online_monitor' => 'Online Monitor',
+        'online_monitor' => 'Online Monitoring',
         'reset_traffic' => 'Reset 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?'],
+        'counts' => 'Total <code>:num</code> Accounts',
+        'reset_confirm' => [0 => 'Do you want to reset [', 1 => ']\'s traffic?'],
         'info' => [
             'account' => 'Account Info',
             'proxy' => 'Proxy Info',
             'switch' => 'Switch Identity',
             'reset_date_hint' => 'Next data reset date',
-            'expired_date_hint' => 'Leave empty for 1 year by default',
+            'expired_date_hint' => 'Leave blank for a default validity of one year',
             'uuid_hint' => 'UUID for V2Ray',
-            'recharge_placeholder' => 'Input negative to deduct balance',
+            'recharge_placeholder' => 'If negative, deducts balance',
         ],
         'update_help' => 'Update successful, go back?',
-        'proxies_config' => '[:username] Config Info',
+        'proxies_config' => 'Connection Info for :username',
         'group' => [
-            'title' => 'User Groups <small>(Nodes can be in multiple groups, user only in one)</small>',
+            'title' => 'User Group Control<small> (A node can be in multiple groups, but the user can only belong to one group; for nodes visible/available to users, group has more priority than level)</small>',
             'name' => 'Group Name',
-            'counts' => '<code>:num</code> groups total',
+            'counts' => 'Total <code>:num</code> Groups',
         ],
     ],
     'zero_unlimited_hint' => '0 or empty for unlimited',
     'node' => [
         'traffic_monitor' => 'Traffic Stats',
-        'refresh_geo' => 'Refresh Geo Data',
-        'ping' => 'Latency Test',
-        'connection_test' => 'Connection Test',
-        'counts' => '<code>:num</code> nodes total',
+        'refresh_geo' => 'Refresh Geography',
+        'connection_test' => 'Connectivity Test',
+        'counts' => 'Total <code> :num </code> Nodes',
         'reload_all' => 'Reload All Backends',
         'refresh_geo_all' => 'Refresh Geo Data',
-        'reload_confirm' => 'Confirm Reload Node?',
+        'reload_confirm' => 'Do you want to reload the server backend?',
         'info' => [
             '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',
+            'basic' => 'Basic Information',
+            'ddns_hint' => 'Dynamic IP nodes require <a href="https://github.com/NewFuture/DDNS" target="_blank">DDNS configuration</a>. For this type of node, Connectivity Test will be conducted through domain names.',
             '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.',
+            'domain_hint' => 'After enabling the DDNS in system settings, the domain name and the IPs will automatically update! You no longer need to edit this information at the domain registrar website.',
             'extend' => 'Extended Info',
             'display' => [
                 'invisible' => 'Invisible',
@@ -166,23 +166,23 @@ return [
                 'all' => 'Fully Visible',
                 'hint' => 'Whether visible in subscription/node list',
             ],
-            '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_hint' => 'Multiple IPs should be separated by commas in English, for example: 1.1.1.1,8.8.8.8',
+            'ipv6_hint' => 'Multiple ips should be separated by commas in English, for example: 1.1.1.1,8.8.8.8',
             'ipv4_placeholder' => 'Server IPv4 Address',
             'ipv6_placeholder' => 'Server IPv6 Address',
-            'push_port_hint' => 'Required, 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',
+            'push_port_hint' => 'Required. Make sure this port is opened in the server firewall, otherwise message push will be abnormal.',
+            'data_rate_hint' => 'E. g. 0.1 means 100M will be count as 10M; 5 means 100M will be count as 500M',
+            'level_hint' => 'Level: 0 - No level restriction, all visible.',
             'detection' => [
-                'tcp' => 'TCP only',
-                'icmp' => 'ICMP only',
-                'all' => 'Detect All',
+                'tcp' => 'Only TCP',
+                'icmp' => 'Only ICMP',
+                'all' => 'Both',
                 'hint' => 'Random check every 30-60 mins',
             ],
             'obfs_param_hint' => 'Fill in parameters for traffic masquerading if obfs is not [plain]; &#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_method_hint' => 'WebSocket transmission protocol should not use \'none\' encryption method.',
+            'v2_net_hint' => 'Please enable TLS for WebSocket',
             'v2_cover' => [
                 'none' => 'None',
                 'http' => 'HTTP',
@@ -192,11 +192,11 @@ return [
                 'dtls' => 'DTLS 1.2',
                 'wireguard' => 'WireGuard',
             ],
-            'v2_host_hint' => 'For HTTP, separate multiple domains with ",". Only one allowed for WebSocket.',
+            'v2_host_hint' => 'When using HTTP camouflage, multiple domains should be separated by commas, while WebSocket only allows a single domain.',
             'v2_tls_provider_hint' => 'Different backends have different configs:',
             'single_hint' => 'Recommended port 80/443. Backend needs <br> strict mode config: only connect via specified ports. (<a href="javascript:showPortsOnlyConfig();">How to configure</a>)',
         ],
-        'proxy_info' => '*Compatibility with SS',
+        'proxy_info' => '*Compatible with the Shadowsocks',
         'proxy_info_hint' => 'For compatibility, please add <span class="red-700">_compatible</span> to protocol and obfuscation in server config',
         'reload' => 'Reload Backend',
         'auth' => [
@@ -214,32 +214,32 @@ return [
                 'real_time_logs' => 'Real-time Logs',
                 'restart' => 'Restart',
                 'same' => 'Same Above',
-                'trojan_hint' => 'Please fill in node <a href=":url" target="_blank">domain</a> and resolve domain DNS to node IP',
+                'trojan_hint' => 'Please fill in </a>the node name<a href=":url" target="_blank">and parse to the corresponding IP',
             ],
-            'reset_auth' => 'Reset Key',
-            'counts' => '<code>:num</code> authorizations total',
-            'generating_all' => 'Generate authorization for all nodes?',
+            'reset_auth' => 'Reset Authorization Key',
+            'counts' => 'Total <code>:num</code> Licenses',
+            'generating_all' => 'Confirm to generate authorization keys for all nodes?',
         ],
         'cert' => [
             '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',
+            'counts' => 'Total <code>:num</code> Domain Certificates',
+            'key_placeholder' => 'The KEY value of the certificate can be left empty. VNET-V2Ray backend supports auto-issue',
+            'pem_placeholder' => 'VNET-V2Ray backend supports auto-issuer',
         ],
     ],
     'hint' => 'Hint',
     'oauth' => [
-        'title' => 'User OAuth',
-        'counts' => '<code>:num</code> authorizations total',
+        'title' => 'OAuth',
+        'counts' => 'Total <code>:num</code> Authorization Records',
     ],
     'select_all' => 'Select All',
     'clear' => 'Clear',
-    'unselected_hint' => 'To Assign, Search Here',
-    'selected_hint' => 'Assigned, Search Here',
+    'unselected_hint' => 'Rules to be allocated can be searched here',
+    'selected_hint' => 'The allocated rules can be searched here',
     'clone' => 'Clone',
     'monitor' => [
-        'daily_chart' => 'Daily Traffic',
-        'monthly_chart' => 'Monthly Traffic',
+        'daily_chart' => 'Daily Traffic Usage',
+        'monthly_chart' => 'Monthly Traffic Usage',
         'node' => 'Node Traffic',
         'user' => 'User Traffic',
         'hint' => '<strong>Hint:</strong> Check scheduled tasks if no data',
@@ -247,39 +247,39 @@ return [
     'tools' => [
         'analysis' => [
             'title' => 'SSR Log Analysis <small>For single node</small>',
-            'req_url' => 'Recent Request URLs',
+            'req_url' => 'Recent Request URL Records',
             'not_enough' => 'Less than 15,000 records, unable to analyze',
         ],
         'convert' => [
             'title' => 'Format Conversion <small>SS to SSR</small>',
-            'content_placeholder' => 'Please fill in the config to convert',
+            'content_placeholder' => 'Please fill in the configuration information that needs to be converted.',
         ],
         'decompile' => [
             'title' => 'Decompile <small>Config Info</small>',
-            'attribute' => 'Decompile',
-            'content_placeholder' => 'Please fill in the SSR links to decompile, one per line',
+            'attribute' => 'Reverse Parsing Configuration Link',
+            'content_placeholder' => 'Please fill in the ShadowsocksR links that need to be reverse-parsed, separated by line breaks.',
         ],
     ],
     'ticket' => [
         'title' => 'Tickets',
-        'counts' => '<code>:num</code> tickets total',
+        'counts' => 'Total <code>:num</code> Tickets',
         'send_to' => 'Please fill in target user details',
         'user_info' => 'User Info',
         'inviter_info' => 'Inviter Info',
-        'close_confirm' => 'Confirm Close Ticket?',
+        'close_confirm' => 'Do you want to close this ticket?',
         'error' => 'Unknown error! Please check logs',
     ],
     'logs' => [
         'subscribe' => 'Subscriptions',
-        'counts' => '<code>:num</code> records total',
+        'counts' => 'Total <code>:num</code> Records',
         'rule' => [
-            'clear_all' => 'Clear All Records',
-            'title' => 'Trigger Records',
-            'name' => 'Trigger Rule',
+            'clear_all' => 'Clear all records',
+            'title' => 'Rule Trigger Records',
+            'name' => 'Triggered Rule Name',
             'reason' => 'Trigger Reason',
             'created_at' => 'Trigger Time',
-            'tag' => '✅ Non-permitted access',
-            'clear_confirm' => 'Confirm Clear All Records?',
+            'tag' => '✅ Accessing Unauthorized Content',
+            'clear_confirm' => 'Do you want to clear all trigger records?',
         ],
         'order' => [
             'title' => 'Orders',
@@ -305,7 +305,7 @@ return [
             'ban_time' => 'Banned On',
             'last_connect_at' => 'Last Login Time',
         ],
-        'credit_title' => 'Balance Change Records',
+        'credit_title' => 'Balance Change Logs',
     ],
     'start_time' => 'Start',
     'end_time' => 'End',
@@ -330,7 +330,7 @@ return [
             'no' => 'Off Sale',
         ],
         'sell_and_used' => 'Used / Sold',
-        'counts' => '<code>:num</code> goods total',
+        'counts' => 'Total <code>:num</code> Items',
     ],
     'sort_asc' => 'Larger sort value has higher priority',
     'yes' => 'Yes',
@@ -342,7 +342,7 @@ return [
             'ip' => 'IP',
             'protocol' => 'Protocol',
         ],
-        'counts' => '<code>:num</code> rules total',
+        'counts' => 'Total <code>:num</code> Rules',
         'title' => 'Rules',
         'group' => [
             'type' => [
@@ -350,7 +350,7 @@ return [
                 'on' => 'Allow',
             ],
             'title' => 'Rule Groups',
-            'counts' => '<code>:num</code> groups total',
+            'counts' => 'Total <code>:num</code> Groups',
         ],
     ],
     'role' => [
@@ -358,12 +358,15 @@ return [
         'description_hint' => 'Display name, e.g. Administrator',
         'title' => 'Roles',
         'permissions_all' => 'All Permissions',
-        'counts' => '<code>:num</code> roles total',
+        'counts' => 'Total <code>:num</code> Roles',
     ],
     'report' => [
-        'monthly_accounting' => 'Monthly Accounting',
-        'annually_accounting' => 'Annual Accounting',
-        'historic_accounting' => 'Historic Accounting',
+        'daily_accounting' => 'Daily Transactions',
+        'monthly_accounting' => 'Monthly Transactions',
+        'annually_accounting' => 'Annual Transactions',
+        'daily_site_flow' => 'Daily Traffic Consumption',
+        'monthly_site_flow' => 'Monthly Traffic Consumption',
+        'annually_site_flow' => 'Annual Traffic Consumption',
         'current_month' => 'This Month',
         'last_month' => 'Last Month',
         'current_year' => 'This Year',
@@ -371,18 +374,20 @@ return [
         'hourly_traffic' => 'Hourly Traffic',
         'daily_traffic' => 'Daily Traffic',
         'today' => 'Today',
+        'avg_traffic_30d' => 'Avg Daily Traffic Over 30 Days',
+        'sum_traffic_30d' => '30-Day Traffic Ratio',
     ],
     'permission' => [
         'title' => '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',
+        'counts' => 'Total <code>:num</code> Permissions',
     ],
     'marketing' => [
         'email' => [
             'title' => 'Email Marketing',
             'group_send' => 'Send Email',
-            'counts' => '<code>:num</code> emails total',
+            'counts' => 'Total <code>:num</code> Emails',
         ],
         'send_status' => 'Send Status',
         'send_time' => 'Sent On',
@@ -390,7 +395,7 @@ return [
         'push' => [
             'title' => 'Push Notifications',
             'send' => 'Send Notification',
-            'counts' => '<code>:num</code> messages total',
+            'counts' => 'Total <code>:num</code> Messages',
         ],
     ],
     'creating' => 'Adding...',
@@ -400,9 +405,9 @@ return [
             'announcement' => 'Announcement',
         ],
         'category_hint' => 'Same category will be grouped together',
-        'logo_hint' => 'Recommended size: 100x75',
+        'logo_placeholder' => 'Or enter logo URL',
         'title' => 'Articles',
-        'counts' => '<code>:num</code> articles total',
+        'counts' => 'Total <code>:num</code> Articles',
     ],
     'coupon' => [
         'title' => 'Coupons',
@@ -415,7 +420,7 @@ return [
         ],
         '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%',
+        'value_hint' => 'Range is 1% to 99%',
         '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',
@@ -435,7 +440,7 @@ return [
         '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',
+        'counts' => 'Total <code>:num</code> Coupons',
         'discount' => 'Discount',
         'export_title' => 'Export',
         'single_use' => 'One-time Use',
@@ -445,12 +450,12 @@ return [
     'system_generate' => 'System Generated',
     'aff' => [
         'rebate_title' => 'Rebate History',
-        'counts' => '<code>:num</code> rebates total',
+        'counts' => 'Total <code>:num</code> Records',
         'title' => 'Withdraw Requests',
-        'apply_counts' => '<code>:num</code> requests total',
+        'apply_counts' => 'Total <code>:num</code> Withdrawal Requests',
         'referral' => 'Referral Rebates',
         'commission_title' => 'Request Details',
-        'commission_counts' => 'Involves <code>:num</code> orders',
+        'commission_counts' => 'This application involves a total of <code>:num</code> orders',
     ],
     'setting' => [
         'common' => [
@@ -523,7 +528,7 @@ return [
         'is_checkin' => 'Check-in Reward',
         'is_clear_log' => 'Clean Logs',
         'is_custom_subscribe' => 'Advanced Subscription',
-        'is_email_filtering' => 'Email Filtering',
+        'is_email_filtering' => 'Email Filtering for User Registration',
         'is_forbid_robot' => 'Forbid Bots',
         'is_free_code' => 'Free Invitation Codes',
         'is_invite_register' => 'Invitation to Register',
@@ -633,14 +638,14 @@ return [
             'f2fpay_private_key' => 'Alipay private key from secret key tool',
             'f2fpay_public_key' => 'Not the APP public key!',
             'forbid_mode' => 'Block access from specified regions',
-            'invite_num' => 'Default invitations per user',
+            'invite_num' => 'Default number of invitations per user',
             'is_activate_account' => 'Require activation via email',
             'is_ban_status' => '(Caution) Ban account will reset all user data',
             '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_email_filtering' => 'Blacklist: Users can register with email suffixes not in the blacklist; Whitelist: Users must register with email suffixes in the whitelist',
             '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',

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

@@ -8,21 +8,21 @@ return [
         'attribute' => 'Activate',
         'error' => [
             '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.',
+            'disable' => 'The account activation is disabled, you can sign in directly!',
+            'throttle' => 'You have reached the activation request limit, please try again later! If you have any questions, contact :email.',
         ],
-        'promotion' => 'Account not yet activated, please [:action] first!',
-        'sent' => 'Activation email has been sent to your mailbox, please check including spam folder.',
+        'promotion' => 'Account not activated yet, please [:action] first!',
+        'sent' => 'Activation email has been sent to your mailbox, please check it (including the spam folder).',
     ],
     'aup' => 'Acceptable Use Policy',
     'captcha' => [
         'attribute' => 'Captcha',
         'error' => [
             'failed' => 'Captcha verification failed, please try again',
-            'timeout' => 'Captcha expired, please refresh and retry.',
+            'timeout' => 'Captcha has expired, please refresh and try again.',
         ],
         'required' => 'Please complete the captcha!',
-        'sent' => 'Captcha sent to your email, please check including spam folder.',
+        'sent' => 'Captcha sent to your email, please check it (including the spam folder).',
     ],
     'email' => [
         'error' => [
@@ -31,18 +31,18 @@ return [
         ],
     ],
     'error' => [
-        'account_baned' => 'Your account is banned!',
-        'login_error' => 'Login error, please retry later!',
-        'login_failed' => 'Login failed, please check email and password!',
+        'account_baned' => 'Your account has been banned!',
+        'login_error' => 'Login error, please try again later!',
+        'login_failed' => 'Login failed, please check your username and password!',
         'not_found_user' => 'No account found, please try other login methods.',
-        'repeat_request' => 'Please refresh and try again.',
-        'url_timeout' => 'Link expired, please request again.',
+        'repeat_request' => 'Please do not repeat requests, refresh and try again.',
+        'url_timeout' => 'The link has expired, please request again.',
     ],
     'failed' => 'Invalid credentials.',
     'invite' => [
         'attribute' => 'Invitation Code',
         'error' => [
-            'unavailable' => 'Invalid invitation code, please retry.',
+            'unavailable' => 'Invalid invitation code, please try again.',
         ],
         'get' => 'Get invitation code',
         'not_required' => 'No invitation code required, you can register directly!',
@@ -71,14 +71,14 @@ return [
         'reset' => [
             'attribute' => 'Reset Password',
             'error' => [
-                'demo' => 'Cannot change admin password in demo.',
+                'demo' => 'Cannot change admin password in demo mode.',
                 'disabled' => 'Password reset disabled, please contact :email for assistance.',
                 'failed' => 'Password reset failed.',
-                'same' => 'New password cannot be the same as old, please re-enter.',
+                'same' => 'New password cannot be the same as old one, please re-enter.',
                 'throttle' => 'You can only reset password :time times in 24 hours, do not operate too frequently.',
                 'wrong' => 'Incorrect password, please try again.',
             ],
-            'sent' => 'Reset link sent to your mailbox, please check including spam folder.',
+            'sent' => 'Reset link sent to your mailbox, please check it (including the spam folder).',
             'success' => 'New password reset successfully, you can now login.',
         ],
     ],
@@ -87,9 +87,9 @@ return [
         'code' => 'Registration Code',
         'error' => [
             'disable' => 'Sorry, we have temporarily stopped accepting new users.',
-            'throttle' => 'Anti-bot active! Please do not send registration forms too frequently!',
+            'throttle' => 'Anti-bot system activated! Please avoid frequent submissions!',
         ],
-        'failed' => 'Registration failed, please try later.',
+        'failed' => 'Registration failed, please try again later.',
         'promotion' => 'No account yet? Please go to ',
         'success' => 'Registration successful',
     ],

+ 15 - 22
resources/lang/en/common.php

@@ -5,9 +5,9 @@ declare(strict_types=1);
 return [
     'hour' => '{1} Hour|{2} O\'clock',
     'account' => 'Account',
-    'available_date' => 'Available Until',
-    'created_at' => 'Created On',
-    'expired_at' => 'Expires On',
+    'available_date' => 'Validity Period',
+    'created_at' => 'Date Created',
+    'expired_at' => 'Expiry Date',
     'updated_at' => 'Last Updated',
     'latest_at' => 'Last Activity',
     'back' => 'Back',
@@ -16,7 +16,7 @@ return [
     'close' => 'Close',
     'close_item' => 'Close :attribute',
     'confirm' => 'Confirm',
-    'continues' => 'Continue',
+    'continue' => 'Continue',
     'open' => 'Open',
     'send' => 'Send',
     'view' => 'View',
@@ -28,12 +28,12 @@ return [
     ],
     'add' => 'Add',
     'free' => 'Free',
-    'replace' => 'Replace',
+    'change' => 'Change',
     'submit' => 'Submit',
     'submit_item' => 'Submit :attribute',
     'generate' => 'Generate',
     'generate_item' => 'Generate :attribute',
-    'to_safari' => [0 => 'Click the upper right corner', 1 => ', then choose', 2 => 'Open in Safari', 3 => ' to improve your experience!'],
+    'to_safari' => [0 => 'Click the upper right corner', 1 => ', then choose', 2 => 'Open in Safari', 3 => ' to properly access this site!'],
     'update_browser' => [0 => 'You are using an ', 1 => 'outdated', 2 => ' browser. Please', 3 => 'upgrade your browser', 4 => 'for the best experience'],
     'apply' => 'Apply',
     'avatar' => 'Avatar',
@@ -65,18 +65,11 @@ return [
     ],
     'days' => [
         'attribute' => '{1} Days|{2} Day',
-        'sun' => 'Sunday',
-        'mon' => 'Monday',
-        'tue' => 'Tuesday',
-        'wed' => 'Wednesday',
-        'thu' => 'Thursday',
-        'fri' => 'Friday',
-        'sat' => 'Saturday',
         'weekend' => 'Weekend',
         'work' => 'Weekday',
-        'next' => 'Following Day',
+        'next' => 'Next Day',
     ],
-    'qrcode' => ':attribute QrCode',
+    'qrcode' => ':attribute QR Code',
     'deleted' => 'Deleted',
     'deleted_item' => ':attribute deleted',
     'print' => 'Print',
@@ -89,13 +82,13 @@ return [
         'crypto' => 'Cryptocurrency',
         'manual' => 'Manual Payment',
         'status' => [
-            'wait' => 'Waiting for Payment',
+            'wait' => 'Pending Payment',
         ],
     ],
     'order' => [
         'status' => [
-            'cancel' => 'Canceled',
-            'complete' => 'Completed',
+            'canceled' => 'Canceled',
+            'completed' => 'Completed',
             'prepaid' => 'Prepaid',
             'ongoing' => 'Ongoing',
             'review' => 'Pending Review',
@@ -135,10 +128,10 @@ return [
         'payment_pending' => 'Payment Pending',
         'pass' => 'Pass',
         'send_to_credit' => 'Add to Credit',
-        'waiting_tobe_send' => 'Waiting to Send',
+        'waiting_tobe_send' => 'Waiting to be Sent',
     ],
-    'stay_unchanged' => 'Keep empty to stay unchanged',
-    'random_generate' => 'Keep empty for random generate',
+    'stay_unchanged' => 'Leave empty to stay unchanged',
+    'random_generate' => 'Leave empty to generate randomly',
     'request_failed' => 'Request failed, please retry',
     'convert' => 'Convert',
     'import' => 'Import',
@@ -146,5 +139,5 @@ return [
     'more' => 'More',
     'to' => 'to',
     'to_be_send' => 'To be sent',
-    'developing' => 'Developing! Stay tuned',
+    'developing' => 'Under development! Stay tuned',
 ];

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

@@ -4,31 +4,31 @@ declare(strict_types=1);
 
 return [
     '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',
+        'access' => 'Detected unknown IP or proxy access, access denied',
+        'bots' => 'Detected bot access, access denied',
+        'china' => 'Detected China IP or proxy access, access denied',
+        'oversea' => 'Detected overseas IP or proxy access, access denied',
     ],
     'log' => 'Log',
     'refresh' => 'Refresh',
     'refresh_page' => 'Please refresh the page and try again',
     'report' => 'The error carried a report: ',
-    'safe_enter' => 'Safe entrance',
+    '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' => 'Failed to get IP info',
+    'get_ip' => 'Failed to retrieve IP information',
     'subscribe' => [
-        '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 banned until :time, please wait for unlock!',
+        'unknown' => 'Invalid subscription link! Please obtain a new one!',
+        'sub_banned' => 'Subscription banned! Visit the website for details',
+        'user' => 'Invalid URL, account does not exist!',
+        'user_disabled' => 'Account Disabled! Contact Support!',
+        'banned_until' => 'Account banned until :time, please wait for unlock!',
         'out' => 'OUT OF DATA! Please purchase more or reset data!',
-        'expired' => 'Account Expired! Please renew your purchase!',
-        'question' => 'Account Error!? Visit the website for details',
+        'expired' => 'Account expired! Please renew your subscription!',
+        'question' => 'Account issues!? Visit the website for details',
         'none' => 'No available nodes',
     ],
 ];

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

@@ -28,7 +28,7 @@ return [
     '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',
+    'data_anomaly_content' => 'User :id: [Upload: :upload | Download: :download | Total: :total] in the last hour',
     'node' => [
         'upload' => 'Upload',
         'download' => 'Download',

+ 101 - 101
resources/lang/en/user.php

@@ -9,59 +9,59 @@ return [
         'level' => 'Account Level',
         'group' => 'Group',
         'speed_limit' => 'Speed Limit',
-        'remain' => 'Data Remaining',
-        'time' => 'Duration',
+        'remain' => 'Remaining Data',
+        'time' => 'Plan Duration',
         'last_login' => 'Last Login',
         'reset' => '{0} Data will reset in <code id="restTime">:days</code> |{1} :days day left to reset data |[2,*] :days days left to reset data',
         'connect_password' => 'Proxy Connection Password',
         'reason' => [
-            'normal' => 'Account normal',
+            'normal' => 'Account is 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 refreshing your browser first before contacting admin for help',
+            'overused' => 'You have exceeded the <code>:data</code> GB limit for this period<br/> Limit will be lifted in <code id="banedTime">:min</code> minutes',
+            'traffic_exhausted' => 'Data has been exhausted',
+            'unknown' => 'Unknown reason, please try refreshing the browser! If the problem persists, contact support.',
         ],
     ],
     'home' => [
         'attendance' => [
             'attribute' => 'Check In',
-            'disable' => 'Check in disabled',
-            'done' => 'Already checked in, come back tomorrow!',
-            'success' => 'You got :data data',
-            'failed' => 'System ❌ Error',
+            'disable' => 'Check-in disabled',
+            'done' => 'You have already checked in. Come back tomorrow!',
+            'success' => 'You received :data data',
+            'failed' => 'System error',
         ],
         'traffic_logs' => 'Data Records',
         'announcement' => 'Announcements',
-        'wechat_push' => 'WeChat Notification Service',
+        'wechat_push' => 'WeChat Notifications',
         'chat_group' => 'Chat Group',
         'empty_announcement' => 'No announcements',
     ],
-    'purchase_to_unlock' => 'Purchase to unlock',
-    'purchase_required' => 'Disabled for non-paying users, please',
+    'purchase_to_unlock' => 'Purchase to Unlock',
+    'purchase_required' => 'This feature is disabled for non-paying users. Please',
     'attribute' => [
         'node' => 'Node',
         'data' => 'Data',
-        'ip' => 'IP',
+        'ip' => 'IP Address',
         'isp' => 'ISP',
         'address' => 'Location',
     ],
-    'purchase_promotion' => 'Purchase service now!',
+    'purchase_promotion' => 'Purchase Service Now!',
     'menu' => [
-        'helps' => 'Help',
+        'help' => 'Help',
         'home' => 'Home',
         'invites' => 'Invite',
         'invoices' => 'Invoice',
         'nodes' => 'Nodes',
-        'referrals' => 'Referral',
+        'promotion' => 'Referral',
         'shop' => 'Shop',
         'profile' => 'Profile',
-        'tickets' => 'Ticket',
+        'tickets' => 'Tickets',
         'admin_dashboard' => 'Dashboard',
     ],
     'contact' => 'Contact',
     'oauth' => [
         'bind_title' => 'Bind Social Account',
-        'not_bind' => 'Not bound',
+        'not_bind' => 'Not Bound',
         'bind' => 'Bind',
         'rebind' => 'Rebind',
         'unbind' => 'Unbind',
@@ -70,118 +70,118 @@ return [
         'discount' => 'Discount',
         'error' => [
             'unknown' => 'Invalid coupon',
-            'used' => 'Coupon used',
+            'used' => 'Coupon already used',
             'expired' => 'Coupon expired',
             'run_out' => 'Coupon exhausted',
-            'inactive' => 'Coupon inactive',
+            'inactive' => 'Coupon not active',
             'wait' => 'Will be active at :time, please wait!',
-            'unmet' => 'Conditions unmet',
+            'unmet' => 'Conditions not met',
             'minimum' => 'Minimum amount is :amount',
-            'overused' => 'Can only use :times times',
-            'users' => 'Account not eligible',
-            'services' => 'Goods not eligible, check terms',
+            'overused' => 'Can only be used :times times',
+            'users' => 'Account not eligible for promotion',
+            'services' => 'Goods not eligible for discount, check promotional terms',
         ],
     ],
-    'error_response' => 'Error occurred, please try again later.',
+    'error_response' => 'An error occurred, please try again later.',
     'invite' => [
         'attribute' => 'Invitation Code',
-        'counts' => 'Total <code>:num</code> invitation codes',
-        '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',
+        'counts' => 'Total of <code>:num</code> invitation codes',
+        'tips' => '<strong>:num</strong> invitations remaining, codes expire :days days after creation',
+        'logs' => 'Invitation Logs',
+        'promotion' => 'Both you and the invitee will receive <mark>:traffic</mark> data when they register with your code; You will earn <mark>:referral_percent%</mark> commission when they make a purchase.',
+        'generate_failed' => 'Failed to generate: Quota exceeded',
     ],
     'reset_data' => [
         'action' => 'Reset Data',
-        'cost' => 'Cost <code>:amount</code>',
-        'cost_tips' => 'Reset will deduct :amount!',
-        'lack' => 'Lack balance, please top up',
-        'logs' => 'User data reset',
-        'success' => 'Reset success',
+        'cost' => 'Cost: <code>:amount</code>',
+        'cost_tips' => 'The reset will deduct :amount!',
+        'insufficient' => 'Insufficient balance, please top up',
+        'logs' => 'User reset data',
+        'success' => 'Reset successful',
     ],
     'referral' => [
         'link' => 'Referral Link',
-        'total' => 'Total :amount (:total times), can withdraw over :money',
+        'total' => 'Total commission: :amount (:total times), can withdraw when over :money',
         'logs' => 'Commission Logs',
-        'failed' => 'Failed',
-        'success' => 'Success',
+        'failed' => 'Request failed',
+        'success' => 'Request successful',
         'msg' => [
-            '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',
+            'account' => 'Account expired, please purchase a plan first',
+            'applied' => 'Existing request, please wait for processing',
+            'unfulfilled' => 'Need :amount to withdraw, keep going!',
+            'wait' => 'Please wait for admin approval',
+            'error' => 'Error creating order, try again later or contact support',
         ],
     ],
     'inviter' => 'Inviter',
     'invitee' => 'Invitee',
-    'registered_at' => 'Register Date',
+    'registered_at' => 'Registration Date',
     'bought_at' => 'Purchase Date',
-    'payment_method' => 'Payment',
+    'payment_method' => 'Payment Method',
     'pay' => 'Pay',
-    'input_coupon' => 'Enter coupon',
-    'recharge' => 'Top Up',
-    'recharge_credit' => 'Credit Top Up',
-    'recharging' => 'Topping up...',
+    'input_coupon' => 'Enter coupon code',
+    'recharge' => 'Recharge',
+    'recharge_credit' => 'Credit Recharge',
+    'recharging' => 'Recharging...',
     'withdraw_commission' => 'Withdraw Commission',
-    'withdraw_at' => 'Withdraw Date',
-    'withdraw_logs' => 'Withdraw Logs',
+    'withdraw_at' => 'Withdrawal Date',
+    'withdraw_logs' => 'Withdrawal Logs',
     'withdraw' => 'Withdraw',
-    'scan_qrcode' => 'Scan QR code in client',
+    'scan_qrcode' => 'Scan QR code with client',
     'shop' => [
-        'hot' => 'HOT',
+        'hot' => 'Hot',
         'limited' => 'Limited',
-        'change_amount' => 'Top Up Amount',
-        'change_amount_help' => 'Enter top up amount',
+        'change_amount' => 'Recharge Amount',
+        'change_amount_help' => 'Enter recharge amount',
         'buy' => 'Buy',
         'description' => 'Description',
         'service' => 'Service',
-        'pay_credit' => 'Credit',
-        'pay_online' => 'Online Payment',
+        'pay_credit' => 'Pay with Credit',
+        'pay_online' => 'Pay Online',
         'price' => 'Price',
         'quantity' => 'Quantity',
         'subtotal' => 'Subtotal',
         'total' => 'Total',
         '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',
+        'conflict_tips' => '<p>The current purchase will be set as a <code>prepaid plan</code></p><ol><li>Prepaid plan will automatically activate after current plan expires</li><li>You can manually activate it after payment</li></ol>',
+        'call4help' => 'Contact support if you have any questions',
     ],
     'service' => [
-        'node_count' => ':num quality nodes',
-        'country_count' => ':num countries covered',
-        'unlimited' => 'Unlimited',
+        'node_count' => '<code>:num</code> high-quality nodes',
+        'country_count' => 'Covers <code>:num</code> countries or regions',
+        'unlimited' => 'Unlimited speed',
     ],
     'payment' => [
-        'error' => 'Invalid top up amount',
+        'error' => 'Invalid recharge 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',
+        'qrcode_tips' => 'Please scan with <strong class="red-600">:software</strong>',
+        'close_tips' => 'Complete the payment within <code>:minutes</code> minutes, or the order will close automatically',
+        'mobile_tips' => '<strong>Mobile Users:</strong> Long press the QR code -> Save image -> Open payment app -> Scan image to pay',
     ],
     'invoice' => [
         'attribute' => 'Order',
-        'detail' => 'Records',
+        'detail' => 'Order Details',
         'amount' => 'Amount',
-        'active_prepaid_question' => 'Activate prepaid package in advance?',
-        'active_prepaid_tips' => 'After activated:<br>- Current package expire immediately!<br>- New expiration starts today!',
+        'active_prepaid_question' => 'Activate prepaid package early?',
+        'active_prepaid_tips' => 'After activation:<br>Your current plan will immediately expire<br>The new plan\'s expiration date will be recalculated from today',
     ],
     'node' => [
-        'info' => 'Config',
-        'setting' => 'Settings',
-        'unstable' => 'Unstable/Maintaining',
-        'rate' => ':ratio X data usage',
+        'info' => 'Configuration Info',
+        'setting' => 'Proxy Settings',
+        'unstable' => 'Unstable/Maintenance',
+        'rate' => ':ratio times data consumption',
     ],
     'subscribe' => [
-        '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',
+        'link' => 'Subscription Link',
+        'tips' => 'Warning: This link is for personal use only. Do not share it, or your account may be banned for abnormal usage.',
+        'exchange_warning' => 'Changing the subscription link will:\n1. Revoke the current link immediately\n2. Change the connection password',
+        'custom' => 'Custom Subscription',
+        'ss_only' => 'Subscribe SS only',
+        'ssr_only' => 'Subscribe SSR (incl. SS) only',
+        'v2ray_only' => 'Subscribe V2Ray only',
+        'trojan_only' => 'Subscribe Trojan only',
+        'error' => 'Error changing subscription link',
         'info' => [
             'title' => 'Account Summary [Non-Realtime]',
             'upload' => 'Upload',
@@ -195,24 +195,24 @@ return [
         'reply_confirm' => 'Confirm reply ticket?',
         'close_tips' => 'Confirm close ticket?',
         'close' => 'Close Ticket',
-        'failed_closed' => 'Error: Closed already',
-        'reply_placeholder' => 'Say something...',
+        'failed_closed' => 'Error: Already closed',
+        'reply_placeholder' => 'Write something...',
         'reply' => 'Reply',
-        'close_msg' => 'Ticket: ID :id closed by user',
+        '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',
+        'content_placeholder' => 'Provide detailed description of your issue to help us assist you better',
+        'new' => 'Create New Ticket',
+        'service_hours' => 'Customer Service Hours',
         'online_hour' => 'Online Hours',
-        'service_tips' => 'Please use only one contact method! Repeated requests will delay response',
-        'error' => 'Unknown error! Notify admin',
+        'service_tips' => 'Please use only <code>one</code> contact method to reach support! Repeated requests will delay response time.',
+        'error' => 'Unknown error! Please contact support',
     ],
     'traffic_logs' => [
-        '24hours' => 'Today Usage',
-        '30days' => 'This Month Usage',
-        'tips' => 'Note: Data delayed, daily updated next day, hourly next hour',
+        'hourly' => 'Today\'s Data Usage',
+        'daily' => 'This Month\'s Data Usage',
+        'tips' => 'Note: There is a delay in data statistics updates.',
     ],
-    'client' => 'Client',
+    'clients' => 'Clients',
     'tutorials' => 'Tutorials',
     'current_role' => 'Current Role as',
     'knowledge' => [
@@ -221,17 +221,17 @@ return [
     ],
     'manual' => [
         'red_packet' => 'Alipay Red Packet',
-        'hint' => 'Continue to [Next] after scanning QR code until [Submit] to complete payment!!!',
-        'step_1' => 'Note',
+        'hint' => 'After scanning the QR code, continue clicking [Next] until [Submit] to complete the payment!',
+        'step_1' => 'Notes',
         'step_1_title' => 'How to Pay Manually',
         'step_2' => 'Payment',
         'step_2_title' => 'Get QR code and pay',
-        'step_3' => 'Done',
+        'step_3' => 'Completion',
         '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',
+        'remark_content' => 'Please provide your account username for accurate manual verification',
+        'payment_hint' => 'Please pay the exact amount (no refund for overpayment, top up for underpayment)',
+        'pre' => 'Previous',
         'next' => 'Next',
     ],
 ];

+ 49 - 0
resources/lang/en/validation.php

@@ -143,37 +143,62 @@ return [
     'uuid' => 'The :attribute must be a valid UUID.',
     'attributes' => [
         'address' => 'address',
+        'affiliate_url' => 'affiliate URL',
         'age' => 'age',
         'amount' => 'amount',
+        'announcement' => 'announcement',
         'area' => 'area',
+        'audience_prize' => 'audience prize',
         'available' => 'available',
         'birthday' => 'birthday',
         'body' => 'body',
         'city' => 'city',
+        'compilation' => 'compilation',
+        'concept' => 'concept',
+        'conditions' => 'conditions',
         'content' => 'content',
         'country' => 'country',
+        'cover' => 'cover',
         'created_at' => 'created at',
         'creator' => 'creator',
+        'currency' => 'currency',
         'current_password' => 'current password',
+        'customer' => 'customer',
         'date' => 'date',
         'date_of_birth' => 'date of birth',
+        'dates' => 'dates',
         'day' => 'day',
         'deleted_at' => 'deleted at',
         'description' => 'description',
+        'display_type' => 'display type',
         'district' => 'district',
         'duration' => 'duration',
         'email' => 'email',
         'excerpt' => 'excerpt',
         'filter' => 'filter',
+        'finished_at' => 'finished at',
         'first_name' => 'first name',
         'gender' => 'gender',
+        'grand_prize' => 'grand prize',
         'group' => 'group',
         'hour' => 'hour',
         'image' => 'image',
+        'image_desktop' => 'desktop image',
+        'image_main' => 'main image',
+        'image_mobile' => 'mobile image',
+        'images' => 'images',
+        'is_audience_winner' => 'is audience winner',
+        'is_hidden' => 'is hidden',
+        'is_subscribed' => 'is subscribed',
+        'is_visible' => 'is visible',
+        'is_winner' => 'is winner',
+        'items' => 'items',
+        'key' => 'key',
         'last_name' => 'last name',
         'lesson' => 'lesson',
         'line_address_1' => 'line address 1',
         'line_address_2' => 'line address 2',
+        'login' => 'login',
         'message' => 'message',
         'middle_name' => 'middle name',
         'minute' => 'minute',
@@ -186,22 +211,43 @@ return [
         'password_confirmation' => 'password confirmation',
         'phone' => 'phone',
         'photo' => 'photo',
+        'portfolio' => 'portfolio',
         'postal_code' => 'postal code',
+        'preview' => 'preview',
         'price' => 'price',
+        'product_id' => 'product ID',
+        'product_uid' => 'product UID',
+        'product_uuid' => 'product UUID',
+        'promo_code' => 'promo code',
         'province' => 'province',
+        'quantity' => 'quantity',
+        'reason' => 'reason',
         'recaptcha_response_field' => 'recaptcha response field',
+        'referee' => 'referee',
+        'referees' => 'referees',
+        'reject_reason' => 'reject reason',
         'remember' => 'remember',
         'restored_at' => 'restored at',
         'result_text_under_image' => 'result text under image',
         'role' => 'role',
+        'rule' => 'rule',
+        'rules' => 'rules',
         'second' => 'second',
         'sex' => 'sex',
+        'shipment' => 'shipment',
         'short_text' => 'short text',
         'size' => 'size',
+        'skills' => 'skills',
+        'slug' => 'slug',
+        'specialization' => 'specialization',
+        'started_at' => 'started at',
         'state' => 'state',
+        'status' => 'status',
         'street' => 'street',
         'student' => 'student',
         'subject' => 'subject',
+        'tag' => 'tag',
+        'tags' => 'tags',
         'teacher' => 'teacher',
         'terms' => 'terms',
         'test_description' => 'test description',
@@ -210,8 +256,11 @@ return [
         'text' => 'text',
         'time' => 'time',
         'title' => 'title',
+        'type' => 'type',
         'updated_at' => 'updated at',
+        'user' => 'user',
         'username' => 'username',
+        'value' => 'value',
         'year' => 'year',
     ],
 ];

+ 129 - 56
resources/lang/fa.json

@@ -1,57 +1,130 @@
 {
-    "(and :count more error)": "(و :count خطای دیگر)",
-    "(and :count more errors)": "(و :count خطای دیگر)",
-    "All rights reserved.": "کلیه حقوق محفوظ است.",
-    "Forbidden": "عدم دسترسی",
-    "Go to page :page": "برو به صفحه :page",
-    "Hello!": "سلام!",
-    "If you did not create an account, no further action is required.": "چنانچه شما حساب کاربری ایجاد نکرده اید، نیاز به اقدام خاصی نیست.",
-    "If you did not request a password reset, no further action is required.": "اگر شما درخواست تغییر رمزعبور را نکرده اید، نیاز به اقدام خاصی نیست.",
-    "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "اگر با کلیک کردن روی دکمه \":actionText\" مشکل دارید، لینک زیر را کپی کنید و در مرورگر خود وارد کنید:",
-    "Invalid JSON was returned from the route.": "JSON نامعتبر از مسیر برگردانده شد.",
-    "Login": "ورود",
-    "Logout": "خروج",
-    "Not Found": "یافت نشد",
-    "of": "از",
-    "Page Expired": "صفحه منقضی شده است",
-    "Pagination Navigation": "راهنمای صفحه بندی",
-    "Payment Required": "پرداخت لازم",
-    "Please click the button below to verify your email address.": "برای تایید آدرس ایمیل روی دکمه زیر کلیک کنید.",
-    "Regards": "با احترام",
-    "Register": "ثبت نام",
-    "Reset Password": "فراموشی رمزعبور",
-    "Reset Password Notification": "پیام فراموشی رمزعبور",
-    "results": "نتایج",
-    "Server Error": "خطای سرور",
-    "Service Unavailable": "عدم دسترسی به سرویس",
-    "Showing": "در حال نمایش",
-    "The given data was invalid.": "داده دریافتی معتبر نمی‌باشد.",
-    "The response is not a streamed response.": "پاسخ یک پاسخ جریانی نیست.",
-    "The response is not a view.": "پاسخ یک دیدگاه نیست.",
-    "This password reset link will expire in :count minutes.": "لینک فراموشی رمزعبور برای :count دقیقه معتبر است.",
-    "to": "به",
-    "Toggle navigation": "تغییر ناوبری",
-    "Too Many Requests": "تعداد درخواست های ارسال شده زیاد است",
-    "Unauthorized": "دسترسی غیر مجاز",
-    "Verify Email Address": "تایید آدرس ایمیل",
-    "Whoops!": "وای!",
-    "You are receiving this email because we received a password reset request for your account.": "شما این ایمیل را به دلیل درخواست رمزعبور جدید دریافت کرده‌اید.",
-    "----「:job」Completed, Used :time seconds ----": "----「:job」 انجام شد، :time ثانیه طول کشید ----",
-    "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[وظیفه خودکار] سرویس مسدود شد: ترافیک غیرعادی در یک ساعت گذشته",
-    "[Auto Task] Blocked service: Run out of traffic": "[وظیفه خودکار] سرویس مسدود شد: ترافیک تمام شد",
-    "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[وظیفه خودکار] اشتراک مسدود شد: اشتراک با درخواست‌های غیرعادی در 24 ساعت گذشته",
-    "[Daily Task] Account Expiration: Block Login & Clear Account": "[وظیفه روزانه] حساب منقضی شد: مسدود کردن ورود و پاک کردن حساب",
-    "[Daily Task] Account Expiration: Stop Service": "[وظیفه روزانه] حساب منقضی شد: توقف سرویس",
-    "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[وظیفه روزانه] بازنشانی ترافیک حساب، تاریخ بعدی بازنشانی: :date",
-    "[Service Timer] Service Expiration": "[تایمر سرویس] انقضای سرویس",
-    "Daily Data Usage Report": "گزارش روزانه مصرف دیتا",
-    "Invoice Detail": "جزئیات فاکتور",
-    "Payment for #:sn has been received! Total amount: :amount.": "پرداخت برای #:sn دریافت شد! مبلغ کل: :amount.",
-    "Payment Received": "پرداخت دریافت شد",
-    "Subscription link receive abnormal access and banned by the system": "لینک اشتراک دسترسی غیرعادی دریافت کرد و توسط سیستم مسدود شد",
-    "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "متشکریم که ثبت نام کردید! قبل از شروع، باید ایمیل خود را با کلیک روی لینکی که تازه برای شما ارسال کردیم، تایید کنید! اگر ایمیلی دریافت نکردید، خوشحال می‌شویم یکی دیگر بفرستیم.",
-    "Verify Your Email Address": "تایید آدرس ایمیل خود",
-    "You have not responded this ticket in :num hours, System has closed your ticket.": ":num ساعت به این تیکت پاسخ نداده‌اید، سیستم تیکت شما را بسته است.",
-    "You must have a valid subscription to view the content in this area!": "برای مشاهده محتوای این بخش باید اشتراک معتبری داشته باشید!",
-    "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "اشتراک شما توسط ادمین غیرفعال شده است، لطفا برای فعالسازی مجدد با ادمین تماس بگیرید."
-}
+  "(and :count more error)": "(و :count خطای دیگر)",
+  "(and :count more errors)": "(و :count خطای دیگر)",
+  "----「:job」Completed, Used :time seconds ----": "----「:job」تکمیل شد، مدت زمان: :time ثانیه ----",
+  "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[وظیفه خودکار] سرویس مسدود شد: ترافیک غیرعادی در 1 ساعت",
+  "[Auto Task] Blocked service: Run out of traffic": "[وظیفه خودکار] سرویس مسدود شد: ترافیک به پایان رسید",
+  "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[وظیفه خودکار] اشتراک مسدود شد: درخواست‌های غیرعادی در 24 ساعت",
+  "[Auto Task] Unblocked Service: Account ban expired": "[وظیفه خودکار] سرویس باز شد: ممنوعیت حساب منقضی شد",
+  "[Auto Task] Unblocked Service: Account has available data traffic": "[وظیفه خودکار] سرویس باز شد: حساب دارای ترافیک داده قابل استفاده است",
+  "[Daily Task] Account Expiration: Block Login & Clear Account": "[وظیفه روزانه] انقضای حساب: مسدود کردن ورود و پاکسازی حساب",
+  "[Daily Task] Account Expiration: Stop Service": "[وظیفه روزانه] انقضای حساب: توقف سرویس",
+  "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[وظیفه روزانه] بازنشانی ترافیک حساب، تاریخ بازنشانی بعدی: :date",
+  "[Service Timer] Service Expiration": "[تایمر سرویس] انقضای سرویس",
+  "A Timeout Occurred": "مهلت زمانی تمام شد.",
+  "Accepted": "پذیرفته شده",
+  "All rights reserved.": "کلیه حقوق محفوظ است.",
+  "Already Reported": "قبلا گزارش شده است",
+  "Bad Gateway": "درگاه خراب",
+  "Bad Request": "درخواست ناصحیح",
+  "Bandwidth Limit Exceeded": "ظرفیت پهنای‌باند به اتمام رسید",
+  "Client Closed Request": "درخواست توسط کاربر بسته شد",
+  "Conflict": "ناسازگاری",
+  "Connection Closed Without Response": "اتصال بدون پاسخ بسته شد",
+  "Connection Timed Out": "مهلت زمانی اتصال تمام شد",
+  "Continue": "ادامه",
+  "Created": "ایجاد شد",
+  "Daily Data Usage Report": "گزارش استفاده روزانه از داده",
+  "Expectation Failed": "انتظار با شکست مواجه شده",
+  "Failed Dependency": "وابستگی شکست‌خورده",
+  "Forbidden": "عدم دسترسی",
+  "Found": "انتقال موقتی",
+  "Gateway Timeout": "وقفهٔ در گاه",
+  "Go to page :page": "برو به صفحه :page",
+  "Gone": "رفته",
+  "Hello!": "سلام!",
+  "HTTP Version Not Supported": "نگارش HTTP پشتیبانی نمی‌شود",
+  "I'm a teapot": "من یک teapot)قوری( هستم",
+  "If you did not create an account, no further action is required.": "چنانچه شما حساب کاربری ایجاد نکرده اید، نیاز به اقدام خاصی نیست.",
+  "If you did not request a password reset, no further action is required.": "اگر شما درخواست تغییر رمزعبور را نکرده اید، نیاز به اقدام خاصی نیست.",
+  "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "اگر با کلیک کردن روی دکمه \":actionText\" مشکل دارید، لینک زیر را کپی کنید و در مرورگر خود وارد کنید:",
+  "IM Used": "IM استفاده شده",
+  "Insufficient Storage": "فضای ناکافی",
+  "Internal Server Error": "خطای داخلی سرور",
+  "Invalid JSON was returned from the route.": "JSON نامعتبر از مسیر برگردانده شد.",
+  "Invalid SSL Certificate": "گواهی SSL نامعتبر",
+  "Invoice Detail": "جزئیات فاکتور",
+  "Length Required": "طول مورد نیاز است",
+  "Locked": "قفل شده",
+  "Login": "ورود",
+  "Logout": "خروج",
+  "Loop Detected": "حلقه شناسایی شد",
+  "Maintenance Mode": "سرویس در دسترس نیست",
+  "Method Not Allowed": "متود مجاز نیست",
+  "Misdirected Request": "درخواست نادرست",
+  "Moved Permanently": "انتقال دائم",
+  "Multi-Status": "چندین-وضعیت",
+  "Multiple Choices": "چندین انتخاب",
+  "Network Authentication Required": "احراز هویت درون شبکه لازم است",
+  "Network Connect Timeout Error": "مهلت اتصال شبکه تمام شد",
+  "Network Read Timeout Error": "مهلت خواندن شبکه تمام شد",
+  "No Content": "بدون محتویات",
+  "Non-Authoritative Information": "اطلاعات نامعتبر",
+  "Not Acceptable": "قابل قبول نیست",
+  "Not Extended": "تمدید نشده",
+  "Not Found": "یافت نشد",
+  "Not Implemented": "اجرا نشده",
+  "Not Modified": "اصلاح نشده",
+  "of": "از",
+  "OK": "موفقیت آمیز",
+  "Origin Is Unreachable": "مبدا قابل دستیابی نیست",
+  "Page Expired": "صفحه منقضی شده است",
+  "Pagination Navigation": "راهنمای صفحه بندی",
+  "Partial Content": "محتوی جزئی",
+  "Payload Too Large": "موجودیت درخواست بسیار بزرگ است",
+  "Payment for #:sn has been received! Total amount: :amount.": "پرداخت برای #:sn دریافت شد! مبلغ کل: :amount.",
+  "Payment Received": "پرداخت دریافت شد",
+  "Payment Required": "پرداخت لازم",
+  "Permanent Redirect": "تغییر مسیر دائم",
+  "Please click the button below to verify your email address.": "برای تایید آدرس ایمیل روی دکمه زیر کلیک کنید.",
+  "Precondition Failed": "پیش شرط با شکست مواجه شده",
+  "Precondition Required": "پیش شرط لازم است",
+  "Processing": "پردازش درخواست",
+  "Proxy Authentication Required": "نیاز به تصدیق پراکسی می‌باشد",
+  "Railgun Error": "خطای Railgun",
+  "Range Not Satisfiable": "محدودهٔ درخواست شده رضایت پذیر نیست",
+  "Regards": "با احترام",
+  "Register": "ثبت نام",
+  "Request Header Fields Too Large": "فیلد های هدر درخواست بیش اندازه بزرگ هستند",
+  "Request Timeout": "وقفهٔ درخواست",
+  "Reset Content": "تنظیم مجدد محتوی",
+  "Reset Password": "فراموشی رمزعبور",
+  "Reset Password Notification": "پیام فراموشی رمزعبور",
+  "results": "نتایج",
+  "Retry With": "تلاش مجدد با",
+  "See Other": "به محل دیگری مراجعه کنید",
+  "Server Error": "خطای سرور",
+  "Service Unavailable": "عدم دسترسی به سرویس",
+  "Session Has Expired": "نشست منقضی شده",
+  "Showing": "در حال نمایش",
+  "SSL Handshake Failed": "SSL Handshake با شکست مواجه شد",
+  "Subscription link receive abnormal access and banned by the system": "لینک اشتراک دسترسی غیرعادی دریافت کرد و توسط سیستم مسدود شد",
+  "Switching Protocols": "درحال تعویض پروتکل ها",
+  "Temporary Redirect": "تغییر مسیر موقت",
+  "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "از ثبت‌نام شما متشکریم! قبل از شروع، باید با کلیک بر روی لینکی که به تازگی به ایمیل شما ارسال کرده‌ایم، ایمیل خود را تأیید کنید! اگر ایمیلی دریافت نکرده‌اید، خوشحال می‌شویم یکی دیگر را ارسال کنیم.",
+  "The given data was invalid.": "داده دریافتی معتبر نمی‌باشد.",
+  "The response is not a streamed response.": "پاسخ یک پاسخ جریانی نیست.",
+  "The response is not a view.": "پاسخ یک دیدگاه نیست.",
+  "This password reset link will expire in :count minutes.": "لینک فراموشی رمزعبور برای :count دقیقه معتبر است.",
+  "to": "به",
+  "Toggle navigation": "تغییر ناوبری",
+  "Too Early": "خیلی زود",
+  "Too Many Requests": "تعداد درخواست های ارسال شده زیاد است",
+  "Unauthorized": "دسترسی غیر مجاز",
+  "Unavailable For Legal Reasons": "به دلایل قانونی در دسترس نیست",
+  "Unknown Error": "خطای ناشناخته",
+  "Unprocessable Entity": "موجودیت غیر قابل پردازش",
+  "Unsupported Media Type": "نوع رسانه پشتیبانی نمی‌شود",
+  "Upgrade Required": "ارتقاء لازم است",
+  "URI Too Long": "یوآرال در خواست شده بسیار طولانی است",
+  "Use Proxy": "استفاده از پراکسی",
+  "Variant Also Negotiates": "گونه‌ها همچنین مذاکره می‌کنند",
+  "Verify Email Address": "تایید آدرس ایمیل",
+  "Verify Your Email Address": "ایمیل خود را تأیید کنید",
+  "Web Server is Down": "وب سرور از کار افتاده است",
+  "Whoops!": "وای!",
+  "You are receiving this email because we received a password reset request for your account.": "شما این ایمیل را به دلیل درخواست رمزعبور جدید دریافت کرده‌اید.",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": "شما در :num ساعت به این تیکت پاسخ نداده‌اید، سیستم تیکت شما را بسته است.",
+  "You must have a valid subscription to view the content in this area!": "برای مشاهده محتوای این منطقه باید اشتراک معتبر داشته باشید!",
+  "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "اشتراک شما توسط مدیر غیرفعال شده است، لطفاً برای بازیابی آن با مدیر تماس بگیرید."
+}

+ 531 - 534
resources/lang/fa/admin.php

@@ -6,366 +6,367 @@ return [
     'dashboard' => [
         'users' => 'تعداد کل کاربران',
         'available_users' => 'تعداد کاربران فعال',
-        'paid_users' => 'تعداد کاربران پرداختکننده',
+        'paid_users' => 'تعداد کاربران پرداخت کننده',
         'active_days_users' => 'کاربران فعال در :days روز گذشته',
-        'inactive_days_users' => 'کاربران غیرفعال بیش از :days روز',
-        'online_users' => 'کاربران آنلاین فعلی',
-        'expiring_users' => 'کاربرانی که به‌زودی منقضی می‌شوند',
-        'overuse_users' => 'کاربران مصرف بالای داده (بیش از 90٪)',
-        'abnormal_users' => 'کاربران با ترافیک غیرعادی در 1 ساعت گذشته',
-        'nodes' => 'تعداد نودها',
-        'maintaining_nodes' => 'نودهای در حال نگهداری',
-        'current_month_traffic_consumed' => 'مصرف ترافیک این ماه',
-        'days_traffic_consumed' => 'مصرف ترافیک در :days روز گذشته',
-        'orders' => 'تعداد کل سفارشات',
-        'online_orders' => 'تعداد سفارشات پرداخت آنلاین',
-        'succeed_orders' => 'تعداد سفارشات پرداخت‌شده',
-        'credit' => 'موجودی کل',
-        'withdrawing_commissions' => 'کمیسیون‌های درحال برداشت',
-        'withdrawn_commissions' => 'کمیسیون‌های برداشتشده',
+        'inactive_days_users' => 'کاربران غیرفعال برای بیش از :days روز',
+        'online_users' => 'کاربران آنلاین کنونی',
+        'expiring_users' => 'کاربران در حال انقضا',
+        'overuse_users' => 'کاربرانی که بیش از 90٪ از داده استفاده کرده‌اند',
+        'abnormal_users' => 'کاربرانی که در یک ساعت گذشته ترافیک غیرعادی داشته‌اند',
+        'nodes' => 'تعداد گره‌ها',
+        'maintaining_nodes' => 'گره‌های در حالت نگهداری',
+        'current_month_traffic_consumed' => 'ترافیک مصرفی این ماه',
+        'days_traffic_consumed' => 'ترافیک مصرفی در :days روز گذشته',
+        'orders' => 'تعداد کل سفارش‌ها',
+        'online_orders' => 'تعداد سفارش‌های پرداخت آنلاین',
+        'succeed_orders' => 'تعداد سفارش‌های پرداخت شده',
+        'credit' => 'کل موجودی',
+        'withdrawing_commissions' => 'کمیسیون‌های در حال برداشت',
+        'withdrawn_commissions' => 'کمیسیون‌های برداشت شده',
     ],
     'action' => [
         'edit_item' => 'ویرایش :attribute',
         'add_item' => 'افزودن :attribute',
     ],
     'confirm' => [
-        'delete' => [0 => 'حذف :attribute [', 1 => '] را تأیید می‌کنید؟'],
-        'continues' => 'ادامه عملیات را تأیید می‌کنید؟',
-        'export' => 'صدور همه را تأیید می‌کنید؟',
+        'delete' => [0 => 'آیا می‌خواهید :attribute【', 1 => '】را حذف کنید؟'],
+        'continues' => 'آیا می‌خواهید این عملیات را ادامه دهید؟',
+        'export' => 'آیا می‌خواهید همه را صادر کنید؟',
     ],
-    'user_dashboard' => 'داشبورد کاربر',
+    'user_dashboard' => 'مرکز کاربری',
     'menu' => [
-        'dashboard' => 'داشبورد',
+        'dashboard' => 'مدیریت',
         'user' => [
-            'attribute' => 'کاربران',
+            'attribute' => 'سیستم کاربران',
             'list' => 'مدیریت کاربران',
-            'oauth' => 'احراز هویت کاربران',
+            'oauth' => 'مجوزهای شخص ثالث',
             'group' => 'گروه‌های کاربری',
-            'credit_log' => 'تغییرات موجودی',
-            'subscribe' => 'مدیریت اشتراک',
+            'credit_log' => 'تاریخچه موجودی',
+            'subscribe' => 'مدیریت اشتراک‌ها',
         ],
         'rbac' => [
-            'attribute' => 'کنترل دسترسی',
-            'permission' => 'مجوزها',
-            'role' => 'نقش‌ها',
+            'attribute' => 'سیستم دسترسی',
+            'permission' => 'مدیریت دسترسی‌ها',
+            'role' => 'لیست نقش‌ها',
         ],
         'customer_service' => [
-            'attribute' => 'پشتیبانی',
-            'ticket' => 'تیکت‌ها',
-            'article' => 'مقالات',
-            'push' => 'اعلان‌ها',
-            'mail' => 'ایمیل',
+            'attribute' => 'سیستم پشتیبانی',
+            'ticket' => 'تیکت‌های پشتیبانی',
+            'article' => 'مدیریت مقالات',
+            'push' => 'ارسال پیام',
+            'mail' => 'ارسال ایمیل گروهی',
         ],
         'node' => [
-            'attribute' => 'نودها',
-            'list' => 'مدیریت نودها',
-            'auth' => 'مجوزهای API',
-            'cert' => 'گواهینامه‌ها',
+            'attribute' => 'سیستم گره‌ها',
+            'list' => 'مدیریت گره‌ها',
+            'auth' => 'مجوزهای گره',
+            'cert' => 'لیست گواهینامه‌ها',
         ],
         'rule' => [
-            'attribute' => 'قوانین',
+            'attribute' => 'قوانین بررسی',
             'list' => 'لیست قوانین',
-            'group' => 'گروه قوانین',
-            'trigger' => 'رکوردهای فعال‌سازی',
+            'group' => 'گروه‌های قوانین',
+            'trigger' => 'سوابق فعال‌سازی',
         ],
         'shop' => [
-            'attribute' => 'فروشگاه',
-            'goods' => 'محصولات',
-            'coupon' => 'کوپن‌ها',
-            'order' => 'سفارشات',
+            'attribute' => 'سیستم فروشگاه',
+            'goods' => 'مدیریت محصولات',
+            'coupon' => 'مدیریت کوپن‌ها',
+            'order' => 'سفارش‌های محصول',
         ],
         'promotion' => [
-            'attribute' => 'تبلیغات',
-            'invite' => 'دعوت‌نامه‌ها',
-            'withdraw' => 'برداشت‌ها',
-            'rebate_flow' => 'سوابق بازگشت درآمد',
+            'attribute' => 'بازاریابی',
+            'invite' => 'مدیریت دعوت‌ها',
+            'withdraw' => 'مدیریت برداشت‌ها',
+            'rebate_flow' => 'تاریخچه تخفیف‌ها',
         ],
         'analysis' => [
-            'attribute' => 'تحلیل‌ها',
+            'attribute' => 'تحلیل داده‌ها',
             'accounting' => 'حسابداری',
-            'user_flow' => 'جریان کاربر',
+            'user_flow' => 'تحلیل ترافیک کاربران',
+            'site_flow' => 'تحلیل ترافیک سایت',
         ],
         'log' => [
-            'attribute' => 'لاگ‌ها',
-            'traffic' => 'مصرف داده',
-            'traffic_flow' => 'جریان داده',
+            'attribute' => 'سیستم لاگ‌ها',
+            'traffic' => 'استفاده از ترافیک',
+            'traffic_flow' => 'تغییرات ترافیک',
             'service_ban' => 'سوابق مسدودسازی',
             'online_logs' => 'لاگ‌های آنلاین',
             'online_monitor' => 'نظارت آنلاین',
-            'notify' => 'اعلان‌ها',
-            'payment_callback' => 'بازخوانی پرداخت',
+            'notify' => 'سوابق اعلان‌ها',
+            'payment_callback' => 'بازگشت پرداخت',
             'system' => 'لاگ‌های سیستم',
         ],
         'tools' => [
             'attribute' => 'ابزارها',
-            'decompile' => 'دکومپایل',
+            'decompile' => 'دی‌کامپایل',
             'convert' => 'تبدیل فرمت',
-            'import' => 'وارد کردن',
-            'analysis' => 'تجزیه و تحلیل لاگ',
+            'import' => 'وارد کردن داده‌ها',
+            'analysis' => 'تحلیل لاگ‌ها',
         ],
         'setting' => [
-            'attribute' => 'تنظیمات',
-            'email_suffix' => 'پسوند ایمیل',
-            'universal' => 'عمومی',
-            'system' => 'سیستم',
+            'attribute' => 'تنظیمات سیستم',
+            'email_suffix' => 'مدیریت پسوندهای ایمیل',
+            'universal' => 'تنظیمات عمومی',
+            'system' => 'پارامترهای سیستم',
         ],
     ],
     'user' => [
         'massive' => [
-            'text' => 'تعداد کاربران برای تولید',
-            'failed' => 'تولید دسته‌ای حساب کاربری ناموفق بود',
-            'succeed' => 'تولید دسته‌ای حساب کاربری موفق بود',
-            'note' => 'تولید دسته‌ای کاربر در پشتیبان',
+            'text' => 'تعداد حساب‌های ایجاد شده به صورت گروهی',
+            'failed' => 'ایجاد حساب گروهی ناموفق بود',
+            'succeed' => 'ایجاد حساب گروهی موفقیت‌آمیز بود',
+            'note' => 'ایجاد حساب‌های کاربری به صورت گروهی در پس‌زمینه',
         ],
         'proxy_info' => 'اطلاعات پیکربندی',
         'traffic_monitor' => 'آمار ترافیک',
         'online_monitor' => 'نظارت آنلاین',
-        'reset_traffic' => 'تنظیم مجدد داده',
-        'user_view' => 'نمای کاربر',
-        'connection_test' => 'آزمایش اتصال',
-        'counts' => 'تعداد کل حساب‌ها <code>:num</code>',
-        'reset_confirm' => [0 => 'تنظیم مجدد داده‌های [', 1 => '] را تأیید می‌کنید؟'],
+        'reset_traffic' => 'بازنشانی ترافیک',
+        'user_view' => 'تغییر به نمای کاربر',
+        'connection_test' => 'تست اتصال',
+        'counts' => 'مجموع <code>:num</code> حساب',
+        'reset_confirm' => [0 => 'آیا می‌خواهید ترافیک [', 1 => '] را بازنشانی کنید؟'],
         'info' => [
             'account' => 'اطلاعات حساب',
             'proxy' => 'اطلاعات پروکسی',
-            'switch' => 'تعویض هویت',
-            'reset_date_hint' => 'تاریخ تنظیم مجدد بعدی داده',
-            'expired_date_hint' => 'خالی بگذارید برای یک سال پیش‌فرض',
-            'uuid_hint' => 'شناسه کاربری برای V2Ray',
-            'recharge_placeholder' => 'منفی برای کسر از موجودی',
-        ],
-        'update_help' => 'به‌روزرسانی موفق، برگشت؟',
-        'proxies_config' => 'اطلاعات پیکربندی اتصال [:username]',
+            'switch' => 'تغییر هویت',
+            'reset_date_hint' => 'تاریخ بازنشانی بعدی ترافیک',
+            'expired_date_hint' => 'اگر خالی بماند، پیش‌فرض یک سال اعتبار دارد',
+            'uuid_hint' => 'UUID برای V2Ray',
+            'recharge_placeholder' => 'اگر منفی باشد، موجودی کسر می‌شود',
+        ],
+        'update_help' => 'به‌روزرسانی موفقیت‌آمیز بود، بازگردید؟',
+        'proxies_config' => 'اطلاعات اتصال برای :username',
         'group' => [
-            'title' => 'گروه‌های کاربری <small>(یک نود می‌تواند در چند گروه باشد، اما هر کاربر فقط می‌تواند در یک گروه باشد)</small>',
+            'title' => 'کنترل گروه‌های کاربری<small> (یک گره می‌تواند در چندین گروه باشد، اما کاربر فقط می‌تواند در یک گروه باشد؛ برای گره‌های قابل مشاهده/قابل استفاده برای کاربران، گروه اولویت بیشتری نسبت به سطح دارد)</small>',
             'name' => 'نام گروه',
-            'counts' => 'تعداد کل گروه‌ها <code>:num</code>',
+            'counts' => 'مجموع <code>:num</code> گروه',
         ],
     ],
-    'zero_unlimited_hint' => 'صفر یا خالی برای نامحدود',
+    'zero_unlimited_hint' => '0 یا خالی برای نامحدود',
     'node' => [
         'traffic_monitor' => 'آمار ترافیک',
-        'refresh_geo' => 'به‌روزرسانی داده‌های مکانی',
-        'ping' => 'آزمایش تأخیر',
-        'connection_test' => 'آزمایش اتصال',
-        'counts' => 'تعداد کل نودها <code>:num</code>',
-        'reload_all' => 'بارگذاری مجدد همه پشته‌ها',
-        'refresh_geo_all' => 'به‌روزرسانی داده‌های مکانی همه نودها',
-        'reload_confirm' => 'بارگذاری مجدد نود را تأیید می‌کنید؟',
+        'refresh_geo' => 'تازه‌سازی جغرافیا',
+        'connection_test' => 'تست اتصال',
+        'counts' => 'مجموع <code>:num</code> گره',
+        'reload_all' => 'بارگذاری مجدد همه سرورها',
+        'refresh_geo_all' => 'تازه‌سازی داده‌های جغرافیا',
+        'reload_confirm' => 'آیا می‌خواهید سرور را بارگذاری مجدد کنید؟',
         'info' => [
-            'hint' => '<strong>توجه:</strong> <code>ID</code> تولیدشده به‌طور خودکار، همان <code>node_id</code> برای پشته ShadowsocksR و <code>nodeId</code> برای پشته V2Ray است',
+            'hint' => '<strong>توجه:</strong> <code>ID</code> به‌طور خودکار تولید شده، <code>node_id</code> برای بک‌اند ShadowsocksR و <code>nodeId</code> برای بک‌اند V2Ray است',
             'basic' => 'اطلاعات پایه',
-            'ddns_hint' => 'نودهای IP داینامیک نیاز به <a href="https://github.com/NewFuture/DDNS" target="_blank">DDNS</a> دارند. آزمایش اتصال از نام دامنه استفاده می‌کند',
-            'domain_placeholder' => 'دامنه سرور، اولی استفاده می‌شود اگر پر شده باشد',
-            'domain_hint' => 'با فعال‌سازی DDNS، دامنه به‌طور خودکار به IP متصل می‌شود! دیگر نیاز نیست دستی رکورد DNS را ویرایش کنید.',
-            'extend' => 'اطلاعات تکمیلی',
+            'ddns_hint' => 'گره‌های داینامیک IP نیاز به <a href="https://github.com/NewFuture/DDNS" target="_blank">پیکربندی DDNS</a> دارند. برای این نوع گره، تست اتصال از طریق نام دامنه انجام می‌شود.',
+            'domain_placeholder' => 'دامنه سرور، در صورت پر شدن ابتدا استفاده می‌شود',
+            'domain_hint' => 'پس از فعال‌سازی DDNS در تنظیمات سیستم، نام دامنه و IPها به‌طور خودکار به‌روزرسانی می‌شوند! دیگر نیازی به ویرایش این اطلاعات در وب‌سایت ثبت دامنه نیست.',
+            'extend' => 'اطلاعات اضافی',
             'display' => [
-                'invisible' => 'نامرئی',
-                'node' => 'فقط در صفحه نود قابل مشاهده',
-                'sub' => 'فقط در اشتراک‌ها قابل مشاهده',
+                'invisible' => 'کاملاً نامرئی',
+                'node' => 'فقط در صفحه گره‌ها قابل مشاهده است',
+                'sub' => 'فقط در اشتراک‌ها قابل مشاهده است',
                 'all' => 'کاملاً قابل مشاهده',
-                'hint' => 'آیا در لیست اشتراک/نود قابل مشاهده است',
+                'hint' => 'آیا در لیست اشتراک/گره قابل مشاهده است',
             ],
-            'ipv4_hint' => 'چندین IP با "," جدا شوند؛ مثال: 1.1.1.1, 8.8.8.8',
-            'ipv6_hint' => 'چندین IP با "," جدا شوند؛ مثال: 1.1.1.1, 8.8.8.8',
+            'ipv4_hint' => 'چندین IP باید با کاما انگلیسی جدا شوند، برای مثال: 1.1.1.1,8.8.8.8',
+            'ipv6_hint' => 'چندین IP باید با کاما انگلیسی جدا شوند، برای مثال: 1.1.1.1,8.8.8.8',
             'ipv4_placeholder' => 'آدرس IPv4 سرور',
-            'ipv6_placeholder' => 'آدرس IPv6 سرور، اگر پر شود کاربر می‌بیند',
-            'push_port_hint' => 'لازم است و در دیواره آتش باز باشد، در غیر این صورت ارسال پیام ناموفق خواهد بود',
-            'data_rate_hint' => 'مثال: 0.1 به این معنی است که 100M به عنوان 10M محاسبه می‌شود؛ 5 به این معنی است که 100M به عنوان 500M محاسبه می‌شود',
-            'level_hint' => 'سطح: 0 = بدون امتیاز، همه نودها قابل مشاهده هستند',
+            'ipv6_placeholder' => 'آدرس IPv6 سرور',
+            'push_port_hint' => 'الزامی است. مطمئن شوید که این پورت در فایروال سرور باز است، در غیر این صورت ارسال پیام‌ها غیرعادی خواهد بود.',
+            'data_rate_hint' => 'مثال: 0.1 به معنای 100M به عنوان 10M محاسبه می‌شود؛ 5 به معنای 100M به عنوان 500M محاسبه می‌شود',
+            'level_hint' => 'سطح: 0 - بدون محدودیت سطح، همه قابل مشاهده هستند.',
             'detection' => [
                 'tcp' => 'فقط TCP',
                 'icmp' => 'فقط ICMP',
-                'all' => 'تشخیص همه',
+                'all' => 'هر دو',
                 'hint' => 'بررسی تصادفی هر 30-60 دقیقه',
             ],
-            'obfs_param_hint' => 'اگر obfs غیر از [plain] است، پارامترها را برای اختفای ترافیک پر کنید؛
-اگر obfs [http_simple] است، پیشنهاد می‌شود پورت 80 باشد؛
-اگر obfs [tls] است، پیشنهاد می‌شود پورت 443 باشد;',
-            'additional_ports_hint' => 'اگر فعال شده است، لطفا <span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span> را در سرور پیکربندی کنید',
-            'v2_method_hint' => 'با پروتکل انتقال WebSocket از none استفاده نکنید',
-            'v2_net_hint' => 'با پروتکل انتقال WebSocket، TLS را فعال کنید',
+            'obfs_param_hint' => 'اگر obfs [plain] نیست، پارامترها را برای پنهان‌سازی ترافیک وارد کنید؛ &#13;&#10;پورت 80 را پیشنهاد می‌کنیم اگر obfs [http_simple] است؛ &#13;&#10;پورت 443 را پیشنهاد می‌کنیم اگر obfs [tls] است؛',
+            'additional_ports_hint' => 'اگر فعال است، لطفاً پیکربندی سرور <span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span> را انجام دهید',
+            'v2_method_hint' => 'پروتکل انتقال WebSocket نباید از روش رمزنگاری \'none\' استفاده کند.',
+            'v2_net_hint' => 'لطفاً TLS را برای WebSocket فعال کنید',
             'v2_cover' => [
-                'none' => 'بدون اختفا',
-                'http' => 'جریان داده HTTP',
-                'srtp' => 'داده تماس ویدیویی (SRTP)',
-                'utp' => 'داده دانلود BT (uTP)',
+                'none' => 'بدون پنهان‌سازی',
+                'http' => 'HTTP',
+                'srtp' => 'SRTP',
+                'utp' => 'uTP',
                 'wechat' => 'تماس ویدیویی WeChat',
-                'dtls' => 'بسته‌های داده DTLS 1.2',
-                'wireguard' => 'بسته‌های داده WireGuard',
+                'dtls' => 'DTLS 1.2',
+                'wireguard' => 'WireGuard',
             ],
-            'v2_host_hint' => 'برای HTTP، چندین دامنه با "," جدا شوند. تنها یکی برای WebSocket مجاز است.',
-            'v2_tls_provider_hint' => 'پیکربندی متفاوت برای پشته‌های مختلف:',
-            'single_hint' => 'پورت 80/443 توصیه می‌شود. پشته نیاز به <br> پیکربندی حالت سختگیرانه دارد: فقط اتصال از طریق پورت‌های مشخص‌شده. (<a href="javascript:showPortsOnlyConfig();">چگونگی پیکربندی</a>)',
+            'v2_host_hint' => 'هنگام استفاده از پنهان‌سازی HTTP، چندین دامنه باید با کاما جدا شوند، در حالی که WebSocket فقط یک دامنه را مجاز می‌داند.',
+            'v2_tls_provider_hint' => 'پیکربندی‌های مختلف برای بک‌اندهای مختلف:',
+            'single_hint' => 'پورت 80/443 را پیشنهاد می‌کنیم. بک‌اند نیاز به پیکربندی حالت سختگیرانه دارد: فقط از طریق پورت‌های مشخص شده متصل شوید. (<a href="javascript:showPortsOnlyConfig();">چگونه پیکربندی کنیم</a>)',
         ],
-        'proxy_info' => '*سازگاری با SS',
-        'proxy_info_hint' => 'برای سازگاری، لطفا <span class="red-700">_compatible</span> را به پروتکل و رمزگذاری در پیکربندی سرور اضافه کنید',
-        'reload' => 'بارگذاری مجدد پشته',
+        'proxy_info' => '*سازگار با Shadowsocks',
+        'proxy_info_hint' => 'برای سازگاری، لطفاً <span class="red-700">_compatible</span> را به پروتکل و obfuscation در پیکربندی سرور اضافه کنید',
+        'reload' => 'بارگذاری مجدد بک‌اند',
         'auth' => [
-            'title' => 'فهرست مجوزهای API <small>وب‌ای‌پی‌آی</small>',
+            'title' => 'مجوزهای API <small>WEBAPI</small>',
             'deploy' => [
-                'title' => 'استقرار پشته :type_label',
-                'attribute' => 'استقرار پشته',
-                'command' => 'دستورالعمل‌ها',
+                'title' => 'استقرار بک‌اند :type_label',
+                'attribute' => 'استقرار بک‌اند',
+                'command' => 'دستورات',
                 'update' => 'به‌روزرسانی',
-                'uninstall' => 'حذف نصب',
-                'start' => 'راه‌اندازی',
+                'uninstall' => 'حذف',
+                'start' => 'شروع',
                 'stop' => 'توقف',
                 'status' => 'وضعیت',
                 'recent_logs' => 'لاگ‌های اخیر',
-                'real_time_logs' => 'لاگ‌های بلادرنگ',
+                'real_time_logs' => 'لاگ‌های زمان واقعی',
                 'restart' => 'راه‌اندازی مجدد',
                 'same' => 'همان بالا',
-                'trojan_hint' => 'لطفا ابتدا <a href=":url" target="_blank">دامنه نود</a> را پر کنید و دامنه را به IP نود تعلق دهید',
+                'trojan_hint' => 'لطفاً <a href=":url" target="_blank">نام گره را وارد کنید</a> و به IP مربوطه تجزیه کنید',
             ],
-            'reset_auth' => 'تنظیم مجدد کلید',
-            'counts' => 'تعداد کل مجوزها <code>:num</code>',
-            'generating_all' => 'مجوز برای همه نودها تولید شود؟',
+            'reset_auth' => 'بازنشانی کلید مجوز',
+            'counts' => 'مجموع <code>:num</code> مجوز',
+            'generating_all' => 'آیا می‌خواهید کلیدهای مجوز را برای همه گره‌ها تولید کنید؟',
         ],
         'cert' => [
-            'title' => 'گواهی‌نامه‌های دامنه <small>(برای جعل هویت نود V2Ray)</small>',
-            'counts' => 'تعداد کل گواهی‌نامه‌ها <code>:num</code>',
-            'key_placeholder' => 'KEY گواهی‌نامه دامنه. خالی مجاز است، VNET-V2Ray از گواهی‌نامه خودکار پشتیبانی می‌کند',
-            'pem_placeholder' => 'PEM گواهی‌نامه دامنه. خالی مجاز است، VNET-V2Ray از گواهی‌نامه خودکار پشتیبانی می‌کند',
+            'title' => 'گواهینامه‌های دامنه <small>(برای پنهان‌سازی دامنه V2Ray)</small>',
+            'counts' => 'مجموع <code>:num</code> گواهینامه دامنه',
+            'key_placeholder' => 'مقدار KEY گواهینامه، می‌تواند خالی بماند. بک‌اند VNET-V2Ray از صدور خودکار پشتیبانی می‌کند',
+            'pem_placeholder' => 'بک‌اند VNET-V2Ray از صدور خودکار پشتیبانی می‌کند',
         ],
     ],
     'hint' => 'نکته',
     'oauth' => [
-        'title' => 'مجوزهای OAuth کاربر',
-        'counts' => 'تعداد کل مجوزها <code>:num</code>',
+        'title' => 'مجوزهای شخص ثالث',
+        'counts' => 'مجموع <code>:num</code> رکورد مجوز',
     ],
     'select_all' => 'انتخاب همه',
     'clear' => 'پاک کردن',
-    'unselected_hint' => 'برای اختصاص، اینجا جستجو کنید',
-    'selected_hint' => 'اختصاص یافته، اینجا جستجو کنید',
+    'unselected_hint' => 'قوانینی که باید تخصیص داده شوند، اینجا قابل جستجو هستند',
+    'selected_hint' => 'قوانین تخصیص داده شده، اینجا قابل جستجو هستند',
     'clone' => 'کلون',
     'monitor' => [
-        'daily_chart' => 'ترافیک روزانه',
-        'monthly_chart' => 'ترافیک ماهانه',
-        'node' => 'ترافیک نود',
+        'daily_chart' => 'نمودار مصرف روزانه ترافیک',
+        'monthly_chart' => 'نمودار مصرف ماهانه ترافیک',
+        'node' => 'ترافیک گره',
         'user' => 'ترافیک کاربر',
-        'hint' => '<strong>نکته:</strong> اگر داده‌ای وجود ندارد، لطفا وظایف زمانبندی‌شده را بررسی کنید',
+        'hint' => '<strong>نکته:</strong> اگر داده‌ای وجود ندارد، بررسی کنید که وظایف زمان‌بندی شده به درستی اجرا می‌شوند.',
     ],
     'tools' => [
         'analysis' => [
-            'title' => 'تجزیه و تحلیل لاگ SSR <small>فقط برای یک نود</small>',
-            'req_url' => 'آدرس‌های درخواستی اخیر',
-            'not_enough' => 'کمتر از 15000 رکورد، قادر به تجزیه و تحلیل نیست',
+            'title' => 'تحلیل لاگ SSR <small>فقط برای یک گره</small>',
+            'req_url' => 'سوابق URL درخواست‌های اخیر',
+            'not_enough' => 'کمتر از 15000 رکورد، قادر به تحلیل نیست',
         ],
         'convert' => [
-            'title' => 'تبدیل قالب <small>از SS به SSR</small>',
-            'content_placeholder' => 'لطفا پیکربندی برای تبدیل را وارد کنید',
+            'title' => 'تبدیل فرمت <small>SS به SSR</small>',
+            'content_placeholder' => 'لطفاً اطلاعات پیکربندی که نیاز به تبدیل دارند را وارد کنید.',
         ],
         'decompile' => [
-            'title' => 'دکومپایل <small>اطلاعات پیکربندی</small>',
-            'attribute' => 'دکومپایل',
-            'content_placeholder' => 'لطفا لینک‌های SSR را برای دکومپایل، هر کدام در یک سطر، وارد کنید',
+            'title' => 'دی‌کامپایل <small>اطلاعات پیکربندی</small>',
+            'attribute' => 'لینک پیکربندی دی‌کامپایل',
+            'content_placeholder' => 'لطفاً لینک‌های ShadowsocksR که نیاز به دی‌کامپایل دارند را وارد کنید، با خط جدا شوند.',
         ],
     ],
     'ticket' => [
         'title' => 'تیکت‌ها',
-        'counts' => 'تعداد کل تیکت‌ها <code>:num</code>',
-        'send_to' => 'لطفا جزئیات کاربر هدف را وارد کنید',
+        'counts' => 'مجموع <code>:num</code> تیکت',
+        'send_to' => 'لطفاً جزئیات کاربر هدف را وارد کنید',
         'user_info' => 'اطلاعات کاربر',
         'inviter_info' => 'اطلاعات دعوت‌کننده',
-        'close_confirm' => 'تأیید می‌کنید که تیکت بسته شود؟',
-        'error' => 'خطای ناشناخته! لطفا لاگ‌ها را بررسی کنید',
+        'close_confirm' => 'آیا می‌خواهید این تیکت را ببندید؟',
+        'error' => 'خطای ناشناخته! لطفاً لاگ‌ها را بررسی کنید',
     ],
     'logs' => [
-        'subscribe' => 'لیست اشتراک',
-        'counts' => 'تعداد کل رکوردها <code>:num</code>',
+        'subscribe' => 'اشتراک‌ها',
+        'counts' => 'مجموع <code>:num</code> رکورد',
         'rule' => [
-            'clear_all' => 'پاککردن همه رکوردها',
-            'title' => 'رکوردهای فعال‌سازی',
-            'name' => 'قانون فعال‌ساز',
+            'clear_all' => 'پاک کردن همه رکوردها',
+            'title' => 'سوابق فعال‌سازی قوانین',
+            'name' => 'نام قانون فعال شده',
             'reason' => 'دلیل فعال‌سازی',
             'created_at' => 'زمان فعال‌سازی',
-            'tag' => '✅ دسترسی غیرمجاز',
-            'clear_confirm' => 'تأیید می‌کنید که همه رکوردها پاک شوند؟',
+            'tag' => '✅ دسترسی به محتوای غیرمجاز',
+            'clear_confirm' => 'آیا می‌خواهید همه سوابق فعال‌سازی قوانین را پاک کنید؟',
         ],
         'order' => [
-            'title' => 'لیست سفارشات',
-            'is_expired' => 'منقضیشده',
-            'is_coupon' => 'استفاده از کوپن',
+            'title' => 'سفارش‌ها',
+            'is_expired' => 'منقضی شده',
+            'is_coupon' => 'کوپن استفاده شده',
         ],
         'user_traffic' => [
-            'title' => 'رکوردهای مصرف داده',
-            'choose_node' => 'انتخاب نود',
+            'title' => 'سوابق استفاده از داده‌ها',
+            'choose_node' => 'انتخاب گره',
         ],
-        'user_data_modify_title' => 'رکوردهای تغییر داده',
-        'callback' => 'لاگ‌های بازخوانی <small>(پرداخت)</small>',
+        'user_data_modify_title' => 'سوابق تغییر داده‌ها',
+        'callback' => 'لاگ‌های بازگشت <small>(پرداخت)</small>',
         'notification' => 'لاگ‌های ایمیل',
-        'ip_monitor' => 'آی‌پی‌های آنلاین <small>بلادرنگ 2 دقیقه</small>',
+        'ip_monitor' => 'IP‌های آنلاین <small>داده‌های زمان واقعی 2 دقیقه‌ای</small>',
         'user_ip' => [
-            'title' => 'لیست آی‌پی‌های آنلاین کاربران <small>10 دقیقه گذشته</small>',
-            'connect' => 'آی‌پی متصل‌شده',
+            'title' => 'IP‌های آنلاین <small>10 دقیقه گذشته</small>',
+            'connect' => 'IP متصل شده',
         ],
         'ban' => [
-            'title' => 'رکوردهای مسدودسازی کاربر',
-            'time' => 'مدتزمان',
+            'title' => 'سوابق مسدودسازی کاربران',
+            'time' => 'مدت زمان',
             'reason' => 'دلیل',
             'ban_time' => 'زمان مسدودسازی',
             'last_connect_at' => 'آخرین زمان ورود',
         ],
-        'credit_title' => 'رکوردهای تغییر موجودی',
+        'credit_title' => 'سوابق تغییر موجودی',
     ],
-    'start_time' => 'ابتدا',
-    'end_time' => 'انتها',
+    'start_time' => 'شروع',
+    'end_time' => 'پایان',
     'goods' => [
-        'title' => 'فهرست محصولات',
+        'title' => 'محصولات',
         'type' => [
             'top_up' => 'شارژ',
             'package' => 'بسته داده',
             'plan' => 'طرح اشتراک',
         ],
         'info' => [
-            'type_hint' => 'طرح اشتراک با تاریخ انقضای حساب ارتباط دارد، بسته داده فقط از داده کسر می‌کند و بر تاریخ انقضا تأثیر ندارد',
-            'period_hint' => 'داده بسته هر N روز تنظیم مجدد می‌شود',
-            'limit_num_hint' => 'حداکثر تعداد خرید برای هر کاربر، 0 برای نامحدود',
-            'available_date_hint' => 'پس از انقضا از داده کل کسر می‌شود',
-            'desc_placeholder' => 'توضیح مختصر',
-            'list_placeholder' => 'اضافه کردن محتوای سفارشی',
-            'list_hint' => 'هر خط را با <code><li></code> شروع کنید و با <code></li></code> تمام کنید',
+            'type_hint' => 'طرح‌ها بر انقضای حساب تأثیر می‌گذارند، بسته‌ها فقط از داده کسر می‌کنند و بر انقضا تأثیر نمی‌گذارند',
+            'period_hint' => 'مقدار داده هر N روز برای طرح‌ها بازنشانی می‌شود',
+            'limit_num_hint' => 'حداکثر تعداد خریدها برای هر کاربر، 0 برای نامحدود',
+            'available_date_hint' => 'هنگام انقضا به‌طور خودکار از کل داده کسر می‌شود',
+            'desc_placeholder' => 'توضیحات مختصر',
+            'list_placeholder' => 'افزودن محتوای سفارشی',
+            'list_hint' => 'هر خط را با <code><li></code> شروع کنید و با <code></li></code> پایان دهید',
         ],
         'status' => [
-            'yes' => 'در فروش',
-            'no' => 'از فروش خارج',
+            'yes' => 'در حال فروش',
+            'no' => 'خارج از فروش',
         ],
-        'sell_and_used' => 'استفاده‌شده / فروش‌رفته',
-        'counts' => 'تعداد کل محصولات <code>:num</code>',
+        'sell_and_used' => 'استفاده شده / فروخته شده',
+        'counts' => 'مجموع <code>:num</code> محصول',
     ],
-    'sort_asc' => 'اولویت بالاتر با مقدار بزرگتر',
+    'sort_asc' => 'مقدار مرتب‌سازی بزرگتر اولویت بالاتری دارد',
     'yes' => 'بله',
     'no' => 'خیر',
     'rule' => [
         'type' => [
-            'reg' => 'عبارت منظم',
+            'reg' => 'عبارت با قاعده',
             'domain' => 'دامنه',
-            'ip' => 'آی‌پی',
+            'ip' => 'IP',
             'protocol' => 'پروتکل',
         ],
-        'counts' => 'تعداد کل قوانین <code>:num</code>',
-        'title' => 'فهرست قوانین',
+        'counts' => 'مجموع <code>:num</code> قانون',
+        'title' => 'قوانین',
         'group' => [
             'type' => [
-                'off' => 'مسدودسازی',
-                'on' => 'رهاسازی',
+                'off' => 'مسدود',
+                'on' => 'مجاز',
             ],
-            'title' => 'گروه‌های قانون',
-            'counts' => 'تعداد کل گروه‌ها <code>:num</code>',
+            'title' => 'گروه‌های قوانین',
+            'counts' => 'مجموع <code>:num</code> گروه',
         ],
     ],
     'role' => [
-        'name_hint' => 'شناسه منحصربفرد، مثلا: admin',
-        'description_hint' => 'نام نمایشی، مثلا: مدیر',
-        'title' => 'فهرست نقش‌ها',
-        'permissions_all' => 'همه مجوزها',
-        'counts' => 'تعداد کل نقش‌ها <code>:num</code>',
+        'name_hint' => 'شناسه منحصر به فرد، برای مثال: admin',
+        'description_hint' => 'نام نمایشی، برای مثال: مدیر',
+        'title' => 'نقش‌ها',
+        'permissions_all' => 'همه دسترسی‌ها',
+        'counts' => 'مجموع <code>:num</code> نقش',
     ],
     'report' => [
-        'monthly_accounting' => 'حسابداری ماهانه',
-        'annually_accounting' => 'حسابداری سالانه',
-        'historic_accounting' => 'حسابداری تاریخی',
+        'daily_accounting' => 'تراکنش‌های روزانه',
+        'monthly_accounting' => 'تراکنش‌های ماهانه',
+        'annually_accounting' => 'تراکنش‌های سالانه',
+        'daily_site_flow' => 'مصرف روزانه ترافیک',
+        'monthly_site_flow' => 'مصرف ماهانه ترافیک',
+        'annually_site_flow' => 'مصرف سالانه ترافیک',
         'current_month' => 'این ماه',
         'last_month' => 'ماه گذشته',
         'current_year' => 'امسال',
@@ -373,430 +374,426 @@ return [
         'hourly_traffic' => 'ترافیک ساعتی',
         'daily_traffic' => 'ترافیک روزانه',
         'today' => 'امروز',
+        'avg_traffic_30d' => 'میانگین ترافیک روزانه در 30 روز',
+        'sum_traffic_30d' => 'نسبت ترافیک 30 روزه',
     ],
     'permission' => [
-        'title' => 'فهرست مجوزها',
-        'description_hint' => 'توضیح، مثلا: [سیستم X] ویرایش A',
-        'name_hint' => 'نام مسیر، مثلا: admin.permission.create',
-        'counts' => 'تعداد کل مجوزها <code>:num</code>',
+        'title' => 'دسترسی‌ها',
+        'description_hint' => 'توضیحات، برای مثال: [سیستم X] ویرایش A',
+        'name_hint' => 'نام مسیر، برای مثال: admin.user.update',
+        'counts' => 'مجموع <code>:num</code> دسترسی',
     ],
     'marketing' => [
         'email' => [
-            'title' => 'لیست ایمیل‌های ارسالی',
-            'group_send' => 'ارسال دسته‌جمعی ایمیل',
-            'counts' => 'تعداد کل پیام‌ها <code>:num</code>',
+            'title' => 'ایمیل مارکتینگ',
+            'group_send' => 'ارسال ایمیل گروهی',
+            'counts' => 'مجموع <code>:num</code> ایمیل',
         ],
         'send_status' => 'وضعیت ارسال',
         'send_time' => 'زمان ارسال',
-        'error_message' => 'پیام خطا',
+        'error_message' => 'پیام‌های خطا',
         'push' => [
-            'title' => 'فهرست اعلان‌های ارسالی',
-            'send' => 'ارسال اعلان',
-            'counts' => 'تعداد کل پیام‌های ارسالی <code>:num</code>',
+            'title' => 'پیام‌های فشاری',
+            'send' => 'ارسال پیام فشاری',
+            'counts' => 'مجموع <code>:num</code> پیام',
         ],
     ],
-    'creating' => 'در حال اضافه‌کردن...',
+    'creating' => 'در حال افزودن...',
     'article' => [
         'type' => [
             'knowledge' => 'مقاله',
             'announcement' => 'اعلان',
         ],
-        'category_hint' => 'دسته‌بندی یکسان در یک پوشه گروه‌بندی می‌شوند',
-        'logo_hint' => 'اندازه توصیه‌شده: 100x75',
-        'title' => 'فهرست مقالات',
-        'counts' => 'تعداد کل مقالات <code>:num</code>',
+        'category_hint' => 'همه مقالات در یک دسته‌بندی در یک پوشه قرار می‌گیرند',
+        'logo_placeholder' => 'یا آدرس URL لوگو را وارد کنید',
+        'title' => 'مقالات',
+        'counts' => 'مجموع <code>:num</code> مقاله',
     ],
     'coupon' => [
-        'title' => 'فهرست کوپن‌ها',
+        'title' => 'کوپن‌ها',
         'name_hint' => 'برای نمایش',
-        'sn_hint' => 'برای ارائه به کاربران، خالی بگذارید برای کد 8 رقمی تصادفی',
+        'sn_hint' => 'برای استفاده کاربران از کوپن، خالی بگذارید تا به صورت تصادفی یک کد 8 رقمی تولید شود',
         'type' => [
             'voucher' => 'کوپن',
             'discount' => 'تخفیف',
             'charge' => 'شارژ',
         ],
-        'type_hint' => 'کسر: کسر مبلغ؛ تخفیف: درصد تخفیف؛ شارژ: اضافه‌کردن مبلغ به موجودی',
-        'value' => '{1} ➖ :num|{2} :num٪ تخفیف|{3} ➕ :num',
-        'value_hint' => 'محدوده 1٪ ~ 99٪',
-        'priority_hint' => 'بالاترین اولویت واجد شرایط استفاده می‌شود. حداکثر 255',
-        'minimum_hint' => 'فقط هنگامی‌که پرداخت بیش از <strong>:num</strong> باشد قابل استفاده است',
-        'used_hint' => 'هر کاربر می‌تواند حداکثر <strong>:num</strong> بار از این کوپن استفاده کند',
-        'levels_hint' => 'فقط برای سطوح کاربری انتخابشده قابل استفاده است',
-        'groups_hint' => 'فقط برای گروه‌های کاربری انتخابشده قابل استفاده است',
-        'users_placeholder' => 'وارد کردن شناسه کاربر، سپس Enter',
-        'user_whitelist_hint' => 'کاربران مرتبط می‌توانند از این کوپن استفاده کنند، خالی بگذارید اگر استفاده نمی‌شود',
-        'users_blacklist_hint' => 'کاربران مرتبط نمی‌توانند از این کوپن استفاده کنند، خالی بگذارید اگر استفاده نمی‌شود',
-        'services_placeholder' => 'وارد کردن شناسه محصول، سپس Enter',
-        'services_whitelist_hint' => 'فقط برای محصولات سفیدلیست‌شده قابل استفاده است، خالی بگذارید اگر استفاده نمی‌شود',
-        'services_blacklist_hint' => 'برای محصولات بلک‌لیست‌شده غیرقابل استفاده است، خالی بگذارید اگر استفاده نمی‌شود',
+        'type_hint' => 'کاهش: کسر مبلغ؛ تخفیف: درصد تخفیف؛ شارژ: افزودن مبلغ به موجودی',
+        'value' => '{1} ➖ :num|{2} :num% تخفیف|{3} ➕ :num',
+        'value_hint' => 'محدوده 1٪ تا 99٪',
+        'priority_hint' => 'کوپن با اولویت بالاتر ابتدا استفاده می‌شود. حداکثر 255',
+        'minimum_hint' => 'فقط زمانی قابل استفاده است که مبلغ پرداختی بیش از <strong>:num</strong> باشد',
+        'used_hint' => 'هر کاربر می‌تواند این کوپن را حداکثر <strong>:num</strong> بار استفاده کند',
+        'levels_hint' => 'فقط برای سطوح کاربری انتخاب شده قابل استفاده است',
+        'groups_hint' => 'فقط برای گروه‌های کاربری انتخاب شده قابل استفاده است',
+        'users_placeholder' => 'شناسه کاربر را وارد کنید، سپس Enter را فشار دهید',
+        'user_whitelist_hint' => 'کاربران سفید لیست می‌توانند استفاده کنند، خالی بگذارید اگر استفاده نمی‌شود',
+        'users_blacklist_hint' => 'کاربران سیاه لیست نمی‌توانند استفاده کنند، خالی بگذارید اگر استفاده نمی‌شود',
+        'services_placeholder' => 'شناسه محصول را وارد کنید، سپس Enter را فشار دهید',
+        'services_whitelist_hint' => 'فقط برای محصولات سفید لیست قابل استفاده است، خالی بگذارید اگر استفاده نمی‌شود',
+        'services_blacklist_hint' => 'برای محصولات سیاه لیست قابل استفاده نیست، خالی بگذارید اگر استفاده نمی‌شود',
         'newbie' => [
-            'first_discount' => 'اولین تخفیف',
+            'first_discount' => 'تخفیف اولین بار',
             'first_order' => 'اولین سفارش',
-            'created_days' => 'سن حساب',
+            'created_days' => 'عمر حساب',
         ],
         'created_days_hint' => '<code>:days</code> روز پس از ثبت‌نام',
-        'limit_hint' => 'قوانین رابطه <strong>و</strong> دارند، درست استفاده کنید',
-        'info_title' => 'اطلاعات کوپن',
-        'counts' => 'تعداد کل کوپن‌ها <code>:num</code>',
+        'limit_hint' => 'قوانین دارای رابطه <strong>و</strong> هستند، به‌درستی استفاده کنید',
+        'info_title' => 'اطلاعات',
+        'counts' => 'مجموع <code>:num</code> کوپن',
         'discount' => 'تخفیف',
-        'export_title' => 'صدور کوپن‌ها',
-        'single_use' => 'یک‌بار مصرف',
+        'export_title' => 'صادرات',
+        'single_use' => 'استفاده یک‌باره',
     ],
     'times' => 'بار',
-    'massive_export' => 'صدور دسته‌جمعی',
-    'system_generate' => 'تولیدشده توسط سیستم',
+    'massive_export' => 'صادرات گروهی',
+    'system_generate' => 'تولید شده توسط سیستم',
     'aff' => [
-        'rebate_title' => 'سوابق بازگشت درآمد',
-        'counts' => 'تعداد کل درخواست‌ها <code>:num</code>',
-        'title' => 'فهرست درخواست‌های برداشت',
-        'apply_counts' => 'تعداد کل درخواست‌ها <code>:num</code>',
-        'referral' => 'بازگشت درآمد معرفی‌شده',
+        'rebate_title' => 'تاریخچه بازگشت وجه',
+        'counts' => 'مجموع <code>:num</code> رکورد بازگشت وجه',
+        'title' => 'لیست درخواست‌های برداشت',
+        'apply_counts' => 'مجموع <code>:num</code> درخواست برداشت',
+        'referral' => 'بازگشت وجه معرفی',
         'commission_title' => 'جزئیات درخواست',
-        'commission_counts' => 'شامل <code>:num</code> سفارش',
+        'commission_counts' => 'این درخواست شامل مجموع <code>:num</code> سفارش است',
     ],
     'setting' => [
         'common' => [
             'title' => 'تنظیمات عمومی',
-            'set_default' => 'تنظیم بهعنوان پیش‌فرض',
-            'connect_nodes' => 'تعداد نودهای مرتبط',
+            'set_default' => 'تنظیم به عنوان پیش‌فرض',
+            'connect_nodes' => 'تعداد گره‌های متصل',
         ],
         'email' => [
-            'title' => 'فیلتر ایمیل <small>(برای ثبت‌نام)</small>',
+            'title' => 'لیست فیلتر ایمیل <small>(برای جلوگیری از ثبت‌نام با پسوندهای خاص ایمیل)</small>',
             'tail' => 'پسوند ایمیل',
-            'rule' => 'نوع محدودیت',
+            'rule' => 'قانون',
             'black' => 'لیست سیاه',
             'white' => 'لیست سفید',
-            'tail_placeholder' => 'وارد کردن پسوند ایمیل',
+            'tail_placeholder' => 'لطفاً پسوند ایمیل را وارد کنید',
         ],
         'system' => [
             'title' => 'تنظیمات سیستم',
-            'web' => 'عمومی',
-            'account' => 'حساب',
-            'node' => 'نود',
-            'extend' => 'پیشرفته',
-            'check_in' => 'حضور و غیاب',
-            'promotion' => 'تبلیغات',
-            'notify' => 'اعلان‌رسانی',
-            'auto_job' => 'خودکارسازی',
-            'other' => 'لوگو|پشتیبانی|تحلیل',
-            'payment' => 'پرداخت',
+            'web' => 'تنظیمات سایت',
+            'account' => 'تنظیمات حساب',
+            'node' => 'تنظیمات گره',
+            'extend' => 'ویژگی‌های اضافی',
+            'check_in' => 'سیستم چک‌این',
+            'promotion' => 'سیستم معرفی',
+            'notify' => 'سیستم اطلاع‌رسانی',
+            'auto_job' => 'وظایف خودکار',
+            'other' => 'لوگو | خدمات مشتری | آمار',
+            'payment' => 'سیستم پرداخت',
             'menu' => 'منو',
         ],
-        'no_permission' => 'مجوز تغییر تنظیمات را ندارید!',
+        'no_permission' => 'شما اجازه تغییر پارامترها را ندارید!',
     ],
     'system' => [
-        'account_expire_notification' => 'اعلان انقضای حساب',
-        'active_times' => 'حداکثر فعال‌سازی حساب',
-        'admin_invite_days' => '[مدیر] مهلت دعوت‌نامه',
-        'aff_salt' => '[لینک معرفی] رمزگذاری شناسه کاربر',
+        'account_expire_notification' => 'اطلاع‌رسانی انقضای حساب',
+        'active_times' => 'تعداد فعال‌سازی حساب',
+        'admin_invite_days' => 'مدت اعتبار دعوت‌نامه مدیر',
+        'aff_salt' => 'رمزنگاری اطلاعات کاربر در لینک معرفی',
         'alipay_qrcode' => 'کد QR علی‌پی',
-        'AppStore_id' => '[Apple] حساب',
-        'AppStore_password' => '[Apple] رمزعبور',
-        'auto_release_port' => 'بازیابی پورت',
-        'bark_key' => '[Bark] کلید دستگاه',
-        'captcha_key' => 'کلید کپچا',
-        'captcha_secret' => 'رمزعبور/شناسه کپچا',
-        'codepay_id' => '[کدپرداخت] شناسه',
-        'codepay_key' => '[کدپرداخت] کلید',
-        'codepay_url' => '[کدپرداخت] آدرس',
-        'data_anomaly_notification' => 'اعلان ناهنجاری داده',
-        'data_exhaust_notification' => 'اعلان تمام‌شدن داده',
-        'ddns_key' => '[DNS] کلید',
-        'ddns_mode' => 'حالت همگام‌سازی DNS',
-        'ddns_secret' => '[DNS] رمز',
-        'default_days' => 'مدت پیش‌فرض حساب',
+        'AppStore_id' => 'حساب اپل',
+        'AppStore_password' => 'رمز عبور اپل',
+        'auto_release_port' => 'مکانیزم بازیابی پورت',
+        'bark_key' => 'کلید دستگاه Bark',
+        'captcha_key' => 'کلید کد امنیتی',
+        'captcha_secret' => 'رمز/شناسه کد امنیتی',
+        'codepay_id' => 'شناسه CodePay',
+        'codepay_key' => 'کلید ارتباطی',
+        'codepay_url' => 'URL درخواست',
+        'data_anomaly_notification' => 'اطلاع‌رسانی ناهنجاری داده',
+        'data_exhaust_notification' => 'اطلاع‌رسانی اتمام داده',
+        'ddns_key' => 'کلید DNS',
+        'ddns_mode' => 'حالت DDNS',
+        'ddns_secret' => 'رمز DNS',
+        'default_days' => 'مدت اعتبار پیش‌فرض',
         'default_traffic' => 'داده اولیه پیش‌فرض',
-        'detection_check_times' => 'اعلان‌های مسدودسازی نود',
-        'dingTalk_access_token' => '[دینگتاک] توکن دسترسی',
-        'dingTalk_secret' => '[دینگتاک] رمز',
-        'epay_key' => '[ای‌پی] کلید',
-        'epay_mch_id' => '[ای‌پی] شناسه بازرگان',
-        'epay_url' => '[ای‌پی] آدرس',
-        'expire_days' => 'آستانه اعلان انقضا',
-        'f2fpay_app_id' => 'شناسه برنامه',
-        'f2fpay_private_key' => 'کلید خصوصی',
-        'f2fpay_public_key' => 'کلید عمومی',
-        'forbid_mode' => 'محدودیت دسترسی',
-        'invite_num' => 'تعداد پیش‌فرض دعوت‌نامه',
+        'detection_check_times' => 'اطلاع‌رسانی تشخیص انسداد',
+        'dingTalk_access_token' => 'توکن دسترسی DingTalk',
+        'dingTalk_secret' => 'رمز DingTalk',
+        'epay_key' => 'کلید ePay',
+        'epay_mch_id' => 'شناسه بازرگان ePay',
+        'epay_url' => 'URL ePay',
+        'expire_days' => 'هشدار انقضا',
+        'f2fpay_app_id' => 'شناسه برنامه Alipay',
+        'f2fpay_private_key' => 'کلید خصوصی Alipay',
+        'f2fpay_public_key' => 'کلید عمومی Alipay',
+        'forbid_mode' => 'حالت مسدودسازی',
+        'invite_num' => 'تعداد دعوت‌نامه‌های پیش‌فرض',
         'is_activate_account' => 'فعال‌سازی حساب',
         'is_AliPay' => 'پرداخت علی‌پی',
-        'is_ban_status' => 'مسدودسازی خودکار با انقضا',
-        'is_captcha' => 'حالت کپچا',
-        'is_checkin' => 'پاداش حضور و غیاب',
-        'is_clear_log' => 'پاکسازی خودکار لاگ‌ها',
+        'is_ban_status' => 'مسدودسازی خودکار در صورت انقضا',
+        'is_captcha' => 'حالت کد امنیتی',
+        'is_checkin' => 'افزایش داده با چک‌این',
+        'is_clear_log' => 'پاکسازی خودکار لاگ‌ها',
         'is_custom_subscribe' => 'اشتراک پیشرفته',
         'is_email_filtering' => 'فیلتر ایمیل',
-        'is_forbid_robot' => 'مسدود کردن ربات‌ها',
+        'is_forbid_robot' => 'مسدودسازی ربات‌ها',
         'is_free_code' => 'کد دعوت رایگان',
-        'is_invite_register' => 'ثبت‌نام با دعوت‌نامه',
-        'is_otherPay' => 'پرداخت سفارشی',
-        'is_QQPay' => 'پرداخت کیو‌کیو',
+        'is_invite_register' => 'ثبت‌نام با دعوت',
+        'is_otherPay' => 'پرداخت خاص',
+        'is_QQPay' => 'پرداخت QQ',
         'is_rand_port' => 'پورت تصادفی',
-        'is_register' => 'ثبت‌نام',
-        'is_subscribe_ban' => 'مسدودسازی خودکار درخواست اشتراک',
-        'is_traffic_ban' => 'مسدودسازی خودکار به دلیل مصرف بی‌رویه',
-        'is_WeChatPay' => 'پرداخت وی‌چت',
-        'iYuu_token' => 'توکن ای‌یو',
-        'maintenance_content' => 'متن نگهداری',
+        'is_register' => 'ثبت‌نام کاربران',
+        'is_subscribe_ban' => 'مسدودسازی خودکار درخواست‌های اشتراک غیرعادی',
+        'is_traffic_ban' => 'مسدودسازی خودکار در صورت استفاده غیرعادی از داده',
+        'is_WeChatPay' => 'پرداخت WeChat',
+        'iYuu_token' => 'توکن IYUU',
+        'maintenance_content' => 'محتوای معرفی نگهداری',
         'maintenance_mode' => 'حالت نگهداری',
         'maintenance_time' => 'زمان پایان نگهداری',
         'min_port' => 'محدوده پورت',
         'min_rand_traffic' => 'محدوده داده',
-        'node_blocked_notification' => 'اعلان مسدودشدن نود',
-        'node_daily_notification' => 'گزارش روزانه نود',
-        'node_offline_notification' => 'اعلان آفلاین‌شدن نود',
-        'oauth_path' => 'مسیرهای OAuth',
-        'offline_check_times' => 'تعداد تلاش‌های آفلاین',
-        'password_reset_notification' => 'اعلان تنظیم مجدد رمزعبور',
-        'paybeaver_app_id' => 'شناسه برنامه',
-        'paybeaver_app_secret' => 'رمز برنامه',
-        'payjs_key' => 'کلید ارتباطی',
-        'payjs_mch_id' => 'شماره بازرگان',
-        'payment_confirm_notification' => 'اعلان تأیید پرداخت دستی',
-        'payment_received_notification' => 'اعلان دریافت پرداخت',
-        'paypal_app_id' => 'شناسه برنامه',
-        'paypal_client_id' => 'شناسه مشتری',
-        'paypal_client_secret' => 'کلید مخفی مشتری',
-        'pushDeer_key' => 'کلید پوش‌دیر',
-        'pushplus_token' => 'توکن پوش‌پلاس',
+        'node_blocked_notification' => 'اطلاع‌رسانی انسداد گره',
+        'node_daily_notification' => 'گزارش روزانه مصرف گره',
+        'node_offline_notification' => 'اطلاع‌رسانی آفلاین شدن گره',
+        'oauth_path' => 'پلتفرم‌های ورود شخص ثالث',
+        'offline_check_times' => 'تعداد اطلاع‌رسانی‌های آفلاین',
+        'password_reset_notification' => 'اطلاع‌رسانی بازنشانی رمز عبور',
+        'paybeaver_app_id' => 'شناسه برنامه PayBeaver',
+        'paybeaver_app_secret' => 'رمز برنامه PayBeaver',
+        'payjs_key' => 'کلید PayJs',
+        'payjs_mch_id' => 'شناسه بازرگان PayJs',
+        'payment_confirm_notification' => 'اطلاع‌رسانی تأیید پرداخت دستی',
+        'payment_received_notification' => 'اطلاع‌رسانی موفقیت پرداخت',
+        'paypal_app_id' => 'شناسه برنامه PayPal',
+        'paypal_client_id' => 'شناسه مشتری PayPal',
+        'paypal_client_secret' => 'کلید مخفی PayPal',
+        'pushDeer_key' => 'کلید PushDeer',
+        'pushplus_token' => 'توکن PushPlus',
         'rand_subscribe' => 'اشتراک تصادفی',
-        'redirect_url' => 'آدرس تغییرمسیر',
+        'redirect_url' => 'URL تغییر مسیر',
         'referral_money' => 'حداقل مبلغ برداشت',
-        'referral_percent' => 'درصد بازگشت درآمد',
-        'referral_status' => 'وضعیت تبلیغات',
-        'referral_traffic' => 'ترافیک ثبت‌نامی',
-        'referral_type' => 'حالت بازگشت درآمد',
-        'register_ip_limit' => 'محدودیت IP ثبت‌نام',
-        'reset_password_times' => 'تعداد تنظیم مجدد رمزعبور',
-        'reset_traffic' => 'تنظیم مجدد خودکار داده',
-        'server_chan_key' => 'کلید سرورچن',
-        'standard_currency' => 'واحد پول پایه',
-        'stripe_public_key' => 'کلید عمومی',
-        'stripe_secret_key' => 'کلید مخفی',
-        'stripe_signing_secret' => 'کلید امضای وب‌هوک',
-        'subject_name' => 'نام سفارشی کالا',
-        'subscribe_ban_times' => 'آستانه درخواست اشتراک',
-        'subscribe_domain' => 'آدرس اشتراک نود',
-        'subscribe_max' => 'حداکثر تعداد نودهای اشتراک',
-        'telegram_token' => 'توکن تلگرام',
-        'tg_chat_token' => 'توکن تی‌جی‌چت',
-        'theadpay_key' => 'کلید بازرگان',
-        'theadpay_mchid' => 'شناسه بازرگان',
-        'theadpay_url' => 'آدرس',
-        'ticket_closed_notification' => 'اعلان بستن تیکت',
-        'ticket_created_notification' => 'اعلان ایجاد تیکت',
-        'ticket_replied_notification' => 'اعلان پاسخ تیکت',
-        'traffic_ban_time' => 'مدت مسدودسازی',
-        'traffic_ban_value' => 'آستانه مصرف بی‌رویه',
-        'traffic_limit_time' => 'فاصله زمانی',
-        'traffic_warning_percent' => 'آستانه اخطار مصرف',
-        'trojan_license' => 'مجوز تروجان',
-        'username_type' => 'نوع نامکاربری',
-        'user_invite_days' => '[کاربر] مهلت دعوت‌نامه',
-        'v2ray_license' => 'مجوز وی‌توری',
-        'v2ray_tls_provider' => 'پیکربندی TLS وی‌توری',
-        'webmaster_email' => 'ایمیل مدیر',
-        'website_analytics' => 'کد تحلیل وبسایت',
-        'website_callback_url' => 'آدرس بازخوانی پرداخت',
-        'website_customer_service' => 'کد پشتیبانی وبسایت',
-        'website_home_logo' => 'لوگوی صفحه اصلی',
-        'website_logo' => 'لوگوی داخلی',
-        'website_name' => 'نام وبسایت',
-        'website_security_code' => 'کد امنیتی',
-        'website_url' => 'آدرس وبسایت',
+        'referral_percent' => 'درصد بازگشت وجه',
+        'referral_status' => 'وضعیت معرفی',
+        'referral_traffic' => 'هدیه داده برای ثبت‌نام با لینک معرفی',
+        'referral_type' => 'نوع بازگشت وجه',
+        'register_ip_limit' => 'محدودیت ثبت‌نام با IP مشابه',
+        'reset_password_times' => 'تعداد بازنشانی رمز عبور',
+        'reset_traffic' => 'بازنشانی خودکار داده',
+        'server_chan_key' => 'کلید ServerChan',
+        'standard_currency' => 'واحد پول اصلی',
+        'stripe_public_key' => 'کلید عمومی Stripe',
+        'stripe_secret_key' => 'کلید مخفی Stripe',
+        'stripe_signing_secret' => 'رمز امضای WebHook',
+        'subject_name' => 'نام محصول سفارشی',
+        'subscribe_ban_times' => 'حداکثر تعداد درخواست‌های اشتراک',
+        'subscribe_domain' => 'آدرس اشتراک',
+        'subscribe_max' => 'حداکثر تعداد گره‌های اشتراک',
+        'telegram_token' => 'توکن Telegram',
+        'tg_chat_token' => 'توکن TG Chat',
+        'theadpay_key' => 'کلید THeadPay',
+        'theadpay_mchid' => 'شناسه بازرگان THeadPay',
+        'theadpay_url' => 'URL THeadPay',
+        'ticket_closed_notification' => 'اطلاع‌رسانی بسته شدن تیکت',
+        'ticket_created_notification' => 'اطلاع‌رسانی ایجاد تیکت جدید',
+        'ticket_replied_notification' => 'اطلاع‌رسانی پاسخ به تیکت',
+        'traffic_ban_time' => 'مدت زمان مسدودسازی',
+        'traffic_ban_value' => 'آستانه استفاده غیرعادی از داده',
+        'traffic_limit_time' => 'فاصله زمانی بین چک‌این‌ها',
+        'traffic_warning_percent' => 'آستانه هشدار استفاده از داده',
+        'trojan_license' => 'مجوز Trojan',
+        'username_type' => 'نوع نام کاربری',
+        'user_invite_days' => 'مدت اعتبار دعوت‌نامه کاربر',
+        'v2ray_license' => 'مجوز V2Ray',
+        'v2ray_tls_provider' => 'تنظیمات TLS برای V2Ray',
+        'webmaster_email' => 'ایمیل مدیر سایت',
+        'website_analytics' => 'کد آمار وب‌سایت',
+        'website_callback_url' => 'آدرس بازگشت پرداخت',
+        'website_customer_service' => 'کد خدمات مشتری',
+        'website_home_logo' => 'لوگو صفحه اصلی',
+        'website_logo' => 'لوگو سایت',
+        'website_name' => 'نام وبسایت',
+        'website_security_code' => 'کد امنیتی وب‌سایت',
+        'website_url' => 'آدرس وبسایت',
         'web_api_url' => 'آدرس API',
-        'wechat_aid' => 'شناسه برنامه وی‌چت',
-        'wechat_cid' => 'شناسه سازمانی وی‌چت',
-        'wechat_encodingAESKey' => 'کلید رمزنگاری',
-        'wechat_qrcode' => 'کد QR وی‌چت',
-        'wechat_secret' => 'رمز برنامه وی‌چت',
-        'wechat_token' => 'توکن برنامه وی‌چت',
+        'wechat_aid' => 'شناسه برنامه WeChat',
+        'wechat_cid' => 'شناسه شرکت WeChat',
+        'wechat_encodingAESKey' => 'کلید رمزنگاری AES WeChat',
+        'wechat_qrcode' => 'کد QR WeChat',
+        'wechat_secret' => 'رمز WeChat',
+        'wechat_token' => 'توکن WeChat',
         'hint' => [
-            'account_expire_notification' => 'اعلان انقضای حساب',
-            'active_times' => 'ظرف 24 ساعت از طریق ایمیل',
-            'admin_invite_days' => 'مدت اعتبار دعوت‌نامه مدیر',
-            'aff_salt' => 'رمزگذاری لینک معرفی',
-            'AppStore_id' => 'در مقالات استفاده می‌شود',
-            'AppStore_password' => 'در مقالات استفاده می‌شود',
-            'auto_release_port' => 'پورت حساب‌های مسدود شده/منقضی شده پس از <code>'.config('tasks.release_port').'</code> روز به صورت خودکار آزاد می‌شود',
-            'bark_key' => 'برای ارسال به دستگاه iOS',
-            'captcha_key' => '<a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">راهنمای تنظیمات</a>',
-            'data_anomaly_notification' => 'اگر ظرف 1 ساعت از حد مجاز بیشتر باشد',
-            'data_exhaust_notification' => 'هنگام تمام‌شدن داده',
-            'ddns_key' => "<a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>راهنمای تنظیمات</a>",
-            'ddns_mode' => 'همگام‌سازی دامنه و IP',
-            'default_days' => 'مدت پیش‌فرض حساب جدید، 0 به معنی امروز منقضی می‌شود',
-            'default_traffic' => 'داده پیش‌فرض حساب جدید',
-            'detection_check_times' => 'پس از N بار 0 تا 12',
-            'dingTalk_access_token' => '<a href="https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2" target="_blank">دفترچه راهنمای دینگتاک</a>',
-            'dingTalk_secret' => 'لازم است اگر امضا فعال باشد',
-            'expire_days' => 'شروع اعلان انقضای حساب',
-            'f2fpay_app_id' => 'شناسه برنامه',
-            'f2fpay_private_key' => 'کلید خصوصی تولیدشده',
-            'f2fpay_public_key' => 'کلید عمومی برنامه نیست!',
-            'forbid_mode' => 'مناطق مشخص‌شده مسدود می‌شوند',
-            'invite_num' => 'پیش‌فرض هر کاربر',
-            'is_activate_account' => 'نیاز به فعال‌سازی از طریق ایمیل',
-            'is_ban_status' => 'حساب را مسدود می‌کند و داده‌ها را پاک می‌کند',
-            'is_captcha' => 'نیاز به کپچا برای ورود/ثبت‌نام',
-            'is_checkin' => 'پاداش تصادفی هنگام حضور و غیاب',
-            'is_clear_log' => 'پاکسازی خودکار لاگ‌های بی‌استفاده',
-            'is_custom_subscribe' => 'نمایش تاریخ انقضا و داده باقیمانده',
-            'is_email_filtering' => 'لیست سیاه و سفید ایمیل مجاز',
-            'is_forbid_robot' => 'خطای 404 برای ربات‌ها',
-            'is_free_code' => 'مخفی‌کردن کدهای رایگان',
-            'is_rand_port' => 'پورت تصادفی هنگام ثبت‌نام',
-            'is_register' => 'غیرفعال‌کردن ثبت‌نام',
-            'is_subscribe_ban' => 'مسدودسازی خودکار در صورت درخواست بیش از حد',
-            'is_traffic_ban' => 'مسدودسازی خدمات در صورت مصرف بی‌رویه',
-            'iYuu_token' => 'پس از دریافت <a href="https://iyuu.cn" target="_blank">توکن ای‌یو</a>',
-            'maintenance_content' => 'متن سفارشی نگهداری',
-            'maintenance_mode' => "تغییر مسیر کاربران | مدیر ورود از <a href='javascript:(0)'>:url</a>",
-            'maintenance_time' => 'برای شمارش معکوس',
-            'min_port' => '1000 - 65535',
-            'node_blocked_notification' => 'اعلان مسدودشدن نود در هر ساعت',
-            'node_daily_notification' => 'گزارش روزانه مصرف نودها',
-            'node_offline_notification' => 'اعلان آفلاین‌شدن نودها',
-            'oauth_path' => 'لطفا ابتدا در .ENV فعال کنید',
-            'offline_check_times' => 'توقف اعلان پس از N بار در 24 ساعت',
-            'password_reset_notification' => 'امکان تنظیم مجدد رمزعبور از طریق ایمیل',
+            'account_expire_notification' => 'اطلاع‌رسانی انقضای حساب',
+            'active_times' => 'تعداد فعال‌سازی حساب از طریق ایمیل در 24 ساعت',
+            'admin_invite_days' => 'مدت اعتبار کدهای دعوت ایجاد شده توسط مدیر',
+            'aff_salt' => 'رمزنگاری لینک دعوت با استفاده از متن مخفی',
+            'AppStore_id' => 'حساب اپل استفاده شده در آموزش‌ها',
+            'AppStore_password' => 'رمز عبور اپل استفاده شده در آموزش‌ها',
+            'auto_release_port' => 'پورت‌های مسدود شده/منقضی شده پس از <code>'.config('tasks.release_port').'</code> روز به‌صورت خودکار آزاد می‌شوند',
+            'bark_key' => 'کلید دستگاه برای ارسال پیام به iOS',
+            'captcha_key' => 'راهنمای تنظیمات <a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">اینجا</a>',
+            'data_anomaly_notification' => 'اطلاع‌رسانی به مدیر در صورت استفاده غیرعادی از داده در یک ساعت',
+            'data_exhaust_notification' => 'اطلاع‌رسانی در صورت اتمام داده',
+            'ddns_key' => "راهنمای تنظیمات <a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>اینجا</a>",
+            'ddns_mode' => 'به‌روزرسانی خودکار تغییرات دامنه و IP به DNS',
+            'default_days' => 'مدت اعتبار پیش‌فرض حساب‌های جدید، 0 به‌معنای انقضا در همان روز',
+            'default_traffic' => 'داده پیش‌فرض برای حساب‌های جدید',
+            'detection_check_times' => 'تعداد اطلاع‌رسانی‌های انسداد گره، 0 برای نامحدود، حداکثر 12',
+            'dingTalk_access_token' => 'توکن دسترسی ربات سفارشی <a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>اینجا</a>',
+            'dingTalk_secret' => 'رمز ربات سفارشی در صورت فعال‌سازی امضا',
+            'expire_days' => 'شروع اطلاع‌رسانی انقضای حساب',
+            'f2fpay_app_id' => 'شناسه برنامه Alipay',
+            'f2fpay_private_key' => 'کلید خصوصی Alipay از ابزار تولید کلید',
+            'f2fpay_public_key' => 'توجه: این کلید عمومی برنامه نیست!',
+            'forbid_mode' => 'مسدودسازی دسترسی از مناطق مشخص',
+            'invite_num' => 'تعداد دعوت‌نامه‌های پیش‌فرض برای هر کاربر',
+            'is_activate_account' => 'نیاز به فعال‌سازی حساب از طریق ایمیل',
+            'is_ban_status' => '(احتیاط) مسدودسازی کل حساب باعث بازنشانی تمام داده‌های کاربر می‌شود',
+            'is_captcha' => 'نیاز به کد امنیتی برای ورود/ثبت‌نام در صورت فعال‌سازی',
+            'is_checkin' => 'پاداش تصادفی در زمان چک‌این',
+            'is_clear_log' => '(توصیه می‌شود) پاکسازی خودکار لاگ‌های بی‌استفاده/قدیمی در صورت فعال‌سازی',
+            'is_custom_subscribe' => 'نمایش تاریخ انقضا و داده باقیمانده در لیست اشتراک در صورت فعال‌سازی',
+            'is_email_filtering' => 'لیست سیاه: کاربران می‌توانند با پسوندهای ایمیلی که در لیست سیاه نیستند ثبت‌نام کنند؛ لیست سفید: کاربران باید با پسوندهای ایمیلی که در لیست سفید هستند ثبت‌نام کنند',
+            'is_forbid_robot' => 'بازگشت خطای 404 در صورت دسترسی ربات‌ها/پراکسی‌ها',
+            'is_free_code' => 'پنهان کردن کدهای دعوت رایگان در صورت غیرفعال‌سازی',
+            'is_rand_port' => 'پورت تصادفی در زمان افزودن/ثبت‌نام کاربر',
+            'is_register' => 'غیرفعال‌سازی ثبت‌نام در صورت عدم انتخاب',
+            'is_subscribe_ban' => 'مسدودسازی خودکار در صورت درخواست‌های اشتراک بیش از حد',
+            'is_traffic_ban' => 'غیرفعال‌سازی خودکار سرویس در صورت استفاده غیرعادی از داده در یک ساعت',
+            'iYuu_token' => 'پر کردن <a href=https://iyuu.cn target=_blank>توکن IYUU</a> قبل از فعال‌سازی',
+            'maintenance_content' => 'اطلاع‌رسانی سفارشی نگهداری',
+            'maintenance_mode' => "انتقال کاربران عادی به صفحه نگهداری در صورت فعال‌سازی | مدیر می‌تواند از طریق <a href='javascript:(0)'>:url</a> وارد شود",
+            'maintenance_time' => 'برای شمارش معکوس صفحه نگهداری',
+            'min_port' => 'محدوده پورت 1000 - 65535',
+            'node_blocked_notification' => 'تشخیص انسداد گره ساعتی و اطلاع‌رسانی به مدیران',
+            'node_daily_notification' => 'گزارش روزانه استفاده از گره',
+            'node_offline_notification' => 'تشخیص آفلاین شدن هر 10 دقیقه و اطلاع‌رسانی در صورت آفلاین بودن گره',
+            'oauth_path' => 'لطفاً ابتدا پلتفرم‌ها را در .ENV فعال کنید',
+            'offline_check_times' => 'توقف اطلاع‌رسانی پس از N هشدار در 24 ساعت',
+            'password_reset_notification' => 'اجازه بازنشانی رمز عبور از طریق ایمیل در صورت فعال‌سازی',
             'paybeaver_app_id' => '<a href="https://merchant.paybeaver.com/" target="_blank">مرکز بازرگان</a> -> توسعه‌دهنده -> شناسه برنامه',
             'paybeaver_app_secret' => '<a href="https://merchant.paybeaver.com/" target="_blank">مرکز بازرگان</a> -> توسعه‌دهنده -> رمز برنامه',
-            'payjs_mch_id' => '<a href="https://payjs.cn/dashboard/member" target="_blank">از اینجا</a>',
-            'payment_confirm_notification' => 'اعلان به مدیر برای پردازش سفارشات دستی',
-            'payment_received_notification' => 'اعلان دریافت پرداخت به کاربر',
-            'pushDeer_key' => 'پس از دریافت <a href="https://www.pushdeer.com/official.html" target="_blank">کلید پوش‌دیر</a>',
-            'pushplus_token' => 'پس از دریافت <a href="https://www.pushplus.plus/push1.html" target="_blank">توکن پوش‌پلاس</a>',
-            'rand_subscribe' => 'ترتیب تصادفی به جای ترتیب نود',
-            'redirect_url' => 'تغییرمسیر به این آدرس هنگام فعال‌شدن قوانین',
-            'referral_money' => 'حداقل مبلغ قابل برداشت',
-            'referral_percent' => 'درصد سفارش برای معرف',
-            'referral_status' => 'غیرفعال‌کردن سیستم معرفی',
-            'referral_traffic' => 'ترافیک رایگان با ثبت‌نام از طریق معرفی',
-            'referral_type' => 'بازگشت درآمد جدید بر اساس حالت جدید',
-            'register_ip_limit' => 'تعداد ثبت‌نام مجاز در 24 ساعت، 0 برای نامحدود',
-            'reset_password_times' => 'تعداد مجاز تنظیم مجدد رمزعبور در 24 ساعت',
-            'reset_traffic' => 'تنظیم مجدد خودکار بر اساس دوره طرح کاربر',
-            'server_chan_key' => 'پس از دریافت <a href="https://sc.ftqq.com" target="_blank">کلید سرورچن</a>',
-            'standard_currency' => 'واحد پول پیش‌فرض سایت',
-            'subject_name' => 'نام سفارشی محصول در درگاه‌ها',
-            'subscribe_ban_times' => 'حداکثر تعداد درخواست اشتراک در 24 ساعت',
-            'subscribe_domain' => 'شروع با http:// یا https:// برای جلوگیری از شکست DNS',
-            'subscribe_max' => 'حداکثر تعداد نودهای بازگشتی، 0 برای همه',
-            'telegram_token' => 'دریافت <a href="https://t.me/BotFather" target="_blank">توکن ربات</a> از @BotFather',
-            'tg_chat_token' => 'پس از دریافت <a href="https://t.me/realtgchat_bot" target="_blank">توکن تی‌جی‌چت</a>',
-            'ticket_closed_notification' => 'اعلان بسته‌شدن به کاربر',
-            'ticket_created_notification' => 'بسته به ایجادکننده، اعلان به مدیر/کاربر',
-            'ticket_replied_notification' => 'اعلان پاسخ به طرف مقابل',
-            'traffic_ban_time' => 'مدت زمان مسدودسازی خودکار',
-            'traffic_ban_value' => 'آستانه مصرف غیرمجاز در 1 ساعت',
-            'traffic_limit_time' => 'فاصله زمانی بین حضور و غیاب‌ها',
-            'traffic_warning_percent' => 'اعلان تمام‌شدن داده هنگام رسیدن به این درصد',
-            'username_type' => 'نوع پیش‌فرض نام‌کاربری',
-            'user_invite_days' => 'مدت اعتبار دعوت‌نامه کاربر',
-            'v2ray_tls_provider' => 'تنظیمات نود ارجح است',
-            'webmaster_email' => 'نمایش در خطاها',
-            'website_analytics' => 'کد JavaScript تحلیلگر',
-            'website_callback_url' => 'جلوگیری از شکست بازخوانی به دلیل DNS',
-            'website_customer_service' => 'کد JavaScript پشتیبانی',
-            'website_name' => 'نام نمایشی در ایمیل',
-            'website_security_code' => 'در صورت تنظیم، ورود فقط از <a href=":url" target="_blank">ورود امن</a>',
-            'website_url' => 'آدرس اصلی برای لینک‌ها',
-            'web_api_url' => 'مثلا '.config('app.url'),
-            'wechat_aid' => 'در <a href="https://work.weixin.qq.com/wework_admin/frame#apps" target="_blank">مدیریت برنامه</a>',
-            'wechat_cid' => '<a href="https://work.weixin.qq.com/wework_admin/frame#profile" target="_blank">اطلاعات سازمان</a>',
-            'wechat_encodingAESKey' => 'تنظیمات API دریافتی',
-            'wechat_secret' => 'ممکن است نیاز به برنامه سازمانی باشد',
-            'wechat_token' => 'تنظیمات API، آدرس بازخوانی: :url',
+            'payjs_mch_id' => 'دریافت از <a href="https://payjs.cn/dashboard/member" target="_blank">صفحه عضو</a>',
+            'payment_confirm_notification' => 'اطلاع‌رسانی به مدیر برای پردازش سفارش‌های پرداخت دستی',
+            'payment_received_notification' => 'اطلاع‌رسانی به کاربر در صورت دریافت پرداخت',
+            'pushDeer_key' => 'پر کردن <a href=https://www.pushdeer.com/official.html target=_blank>کلید PushDeer</a> قبل از فعال‌سازی',
+            'pushplus_token' => 'پر کردن <a href=https://www.pushplus.plus/push1.html target=_blank>توکن PushPlus</a> قبل از فعال‌سازی',
+            'rand_subscribe' => 'ترتیب تصادفی در صورت فعال‌سازی، در غیر این صورت بر اساس ترتیب لیست گره‌ها',
+            'redirect_url' => 'تغییر مسیر درخواست‌های مسدود شده به این URL در صورت فعال‌سازی قوانین',
+            'referral_money' => 'حداقل مبلغ برداشت',
+            'referral_percent' => 'درصد بازگشت وجه از مبلغ سفارش',
+            'referral_status' => 'بستن سیستم معرفی بدون تأثیر بر داده‌های موجود',
+            'referral_traffic' => 'هدیه داده برای ثبت‌نام با لینک معرفی',
+            'referral_type' => 'محاسبه بازگشت وجه جدید بر اساس حالت جدید پس از تغییر',
+            'register_ip_limit' => 'تعداد ثبت‌نام‌های مجاز در هر IP در 24 ساعت، 0 برای نامحدود',
+            'reset_password_times' => 'تعداد مجاز بازنشانی رمز عبور از طریق ایمیل در 24 ساعت',
+            'reset_traffic' => 'بازنشانی خودکار داده بر اساس چرخه طرح کاربر',
+            'server_chan_key' => 'پر کردن <a href=https://sc.ftqq.com target=_blank>کلید ServerChan</a> قبل از فعال‌سازی',
+            'standard_currency' => 'واحد پول اصلی مورد استفاده در پنل',
+            'subject_name' => 'نام محصول سفارشی در درگاه‌های پرداخت',
+            'subscribe_ban_times' => 'حداکثر تعداد درخواست‌های اشتراک در 24 ساعت',
+            'subscribe_domain' => 'شروع با http:// یا https:// برای جلوگیری از شکست DNS poisoning',
+            'subscribe_max' => 'حداکثر تعداد گره‌های بازگشتی در لیست اشتراک، 0 برای همه',
+            'telegram_token' => 'دریافت <a href=https://t.me/BotFather target=_blank>توکن ربات</a> از @BotFather',
+            'tg_chat_token' => 'پر کردن <a href=https://t.me/realtgchat_bot target=_blank>توکن TG Chat</a> قبل از فعال‌سازی',
+            'ticket_closed_notification' => 'اطلاع‌رسانی به کاربر هنگام بسته شدن تیکت',
+            'ticket_created_notification' => 'اطلاع‌رسانی به مدیر یا کاربر بسته به ایجادکننده تیکت',
+            'ticket_replied_notification' => 'اطلاع‌رسانی به طرف دیگر هنگام پاسخ به تیکت',
+            'traffic_ban_time' => 'مدت زمان مسدودسازی خودکار برای موارد استثنا',
+            'traffic_ban_value' => 'مسدودسازی خودکار حساب در صورت تجاوز از این مقدار در یک ساعت',
+            'traffic_limit_time' => 'فاصله زمانی بین چک‌این‌ها',
+            'traffic_warning_percent' => 'ارسال اطلاع‌رسانی اتمام داده هنگامی که استفاده روزانه به این درصد برسد',
+            'username_type' => 'نوع نام کاربری پیش‌فرض برای کاربران',
+            'user_invite_days' => 'مدت اعتبار کدهای دعوت ایجاد شده توسط کاربر',
+            'v2ray_tls_provider' => 'تنظیمات گره این پیکربندی TLS را نادیده می‌گیرد',
+            'webmaster_email' => 'ایمیل تماس نمایش داده شده در برخی از پیام‌های خطا',
+            'website_analytics' => 'کد جاوا اسکریپت تحلیل وب‌سایت',
+            'website_callback_url' => 'جلوگیری از شکست بازگشت پرداخت به دلیل DNS poisoning',
+            'website_customer_service' => 'کد جاوا اسکریپت خدمات مشتری',
+            'website_name' => 'نام وب‌سایت در ایمیل‌ها',
+            'website_security_code' => 'نیاز به کد امنیتی برای دسترسی به سایت در صورت تنظیم',
+            'website_url' => 'دامنه اصلی مورد استفاده برای لینک‌ها',
+            'web_api_url' => 'مثال: '.config('app.url'),
+            'wechat_aid' => '<a href="https://work.weixin.qq.com/wework_admin/frame#apps" target="_blank">مدیریت برنامه</a> -> AgentId',
+            'wechat_cid' => 'دریافت از <a href="https://work.weixin.qq.com/wework_admin/frame#profile" target="_blank">اطلاعات شرکت</a>',
+            'wechat_encodingAESKey' => 'مدیریت برنامه -> تنظیمات برنامه -> EncodingAESKey',
+            'wechat_secret' => 'رمز برنامه (ممکن است نیاز به دانلود WeChat Enterprise باشد)',
+            'wechat_token' => 'تنظیمات برنامه -> TOKEN، آدرس بازگشت: :url',
         ],
         'placeholder' => [
-            'default_url' => ':url پیش‌فرض',
-            'server_chan_key' => 'پرکردن کلید سرورچن و کلیک بروزرسانی',
-            'pushDeer_key' => 'پرکردن کلید پوش‌دیر و کلیک بروزرسانی',
-            'iYuu_token' => 'پرکردن توکن ای‌یو و کلیک بروزرسانی',
-            'bark_key' => 'پرکردن کلید دستگاه بارک و کلیک بروزرسانی',
-            'telegram_token' => 'پرکردن توکن تلگرام و کلیک بروزرسانی',
-            'pushplus_token' => 'لطفا از سرورچن درخواست کنید',
+            'default_url' => 'پیش‌فرض به عنوان :url',
+            'server_chan_key' => 'پر کردن SCKEY ServerChan سپس کلیک بر روی به‌روزرسانی',
+            'pushDeer_key' => 'پر کردن کلید PushDeer سپس کلیک بر روی به‌روزرسانی',
+            'iYuu_token' => 'پر کردن توکن IYUU سپس کلیک بر روی به‌روزرسانی',
+            'bark_key' => 'پر کردن کلید دستگاه Bark سپس کلیک بر روی به‌روزرسانی',
+            'telegram_token' => 'پر کردن توکن Telegram سپس کلیک بر روی به‌روزرسانی',
+            'pushplus_token' => 'لطفاً در ServerChan درخواست دهید',
             'dingTalk_access_token' => 'توکن دسترسی ربات سفارشی',
-            'dingTalk_secret' => 'رمز پس از فعال‌سازی امضای ربات',
-            'wechat_aid' => 'شناسه برنامه سازمانی وی‌چت',
-            'wechat_cid' => 'پر کردن شناسه وی‌چت و کلیک بروزرسانی',
-            'wechat_secret' => 'رمز برنامه سازمانی وی‌چت',
-            'tg_chat_token' => 'لطفا از تلگرام درخواست کنید',
-            'codepay_url' => 'https://codepay.fateqq.com/create_order/?',
+            'dingTalk_secret' => 'رمز ربات سفارشی پس از امضا',
+            'wechat_aid' => 'شناسه برنامه WeChat Enterprise',
+            'wechat_cid' => 'پر کردن CID WeChat سپس کلیک بر روی به‌روزرسانی',
+            'wechat_secret' => 'رمز برنامه WeChat Enterprise',
+            'tg_chat_token' => 'لطفاً در Telegram درخواست دهید',
+            'codepay_url' => 'https://codepay.fatq.com/create_order/?',
         ],
         'payment' => [
-            'attribute' => 'تنظیمات پرداخت',
+            'attribute' => 'درگاه پرداخت',
             'channel' => [
-                'alipay' => 'پرداخت آنلاین علی‌پی',
-                'codepay' => 'کدپرداخت',
-                'epay' => 'ای‌پی',
-                'payjs' => 'پی‌جی‌اس',
-                'paypal' => 'پی‌پال',
-                'stripe' => 'استرایپ',
-                'paybeaver' => 'پی‌بیور',
-                'theadpay' => 'تی‌هدپی',
+                'alipay' => 'Alipay F2F',
+                'codepay' => 'CodePay',
+                'epay' => 'ePay',
+                'payjs' => 'PayJs',
+                'paypal' => 'PayPal',
+                'stripe' => 'Stripe',
+                'paybeaver' => 'PayBeaver',
+                'theadpay' => 'THeadPay',
                 'manual' => 'پرداخت دستی',
             ],
             'hint' => [
-                'alipay' => 'نیاز به مجوز از <a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">درگاه آنت فایننشل</a>',
-                'codepay' => 'ثبت‌نام در <a href="https://codepay.fateqq.com/i/377289" target="_blank">کدپرداخت</a> و دانلود نرم‌افزار',
-                'payjs' => 'ثبت‌نام در <a href="https://payjs.cn/ref/zgxjnb" target="_blank">پی‌جی‌اس</a>',
-                'paypal' => 'ورود به <a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">صفحه اعتبارنامه API</a> و دریافت اطلاعات',
-                'paybeaver' => 'ثبت‌نام در <a href="https://merchant.paybeaver.com/?aff_code=iK4GNuX8" target="_blank">پی‌بیور</a>',
-                'theadpay' => 'درخواست حساب از <a href="https://theadpay.com/" target="_blank">تی‌هدپی</a>',
-                'manual' => 'پس از تنظیم درگاه، در سمت کاربر نمایش داده می‌شود',
+                'alipay' => 'این ویژگی نیاز به رفتن به <a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">پلتفرم باز خدمات مالی Ant</a> برای درخواست مجوز و برنامه دارد',
+                'codepay' => 'لطفاً به <a href="https://codepay.fateqq.com/i/377289" target="_blank">CodePay</a> بروید و یک حساب کاربری درخواست دهید، سپس نرم‌افزار آن را دانلود و تنظیم کنید',
+                'payjs' => 'لطفاً به <a href="https://payjs.cn/ref/zgxjnb" target="_blank">PayJs</a> بروید و یک حساب کاربری درخواست دهید',
+                'paypal' => 'با حساب بازرگانی خود وارد <a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">صفحه درخواست اعتبار API</a> شوید، موافقت کنید و اطلاعات تنظیمات را دریافت کنید',
+                'paybeaver' => 'لطفاً به <a href="https://merchant.paybeaver.com/?aff_code=iK4GNuX8" target="_blank">PayBeaver</a> بروید و یک حساب کاربری درخواست دهید',
+                'theadpay' => 'لطفاً به <a href="https://theadpay.com/" target="_blank">THeadPay</a> بروید و یک حساب کاربری درخواست دهید',
+                'manual' => 'پس از تنظیم و انتخاب درگاه پرداخت، در سمت کاربر نمایش داده می‌شود',
             ],
         ],
         'notification' => [
             'channel' => [
                 'telegram' => 'تلگرام',
-                'wechat' => 'وی‌چت سازمانی',
-                'dingtalk' => 'دینگتاک',
+                'wechat' => 'WeChat Enterprise',
+                'dingtalk' => 'DingTalk',
                 'email' => 'ایمیل',
-                'bark' => 'بارک',
-                'serverchan' => 'سرورچن',
-                'pushdeer' => 'پوش‌دیر',
-                'pushplus' => 'پوش‌پلاس',
-                'iyuu' => 'ای‌یو',
-                'tg_chat' => 'تی‌جی‌چت',
-                'site' => 'اعلان سایت',
+                'bark' => 'Bark',
+                'serverchan' => 'ServerChan',
+                'pushdeer' => 'PushDeer',
+                'pushplus' => 'PushPlus',
+                'iyuu' => 'IYUU',
+                'tg_chat' => 'TG Chat',
+                'site' => 'اعلان درون سایت',
             ],
             'send_test' => 'ارسال پیام آزمایشی',
         ],
         'forbid' => [
-            'mainland' => 'مسدودسازی ایران',
-            'china' => 'مسدودسازی چین',
-            'oversea' => 'مسدودسازی خارج از کشور',
+            'mainland' => 'مسدودسازی دسترسی از سرزمین اصلی چین',
+            'china' => 'مسدودسازی دسترسی از چین',
+            'oversea' => 'مسدودسازی دسترسی از خارج از کشور',
         ],
         'username' => [
             'email' => 'ایمیل',
-            'mobile' => 'شماره موبایل',
-            'any' => 'هر نامکاربری',
+            'mobile' => 'شماره تلفن',
+            'any' => 'هر نام کاربری',
         ],
         'active_account' => [
             'before' => 'فعال‌سازی قبل از ثبت‌نام',
-            'after' => 'فعال‌سازی بعد از ثبت‌نام',
-        ],
-        'ddns' => [
-            'namesilo' => 'نیم‌سیلو',
-            'aliyun' => 'علی‌کلود',
-            'dnspod' => 'دی‌ان‌اس‌پاد',
-            'cloudflare' => 'کلودفلر',
+            'after' => 'فعال‌سازی پس از ثبت‌نام',
         ],
         'captcha' => [
-            'standard' => 'کپچای استاندارد',
-            'geetest' => 'جی‌تست',
-            'recaptcha' => 'ری‌کپچای گوگل',
-            'hcaptcha' => 'اچ‌کپچا',
+            'standard' => 'کد امنیتی استاندارد',
+            'geetest' => 'Geetest',
+            'recaptcha' => 'Google reCaptcha',
+            'hcaptcha' => 'hCaptcha',
             'turnstile' => 'Turnstile',
         ],
         'referral' => [
-            'once' => 'بازگشت درآمد اولین خرید',
-            'loop' => 'بازگشت درآمد همیشگی',
+            'once' => 'بازگشت وجه اولین خرید',
+            'loop' => 'بازگشت وجه دائمی',
         ],
     ],
-    'set_to' => ':attribute را به :attribute تنظیم کن',
+    'set_to' => 'تنظیم به :attribute',
     'minute' => 'دقیقه',
     'query' => 'جستجو',
     'optional' => 'اختیاری',

+ 48 - 48
resources/lang/fa/auth.php

@@ -3,98 +3,98 @@
 declare(strict_types=1);
 
 return [
-    'accept_term' => 'من شرایط و مقررات را خوانده و پذیرفته ام',
+    'accept_term' => 'من شرایط را خوانده و پذیرفته‌ام',
     'active' => [
-        'attribute' => 'فعال سازی',
+        'attribute' => 'فعالسازی',
         'error' => [
-            'activated' => 'حساب کاربری قبلا فعال شده است، نیازی به فعال سازی مجدد نیست',
-            'disable' => 'فعال سازی حساب کاربری غیرفعال است، می توانید بدون فعال سازی وارد شوید!',
-            'throttle' => 'محدودیت درخواست فعال سازی به اتمام رسیده است، لطفا عملیات را به صورت پیوسته انجام ندهید! در صورت بروز مشکل با :email تماس بگیرید.',
+            'activated' => 'حساب کاربری قبلاً فعال شده است، نیازی به فعالسازی مجدد نیست',
+            'disable' => 'فعال‌سازی حساب کاربری غیر فعال شده است، می‌توانید مستقیماً وارد شوید!',
+            'throttle' => 'شما به محدودیت درخواست‌های فعال‌سازی رسیده‌اید، لطفاً بعداً دوباره تلاش کنید! اگر سوالی دارید، با :email تماس بگیرید.',
         ],
-        'promotion' => 'حساب کاربری هنوز فعال نشده است، لطفا ابتدا ":action" را انجام دهید!',
-        'sent' => 'ایمیل فعال سازی ارسال شده است، لطفا ایمیل خود را از جمله پوشه هرزنامه بررسی کنید.',
+        'promotion' => 'حساب کاربری هنوز فعال نشده است، لطفاً ابتدا [:action] کنید!',
+        'sent' => 'ایمیل فعال‌سازی به صندوق پستی شما ارسال شده است، لطفاً آن را بررسی کنید (شامل پوشه اسپم).',
     ],
-    'aup' => 'شرایط و مقررات قابل قبول استفاده',
+    'aup' => 'سیاست استفاده قابل قبول',
     'captcha' => [
         'attribute' => 'کپچا',
         'error' => [
-            'failed' => 'تایید کپچا ناموفق بود، لطفا مجددا تلاش کنید',
-            'timeout' => 'کپچا منقضی شده است، لطفا صفحه را بارگذاری مجدد کرده و دوباره امتحان کنید.',
+            'failed' => 'تأیید کپچا ناموفق بود، لطفاً دوباره تلاش کنید',
+            'timeout' => 'کپچا منقضی شده است، لطفاً صفحه را تازه‌سازی کرده و دوباره تلاش کنید.',
         ],
-        'required' => 'لطفا کپچا را کامل کنید!',
-        'sent' => 'کپچا به ایمیل شما ارسال شده است، لطفا ایمیل خود را از جمله پوشه هرزنامه بررسی کنید.',
+        'required' => 'لطفاً کپچا را کامل کنید!',
+        'sent' => 'کپچا به ایمیل شما ارسال شده است، لطفاً آن را بررسی کنید (شامل پوشه اسپم).',
     ],
     'email' => [
         'error' => [
-            'banned' => 'ارائه دهنده ایمیل شما مسدود شده است، لطفا از ایمیل دیگری استفاده کنید.',
-            'invalid' => 'ایمیل شما پشتیبانی نمی شود.',
+            'banned' => 'ارائه دهنده ایمیل شما مسدود شده است، لطفاً از یک ایمیل دیگر استفاده کنید.',
+            'invalid' => 'ایمیل شما پشتیبانی نمیشود.',
         ],
     ],
     'error' => [
         'account_baned' => 'حساب کاربری شما مسدود شده است!',
-        'login_error' => 'خطای ورود، لطفا بعدا دوباره امتحان کنید!',
-        'login_failed' => 'ورود ناموفق بود، لطفا ایمیل و رمز عبور را بررسی کنید!',
-        'not_found_user' => 'حساب کاربری یافت نشد، لطفا روش های ورود دیگر را امتحان کنید.',
-        'repeat_request' => 'لطفا صفحه را بارگذاری مجدد کرده و دوباره امتحان کنید.',
-        'url_timeout' => 'لینک منقضی شده است، لطفا دوباره درخواست دهید.',
+        'login_error' => 'خطای ورود، لطفاً بعداً دوباره تلاش کنید!',
+        'login_failed' => 'ورود ناموفق بود، لطفاً نام کاربری و رمز عبور خود را بررسی کنید!',
+        'not_found_user' => 'حسابی یافت نشد، لطفاً از روش‌های ورود دیگر استفاده کنید.',
+        'repeat_request' => 'لطفاً درخواست‌های تکراری ارسال نکنید، صفحه را تازه‌سازی کرده و دوباره تلاش کنید.',
+        'url_timeout' => 'لینک منقضی شده است، لطفاً دوباره درخواست کنید.',
     ],
     'failed' => 'مشخصات وارد شده با اطلاعات ما سازگار نیست.',
     'invite' => [
         'attribute' => 'کد دعوت',
         'error' => [
-            'unavailable' => 'کد دعوت نامعتبر است، لطفا دوباره امتحان کنید.',
+            'unavailable' => 'کد دعوت نامعتبر است، لطفاً دوباره تلاش کنید.',
         ],
         'get' => 'دریافت کد دعوت',
-        'not_required' => 'نیازی به کد دعوت نیست، می توانید به صورت مستقیم ثبت نام کنید!',
+        'not_required' => 'نیازی به کد دعوت نیست، می‌توانید مستقیماً ثبت نام کنید!',
     ],
     'login' => 'ورود',
     'logout' => 'خروج',
-    'maintenance' => 'تعمیر و نگهداری',
-    'maintenance_tip' => 'در حال تعمیر و نگهداری',
+    'maintenance' => 'نگهداری',
+    'maintenance_tip' => 'در حال نگهداری',
     'oauth' => [
         'bind_failed' => 'اتصال ناموفق بود',
-        'bind_success' => 'اتصال موفقیت آمیز بود',
-        'login_failed' => 'ورود از طریق شخص ثالث ناموفق بود!',
-        'rebind_success' => 'اتصال مجدد موفقیت آمیز بود',
+        'bind_success' => 'اتصال موفقیتآمیز بود',
+        'login_failed' => 'ورود با شخص ثالث ناموفق بود!',
+        'rebind_success' => 'اتصال مجدد موفقیتآمیز بود',
         'register' => 'ثبت نام سریع',
         'register_failed' => 'ثبت نام ناموفق بود',
-        'registered' => 'قبلا ثبت نام کرده اید، لطفا مستقیما وارد شوید.',
-        'unbind_failed' => 'لغو اتصال ناموفق بود',
-        'unbind_success' => 'لغو اتصال موفقیت آمیز بود',
+        'registered' => 'قبلاً ثبت نام کرده‌اید، لطفاً مستقیماً وارد شوید.',
+        'unbind_failed' => 'قطع اتصال ناموفق بود',
+        'unbind_success' => 'قطع اتصال موفقیت‌آمیز بود',
     ],
-    'one-click_login' => 'ورود یک کلیکه',
+    'one-click_login' => 'ورود با یک کلیک',
     'optional' => 'اختیاری',
     'password' => [
-        'forget' => 'رمزعبور را فراموش کرده اید؟',
-        'new' => 'رمزعبور جدید را وارد کنید',
-        'original' => 'رمزعبور فعلی',
+        'forget' => 'رمز عبور را فراموش کرده‌اید؟',
+        'new' => 'رمز عبور جدید را وارد کنید',
+        'original' => 'رمز عبور فعلی',
         'reset' => [
-            'attribute' => 'بازنشانی رمزعبور',
+            'attribute' => 'بازنشانی رمز عبور',
             'error' => [
-                'demo' => 'تغییر رمزعبور ادمین در نسخه نمایشی ممکن نیست.',
-                'disabled' => 'بازنشانی رمزعبور غیرفعال است، لطفا برای کمک با :email تماس بگیرید.',
-                'failed' => 'بازنشانی رمزعبور ناموفق بود.',
-                'same' => 'رمزعبور جدید نمی تواند مشابه رمزعبور قدیم باشد، لطفا دوباره وارد کنید.',
-                'throttle' => 'شما تنها می توانید رمزعبور را :time بار در 24 ساعت بازنشانی کنید، لطفا عملیات را به صورت پیوسته انجام ندهید.',
-                'wrong' => 'رمزعبور نادرست است، لطفا دوباره امتحان کنید.',
+                'demo' => 'در حالت دمو نمی‌توان رمز عبور ادمین را تغییر داد.',
+                'disabled' => 'بازنشانی رمز عبور غیر فعال شده است، لطفاً برای کمک با :email تماس بگیرید.',
+                'failed' => 'بازنشانی رمز عبور ناموفق بود.',
+                'same' => 'رمز عبور جدید نمی‌تواند با رمز عبور قدیمی یکسان باشد، لطفاً دوباره وارد کنید.',
+                'throttle' => 'شما می‌توانید فقط :time بار در 24 ساعت رمز عبور را بازنشانی کنید، لطفاً عملیات را تکرار نکنید.',
+                'wrong' => 'رمز عبور اشتباه است، لطفاً دوباره تلاش کنید.',
             ],
-            'sent' => 'لینک بازنشانی به ایمیل شما ارسال شده است، لطفا ایمیل خود را از جمله پوشه هرزنامه بررسی کنید.',
-            'success' => 'رمزعبور جدید با موفقیت بازنشانی شد، اکنون می توانید وارد شوید.',
+            'sent' => 'لینک بازنشانی به صندوق پستی شما ارسال شده است، لطفاً آن را بررسی کنید (شامل پوشه اسپم).',
+            'success' => 'رمز عبور جدید با موفقیت بازنشانی شد، اکنون میتوانید وارد شوید.',
         ],
     ],
     'register' => [
         'attribute' => 'ثبت نام',
         'code' => 'کد ثبت نام',
         'error' => [
-            'disable' => 'متاسفانه ثبت نام کاربران جدید موقتا متوقف شده است.',
-            'throttle' => 'مکانیزم ضد هرزنامه فعال شده است، لطفا به صورت پیوسته ثبت نام نکنید!',
+            'disable' => 'متأسفیم، ما به طور موقت پذیرش کاربران جدید را متوقف کرده‌ایم.',
+            'throttle' => 'سیستم ضد ربات فعال شده است! لطفاً از ارسال مکرر خودداری کنید!',
         ],
-        'failed' => 'ثبت نام ناموفق بود، لطفا بعدا دوباره امتحان کنید.',
-        'promotion' => 'هنوز حساب کاربری ندارید؟ لطفا به ',
-        'success' => 'ثبت نام موفقیت آمیز بود',
+        'failed' => 'ثبت نام ناموفق بود، لطفاً بعداً دوباره تلاش کنید.',
+        'promotion' => 'هنوز حساب کاربری ندارید؟ لطفاً به ',
+        'success' => 'ثبت نام موفقیتآمیز بود',
     ],
     'remember_me' => 'مرا به خاطر بسپار',
     'request' => 'درخواست',
     'throttle' => 'دفعات تلاش شما برای ورود بیش از حد مجاز است. لطفا پس از :seconds ثانیه مجددا تلاش فرمایید.',
-    'tos' => 'شرایط استفاده کاربر',
+    'tos' => 'شرایط خدمات',
 ];

+ 48 - 55
resources/lang/fa/common.php

@@ -4,76 +4,69 @@ declare(strict_types=1);
 
 return [
     'hour' => '{1} ساعت|{2} ساعت',
-    'account' => 'حساب کاربری',
-    'available_date' => 'تاریخ اعتبار',
+    'account' => 'حساب',
+    'available_date' => 'دوره اعتبار',
     'created_at' => 'تاریخ ایجاد',
     'expired_at' => 'تاریخ انقضا',
-    'updated_at' => 'آخرین به‌روزرسانی',
+    'updated_at' => 'آخرین بروزرسانی',
     'latest_at' => 'آخرین فعالیت',
     'back' => 'بازگشت',
     'back_to' => 'بازگشت به :page',
     'cancel' => 'لغو',
     'close' => 'بستن',
     'close_item' => 'بستن :attribute',
-    'confirm' => 'تایید',
-    'continues' => 'ادامه',
+    'confirm' => 'تأیید',
+    'continue' => 'ادامه',
     'open' => 'باز کردن',
     'send' => 'ارسال',
     'view' => 'مشاهده',
     'reset' => 'بازنشانی',
     'copy' => [
         'attribute' => 'کپی',
-        'success' => 'با موفقیت کپی شد',
-        'failed' => 'کپی با شکست مواجه شد، لطفاً دستی کپی کنید',
+        'success' => 'کپی با موفقیت انجام شد',
+        'failed' => 'کپی ناموفق بود، لطفاً دستی کپی کنید',
     ],
-    'add' => 'افزودن',
+    'add' => 'اضافه کردن',
     'free' => 'رایگان',
-    'replace' => 'جایگزین کردن',
-    'submit' => 'ثبت',
-    'submit_item' => 'ثبت :attribute',
+    'change' => 'تغییر',
+    'submit' => 'ارسال',
+    'submit_item' => 'ارسال :attribute',
     'generate' => 'تولید',
     'generate_item' => 'تولید :attribute',
-    'to_safari' => [0 => 'روی گوشه بالا سمت راست کلیک کنید', 1 => '، سپس', 2 => 'در Safari باز کنید', 3 => ' را انتخاب کنید تا تجربه بهتری داشته باشید!'],
-    'update_browser' => [0 => 'شما از یک مرورگر', 1 => 'قدیمی', 2 => 'استفاده می‌کنید. لطفاً مرورگر خود را', 3 => 'به‌روزرسانی کنید', 4 => 'تا بهترین تجربه را داشته باشید'],
+    'to_safari' => [0 => 'روی گوشه بالا سمت راست کلیک کنید', 1 => '، سپس انتخاب کنید', 2 => 'باز کردن در Safari', 3 => ' تا بتوانید به درستی به این سایت دسترسی پیدا کنید!'],
+    'update_browser' => [0 => 'شما از یک مرورگر', 1 => 'قدیمی', 2 => ' استفاده می‌کنید. لطفاً', 3 => 'مرورگر خود را ارتقا دهید', 4 => 'برای بهترین تجربه'],
     'apply' => 'اعمال',
     'avatar' => 'آواتار',
-    'customize' => 'سفارشی سازی',
+    'customize' => 'شخصی‌سازی',
     'all' => 'همه',
     'default' => 'پیش‌فرض',
     'download' => 'دانلود',
     'goto' => 'برو به',
     'warning' => 'هشدار',
-    'success' => 'موفق',
-    'success_item' => ':attribute موفق بود',
+    'success' => 'موفقیت',
+    'success_item' => ':attribute موفق شد',
     'failed' => 'ناموفق',
     'failed_item' => ':attribute ناموفق بود',
-    'update' => 'به‌روزرسانی',
-    'update_action' => 'به‌روزرسانی :action',
+    'update' => 'بروزرسانی',
+    'update_action' => 'بروزرسانی :action',
     'none' => 'هیچ',
     'new' => 'جدید',
-    'sorry' => 'متاسفم',
+    'sorry' => 'متأسفیم',
     'applied' => ':attribute اعمال شد',
-    'active_item' => 'فعالسازی :attribute',
+    'active_item' => 'فعال کردن :attribute',
     'error' => 'خطا',
-    'toggle' => 'تغییر',
-    'toggle_action' => 'تغییر :action',
-    'request_url' => 'نشانی درخواست',
+    'toggle' => 'تغییر وضعیت',
+    'toggle_action' => 'تغییر وضعیت :action',
+    'request_url' => 'آدرس درخواست',
     'function' => [
         'navigation' => 'ناوبری',
         'menubar' => 'نوار منو',
-        'fullscreen' => 'تمامصفحه',
+        'fullscreen' => 'تمام صفحه',
     ],
     'days' => [
         'attribute' => '{1} روز|{2} روز',
-        'sun' => 'یک‌شنبه',
-        'mon' => 'دوشنبه',
-        'tue' => 'سه‌شنبه',
-        'wed' => 'چهارشنبه',
-        'thu' => 'پنج‌شنبه',
-        'fri' => 'جمعه',
-        'sat' => 'شنبه',
         'weekend' => 'آخر هفته',
-        'work' => 'روزهای کاری',
+        'work' => 'روز کاری',
         'next' => 'روز بعد',
     ],
     'qrcode' => 'کد QR :attribute',
@@ -83,10 +76,10 @@ return [
     'unlimited' => 'نامحدود',
     'payment' => [
         'credit' => 'اعتبار',
-        'alipay' => 'پرداخت آلی‌پی',
+        'alipay' => 'علی‌پی',
         'qq' => 'کیف پول QQ',
-        'wechat' => 'پرداخت ویچت',
-        'crypto' => 'ارزهای دیجیتال',
+        'wechat' => 'پرداخت ویچت',
+        'crypto' => 'ارز دیجیتال',
         'manual' => 'پرداخت دستی',
         'status' => [
             'wait' => 'در انتظار پرداخت',
@@ -94,14 +87,14 @@ return [
     ],
     'order' => [
         'status' => [
-            'cancel' => 'لغو شد',
-            'complete' => 'کامل شد',
+            'canceled' => 'لغو شده',
+            'completed' => 'تکمیل شده',
             'prepaid' => 'پیش‌پرداخت',
-            'ongoing' => 'درحال استفاده',
+            'ongoing' => 'در حال استفاده',
             'review' => 'در انتظار بررسی',
         ],
     ],
-    'recommend' => 'توصیه شده',
+    'recommend' => 'توصیه',
     'advance' => 'پیشرفته',
     'action' => 'عملیات',
     'search' => 'جستجو',
@@ -110,41 +103,41 @@ return [
     'status' => [
         'attribute' => 'وضعیت',
         'inactive' => 'غیرفعال',
-        'disabled' => 'غیرفعال شده',
-        'banned' => 'مسدود',
+        'disabled' => 'غیرفعال',
+        'banned' => 'ممنوع',
         'normal' => 'عادی',
         'enabled' => 'فعال',
         'expire' => 'منقضی شده',
         'limited' => 'محدود',
-        'run_out' => 'اتمام حجم',
+        'run_out' => 'تمام شده',
         'unused' => 'استفاده نشده',
         'used' => 'استفاده شده',
-        'closed' => 'بسته شد',
-        'applying' => 'درحال بررسی',
+        'closed' => 'بسته شده',
+        'applying' => 'در حال درخواست',
         'withdrawn' => 'برداشت شده',
         'unwithdrawn' => 'برداشت نشده',
-        'reply' => 'پاسخ داده شد',
+        'reply' => 'پاسخ داده شده',
         'pending' => 'در انتظار',
-        'unknown' => 'نامشخص',
+        'unknown' => 'ناشناخته',
         'available' => 'در دسترس',
         'reject' => 'رد',
-        'rejected' => 'رد شد',
+        'rejected' => 'رد شده',
         'review' => 'در انتظار بررسی',
-        'reviewed' => 'بررسی شد',
-        'paid' => 'پرداخت شد',
-        'payment_pending' => 'پرداخت در انتظار',
-        'pass' => 'تایید',
+        'reviewed' => 'بررسی شده',
+        'paid' => 'پرداخت شده',
+        'payment_pending' => 'در انتظار پرداخت',
+        'pass' => 'قبول',
         'send_to_credit' => 'اضافه به اعتبار',
         'waiting_tobe_send' => 'در انتظار ارسال',
     ],
-    'stay_unchanged' => 'خالی بماند تا تغییر نکند',
-    'random_generate' => 'خالی بماند تا تصادفی تولید شود',
-    'request_failed' => 'درخواست ناموفق بود، لطفاً دوباره امتحان کنید',
+    'stay_unchanged' => 'خالی بگذارید تا تغییر نکند',
+    'random_generate' => 'خالی بگذارید تا به صورت تصادفی تولید شود',
+    'request_failed' => 'درخواست ناموفق بود، لطفاً دوباره تلاش کنید',
     'convert' => 'تبدیل',
     'import' => 'وارد کردن',
     'or' => 'یا',
     'more' => 'بیشتر',
     'to' => 'به',
     'to_be_send' => 'در انتظار ارسال',
-    'developing' => 'درحال توسعه! لطفاً منتظر بمانید',
+    'developing' => 'در حال توسعه! منتظر بمانید',
 ];

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

@@ -4,31 +4,31 @@ declare(strict_types=1);
 
 return [
     'forbidden' => [
-        'access' => 'آی‌پی یا پروکسی ناشناس شناسایی شد، دسترسی ممنوع',
+        'access' => 'دسترسی IP یا پروکسی ناشناخته شناسایی شد، دسترسی ممنوع',
         'bots' => 'دسترسی ربات شناسایی شد، دسترسی ممنوع',
-        'china' => 'آی‌پی یا پروکسی چین شناسایی شد، دسترسی ممنوع',
-        'oversea' => 'آی‌پی یا پروکسی خارجی شناسایی شد، دسترسی ممنوع',
+        'china' => 'دسترسی IP یا پروکسی چین شناسایی شد، دسترسی ممنوع',
+        'oversea' => 'دسترسی IP یا پروکسی خارج از کشور شناسایی شد، دسترسی ممنوع',
     ],
     'log' => 'لاگ',
-    'refresh' => 'بازخوانی',
-    'refresh_page' => 'لطفاً صفحه را بازخوانی کرده و دوباره امتحان کنید',
-    'report' => 'خطا حامل گزارشی بود:',
+    'refresh' => 'تازه‌سازی',
+    'refresh_page' => 'لطفاً صفحه را تازه‌سازی کنید و دوباره تلاش کنید',
+    'report' => 'خطا حاوی گزارشی بود: ',
     'safe_enter' => 'ورود امن',
-    'safe_code' => 'لطفاً کد امنیتی را وارد کنید',
+    'safe_code' => 'لطفاً کد ایمنی را وارد کنید',
     'title' => '⚠️ خطا رخ داد',
     'unsafe_enter' => 'ورود ناامن',
-    'visit' => 'لطفاً به آدرس زیر مراجعه کنید',
-    'whoops' => 'اوه!',
-    'get_ip' => 'دریافت اطلاعات آی‌پی با شکست مواجه شد',
+    'visit' => 'لطفاً مراجعه کنید به',
+    'whoops' => 'اوپس!',
+    'get_ip' => 'دریافت اطلاعات IP ناموفق بود',
     'subscribe' => [
-        'unknown' => 'لینک اشتراک نامعتبر! لطفاً لینک جدید دریافت کنید',
-        'sub_baned' => 'اشتراک مسدود شده است! برای جزئیات به وب‌سایت مراجعه کنید',
-        'user' => 'لینک اشتباه، حساب کاربری وجود ندارد!',
-        'user_disable' => 'حساب کاربری غیرفعال شده است! با پشتیبانی تماس بگیرید!',
-        'baned_until' => 'حساب کاربری تا :time مسدود شده است، لطفاً منتظر باز شدن بمانید!',
-        'out' => 'حجم تمام شده است! لطفاً حجم بیشتری خریداری کنید یا حجم را بازنشانی کنید!',
-        'expired' => 'حساب کاربری منقضی شده است! لطفاً خرید خود را تمدید کنید!',
-        'question' => 'مشکل در حساب کاربری! برای جزئیات به وب‌سایت مراجعه کنید',
-        'none' => 'هیچ گره در دسترسی نیست',
+        'unknown' => 'لینک اشتراک نامعتبر است! لطفاً لینک جدیدی دریافت کنید!',
+        'sub_banned' => 'اشتراک ممنوع شده! برای جزئیات به وب‌سایت مراجعه کنید',
+        'user' => 'URL نامعتبر است، حساب وجود ندارد!',
+        'user_disabled' => 'حساب غیرفعال شده است! با پشتیبانی تماس بگیرید!',
+        'banned_until' => 'حساب تا :time ممنوع شده، لطفاً برای باز شدن صبر کنید!',
+        'out' => 'داده تمام شده! لطفاً بیشتر خریداری کنید یا داده را بازنشانی کنید!',
+        'expired' => 'حساب منقضی شده! لطفاً اشتراک خود را تمدید کنید!',
+        'question' => 'مشکلات حساب؟! برای جزئیات به وب‌سایت مراجعه کنید',
+        'none' => 'هیچ گره‌ای در دسترس نیست',
     ],
 ];

+ 70 - 70
resources/lang/fa/model.php

@@ -8,34 +8,34 @@ return [
         'attribute' => 'کاربر',
         'nickname' => 'نام مستعار',
         'username' => 'نام کاربری',
-        'password' => 'گذرواژه',
-        'credit' => 'موجودی',
-        'invite_num' => 'دعوت‌نامه‌های موجود',
-        'reset_date' => 'تاریخ بازنشانی ترافیک',
+        'password' => 'رمز عبور',
+        'credit' => 'اعتبار',
+        'invite_num' => 'تعداد دعوت‌های موجود',
+        'reset_date' => 'تاریخ بازنشانی داده',
         'port' => 'پورت',
-        'traffic_used' => 'ترافیک مصرف شده',
+        'traffic_used' => 'داده استفاده شده',
         'service' => 'پروکسی',
         'group' => 'گروه',
         'account_status' => 'وضعیت حساب',
         'proxy_status' => 'وضعیت پروکسی',
         'expired_date' => 'تاریخ انقضا',
         'role' => 'نقش',
-        'wechat' => 'ویچت',
-        'qq' => 'کیوکیو',
+        'wechat' => 'ویچت',
+        'qq' => 'QQ',
         'remark' => 'یادداشت',
-        'uuid' => 'شناسه UUID',
-        'proxy_passwd' => 'گذرواژه پروکسی',
-        'proxy_method' => 'روش رمزنگاری',
-        'usable_traffic' => 'ترافیک مجاز',
-        'proxy_protocol' => 'پروتکل پروکسی',
-        'proxy_obfs' => 'ابهام‌زدایی',
-        'speed_limit' => 'محدوده سرعت',
+        'uuid' => 'VMess UUID',
+        'proxy_passwd' => 'رمز پروکسی',
+        'proxy_method' => 'رمزنگاری',
+        'usable_traffic' => 'مقدار داده مجاز',
+        'proxy_protocol' => 'پروتکل',
+        'proxy_obfs' => 'پنهان‌سازی',
+        'speed_limit' => 'محدودیت سرعت',
         'inviter' => 'دعوت‌کننده',
         'created_date' => 'تاریخ ثبت‌نام',
     ],
     'common' => [
-        'extend' => 'اطلاعات تکمیلی',
-        'sort' => 'ترتیب',
+        'extend' => 'اطلاعات گسترش یافته',
+        'sort' => 'مرتب‌سازی',
         'description' => 'توضیحات',
         'type' => 'نوع',
         'level' => 'سطح',
@@ -49,10 +49,10 @@ return [
         'code' => 'کد اشتراک',
         'req_times' => 'تعداد درخواست‌ها',
         'updated_at' => 'آخرین درخواست',
-        'ban_time' => 'زمان مسدودسازی',
-        'ban_desc' => 'دلیل مسدودسازی',
-        'req_ip' => 'آی‌پی درخواست',
-        'req_header' => 'هدر درخواست',
+        'ban_time' => 'زمان ممنوعیت',
+        'ban_desc' => 'دلیل ممنوعیت',
+        'req_ip' => 'IP درخواست',
+        'req_header' => 'هدر دسترسی',
     ],
     'oauth' => [
         'type' => 'کانال',
@@ -60,7 +60,7 @@ return [
     ],
     'user_group' => [
         'attribute' => 'گروه کاربری',
-        'name' => 'نام',
+        'name' => 'نام گروه',
         'nodes' => 'گره‌ها',
     ],
     'node' => [
@@ -68,40 +68,40 @@ return [
         'id' => 'شناسه گره',
         'name' => 'نام',
         'domain' => 'دامنه',
-        'static' => 'وضعیت آنلاین',
+        'static' => 'وضعیت زنده بودن',
         'online_user' => 'کاربران آنلاین',
-        'data_consume' => 'مصرف دیتا',
-        'data_rate' => 'ضریب دیتا',
+        'data_consume' => 'مصرف داده',
+        'data_rate' => 'نسبت داده',
         'ddns' => 'DDNS',
-        'ipv4' => 'آی‌پی ورژن 4',
-        'ipv6' => 'آی‌پی ورژن 6',
-        'push_port' => 'پورت پوش',
+        'ipv4' => 'IPv4',
+        'ipv6' => 'IPv6',
+        'push_port' => 'پورت ارسال',
         'rule_group' => 'گروه قوانین',
         'traffic_limit' => 'محدودیت سرعت',
-        'client_limit' => 'محدودیت دستگاه',
+        'client_limit' => 'محدودیت کاربر',
         'label' => 'برچسب',
         'country' => 'کشور',
         'udp' => 'UDP',
         'display' => 'نمایش و اشتراک',
-        'detection' => 'شناسایی مسدودسازی',
-        'method' => 'روش رمزنگاری',
+        'detection' => 'تشخیص مسدود شدن',
+        'method' => 'رمزنگاری',
         'protocol' => 'پروتکل',
         'protocol_param' => 'پارامتر پروتکل',
-        'obfs' => 'ابهام‌زدایی',
-        'obfs_param' => 'پارامتر ابهام‌زدایی',
+        'obfs' => 'پنهان‌سازی',
+        'obfs_param' => 'پارامتر پنهان‌سازی',
         'single' => 'پورت تکی',
-        'transfer' => 'ترانزیت',
+        'transfer' => 'رله',
         'service_port' => 'پورت سرویس',
-        'single_passwd' => 'گذرواژه [تک پورت]',
+        'single_passwd' => '[تکی] رمز عبور',
         'v2_alter_id' => 'شناسه جایگزین',
         'v2_net' => 'شبکه',
-        'v2_cover' => 'کاور',
+        'v2_cover' => 'پوشش',
         'v2_host' => 'میزبان',
         'v2_path' => 'مسیر | کلید',
         'v2_sni' => 'SNI',
         'v2_tls' => 'TLS',
         'v2_tls_provider' => 'پیکربندی TLS',
-        'relay_port' => 'پورت ترانزیت',
+        'relay_port' => 'پورت رله',
     ],
     'node_auth' => [
         'attribute' => 'احراز هویت گره',
@@ -109,7 +109,7 @@ return [
         'secret' => 'کلید معکوس',
     ],
     'node_cert' => [
-        'attribute' => 'گواهینامه',
+        'attribute' => 'گواهینامه دامنه',
         'domain' => 'دامنه',
         'key' => 'کلید',
         'pem' => 'PEM',
@@ -120,8 +120,8 @@ return [
     'order' => [
         'attribute' => 'سفارش',
         'id' => 'شناسه سفارش',
-        'original_price' => 'قیمت اصلی',
-        'price' => 'قیمت پرداختی',
+        'original_price' => 'قیمت اولیه',
+        'price' => 'قیمت واقعی',
         'pay_way' => 'روش پرداخت',
         'status' => 'وضعیت',
     ],
@@ -130,13 +130,13 @@ return [
         'name' => 'نام',
         'price' => 'قیمت',
         'category' => 'دسته‌بندی',
-        'renew' => 'قیمت تمدید ترافیک',
+        'renew' => 'قیمت بازنشانی داده',
         'user_limit' => 'محدودیت سرعت کاربر',
         'period' => 'دوره بازنشانی',
-        'traffic' => 'ترافیک',
-        'invite_num' => 'تعداد کدهای دعوت',
+        'traffic' => 'مقدار داده مجاز',
+        'invite_num' => 'دعوت‌نامه‌های اضافی',
         'limit_num' => 'محدودیت خرید',
-        'available_date' => 'مدت اعتبار',
+        'available_date' => 'دوره اعتبار',
         'hot' => 'پرفروش',
         'color' => 'رنگ',
         'logo' => 'لوگو',
@@ -168,44 +168,44 @@ return [
         'category' => 'دسته‌بندی',
         'language' => 'زبان',
         'logo' => 'کاور',
-        'created_at' => 'تاریخ انتشار',
-        'updated_at' => 'تاریخ به‌روزرسانی',
+        'created_at' => 'منتشر شده در',
+        'updated_at' => 'بروزرسانی شده در',
     ],
     'coupon' => [
         'attribute' => 'کوپن',
         'name' => 'نام',
         'sn' => 'کد',
-        'logo' => 'تصویر',
-        'value' => 'ارزش',
+        'logo' => 'لوگو',
+        'value' => 'مقدار',
         'priority' => 'اولویت',
-        'usable_times' => 'محدودیت استفاده',
-        'minimum' => 'حداقل خرید',
-        'used' => 'محدودیت فردی',
-        'levels' => 'محدود به سطوح',
-        'groups' => 'محدود به گروه‌ها',
-        'users_whitelist' => 'لیست سفید کاربران',
-        'users_blacklist' => 'لیست سیاه کاربران',
-        'services_whitelist' => 'لیست سفید کالاها',
-        'services_blacklist' => 'لیست سیاه کالاها',
-        'newbie' => 'منحصر به کاربران جدید',
+        'usable_times' => 'تعداد استفاده',
+        'minimum' => 'حداقل هزینه',
+        'used' => 'محدودیت شخصی',
+        'levels' => 'محدودیت سطح',
+        'groups' => 'محدودیت گروه',
+        'users_whitelist' => 'کاربران مجاز',
+        'users_blacklist' => 'کاربران ممنوع',
+        'services_whitelist' => 'کالاهای مجاز',
+        'services_blacklist' => 'کالاهای ممنوع',
+        'newbie' => 'فقط برای کاربران جدید',
         'num' => 'تعداد',
     ],
     'aff' => [
         'invitee' => 'خریدار',
-        'amount' => 'مبلغ خرید',
+        'amount' => 'مقدار سفارش',
         'commission' => 'کمیسیون',
-        'updated_at' => 'زمان پردازش',
-        'created_at' => 'زمان سفارش',
+        'updated_at' => 'پردازش شده در',
+        'created_at' => 'سفارش شده در',
     ],
     'referral' => [
-        'created_at' => 'زمان درخواست',
-        'user' => 'حساب درخواست‌کننده',
-        'amount' => 'مقدار درخواستی',
+        'created_at' => 'درخواست شده در',
+        'user' => 'درخواست کننده',
+        'amount' => 'مقدار',
         'id' => 'شناسه درخواست',
     ],
     'notification' => [
-        'address' => 'دریافت‌کننده',
-        'created_at' => 'زمان ارسال',
+        'address' => 'گیرنده',
+        'created_at' => 'ارسال شده در',
         'status' => 'وضعیت',
     ],
     'ip' => [
@@ -219,14 +219,14 @@ return [
         'log_time' => 'زمان ثبت',
     ],
     'user_data_modify' => [
-        'before' => 'قبلی',
-        'after' => 'بعدی',
+        'before' => 'قبل از تغییر',
+        'after' => 'بعد از تغییر',
         'created_at' => 'زمان تغییر',
     ],
     'user_credit' => [
-        'before' => 'قبلی',
-        'after' => 'بعدی',
-        'amount' => 'مقدار',
+        'before' => 'قبل از تغییر',
+        'after' => 'بعد از تغییر',
+        'amount' => 'مقدار تغییر',
         'created_at' => 'زمان تغییر',
     ],
 ];

+ 25 - 25
resources/lang/fa/notification.php

@@ -5,33 +5,33 @@ declare(strict_types=1);
 return [
     'attribute' => 'اعلان',
     'new' => 'شما :num پیام جدید دارید',
-    'empty' => 'شما هیچ پیام جدیدی ندارید',
-    'payment_received' => 'پرداخت دریافت شد، مبلغ: :amount. جزئیات سفارش را مشاهده کنید',
+    'empty' => 'شما در حال حاضر هیچ پیام جدیدی ندارید',
+    'payment_received' => 'پرداخت سفارش شما با مبلغ :amount با موفقیت انجام شد، لطفاً برای مشاهده جزئیات سفارش کلیک کنید',
     'account_expired' => 'یادآوری انقضای حساب',
-    'account_expired_content' => 'حساب شما :days روز دیگر منقضی می‌شود. لطفاً برای ادامه استفاده از خدمات ما، سریعاً تمدید کنید.',
-    'account_expired_blade' => 'حساب شما :days روز دیگر منقضی می‌شود، لطفاً سریعاً تمدید کنید',
-    'active_email' => 'لطفاً ظرف 30 دقیقه تایید کنید',
-    'close_ticket' => 'تیکت :id با عنوان :title بسته شد',
-    'view_web' => 'مشاهده وب‌سایت',
-    'view_ticket' => 'مشاهده این تیکت',
-    'new_ticket' => 'تیکت جدیدی با عنوان :title دریافت شد',
-    'reply_ticket' => 'پاسخ تیکت :title',
+    'account_expired_content' => 'حساب شما در :days روز آینده منقضی خواهد شد، لطفاً برای جلوگیری از هرگونه مشکل در استفاده به موقع تمدید کنید',
+    'account_expired_blade' => 'حساب شما در :days روز آینده منقضی خواهد شد، لطفاً به موقع تمدید کنید',
+    'active_email' => 'لطفاً در عرض 30 دقیقه تأیید را تکمیل کنید',
+    'close_ticket' => 'تیکت شماره :id با عنوان :title بسته شده است',
+    'view_web' => 'بازدید از وب‌سایت ما',
+    'view_ticket' => 'مشاهده وضعیت این تیکت',
+    'new_ticket' => 'تیکت جدید شما با عنوان :title دریافت شد، لطفاً برای مشاهده مراجعه کنید',
+    'reply_ticket' => 'پاسخ تیکت: :title',
     'ticket_content' => 'محتوای تیکت:',
-    'node_block' => 'اخطار مسدود شدن گره',
-    'node_offline' => 'اخطار آفلاین شدن گره',
-    'node_offline_content' => 'گره‌های غیرعادی زیر ممکن است آفلاین شده باشند:',
-    'block_report' => 'گزارش جزئیات مسدودسازی:',
-    'traffic_warning' => 'هشدار مصرف ترافیک',
-    'traffic_remain' => ':percent% از ترافیک شما مصرف شده است، لطفاً توجه کنید',
-    'traffic_tips' => 'لطفاً به تاریخ بازنشانی ترافیک توجه کنید، از ترافیک به طور منطقی استفاده کنید یا پس از تمام شدن آن شارژ کنید',
-    'verification_account' => 'تایید حساب کاربری',
-    'verification' => 'کد تایید شما:',
-    'verification_limit' => 'لطفاً ظرف :minutes دقیقه تایید کنید',
-    'data_anomaly' => 'اخطار کاربر با ترافیک غیرمعمول',
-    'data_anomaly_content' => 'کاربر :id طی 1 ساعت گذشته (آپلود: :upload | دانلود: :download | مجموع: :total)',
+    'node_block' => 'هشدار مسدود شدن گره',
+    'node_offline' => 'هشدار آفلاین بودن گره',
+    'node_offline_content' => 'گره‌های زیر غیرعادی هستند و ممکن است آفلاین باشند:',
+    'block_report' => 'گزارش مسدود شدن:',
+    'traffic_warning' => 'هشدار استفاده از داده',
+    'traffic_remain' => 'شما :percent% از داده خود را استفاده کرده‌اید، لطفاً توجه کنید',
+    'traffic_tips' => 'لطفاً به تاریخ بازنشانی داده توجه کنید و داده‌ها را به صورت منطقی استفاده کنید یا پس از اتمام، مجدداً شارژ کنید',
+    'verification_account' => 'تأیید حساب',
+    'verification' => 'کد تأیید شما:',
+    'verification_limit' => 'لطفاً در عرض :minutes دقیقه تأیید را تکمیل کنید',
+    'data_anomaly' => 'هشدار کاربر با داده غیرعادی',
+    'data_anomaly_content' => 'کاربر :id: [آپلود: :upload | دانلود: :download | مجموع: :total] در ساعت گذشته',
     'node' => [
-        'upload' => 'آپلود ترافیک',
-        'download' => 'دانلود ترافیک',
-        'total' => 'ترافیک کل',
+        'upload' => 'آپلود',
+        'download' => 'دانلود',
+        'total' => 'مجموع',
     ],
 ];

+ 122 - 122
resources/lang/fa/user.php

@@ -9,125 +9,125 @@ return [
         'level' => 'سطح حساب',
         'group' => 'گروه',
         'speed_limit' => 'محدودیت سرعت',
-        'remain' => 'ترافیک باقیمانده',
-        'time' => 'مدت زمان',
+        'remain' => 'داده باقیمانده',
+        'time' => 'مدت طرح',
         'last_login' => 'آخرین ورود',
-        'reset' => '{0} <code id="restTime">:days</code> روز دیگر ترافیک بازنشانی می‌شود|{1} :days روز دیگر ترافیک بازنشانی می‌شود |[2,*] :days روز دیگر ترافیک بازنشانی می‌شود',
-        'connect_password' => 'گذرواژه اتصال پروکسی',
+        'reset' => '{0} داده در <code id="restTime">:days</code> بازنشانی می‌شود |{1} :days روز تا بازنشانی داده باقی مانده است |[2,*] :days روز تا بازنشانی داده باقی مانده است',
+        'connect_password' => 'رمز اتصال پروکسی',
         'reason' => [
             'normal' => 'حساب عادی است',
-            'expired' => 'مدت اعتبار شما به پایان رسیده است',
-            'overused' => 'شما محدودیت ساعتی <code>:data</code> گیگابایت را رسیده‌اید<br/> :min دقیقه دیگر محدودیت برداشته می‌شود',
-            'traffic_exhausted' => 'ترافیک تمام شد',
-            'unknown' => 'خطای ناشناس. لطفاً ابتدا مرورگر خود را رفرش کنید، سپس برای رفع مشکل با مدیر تماس بگیرید',
+            'expired' => 'طرح شما منقضی شده است',
+            'overused' => 'شما از حد <code>:data</code> گیگابایت برای این دوره فراتر رفته‌اید<br/> محدودیت در <code id="banedTime">:min</code> دقیقه برداشته می‌شود',
+            'traffic_exhausted' => 'داده تمام شده است',
+            'unknown' => 'دلیل ناشناخته، لطفاً مرورگر را تازه‌سازی کنید! اگر مشکل ادامه داشت، با پشتیبانی تماس بگیرید.',
         ],
     ],
     'home' => [
         'attendance' => [
-            'attribute' => 'حضور و غیاب',
-            'disable' => 'غیرفعال',
-            'done' => 'قبلاً ثبت شده است، فردا دوباره بیایید!',
-            'success' => ':data ترافیک دریافت کردید',
-            'failed' => 'خطای سیستم',
+            'attribute' => 'ثبت حضور',
+            'disable' => 'ثبت حضور غیرفعال است',
+            'done' => 'شما قبلاً ثبت حضور کرده‌اید. فردا برگردید!',
+            'success' => 'شما :data داده دریافت کردید',
+            'failed' => 'خطای سیستم',
         ],
-        'traffic_logs' => 'ثبت ترافیک',
-        'announcement' => 'اعلان‌ها',
-        'wechat_push' => 'ارسال اعلان به ویچت',
+        'traffic_logs' => 'سوابق داده',
+        'announcement' => 'اعلانات',
+        'wechat_push' => 'اعلانات وی‌چت',
         'chat_group' => 'گروه چت',
-        'empty_announcement' => 'بدون اعلان',
+        'empty_announcement' => 'هیچ اعلانی وجود ندارد',
     ],
     'purchase_to_unlock' => 'خرید برای باز کردن',
-    'purchase_required' => 'برای کاربران رایگان غیرفعال است، لطفاً',
+    'purchase_required' => 'این ویژگی برای کاربران غیرپرداختی غیرفعال است. لطفاً',
     'attribute' => [
         'node' => 'گره',
-        'data' => 'ترافیک',
-        'ip' => 'آی‌پی',
-        'isp' => 'اینترنت',
-        'address' => 'موقعیت',
+        'data' => 'داده',
+        'ip' => 'آدرس IP',
+        'isp' => 'ISP',
+        'address' => 'مکان',
     ],
-    'purchase_promotion' => 'اکنون خدمات را خریداری کنید!',
+    'purchase_promotion' => 'همین حالا خدمات را خریداری کنید!',
     'menu' => [
-        'helps' => 'راهنما',
+        'help' => 'کمک',
         'home' => 'خانه',
         'invites' => 'دعوت',
-        'invoices' => 'صورتحساب',
+        'invoices' => 'فاکتور',
         'nodes' => 'گره‌ها',
-        'referrals' => 'ارجاع',
+        'promotion' => 'ارجاع',
         'shop' => 'فروشگاه',
         'profile' => 'پروفایل',
-        'tickets' => 'تیکت',
-        'admin_dashboard' => 'پنل مدیریت',
+        'tickets' => 'تیکت‌ها',
+        'admin_dashboard' => 'داشبورد',
     ],
-    'contact' => 'تماس با ما',
+    'contact' => 'تماس',
     'oauth' => [
         'bind_title' => 'اتصال حساب اجتماعی',
-        'not_bind' => 'اتصال نشده',
+        'not_bind' => 'متصل نشده',
         'bind' => 'اتصال',
         'rebind' => 'اتصال مجدد',
-        'unbind' => 'جدا کردن',
+        'unbind' => 'لغو اتصال',
     ],
     'coupon' => [
         'discount' => 'تخفیف',
         'error' => [
-            'unknown' => 'کد تخفیف نامعتبر',
-            'used' => 'کد تخفیف استفاده شده است',
-            'expired' => 'کد تخفیف منقضی شده است',
-            'run_out' => 'کد تخفیف تمام شده است',
-            'inactive' => 'کد تخفیف غیرفعال است',
-            'wait' => ':time فعال می‌شود، لطفاً منتظر بمانید!',
-            'unmet' => 'شرایط برآورده نشده است',
+            'unknown' => 'کوپن نامعتبر',
+            'used' => 'کوپن قبلاً استفاده شده',
+            'expired' => 'کوپن منقضی شده',
+            'run_out' => 'کوپن تمام شده',
+            'inactive' => 'کوپن فعال نیست',
+            'wait' => 'در :time فعال خواهد شد، لطفاً صبر کنید!',
+            'unmet' => 'شرایط استفاده رعایت نشده',
             'minimum' => 'حداقل مبلغ :amount است',
-            'overused' => 'فقط :times بار قابل استفاده است',
-            'users' => 'حساب واجد شرایط نیست',
-            'services' => 'کالا واجد شرایط نیست، شرایط را بررسی کنید',
+            'overused' => 'فقط می‌توان :times بار استفاده کرد',
+            'users' => 'حساب واجد شرایط برای تبلیغ نیست',
+            'services' => 'کالاها واجد شرایط تخفیف نیستند، شرایط تبلیغ را بررسی کنید',
         ],
     ],
-    'error_response' => 'خطا رخ داده است، لطفاً بعداً دوباره امتحان کنید.',
+    'error_response' => 'خطایی رخ داده است، لطفاً بعداً دوباره امتحان کنید.',
     'invite' => [
         'attribute' => 'کد دعوت',
         'counts' => 'مجموع <code>:num</code> کد دعوت',
-        'tips' => '<strong>:num</strong> دعوت باقی مانده است، کدهای دعوت :days روز پس از ایجاد منقضی می‌شوند',
-        'logs' => 'ثبت دعوت',
-        'promotion' => 'هر دو هنگام ثبت‌نام از طریق کد شما :traffic ترافیک دریافت می‌کنند؛ شما :referral_percent% کمیسیون دریافت می‌کنید هنگامی که دعوت‌شده خرید می‌کند',
-        'generate_failed' => 'ناموفق: سقف تعداد رسیده شده است',
+        'tips' => '<strong>:num</strong> دعوت باقی مانده، کدها :days روز پس از ایجاد منقضی می‌شوند',
+        'logs' => 'سوابق دعوت',
+        'promotion' => 'هم شما و هم دعوت‌شونده <mark>:traffic</mark> داده دریافت خواهید کرد وقتی که با کد شما ثبت نام کنند؛ شما <mark>:referral_percent%</mark> کمیسیون دریافت خواهید کرد وقتی که آنها خرید کنند.',
+        'generate_failed' => 'تولید ناموفق: سهمیه تمام شده',
     ],
     'reset_data' => [
-        'action' => 'بازنشانی ترافیک',
-        'cost' => 'هزینه <code>:amount</code>',
-        'cost_tips' => 'بازنشانی :amount کسر می‌کند!',
-        'lack' => 'موجودی کم است، لطفاً شارژ کنید',
-        'logs' => 'ترافیک کاربر بازنشانی شد',
-        'success' => 'بازنشانی موفقیت‌آمیز بود',
+        'action' => 'بازنشانی داده',
+        'cost' => 'هزینه: <code>:amount</code>',
+        'cost_tips' => 'بازنشانی داده :amount کسر خواهد کرد!',
+        'insufficient' => 'موجودی کافی نیست، لطفاً موجودی خود را شارژ کنید',
+        'logs' => 'کاربر داده را بازنشانی کرد',
+        'success' => 'بازنشانی موفقیت‌آمیز',
     ],
     'referral' => [
         'link' => 'لینک ارجاع',
-        'total' => 'جمع :amount (:total بار)، بیش از :money قابل برداشت است',
-        'logs' => 'ثبت کمیسیون',
-        'failed' => 'ناموفق',
-        'success' => 'موفق',
+        'total' => 'مجموع کمیسیون: :amount (:total بار)، می‌توانید پس از رسیدن به :money برداشت کنید',
+        'logs' => 'سوابق کمیسیون',
+        'failed' => 'درخواست ناموفق',
+        'success' => 'درخواست موفق',
         'msg' => [
-            'account' => 'حساب منقضی شده است، لطفاً ابتدا خرید کنید',
-            'applied' => 'درخواست موجود است، منتظر پردازش بمانید',
-            'unfulfilled' => ':amount برای برداشت، ادامه دهید!',
-            'wait' => 'در انتظار تأیید مدیر',
-            'error' => 'خطا در ایجاد سفارش، دوباره امتحان کنید یا با مدیر تماس بگیرید',
+            'account' => 'حساب منقضی شده، لطفاً ابتدا یک طرح خریداری کنید',
+            'applied' => 'درخواست موجود است، لطفاً منتظر پردازش باشید',
+            'unfulfilled' => 'نیاز به :amount برای برداشت، ادامه بده!',
+            'wait' => 'لطفاً منتظر تأیید مدیر باشید',
+            'error' => 'خطا در ایجاد سفارش، بعداً دوباره امتحان کنید یا با پشتیبانی تماس بگیرید',
         ],
     ],
     'inviter' => 'دعوت‌کننده',
-    'invitee' => 'دعوت‌شده',
+    'invitee' => 'دعوت‌شونده',
     'registered_at' => 'تاریخ ثبت‌نام',
     'bought_at' => 'تاریخ خرید',
-    'payment_method' => 'پرداخت',
+    'payment_method' => 'روش پرداخت',
     'pay' => 'پرداخت',
-    'input_coupon' => 'وارد کردن کد تخفیف',
+    'input_coupon' => 'کد کوپن را وارد کنید',
     'recharge' => 'شارژ',
     'recharge_credit' => 'شارژ اعتبار',
-    'recharging' => 'درحال شارژ...',
+    'recharging' => 'در حال شارژ...',
     'withdraw_commission' => 'برداشت کمیسیون',
     'withdraw_at' => 'تاریخ برداشت',
-    'withdraw_logs' => 'ثبت برداشت‌ها',
+    'withdraw_logs' => 'سوابق برداشت',
     'withdraw' => 'برداشت',
-    'scan_qrcode' => 'اسکن کد QR در کلاینت',
+    'scan_qrcode' => 'با استفاده از کلاینت کد QR را اسکن کنید',
     'shop' => [
         'hot' => 'داغ',
         'limited' => 'محدود',
@@ -135,84 +135,84 @@ return [
         'change_amount_help' => 'مبلغ شارژ را وارد کنید',
         'buy' => 'خرید',
         'description' => 'توضیحات',
-        'service' => 'سرویس',
-        'pay_credit' => 'اعتبار',
+        'service' => 'خدمات',
+        'pay_credit' => 'پرداخت با اعتبار',
         'pay_online' => 'پرداخت آنلاین',
         'price' => 'قیمت',
         'quantity' => 'تعداد',
         'subtotal' => 'جمع کل',
-        'total' => 'جمع',
-        'conflict' => 'تداخل',
-        'conflict_tips' => '<p>خرید کنونی به صورت <code>پیش‌پرداخت</code> خواهد بود</p><ol><li>پس از انقضای بسته فعلی به طور خودکار فعال می‌شود!</li><li>پس از پرداخت می‌توانید به طور دستی فعال کنید</li></ol>',
-        'call4help' => 'لطفاً با پشتیبان تماس بگیرید',
+        'total' => 'مجموع',
+        'conflict' => 'تضاد',
+        'conflict_tips' => '<p>خرید فعلی به عنوان <code>طرح پیش پرداخت</code> تنظیم خواهد شد</p><ol><li>طرح پیش پرداخت پس از انقضای طرح فعلی به طور خودکار فعال می‌شود</li><li>شما می‌توانید پس از پرداخت آن را به صورت دستی فعال کنید</li></ol>',
+        'call4help' => 'اگر سوالی دارید با پشتیبانی تماس بگیرید',
     ],
     'service' => [
-        'node_count' => ':num گره باکیفیت',
-        'country_count' => 'پوشش :num کشور',
-        'unlimited' => 'نامحدود',
+        'node_count' => '<code>:num</code> گره با کیفیت بالا',
+        'country_count' => 'پوشش <code>:num</code> کشور یا منطقه',
+        'unlimited' => 'بدون محدودیت سرعت',
     ],
     'payment' => [
-        'error' => 'مبلغ شارژ نامعتبر است',
-        'creating' => 'درحال ایجاد پرداخت...',
-        'redirect_stripe' => 'انتقال به استرایپ',
-        'qrcode_tips' => 'اسکن با <strong class="red-600">:software</strong>',
-        'close_tips' => 'لطفاً ظرف <code>:minutes دقیقه</code> تکمیل کنید وگرنه سفارش بسته می‌شود',
-        'mobile_tips' => '<strong>موبایل:</strong> نگه داشتن طولانی روی کد QR -> ذخیره تصویر -> باز کردن برنامه پرداخت -> اسکن تصویر برای پرداخت',
+        'error' => 'مبلغ شارژ نامعتبر',
+        'creating' => 'در حال ایجاد پرداخت...',
+        'redirect_stripe' => 'انتقال به صفحه پرداخت Stripe',
+        'qrcode_tips' => 'لطفاً با <strong class="red-600">:software</strong> اسکن کنید',
+        'close_tips' => 'پرداخت را در عرض <code>:minutes</code> دقیقه کامل کنید، در غیر این صورت سفارش به‌طور خودکار بسته می‌شود',
+        'mobile_tips' => '<strong>کاربران موبایل:</strong> کد QR را فشار طولانی دهید -> تصویر را ذخیره کنید -> برنامه پرداخت را باز کنید -> تصویر را برای پرداخت اسکن کنید',
     ],
     'invoice' => [
         'attribute' => 'سفارش',
-        'detail' => 'جزئیات',
-        'amount' => 'مبلغ',
-        'active_prepaid_question' => 'فعال‌سازی پیش‌پرداخت از پیش؟',
-        'active_prepaid_tips' => 'پس از فعال‌سازی:<br>- بسته فعلی بلافاصله منقضی می‌شود!<br>- تاریخ انقضا از امروز محاسبه می‌شود!',
+        'detail' => 'جزئیات سفارش',
+        'amount' => 'مقدار',
+        'active_prepaid_question' => 'فعال سازی بسته پیش پرداخت زودتر؟',
+        'active_prepaid_tips' => 'پس از فعال‌سازی:<br>طرح فعلی شما بلافاصله منقضی می‌شود<br>تاریخ انقضای طرح جدید از امروز محاسبه می‌شود',
     ],
     'node' => [
         'info' => 'اطلاعات پیکربندی',
         'setting' => 'تنظیمات پروکسی',
-        'unstable' => 'خط ناپایدار/در حال نگهداری',
-        'rate' => ':ratio برابر مصرف ترافیک',
+        'unstable' => 'ناپایدار/در حال نگهداری',
+        'rate' => ':ratio برابر مصرف داده',
     ],
     'subscribe' => [
         'link' => 'لینک اشتراک',
-        'tips' => 'هشدار: این لینک اشتراک تنها برای استفاده شخصی است، لطفاً آن را به اشتراک نگذارید تا از شناسایی ترافیک غیرمعمول و مسدودسازی جلوگیری شود.',
-        'exchange_warning' => 'تغییر آدرس اشتراک منجر می‌شود به:\n1. غیرفعال شدن فوری آدرس قبلی\n2. تغییر گذرواژه اتصال',
+        'tips' => 'هشدار: این لینک فقط برای استفاده شخصی است. آن را به اشتراک نگذارید، در غیر این صورت حساب شما به دلیل استفاده غیرعادی مسدود می‌شود.',
+        'exchange_warning' => 'تغییر لینک اشتراک باعث می‌شود:\n1. لینک فعلی بلافاصله لغو شود\n2. رمز اتصال تغییر کند',
         'custom' => 'اشتراک سفارشی',
-        'ss_only' => 'فقط SS',
-        'ssr_only' => 'فقط SSR (شامل SS)',
-        'v2ray_only' => 'فقط V2Ray',
-        'trojan_only' => 'فقط Trojan',
-        'error' => 'خطا در تغییر آدرس اشتراک',
+        'ss_only' => 'فقط اشتراک SS',
+        'ssr_only' => 'فقط اشتراک SSR (شامل SS)',
+        'v2ray_only' => 'فقط اشتراک V2Ray',
+        'trojan_only' => 'فقط اشتراک Trojan',
+        'error' => 'خطا در تغییر لینک اشتراک',
         'info' => [
-            'title' => 'خلاصه حساب [غیر بلادرنگ]',
-            'upload' => 'آپلود ترافیک',
-            'download' => 'دانلود ترافیک',
-            'total' => 'ترافیک بسته',
+            'title' => 'خلاصه حساب [غیر زمان واقعی]',
+            'upload' => 'آپلود',
+            'download' => 'دانلود',
+            'total' => 'داده طرح',
         ],
     ],
     'ticket' => [
         'attribute' => 'تیکت',
-        'submit_tips' => 'تایید ارسال تیکت؟',
-        'reply_confirm' => 'تایید پاسخ تیکت؟',
-        'close_tips' => 'تایید بستن این تیکت؟',
+        'submit_tips' => 'تأیید ارسال تیکت؟',
+        'reply_confirm' => 'تأیید پاسخ به تیکت؟',
+        'close_tips' => 'تأیید بستن تیکت؟',
         'close' => 'بستن تیکت',
-        'failed_closed' => 'خطا: این تیکت قبلاً بسته شده است',
-        'reply_placeholder' => 'چیزی بگویید...',
+        'failed_closed' => 'خطا: قبلاً بسته شده است',
+        'reply_placeholder' => 'چیزی بنویسید...',
         'reply' => 'پاسخ',
-        'close_msg' => 'تیکت: شناسه :id توسط کاربر بسته شد',
-        'title_placeholder' => 'مشکل خود را مختصراً توضیح دهید',
-        'content_placeholder' => 'مشکل خود را به طور مفصل توضیح دهید تا بتوانیم به سرعت به شما کمک کنیم',
+        'close_msg' => 'تیکت ID :id توسط کاربر بسته شد',
+        'title_placeholder' => 'به طور خلاصه مشکل خود را توضیح دهید',
+        'content_placeholder' => 'توضیحات دقیق مشکل خود را ارائه دهید تا ما بتوانیم بهتر به شما کمک کنیم',
         'new' => 'ایجاد تیکت جدید',
-        'working_hour' => 'ساعات کاری',
+        'service_hours' => 'ساعات خدمات مشتری',
         'online_hour' => 'ساعات آنلاین',
-        'service_tips' => 'لطفاً تنها از یک روش تماس استفاده کنید! درخواست‌های مکرر باعث تاخیر در پاسخ می‌شود',
-        'error' => 'خطای ناشناخته! لطفاً به مدیر اطلاع دهید',
+        'service_tips' => 'لطفاً فقط از <code>یک</code> روش تماس برای تماس با پشتیبانی استفاده کنید! درخواست‌های مکرر زمان پاسخگویی را به تأخیر می‌اندازد.',
+        'error' => 'خطای ناشناخته! لطفاً با پشتیبانی تماس بگیرید',
     ],
     'traffic_logs' => [
-        '24hours' => 'مصرف امروز',
-        '30days' => 'مصرف این ماه',
-        'tips' => 'توجه: آمار ترافیک با تاخیر به‌روزرسانی می‌شود. روزانه در روز بعد، ساعتی در ساعت بعد.',
+        'hourly' => 'مصرف داده امروز',
+        'daily' => 'مصرف داده این ماه',
+        'tips' => 'توجه: به‌روزرسانی آمار داده‌ها با تأخیر انجام می‌شود.',
     ],
-    'client' => 'کلاینت',
+    'clients' => 'کلاینت‌ها',
     'tutorials' => 'آموزش‌ها',
     'current_role' => 'نقش فعلی به عنوان',
     'knowledge' => [
@@ -220,17 +220,17 @@ return [
         'basic' => 'پایه',
     ],
     'manual' => [
-        'red_packet' => 'دریافت پاکت قرمز آلی‌پی',
-        'hint' => 'پس از اسکن کد، تا [ارسال] ادامه دهید تا پرداخت کامل شود!!!',
-        'step_1' => 'توجه',
-        'step_1_title' => 'چگونه پرداخت دستی انجام دهیم',
+        'red_packet' => 'بسته قرمز Alipay',
+        'hint' => 'پس از اسکن کد QR، ادامه دهید و روی [بعدی] کلیک کنید تا زمانی که روی [ارسال] کلیک کنید تا پرداخت تکمیل شود!',
+        'step_1' => 'توجهات',
+        'step_1_title' => 'چگونه به صورت دستی پرداخت کنیم',
         'step_2' => 'پرداخت',
         'step_2_title' => 'دریافت کد QR و پرداخت',
         'step_3' => 'تکمیل',
-        'step_3_title' => 'در انتظار تایید دستی پرداخت',
-        'remark' => 'توضیح حساب',
-        'remark_content' => 'حساب ورود خود را وارد کنید تا در بررسی دستی تطبیق داده شود!',
-        'payment_hint' => 'لطفاً مبلغ دقیق را پرداخت کنید (اضافه‌پرداختی عودت داده نمی‌شود، کم‌پرداختی باید جبران شود)',
+        'step_3_title' => 'منتظر تأیید دستی باشید',
+        'remark' => 'یادداشت حساب',
+        'remark_content' => 'لطفاً نام کاربری حساب خود را برای تأیید دقیق دستی ارائه دهید',
+        'payment_hint' => 'لطفاً مبلغ دقیق را پرداخت کنید (بازپرداخت برای پرداخت اضافی وجود ندارد، برای پرداخت کمتر باید شارژ کنید)',
         'pre' => 'قبلی',
         'next' => 'بعدی',
     ],

+ 49 - 0
resources/lang/fa/validation.php

@@ -143,37 +143,62 @@ return [
     'uuid' => ':Attribute باید یک UUID معتبر باشد.',
     'attributes' => [
         'address' => 'نشانی',
+        'affiliate_url' => 'URL وابسته',
         'age' => 'سن',
         'amount' => 'مبلغ',
+        'announcement' => 'اعلامیه',
         'area' => 'منطقه',
+        'audience_prize' => 'جایزه مخاطب',
         'available' => 'موجود',
         'birthday' => 'تاریخ تولد',
         'body' => 'بدن',
         'city' => 'شهر',
+        'compilation' => 'تلفیقی',
+        'concept' => 'مفهوم',
+        'conditions' => 'شرایط',
         'content' => 'محتوا',
         'country' => 'کشور',
+        'cover' => 'پوشش',
         'created_at' => 'ایجاد شده در',
         'creator' => 'سازنده',
+        'currency' => 'واحد پول',
         'current_password' => 'رمزعبور فعلی',
+        'customer' => 'مشتری',
         'date' => 'تاریخ',
         'date_of_birth' => 'تاریخ تولد',
+        'dates' => 'تاریخ',
         'day' => 'روز',
         'deleted_at' => 'حذف شده در',
         'description' => 'توضیحات',
+        'display_type' => 'نوع نمایش',
         'district' => 'ناحیه',
         'duration' => 'مدت',
         'email' => 'ایمیل',
         'excerpt' => 'گزیده مطلب',
         'filter' => 'فیلتر',
+        'finished_at' => 'به پایان رسید در',
         'first_name' => 'نام',
         'gender' => 'جنسیت',
+        'grand_prize' => 'جایزه بزرگ',
         'group' => 'گروه',
         'hour' => 'ساعت',
         'image' => 'تصویر',
+        'image_desktop' => 'تصویر دسکتاپ',
+        'image_main' => 'تصویر اصلی',
+        'image_mobile' => 'تصویر موبایل',
+        'images' => 'تصاویر',
+        'is_audience_winner' => 'برنده مخاطب است',
+        'is_hidden' => 'پنهان است',
+        'is_subscribed' => 'مشترک شده است',
+        'is_visible' => 'قابل مشاهده است',
+        'is_winner' => 'برنده است',
+        'items' => 'موارد',
+        'key' => 'کلید',
         'last_name' => 'نام خانوادگی',
         'lesson' => 'درس',
         'line_address_1' => 'آدرس 1',
         'line_address_2' => 'آدرس 2',
+        'login' => 'وارد شدن',
         'message' => 'پیام',
         'middle_name' => 'نام وسط',
         'minute' => 'دقیقه',
@@ -186,22 +211,43 @@ return [
         'password_confirmation' => 'تکرار رمز عبور',
         'phone' => 'شماره ثابت',
         'photo' => 'تصویر',
+        'portfolio' => 'نمونه کارها',
         'postal_code' => 'کد پستی',
+        'preview' => 'پیش نمایش',
         'price' => 'قیمت',
+        'product_id' => 'شناسه محصول',
+        'product_uid' => 'UID محصول',
+        'product_uuid' => 'UUID محصول',
+        'promo_code' => 'کد تبلیغاتی',
         'province' => 'استان',
+        'quantity' => 'تعداد',
+        'reason' => 'دلیل',
         'recaptcha_response_field' => 'فیلد جواب ریکپچا',
+        'referee' => 'داور',
+        'referees' => 'داوران',
+        'reject_reason' => 'دلیل را رد کنید',
         'remember' => 'به خاطر سپردن',
         'restored_at' => 'بازیابی شده در',
         'result_text_under_image' => 'متن نتیجه زیر تصویر',
         'role' => 'نقش',
+        'rule' => 'قانون',
+        'rules' => 'قوانین',
         'second' => 'ثانیه',
         'sex' => 'جنسیت',
+        'shipment' => 'حمل و نقل',
         'short_text' => 'متن کوتاه',
         'size' => 'اندازه',
+        'skills' => 'مهارت ها',
+        'slug' => 'حلزون حرکت کردن',
+        'specialization' => 'تخصص',
+        'started_at' => 'آغاز شده در',
         'state' => 'استان',
+        'status' => 'وضعیت',
         'street' => 'خیابان',
         'student' => 'دانش آموز',
         'subject' => 'موضوع',
+        'tag' => 'برچسب زدن',
+        'tags' => 'برچسب ها',
         'teacher' => 'معلم',
         'terms' => 'شرایط',
         'test_description' => 'شرح آزمون',
@@ -210,8 +256,11 @@ return [
         'text' => 'متن',
         'time' => 'زمان',
         'title' => 'عنوان',
+        'type' => 'نوع',
         'updated_at' => 'بروزشده در',
+        'user' => 'کاربر',
         'username' => 'نام کاربری',
+        'value' => 'ارزش',
         'year' => 'سال',
     ],
 ];

+ 129 - 56
resources/lang/ja.json

@@ -1,57 +1,130 @@
 {
-    "(and :count more error)": "(その他、:countエラーあり)",
-    "(and :count more errors)": "(その他、:countエラーあり)",
-    "All rights reserved.": "All rights reserved.",
-    "Forbidden": "禁止されています",
-    "Go to page :page": ":Pageページへ",
-    "Hello!": "こんにちは",
-    "If you did not create an account, no further action is required.": "アカウント作成にお心当たりがない場合は、このメールを無視してください。",
-    "If you did not request a password reset, no further action is required.": "パスワード再設定のリクエストにお心当たりがない場合は、このメールを無視してください。",
-    "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "\":actionText\"ボタンがクリックできない場合は、以下のURLに直接アクセスしてください。",
-    "Invalid JSON was returned from the route.": "無効な JSON がルートから返されました。",
-    "Login": "ログイン",
-    "Logout": "ログアウト",
-    "Not Found": "見つかりません",
-    "of": "の",
-    "Page Expired": "ページが無効です",
-    "Pagination Navigation": "ページネーション",
-    "Payment Required": "お支払いが必要",
-    "Please click the button below to verify your email address.": "メールアドレスを確認するには、以下のボタンをクリックしてください。",
-    "Regards": "よろしくお願いします",
-    "Register": "アカウント作成",
-    "Reset Password": "パスワード再設定",
-    "Reset Password Notification": "パスワード再設定のお知らせ",
-    "results": "結果",
-    "Server Error": "サーバーエラー",
-    "Service Unavailable": "サービスは利用できません",
-    "Showing": "表示中",
-    "The given data was invalid.": "指定されたデータは無効でした。",
-    "The response is not a streamed response.": "応答はストリーミング応答ではありません。",
-    "The response is not a view.": "応答はビューではありません。",
-    "This password reset link will expire in :count minutes.": "このパスワード再設定リンクの有効期限は:count分です。",
-    "to": "に",
-    "Toggle navigation": "ナビゲーション切替",
-    "Too Many Requests": "リクエストが多すぎます",
-    "Unauthorized": "認証が必要です",
-    "Verify Email Address": "メールアドレスの確認",
-    "Whoops!": "おっと!",
-    "You are receiving this email because we received a password reset request for your account.": "パスワード再設定のリクエストを受け付けました。",
-    "----「:job」Completed, Used :time seconds ----": "----「:job」完了, 所要時間 :time 秒 ----",
-    "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[自動タスク] サービスをブロック: 1時間以内にトラフィック異常あり",
-    "[Auto Task] Blocked service: Run out of traffic": "[自動タスク] サービスをブロック: トラフィック枯渇",
-    "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[自動タスク] サブスクリプションをブロック: 24時間以内に異常リクエストあり",
-    "[Daily Task] Account Expiration: Block Login & Clear Account": "[毎日のタスク] アカウント有効期限切れ: ログイン禁止及びアカウントクリア",
-    "[Daily Task] Account Expiration: Stop Service": "[毎日のタスク] アカウント有効期限切れ: サービス停止",
-    "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[毎日のタスク] アカウントトラフィックリセット, 次のリセット日: :date",
-    "[Service Timer] Service Expiration": "[サービスタイマー] サービス有効期限切れ",
-    "Daily Data Usage Report": "毎日のデータ使用レポート",
-    "Invoice Detail": "請求書の詳細",
-    "Payment for #:sn has been received! Total amount: :amount.": "ご注文を支払うことに成功しました。合計金額は :amountです。",
-    "Payment Received": "請求書の支払いが完了しました",
-    "Subscription link receive abnormal access and banned by the system": "自動アクセス例外を購読する",
-    "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "ご登録ありがとうございます! メールアドレスを確認するため、あなたのメールボックスに送信リンクをクリックしてあなたのメールを送信してください。もしメールが届かない場合は再度メールを送信してください。",
-    "Verify Your Email Address": "メールアドレスの確認",
-    "You have not responded this ticket in :num hours, System has closed your ticket.": "超:num以上返信のチケットは報告されていません。自動的にチケットのプロセスを停止しました。",
-    "You must have a valid subscription to view the content in this area!": "この地域のコンテンツを表示するには、利用可能なプランが必要です。",
-    "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "購読は無効になっています。回復するには管理者に連絡してください。"
-}
+  "(and :count more error)": "(その他、:countエラーあり)",
+  "(and :count more errors)": "(その他、:countエラーあり)",
+  "----「:job」Completed, Used :time seconds ----": "----「:job」完了、所要時間 :time 秒 ----",
+  "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[自動タスク] サービスがブロックされました:1時間以内に異常なトラフィックが発生",
+  "[Auto Task] Blocked service: Run out of traffic": "[自動タスク] サービスがブロックされました:トラフィックが使い切られました",
+  "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[自動タスク] サブスクリプションがブロックされました:24時間以内に異常なリクエストが発生",
+  "[Auto Task] Unblocked Service: Account ban expired": "[自動タスク] サービスが解除されました:アカウントの禁止期間が終了",
+  "[Auto Task] Unblocked Service: Account has available data traffic": "[自動タスク] サービスが解除されました:アカウントに利用可能なデータトラフィックがあります",
+  "[Daily Task] Account Expiration: Block Login & Clear Account": "[日次タスク] アカウントが期限切れ:ログインをブロックし、アカウントデータをクリア",
+  "[Daily Task] Account Expiration: Stop Service": "[日次タスク] アカウントが期限切れ:サービスを停止",
+  "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[日次タスク] アカウントトラフィックをリセット、次のリセット日::date",
+  "[Service Timer] Service Expiration": "[サービスタイマー] サービスが期限切れ",
+  "A Timeout Occurred": "タイムアウト発生",
+  "Accepted": "承認済",
+  "All rights reserved.": "全著作権所有。",
+  "Already Reported": "報告済",
+  "Bad Gateway": "不正なゲートウェイ",
+  "Bad Request": "不正なリクエスト",
+  "Bandwidth Limit Exceeded": "帯域幅の制限を超過",
+  "Client Closed Request": "クライアントによるリクエストの終了",
+  "Conflict": "競合",
+  "Connection Closed Without Response": "応答なしで接続が閉じられました",
+  "Connection Timed Out": "接続がタイムアウト",
+  "Continue": "継続",
+  "Created": "作成済",
+  "Daily Data Usage Report": "日次データ使用報告",
+  "Expectation Failed": "指定された要件を満たしていません",
+  "Failed Dependency": "失敗した依存関係",
+  "Forbidden": "禁止されています",
+  "Found": "発見",
+  "Gateway Timeout": "ゲートウェイのタイムアウト",
+  "Go to page :page": ":Pageページへ",
+  "Gone": "消滅",
+  "Hello!": "こんにちは",
+  "HTTP Version Not Supported": "サポートしていないHTTPバージョン",
+  "I'm a teapot": "私はティーポットです",
+  "If you did not create an account, no further action is required.": "アカウント作成にお心当たりがない場合は、このメールを無視してください。",
+  "If you did not request a password reset, no further action is required.": "パスワード再設定のリクエストにお心当たりがない場合は、このメールを無視してください。",
+  "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "\":actionText\"ボタンがクリックできない場合は、以下のURLに直接アクセスしてください。",
+  "IM Used": "IM 使用済み",
+  "Insufficient Storage": "ストレージ不足",
+  "Internal Server Error": "内部サーバーエラー",
+  "Invalid JSON was returned from the route.": "無効な JSON がルートから返されました。",
+  "Invalid SSL Certificate": "無効なSSL証明書",
+  "Invoice Detail": "請求書の詳細",
+  "Length Required": "長さが必要",
+  "Locked": "ロック済",
+  "Login": "ログイン",
+  "Logout": "ログアウト",
+  "Loop Detected": "ループを検出",
+  "Maintenance Mode": "メンテナンス中",
+  "Method Not Allowed": "未許可のメソッド",
+  "Misdirected Request": "誤ったリクエスト",
+  "Moved Permanently": "恒久的に移動",
+  "Multi-Status": "マルチステータス",
+  "Multiple Choices": "複数の選択肢",
+  "Network Authentication Required": "ネットワーク認証が必要",
+  "Network Connect Timeout Error": "ネットワーク接続のタイムアウトエラー",
+  "Network Read Timeout Error": "ネットワーク読み取りのタイムアウトエラー",
+  "No Content": "コンテンツなし",
+  "Non-Authoritative Information": "信頼できない情報",
+  "Not Acceptable": "受付不可",
+  "Not Extended": "拡張なし",
+  "Not Found": "見つかりません",
+  "Not Implemented": "未実装",
+  "Not Modified": "未変更",
+  "of": "の",
+  "OK": "成功",
+  "Origin Is Unreachable": "オリジンに到達できません",
+  "Page Expired": "ページが無効です",
+  "Pagination Navigation": "ページネーション",
+  "Partial Content": "部分的なコンテンツ",
+  "Payload Too Large": "ペイロードが大きすぎます",
+  "Payment for #:sn has been received! Total amount: :amount.": "#:sn の支払いが受領されました!合計金額::amount。",
+  "Payment Received": "支払いが受領されました",
+  "Payment Required": "お支払いが必要",
+  "Permanent Redirect": "恒久的なリダイレクト",
+  "Please click the button below to verify your email address.": "メールアドレスを確認するには、以下のボタンをクリックしてください。",
+  "Precondition Failed": "前提条件が失敗",
+  "Precondition Required": "事前条件が必要",
+  "Processing": "処理中",
+  "Proxy Authentication Required": "プロキシ認証が必要",
+  "Railgun Error": "レールガンエラー",
+  "Range Not Satisfiable": "範囲外のレンジ",
+  "Regards": "よろしくお願いします",
+  "Register": "アカウント作成",
+  "Request Header Fields Too Large": "要求ヘッダーフィールドが大きすぎます",
+  "Request Timeout": "リクエストタイムアウト",
+  "Reset Content": "コンテンツのリセット",
+  "Reset Password": "パスワード再設定",
+  "Reset Password Notification": "パスワード再設定のお知らせ",
+  "results": "結果",
+  "Retry With": "再試行",
+  "See Other": "他を参照要",
+  "Server Error": "サーバーエラー",
+  "Service Unavailable": "サービスは利用できません",
+  "Session Has Expired": "セッションの有効期限切れ",
+  "Showing": "表示中",
+  "SSL Handshake Failed": "SSL接続エラー",
+  "Subscription link receive abnormal access and banned by the system": "サブスクリプションリンクに異常なアクセスがあり、システムによって禁止されました",
+  "Switching Protocols": "プロトコルの切替",
+  "Temporary Redirect": "一時的なリダイレクト",
+  "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "ご登録ありがとうございます!始める前に、メールに送信されたリンクをクリックしてメールを確認してください。メールが届いていない場合は、再送信いたします。",
+  "The given data was invalid.": "指定されたデータは無効でした。",
+  "The response is not a streamed response.": "応答はストリーミング応答ではありません。",
+  "The response is not a view.": "応答はビューではありません。",
+  "This password reset link will expire in :count minutes.": "このパスワード再設定リンクの有効期限は:count分です。",
+  "to": "に",
+  "Toggle navigation": "ナビゲーション切替",
+  "Too Early": "リクエスト間隔が早すぎる",
+  "Too Many Requests": "リクエストが多すぎます",
+  "Unauthorized": "認証が必要です",
+  "Unavailable For Legal Reasons": "法的な理由により利用不可",
+  "Unknown Error": "不明なエラー",
+  "Unprocessable Entity": "処理できないエンティティ",
+  "Unsupported Media Type": "サポートされていないメディアタイプ",
+  "Upgrade Required": "アップグレードが必要",
+  "URI Too Long": "URLが長すぎます",
+  "Use Proxy": "プロキシ使用",
+  "Variant Also Negotiates": "バリアントの再認証",
+  "Verify Email Address": "メールアドレスの確認",
+  "Verify Your Email Address": "メールアドレスを確認してください",
+  "Web Server is Down": "Webサーバーが停止中",
+  "Whoops!": "おっと!",
+  "You are receiving this email because we received a password reset request for your account.": "パスワード再設定のリクエストを受け付けました。",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": ":num 時間以内にこのチケットに返信しなかったため、システムがチケットを閉じました。",
+  "You must have a valid subscription to view the content in this area!": "このエリアのコンテンツを表示するには、有効なサブスクリプションが必要です!",
+  "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "お客様のサブスクリプションは管理者によって無効にされました。復元するには管理者に連絡してください。"
+}

File diff suppressed because it is too large
+ 432 - 427
resources/lang/ja/admin.php


+ 53 - 53
resources/lang/ja/auth.php

@@ -3,98 +3,98 @@
 declare(strict_types=1);
 
 return [
-    'accept_term' => '利用規約に同意します',
+    'accept_term' => '私は読んで同意しました',
     'active' => [
-        'attribute' => 'アカウント有効化',
+        'attribute' => 'アクティベート',
         'error' => [
-            'activated' => 'アカウントはすでにアクティブ化されています。再アクティブ化の必要はありません。',
-            'disable' => 'このサイトはアカウントのアクティベーション機能を無効にしています。直接ログインできます。',
-            'throttle' => 'アクティベーションリクエストの制限に達しました。操作を頻繁に行わないでください。質問がある場合は :email に連絡してください。',
+            'activated' => 'アカウントは既にアクティベートされています、再度アクティベートする必要はありません',
+            'disable' => 'アカウントのアクティベートは無効です、直接ログインできます!',
+            'throttle' => 'アクティベートリクエストの制限に達しました、後でもう一度お試しください。ご質問がある場合は:emailに連絡してください。',
         ],
-        'promotion' => 'アカウントはまだアクティブ化されていません。まず「:action」を行ってください。',
-        'sent' => 'アクティベーションリンクをメールボックスに送信しました。迷惑メールフォルダーを含めて確認してください。',
+        'promotion' => 'アカウントがまだアクティベートされていません、まず「:action」を行ってください!',
+        'sent' => 'アクティベートリンクがメールに送信されましたので、受信トレイ(スパムフォルダも含む)を確認してください。',
     ],
-    'aup' => '許容可能な利用規約',
+    'aup' => '使用許諾ポリシー',
     'captcha' => [
-        'attribute' => '確認コード',
+        'attribute' => 'キャプチャ',
         'error' => [
-            'failed' => '確認コードの検証に失敗しました。再度入力してください。',
-            'timeout' => '確認コードが期限切れです。更新して再試行してください。',
+            'failed' => 'キャプチャの検証に失敗しました、再試行してください',
+            'timeout' => 'キャプチャの有効期限が切れました、再読み込みして再試行してください。',
         ],
-        'required' => '確認コードを正しく入力してください',
-        'sent' => '確認コードをメールアドレスに送信しました。迷惑メールフォルダーも確認してください。',
+        'required' => 'キャプチャを完了してください!',
+        'sent' => 'キャプチャがメールに送信されましたので、受信トレイ(スパムフォルダも含む)を確認してください。',
     ],
     'email' => [
         'error' => [
-            'banned' => 'あなたが利用しているメールサービスはブロックされています。別のメールを利用してください。',
-            'invalid' => 'メールアドレスがサポート外です。',
+            'banned' => '使用しているメールプロバイダーはブロックされています、他のメールを使用してください。',
+            'invalid' => 'サポートされていないメールです。',
         ],
     ],
     'error' => [
-        'account_baned' => 'アカウントは利用停止中です。',
-        'login_error' => 'ログインエラーです。時間をおいて再試行してください。',
-        'login_failed' => 'ログインに失敗しました。メールアドレスとパスワードを確認してください。',
-        'not_found_user' => 'アカウントが見つかりません他のログイン方法を試してください。',
-        'repeat_request' => 'リクエストの再送信は控えてください。更新してから再試行してください。',
-        'url_timeout' => 'リンクの有効期限が切れています。再度リクエストしてください。',
+        'account_baned' => 'アカウントが禁止されています!',
+        'login_error' => 'ログインエラーが発生しました、後でもう一度お試しください!',
+        'login_failed' => 'ログインに失敗しました、ユーザー名とパスワードを確認してください!',
+        'not_found_user' => 'アカウントが見つかりません他のログイン方法を試してください。',
+        'repeat_request' => 'リクエストを繰り返さないでください、再読み込みして再試行してください。',
+        'url_timeout' => 'リンクの有効期限が切れました、再度リクエストしてください。',
     ],
-    'failed' => 'メールアドレスまたはパスワードが無効です。',
+    'failed' => '無効な資格情報です。',
     'invite' => [
         'attribute' => '招待コード',
         'error' => [
-            'unavailable' => '招待コードが無効です。再度入力してください。',
+            'unavailable' => '無効な招待コードです、再試行してください。',
         ],
-        'get' => '招待コード取得',
-        'not_required' => '招待コードは不要です。直接登録できます。',
+        'get' => '招待コード取得',
+        'not_required' => '招待コードは不要です、直接登録できます!',
     ],
     'login' => 'ログイン',
     'logout' => 'ログアウト',
-    'maintenance' => 'メンテナンス',
+    'maintenance' => 'メンテナンス',
     'maintenance_tip' => 'メンテナンス中',
     'oauth' => [
-        'bind_failed' => '連携に失敗しました',
-        'bind_success' => '連携に成功しました',
-        'login_failed' => 'ソーシャルログインに失敗しました。',
-        'rebind_success' => '連携再設定に成功しました',
-        'register' => '早期登録',
+        'bind_failed' => 'バインドに失敗しました',
+        'bind_success' => 'バインドに成功しました',
+        'login_failed' => 'サードパーティのログインに失敗しました!',
+        'rebind_success' => '再バインドに成功しました',
+        'register' => 'クイック登録',
         'register_failed' => '登録に失敗しました',
-        'registered' => 'すでに登録済みです。直接ログインしてください。',
-        'unbind_failed' => '連携解除に失敗しました',
-        'unbind_success' => '連携を解除しました',
+        'registered' => '既に登録されています、直接ログインしてください。',
+        'unbind_failed' => 'バインド解除に失敗しました',
+        'unbind_success' => 'バインド解除に成功しました',
     ],
     'one-click_login' => 'ソーシャルログイン',
     'optional' => 'オプション',
     'password' => [
-        'forget' => 'パスワードを忘れましたか?',
+        'forget' => 'パスワードを忘れた方はこちら',
         'new' => '新しいパスワードを入力',
         'original' => '現在のパスワード',
         'reset' => [
-            'attribute' => 'パスワード再設定',
+            'attribute' => 'パスワード再設定',
             'error' => [
-                'demo' => 'デモ環境では管理者パスワードの変更はできません。',
-                'disabled' => 'パスワード再設定は無効化されています。サポートは :email にお問い合わせください。',
-                'failed' => 'パスワードの再設定に失敗しました。',
-                'same' => '新しいパスワードは古いパスワードと同じであってはいけません。再入力してください。',
-                'throttle' => '24時間以内にパスワード再設定は :time 回までです。頻繁に操作しないでください。',
-                'wrong' => '現在のパスワードが間違っています。再入力してください。',
+                'demo' => 'デモモードでは管理者パスワードを変更できません。',
+                'disabled' => 'パスワードリセットは無効です、サポートが必要な場合は:emailに連絡してください。',
+                'failed' => 'パスワードリセットに失敗しました。',
+                'same' => '新しいパスワードは古いパスワードと同じにできません、再入力してください。',
+                'throttle' => '24時間以内に:time回しかパスワードをリセットできません、頻繁な操作は避けてください。',
+                'wrong' => 'パスワードが間違っています、再試行してください。',
             ],
-            'sent' => 'パスワード再設定のリンクをメールに送信しました。迷惑メールフォルダーも確認してください。',
-            'success' => '新しいパスワードが再設定されました。ログインできます。',
+            'sent' => 'リセットリンクがメールに送信されましたので、受信トレイ(スパムフォルダも含む)を確認してください。',
+            'success' => '新しいパスワードが正常にリセットされました、ログインできます。',
         ],
     ],
     'register' => [
-        'attribute' => '登録',
-        'code' => '登録確認コード',
+        'attribute' => 'サインアップ',
+        'code' => '登録コード',
         'error' => [
-            'disable' => '申し訳ありませんが、新規登録は一時停止中です。',
-            'throttle' => '自動登録防止システムがアクティブです。登録フォームの送信は控えめにしてください。',
+            'disable' => '申し訳ありませんが、現在新規ユーザーの受付を停止しています。',
+            'throttle' => 'アンチボットシステムが作動しました!頻繁な提出は避けてください。',
         ],
-        'failed' => '登録に失敗しました。時間をおいて再度お試しください。',
-        'promotion' => 'アカウントをお持ちでない方は',
+        'failed' => '登録に失敗しました、後でもう一度お試しください。',
+        'promotion' => 'アカウントをお持ちでない方は、まず',
         'success' => '登録に成功しました',
     ],
-    'remember_me' => 'ログインしたままにする',
-    'request' => '取得',
-    'throttle' => 'ログイン試行回数が多すぎます。:seconds 秒後に再試行してください。',
+    'remember_me' => 'ログイン状態を保持する',
+    'request' => 'リクエスト',
+    'throttle' => '試行回数が多すぎます、:seconds秒後にもう一度お試しください。',
     'tos' => '利用規約',
 ];

+ 51 - 58
resources/lang/ja/common.php

@@ -5,146 +5,139 @@ declare(strict_types=1);
 return [
     'hour' => '{1} 時間|{2} 時',
     'account' => 'アカウント',
-    'available_date' => '有効期',
-    'created_at' => '作成日',
-    'expired_at' => '有効期限切れ',
-    'updated_at' => '更新日',
-    'latest_at' => '最終アクセス',
+    'available_date' => '有効期',
+    'created_at' => '作成日',
+    'expired_at' => '有効期限',
+    'updated_at' => '更新日',
+    'latest_at' => '最近の活動',
     'back' => '戻る',
     'back_to' => ':pageに戻る',
-    'cancel' => '取消',
+    'cancel' => 'キャンセル',
     'close' => '閉じる',
     'close_item' => ':attributeを閉じる',
     'confirm' => '確認',
-    'continues' => '続ける',
+    'continue' => '続ける',
     'open' => '開く',
     'send' => '送信',
     'view' => '表示',
     'reset' => 'リセット',
     'copy' => [
         'attribute' => 'コピー',
-        'success' => 'コピー成功しました',
-        'failed' => 'コピーに失敗しました。手動でコピーしてください。',
+        'success' => 'コピー成功',
+        'failed' => 'コピー失敗、手動でコピーしてください',
     ],
     'add' => '追加',
     'free' => '無料',
-    'replace' => '置換',
+    'change' => '変更',
     'submit' => '送信',
     'submit_item' => ':attributeを送信',
     'generate' => '生成',
     'generate_item' => ':attributeを生成',
-    'to_safari' => [0 => '右上の', 1 => 'をタップし、', 2 => '「Safariで開く」', 3 => 'を選択してください。'],
-    'update_browser' => [0 => '古い', 1 => 'ブラウザ', 2 => 'をご利用中です。', 3 => 'ブラウザ', 4 => 'をアップデートして、最適なブラウジング体験を得てください。'],
+    'to_safari' => [0 => '右上のボタンをクリック', 1 => 'し、', 2 => 'Safariで開く', 3 => 'を選択して正常にアクセスしてください!'],
+    'update_browser' => [0 => 'お使いの', 1 => 'ブラウザは古いです', 2 => '。ブラウザを', 3 => 'アップグレードしてください', 4 => '。'],
     'apply' => '適用',
     'avatar' => 'アバター',
     'customize' => 'カスタマイズ',
-    'all' => 'て',
+    'all' => 'すべて',
     'default' => 'デフォルト',
     'download' => 'ダウンロード',
     'goto' => '移動',
     'warning' => '警告',
     'success' => '成功',
-    'success_item' => ':attribute成功しました',
+    'success_item' => ':attribute成功しました',
     'failed' => '失敗',
-    'failed_item' => ':attribute失敗しました',
+    'failed_item' => ':attribute失敗しました',
     'update' => '更新',
     'update_action' => ':actionを更新',
     'none' => 'なし',
-    'new' => '新',
-    'sorry' => 'ごめんなさい',
+    'new' => '新しい',
+    'sorry' => '申し訳ありません',
     'applied' => ':attributeが適用されました',
     'active_item' => ':attributeを有効化',
     'error' => 'エラー',
-    'toggle' => 'トグル',
-    'toggle_action' => ':actionをトグル',
+    'toggle' => '切り替え',
+    'toggle_action' => ':actionを切り替え',
     'request_url' => 'リクエストURL',
     'function' => [
         'navigation' => 'ナビゲーション',
         'menubar' => 'メニューバー',
-        'fullscreen' => '全画面',
+        'fullscreen' => '全画面表示',
     ],
     'days' => [
         'attribute' => '{1} 日間|{2} 日目',
-        'sun' => '日曜日',
-        'mon' => '月曜日',
-        'tue' => '火曜日',
-        'wed' => '水曜日',
-        'thu' => '木曜日',
-        'fri' => '金曜日',
-        'sat' => '土曜日',
         'weekend' => '週末',
         'work' => '平日',
         'next' => '翌日',
     ],
-    'qrcode' => ':attributeQRコード',
-    'deleted' => '削除済み',
-    'deleted_item' => ':attributeを削除しました',
+    'qrcode' => ':attribute QRコード',
+    'deleted' => '削除されました',
+    'deleted_item' => ':attributeが削除されました',
     'print' => '印刷',
     'unlimited' => '無制限',
     'payment' => [
         'credit' => '残高',
-        'alipay' => 'Alipay',
+        'alipay' => 'アリペイ',
         'qq' => 'QQウォレット',
-        'wechat' => 'WeChatペイ',
+        'wechat' => 'ウィーチャットペイ',
         'crypto' => '暗号通貨',
-        'manual' => '手動支払',
+        'manual' => '手動支払',
         'status' => [
-            'wait' => '支払待ち',
+            'wait' => '支払待ち',
         ],
     ],
     'order' => [
         'status' => [
-            'cancel' => 'キャンセル',
-            'complete' => '完了',
+            'canceled' => 'キャンセルされました',
+            'completed' => '完了しました',
             'prepaid' => '前払い',
             'ongoing' => '進行中',
-            'review' => '確認待ち',
+            'review' => '審査中',
         ],
     ],
-    'recommend' => 'おすすめ',
-    'advance' => 'アドバンス',
+    'recommend' => '推奨',
+    'advance' => '進む',
     'action' => 'アクション',
     'search' => '検索',
     'edit' => '編集',
     'delete' => '削除',
     'status' => [
-        'attribute' => '状態',
+        'attribute' => 'ステータス',
         'inactive' => '非アクティブ',
         'disabled' => '無効',
-        'banned' => 'Ban',
-        'normal' => '常',
+        'banned' => '禁止',
+        'normal' => '常',
         'enabled' => '有効',
         'expire' => '期限切れ',
         'limited' => '制限付き',
-        'run_out' => '残量なし',
+        'run_out' => 'データ使用済み',
         'unused' => '未使用',
         'used' => '使用済み',
-        'closed' => 'クローズ',
+        'closed' => '閉じた',
         'applying' => '申請中',
-        'withdrawn' => '出金済み',
-        'unwithdrawn' => '未出金',
+        'withdrawn' => '引き出し済み',
+        'unwithdrawn' => '未引き出し',
         'reply' => '返信済み',
         'pending' => '保留中',
         'unknown' => '不明',
         'available' => '利用可能',
-        'reject' => '却下',
-        'rejected' => '却下済み',
-        'review' => '審査待ち',
+        'reject' => '拒否',
+        'rejected' => '却下されました',
+        'review' => '審査',
         'reviewed' => '審査済み',
-        'paid' => '支払済み',
-        'payment_pending' => '支払保留中',
-        'pass' => 'パス',
+        'paid' => '支払済み',
+        'payment_pending' => '支払い待ち',
+        'pass' => '合格',
         'send_to_credit' => '残高への支払い',
-        'waiting_tobe_send' => '信待ち',
+        'waiting_tobe_send' => '信待ち',
     ],
-    'stay_unchanged' => '空欄のままで変更なし',
-    'random_generate' => '空欄の場合はランダム生成',
-    'request_failed' => 'リクエストに失敗しました。再度お試しください。',
+    'stay_unchanged' => '変更しない場合は空のままにしてください',
+    'random_generate' => 'ランダム生成するには空のままにしてください',
+    'request_failed' => 'リクエストに失敗しました、再試行してください',
     'convert' => '変換',
     'import' => 'インポート',
     'or' => 'または',
-    'more' => 'もっと見る',
+    'more' => 'もっと',
     'to' => 'へ',
     'to_be_send' => '送信待ち',
-    'developing' => '開発中です。お楽しみに!',
+    'developing' => '開発中です、お楽しみに!',
 ];

+ 18 - 18
resources/lang/ja/errors.php

@@ -4,31 +4,31 @@ declare(strict_types=1);
 
 return [
     'forbidden' => [
-        'access' => '不明なIPまたはプロキシからのアクセスを検出したため、アクセスを拒否します',
-        'bots' => 'ボットからのアクセスを検出したため、アクセスを拒否します',
-        'china' => '中国IPまたはプロキシからのアクセスを検出したため、アクセスを拒否します',
-        'oversea' => '海外IPまたはプロキシからのアクセスを検出したため、アクセスを拒否します',
+        'access' => '不明なIPまたはプロキシアクセスが検出されました。アクセス禁止',
+        'bots' => 'ボットアクセスが検出されました。アクセス禁止',
+        'china' => '中国のIPまたはプロキシアクセスが検出されました。アクセス禁止',
+        'oversea' => '海外のIPまたはプロキシアクセスが検出されました。アクセス禁止',
     ],
     'log' => 'ログ',
-    'refresh' => '更新',
-    'refresh_page' => 'ページを更新してから再度お試しください',
-    'report' => 'エラーに次のレポートが含まれています:',
+    'refresh' => 'リフレッシュ',
+    'refresh_page' => 'ページをリフレッシュしてから再度アクセスしてください',
+    'report' => 'エラーにレポートが含まれています:',
     'safe_enter' => '安全な入口',
     'safe_code' => '安全コードを入力してください',
     'title' => '⚠️ エラーが発生しました',
-    'unsafe_enter' => '安全でない入口',
+    'unsafe_enter' => '安全でない入口',
     'visit' => 'アクセスしてください',
-    'whoops' => 'おっと!',
+    'whoops' => 'おっと',
     'get_ip' => 'IP情報の取得に失敗しました',
     'subscribe' => [
-        'unknown' => '不明なサブスクリプションです!新しいURLを取得してください!',
-        'sub_baned' => 'サブスクリプションがBANされています! 詳細はウェブサイトをご確認ください。',
-        'user' => '誤ったURLです。アカウントが存在しません!',
-        'user_disable' => 'アカウントが無効化されています! サポートにお問い合わせください!',
-        'baned_until' => ':timeまでアカウントはBANされています。ロック解除をお待ちください!',
-        'out' => 'データが使い切られました! データを追加購入するかリセットしてください!',
-        'expired' => 'アカウントの有効期限が切れています! 購入を更新してください!',
-        'question' => 'アカウントにエラーが発生しています! 詳細はウェブサイトをご確認ください!',
-        'none' => '使用可能なノードがありません',
+        'unknown' => '無効なリンクです。新しいリンクを取得してください!',
+        'sub_banned' => 'リンクが禁止されました。詳細は公式サイトをご覧ください',
+        'user' => '無効なリンクです。アカウントが存在しません!新しいリンクを取得してください!',
+        'user_disabled' => 'アカウントが無効です!',
+        'banned_until' => 'アカウントは:timeまで禁止されています。解除後に更新してください!',
+        'out' => 'データが不足しています。再購入またはデータをリセットしてください!',
+        'expired' => 'アカウントの有効期限が切れています。更新してください!',
+        'question' => 'アカウントに問題があります。公式サイトをご覧ください!',
+        'none' => '用可能なノードがありません',
     ],
 ];

+ 54 - 54
resources/lang/ja/model.php

@@ -10,10 +10,10 @@ return [
         'username' => 'ユーザー名',
         'password' => 'パスワード',
         'credit' => '残高',
-        'invite_num' => '招待コード残数',
-        'reset_date' => 'データリセット予定日',
+        'invite_num' => '利用可能な招待数',
+        'reset_date' => 'データリセット日',
         'port' => 'ポート',
-        'traffic_used' => '使用済みデータ',
+        'traffic_used' => '使用済みデータ',
         'service' => 'プロキシサービス',
         'group' => 'ユーザーグループ',
         'account_status' => 'アカウントステータス',
@@ -25,17 +25,17 @@ return [
         'remark' => '備考',
         'uuid' => 'VMess UUID',
         'proxy_passwd' => 'プロキシパスワード',
-        'proxy_method' => '暗号化',
-        'usable_traffic' => '利用可能データ',
+        'proxy_method' => '暗号化方式',
+        'usable_traffic' => '利用可能データ',
         'proxy_protocol' => 'プロトコル',
-        'proxy_obfs' => 'オブフェスケーション',
+        'proxy_obfs' => '難読化',
         'speed_limit' => '速度制限',
         'inviter' => '招待者',
         'created_date' => '登録日',
     ],
     'common' => [
         'extend' => '拡張情報',
-        'sort' => '並び順',
+        'sort' => 'ソート',
         'description' => '説明',
         'type' => 'タイプ',
         'level' => 'レベル',
@@ -48,14 +48,14 @@ return [
     'subscribe' => [
         'code' => 'サブスクリプションコード',
         'req_times' => 'リクエスト回数',
-        'updated_at' => '最終リクエスト時',
-        'ban_time' => 'BAN期限',
-        'ban_desc' => 'BAN理由',
+        'updated_at' => '最終リクエスト時',
+        'ban_time' => '禁止時間',
+        'ban_desc' => '禁止理由',
         'req_ip' => 'リクエストIP',
-        'req_header' => 'アクセスヘッダー',
+        'req_header' => 'リクエストヘッダー',
     ],
     'oauth' => [
-        'type' => 'チャネル',
+        'type' => 'チャネル',
         'identifier' => '識別子',
     ],
     'user_group' => [
@@ -68,10 +68,10 @@ return [
         'id' => 'ノードID',
         'name' => '名前',
         'domain' => 'ドメイン',
-        'static' => '生存ステータス',
+        'static' => 'ステータス',
         'online_user' => 'オンラインユーザー',
-        'data_consume' => 'データ使用量',
-        'data_rate' => 'データレート',
+        'data_consume' => 'データ消費',
+        'data_rate' => 'データ比率',
         'ddns' => 'DDNS',
         'ipv4' => 'IPv4アドレス',
         'ipv6' => 'IPv6アドレス',
@@ -84,16 +84,16 @@ return [
         'udp' => 'UDP',
         'display' => '表示とサブスクリプション',
         'detection' => 'ブロック検出',
-        'method' => '暗号化',
+        'method' => '暗号化方式',
         'protocol' => 'プロトコル',
-        'protocol_param' => 'プロトコルパラメータ',
-        'obfs' => 'オブフェスケーション',
-        'obfs_param' => 'オブフェスケーションパラメーター',
+        'protocol_param' => 'プロトコルパラメータ',
+        'obfs' => '難読化',
+        'obfs_param' => '難読化パラメータ',
         'single' => 'シングルポート',
         'transfer' => 'リレー',
         'service_port' => 'サービスポート',
         'single_passwd' => 'シングルポートパスワード',
-        'v2_alter_id' => '変更ID',
+        'v2_alter_id' => '代替ID',
         'v2_net' => 'ネットワーク',
         'v2_cover' => 'カバー',
         'v2_host' => 'ホスト',
@@ -106,13 +106,13 @@ return [
     'node_auth' => [
         'attribute' => 'ノード認証',
         'key' => '通信キー<small>ノード用</small>',
-        'secret' => 'リバースシークレット',
+        'secret' => 'リバースキー',
     ],
     'node_cert' => [
-        'attribute' => 'ドメイン証明書',
+        'attribute' => '証明書',
         'domain' => 'ドメイン',
-        'key' => 'KEY',
-        'pem' => 'PEM',
+        'key' => 'キー',
+        'pem' => '証明書',
         'issuer' => '発行者',
         'signed_date' => '発行日',
         'expired_date' => '有効期限',
@@ -120,24 +120,24 @@ return [
     'order' => [
         'attribute' => '注文',
         'id' => '注文ID',
-        'original_price' => '定価',
-        'price' => '実際の価格',
-        'pay_way' => '支払方法',
+        'original_price' => '元の価格',
+        'price' => '支払金額',
+        'pay_way' => '支払方法',
         'status' => 'ステータス',
     ],
     'goods' => [
         'attribute' => '商品',
-        'name' => '名',
+        'name' => '名',
         'price' => '価格',
         'category' => 'カテゴリー',
-        'renew' => 'データリセット価格',
+        'renew' => 'データ更新価格',
         'user_limit' => 'ユーザー速度制限',
         'period' => 'リセットサイクル',
-        'traffic' => 'データ容量',
-        'invite_num' => '付与招待コード数',
-        'limit_num' => '購入制限',
+        'traffic' => 'データ容量',
+        'invite_num' => 'ボーナス招待数',
+        'limit_num' => '購入制限',
         'available_date' => '有効期間',
-        'hot' => '人気',
+        'hot' => 'ベストセラー',
         'color' => '色',
         'logo' => 'ロゴ',
         'info' => 'カスタム情報',
@@ -149,13 +149,13 @@ return [
     ],
     'rule_group' => [
         'attribute' => 'ルールグループ',
-        'name' => '名',
+        'name' => '名',
         'type' => 'タイプ',
         'rules' => 'ルール',
     ],
     'role' => [
-        'attribute' => 'ロール',
-        'name' => '名',
+        'attribute' => '役割',
+        'name' => '名',
         'permissions' => '権限',
     ],
     'permission' => [
@@ -167,27 +167,27 @@ return [
         'attribute' => '記事',
         'category' => 'カテゴリー',
         'language' => '言語',
-        'logo' => '表紙',
-        'created_at' => '投稿日',
+        'logo' => 'カバー',
+        'created_at' => '公開日',
         'updated_at' => '更新日',
     ],
     'coupon' => [
         'attribute' => 'クーポン',
-        'name' => '名',
+        'name' => '名',
         'sn' => 'コード',
         'logo' => 'ロゴ',
-        'value' => '値',
-        'priority' => '優先順位',
-        'usable_times' => '利用制限回数',
-        'minimum' => '最低購入額',
-        'used' => '個人利用制限',
+        'value' => '値',
+        'priority' => '優先',
+        'usable_times' => '使用制限',
+        'minimum' => '最低利用額',
+        'used' => '個人制限',
         'levels' => 'レベル制限',
         'groups' => 'グループ制限',
         'users_whitelist' => 'ホワイトリストユーザー',
         'users_blacklist' => 'ブラックリストユーザー',
-        'services_whitelist' => '対象商品',
-        'services_blacklist' => '対象外商品',
-        'newbie' => '新規ユーザー限定',
+        'services_whitelist' => 'ホワイトリスト商品',
+        'services_blacklist' => 'ブラックリスト商品',
+        'newbie' => '新規ユーザー専用',
         'num' => '数量',
     ],
     'aff' => [
@@ -210,23 +210,23 @@ return [
     ],
     'ip' => [
         'network_type' => 'ネットワークタイプ',
-        'info' => 'ロケーション',
+        'info' => '位置情報',
     ],
     'user_traffic' => [
         'upload' => 'アップロード',
         'download' => 'ダウンロード',
         'total' => '合計',
-        'log_time' => '記録時',
+        'log_time' => '記録時',
     ],
     'user_data_modify' => [
-        'before' => '変更前',
-        'after' => '変更後',
+        'before' => '変更前のデータ',
+        'after' => '変更後のデータ',
         'created_at' => '変更日時',
     ],
     'user_credit' => [
-        'before' => '変更前',
-        'after' => '変更後',
-        'amount' => '金額',
+        'before' => '変更前の残高',
+        'after' => '変更後の残高',
+        'amount' => '変更金額',
         'created_at' => '変更日時',
     ],
 ];

+ 25 - 25
resources/lang/ja/notification.php

@@ -5,33 +5,33 @@ declare(strict_types=1);
 return [
     'attribute' => '通知',
     'new' => '新しいメッセージが:num件あります',
-    'empty' => '新しいメッセージはありません',
+    'empty' => '現在、新しいメッセージはありません',
     'payment_received' => '支払いを受け取りました。金額: :amount。注文の詳細を見る',
-    'account_expired' => 'アカウントの有効期限切れ注意',
-    'account_expired_content' => ':days日後にアカウントが期限切れとなります。サービスを継続するためには早めに更新してください。',
-    'account_expired_blade' => ':days日後にアカウントが期限切れになります。早めに更新してください。',
+    'account_expired' => 'アカウントの有効期限通知',
+    'account_expired_content' => 'あなたのアカウントは:days日後に有効期限が切れます。サービスの継続利用のため、早めに更新してください。',
+    'account_expired_blade' => 'アカウントは:days日後に有効期限が切れます。早めに更新してください',
     'active_email' => '30分以内に認証を完了してください',
-    'close_ticket' => 'チケット:id :title はクローズされました',
-    'view_web' => 'ウェブサイトを見る',
-    'view_ticket' => 'チケットを見る',
-    'new_ticket' => '新しいチケットを受信しました: :title',
-    'reply_ticket' => 'チケットへの返信: :title',
-    'ticket_content' => 'チケットの内容:',
-    'node_block' => 'ノードブロック警告',
-    'node_offline' => 'ノードオフライン警告',
-    'node_offline_content' => '異常なノードがあり、オフラインの可能性があります:',
-    'block_report' => 'ブロックレポート:',
-    'traffic_warning' => 'データ使用量の警告',
-    'traffic_remain' => 'データの:percent%使用済みです。ご注意ください。',
-    'traffic_tips' => 'データリセット日に注意し、データを合理的に使用するか、使い切った後に更新してください。',
-    'verification_account' => 'アカウントの確認',
-    'verification' => '確認コード:',
-    'verification_limit' => ':minutes分以内に認してください',
-    'data_anomaly' => 'データ異常ユーザーの警告',
-    'data_anomaly_content' => 'ユーザー:id: [アップロード: :upload | ダウンロード: :download | 合計: :total] 最終1時間',
+    'close_ticket' => 'チケット番号:id、タイトル:titleがクローズされました',
+    'view_web' => '公式サイトを見る',
+    'view_ticket' => 'このチケットの進捗を見る',
+    'new_ticket' => '新しい返信があります。チケット:titleを確認してください',
+    'reply_ticket' => 'チケットの返信::title',
+    'ticket_content' => 'チケット内容:',
+    'node_block' => 'ノードブロック警告通知',
+    'node_offline' => 'ノードオフライン警告',
+    'node_offline_content' => '以下のノードが異常です。オフラインの可能性があります:',
+    'block_report' => '詳細なブロックログ:',
+    'traffic_warning' => 'データ使用警告',
+    'traffic_remain' => 'データ使用率が:percent%に達しました。ご注意ください',
+    'traffic_tips' => 'データリセット日を確認し、合理的にデータを使用するか、使用後にリチャージしてください',
+    'verification_account' => 'アカウント認証通知',
+    'verification' => 'あなたの認証コードは:',
+    'verification_limit' => ':minutes分以内に認証を完了してください',
+    'data_anomaly' => 'データ異常ユーザー通知',
+    'data_anomaly_content' => 'ユーザー:id、最近1時間のデータ(アップロード:upload、ダウンロード:download、合計:total)',
     'node' => [
-        'upload' => 'アップロード',
-        'download' => 'ダウンロード',
-        'total' => '合計',
+        'upload' => 'アップロードデータ',
+        'download' => 'ダウンロードデータ',
+        'total' => '総データ',
     ],
 ];

+ 30 - 30
resources/lang/ja/user.php

@@ -4,63 +4,63 @@ declare(strict_types=1);
 
 return [
     'account' => [
-        'credit' => '残高',
+        'credit' => 'アカウント残高',
         'status' => 'アカウント状態',
         'level' => 'アカウントレベル',
         'group' => 'グループ',
         'speed_limit' => '速度制限',
-        'remain' => '残データ',
-        'time' => '有効期限',
+        'remain' => '残データ',
+        'time' => 'プラン期間',
         'last_login' => '最終ログイン',
-        'reset' => '{0} <code id="restTime">:days</code>後にデータがリセットされます |[1,*] データがリセットされるまで :days 日です',
+        'reset' => '{0} データは <code id="restTime">:days</code> 後にリセットされます |{1} データリセットまで :days 日 |[2,*] データリセットまで :days 日',
         'connect_password' => 'プロキシ接続パスワード',
         'reason' => [
-            'normal' => 'アカウント状態は正常です',
-            'expired' => 'お客様のプランは有効期限が切れています',
-            'overused' => '<code>:data</code> GBの時間制限を超えました。<code id="banedTime">:min</code> 後に制限が解除されます。',
-            'traffic_exhausted' => 'データが使い切られました',
-            'unknown' => '不明なエラーです。まずはブラウザの更新をお試しください。改善しない場合は管理者にお問い合わせください。',
+            'normal' => 'アカウントは正常です',
+            'expired' => 'プランの有効期限が切れています',
+            'overused' => 'この期間の <code>:data</code> GB 制限を超えました。<br/> 制限は <code id="banedTime">:min</code> 分後に解除されます',
+            'traffic_exhausted' => 'データが使い果たされました',
+            'unknown' => '不明な理由です。ブラウザをリフレッシュしてみてください。問題が続く場合はサポートに連絡してください。',
         ],
     ],
     'home' => [
         'attendance' => [
             'attribute' => 'チェックイン',
-            'disable' => 'チェックイン機能は無効化されています。',
-            'done' => 'すでにチェックイン済みです。明日また来てください。',
-            'success' => ':data データを獲得しました。',
+            'disable' => 'チェックイン機能が無効です',
+            'done' => '既にチェックイン済みです。明日また来てください!',
+            'success' => ':data データを受け取りました',
             'failed' => 'システムエラー',
         ],
-        'traffic_logs' => 'データ使用履歴',
+        'traffic_logs' => 'データ記録',
         'announcement' => 'お知らせ',
-        'wechat_push' => 'WeChatプッシュ通知',
+        'wechat_push' => 'WeChat通知',
         'chat_group' => 'チャットグループ',
         'empty_announcement' => 'お知らせはありません',
     ],
-    'purchase_to_unlock' => '購入後に機能がアンロックされます',
-    'purchase_required' => 'この機能は無料ユーザーには利用できません。 ',
+    'purchase_to_unlock' => '購入してアンロック',
+    'purchase_required' => 'この機能は無料ユーザーには利用できません。まずは',
     'attribute' => [
         'node' => 'ノード',
         'data' => 'データ',
         'ip' => 'IPアドレス',
-        'isp' => 'プロバイダー',
-        'address' => '地',
+        'isp' => 'ISP',
+        'address' => '所在地',
     ],
-    'purchase_promotion' => '今すぐサービスを購入!',
+    'purchase_promotion' => '今すぐサービスを購入',
     'menu' => [
-        'helps' => 'ヘルプ',
+        'help' => 'ヘルプ',
         'home' => 'ホーム',
         'invites' => '招待',
         'invoices' => '請求書',
         'nodes' => 'ノード',
-        'referrals' => '紹介',
-        'shop' => 'サービス',
+        'promotion' => 'プロモーション',
+        'shop' => 'ショップ',
         'profile' => 'プロフィール',
         'tickets' => 'チケット',
-        'admin_dashboard' => '管理画面',
+        'admin_dashboard' => 'ダッシュボード',
     ],
     'contact' => 'お問い合わせ',
     'oauth' => [
-        'bind_title' => 'SNSアカウントを連携する',
+        'bind_title' => 'ソーシャルアカウントを連携',
         'not_bind' => '未連携',
         'bind' => '連携する',
         'rebind' => '再連携する',
@@ -95,7 +95,7 @@ return [
         'action' => 'データリセット',
         'cost' => 'コスト <code>:amount</code>',
         'cost_tips' => 'データリセットには :amount が差し引かれます!',
-        'lack' => '残高が足りません。チャージしてください。',
+        'insufficient' => '残高が足りません。チャージしてください。',
         'logs' => 'ユーザーデータリセット記録',
         'success' => 'リセット成功',
     ],
@@ -202,17 +202,17 @@ return [
         'title_placeholder' => '簡単に問題を説明してください',
         'content_placeholder' => '問題を詳細に説明して助けを得ることができるようにしてください',
         'new' => '新規チケット',
-        'working_hour' => '営業時間',
+        'service_hours' => '営業時間',
         'online_hour' => 'オンライン時間',
         'service_tips' => 'ご連絡は<code>1つの</code>方法のみでお願いします。<br>重複したリクエストは対応を遅らせます。',
         'error' => '不明なエラーです。スタッフに通知してください。',
     ],
     'traffic_logs' => [
-        '24hours' => '今日のデータ使用',
-        '30days' => '今月のデータ使用',
-        'tips' => '注意: データに遅延があります。前日に更新される日次データ、前時間に更新される時間データ。',
+        'hourly' => '今日のデータ使用',
+        'daily' => '今月のデータ使用',
+        'tips' => ':トラフィックのデータは遅延を提供します。',
     ],
-    'client' => 'クライアント',
+    'clients' => 'クライアント',
     'tutorials' => 'チュートリアル',
     'current_role' => '現在のロール',
     'knowledge' => [

+ 49 - 0
resources/lang/ja/validation.php

@@ -143,37 +143,62 @@ return [
     'uuid' => ':Attributeは、有効なUUIDである必要があります。',
     'attributes' => [
         'address' => '住所',
+        'affiliate_url' => 'アフィリエイトURL',
         'age' => '年',
         'amount' => '額',
+        'announcement' => '発表',
         'area' => 'エリア',
+        'audience_prize' => '観客賞',
         'available' => '利用可能',
         'birthday' => '誕生日',
         'body' => '本文',
         'city' => '市',
+        'compilation' => '編集',
+        'concept' => 'コンセプト',
+        'conditions' => '条件',
         'content' => 'コンテンツ',
         'country' => '国',
+        'cover' => 'カバー',
         'created_at' => '作成日',
         'creator' => 'クリエーター',
+        'currency' => '通貨',
         'current_password' => '現在のパスワード',
+        'customer' => 'お客様',
         'date' => '日付',
         'date_of_birth' => '生年月日',
+        'dates' => '日付',
         'day' => '日',
         'deleted_at' => '削除日',
         'description' => '説明',
+        'display_type' => '画面タイプ',
         'district' => '地区',
         'duration' => '期間',
         'email' => 'eメール',
         'excerpt' => '抜粋',
         'filter' => 'フィルタ',
+        'finished_at' => 'に終了しました',
         'first_name' => '名',
         'gender' => '性別',
+        'grand_prize' => '大賞',
         'group' => 'グループ',
         'hour' => '時間',
         'image' => '画像',
+        'image_desktop' => 'デスクトップイメージ',
+        'image_main' => 'メイン画像',
+        'image_mobile' => 'モバイル画像',
+        'images' => '画像',
+        'is_audience_winner' => '視聴者の勝者です',
+        'is_hidden' => '隠されています',
+        'is_subscribed' => '購読されています',
+        'is_visible' => '見える',
+        'is_winner' => '勝者です',
+        'items' => 'アイテム',
+        'key' => '鍵',
         'last_name' => '姓',
         'lesson' => 'レッスン',
         'line_address_1' => '住所1行目',
         'line_address_2' => '住所2行目',
+        'login' => 'ログイン',
         'message' => 'メッセージ',
         'middle_name' => 'ミドルネーム',
         'minute' => '分',
@@ -186,22 +211,43 @@ return [
         'password_confirmation' => 'パスワードの確認',
         'phone' => '電話番号',
         'photo' => '写真',
+        'portfolio' => 'ポートフォリオ',
         'postal_code' => '郵便番号',
+        'preview' => 'プレビュー',
         'price' => '価格',
+        'product_id' => '製品番号',
+        'product_uid' => '製品UID',
+        'product_uuid' => '製品UUID',
+        'promo_code' => 'プロモーションコード',
         'province' => '都道府県',
+        'quantity' => '量',
+        'reason' => '理由',
         'recaptcha_response_field' => 'recaptchaの解答',
+        'referee' => '審判',
+        'referees' => '審判員',
+        'reject_reason' => '拒否理由',
         'remember' => 'ログイン状態を保持',
         'restored_at' => '復元日',
         'result_text_under_image' => '画像の下の結果テキスト',
         'role' => '権限',
+        'rule' => 'ルール',
+        'rules' => 'ルール',
         'second' => '秒',
         'sex' => '性別',
+        'shipment' => '発送',
         'short_text' => '短いテキスト',
         'size' => 'サイズ',
+        'skills' => 'スキル',
+        'slug' => 'ナメクジ',
+        'specialization' => '専門化',
+        'started_at' => 'に始まりました',
         'state' => '状態',
+        'status' => '状態',
         'street' => '町名・番地',
         'student' => '生徒',
         'subject' => '課題',
+        'tag' => '鬼ごっこ',
+        'tags' => 'タグ',
         'teacher' => '先生',
         'terms' => '利用規約',
         'test_description' => 'テスト内容',
@@ -210,8 +256,11 @@ return [
         'text' => 'テキスト',
         'time' => '時間',
         'title' => 'タイトル',
+        'type' => 'タイプ',
         'updated_at' => '更新日',
+        'user' => 'ユーザー',
         'username' => 'ユーザー名',
+        'value' => '価値',
         'year' => '年',
     ],
 ];

+ 129 - 56
resources/lang/ko.json

@@ -1,57 +1,130 @@
 {
-    "(and :count more error)": "(그리고 :count개 이상의 오류)",
-    "(and :count more errors)": "(그리고 :count개 이상의 오류)",
-    "All rights reserved.": "모든 권리 보유.",
-    "Forbidden": "권한 없음",
-    "Go to page :page": ":Page 페이지로 이동",
-    "Hello!": "안녕하세요!",
-    "If you did not create an account, no further action is required.": "계정을 생성하지 않았다면 추가 조치가 필요하지 않습니다.",
-    "If you did not request a password reset, no further action is required.": "귀하께서 비밀번호 재설정을 요청하지 않으셨다면, 추가 조치가 필요하지 않습니다.",
-    "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "\":actionText\" 버튼을 클릭하는 중에 문제가 있는 경우 아래 URL을 복사하여\n웹 브라우저에 붙여넣으세요:",
-    "Invalid JSON was returned from the route.": "경로에서 잘못된 JSON이 반환되었습니다.",
-    "Login": "로그인",
-    "Logout": "로그아웃",
-    "Not Found": "찾을 수 없습니다",
-    "of": "의",
-    "Page Expired": "만료된 페이지",
-    "Pagination Navigation": "페이지네이션 내비게이션",
-    "Payment Required": "결제 필요",
-    "Please click the button below to verify your email address.": "이메일 주소를 확인하려면 아래 버튼을 클릭하십시오.",
-    "Regards": "안부",
-    "Register": "회원가입",
-    "Reset Password": "비밀번호 재설정",
-    "Reset Password Notification": "비밀번호 재설정 알림",
-    "results": "결과",
-    "Server Error": "서버 오류",
-    "Service Unavailable": "서비스를 사용할 수 없습니다.",
-    "Showing": "보기",
-    "The given data was invalid.": "제공된 데이터가 유효하지 않습니다.",
-    "The response is not a streamed response.": "응답이 스트리밍 응답이 아닙니다.",
-    "The response is not a view.": "응답은 보기가 아닙니다.",
-    "This password reset link will expire in :count minutes.": "이 비밀번호 재설정 링크는 :count분 후에 만료됩니다.",
-    "to": "에",
-    "Toggle navigation": "내비게이션 전환",
-    "Too Many Requests": "너무 많은 요청",
-    "Unauthorized": "인증되지 않음",
-    "Verify Email Address": "이메일 주소 확인",
-    "Whoops!": "저런!",
-    "You are receiving this email because we received a password reset request for your account.": "귀하의 계정에 대한 비밀번호 재설정이 요청되어 이 메일이 발송되었습니다.",
-    "----「:job」Completed, Used :time seconds ----": "----「:job」완료, 소요 시간 : :time 초----",
-    "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[자동 작업] 서비스 차단: 1시간 내 이상 트래픽",
-    "[Auto Task] Blocked service: Run out of traffic": "[자동 작업] 서비스 차단: 트래픽 소진",
-    "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[자동 작업] 구독 차단: 24시간 내 이상 요청 구독",
-    "[Daily Task] Account Expiration: Block Login & Clear Account": "[일일 작업] 계정 만료: 로그인 차단 및 계정 삭제",
-    "[Daily Task] Account Expiration: Stop Service": "[일일 작업] 계정 만료: 서비스 중지",
-    "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[일일 작업] 계정 트래픽 리셋, 다음 리셋 일자: :date",
-    "[Service Timer] Service Expiration": "[서비스 타이머] 서비스 만료",
-    "Daily Data Usage Report": "일일 데이터 사용량 보고서",
-    "Invoice Detail": "청구서 상세",
-    "Payment for #:sn has been received! Total amount: :amount.": "#:sn에 대한 결제가 완료되었습니다! 총액: :amount",
-    "Payment Received": "결제 완료",
-    "Subscription link receive abnormal access and banned by the system": "이상 접속으로 인해 시스템에서 구독 링크 차단",
-    "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "가입해주셔서 감사합니다! 시작하기 전에 이메일로 보낸 링크를 클릭하여 이메일 인증을 완료해주세요. 이메일을 받지 못했다면 다시 보내드리겠습니다.",
-    "Verify Your Email Address": "이메일 주소 인증하기",
-    "You have not responded this ticket in :num hours, System has closed your ticket.": ":num시간 동안 티켓에 응답하지 않아 시스템이 티켓을 닫았습니다.",
-    "You must have a valid subscription to view the content in this area!": "이 영역의 콘텐츠를 보려면 유효한 구독이 필요합니다!",
-    "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "귀하의 구독이 관리자에 의해 비활성화되었습니다. 복원하려면 관리자에게 문의하세요."
-}
+  "(and :count more error)": "(그리고 :count개 이상의 오류)",
+  "(and :count more errors)": "(그리고 :count개 이상의 오류)",
+  "----「:job」Completed, Used :time seconds ----": "----「:job」이 완료되었습니다. 소요 시간: :time 초 ----",
+  "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[자동 작업] 서비스 차단: 1시간 내 비정상 트래픽 발생",
+  "[Auto Task] Blocked service: Run out of traffic": "[자동 작업] 서비스 차단: 트래픽 소진",
+  "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[자동 작업] 구독 차단: 24시간 내 비정상 요청 발생",
+  "[Auto Task] Unblocked Service: Account ban expired": "[자동 작업] 서비스 차단 해제: 계정 차단 기간 만료",
+  "[Auto Task] Unblocked Service: Account has available data traffic": "[자동 작업] 서비스 차단 해제: 계정에 사용 가능한 트래픽 있음",
+  "[Daily Task] Account Expiration: Block Login & Clear Account": "[일일 작업] 계정 만료: 로그인 차단 및 계정 데이터 삭제",
+  "[Daily Task] Account Expiration: Stop Service": "[일일 작업] 계정 만료: 서비스 중지",
+  "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[일일 작업] 계정 트래픽 초기화, 다음 초기화 날짜: :date",
+  "[Service Timer] Service Expiration": "[서비스 타이머] 서비스 만료",
+  "A Timeout Occurred": "시간 초과가 발생했습니다.",
+  "Accepted": "수락됨",
+  "All rights reserved.": "모든 권리 보유.",
+  "Already Reported": "이미 보고됨",
+  "Bad Gateway": "잘못된 게이트웨이",
+  "Bad Request": "잘못된 요청",
+  "Bandwidth Limit Exceeded": "대역폭 제한 초과",
+  "Client Closed Request": "클라이언트 종료 요청",
+  "Conflict": "갈등",
+  "Connection Closed Without Response": "응답 없이 연결 종료",
+  "Connection Timed Out": "연결 시간이 초과되었습니다",
+  "Continue": "계속하다",
+  "Created": "만들어진",
+  "Daily Data Usage Report": "일일 데이터 사용 보고서",
+  "Expectation Failed": "예상 실패",
+  "Failed Dependency": "실패한 종속성",
+  "Forbidden": "권한 없음",
+  "Found": "설립하다",
+  "Gateway Timeout": "게이트웨이 시간 초과",
+  "Go to page :page": ":Page 페이지로 이동",
+  "Gone": "다 쓴",
+  "Hello!": "안녕하세요!",
+  "HTTP Version Not Supported": "지원되지 않는 HTTP 버전",
+  "I'm a teapot": "나는 찻주전자",
+  "If you did not create an account, no further action is required.": "계정을 생성하지 않았다면 추가 조치가 필요하지 않습니다.",
+  "If you did not request a password reset, no further action is required.": "귀하께서 비밀번호 재설정을 요청하지 않으셨다면, 추가 조치가 필요하지 않습니다.",
+  "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "\":actionText\" 버튼을 클릭하는 중에 문제가 있는 경우 아래 URL을 복사하여\n웹 브라우저에 붙여넣으세요:",
+  "IM Used": "메신저 사용",
+  "Insufficient Storage": "불충분한 저장 공간",
+  "Internal Server Error": "인터넷 서버 오류",
+  "Invalid JSON was returned from the route.": "경로에서 잘못된 JSON이 반환되었습니다.",
+  "Invalid SSL Certificate": "잘못된 SSL 인증서",
+  "Invoice Detail": "청구서 세부사항",
+  "Length Required": "필요한 길이",
+  "Locked": "잠김",
+  "Login": "로그인",
+  "Logout": "로그아웃",
+  "Loop Detected": "루프 감지됨",
+  "Maintenance Mode": "유지 관리 모드",
+  "Method Not Allowed": "비 허가 된 방식",
+  "Misdirected Request": "잘못된 요청",
+  "Moved Permanently": "영구 이사",
+  "Multi-Status": "다중 상태",
+  "Multiple Choices": "객관식",
+  "Network Authentication Required": "네트워크 인증 필요",
+  "Network Connect Timeout Error": "네트워크 연결 시간 초과 오류",
+  "Network Read Timeout Error": "네트워크 읽기 시간 초과 오류",
+  "No Content": "콘텐츠 없음",
+  "Non-Authoritative Information": "신뢰할 수 없는 정보",
+  "Not Acceptable": "받아 드릴 수없는",
+  "Not Extended": "연장되지 않음",
+  "Not Found": "찾을 수 없습니다",
+  "Not Implemented": "구현되지 않음",
+  "Not Modified": "수정되지 않음",
+  "of": "의",
+  "OK": "확인",
+  "Origin Is Unreachable": "원본에 연결할 수 없음",
+  "Page Expired": "만료된 페이지",
+  "Pagination Navigation": "페이지네이션 내비게이션",
+  "Partial Content": "부분 콘텐츠",
+  "Payload Too Large": "페이로드가 너무 큼",
+  "Payment for #:sn has been received! Total amount: :amount.": "주문 #:sn의 결제가 완료되었습니다! 총 금액: :amount.",
+  "Payment Received": "결제 완료",
+  "Payment Required": "결제 필요",
+  "Permanent Redirect": "영구 리디렉션",
+  "Please click the button below to verify your email address.": "이메일 주소를 확인하려면 아래 버튼을 클릭하십시오.",
+  "Precondition Failed": "전제 조건 실패",
+  "Precondition Required": "전제 조건 필요",
+  "Processing": "처리",
+  "Proxy Authentication Required": "프록시 인증 필요",
+  "Railgun Error": "레일건 오류",
+  "Range Not Satisfiable": "범위가 만족스럽지 않음",
+  "Regards": "안부",
+  "Register": "회원가입",
+  "Request Header Fields Too Large": "요청 헤더 필드가 너무 큼",
+  "Request Timeout": "요청 시간 초과",
+  "Reset Content": "콘텐츠 재설정",
+  "Reset Password": "비밀번호 재설정",
+  "Reset Password Notification": "비밀번호 재설정 알림",
+  "results": "결과",
+  "Retry With": "재시도",
+  "See Other": "기타 보기",
+  "Server Error": "서버 오류",
+  "Service Unavailable": "서비스를 사용할 수 없습니다.",
+  "Session Has Expired": "세션이 만료됨",
+  "Showing": "보기",
+  "SSL Handshake Failed": "SSL 핸드셰이크 실패",
+  "Subscription link receive abnormal access and banned by the system": "구독 링크에 비정상적인 접근이 감지되어 시스템에 의해 차단되었습니다",
+  "Switching Protocols": "스위칭 프로토콜",
+  "Temporary Redirect": "임시 리디렉션",
+  "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "회원가입해 주셔서 감사합니다! 시작하기 전에 이메일로 전송된 링크를 클릭하여 이메일을 확인해 주세요. 이메일을 받지 못한 경우, 다시 보내드리겠습니다.",
+  "The given data was invalid.": "제공된 데이터가 유효하지 않습니다.",
+  "The response is not a streamed response.": "응답이 스트리밍 응답이 아닙니다.",
+  "The response is not a view.": "응답은 보기가 아닙니다.",
+  "This password reset link will expire in :count minutes.": "이 비밀번호 재설정 링크는 :count분 후에 만료됩니다.",
+  "to": "에",
+  "Toggle navigation": "내비게이션 전환",
+  "Too Early": "너무 이른",
+  "Too Many Requests": "너무 많은 요청",
+  "Unauthorized": "인증되지 않음",
+  "Unavailable For Legal Reasons": "법적인 이유로 사용할 수 없음",
+  "Unknown Error": "알수없는 오류",
+  "Unprocessable Entity": "처리할 수 없는 항목",
+  "Unsupported Media Type": "지원되지 않는 미디어 유형",
+  "Upgrade Required": "업그레이드 필요",
+  "URI Too Long": "URI가 너무 깁니다.",
+  "Use Proxy": "프록시 사용",
+  "Variant Also Negotiates": "변형도 협상",
+  "Verify Email Address": "이메일 주소 확인",
+  "Verify Your Email Address": "이메일 주소를 확인해 주세요",
+  "Web Server is Down": "웹 서버가 다운되었습니다",
+  "Whoops!": "저런!",
+  "You are receiving this email because we received a password reset request for your account.": "귀하의 계정에 대한 비밀번호 재설정이 요청되어 이 메일이 발송되었습니다.",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": ":num 시간 내에 이 티켓에 응답하지 않아 시스템이 티켓을 닫았습니다.",
+  "You must have a valid subscription to view the content in this area!": "이 영역의 내용을 보려면 유효한 구독이 있어야 합니다!",
+  "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "관리자에 의해 구독이 비활성화되었습니다. 복원하려면 관리자에게 문의하세요."
+}

File diff suppressed because it is too large
+ 453 - 448
resources/lang/ko/admin.php


+ 44 - 44
resources/lang/ko/auth.php

@@ -3,62 +3,62 @@
 declare(strict_types=1);
 
 return [
-    'accept_term' => '서비스 약관에 동의합니다',
+    'accept_term' => '저는 읽고 동의합니다',
     'active' => [
-        'attribute' => '계정 활성화',
+        'attribute' => '활성화',
         'error' => [
-            'activated' => '계정이 이미 활성화되었습니다',
-            'disable' => '계정 활성화가 비활성화되었습니다. 바로 로그인하세요!',
-            'throttle' => '활성화 요청 횟수가 제한을 초과했습니다. 잦은 요청은 자제해주세요. 문의사항이 있다면 :email로 연락주세요',
+            'activated' => '계정이 이미 활성화되었습니다. 다시 활성화할 필요가 없습니다.',
+            'disable' => '계정 활성화 기능이 비활성화되었습니다. 바로 로그인할 수 있습니다!',
+            'throttle' => '활성화 요청 한도를 초과했습니다. 나중에 다시 시도해 주세요. 문제가 있으면 :email로 연락해 주세요.',
         ],
         'promotion' => '계정이 아직 활성화되지 않았습니다. 먼저 [:action] 해주세요!',
-        'sent' => '활성화 링크가 귀하의 이메일로 발송되었습니다. 스팸 메일함도 확인해 주세요',
+        'sent' => '활성화 이메일이 발송되었습니다. 메일함(스팸 폴더 포함)을 확인해 주세요.',
     ],
     'aup' => '허용 가능한 사용 정책',
     'captcha' => [
         'attribute' => '캡차',
         'error' => [
-            'failed' => '캡차 인증에 실패했습니다. 다시 입력해 주세요',
-            'timeout' => '캡차 인증 시간이 만료되었습니다. 새로고침 후 다시 시도해 주세요',
+            'failed' => '캡차 인증 실패, 다시 시도해 주세요',
+            'timeout' => '캡차 만료되었습니다. 새로고침 후 다시 시도해 주세요.',
         ],
-        'required' => '캡차를 정확히 입력해 주세요',
-        'sent' => '캡차가 귀하의 이메일로 발송되었습니다. 스팸 메일함도 확인해 주세요',
+        'required' => '캡차를 완료해 주세요!',
+        'sent' => '캡차가 이메일로 발송되었습니다. 메일함(스팸 폴더 포함)을 확인해 주세요.',
     ],
     'email' => [
         'error' => [
-            'banned' => '현재 사용 중인 이메일 서비스는 차단되었습니다. 다른 이메일을 사용해 주세요',
-            'invalid' => '현재 사용 중인 이메일이 지원되지 않습니다',
+            'banned' => '이메일 제공자가 차단되었습니다. 다른 이메일을 사용해 주세요.',
+            'invalid' => '지원되지 않는 이메일입니다.',
         ],
     ],
     'error' => [
-        'account_baned' => '귀하의 계정이 차단되었습니다',
-        'login_error' => '로그인 오류가 발생했습니다. 잠시 후 다시 시도해 주세요',
-        'login_failed' => '로그인에 실패했습니다. 이메일과 비밀번호를 확인해 주세요',
-        'not_found_user' => '관련 계정을 찾을 수 없습니다. 다른 로그인 방법을 시도해 주세요',
-        'repeat_request' => '요청을 반복하지 마시고, 새로고침 후 다시 시도해 주세요',
-        'url_timeout' => '링크가 만료되었습니다. 다시 요청해 주세요',
+        'account_baned' => '계정이 차단되었습니다!',
+        'login_error' => '로그인 오류, 나중에 다시 시도해 주세요!',
+        'login_failed' => '로그인 실패, 사용자 이름과 비밀번호를 확인해 주세요!',
+        'not_found_user' => '계정을 찾을 수 없습니다. 다른 로그인 방법을 시도해 주세요.',
+        'repeat_request' => '요청을 반복하지 마세요. 새로고침 후 다시 시도해 주세요.',
+        'url_timeout' => '링크가 만료되었습니다. 다시 요청해 주세요.',
     ],
     'failed' => '제출된 인증 정보가 레코드와 일치하지 않습니다.',
     'invite' => [
-        'attribute' => '초대코드',
+        'attribute' => '초대 코드',
         'error' => [
-            'unavailable' => '잘못된 초대코드입니다. 다시 시도해 주세요',
+            'unavailable' => '유효하지 않은 초대 코드입니다. 다시 시도해 주세요.',
         ],
-        'get' => '초대코드 받기',
-        'not_required' => '초대코드가 필요 없습니다. 바로 가입이 가능합니다',
+        'get' => '초대 코드 받기',
+        'not_required' => '초대 코드가 필요 없습니다. 바로 등록할 수 있습니다!',
     ],
     'login' => '로그인',
     'logout' => '로그아웃',
-    'maintenance' => '점검 중',
-    'maintenance_tip' => '점검 중입니다',
+    'maintenance' => '유지 보수',
+    'maintenance_tip' => '유지 보수 중',
     'oauth' => [
         'bind_failed' => '연동 실패',
         'bind_success' => '연동 성공',
-        'login_failed' => '소셜 로그인 실패!',
+        'login_failed' => '서드파티 로그인 실패!',
         'rebind_success' => '재연동 성공',
-        'register' => '간편 가입',
-        'register_failed' => '가입 실패',
-        'registered' => '이미 가입되었습니다. 바로 로그인해 주세요',
+        'register' => '빠른 등록',
+        'register_failed' => '등록 실패',
+        'registered' => '이미 등록되었습니다. 바로 로그인해 주세요.',
         'unbind_failed' => '연동 해제 실패',
         'unbind_success' => '연동 해제 성공',
     ],
@@ -71,30 +71,30 @@ return [
         'reset' => [
             'attribute' => '비밀번호 재설정',
             'error' => [
-                'demo' => '데모 환경에서는 관리자 비밀번호를 변경할 수 없습니다',
-                'disabled' => '비밀번호 재설정이 비활성화되었습니다. 도움이 필요하시면 :email로 문의해 주세요',
-                'failed' => '비밀번호 재설정에 실패했습니다',
-                'same' => '새 비밀번호는 이전 비밀번호와 같을 수 없습니다. 다시 입력해 주세요',
-                'throttle' => '24시간 내 비밀번호 재설정은 :time회만 가능합니다',
-                'wrong' => '현재 비밀번호가 일치하지 않습니다. 다시 입력해 주세요',
+                'demo' => '데모 모드에서는 관리자 비밀번호를 변경할 수 없습니다.',
+                'disabled' => '비밀번호 재설정이 비활성화되었습니다. 도움이 필요하면 :email로 연락해 주세요.',
+                'failed' => '비밀번호 재설정 실패.',
+                'same' => '새 비밀번호는 기존 비밀번호와 다르게 설정해 주세요.',
+                'throttle' => '24시간 내에 :time회만 비밀번호를 재설정할 수 있습니다. 너무 자주 시도하지 마세요.',
+                'wrong' => '잘못된 비밀번호입니다. 다시 입력해 주세요.',
             ],
-            'sent' => '비밀번호 재설정 링크가 귀하의 이메일로 발송되었습니다. 스팸 메일함도 확인해 주세요',
-            'success' => '새 비밀번호가 설정되었습니다. 로그인 페이지에서 로그인해 주세요',
+            'sent' => '재설정 링크가 이메일로 발송되었습니다. 메일함(스팸 폴더 포함)을 확인해 주세요.',
+            'success' => '새 비밀번호가 성공적으로 설정되었습니다. 이제 로그인할 수 있습니다.',
         ],
     ],
     'register' => [
         'attribute' => '회원가입',
-        'code' => '인증번호',
+        'code' => '회원가입 코드',
         'error' => [
-            'disable' => '죄송합니다. 현재 회원가입을 받지 않고 있습니다',
-            'throttle' => '자동 가입 방지 기능이 활성화되었습니다. 회원가입은 너무 자주 시도하지 마세요!',
+            'disable' => '죄송합니다. 현재 신규 회원 가입을 일시 중단했습니다.',
+            'throttle' => '봇 방지 시스템이 활성화되었습니다! 자주 제출하지 마세요!',
         ],
-        'failed' => '회원가입에 실패했습니다. 나중에 다시 시도해 주세요',
-        'promotion' => '계정이 없다면 ',
-        'success' => '회원가입에 성공했습니다',
+        'failed' => '등록 실패, 나중에 다시 시도해 주세요.',
+        'promotion' => '계정이 없으신가요? ',
+        'success' => '등록 성공',
     ],
-    'remember_me' => '로그인 유지',
+    'remember_me' => '기억하기',
     'request' => '요청',
     'throttle' => '너무 많은 로그인을 시도하였습니다. :seconds 초 후에 다시 시도하십시오.',
-    'tos' => '이용약관',
+    'tos' => '서비스 약관',
 ];

+ 52 - 59
resources/lang/ko/common.php

@@ -3,12 +3,12 @@
 declare(strict_types=1);
 
 return [
-    'hour' => '{1}시간|{2}시',
+    'hour' => '{1} 시간|{2} 시',
     'account' => '계정',
     'available_date' => '유효 기간',
-    'created_at' => '생성',
-    'expired_at' => '만료',
-    'updated_at' => '최종 수정일',
+    'created_at' => '생성 날짜',
+    'expired_at' => '만료 날짜',
+    'updated_at' => '마지막 업데이트',
     'latest_at' => '최근 활동',
     'back' => '뒤로',
     'back_to' => ':page로 돌아가기',
@@ -16,27 +16,27 @@ return [
     'close' => '닫기',
     'close_item' => ':attribute 닫기',
     'confirm' => '확인',
-    'continues' => '계속',
+    'continue' => '계속',
     'open' => '열기',
-    'send' => '전송',
+    'send' => '보내기',
     'view' => '보기',
-    'reset' => '초기화',
+    'reset' => '재설정',
     'copy' => [
         'attribute' => '복사',
         'success' => '복사 성공',
-        'failed' => '복사 실패, 직접 복사해주세요',
+        'failed' => '복사 실패, 수동으로 복사해 주세요',
     ],
     'add' => '추가',
     'free' => '무료',
-    'replace' => '교체',
+    'change' => '변경',
     'submit' => '제출',
     'submit_item' => ':attribute 제출',
     'generate' => '생성',
     'generate_item' => ':attribute 생성',
-    'to_safari' => [0 => '우측 상단을 클릭한 후', 1 => '에서', 2 => 'Safari로 열기', 3 => '를 선택하면 정상적으로 사이트에 접속할 수 있습니다'],
-    'update_browser' => [0 => '현재 사용 중인 브라우저가 ', 1 => '오래된', 2 => ' 버전입니다. ', 3 => '브라우저를 업데이트', 4 => '하여 최상의 경험을 얻으십시오'],
+    'to_safari' => [0 => '오른쪽 상단을 클릭', 1 => ', 그런 다음', 2 => 'Safari에서 열기', 3 => '를 선택하여 이 사이트에 정상적으로 접근하세요!'],
+    'update_browser' => [0 => '현재', 1 => '구식', 2 => ' 브라우저를 사용 중입니다. ', 3 => '브라우저를 업데이트', 4 => '하여 최상의 경험을 누리세요'],
     'apply' => '적용',
-    'avatar' => '프로필 사진',
+    'avatar' => '아바타',
     'customize' => '사용자 정의',
     'all' => '전체',
     'default' => '기본값',
@@ -50,101 +50,94 @@ return [
     'update' => '업데이트',
     'update_action' => ':action 업데이트',
     'none' => '없음',
-    'new' => '신규',
+    'new' => '새로운',
     'sorry' => '죄송합니다',
     'applied' => ':attribute 적용됨',
     'active_item' => ':attribute 활성화',
     'error' => '오류',
-    'toggle' => '토글',
-    'toggle_action' => ':action 토글',
+    'toggle' => '전환',
+    'toggle_action' => ':action 전환',
     'request_url' => '요청 URL',
     'function' => [
-        'navigation' => '네비게이션',
-        'menubar' => '메뉴 막대',
+        'navigation' => '탐색',
+        'menubar' => '메뉴',
         'fullscreen' => '전체 화면',
     ],
     'days' => [
-        'attribute' => '{1}일|{2}일',
-        'sun' => '일요일',
-        'mon' => '월요일',
-        'tue' => '화요일',
-        'wed' => '수요일',
-        'thu' => '목요일',
-        'fri' => '금요일',
-        'sat' => '토요일',
+        'attribute' => '{1} 일|{2} 일',
         'weekend' => '주말',
-        'work' => '근무일',
-        'next' => '다음날',
+        'work' => '평일',
+        'next' => '다음 날',
     ],
-    'qrcode' => ':attribute QR코드',
+    'qrcode' => ':attribute QR 코드',
     'deleted' => '삭제됨',
     'deleted_item' => ':attribute 삭제됨',
     'print' => '인쇄',
     'unlimited' => '무제한',
     'payment' => [
-        'credit' => '잔액',
-        'alipay' => '支付宝',
+        'credit' => '크레딧',
+        'alipay' => '알리페이',
         'qq' => 'QQ 지갑',
-        'wechat' => '위챗페이',
+        'wechat' => '위챗 페이',
         'crypto' => '암호화폐',
-        'manual' => '수동결제',
+        'manual' => '수동 결제',
         'status' => [
-            'wait' => '결제 대기중',
+            'wait' => '결제 대기 중',
         ],
     ],
     'order' => [
         'status' => [
-            'cancel' => '취소됨',
-            'complete' => '완료됨',
-            'prepaid' => '선결제됨',
-            'ongoing' => '사용중',
-            'review' => '검토 필요',
+            'canceled' => '취소됨',
+            'completed' => '완료됨',
+            'prepaid' => '선',
+            'ongoing' => '진행 중',
+            'review' => '검토 대기 중',
         ],
     ],
     'recommend' => '추천',
     'advance' => '고급',
-    'action' => '작',
+    'action' => '작',
     'search' => '검색',
     'edit' => '편집',
     'delete' => '삭제',
     'status' => [
         'attribute' => '상태',
-        'inactive' => '비활성',
-        'disabled' => '정지됨',
-        'banned' => '차단됨',
+        'inactive' => '비활성',
+        'disabled' => '비활성화됨',
+        'banned' => '금지됨',
         'normal' => '정상',
         'enabled' => '활성화됨',
         'expire' => '만료됨',
         'limited' => '제한됨',
-        'run_out' => '소진',
+        'run_out' => '데이터 소진',
         'unused' => '미사용',
         'used' => '사용됨',
         'closed' => '닫힘',
         'applying' => '신청 중',
-        'withdrawn' => '출금 완료',
-        'unwithdrawn' => '출금 미완료',
-        'reply' => '답변 완료',
-        'pending' => '대기 중',
+        'withdrawn' => '철회됨',
+        'unwithdrawn' => '미철회',
+        'reply' => '답변',
+        'pending' => '보류 중',
         'unknown' => '알 수 없음',
         'available' => '사용 가능',
         'reject' => '거부',
         'rejected' => '거부됨',
-        'review' => '검토 필요',
+        'review' => '검토 ',
         'reviewed' => '검토 완료',
-        'paid' => '지급 완료',
-        'payment_pending' => '지 대기 중',
-        'pass' => '승인',
-        'send_to_credit' => '잔액으로 적립',
-        'waiting_tobe_send' => '전송 예정',
+        'paid' => '지불됨',
+        'payment_pending' => '지 대기 중',
+        'pass' => '통과',
+        'send_to_credit' => '크레딧으로 추가',
+        'waiting_tobe_send' => '발송 대기 중',
     ],
-    'stay_unchanged' => '변경 없으려면 공백으로 두세요',
-    'random_generate' => '무작위 생성하려면 공백으로 두세요',
-    'request_failed' => '요청 실패, 재시도 바랍니다',
+    'stay_unchanged' => '변경하지 않으려면 비워 두세요',
+    'random_generate' => '무작위로 생성하려면 비워 두세요',
+    'request_failed' => '요청 실패, 다시 시도해 주세요',
     'convert' => '변환',
     'import' => '가져오기',
     'or' => '또는',
     'more' => '더보기',
-    'to' => '에서',
-    'to_be_send' => '송 예정',
-    'developing' => '개발 중입니다. 곧 출시됩니다!',
+    'to' => '까지',
+    'to_be_send' => '송 예정',
+    'developing' => '개발 중입니다! 기대해 주세요',
 ];

+ 22 - 22
resources/lang/ko/errors.php

@@ -4,31 +4,31 @@ declare(strict_types=1);
 
 return [
     'forbidden' => [
-        'access' => '알 수 없는 IP나 프록시 접속 감지, 접속 불가',
-        'bots' => '봇 접속 감지, 접속 불가',
-        'china' => '중국 IP나 프록시 접속 감지, 접속 불가',
-        'oversea' => '해외 IP나 프록시 접속 감지, 접속 불가',
+        'access' => '알 수 없는 IP 또는 프록시 접근이 감지되었습니다. 접근이 거부되었습니다.',
+        'bots' => '봇 접근이 감지되었습니다. 접근이 거부되었습니다.',
+        'china' => '중국 IP 또는 프록시 접근이 감지되었습니다. 접근이 거부되었습니다.',
+        'oversea' => '해외 IP 또는 프록시 접근이 감지되었습니다. 접근이 거부되었습니다.',
     ],
     'log' => '로그',
-    'refresh' => '새로고침',
-    'refresh_page' => '페이지를 새로고침 후 다시 시도해주세요',
-    'report' => '오류가 보고서를 동봉했습니다: ',
-    'safe_enter' => '안전 입장',
-    'safe_code' => '안전 코드를 입력해주세요',
+    'refresh' => '새로 고침',
+    'refresh_page' => '페이지를 새로 고친 후 다시 시도해 주세요',
+    'report' => '오류 보고서 포함: ',
+    'safe_enter' => '안전한 입구',
+    'safe_code' => '안전 코드를 입력해 주세요',
     'title' => '⚠️ 오류 발생',
-    'unsafe_enter' => '안전하지 않은 입',
-    'visit' => '방문하기',
-    'whoops' => '어머!',
-    'get_ip' => 'IP 정보 가져오기 실패',
+    'unsafe_enter' => '안전하지 않은 입',
+    'visit' => '방문해 주세요',
+    'whoops' => '이런!',
+    'get_ip' => 'IP 정보를 가져오지 못했습니다',
     'subscribe' => [
-        'unknown' => '알 수 없는 구독 링크입니다! 새로운 링크를 받으세요!',
-        'sub_baned' => '구독 차단됨! 사이트를 방문해 세부내용을 확인하세요.',
-        'user' => '잘못된 URL, 계정이 존재하지 않습니다!',
-        'user_disable' => '계정 비활성화됨! 고객센터에 문의하세요!',
-        'baned_until' => ':time 까지 계정 차단됨, 잠금 해제를 기다리세요!',
-        'out' => '데이터 소진! 더 구매하거나 데이터를 초기화하세요!',
-        'expired' => '계정 만료됨! 구매를 갱신하세요!',
-        'question' => '계정 오류! 세부내용은 사이트를 방문하세요!',
-        'none' => '사용 가능한 노드 없음',
+        'unknown' => '잘못된 구독 링크입니다! 새 링크를 받아 주세요!',
+        'sub_banned' => '구독이 차단되었습니다! 자세한 내용은 웹사이트를 방문해 주세요',
+        'user' => '잘못된 URL입니다. 계정이 존재하지 않습니다!',
+        'user_disabled' => '계정이 비활성화되었습니다! 지원팀에 문의해 주세요!',
+        'banned_until' => '계정이 :time까지 차단되었습니다. 잠금 해제될 때까지 기다려 주세요!',
+        'out' => '데이터가 소진되었습니다! 더 구매하거나 데이터를 재설정해 주세요!',
+        'expired' => '계정이 만료되었습니다! 구독을 갱신해 주세요!',
+        'question' => '계정에 문제가 있습니다! 자세한 내용은 웹사이트를 방문해 주세요',
+        'none' => '사용 가능한 노드가 없습니다',
     ],
 ];

+ 58 - 58
resources/lang/ko/model.php

@@ -7,37 +7,37 @@ return [
         'id' => '사용자 ID',
         'attribute' => '사용자',
         'nickname' => '닉네임',
-        'username' => '사용자이름',
+        'username' => '사용자 이름',
         'password' => '비밀번호',
         'credit' => '잔액',
-        'invite_num' => '사용 가능한 초대 수',
-        'reset_date' => '데이터 리셋 일자',
+        'invite_num' => '초대 가능 수',
+        'reset_date' => '데이터 초기화 날짜',
         'port' => '포트',
-        'traffic_used' => '사용 데이터',
-        'service' => '프록시',
+        'traffic_used' => '사용 데이터',
+        'service' => '프록시 서비스',
         'group' => '그룹',
         'account_status' => '계정 상태',
         'proxy_status' => '프록시 상태',
-        'expired_date' => '만료',
+        'expired_date' => '만료 날짜',
         'role' => '역할',
         'wechat' => '위챗',
         'qq' => 'QQ',
         'remark' => '비고',
         'uuid' => 'VMess UUID',
         'proxy_passwd' => '프록시 비밀번호',
-        'proxy_method' => '암호화',
+        'proxy_method' => '암호화 방식',
         'usable_traffic' => '사용 가능한 데이터',
-        'proxy_protocol' => '프로토콜',
-        'proxy_obfs' => '가림',
+        'proxy_protocol' => '프록시 프로토콜',
+        'proxy_obfs' => '혼란 방식',
         'speed_limit' => '속도 제한',
-        'inviter' => '초대',
-        'created_date' => '등록',
+        'inviter' => '초대',
+        'created_date' => '등록 날짜',
     ],
     'common' => [
         'extend' => '확장 정보',
         'sort' => '정렬',
         'description' => '설명',
-        'type' => '타입',
+        'type' => '유형',
         'level' => '레벨',
     ],
     'country' => [
@@ -50,9 +50,9 @@ return [
         'req_times' => '요청 횟수',
         'updated_at' => '마지막 요청',
         'ban_time' => '차단 시간',
-        'ban_desc' => '차단 유',
+        'ban_desc' => '차단 유',
         'req_ip' => '요청 IP',
-        'req_header' => '접근 헤더',
+        'req_header' => '요청 헤더',
     ],
     'oauth' => [
         'type' => '채널',
@@ -68,7 +68,7 @@ return [
         'id' => '노드 ID',
         'name' => '이름',
         'domain' => '도메인',
-        'static' => '생존 상태',
+        'static' => '상태',
         'online_user' => '온라인 사용자',
         'data_consume' => '데이터 사용량',
         'data_rate' => '데이터 비율',
@@ -76,7 +76,7 @@ return [
         'ipv4' => 'IPv4',
         'ipv6' => 'IPv6',
         'push_port' => '푸시 포트',
-        'rule_group' => ' 그룹',
+        'rule_group' => '규칙 그룹',
         'traffic_limit' => '속도 제한',
         'client_limit' => '클라이언트 제한',
         'label' => '라벨',
@@ -86,27 +86,27 @@ return [
         'detection' => '차단 감지',
         'method' => '암호화',
         'protocol' => '프로토콜',
-        'protocol_param' => '프로토콜 파라미터',
-        'obfs' => '가림',
-        'obfs_param' => '가림 파라미터',
+        'protocol_param' => '프로토콜 매개변수',
+        'obfs' => '혼란',
+        'obfs_param' => '혼란 매개변수',
         'single' => '단일 포트',
-        'transfer' => '릴레이',
+        'transfer' => '전송',
         'service_port' => '서비스 포트',
         'single_passwd' => '[단일] 비밀번호',
-        'v2_alter_id' => '기타 ID',
+        'v2_alter_id' => '대체 ID',
         'v2_net' => '네트워크',
-        'v2_cover' => '가장',
+        'v2_cover' => '커버',
         'v2_host' => '호스트',
         'v2_path' => '경로 | 키',
         'v2_sni' => 'SNI',
         'v2_tls' => 'TLS',
-        'v2_tls_provider' => 'TLS 설정',
+        'v2_tls_provider' => 'TLS 구성',
         'relay_port' => '릴레이 포트',
     ],
     'node_auth' => [
         'attribute' => '노드 인증',
         'key' => '키 <small>노드용</small>',
-        'secret' => '역방향 시크릿',
+        'secret' => '역방향 비밀',
     ],
     'node_cert' => [
         'attribute' => '도메인 인증서',
@@ -114,15 +114,15 @@ return [
         'key' => '키',
         'pem' => 'PEM',
         'issuer' => '발급자',
-        'signed_date' => '발급',
-        'expired_date' => '만료',
+        'signed_date' => '발급 날짜',
+        'expired_date' => '만료 날짜',
     ],
     'order' => [
         'attribute' => '주문',
-        'id' => '주문번호',
-        'original_price' => '원가',
+        'id' => '주문 ID',
+        'original_price' => '원',
         'price' => '실제 가격',
-        'pay_way' => '결제수단',
+        'pay_way' => '결제 방식',
         'status' => '상태',
     ],
     'goods' => [
@@ -132,12 +132,12 @@ return [
         'category' => '카테고리',
         'renew' => '데이터 갱신 가격',
         'user_limit' => '사용자 속도 제한',
-        'period' => '리셋 주기',
-        'traffic' => '데이터 한도',
-        'invite_num' => '보너스 초대',
+        'period' => '초기화 주기',
+        'traffic' => '데이터 허용량',
+        'invite_num' => '보너스 초대',
         'limit_num' => '구매 제한',
         'available_date' => '유효 기간',
-        'hot' => '인기상품',
+        'hot' => '베스트셀러',
         'color' => '색상',
         'logo' => '로고',
         'info' => '사용자 정의 정보',
@@ -164,12 +164,12 @@ return [
         'name' => '경로 이름',
     ],
     'article' => [
-        'attribute' => '게시글',
+        'attribute' => '기사',
         'category' => '카테고리',
         'language' => '언어',
         'logo' => '표지',
-        'created_at' => '게시',
-        'updated_at' => '수정일',
+        'created_at' => '게시 날짜',
+        'updated_at' => '업데이트 날짜',
     ],
     'coupon' => [
         'attribute' => '쿠폰',
@@ -178,34 +178,34 @@ return [
         'logo' => '로고',
         'value' => '가치',
         'priority' => '우선순위',
-        'usable_times' => '사용 횟수 제한',
-        'minimum' => '최소 구매금액',
-        'used' => '개인 사용 제한',
-        'levels' => '등급 제한',
+        'usable_times' => '사용 제한',
+        'minimum' => '최소 사용 금액',
+        'used' => '개인 제한',
+        'levels' => '레벨 제한',
         'groups' => '그룹 제한',
-        'users_whitelist' => '화이트리스트 사용자',
-        'users_blacklist' => '블랙리스트 사용자',
-        'services_whitelist' => '화이트리스트 상품',
-        'services_blacklist' => '블랙리스트 상품',
+        'users_whitelist' => '허용 사용자',
+        'users_blacklist' => '차단 사용자',
+        'services_whitelist' => '허용 상품',
+        'services_blacklist' => '차단 상품',
         'newbie' => '신규 사용자 전용',
         'num' => '수량',
     ],
     'aff' => [
         'invitee' => '구매자',
-        'amount' => '구매금액',
+        'amount' => '주문 금액',
         'commission' => '커미션',
-        'updated_at' => '처리',
-        'created_at' => '주문',
+        'updated_at' => '처리 날짜',
+        'created_at' => '주문 날짜',
     ],
     'referral' => [
-        'created_at' => '신청',
+        'created_at' => '신청 날짜',
         'user' => '신청자',
         'amount' => '금액',
-        'id' => '신청번호',
+        'id' => '신청 ID',
     ],
     'notification' => [
         'address' => '수신자',
-        'created_at' => '발송',
+        'created_at' => '발송 날짜',
         'status' => '상태',
     ],
     'ip' => [
@@ -215,18 +215,18 @@ return [
     'user_traffic' => [
         'upload' => '업로드',
         'download' => '다운로드',
-        'total' => '총',
+        'total' => '총 데이터',
         'log_time' => '기록 시간',
     ],
     'user_data_modify' => [
-        'before' => '전',
-        'after' => '후',
-        'created_at' => '변경',
+        'before' => '변경 전',
+        'after' => '변경 후',
+        'created_at' => '변경 날짜',
     ],
     'user_credit' => [
-        'before' => '이전',
-        'after' => '이후',
-        'amount' => '금액',
-        'created_at' => '변경',
+        'before' => '변경 전 잔액',
+        'after' => '변경 후 잔액',
+        'amount' => '변경 금액',
+        'created_at' => '변경 날짜',
     ],
 ];

+ 24 - 24
resources/lang/ko/notification.php

@@ -4,34 +4,34 @@ declare(strict_types=1);
 
 return [
     'attribute' => '알림',
-    'new' => ':num개의 새 메시지가 있습니다',
-    'empty' => '새 메시지가 없습니다',
-    'payment_received' => '결제가 완료되었습니다. 금액: :amount. 주문 내역을 확인하세요.',
+    'new' => '새 메시지가 :num개 있습니다',
+    'empty' => '현재 새 메시지가 없습니다',
+    'payment_received' => '주문 결제가 완료되었습니다. 금액: :amount, 주문 세부사항을 확인하세요',
     'account_expired' => '계정 만료 알림',
-    'account_expired_content' => '귀하의 계정이 :days일 후에 만료됩니다. 서비스를 계속 사용하기 위해서는 즉시 갱신하시기 바랍니다.',
-    'account_expired_blade' => ':days일 후 계정이 만료됩니다. 즉시 갱신하세요.',
-    'active_email' => '30분 이내에 인증을 완료하세요',
-    'close_ticket' => '티켓 :id: :title이 닫혔습니다',
-    'view_web' => '웹사이트 방문하기',
-    'view_ticket' => '티켓 확인하기',
-    'new_ticket' => '새 티켓이 도착했습니다: :title',
+    'account_expired_content' => '귀하의 계정이 :days일 후에 만료됩니다. 정상적인 사용을 위해 즉시 갱신해 주세요',
+    'account_expired_blade' => '귀하의 계정이 :days일 후에 만료됩니다. 즉시 갱신해 주세요',
+    'active_email' => '30분 내에 인증을 완료해 주세요',
+    'close_ticket' => '티켓 번호:id, 제목:title이(가) 닫혔습니다',
+    'view_web' => '우리의 웹사이트 방문',
+    'view_ticket' => '이 티켓의 진행 상황 보기',
+    'new_ticket' => '새 티켓:title에 대한 답변이 있습니다. 확인해 주세요',
     'reply_ticket' => '티켓 답변: :title',
     'ticket_content' => '티켓 내용:',
-    'node_block' => '노드 차단 알림',
-    'node_offline' => '노드 오프라인 알림',
-    'node_offline_content' => '비정상 노드, 오프라인 의심:',
+    'node_block' => '노드 차단 경고 알림',
+    'node_offline' => '노드 오프라인 경고',
+    'node_offline_content' => '다음 노드가 비정상적일 수 있습니다. 오프라인일 가능성이 있습니다:',
     'block_report' => '상세 차단 로그:',
-    'traffic_warning' => '데이터 사용량 알림',
-    'traffic_remain' => '데이터 사용률 :percent%, 주의하세요',
-    'traffic_tips' => '데이터 리셋 일자에 유의하시고 합리적으로 사용하거나 소진 시 갱신하세요',
-    'verification_account' => '계정 인증',
-    'verification' => '귀하의 인증코드:',
-    'verification_limit' => ':minutes분 이내에 인증을 완료하세요',
-    'data_anomaly' => '데이터 이상 사용자 경고',
-    'data_anomaly_content' => '사용자 :id: 지난 1시간 동안 [업로드: :upload | 다운로드: :download | 총 사용량: :total]',
+    'traffic_warning' => '데이터 사용량 경고',
+    'traffic_remain' => '귀하의 데이터 사용량이 :percent%입니다. 합리적으로 사용해 주세요',
+    'traffic_tips' => '데이터 초기화 날짜에 유의하고, 합리적으로 사용하거나 소진 후 충전해 주세요',
+    'verification_account' => '계정 인증 알림',
+    'verification' => '귀하의 인증 코드:',
+    'verification_limit' => ':minutes분 내에 인증을 완료해 주세요',
+    'data_anomaly' => '데이터 이상 사용자 알림',
+    'data_anomaly_content' => '사용자:id, 최근 1시간 데이터 사용량 (업로드: :upload, 다운로드: :download, 총계: :total)',
     'node' => [
-        'upload' => '업로드',
-        'download' => '다운로드',
-        'total' => '총',
+        'upload' => '업로드 트래픽',
+        'download' => '다운로드 트래픽',
+        'total' => '총 트래픽',
     ],
 ];

+ 120 - 120
resources/lang/ko/user.php

@@ -4,233 +4,233 @@ declare(strict_types=1);
 
 return [
     'account' => [
-        'credit' => '잔액',
+        'credit' => '계정 잔액',
         'status' => '계정 상태',
         'level' => '계정 등급',
-        'group' => '그룹',
+        'group' => '소속 그룹',
         'speed_limit' => '속도 제한',
         'remain' => '남은 데이터',
-        'time' => '기간',
+        'time' => '플랜 유효 기간',
         'last_login' => '최근 로그인',
-        'reset' => '{0} <code id="restTime">:days</code> 후에 데이터가 리셋됩니다 |{1} 데이터가 리셋되기 :days일 남았습니다 |[2,*] 데이터가 리셋되기 :days일 남았습니다',
+        'reset' => '{0} 데이터가 <code id="restTime">:days</code> 후에 초기화됩니다 |{1} 데이터 초기화까지 :days 일 남았습니다 |[2,*] 데이터 초기화까지 :days 일 남았습니다',
         'connect_password' => '프록시 연결 비밀번호',
         'reason' => [
-            'normal' => '계정 정상',
-            'expired' => '구독 기간이 만료되었습니다',
-            'overused' => '<code>:data</code> GB 시간제한 초과<br/><code id="banedTime">:min</code> 후 제한 해제',
-            'traffic_exhausted' => '데이터 소진',
-            'unknown' => '알 수 없는 오류입니다. 먼저 브라우저를 새로고침한 후 고객센터에 문의하세요',
+            'normal' => '계정 정상입니다',
+            'expired' => '플랜이 만료되었습니다',
+            'overused' => '이 기간 동안 <code>:data</code> GB를 초과 사용했습니다<br/> 제한은 <code id="banedTime">:min</code> 분 후 해제됩니다',
+            'traffic_exhausted' => '데이터 소진되었습니다',
+            'unknown' => '알 수 없는 이유입니다. 브라우저를 새로 고침해 보세요! 문제가 지속되면 지원팀에 문의하세요.',
         ],
     ],
     'home' => [
         'attendance' => [
-            'attribute' => '출석체크',
-            'disable' => '출석체크 비활성화',
-            'done' => '이미 출석체크 했습니다. 내일 다시 오세요!',
+            'attribute' => '출석 체크',
+            'disable' => '출석 체크 비활성화',
+            'done' => '이미 출석 체크를 완료했습니다. 내일 다시 시도하세요!',
             'success' => ':data 데이터를 받았습니다',
-            'failed' => '시스템 오류',
+            'failed' => '시스템 오류',
         ],
         'traffic_logs' => '데이터 기록',
         'announcement' => '공지사항',
-        'wechat_push' => '위챗 공지 알림',
-        'chat_group' => '채팅',
-        'empty_announcement' => '공지사항 없음',
+        'wechat_push' => 'WeChat 알림',
+        'chat_group' => '채팅 그룹',
+        'empty_announcement' => '공지사항이 없습니다',
     ],
-    'purchase_to_unlock' => '구매 후 잠금해제',
-    'purchase_required' => '유료 사용자만 사용 가능합니다. ',
+    'purchase_to_unlock' => '구매하여 잠금 해제',
+    'purchase_required' => '이 기능은 유료 사용자만 사용할 수 있습니다. 먼저',
     'attribute' => [
         'node' => '노드',
         'data' => '데이터',
-        'ip' => 'IP',
+        'ip' => 'IP 주소',
         'isp' => 'ISP',
         'address' => '위치',
     ],
-    'purchase_promotion' => '지금 서비스 구매하기!',
+    'purchase_promotion' => '지금 서비스를 구매하세요!',
     'menu' => [
-        'helps' => '도움말',
+        'help' => '도움말',
         'home' => '홈',
         'invites' => '초대',
-        'invoices' => '주문내역',
+        'invoices' => '청구서',
         'nodes' => '노드',
-        'referrals' => '추천',
+        'promotion' => '추천',
         'shop' => '상점',
         'profile' => '프로필',
         'tickets' => '티켓',
-        'admin_dashboard' => '관리',
+        'admin_dashboard' => '관리 대시보드',
     ],
     'contact' => '연락처',
     'oauth' => [
         'bind_title' => '소셜 계정 연결',
-        'not_bind' => '연결 안됨',
+        'not_bind' => '연결되지 않음',
         'bind' => '연결',
-        'rebind' => '연결',
-        'unbind' => '연결끊기',
+        'rebind' => '다시 연결',
+        'unbind' => '연결 해제',
     ],
     'coupon' => [
         'discount' => '할인',
         'error' => [
-            'unknown' => '잘못된 쿠폰',
-            'used' => '사용된 쿠폰',
+            'unknown' => '유효하지 않은 쿠폰',
+            'used' => '이미 사용된 쿠폰',
             'expired' => '만료된 쿠폰',
             'run_out' => '소진된 쿠폰',
-            'inactive' => '활성 쿠폰',
-            'wait' => ':time에 활성화됩니다. 기다려주세요!',
-            'unmet' => '조건 충족',
-            'minimum' => '최소 금액 :amount',
-            'overused' => ':times번만 사용 가능',
-            'users' => '프로모션 대상 계정 아님',
-            'services' => '프로모션 대상 상품 아님, 약관 확인',
+            'inactive' => '활성화되지 않은 쿠폰',
+            'wait' => ':time에 활성화됩니다. 기다려 주세요!',
+            'unmet' => '조건 충족하지 않음',
+            'minimum' => '최소 금액 :amount입니다',
+            'overused' => ':times회만 사용할 수 있습니다',
+            'users' => '계정이 프로모션 조건에 맞지 않습니다',
+            'services' => '상품이 할인 조건에 맞지 않습니다. 프로모션 약관 확인하세요',
         ],
     ],
     'error_response' => '오류가 발생했습니다. 나중에 다시 시도하세요.',
     'invite' => [
-        'attribute' => '초대코드',
-        'counts' => '총 <code>:num</code> 개 초대코드',
-        'tips' => '남은 초대코드 <strong>:num</strong> 개, 생성 후 :days일 동안 유효',
-        'logs' => '초대 기록',
-        'promotion' => '귀하 코드로 가입 및 활성화시 양측 모두 :traffic 데이터를 받습니다. 구매시 :referral_percent%의 커미션을 받습니다',
-        'generate_failed' => '실패: 초과',
+        'attribute' => '초대 코드',
+        'counts' => '총 <code>:num</code> 개 초대 코드',
+        'tips' => '<strong>:num</strong> 개의 초대 가능, 코드 생성 후 :days 일 내에 만료됩니다',
+        'logs' => '초대 로그',
+        'promotion' => '귀하와 초대된 사용자는 등록 시 <mark>:traffic</mark> 데이터를 받습니다. 그들이 구매할 때마다 귀하는 구매 금액의 <mark>:referral_percent%</mark>를 커미션으로 받습니다.',
+        'generate_failed' => '생성 실패: 할당량 초과',
     ],
     'reset_data' => [
-        'action' => '데이터 리셋',
-        'cost' => '<code>:amount</code> 소모',
-        'cost_tips' => ':amount 차감!',
-        'lack' => '잔액 부족, 충전 필요',
-        'logs' => '사용자 데이터 리셋',
-        'success' => '리셋 성공',
+        'action' => '데이터 초기화',
+        'cost' => '비용: <code>:amount</code>',
+        'cost_tips' => '초기화 시 :amount 차감됩니다!',
+        'insufficient' => '잔액 부족, 충전해 주세요',
+        'logs' => '사용자 데이터 초기화',
+        'success' => '초기화 성공',
     ],
     'referral' => [
         'link' => '추천 링크',
-        'total' => '총 커미션 :amount (:total 회), :money 이상 시 출금 가능',
-        'logs' => '커미션 기록',
-        'failed' => '실패',
-        'success' => '성공',
+        'total' => '총 커미션: :amount (:total 회), :money 이상일 때 인출 가능',
+        'logs' => '커미션 로그',
+        'failed' => '요청 실패',
+        'success' => '요청 성공',
         'msg' => [
-            'account' => '계정 만료됨, 먼저 구매 필요',
-            'applied' => '이미 신청 중, 처리 대기 중',
-            'unfulfilled' => '출금 최소금액 :amount, 계속 노력하세요!',
-            'wait' => '관리자 승인 대기 중',
-            'error' => '오류로 인해 주문 생성 실패, 재시도나 관리자에게 문의',
+            'account' => '계정이 만료되었습니다. 먼저 플랜을 구매하세요',
+            'applied' => '이미 요청이 있습니다. 처리 대기 중입니다',
+            'unfulfilled' => ':amount 이상 필요합니다. 계속 노력하세요!',
+            'wait' => '관리자 승인을 기다려 주세요',
+            'error' => '주문 생성 오류. 나중에 다시 시도하거나 지원팀에 문의하세요',
         ],
     ],
     'inviter' => '초대자',
-    'invitee' => '피초대자',
-    'registered_at' => '가입일',
-    'bought_at' => '구매',
-    'payment_method' => '결제수단',
-    'pay' => '결제',
-    'input_coupon' => '쿠폰번호 입력',
+    'invitee' => '초대된 사람',
+    'registered_at' => '등록 날짜',
+    'bought_at' => '구매 날짜',
+    'payment_method' => '결제 방법',
+    'pay' => '지불',
+    'input_coupon' => '쿠폰 코드를 입력하세요',
     'recharge' => '충전',
     'recharge_credit' => '잔액 충전',
     'recharging' => '충전 중...',
-    'withdraw_commission' => '커미션 출',
-    'withdraw_at' => '출금일',
-    'withdraw_logs' => '출금 기록',
-    'withdraw' => '출',
-    'scan_qrcode' => '클라이언트에서 QR코드 스캔',
+    'withdraw_commission' => '커미션 출',
+    'withdraw_at' => '인출 날짜',
+    'withdraw_logs' => '인출 로그',
+    'withdraw' => '출',
+    'scan_qrcode' => '클라이언트로 QR 코드를 스캔하세요',
     'shop' => [
         'hot' => '인기',
-        'limited' => '수량 한정',
-        'change_amount' => '충전금액',
-        'change_amount_help' => '충전금액 입력',
+        'limited' => '한정',
+        'change_amount' => '충전 금액',
+        'change_amount_help' => '충전 금액 입력하세요',
         'buy' => '구매',
         'description' => '설명',
         'service' => '서비스',
-        'pay_credit' => '잔액',
+        'pay_credit' => '잔액으로 결제',
         'pay_online' => '온라인 결제',
         'price' => '가격',
         'quantity' => '수량',
         'subtotal' => '소계',
         'total' => '합계',
         'conflict' => '충돌',
-        'conflict_tips' => '<p>현재 구매가 <code>선결제</code>로 설정됩니다</p><ol><li>현재 구독 기간 만료 후 자동 활성화!</li><li>결제 후 수동 활성화 가능</li></ol>',
-        'call4help' => '관리자에게 문의',
+        'conflict_tips' => '<p>현재 구매는 <code>선불 플랜</code>으로 설정됩니다</p><ol><li>선불 플랜은 현재 플랜이 만료된 후 자동으로 활성화됩니다</li><li>결제 후 주문 페이지에서 수동으로 활성화할 수 있습니다</li></ol>',
+        'call4help' => '질문이 있으면 지원팀에 문의하세요',
     ],
     'service' => [
-        'node_count' => ':num 개의 양질의 노드',
-        'country_count' => ':num 개 국가 커버',
-        'unlimited' => '무제한',
+        'node_count' => '<code>:num</code> 개의 고품질 노드',
+        'country_count' => '<code>:num</code> 개국 또는 지역을 커버',
+        'unlimited' => '속도 제한 없음',
     ],
     'payment' => [
-        'error' => '잘못된 충전 금액',
+        'error' => '유효하지 않은 충전 금액',
         'creating' => '결제 생성 중...',
-        'redirect_stripe' => 'Stripe로 리디렉션',
-        'qrcode_tips' => '<strong class="red-600">:software</strong>로 스캔',
-        'close_tips' => '<code>:minutes분</code> 이내 결제하세요. 그렇지 않으면 주문이 취소됩니다',
-        'mobile_tips' => '<strong>모바일:</strong> QR코드 길게 누르기 -> 이미지 저장 -> 결제앱 열기 -> 이미지 스캔하여 결제',
+        'redirect_stripe' => 'Stripe 결제 페이지로 이동 중',
+        'qrcode_tips' => '<strong class="red-600">:software</strong>로 QR 코드를 스캔하세요',
+        'close_tips' => '<code>:minutes</code> 분 내에 결제를 완료하세요, 그렇지 않으면 주문이 자동으로 닫힙니다',
+        'mobile_tips' => '<strong>모바일 사용자:</strong> QR 코드를 길게 눌러 -> 이미지 저장 -> 결제 앱 열기 -> 이미지 스캔하여 결제',
     ],
     'invoice' => [
         'attribute' => '주문',
-        'detail' => '기록',
+        'detail' => '주문 내역',
         'amount' => '금액',
-        'active_prepaid_question' => '선결제 상품 미리 활성화하시겠습니까?',
-        'active_prepaid_tips' => '활성화 후:<br>- 현재 구독 즉시 만료!<br>- 새로운 만료일은 오늘부터 계산!',
+        'active_prepaid_question' => '선불 패키지를 조기 활성화하시겠습니까?',
+        'active_prepaid_tips' => '활성화 후:<br>현재 계정 플랜이 즉시 만료됩니다<br>새 플랜의 만료 날짜가 오늘부터 다시 계산됩니다',
     ],
     'node' => [
-        'info' => '설정',
-        'setting' => '설정',
+        'info' => '구성 정보',
+        'setting' => '프록시 설정',
         'unstable' => '불안정/유지보수 중',
-        'rate' => ':ratio 배 데이터 소',
+        'rate' => ':ratio 배 데이터 소',
     ],
     'subscribe' => [
         'link' => '구독 링크',
-        'tips' => '경고: 개인용으로만 사용, 공유하지 마세요. 그렇지 않으면 비정상 트래픽 감지로 차단될 수 있습니다',
-        'exchange_warning' => '구독 변경시:\n1. 현재 구독 즉시 비활성화\n2. 연결 비밀번호 변경',
-        'custom' => '사용자 정의 구독',
+        'tips' => '경고: 이 링크는 개인용으로만 사용하세요. 공유하지 마세요, 그렇지 않으면 계정이 비정상적인 사용으로 인해 차단될 수 있습니다.',
+        'exchange_warning' => '구독 링크를 변경하면:\n1. 기존 링크가 즉시 무효화됩니다\n2. 연결 비밀번호가 변경됩니다',
+        'custom' => '맞춤 구독',
         'ss_only' => 'SS만 구독',
-        'ssr_only' => 'SSR만 구독(SS 포함)',
+        'ssr_only' => 'SSR(SS 포함)만 구독',
         'v2ray_only' => 'V2Ray만 구독',
         'trojan_only' => 'Trojan만 구독',
-        'error' => '구독 변경 오류',
+        'error' => '구독 링크 변경 실패',
         'info' => [
             'title' => '계정 요약 [실시간 아님]',
-            'upload' => '업로드',
-            'download' => '다운로드',
-            'total' => '구독 데이터',
+            'upload' => '업로드 데이터',
+            'download' => '다운로드 데이터',
+            'total' => '플랜 데이터',
         ],
     ],
     'ticket' => [
         'attribute' => '티켓',
-        'submit_tips' => '티켓 제출하시겠습니까?',
-        'reply_confirm' => '티켓 답변하시겠습니까?',
-        'close_tips' => '티켓 닫기하시겠습니까?',
+        'submit_tips' => '티켓 제출하시겠습니까?',
+        'reply_confirm' => '티켓 답변하시겠습니까?',
+        'close_tips' => '티켓을 닫으시겠습니까?',
         'close' => '티켓 닫기',
-        'failed_closed' => '오류: 이미 닫',
-        'reply_placeholder' => '답변 입력...',
+        'failed_closed' => '오류: 이미 닫힌 티켓',
+        'reply_placeholder' => '무엇인가 적어보세요...',
         'reply' => '답변',
-        'close_msg' => '사용자가 티켓 닫기: ID :id',
-        'title_placeholder' => '문제 유형을 간단히 설명하세요',
-        'content_placeholder' => '문제를 자세히 설명하세요. 빠른 해결을 위해 도움이 됩니다',
-        'new' => '새 티켓',
-        'working_hour' => '근무 시간',
+        'close_msg' => '티켓 ID :id 사용자가 수동으로 닫았습니다',
+        'title_placeholder' => '문제 유형 또는 관련 내용을 간단히 설명하세요',
+        'content_placeholder' => '문제 또는 도움이 필요한 부분을 자세히 설명해 주세요, 저희가 빠르게 해결할 수 있도록 도와드립니다',
+        'new' => '새 티켓 생성',
+        'service_hours' => '고객 서비스 시간',
         'online_hour' => '온라인 시간',
-        'service_tips' => '연락 수단은 하나만 사용해주세요! 반복 요청시 답변 지연',
-        'error' => '알 수 없는 오류! 관리자에게 알리세요',
+        'service_tips' => '지원팀에 연락하려면 <code>하나의</code> 연락 방법만 사용하세요! 반복된 요청은 응답 시간을 지연시킵니다.',
+        'error' => '알 수 없는 오류가 발생했습니다! 지원팀에 문의하세요',
     ],
     'traffic_logs' => [
-        '24hours' => '오늘 사용량',
-        '30days' => '이번달 사용량',
-        'tips' => '참고: 통계 지연됨, 일별은 다음날 업데이트, 시간별은 다음 시간 업데이트',
+        'hourly' => '오늘 데이터 사용량',
+        'daily' => '이번  데이터 사용량',
+        'tips' => '참고: 데이터 통계 업데이트에는 지연이 있습니다.',
     ],
-    'client' => '클라이언트',
+    'clients' => '클라이언트',
     'tutorials' => '튜토리얼',
     'current_role' => '현재 역할',
     'knowledge' => [
-        'title' => '지식베이스',
+        'title' => '지식 베이스',
         'basic' => '기본',
     ],
     'manual' => [
-        'red_packet' => '알리페이 적요',
-        'hint' => 'QR코드 스캔 후 계속 [다음]을 누르고 [제출]을 누를 때까지 진행하세요.',
-        'step_1' => '참고',
+        'red_packet' => '알리페이 레드 패킷',
+        'hint' => 'QR 코드를 스캔한 후, 계속 [다음]을 클릭하여 [제출]을 클릭해야 결제가 완료됩니다!',
+        'step_1' => '주의사항',
         'step_1_title' => '수동 결제 방법',
         'step_2' => '결제',
-        'step_2_title' => '결제 QR코드 받기',
+        'step_2_title' => 'QR 코드아 결제하기',
         'step_3' => '완료',
-        'step_3_title' => '수동 검토 기다리는 중',
+        'step_3_title' => '수동 확인 대기',
         'remark' => '계정 비고',
-        'remark_content' => '로그인 계정 입력 확인용',
-        'payment_hint' => '정확한 금액 결제하세요. 결제취소/환불 없음',
+        'remark_content' => '정확한 수동 확인을 위해 로그인 계정을 입력하세요',
+        'payment_hint' => '정확한 금액을 결제하세요 (초과 결제는 환불되지 않으며, 부족한 금액은 추가 결제 필요)',
         'pre' => '이전',
         'next' => '다음',
     ],

+ 49 - 0
resources/lang/ko/validation.php

@@ -143,37 +143,62 @@ return [
     'uuid' => ':Attribute은(는) 유효한UUID여야합니다.',
     'attributes' => [
         'address' => '주소',
+        'affiliate_url' => '제휴 URL',
         'age' => '나이',
         'amount' => '양',
+        'announcement' => '발표',
         'area' => '지역',
+        'audience_prize' => '관객상',
         'available' => '사용 가능',
         'birthday' => '생신',
         'body' => '몸',
         'city' => '도시',
+        'compilation' => '편집',
+        'concept' => '개념',
+        'conditions' => '정황',
         'content' => '내용',
         'country' => '나라',
+        'cover' => '씌우다',
         'created_at' => '에 생성됨',
         'creator' => '창조자',
+        'currency' => '통화',
         'current_password' => '현재 비밀번호',
+        'customer' => '고객',
         'date' => '날짜',
         'date_of_birth' => '생일',
+        'dates' => '날짜',
         'day' => '일',
         'deleted_at' => '에서 삭제됨',
         'description' => '상세설명',
+        'display_type' => '디스플레이 유형',
         'district' => '구역',
         'duration' => '지속',
         'email' => '이메일',
         'excerpt' => '발췌',
         'filter' => '필터',
+        'finished_at' => '에 끝났다',
         'first_name' => '이름',
         'gender' => '성별',
+        'grand_prize' => '큰 상',
         'group' => '그룹',
         'hour' => '시',
         'image' => '영상',
+        'image_desktop' => '데스크톱 이미지',
+        'image_main' => '메인 이미지',
+        'image_mobile' => '모바일 이미지',
+        'images' => '이미지',
+        'is_audience_winner' => '청중의 승자인가',
+        'is_hidden' => '숨겨져 있다',
+        'is_subscribed' => '구독중입니다',
+        'is_visible' => '눈에 보인다',
+        'is_winner' => '승자입니다',
+        'items' => '아이템',
+        'key' => '열쇠',
         'last_name' => '성',
         'lesson' => '수업',
         'line_address_1' => '회선 주소 1',
         'line_address_2' => '회선 주소 2',
+        'login' => '로그인',
         'message' => '메시지',
         'middle_name' => '중간 이름',
         'minute' => '분',
@@ -186,22 +211,43 @@ return [
         'password_confirmation' => '비밀번호 확인',
         'phone' => '전화번호',
         'photo' => '사진',
+        'portfolio' => '포트폴리오',
         'postal_code' => '우편 번호',
+        'preview' => '시사',
         'price' => '가격',
+        'product_id' => '제품 ID',
+        'product_uid' => '제품 UID',
+        'product_uuid' => '제품 UUID',
+        'promo_code' => '프로모션 코드',
         'province' => '주',
+        'quantity' => '수량',
+        'reason' => '이유',
         'recaptcha_response_field' => 'recaptcha 응답 필드',
+        'referee' => '심판',
+        'referees' => '심판',
+        'reject_reason' => '거부 이유',
         'remember' => '기억하다',
         'restored_at' => '복원',
         'result_text_under_image' => '이미지 아래의 결과 텍스트',
         'role' => '규칙',
+        'rule' => '규칙',
+        'rules' => '규칙',
         'second' => '초',
         'sex' => '성별',
+        'shipment' => '선적',
         'short_text' => '짧은 텍스트',
         'size' => '크기',
+        'skills' => '기술',
+        'slug' => '강타',
+        'specialization' => '전문화',
+        'started_at' => '시작 시간',
         'state' => '상태',
+        'status' => '상태',
         'street' => '거리',
         'student' => '학생',
         'subject' => '주제',
+        'tag' => '꼬리표',
+        'tags' => '태그',
         'teacher' => '선생님',
         'terms' => '약관',
         'test_description' => '테스트 설명',
@@ -210,8 +256,11 @@ return [
         'text' => '텍스트',
         'time' => '시간',
         'title' => '제목',
+        'type' => '유형',
         'updated_at' => '에 업데이트됨',
+        'user' => '사용자',
         'username' => '유저네임',
+        'value' => '값',
         'year' => '년',
     ],
 ];

+ 129 - 56
resources/lang/vi.json

@@ -1,57 +1,130 @@
 {
-    "(and :count more error)": "(và :count lỗi khác)",
-    "(and :count more errors)": "(và :count lỗi khác)",
-    "All rights reserved.": "Đã đăng kí bản quyền",
-    "Forbidden": "Cấm Truy Cập",
-    "Go to page :page": "Tới trang :page",
-    "Hello!": "Xin chào!",
-    "If you did not create an account, no further action is required.": "Nếu bạn không đăng ký tài khoản này, bạn không cần thực hiện thêm hành động nào.",
-    "If you did not request a password reset, no further action is required.": "Nếu bạn không yêu cầu đặt lại mật khẩu, bạn không cần thực hiện thêm hành động nào.",
-    "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Nếu bạn gặp vấn đề khi click vào nút \":actionText\", hãy sao chép dán địa chỉ bên dưới\nvào trình duyệt web của bạn:",
-    "Invalid JSON was returned from the route.": "JSON không hợp lệ đã được trả về từ tuyến đường.",
-    "Login": "Đăng nhập",
-    "Logout": "Đăng xuất",
-    "Not Found": "Không Tìm Thấy",
-    "of": "trong",
-    "Page Expired": "Trang Đã Hết Hạn",
-    "Pagination Navigation": "Điều hướng phân trang",
-    "Payment Required": "yêu cầu thanh toán",
-    "Please click the button below to verify your email address.": "Vui lòng click vào nút bên dưới để xác minh địa chỉ email của bạn.",
-    "Regards": "Trân trọng",
-    "Register": "Đăng ký",
-    "Reset Password": "Đặt Lại Mật Khẩu",
-    "Reset Password Notification": "Thông Báo Đặt Lại Mật Khẩu",
-    "results": "kết quả",
-    "Server Error": "Máy Chủ Gặp Sự Cố",
-    "Service Unavailable": "Dịch Vụ Không Khả Dụng",
-    "Showing": "Đang hiển thị",
-    "The given data was invalid.": "Dữ liệu nhận được không hợp lệ.",
-    "The response is not a streamed response.": "Phản hồi không phải là phản hồi được phát trực tuyến.",
-    "The response is not a view.": "Phản hồi không phải là một lượt xem.",
-    "This password reset link will expire in :count minutes.": "Đường dẫn lấy lại mật khẩu sẽ hết hạn trong :count phút.",
-    "to": "tới",
-    "Toggle navigation": "Chuyển hướng điều hướng",
-    "Too Many Requests": "Quá Nhiều Yêu Cầu",
-    "Unauthorized": "Không Được Phép",
-    "Verify Email Address": "Xác Minh Địa Chỉ Email",
-    "Whoops!": "Rất tiếc!",
-    "You are receiving this email because we received a password reset request for your account.": "Bạn nhận được email này vì chúng tôi đã nhận được yêu cầu đặt lại mật khẩu cho tài khoản của bạn.",
-    "----「:job」Completed, Used :time seconds ----": "----「:job」Đã hoàn thành, Mất :time giây ----",
-    "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[Nhiệm vụ Tự động] Chặn dịch vụ: Lưu lượng bất thường trong 1 giờ",
-    "[Auto Task] Blocked service: Run out of traffic": "[Nhiệm vụ Tự động] Chặn dịch vụ: Hết dữ liệu",
-    "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[Nhiệm vụ Tự động] Chặn đăng ký: Đăng ký có yêu cầu bất thường trong vòng 24 giờ",
-    "[Daily Task] Account Expiration: Block Login & Clear Account": "[Nhiệm vụ Hàng ngày] Hết hạn Tài khoản: Chặn Đăng nhập & Xóa Tài khoản",
-    "[Daily Task] Account Expiration: Stop Service": "[Nhiệm vụ Hàng ngày] Hết hạn Tài khoản: Ngừng Dịch vụ",
-    "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[Nhiệm vụ Hàng ngày] Đặt lại Dữ liệu Tài khoản, Ngày đặt lại tiếp theo: :date",
-    "[Service Timer] Service Expiration": "[Hẹn giờ Dịch vụ] Dịch vụ đã Hết hạn",
-    "Daily Data Usage Report": "Báo cáo Sử dụng Dữ liệu Hàng ngày ",
-    "Invoice Detail": "Chi tiết Hóa đơn",
-    "Payment for #:sn has been received! Total amount: :amount.": "Đã nhận Thanh toán cho #:sn! Tổng số tiền: :amount.",
-    "Payment Received": "Đã Nhận Thanh toán",
-    "Subscription link receive abnormal access and banned by the system": "订阅链接访问异常,系统自动封禁",
-    "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "感谢您的注册! 在开始之前,您需要通过点击我们刚刚发送至您邮箱中的链接来验证您的电子邮件! 如果您没有收到电子邮件,我们很乐意再发送一封给您。",
-    "Verify Your Email Address": "Xác Minh Địa Chỉ Email Của Bạn",
-    "You have not responded this ticket in :num hours, System has closed your ticket.": "超过:num小时未回复工单,系统已自动关闭了您的工单",
-    "You must have a valid subscription to view the content in this area!": "您必须拥有有效套餐才可以查看该区域的内容!",
-    "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "订阅功能被禁用,请联系管理员恢复"
-}
+  "(and :count more error)": "(và :count lỗi khác)",
+  "(and :count more errors)": "(và :count lỗi khác)",
+  "----「:job」Completed, Used :time seconds ----": "----「:job」Đã hoàn thành, mất :time giây ----",
+  "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[Tự động] Dịch vụ bị chặn: Lưu lượng bất thường trong 1 giờ",
+  "[Auto Task] Blocked service: Run out of traffic": "[Tự động] Dịch vụ bị chặn: Hết lưu lượng",
+  "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[Tự động] Đăng ký bị chặn: Yêu cầu bất thường trong 24 giờ",
+  "[Auto Task] Unblocked Service: Account ban expired": "[Tự động] Dịch vụ được mở khóa: Hết hạn cấm tài khoản",
+  "[Auto Task] Unblocked Service: Account has available data traffic": "[Tự động] Dịch vụ được mở khóa: Tài khoản có lưu lượng khả dụng",
+  "[Daily Task] Account Expiration: Block Login & Clear Account": "[Hàng ngày] Tài khoản hết hạn: Chặn đăng nhập và xóa dữ liệu tài khoản",
+  "[Daily Task] Account Expiration: Stop Service": "[Hàng ngày] Tài khoản hết hạn: Dừng dịch vụ",
+  "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[Hàng ngày] Đặt lại lưu lượng tài khoản, ngày đặt lại tiếp theo: :date",
+  "[Service Timer] Service Expiration": "[Định giờ] Dịch vụ hết hạn",
+  "A Timeout Occurred": "Xảy Ra Thời Gian Chờ",
+  "Accepted": "Đã Chấp Nhận",
+  "All rights reserved.": "Đã đăng kí bản quyền",
+  "Already Reported": "Đã Được Báo Cáo",
+  "Bad Gateway": "Cổng Không Hợp Lệ",
+  "Bad Request": "Yêu Cầu Không Hợp Lệ",
+  "Bandwidth Limit Exceeded": "Giới Hạn Băng Thông",
+  "Client Closed Request": "Khách Đóng Yêu Cầu",
+  "Conflict": "Xung Đột",
+  "Connection Closed Without Response": "Đóng Kết Nối Với Không Phản Hồi",
+  "Connection Timed Out": "Quá Thời Gian Kết Nối",
+  "Continue": "Tiếp Tục",
+  "Created": "Tạo",
+  "Daily Data Usage Report": "Báo cáo sử dụng dữ liệu hàng ngày",
+  "Expectation Failed": "Kỳ Vọng Không Thành Công",
+  "Failed Dependency": "Không Phụ Thuộc",
+  "Forbidden": "Cấm Truy Cập",
+  "Found": "Tìm Thấy",
+  "Gateway Timeout": "Quá Thời Gian Phản Hồi Của Cổng",
+  "Go to page :page": "Tới trang :page",
+  "Gone": "Không Còn",
+  "Hello!": "Xin chào!",
+  "HTTP Version Not Supported": "Phiên Bản HTTP Không Được Hỗ Trợ",
+  "I'm a teapot": "Tôi là teapot",
+  "If you did not create an account, no further action is required.": "Nếu bạn không đăng ký tài khoản này, bạn không cần thực hiện thêm hành động nào.",
+  "If you did not request a password reset, no further action is required.": "Nếu bạn không yêu cầu đặt lại mật khẩu, bạn không cần thực hiện thêm hành động nào.",
+  "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Nếu bạn gặp vấn đề khi click vào nút \":actionText\", hãy sao chép dán địa chỉ bên dưới\nvào trình duyệt web của bạn:",
+  "IM Used": "Tôi Đã Sử Dụng",
+  "Insufficient Storage": "Không Đủ Bộ Nhớ",
+  "Internal Server Error": "Lỗi Từ Máy Chủ Nội Bộ",
+  "Invalid JSON was returned from the route.": "JSON không hợp lệ đã được trả về từ tuyến đường.",
+  "Invalid SSL Certificate": "Chứng Chỉ SSL Không Hợp Lệ",
+  "Invoice Detail": "Chi tiết hóa đơn",
+  "Length Required": "Yêu Cầu Chiều Dài",
+  "Locked": "Đã Khóa",
+  "Login": "Đăng nhập",
+  "Logout": "Đăng xuất",
+  "Loop Detected": "Phát Hiện Lặp",
+  "Maintenance Mode": "Trạng Thái Bảo Trì",
+  "Method Not Allowed": "Phương Thức Không Được Phép",
+  "Misdirected Request": "Yêu Cầu Sai Hướng",
+  "Moved Permanently": "Chuyển Hướng Vĩnh Viễn",
+  "Multi-Status": "Đa Trạng Thái",
+  "Multiple Choices": "Nhiều Sự Lựa Chọn",
+  "Network Authentication Required": "Yêu Cầu Xác Thực Mạng",
+  "Network Connect Timeout Error": "Lỗi Quá Thời Gian Kết Nối Mạng",
+  "Network Read Timeout Error": "Lỗi Hết Thời Gian Đọc Mạng",
+  "No Content": "Không Có Nội Dung",
+  "Non-Authoritative Information": "Thông Tin Không Có Thẩm Quyền",
+  "Not Acceptable": "Không Thể Chấp Nhận",
+  "Not Extended": "Không Mở Rộng",
+  "Not Found": "Không Tìm Thấy",
+  "Not Implemented": "Không Được Thực Hiện",
+  "Not Modified": "Không Có Thay Đổi",
+  "of": "trong",
+  "OK": "VÂNG",
+  "Origin Is Unreachable": "Nguồn Gốc Không Chấp Nhận",
+  "Page Expired": "Trang Đã Hết Hạn",
+  "Pagination Navigation": "Điều hướng phân trang",
+  "Partial Content": "Nội Dung Một Phần",
+  "Payload Too Large": "Tải Trọng Quá Lớn",
+  "Payment for #:sn has been received! Total amount: :amount.": "Thanh toán cho #:sn đã được nhận! Tổng số tiền: :amount.",
+  "Payment Received": "Đã nhận thanh toán",
+  "Payment Required": "yêu cầu thanh toán",
+  "Permanent Redirect": "Chuyển Hướng Vĩnh Viễn",
+  "Please click the button below to verify your email address.": "Vui lòng click vào nút bên dưới để xác minh địa chỉ email của bạn.",
+  "Precondition Failed": "Điều Kiện Tiên Quyết Không Thành Công",
+  "Precondition Required": "Yêu Cầu Điều Kiện Tiên Quyết",
+  "Processing": "Đang Xử Lí",
+  "Proxy Authentication Required": "Yêu Càu Xác Thực Proxy",
+  "Railgun Error": "Lỗi Railgun",
+  "Range Not Satisfiable": "Phạm Vi Không Đạt Yêu Cầu",
+  "Regards": "Trân trọng",
+  "Register": "Đăng ký",
+  "Request Header Fields Too Large": "Header Của Yêu Cầu Quá Lớn",
+  "Request Timeout": "Quá Thời Gian Yêu Cầu",
+  "Reset Content": "Đặt Lại Nội Dung",
+  "Reset Password": "Đặt Lại Mật Khẩu",
+  "Reset Password Notification": "Thông Báo Đặt Lại Mật Khẩu",
+  "results": "kết quả",
+  "Retry With": "Thử Lại Với",
+  "See Other": "Xem Cái Khác",
+  "Server Error": "Máy Chủ Gặp Sự Cố",
+  "Service Unavailable": "Dịch Vụ Không Khả Dụng",
+  "Session Has Expired": "Phiên Đã Hết Hạn",
+  "Showing": "Đang hiển thị",
+  "SSL Handshake Failed": "Kết Nối SSL Không Thành Công",
+  "Subscription link receive abnormal access and banned by the system": "Liên kết đăng ký nhận truy cập bất thường và bị hệ thống cấm",
+  "Switching Protocols": "Chuyển Đổi Giao Thức",
+  "Temporary Redirect": "Chuyển Hướng Tạm Thời",
+  "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "Cảm ơn bạn đã đăng ký! Trước khi bắt đầu, bạn cần xác minh email của mình bằng cách nhấp vào liên kết chúng tôi vừa gửi đến email của bạn! Nếu bạn chưa nhận được email, chúng tôi rất sẵn lòng gửi lại một email khác.",
+  "The given data was invalid.": "Dữ liệu nhận được không hợp lệ.",
+  "The response is not a streamed response.": "Phản hồi không phải là phản hồi được phát trực tuyến.",
+  "The response is not a view.": "Phản hồi không phải là một lượt xem.",
+  "This password reset link will expire in :count minutes.": "Đường dẫn lấy lại mật khẩu sẽ hết hạn trong :count phút.",
+  "to": "tới",
+  "Toggle navigation": "Chuyển hướng điều hướng",
+  "Too Early": "Quá Sớm",
+  "Too Many Requests": "Quá Nhiều Yêu Cầu",
+  "Unauthorized": "Không Được Phép",
+  "Unavailable For Legal Reasons": "Không Có Sẵn Vì Lí Do Pháp Lí",
+  "Unknown Error": "Lỗi Không Xác Định",
+  "Unprocessable Entity": "Không Thể Xử Lí yêu Cầu",
+  "Unsupported Media Type": "Loại Phương Tiện Không Được Hỗ Trợ",
+  "Upgrade Required": "Yêu Cầu Nâng Cấp",
+  "URI Too Long": "URI Quá Dài",
+  "Use Proxy": "Dùng Proxy",
+  "Variant Also Negotiates": "Biến Thể Cũng Đàm Phán",
+  "Verify Email Address": "Xác Minh Địa Chỉ Email",
+  "Verify Your Email Address": "Xác minh địa chỉ email của bạn",
+  "Web Server is Down": "Máy Chủ Web Đã Tắt",
+  "Whoops!": "Rất tiếc!",
+  "You are receiving this email because we received a password reset request for your account.": "Bạn nhận được email này vì chúng tôi đã nhận được yêu cầu đặt lại mật khẩu cho tài khoản của bạn.",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": "Bạn đã không trả lời phiếu hỗ trợ này trong :num giờ, hệ thống đã tự động đóng phiếu hỗ trợ của bạn.",
+  "You must have a valid subscription to view the content in this area!": "Bạn phải có đăng ký hợp lệ để xem nội dung trong khu vực này!",
+  "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "Đăng ký của bạn đã bị quản trị viên vô hiệu hóa, vui lòng liên hệ với quản trị viên để khôi phục."
+}

File diff suppressed because it is too large
+ 431 - 426
resources/lang/vi/admin.php


+ 32 - 32
resources/lang/vi/auth.php

@@ -3,39 +3,39 @@
 declare(strict_types=1);
 
 return [
-    'accept_term' => 'Tôi đã đọc và chấp nhận',
+    'accept_term' => 'Tôi đã đọc và đồng ý tuân thủ',
     'active' => [
         'attribute' => 'Kích hoạt',
         'error' => [
-            'activated' => 'Tài khoản đã kích hoạt, không cần kích hoạt lại',
-            'disable' => 'Kích hoạt tài khoản bị tắt, bạn có thể đăng nhập trực tiếp!',
-            'throttle' => 'Đã vượt quá giới hạn yêu cầu kích hoạt, vui lòng không thao tác quá thường xuyên! Liên hệ :email nếu có vấn đề.',
+            'activated' => 'Tài khoản đã được kích hoạt, không cần kích hoạt lại',
+            'disable' => 'Chức năng kích hoạt tài khoản đã bị tắt, bạn có thể đăng nhập trực tiếp!',
+            'throttle' => 'Bạn đã đạt đến giới hạn yêu cầu kích hoạt, vui lòng thử lại sau. Nếu có bất kỳ câu hỏi nào, vui lòng liên hệ :email.',
         ],
-        'promotion' => 'Tài khoản chưa kích hoạt, vui lòng [:action] trước!',
-        'sent' => 'Email kích hoạt đã được gửi đến hộp thư của bạn, vui lòng kiểm tra kể cả thư rác.',
+        'promotion' => 'Tài khoản chưa được kích hoạt, vui lòng [:action] trước!',
+        'sent' => 'Email kích hoạt đã được gửi đến hộp thư của bạn, vui lòng kiểm tra (bao gồm cả thư mục spam).',
     ],
     'aup' => 'Chính sách Sử dụng Chấp nhận được',
     'captcha' => [
         'attribute' => 'Mã xác nhận',
         'error' => [
-            'failed' => 'Xác minh mã không thành công, vui lòng thử lại',
+            'failed' => 'Xác minh mã xác nhận thất bại, vui lòng thử lại',
             'timeout' => 'Mã xác nhận đã hết hạn, vui lòng làm mới và thử lại.',
         ],
         'required' => 'Vui lòng hoàn thành mã xác nhận!',
-        'sent' => 'Mã xác nhận đã được gửi đến email của bạn, vui lòng kiểm tra kể cả thư rác.',
+        'sent' => 'Mã xác nhận đã được gửi đến email của bạn, vui lòng kiểm tra (bao gồm cả thư mục spam).',
     ],
     'email' => [
         'error' => [
-            'banned' => 'Nhà cung cấp email của bạn bị chặn, vui lòng sử dụng email khác.',
+            'banned' => 'Nhà cung cấp email của bạn đã bị chặn, vui lòng sử dụng email khác.',
             'invalid' => 'Email của bạn không được hỗ trợ.',
         ],
     ],
     'error' => [
-        'account_baned' => 'Tài khoản của bạn bị cấm!',
+        'account_baned' => 'Tài khoản của bạn đã bị cấm!',
         'login_error' => 'Lỗi đăng nhập, vui lòng thử lại sau!',
-        'login_failed' => 'Đăng nhập không thành công, vui lòng kiểm tra email và mật khẩu!',
-        'not_found_user' => 'Không tìm thấy tài khoản, vui lòng thử cách đăng nhập khác.',
-        'repeat_request' => 'Vui lòng làm mới và thử lại.',
+        'login_failed' => 'Đăng nhập thất bại, vui lòng kiểm tra tên người dùng và mật khẩu!',
+        'not_found_user' => 'Không tìm thấy tài khoản, vui lòng thử các phương thức đăng nhập khác.',
+        'repeat_request' => 'Vui lòng không lặp lại yêu cầu, làm mới và thử lại.',
         'url_timeout' => 'Liên kết đã hết hạn, vui lòng yêu cầu lại.',
     ],
     'failed' => 'Thông tin tài khoản không tìm thấy trong hệ thống.',
@@ -52,15 +52,15 @@ return [
     'maintenance' => 'Bảo trì',
     'maintenance_tip' => 'Đang bảo trì',
     'oauth' => [
-        'bind_failed' => 'Gắn kết không thành công',
-        'bind_success' => 'Gắn kết thành công',
-        'login_failed' => 'Đăng nhập bên thứ ba không thành công!',
-        'rebind_success' => 'Gắn kết lại thành công',
+        'bind_failed' => 'Liên kết thất bại',
+        'bind_success' => 'Liên kết thành công',
+        'login_failed' => 'Đăng nhập bên thứ ba thất bại!',
+        'rebind_success' => 'Liên kết lại thành công',
         'register' => 'Đăng ký nhanh',
-        'register_failed' => 'Đăng ký không thành công',
+        'register_failed' => 'Đăng ký thất bại',
         'registered' => 'Đã đăng ký, vui lòng đăng nhập trực tiếp.',
-        'unbind_failed' => 'Hủy gắn kết không thành công',
-        'unbind_success' => 'Hủy gắn kết thành công',
+        'unbind_failed' => 'Hủy liên kết thất bại',
+        'unbind_success' => 'Hủy liên kết thành công',
     ],
     'one-click_login' => 'Đăng nhập một chạm',
     'optional' => 'Tùy chọn',
@@ -71,15 +71,15 @@ return [
         'reset' => [
             'attribute' => 'Đặt lại mật khẩu',
             'error' => [
-                'demo' => 'Không thể thay đổi mật khẩu admin trong demo.',
-                'disabled' => 'Đặt lại mật khẩu bị tắt, vui lòng liên hệ :email để được hỗ trợ.',
-                'failed' => 'Đặt lại mật khẩu không thành công.',
-                'same' => 'Mật khẩu mới không được giống mật khẩu cũ, vui lòng nhập lại.',
-                'throttle' => 'Bạn chỉ có thể đặt lại mật khẩu :time lần trong 24 giờ, không nên thao tác quá thường xuyên.',
-                'wrong' => 'Mật khẩu sai, vui lòng thử lại.',
+                'demo' => 'Không thể thay đổi mật khẩu quản trị viên trong chế độ demo.',
+                'disabled' => 'Chức năng đặt lại mật khẩu đã bị tắt, vui lòng liên hệ :email để được hỗ trợ.',
+                'failed' => 'Đặt lại mật khẩu thất bại.',
+                'same' => 'Mật khẩu mới không thể giống mật khẩu cũ, vui lòng nhập lại.',
+                'throttle' => 'Bạn chỉ có thể đặt lại mật khẩu :time lần trong 24 giờ, vui lòng không thực hiện quá thường xuyên.',
+                'wrong' => 'Sai mật khẩu, vui lòng thử lại.',
             ],
-            'sent' => 'Liên kết đặt lại mật khẩu đã được gửi đến email của bạn, vui lòng kiểm tra kể cả thư rác.',
-            'success' => 'Mật khẩu mới đã được đặt lại thành công, bạn có thể đăng nhập.',
+            'sent' => 'Liên kết đặt lại đã được gửi đến hộp thư của bạn, vui lòng kiểm tra (bao gồm cả thư mục spam).',
+            'success' => 'Mật khẩu mới đã được đặt lại thành công, bạn có thể đăng nhập ngay bây giờ.',
         ],
     ],
     'register' => [
@@ -87,13 +87,13 @@ return [
         'code' => 'Mã đăng ký',
         'error' => [
             'disable' => 'Xin lỗi, chúng tôi tạm thời ngừng nhận người dùng mới.',
-            'throttle' => 'Chống bot đã kích hoạt! Vui lòng không gửi quá thường xuyên mẫu đăng ký!',
+            'throttle' => 'Hệ thống chống bot đã được kích hoạt! Vui lòng tránh gửi quá nhiều lần!',
         ],
-        'failed' => 'Đăng ký không thành công, vui lòng thử lại sau.',
-        'promotion' => 'Chưa có tài khoản? Vui lòng đi đến ',
+        'failed' => 'Đăng ký thất bại, vui lòng thử lại sau.',
+        'promotion' => 'Chưa có tài khoản? Vui lòng đến ',
         'success' => 'Đăng ký thành công',
     ],
-    'remember_me' => 'Nhớ tôi',
+    'remember_me' => 'Ghi nhớ tôi',
     'request' => 'Yêu cầu',
     'throttle' => 'Vượt quá số lần đăng nhập cho phép. Vui lòng thử lại sau :seconds giây.',
     'tos' => 'Điều khoản Dịch vụ',

+ 39 - 46
resources/lang/vi/common.php

@@ -5,9 +5,9 @@ declare(strict_types=1);
 return [
     'hour' => '{1} Giờ|{2} Giờ',
     'account' => 'Tài khoản',
-    'available_date' => 'Có hiệu lực đến',
-    'created_at' => 'Tạo vào',
-    'expired_at' => 'Hết hạn vào',
+    'available_date' => 'Thời hạn hiệu lực',
+    'created_at' => 'Ngày tạo',
+    'expired_at' => 'Ngày hết hạn',
     'updated_at' => 'Cập nhật lần cuối',
     'latest_at' => 'Hoạt động gần đây',
     'back' => 'Quay lại',
@@ -16,7 +16,7 @@ return [
     'close' => 'Đóng',
     'close_item' => 'Đóng :attribute',
     'confirm' => 'Xác nhận',
-    'continues' => 'Tiếp tục',
+    'continue' => 'Tiếp tục',
     'open' => 'Mở',
     'send' => 'Gửi',
     'view' => 'Xem',
@@ -28,20 +28,20 @@ return [
     ],
     'add' => 'Thêm',
     'free' => 'Miễn phí',
-    'replace' => 'Thay thế',
+    'change' => 'Thay đổi',
     'submit' => 'Gửi',
     'submit_item' => 'Gửi :attribute',
     'generate' => 'Tạo',
     'generate_item' => 'Tạo :attribute',
-    'to_safari' => [0 => 'Nhấn vào góc trên bên phải', 1 => ', chọn', 2 => 'Mở bằng Safari', 3 => ' để trải nghiệm tốt hơn!'],
-    'update_browser' => [0 => 'Bạn đang dùng trình duyệt ', 1 => 'lỗi thời', 2 => '. Vui lòng ', 3 => 'nâng cấp trình duyệt', 4 => 'để có trải nghiệm tốt nhất'],
+    'to_safari' => [0 => 'Nhấp vào góc trên bên phải', 1 => ', sau đó chọn', 2 => 'Mở trong Safari', 3 => ' để truy cập trang web này!'],
+    'update_browser' => [0 => 'Bạn đang sử dụng một trình duyệt', 1 => 'lỗi thời', 2 => '. Vui lòng', 3 => 'nâng cấp trình duyệt của bạn', 4 => ' để có trải nghiệm tốt nhất'],
     'apply' => 'Áp dụng',
-    'avatar' => 'nh đại diện',
+    'avatar' => 'nh đại diện',
     'customize' => 'Tùy chỉnh',
     'all' => 'Tất cả',
     'default' => 'Mặc định',
     'download' => 'Tải xuống',
-    'goto' => 'Đi đến',
+    'goto' => 'Đi tới',
     'warning' => 'Cảnh báo',
     'success' => 'Thành công',
     'success_item' => ':attribute thành công',
@@ -49,10 +49,10 @@ return [
     'failed_item' => ':attribute thất bại',
     'update' => 'Cập nhật',
     'update_action' => 'Cập nhật :action',
-    'none' => 'Không',
+    'none' => 'Không',
     'new' => 'Mới',
     'sorry' => 'Xin lỗi',
-    'applied' => ':attribute đã áp dụng',
+    'applied' => ':attribute đã được áp dụng',
     'active_item' => 'Kích hoạt :attribute',
     'error' => 'Lỗi',
     'toggle' => 'Chuyển đổi',
@@ -65,16 +65,9 @@ return [
     ],
     'days' => [
         'attribute' => '{1} Ngày|{2} Ngày',
-        'sun' => 'Chủ nhật',
-        'mon' => 'Thứ hai',
-        'tue' => 'Thứ ba',
-        'wed' => 'Thứ tư',
-        'thu' => 'Thứ năm',
-        'fri' => 'Thứ sáu',
-        'sat' => 'Thứ bảy',
         'weekend' => 'Cuối tuần',
         'work' => 'Ngày làm việc',
-        'next' => 'Ngày kế tiếp',
+        'next' => 'Ngày tiếp theo',
     ],
     'qrcode' => 'Mã QR :attribute',
     'deleted' => 'Đã xóa',
@@ -82,23 +75,23 @@ return [
     'print' => 'In',
     'unlimited' => 'Không giới hạn',
     'payment' => [
-        'credit' => 'Tín dụng',
+        'credit' => 'Số dư',
         'alipay' => 'Alipay',
         'qq' => 'Ví QQ',
         'wechat' => 'WeChat Pay',
         'crypto' => 'Tiền điện tử',
         'manual' => 'Thanh toán thủ công',
         'status' => [
-            'wait' => 'Chờ thanh toán',
+            'wait' => 'Đang chờ thanh toán',
         ],
     ],
     'order' => [
         'status' => [
-            'cancel' => 'Hủy',
-            'complete' => 'Hoàn thành',
-            'prepaid' => 'Thanh toán trước',
-            'ongoing' => 'Đang diễn ra',
-            'review' => 'Chờ xác nhận',
+            'canceled' => 'Đã hủy',
+            'completed' => 'Đã hoàn thành',
+            'prepaid' => 'Trả trước',
+            'ongoing' => 'Đang sử dụng',
+            'review' => 'Đang chờ duyệt',
         ],
     ],
     'recommend' => 'Đề xuất',
@@ -109,42 +102,42 @@ return [
     'delete' => 'Xóa',
     'status' => [
         'attribute' => 'Trạng thái',
-        'inactive' => 'Không hoạt động',
-        'disabled' => 'Đã tắt',
+        'inactive' => 'Chưa kích hoạt',
+        'disabled' => 'Vô hiệu hóa',
         'banned' => 'Bị cấm',
         'normal' => 'Bình thường',
-        'enabled' => 'Đã bật',
+        'enabled' => 'Đã kích hoạt',
         'expire' => 'Hết hạn',
-        'limited' => 'Giới hạn',
-        'run_out' => 'Đã dùng hết',
+        'limited' => 'Hạn chế',
+        'run_out' => 'Hết dữ liệu',
         'unused' => 'Chưa sử dụng',
         'used' => 'Đã sử dụng',
-        'closed' => 'Đóng',
+        'closed' => 'Đã đóng',
         'applying' => 'Đang áp dụng',
         'withdrawn' => 'Đã rút',
         'unwithdrawn' => 'Chưa rút',
         'reply' => 'Đã trả lời',
-        'pending' => 'Đang chờ',
-        'unknown' => 'Không xác định',
-        'available' => 'Có sẵn',
+        'pending' => 'Đang chờ xử lý',
+        'unknown' => 'Không ',
+        'available' => 'Có hiệu lực',
         'reject' => 'Từ chối',
-        'rejected' => 'Bị từ chối',
-        'review' => 'Chờ xét duyệt',
+        'rejected' => 'Đã từ chối',
+        'review' => 'Đang chờ duyệt',
         'reviewed' => 'Đã duyệt',
         'paid' => 'Đã thanh toán',
-        'payment_pending' => 'Chờ thanh toán',
-        'pass' => 'Đạt',
-        'send_to_credit' => 'Gửi vào tài khoản',
-        'waiting_tobe_send' => 'Chờ gửi',
+        'payment_pending' => 'Đang chờ thanh toán',
+        'pass' => 'Thông qua',
+        'send_to_credit' => 'Chuyển vào số dư',
+        'waiting_tobe_send' => 'Đang chờ gửi',
     ],
-    'stay_unchanged' => 'Để trống để giữ nguyên',
-    'random_generate' => 'Để trống để tự động tạo ngẫu nhiên',
+    'stay_unchanged' => 'Để trống nếu không thay đổi',
+    'random_generate' => 'Để trống để tạo ngẫu nhiên',
     'request_failed' => 'Yêu cầu thất bại, vui lòng thử lại',
     'convert' => 'Chuyển đổi',
-    'import' => 'Nhập',
+    'import' => 'Nhập khẩu',
     'or' => 'hoặc',
     'more' => 'Thêm',
     'to' => 'đến',
-    'to_be_send' => 'Chờ gửi',
-    'developing' => 'Đang phát triển! Hãy chờ đón nhé',
+    'to_be_send' => 'Đang chờ gửi',
+    'developing' => 'Đang phát triển! Hãy đón chờ',
 ];

+ 13 - 13
resources/lang/vi/errors.php

@@ -5,30 +5,30 @@ declare(strict_types=1);
 return [
     'forbidden' => [
         'access' => 'Phát hiện truy cập từ IP hoặc proxy không xác định, từ chối truy cập',
-        'bots' => 'Phát hiện truy cập từ bot, từ chối truy cập',
+        'bots' => 'Phát hiện truy cập từ robot, từ chối truy cập',
         'china' => 'Phát hiện truy cập từ IP hoặc proxy Trung Quốc, từ chối truy cập',
         'oversea' => 'Phát hiện truy cập từ IP hoặc proxy nước ngoài, từ chối truy cập',
     ],
     'log' => 'Nhật ký',
     'refresh' => 'Làm mới',
     'refresh_page' => 'Vui lòng làm mới trang và thử lại',
-    'report' => 'Lỗi bao gồm báo cáo: ',
+    'report' => 'Lỗi kèm theo báo cáo: ',
     'safe_enter' => 'Lối vào an toàn',
     'safe_code' => 'Vui lòng nhập mã an toàn',
-    'title' => '⚠️ Lỗi xảy ra',
+    'title' => '⚠️ Lỗi đã được kích hoạt',
     'unsafe_enter' => 'Lối vào không an toàn',
     'visit' => 'Vui lòng truy cập',
-    'whoops' => 'Ôi!',
-    'get_ip' => 'Lấy thông tin IP thất bại',
+    'whoops' => 'Rất tiếc!',
+    'get_ip' => 'Không thể lấy thông tin IP',
     'subscribe' => [
-        'unknown' => 'Liên kết đăng ký không xác định! Vui lòng lấy liên kết mới!',
-        'sub_baned' => 'Đăng ký bị cấm! Vào trang web để biết thêm chi tiết',
-        'user' => 'URL sai, tài khoản không tồn tại!',
-        'user_disable' => 'Tài khoản bị vô hiệu hóa! Liên hệ hỗ trợ!',
-        'baned_until' => 'Tài khoản bị cấm đến :time, vui lòng đợi mở khóa!',
+        'unknown' => 'Liên kết đăng ký không hợp lệ! Vui lòng lấy lại liên kết mới!',
+        'sub_banned' => 'Đăng ký bị cấm! Truy cập trang web để biết chi tiết',
+        'user' => 'URL không hợp lệ, tài khoản không tồn tại!',
+        'user_disabled' => 'Tài khoản bị vô hiệu hóa! Liên hệ hỗ trợ!',
+        'banned_until' => 'Tài khoản bị cấm đến :time, vui lòng chờ mở khóa!',
         'out' => 'HẾT DỮ LIỆU! Vui lòng mua thêm hoặc đặt lại dữ liệu!',
-        'expired' => 'Tài khoản hết hạn! Vui lòng gia hạn mua hàng!',
-        'question' => 'Lỗi tài khoản!? Vào trang web để biết thêm chi tiết',
-        'none' => 'Không có node khả dụng',
+        'expired' => 'Tài khoản đã hết hạn! Vui lòng gia hạn đăng ký!',
+        'question' => 'Có vấn đề với tài khoản!? Truy cập trang web để biết chi tiết',
+        'none' => 'Không có nút nào khả dụng',
     ],
 ];

+ 71 - 71
resources/lang/vi/model.php

@@ -10,10 +10,10 @@ return [
         'username' => 'Tên đăng nhập',
         'password' => 'Mật Khẩu',
         'credit' => 'Số dư',
-        'invite_num' => 'Lượt mời khả dụng',
+        'invite_num' => 'Lời mời khả dụng',
         'reset_date' => 'Ngày đặt lại dữ liệu',
         'port' => 'Cổng',
-        'traffic_used' => 'Dữ liệu đã ng',
+        'traffic_used' => 'Dữ liệu đã sử dụng',
         'service' => 'Dịch vụ Proxy',
         'group' => 'Nhóm',
         'account_status' => 'Trạng Thái Tài Khoản',
@@ -27,8 +27,8 @@ return [
         'proxy_passwd' => 'Mật khẩu Proxy',
         'proxy_method' => 'Mã hóa',
         'usable_traffic' => 'Lưu lượng có sẵn',
-        'proxy_protocol' => 'Giao thức',
-        'proxy_obfs' => 'Che đậy',
+        'proxy_protocol' => 'Giao thức Proxy',
+        'proxy_obfs' => 'Phương pháp làm rối',
         'speed_limit' => 'Giới hạn tốc độ',
         'inviter' => 'Người mời',
         'created_date' => 'Ngày đăng ký',
@@ -48,11 +48,11 @@ return [
     'subscribe' => [
         'code' => 'Mã đăng ký',
         'req_times' => 'Số lần yêu cầu',
-        'updated_at' => 'Yêu cầu gần nhất',
+        'updated_at' => 'Lần yêu cầu cuối',
         'ban_time' => 'Thời gian cấm',
         'ban_desc' => 'Lý do cấm',
         'req_ip' => 'IP yêu cầu',
-        'req_header' => 'Tiêu đề truy cập',
+        'req_header' => 'Header yêu cầu',
     ],
     'oauth' => [
         'type' => 'Kênh',
@@ -61,17 +61,17 @@ return [
     'user_group' => [
         'attribute' => 'Nhóm người dùng',
         'name' => 'Tên nhóm',
-        'nodes' => 'Node',
+        'nodes' => 'Nút',
     ],
     'node' => [
         'attribute' => 'Node',
-        'id' => 'ID Node',
+        'id' => 'ID Nút',
         'name' => 'Tên',
         'domain' => 'Tên miền',
         'static' => 'Trạng thái hoạt động',
-        'online_user' => 'Người dùng online',
-        'data_consume' => 'Dữ liệu tiêu thụ',
-        'data_rate' => 'Hệ số dữ liệu',
+        'online_user' => 'Người dùng trực tuyến',
+        'data_consume' => 'Sử dụng dữ liệu',
+        'data_rate' => 'Tỷ lệ dữ liệu',
         'ddns' => 'DDNS',
         'ipv4' => 'IPv4',
         'ipv6' => 'IPv6',
@@ -84,62 +84,62 @@ return [
         'udp' => 'UDP',
         'display' => 'Hiển thị & Đăng ký',
         'detection' => 'Phát hiện chặn',
-        'method' => 'Mã hóa',
+        'method' => 'Phương pháp mã hóa',
         'protocol' => 'Giao thức',
         'protocol_param' => 'Tham số giao thức',
-        'obfs' => 'Obfs',
-        'obfs_param' => 'Tham số obfs',
+        'obfs' => 'Làm rối',
+        'obfs_param' => 'Tham số làm rối',
         'single' => 'Cổng đơn',
         'transfer' => 'Chuyển tiếp',
         'service_port' => 'Cổng dịch vụ',
-        'single_passwd' => '[Đơn] Mật khẩu',
-        'v2_alter_id' => 'Alter ID',
+        'single_passwd' => 'Mật khẩu cổng đơn',
+        'v2_alter_id' => 'ID thay thế',
         'v2_net' => 'Mạng',
-        'v2_cover' => 'Ẩn danh',
-        'v2_host' => 'Host ẩn danh',
-        'v2_path' => 'Đường dẫn | Khóa',
+        'v2_cover' => 'Loại giả mạo',
+        'v2_host' => 'Tên miền giả mạo',
+        'v2_path' => 'Đường dẫn hoặc khóa',
         'v2_sni' => 'SNI',
-        'v2_tls' => 'TLS',
+        'v2_tls' => 'Kết nối TLS',
         'v2_tls_provider' => 'Cấu hình TLS',
         'relay_port' => 'Cổng chuyển tiếp',
     ],
     'node_auth' => [
-        'attribute' => 'Xác thực Node',
-        'key' => 'Mã bí mật<small>cho node</small>',
-        'secret' => 'Mã bí mật ngược',
+        'attribute' => 'Xác thực nút',
+        'key' => 'Khóa <small>dành cho nút</small>',
+        'secret' => 'Khóa ngược',
     ],
     'node_cert' => [
-        'attribute' => 'Chứng chỉ miền',
+        'attribute' => 'Chứng chỉ',
         'domain' => 'Tên miền',
         'key' => 'Khóa',
-        'pem' => 'PEM',
-        'issuer' => 'Người cấp',
-        'signed_date' => 'Ngày ',
+        'pem' => 'Chứng chỉ PEM',
+        'issuer' => 'Tổ chức cấp phát',
+        'signed_date' => 'Ngày cấp',
         'expired_date' => 'Ngày hết hạn',
     ],
     'order' => [
         'attribute' => 'Đơn hàng',
-        'id' => 'Mã đơn hàng',
+        'id' => 'ID Đơn hàng',
         'original_price' => 'Giá gốc',
-        'price' => 'Giá thực',
-        'pay_way' => 'Thanh toán',
+        'price' => 'Giá thực tế',
+        'pay_way' => 'Phương thức thanh toán',
         'status' => 'Trạng thái',
     ],
     'goods' => [
-        'attribute' => 'Hàng hóa',
+        'attribute' => 'Sản phẩm',
         'name' => 'Tên',
-        'price' => 'Giá bán',
+        'price' => 'Giá',
         'category' => 'Danh mục',
-        'renew' => 'Giá đổi dữ liệu',
-        'user_limit' => 'Giới hạn tốc độ',
-        'period' => 'Chu kỳ',
-        'traffic' => 'Dữ liệu cho phép',
-        'invite_num' => 'Mời miễn phí',
+        'renew' => 'Giá gia hạn dữ liệu',
+        'user_limit' => 'Giới hạn tốc độ người dùng',
+        'period' => 'Chu kỳ đặt lại',
+        'traffic' => 'Dữ liệu khả dụng',
+        'invite_num' => 'Lời mời tặng kèm',
         'limit_num' => 'Giới hạn mua',
-        'available_date' => 'Thời hạn',
+        'available_date' => 'Thời hạn hiệu lực',
         'hot' => 'Bán chạy',
         'color' => 'Màu sắc',
-        'logo' => 'Hình ảnh',
+        'logo' => 'Ảnh sản phẩm',
         'info' => 'Thông tin tùy chỉnh',
     ],
     'rule' => [
@@ -150,16 +150,16 @@ return [
     'rule_group' => [
         'attribute' => 'Nhóm quy tắc',
         'name' => 'Tên',
-        'type' => 'Kiểu',
+        'type' => 'Loại',
         'rules' => 'Quy tắc',
     ],
     'role' => [
         'attribute' => 'Vai trò',
         'name' => 'Tên',
-        'permissions' => 'Quyền',
+        'permissions' => 'Quyền hạn',
     ],
     'permission' => [
-        'attribute' => 'Quyền',
+        'attribute' => 'Quyền hạn',
         'description' => 'Mô tả',
         'name' => 'Tên tuyến',
     ],
@@ -172,61 +172,61 @@ return [
         'updated_at' => 'Ngày cập nhật',
     ],
     'coupon' => [
-        'attribute' => 'Phiếu',
+        'attribute' => 'Phiếu giảm giá',
         'name' => 'Tên',
         'sn' => 'Mã',
-        'logo' => 'Hình ảnh',
+        'logo' => 'nh',
         'value' => 'Giá trị',
         'priority' => 'Ưu tiên',
-        'usable_times' => 'Giới hạn',
-        'minimum' => 'Tối thiểu',
-        'used' => 'Hạn mức cá nhân',
-        'levels' => 'Hạn theo cấp',
-        'groups' => 'Hạn theo nhóm',
-        'users_whitelist' => 'Tài khoản ưu tiên',
-        'users_blacklist' => 'Tài khoản hạn chế',
-        'services_whitelist' => 'Cho phép hàng hóa',
-        'services_blacklist' => 'Vô hiệu hàng hóa',
-        'newbie' => 'Mới tạo tài khoản',
+        'usable_times' => 'Số lần sử dụng',
+        'minimum' => 'Điều kiện giảm giá',
+        'used' => 'Giới hạn cá nhân',
+        'levels' => 'Giới hạn cấp độ',
+        'groups' => 'Giới hạn nhóm',
+        'users_whitelist' => 'Danh sách trắng người dùng',
+        'users_blacklist' => 'Danh sách đen người dùng',
+        'services_whitelist' => 'Danh sách trắng sản phẩm',
+        'services_blacklist' => 'Danh sách đen sản phẩm',
+        'newbie' => 'Chỉ dành cho người dùng mới',
         'num' => 'Số lượng',
     ],
     'aff' => [
         'invitee' => 'Người mua',
-        'amount' => 'Tổng đơn hàng',
+        'amount' => 'Số tiền đơn hàng',
         'commission' => 'Hoa hồng',
-        'updated_at' => 'Xử lý',
-        'created_at' => 'Ngày đặt',
+        'updated_at' => 'Xử lý vào',
+        'created_at' => 'Đặt hàng vào',
     ],
     'referral' => [
-        'created_at' => 'Thời gian nộp',
-        'user' => 'Người nộp',
+        'created_at' => 'Đăng ký vào',
+        'user' => 'Người đăng ký',
         'amount' => 'Số tiền',
-        'id' => 'Mã yêu cầu',
+        'id' => 'ID Đơn đăng ký',
     ],
     'notification' => [
         'address' => 'Người nhận',
-        'created_at' => 'Ngày gửi',
+        'created_at' => 'Gửi vào',
         'status' => 'Trạng thái',
     ],
     'ip' => [
         'network_type' => 'Loại mạng',
-        'info' => 'Vị trí',
+        'info' => 'Thông tin vị trí',
     ],
     'user_traffic' => [
-        'upload' => 'Tải lên',
-        'download' => 'Tải xuống',
-        'total' => 'Tổng',
-        'log_time' => 'Thời gian',
+        'upload' => 'Lưu lượng tải lên',
+        'download' => 'Lưu lượng tải xuống',
+        'total' => 'Tổng lưu lượng',
+        'log_time' => 'Thời gian ghi nhận',
     ],
     'user_data_modify' => [
-        'before' => 'Trước',
-        'after' => 'Sau',
+        'before' => 'Lưu lượng trước khi thay đổi',
+        'after' => 'Lưu lượng sau khi thay đổi',
         'created_at' => 'Thời gian thay đổi',
     ],
     'user_credit' => [
-        'before' => 'Trước',
-        'after' => 'Sau',
-        'amount' => 'Số tiền',
+        'before' => 'Số dư trước khi thay đổi',
+        'after' => 'Số dư sau khi thay đổi',
+        'amount' => 'Số tiền thay đổi',
         'created_at' => 'Thời gian thay đổi',
     ],
 ];

+ 17 - 17
resources/lang/vi/notification.php

@@ -4,34 +4,34 @@ declare(strict_types=1);
 
 return [
     'attribute' => 'Thông báo',
-    'new' => '{1} Bạn có :num tin nhắn mới',
-    'empty' => 'Bạn không có tin nhắn mới nào',
-    'payment_received' => 'Thanh toán thành công, số tiền: :amount. Xem chi tiết đơn hàng',
+    'new' => '{1} :num tin nhắn mới|[1,*] :num tin nhắn mới',
+    'empty' => 'Bạn không có tin nhắn mới',
+    'payment_received' => 'Thanh toán đã nhận, số tiền: :amount. Xem chi tiết đơn hàng',
     'account_expired' => 'Nhắc nhở hết hạn tài khoản',
-    'account_expired_content' => 'Tài khoản của bạn sẽ hết hạn trong :days ngày nữa. Vui lòng gia hạn để tiếp tục sử dụng dịch vụ.',
-    'account_expired_blade' => 'Tài khoản sẽ hết hạn trong :days ngày nữa, vui lòng gia hạn kịp thời',
-    'active_email' => 'Vui lòng xác minh trong vòng 30 phút',
-    'close_ticket' => 'Đóng vé :id: :title',
+    'account_expired_content' => 'Tài khoản của bạn sẽ hết hạn trong :days ngày. Vui lòng gia hạn kịp thời để tiếp tục sử dụng dịch vụ của chúng tôi.',
+    'account_expired_blade' => 'Tài khoản sẽ hết hạn trong :days ngày, vui lòng gia hạn kịp thời',
+    'active_email' => 'Vui lòng hoàn thành xác minh trong vòng 30 phút',
+    'close_ticket' => 'Yêu cầu :id: :title đã đóng',
     'view_web' => 'Xem trang web',
-    'view_ticket' => 'Xem ',
-    'new_ticket' => ' mới nhận được: :title',
-    'reply_ticket' => 'Đã trả lời vé: :title',
-    'ticket_content' => 'Nội dung :',
-    'node_block' => 'Cảnh báo chặn node',
-    'node_offline' => 'Cảnh báo node ngắt kết nối',
-    'node_offline_content' => 'Các node bất thường, có thể đã ngắt kết nối:',
+    'view_ticket' => 'Xem yêu cầu',
+    'new_ticket' => 'Yêu cầu mới nhận được: :title',
+    'reply_ticket' => 'Yêu cầu đã trả lời: :title',
+    'ticket_content' => 'Nội dung yêu cầu:',
+    'node_block' => 'Cảnh báo chặn nút',
+    'node_offline' => 'Cảnh báo nút ngoại tuyến',
+    'node_offline_content' => 'Các nút bất thường, có thể đã ngoại tuyến:',
     'block_report' => 'Báo cáo chặn:',
     'traffic_warning' => 'Cảnh báo sử dụng dữ liệu',
     'traffic_remain' => 'Đã sử dụng :percent% dữ liệu, vui lòng chú ý',
-    'traffic_tips' => 'Lưu ý ngày đặt lại dữ liệu và sử dụng dữ liệu hợp lý, hoặc nạp tiền sau khi hết',
+    'traffic_tips' => 'Vui lòng lưu ý ngày đặt lại dữ liệu và sử dụng dữ liệu hợp lý, hoặc gia hạn sau khi hết',
     'verification_account' => 'Xác minh tài khoản',
     'verification' => 'Mã xác minh của bạn:',
     'verification_limit' => 'Vui lòng xác minh trong vòng :minutes phút',
     'data_anomaly' => 'Cảnh báo người dùng dữ liệu bất thường',
-    'data_anomaly_content' => 'Người dùng :id: [Tải lên: :upload | Tải xuống: :download | Tổng: :total] trong 1 giờ qua',
+    'data_anomaly_content' => 'Người dùng :id: [Tải lên: :upload | Tải xuống: :download | Tổng cộng: :total] trong giờ qua',
     'node' => [
         'upload' => 'Tải lên',
         'download' => 'Tải xuống',
-        'total' => 'Tổng',
+        'total' => 'Tổng cộng',
     ],
 ];

+ 113 - 113
resources/lang/vi/user.php

@@ -10,57 +10,57 @@ return [
         'group' => 'Nhóm',
         'speed_limit' => 'Giới hạn tốc độ',
         'remain' => 'Dữ liệu còn lại',
-        'time' => 'Thời hạn',
-        'last_login' => 'Đăng nhập gần nhất',
-        'reset' => '{0} Dữ liệu sẽ đặt lại sau <code id="restTime">:days</code> ngày |[1,*] Còn :days ngày nữa để đặt lại dữ liệu',
-        'connect_password' => 'Mật khẩu kết nối proxy',
+        'time' => 'Thời hạn gói',
+        'last_login' => 'Đăng nhập lần cuối',
+        'reset' => '{0} Dữ liệu sẽ được đặt lại trong <code id="restTime">:days</code> ngày|[1,*] Còn :days ngày để đặt lại dữ liệu',
+        'connect_password' => 'Mật khẩu kết nối Proxy',
         'reason' => [
             'normal' => 'Tài khoản bình thường',
-            'expired' => 'Gói cước của bạn đã hết hạn',
-            'overused' => 'Đã vượt quá giới hạn <code>:data</code> GB dữ liệu trong 1 giờ nên bị giới hạn tốc độ<br/>Sau <code id="banedTime">:min</code> phút sẽ mở khóa',
-            'traffic_exhausted' => 'HẾT DỮ LIỆU',
-            'unknown' => 'LỖI KHÔNG XÁC ĐỊNH. Vui lòng thử làm mới trình duyệt trước khi liên hệ admin để được trợ giúp',
+            'expired' => 'Gói của bạn đã hết hạn',
+            'overused' => 'Bạn đã sử dụng quá giới hạn <code>:data</code> GB cho giai đoạn này<br/> Giới hạn sẽ được gỡ bỏ sau <code id="banedTime">:min</code> phút',
+            'traffic_exhausted' => 'Dữ liệu đã hết',
+            'unknown' => 'Lý do không rõ, hãy thử làm mới trình duyệt! Nếu vấn đề vẫn tiếp tục, liên hệ hỗ trợ.',
         ],
     ],
     'home' => [
         'attendance' => [
             'attribute' => 'Điểm danh',
-            'disable' => 'Chức năng điểm danh bị tắt',
-            'done' => 'Đã điểm danh rồi, ngày mai quay lại nhé!',
-            'success' => 'Bạn nhận được :data dữ liệu',
-            'failed' => 'Lỗi hệ thống',
+            'disable' => 'Điểm danh bị vô hiệu hóa',
+            'done' => 'Bạn đã điểm danh hôm nay. Hãy quay lại vào ngày mai!',
+            'success' => 'Bạn đã nhận được :data dữ liệu',
+            'failed' => 'Lỗi hệ thống',
         ],
         'traffic_logs' => 'Nhật ký dữ liệu',
         'announcement' => 'Thông báo',
-        'wechat_push' => 'Dịch vụ thông báo WeChat',
+        'wechat_push' => 'Thông báo WeChat',
         'chat_group' => 'Nhóm chat',
-        'empty_announcement' => 'Chưa có thông báo',
+        'empty_announcement' => 'Không có thông báo',
     ],
-    'purchase_to_unlock' => 'Mua dịch vụ để mở khóa',
-    'purchase_required' => 'Chức năng này bị tắt đối với người dùng không trả phí! Vui lòng',
+    'purchase_to_unlock' => 'Mua để mở khóa',
+    'purchase_required' => 'Tính năng này bị vô hiệu hóa cho người dùng không trả phí. Vui lòng',
     'attribute' => [
-        'node' => 'Node',
+        'node' => 'Nút',
         'data' => 'Dữ liệu',
-        'ip' => 'IP',
-        'isp' => 'Nhà mạng',
+        'ip' => 'Địa chỉ IP',
+        'isp' => 'ISP',
         'address' => 'Vị trí',
     ],
-    'purchase_promotion' => 'Nhanh chóng mua dịch vụ!',
+    'purchase_promotion' => 'Mua dịch vụ ngay!',
     'menu' => [
-        'helps' => 'Trợ giúp',
+        'help' => 'Trợ giúp',
         'home' => 'Trang chủ',
         'invites' => 'Mời',
-        'invoices' => 'H đơn',
-        'nodes' => 'Node',
-        'referrals' => 'Giới thiệu',
+        'invoices' => 'Hóa đơn',
+        'nodes' => 'Nút',
+        'promotion' => 'Giới thiệu',
         'shop' => 'Cửa hàng',
         'profile' => 'Hồ sơ',
-        'tickets' => '',
+        'tickets' => 'Yêu cầu hỗ trợ',
         'admin_dashboard' => 'Bảng điều khiển',
     ],
     'contact' => 'Liên hệ',
     'oauth' => [
-        'bind_title' => 'Liên kết tài khoản mạng xã hội',
+        'bind_title' => 'Liên kết tài khoản xã hội',
         'not_bind' => 'Chưa liên kết',
         'bind' => 'Liên kết',
         'rebind' => 'Liên kết lại',
@@ -69,169 +69,169 @@ return [
     'coupon' => [
         'discount' => 'Giảm giá',
         'error' => [
-            'unknown' => 'Mã không hợp lệ',
-            'used' => 'Mã đã được sử dụng',
-            'expired' => 'Mã đã hết hạn',
-            'run_out' => 'Mã đã dùng hết',
-            'inactive' => 'Mã chưa có hiệu lực',
-            'wait' => 'Sẽ có hiệu lực lúc :time, vui lòng đợi!',
-            'unmet' => 'Chưa đáp ứng điều kiện',
-            'minimum' => 'Giá trị tối thiểu là :amount',
-            'overused' => 'Chỉ có thể ng :times lần',
-            'users' => 'Tài khoản không đủ điều kiện',
-            'services' => 'Sản phẩm không đủ điều kiện, vui lòng xem điều khoản',
+            'unknown' => 'Mã giảm giá không hợp lệ',
+            'used' => 'Mã giảm giá đã được sử dụng',
+            'expired' => 'Mã giảm giá đã hết hạn',
+            'run_out' => 'Mã giảm giá đã hết',
+            'inactive' => 'Mã giảm giá chưa có hiệu lực',
+            'wait' => 'Sẽ có hiệu lực vào :time, vui lòng chờ!',
+            'unmet' => 'Không đủ điều kiện sử dụng',
+            'minimum' => 'Số tiền tối thiểu là :amount',
+            'overused' => 'Chỉ có thể sử dụng :times lần',
+            'users' => 'Tài khoản không đủ điều kiện khuyến mãi',
+            'services' => 'Sản phẩm không đủ điều kiện giảm giá, kiểm tra điều khoản khuyến mãi',
         ],
     ],
-    'error_response' => 'Đã có lỗi xảy ra, vui lòng thử lại sau.',
+    'error_response' => 'Đã xảy ra lỗi, vui lòng thử lại sau.',
     'invite' => [
         'attribute' => 'Mã mời',
-        'counts' => 'Tổng <code>:num</code> mã mời',
-        'tips' => 'Còn <strong>:num</strong> mã mời, mã mời có hiệu lực trong :days ngày kể từ lúc tạo',
+        'counts' => 'Tổng cộng <code>:num</code> mã mời',
+        'tips' => 'Còn lại <strong>:num</strong> mã mời khả dụng, mã mời hết hạn sau :days ngày kể từ khi tạo',
         'logs' => 'Nhật ký mời',
-        'promotion' => 'Đăng ký qua mã của bạn, cả hai đều nhận được :traffic dữ liệu; Bạn nhận được :referral_percent% hoa hồng khi người được giới thiệu mua hàng',
-        'generate_failed' => 'Thất bại: Đã hết số lượng mã mời',
+        'promotion' => 'Cả bạn và người được mời sẽ nhận được <mark>:traffic</mark> dữ liệu khi họ đăng ký bằng mã của bạn; Bạn sẽ nhận được <mark>:referral_percent%</mark> hoa hồng khi họ mua hàng.',
+        'generate_failed' => 'Tạo thất bại: Hết hạn ngạch mã mời',
     ],
     'reset_data' => [
         'action' => 'Đặt lại dữ liệu',
-        'cost' => 'Phí <code>:amount</code>',
-        'cost_tips' => 'Đặt lại sẽ trừ :amount!',
-        'lack' => 'Số dư không đủ, vui lòng nạp thêm',
-        'logs' => 'Người dùng tự đặt lại dữ liệu',
+        'cost' => 'Chi phí: <code>:amount</code>',
+        'cost_tips' => 'Việc đặt lại sẽ trừ :amount!',
+        'insufficient' => 'Số dư không đủ, vui lòng nạp thêm',
+        'logs' => 'Người dùng đặt lại dữ liệu',
         'success' => 'Đặt lại thành công',
     ],
     'referral' => [
         'link' => 'Liên kết giới thiệu',
-        'total' => 'Tổng :amount (:total lần), rút tiền khi đủ :money',
+        'total' => 'Tổng hoa hồng: :amount (:total lần), có thể rút khi trên :money',
         'logs' => 'Nhật ký hoa hồng',
         'failed' => 'Yêu cầu thất bại',
         'success' => 'Yêu cầu thành công',
         'msg' => [
-            'account' => 'Tài khoản đã hết hạn, vui lòng mua dịch vụ trước',
-            'applied' => 'Đã có yêu cầu, đợi xử lý',
-            'unfulfilled' => 'Cần :amount để rút, cố lên!',
-            'wait' => 'Đợi duyệt',
-            'error' => 'Lỗi tạo đơn, thử lại sau hoặc liên hệ admin',
+            'account' => 'Tài khoản hết hạn, vui lòng mua gói trước',
+            'applied' => 'Yêu cầu hiện tại, vui lòng chờ xử lý',
+            'unfulfilled' => 'Cần :amount để rút, tiếp tục cố gắng!',
+            'wait' => 'Vui lòng chờ quản trị viên phê duyệt',
+            'error' => 'Lỗi tạo đơn hàng, thử lại sau hoặc liên hệ hỗ trợ',
         ],
     ],
     'inviter' => 'Người mời',
     'invitee' => 'Người được mời',
     'registered_at' => 'Ngày đăng ký',
     'bought_at' => 'Ngày mua',
-    'payment_method' => 'Thanh toán',
+    'payment_method' => 'Phương thức thanh toán',
     'pay' => 'Thanh toán',
     'input_coupon' => 'Nhập mã giảm giá',
     'recharge' => 'Nạp tiền',
-    'recharge_credit' => 'Nạp tiền vào tài khoản',
-    'recharging' => 'Đang nạp tiền...',
+    'recharge_credit' => 'Nạp số dư',
+    'recharging' => 'Đang nạp...',
     'withdraw_commission' => 'Rút hoa hồng',
     'withdraw_at' => 'Ngày rút',
-    'withdraw_logs' => 'Lịch sử rút tiền',
+    'withdraw_logs' => 'Nhật ký rút',
     'withdraw' => 'Rút tiền',
-    'scan_qrcode' => 'Vui lòng quét mã QR trong ứng dụng',
+    'scan_qrcode' => 'Quét mã QR bằng ứng dụng khách',
     'shop' => [
-        'hot' => 'BÁN CHẠY',
-        'limited' => 'GIỚI HẠN',
+        'hot' => 'Bán chạy',
+        'limited' => 'Giới hạn',
         'change_amount' => 'Số tiền nạp',
         'change_amount_help' => 'Nhập số tiền nạp',
         'buy' => 'Mua',
         'description' => 'Mô tả',
         'service' => 'Dịch vụ',
-        'pay_credit' => 'Tài khoản',
+        'pay_credit' => 'Thanh toán bằng số dư',
         'pay_online' => 'Thanh toán trực tuyến',
         'price' => 'Giá',
         'quantity' => 'Số lượng',
         'subtotal' => 'Tổng phụ',
-        'total' => 'Tổng',
+        'total' => 'Tổng cộng',
         'conflict' => 'Xung đột',
-        'conflict_tips' => '<p>Gói hiện tại sẽ được đặt là <code>trả trước</code><p><ol class="text-left"><li> Gói trả trước sẽ tự động kích hoạt khi gói hiện tại hết hạn!</li><li> Bạn có thể kích hoạt thủ công sau khi thanh toán!</li></ol>',
-        'call4help' => 'Vui lòng mở vé liên hệ hỗ trợ',
+        'conflict_tips' => '<p>Gói mua hiện tại sẽ được thiết lập là <code>gói trả trước</code></p><ol><li>Gói trả trước sẽ tự động kích hoạt sau khi gói hiện tại hết hạn</li><li>Bạn có thể kích hoạt thủ công sau khi thanh toán</li></ol>',
+        'call4help' => 'Liên hệ hỗ trợ nếu bạn có bất kỳ câu hỏi nào',
     ],
     'service' => [
-        'node_count' => '<code>:num</code> node chất lượng cao',
-        'country_count' => 'Có mặt tại <code>:num</code> quốc gia',
+        'node_count' => '<code>:num</code> nút chất lượng cao',
+        'country_count' => 'Phủ sóng <code>:num</code> quốc gia hoặc khu vực',
         'unlimited' => 'Không giới hạn tốc độ',
     ],
     'payment' => [
         'error' => 'Số tiền nạp không hợp lệ',
-        'creating' => 'Đang tạo đơn hàng...',
-        'redirect_stripe' => 'Chuyển hướng đến thanh toán Stripe',
-        'qrcode_tips' => 'Vui lòng quét mã QR bằng <strong class="red-600">:software</strong>',
-        'close_tips' => 'Vui lòng hoàn thành trong <code>:minutes phút</code> nếu không đơn hàng sẽ đóng',
-        'mobile_tips' => '<strong>Điện thoại:</strong> Nhấn giữ mã QR -> Lưu hình ảnh -> Mở ứng dụng thanh toán -> Quét từ thư viện ảnh để thanh toán',
+        'creating' => 'Đang tạo thanh toán...',
+        'redirect_stripe' => 'Chuyển hướng đến Stripe',
+        'qrcode_tips' => 'Vui lòng quét bằng <strong class="red-600">:software</strong>',
+        'close_tips' => 'Hoàn thành thanh toán trong <code>:minutes</code> phút, nếu không đơn hàng sẽ tự động đóng',
+        'mobile_tips' => '<strong>Người dùng di động:</strong> Nhấn giữ mã QR -> Lưu hình ảnh -> Mở ứng dụng thanh toán -> Quét hình ảnh để thanh toán',
     ],
     'invoice' => [
         'attribute' => 'Đơn hàng',
-        'detail' => 'Chi tiết',
+        'detail' => 'Chi tiết đơn hàng',
         'amount' => 'Số tiền',
-        'active_prepaid_question' => 'Kích hoạt gói trả trước ngay bây giờ?',
-        'active_prepaid_tips' => 'Sau khi kích hoạt:<br>- Gói hiện tại sẽ mất hiệu lực ngay!<br>- Thời hạn mới bắt đầu tính từ hôm nay!',
+        'active_prepaid_question' => 'Kích hoạt gói trả trước sớm?',
+        'active_prepaid_tips' => 'Sau khi kích hoạt:<br>Gói hiện tại của bạn sẽ hết hạn ngay lập tức<br>Ngày hết hạn của gói mới sẽ được tính lại từ hôm nay',
     ],
     'node' => [
         'info' => 'Thông tin cấu hình',
-        'setting' => 'Cài đặt proxy',
-        'unstable' => 'Mạng không ổn định/Bảo trì',
+        'setting' => 'Cài đặt Proxy',
+        'unstable' => 'Không ổn định/Bảo trì',
         'rate' => ':ratio lần tiêu thụ dữ liệu',
     ],
     'subscribe' => [
-        'link' => 'Đường dẫn đăng ký',
-        'tips' => 'Cảnh báo: Chỉ sử dụng cá nhân, không chia sẻ để tránh phát hiện lưu lượng bất thường và bị cấm',
-        'exchange_warning' => 'Thay đổi đăng ký sẽ:\n1. Vô hiệu hóa đăng ký hiện tại ngay lập tức\n2. Thay đổi mật khẩu kết nối',
+        'link' => 'Liên kết đăng ký',
+        'tips' => 'Cảnh báo: Liên kết này chỉ dành cho cá nhân sử dụng. Không chia sẻ nó, nếu không tài khoản của bạn có thể bị cấm do sử dụng bất thường.',
+        'exchange_warning' => 'Thay đổi liên kết đăng ký sẽ:\n1. Thu hồi liên kết hiện tại ngay lập tức\n2. Thay đổi mật khẩu kết nối',
         'custom' => 'Đăng ký tùy chỉnh',
-        'ss_only' => 'Chỉ SS',
-        'ssr_only' => 'Chỉ SSR (bao gồm SS)',
-        'v2ray_only' => 'Chỉ V2Ray',
-        'trojan_only' => 'Chỉ Trojan',
-        'error' => 'Lỗi thay đổi đăng ký',
+        'ss_only' => 'Chỉ đăng ký SS',
+        'ssr_only' => 'Chỉ đăng ký SSR (bao gồm SS)',
+        'v2ray_only' => 'Chỉ đăng ký V2Ray',
+        'trojan_only' => 'Chỉ đăng ký Trojan',
+        'error' => 'Lỗi thay đổi liên kết đăng ký',
         'info' => [
-            'title' => 'Tóm tắt tài khoản [Không thời gian thực]',
+            'title' => 'Tóm tắt tài khoản [Không theo thời gian thực]',
             'upload' => 'Tải lên',
-            'download' => 'Tải về',
+            'download' => 'Tải xuống',
             'total' => 'Dữ liệu gói',
         ],
     ],
     'ticket' => [
-        'attribute' => '',
-        'submit_tips' => 'Xác nhận gửi ?',
-        'reply_confirm' => 'Xác nhận trả lời ?',
-        'close_tips' => 'Bạn có chắc chắn muốn đóng vé này không?',
-        'close' => 'Đóng ',
-        'failed_closed' => 'Lỗi: Vé đã đóng',
-        'reply_placeholder' => 'Nói gì đó...',
+        'attribute' => 'Yêu cầu hỗ trợ',
+        'submit_tips' => 'Xác nhận gửi yêu cầu hỗ trợ?',
+        'reply_confirm' => 'Xác nhận trả lời yêu cầu hỗ trợ?',
+        'close_tips' => 'Xác nhận đóng yêu cầu hỗ trợ?',
+        'close' => 'Đóng yêu cầu hỗ trợ',
+        'failed_closed' => 'Lỗi: Đã đóng',
+        'reply_placeholder' => 'Viết gì đó...',
         'reply' => 'Trả lời',
-        'close_msg' => 'Vé: ID :id đã được đóng bởi người dùng',
-        'title_placeholder' => 'Mô tả ngắn vấn đề của bạn',
-        'content_placeholder' => 'Mô tả chi tiết vấn đề để chúng tôi có thể hỗ trợ nhanh chóng',
-        'new' => 'Tạo  mới',
-        'working_hour' => 'Giờ làm việc',
+        'close_msg' => 'Yêu cầu hỗ trợ ID :id đã đóng bởi người dùng',
+        'title_placeholder' => 'Mô tả ngắn gọn vấn đề của bạn',
+        'content_placeholder' => 'Cung cấp mô tả chi tiết về vấn đề của bạn để chúng tôi có thể hỗ trợ bạn tốt hơn',
+        'new' => 'Tạo yêu cầu hỗ trợ mới',
+        'service_hours' => 'Giờ làm việc của bộ phận hỗ trợ',
         'online_hour' => 'Giờ trực tuyến',
-        'service_tips' => 'Vui lòng chỉ sử dụng một cách liên hệ! Yêu cầu lặp lại sẽ làm chậm phản hồi',
-        'error' => 'Lỗi không xác định! Thông báo cho admin',
+        'service_tips' => 'Vui lòng chỉ sử dụng <code>một</code> phương thức liên hệ để liên hệ hỗ trợ! Yêu cầu lặp lại sẽ làm chậm thời gian phản hồi.',
+        'error' => 'Lỗi không xác định! Vui lòng liên hệ hỗ trợ',
     ],
     'traffic_logs' => [
-        '24hours' => 'Sử dụng hôm nay',
-        '30days' => 'Sử dụng trong tháng',
-        'tips' => 'Lưu ý: Thống kê dữ liệu có thể bị chậm. Theo ngày cập nhật vào ngày kế tiếp, theo giờ cập nhật vào giờ kế tiếp.',
+        'hourly' => 'Sử dụng dữ liệu hôm nay',
+        'daily' => 'Sử dụng dữ liệu tháng này',
+        'tips' => 'Lưu ý: Có độ trễ trong cập nhật thống kê dữ liệu.',
     ],
-    'client' => 'Ứng dụng',
+    'clients' => 'Ứng dụng khách',
     'tutorials' => 'Hướng dẫn',
     'current_role' => 'Vai trò hiện tại',
     'knowledge' => [
-        'title' => 'Kiến thức',
+        'title' => 'Kiến thức cơ bản',
         'basic' => 'Cơ bản',
     ],
     'manual' => [
-        'red_packet' => 'Nhận hồng bao Alipay',
-        'hint' => 'Sau khi quét mã thanh toán, vui lòng nhấn vào 👇【Tiếp theo】 cho đến 👇【Gửi】 để hoàn thành thanh toán!!!',
+        'red_packet' => 'Bao lì xì Alipay',
+        'hint' => 'Sau khi quét mã QR, tiếp tục nhấn [Tiếp theo] cho đến khi nhấn [Gửi] để hoàn tất thanh toán!',
         'step_1' => 'Lưu ý',
-        'step_1_title' => 'Cách thanh toán chính xác',
+        'step_1_title' => 'Cách thanh toán thủ công',
         'step_2' => 'Thanh toán',
-        'step_2_title' => 'Lấy mã QR và thanh toán',
-        'step_3' => 'Hoàn tất',
-        'step_3_title' => 'Đợi xác minh thủ công',
+        'step_2_title' => 'Nhận mã QR và thanh toán',
+        'step_3' => 'Hoàn thành',
+        'step_3_title' => 'Chờ xác minh thủ công',
         'remark' => 'Ghi chú tài khoản',
-        'remark_content' => 'Điền tài khoản đăng nhập để kiểm tra',
-        'payment_hint' => 'Khi thanh toán vui lòng nạp đúng số tiền (nhiều không hoàn lại, ít phải nạp thêm)',
+        'remark_content' => 'Vui lòng cung cấp tên đăng nhập của bạn để xác minh thủ công chính xác',
+        'payment_hint' => 'Vui lòng thanh toán số tiền chính xác (không hoàn lại tiền thừa, nạp thêm nếu thiếu)',
         'pre' => 'Trước',
-        'next' => 'Sau',
+        'next' => 'Tiếp theo',
     ],
 ];

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

@@ -143,37 +143,62 @@ return [
     'uuid' => 'Trường :attribute phải là một chuỗi UUID hợp lệ.',
     'attributes' => [
         'address' => 'địa chỉ',
+        'affiliate_url' => 'URL liên kết',
         'age' => 'tuổi',
         'amount' => 'số lượng',
+        'announcement' => 'thông báo',
         'area' => 'khu vực',
+        'audience_prize' => 'giải thưởng khán giả',
         'available' => 'có sẵn',
         'birthday' => 'ngày sinh nhật',
         'body' => 'nội dung',
         'city' => 'thành phố',
+        'compilation' => 'biên soạn',
+        'concept' => 'ý tưởng',
+        'conditions' => 'điều kiện',
         'content' => 'nội dung',
         'country' => 'quốc gia',
+        'cover' => 'che phủ',
         'created_at' => 'tạo lúc',
         'creator' => 'người sáng tạo',
+        'currency' => 'tiền tệ',
         'current_password' => 'mật khẩu hiện tại',
+        'customer' => 'khách hàng',
         'date' => 'ngày',
         'date_of_birth' => 'ngày sinh',
+        'dates' => 'ngày',
         'day' => 'ngày',
         'deleted_at' => 'xoá lúc',
         'description' => 'mô tả',
+        'display_type' => 'kiểu hiển thị',
         'district' => 'quận/huyện',
         'duration' => 'khoảng thời gian',
         'email' => 'e-mail',
         'excerpt' => 'trích dẫn',
         'filter' => 'lọc',
+        'finished_at' => 'kết thúc lúc',
         'first_name' => 'tên',
         'gender' => 'giới tính',
+        'grand_prize' => 'giải thưởng lớn',
         'group' => 'nhóm',
         'hour' => 'giờ',
         'image' => 'hình ảnh',
+        'image_desktop' => 'hình ảnh máy tính để bàn',
+        'image_main' => 'hình ảnh chính',
+        'image_mobile' => 'hình ảnh di động',
+        'images' => 'hình ảnh',
+        'is_audience_winner' => 'khán giả là người chiến thắng',
+        'is_hidden' => 'bị ẩn',
+        'is_subscribed' => 'đã được đăng ký',
+        'is_visible' => 'có thể nhìn thấy',
+        'is_winner' => 'là người chiến thắng',
+        'items' => 'mặt hàng',
+        'key' => 'chìa khóa',
         'last_name' => 'họ',
         'lesson' => 'bài học',
         'line_address_1' => 'địa chỉ dòng 1',
         'line_address_2' => 'địa chỉ dòng 2',
+        'login' => 'đăng nhập',
         'message' => 'lời nhắn',
         'middle_name' => 'tên đệm',
         'minute' => 'phút',
@@ -186,22 +211,43 @@ return [
         'password_confirmation' => 'xác nhận mật khẩu',
         'phone' => 'số điện thoại',
         'photo' => 'tấm ảnh',
+        'portfolio' => 'danh mục đầu tư',
         'postal_code' => 'mã bưu điện',
+        'preview' => 'xem trước',
         'price' => 'giá',
+        'product_id' => 'ID sản phẩm',
+        'product_uid' => 'UID sản phẩm',
+        'product_uuid' => 'sản phẩm UUID',
+        'promo_code' => 'mã khuyến mại',
         'province' => 'tỉnh/thành phố',
+        'quantity' => 'Số lượng',
+        'reason' => 'lý do',
         'recaptcha_response_field' => 'trường phản hồi recaptcha',
+        'referee' => 'trọng tài',
+        'referees' => 'trọng tài',
+        'reject_reason' => 'lý do từ chối',
         'remember' => 'ghi nhớ',
         'restored_at' => 'khôi phục tại',
         'result_text_under_image' => 'văn bản kết quả dưới hình ảnh',
         'role' => 'vai diễn',
+        'rule' => 'luật lệ',
+        'rules' => 'quy tắc',
         'second' => 'giây',
         'sex' => 'giới tính',
+        'shipment' => 'lô hàng',
         'short_text' => 'văn bản ngắn',
         'size' => 'kích thước',
+        'skills' => 'kỹ năng',
+        'slug' => 'sên',
+        'specialization' => 'chuyên môn hóa',
+        'started_at' => 'bắt đầu lúc',
         'state' => 'tình trạng',
+        'status' => 'trạng thái',
         'street' => 'đường',
         'student' => 'học sinh',
         'subject' => 'tiêu đề',
+        'tag' => 'nhãn',
+        'tags' => 'thẻ',
         'teacher' => 'giáo viên',
         'terms' => 'điều kiện',
         'test_description' => 'mô tả thử nghiệm',
@@ -210,8 +256,11 @@ return [
         'text' => 'văn bản',
         'time' => 'thời gian',
         'title' => 'tiêu đề',
+        'type' => 'kiểu',
         'updated_at' => 'cập nhật lúc',
+        'user' => 'người dùng',
         'username' => 'tên đăng nhập',
+        'value' => 'giá trị',
         'year' => 'năm',
     ],
 ];

+ 129 - 58
resources/lang/zh_CN.json

@@ -1,59 +1,130 @@
 {
-    "(and :count more error)": "(另有 :count 个错误)",
-    "(and :count more errors)": "(另有 :count 个错误)",
-    "All rights reserved.": "版权所有。",
-    "Forbidden": "访问被拒绝",
-    "Go to page :page": "前往第 :page 页",
-    "Hello!": "您好!",
-    "If you did not create an account, no further action is required.": "如果您未注册账号,请忽略此邮件。",
-    "If you did not request a password reset, no further action is required.": "如果您未申请重置密码,请忽略此邮件。",
-    "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "如果您点击「:actionText」按钮时遇到问题,请复制下方链接至浏览器打开:",
-    "Invalid JSON was returned from the route.": "从路由返回无效的JSON数据。",
-    "Login": "登录",
-    "Logout": "登出",
-    "Not Found": "页面不存在",
-    "of": "于",
-    "Page Expired": "页面会话已过期",
-    "Pagination Navigation": "分页导航",
-    "Payment Required": "需要支付",
-    "Please click the button below to verify your email address.": "请点击下方按钮来验证您的邮箱:",
-    "Regards": "致敬",
-    "Register": "注册",
-    "Reset Password": "重置密码",
-    "Reset Password Notification": "重置密码通知",
-    "results": "结果",
-    "Server Error": "服务器错误",
-    "Service Unavailable": "服务不可用",
-    "Showing": "显示中",
-    "The given data was invalid.": "提交的数据无效。",
-    "The response is not a streamed response.": "该响应不是流式响应。",
-    "The response is not a view.": "响应不是视图。",
-    "This password reset link will expire in :count minutes.": "这个重置密码链接将在 :count 分钟后过期。",
-    "to": "至",
-    "Toggle navigation": "切换导航",
-    "Too Many Requests": "请求次数过多。",
-    "Unauthorized": "未授权",
-    "Verify Email Address": "验证邮箱",
-    "Whoops!": "哎呀!",
-    "You are receiving this email because we received a password reset request for your account.": "您收到此邮件是因为我们收到您账号的重置密码请求。",
-    "----「:job」Completed, Used :time seconds ----": "----「:job」完成,用时 :time 秒----",
-    "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[自动任务] 封禁服务:1小时内流量异常",
-    "[Auto Task] Blocked service: Run out of traffic": "[自动任务] 封禁服务:流量耗尽",
-    "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[自动任务] 封禁订阅:24小时内请求异常",
-    "[Auto Task] Unblocked Service: Account ban expired" : "[自动任务]解封服务: 封禁到期",
-    "[Auto Task] Unblocked Service: Account has available data traffic" : "[自动任务]解封服务: 出现可用流量",
-    "[Daily Task] Account Expiration: Block Login & Clear Account": "[每日任务] 账号过期:禁止登录,清空账户",
-    "[Daily Task] Account Expiration: Stop Service": "[每日任务] 账号过期:停止服务",
-    "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[每日任务] 重置账号流量,下次重置日::date",
-    "[Service Timer] Service Expiration": "[定时任务] 服务过期",
-    "Daily Data Usage Report": "每日流量报告",
-    "Invoice Detail": "订单明细",
-    "Payment for #:sn has been received! Total amount: :amount.": "您已支付订单 #:sn,总金额::amount。",
-    "Payment Received": "账单支付成功",
-    "Subscription link receive abnormal access and banned by the system": "订阅链接访问异常,系统自动封禁",
-    "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "感谢您的注册!在开始之前,您需要通过点击我们发送至您邮箱的链接来验证邮箱!如果没有收到邮件,我们很乐意再次发送。",
-    "Verify Your Email Address": "验证您的邮箱",
-    "You have not responded this ticket in :num hours, System has closed your ticket.": ":num小时内未回复工单,系统已自动关闭您的工单",
-    "You must have a valid subscription to view the content in this area!": "您必须拥有有效订阅才可以查看本区域内容!",
-    "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "您的订阅被管理员禁用,请联系管理员恢复。"
-}
+  "(and :count more error)": "(还有 :count 个错误)",
+  "(and :count more errors)": "(以及另外 :count 个错误)",
+  "----「:job」Completed, Used :time seconds ----": "----「:job」已完成,耗时 :time 秒 ----",
+  "[Auto Task] Blocked service: Abnormal traffic within 1 hour": "[自动任务] 服务被封禁:1小时内出现异常流量",
+  "[Auto Task] Blocked service: Run out of traffic": "[自动任务] 服务被封禁:流量已用尽",
+  "[Auto Task] Blocked Subscription: Subscription with abnormal requests within 24 hours": "[自动任务] 订阅被封禁:24小时内出现异常请求",
+  "[Auto Task] Unblocked Service: Account ban expired": "[自动任务] 服务解封:账户封禁期已过",
+  "[Auto Task] Unblocked Service: Account has available data traffic": "[自动任务] 服务解封:账户出现可用流量",
+  "[Daily Task] Account Expiration: Block Login & Clear Account": "[每日任务] 账户已过期:禁止登录并清空账户数据",
+  "[Daily Task] Account Expiration: Stop Service": "[每日任务] 账户已过期:停止服务",
+  "[Daily Task] Reset Account Traffic, Next Reset Date: :date": "[每日任务] 重置账户流量,下次重置日期::date",
+  "[Service Timer] Service Expiration": "[定时任务] 服务已过期",
+  "A Timeout Occurred": "发生超时",
+  "Accepted": "已接受",
+  "All rights reserved.": "版权所有。",
+  "Already Reported": "已上报",
+  "Bad Gateway": "网关错误",
+  "Bad Request": "请求错误",
+  "Bandwidth Limit Exceeded": "超出带宽限制",
+  "Client Closed Request": "客户端关闭请求",
+  "Conflict": "冲突",
+  "Connection Closed Without Response": "连接关闭无响应",
+  "Connection Timed Out": "连接超时",
+  "Continue": "继续请求",
+  "Created": "已创建",
+  "Daily Data Usage Report": "每日流量使用报告",
+  "Expectation Failed": "期望不满足",
+  "Failed Dependency": "失败的依赖",
+  "Forbidden": "访问被拒绝",
+  "Found": "临时移动",
+  "Gateway Timeout": "网关超时",
+  "Go to page :page": "前往第 :page 页",
+  "Gone": "不可用",
+  "Hello!": "您好!",
+  "HTTP Version Not Supported": "HTTP版本不支持",
+  "I'm a teapot": "我是一个茶壶",
+  "If you did not create an account, no further action is required.": "如果您未注册帐号,请忽略此邮件。",
+  "If you did not request a password reset, no further action is required.": "如果您未申请重设密码,请忽略此邮件。",
+  "If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "如果您单击「:actionText」按钮时遇到问题,请复制下方链接到浏览器中访问:",
+  "IM Used": "IM已使用",
+  "Insufficient Storage": "存储空间不足",
+  "Internal Server Error": "内部服务器错误",
+  "Invalid JSON was returned from the route.": "从路由返回无效的 JSON。",
+  "Invalid SSL Certificate": "无效的SSL证书",
+  "Invoice Detail": "订单详情",
+  "Length Required": "长度要求",
+  "Locked": "锁定",
+  "Login": "登录",
+  "Logout": "登出",
+  "Loop Detected": "检测到环路",
+  "Maintenance Mode": "服务不可用",
+  "Method Not Allowed": "方法不允许",
+  "Misdirected Request": "错误的请求",
+  "Moved Permanently": "已永久移动",
+  "Multi-Status": "多状态",
+  "Multiple Choices": "多种选择",
+  "Network Authentication Required": "需要网络验证",
+  "Network Connect Timeout Error": "网络连接超时",
+  "Network Read Timeout Error": "网络读取超时",
+  "No Content": "无内容",
+  "Non-Authoritative Information": "非权威信息",
+  "Not Acceptable": "无法接受",
+  "Not Extended": "未延期",
+  "Not Found": "页面不存在",
+  "Not Implemented": "未实现",
+  "Not Modified": "未修改",
+  "of": "于",
+  "OK": "请求成功",
+  "Origin Is Unreachable": "原点无法到达",
+  "Page Expired": "页面会话已超时",
+  "Pagination Navigation": "分页导航",
+  "Partial Content": "部分内容",
+  "Payload Too Large": "请求实体过大",
+  "Payment for #:sn has been received! Total amount: :amount.": "订单#:sn的付款已收到!总金额::amount。",
+  "Payment Received": "付款成功",
+  "Payment Required": "需要付款",
+  "Permanent Redirect": "永久重定向",
+  "Please click the button below to verify your email address.": "请点击下面按钮验证您的电子邮箱地址:",
+  "Precondition Failed": "前提条件未满足",
+  "Precondition Required": "前提要求",
+  "Processing": "处理中",
+  "Proxy Authentication Required": "需要代理验证",
+  "Railgun Error": "轨道炮错误",
+  "Range Not Satisfiable": "请求范围不符合",
+  "Regards": "致敬",
+  "Register": "注册",
+  "Request Header Fields Too Large": "请求标头字段太大",
+  "Request Timeout": "请求超时",
+  "Reset Content": "重置内容",
+  "Reset Password": "重置密码",
+  "Reset Password Notification": "重置密码通知",
+  "results": "结果",
+  "Retry With": "重试",
+  "See Other": "见其他",
+  "Server Error": "服务器错误",
+  "Service Unavailable": "服务不可用",
+  "Session Has Expired": "会话已过期",
+  "Showing": "显示中",
+  "SSL Handshake Failed": "SSL握手失败",
+  "Subscription link receive abnormal access and banned by the system": "订阅链接出现异常访问,系统已自动封禁",
+  "Switching Protocols": "切换协议",
+  "Temporary Redirect": "临时重定向",
+  "Thank you for signing up! Before you start, you need to verify your email by clicking on the link we have just sent to your email! If you haven't received an email, we would be happy to send another one.": "感谢您的注册!在开始之前,请点击我们刚发送到您邮箱的链接完成邮箱验证。如果没有收到邮件,我们很乐意为您重发一封。",
+  "The given data was invalid.": "给定的数据无效。",
+  "The response is not a streamed response.": "该响应不是流式响应。",
+  "The response is not a view.": "响应不是视图。",
+  "This password reset link will expire in :count minutes.": "这个重设密码链接将会在 :count 分钟后失效。",
+  "to": "至",
+  "Toggle navigation": "切换导航",
+  "Too Early": "太早了",
+  "Too Many Requests": "请求次数过多。",
+  "Unauthorized": "未授权",
+  "Unavailable For Legal Reasons": "法律原因不可用",
+  "Unknown Error": "未知错误",
+  "Unprocessable Entity": "不可处理的实体",
+  "Unsupported Media Type": "不支持的媒体类型",
+  "Upgrade Required": "需要升级",
+  "URI Too Long": "URI太长了",
+  "Use Proxy": "使用代理",
+  "Variant Also Negotiates": "变体协商",
+  "Verify Email Address": "验证电子邮箱地址",
+  "Verify Your Email Address": "验证您的电子邮箱地址",
+  "Web Server is Down": "Web服务器已关闭",
+  "Whoops!": "哎呀!",
+  "You are receiving this email because we received a password reset request for your account.": "您收到此电子邮件是因为我们收到了您帐户的密码重设请求。",
+  "You have not responded this ticket in :num hours, System has closed your ticket.": ":num 小时内未回复该工单,系统已自动关闭此工单。",
+  "You must have a valid subscription to view the content in this area!": "您必须拥有有效订阅才能查看此区域的内容!",
+  "Your subscription has been disabled by the administrator, please contact the administrator to restore it": "您的订阅已被管理员禁用,请联系管理员恢复订阅。"
+}

+ 117 - 118
resources/lang/zh_CN/admin.php

@@ -7,12 +7,12 @@ return [
         'users' => '总用户数',
         'available_users' => '有效用户数',
         'paid_users' => '付费用户数',
-        'active_days_users' => ':days 内活跃用户',
-        'inactive_days_users' => ':days 日以上不活跃用户',
+        'active_days_users' => ':days 内活跃用户',
+        'inactive_days_users' => '超过 :days 天未活跃的用户',
         'online_users' => '当前在线用户',
-        'expiring_users' => '即将期用户',
-        'overuse_users' => '流量大户(超过90%的用户)',
-        'abnormal_users' => '1小时内流量异常用户',
+        'expiring_users' => '即将期用户',
+        'overuse_users' => '流量使用超过90%的用户',
+        'abnormal_users' => '1小时内流量异常用户',
         'nodes' => '节点数',
         'maintaining_nodes' => '维护中节点',
         'current_month_traffic_consumed' => '本月消耗流量',
@@ -25,13 +25,13 @@ return [
         'withdrawn_commissions' => '已支出佣金',
     ],
     'action' => [
-        'edit_item' => '编辑:attribute',
-        'add_item' => '添加:attribute',
+        'edit_item' => '编辑 :attribute',
+        'add_item' => '添加 :attribute',
     ],
     'confirm' => [
-        'delete' => [0 => '确定删除:attribute【', 1 => '】? '],
-        'continues' => '确定继续操作吗? ',
-        'export' => '确定全部导出? ',
+        'delete' => [0 => '确定删除 :attribute【', 1 => '】?'],
+        'continues' => '确定继续执行此操作吗?',
+        'export' => '确定全部导出吗?',
     ],
     'user_dashboard' => '个人中心',
     'menu' => [
@@ -39,14 +39,14 @@ return [
         'user' => [
             'attribute' => '用户系统',
             'list' => '用户管理',
-            'oauth' => '用户授权',
+            'oauth' => '第三方授权',
             'group' => '用户分组',
-            'credit_log' => '余额变动',
+            'credit_log' => '余额变动记录',
             'subscribe' => '订阅管理',
         ],
         'rbac' => [
             'attribute' => '权限系统',
-            'permission' => '权限列表',
+            'permission' => '权限管理',
             'role' => '角色列表',
         ],
         'customer_service' => [
@@ -71,11 +71,11 @@ return [
         'shop' => [
             'attribute' => '商品系统',
             'goods' => '商品管理',
-            'coupon' => '券管理',
+            'coupon' => '优惠券管理',
             'order' => '商品订单',
         ],
         'promotion' => [
-            'attribute' => '推广系统',
+            'attribute' => '推广营销',
             'invite' => '邀请管理',
             'withdraw' => '提现管理',
             'rebate_flow' => '返利流水',
@@ -98,67 +98,66 @@ return [
             'system' => '系统日志',
         ],
         'tools' => [
-            'attribute' => '工具',
+            'attribute' => '工具',
             'decompile' => '反解析',
             'convert' => '格式转换',
             'import' => '数据导入',
             'analysis' => '日志分析',
         ],
         'setting' => [
-            'attribute' => '设置',
+            'attribute' => '系统设置',
             'email_suffix' => '邮箱后缀管理',
-            'universal' => '通用置',
-            'system' => '系统设置',
+            'universal' => '通用置',
+            'system' => '系统参数',
         ],
     ],
     'user' => [
         'massive' => [
-            'text' => '用户生成数量',
+            'text' => '批量生成账号数量',
             'failed' => '批量生成账号失败',
             'succeed' => '批量生成账号成功',
-            'note' => '后台批量生成用户',
+            'note' => '后台批量生成用户账号',
         ],
         'proxy_info' => '配置信息',
         'traffic_monitor' => '流量统计',
-        'online_monitor' => '在线巡查',
+        'online_monitor' => '在线监测',
         'reset_traffic' => '重置流量',
         'user_view' => '用户视角',
-        'connection_test' => '联网测试',
-        'counts' => '共 <code>:num</code> 个账号',
-        'reset_confirm' => [0 => '确定重置 【', 1 => '】 的流量吗?'],
+        'connection_test' => '连接测试',
+        'counts' => '共 <code>:num</code> 个账号',
+        'reset_confirm' => [0 => '确定重置 【', 1 => '】 的可用流量吗?'],
         'info' => [
             'account' => '账号信息',
             'proxy' => '代理信息',
             'switch' => '切换身份',
-            'reset_date_hint' => '账号流量下一个重置日期',
-            'expired_date_hint' => '留空默认为一年',
-            'uuid_hint' => 'V2Ray的账户ID',
-            'recharge_placeholder' => '填入负值则会扣余额',
+            'reset_date_hint' => '账号流量下重置日期',
+            'expired_date_hint' => '留空默认为一年有效期',
+            'uuid_hint' => 'V2Ray 的账户 ID',
+            'recharge_placeholder' => '填入负值可扣减余额',
         ],
         'update_help' => '更新成功,是否返回?',
-        'proxies_config' => '【:username】连接配置信息',
+        'proxies_config' => '【:username】连接配置信息',
         'group' => [
-            'title' => '用户分组控制<small>(同一节点可分配至多个分组,一个用户只能属于一个分组;对于用户可见/可用节点:先按分组后按等级)</small>',
+            'title' => '用户分组控制<small>(同节点可以属于多个分组,但用户只能属于一个分组;对于用户可见/可用的节点,分组优先于等级)</small>',
             'name' => '分组名称',
-            'counts' => '共 <code>:num</code> 个分组',
+            'counts' => '共 <code>:num</code> 个分组',
         ],
     ],
     'zero_unlimited_hint' => '不设置/0,即为无限制',
     'node' => [
         'traffic_monitor' => '流量统计',
-        'refresh_geo' => '刷新地理',
-        'ping' => '检测延迟',
-        'connection_test' => '连通性检测',
-        'counts' => '共 <code> :num </code> 条线路',
+        'refresh_geo' => '刷新地理位置',
+        'connection_test' => '连通性测试',
+        'counts' => '共有 <code>:num</code> 条线路',
         'reload_all' => '重载【全部】后端',
         'refresh_geo_all' => '刷新【全部】节点地理信息',
-        'reload_confirm' => '确定重载节点?',
+        'reload_confirm' => '确定重载节点后端吗?',
         'info' => [
-            'hint' => '<strong>注意:</strong> 添加节点后自动生成的<code>ID</code>,即为该节点部署ShadowsocksR Python版后端时<code>usermysql.json</code>中的<code>node_id</code>的值,同时也是部署V2Ray后端时的<code>nodeId</code>的值;',
-            'basic' => '基信息',
-            'ddns_hint' => '动态IP节点需要<a href="https://github.com/NewFuture/DDNS" target="_blank">配置DDNS</a>,对此类型节点,节点阻断功能会通过域名进行检测',
+            'hint' => '<strong>注意:</strong> 添加节点后自动生成的<code>ID</code>是该节点部署 ShadowsocksR Python版后端时<code>usermysql.json</code>中的<code>node_id</code>值,同时也是部署 V2Ray 后端时的<code>nodeId</code>值。',
+            'basic' => '基信息',
+            'ddns_hint' => '动态IP节点需要<a href="https://github.com/NewFuture/DDNS" target="_blank">配置DDNS</a>,这种类型的节点会通过域名进行节点阻断检测。',
             'domain_placeholder' => '服务器域名地址,填则优先取域名地址',
-            'domain_hint' => '系统设置中开启【DDNS模式】,域名将自动绑定下方IP!无需再前往域名注册商页面修改IP信息了哟',
+            'domain_hint' => '系统开启【DDNS模式】后,域名将自动与下方的IP绑定,不需要再去域名注册商修改IP信息。',
             'extend' => '扩展信息',
             'display' => [
                 'invisible' => '完全不可见',
@@ -167,23 +166,23 @@ return [
                 'all' => '完全可见',
                 'hint' => '用户是否可订阅/查看本节点',
             ],
-            'ipv4_hint' => '多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8',
-            'ipv6_hint' => '多IP使用“, ”分割,例:1.1.1.1, 8.8.8.8',
+            'ipv4_hint' => '多IP使用英文逗号分隔,例:1.1.1.1,8.8.8.8',
+            'ipv6_hint' => '多IP使用英文逗号分隔,例:1.1.1.1,8.8.8.8',
             'ipv4_placeholder' => '服务器IPv4地址',
-            'ipv6_placeholder' => '服务器IPv6地址,填写则用户可见',
-            'push_port_hint' => '必填且防火墙需放行,否则将导致消息推送异常',
-            'data_rate_hint' => '举例:0.1用100M结算10M,5用100M结算500M',
-            'level_hint' => '等级:0-无等级,全部可见',
+            'ipv6_placeholder' => '服务器IPv6地址',
+            'push_port_hint' => '必填且需开放防火墙端口,否则消息推送将异常',
+            'data_rate_hint' => '示例:0.1表示100M结算10M,5表示100M结算500M',
+            'level_hint' => '等级:0-无等级限制,全部可见',
             'detection' => [
-                'tcp' => '只检测TCP',
-                'icmp' => '只检测ICMP',
-                'all' => '检测全部',
+                'tcp' => '只检测TCP连通性',
+                'icmp' => '只检测ICMP连通性',
+                'all' => '检测全部连通性',
                 'hint' => '每30~60分钟随机进行节点阻断检测',
             ],
             'obfs_param_hint' => '混淆不为 [plain] 时可填入参数进行流量伪装;&#13;&#10;混淆为 [http_simple] 时,建议端口为 80;&#13;&#10;混淆为 [tls] 时,建议端口为 443;',
             'additional_ports_hint' => '如果启用请配置服务端的<span class="red-700"><a href="javascript:showTnc();">additional_ports</a></span>信息',
-            'v2_method_hint' => '使用WebSocket传输协议不要使用none',
-            'v2_net_hint' => '使用WebSocket传输协议请启用TLS',
+            'v2_method_hint' => 'WebSocket传输协议不要使用none加密方式',
+            'v2_net_hint' => 'WebSocket传输协议请启用TLS',
             'v2_cover' => [
                 'none' => '无伪装',
                 'http' => 'HTTP数据流',
@@ -193,11 +192,11 @@ return [
                 'dtls' => 'DTLS1.2数据包',
                 'wireguard' => 'WireGuard数据包',
             ],
-            'v2_host_hint' => '伪装类型为http时多个伪装域名逗号隔使用WebSocket传输协议时只允许单个',
-            'v2_tls_provider_hint' => '各后端配置不同:',
-            'single_hint' => '推荐80或443端口,服务端需配置 <br> 严格模式:用户的端口无法连接,只能通过以下指定的端口进行连接(<a href="javascript:showPortsOnlyConfig();">如何配置</a>)',
+            'v2_host_hint' => 'http伪装时多个域名逗号隔,WebSocket只允许单个域名',
+            'v2_tls_provider_hint' => '不同后端的配置不同:',
+            'single_hint' => '推荐80或443端口,服务端需配置 <br> 严格模式:用户的端口无法连接,只能通过以下指定的端口进行连接(<a href="javascript:showPortsOnlyConfig();">如何配置</a>)',
         ],
-        'proxy_info' => '*兼容 SS',
+        'proxy_info' => '*兼容SS协议',
         'proxy_info_hint' => '如果兼容请在服务端配置协议和混淆时加上<span class="red-700">_compatible</span>',
         'reload' => '重载后端',
         'auth' => [
@@ -215,72 +214,72 @@ return [
                 'real_time_logs' => '实时日志',
                 'restart' => '重启',
                 'same' => '同上',
-                'trojan_hint' => '请先<a href=":url" target="_blank">填写节点域名</a>并将域名解析到节点对应IP',
+                'trojan_hint' => '请先<a href=":url" target="_blank">填写节点域名</a>并解析到对应IP',
             ],
             'reset_auth' => '重置密钥',
-            'counts' => '共 <code>:num</code> 条授权',
-            'generating_all' => '确定生成所有节点的授权吗?',
+            'counts' => '共 <code>:num</code> 条授权记录',
+            'generating_all' => '确定是否为所有节点生成授权密钥?',
         ],
         'cert' => [
             'title' => '域名证书列表<small>(V2Ray节点的伪装域名)</small>',
-            'counts' => '共 <code>:num</code> 个域名证书',
-            'key_placeholder' => '域名证书的KEY值,允许为空,VNET-V2Ray后端支持自动签证书',
-            'pem_placeholder' => '域名证书的PEM值,允许为空,VNET-V2Ray后端支持自动签证书',
+            'counts' => '共 <code>:num</code> 个域名证书',
+            'key_placeholder' => '证书的KEY值,允许为空,VNET-V2Ray后端支持自动签',
+            'pem_placeholder' => '证书的PEM值,允许为空,VNET-V2Ray后端支持自动签',
         ],
     ],
     'hint' => '提示',
     'oauth' => [
-        'title' => '用户OAuth授权',
-        'counts' => '共 <code>:num</code> 个授权',
+        'title' => '第三方授权',
+        'counts' => '共有 <code>:num</code> 条授权记录',
     ],
-    'select_all' => '全 选',
-    'clear' => '清 空',
-    'unselected_hint' => '待分配规则,此处可搜索',
-    'selected_hint' => '已分配规则,此处可搜索',
+    'select_all' => '全选',
+    'clear' => '清空',
+    'unselected_hint' => '待分配规则,此处可搜索',
+    'selected_hint' => '已分配规则,此处可搜索',
     'clone' => '克隆',
     'monitor' => [
         'daily_chart' => '每日流量图',
         'monthly_chart' => '月流量图',
         'node' => '节点流量',
         'user' => '用户流量',
-        'hint' => '<strong>提示:</strong> 如果无统计数据,请检查定时任务是否正常。',
+        'hint' => '<strong>提示:</strong> 如果没有统计数据,请检查定时任务是否正常运行。',
     ],
     'tools' => [
         'analysis' => [
             'title' => 'SSR日志分析<small>仅适用于单机单节点</small>',
-            'req_url' => '近期请求地址',
+            'req_url' => '近期请求URL记录',
             'not_enough' => '访问记录不足15000条,无法分析数据',
         ],
         'convert' => [
             'title' => '格式转换 <small>Shadowsocks 转 ShadowsocksR</small>',
-            'content_placeholder' => '请填入要转换的配置信息',
+            'content_placeholder' => '请填入要转换的配置信息',
         ],
         'decompile' => [
             'title' => '反解析<small>配置转换</small>',
-            'attribute' => '反解析',
-            'content_placeholder' => '请填入要反解析的ShadowsocksR链接,一行一条',
+            'attribute' => '反解析配置链接',
+            'content_placeholder' => '请填入需要反解析的ShadowsocksR链接,换行分隔',
         ],
     ],
     'ticket' => [
         'title' => '工单列表',
-        'counts' => '共 <code>:num</code> 个工单',
-        'send_to' => '请填入目标用户信息!',
+        'counts' => '共 <code>:num</code> 个工单',
+        'send_to' => '请填入目标用户信息',
         'user_info' => '用户信息',
         'inviter_info' => '邀请人信息',
-        'close_confirm' => '确定关闭工单?',
+        'close_confirm' => '确定关闭工单?',
         'error' => '未知错误!请查看运行日志',
     ],
     'logs' => [
         'subscribe' => '订阅列表',
-        'counts' => '共 <code>:num</code> 条记录',
+        'counts' => '共 <code>:num</code> 条记录',
         'rule' => [
-            'clear_all' => '清空记录',
-            'title' => '触发记录',
-            'name' => '触发规则',
+            'clear_all' => '清空所有记录',
+            'title' => '规则触发记录',
+            'name' => '触发规则名称',
             'reason' => '触发原因',
             'created_at' => '触发时间',
-            'tag' => '✅ 访问非规则允许内容',
-            'clear_confirm' => '确定清空所有记录吗?',
+            'tag' => '✅ 访问非许内容',
+            'clear_confirm' => '确定清空所有触发记录吗?',
         ],
         'order' => [
             'title' => '订单列表',
@@ -330,8 +329,8 @@ return [
             'yes' => '上架',
             'no' => '下架',
         ],
-        'sell_and_used' => '使用 / 销售',
-        'counts' => '共 <code>:num</code> 个商品',
+        'sell_and_used' => '使用/销售',
+        'counts' => '共 <code>:num</code> 个商品',
     ],
     'sort_asc' => '排序值越大排越前',
     'yes' => '是',
@@ -343,7 +342,7 @@ return [
             'ip' => 'IP',
             'protocol' => '协议',
         ],
-        'counts' => '共 <code>:num</code> 条审计规则',
+        'counts' => '共 <code>:num</code> 条审计规则',
         'title' => '规则列表',
         'group' => [
             'type' => [
@@ -351,7 +350,7 @@ return [
                 'on' => '放行',
             ],
             'title' => '规则分组',
-            'counts' => '共 <code>:num</code> 个分组',
+            'counts' => '共 <code>:num</code> 个分组',
         ],
     ],
     'role' => [
@@ -359,7 +358,7 @@ return [
         'description_hint' => '面板显示名称,例如:管理员',
         'title' => '权限角色列表',
         'permissions_all' => '全部权限',
-        'counts' => '共 <code>:num</code> 个权限角色',
+        'counts' => '共 <code>:num</code> 个权限角色',
     ],
     'report' => [
         'daily_accounting' => '日流水',
@@ -382,13 +381,13 @@ return [
         'title' => '权限行为列表',
         'description_hint' => '填写描述,例:【A系统】编辑A',
         'name_hint' => '填写路由名称,例:admin.permission.create,update',
-        'counts' => '共 <code>:num</code> 条权限行为',
+        'counts' => '共 <code>:num</code> 条权限行为',
     ],
     'marketing' => [
         'email' => [
             'title' => '邮件群发列表',
             'group_send' => '群发邮件',
-            'counts' => '共 <code>:num</code> 条消息',
+            'counts' => '共 <code>:num</code> 条消息',
         ],
         'send_status' => '发送状态',
         'send_time' => '发送时间',
@@ -396,7 +395,7 @@ return [
         'push' => [
             'title' => '推送消息列表',
             'send' => '推送消息',
-            'counts' => '共 <code>:num</code> 条推送消息',
+            'counts' => '共 <code>:num</code> 条推送消息',
         ],
     ],
     'creating' => '正在添加...',
@@ -406,9 +405,9 @@ return [
             'announcement' => '公告',
         ],
         'category_hint' => '同一类别将归类与同一文件夹下',
-        'logo_hint' => '推荐尺寸:100x75',
+        'logo_placeholder' => '或输入 logo 链接',
         'title' => '文章列表',
-        'counts' => '共 <code>:num</code> 篇文章',
+        'counts' => '共 <code>:num</code> 篇文章',
     ],
     'coupon' => [
         'title' => '卡券列表',
@@ -427,10 +426,10 @@ return [
         'used_hint' => '符合条件的用户可以使用本券 <strong>:num</strong> 次;',
         'levels_hint' => '用户等级在选定等级内,方可使用本券',
         'groups_hint' => '选定的用户分组,方可使用本券',
-        'users_placeholder' => '输入用户ID, 再回车',
+        'users_placeholder' => '输入用户ID再回车',
         'user_whitelist_hint' => '涉及用户均可使用本券,留空为不使用此条件',
         'users_blacklist_hint' => '涉及用户均不可使用本券,空为不使用此条件',
-        'services_placeholder' => '输入商品ID, 再回车',
+        'services_placeholder' => '输入商品ID再回车',
         'services_whitelist_hint' => '涉及商品方可使用本券,留空为不使用此条件',
         'services_blacklist_hint' => '涉及商品不可使用本券,留空为不使用此条件',
         'newbie' => [
@@ -441,7 +440,7 @@ return [
         'created_days_hint' => '且 创号 <code>:days</code> 天',
         'limit_hint' => '本项各条件为 <strong>并且</strong> 关系,请自行搭配使用',
         'info_title' => '卡券信息',
-        'counts' => '共 <code>:num</code> 张优惠券',
+        'counts' => '共 <code>:num</code> 张优惠券',
         'discount' => '优惠',
         'export_title' => '卡券导出',
         'single_use' => '一次性',
@@ -451,12 +450,12 @@ return [
     'system_generate' => '系统生成',
     'aff' => [
         'rebate_title' => '返利流水记录',
-        'counts' => '共 <code>:num</code> 个申请',
+        'counts' => '共有 <code>:num</code> 条返利记录',
         'title' => '提现申请列表',
-        'apply_counts' => '共 <code>:num</code> 个申请',
+        'apply_counts' => '共 <code>:num</code> 个提现申请',
         'referral' => '推广返利',
         'commission_title' => '提现申请详情',
-        'commission_counts' => '本申请共涉及 <code>:num</code> 单',
+        'commission_counts' => '本申请共涉及 <code>:num</code> 单',
     ],
     'setting' => [
         'common' => [
@@ -465,7 +464,7 @@ return [
             'connect_nodes' => '关联节点数',
         ],
         'email' => [
-            'title' => '邮箱过滤列表 <small>(用于屏蔽注册邮箱后缀)</small>',
+            'title' => '邮箱过滤列表 <small>(用于屏蔽特定邮箱后缀注册)</small>',
             'tail' => '邮箱后缀',
             'rule' => '规则',
             'black' => '黑名单',
@@ -510,7 +509,7 @@ return [
         'ddns_secret' => 'DNS服务商Secret',
         'default_days' => '初始有效期',
         'default_traffic' => '初始流量',
-        'detection_check_times' => '阻断检测提醒',
+        'detection_check_times' => '阻断检测通知',
         'dingTalk_access_token' => '钉钉自定义机器人 Access Token',
         'dingTalk_secret' => '钉钉自定义机器人 密钥',
         'epay_key' => '商户密钥',
@@ -546,11 +545,11 @@ return [
         'maintenance_time' => '维护结束时间',
         'min_port' => '端口范围',
         'min_rand_traffic' => '流量范围',
-        'node_blocked_notification' => '节点阻断提醒通知',
+        'node_blocked_notification' => '节点阻断通知',
         'node_daily_notification' => '节点使用报告',
-        'node_offline_notification' => '节点离线提醒',
+        'node_offline_notification' => '节点离线通知',
         'oauth_path' => '第三方登录平台',
-        'offline_check_times' => '离线提醒次数',
+        'offline_check_times' => '离线通知次数',
         'password_reset_notification' => '重置密码',
         'paybeaver_app_id' => 'App ID',
         'paybeaver_app_secret' => 'App Secret',
@@ -625,13 +624,13 @@ return [
             'auto_release_port' => '被封禁/过期 <code>'.config('tasks.release_port').'</code> 天的账号端口自动释放',
             'bark_key' => '推送消息到iOS设备,需要在iOS设备里装一个名为Bark的应用,取网址后的一长串字符串,启用Bark,请务必填入本值',
             'captcha_key' => '浏览<a href="https://proxypanel.gitbook.io/wiki/captcha" target="_blank">设置指南</a>来设置',
-            'data_anomaly_notification' => '1小时内流量超过异常阈值通知管',
+            'data_anomaly_notification' => '1小时内流量超过异常阈值通知管理员',
             'data_exhaust_notification' => '通知用户流量即将耗尽',
             'ddns_key' => "浏览<a href='https://proxypanel.gitbook.io/wiki/ddns' target='_blank'>设置指南</a>来设置",
             'ddns_mode' => '添加/编辑/删除节点的【域名、ipv4、ipv6】时,自动更新对应内容至DNS服务商',
-            'default_days' => '用户注册时默认账户有效期,为0即当天到期',
+            'default_days' => '用户注册时默认账户有效期,为0即当天到期',
             'default_traffic' => '用户注册时默认可用流量',
-            'detection_check_times' => '提醒N次后自动下线节点,为0/留空时不限制,不超过12',
+            'detection_check_times' => '通知N次后自动下线节点,为0/留空时不限制,不超过12',
             'dingTalk_access_token' => '可以阅读<a href=https://open.dingtalk.com/document/group/custom-robot-access#title-jfe-yo9-jl2 target=_blank>钉钉手册</a>查阅步骤',
             'dingTalk_secret' => '可选填!开启机器人[加签]就是必填项目!',
             'expire_days' => '【账号过期通知】开始阈值,每日通知用户',
@@ -646,7 +645,7 @@ return [
             'is_checkin' => '登录时将根据流量范围随机得到流量',
             'is_clear_log' => '(推荐)启用后自动清除无用日志',
             'is_custom_subscribe' => '启用后,订阅信息顶部将显示过期时间、剩余流量(只支持个别客户端)',
-            'is_email_filtering' => '黑名单: 用户可使用任意黑名单外的邮箱注册;白名单:用户只能选择使用白名单中的邮箱后缀注册',
+            'is_email_filtering' => '黑名单:用户可使用任意黑名单外的邮箱注册;白名单:用户只能选择使用白名单中的邮箱后缀注册',
             'is_forbid_robot' => '如果是机器人、爬虫、代理访问网站则会抛出404错误',
             'is_free_code' => '关闭后免费邀请码不可见',
             'is_rand_port' => '注册、添加用户时随机生成端口',
@@ -657,12 +656,12 @@ return [
             'maintenance_content' => '自定义维护内容信息',
             'maintenance_mode' => "启用后,用户访问转移至维护界面 | 管理员使用 <a href='javascript:(0)'>:url</a> 登录",
             'maintenance_time' => '用于维护界面倒计时',
-            'min_port' => '端口范围:1000 - 65535',
-            'node_blocked_notification' => '每小时检测节点是否被阻断并提醒管理员',
-            'node_daily_notification' => '报告各节点流量昨日消耗情况',
-            'node_offline_notification' => '每10分钟检测节点离线并提醒管理员',
+            'min_port' => '端口范围:1000~65535',
+            'node_blocked_notification' => '每小时检测节点是否被阻断并通知管理员',
+            'node_daily_notification' => '报告各节点前一天的流量消耗情况',
+            'node_offline_notification' => '每10分钟检测节点离线情况并通知管理员',
             'oauth_path' => '请在.ENV中添加设置,再在此处开启平台',
-            'offline_check_times' => '24小时内提醒n次后不再提醒',
+            'offline_check_times' => '24小时内通知n次后不再通知',
             'password_reset_notification' => '启用后用户可以重置密码',
             'paybeaver_app_id' => '<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -> 开发者 -> App ID',
             'paybeaver_app_secret' => '<a href="https://merchant.paybeaver.com/" target="_blank">商户中心</a> -> 开发者 -> App Secret',
@@ -692,7 +691,7 @@ return [
             'ticket_closed_notification' => '工单关闭通知用户',
             'ticket_created_notification' => '新工单通知管理/用户,取决于谁创建了新工单',
             'ticket_replied_notification' => '工单回复通知对方',
-            'traffic_ban_time' => '任何异常导致用户/订阅被封禁的时长, 到期后自动解封',
+            'traffic_ban_time' => '任何异常导致用户/订阅被封禁的时长到期后自动解封',
             'traffic_ban_value' => '1小时内超过该值,则触发自动封号',
             'traffic_limit_time' => '间隔多久才可以再次签到',
             'traffic_warning_percent' => '【流量耗尽通知】开始阈值,每日通知用户',
@@ -715,11 +714,11 @@ return [
         ],
         'placeholder' => [
             'default_url' => '默认为 :url',
-            'server_chan_key' => '填入ServerChan的SCKEY->再点击更新',
+            'server_chan_key' => '填入ServerChan的SCKEY -> 再点击更新',
             'pushDeer_key' => '填入PushDeer的Push Key -> 再点击更新',
             'iYuu_token' => '填入爱语飞飞的IYUU令牌 -> 再点击更新',
             'bark_key' => '填入Bark的设备号 -> 再点击更新',
-            'telegram_token' => '填入Telegram的 Token -> 再点击更新',
+            'telegram_token' => '填入Telegram的Token -> 再点击更新',
             'pushplus_token' => '请到ServerChan申请',
             'dingTalk_access_token' => '自定义机器人的WebHook中的access_token',
             'dingTalk_secret' => '自定义机器人加签后出现的的密钥',
@@ -743,10 +742,10 @@ return [
                 'manual' => '人工支付',
             ],
             'hint' => [
-                'alipay' => '本功能需要<a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">蚂蚁金服开放平台</a>申请权限及应用',
+                'alipay' => '本功能需要<a href="https://open.alipay.com/platform/appManage.htm?#/create/" target="_blank">蚂蚁金服开放平台</a>申请权限及应用',
                 'codepay' => '请到 <a href="https://codepay.fateqq.com/i/377289" target="_blank">码支付</a>申请账号,然后下载登录其挂机软件',
                 'payjs' => '请到<a href="https://payjs.cn/ref/zgxjnb" target="_blank">PayJs</a> 申请账号',
-                'paypal' => '使用商家账号登录<a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">API凭证申请页</a>, 同意并获取设置信息',
+                'paypal' => '使用商家账号登录<a href="https://www.paypal.com/businessprofile/mytools/apiaccess/firstparty" target="_blank">API凭证申请页</a>同意并获取设置信息',
                 'paybeaver' => '请到<a href="https://merchant.paybeaver.com/?aff_code=iK4GNuX8" target="_blank">海狸支付 PayBeaver</a>申请账号',
                 'theadpay' => '请到<a href="https://theadpay.com/" target="_blank">平头哥支付 THeadPay</a>申请账号',
                 'manual' => '设置后会自动开启对应显示',
@@ -796,7 +795,7 @@ return [
     ],
     'set_to' => '置 :attribute',
     'minute' => '分钟',
-    'query' => '查 询',
+    'query' => '查询',
     'optional' => '可选',
     'require' => '必须',
 ];

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

@@ -7,35 +7,35 @@ return [
     'active' => [
         'attribute' => '激活',
         'error' => [
-            'activated' => '账号已激活,无需再次激活',
-            'disable' => '本站关闭了账号激活子系统,您可以直接去登录!',
-            'throttle' => '您已触发本站激活请求限制,请勿频繁操作!如有问题,请联系:email',
+            'activated' => '账号已激活,无需再次激活',
+            'disable' => '本站关闭了账号激活功能,您可以直接登录!',
+            'throttle' => '您已触发激活请求限制,请稍后再尝试。如有问题,请联系:email',
         ],
         'promotion' => '账号尚未激活,请先「:action」!',
-        'sent' => '激活链接已发送至您的邮箱,请稍或查垃圾箱',
+        'sent' => '激活链接已发送至您的邮箱,请稍等或查垃圾箱',
     ],
     'aup' => '可接受使用条款',
     'captcha' => [
         'attribute' => '验证码',
         'error' => [
-            'failed' => '验证码验证失败,请重新输入',
-            'timeout' => '验证码不合法!可能已过期,请刷新后重试',
+            'failed' => '验证码错误,请重新输入',
+            'timeout' => '验证码已失效,请刷新后重试',
         ],
         'required' => '请正确完成验证码操作',
-        'sent' => '验证码已发送至您的邮箱,请稍或查垃圾箱',
+        'sent' => '验证码已发送至您的邮箱,请稍等或查垃圾箱',
     ],
     'email' => [
         'error' => [
-            'banned' => '本站屏蔽了您使用的邮箱服务商,请使用其他有效邮箱',
-            'invalid' => '使用邮箱不在本站支持邮箱列表内',
+            'banned' => '本站不支持您使用的邮箱服务商,请更换邮箱',
+            'invalid' => '该邮箱不在本站支持的邮箱列表内',
         ],
     ],
     'error' => [
-        'account_baned' => '您的账号已被禁止登录!',
-        'login_error' => '登录错误,请稍后重试!',
-        'login_failed' => '登录失败,请检查邮箱或密码是否输入正确!',
-        'not_found_user' => '未找到关联账号,请使用其他方式登录',
-        'repeat_request' => '请勿重复请求,请刷新后试',
+        'account_baned' => '您的账号已被禁!',
+        'login_error' => '登录出现错误,请稍后再试!',
+        'login_failed' => '登录失败,请检查账号或密码是否正确!',
+        'not_found_user' => '未找到关联账号,请使用其他方式登录',
+        'repeat_request' => '请勿重复请求,请刷新后试',
         'url_timeout' => '链接已失效,请重新操作',
     ],
     'failed' => '用户名或密码错误。',
@@ -72,13 +72,13 @@ return [
             'attribute' => '重置密码',
             'error' => [
                 'demo' => '演示环境禁止修改管理员密码',
-                'disabled' => '本站关闭了密码重置子系统,有事请联系 :email',
-                'failed' => '重密码失败',
-                'same' => '新密码不可与旧密码一样,请重新输入',
-                'throttle' => '24小时内只能重设密码 :time 次,请勿频繁操作',
+                'disabled' => '本站关闭了密码重置功能,如遇问题请联系:email',
+                'failed' => '重密码失败',
+                'same' => '新密码不能与旧密码相同,请重新输入',
+                'throttle' => '24小时内只能重设密码:time次,请勿频繁操作',
                 'wrong' => '旧密码错误,请重新输入',
             ],
-            'sent' => '重置成功,请查看所用邮箱(邮件可能在垃圾箱中)',
+            'sent' => '重置成功,请查看您的邮箱(可能在垃圾箱中)',
             'success' => '新密码设置成功,请前往登录页面',
         ],
     ],
@@ -86,11 +86,11 @@ return [
         'attribute' => '注册',
         'code' => '注册验证码',
         'error' => [
-            'disable' => '抱歉,本站关闭注册通道',
+            'disable' => '抱歉,本站暂时关闭注册通道',
             'throttle' => '防刷机制已激活,请勿频繁注册',
         ],
-        'failed' => '注册失败,请稍后试',
-        'promotion' => '还没有账号?请',
+        'failed' => '注册失败,请稍后试',
+        'promotion' => '还没有账号?请',
         'success' => '注册成功',
     ],
     'remember_me' => '记住我',

+ 10 - 17
resources/lang/zh_CN/common.php

@@ -3,20 +3,20 @@
 declare(strict_types=1);
 
 return [
-    'hour' => '{1} 时|{2} 点',
-    'account' => '账',
+    'hour' => '{1} 时|{2} 点',
+    'account' => '账',
     'available_date' => '有效期',
     'created_at' => '创建时间',
     'expired_at' => '到期时间',
     'updated_at' => '更新时间',
-    'latest_at' => '最近时间',
+    'latest_at' => '最近更新',
     'back' => '返回',
     'back_to' => '返回至:page',
     'cancel' => '取消',
     'close' => '关闭',
     'close_item' => '关闭:attribute',
     'confirm' => '确认',
-    'continues' => '继续',
+    'continue' => '继续',
     'open' => '打开',
     'send' => '发送',
     'view' => '查看',
@@ -28,13 +28,13 @@ return [
     ],
     'add' => '添加',
     'free' => '免费',
-    'replace' => '更换',
+    'change' => '更换',
     'submit' => '提交',
     'submit_item' => '提交:attribute',
     'generate' => '生成',
     'generate_item' => '生成:attribute',
-    'to_safari' => [0 => '点击右上角', 1 => ',选择在', 2 => 'Safari 中打开', 3 => '就可以正常访问本站了哟!'],
-    'update_browser' => [0 => '您正在使用', 1 => '过时的', 2 => '浏览器。请', 3 => '升级您的浏览器', 4 => '来获得最佳的浏览体验'],
+    'to_safari' => [0 => '点击右上角', 1 => ',选择在', 2 => 'Safari 中打开', 3 => '即可正常访问本站!'],
+    'update_browser' => [0 => '您正在使用', 1 => '过时的', 2 => '浏览器。请', 3 => '升级您的浏览器', 4 => '以获得最佳浏览体验'],
     'apply' => '应用',
     'avatar' => '头像',
     'customize' => '自定义',
@@ -65,13 +65,6 @@ return [
     ],
     'days' => [
         'attribute' => '{1} 天|{2} 日',
-        'sun' => '周日',
-        'mon' => '周一',
-        'tue' => '周二',
-        'wed' => '周三',
-        'thu' => '周四',
-        'fri' => '周五',
-        'sat' => '周六',
         'weekend' => '周末',
         'work' => '工作日',
         'next' => '次日',
@@ -94,8 +87,8 @@ return [
     ],
     'order' => [
         'status' => [
-            'cancel' => '取消',
-            'complete' => '完成',
+            'canceled' => '取消',
+            'completed' => '完成',
             'prepaid' => '预支付',
             'ongoing' => '使用中',
             'review' => '待确认',
@@ -146,5 +139,5 @@ return [
     'more' => '更多',
     'to' => '至',
     'to_be_send' => '待发送',
-    'developing' => '开发中!敬请期待',
+    'developing' => '开发中,敬请期待!',
 ];

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

@@ -21,13 +21,13 @@ return [
     'whoops' => '哎呦!',
     'get_ip' => '获取IP信息异常',
     'subscribe' => [
-        'unknown' => '使用错误链接,请重新获取!',
-        'sub_baned' => '链接已被封禁,请前往官网查询原因',
-        'user' => '错误链接,账号不存在!请重新获取链接',
-        'user_disable' => '账号被禁用!',
-        'baned_until' => '账号封禁至:time,请解封后再更新!',
+        'unknown' => '使用错误链接,请重新获取链接!',
+        'sub_banned' => '链接已被封禁,请前往官网查询原因',
+        'user' => '使用了错误链接,账号不存在!请重新获取链接',
+        'user_disabled' => '账号被禁用!',
+        'banned_until' => '账号封禁至:time,请解封后再更新!',
         'out' => '流量耗尽,请重新购买或重置流量!',
-        'expired' => '账号过期,请续费!',
+        'expired' => '账号过期,请续费!',
         'question' => '账号存在问题,请前往官网查询!',
         'none' => '无可用节点',
     ],

+ 8 - 8
resources/lang/zh_CN/model.php

@@ -180,14 +180,14 @@ return [
         'priority' => '权重',
         'usable_times' => '使用次数',
         'minimum' => '满减条件',
-        'used' => '个人限',
-        'levels' => '等级限',
-        'groups' => '分组限',
-        'users_whitelist' => '专属用户',
-        'users_blacklist' => '禁用户',
-        'services_whitelist' => '允许商品',
+        'used' => '个人限',
+        'levels' => '等级限',
+        'groups' => '分组限',
+        'users_whitelist' => '允许用户',
+        'users_blacklist' => '禁用户',
+        'services_whitelist' => '适用商品',
         'services_blacklist' => '禁用商品',
-        'newbie' => '新专享',
+        'newbie' => '新用户专享',
         'num' => '数量',
     ],
     'aff' => [
@@ -209,7 +209,7 @@ return [
         'status' => '状态',
     ],
     'ip' => [
-        'network_type' => '类型',
+        'network_type' => '网络类型',
         'info' => '归属地',
     ],
     'user_traffic' => [

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

@@ -8,7 +8,7 @@ return [
     'empty' => '您当前没有新消息',
     'payment_received' => '您的订单支付成功,金额为:amount,请点击查看订单详情',
     'account_expired' => '账号过期提醒',
-    'account_expired_content' => '您的账号将在:days天后过期,为避免影响正常使用,请及时续费',
+    'account_expired_content' => '您的账号将在:days天后过期,请及时续费以避免影响正常使用',
     'account_expired_blade' => '您的账号将于:days天后过期,请及时续费',
     'active_email' => '请在30分钟内完成验证',
     'close_ticket' => '工单编号:id,标题:title已被关闭',

+ 76 - 76
resources/lang/zh_CN/user.php

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

+ 49 - 0
resources/lang/zh_CN/validation.php

@@ -143,37 +143,62 @@ return [
     'uuid' => ':Attribute 必须是有效的 UUID。',
     'attributes' => [
         'address' => '地址',
+        'affiliate_url' => '附属网址',
         'age' => '年龄',
         'amount' => '数额',
+        'announcement' => '公告',
         'area' => '区域',
+        'audience_prize' => '观众奖',
         'available' => '可用的',
         'birthday' => '生日',
         'body' => '身体',
         'city' => '城市',
+        'compilation' => '汇编',
+        'concept' => '概念',
+        'conditions' => '状况',
         'content' => '内容',
         'country' => '国家',
+        'cover' => '覆盖',
         'created_at' => '创建于',
         'creator' => '创建者',
+        'currency' => '货币',
         'current_password' => '当前密码',
+        'customer' => '顾客',
         'date' => '日期',
         'date_of_birth' => '出生日期',
+        'dates' => '日期',
         'day' => '天',
         'deleted_at' => '删除于',
         'description' => '描述',
+        'display_type' => '显示类型',
         'district' => '地区',
         'duration' => '期间',
         'email' => '邮箱',
         'excerpt' => '摘要',
         'filter' => '过滤',
+        'finished_at' => '完成于',
         'first_name' => '名',
         'gender' => '性别',
+        'grand_prize' => '大奖',
         'group' => '组',
         'hour' => '时',
         'image' => '图像',
+        'image_desktop' => '桌面图像',
+        'image_main' => '主图',
+        'image_mobile' => '移动图像',
+        'images' => '图片',
+        'is_audience_winner' => '是观众赢家',
+        'is_hidden' => '被隐藏',
+        'is_subscribed' => '已订阅',
+        'is_visible' => '是可见的',
+        'is_winner' => '是赢家',
+        'items' => '项目',
+        'key' => '钥匙',
         'last_name' => '姓',
         'lesson' => '课程',
         'line_address_1' => '线路地址 1',
         'line_address_2' => '线路地址 2',
+        'login' => '登录',
         'message' => '信息',
         'middle_name' => '中间名字',
         'minute' => '分',
@@ -186,22 +211,43 @@ return [
         'password_confirmation' => '确认密码',
         'phone' => '电话',
         'photo' => '照片',
+        'portfolio' => '文件夹',
         'postal_code' => '邮政编码',
+        'preview' => '预览',
         'price' => '价格',
+        'product_id' => '产品编号',
+        'product_uid' => '产品UID',
+        'product_uuid' => '产品UUID',
+        'promo_code' => '促销代码',
         'province' => '省',
+        'quantity' => '数量',
+        'reason' => '原因',
         'recaptcha_response_field' => '重复验证码响应字段',
+        'referee' => '裁判',
+        'referees' => '裁判员',
+        'reject_reason' => '拒绝理由',
         'remember' => '记住',
         'restored_at' => '恢复于',
         'result_text_under_image' => '图像下的结果文本',
         'role' => '角色',
+        'rule' => '规则',
+        'rules' => '规则',
         'second' => '秒',
         'sex' => '性别',
+        'shipment' => '运输',
         'short_text' => '短文本',
         'size' => '大小',
+        'skills' => '技能',
+        'slug' => '蛞蝓',
+        'specialization' => '专业化',
+        'started_at' => '开始于',
         'state' => '状态',
+        'status' => '地位',
         'street' => '街道',
         'student' => '学生',
         'subject' => '主题',
+        'tag' => '标签',
+        'tags' => '标签',
         'teacher' => '教师',
         'terms' => '条款',
         'test_description' => '测试说明',
@@ -210,8 +256,11 @@ return [
         'text' => '文本',
         'time' => '时间',
         'title' => '标题',
+        'type' => '类型',
         'updated_at' => '更新于',
+        'user' => '用户',
         'username' => '用户名',
+        'value' => '价值',
         'year' => '年',
     ],
 ];

+ 6 - 4
resources/views/admin/logs/order.blade.php

@@ -57,12 +57,14 @@
                         </select>
                     </div>
                     <div class="form-group col-lg-2 col-sm-6">
-                        <select data-plugin="selectpicker" class="form-control show-tick" name="status[]" id="status" data-style="btn-outline btn-primary" title="{{ trans('model.order.status') }}"
-                                multiple>
-                            <option value="-1">{{ trans('common.order.status.cancel') }}</option>
+                        <select class="form-control show-tick" id="status" name="status[]" data-plugin="selectpicker" data-style="btn-outline btn-primary"
+                                title="{{ trans('model.order.status') }}" multiple>
+                            <option value="-1">{{ trans('common.order.status.canceled') }}</option>
                             <option value="0">{{ trans('common.payment.status.wait') }}</option>
                             <option value="1">{{ trans('common.order.status.review') }}</option>
-                            <option value="2">{{ trans('common.order.status.complete').'/'.trans('common.status.expire').'/'.trans('common.order.status.ongoing') }}</option>
+                            <option value="2">
+                                {{ trans('common.order.status.completed') . '/' . trans('common.status.expire') . '/' . trans('common.order.status.ongoing') }}
+                            </option>
                             <option value="3">{{ trans('common.order.status.prepaid') }}</option>
                         </select>
                     </div>

+ 158 - 141
resources/views/user/buy.blade.php

@@ -9,60 +9,58 @@
                 <div class="page-invoice-table table-responsive">
                     <table class="table table-hover text-md-center">
                         <thead>
-                        <tr>
-                            <th>{{trans('user.shop.service')}}</th>
-                            <th>{{trans('user.shop.description')}} </th>
-                            <th>{{trans('user.shop.price')}}</th>
-                            <th>{{trans('user.shop.quantity')}}</th>
-                        </tr>
+                            <tr>
+                                <th>{{ trans('user.shop.service') }}</th>
+                                <th>{{ trans('user.shop.description') }} </th>
+                                <th>{{ trans('user.shop.price') }}</th>
+                                <th>{{ trans('user.shop.quantity') }}</th>
+                            </tr>
                         </thead>
                         <tbody>
-                        <tr>
-                            <td class="text-middle">{{$goods->name}} </td>
-                            <td>{{trans('common.available_date')}}
-                                <strong>{{$goods->type === 1? $dataPlusDays : $goods->days}} {{trans_choice('common.days.attribute', 1)}}</strong>
-                                <br>
-                                <strong>{{$goods->traffic_label}}</strong> {{trans('user.attribute.data')}}
-                                <br>
-                                {{trans('user.account.speed_limit')}}
-                                <strong> {{ $goods->speed_limit ? $goods->speed_limit.' Mbps' : trans('user.service.unlimited') }} </strong>
-                            </td>
-                            <td class="text-middle"> {{$goods->price_tag}} </td>
-                            <td class="text-middle"> x 1</td>
-                        </tr>
+                            <tr>
+                                <td class="text-middle">{{ $goods->name }} </td>
+                                <td>{{ trans('common.available_date') }}
+                                    <strong>{{ $goods->type === 1 ? $dataPlusDays : $goods->days }} {{ trans_choice('common.days.attribute', 1) }}</strong>
+                                    <br>
+                                    <strong>{{ $goods->traffic_label }}</strong> {{ trans('user.attribute.data') }}
+                                    <br>
+                                    {{ trans('user.account.speed_limit') }}
+                                    <strong> {{ $goods->speed_limit ? $goods->speed_limit . ' Mbps' : trans('user.service.unlimited') }} </strong>
+                                </td>
+                                <td class="text-middle"> {{ $goods->price_tag }} </td>
+                                <td class="text-middle"> x 1</td>
+                            </tr>
                         </tbody>
                     </table>
                 </div>
                 <div class="row">
-                    @if($goods->type <= 2)
+                    @if ($goods->type <= 2)
                         <div class="col-lg-3 pl-30">
                             <div class="input-group">
-                                <input type="text" class="form-control" name="coupon_sn" id="coupon_sn"
-                                       placeholder="{{trans('model.coupon.attribute')}}"/>
+                                <input class="form-control" id="coupon_sn" name="coupon_sn" type="text" placeholder="{{ trans('model.coupon.attribute') }}" />
                                 <div class="input-group-btn">
-                                    <button type="submit" class="btn btn-info" onclick="redeemCoupon()">
-                                        <i class="icon wb-loop" aria-hidden="true"></i> {{trans('common.apply')}}
+                                    <button class="btn btn-info" type="submit" onclick="redeemCoupon()">
+                                        <i class="icon wb-loop" aria-hidden="true"></i> {{ trans('common.apply') }}
                                     </button>
                                 </div>
                             </div>
                         </div>
                         <div class="col-lg-3 offset-lg-6 text-right">
                             <p id="discount"></p>
-                            <p>{{trans('user.shop.subtotal')}}
-                                <span>{{$goods->price_tag}}</span>
+                            <p>{{ trans('user.shop.subtotal') }}
+                                <span>{{ $goods->price_tag }}</span>
                             </p>
-                            <p class="page-invoice-amount">{{trans('user.shop.total')}}
-                                <span class="grand-total">{{$goods->price_tag}}</span>
+                            <p class="page-invoice-amount">{{ trans('user.shop.total') }}
+                                <span class="grand-total">{{ $goods->price_tag }}</span>
                             </p>
                         </div>
                     @endif
                     <div class="col-md-12 mb-30">
                         <div class="float-right">
                             @include('user.components.purchase')
-                            @if($goods->type <= 2)
+                            @if ($goods->type <= 2)
                                 <button class="btn btn-flat mt-2 mx-0 p-0" onclick="pay('credit', '0')">
-                                    <img src="/assets/images/payment/creditpay.svg" height="48px"
-                                         alt="{{trans('user.shop.pay_credit')}}"/>
+                                    <img src="/assets/images/payment/creditpay.svg" alt="{{ trans('user.shop.pay_credit') }}" height="48px" />
                                 </button>
                             @endif
                         </div>
@@ -74,121 +72,140 @@
 @endsection
 @section('javascript')
     <script>
-      function redeemCoupon() { // 校验优惠券是否可用
-        const coupon_sn = $('#coupon_sn').val();
-        let tag = '{{$goods->price_tag}}'.match(/(.*?[^0-9])(\d+\.?.*)/);
-        const goods_price = tag[2];
-        const sign = tag[1];
-        $.ajax({
-          method: 'POST',
-          url: '{{route('redeemCoupon', $goods)}}',
-          dataType: 'json',
-          data: {_token: '{{csrf_token()}}', coupon_sn: coupon_sn},
-          success: function(ret) {
-            $('.input-group-prepend').remove();
-            if (ret.status === 'success') {
-              $('#coupon_sn').parent().prepend(
-                  '<div class="input-group-prepend"><span class="input-group-text bg-green-700"><i class="icon wb-check white" aria-hidden="true"></i></span></div>');
-              // 根据类型计算折扣后的总金额
-              let total_price;
-              let coupon_text = document.getElementById('discount');
-              if (ret.data.type === 2) {
-                const discount = goods_price * (1 - ret.data.value / 100);
+        function redeemCoupon() { // 校验优惠券是否可用
+            const coupon_sn = $('#coupon_sn').val();
+            let tag = '{{ $goods->price_tag }}'.match(/(.*?[^0-9])(\d+\.?.*)/);
+            const goods_price = tag[2];
+            const sign = tag[1];
+            $.ajax({
+                method: 'POST',
+                url: '{{ route('redeemCoupon', $goods) }}',
+                dataType: 'json',
+                data: {
+                    _token: '{{ csrf_token() }}',
+                    coupon_sn: coupon_sn
+                },
+                success: function(ret) {
+                    $('.input-group-prepend').remove();
+                    if (ret.status === 'success') {
+                        $('#coupon_sn').parent().prepend(
+                            '<div class="input-group-prepend"><span class="input-group-text bg-green-700"><i class="icon wb-check white" aria-hidden="true"></i></span></div>'
+                        );
+                        // 根据类型计算折扣后的总金额
+                        let total_price;
+                        let coupon_text = document.getElementById('discount');
+                        if (ret.data.type === 2) {
+                            const discount = goods_price * (1 - ret.data.value / 100);
 
-                coupon_text.innerHTML = '【{{trans('admin.coupon.type.discount')}}】: ' + ret.data.name + ' _ '
-                    + (100 - ret.data.value) + '%<br> {{trans('user.coupon.discount')}}: ➖ ' + sign +
-                    discount.toFixed(2);
-                total_price = goods_price - discount;
-              } else {
-                console.log(ret.data.value);
-                total_price = goods_price - ret.data.value.match(/(.*?[^0-9])(\d+\.?.*)/)[2];
-                total_price = total_price > 0 ? total_price : 0;
-                if (ret.data.type === 1) {
-                  coupon_text.innerHTML = '【{{trans('admin.coupon.type.voucher')}}】: ' + ret.data.name + ' -' +
-                      ret.data.value;
-                }
-              }
+                            coupon_text.innerHTML = '【{{ trans('admin.coupon.type.discount') }}】: ' + ret.data.name + ' _ ' +
+                                (100 - ret.data.value) + '%<br> {{ trans('user.coupon.discount') }}: ➖ ' + sign +
+                                discount.toFixed(2);
+                            total_price = goods_price - discount;
+                        } else {
+                            console.log(ret.data.value);
+                            total_price = goods_price - ret.data.value.match(/(.*?[^0-9])(\d+\.?.*)/)[2];
+                            total_price = total_price > 0 ? total_price : 0;
+                            if (ret.data.type === 1) {
+                                coupon_text.innerHTML = '【{{ trans('admin.coupon.type.voucher') }}】: ' + ret.data.name + ' -' +
+                                    ret.data.value;
+                            }
+                        }
 
-              // 四舍五入,保留2位小数
-              $('.grand-total').text(sign + total_price.toFixed(2));
-              swal.fire({
-                title: ret.message,
-                icon: 'success',
-                timer: 1300,
-                showConfirmButton: false,
-              });
-            } else {
-              $('.grand-total').text(sign + goods_price);
-              $('#coupon_sn').parent().prepend(
-                  '<div class="input-group-prepend"><span class="input-group-text bg-red-700"><i class="icon wb-close white" aria-hidden="true"></i></span></div>');
-              swal.fire({
-                title: ret.title,
-                text: ret.message,
-                icon: 'error',
-              });
-            }
-          },
-        });
-      }
-
-      function pay(method, pay_type) { // 检查预支付
-        if ('{{$activePlan}}' === '1' && '{{$goods->type}}' === '2') { // 存在套餐 和 购买类型为套餐时 出现提示
-          swal.fire({
-            title: '{{trans('user.shop.conflict')}}',
-            html: '{!! trans('user.shop.conflict_tips') !!}',
-            icon: 'info',
-            showCancelButton: true,
-            cancelButtonText: '{{trans('common.back')}}',
-            confirmButtonText: '{{trans('common.continues')}}',
-          }).then((result) => {
-            if (result.value) {
-              continuousPayment(method, pay_type);
-            }
-          });
-        } else {
-          continuousPayment(method, pay_type);
+                        // 四舍五入,保留2位小数
+                        $('.grand-total').text(sign + total_price.toFixed(2));
+                        swal.fire({
+                            title: ret.message,
+                            icon: 'success',
+                            timer: 1300,
+                            showConfirmButton: false,
+                        });
+                    } else {
+                        $('.grand-total').text(sign + goods_price);
+                        $('#coupon_sn').parent().prepend(
+                            '<div class="input-group-prepend"><span class="input-group-text bg-red-700"><i class="icon wb-close white" aria-hidden="true"></i></span></div>'
+                        );
+                        swal.fire({
+                            title: ret.title,
+                            text: ret.message,
+                            icon: 'error',
+                        });
+                    }
+                },
+            });
         }
-      }
 
-      function continuousPayment(method, pay_type) {
-        const goods_id = '{{$goods->id}}';
-        const coupon_sn = $('#coupon_sn').val();
-        $.ajax({
-          method: 'POST',
-          url: '{{route('purchase')}}',
-          dataType: 'json',
-          data: {
-            _token: '{{csrf_token()}}',
-            goods_id: goods_id,
-            coupon_sn: coupon_sn,
-            method: method,
-            pay_type: pay_type,
-          },
-          success: function(ret) {
-            if (ret.status === 'success') {
-              swal.fire({title: ret.message, icon: 'success', timer: 1300, showConfirmButton: false});
-              if (method === 'credit') {
-                swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).
-                    then(() => window.location.href = '{{route('invoice')}}');
-              }
-              if (ret.data) {
-                window.location.href = '{{route('orderDetail', '')}}/' + ret.data;
-              } else if (ret.url) {
-                window.location.href = ret.url;
-              }
-            } else if (ret.status === 'info') {
-              swal.fire({title: ret.title, text: ret.message, icon: 'question'});
+        function pay(method, pay_type) { // 检查预支付
+            if ('{{ $activePlan }}' === '1' && '{{ $goods->type }}' === '2') { // 存在套餐 和 购买类型为套餐时 出现提示
+                swal.fire({
+                    title: '{{ trans('user.shop.conflict') }}',
+                    html: '{!! trans('user.shop.conflict_tips') !!}',
+                    icon: 'info',
+                    showCancelButton: true,
+                    cancelButtonText: '{{ trans('common.back') }}',
+                    confirmButtonText: '{{ trans('common.continue') }}',
+                }).then((result) => {
+                    if (result.value) {
+                        continuousPayment(method, pay_type);
+                    }
+                });
             } else {
-              swal.fire({
-                title: ret.message,
-                icon: 'error',
-              });
+                continuousPayment(method, pay_type);
             }
-          },
-          error: function() {
-            swal.fire('{{trans('http-statuses.unknownError')}}', '{{trans('user.shop.call4help')}}', 'error');
-          },
-        });
-      }
+        }
+
+        function continuousPayment(method, pay_type) {
+            const goods_id = '{{ $goods->id }}';
+            const coupon_sn = $('#coupon_sn').val();
+            $.ajax({
+                method: 'POST',
+                url: '{{ route('purchase') }}',
+                dataType: 'json',
+                data: {
+                    _token: '{{ csrf_token() }}',
+                    goods_id: goods_id,
+                    coupon_sn: coupon_sn,
+                    method: method,
+                    pay_type: pay_type,
+                },
+                success: function(ret) {
+                    if (ret.status === 'success') {
+                        swal.fire({
+                            title: ret.message,
+                            icon: 'success',
+                            timer: 1300,
+                            showConfirmButton: false
+                        });
+                        if (method === 'credit') {
+                            swal.fire({
+                                title: ret.message,
+                                icon: 'success',
+                                timer: 1000,
+                                showConfirmButton: false
+                            }).
+                            then(() => window.location.href = '{{ route('invoice') }}');
+                        }
+                        if (ret.data) {
+                            window.location.href = '{{ route('orderDetail', '') }}/' + ret.data;
+                        } else if (ret.url) {
+                            window.location.href = ret.url;
+                        }
+                    } else if (ret.status === 'info') {
+                        swal.fire({
+                            title: ret.title,
+                            text: ret.message,
+                            icon: 'question'
+                        });
+                    } else {
+                        swal.fire({
+                            title: ret.message,
+                            icon: 'error',
+                        });
+                    }
+                },
+                error: function() {
+                    swal.fire('{{ trans('http-statuses.unknownError') }}', '{{ trans('user.shop.call4help') }}', 'error');
+                },
+            });
+        }
     </script>
 @endsection

+ 282 - 253
resources/views/user/index.blade.php

@@ -8,50 +8,53 @@
     <div class="page-content container-fluid">
         <div class="row" data-plugin="matchHeight" data-by-row="true">
             @if (Session::has('successMsg'))
-                <x-alert type="success" :message="Session::pull('successMsg')" class="col-md-12"/>
+                <x-alert class="col-md-12" type="success" :message="Session::pull('successMsg')" />
             @endif
             <div class="col-xxl-3 col-xl-4 col-lg-5 col-md-6 col-12">
                 <div class="card card-shadow">
                     <div class="card-block p-20">
-                        <button type="button" class="btn btn-floating btn-sm btn-pure">
+                        <button class="btn btn-floating btn-sm btn-pure" type="button">
                             <i class="wb-heart red-500" aria-hidden="true"></i>
                         </button>
-                        <span class="font-weight-400">{{trans('user.account.status')}}</span>
-                        @if(sysConfig('is_checkin'))
+                        <span class="font-weight-400">{{ trans('user.account.status') }}</span>
+                        @if (sysConfig('is_checkin'))
                             <button class="btn btn-md btn-round btn-info float-right" onclick="checkIn()">
                                 <i class="wb-star yellow-400 mr-5" aria-hidden="true"></i>
-                                {{trans('user.home.attendance.attribute')}}
+                                {{ trans('user.home.attendance.attribute') }}
                             </button>
                         @endif
                         <div class="content-text text-center mb-0">
-                            @if(!$paying_user)
-                                <p class="ml-15 mt-15 text-left">{{trans('common.more')}}
-                                    <code>{{trans('validation.attributes.time')}}</code></p>
-                                <p class="text-center">{{trans('common.more')}}
-                                    <code>{{trans('user.attribute.data')}}</code></p>
-                                <p class="mb-15 mr-15 text-right">{{trans('common.more')}}
-                                    <code>{{trans('user.attribute.node')}}</code></p>
-                                <a href="{{route('shop')}}" class="btn btn-block btn-danger">{{trans('user.purchase_promotion')}}</a>
+                            @if (!$paying_user)
+                                <p class="ml-15 mt-15 text-left">{{ trans('common.more') }}
+                                    <code>{{ trans('validation.attributes.time') }}</code>
+                                </p>
+                                <p class="text-center">{{ trans('common.more') }}
+                                    <code>{{ trans('user.attribute.data') }}</code>
+                                </p>
+                                <p class="mb-15 mr-15 text-right">{{ trans('common.more') }}
+                                    <code>{{ trans('user.attribute.node') }}</code>
+                                </p>
+                                <a class="btn btn-block btn-danger" href="{{ route('shop') }}">{{ trans('user.purchase_promotion') }}</a>
                             @elseif(Auth::user()->enable)
                                 <i class="wb-check green-400 font-size-40 mr-10" aria-hidden="true"></i>
-                                <span class="font-size-40 font-weight-100">{{trans('common.status.normal')}}</span>
-                                <p class="font-weight-300 m-0 green-500">{{trans('user.account.reason.normal')}}</p>
+                                <span class="font-size-40 font-weight-100">{{ trans('common.status.normal') }}</span>
+                                <p class="font-weight-300 m-0 green-500">{{ trans('user.account.reason.normal') }}</p>
                             @elseif($remainDays < 0)
                                 <i class="wb-close red-400 font-size-40 mr-10" aria-hidden="true"></i>
-                                <span class="font-size-40 font-weight-100">{{trans('common.status.expire')}}</span>
-                                <p class="font-weight-300 m-0 red-500">{{trans('user.account.reason.expired')}}</p>
+                                <span class="font-size-40 font-weight-100">{{ trans('common.status.expire') }}</span>
+                                <p class="font-weight-300 m-0 red-500">{{ trans('user.account.reason.expired') }}</p>
                             @elseif($unusedTraffic === 0)
                                 <i class="wb-close red-400 font-size-40 mr-10"></i>
-                                <span class="font-size-40 font-weight-100">{{trans('common.status.disabled')}}</span>
-                                <p class="font-weight-300 m-0 red-500">{{trans('user.account.reason.traffic_exhausted')}}</p>
+                                <span class="font-size-40 font-weight-100">{{ trans('common.status.disabled') }}</span>
+                                <p class="font-weight-300 m-0 red-500">{{ trans('user.account.reason.traffic_exhausted') }}</p>
                             @elseif($banedTime || Auth::user()->isTrafficWarning())
                                 <i class="wb-alert orange-400 font-size-40 mr-10"></i>
-                                <span class="font-size-40 font-weight-100">{{trans('common.status.limited')}}</span>
-                                <p class="font-weight-300 m-0 orange-500">{!!trans('user.account.reason.overused', ['data'=>sysConfig('traffic_ban_value')])!!}</p>
+                                <span class="font-size-40 font-weight-100">{{ trans('common.status.limited') }}</span>
+                                <p class="font-weight-300 m-0 orange-500">{!! trans('user.account.reason.overused', ['data' => sysConfig('traffic_ban_value')]) !!}</p>
                             @else
                                 <i class="wb-help red-400 font-size-40 mr-10"></i>
-                                <span class="font-size-40 font-weight-100">{{trans('common.status.disabled')}}</span>
-                                <p class="font-weight-300 m-0 red-500">{{trans('user.account.reason.unknown')}}</p>
+                                <span class="font-size-40 font-weight-100">{{ trans('common.status.disabled') }}</span>
+                                <p class="font-weight-300 m-0 red-500">{{ trans('user.account.reason.unknown') }}</p>
                             @endif
                         </div>
                     </div>
@@ -60,30 +63,31 @@
                     <div class="card-block p-20">
                         <div class="row">
                             <div class="col-lg-7 col-md-12 col-sm-7">
-                                <button type="button" class="btn btn-floating btn-sm btn-pure">
+                                <button class="btn btn-floating btn-sm btn-pure" type="button">
                                     <i class="wb-stats-bars cyan-500"></i>
                                 </button>
-                                <span class="font-weight-400">{{trans('user.account.remain')}}</span>
+                                <span class="font-weight-400">{{ trans('user.account.remain') }}</span>
                                 <div class="text-center font-weight-100 font-size-40">
                                     @if ($unusedTraffic === 0)
-                                        {{trans('common.status.run_out')}}
+                                        {{ trans('common.status.run_out') }}
                                     @else
                                         {{ formatBytes($unusedTraffic) }}
                                     @endif
-                                    <br/>
-                                    <h4>{{trans('user.account.level')}}:
-                                        <code class="font-size-20">{{Auth::user()->level}}</code></h4>
+                                    <br />
+                                    <h4>{{ trans('user.account.level') }}:
+                                        <code class="font-size-20">{{ Auth::user()->level }}</code>
+                                    </h4>
                                 </div>
                                 <div class="text-center font-weight-300 blue-grey-500 mb-10">
-                                    @if(isset($resetDays) && $resetDays >= 0)
-                                        {!! trans_choice('user.account.reset',$resetDays, ['days' => $resetDays]) !!}
+                                    @if (isset($resetDays) && $resetDays >= 0)
+                                        {!! trans_choice('user.account.reset', $resetDays, ['days' => $resetDays]) !!}
                                     @endif
                                 </div>
                             </div>
                             <div class="col-lg-5 col-md-12 col-sm-5">
-                                <div class="w-only-xs-p50 w-only-sm-p75 w-only-md-p50" data-plugin="pieProgress" data-valuemax="100" data-barcolor="#96A3FA" data-size="100"
-                                     data-barsize="10" data-goal="{{$unusedPercent}}" aria-valuenow="{{$unusedPercent}}" role="progressbar">
-                                    <span class="pie-progress-number blue-grey-700 font-size-20">{{$unusedPercent}}%</span>
+                                <div class="w-only-xs-p50 w-only-sm-p75 w-only-md-p50" data-plugin="pieProgress" data-valuemax="100" data-barcolor="#96A3FA"
+                                     data-size="100" data-barsize="10" data-goal="{{ $unusedPercent }}" role="progressbar" aria-valuenow="{{ $unusedPercent }}">
+                                    <span class="pie-progress-number blue-grey-700 font-size-20">{{ $unusedPercent }}%</span>
                                 </div>
                             </div>
                         </div>
@@ -91,45 +95,43 @@
                 </div>
                 <div class="card card-shadow">
                     <div class="card-block p-20">
-                        <button type="button" class="btn btn-floating btn-sm btn-pure">
+                        <button class="btn btn-floating btn-sm btn-pure" type="button">
                             <i class="wb-calendar green-500"></i>
                         </button>
-                        <span class="font-weight-400">{{trans('user.account.time')}}</span>
+                        <span class="font-weight-400">{{ trans('user.account.time') }}</span>
                         <div class="content-text text-center mb-0">
-                            @if($remainDays >= 0)
-                                <span class="font-size-40 font-weight-100">{{$remainDays.' '.trans_choice('common.days.attribute', 1)}}</span>
-                                <p class="blue-grey-500 font-weight-300 m-0">{{$expireTime}}</p>
+                            @if ($remainDays >= 0)
+                                <span class="font-size-40 font-weight-100">{{ $remainDays . ' ' . trans_choice('common.days.attribute', 1) }}</span>
+                                <p class="blue-grey-500 font-weight-300 m-0">{{ $expireTime }}</p>
                             @else
-                                <span class="font-size-40 font-weight-100">{{trans('common.status.expire')}}</span>
-                                <br/>
-                                <a href="{{route('shop')}}" class="btn btn-danger">{{trans('user.shop.buy')}}</a>
+                                <span class="font-size-40 font-weight-100">{{ trans('common.status.expire') }}</span>
+                                <br />
+                                <a class="btn btn-danger" href="{{ route('shop') }}">{{ trans('user.shop.buy') }}</a>
                             @endif
                         </div>
                     </div>
                 </div>
-                @if($userLoginLog)
+                @if ($userLoginLog)
                     <div class="card card-shadow">
                         <div class="card-block p-20">
-                            <button type="button" class="btn btn-floating btn-sm btn-pure">
+                            <button class="btn btn-floating btn-sm btn-pure" type="button">
                                 <i class="wb-globe purple-500"></i>
                             </button>
-                            <span class="font-weight-400 mb-10">{{trans('user.account.last_login')}}</span>
+                            <span class="font-weight-400 mb-10">{{ trans('user.account.last_login') }}</span>
                             <ul class="list-group list-group-dividered px-20 mb-0">
                                 <li class="list-group-item px-0">
-                                    <i class="icon wb-time"></i>{{trans('validation.attributes.time')}}
-                                    : {{date_format($userLoginLog->created_at,'Y/m/d H:i')}}
+                                    <i class="icon wb-time"></i>{{ ucfirst(trans('validation.attributes.time')) }}:
+                                    {{ date_format($userLoginLog->created_at, 'Y/m/d H:i') }}
                                 </li>
                                 <li class="list-group-item px-0">
-                                    <i class="icon wb-code"></i>
-                                    {{trans('user.attribute.ip')}}: {{$userLoginLog->ip}}
+                                    <i class="icon wb-code"></i>{{ trans('user.attribute.ip') }}: {{ $userLoginLog->ip }}
                                 </li>
                                 <li class="list-group-item px-0">
-                                    <i class="icon wb-cloud"></i>
-                                    {{trans('user.attribute.isp')}}: {{$userLoginLog->isp}}
+                                    <i class="icon wb-cloud"></i>{{ trans('user.attribute.isp') }}: {{ $userLoginLog->isp }}
                                 </li>
                                 <li class="list-group-item px-0">
-                                    <i class="icon wb-map"></i>{{trans('user.attribute.address')}}
-                                    : {{$userLoginLog->country.' '.$userLoginLog->province.' '.$userLoginLog->city.' '.$userLoginLog->area}}
+                                    <i class="icon wb-map"></i>{{ trans('user.attribute.address') }}:
+                                    {{ $userLoginLog->country . ' ' . $userLoginLog->province . ' ' . $userLoginLog->city . ' ' . $userLoginLog->area }}
                                 </li>
                             </ul>
                         </div>
@@ -142,33 +144,34 @@
                         <div class="card card-shadow h-full">
                             <div class="card-block text-center">
                                 <h3 class="card-header-transparent">
-                                    <i class="icon wb-link-intact"></i>{{trans('user.subscribe.link')}}</h3>
-                                @if($subscribe_status)
+                                    <i class="icon wb-link-intact"></i>{{ trans('user.subscribe.link') }}
+                                </h3>
+                                @if ($subscribe_status)
                                     <div class="card-body">
-                                        @if(count($subType)>1)
+                                        @if (count($subType) > 1)
                                             <div class="form-group row">
-                                                <label class="col-md-auto col-form-label" for="subType">{{trans('common.customize')}}</label>
+                                                <label class="col-md-auto col-form-label" for="subType">{{ trans('common.customize') }}</label>
                                                 <div class="col">
-                                                    <select class="form-control" id="subType" name="subType" data-plugin="selectpicker" data-style="btn-outline btn-primary"
-                                                            title="{{trans('common.all')}}">
-                                                        @if(in_array('ss', $subType, true))
-                                                            <option value="1">{{trans('user.subscribe.ss_only')}}</option>
+                                                    <select class="form-control" id="subType" name="subType" data-plugin="selectpicker"
+                                                            data-style="btn-outline btn-primary" title="{{ trans('common.all') }}">
+                                                        @if (in_array('ss', $subType, true))
+                                                            <option value="1">{{ trans('user.subscribe.ss_only') }}</option>
                                                         @endif
-                                                        @if(in_array('v2', $subType, true))
-                                                            <option value="2">{{trans('user.subscribe.v2ray_only')}}</option>
+                                                        @if (in_array('v2', $subType, true))
+                                                            <option value="2">{{ trans('user.subscribe.v2ray_only') }}</option>
                                                         @endif
-                                                        @if(in_array('trojan', $subType, true))
-                                                            <option value="3">{{trans('user.subscribe.trojan_only')}}</option>
+                                                        @if (in_array('trojan', $subType, true))
+                                                            <option value="3">{{ trans('user.subscribe.trojan_only') }}</option>
                                                         @endif
                                                     </select>
                                                 </div>
                                             </div>
                                         @endif
                                         <div class="form-group row">
-                                            <label class="col-md-auto col-form-label" for="client">{{  trans('user.client') }}</label>
+                                            <label class="col-md-auto col-form-label" for="client">{{ trans('user.clients') }}</label>
                                             <div class="col">
-                                                <select class="form-control" id="client" name="client" data-plugin="selectpicker" data-style="btn-primary btn-outline"
-                                                        title="{{trans('common.default')}}">
+                                                <select class="form-control" id="client" name="client" data-plugin="selectpicker"
+                                                        data-style="btn-primary btn-outline" title="{{ trans('common.default') }}">
                                                     <option value="quantumult">Quantumult</option>
                                                     <option value="quantumult%20x">QuantumultX</option>
                                                     <option value="clash">Clash</option>
@@ -184,13 +187,13 @@
                                     <div class="card-footer-transparent btn-group">
                                         <button class="btn btn-outline-danger" onclick="exchangeSubscribe();">
                                             <i class="icon wb-refresh" aria-hidden="true"></i>
-                                            {{trans('common.replace')}}</button>
+                                            {{ trans('common.change') }}</button>
                                         <button class="btn btn-outline-info mt-clipboard" data-clipboard-action="copy">
                                             <i class="icon wb-copy" aria-hidden="true"></i>
-                                            {{trans('common.copy.attribute')}}</button>
+                                            {{ trans('common.copy.attribute') }}</button>
                                     </div>
                                 @else
-                                    <x-alert type="danger" :message="__($subMsg)"/>
+                                    <x-alert type="danger" :message="__($subMsg)" />
                                 @endif
                             </div>
                         </div>
@@ -199,19 +202,39 @@
                         <div class="card card-shadow h-full">
                             <div class="card-block text-center">
                                 <i class="font-size-40 wb-wrench"></i>
-                                <h4 class="card-title">{{trans('user.client')}}</h4>
-                                <p class="card-text">{{trans('common.download').' & '.trans('user.tutorials')}}</p>
-                                <a href="{{route('knowledge')}}" class="btn btn-primary mb-10">{{trans('common.goto')}}</a>
+                                <h4 class="card-title">{{ trans('user.clients') }}</h4>
+                                <p class="card-text">{{ trans('common.download') . ' & ' . trans('user.tutorials') }}</p>
+                                <a class="btn btn-primary mb-10" href="{{ route('knowledge') }}">{{ trans('common.goto') }}</a>
                             </div>
                         </div>
                     </div>
-                    @if (config('common.contact.telegram'))
+                    @if (config('common.contact.telegram') || config('common.contact.qq'))
                         <div class="col-xl-4 mb-30">
                             <div class="card card-shadow text-center h-full">
                                 <div class="card-block">
-                                    <h4 class="card-title"><i class="wb-bell mr-10 yellow-600"></i>{{trans('user.home.chat_group')}}</h4>
-                                    <a class="card-link btn btn-lg btn-primary" href="{{  config('common.contact.telegram') }}" target="_blank" rel="noopener">
-                                        Telegram {{trans('user.home.chat_group')}} <i class="fa-brands fa-telegram"></i></a>
+                                    <h4 class="card-title">
+                                        <i class="wb-bell mr-10 yellow-600"></i>{{ trans('user.home.chat_group') }}
+                                    </h4>
+                                    @if ($paying_user)
+                                        <div class="btn-group">
+                                            @if (config('common.contact.qq'))
+                                                <a class="card-link btn btn-sm btn-pill-left btn-info" href="{{ config('common.contact.qq') }}" target="_blank"
+                                                   rel="noopener">
+                                                    <i class="fa-brands fa-qq"></i> QQ{{ trans('user.home.chat_group') }}
+                                                </a>
+                                            @endif
+                                            @if (config('common.contact.telegram'))
+                                                <a class="card-link btn btn-sm btn-pill-right btn-success" href="{{ config('common.contact.telegram') }}"
+                                                   target="_blank" rel="noopener">
+                                                    TG{{ trans('user.home.chat_group') }}
+                                                    <i class="fa-brands fa-telegram"></i></a>
+                                            @endif
+                                        </div>
+                                    @else
+                                        <p class="card-link btn btn-sm btn-primary">
+                                            <i class="wb-lock mr-5"></i>{{ trans('user.purchase_to_unlock') }}
+                                        </p>
+                                    @endif
                                 </div>
                             </div>
                         </div>
@@ -223,23 +246,23 @@
                             <div class="panel-heading">
                                 <h2 class="panel-title">
                                     <i class="wb-volume-high mr-10"></i>
-                                    {{trans('user.home.announcement')}}
+                                    {{ trans('user.home.announcement') }}
                                 </h2>
                                 <div class="panel-actions pagination-no-border pagination-sm">
-                                    {{$announcements->links()}}
+                                    {{ $announcements->links() }}
                                 </div>
                             </div>
-                            <div class="panel-body" data-show-on-hover="false" data-direction="vertical"
-                                 data-skin="scrollable-shadow" data-plugin="scrollable">
+                            <div class="panel-body" data-show-on-hover="false" data-direction="vertical" data-skin="scrollable-shadow"
+                                 data-plugin="scrollable">
                                 <div data-role="container">
                                     <div class="pb-10" data-role="content">
                                         @forelse($announcements as $announcement)
-                                            <h2 class="text-center">{!!$announcement->title!!}</h2>
-                                            <p class="text-right"><small>{{trans('common.updated_at')}}
-                                                    <code>{{$announcement->updated_at}}</code></small></p>
+                                            <h2 class="text-center">{!! $announcement->title !!}</h2>
+                                            <p class="text-right"><small>{{ trans('common.updated_at') }}
+                                                    <code>{{ $announcement->updated_at }}</code></small></p>
                                             {!! $announcement->content !!}
                                         @empty
-                                            <p class="text-center font-size-40">{{trans('user.home.empty_announcement')}}</p>
+                                            <p class="text-center font-size-40">{{ trans('user.home.empty_announcement') }}</p>
                                         @endforelse
                                     </div>
                                 </div>
@@ -250,29 +273,29 @@
                         <div class="panel panel-primary panel-line h-full">
                             <div class="panel-heading">
                                 <h1 class="panel-title">
-                                    <i class="wb-pie-chart mr-10"></i>{{trans('user.home.traffic_logs')}}
+                                    <i class="wb-pie-chart mr-10"></i>{{ trans('user.home.traffic_logs') }}
                                 </h1>
                                 <div class="panel-actions">
                                     <ul class="nav nav-pills" role="tablist">
                                         <li class="nav-item">
-                                            <a class="nav-link active" data-toggle="tab" href="#daily" aria-controls="daily" role="tab" aria-expanded="true"
-                                               aria-selected="false">{{trans_choice('common.days.attribute', 1)}}</a>
+                                            <a class="nav-link active" data-toggle="tab" href="#daily" role="tab" aria-controls="daily"
+                                               aria-expanded="true" aria-selected="false">{{ trans_choice('common.days.attribute', 1) }}</a>
                                         </li>
                                         <li class="nav-item">
-                                            <a class="nav-link" data-toggle="tab" href="#monthly" aria-controls="monthly" role="tab"
-                                               aria-selected="true">{{trans('validation.attributes.month')}}</a>
+                                            <a class="nav-link" data-toggle="tab" href="#monthly" role="tab" aria-controls="monthly"
+                                               aria-selected="true">{{ trans('validation.attributes.month') }}</a>
                                         </li>
                                     </ul>
                                 </div>
                             </div>
-                            <x-alert type="danger" :message="trans('user.traffic_logs.tips')"/>
+                            <x-alert type="danger" :message="trans('user.traffic_logs.tips')" />
                             <div class="panel-body">
                                 <div class="tab-content">
                                     <div class="tab-pane active" id="daily" role="tabpanel">
-                                        <canvas id="dailyChart" aria-label="{{trans('user.traffic_logs.24hours')}}" role="img"></canvas>
+                                        <canvas id="dailyChart" role="img" aria-label="{{ trans('user.traffic_logs.hourly') }}"></canvas>
                                     </div>
                                     <div class="tab-pane" id="monthly" role="tabpanel">
-                                        <canvas id="monthlyChart" aria-label="{{trans('user.traffic_logs.30days')}}" role="img"></canvas>
+                                        <canvas id="monthlyChart" role="img" aria-label="{{ trans('user.traffic_logs.daily') }}"></canvas>
                                     </div>
                                 </div>
                             </div>
@@ -293,181 +316,187 @@
     <script src="/assets/global/js/Plugin/matchheight.js"></script>
     <script src="/assets/global/js/Plugin/bootstrap-select.js"></script>
     <script>
-      function exchangeSubscribe() { // 更换订阅地址
-        swal.fire({
-          title: '{{trans('common.warning')}}',
-          text: '{{trans('user.subscribe.exchange_warning')}}',
-          icon: 'warning',
-          showCancelButton: true,
-          cancelButtonText: '{{trans('common.close')}}',
-          confirmButtonText: '{{trans('common.confirm')}}',
-        }).then((result) => {
-          if (result.value) {
-            $.post('{{route('changeSub')}}', {_token: '{{csrf_token()}}'}, function(ret) {
-              if (ret.status === 'success') {
-                swal.fire({
-                  title: ret.message,
-                  icon: 'success',
-                  timer: 1000,
-                  showConfirmButton: false,
-                }).then(() => window.location.reload());
-              } else {
-                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-              }
+        function exchangeSubscribe() { // 更换订阅地址
+            swal.fire({
+                title: '{{ trans('common.warning') }}',
+                text: '{{ trans('user.subscribe.exchange_warning') }}',
+                icon: 'warning',
+                showCancelButton: true,
+                cancelButtonText: '{{ trans('common.close') }}',
+                confirmButtonText: '{{ trans('common.confirm') }}',
+            }).then((result) => {
+                if (result.value) {
+                    $.post('{{ route('changeSub') }}', {
+                        _token: '{{ csrf_token() }}'
+                    }, function(ret) {
+                        if (ret.status === 'success') {
+                            swal.fire({
+                                title: ret.message,
+                                icon: 'success',
+                                timer: 1000,
+                                showConfirmButton: false,
+                            }).then(() => window.location.reload());
+                        } else {
+                            swal.fire({
+                                title: ret.message,
+                                icon: 'error'
+                            }).then(() => window.location.reload());
+                        }
+                    });
+                }
             });
-          }
-        });
-      }
+        }
 
-      const clipboard = new ClipboardJS('.mt-clipboard', {
-        text: function(trigger) {
-          let base = @json($subUrl);
-          const client = $('#client').val();
-          const subType = $('#subType').val();
-          if (subType && client) {
-            base += '?target=' + client + '&type=' + subType;
-          } else if (subType) {
-            base += '?type=' + subType;
-          } else if (client) {
-            base += '?target=' + client;
-          }
-          return base;
-        },
-      });
-      clipboard.on('success', function() {
-        swal.fire({
-          title: '{{trans('common.copy.success')}}',
-          icon: 'success',
-          timer: 1300,
-          showConfirmButton: false,
+        const clipboard = new ClipboardJS('.mt-clipboard', {
+            text: function(trigger) {
+                let base = @json($subUrl);
+                const client = $('#client').val();
+                const subType = $('#subType').val();
+                if (subType && client) {
+                    base += '?target=' + client + '&type=' + subType;
+                } else if (subType) {
+                    base += '?type=' + subType;
+                } else if (client) {
+                    base += '?target=' + client;
+                }
+                return base;
+            },
         });
-      });
-      clipboard.on('error', function() {
-        swal.fire({
-          title: '{{trans('common.copy.failed')}}',
-          icon: 'error',
-          timer: 1500,
-          showConfirmButton: false,
-
+        clipboard.on('success', function() {
+            swal.fire({
+                title: '{{ trans('common.copy.success') }}',
+                icon: 'success',
+                timer: 1300,
+                showConfirmButton: false,
+            });
         });
-      });
+        clipboard.on('error', function() {
+            swal.fire({
+                title: '{{ trans('common.copy.failed') }}',
+                icon: 'error',
+                timer: 1500,
+                showConfirmButton: false,
 
-      @if(sysConfig('is_checkin'))
-      function checkIn() { // 签到
-        $.post('{{route('checkIn')}}', {_token: '{{csrf_token()}}'}, function(ret) {
-          if (ret.status === 'success') {
-            swal.fire(ret.title, ret.message, 'success');
-          } else {
-            swal.fire(ret.title, ret.message, 'error');
-          }
+            });
         });
-      }
-      @endif
 
-      function common_options(tail) {
-        return {
-          responsive: true,
-          scales: {
-            x: {
-              ticks: {
-                callback: function(value) {
-                  return this.getLabelForValue(value) + ' ' + tail;
-                },
-              },
-              grid: {
-                display: false,
-              },
-            },
-            y: {
-              ticks: {
-                callback: function(value) {
-                  return this.getLabelForValue(value) + ' GB';
-                },
-              },
-              grid: {
-                display: false,
-              },
-              min: 0,
-            },
-          },
-          plugins: {
-            legend: false,
-            tooltip: {
-              mode: 'index',
-              intersect: false,
-              callbacks: {
-                title: function(context) {
-                  return context[0].label + ' ' + tail;
+        @if (sysConfig('is_checkin'))
+            function checkIn() { // 签到
+                $.post('{{ route('checkIn') }}', {
+                    _token: '{{ csrf_token() }}'
+                }, function(ret) {
+                    if (ret.status === 'success') {
+                        swal.fire(ret.title, ret.message, 'success');
+                    } else {
+                        swal.fire(ret.title, ret.message, 'error');
+                    }
+                });
+            }
+        @endif
+
+        function common_options(tail) {
+            return {
+                responsive: true,
+                scales: {
+                    x: {
+                        ticks: {
+                            callback: function(value) {
+                                return this.getLabelForValue(value) + ' ' + tail;
+                            },
+                        },
+                        grid: {
+                            display: false,
+                        },
+                    },
+                    y: {
+                        ticks: {
+                            callback: function(value) {
+                                return this.getLabelForValue(value) + ' GB';
+                            },
+                        },
+                        grid: {
+                            display: false,
+                        },
+                        min: 0,
+                    },
                 },
-                label: function(context) {
-                  return context.parsed.y + ' GB';
+                plugins: {
+                    legend: false,
+                    tooltip: {
+                        mode: 'index',
+                        intersect: false,
+                        callbacks: {
+                            title: function(context) {
+                                return context[0].label + ' ' + tail;
+                            },
+                            label: function(context) {
+                                return context.parsed.y + ' GB';
+                            },
+                        },
+                    },
                 },
-              },
-            },
-          },
-        };
-      }
+            };
+        }
 
-      function datasets(label, data) {
-        return {
-          labels: label,
-          datasets: [
-            {
-              backgroundColor: 'rgba(184, 215, 255)',
-              borderColor: 'rgba(184, 215, 255)',
-              data: data,
-              tension: 0.4,
-            }],
-        };
-      }
+        function datasets(label, data) {
+            return {
+                labels: label,
+                datasets: [{
+                    backgroundColor: 'rgba(184, 215, 255)',
+                    borderColor: 'rgba(184, 215, 255)',
+                    data: data,
+                    tension: 0.4,
+                }],
+            };
+        }
 
-      new Chart(document.getElementById('dailyChart'), {
-        type: 'line',
-        data: datasets(@json($dayHours), @json($trafficHourly)),
-        options: common_options(@json(trans_choice('common.hour', 2))),
-      });
+        new Chart(document.getElementById('dailyChart'), {
+            type: 'line',
+            data: datasets(@json($dayHours), @json($trafficHourly)),
+            options: common_options(@json(trans_choice('common.hour', 2))),
+        });
 
-      new Chart(document.getElementById('monthlyChart'), {
-        type: 'line',
-        data: datasets(@json($monthDays), @json($trafficDaily)),
-        options: common_options(@json(trans_choice('common.days.attribute', 2))),
-      });
+        new Chart(document.getElementById('monthlyChart'), {
+            type: 'line',
+            data: datasets(@json($monthDays), @json($trafficDaily)),
+            options: common_options(@json(trans_choice('common.days.attribute', 2))),
+        });
 
-      @if($banedTime) // 封禁倒计时
-      const banedTime = new Date("{{$banedTime}}").getTime();
-      countDown(banedTime, 'banedTime', true);
-      setInterval(function() {
-        countDown(banedTime, 'banedTime', true);
-      }, 1000);
-      @endif
+        @if ($banedTime) // 封禁倒计时
+            const banedTime = new Date("{{ $banedTime }}").getTime();
+            countDown(banedTime, 'banedTime', true);
+            setInterval(function() {
+                countDown(banedTime, 'banedTime', true);
+            }, 1000);
+        @endif
 
-      @if(isset($resetDays) && $resetDays === 0) // 重置日倒计时
-      const resetTime = new Date("{{date("Y-m-d 00:00", strtotime("tomorrow"))}}").getTime();
-      countDown(resetTime, 'restTime');
-      setInterval(function() {
-        countDown(resetTime, 'restTime');
-      }, 60000);
-      @endif
+        @if (isset($resetDays) && $resetDays === 0) // 重置日倒计时
+            const resetTime = new Date("{{ date('Y-m-d 00:00', strtotime('tomorrow')) }}").getTime();
+            countDown(resetTime, 'restTime');
+            setInterval(function() {
+                countDown(resetTime, 'restTime');
+            }, 60000);
+        @endif
 
-      function countDown(endTime, id, seconds = false) { // 计时器主题逻辑
-        const distance = endTime - new Date().getTime();
-        const hour = Math.floor(distance % 86400000 / 3600000);
-        const minute = Math.floor((distance % 3600000) / 60000);
-        let string = '';
-        if (hour) {
-          string += hour + ' ' + @json(trans_choice('common.hour', 1));
-        }
-        if (minute) {
-          string += ' ' + minute + ' ' + @json(trans('validation.attributes.minute'));
-        }
-        if (seconds) {
-          string += ' ' + Math.floor((distance % 60000) / 1000) + ' ' + @json(trans('validation.attributes.second'));
-        }
-        document.getElementById(id).innerHTML = string;
+        function countDown(endTime, id, seconds = false) { // 计时器主题逻辑
+            const distance = endTime - new Date().getTime();
+            const hour = Math.floor(distance % 86400000 / 3600000);
+            const minute = Math.floor((distance % 3600000) / 60000);
+            let string = '';
+            if (hour) {
+                string += hour + ' ' + @json(trans_choice('common.hour', 1));
+            }
+            if (minute) {
+                string += ' ' + minute + ' ' + @json(trans('validation.attributes.minute'));
+            }
+            if (seconds) {
+                string += ' ' + Math.floor((distance % 60000) / 1000) + ' ' + @json(trans('validation.attributes.second'));
+            }
+            document.getElementById(id).innerHTML = string;
 
-        if (distance <= 0 && distance.abs > 1000) {
-          window.location.reload();
+            if (distance <= 0 && distance.abs > 1000) {
+                window.location.reload();
+            }
         }
-      }
     </script>
 @endsection

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

@@ -79,7 +79,7 @@
                                                                         @endif
                                                                         <button class="btn btn-outline-info" onclick="exchangeSubscribe();">
                                                                             <i class="icon wb-refresh" aria-hidden="true"></i>
-                                                                            {{trans('common.replace')}}</button>
+                                                                            {{ trans('common.change') }}</button>
                                                                         <button class="btn btn-outline-info mt-clipboard" data-clipboard-action="copy"
                                                                                 data-clipboard-target="#sub_link">
                                                                             <i class="icon wb-copy" aria-hidden="true"></i>

+ 2 - 2
resources/views/user/layouts.blade.php

@@ -120,7 +120,7 @@
                 <li class="site-menu-item {{ request()->routeIs('knowledge') ? 'active open' : '' }}">
                     <a href="{{ route('knowledge') }}">
                         <i class="site-menu-icon wb-info-circle" aria-hidden="true"></i>
-                        <span class="site-menu-title">{{trans('user.menu.helps')}}</span>
+                        <span class="site-menu-title">{{ trans('user.menu.help') }}</span>
                     </a>
                 </li>
                 <li class="site-menu-item {{ request()->routeIs('profile') ? 'active open' : '' }}">
@@ -162,7 +162,7 @@
                         <li class="site-menu-item {{ request()->routeIs('commission') ? 'active open' : '' }}">
                             <a href="{{ route('commission') }}">
                                 <i class="site-menu-icon wb-star-outline" aria-hidden="true"></i>
-                                <span class="site-menu-title">{{trans('user.menu.referrals')}}</span>
+                                <span class="site-menu-title">{{ trans('user.menu.promotion') }}</span>
                             </a>
                         </li>
                     @endif

+ 145 - 133
resources/views/user/nodeList.blade.php

@@ -1,8 +1,8 @@
 @extends('user.layouts')
 @section('css')
     <link href="/assets/global/fonts/font-awesome/css/all.min.css" rel="stylesheet">
-    <link href="/assets/global/vendor/webui-popover/webui-popover.min.css" type="text/css" rel="stylesheet">
-    <link href="/assets/global/vendor/jvectormap/jquery-jvectormap.min.css" type="text/css" rel="stylesheet">
+    <link href="/assets/global/vendor/webui-popover/webui-popover.min.css" rel="stylesheet">
+    <link href="/assets/global/vendor/jvectormap/jquery-jvectormap.min.css" rel="stylesheet">
     <style>
         .flag-icon-rounded {
             border-radius: 50%;
@@ -14,7 +14,6 @@
     </style>
 @endsection
 @section('content')
-    <!-- BEGIN CONTENT BODY -->
     <div class="page-content container-fluid">
         <div class="row">
             <div class="col-md-9">
@@ -29,23 +28,23 @@
                     <div class="col-md-12">
                         <div class="card card-block p-20  bg-indigo-500">
                             <div class="counter counter-lg counter-inverse">
-                                <div class="counter-label text-uppercase font-size-16">{{trans('user.account.level')}}</div>
+                                <div class="counter-label text-uppercase font-size-16">{{ trans('user.account.level') }}</div>
                                 <div class="counter-number-group">
                                     <span class="counter-icon"><i class="icon wb-user-circle" aria-hidden="true"></i></span>
-                                    <span class="counter-number ml-10">{{Auth::getUser()->level}}</span>
+                                    <span class="counter-number ml-10">{{ Auth::getUser()->level }}</span>
                                 </div>
-                                <div class="counter-label text-uppercase font-size-16">{{Auth::getUser()->level_name}}</div>
+                                <div class="counter-label text-uppercase font-size-16">{{ Auth::getUser()->level_name }}</div>
                             </div>
                         </div>
                     </div>
-                    @if(Auth::getUser()->user_group_id)
+                    @if (Auth::getUser()->user_group_id)
                         <div class="col-md-12">
                             <div class="card card-block p-20 bg-indigo-500">
                                 <div class="counter counter-lg counter-inverse">
-                                    <div class="counter-label text-uppercase font-size-16">{{trans('user.account.group')}}</div>
+                                    <div class="counter-label text-uppercase font-size-16">{{ trans('user.account.group') }}</div>
                                     <div class="counter-number-group">
                                         <span class="counter-icon"><i class="icon wb-globe" aria-hidden="true"></i></span>
-                                        <span class="counter-number ml-10">{{Auth::getUser()->userGroup->name}}</span>
+                                        <span class="counter-number ml-10">{{ Auth::getUser()->userGroup->name }}</span>
                                     </div>
                                 </div>
                             </div>
@@ -54,10 +53,10 @@
                     <div class="col-md-12">
                         <div class="card card-block p-20 bg-indigo-500">
                             <div class="counter counter-lg counter-inverse">
-                                <div class="counter-label text-uppercase font-size-16">{{trans('user.account.speed_limit')}}</div>
+                                <div class="counter-label text-uppercase font-size-16">{{ trans('user.account.speed_limit') }}</div>
                                 <div class="counter-number-group">
                                     <span class="counter-icon"><i class="icon wb-signal" aria-hidden="true"></i></span>
-                                    <span class="counter-number ml-10">{{Auth::getUser()->speed_limit ?? trans('common.unlimited')}}</span>
+                                    <span class="counter-number ml-10">{{ Auth::getUser()->speed_limit ?: trans('common.unlimited') }}</span>
                                 </div>
                                 <div class="counter-label font-size-16">Mbps</div>
                             </div>
@@ -65,40 +64,42 @@
                     </div>
                 </div>
             </div>
-            @foreach($nodeList as $node)
+            @foreach ($nodeList as $node)
                 <div class="col-xxl-3 col-xl-4 col-sm-6">
                     <div class="card card-inverse card-shadow bg-white node">
                         <div class="card-block p-30 row">
                             <div class="col-4">
-                                <i class="fi fi-{{$node->country_code}} flag-icon-rounded" aria-hidden="true"></i>
+                                <i class="fi fi-{{ $node->country_code }} flag-icon-rounded" aria-hidden="true"></i>
                             </div>
                             <div class="col-8 text-break text-right">
                                 <p class="font-size-20 blue-600">
-                                    <span class="float-left badge badge-round badge-default">{{$node->level_table->name}}</span>
-                                    @if($node->offline && !$node->relay_node_id)
-                                        <i class="red-600 icon wb-warning" data-content="{{trans('user.node.unstable')}}" data-trigger="hover" data-toggle="popover" data-placement="top"></i>
+                                    <span class="float-left badge badge-round badge-default">{{ $node->level_table->name }}</span>
+                                    @if ($node->offline && !$node->relay_node_id)
+                                        <i class="red-600 icon wb-warning" data-content="{{ trans('user.node.unstable') }}" data-trigger="hover"
+                                           data-toggle="popover" data-placement="top"></i>
                                     @endif
-                                    @if($node->traffic_rate !== 1.0)
-                                        <i class="green-600 icon wb-info-circle" data-content="{{trans('user.node.rate', ['ratio' => $node->traffic_rate])}}" data-trigger="hover" data-toggle="popover" data-placement="top"></i>
+                                    @if ($node->traffic_rate !== 1.0)
+                                        <i class="green-600 icon wb-info-circle" data-content="{{ trans('user.node.rate', ['ratio' => $node->traffic_rate]) }}"
+                                           data-trigger="hover" data-toggle="popover" data-placement="top"></i>
                                     @endif
-                                    {{$node->name}}
+                                    {{ $node->name }}
                                 </p>
                                 <blockquote>
-                                    @foreach($node->labels as $label)
-                                        <span class="badge badge-round badge-info">{{$label->name}}</span>
+                                    @foreach ($node->labels as $label)
+                                        <span class="badge badge-round badge-info">{{ $label->name }}</span>
                                     @endforeach
                                     <br>
-                                    {{$node->description}}
+                                    {{ $node->description }}
                                 </blockquote>
                                 <p class="font-size-14">
-                                    <button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','code')">
-                                        <i id="code{{$node->id}}" class="fa-solid fa-code"></i>
+                                    <button class="btn btn-sm btn-outline-info" onclick="getInfo('{{ $node->id }}','code')">
+                                        <i class="fa-solid fa-code" id="code{{ $node->id }}"></i>
                                     </button>
-                                    <button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','qrcode')">
-                                        <i id="qrcode{{$node->id}}" class="fa-solid fa-qrcode"></i>
+                                    <button class="btn btn-sm btn-outline-info" onclick="getInfo('{{ $node->id }}','qrcode')">
+                                        <i class="fa-solid fa-qrcode" id="qrcode{{ $node->id }}"></i>
                                     </button>
-                                    <button class="btn btn-sm btn-outline-info" onclick="getInfo('{{$node->id}}','text')">
-                                        <i id="text{{$node->id}}" class="fa-solid fa-list"></i>
+                                    <button class="btn btn-sm btn-outline-info" onclick="getInfo('{{ $node->id }}','text')">
+                                        <i class="fa-solid fa-list" id="text{{ $node->id }}"></i>
                                     </button>
                                 </p>
                             </div>
@@ -118,114 +119,125 @@
     <script src="/assets/custom/maps/jquery-jvectormap-world-mill-cn.js"></script>
 
     <script type="text/javascript">
-      $(function() {
-        $('#world-map').vectorMap({
-          map: 'world_mill',
-          scaleColors: ['#C8EEFF', '#0071A4'],
-          normalizeFunction: 'polynomial',
-          zoomAnimate: true,
-          hoverOpacity: 0.7,
-          hoverColor: false,
-          regionStyle: {
-            initial: {
-              fill: '#3E8EF7',
-            },
-            hover: {
-              fill: '#589FFC',
-            },
-            selected: {
-              fill: '#0B69E3',
-            },
-            selectedHover: {
-              fill: '#589FFC',
-            },
-          },
-          markerStyle: {
-            initial: {
-              r: 3,
-              fill: '#FF4C52',
-              'stroke-width': 0,
-            },
-            hover: {
-              r: 6,
-              stroke: '#FF4C52',
-              'stroke-width': 0,
-            },
-          },
-          backgroundColor: '#fff',
-          markers: [
-                  @foreach($nodesGeo as $name => $geo)
-            {
-              latLng: [{{$name}}], name: '{{$geo}}',
-            },
-              @endforeach
-          ],
-        });
-        $('.node').matchHeight();
-        $('.map').matchHeight();
-      });
-
-      function getInfo(id, type) {
-        const oldClass = $('#' + type + id).attr('class');
-        $.ajax({
-          method: 'POST',
-          url: '{{route('node')}}',
-          data: {_token: '{{csrf_token()}}', id: id, type: type},
-          beforeSend: function() {
-            $('#' + type + id).removeAttr('class').addClass('icon wb-loop icon-spin');
-          },
-          success: function(ret) {
-            if (ret.status === 'success') {
-              switch (type) {
-                case 'code':
-                  swal.fire({
-                    html: '<textarea class="form-control" rows="8" readonly="readonly">' + ret.data + '</textarea>' +
-                        '<a href="' + ret.data + '" class="btn btn-block btn-danger mt-4">{{trans('common.open')}}' +
-                        ret.title + '</a>',
-                    showConfirmButton: false,
-                  });
-                  break;
-                case 'qrcode':
-                  swal.fire({
-                    title: '{{trans('user.scan_qrcode')}}',
-                    html: '<div id="qrcode"></div><button class="btn btn-block btn-outline-primary mt-4" onclick="Download()"> <i class="icon wb-download"></i> {{trans('common.download')}}</button>',
-                    onBeforeOpen: () => {
-                      new QRCode(document.getElementById('qrcode'), {text: ret.data});
+        $(function() {
+            $('#world-map').vectorMap({
+                map: 'world_mill',
+                scaleColors: ['#C8EEFF', '#0071A4'],
+                normalizeFunction: 'polynomial',
+                zoomAnimate: true,
+                hoverOpacity: 0.7,
+                hoverColor: false,
+                regionStyle: {
+                    initial: {
+                        fill: '#3E8EF7',
+                    },
+                    hover: {
+                        fill: '#589FFC',
+                    },
+                    selected: {
+                        fill: '#0B69E3',
+                    },
+                    selectedHover: {
+                        fill: '#589FFC',
                     },
-                    showConfirmButton: false,
-                  });
-                  break;
-                case 'text':
-                  swal.fire({
-                    title: '{{trans('user.node.info')}}',
-                    html: '<textarea class="form-control" rows="12" readonly="readonly">' + ret.data + '</textarea>',
-                    showConfirmButton: false,
-                  });
-                  break;
-                default:
-                  swal.fire({title: ret.title, text: ret.data, icon: 'error'});
-              }
-            }
-          },
-          complete: function() {
-            $('#' + type + id).removeAttr('class').addClass(oldClass);
-          },
+                },
+                markerStyle: {
+                    initial: {
+                        r: 3,
+                        fill: '#FF4C52',
+                        'stroke-width': 0,
+                    },
+                    hover: {
+                        r: 6,
+                        stroke: '#FF4C52',
+                        'stroke-width': 0,
+                    },
+                },
+                backgroundColor: '#fff',
+                markers: [
+                    @foreach ($nodesGeo as $name => $geo)
+                        {
+                            latLng: [{{ $name }}],
+                            name: '{{ $geo }}',
+                        },
+                    @endforeach
+                ],
+            });
+            $('.node').matchHeight();
+            $('.map').matchHeight();
         });
-      }
 
-      function Download() {
-        const canvas = document.getElementsByTagName('canvas')[0];
-        canvas.toBlob((blob) => {
-          let link = document.createElement('a');
-          link.download = 'qr.png';
+        function getInfo(id, type) {
+            const oldClass = $('#' + type + id).attr('class');
+            $.ajax({
+                method: 'POST',
+                url: '{{ route('node') }}',
+                data: {
+                    _token: '{{ csrf_token() }}',
+                    id: id,
+                    type: type
+                },
+                beforeSend: function() {
+                    $('#' + type + id).removeAttr('class').addClass('icon wb-loop icon-spin');
+                },
+                success: function(ret) {
+                    if (ret.status === 'success') {
+                        switch (type) {
+                            case 'code':
+                                swal.fire({
+                                    html: '<textarea class="form-control" rows="8" readonly="readonly">' + ret.data + '</textarea>' +
+                                        '<a href="' + ret.data + '" class="btn btn-block btn-danger mt-4">{{ trans('common.open') }}' +
+                                        ret.title + '</a>',
+                                    showConfirmButton: false,
+                                });
+                                break;
+                            case 'qrcode':
+                                swal.fire({
+                                    title: '{{ trans('user.scan_qrcode') }}',
+                                    html: '<div id="qrcode"></div><button class="btn btn-block btn-outline-primary mt-4" onclick="Download()"> <i class="icon wb-download"></i> {{ trans('common.download') }}</button>',
+                                    onBeforeOpen: () => {
+                                        new QRCode(document.getElementById('qrcode'), {
+                                            text: ret.data
+                                        });
+                                    },
+                                    showConfirmButton: false,
+                                });
+                                break;
+                            case 'text':
+                                swal.fire({
+                                    title: '{{ trans('user.node.info') }}',
+                                    html: '<textarea class="form-control" rows="12" readonly="readonly">' + ret.data + '</textarea>',
+                                    showConfirmButton: false,
+                                });
+                                break;
+                            default:
+                                swal.fire({
+                                    title: ret.title,
+                                    text: ret.data,
+                                    icon: 'error'
+                                });
+                        }
+                    }
+                },
+                complete: function() {
+                    $('#' + type + id).removeAttr('class').addClass(oldClass);
+                },
+            });
+        }
 
-          let reader = new FileReader();
-          reader.readAsDataURL(blob);
-          reader.onload = () => {
-            link.href = reader.result;
-            link.click();
-          };
-        }, 'image/png');
-      }
+        function Download() {
+            const canvas = document.getElementsByTagName('canvas')[0];
+            canvas.toBlob((blob) => {
+                let link = document.createElement('a');
+                link.download = 'qr.png';
+
+                let reader = new FileReader();
+                reader.readAsDataURL(blob);
+                reader.onload = () => {
+                    link.href = reader.result;
+                    link.click();
+                };
+            }, 'image/png');
+        }
     </script>
 @endsection

+ 130 - 125
resources/views/user/referral.blade.php

@@ -4,31 +4,29 @@
 @endsection
 @section('content')
     <div class="page-header">
-        <h1 class="page-title cyan-600"><i class="icon wb-star"></i>{{trans('user.menu.referrals')}}</h1>
+        <h1 class="page-title cyan-600"><i class="icon wb-star"></i>{{ trans('user.menu.promotion') }}</h1>
     </div>
     <div class="page-content  container-fluid">
-        <x-alert type="success"
-                 :message="trans('user.invite.promotion', ['traffic' => $referral_traffic, 'referral_percent' => $referral_percent * 100])"/>
+        <x-alert type="success" :message="trans('user.invite.promotion', ['traffic' => $referral_traffic, 'referral_percent' => $referral_percent * 100])" />
         <div class="row">
             <div class="col-lg-5">
                 <!-- 推广链接 -->
                 <div class="card card-inverse card-shadow bg-white node">
                     <div class="card-block p-30 row">
-                        <div id="qrcode" class="col-auto"></div>
+                        <div class="col-auto" id="qrcode"></div>
                         <div class="col text-break">
                             <h4 class="card-title cyan-600"><i class="icon wb-link"></i>
-                                {{trans('user.referral.link')}}
+                                {{ trans('user.referral.link') }}
                             </h4>
                             <div class="mt-clipboard-container input-group">
-                                <input type="text" id="mt-target-1" class="form-control" value="{{$aff_link}}"/>
+                                <input class="form-control" id="mt-target-1" type="text" value="{{ $aff_link }}" />
                             </div>
                             <div class="btn-group float-right pt-4">
                                 <button class="btn btn-outline-primary" onclick="Download()">
-                                    <i class="icon wb-download"></i> {{trans('common.download')}}
+                                    <i class="icon wb-download"></i> {{ trans('common.download') }}
                                 </button>
-                                <button class="btn btn-info mt-clipboard" data-clipboard-action="copy"
-                                        data-clipboard-text="{{$aff_link}}">
-                                    <i class="icon wb-copy"></i> {{trans('common.copy.attribute')}}
+                                <button class="btn btn-info mt-clipboard" data-clipboard-action="copy" data-clipboard-text="{{ $aff_link }}">
+                                    <i class="icon wb-copy"></i> {{ trans('common.copy.attribute') }}
                                 </button>
                             </div>
                         </div>
@@ -39,30 +37,30 @@
                 <div class="card">
                     <div class="card-block">
                         <h4 class="card-title cyan-600"><i class="icon wb-emoticon"></i>
-                            {{trans('user.invite.logs')}}
+                            {{ trans('user.invite.logs') }}
                         </h4>
                         <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                             <thead class="thead-default">
-                            <tr>
-                                <th data-cell-style="cellStyle"> #</th>
-                                <th> {{trans('model.user.username')}} </th>
-                                <th> {{trans('user.registered_at')}}</th>
-                            </tr>
-                            </thead>
-                            <tbody>
-                            @foreach($referralUserList as $user)
                                 <tr>
-                                    <td> {{$loop->iteration}} </td>
-                                    <td> {{str_replace(mb_substr($user->username, 3, 4), "****", $user->username)}}  </td>
-                                    <td> {{$user->created_at}} </td>
+                                    <th data-cell-style="cellStyle"> #</th>
+                                    <th> {{ trans('model.user.username') }} </th>
+                                    <th> {{ trans('user.registered_at') }}</th>
                                 </tr>
-                            @endforeach
+                            </thead>
+                            <tbody>
+                                @foreach ($referralUserList as $user)
+                                    <tr>
+                                        <td> {{ $loop->iteration }} </td>
+                                        <td> {{ str_replace(mb_substr($user->username, 3, 4), '****', $user->username) }} </td>
+                                        <td> {{ $user->created_at }} </td>
+                                    </tr>
+                                @endforeach
                             </tbody>
                         </table>
                     </div>
                     <div class="card-footer card-footer-transparent">
                         <nav class="Page navigation float-right">
-                            {{$referralUserList->appends(Arr::except(Request::query(), 'user_page'))->links()}}
+                            {{ $referralUserList->appends(Arr::except(Request::query(), 'user_page'))->links() }}
                         </nav>
                     </div>
                 </div>
@@ -72,48 +70,49 @@
                 <div class="panel">
                     <div class="panel-heading">
                         <h3 class="panel-title cyan-600">
-                            <i class="icon wb-star-half"></i>{{trans('user.referral.logs')}}
+                            <i class="icon wb-star-half"></i>{{ trans('user.referral.logs') }}
                         </h3>
                         <div class="panel-actions">
-                            <button type="submit" class="btn btn-danger" onclick="extractMoney()">
-                                {{trans('user.withdraw')}}
+                            <button class="btn btn-danger" type="submit" onclick="extractMoney()">
+                                {{ trans('user.withdraw') }}
                             </button>
                         </div>
                     </div>
                     <div class="panel-body">
                         <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                             <thead class="thead-default">
-                            <tr>
-                                <th data-cell-style="cellStyle"> #</th>
-                                <th> {{trans('model.aff.invitee')}} </th>
-                                <th> {{trans('model.aff.amount')}} </th>
-                                <th> {{trans('model.aff.commission')}} </th>
-                                <th> {{trans('common.created_at')}} </th>
-                                <th> {{trans('common.status.attribute')}} </th>
-                            </tr>
-                            </thead>
-                            <tbody>
-                            @foreach($referralLogList as $referralLog)
                                 <tr>
-                                    <td> {{$loop->iteration}} </td>
-                                    <td> {{empty($referralLog->invitee) ? '【'.trans('common.deleted_item', ['attribute' => trans('common.account')]).'】' : str_replace(mb_substr($referralLog->invitee->username, 3, 4), "****", $referralLog->invitee->username)}} </td>
-                                    <td> {{$referralLog->amount_tag}} </td>
-                                    <td> {{$referralLog->commission_tag}} </td>
-                                    <td> {{$referralLog->created_at}} </td>
-                                    <td>{!! $referralLog->status_label !!}</td>
+                                    <th data-cell-style="cellStyle"> #</th>
+                                    <th> {{ trans('model.aff.invitee') }} </th>
+                                    <th> {{ trans('model.aff.amount') }} </th>
+                                    <th> {{ trans('model.aff.commission') }} </th>
+                                    <th> {{ trans('common.created_at') }} </th>
+                                    <th> {{ trans('common.status.attribute') }} </th>
                                 </tr>
-                            @endforeach
+                            </thead>
+                            <tbody>
+                                @foreach ($referralLogList as $referralLog)
+                                    <tr>
+                                        <td> {{ $loop->iteration }} </td>
+                                        <td> {{ empty($referralLog->invitee) ? '【' . trans('common.deleted_item', ['attribute' => trans('common.account')]) . '】' : str_replace(mb_substr($referralLog->invitee->username, 3, 4), '****', $referralLog->invitee->username) }}
+                                        </td>
+                                        <td> {{ $referralLog->amount_tag }} </td>
+                                        <td> {{ $referralLog->commission_tag }} </td>
+                                        <td> {{ $referralLog->created_at }} </td>
+                                        <td>{!! $referralLog->status_label !!}</td>
+                                    </tr>
+                                @endforeach
                             </tbody>
                         </table>
                     </div>
                     <div class="panel-footer">
                         <div class="row">
                             <div class="col-md-6 col-sm-6">
-                                {{trans('user.referral.total', ['amount' => $canAmount, 'total' => $referralLogList->total(), 'money' => $referral_money])}}
+                                {{ trans('user.referral.total', ['amount' => $canAmount, 'total' => $referralLogList->total(), 'money' => $referral_money]) }}
                             </div>
                             <div class="col-md-6 col-sm-6">
                                 <nav class="Page navigation float-right">
-                                    {{$referralLogList->appends(Arr::except(Request::query(), 'log_page'))->links()}}
+                                    {{ $referralLogList->appends(Arr::except(Request::query(), 'log_page'))->links() }}
                                 </nav>
                             </div>
                         </div>
@@ -122,34 +121,33 @@
                 <!-- 提现记录 -->
                 <div class="card">
                     <div class="card-block">
-                        <h4 class="card-title cyan-600"><i
-                                    class="icon wb-star-outline"></i> {{trans('user.withdraw_logs')}}</h4>
+                        <h4 class="card-title cyan-600"><i class="icon wb-star-outline"></i> {{ trans('user.withdraw_logs') }}</h4>
                         <table class="text-md-center" data-toggle="table" data-mobile-responsive="true">
                             <thead class="thead-default">
-                            <tr>
-                                <th data-cell-style="cellStyle"> #</th>
-                                <th> {{trans('user.withdraw_at')}} </th>
-                                <th> {{trans('user.withdraw_commission')}} </th>
-                                <th> {{trans('common.status.attribute')}} </th>
-                            </tr>
-                            </thead>
-                            <tbody>
-                            @foreach($referralApplyList as $referralApply)
                                 <tr>
-                                    <td> {{$loop->iteration}} </td>
-                                    <td> {{$referralApply->created_at}} </td>
-                                    <td> {{$referralApply->amount_tag}} </td>
-                                    <td>
-                                        {!! $referralApply->status_label !!}
-                                    </td>
+                                    <th data-cell-style="cellStyle"> #</th>
+                                    <th> {{ trans('user.withdraw_at') }} </th>
+                                    <th> {{ trans('user.withdraw_commission') }} </th>
+                                    <th> {{ trans('common.status.attribute') }} </th>
                                 </tr>
-                            @endforeach
+                            </thead>
+                            <tbody>
+                                @foreach ($referralApplyList as $referralApply)
+                                    <tr>
+                                        <td> {{ $loop->iteration }} </td>
+                                        <td> {{ $referralApply->created_at }} </td>
+                                        <td> {{ $referralApply->amount_tag }} </td>
+                                        <td>
+                                            {!! $referralApply->status_label !!}
+                                        </td>
+                                    </tr>
+                                @endforeach
                             </tbody>
                         </table>
                     </div>
                     <div class="card-footer card-footer-transparent">
                         <nav class="Page navigation float-right">
-                            {{$referralApplyList->appends(Arr::except(Request::query(), 'apply_page'))->links()}}
+                            {{ $referralApplyList->appends(Arr::except(Request::query(), 'apply_page'))->links() }}
                         </nav>
                     </div>
                 </div>
@@ -163,72 +161,79 @@
     <script src="/assets/custom/clipboardjs/clipboard.min.js"></script>
     <script src="/assets/custom/easy.qrcode.min.js"></script>
     <script>
-      // Options
-      const options = {
-        text: @json($aff_link),
-        dotScale: 0.9,
-        width: 144,
-        height: 144,
-        backgroundImage: '/assets/images/logo_original.png',
-        backgroundImageAlpha: 1,
-        PO_TL: '#007bff',
-        PI_TL: '#17a2b8',
-        PI_TR: '#fd7e14',
-        PO_TR: '#28a745',
-        PI_BL: '#ffc107',
-        PO_BL: '#17a2b8',
-        AO: '#fd7e14',
-        AI: '#20c997',
-        autoColor: true,
-      };
+        // Options
+        const options = {
+            text: @json($aff_link),
+            dotScale: 0.9,
+            width: 144,
+            height: 144,
+            backgroundImage: '/assets/images/logo_original.png',
+            backgroundImageAlpha: 1,
+            PO_TL: '#007bff',
+            PI_TL: '#17a2b8',
+            PI_TR: '#fd7e14',
+            PO_TR: '#28a745',
+            PI_BL: '#ffc107',
+            PO_BL: '#17a2b8',
+            AO: '#fd7e14',
+            AI: '#20c997',
+            autoColor: true,
+        };
 
-      // Create QRCode Object
-      new QRCode(document.getElementById('qrcode'), options);
+        // Create QRCode Object
+        new QRCode(document.getElementById('qrcode'), options);
 
-      function Download() {
-        const canvas = document.getElementsByTagName('canvas')[0];
-        canvas.toBlob((blob) => {
-          let link = document.createElement('a');
-          link.download = 'qr.png';
+        function Download() {
+            const canvas = document.getElementsByTagName('canvas')[0];
+            canvas.toBlob((blob) => {
+                let link = document.createElement('a');
+                link.download = 'qr.png';
 
-          let reader = new FileReader();
-          reader.readAsDataURL(blob);
-          reader.onload = () => {
-            link.href = reader.result;
-            link.click();
-          };
-        }, 'image/png');
-      }
+                let reader = new FileReader();
+                reader.readAsDataURL(blob);
+                reader.onload = () => {
+                    link.href = reader.result;
+                    link.click();
+                };
+            }, 'image/png');
+        }
 
-      // 申请提现
-      function extractMoney() {
-        $.post('{{route('applyCommission')}}', {_token: '{{csrf_token()}}'}, function(ret) {
-          if (ret.status === 'success') {
-            swal.fire({title: ret.message, icon: 'success', timer: 1000, showConfirmButton: false}).then(() => {
-              window.location.reload();
+        // 申请提现
+        function extractMoney() {
+            $.post('{{ route('applyCommission') }}', {
+                _token: '{{ csrf_token() }}'
+            }, function(ret) {
+                if (ret.status === 'success') {
+                    swal.fire({
+                        title: ret.message,
+                        icon: 'success',
+                        timer: 1000,
+                        showConfirmButton: false
+                    }).then(() => {
+                        window.location.reload();
+                    });
+                } else {
+                    swal.fire(ret.title, ret.message, 'error');
+                }
             });
-          } else {
-            swal.fire(ret.title, ret.message, 'error');
-          }
-        });
-      }
+        }
 
-      const clipboard = new ClipboardJS('.mt-clipboard');
-      clipboard.on('success', function() {
-        swal.fire({
-          title: '{{trans('common.copy.success')}}',
-          icon: 'success',
-          timer: 1300,
-          showConfirmButton: false,
+        const clipboard = new ClipboardJS('.mt-clipboard');
+        clipboard.on('success', function() {
+            swal.fire({
+                title: '{{ trans('common.copy.success') }}',
+                icon: 'success',
+                timer: 1300,
+                showConfirmButton: false,
+            });
         });
-      });
-      clipboard.on('error', function() {
-        swal.fire({
-          title: '{{trans('common.copy.failed')}}',
-          icon: 'error',
-          timer: 1500,
-          showConfirmButton: false,
+        clipboard.on('error', function() {
+            swal.fire({
+                title: '{{ trans('common.copy.failed') }}',
+                icon: 'error',
+                timer: 1500,
+                showConfirmButton: false,
+            });
         });
-      });
     </script>
 @endsection

+ 87 - 82
resources/views/user/ticketList.blade.php

@@ -9,12 +9,12 @@
                 <div class="panel panel-bordered">
                     <div class="panel-heading p-20">
                         <h1 class="panel-title cyan-600">
-                            <i class="icon wb-user-circle"></i>{{trans('user.menu.tickets')}}
+                            <i class="icon wb-user-circle"></i>{{ trans('user.menu.tickets') }}
                         </h1>
                         <div class="panel-actions">
                             <button class="btn btn-primary btn-animate btn-animate-side" data-toggle="modal" data-target="#add_ticket_modal">
                                 <span>
-                                    <i class="icon wb-plus" aria-hidden="true"></i> {{trans('user.ticket.new')}}
+                                    <i class="icon wb-plus" aria-hidden="true"></i> {{ trans('user.ticket.new') }}
                                 </span>
                             </button>
                         </div>
@@ -23,32 +23,33 @@
                         <div class="table-responsive">
                             <table class="table table-hover text-center">
                                 <thead class="thead-default">
-                                <tr>
-                                    <th data-cell-style="cellStyle"> #</th>
-                                    <th> {{trans('validation.attributes.title')}} </th>
-                                    <th> {{trans('common.status.attribute')}} </th>
-                                    <th></th>
-                                </tr>
-                                </thead>
-                                <tbody>
-                                @foreach($tickets as $ticket)
                                     <tr>
-                                        <td>{{$ticket->id}}</td>
-                                        <td>{{$ticket->title}}</td>
-                                        <td>{!!$ticket->status_label!!}</td>
-                                        <td>
-                                            <a href="{{route('replyTicket', ['id' => $ticket->id])}}" class="btn btn-animate btn-animate-vertical btn-outline-info">
-                                                <span>
-                                                    @if($ticket->status === 2)
-                                                        <i class="icon wb-eye" aria-hidden="true" style="left: 40%"> </i>{{trans('common.view')}}
-                                                    @else
-                                                        <i class="icon wb-check" aria-hidden="true" style="left: 40%"> </i>{{trans('common.open')}}
-                                                    @endif
-                                                </span>
-                                            </a>
-                                        </td>
+                                        <th data-cell-style="cellStyle"> #</th>
+                                        <th> {{ trans('validation.attributes.title') }} </th>
+                                        <th> {{ trans('common.status.attribute') }} </th>
+                                        <th></th>
                                     </tr>
-                                @endforeach
+                                </thead>
+                                <tbody>
+                                    @foreach ($tickets as $ticket)
+                                        <tr>
+                                            <td>{{ $ticket->id }}</td>
+                                            <td>{{ $ticket->title }}</td>
+                                            <td>{!! $ticket->status_label !!}</td>
+                                            <td>
+                                                <a class="btn btn-animate btn-animate-vertical btn-outline-info"
+                                                   href="{{ route('replyTicket', ['id' => $ticket->id]) }}">
+                                                    <span>
+                                                        @if ($ticket->status === 2)
+                                                            <i class="icon wb-eye" aria-hidden="true" style="left: 40%"> </i>{{ trans('common.view') }}
+                                                        @else
+                                                            <i class="icon wb-check" aria-hidden="true" style="left: 40%"> </i>{{ trans('common.open') }}
+                                                        @endif
+                                                    </span>
+                                                </a>
+                                            </td>
+                                        </tr>
+                                    @endforeach
                                 </tbody>
                             </table>
                         </div>
@@ -57,7 +58,7 @@
                         <div class="row">
                             <div class="col-md-12">
                                 <nav class="Page navigation float-right">
-                                    {{$tickets->links()}}
+                                    {{ $tickets->links() }}
                                 </nav>
                             </div>
                         </div>
@@ -68,7 +69,8 @@
                 <div class="panel panel-bordered">
                     <div class="panel-heading p-20">
                         <h3 class="panel-title cyan-600">
-                            <i class="icon ti-headphone-alt"></i>{{trans('user.ticket.working_hour')}}</h3>
+                            <i class="icon ti-headphone-alt"></i>{{ trans('user.ticket.service_hours') }}
+                        </h3>
                     </div>
                     <div class="panel-body pt-0">
                         <ul class="list-group list-group-dividered list-group-full vertical-align-middle">
@@ -76,12 +78,12 @@
                                 <div class="row">
                                     <div class="col-lg-5 col-4">
                                         <button class="btn btn-pure ti-time blue-700"></button>
-                                        {{trans('user.ticket.online_hour')}}
+                                        {{ trans('user.ticket.online_hour') }}
                                     </div>
                                     <div class="col-lg-7 col-8 text-right">
-                                        {{trans('common.days.work')}} 23:00 - {{trans('common.days.next')}} 11:00
+                                        {{ trans('common.days.work') }} 23:00 - {{ trans('common.days.next') }} 11:00
                                         <br>
-                                        {{trans('common.days.weekend')}} 21:00 - {{trans('common.days.next')}} 12:00
+                                        {{ trans('common.days.weekend') }} 21:00 - {{ trans('common.days.next') }} 12:00
                                     </div>
                                 </div>
                             </li>
@@ -101,28 +103,28 @@
             </div>
         </div>
     </div>
-    <div id="add_ticket_modal" class="modal fade" tabindex="-1" data-focus-on="input:first" data-keyboard="false">
+    <div class="modal fade" id="add_ticket_modal" data-focus-on="input:first" data-keyboard="false" tabindex="-1">
         <div class="modal-dialog modal-simple modal-center">
             <div class="modal-content">
                 <div class="modal-header">
-                    <button type="button" class="close" data-dismiss="modal" aria-label="{{ trans('common.close') }}">
+                    <button class="close" data-dismiss="modal" type="button" aria-label="{{ trans('common.close') }}">
                         <span aria-hidden="true">×</span>
                     </button>
-                    <h4 class="modal-title"> {{trans('user.ticket.new')}} </h4>
+                    <h4 class="modal-title"> {{ trans('user.ticket.new') }} </h4>
                 </div>
                 <div class="modal-body">
                     <div class="row">
                         <div class="col-xl-12 form-group">
-                            <input type="text" class="form-control" name="title" id="title" placeholder="{{trans('user.ticket.title_placeholder')}}">
+                            <input class="form-control" id="title" name="title" type="text" placeholder="{{ trans('user.ticket.title_placeholder') }}">
                         </div>
                         <div class="col-xl-12 form-group">
-                            <textarea class="form-control" rows="5" name="content" id="content" placeholder="{{trans('user.ticket.content_placeholder')}}"></textarea>
+                            <textarea class="form-control" id="content" name="content" rows="5" placeholder="{{ trans('user.ticket.content_placeholder') }}"></textarea>
                         </div>
                     </div>
                 </div>
                 <div class="modal-footer">
-                    <button type="button" data-dismiss="modal" class="btn btn-danger mr-auto"> {{trans('common.cancel')}} </button>
-                    <button type="button" data-dismiss="modal" class="btn btn-success" onclick="createTicket()"> {{trans('common.confirm')}} </button>
+                    <button class="btn btn-danger mr-auto" data-dismiss="modal" type="button"> {{ trans('common.cancel') }} </button>
+                    <button class="btn btn-success" data-dismiss="modal" type="button" onclick="createTicket()"> {{ trans('common.confirm') }} </button>
                 </div>
             </div>
         </div>
@@ -130,53 +132,56 @@
 @endsection
 @section('javascript')
     <script>
-      // 发起工单
-      function createTicket() {
-        const title = $('#title').val();
-        const content = $('#content').val();
-
-        if (title.trim() === '') {
-          swal.fire({
-            title: '{{trans('validation.required', ['attribute' => trans('validation.attributes.title')])}}!',
-            icon: 'warning',
-          });
-          return false;
-        }
+        // 发起工单
+        function createTicket() {
+            const title = $('#title').val();
+            const content = $('#content').val();
 
-        if (content.trim() === '') {
-          swal.fire({
-            title: '{{trans('validation.required', ['attribute' => trans('validation.attributes.content')])}}!',
-            icon: 'warning',
-          });
-          return false;
-        }
+            if (title.trim() === '') {
+                swal.fire({
+                    title: '{{ trans('validation.required', ['attribute' => trans('validation.attributes.title')]) }}!',
+                    icon: 'warning',
+                });
+                return false;
+            }
 
-        swal.fire({
-          title: '{{trans('user.ticket.submit_tips')}}',
-          icon: 'question',
-          showCancelButton: true,
-          cancelButtonText: '{{trans('common.close')}}',
-          confirmButtonText: '{{trans('common.confirm')}}',
-        }).then((result) => {
-          if (result.value) {
-            $.post('{{route('openTicket')}}', {
-              _token: '{{csrf_token()}}',
-              title: title,
-              content: content,
-            }, function(ret) {
-              if (ret.status === 'success') {
+            if (content.trim() === '') {
                 swal.fire({
-                  title: ret.message,
-                  icon: 'success',
-                  timer: 1000,
-                  showConfirmButton: false,
-                }).then(() => window.location.reload());
-              } else {
-                swal.fire({title: ret.message, icon: 'error'}).then(() => window.location.reload());
-              }
+                    title: '{{ trans('validation.required', ['attribute' => trans('validation.attributes.content')]) }}!',
+                    icon: 'warning',
+                });
+                return false;
+            }
+
+            swal.fire({
+                title: '{{ trans('user.ticket.submit_tips') }}',
+                icon: 'question',
+                showCancelButton: true,
+                cancelButtonText: '{{ trans('common.close') }}',
+                confirmButtonText: '{{ trans('common.confirm') }}',
+            }).then((result) => {
+                if (result.value) {
+                    $.post('{{ route('openTicket') }}', {
+                        _token: '{{ csrf_token() }}',
+                        title: title,
+                        content: content,
+                    }, function(ret) {
+                        if (ret.status === 'success') {
+                            swal.fire({
+                                title: ret.message,
+                                icon: 'success',
+                                timer: 1000,
+                                showConfirmButton: false,
+                            }).then(() => window.location.reload());
+                        } else {
+                            swal.fire({
+                                title: ret.message,
+                                icon: 'error'
+                            }).then(() => window.location.reload());
+                        }
+                    });
+                }
             });
-          }
-        });
-      }
+        }
     </script>
 @endsection

Some files were not shown because too many files changed in this diff