From 2769585de0fbe751413ed528956cfc61d163dc6c Mon Sep 17 00:00:00 2001 From: Leonid Nikitin Date: Sun, 14 Apr 2024 15:27:51 +0500 Subject: [PATCH] Added the ability to add project information. --- app/application/.env.example | 2 + .../Admin/Project/About/StoreUpdate.php | 23 ++ app/application/app/Enums/Permission.php | 6 + .../Admin/Projects/AboutController.php | 54 +++++ .../Controllers/Admin/ProjectsController.php | 11 + .../Projects/About/StoreUpdateRequest.php | 29 +++ app/application/app/Models/Project.php | 5 + app/application/app/Models/ProjectContent.php | 19 ++ .../app/Policies/ProjectContentPolicy.php | 29 +++ .../Repositories/ProjectContentRepository.php | 15 ++ .../ProjectLanguageRepository.php | 15 ++ .../Services/Admin/Project/AboutService.php | 132 ++++++++++++ .../app/Services/Admin/ProjectService.php | 17 ++ .../ProjectContentCommandHandler.php | 27 +++ .../View/Components/Volt/Forms/Textarea.php | 43 ++++ .../Components/Volt/Forms/TextareaWysiwyg.php | 46 ++++ app/application/config/tinymce.php | 4 + app/application/lang/en.json | 3 +- app/application/lang/en/admin-sections.php | 5 + app/application/lang/en/permissions.php | 1 + app/application/lang/ru.json | 3 +- app/application/lang/ru/admin-sections.php | 5 + app/application/lang/ru/permissions.php | 1 + app/application/package-lock.json | 200 +++++++++++++++++- app/application/package.json | 4 +- app/application/resources/tinymce/langs/ru.js | 1 + .../admin/projects/about/_from.blade.php | 7 + .../views/admin/projects/about/edit.blade.php | 17 ++ .../admin/projects/about/languages.blade.php | 42 ++++ .../views/admin/projects/index.blade.php | 27 ++- .../views/admin/projects/show.blade.php | 32 +++ .../volt/forms/textarea-wysiwyg.blade.php | 24 +++ .../components/volt/forms/textarea.blade.php | 7 + app/application/routes/web.php | 9 +- app/application/vite.config.js | 11 +- 35 files changed, 862 insertions(+), 14 deletions(-) create mode 100644 app/application/app/Dto/Service/Admin/Project/About/StoreUpdate.php create mode 100644 app/application/app/Http/Controllers/Admin/Projects/AboutController.php create mode 100644 app/application/app/Http/Requests/Admin/Projects/About/StoreUpdateRequest.php create mode 100644 app/application/app/Models/ProjectContent.php create mode 100644 app/application/app/Policies/ProjectContentPolicy.php create mode 100644 app/application/app/Repositories/ProjectContentRepository.php create mode 100644 app/application/app/Repositories/ProjectLanguageRepository.php create mode 100644 app/application/app/Services/Admin/Project/AboutService.php create mode 100644 app/application/app/Services/ProjectContent/ProjectContentCommandHandler.php create mode 100644 app/application/app/View/Components/Volt/Forms/Textarea.php create mode 100644 app/application/app/View/Components/Volt/Forms/TextareaWysiwyg.php create mode 100644 app/application/config/tinymce.php create mode 100644 app/application/resources/tinymce/langs/ru.js create mode 100644 app/application/resources/views/admin/projects/about/_from.blade.php create mode 100644 app/application/resources/views/admin/projects/about/edit.blade.php create mode 100644 app/application/resources/views/admin/projects/about/languages.blade.php create mode 100644 app/application/resources/views/admin/projects/show.blade.php create mode 100644 app/application/resources/views/components/volt/forms/textarea-wysiwyg.blade.php create mode 100644 app/application/resources/views/components/volt/forms/textarea.blade.php diff --git a/app/application/.env.example b/app/application/.env.example index 4c6a973..61089d6 100644 --- a/app/application/.env.example +++ b/app/application/.env.example @@ -22,6 +22,8 @@ APP_MAINTENANCE_STORE=database #LOGIN_MAX_REQUEST=50 #LOGIN_MAX_EMAIL_REQUEST=10 +TINYMCE_LICENSE_KEY="gpl" + BCRYPT_ROUNDS=12 LOG_CHANNEL=stack diff --git a/app/application/app/Dto/Service/Admin/Project/About/StoreUpdate.php b/app/application/app/Dto/Service/Admin/Project/About/StoreUpdate.php new file mode 100644 index 0000000..548fe32 --- /dev/null +++ b/app/application/app/Dto/Service/Admin/Project/About/StoreUpdate.php @@ -0,0 +1,23 @@ +title; + } + + public function getDescription(): string + { + return $this->description; + } +} diff --git a/app/application/app/Enums/Permission.php b/app/application/app/Enums/Permission.php index ed427e9..c4e7416 100644 --- a/app/application/app/Enums/Permission.php +++ b/app/application/app/Enums/Permission.php @@ -8,6 +8,7 @@ enum Permission: string case Role = 'role'; case User = 'user'; case Project = 'project'; + case ProjectContent = 'project-content'; public function getPermissions(): array { @@ -15,6 +16,11 @@ public function getPermissions(): array self::AdminPanel => [ 'view' => __('permissions.Administrative panel allowed'), ], + self::ProjectContent => [ + 'view' => __('permissions.Allowed to watch'), + 'create' => __('permissions.Allowed to create'), + 'update' => __('permissions.Allowed to edit'), + ], default => $this->getBasePermissions() }; diff --git a/app/application/app/Http/Controllers/Admin/Projects/AboutController.php b/app/application/app/Http/Controllers/Admin/Projects/AboutController.php new file mode 100644 index 0000000..d315844 --- /dev/null +++ b/app/application/app/Http/Controllers/Admin/Projects/AboutController.php @@ -0,0 +1,54 @@ +user(); + $result = $this->aboutService->languages($project, $user); + if ($result->isError()) { + $this->errors($result); + } + + return view('admin/projects/about/languages', $result->getData()); + } + + public function edit(int $project, int $language, Request $request): View + { + $user = $request->user(); + $result = $this->aboutService->edit($project, $language, $user); + if ($result->isError()) { + $this->errors($result); + } + + return view('admin/projects/about/edit', $result->getData()); + } + + public function update(int $project, int $language, StoreUpdateRequest $request): RedirectResponse + { + $data = $request->getDto(); + $user = $request->user(); + $result = $this->aboutService->storeOrUpdate($project, $language, $data, $user); + if ($result->isError()) { + return redirect()->back()->withInput()->withErrors($result->getErrorsOrMessage()); + } + + return redirect()->route('admin.projects.about.edit', [ + 'project' => $project, + 'language' => $language, + ])->withSuccess($result->getMessage()); + } +} diff --git a/app/application/app/Http/Controllers/Admin/ProjectsController.php b/app/application/app/Http/Controllers/Admin/ProjectsController.php index a2253a2..3ab7a46 100644 --- a/app/application/app/Http/Controllers/Admin/ProjectsController.php +++ b/app/application/app/Http/Controllers/Admin/ProjectsController.php @@ -34,6 +34,17 @@ public function index(IndexRequest $request): View return view('admin/projects/index', $result->getData()); } + public function show(int $id, Request $request): View + { + $user = $request->user(); + $result = $this->projectService->show($id, $user); + if ($result->isError()) { + $this->errors($result); + } + + return view('admin/projects/show', $result->getData()); + } + public function create(Request $request): View { $user = $request->user(); diff --git a/app/application/app/Http/Requests/Admin/Projects/About/StoreUpdateRequest.php b/app/application/app/Http/Requests/Admin/Projects/About/StoreUpdateRequest.php new file mode 100644 index 0000000..f814182 --- /dev/null +++ b/app/application/app/Http/Requests/Admin/Projects/About/StoreUpdateRequest.php @@ -0,0 +1,29 @@ + ['required', 'string', 'max:255',], + 'description' => ['nullable', 'string',], + ]; + } + + public function getDto(): StoreUpdate + { + return new StoreUpdate( + title: $this->input('title'), + description: $this->input('description'), + ); + } +} diff --git a/app/application/app/Models/Project.php b/app/application/app/Models/Project.php index 2f6db89..6b94acb 100644 --- a/app/application/app/Models/Project.php +++ b/app/application/app/Models/Project.php @@ -47,4 +47,9 @@ public function languages(): HasMany { return $this->hasMany(ProjectLanguage::class); } + + public function contents(): HasMany + { + return $this->hasMany(ProjectContent::class); + } } diff --git a/app/application/app/Models/ProjectContent.php b/app/application/app/Models/ProjectContent.php new file mode 100644 index 0000000..b719f2e --- /dev/null +++ b/app/application/app/Models/ProjectContent.php @@ -0,0 +1,19 @@ +hasPermission('project-content.view'); + } + + public function view(User $user, ProjectContent $projectContent): bool + { + return $user->hasPermission('project-content.view'); + } + + public function create(User $user): bool + { + return $user->hasPermission('project-content.create'); + } + + public function update(User $user, ProjectContent $projectContent): bool + { + return $user->hasPermission('project-content.update'); + } +} diff --git a/app/application/app/Repositories/ProjectContentRepository.php b/app/application/app/Repositories/ProjectContentRepository.php new file mode 100644 index 0000000..0d5fc30 --- /dev/null +++ b/app/application/app/Repositories/ProjectContentRepository.php @@ -0,0 +1,15 @@ +where(['project_id' => $projectId, 'language_id' => $languageId]) + ->first(); + } +} diff --git a/app/application/app/Repositories/ProjectLanguageRepository.php b/app/application/app/Repositories/ProjectLanguageRepository.php new file mode 100644 index 0000000..eec7bb7 --- /dev/null +++ b/app/application/app/Repositories/ProjectLanguageRepository.php @@ -0,0 +1,15 @@ +where(['id' => $languageId, 'project_id' => $projectId]) + ->exists(); + } +} diff --git a/app/application/app/Services/Admin/Project/AboutService.php b/app/application/app/Services/Admin/Project/AboutService.php new file mode 100644 index 0000000..4026425 --- /dev/null +++ b/app/application/app/Services/Admin/Project/AboutService.php @@ -0,0 +1,132 @@ +projectRepository->getProjectById($projectId); + + if (is_null($project)) { + return $this->errNotFound(__('Not Found')); + } + + if ($user->cannot('viewAny', ProjectContent::class)) { + return $this->errFobidden(__('Access is denied')); + } + + return $this->result([ + 'project' => $project, + ]); + } + + public function edit(int $projectId, int $languageId, User $user): ServiceResultError | ServiceResultArray + { + $project = $this->projectRepository->getProjectById($projectId); + $language = $project?->languages()->firstWhere('id', $languageId); + + if (\is_null($project) || \is_null($language)) { + return $this->errNotFound(__('Not Found')); + } + + $content = $project->contents()->firstWhere('language_id', $languageId); + if (\is_null($content)) { + if ($user->cannot('create', ProjectContent::class)) { + return $this->errFobidden(__('Access is denied')); + } + $content = new ProjectContent(); + $content->project_id = $project->id; + $content->language_id = $language->id; + } else if($user->cannot('update', $content)) { + return $this->errFobidden(__('Access is denied')); + } + + return $this->result([ + 'project' => $project, + 'language' => $language, + 'content' => $content, + ]); + } + + public function storeOrUpdate(int $projectId, int $languageId, StoreUpdate $data, User $user): ServiceResultError | StoreUpdateResult + { + if (! $this->projectLanguageRepository->isExistsLanguageById($projectId, $languageId)) { + return $this->errNotFound(__('Not Found')); + } + + $content = $this->projectContentRepository->getContentByLanguageId($projectId, $languageId); + if (is_null($content)) { + return $this->store($projectId, $languageId, $data, $user); + } + + return $this->update($content, $data, $user); + } + + private function store(int $projectId, int $languageId, StoreUpdate $data, User $user): ServiceResultError | StoreUpdateResult + { + if ($user->cannot('create', ProjectContent::class)) { + return $this->errFobidden(__('Access is denied')); + } + try { + $aboutProject = DB::transaction(function () use ($data, $projectId, $languageId) { + $dataAboutProject = $this->getDataAboutProject($data); + + return $this->projectContentCommandHandler->handleStore($projectId, $languageId, $dataAboutProject); + }); + } catch (\Throwable $e) { + report($e); + return $this->errService(__('Server Error')); + } + + return $this->resultStoreUpdateModel($aboutProject, __('Project information has been successfully updated')); + } + + private function update(ProjectContent $content, StoreUpdate $data, User $user): ServiceResultError | StoreUpdateResult + { + if ($user->cannot('update', $content)) { + return $this->errFobidden(__('Access is denied')); + } + + try { + $aboutProject = DB::transaction(function () use ($data, $content) { + $dataAboutProject = $this->getDataAboutProject($data); + + return $this->projectContentCommandHandler->handleUpdate($content, $dataAboutProject); + }); + } catch (\Throwable $e) { + report($e); + return $this->errService(__('Server Error')); + } + + return $this->resultStoreUpdateModel($aboutProject, __('Project information has been successfully updated')); + } + + private function getDataAboutProject(StoreUpdate $data): array + { + return [ + 'title' => $data->getTitle(), + 'description' => $data->getDescription(), + ]; + } +} diff --git a/app/application/app/Services/Admin/ProjectService.php b/app/application/app/Services/Admin/ProjectService.php index a2f4d28..7b6334c 100644 --- a/app/application/app/Services/Admin/ProjectService.php +++ b/app/application/app/Services/Admin/ProjectService.php @@ -50,6 +50,23 @@ public function index(ProjectBuilderDto $projectBuilderDto, QuerySettingsDto $qu ]); } + public function show(int $id, User $user): ServiceResultError | ServiceResultArray + { + $project = $this->projectRepository->getProjectById($id); + + if (is_null($project)) { + return $this->errNotFound(__('Not Found')); + } + + if ($user->cannot('view', $project)) { + return $this->errFobidden(__('Access is denied')); + } + + return $this->result([ + 'project' => $project, + ]); + } + public function create(User $user): ServiceResultError | ServiceResultArray { if ($user->cannot('create', Project::class)) { diff --git a/app/application/app/Services/ProjectContent/ProjectContentCommandHandler.php b/app/application/app/Services/ProjectContent/ProjectContentCommandHandler.php new file mode 100644 index 0000000..dc4e711 --- /dev/null +++ b/app/application/app/Services/ProjectContent/ProjectContentCommandHandler.php @@ -0,0 +1,27 @@ +project_id = $projectId; + $content->language_id = $languageId; + + $content->fill($data); + $content->save(); + + return $content; + } + + public function handleUpdate(ProjectContent $content, array $data): ProjectContent + { + $content->update($data); + + return $content; + } +} diff --git a/app/application/app/View/Components/Volt/Forms/Textarea.php b/app/application/app/View/Components/Volt/Forms/Textarea.php new file mode 100644 index 0000000..15d1b90 --- /dev/null +++ b/app/application/app/View/Components/Volt/Forms/Textarea.php @@ -0,0 +1,43 @@ +name; + } + + private function getTitle(): string + { + return Str::ucfirst($this->title); + } + + private function getValue(): string + { + return (string) old($this->getRequestName(), $this->value); + } + + /** + * @inheritDoc + */ + public function render(): View + { + return view('components.volt.forms.textarea', [ + 'title' => $this->getTitle(), + 'name' => $this->getName(), + 'requestName' => $this->getRequestName(), + 'value' => $this->getValue(), + ]); + } +} diff --git a/app/application/app/View/Components/Volt/Forms/TextareaWysiwyg.php b/app/application/app/View/Components/Volt/Forms/TextareaWysiwyg.php new file mode 100644 index 0000000..79e02dc --- /dev/null +++ b/app/application/app/View/Components/Volt/Forms/TextareaWysiwyg.php @@ -0,0 +1,46 @@ +name; + } + + private function getTitle(): string + { + return Str::ucfirst($this->title); + } + + private function getValue(): string + { + return (string) old($this->getRequestName(), $this->value); + } + + /** + * @inheritDoc + */ + public function render(): View + { + $tinymceLicenseKey = config('tinymce.license_key'); + + return view('components.volt.forms.textarea-wysiwyg', [ + 'tinymceLicenseKey' => $tinymceLicenseKey, + 'title' => $this->getTitle(), + 'name' => $this->getName(), + 'requestName' => $this->getRequestName(), + 'value' => $this->getValue(), + ]); + } +} diff --git a/app/application/config/tinymce.php b/app/application/config/tinymce.php new file mode 100644 index 0000000..543a20c --- /dev/null +++ b/app/application/config/tinymce.php @@ -0,0 +1,4 @@ + (string) env('TINYMCE_LICENSE_KEY', 'gpl'), +]; diff --git a/app/application/lang/en.json b/app/application/lang/en.json index 431d292..a4fd870 100644 --- a/app/application/lang/en.json +++ b/app/application/lang/en.json @@ -248,5 +248,6 @@ "Add language": "Add language", "There was an error adding a language": "There was an error adding a language", "Select images": "Select images", - "loading": "loading" + "loading": "loading", + "Project information has been successfully updated": "Project information has been successfully updated" } diff --git a/app/application/lang/en/admin-sections.php b/app/application/lang/en/admin-sections.php index 2a252ee..503d7f2 100644 --- a/app/application/lang/en/admin-sections.php +++ b/app/application/lang/en/admin-sections.php @@ -5,4 +5,9 @@ 'Users' => 'Users', 'AdminPanel' => 'Admin Panel', 'Projects' => 'Projects', + 'Project' => 'Project', + 'Sections' => 'Sections', + 'About project' => 'About the project', + 'Languages' => 'Languages', + 'Last update' => 'Last update', ]; diff --git a/app/application/lang/en/permissions.php b/app/application/lang/en/permissions.php index a7ff33b..063e379 100644 --- a/app/application/lang/en/permissions.php +++ b/app/application/lang/en/permissions.php @@ -10,4 +10,5 @@ 'Administrative panel allowed' => 'Administrative panel allowed', 'AdminPanel' => 'Administrative panel allowed', 'Project' => 'Projects', + 'ProjectContent' => 'About the project', ]; diff --git a/app/application/lang/ru.json b/app/application/lang/ru.json index 07de063..0547a0e 100644 --- a/app/application/lang/ru.json +++ b/app/application/lang/ru.json @@ -248,5 +248,6 @@ "Add language": "Добавить язык", "There was an error adding a language": "Произошла ошибка при добавлении языка", "Select images": "Выберите изображения", - "loading": "загрузка" + "loading": "загрузка", + "Project information has been successfully updated": "Информация о проекте успешно обновлена" } diff --git a/app/application/lang/ru/admin-sections.php b/app/application/lang/ru/admin-sections.php index 735c23d..06e553e 100644 --- a/app/application/lang/ru/admin-sections.php +++ b/app/application/lang/ru/admin-sections.php @@ -5,4 +5,9 @@ 'Users' => 'Пользователи', 'AdminPanel' => 'Админка', 'Projects' => 'Проекты', + 'Project' => 'Проект', + 'Sections' => 'Разделы', + 'About project' => 'О проекте', + 'Languages' => 'Языки', + 'Last update' => 'Последнее обновление', ]; diff --git a/app/application/lang/ru/permissions.php b/app/application/lang/ru/permissions.php index 5444134..fac9c56 100644 --- a/app/application/lang/ru/permissions.php +++ b/app/application/lang/ru/permissions.php @@ -11,4 +11,5 @@ 'Administrative panel allowed' => 'Административная панель разрешена', 'AdminPanel' => 'Административная панель разрешена', 'Project' => 'Проекты', + 'ProjectContent' => 'О проекте', ]; diff --git a/app/application/package-lock.json b/app/application/package-lock.json index 0d815f9..85bd7ef 100644 --- a/app/application/package-lock.json +++ b/app/application/package-lock.json @@ -17,6 +17,7 @@ "simplebar": "^5.3.4", "smooth-scroll": "^16.1.3", "sweetalert2": "^11.0.18", + "tinymce": "^7.0.1", "vanillajs-datepicker": "^1.2.0", "waypoints": "^4.0.1" }, @@ -24,7 +25,8 @@ "axios": "^1.6.4", "laravel-vite-plugin": "^1.0", "sass-loader": "^13.3.2", - "vite": "^5.0" + "vite": "^5.0", + "vite-plugin-static-copy": "^1.0.2" } }, "node_modules/@esbuild/aix-ppc64": { @@ -464,6 +466,41 @@ "resolved": "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz", "integrity": "sha512-dfLbk+PwWvFzSxwk3n5ySL0hfBog779o8h68wK/7/APo/7cgyWp5jcXockbxdk5kFRkbeXWm4Fbi9FrdN381sA==" }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -1308,6 +1345,22 @@ "dev": true, "peer": true }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dev": true, + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", @@ -1315,6 +1368,15 @@ "dev": true, "peer": true }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dev": true, + "dependencies": { + "reusify": "^1.0.4" + } + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", @@ -1360,6 +1422,20 @@ "node": ">= 6" } }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "dev": true, + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -1395,8 +1471,7 @@ "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "peer": true + "dev": true }, "node_modules/has-flag": { "version": "4.0.0", @@ -1480,6 +1555,18 @@ "dev": true, "peer": true }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "dev": true, + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, "node_modules/just-extend": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-5.1.1.tgz", @@ -1536,6 +1623,28 @@ "dev": true, "peer": true }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dev": true, + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -1673,6 +1782,26 @@ "node": ">=6" } }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, "node_modules/randombytes": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", @@ -1694,6 +1823,16 @@ "node": ">=8.10.0" } }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "dev": true, + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, "node_modules/rollup": { "version": "4.13.2", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.13.2.tgz", @@ -1728,6 +1867,29 @@ "fsevents": "~2.3.2" } }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, "node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -1967,6 +2129,11 @@ } } }, + "node_modules/tinymce": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/tinymce/-/tinymce-7.0.1.tgz", + "integrity": "sha512-0a7DJnhniBx2psRuKcVQ9g4hujN6PAR4fPS0NSF1T1luH1RBDZVVEn2pGND6Ly+AW1lUm/cHOHjsasqBelMhbw==" + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -1985,6 +2152,15 @@ "dev": true, "peer": true }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "dev": true, + "engines": { + "node": ">= 10.0.0" + } + }, "node_modules/update-browserslist-db": { "version": "1.0.13", "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.13.tgz", @@ -2096,6 +2272,24 @@ "picomatch": "^2.3.1" } }, + "node_modules/vite-plugin-static-copy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/vite-plugin-static-copy/-/vite-plugin-static-copy-1.0.2.tgz", + "integrity": "sha512-AfmEF+a/mfjsUsrgjbCkhzUCeIUF4EKQXXt3Ie1cour9MBpy6f6GphbdW2td28oYfOrwCyRzFCksgLkpk58q6Q==", + "dev": true, + "dependencies": { + "chokidar": "^3.5.3", + "fast-glob": "^3.2.11", + "fs-extra": "^11.1.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0" + } + }, "node_modules/watchpack": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.1.tgz", diff --git a/app/application/package.json b/app/application/package.json index 93712ee..7fd2962 100644 --- a/app/application/package.json +++ b/app/application/package.json @@ -18,6 +18,7 @@ "simplebar": "^5.3.4", "smooth-scroll": "^16.1.3", "sweetalert2": "^11.0.18", + "tinymce": "^7.0.1", "vanillajs-datepicker": "^1.2.0", "waypoints": "^4.0.1" }, @@ -25,6 +26,7 @@ "axios": "^1.6.4", "laravel-vite-plugin": "^1.0", "sass-loader": "^13.3.2", - "vite": "^5.0" + "vite": "^5.0", + "vite-plugin-static-copy": "^1.0.2" } } diff --git a/app/application/resources/tinymce/langs/ru.js b/app/application/resources/tinymce/langs/ru.js new file mode 100644 index 0000000..eb669f9 --- /dev/null +++ b/app/application/resources/tinymce/langs/ru.js @@ -0,0 +1 @@ +tinymce.addI18n("ru",{"#":"#","Accessibility":"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0435 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438","Accordion":"","Accordion body...":"","Accordion summary...":"","Action":"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u0435","Activity":"\u0414\u0435\u044f\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u044c","Address":"\u0410\u0434\u0440\u0435\u0441","Advanced":"\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435","Align":"\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c","Align center":"\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","Align left":"\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","Align right":"\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u043f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","Alignment":"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","Alignment {0}":"","All":"\u0412\u0441\u0435","Alternative description":"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u043e\u043f\u0438\u0441\u0430\u043d\u0438\u0435","Alternative source":"\u0410\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u044b\u0439 \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a","Alternative source URL":"URL \u0430\u043b\u044c\u0442\u0435\u0440\u043d\u0430\u0442\u0438\u0432\u043d\u043e\u0433\u043e \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430","Anchor":"\u042f\u043a\u043e\u0440\u044c","Anchor...":"\u042f\u043a\u043e\u0440\u044c...","Anchors":"\u042f\u043a\u043e\u0440\u044f","Animals and Nature":"\u0416\u0438\u0432\u043e\u0442\u043d\u044b\u0435 \u0438 \u043f\u0440\u0438\u0440\u043e\u0434\u0430","Arrows":"\u0421\u0442\u0440\u0435\u043b\u043a\u0438","B":"B","Background color":"\u0426\u0432\u0435\u0442 \u0444\u043e\u043d\u0430","Background color {0}":"","Black":"\u0427\u0435\u0440\u043d\u044b\u0439","Block":"\u0411\u043b\u043e\u043a","Block {0}":"","Blockquote":"\u0411\u043b\u043e\u043a \u0446\u0438\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f","Blocks":"\u0411\u043b\u043e\u043a\u0438","Blue":"\u0421\u0438\u043d\u0438\u0439","Blue component":"\u0421\u0438\u043d\u044f\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430","Body":"\u0422\u0435\u043b\u043e","Bold":"\u0416\u0438\u0440\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442","Border":"\u0413\u0440\u0430\u043d\u0438\u0446\u0430","Border color":"\u0426\u0432\u0435\u0442 \u0433\u0440\u0430\u043d\u0438\u0446\u044b","Border style":"\u0421\u0442\u0438\u043b\u044c \u0440\u0430\u043c\u043a\u0438","Border width":"\u0428\u0438\u0440\u0438\u043d\u0430 \u0440\u0430\u043c\u043a\u0438","Bottom":"\u041f\u043e \u043d\u0438\u0437\u0443","Browse files":"","Browse for an image":"\u0412\u044b\u0431\u043e\u0440 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f","Browse links":"","Bullet list":"\u041c\u0430\u0440\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","Cancel":"\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c","Caption":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","Cell":"\u042f\u0447\u0435\u0439\u043a\u0430","Cell padding":"\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f \u044f\u0447\u0435\u0439\u043a\u0438","Cell properties":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044f\u0447\u0435\u0439\u043a\u0438","Cell spacing":"\u0412\u043d\u0435\u0448\u043d\u0438\u0439 \u043e\u0442\u0441\u0442\u0443\u043f \u044f\u0447\u0435\u0439\u043a\u0438","Cell styles":"\u0421\u0442\u0438\u043b\u0438 \u044f\u0447\u0435\u0439\u043a\u0438","Cell type":"\u0422\u0438\u043f \u044f\u0447\u0435\u0439\u043a\u0438","Center":"\u041f\u043e \u0446\u0435\u043d\u0442\u0440\u0443","Characters":"\u0421\u0438\u043c\u0432\u043e\u043b\u044b","Characters (no spaces)":"\u0421\u0438\u043c\u0432\u043e\u043b\u044b (\u0431\u0435\u0437 \u043f\u0440\u043e\u0431\u0435\u043b\u043e\u0432)","Circle":"\u041a\u0440\u0443\u0436\u043e\u043a","Class":"\u041a\u043b\u0430\u0441\u0441","Clear formatting":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","Close":"\u0417\u0430\u043a\u0440\u044b\u0442\u044c","Code":"\u041a\u043e\u0434","Code sample...":"\u041f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430...","Code view":"\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043a\u043e\u0434\u0430","Color Picker":"\u041f\u0438\u043f\u0435\u0442\u043a\u0430 \u0446\u0432\u0435\u0442\u0430","Color swatch":"\u041e\u0431\u0440\u0430\u0437\u0435\u0446 \u0446\u0432\u0435\u0442\u0430","Cols":"\u0421\u0442\u043e\u043b\u0431\u0446\u044b","Column":"\u0421\u0442\u043e\u043b\u0431\u0435\u0446","Column clipboard actions":"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u043b\u044f \u0441\u0442\u043e\u043b\u0431\u0446\u0430","Column group":"\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0442\u043e\u043b\u0431\u0446\u043e\u0432","Column header":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u043e\u043b\u0431\u0446\u0430","Constrain proportions":"\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u044c \u043f\u0440\u043e\u043f\u043e\u0440\u0446\u0438\u0438","Copy":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c","Copy column":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446","Copy row":"\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","Could not find the specified string.":"\u0417\u0430\u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0442\u0440\u043e\u043a\u0430 \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u0430/","Could not load emojis":"\u041d\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u043e\u0441\u044c \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u0438","Count":"\u041f\u043e\u0434\u0441\u0447\u0435\u0442","Currency":"\u0412\u0430\u043b\u044e\u0442\u0430","Current window":"\u0422\u0435\u043a\u0443\u0449\u0435\u0435 \u043e\u043a\u043d\u043e","Custom color":"\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0446\u0432\u0435\u0442","Custom...":"\u041d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c\u044b\u0439...","Cut":"\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c","Cut column":"\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446","Cut row":"\u0412\u044b\u0440\u0435\u0437\u0430\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","Dark Blue":"\u0422\u0435\u043c\u043d\u043e-\u0441\u0438\u043d\u0438\u0439","Dark Gray":"\u0422\u0435\u043c\u043d\u043e-\u0441\u0435\u0440\u044b\u0439","Dark Green":"\u0422\u0435\u043c\u043d\u043e-\u0437\u0435\u043b\u0435\u043d\u044b\u0439","Dark Orange":"\u0422\u0435\u043c\u043d\u043e-\u043e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439","Dark Purple":"\u0422\u0435\u043c\u043d\u043e-\u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439","Dark Red":"\u0422\u0435\u043c\u043d\u043e-\u043a\u0440\u0430\u0441\u043d\u044b\u0439","Dark Turquoise":"\u0422\u0435\u043c\u043d\u043e-\u0431\u0438\u0440\u044e\u0437\u043e\u0432\u044b\u0439","Dark Yellow":"\u0422\u0435\u043c\u043d\u043e-\u0436\u0435\u043b\u0442\u044b\u0439","Dashed":"\u0427\u0435\u0440\u0442\u043e\u0447\u043a\u0430\u043c\u0438","Date/time":"\u0414\u0430\u0442\u0430/\u0432\u0440\u0435\u043c\u044f","Decrease indent":"\u0423\u043c\u0435\u043d\u044c\u0448\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f","Default":"\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e","Delete accordion":"","Delete column":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446","Delete row":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443","Delete table":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443","Dimensions":"\u0420\u0430\u0437\u043c\u0435\u0440\u044b","Disc":"\u0422\u043e\u0447\u043a\u0430","Div":"Div","Document":"\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442","Dotted":"\u0422\u043e\u0447\u043a\u0430\u043c\u0438","Double":"\u0414\u0432\u043e\u0439\u043d\u043e\u0439","Drop an image here":"\u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u0441\u044e\u0434\u0430","Dropped file type is not supported":"\u0422\u0438\u043f \u0444\u0430\u0439\u043b\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f","Edit":"\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c","Embed":"\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434","Emojis":"\u0421\u043c\u0430\u0439\u043b\u0438\u043a\u0438","Emojis...":"\u0421\u043c\u0430\u0439\u043b\u0438\u043a\u0438...","Error":"\u041e\u0448\u0438\u0431\u043a\u0430","Error: Form submit field collision.":"\u041e\u0448\u0438\u0431\u043a\u0430: \u043a\u043e\u043d\u0444\u043b\u0438\u043a\u0442 \u043f\u043e\u043b\u0435\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0444\u043e\u0440\u043c\u044b.","Error: No form element found.":"\u041e\u0448\u0438\u0431\u043a\u0430: \u043d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d \u044d\u043b\u0435\u043c\u0435\u043d\u0442 \u0444\u043e\u0440\u043c\u044b.","Extended Latin":"\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u0430\u044f \u043b\u0430\u0442\u044b\u043d\u044c","Failed to initialize plugin: {0}":"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0438\u043d\u0438\u0446\u0438\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430: {0}","Failed to load plugin url: {0}":"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 URL \u043f\u043b\u0430\u0433\u0438\u043d\u0430: {0}","Failed to load plugin: {0} from url {1}":"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u0430: {0} \u0438\u0437 URL {1}","Failed to upload image: {0}":"\u041e\u0448\u0438\u0431\u043a\u0430 \u043f\u0440\u0438 \u043f\u0435\u0440\u0435\u0434\u0430\u0447\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f: {0}","File":"\u0424\u0430\u0439\u043b","Find":"\u041d\u0430\u0439\u0442\u0438","Find (if searchreplace plugin activated)":"\u041d\u0430\u0439\u0442\u0438 (\u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d searchreplace \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d)","Find and Replace":"\u041d\u0430\u0439\u0442\u0438 \u0438 \u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c","Find and replace...":"\u041d\u0430\u0439\u0442\u0438 \u0438 \u0437\u0430\u043c\u0435\u043d\u0438\u0442\u044c...","Find in selection":"\u0418\u0441\u043a\u0430\u0442\u044c \u0432 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u043c","Find whole words only":"\u041d\u0430\u0439\u0442\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0446\u0435\u043b\u044b\u0435 \u0441\u043b\u043e\u0432\u0430","Flags":"\u0424\u043b\u0430\u0433\u0438","Focus to contextual toolbar":"\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u043a\u043e\u043d\u0442\u0435\u043a\u0441\u0442\u043d\u043e\u0439 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432","Focus to element path":"\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0435 \u043f\u0443\u0442\u0438","Focus to menubar":"\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u043c\u0435\u043d\u044e","Focus to toolbar":"\u0424\u043e\u043a\u0443\u0441 \u043d\u0430 \u043f\u0430\u043d\u0435\u043b\u0438 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432","Font":"\u0428\u0440\u0438\u0444\u0442","Font size {0}":"","Font sizes":"\u0420\u0430\u0437\u043c\u0435\u0440 \u0448\u0440\u0438\u0444\u0442\u0430","Font {0}":"","Fonts":"\u0428\u0440\u0438\u0444\u0442\u044b","Food and Drink":"\u0415\u0434\u0430 \u0438 \u043d\u0430\u043f\u0438\u0442\u043a\u0438","Footer":"\u041d\u0438\u0436\u043d\u0438\u0439 \u043a\u043e\u043b\u043e\u043d\u0442\u0438\u0442\u0443\u043b","Format":"\u0424\u043e\u0440\u043c\u0430\u0442","Format {0}":"","Formats":"\u0424\u043e\u0440\u043c\u0430\u0442\u044b","Fullscreen":"\u041f\u043e\u043b\u043d\u044b\u0439 \u044d\u043a\u0440\u0430\u043d","G":"G","General":"\u041e\u0431\u0449\u0438\u0435","Gray":"\u0421\u0435\u0440\u044b\u0439","Green":"\u0417\u0435\u043b\u0435\u043d\u044b\u0439","Green component":"\u0417\u0435\u043b\u0435\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430","Groove":"\u041f\u0430\u0437","Handy Shortcuts":"\u0413\u043e\u0440\u044f\u0447\u0438\u0435 \u043a\u043b\u0430\u0432\u0438\u0448\u0438","Header":"\u0412\u0435\u0440\u0445\u043d\u0438\u0439 \u043a\u043e\u043b\u043e\u043d\u0442\u0438\u0442\u0443\u043b","Header cell":"\u042f\u0447\u0435\u0439\u043a\u0430 \u0432\u0435\u0440\u0445\u043d\u0435\u0433\u043e \u043a\u043e\u043b\u043e\u043d\u0442\u0438\u0442\u0443\u043b\u0430","Heading 1":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 1","Heading 2":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 2","Heading 3":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 3","Heading 4":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 4","Heading 5":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 5","Heading 6":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a 6","Headings":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0438","Height":"\u0412\u044b\u0441\u043e\u0442\u0430","Help":"\u0421\u043f\u0440\u0430\u0432\u043a\u0430","Hex color code":"HEX-\u043a\u043e\u0434 \u0446\u0432\u0435\u0442\u0430","Hidden":"\u0421\u043a\u0440\u044b\u0442\u044b\u0439","Horizontal align":"\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","Horizontal line":"\u0413\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u0430\u044f \u043b\u0438\u043d\u0438\u044f","Horizontal space":"\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u043e \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u0438","ID":"ID","ID should start with a letter, followed only by letters, numbers, dashes, dots, colons or underscores.":"ID \u0434\u043e\u043b\u0436\u0435\u043d \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u0443\u043a\u0432\u044b, \u0446\u0438\u0444\u0440\u044b, \u0447\u0435\u0440\u0442\u043e\u0447\u043a\u0443, \u0442\u043e\u0447\u043a\u0443, \u0437\u0430\u043f\u044f\u0442\u0443\u044e \u0438\u043b\u0438 \u0437\u043d\u0430\u043a \u043f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u044f.","Image is decorative":"\u0414\u0435\u043a\u043e\u0440\u0430\u0442\u0438\u0432\u043d\u043e\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","Image list":"\u0421\u043f\u0438\u0441\u043e\u043a \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0439","Image title":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f","Image...":"\u0418\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435...","ImageProxy HTTP error: Could not find Image Proxy":"\u041e\u0448\u0438\u0431\u043a\u0430 HTTP ImageProxy: \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043d\u0430\u0439\u0442\u0438 Image Proxy","ImageProxy HTTP error: Incorrect Image Proxy URL":"\u041e\u0448\u0438\u0431\u043a\u0430 HTTP ImageProxy: \u043d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 URL-\u0430\u0434\u0440\u0435\u0441 Image Proxy","ImageProxy HTTP error: Rejected request":"\u041e\u0448\u0438\u0431\u043a\u0430 HTTP ImageProxy: \u0437\u0430\u043f\u0440\u043e\u0441 \u043e\u0442\u043a\u043b\u043e\u043d\u0435\u043d","ImageProxy HTTP error: Unknown ImageProxy error":"\u041e\u0448\u0438\u0431\u043a\u0430 HTTP ImageProxy: \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u043d\u0430\u044f \u043e\u0448\u0438\u0431\u043a\u0430 ImageProxy","Increase indent":"\u0423\u0432\u0435\u043b\u0438\u0447\u0438\u0442\u044c \u043e\u0442\u0441\u0442\u0443\u043f","Inline":"\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439","Insert":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c","Insert Template":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d","Insert accordion":"","Insert column after":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043f\u0440\u0430\u0432\u0430","Insert column before":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043b\u0435\u0432\u0430","Insert date/time":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0434\u0430\u0442\u0443/\u0432\u0440\u0435\u043c\u044f","Insert image":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","Insert link (if link plugin activated)":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 (\u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d link \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d)","Insert row after":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443","Insert row before":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043f\u0443\u0441\u0442\u0443\u044e \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443","Insert table":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0442\u0430\u0431\u043b\u0438\u0446\u0443","Insert template...":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d...","Insert video":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0432\u0438\u0434\u0435\u043e","Insert/Edit code sample":"\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c/\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u0434\u0430","Insert/edit image":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c/\u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435","Insert/edit link":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443","Insert/edit media":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430","Insert/edit video":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c/\u0440\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0432\u0438\u0434\u0435\u043e","Inset":"\u0412\u0441\u0442\u0430\u0432\u043a\u0430","Invalid hex color code: {0}":"\u041d\u0435\u0432\u0435\u0440\u043d\u044b\u0439 HEX-\u043a\u043e\u0434 \u0446\u0432\u0435\u0442\u0430: {0}","Invalid input":"\u041d\u0435\u0432\u0435\u0440\u043d\u043e\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435","Italic":"\u041a\u0443\u0440\u0441\u0438\u0432","Justify":"\u0412\u044b\u0440\u043e\u0432\u043d\u044f\u0442\u044c \u0442\u0435\u043a\u0441\u0442 \u043f\u043e \u0448\u0438\u0440\u0438\u043d\u0435","Keyboard Navigation":"\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b","Language":"\u042f\u0437\u044b\u043a","Learn more...":"\u0423\u0437\u043d\u0430\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435...","Left":"\u041f\u043e \u043b\u0435\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","Left to right":"\u0421\u043b\u0435\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043e","Light Blue":"\u0421\u0432\u0435\u0442\u043b\u043e-\u0441\u0438\u043d\u0438\u0439","Light Gray":"\u0421\u0432\u0435\u0442\u043b\u043e-\u0441\u0435\u0440\u044b\u0439","Light Green":"\u0421\u0432\u0435\u0442\u043b\u043e-\u0437\u0435\u043b\u0435\u043d\u044b\u0439","Light Purple":"\u0421\u0432\u0435\u0442\u043b\u043e-\u0444\u0438\u043e\u043b\u0435\u0442\u043e\u0432\u044b\u0439","Light Red":"\u0421\u0432\u0435\u0442\u043b\u043e-\u043a\u0440\u0430\u0441\u043d\u044b\u0439","Light Yellow":"\u0421\u0432\u0435\u0442\u043b\u043e-\u0436\u0435\u043b\u0442\u044b\u0439","Line height":"\u0412\u044b\u0441\u043e\u0442\u0430 \u0441\u0442\u0440\u043e\u043a\u0438","Link list":"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0441\u044b\u043b\u043e\u043a","Link...":"\u0421\u0441\u044b\u043b\u043a\u0430...","List Properties":"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432","List properties...":"\u0421\u043f\u0438\u0441\u043e\u043a \u0441\u0432\u043e\u0439\u0441\u0442\u0432...","Loading emojis...":"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u043c\u0430\u0439\u043b\u0438\u043a\u043e\u0432...","Loading...":"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430...","Lower Alpha":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435","Lower Greek":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0433\u0440\u0435\u0447\u0435\u0441\u043a\u0438\u0435","Lower Roman":"\u0421\u0442\u0440\u043e\u0447\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435","Match case":"\u0421 \u0443\u0447\u0435\u0442\u043e\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430","Mathematical":"\u041c\u0430\u0442\u0435\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0435","Media poster (Image URL)":"\u041f\u043e\u0441\u0442\u0435\u0440 \u043c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430 (URL \u0438\u0437\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u044f)","Media...":"\u041c\u0443\u043b\u044c\u0442\u0438\u043c\u0435\u0434\u0438\u0430...","Medium Blue":"\u0421\u0440\u0435\u0434\u043d\u0438\u0439 \u0441\u0438\u043d\u0438\u0439","Medium Gray":"\u0423\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u0441\u0435\u0440\u044b\u0439","Medium Purple":"\u0423\u043c\u0435\u0440\u0435\u043d\u043d\u043e \u043f\u0443\u0440\u043f\u0443\u0440\u043d\u044b\u0439","Merge cells":"\u041e\u0431\u044a\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0438","Middle":"\u041f\u043e \u0441\u0435\u0440\u0435\u0434\u0438\u043d\u0435","Midnight Blue":"\u0427\u0435\u0440\u043d\u043e-\u0441\u0438\u043d\u0438\u0439","More...":"\u0411\u043e\u043b\u044c\u0448\u0435...","Name":"\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435/\u0418\u043c\u044f","Navy Blue":"\u0422\u0435\u043c\u043d\u043e-\u0441\u0438\u043d\u0438\u0439","New document":"\u041d\u043e\u0432\u044b\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442","New window":"\u041d\u043e\u0432\u043e\u0435 \u043e\u043a\u043d\u043e","Next":"\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c","No":"\u041d\u0435\u0442","No alignment":"\u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435 \u043d\u0435 \u0437\u0430\u0434\u0430\u043d\u043e","No color":"\u0411\u0435\u0437 \u0446\u0432\u0435\u0442\u0430","Nonbreaking space":"\u041d\u0435\u0440\u0430\u0437\u0440\u044b\u0432\u043d\u044b\u0439 \u043f\u0440\u043e\u0431\u0435\u043b","None":"\u041d\u0435\u0442","Numbered list":"\u041d\u0443\u043c\u0435\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u043f\u0438\u0441\u043e\u043a","OR":"\u0418\u041b\u0418","Objects":"\u041e\u0431\u044a\u0435\u043a\u0442\u044b","Ok":"OK","Open help dialog":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043a\u0443","Open link":"\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043f\u043e \u0441\u0441\u044b\u043b\u043a\u0435","Open link in...":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443 \u0432...","Open popup menu for split buttons":"\u041e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u043c\u0435\u043d\u044e \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u043a\u043d\u043e\u043f\u043e\u043a","Orange":"\u041e\u0440\u0430\u043d\u0436\u0435\u0432\u044b\u0439","Outset":"\u0412\u044b\u0440\u0435\u0437\u043a\u0430","Page break":"\u0420\u0430\u0437\u0440\u044b\u0432 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b","Paragraph":"\u0410\u0431\u0437\u0430\u0446","Paste":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c","Paste as text":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u043a\u0430\u043a \u0442\u0435\u043a\u0441\u0442","Paste column after":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043f\u0440\u0430\u0432\u0430","Paste column before":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u043e\u043b\u0431\u0435\u0446 \u0441\u043b\u0435\u0432\u0430","Paste is now in plain text mode. Contents will now be pasted as plain text until you toggle this option off.":"\u0412\u0441\u0442\u0430\u0432\u043a\u0430 \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432 \u0432\u0438\u0434\u0435 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430, \u043f\u043e\u043a\u0430 \u043d\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u043e\u043f\u0446\u0438\u044e.","Paste or type a link":"\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043b\u0438 \u0432\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0441\u0441\u044b\u043b\u043a\u0443","Paste row after":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u043d\u0438\u0437\u0443","Paste row before":"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0440\u043e\u043a\u0443 \u0441\u0432\u0435\u0440\u0445\u0443","Paste your embed code below:":"\u0412\u0441\u0442\u0430\u0432\u044c\u0442\u0435 \u0432\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 \u043a\u043e\u0434 \u043d\u0438\u0436\u0435:","People":"\u041b\u044e\u0434\u0438","Plugins":"\u041f\u043b\u0430\u0433\u0438\u043d\u044b","Plugins installed ({0}):":"\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u043b\u0430\u0433\u0438\u043d\u044b ({0}):","Powered by {0}":"\u041f\u043e\u0434 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\u043c {0}","Pre":"Pre","Preferences":"\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u044f","Preformatted":"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439","Premium plugins:":"\u041f\u0440\u0435\u043c\u0438\u0443\u043c \u043f\u043b\u0430\u0433\u0438\u043d\u044b:","Press the Up and Down arrow keys to resize the editor.":"","Press the arrow keys to resize the editor.":"","Press {0} for help":"","Preview":"\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440","Previous":"\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439","Print":"\u041f\u0435\u0447\u0430\u0442\u044c","Print...":"\u041d\u0430\u043f\u0435\u0447\u0430\u0442\u0430\u0442\u044c...","Purple":"\u0420\u043e\u0437\u043e\u0432\u044b\u0439","Quotations":"\u0426\u0438\u0442\u0430\u0442\u044b","R":"R","Range 0 to 255":"\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043e\u0442 0 \u0434\u043e 255","Red":"\u041a\u0440\u0430\u0441\u043d\u044b\u0439","Red component":"\u041a\u0440\u0430\u0441\u043d\u0430\u044f \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430","Redo":"Redo","Remove":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c","Remove color":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0446\u0432\u0435\u0442","Remove link":"\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0441\u044b\u043b\u043a\u0443","Replace":"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c","Replace all":"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u0432\u0441\u0435","Replace with":"\u0417\u0430\u043c\u0435\u043d\u0438\u0442\u044c \u043d\u0430","Resize":"\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440","Restore last draft":"\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u0447\u0435\u0440\u043d\u043e\u0432\u0438\u043a","Reveal or hide additional toolbar items":"","Rich Text Area":"\u041f\u043e\u043b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430","Rich Text Area. Press ALT-0 for help.":"\u041f\u043e\u043b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 ALT-0, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043a\u0443.","Rich Text Area. Press ALT-F9 for menu. Press ALT-F10 for toolbar. Press ALT-0 for help":"\u041f\u043e\u043b\u0435 \u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u043e\u0433\u043e \u0442\u0435\u043a\u0441\u0442\u0430. \u041d\u0430\u0436\u043c\u0438\u0442\u0435 ALT-F9, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043c\u0435\u043d\u044e, ALT-F10, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u043f\u0430\u043d\u0435\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432, ALT-0, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0441\u043f\u0440\u0430\u0432\u043a\u0443.","Ridge":"\u0428\u0438\u043f","Right":"\u041f\u043e \u043f\u0440\u0430\u0432\u043e\u043c\u0443 \u043a\u0440\u0430\u044e","Right to left":"\u0421\u043f\u0440\u0430\u0432\u0430 \u043d\u0430\u043b\u0435\u0432\u043e","Row":"\u0421\u0442\u0440\u043e\u043a\u0430","Row clipboard actions":"\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f \u0441 \u0431\u0443\u0444\u0435\u0440\u043e\u043c \u043e\u0431\u043c\u0435\u043d\u0430 \u0434\u043b\u044f \u0441\u0442\u0440\u043e\u043a\u0438","Row group":"\u0413\u0440\u0443\u043f\u043f\u0430 \u0441\u0442\u0440\u043e\u043a","Row header":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0441\u0442\u0440\u043e\u043a\u0438","Row properties":"\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0441\u0442\u0440\u043e\u043a\u0438","Row type":"\u0422\u0438\u043f \u0441\u0442\u0440\u043e\u043a\u0438","Rows":"\u0421\u0442\u0440\u043e\u043a\u0438","Save":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c","Save (if save plugin activated)":"\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c (\u0435\u0441\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d save \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d)","Scope":"\u041e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u044f","Search":"\u041f\u043e\u0438\u0441\u043a","Select all":"\u0412\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0432\u0441\u0435","Select...":"\u0412\u044b\u0431\u0440\u0430\u0442\u044c...","Selection":"\u0412\u044b\u0431\u043e\u0440","Shortcut":"\u0411\u044b\u0441\u0442\u0440\u0430\u044f \u043a\u043b\u0430\u0432\u0438\u0448\u0430","Show blocks":"\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438","Show caption":"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043f\u043e\u0434\u043f\u0438\u0441\u044c","Show invisible characters":"\u041f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0442\u044c \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b","Size":"\u0420\u0430\u0437\u043c\u0435\u0440","Solid":"\u0421\u043f\u043b\u043e\u0448\u043d\u043e\u0439","Source":"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043e\u0431\u044a\u0435\u043a\u0442","Source code":"\u0418\u0441\u0445\u043e\u0434\u043d\u044b\u0439 \u043a\u043e\u0434","Special Character":"\u0421\u043f\u0435\u0446\u0438\u0430\u043b\u044c\u043d\u044b\u0439 \u0441\u0438\u043c\u0432\u043e\u043b","Special character...":"\u0421\u043f\u0435\u0446. \u0441\u0438\u043c\u0432\u043e\u043b\u044b...","Split cell":"\u0420\u0430\u0437\u0431\u0438\u0442\u044c \u044f\u0447\u0435\u0439\u043a\u0443","Square":"\u041a\u0432\u0430\u0434\u0440\u0430\u0442","Start list at number":"\u041d\u0430\u0447\u0430\u0442\u044c \u043d\u0443\u043c\u0435\u0440\u0430\u0446\u0438\u044e \u0441","Strikethrough":"\u0417\u0430\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435","Style":"\u0421\u0442\u0438\u043b\u044c","Subscript":"\u041f\u043e\u0434\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439","Superscript":"\u041d\u0430\u0434\u0441\u0442\u0440\u043e\u0447\u043d\u044b\u0439","Switch to or from fullscreen mode":"\u041f\u0435\u0440\u0435\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u043b\u043d\u043e\u044d\u043a\u0440\u0430\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c","Symbols":"\u0421\u0438\u043c\u0432\u043e\u043b\u044b","System Font":"\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0448\u0440\u0438\u0444\u0442","Table":"\u0422\u0430\u0431\u043b\u0438\u0446\u0430","Table caption":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0442\u0430\u0431\u043b\u0438\u0446\u044b","Table properties":"\u0421\u0432\u043e\u0439\u0441\u0442\u0432\u0430 \u0442\u0430\u0431\u043b\u0438\u0446\u044b","Table styles":"\u0421\u0442\u0438\u043b\u0438 \u0442\u0430\u0431\u043b\u0438\u0446\u044b","Template":"\u0428\u0430\u0431\u043b\u043e\u043d","Templates":"\u0428\u0430\u0431\u043b\u043e\u043d\u044b","Text":"\u0422\u0435\u043a\u0441\u0442","Text color":"\u0426\u0432\u0435\u0442 \u0442\u0435\u043a\u0441\u0442\u0430","Text color {0}":"","Text to display":"\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442","The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 URL \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0430\u0434\u0440\u0435\u0441\u043e\u043c \u044d\u043b\u0435\u043a\u0442\u0440\u043e\u043d\u043d\u043e\u0439 \u043f\u043e\u0447\u0442\u044b. \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \xabmailto:\xbb?","The URL you entered seems to be an external link. Do you want to add the required http:// prefix?":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 URL \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u043e\u0439. \u0412\u044b \u0436\u0435\u043b\u0430\u0435\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 \xabhttp://\xbb?","The URL you entered seems to be an external link. Do you want to add the required https:// prefix?":"\u0412\u0432\u0435\u0434\u0435\u043d\u043d\u044b\u0439 \u0412\u0430\u043c\u0438 URL-\u0430\u0434\u0440\u0435\u0441 \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u0432\u043d\u0435\u0448\u043d\u0435\u0439 \u0441\u0441\u044b\u043b\u043a\u043e\u0439. \u0425\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0439 \u043f\u0440\u0435\u0444\u0438\u043a\u0441 https: //?","Title":"\u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a","To open the popup, press Shift+Enter":"\u0427\u0442\u043e\u0431\u044b \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0432\u0441\u043f\u043b\u044b\u0432\u0430\u044e\u0449\u0435\u0435 \u043e\u043a\u043d\u043e, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 Shift+Enter","Toggle accordion":"","Tools":"\u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u044b","Top":"\u041f\u043e \u0432\u0435\u0440\u0445\u0443","Travel and Places":"\u041f\u0443\u0442\u0435\u0448\u0435\u0441\u0442\u0432\u0438\u044f \u0438 \u043c\u0435\u0441\u0442\u0430","Turquoise":"\u0411\u0438\u0440\u044e\u0437\u043e\u0432\u044b\u0439","Underline":"\u041f\u043e\u0434\u0447\u0435\u0440\u043a\u0438\u0432\u0430\u043d\u0438\u0435","Undo":"Undo","Upload":"\u041f\u0435\u0440\u0435\u0434\u0430\u0442\u044c","Uploading image":"\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u043a\u0438","Upper Alpha":"\u0417\u0430\u0433\u043b\u0430\u0432\u043d\u044b\u0435 \u043b\u0430\u0442\u0438\u043d\u0441\u043a\u0438\u0435","Upper Roman":"\u041f\u0440\u043e\u043f\u0438\u0441\u043d\u044b\u0435 \u0440\u0438\u043c\u0441\u043a\u0438\u0435","Url":"URL-\u0430\u0434\u0440\u0435\u0441","User Defined":"\u041e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u0435\u043c\u044b\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c","Valid":"\u0414\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0439","Version":"\u0412\u0435\u0440\u0441\u0438\u044f","Vertical align":"\u0412\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","Vertical space":"\u0418\u043d\u0442\u0435\u0440\u0432\u0430\u043b \u043f\u043e \u0432\u0435\u0440\u0442\u0438\u043a\u0430\u043b\u0438","View":"\u0412\u0438\u0434","Visual aids":"\u0412\u0438\u0437\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438","Warn":"\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435","White":"\u0411\u0435\u043b\u044b\u0439","Width":"\u0428\u0438\u0440\u0438\u043d\u0430","Word count":"\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043b\u043e\u0432","Words":"\u0421\u043b\u043e\u0432\u0430","Words: {0}":"\u0421\u043b\u043e\u0432: {0}","Yellow":"\u0416\u0435\u043b\u0442\u044b\u0439","Yes":"\u0414\u0430","You are using {0}":"\u0412\u044b \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 {0}","You have unsaved changes are you sure you want to navigate away?":"\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f. \u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u0439\u0442\u0438?","Your browser doesn't support direct access to the clipboard. Please use the Ctrl+X/C/V keyboard shortcuts instead.":"\u0412\u0430\u0448 \u0431\u0440\u0430\u0443\u0437\u0435\u0440 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043f\u0440\u044f\u043c\u043e\u0439 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u0431\u0443\u0444\u0435\u0440\u0443 \u043e\u0431\u043c\u0435\u043d\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0441\u043e\u0447\u0435\u0442\u0430\u043d\u0438\u044f \u043a\u043b\u0430\u0432\u0438\u0448: Ctrl+X/C/V.","alignment":"\u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435","austral sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0430\u0443\u0441\u0442\u0440\u0430\u043b\u0430","cedi sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0441\u0435\u0434\u0438","colon sign":"\u0414\u0432\u043e\u0435\u0442\u043e\u0447\u0438\u0435","cruzeiro sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043a\u0440\u0443\u0437\u0435\u0439\u0440\u043e","currency sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0432\u0430\u043b\u044e\u0442\u044b","dollar sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0434\u043e\u043b\u043b\u0430\u0440\u0430","dong sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0434\u043e\u043d\u0433\u0430","drachma sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0434\u0440\u0430\u0445\u043c\u044b","euro-currency sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0435\u0432\u0440\u043e","example":"\u043f\u0440\u0438\u043c\u0435\u0440","formatting":"\u0444\u043e\u0440\u043c\u0430\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435","french franc sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0444\u0440\u0430\u043d\u0446\u0443\u0437\u0441\u043a\u043e\u0433\u043e \u0444\u0440\u0430\u043d\u043a\u0430","german penny symbol":"\u0441\u0438\u043c\u0432\u043e\u043b \u043f\u0444\u0435\u043d\u043d\u0438\u0433\u0430","guarani sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0433\u0443\u0430\u0440\u0430\u043d\u0438","history":"\u0438\u0441\u0442\u043e\u0440\u0438\u044f","hryvnia sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0433\u0440\u0438\u0432\u043d\u0438","indentation":"\u043e\u0442\u0441\u0442\u0443\u043f","indian rupee sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0438\u043d\u0434\u0438\u0439\u0441\u043a\u043e\u0439 \u0440\u0443\u043f\u0438\u0438","kip sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043a\u0438\u043f\u044b","lira sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043b\u0438\u0440\u044b","livre tournois sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043b\u0438\u0432\u0440\u044b","manat sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043c\u0430\u043d\u0430\u0442\u0430","mill sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0434\u0435\u0441\u044f\u0442\u043e\u0439 \u0447\u0430\u0441\u0442\u0438 \u0446\u0435\u043d\u0442\u0430","naira sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043d\u0430\u0439\u0440\u044b","new sheqel sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0448\u0435\u043a\u0435\u043b\u044f","nordic mark sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043c\u0430\u0440\u043a\u0438","peseta sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043f\u0435\u0441\u0435\u0442\u044b","peso sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u043f\u0435\u0441\u043e","ruble sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0440\u0443\u0431\u043b\u044f","rupee sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0440\u0443\u043f\u0438\u0438","spesmilo sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0441\u043f\u0435\u0441\u043c\u0438\u043b\u043e","styles":"\u0441\u0442\u0438\u043b\u0438","tenge sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0442\u0435\u043d\u044c\u0433\u0435","tugrik sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0442\u0443\u0433\u0440\u0438\u043a\u0430","turkish lira sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0442\u0443\u0440\u0435\u0446\u043a\u043e\u0439 \u043b\u0438\u0440\u044b","won sign":"\u0421\u0438\u043c\u0432\u043e\u043b \u0432\u043e\u043d\u044b","yen character":"\u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0435\u043d\u044b","yen/yuan character variant one":"\u0441\u0438\u043c\u0432\u043e\u043b \u0438\u0435\u043d\u044b/\u044e\u0430\u043d\u044f, \u0432\u0430\u0440\u0438\u0430\u043d\u0442 1","yuan character":"\u0441\u0438\u043c\u0432\u043e\u043b \u044e\u0430\u043d\u044f","yuan character, in hong kong and taiwan":"\u0421\u0438\u043c\u0432\u043e\u043b \u044e\u0430\u043d\u044f, \u0413\u043e\u043d\u043a\u043e\u043d\u0433 \u0438 \u0422\u0430\u0439\u0432\u0430\u043d\u044c","{0} characters":"{0} \u0441\u0438\u043c\u0432\u043e\u043b.","{0} columns, {1} rows":"","{0} words":"{0} \u0441\u043b\u043e\u0432"}); \ No newline at end of file diff --git a/app/application/resources/views/admin/projects/about/_from.blade.php b/app/application/resources/views/admin/projects/about/_from.blade.php new file mode 100644 index 0000000..6057481 --- /dev/null +++ b/app/application/resources/views/admin/projects/about/_from.blade.php @@ -0,0 +1,7 @@ +@csrf + + + +@canany(['create', 'update'], $content) + +@endcanany diff --git a/app/application/resources/views/admin/projects/about/edit.blade.php b/app/application/resources/views/admin/projects/about/edit.blade.php new file mode 100644 index 0000000..bfd057d --- /dev/null +++ b/app/application/resources/views/admin/projects/about/edit.blade.php @@ -0,0 +1,17 @@ +@section('meta_title', __('admin-sections.Project') . ': ' . $project->name) +@section('h1', __('admin-sections.Project') . ': ' . $project->name) + +
+
+
+
+

{{ __('admin-sections.About project') }} ({{ $language->title }})

+
+ @method('PUT') + @include('admin.projects.about._from') +
+
+
+
+
+
diff --git a/app/application/resources/views/admin/projects/about/languages.blade.php b/app/application/resources/views/admin/projects/about/languages.blade.php new file mode 100644 index 0000000..8ee9395 --- /dev/null +++ b/app/application/resources/views/admin/projects/about/languages.blade.php @@ -0,0 +1,42 @@ +@section('meta_title', __('admin-sections.Project') . ': ' . $project->name) +@section('h1', __('admin-sections.Project') . ': ' . $project->name) +@php + $contents = $project->contents; +@endphp + +
+
+

{{ __('admin-sections.About project') }}

+
+ + + + + + + + + @foreach($project->languages as $language) + @php + $content = $contents->firstWhere('language_id', $language->id); + @endphp + + + + + @endforeach + +
{{ __('admin-sections.Languages') }}{{ __('admin-sections.Last update') }}
+ + + + + {{ $language->title }} + + + {{ $content?->updated_at }} +
+
+
+
+
diff --git a/app/application/resources/views/admin/projects/index.blade.php b/app/application/resources/views/admin/projects/index.blade.php index 08ca5f1..637b497 100644 --- a/app/application/resources/views/admin/projects/index.blade.php +++ b/app/application/resources/views/admin/projects/index.blade.php @@ -11,6 +11,7 @@ {{ __('validation.attributes.name') }} {{ __('validation.attributes.code') }} {{ __('validation.attributes.http_host') }} + {{ __('validation.attributes.is_public') }} @@ -18,9 +19,9 @@ @foreach($projects as $project) - - - + + {{ $project->name }} @@ -32,12 +33,26 @@ {{ $project->http_host }} + @if($project->is_public) + {{ __('Yes') }} + @else + {{ __('No') }} + @endif + + + + + + + @can('delete', $project) -
+
@csrf @method('DELETE') -
@endcan diff --git a/app/application/resources/views/admin/projects/show.blade.php b/app/application/resources/views/admin/projects/show.blade.php new file mode 100644 index 0000000..119d2a6 --- /dev/null +++ b/app/application/resources/views/admin/projects/show.blade.php @@ -0,0 +1,32 @@ +@section('meta_title', __('admin-sections.Project') . ': ' . $project->name) +@section('h1', __('admin-sections.Project') . ': ' . $project->name) + + @include('admin.projects._top') +
+
+
+ + + + + + + + @can('viewAny', \App\Models\ProjectContent::class) + + + + @endcan + +
{{ __('admin-sections.Sections') }}
+ + + + + {{ __('admin-sections.About project') }} + +
+
+
+
+ diff --git a/app/application/resources/views/components/volt/forms/textarea-wysiwyg.blade.php b/app/application/resources/views/components/volt/forms/textarea-wysiwyg.blade.php new file mode 100644 index 0000000..32ddf08 --- /dev/null +++ b/app/application/resources/views/components/volt/forms/textarea-wysiwyg.blade.php @@ -0,0 +1,24 @@ +
+ + + @error($requestName) + {{ $message }} + @enderror +
+@pushOnce('scripts') + + +@endpushonce diff --git a/app/application/resources/views/components/volt/forms/textarea.blade.php b/app/application/resources/views/components/volt/forms/textarea.blade.php new file mode 100644 index 0000000..0be825c --- /dev/null +++ b/app/application/resources/views/components/volt/forms/textarea.blade.php @@ -0,0 +1,7 @@ +
+ + + @error($requestName) + {{ $message }} + @enderror +
diff --git a/app/application/routes/web.php b/app/application/routes/web.php index 1107c8e..9e6b87d 100644 --- a/app/application/routes/web.php +++ b/app/application/routes/web.php @@ -18,7 +18,14 @@ Route::resource('roles', \App\Http\Controllers\Admin\RolesController::class)->only(['index', 'create', 'store', 'edit', 'update', 'destroy'])->where(['role' => '[0-9]+']); - Route::resource('projects', \App\Http\Controllers\Admin\ProjectsController::class)->only(['index', 'create', 'store', 'edit', 'update', 'destroy'])->where(['project' => '[0-9]+']); + Route::resource('projects', \App\Http\Controllers\Admin\ProjectsController::class)->where(['project' => '[0-9]+']); + Route::prefix('projects/{project}')->as('projects.')->group(function () { + + Route::get('about', [\App\Http\Controllers\Admin\Projects\AboutController::class, 'languages'])->name('about.languages'); + Route::get('about/{language}', [\App\Http\Controllers\Admin\Projects\AboutController::class, 'edit'])->name('about.edit')->where(['language' => '[0-9]+']); + Route::put('about/{language}', [\App\Http\Controllers\Admin\Projects\AboutController::class, 'update'])->name('about.update')->where(['language' => '[0-9]+']); + + })->where(['project' => '[0-9]+']); Route::post('languages/new-language', [\App\Http\Controllers\Admin\LanguagesController::class, 'newLanguage'])->name('new-language'); }); diff --git a/app/application/vite.config.js b/app/application/vite.config.js index 1563b46..dd794b1 100644 --- a/app/application/vite.config.js +++ b/app/application/vite.config.js @@ -1,14 +1,23 @@ import { defineConfig } from 'vite'; import laravel from 'laravel-vite-plugin'; +import { viteStaticCopy } from 'vite-plugin-static-copy' export default defineConfig({ plugins: [ laravel({ input: [ 'resources/volt/scss/app.scss', - 'resources/volt/js/app.js' + 'resources/volt/js/app.js', ], refresh: true, }), + viteStaticCopy({ + targets: [ + { + src: ['node_modules/tinymce/*', 'resources/tinymce/*'], + dest: 'tinymce' + } + ] + }) ], });