From c46fd080df304457577a68bd294f11075da480fe Mon Sep 17 00:00:00 2001 From: kuaifan Date: Tue, 5 Nov 2024 22:43:58 +0800 Subject: [PATCH] =?UTF-8?q?perf:=20=E4=BC=98=E5=8C=96=E5=9B=BD=E9=99=85?= =?UTF-8?q?=E5=8C=96=E8=AF=AD=E8=A8=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/Api/ApproveController.php | 2 +- app/Http/Controllers/Api/DialogController.php | 14 +---- app/Http/Controllers/Api/UsersController.php | 13 ++++- app/Models/File.php | 2 +- app/Models/User.php | 11 +++- app/Models/WebSocketDialogMsg.php | 4 +- app/Module/Doo.php | 54 +++++++++++++++++-- app/Tasks/AutoArchivedTask.php | 1 - app/Tasks/EmailNoticeTask.php | 4 +- app/Tasks/WebSocketDialogMsgTask.php | 26 ++++++--- .../2024_11_05_151611_add_users_lang.php | 35 ++++++++++++ 11 files changed, 133 insertions(+), 33 deletions(-) create mode 100644 database/migrations/2024_11_05_151611_add_users_lang.php diff --git a/app/Http/Controllers/Api/ApproveController.php b/app/Http/Controllers/Api/ApproveController.php index 756be9e74..30fd244fb 100755 --- a/app/Http/Controllers/Api/ApproveController.php +++ b/app/Http/Controllers/Api/ApproveController.php @@ -1034,7 +1034,7 @@ class ApproveController extends AbstractController // 更新审批 未读数量 if ($type == 'approve_reviewer' && $toUser['userid']) { $params = [ - 'userid' => [$toUser['userid'], User::auth()->userid()], + 'userid' => [$toUser['userid'], User::userid()], 'msg' => [ 'type' => 'approve', 'action' => 'unread', diff --git a/app/Http/Controllers/Api/DialogController.php b/app/Http/Controllers/Api/DialogController.php index ac2211541..479269252 100755 --- a/app/Http/Controllers/Api/DialogController.php +++ b/app/Http/Controllers/Api/DialogController.php @@ -7,6 +7,7 @@ use Request; use Redirect; use Carbon\Carbon; use App\Tasks\PushTask; +use App\Module\Doo; use App\Models\File; use App\Models\User; use App\Module\Base; @@ -1556,18 +1557,7 @@ class DialogController extends AbstractController // $msg_id = intval(Request::input("msg_id")); $language = Base::inputOrHeader('language'); - $targetLanguage = match ($language) { - "zh" => "简体中文", - "zh-CHT" => "繁体中文", - "en" => "英语", - "ko" => "韩语", - "ja" => "日语", - "de" => "德语", - "fr" => "法语", - "id" => "印度尼西亚语", - "ru" => "俄语", - default => '', - }; + $targetLanguage = Doo::getLanguages($language); // if (empty($targetLanguage)) { return Base::retError("参数错误"); diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 6ba776532..ae9cde3f7 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -331,8 +331,7 @@ class UsersController extends AbstractController $data = $user->toArray(); $data['nickname_original'] = $user->getRawOriginal('nickname'); $data['department_name'] = $user->getDepartmentName(); - // 适用默认部门下第1级负责人才能添加部门OKR - $data['department_owner'] = UserDepartment::where('parent_id',0)->where('owner_userid', $user->userid())->exists(); + $data['department_owner'] = UserDepartment::where('parent_id',0)->where('owner_userid', $user->userid)->exists(); // 适用默认部门下第1级负责人才能添加部门OKR return Base::retSuccess('success', $data); } @@ -348,6 +347,7 @@ class UsersController extends AbstractController * @apiParam {String} [tel] 电话 * @apiParam {String} [nickname] 昵称 * @apiParam {String} [profession] 职位/职称 + * @apiParam {String} [lang] 语言(比如:zh/en) * * @apiSuccess {Number} ret 返回状态码(1正确、0错误) * @apiSuccess {String} msg 返回信息(错误描述) @@ -410,6 +410,15 @@ class UsersController extends AbstractController $upLdap['employeeType'] = $profession; } } + // 语言 + if (Arr::exists($data, 'lang')) { + $lang = trim(Request::input('lang')); + if (!Doo::checkLanguage($lang)) { + return Base::retError('语言错误'); + } else { + $user->lang = $lang; + } + } // $user->save(); User::generateToken($user); diff --git a/app/Models/File.php b/app/Models/File.php index b35d674a6..4fd5d525b 100644 --- a/app/Models/File.php +++ b/app/Models/File.php @@ -941,7 +941,7 @@ class File extends AbstractModel */ public static function filePushMsg($action, $data = null, $userid = null) { - $userid = User::auth()->userid(); + $userid = User::userid(); if (empty($userid)) { return; } diff --git a/app/Models/User.php b/app/Models/User.php index 7c6fb264e..47befd70f 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -8,6 +8,7 @@ use App\Module\Base; use App\Module\Doo; use Cache; use Carbon\Carbon; +use Request; /** * App\Models\User @@ -446,6 +447,12 @@ class User extends AbstractModel if (Carbon::parse($user->line_at)->addSeconds(30)->lt(Carbon::now())) { $upArray['line_at'] = Carbon::now(); } + if (empty($user->lang) || Request::hasHeader('language')) { + $lang = Request::header('language'); + if (Doo::checkLanguage($lang) && $user->lang != $lang) { + $upArray['lang'] = $lang; + } + } if ($upArray) { $user->updateInstance($upArray); $user->save(); @@ -486,7 +493,7 @@ class User extends AbstractModel * @param int $userid 会员ID * @return self */ - public static function userid2basic($userid) + public static function userid2basic($userid, $addField = []) { global $_A; if (empty($userid)) { @@ -496,7 +503,7 @@ class User extends AbstractModel if (isset($_A["__static_userid2basic_" . $userid])) { return $_A["__static_userid2basic_" . $userid]; } - $userInfo = self::whereUserid($userid)->select(User::$basicField)->first(); + $userInfo = self::whereUserid($userid)->select(array_merge(User::$basicField, $addField))->first(); if ($userInfo) { $userInfo->online = $userInfo->getOnlineStatus(); $userInfo->department_name = $userInfo->getDepartmentName(); diff --git a/app/Models/WebSocketDialogMsg.php b/app/Models/WebSocketDialogMsg.php index 83fcb5c30..5b4f52435 100644 --- a/app/Models/WebSocketDialogMsg.php +++ b/app/Models/WebSocketDialogMsg.php @@ -630,8 +630,8 @@ class WebSocketDialogMsg extends AbstractModel $text = Base::markdown2html($text); } $text = preg_replace("/]*?alt=\"(\S+)\"[^>]*?>/", "[$1]", $text); - $text = preg_replace("/]*?>/", "[动画表情]", $text); - $text = preg_replace("/]*?>/", "[图片]", $text); + $text = preg_replace("/]*?>/", "[" . Doo::translate('动画表情') . "]", $text); + $text = preg_replace("/]*?>/", "[" . Doo::translate('图片') . "]", $text); if (!$preserveHtml) { $text = str_replace("

", "

", $text); $text = strip_tags($text); diff --git a/app/Module/Doo.php b/app/Module/Doo.php index 52125f864..4dceafe72 100644 --- a/app/Module/Doo.php +++ b/app/Module/Doo.php @@ -11,7 +11,7 @@ use FFI; class Doo { private static $doo; - private static $passphrase = "LYHevk5n"; + private static $userLanguage = ""; /** * char转为字符串 @@ -269,12 +269,58 @@ class Doo /** * 翻译 * @param $text - * @param string $type + * @param string $lang * @return string */ - public static function translate($text, string $type = ""): string + public static function translate($text, string $lang = ""): string { - return self::string(self::doo()->translate($text, $type)); + return self::string(self::doo()->translate($text, $lang ?: self::$userLanguage)); + } + + /** + * 设置语言 + * @param string|integer $lang 语言 或 会员ID + * @return void + */ + public static function setLanguage($lang) { + if (Base::isNumber($lang)) { + $lang = User::find(intval($lang))?->lang ?: ""; + } + self::$userLanguage = $lang; + } + + /** + * 获取语言列表 或 语言名称 + * @param string|false $lang + * @return string|string[] + */ + public static function getLanguages(bool $lang = false) + { + $array = [ + "zh" => "简体中文", + "zh-CHT" => "繁体中文", + "en" => "英语", + "ko" => "韩语", + "ja" => "日语", + "de" => "德语", + "fr" => "法语", + "id" => "印度尼西亚语", + "ru" => "俄语", + ]; + if ($lang !== false) { + return $array[$lang] ?? ""; + } + return $array; + } + + /** + * 检查语言是否存在 + * @param $lang + * @return bool + */ + public static function checkLanguage($lang): bool + { + return array_key_exists($lang, self::getLanguages()); } /** diff --git a/app/Tasks/AutoArchivedTask.php b/app/Tasks/AutoArchivedTask.php index 8da584f70..9bd049c72 100644 --- a/app/Tasks/AutoArchivedTask.php +++ b/app/Tasks/AutoArchivedTask.php @@ -3,7 +3,6 @@ namespace App\Tasks; @error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING); -use App\Models\AbstractModel; use App\Models\ProjectTask; use App\Module\Base; use Carbon\Carbon; diff --git a/app/Tasks/EmailNoticeTask.php b/app/Tasks/EmailNoticeTask.php index d559b839d..3c5ba372d 100644 --- a/app/Tasks/EmailNoticeTask.php +++ b/app/Tasks/EmailNoticeTask.php @@ -7,6 +7,7 @@ use App\Models\User; use App\Models\WebSocketDialogMsg; use App\Models\WebSocketDialogMsgRead; use App\Module\Base; +use App\Module\Doo; use Carbon\Carbon; use Guanguans\Notify\Factory; use Guanguans\Notify\Messages\EmailMessage; @@ -113,7 +114,8 @@ class EmailNoticeTask extends AbstractTask $dialogName = null; foreach ($items as $item) { $item->cancelAppend(); - $item->userInfo = User::userid2basic($item->userid); + $item->userInfo = User::userid2basic($item->userid, ['lang']); + Doo::setLanguage($item->userInfo->lang); $item->preview = WebSocketDialogMsg::previewMsg($item, true); $item->preview = str_replace('

', '

', $item->preview); if (empty($dialogId)) { diff --git a/app/Tasks/WebSocketDialogMsgTask.php b/app/Tasks/WebSocketDialogMsgTask.php index ae46f3862..29b217ff0 100644 --- a/app/Tasks/WebSocketDialogMsgTask.php +++ b/app/Tasks/WebSocketDialogMsgTask.php @@ -9,6 +9,7 @@ use App\Models\WebSocketDialog; use App\Models\WebSocketDialogMsg; use App\Models\WebSocketDialogMsgRead; use App\Module\Base; +use App\Module\Doo; use Carbon\Carbon; use Hhxsv5\LaravelS\Swoole\Task\Task; use Request; @@ -191,13 +192,24 @@ class WebSocketDialogMsgTask extends AbstractTask if ($dialog->type == 'group') { $umengTitle = "{$dialog->getGroupName()} ($umengTitle)"; } - $this->endArray[] = new PushUmengMsg($umengUserid, [ - 'title' => $umengTitle, - 'body' => WebSocketDialogMsg::previewMsg($msg), - 'description' => "MID:{$msg->id}", - 'seconds' => 3600, - 'badge' => 1, - ]); + $langs = User::select(['userid', 'lang']) + ->whereIn('userid', $umengUserid) + ->get() + ->groupBy('lang') + ->map(function($group) { + return $group->pluck('userid'); + }); + foreach ($langs as $lang => $uids) { + Doo::setLanguage($lang); + $umengMsg = [ + 'title' => $umengTitle, + 'body' => WebSocketDialogMsg::previewMsg($msg), + 'description' => "MID:{$msg->id}", + 'seconds' => 3600, + 'badge' => 1, + ]; + $this->endArray[] = new PushUmengMsg($uids->toArray(), $umengMsg); + } } } diff --git a/database/migrations/2024_11_05_151611_add_users_lang.php b/database/migrations/2024_11_05_151611_add_users_lang.php new file mode 100644 index 000000000..3aae71b2c --- /dev/null +++ b/database/migrations/2024_11_05_151611_add_users_lang.php @@ -0,0 +1,35 @@ +string('lang', 20)->nullable()->default('')->after('bot')->comment('语言首选项'); + } + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('users', function (Blueprint $table) { + $table->dropColumn("lang"); + }); + } +}