few updates

master
Константин 2023-11-09 11:13:17 +03:00
parent 4c4e6e7016
commit 58f213ae23
23 changed files with 1264 additions and 187 deletions

View File

@ -0,0 +1,48 @@
<?php
namespace App\Http\Controllers\Api\Localization;
use App\Http\Controllers\Controller;
use App\Models\Localization\Locale;
use App\Transformers\Localization\LocaleTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
class LocalesController extends Controller {
protected Locale $model;
public function __construct(Locale $model) {
$this->model = $model;
}
public function index(Request $request): JsonResponse {
$query = $this->model->query();
$paginator = $query->paginate(config('app.pagination_limit'));
return fractal($paginator, new LocaleTransformer())->respond();
}
public function show(Request $request, $id): JsonResponse {
$model = $this->model->byUuid($id)->firstOrFail();
return fractal($model, new LocaleTransformer())->respond();
}
public function menu(Request $request): JsonResponse {
return fractal($this->model->query()->enabled()->get(), new LocaleTransformer())->respond();
}
public function store(Request $request): void {
}
public function update(Request $request, $uuid): void {
}
public function destroy(Request $request, $uuid): JsonResponse {
$model = $this->model->byUuid($uuid)->firstOrFail();
$model->delete();
return response()->json(null, 204);
}
}

View File

@ -2,6 +2,7 @@
namespace App\Http;
use App\Http\Middleware\Localization;
use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel
@ -42,6 +43,7 @@ class Kernel extends HttpKernel
'api' => [
'throttle:api',
Localization::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
\TomLerendu\LaravelConvertCaseMiddleware\ConvertRequestToSnakeCase::class,
\TomLerendu\LaravelConvertCaseMiddleware\ConvertResponseToCamelCase::class,

View File

@ -21,7 +21,7 @@ class CORS
$response->headers->set("Access-Control-Allow-Origin", "*");
$response->headers->set("Access-Control-Allow-Credentials", "true");
$response->headers->set("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE, PUT, PATCH"); //Make sure you remove those you do not want to support
$response->headers->set("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization, X-Requested-With, Application");
$response->headers->set("Access-Control-Allow-Headers", "Content-Type, Accept, Authorization, X-Requested-With, Application, Locale");
return $response;
}

View File

@ -0,0 +1,16 @@
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\App;
class Localization {
public function handle(Request $request, Closure $next) {
if ($locale = $request->header('Locale')) {
App::setLocale($locale);
Carbon::setLocale($locale);
}
return $next($request);
}
}

View File

@ -0,0 +1,61 @@
<?php
namespace App\Models\Localization;
use App\Support\RelationValuesTrait;
use App\Support\UuidScopeTrait;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Support\Facades\App;
class Locale extends Model {
use UuidScopeTrait, SoftDeletes, RelationValuesTrait;
protected $dates = [
];
protected $fillable = [
'uuid',
'name',
'name_iso',
'title',
'is_enabled',
'is_default'
];
protected $hidden = [
'id'
];
public function scopeEnabled($query) {
return $query->where(['is_enabled' => true]);
}
public function getIsActiveAttribute(): bool {
return $this->name === App::getLocale();
}
public function toggle(): bool {
return $this->is_enabled ? $this->disable() : $this->enable();
}
public function enable(): bool {
return $this->update(['is_enabled' => true]);
}
public function disable(): bool {
return $this->update(['is_enabled' => false]);
}
public function setAsDefault(): bool {
self::query()->where(['is_default' => true])->update(['is_default' => false]);
return $this->update(['is_default' => true]);
}
public static function default() {
return self::query()->where(['is_default' => 1])->first();
}
}

View File

@ -2,6 +2,7 @@
namespace App\Models\Pages;
use App\Models\Asset;
use App\Models\Objects\Field;
use App\Models\Publications\Publication;
use App\Models\Registries\Registry;
@ -25,11 +26,14 @@ class Page extends Model {
protected $fillable = [
'uuid',
'parent_id',
'picture_id',
'slug',
'type',
'sub_type',
'name',
'title',
'description',
'keywords',
'h1',
'ord'
];
@ -51,6 +55,10 @@ class Page extends Model {
return $this->hasMany(Page::class, 'parent_id', 'parent_id');
}
public function picture(): BelongsTo {
return $this->belongsTo(Asset::class);
}
public function sections(): MorphToMany {
return $this->objects()->wherePivot('group', '=', 'sections');
}

View File

@ -2,12 +2,14 @@
namespace App\Services\Forms\Pages;
use App\Models\Asset;
use App\Models\Objects\FieldType;
use App\Models\Pages\Page;
use App\Models\Pages\PageSubType;
use App\Models\Pages\PageType;
use App\Models\Registries\RegistryType;
use App\Services\Forms\FormsService;
use App\Transformers\Assets\AssetTransformer;
use App\Transformers\Pages\PageTransformer;
use Illuminate\Http\JsonResponse;
use Illuminate\Support\Str;
@ -19,13 +21,16 @@ class PageForms extends FormsService {
$model = Page::byUuid($id)->first();
$groups = [
[
'name' => 'common', 'fields' => $this->commonGroupFields($model),
'name' => 'common', 'title' => 'Основные свойства страницы', 'fields' => $this->commonGroupFields($model),
'dynamic' => [
['field' => 'type', 'hide' => ['registry_type', 'subtype']],
['field' => 'type', 'value' => PageType::REGISTRY, 'show' => ['registry_type']],
['field' => 'type', 'value' => PageType::PUBLICATIONS, 'show' => ['subtype']]
]
],
[
'name' => 'seo', 'title' => 'Мета данные', 'fields' => $this->seoGroupFields($model)
]
];
return ['title' => $this->formTitle($model), 'data' => $groups];
@ -70,16 +75,54 @@ class PageForms extends FormsService {
'required' => true,
'options' => $this->getRelationItems(PageSubType::TITLES),
'value' => $this->getRelationValue(PageSubType::TITLES, $model->sub_type ?? null)
],
[
'name' => 'picture',
'title' => 'Изображение',
'type' => FieldType::IMAGE,
'value' => ($v = $model->picture ?? null) ? fractal($v, new AssetTransformer()) : null
]
];
return ['data' => $fields];
}
public function seoGroupFields(?Page $model): array {
$fields = [
[
'name' => 'h1',
'title' => 'Заголовок H1',
'type' => FieldType::STRING,
'value' => $model->keywords ?? null
],
[
'name' => 'title',
'title' => 'Title страницы',
'type' => FieldType::STRING,
'value' => $model->title ?? null
],
[
'name' => 'description',
'title' => 'Описание',
'type' => FieldType::TEXT,
'value' => $model->description ?? null
],
[
'name' => 'keywords',
'title' => 'Ключевые слова',
'type' => FieldType::STRING,
'value' => $model->keywords ?? null
],
];
return ['data' => $fields];
}
public function store(array $data): ?JsonResponse {
$parent = Page::byUuid($data['parent'] ?? null)->first();
$data['parent_id'] = $parent->id ?? 0;
$data['picture_id'] = ($v = Asset::byUuid($data['picture'] ?? null)->first()) ? $v->id : null;
$data['slug'] = $data['slug'] ?? Str::slug(Str::transliterate($data['name'] ?? null));
$model = Page::create($data);
$model->update(['ord' => $model->getMaxOrd()]);
@ -89,6 +132,7 @@ class PageForms extends FormsService {
public function update(string $id, array $data): ?JsonResponse {
$model = Page::byUuid($id)->firstOrFail();
$data['picture_id'] = ($v = Asset::byUuid($data['picture'] ?? null)->first()) ? $v->id : null;
$data['slug'] = $data['slug'] ?? Str::slug(Str::transliterate($data['name'] ?? null));
$model->update($data);
if ($model->type === PageType::REGISTRY) $model->registry->update(['type' => $data['registry_type'] ?? RegistryType::SIMPLE]);

View File

@ -0,0 +1,28 @@
<?php
namespace App\Transformers\Localization;
use App\Models\Localization\Locale;
use League\Fractal\TransformerAbstract;
class LocaleTransformer extends TransformerAbstract {
protected array $defaultIncludes = [
];
protected array $availableIncludes = [
];
public function transform(Locale $model): array {
return [
'id' => $model->uuid,
'name' => $model->name,
'name_iso' => $model->name_iso,
'title' => $model->title,
'is_active' => $model->isActive,
'is_enabled' => boolval($model->is_enabled),
'is_default' => boolval($model->is_default)
];
}
}

View File

@ -4,6 +4,7 @@ namespace App\Transformers\Pages;
use App\Models\Pages\Page;
use App\Services\PermissionsService;
use App\Transformers\Assets\AssetTransformer;
use App\Transformers\Objects\ObjectTransformer;
use App\Transformers\Publications\PublicationTransformer;
use App\Transformers\Registries\RegistryTransformer;
@ -18,7 +19,7 @@ class PageTransformer extends TransformerAbstract {
];
protected array $availableIncludes = [
'children', 'parent', 'parents', 'sections', 'sidebars', 'publications',
'children', 'parent', 'parents', 'picture', 'sections', 'sidebars', 'publications',
'registries', 'registry', 'permissions'
];
@ -31,6 +32,8 @@ class PageTransformer extends TransformerAbstract {
'sub_type' => $model->sub_type,
'name' => $model->name,
'title' => $model->title,
'description' => $model->description,
'keywords' => $model->keywords,
'h1' => $model->h1,
'created_at' => $model->created_at ? $model->created_at->toIso8601String() : null,
'updated_at' => $model->updated_at ? $model->updated_at->toIso8601String() : null
@ -49,6 +52,10 @@ class PageTransformer extends TransformerAbstract {
return $this->collection($model->parents->reverse(), new PageTransformer());
}
public function includePicture(Page $model): ?Item {
return $model->picture ? $this->item($model->picture, new AssetTransformer()) : null;
}
public function includeSections(Page $model): Collection {
return $this->collection($model->sections, new ObjectTransformer());
}

View File

@ -27,6 +27,7 @@
"guzzlehttp/guzzle": "^7.0.1",
"intervention/image": "^2.5",
"intervention/imagecache": "^2.4",
"laravel-lang/common": "^1.0",
"laravel/framework": "^8.0",
"laravel/passport": "^10.0",
"laravel/socialite": "^5.1",

654
composer.lock generated
View File

@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
"content-hash": "19a46ca556224368f88f689f8cc0ffb1",
"content-hash": "5b498713aa3e96e8f7771993a3011a4a",
"packages": [
{
"name": "asm89/stack-cors",
@ -647,6 +647,252 @@
},
"time": "2022-04-27T13:50:54+00:00"
},
{
"name": "dragon-code/contracts",
"version": "v2.19.1",
"source": {
"type": "git",
"url": "https://github.com/TheDragonCode/contracts.git",
"reference": "644ac91d9df96ebec3a46c0d2cc8ff51a83cbfad"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TheDragonCode/contracts/zipball/644ac91d9df96ebec3a46c0d2cc8ff51a83cbfad",
"reference": "644ac91d9df96ebec3a46c0d2cc8ff51a83cbfad",
"shasum": ""
},
"require": {
"php": "^7.2.5 || ^8.0",
"psr/http-message": "^1.0.1 || ^2.0",
"symfony/http-kernel": "^4.0 || ^5.0 || ^6.0",
"symfony/polyfill-php80": "^1.23"
},
"conflict": {
"andrey-helldar/contracts": "*"
},
"require-dev": {
"illuminate/database": "^10.0",
"phpdocumentor/reflection-docblock": "^5.0"
},
"type": "library",
"autoload": {
"psr-4": {
"DragonCode\\Contracts\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Andrey Helldar",
"email": "helldar@dragon-code.pro",
"homepage": "https://github.com/andrey-helldar"
}
],
"description": "A set of contracts for any project",
"keywords": [
"contracts",
"interfaces"
],
"support": {
"source": "https://github.com/TheDragonCode/contracts"
},
"funding": [
{
"url": "https://boosty.to/dragon-code",
"type": "boosty"
},
{
"url": "https://github.com/sponsors/TheDragonCode",
"type": "github"
},
{
"url": "https://opencollective.com/dragon-code",
"type": "open_collective"
},
{
"url": "https://yoomoney.ru/to/410012608840929",
"type": "yoomoney"
}
],
"time": "2023-04-19T08:23:59+00:00"
},
{
"name": "dragon-code/pretty-array",
"version": "v3.0.0",
"source": {
"type": "git",
"url": "https://github.com/TheDragonCode/pretty-array.git",
"reference": "bc6629eb266e7869d540dd1fcf13e8c7e1c61e82"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TheDragonCode/pretty-array/zipball/bc6629eb266e7869d540dd1fcf13e8c7e1c61e82",
"reference": "bc6629eb266e7869d540dd1fcf13e8c7e1c61e82",
"shasum": ""
},
"require": {
"dragon-code/contracts": "^2.6",
"dragon-code/support": "^5.0",
"ext-dom": "*",
"ext-mbstring": "*",
"php": "^7.3|^8.0"
},
"conflict": {
"andrey-helldar/pretty-array": "*"
},
"require-dev": {
"phpunit/phpunit": "^9.0"
},
"suggest": {
"symfony/thanks": "Give thanks (in the form of a GitHub) to your fellow PHP package maintainers"
},
"type": "library",
"autoload": {
"psr-4": {
"DragonCode\\PrettyArray\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Andrey Helldar",
"email": "helldar@ai-rus.com"
}
],
"description": "Simple conversion of an array to a pretty view",
"keywords": [
"andrey helldar",
"array",
"dragon",
"dragon code",
"pretty",
"pretty array"
],
"support": {
"issues": "https://github.com/TheDragonCode/pretty-array/issues",
"source": "https://github.com/TheDragonCode/pretty-array"
},
"funding": [
{
"url": "https://paypal.me/helldar",
"type": "custom"
},
{
"url": "https://yoomoney.ru/to/410012608840929",
"type": "custom"
},
{
"url": "https://opencollective.com/dragon-code",
"type": "open_collective"
},
{
"url": "https://www.patreon.com/andrey_helldar",
"type": "patreon"
}
],
"time": "2021-11-16T17:50:22+00:00"
},
{
"name": "dragon-code/support",
"version": "v5.8.1",
"source": {
"type": "git",
"url": "https://github.com/TheDragonCode/support.git",
"reference": "27af9d8f9ebb0c672ed76d516f524d8d58346cab"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/TheDragonCode/support/zipball/27af9d8f9ebb0c672ed76d516f524d8d58346cab",
"reference": "27af9d8f9ebb0c672ed76d516f524d8d58346cab",
"shasum": ""
},
"require": {
"dragon-code/contracts": "^2.15",
"ext-ctype": "*",
"ext-dom": "*",
"ext-json": "*",
"ext-mbstring": "*",
"php": "^7.2.5 || ^8.0",
"psr/http-message": "^1.0.1",
"symfony/deprecation-contracts": "^2.5 || ^3.0",
"voku/portable-ascii": "^1.4.8|^2.0"
},
"conflict": {
"andrey-helldar/support": "*"
},
"require-dev": {
"ext-bcmath": "*",
"phpunit/phpunit": "^8.0 || ^9.0",
"symfony/var-dumper": "^5.2 || ^6.0"
},
"suggest": {
"dragon-code/laravel-support": "Various helper files for the Laravel and Lumen frameworks",
"ext-bcmath": "Require the extension if you will be using DragonCode\\Support\\Facades\\Helpers\\Digit.",
"symfony/thanks": "Give thanks (in the form of a GitHub) to your fellow PHP package maintainers"
},
"type": "library",
"autoload": {
"psr-4": {
"DragonCode\\Support\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Andrey Helldar",
"email": "helldar@ai-rus.com"
}
],
"description": "Support package is a collection of helpers and tools for any project.",
"keywords": [
"dragon",
"dragon-code",
"framework",
"helper",
"helpers",
"laravel",
"support",
"symfony",
"yii",
"yii2"
],
"support": {
"issues": "https://github.com/TheDragonCode/support/issues",
"source": "https://github.com/TheDragonCode/support"
},
"funding": [
{
"url": "https://paypal.me/helldar",
"type": "custom"
},
{
"url": "https://yoomoney.ru/to/410012608840929",
"type": "custom"
},
{
"url": "https://github.com/TheDragonCode",
"type": "github"
},
{
"url": "https://opencollective.com/dragon-code",
"type": "open_collective"
},
{
"url": "https://www.patreon.com/andrey_helldar",
"type": "patreon"
}
],
"time": "2022-04-01T17:14:16+00:00"
},
{
"name": "dragonmantank/cron-expression",
"version": "v3.3.3",
@ -1627,6 +1873,412 @@
],
"time": "2022-10-10T10:11:09+00:00"
},
{
"name": "laravel-lang/attributes",
"version": "v1.1.3",
"source": {
"type": "git",
"url": "https://github.com/Laravel-Lang/attributes.git",
"reference": "2a6b4715b02fffeeb7954158f52f5e7c01cf8707"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Laravel-Lang/attributes/zipball/2a6b4715b02fffeeb7954158f52f5e7c01cf8707",
"reference": "2a6b4715b02fffeeb7954158f52f5e7c01cf8707",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": "^7.3 || ^8.0"
},
"require-dev": {
"dragon-code/pretty-array": "^4.0",
"dragon-code/support": "^6.0",
"laravel-lang/publisher": "^12.1 || ^13.0",
"orchestra/testbench": "^5.0 || ^6.0 || ^7.0",
"phpunit/phpunit": "^9.5",
"symfony/finder": "^5.0 || ^6.0",
"symfony/var-dumper": "^5.0 || ^6.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"LaravelLang\\Attributes\\ServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"LaravelLang\\Attributes\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Andrey Helldar",
"email": "helldar@ai-rus.com"
},
{
"name": "Laravel-Lang Team",
"homepage": "https://github.com/Laravel-Lang"
}
],
"description": "List of 78 languages for form field names",
"keywords": [
"attributes",
"fields",
"form",
"lang",
"languages",
"laravel",
"messages",
"translations",
"validation"
],
"support": {
"issues": "https://github.com/Laravel-Lang/attributes/issues",
"source": "https://github.com/Laravel-Lang/attributes/tree/v1.1.3"
},
"funding": [
{
"url": "https://opencollective.com/laravel-lang",
"type": "open_collective"
}
],
"time": "2022-06-29T19:06:05+00:00"
},
{
"name": "laravel-lang/common",
"version": "v1.0.1",
"source": {
"type": "git",
"url": "https://github.com/Laravel-Lang/common.git",
"reference": "2b08c50d33dd425c4e9035fe8a6714eb41c5aae1"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Laravel-Lang/common/zipball/2b08c50d33dd425c4e9035fe8a6714eb41c5aae1",
"reference": "2b08c50d33dd425c4e9035fe8a6714eb41c5aae1",
"shasum": ""
},
"require": {
"dragon-code/contracts": "2.19.1",
"illuminate/translation": "^7.0 || ^8.0 || ^9.0",
"laravel-lang/attributes": "^1.0",
"laravel-lang/http-statuses": "^2.0",
"laravel-lang/lang": "^10.0",
"laravel-lang/publisher": "^12.0",
"php": "^7.3 || ^8.0"
},
"require-dev": {
"orchestra/testbench": "^5.0 || ^6.0 || ^7.0",
"phpunit/phpunit": "^9.6",
"symfony/var-dumper": "^5.3 || ^6.0"
},
"type": "library",
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Laravel-Lang Team",
"homepage": "https://github.com/Laravel-Lang"
},
{
"name": "Andrey Helldar",
"email": "helldar@dragon-code.pro",
"homepage": "https://github.com/andrey-helldar"
}
],
"description": "Easily connect the necessary language packs to the application",
"keywords": [
"Laravel-lang",
"attribute",
"attributes",
"http",
"http-statuses",
"i18n",
"lang",
"languages",
"laravel",
"locale",
"locales",
"publisher",
"statuses",
"translation",
"translations"
],
"support": {
"issues": "https://github.com/Laravel-Lang/common/issues",
"source": "https://github.com/Laravel-Lang/common"
},
"funding": [
{
"url": "https://opencollective.com/laravel-lang",
"type": "open_collective"
}
],
"time": "2023-09-09T10:07:42+00:00"
},
{
"name": "laravel-lang/http-statuses",
"version": "v2.1.3",
"source": {
"type": "git",
"url": "https://github.com/Laravel-Lang/http-statuses.git",
"reference": "2de194362eda52125994150c635c440ce4eca9b4"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Laravel-Lang/http-statuses/zipball/2de194362eda52125994150c635c440ce4eca9b4",
"reference": "2de194362eda52125994150c635c440ce4eca9b4",
"shasum": ""
},
"require": {
"ext-json": "*",
"php": "^7.3 || ^8.0"
},
"conflict": {
"laravel-lang/publisher": "<13.0 >=14.0"
},
"require-dev": {
"laravel-lang/publisher": "^13.0",
"orchestra/testbench": "^5.0 || ^6.0 || ^7.0",
"phpunit/phpunit": "^9.5",
"symfony/var-dumper": "^5.0 || ^6.0"
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"LaravelLang\\HttpStatuses\\ServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"LaravelLang\\HttpStatuses\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Andrey Helldar",
"email": "helldar@ai-rus.com"
},
{
"name": "Laravel-Lang Team",
"homepage": "https://github.com/Laravel-Lang"
}
],
"description": "List of 78 languages for HTTP statuses",
"keywords": [
"http",
"lang",
"languages",
"laravel",
"messages",
"status",
"translations"
],
"support": {
"issues": "https://github.com/Laravel-Lang/http-statuses/issues",
"source": "https://github.com/Laravel-Lang/http-statuses/tree/v2.1.3"
},
"funding": [
{
"url": "https://opencollective.com/laravel-lang",
"type": "open_collective"
}
],
"time": "2022-06-28T18:02:34+00:00"
},
{
"name": "laravel-lang/lang",
"version": "10.9.5",
"source": {
"type": "git",
"url": "https://github.com/Laravel-Lang/lang.git",
"reference": "e341421d40f2cd28feca24ab2cb84fa5cb5ddaf6"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Laravel-Lang/lang/zipball/e341421d40f2cd28feca24ab2cb84fa5cb5ddaf6",
"reference": "e341421d40f2cd28feca24ab2cb84fa5cb5ddaf6",
"shasum": ""
},
"require": {
"ext-json": "*"
},
"conflict": {
"laravel-lang/publisher": "<12.0 >=14.0"
},
"require-dev": {
"dragon-code/pretty-array": "^4.0",
"dragon-code/simple-dto": "^2.3",
"dragon-code/support": "^6.1",
"ext-zip": "*",
"guzzlehttp/guzzle": "^7.3",
"laravel-lang/publisher": "^13.0",
"laravel/breeze": "^1.2",
"laravel/fortify": "^1.7",
"laravel/jetstream": "^2.3",
"laravel/ui": "^3.4",
"orchestra/testbench": "^7.0",
"php": "^8.1",
"phpunit/phpunit": "^9.5",
"symfony/finder": "^6.0",
"symfony/var-dumper": "^6.0",
"vlucas/phpdotenv": "^5.4.1"
},
"suggest": {
"arcanedev/laravel-lang": "Translations manager and checker for Laravel 5",
"laravel-lang/publisher": "Easy installation and update of translation files for your project",
"overtrue/laravel-lang": "Command to add languages in your project"
},
"type": "library",
"autoload": {
"psr-4": {
"LaravelLang\\Lang\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Laravel-Lang Team",
"homepage": "https://github.com/Laravel-Lang"
}
],
"description": "Languages for Laravel",
"keywords": [
"lang",
"languages",
"laravel",
"lpm"
],
"support": {
"issues": "https://github.com/Laravel-Lang/lang/issues",
"source": "https://github.com/Laravel-Lang/lang"
},
"funding": [
{
"url": "https://opencollective.com/laravel-lang",
"type": "open_collective"
}
],
"time": "2022-06-27T01:57:27+00:00"
},
{
"name": "laravel-lang/publisher",
"version": "v12.2.1",
"source": {
"type": "git",
"url": "https://github.com/Laravel-Lang/publisher.git",
"reference": "200a9aca41529ce33d3385e7ffd3e60aaaf808de"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/Laravel-Lang/publisher/zipball/200a9aca41529ce33d3385e7ffd3e60aaaf808de",
"reference": "200a9aca41529ce33d3385e7ffd3e60aaaf808de",
"shasum": ""
},
"require": {
"dragon-code/contracts": "^2.15",
"dragon-code/pretty-array": "^3.0",
"dragon-code/support": "^5.6",
"ext-json": "*",
"illuminate/console": "^7.0 || ^8.0 || ^9.0",
"illuminate/contracts": "^7.0 || ^8.0 || ^9.0",
"illuminate/support": "^7.0 || ^8.0 || ^9.0",
"php": "^7.3 || ^8.0"
},
"conflict": {
"andrey-helldar/laravel-lang-publisher": "*",
"dragon-code/contracts": "<2.0.0",
"dragon-code/pretty-array": "<3.0.0",
"dragon-code/support": "<5.0.0",
"laravel-lang/lang": "<10.2.0"
},
"require-dev": {
"laravel-lang/http-statuses": "^2.0",
"laravel-lang/lang": "^10.2",
"orchestra/testbench": "^5.0 || ^6.0 || ^7.0",
"phpunit/phpunit": "^9.4",
"symfony/var-dumper": "^5.0 || ^6.0"
},
"suggest": {
"laravel-lang/http-statuses": "List of 78 languages for HTTP statuses",
"laravel-lang/lang": "List of 78 languages for Laravel Framework, Jetstream, Fortify, Breeze, Cashier, Nova, Spark and UI."
},
"type": "library",
"extra": {
"laravel": {
"providers": [
"LaravelLang\\Publisher\\ServiceProvider"
]
}
},
"autoload": {
"psr-4": {
"LaravelLang\\Publisher\\": "src"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Andrey Helldar",
"email": "helldar@ai-rus.com"
}
],
"description": "Publisher lang files for the Laravel and Lumen Frameworks, Jetstream, Fortify, Cashier, Spark and Nova from Laravel-Lang/lang",
"keywords": [
"breeze",
"cashier",
"fortify",
"framework",
"i18n",
"jetstream",
"lang",
"languages",
"laravel",
"locale",
"locales",
"localization",
"lpm",
"lumen",
"nova",
"publisher",
"spark",
"trans",
"translations",
"validations"
],
"support": {
"issues": "https://github.com/Laravel-Lang/publisher/issues",
"source": "https://github.com/Laravel-Lang/publisher"
},
"funding": [
{
"url": "https://opencollective.com/laravel-lang",
"type": "open_collective"
}
],
"time": "2022-03-06T12:54:14+00:00"
},
{
"name": "laravel/framework",
"version": "v8.83.27",

View File

@ -67,7 +67,7 @@ return [
| to any of the locales which will be supported by the application.
|
*/
'locale' => 'ru',
'locale' => env('APP_LOCALE', 'ru'),
/*
|--------------------------------------------------------------------------
| Application Fallback Locale
@ -78,7 +78,7 @@ return [
| the language folders that are provided through your application.
|
*/
'fallback_locale' => 'en',
'fallback_locale' => env('APP_FALLBACK_LOCALE', 'en'),
/*
|--------------------------------------------------------------------------
| Faker Locale

View File

@ -17,11 +17,14 @@ class CreatePagesTable extends Migration
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->integer('parent_id')->index()->default(0);
$table->integer('picture_id')->index()->nullable();
$table->string('slug')->index()->nullable();
$table->string('type')->index()->nullable();
$table->string('sub_type')->index()->nullable();
$table->string('name')->index()->nullable();
$table->string('title')->index()->nullable();
$table->text('description')->nullable();
$table->string('keywords')->index()->nullable();
$table->string('h1')->index()->nullable();
$table->integer('ord')->index()->default(0);
$table->timestamps();

View File

@ -0,0 +1,38 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateLocalesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('locales', function (Blueprint $table) {
$table->id();
$table->char('uuid', 36)->index()->unique();
$table->string('name', 20)->nullable()->index();
$table->string('name_iso', 20)->nullable()->index();
$table->string('title')->nullable()->index();
$table->boolean('is_enabled')->default(0)->index();
$table->boolean('is_default')->default(0)->index();
$table->timestamps();
$table->softDeletes();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('locales');
}
}

View File

@ -5,6 +5,7 @@ namespace Database\Seeders;
use Database\Seeders\Advisories\AdvisoriesTablesSeeder;
use Database\Seeders\Companies\CompaniesTablesSeeder;
use Database\Seeders\Dictionaries\DictionariesTablesSeeder;
use Database\Seeders\Localization\LocalesTableSeeder;
use Database\Seeders\Objects\ObjectsTablesSeeder;
use Database\Seeders\Pages\PagesTableSeeder;
use Database\Seeders\Users\RoleTableSeeder;
@ -16,6 +17,7 @@ class DatabaseSeeder extends Seeder {
public function run() {
$this->call(RoleTableSeeder::class);
$this->call(UsersTableSeeder::class);
$this->call(LocalesTableSeeder::class);
$this->call(ObjectsTablesSeeder::class);
$this->call(DictionariesTablesSeeder::class);
$this->call(PagesTableSeeder::class);

View File

@ -0,0 +1,21 @@
<?php
namespace Database\Seeders\Localization;
use App\Models\Localization\Locale;
use Illuminate\Database\Seeder;
class LocalesTableSeeder extends Seeder {
public array $locales = [
'ru' => ['title' => 'Русский', 'is_enabled' => true, 'is_default' => true],
'en' => ['title' => 'English', 'is_enabled' => true],
'ua' => ['title' => 'Українська', 'is_enabled' => true]
];
public function run() {
collect($this->locales)->each(function($data, $name) {
$model = Locale::firstOrCreate(['name' => $name]);
$model->update(collect($data)->all());
});
}
}

51
resources/lang/ru.json Normal file
View File

@ -0,0 +1,51 @@
{
"A fresh verification link has been sent to your email address.": "Новая ссылка подтверждения отправлена на Ваш адрес электронной почты.",
"All rights reserved.": "Все права защищены.",
"Before proceeding, please check your email for a verification link.": "Прежде чем продолжить, проверьте свою электронную почту на наличие ссылки для подтверждения.",
"click here to request another": "нажмите здесь для запроса другой ссылки",
"Confirm Password": "Подтверждение пароля",
"E-Mail Address": "Email адрес",
"Forbidden": "Запрещено",
"Forgot Your Password?": "Забыли пароль?",
"Go Home": "Домой",
"Go to page :page": "Перейти к :page-й странице",
"Hello!": "Здравствуйте!",
"If you did not create an account, no further action is required.": "Если Вы не создавали учетную запись, никаких дополнительных действий не требуется.",
"If you did not receive the email": "Если Вы не получили письмо",
"If you did not request a password reset, no further action is required.": "Если Вы не запрашивали сброс пароля, то дополнительных действий не требуется.",
"If you're having trouble clicking the \":actionText\" button, copy and paste the URL below\ninto your web browser:": "Если у вас возникли проблемы с нажатием кнопки \":actionText\", скопируйте и вставьте приведенный ниже URL-адрес в свой браузер:",
"Login": "Войти",
"Logout": "Выйти",
"Name": "Имя",
"Not Found": "Не найдено",
"of": "из",
"Oh no": "О, нет",
"Page Expired": "Страница устарела",
"Pagination Navigation": "Навигация",
"Password": "Пароль",
"Please click the button below to verify your email address.": "Пожалуйста, нажмите кнопку ниже, чтобы подтвердить свой адрес электронной почты.",
"Regards": "С уважением",
"Register": "Регистрация",
"Remember Me": "Запомнить меня",
"Reset Password": "Сбросить пароль",
"Reset Password Notification": "Уведомление сброса пароля",
"results": "результатов",
"Send Password Reset Link": "Отправить ссылку сброса пароля",
"Server Error": "Ошибка сервера",
"Service Unavailable": "Сервис недоступен",
"Showing": "Показано с",
"The :attribute must contain at least one letter.": "Значение поля :attribute должно содержать минимум одну букву.",
"The :attribute must contain at least one number.": "Значение поля :attribute должно содержать минимум одну цифру.",
"The :attribute must contain at least one symbol.": "Значение поля :attribute должно содержать минимум один спец символ.",
"The :attribute must contain at least one uppercase and one lowercase letter.": "Значение поля :attribute должно содержать как минимум по одному символу в нижнем и верхнем регистрах.",
"The given :attribute has appeared in a data leak. Please choose a different :attribute.": "Значение поля :attribute обнаружено в утечке данных. Пожалуйста, укажите другое значение для :attribute.",
"This password reset link will expire in :count minutes.": "Срок действия ссылки для сброса пароля истекает через :count минут.",
"to": "по",
"Toggle navigation": "Переключить навигацию",
"Too Many Requests": "Слишком много запросов",
"Unauthorized": "Не авторизован",
"Verify Email Address": "Подтвердить email-адрес",
"Verify Your Email Address": "Подтвердите Ваш email-адрес",
"Whoops!": "Упс!",
"You are receiving this email because we received a password reset request for your account.": "Вы получили это письмо, потому что мы получили запрос на сброс пароля для Вашей учетной записи."
}

View File

@ -1,18 +1,7 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Authentication Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used during authentication for various
| messages that we need to display to the user. You are free to modify
| these language lines according to your application's requirements.
|
*/
'failed' => 'Указаны не верные данные учетой записи.',
'throttle' => 'Слишком много попыток. Попробуйте снова через :seconds секунд.'
'failed' => 'Неверное имя пользователя или пароль.',
'password' => 'Неверный пароль.',
'throttle' => 'Слишком много попыток входа. Пожалуйста, попробуйте еще раз через :seconds секунд.',
];

View File

@ -0,0 +1,76 @@
<?php
return [
'0' => 'Неизвестная ошибка',
'100' => 'Продолжай',
'101' => 'Переключение протоколов',
'102' => 'Идет обработка',
'200' => 'ОК',
'201' => 'Создано',
'202' => 'Принято',
'203' => 'Информация не авторитетна',
'204' => 'Содержимое отсутствует',
'205' => 'Сбросить содержимое',
'206' => 'Частичное содержимое',
'207' => 'Много статусов',
'208' => 'Уже сообщалось',
'226' => 'Использовано IM',
'300' => 'Множество выбора',
'301' => 'Перемещено навсегда',
'302' => 'Найдено',
'303' => 'Смотри другое',
'304' => 'Не изменялось',
'305' => 'Используй прокси',
'307' => 'Временное перенаправление',
'308' => 'Постоянное перенаправление',
'400' => 'Некорректный запрос',
'401' => 'Не авторизован',
'402' => 'Необходима оплата',
'403' => 'Доступ запрещен',
'404' => 'Страница не найдена',
'405' => 'Метод запрещен',
'406' => 'Неприемлемо',
'407' => 'Требуется аутентификация прокси',
'408' => 'Истекло время ожидания',
'409' => 'Конфликт',
'410' => 'Удалено',
'411' => 'Необходима длина',
'412' => 'Условие ложно',
'413' => 'Полезная нагрузка слишком велика',
'414' => 'URI слишком длинный',
'415' => 'Неподдерживаемый тип данных',
'416' => 'Диапазон недостижим',
'417' => 'Ожидание не удалось',
'418' => 'Я - чайник',
'419' => 'Сессия устарела',
'421' => 'Неверный запрос',
'422' => 'Необрабатываемый экземпляр',
'423' => 'Доступ заблокирован',
'424' => 'Ошибка зависимости',
'426' => 'Требуется обновление',
'428' => 'Требуется предусловие',
'429' => 'Слишком много запросов',
'431' => 'Поля заголовка слишком большие',
'449' => 'Повторить с',
'451' => 'Недоступно по юридическим причинам',
'500' => 'Внутренняя ошибка сервера',
'501' => 'Не реализовано',
'502' => 'Плохой шлюз',
'503' => 'Ведутся технические работы',
'504' => 'Шлюз не отвечает',
'505' => 'Версия HTTP не поддерживается',
'506' => 'Вариант тоже проводит согласование',
'507' => 'Переполнение хранилища',
'508' => 'Обнаружено бесконеечное перенаправление',
'509' => 'Исчерпана пропускная ширина канала',
'510' => 'Не расширено',
'511' => 'Требуется сетевая аутентификация',
'520' => 'Неизвестная ошибка',
'521' => 'Веб-сервер не работает',
'522' => 'Соединение не отвечает',
'523' => 'Источник недоступен',
'524' => 'Время ожидания истекло',
'525' => 'Квитирование SSL не удалось',
'526' => 'Недействительный SSL сертификат',
'unknownError' => 'Неизвестная ошибка',
];

View File

@ -1,19 +1,6 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Pagination Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are used by the paginator library to build
| the simple pagination links. You are free to change them to anything
| you want to customize your views to better match your application.
|
*/
'next' => 'Вперёд &raquo;',
'previous' => '&laquo; Назад',
'next' => 'Вперед &raquo;',
];

View File

@ -1,22 +1,9 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Password Reset Language Lines
|--------------------------------------------------------------------------
|
| The following language lines are the default lines which match reasons
| that are given by the password broker for a password update attempt
| has failed, such as for an invalid token or invalid new password.
|
*/
'reset' => 'Пароль был сброшен!',
'sent' => 'Ссылка для сброса пароля была отправлена на ваш email адрес!',
'token' => 'Не корректный токен сброса пароля.',
'user' => "Пользователя с указанным email адресом не найдено.",
'throttled' => 'Повторите попытку позже.',
'reset' => 'Ваш пароль был сброшен!',
'sent' => 'Ссылка на сброс пароля была отправлена!',
'throttled' => 'Пожалуйста, подождите перед повторной попыткой.',
'token' => 'Ошибочный код сброса пароля.',
'user' => 'Не удалось найти пользователя с указанным электронным адресом.',
];

View File

@ -1,151 +1,198 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Validation Language Lines
|--------------------------------------------------------------------------
|
| The following language lines contain the default error messages used by
| the validator class. Some of these rules have multiple versions such
| as the size rules. Feel free to tweak each of these messages here.
|
*/
'accepted' => 'The :attribute must be accepted.',
'active_url' => 'The :attribute is not a valid URL.',
'after' => 'The :attribute must be a date after :date.',
'after_or_equal' => 'The :attribute must be a date after or equal to :date.',
'alpha' => 'The :attribute may only contain letters.',
'alpha_dash' => 'The :attribute may only contain letters, numbers, dashes and underscores.',
'alpha_num' => 'The :attribute may only contain letters and numbers.',
'array' => 'В поле :attribute должен быть передан массив.',
'before' => 'The :attribute must be a date before :date.',
'before_or_equal' => 'The :attribute must be a date before or equal to :date.',
'accepted' => 'Вы должны принять :attribute.',
'accepted_if' => 'Вы должны принять :attribute, когда :other соответствует :value.',
'active_url' => 'Значение поля :attribute не является действительным URL.',
'after' => 'Значение поля :attribute должно быть датой после :date.',
'after_or_equal' => 'Значение поля :attribute должно быть датой после или равной :date.',
'alpha' => 'Значение поля :attribute может содержать только буквы.',
'alpha_dash' => 'Значение поля :attribute может содержать только буквы, цифры, дефис и нижнее подчеркивание.',
'alpha_num' => 'Значение поля :attribute может содержать только буквы и цифры.',
'array' => 'Значение поля :attribute должно быть массивом.',
'before' => 'Значение поля :attribute должно быть датой до :date.',
'before_or_equal' => 'Значение поля :attribute должно быть датой до или равной :date.',
'between' => [
'numeric' => 'The :attribute must be between :min and :max.',
'file' => 'The :attribute must be between :min and :max kilobytes.',
'string' => 'The :attribute must be between :min and :max characters.',
'array' => 'The :attribute must have between :min and :max items.',
'array' => 'Количество элементов в поле :attribute должно быть между :min и :max.',
'file' => 'Размер файла в поле :attribute должен быть между :min и :max Килобайт(а).',
'numeric' => 'Значение поля :attribute должно быть между :min и :max.',
'string' => 'Количество символов в поле :attribute должно быть между :min и :max.',
],
'boolean' => 'The :attribute field must be true or false.',
'confirmed' => 'Подтверждение поля :attribute не совпадает.',
'boolean' => 'Значение поля :attribute должно быть логического типа.',
'confirmed' => 'Значение поля :attribute не совпадает с подтверждаемым.',
'current_password' => 'Неверный пароль.',
'date' => 'Значение поля :attribute не является датой.',
'date_equals' => 'The :attribute must be a date equal to :date.',
'date_format' => 'The :attribute does not match the format :format.',
'different' => 'The :attribute and :other must be different.',
'digits' => 'The :attribute must be :digits digits.',
'digits_between' => 'The :attribute must be between :min and :max digits.',
'dimensions' => 'The :attribute has invalid image dimensions.',
'distinct' => 'The :attribute field has a duplicate value.',
'email' => 'Поле :attribute должно содержать корректный email адрес.',
'ends_with' => 'The :attribute must end with one of the following: :values',
'exists' => 'Не корректное значение поля :attribute.',
'file' => 'The :attribute must be a file.',
'filled' => 'Требуется указать значение для поля :attribute.',
'date_equals' => 'Значение поля :attribute должно быть датой равной :date.',
'date_format' => 'Значение поля :attribute не соответствует формату даты :format.',
'declined' => 'Поле :attribute должно быть отклонено.',
'declined_if' => 'Поле :attribute должно быть отклонено, когда :other равно :value.',
'different' => 'Значения полей :attribute и :other должны различаться.',
'digits' => 'Длина значения цифрового поля :attribute должна быть :digits.',
'digits_between' => 'Длина значения цифрового поля :attribute должна быть между :min и :max.',
'dimensions' => 'Изображение в поле :attribute имеет недопустимые размеры.',
'distinct' => 'Значения поля :attribute не должны повторяться.',
'email' => 'Значение поля :attribute должно быть действительным электронным адресом.',
'ends_with' => 'Поле :attribute должно заканчиваться одним из следующих значений: :values',
'enum' => 'Выбранное значение для :attribute некорректно.',
'exists' => 'Выбранное значение для :attribute некорректно.',
'file' => 'В поле :attribute должен быть указан файл.',
'filled' => 'Поле :attribute обязательно для заполнения.',
'gt' => [
'numeric' => 'The :attribute must be greater than :value.',
'file' => 'The :attribute must be greater than :value kilobytes.',
'string' => 'The :attribute must be greater than :value characters.',
'array' => 'The :attribute must have more than :value items.',
'array' => 'Количество элементов в поле :attribute должно быть больше :value.',
'file' => 'Размер файла в поле :attribute должен быть больше :value Килобайт(а).',
'numeric' => 'Значение поля :attribute должно быть больше :value.',
'string' => 'Количество символов в поле :attribute должно быть больше :value.',
],
'gte' => [
'numeric' => 'The :attribute must be greater than or equal :value.',
'file' => 'The :attribute must be greater than or equal :value kilobytes.',
'string' => 'The :attribute must be greater than or equal :value characters.',
'array' => 'The :attribute must have :value items or more.',
'array' => 'Количество элементов в поле :attribute должно быть :value или больше.',
'file' => 'Размер файла в поле :attribute должен быть :value Килобайт(а) или больше.',
'numeric' => 'Значение поля :attribute должно быть :value или больше.',
'string' => 'Количество символов в поле :attribute должно быть :value или больше.',
],
'image' => 'The :attribute must be an image.',
'in' => 'The selected :attribute is invalid.',
'in_array' => 'The :attribute field does not exist in :other.',
'integer' => 'The :attribute must be an integer.',
'ip' => 'The :attribute must be a valid IP address.',
'ipv4' => 'The :attribute must be a valid IPv4 address.',
'ipv6' => 'The :attribute must be a valid IPv6 address.',
'json' => 'The :attribute must be a valid JSON string.',
'image' => 'Файл в поле :attribute должен быть изображением.',
'in' => 'Выбранное значение для :attribute некорректно.',
'in_array' => 'Значение поля :attribute не существует в :other.',
'integer' => 'Значение поля :attribute должно быть целым числом.',
'ip' => 'Значение поля :attribute должно быть действительным IP-адресом.',
'ipv4' => 'Значение поля :attribute должно быть действительным IPv4-адресом.',
'ipv6' => 'Значение поля :attribute должно быть действительным IPv6-адресом.',
'json' => 'Значение поля :attribute должно быть JSON строкой.',
'lt' => [
'numeric' => 'The :attribute must be less than :value.',
'file' => 'The :attribute must be less than :value kilobytes.',
'string' => 'The :attribute must be less than :value characters.',
'array' => 'The :attribute must have less than :value items.',
'array' => 'Количество элементов в поле :attribute должно быть меньше :value.',
'file' => 'Размер файла в поле :attribute должен быть меньше :value Килобайт(а).',
'numeric' => 'Значение поля :attribute должно быть меньше :value.',
'string' => 'Количество символов в поле :attribute должно быть меньше :value.',
],
'lte' => [
'numeric' => 'The :attribute must be less than or equal :value.',
'file' => 'The :attribute must be less than or equal :value kilobytes.',
'string' => 'The :attribute must be less than or equal :value characters.',
'array' => 'The :attribute must not have more than :value items.',
'array' => 'Количество элементов в поле :attribute должно быть :value или меньше.',
'file' => 'Размер файла в поле :attribute должен быть :value Килобайт(а) или меньше.',
'numeric' => 'Значение поля :attribute должно быть :value или меньше.',
'string' => 'Количество символов в поле :attribute должно быть :value или меньше.',
],
'mac_address' => 'Значение поля :attribute должно быть корректным MAC-адресом.',
'max' => [
'numeric' => 'Значение :attribute должно быть не более :max.',
'file' => 'Значение :attribute должно быть не более :max килотайт.',
'string' => 'Значение :attribute должно содержать не более :max символов.',
'array' => 'Значение :attribute должно содержать не более :max элементов.',
'array' => 'Количество элементов в поле :attribute не может превышать :max.',
'file' => 'Размер файла в поле :attribute не может быть больше :max Килобайт(а).',
'numeric' => 'Значение поля :attribute не может быть больше :max.',
'string' => 'Количество символов в поле :attribute не может превышать :max.',
],
'mimes' => 'Значение :attribute должно быть файлом типа: :values.',
'mimetypes' => 'Значение :attribute должно быть файлом типа: :values.',
'mimes' => 'Файл в поле :attribute должен быть одного из следующих типов: :values.',
'mimetypes' => 'Файл в поле :attribute должен быть одного из следующих типов: :values.',
'min' => [
'numeric' => 'Значение :attribute должно быть не менее :min.',
'file' => 'Значение :attribute должно быть не менее :min килобайт.',
'string' => 'Значение :attribute должно содержать не менее :min символов.',
'array' => 'Значение :attribute должно содержать не менее :min элементов.',
'array' => 'Количество элементов в поле :attribute должно быть не меньше :min.',
'file' => 'Размер файла в поле :attribute должен быть не меньше :min Килобайт(а).',
'numeric' => 'Значение поля :attribute должно быть не меньше :min.',
'string' => 'Количество символов в поле :attribute должно быть не меньше :min.',
],
'not_in' => 'Указанное значение :attribute не корректно.',
'not_regex' => 'Значение поля :attribute не соответствует заданному формату.',
'numeric' => 'Значение поля :attribute должно быть числовым.',
'multiple_of' => 'Значение поля :attribute должно быть кратным :value',
'not_in' => 'Выбранное значение для :attribute некорректно.',
'not_regex' => 'Значение поля :attribute некорректно.',
'numeric' => 'Значение поля :attribute должно быть числом.',
'password' => 'Некорректный пароль.',
'present' => 'Значение поля :attribute должно присутствовать.',
'regex' => 'Значение поля :attribute не соответствует заданному формату.',
'required' => 'Требуется указать значение поля :attribute.',
'required_if' => 'The :attribute field is required when :other is :value.',
'required_unless' => 'The :attribute field is required unless :other is in :values.',
'required_with' => 'The :attribute field is required when :values is present.',
'required_with_all' => 'The :attribute field is required when :values are present.',
'required_without' => 'The :attribute field is required when :values is not present.',
'required_without_all' => 'The :attribute field is required when none of :values are present.',
'same' => 'The :attribute and :other must match.',
'prohibited' => 'Значение поля :attribute запрещено.',
'prohibited_if' => 'Значение поля :attribute запрещено, когда :other равно :value.',
'prohibited_unless' => 'Значение поля :attribute запрещено, если :other не состоит в :values.',
'prohibits' => 'Значение поля :attribute запрещает присутствие :other.',
'regex' => 'Значение поля :attribute некорректно.',
'required' => 'Поле :attribute обязательно для заполнения.',
'required_array_keys' => 'Массив в поле :attribute обязательно должен иметь ключи: :values',
'required_if' => 'Поле :attribute обязательно для заполнения, когда :other равно :value.',
'required_unless' => 'Поле :attribute обязательно для заполнения, когда :other не равно :values.',
'required_with' => 'Поле :attribute обязательно для заполнения, когда :values указано.',
'required_with_all' => 'Поле :attribute обязательно для заполнения, когда :values указано.',
'required_without' => 'Поле :attribute обязательно для заполнения, когда :values не указано.',
'required_without_all' => 'Поле :attribute обязательно для заполнения, когда ни одно из :values не указано.',
'same' => 'Значения полей :attribute и :other должны совпадать.',
'size' => [
'numeric' => 'The :attribute must be :size.',
'file' => 'The :attribute must be :size kilobytes.',
'string' => 'The :attribute must be :size characters.',
'array' => 'The :attribute must contain :size items.',
'array' => 'Количество элементов в поле :attribute должно быть равным :size.',
'file' => 'Размер файла в поле :attribute должен быть равен :size Килобайт(а).',
'numeric' => 'Значение поля :attribute должно быть равным :size.',
'string' => 'Количество символов в поле :attribute должно быть равным :size.',
],
'starts_with' => 'Поле :attribute должно начинаться с одного из следующих значений: :values',
'string' => 'Значение поля :attribute должно быть строкой.',
'timezone' => 'Значение поля :attribute должно быть действительным часовым поясом.',
'unique' => 'Такое значение поля :attribute уже существует.',
'uploaded' => 'Загрузка поля :attribute не удалась.',
'url' => 'Значение поля :attribute имеет ошибочный формат URL.',
'uuid' => 'Значение поля :attribute должно быть корректным UUID.',
'attributes' => [
'address' => 'адрес',
'age' => 'возраст',
'amount' => 'количество',
'area' => 'область',
'available' => 'доступно',
'birthday' => 'дата рождения',
'body' => 'контент',
'city' => 'город',
'content' => 'контент',
'country' => 'страна',
'created_at' => 'создано в',
'creator' => 'создатель',
'current_password' => 'текущий пароль',
'date' => 'дата',
'date_of_birth' => 'день рождения',
'day' => 'день',
'deleted_at' => 'удалено в',
'description' => 'описание',
'district' => 'округ',
'duration' => 'продолжительность',
'email' => 'email адрес',
'excerpt' => 'выдержка',
'filter' => 'фильтр',
'first_name' => 'имя',
'gender' => 'пол',
'group' => 'группа',
'hour' => 'час',
'image' => 'изображение',
'last_name' => 'фамилия',
'lesson' => 'урок',
'line_address_1' => 'строка адреса 1',
'line_address_2' => 'строка адреса 2',
'message' => 'сообщение',
'middle_name' => 'отчество',
'minute' => 'минута',
'mobile' => 'моб. номер',
'month' => 'месяц',
'name' => 'имя',
'national_code' => 'национальный код',
'number' => 'номер',
'password' => 'пароль',
'password_confirmation' => 'подтверждение пароля',
'phone' => 'номер телефона',
'photo' => 'фотография',
'postal_code' => 'индекс',
'price' => 'стоимость',
'province' => 'провинция',
'recaptcha_response_field' => 'ошибка рекапчи',
'remember' => 'запомнить',
'restored_at' => 'восстановлено в',
'result_text_under_image' => 'текст под изображением',
'role' => 'роль',
'second' => 'секунда',
'sex' => 'пол',
'short_text' => 'короткое описание',
'size' => 'размер',
'state' => 'штат',
'street' => 'улица',
'student' => 'студент',
'subject' => 'заголовок',
'teacher' => 'учитель',
'terms' => 'правила',
'test_description' => 'тестовое описание',
'test_locale' => 'тестовая локализация',
'test_name' => 'тестовое имя',
'text' => 'текст',
'time' => 'время',
'title' => 'наименование',
'updated_at' => 'обновлено в',
'username' => 'никнейм',
'year' => 'год',
],
'starts_with' => 'The :attribute must start with one of the following: :values',
'string' => 'The :attribute must be a string.',
'timezone' => 'The :attribute must be a valid zone.',
'unique' => 'Указанное значение :attribute уже занято.',
'uploaded' => 'The :attribute failed to upload.',
'url' => 'The :attribute format is invalid.',
'uuid' => 'The :attribute must be a valid UUID.',
/*
|--------------------------------------------------------------------------
| Custom Validation Language Lines
|--------------------------------------------------------------------------
|
| Here you may specify custom validation messages for attributes using the
| convention "attribute.rule" to name the lines. This makes it quick to
| specify a specific custom language line for a given attribute rule.
|
*/
'custom' => [
'attribute-name' => [
'rule-name' => 'custom-message',
],
],
/*
|--------------------------------------------------------------------------
| Custom Validation Attributes
|--------------------------------------------------------------------------
|
| The following language lines are used to swap our attribute placeholder
| with something more reader friendly such as "E-Mail Address" instead
| of "email". This simply helps us make our message more expressive.
|
*/
'attributes' => [],
];

View File

@ -91,6 +91,15 @@ Route::group(['prefix' => 'advisories'], function() {
});
});
Route::group(['prefix' => 'locales'], function() {
Route::get('/menu', 'Api\Localization\LocalesController@menu');
Route::get('/{id}', 'Api\Localization\LocalesController@show');
Route::group(['middleware' => ['auth:api']], function() {
Route::get('/', 'Api\Localization\LocalesController@index');
Route::delete('/{id}', 'Api\Localization\LocalesController@destroy');
});
});
Route::group(['middleware' => ['auth:api']], function() {