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 }})
+
+
+
+
+
+
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') }}
+
+
+
+
+ {{ __('admin-sections.Languages') }} |
+ {{ __('admin-sections.Last update') }} |
+
+
+
+ @foreach($project->languages as $language)
+ @php
+ $content = $contents->firstWhere('language_id', $language->id);
+ @endphp
+
+
+
+
+ {{ $language->title }}
+
+ |
+
+ {{ $content?->updated_at }}
+ |
+
+ @endforeach
+
+
+
+
+
+
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)
-
- |
+ @if($project->is_public)
+ {{ __('Yes') }}
+ @else
+ {{ __('No') }}
+ @endif
+ |
+
+
+
+
+
+
@can('delete', $project)
-
@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')
+
+
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'
+ }
+ ]
+ })
],
});
|