1
0

Telegram.php 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. <?php
  2. namespace App\Http\Middleware;
  3. use Closure;
  4. class Telegram
  5. {
  6. /**
  7. * Handle an incoming request.
  8. *
  9. * @return mixed
  10. */
  11. public function handle($request, Closure $next)
  12. {
  13. $token = sysConfig('telegram_token');
  14. $access_token = $request->header('x-telegram-bot-api-secret-token');
  15. // 根据用户 language_code 设置语言
  16. $this->setLocaleFromRequest($request);
  17. if (isset($token, $access_token) && hash_equals(hash('sha256', explode(':', $token)[1]), $access_token)) {
  18. return $next($request);
  19. }
  20. abort(500, 'authentication failed');
  21. }
  22. /**
  23. * 从 Telegram 请求中提取 language_code 并设置语言.
  24. */
  25. private function setLocaleFromRequest($request): void
  26. {
  27. $data = $request->all();
  28. if (! isset($data['message']['from']['language_code'])) {
  29. return;
  30. }
  31. $languageCode = $data['message']['from']['language_code'];
  32. $locale = $this->getLocaleFromLanguageCode($languageCode);
  33. app()->setLocale($locale);
  34. }
  35. /**
  36. * Telegram language_code 转换为 Laravel locale.
  37. */
  38. private function getLocaleFromLanguageCode(string $languageCode): string
  39. {
  40. // 常见 Telegram 语言代码映射
  41. $mapping = [
  42. 'zh-hans' => 'zh_CN', // 简体中文
  43. 'zh-hant' => 'zh_CN', // 繁體中文
  44. 'ja' => 'ja', // 日本語
  45. 'ko' => 'ko', // 한국어
  46. 'ru' => 'ru', // Русский
  47. 'de' => 'de', // Deutsch
  48. 'vi' => 'vi', // Tiếng Việt
  49. 'en' => 'en',
  50. 'fa' => 'fa',
  51. ];
  52. return $mapping[$languageCode] ?? config('app.locale', 'en');
  53. }
  54. }