OneBot: Leantime 改造版源码(BOM/Univer 表格/AI 接管/品牌替换等)

This commit is contained in:
wangruiguo
2026-09-03 18:49:20 +08:00
commit d647428529
3501 changed files with 1988906 additions and 0 deletions

View File

@@ -0,0 +1,100 @@
<?php
namespace Leantime\Core\Middleware;
use Carbon\CarbonImmutable;
use Closure;
use Leantime\Core\Configuration\Environment;
use Leantime\Core\Http\IncomingRequest;
use Leantime\Core\Language;
use Leantime\Core\Support\CarbonMacros;
use Leantime\Domain\Setting\Repositories\Setting as SettingRepository;
use Symfony\Component\HttpFoundation\Response;
class Localization
{
public function __construct(
private readonly SettingRepository $settingsRepo,
private readonly Environment $config,
private readonly Language $language,
) {}
/**
* Handle the incoming request.
*
* @param IncomingRequest $request The incoming request object.
* @param Closure $next The closure to execute next.
* @return Response The response object.
*
* @throws \ReflectionException
*/
public function handle(IncomingRequest $request, Closure $next): Response
{
// Check if localization settings are already cached in the session.
// Settings rarely change mid-session, so we only fetch from DB on first load.
// When users change their settings, the settings save endpoint refreshes the session.
if (session()->has('localization.cached')) {
date_default_timezone_set(session('usersettings.timezone') ?: $this->config->defaultTimezone);
CarbonImmutable::mixin(new CarbonMacros(
session('usersettings.timezone') ?: $this->config->defaultTimezone,
str_replace('-', '_', session('usersettings.language') ?: session('companysettings.language') ?: $this->config->language),
session('usersettings.date_format') ?: $this->language->__('language.dateformat'),
session('usersettings.time_format') ?: $this->language->__('language.timeformat')
));
return $next($request);
}
// First request in session: batch-fetch all localization settings at once
$userId = session('userdata.id') ?? false;
$settingKeys = ['companysettings.language'];
if ($userId) {
$settingKeys = array_merge($settingKeys, [
"usersettings.$userId.language",
"usersettings.$userId.timezone",
"usersettings.$userId.date_format",
"usersettings.$userId.time_format",
]);
}
// Single batch query instead of 5 individual queries
$settings = $this->settingsRepo->getSettingsForKeys($settingKeys);
$companyLanguage = $settings['companysettings.language'] ?? $this->config->language;
session()->put('companysettings.language', $companyLanguage ?: $this->config->language);
if (! $userId) {
CarbonImmutable::mixin(new CarbonMacros(
$this->config->defaultTimezone,
str_replace('-', '_', session('companysettings.language')),
$this->language->__('language.dateformat'),
$this->language->__('language.timeformat')
));
session()->put('localization.cached', true);
return $next($request);
}
session()->put('usersettings.language', ($settings["usersettings.$userId.language"] ?? false) ?: session('companysettings.language'));
session()->put('usersettings.timezone', ($settings["usersettings.$userId.timezone"] ?? false) ?: $this->config->defaultTimezone);
date_default_timezone_set(session('usersettings.timezone'));
session()->put('usersettings.date_format', ($settings["usersettings.$userId.date_format"] ?? false) ?: $this->language->__('language.dateformat'));
session()->put('usersettings.time_format', ($settings["usersettings.$userId.time_format"] ?? false) ?: $this->language->__('language.timeformat'));
// Set macros for CarbonImmutable date handling
CarbonImmutable::mixin(new CarbonMacros(
session('usersettings.timezone'),
str_replace('-', '_', session('usersettings.language')),
session('usersettings.date_format'),
session('usersettings.time_format')
));
session()->put('localization.cached', true);
return $next($request);
}
}