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");
+ });
+ }
+}