mirror of
https://github.com/linuxserver/Heimdall.git
synced 2026-02-23 21:20:32 +09:00
Compare commits
129 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a868a6cac1 | ||
|
|
f9599079e5 | ||
|
|
10afffb71d | ||
|
|
79d53af339 | ||
|
|
8cc6a9cc63 | ||
|
|
18001fbdd0 | ||
|
|
41c2983312 | ||
|
|
e52bc9c6b2 | ||
|
|
a16233ee10 | ||
|
|
5b177f1127 | ||
|
|
f7633b6a5f | ||
|
|
d58e6cb560 | ||
|
|
87fe9c1771 | ||
|
|
95d9e9edb9 | ||
|
|
f7b2c51f9d | ||
|
|
72c70e27f2 | ||
|
|
becbe5ab96 | ||
|
|
f5bce95808 | ||
|
|
1e2b807e05 | ||
|
|
ed3dbf2f14 | ||
|
|
1e35f83fed | ||
|
|
8499d100ff | ||
|
|
bdeae6a722 | ||
|
|
4c63b66dbf | ||
|
|
371f52f92e | ||
|
|
6daaf94974 | ||
|
|
b8e5a22648 | ||
|
|
e821edf01a | ||
|
|
188316df47 | ||
|
|
dd14ce8738 | ||
|
|
d8e4053ce4 | ||
|
|
f73b78f292 | ||
|
|
96ec1e0b08 | ||
|
|
1904d9d910 | ||
|
|
beb2851f4a | ||
|
|
645a0bc7fe | ||
|
|
ef73918098 | ||
|
|
06a23c70af | ||
|
|
323a6e17c7 | ||
|
|
0ca07c9698 | ||
|
|
fbb21d2885 | ||
|
|
b6741c8ff0 | ||
|
|
7fdca02af7 | ||
|
|
271100c25b | ||
|
|
cfecce6100 | ||
|
|
d71341df7a | ||
|
|
ac851f5a02 | ||
|
|
d2a8b7af48 | ||
|
|
4d7a86fbf7 | ||
|
|
87a3af3dbf | ||
|
|
79c76b9f50 | ||
|
|
d7742df802 | ||
|
|
736222e173 | ||
|
|
047ffb0b55 | ||
|
|
505d17cf57 | ||
|
|
71c2da160d | ||
|
|
3487b9e479 | ||
|
|
7cdf315d78 | ||
|
|
a1812a962c | ||
|
|
b97cab34b0 | ||
|
|
3426450b3c | ||
|
|
75804f4624 | ||
|
|
23f757e06f | ||
|
|
fabd704bab | ||
|
|
c16fbae963 | ||
|
|
348759b9ad | ||
|
|
d961aeb19b | ||
|
|
987a9c03b0 | ||
|
|
d17fb04983 | ||
|
|
b07918d751 | ||
|
|
f9a19fce91 | ||
|
|
1b71e80d52 | ||
|
|
9fac11cb77 | ||
|
|
a94fb108fa | ||
|
|
f51893b2d6 | ||
|
|
a4b32dcafd | ||
|
|
862f870303 | ||
|
|
869cfd34ab | ||
|
|
9e67b7c72e | ||
|
|
a5b7f10809 | ||
|
|
698665176c | ||
|
|
1bd65222e4 | ||
|
|
61a5a1a8b0 | ||
|
|
e51cdd7f7a | ||
|
|
a626222ff3 | ||
|
|
af68a45a3d | ||
|
|
7969df9344 | ||
|
|
67bc656325 | ||
|
|
b5baf0d606 | ||
|
|
32964e9045 | ||
|
|
27a667675a | ||
|
|
9a221f47bf | ||
|
|
8d2fbc5599 | ||
|
|
84ebe6587d | ||
|
|
89a71a18da | ||
|
|
05dd7a090b | ||
|
|
3a9bdd2c43 | ||
|
|
0292e9976e | ||
|
|
365de9512f | ||
|
|
e857023903 | ||
|
|
c058e1a452 | ||
|
|
7f42967b67 | ||
|
|
994961de54 | ||
|
|
049d20536c | ||
|
|
c9c8171a52 | ||
|
|
e7a6ac5a75 | ||
|
|
3a372107ba | ||
|
|
493374de65 | ||
|
|
c43fc929f7 | ||
|
|
895d5f2ebe | ||
|
|
cb4768e2cf | ||
|
|
6ca4bfb9ee | ||
|
|
1f7de03d90 | ||
|
|
861d287750 | ||
|
|
e2cc32fd0a | ||
|
|
762df25c45 | ||
|
|
0b114e7dc1 | ||
|
|
981876c43c | ||
|
|
7fe9c477e3 | ||
|
|
5b3a7f4e02 | ||
|
|
60e20c4023 | ||
|
|
9e1bb6c075 | ||
|
|
9c05d0d803 | ||
|
|
3d1393c0b3 | ||
|
|
9914fdb111 | ||
|
|
9b24c9f1b5 | ||
|
|
81b8c646d2 | ||
|
|
f734832e0f | ||
|
|
1bde11b30b |
18
.env.example
18
.env.example
@@ -1,15 +1,17 @@
|
||||
APP_NAME=Heimdall
|
||||
APP_ENV=local
|
||||
APP_KEY=
|
||||
APP_DEBUG=true
|
||||
APP_LOG_LEVEL=debug
|
||||
APP_DEBUG=false
|
||||
APP_URL=http://localhost
|
||||
|
||||
LOG_CHANNEL=daily
|
||||
|
||||
DB_CONNECTION=sqlite
|
||||
DB_DATABASE=app.sqlite
|
||||
|
||||
BROADCAST_DRIVER=log
|
||||
CACHE_DRIVER=file
|
||||
QUEUE_CONNECTION=sync
|
||||
SESSION_DRIVER=file
|
||||
SESSION_LIFETIME=120
|
||||
QUEUE_DRIVER=sync
|
||||
@@ -18,14 +20,24 @@ REDIS_HOST=127.0.0.1
|
||||
REDIS_PASSWORD=null
|
||||
REDIS_PORT=6379
|
||||
|
||||
MAIL_DRIVER=smtp
|
||||
MAIL_MAILER=smtp
|
||||
MAIL_HOST=smtp.mailtrap.io
|
||||
MAIL_PORT=2525
|
||||
MAIL_USERNAME=null
|
||||
MAIL_PASSWORD=null
|
||||
MAIL_ENCRYPTION=null
|
||||
MAIL_FROM_ADDRESS=null
|
||||
MAIL_FROM_NAME="${APP_NAME}"
|
||||
|
||||
AWS_ACCESS_KEY_ID=
|
||||
AWS_SECRET_ACCESS_KEY=
|
||||
AWS_DEFAULT_REGION=us-east-1
|
||||
AWS_BUCKET=
|
||||
|
||||
PUSHER_APP_ID=
|
||||
PUSHER_APP_KEY=
|
||||
PUSHER_APP_SECRET=
|
||||
PUSHER_APP_CLUSTER=mt1
|
||||
|
||||
MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
|
||||
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"
|
||||
|
||||
14
SECURITY.md
Normal file
14
SECURITY.md
Normal file
@@ -0,0 +1,14 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 2.3.x | :white_check_mark: |
|
||||
| < 2.3 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
You can report any vulnerabilities on our discord server by DM-ing a team member, or asking a team member to DM you.
|
||||
|
||||
https://discord.com/invite/YWrKVTn
|
||||
@@ -39,22 +39,86 @@ class Application extends Model
|
||||
public function class()
|
||||
{
|
||||
$name = $this->name;
|
||||
$name = preg_replace('/\PL/u', '', $name);
|
||||
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
|
||||
|
||||
$class = '\App\SupportedApps\\'.$name.'\\'.$name;
|
||||
return $class;
|
||||
}
|
||||
|
||||
public static function classFromName($name)
|
||||
{
|
||||
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
|
||||
|
||||
$class = '\App\SupportedApps\\'.$name.'\\'.$name;
|
||||
return $class;
|
||||
}
|
||||
|
||||
|
||||
public static function apps()
|
||||
{
|
||||
$json = json_decode(file_get_contents(storage_path('app/supportedapps.json'))) ?? [];
|
||||
$apps = collect($json->apps);
|
||||
$sorted = $apps->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);
|
||||
return $sorted;
|
||||
}
|
||||
|
||||
public static function autocomplete()
|
||||
{
|
||||
$apps = self::apps();
|
||||
$list = [];
|
||||
foreach($apps as $app) {
|
||||
$list[] = (object)[
|
||||
'label' => $app->name,
|
||||
'value' => $app->appid
|
||||
];
|
||||
}
|
||||
return $list;
|
||||
}
|
||||
|
||||
public static function getApp($appid)
|
||||
{
|
||||
$localapp = Application::where('appid', $appid)->first();
|
||||
$app = self::single($appid);
|
||||
|
||||
$application = ($localapp) ? $localapp : new Application;
|
||||
|
||||
if(!file_exists(app_path('SupportedApps/'.className($app->name)))) {
|
||||
SupportedApps::getFiles($app);
|
||||
SupportedApps::saveApp($app, $application);
|
||||
} else {
|
||||
// check if there has been an update for this app
|
||||
if($localapp) {
|
||||
if($localapp->sha !== $app->sha) {
|
||||
SupportedApps::getFiles($app);
|
||||
$app = SupportedApps::saveApp($app, $application);
|
||||
}
|
||||
} else {
|
||||
SupportedApps::getFiles($app);
|
||||
$app = SupportedApps::saveApp($app, $application);
|
||||
|
||||
}
|
||||
}
|
||||
return $app;
|
||||
|
||||
}
|
||||
|
||||
public static function single($appid)
|
||||
{
|
||||
$apps = self::apps();
|
||||
$app = $apps->where('appid', $appid)->first();
|
||||
if ($app === null) return null;
|
||||
$classname = preg_replace('/[^\p{L}\p{N}]/u', '', $app->name);
|
||||
$app->class = '\App\SupportedApps\\'.$classname.'\\'.$classname;
|
||||
return $app;
|
||||
}
|
||||
|
||||
public static function applist()
|
||||
{
|
||||
$list = [];
|
||||
$all = self::orderBy('name')->get()->sortBy('name', SORT_NATURAL|SORT_FLAG_CASE);
|
||||
$list['null'] = 'None';
|
||||
foreach($all as $app) {
|
||||
$name = $app->name;
|
||||
$name = preg_replace('/\PL/u', '', $name);
|
||||
|
||||
$list['\App\SupportedApps\\'.$name.'\\'.$name] = $app->name;
|
||||
$apps = self::apps();
|
||||
foreach($apps as $app) {
|
||||
$list[$app->appid] = $app->name;
|
||||
}
|
||||
return $list;
|
||||
}
|
||||
|
||||
@@ -2,8 +2,8 @@
|
||||
|
||||
namespace App\Exceptions;
|
||||
|
||||
use Exception;
|
||||
use Illuminate\Foundation\Exceptions\Handler as ExceptionHandler;
|
||||
use Throwable;
|
||||
|
||||
class Handler extends ExceptionHandler
|
||||
{
|
||||
@@ -22,32 +22,20 @@ class Handler extends ExceptionHandler
|
||||
* @var array
|
||||
*/
|
||||
protected $dontFlash = [
|
||||
'current_password',
|
||||
'password',
|
||||
'password_confirmation',
|
||||
];
|
||||
|
||||
/**
|
||||
* Report or log an exception.
|
||||
* Register the exception handling callbacks for the application.
|
||||
*
|
||||
* This is a great spot to send exceptions to Sentry, Bugsnag, etc.
|
||||
*
|
||||
* @param \Exception $exception
|
||||
* @return void
|
||||
*/
|
||||
public function report(Exception $exception)
|
||||
public function register()
|
||||
{
|
||||
parent::report($exception);
|
||||
}
|
||||
|
||||
/**
|
||||
* Render an exception into an HTTP response.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Exception $exception
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function render($request, Exception $exception)
|
||||
{
|
||||
return parent::render($request, $exception);
|
||||
$this->reportable(function (Throwable $e) {
|
||||
//
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
function format_bytes($bytes, $is_drive_size = true, $beforeunit = '', $afterunit = '')
|
||||
{
|
||||
$btype = ($is_drive_size === true) ? 1000 : 1024;
|
||||
@@ -11,6 +13,27 @@ function format_bytes($bytes, $is_drive_size = true, $beforeunit = '', $afteruni
|
||||
else return(round($bytes, 0).$beforeunit.$labels[$x].$afterunit);
|
||||
}
|
||||
|
||||
function str_slug($title, $separator = '-', $language = 'en')
|
||||
{
|
||||
return Str::slug($title, $separator, $language);
|
||||
}
|
||||
|
||||
if (! function_exists('str_is')) {
|
||||
/**
|
||||
* Determine if a given string matches a given pattern.
|
||||
*
|
||||
* @param string|array $pattern
|
||||
* @param string $value
|
||||
* @return bool
|
||||
*
|
||||
* @deprecated Str::is() should be used directly instead. Will be removed in Laravel 6.0.
|
||||
*/
|
||||
function str_is($pattern, $value)
|
||||
{
|
||||
return Str::is($pattern, $value);
|
||||
}
|
||||
}
|
||||
|
||||
function get_brightness($hex) {
|
||||
// returns brightness value from 0 to 255
|
||||
// strip off any leading #
|
||||
@@ -50,7 +73,7 @@ function getLinkTargetAttribute()
|
||||
|
||||
function className($name)
|
||||
{
|
||||
$name = preg_replace('/\PL/u', '', $name);
|
||||
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
|
||||
return $name;
|
||||
}
|
||||
|
||||
|
||||
@@ -15,6 +15,11 @@ use App\Jobs\ProcessApps;
|
||||
use App\Search;
|
||||
use Illuminate\Support\Facades\Route;
|
||||
|
||||
use GuzzleHttp\Exception\GuzzleException;
|
||||
use GuzzleHttp\Client;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
|
||||
class ItemController extends Controller
|
||||
{
|
||||
public function __construct()
|
||||
@@ -140,20 +145,41 @@ class ItemController extends Controller
|
||||
//
|
||||
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
|
||||
$data['tags']->prepend(__('app.dashboard'), 0);
|
||||
$data['current_tags'] = collect([0 => __('app.dashboard')]);
|
||||
$data['current_tags'] = '0';
|
||||
return view('items.create', $data);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
public function edit($id)
|
||||
{
|
||||
//
|
||||
// Get the item
|
||||
$item = Item::find($id);
|
||||
if($item->appid === null && $item->class !== null) { // old apps wont have an app id so set it
|
||||
$app = Application::where('class', $item->class)->first();
|
||||
if($app) {
|
||||
$item->appid = $app->appid;
|
||||
}
|
||||
}
|
||||
$data['item'] = $item;
|
||||
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
|
||||
$data['tags']->prepend(__('app.dashboard'), 0);
|
||||
$data['current_tags'] = $data['item']->tags();
|
||||
//$data['current_tags'] = $data['item']->parent;
|
||||
//die(print_r($data['current_tags']));
|
||||
// show the edit form and pass the nerd
|
||||
return view('items.edit', $data);
|
||||
}
|
||||
|
||||
|
||||
public function storelogic($request, $id = null)
|
||||
{
|
||||
$application = Application::single($request->input('appid'));
|
||||
$validatedData = $request->validate([
|
||||
'title' => 'required|max:255',
|
||||
'url' => 'required',
|
||||
@@ -164,6 +190,22 @@ class ItemController extends Controller
|
||||
$request->merge([
|
||||
'icon' => $path
|
||||
]);
|
||||
} elseif(strpos($request->input('icon'), 'http') === 0) {
|
||||
$contents = file_get_contents($request->input('icon'));
|
||||
|
||||
if ($application) {
|
||||
$icon = $application->icon;
|
||||
} else {
|
||||
$file = $request->input('icon');
|
||||
$path_parts = pathinfo($file);
|
||||
$icon = md5($contents);
|
||||
$icon .= '.'.$path_parts['extension'];
|
||||
}
|
||||
$path = 'icons/'.$icon;
|
||||
Storage::disk('public')->put($path, $contents);
|
||||
$request->merge([
|
||||
'icon' => $path
|
||||
]);
|
||||
}
|
||||
|
||||
$config = Item::checkConfig($request->input('config'));
|
||||
@@ -173,21 +215,40 @@ class ItemController extends Controller
|
||||
'user_id' => $current_user->id
|
||||
]);
|
||||
|
||||
if($request->input('class') === 'null') {
|
||||
if($request->input('appid') === 'null') {
|
||||
$request->merge([
|
||||
'class' => null,
|
||||
]);
|
||||
} else {
|
||||
$request->merge([
|
||||
'class' => Application::classFromName($application->name),
|
||||
]);
|
||||
|
||||
}
|
||||
|
||||
|
||||
//die(print_r($request->input('config')));
|
||||
|
||||
$item = Item::create($request->all());
|
||||
if($id === null) {
|
||||
$item = Item::create($request->all());
|
||||
} else {
|
||||
$item = Item::find($id);
|
||||
$item->update($request->all());
|
||||
}
|
||||
|
||||
//Search::storeSearchProvider($request->input('class'), $item);
|
||||
|
||||
$item->parents()->sync($request->tags);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Store a newly created resource in storage.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function store(Request $request)
|
||||
{
|
||||
$this->storelogic($request);
|
||||
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success', __('app.alert.success.item_created'));
|
||||
@@ -204,24 +265,6 @@ class ItemController extends Controller
|
||||
//
|
||||
}
|
||||
|
||||
/**
|
||||
* Show the form for editing the specified resource.
|
||||
*
|
||||
* @param int $id
|
||||
* @return \Illuminate\Http\Response
|
||||
*/
|
||||
public function edit($id)
|
||||
{
|
||||
// Get the item
|
||||
$data['item'] = Item::find($id);
|
||||
$data['tags'] = Item::ofType('tag')->orderBy('title', 'asc')->pluck('title', 'id');
|
||||
$data['tags']->prepend(__('app.dashboard'), 0);
|
||||
$data['current_tags'] = $data['item']->tags();
|
||||
//$data['current_tags'] = $data['item']->parent;
|
||||
//die(print_r($data['current_tags']));
|
||||
// show the edit form and pass the nerd
|
||||
return view('items.edit', $data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the specified resource in storage.
|
||||
@@ -232,39 +275,7 @@ class ItemController extends Controller
|
||||
*/
|
||||
public function update(Request $request, $id)
|
||||
{
|
||||
$validatedData = $request->validate([
|
||||
'title' => 'required|max:255',
|
||||
'url' => 'required',
|
||||
]);
|
||||
//die(print_r($request->all()));
|
||||
if($request->hasFile('file')) {
|
||||
$path = $request->file('file')->store('icons');
|
||||
$request->merge([
|
||||
'icon' => $path
|
||||
]);
|
||||
}
|
||||
|
||||
$config = Item::checkConfig($request->input('config'));
|
||||
$current_user = User::currentUser();
|
||||
$request->merge([
|
||||
'description' => $config,
|
||||
'user_id' => $current_user->id
|
||||
]);
|
||||
|
||||
if($request->input('class') === 'null') {
|
||||
$request->merge([
|
||||
'class' => null,
|
||||
]);
|
||||
}
|
||||
|
||||
|
||||
$item = Item::find($id);
|
||||
$item->update($request->all());
|
||||
|
||||
//Search::storeSearchProvider($request->input('class'), $item);
|
||||
|
||||
$item->parents()->sync($request->tags);
|
||||
|
||||
$this->storelogic($request, $id);
|
||||
$route = route('dash', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.item_updated'));
|
||||
@@ -306,7 +317,7 @@ class ItemController extends Controller
|
||||
->where('id', $id)
|
||||
->restore();
|
||||
|
||||
$route = route('items.inded', []);
|
||||
$route = route('items.index', []);
|
||||
return redirect($route)
|
||||
->with('success',__('app.alert.success.item_restored'));
|
||||
}
|
||||
@@ -319,7 +330,10 @@ class ItemController extends Controller
|
||||
public function appload(Request $request)
|
||||
{
|
||||
$output = [];
|
||||
$appname = $request->input('app');
|
||||
$appid = $request->input('app');
|
||||
|
||||
if($appid === "null") return null;
|
||||
/*$appname = $request->input('app');
|
||||
//die($appname);
|
||||
|
||||
$app_details = Application::where('name', $appname)->firstOrFail();
|
||||
@@ -338,8 +352,28 @@ class ItemController extends Controller
|
||||
$output['config'] = className($app_details->name).'.config';
|
||||
} else {
|
||||
$output['config'] = null;
|
||||
}*/
|
||||
|
||||
$output['config'] = null;
|
||||
$output['custom'] = null;
|
||||
|
||||
$app = Application::single($appid);
|
||||
$output = (array)$app;
|
||||
|
||||
$appdetails = Application::getApp($appid);
|
||||
|
||||
if((boolean)$app->enhanced === true) {
|
||||
// if(!isset($app->config)) { // class based config
|
||||
$output['custom'] = className($appdetails->name).'.config';
|
||||
// }
|
||||
}
|
||||
|
||||
$output['colour'] = ($app->tile_background == 'light') ? '#fafbfc' : '#161b1f';
|
||||
$output['iconview'] = config('app.appsource').'icons/' . $app->icon;
|
||||
|
||||
;
|
||||
|
||||
|
||||
return json_encode($output);
|
||||
}
|
||||
|
||||
@@ -347,14 +381,49 @@ class ItemController extends Controller
|
||||
{
|
||||
$data = $request->input('data');
|
||||
//$url = $data[array_search('url', array_column($data, 'name'))]['value'];
|
||||
|
||||
$app = $data['type'];
|
||||
$single = Application::single($data['type']);
|
||||
$app = $single->class;
|
||||
|
||||
$app_details = new $app();
|
||||
$app_details->config = (object)$data;
|
||||
$app_details->test();
|
||||
}
|
||||
|
||||
public function execute($url, $attrs = [], $overridevars=false)
|
||||
{
|
||||
$res = null;
|
||||
|
||||
$vars = ($overridevars !== false) ?
|
||||
$overridevars : [
|
||||
'http_errors' => false,
|
||||
'timeout' => 15,
|
||||
'connect_timeout' => 15,
|
||||
'verify' => false
|
||||
];
|
||||
|
||||
$client = new Client($vars);
|
||||
|
||||
$method = 'GET';
|
||||
|
||||
try {
|
||||
return $client->request($method, $url, $attrs);
|
||||
} catch (\GuzzleHttp\Exception\ConnectException $e) {
|
||||
Log::error("Connection refused");
|
||||
Log::debug($e->getMessage());
|
||||
} catch (\GuzzleHttp\Exception\ServerException $e) {
|
||||
Log::debug($e->getMessage());
|
||||
}
|
||||
return $res;
|
||||
}
|
||||
|
||||
|
||||
public function websitelookup($url)
|
||||
{
|
||||
$url = \base64_decode($url);
|
||||
$data = $this->execute($url);
|
||||
return $data->getBody();
|
||||
}
|
||||
|
||||
public function getStats($id)
|
||||
{
|
||||
$item = Item::find($id);
|
||||
|
||||
@@ -16,7 +16,7 @@ class SearchController extends Controller
|
||||
$provider = Search::providerDetails($requestprovider);
|
||||
|
||||
if($provider->type == 'standard') {
|
||||
return redirect($provider->url.'?'.$provider->var.'='.urlencode($query));
|
||||
return redirect($provider->url.'?'.$provider->query.'='.urlencode($query));
|
||||
} elseif($provider->type == 'external') {
|
||||
$class = new $provider->class;
|
||||
//print_r($provider);
|
||||
|
||||
@@ -66,7 +66,7 @@ class SettingsController extends Controller
|
||||
$user = $this->user();
|
||||
|
||||
if (!is_null($setting)) {
|
||||
$data = Setting::getInput();
|
||||
$data = Setting::getInput($request);
|
||||
|
||||
$setting_value = null;
|
||||
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Illuminate\Foundation\Http\Middleware\VerifyCsrfToken as Middleware;
|
||||
use Symfony\Component\HttpFoundation\Cookie;
|
||||
|
||||
class VerifyCsrfToken extends Middleware
|
||||
{
|
||||
@@ -18,4 +19,40 @@ class VerifyCsrfToken extends Middleware
|
||||
'test_config',
|
||||
//'get_stats'
|
||||
];
|
||||
|
||||
/**
|
||||
* Add the CSRF token to the response cookies.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @param \Symfony\Component\HttpFoundation\Response $response
|
||||
* @return \Symfony\Component\HttpFoundation\Response
|
||||
*/
|
||||
protected function addCookieToResponse($request, $response)
|
||||
{
|
||||
$config = config('session');
|
||||
|
||||
if ($response instanceof Responsable) {
|
||||
$response = $response->toResponse($request);
|
||||
}
|
||||
|
||||
$response->headers->setCookie(
|
||||
new Cookie(
|
||||
'HEIMDALL-XSRF-TOKEN', $request->session()->token(), $this->availableAt(60 * $config['lifetime']),
|
||||
$config['path'], $config['domain'], $config['secure'], false, false, $config['same_site'] ?? null
|
||||
)
|
||||
);
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine if the cookie contents should be serialized.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public static function serialized()
|
||||
{
|
||||
return EncryptCookies::serialized('HEIMDALL-XSRF-TOKEN');
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
33
app/Item.php
33
app/Item.php
@@ -30,7 +30,7 @@ class Item extends Model
|
||||
|
||||
//
|
||||
protected $fillable = [
|
||||
'title', 'url', 'colour', 'icon', 'description', 'pinned', 'order', 'type', 'class', 'user_id'
|
||||
'title', 'url', 'colour', 'icon', 'appdescription', 'description', 'pinned', 'order', 'type', 'class', 'user_id', 'appid'
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -53,22 +53,10 @@ class Item extends Model
|
||||
|
||||
public static function checkConfig($config)
|
||||
{
|
||||
// die(print_r($config));
|
||||
if(empty($config)) {
|
||||
$config = null;
|
||||
} else {
|
||||
$store = false;
|
||||
//die(var_dump($config));
|
||||
foreach($config as $key => $check) {
|
||||
if($key == 'type') continue;
|
||||
if($key == 'dataonly') continue;
|
||||
if(!empty($check) && $check != '0') {
|
||||
$store = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
//die(var_dump($store))
|
||||
|
||||
$config['enabled'] = ($store) ? true : false;
|
||||
$config = json_encode($config);
|
||||
}
|
||||
return $config;
|
||||
@@ -106,7 +94,7 @@ class Item extends Model
|
||||
public function getLinkAttribute()
|
||||
{
|
||||
if((int)$this->type === 1) {
|
||||
return '/tag/'.$this->url;
|
||||
return url('tag/'.$this->url);
|
||||
} else {
|
||||
return $this->url;
|
||||
}
|
||||
@@ -173,12 +161,13 @@ class Item extends Model
|
||||
|
||||
public function enhanced()
|
||||
{
|
||||
if(isset($this->class) && !empty($this->class)) {
|
||||
/*if(isset($this->class) && !empty($this->class)) {
|
||||
$app = new $this->class;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
return (bool)($app instanceof \App\EnhancedApps);
|
||||
return (bool)($app instanceof \App\EnhancedApps);*/
|
||||
return $this->description !== null;
|
||||
}
|
||||
|
||||
public static function isEnhanced($class)
|
||||
@@ -207,13 +196,15 @@ class Item extends Model
|
||||
|
||||
public function getconfig()
|
||||
{
|
||||
$explode = explode('\\', $this->class);
|
||||
// $explode = explode('\\', $this->class);
|
||||
|
||||
|
||||
if(!isset($this->description) || empty($this->description)) {
|
||||
$config = new \stdClass;
|
||||
$config->name = end($explode);
|
||||
// $config->name = end($explode);
|
||||
$config->enabled = false;
|
||||
$config->override_url = null;
|
||||
$config->apikey = null;
|
||||
return $config;
|
||||
}
|
||||
|
||||
@@ -221,12 +212,14 @@ class Item extends Model
|
||||
|
||||
$config = json_decode($this->description);
|
||||
|
||||
$config->name = end($explode);
|
||||
// $config->name = end($explode);
|
||||
|
||||
|
||||
$config->url = $this->url;
|
||||
if(isset($config->override_url) && !empty($config->override_url)) {
|
||||
$config->url = $config->override_url;
|
||||
} else {
|
||||
$config->override_url = null;
|
||||
}
|
||||
|
||||
return $config;
|
||||
|
||||
@@ -7,8 +7,10 @@ use Illuminate\Queue\SerializesModels;
|
||||
use Illuminate\Queue\InteractsWithQueue;
|
||||
use Illuminate\Contracts\Queue\ShouldQueue;
|
||||
use Illuminate\Foundation\Bus\Dispatchable;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
use App\Application;
|
||||
use App\SupportedApps;
|
||||
use App\Item;
|
||||
|
||||
class ProcessApps implements ShouldQueue
|
||||
{
|
||||
@@ -31,36 +33,23 @@ class ProcessApps implements ShouldQueue
|
||||
*/
|
||||
public function handle()
|
||||
{
|
||||
$localapps = Application::all();
|
||||
$list = json_decode(SupportedApps::getList()->getBody());
|
||||
$validapps = [];
|
||||
|
||||
foreach($list->apps as $app) {
|
||||
$validapps[] = $app->appid;
|
||||
$localapp = $localapps->where('appid', $app->appid)->first();
|
||||
$localapps = Application::whereNull('class')->get();
|
||||
$json = SupportedApps::getList()->getBody();
|
||||
|
||||
$application = ($localapp) ? $localapp : new Application;
|
||||
Storage::disk('local')->put('supportedapps.json', $json);
|
||||
|
||||
if(!file_exists(app_path('SupportedApps/'.className($app->name)))) {
|
||||
SupportedApps::getFiles($app);
|
||||
SupportedApps::saveApp($app, $application);
|
||||
} else {
|
||||
// check if there has been an update for this app
|
||||
$localapp = $localapps->where('appid', $app->appid)->first();
|
||||
if($localapp) {
|
||||
if($localapp->sha !== $app->sha) {
|
||||
SupportedApps::getFiles($app);
|
||||
SupportedApps::saveApp($app, $application);
|
||||
}
|
||||
} else {
|
||||
SupportedApps::getFiles($app);
|
||||
SupportedApps::saveApp($app, $application);
|
||||
|
||||
}
|
||||
foreach($localapps as $app) {
|
||||
$app->class = $app->class();
|
||||
$app->save();
|
||||
}
|
||||
|
||||
$items = Item::whereNotNull('class')->get();
|
||||
foreach($items as $item) {
|
||||
if(!file_exists(app_path('SupportedApps/'.Item::nameFromClass($item->class)))) {
|
||||
$app = Application::where('class', $item->class)->first();
|
||||
Application::getApp($app->appid);
|
||||
}
|
||||
}
|
||||
//$delete = Application::whereNotIn('appid', $validapps)->delete(); // delete any apps not in list
|
||||
// removed the delete so local apps can be added
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -52,6 +52,10 @@ class AppServiceProvider extends ServiceProvider
|
||||
Artisan::call('storage:link');
|
||||
\Session::put('current_user', null);
|
||||
}
|
||||
|
||||
$lang = Setting::fetch('language');
|
||||
\App::setLocale($lang);
|
||||
|
||||
|
||||
$applications = Application::all();
|
||||
if($applications->count() <= 0) {
|
||||
@@ -72,7 +76,8 @@ class AppServiceProvider extends ServiceProvider
|
||||
explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
|
||||
}
|
||||
if(!\Auth::check()) {
|
||||
if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])) {
|
||||
if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])
|
||||
&& !empty($_SERVER['PHP_AUTH_USER']) && !empty($_SERVER['PHP_AUTH_PW'])) {
|
||||
$credentials = ['username' => $_SERVER['PHP_AUTH_USER'], 'password' => $_SERVER['PHP_AUTH_PW']];
|
||||
|
||||
if (\Auth::attempt($credentials, true)) {
|
||||
@@ -84,18 +89,18 @@ class AppServiceProvider extends ServiceProvider
|
||||
}
|
||||
elseif(isset($_SERVER['REMOTE_USER']) && !empty($_SERVER['REMOTE_USER'])) {
|
||||
$user = User::where('username', $_SERVER['REMOTE_USER'])->first();
|
||||
\Auth::login($user, true);
|
||||
session(['current_user' => $user]);
|
||||
if ($user) {
|
||||
\Auth::login($user, true);
|
||||
session(['current_user' => $user]);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
$alt_bg = '';
|
||||
if($bg_image = Setting::fetch('background_image')) {
|
||||
$alt_bg = ' style="background-image: url(/storage/'.$bg_image.')"';
|
||||
$alt_bg = ' style="background-image: url(storage/'.$bg_image.')"';
|
||||
}
|
||||
$lang = Setting::fetch('language');
|
||||
\App::setLocale($lang);
|
||||
|
||||
$allusers = User::all();
|
||||
$current_user = User::currentUser();
|
||||
|
||||
@@ -6,6 +6,7 @@ use App\Item;
|
||||
use App\Setting;
|
||||
use Form;
|
||||
use Cache;
|
||||
use Yaml;
|
||||
|
||||
abstract class Search
|
||||
{
|
||||
@@ -19,7 +20,7 @@ abstract class Search
|
||||
{
|
||||
$providers = self::standardProviders();
|
||||
$providers = $providers + self::appProviders();
|
||||
return $providers;
|
||||
return collect($providers);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -41,38 +42,16 @@ abstract class Search
|
||||
*/
|
||||
public static function standardProviders()
|
||||
{
|
||||
return [
|
||||
'google' => [
|
||||
'url' => 'https://www.google.com/search',
|
||||
'var' => 'q',
|
||||
'method' => 'get',
|
||||
'type' => 'standard',
|
||||
],
|
||||
'ddg' => [
|
||||
'url' => 'https://duckduckgo.com/',
|
||||
'var' => 'q',
|
||||
'method' => 'get',
|
||||
'type' => 'standard',
|
||||
],
|
||||
'bing' => [
|
||||
'url' => 'https://www.bing.com/search',
|
||||
'var' => 'q',
|
||||
'method' => 'get',
|
||||
'type' => 'standard',
|
||||
],
|
||||
'qwant' => [
|
||||
'url' => 'https://www.qwant.com/',
|
||||
'var' => 'q',
|
||||
'method' => 'get',
|
||||
'type' => 'standard',
|
||||
],
|
||||
'startpage' => [
|
||||
'url' => 'https://www.startpage.com/do/dsearch',
|
||||
'var' => 'query',
|
||||
'method' => 'get',
|
||||
'type' => 'standard',
|
||||
],
|
||||
];
|
||||
// $providers = json_decode(file_get_contents(storage_path('app/searchproviders.json')));
|
||||
// print_r($providers);
|
||||
$providers = Yaml::parseFile(storage_path('app/searchproviders.yaml'));
|
||||
$all = [];
|
||||
foreach($providers as $key => $provider) {
|
||||
$all[$key] = $provider;
|
||||
$all[$key]['type'] = 'standard';
|
||||
}
|
||||
|
||||
return $all;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -89,10 +68,15 @@ abstract class Search
|
||||
if(empty($app->class)) continue;
|
||||
if(($provider = Item::isSearchProvider($app->class)) !== false) {
|
||||
$name = Item::nameFromClass($app->class);
|
||||
$providers[strtolower($name)] = [
|
||||
$providers[$app->id] = [
|
||||
'id' => $app->id,
|
||||
'type' => $provider->type,
|
||||
'class' => $app->class,
|
||||
'url' => $app->url,
|
||||
'name' => $app->title,
|
||||
'colour' => $app->colour,
|
||||
'icon' => $app->icon,
|
||||
'description' => $app->description
|
||||
];
|
||||
|
||||
}
|
||||
@@ -129,8 +113,8 @@ abstract class Search
|
||||
$output .= '<div id="search-container" class="input-container">';
|
||||
$output .= '<select name="provider">';
|
||||
foreach(self::providers() as $key => $searchprovider) {
|
||||
$selected = ($key === $user_search_provider) ? ' selected="selected"' : '';
|
||||
$output .= '<option value="'.$key.'"'.$selected.'>'.__('app.options.'.$key).'</option>';
|
||||
$selected = ((string)$key === (string)$user_search_provider) ? ' selected="selected"' : '';
|
||||
$output .= '<option value="'.$key.'"'.$selected.'>'.$searchprovider['name'].'</option>';
|
||||
}
|
||||
$output .= '</select>';
|
||||
$output .= Form::text('q', null, ['class' => 'homesearch', 'autofocus' => 'autofocus', 'placeholder' => __('app.settings.search').'...']);
|
||||
@@ -144,4 +128,4 @@ abstract class Search
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -8,6 +8,7 @@ use Form;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use App\User;
|
||||
use App\Search;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class Setting extends Model
|
||||
{
|
||||
@@ -39,11 +40,11 @@ class Setting extends Model
|
||||
/**
|
||||
* @return array
|
||||
*/
|
||||
public static function getInput()
|
||||
public static function getInput(Request $request)
|
||||
{
|
||||
return (object) [
|
||||
'value' => Input::get('value'),
|
||||
'image' => Input::file('value'),
|
||||
'value' => $request->input('value'),
|
||||
'image' => $request->file('value'),
|
||||
];
|
||||
}
|
||||
|
||||
@@ -73,6 +74,9 @@ class Setting extends Model
|
||||
case 'select':
|
||||
if(!empty($this->value) && $this->value !== 'none') {
|
||||
$options = (array)json_decode($this->options);
|
||||
if($this->key === 'search_provider') {
|
||||
$options = Search::providers()->pluck('name', 'id')->toArray();
|
||||
}
|
||||
$value = __($options[$this->value]);
|
||||
} else {
|
||||
$value = __('app.options.none');
|
||||
@@ -121,11 +125,17 @@ class Setting extends Model
|
||||
break;
|
||||
case 'select':
|
||||
$options = json_decode($this->options);
|
||||
if($this->key === 'search_provider') {
|
||||
$options = Search::providers()->pluck('name', 'id');
|
||||
}
|
||||
foreach($options as $key => $opt) {
|
||||
$options->$key = __($opt);
|
||||
}
|
||||
$value = Form::select('value', $options, null, ['class' => 'form-control']);
|
||||
break;
|
||||
case 'textarea':
|
||||
$value = Form::textarea('value', null, ['class' => 'form-control', 'cols' => '44', 'rows' => '15']);
|
||||
break;
|
||||
default:
|
||||
$value = Form::text('value', null, ['class' => 'form-control']);
|
||||
break;
|
||||
|
||||
@@ -107,7 +107,8 @@ abstract class SupportedApps
|
||||
|
||||
public static function getList()
|
||||
{
|
||||
$list_url = 'https://apps.heimdall.site/list';
|
||||
// $list_url = 'https://apps.heimdall.site/list';
|
||||
$list_url = config('app.appsource').'list.json';
|
||||
$client = new Client(['http_errors' => false, 'timeout' => 15, 'connect_timeout' => 15]);
|
||||
return $client->request('GET', $list_url);
|
||||
}
|
||||
@@ -121,7 +122,8 @@ abstract class SupportedApps
|
||||
|
||||
public static function getFiles($app)
|
||||
{
|
||||
$zipurl = $app->files;
|
||||
$zipurl = config('app.appsource').'files/'.$app->sha.'.zip';
|
||||
|
||||
$client = new Client(['http_errors' => false, 'timeout' => 60, 'connect_timeout' => 15]);
|
||||
$res = $client->request('GET', $zipurl);
|
||||
|
||||
@@ -138,35 +140,28 @@ abstract class SupportedApps
|
||||
$zip->extractTo(app_path('SupportedApps')); // place in the directory with same name
|
||||
$zip->close();
|
||||
unlink($src); //Deleting the Zipped file
|
||||
} else {
|
||||
var_dump($x);
|
||||
}
|
||||
}
|
||||
|
||||
public static function saveApp($details, $app)
|
||||
{
|
||||
if(!file_exists(storage_path('app/public/icons'))) {
|
||||
mkdir(storage_path('app/public/icons'), 0777, true);
|
||||
}
|
||||
|
||||
$img_src = app_path('SupportedApps/'.className($details->name).'/'.$details->icon);
|
||||
$img_dest = storage_path('app/public/icons/'.$details->icon);
|
||||
//die("i: ".$img_src);
|
||||
@copy($img_src, $img_dest);
|
||||
|
||||
{
|
||||
$app->appid = $details->appid;
|
||||
$app->name = $details->name;
|
||||
$app->sha = $details->sha ?? null;
|
||||
$app->icon = 'icons/'.$details->icon;
|
||||
$app->website = $details->website;
|
||||
$app->license = $details->license;
|
||||
$app->description = $details->description;
|
||||
|
||||
$appclass = $app->class();
|
||||
$application = new $appclass;
|
||||
$enhanced = (bool)($application instanceof \App\EnhancedApps);
|
||||
|
||||
$app->class = $appclass;
|
||||
$app->enhanced = $enhanced;
|
||||
$app->tile_background = $details->tile_background;
|
||||
$app->save();
|
||||
return $app;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -5,14 +5,15 @@
|
||||
"license": "MIT",
|
||||
"type": "project",
|
||||
"require": {
|
||||
"php": ">=7.0.0",
|
||||
"php": ">=7.2.5",
|
||||
"fideloper/proxy": "^4.0",
|
||||
"graham-campbell/github": "^7.5",
|
||||
"guzzlehttp/guzzle": "^6.3",
|
||||
"laravel/framework": "5.7.*",
|
||||
"laravel/tinker": "~1.0",
|
||||
"laravelcollective/html": "^5.5",
|
||||
"php-http/guzzle6-adapter": "^1.1"
|
||||
"graham-campbell/github": "^10.5",
|
||||
"guzzlehttp/guzzle": "^7.4",
|
||||
"laravel/framework": "^7.0",
|
||||
"laravel/tinker": "^2.0",
|
||||
"laravel/ui": "^2.4",
|
||||
"laravelcollective/html": "^6.0",
|
||||
"symfony/yaml": "^5.4"
|
||||
},
|
||||
"require-dev": {
|
||||
"filp/whoops": "~2.0",
|
||||
@@ -59,6 +60,10 @@
|
||||
"config": {
|
||||
"preferred-install": "dist",
|
||||
"sort-packages": true,
|
||||
"optimize-autoloader": true
|
||||
"optimize-autoloader": true,
|
||||
"allow-plugins": {
|
||||
"kylekatarnls/update-helper": true,
|
||||
"symfony/thanks": true
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
5342
composer.lock
generated
5342
composer.lock
generated
File diff suppressed because it is too large
Load Diff
@@ -14,7 +14,7 @@ return [
|
||||
*/
|
||||
|
||||
'name' => env('APP_NAME', 'Heimdall'),
|
||||
'version' => '2.2.2',
|
||||
'version' => '2.4.3',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -54,6 +54,8 @@ return [
|
||||
*/
|
||||
|
||||
'url' => env('APP_URL', 'http://localhost'),
|
||||
'appsource' => env('APP_SOURCE', 'https://appslist.heimdall.site/'),
|
||||
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
@@ -228,6 +230,7 @@ return [
|
||||
'URL' => Illuminate\Support\Facades\URL::class,
|
||||
'Validator' => Illuminate\Support\Facades\Validator::class,
|
||||
'View' => Illuminate\Support\Facades\View::class,
|
||||
'Yaml' => Symfony\Component\Yaml\Yaml::class,
|
||||
|
||||
'SupportedApps' => App\SupportedApps::class,
|
||||
'EnhancedApps' => App\EnhancedApps::class,
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
@@ -107,13 +109,27 @@ return [
|
||||
|
||||
'redis' => [
|
||||
|
||||
'client' => 'predis',
|
||||
'client' => env('REDIS_CLIENT', 'phpredis'),
|
||||
|
||||
'options' => [
|
||||
'cluster' => env('REDIS_CLUSTER', 'redis'),
|
||||
'prefix' => env('REDIS_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_database_'),
|
||||
],
|
||||
|
||||
'default' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'password' => env('REDIS_PASSWORD', null),
|
||||
'port' => env('REDIS_PORT', 6379),
|
||||
'database' => 0,
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_DB', '0'),
|
||||
],
|
||||
|
||||
'cache' => [
|
||||
'url' => env('REDIS_URL'),
|
||||
'host' => env('REDIS_HOST', '127.0.0.1'),
|
||||
'password' => env('REDIS_PASSWORD', null),
|
||||
'port' => env('REDIS_PORT', '6379'),
|
||||
'database' => env('REDIS_CACHE_DB', '1'),
|
||||
],
|
||||
|
||||
],
|
||||
|
||||
104
config/logging.php
Normal file
104
config/logging.php
Normal file
@@ -0,0 +1,104 @@
|
||||
<?php
|
||||
|
||||
use Monolog\Handler\NullHandler;
|
||||
use Monolog\Handler\StreamHandler;
|
||||
use Monolog\Handler\SyslogUdpHandler;
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Default Log Channel
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| This option defines the default log channel that gets used when writing
|
||||
| messages to the logs. The name specified in this option should match
|
||||
| one of the channels defined in the "channels" configuration array.
|
||||
|
|
||||
*/
|
||||
|
||||
'default' => env('LOG_CHANNEL', 'stack'),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| Log Channels
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| Here you may configure the log channels for your application. Out of
|
||||
| the box, Laravel uses the Monolog PHP logging library. This gives
|
||||
| you a variety of powerful log handlers / formatters to utilize.
|
||||
|
|
||||
| Available Drivers: "single", "daily", "slack", "syslog",
|
||||
| "errorlog", "monolog",
|
||||
| "custom", "stack"
|
||||
|
|
||||
*/
|
||||
|
||||
'channels' => [
|
||||
'stack' => [
|
||||
'driver' => 'stack',
|
||||
'channels' => ['single'],
|
||||
'ignore_exceptions' => false,
|
||||
],
|
||||
|
||||
'single' => [
|
||||
'driver' => 'single',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => 'debug',
|
||||
],
|
||||
|
||||
'daily' => [
|
||||
'driver' => 'daily',
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
'level' => 'debug',
|
||||
'days' => 14,
|
||||
],
|
||||
|
||||
'slack' => [
|
||||
'driver' => 'slack',
|
||||
'url' => env('LOG_SLACK_WEBHOOK_URL'),
|
||||
'username' => 'Laravel Log',
|
||||
'emoji' => ':boom:',
|
||||
'level' => 'critical',
|
||||
],
|
||||
|
||||
'papertrail' => [
|
||||
'driver' => 'monolog',
|
||||
'level' => 'debug',
|
||||
'handler' => SyslogUdpHandler::class,
|
||||
'handler_with' => [
|
||||
'host' => env('PAPERTRAIL_URL'),
|
||||
'port' => env('PAPERTRAIL_PORT'),
|
||||
],
|
||||
],
|
||||
|
||||
'stderr' => [
|
||||
'driver' => 'monolog',
|
||||
'handler' => StreamHandler::class,
|
||||
'formatter' => env('LOG_STDERR_FORMATTER'),
|
||||
'with' => [
|
||||
'stream' => 'php://stderr',
|
||||
],
|
||||
],
|
||||
|
||||
'syslog' => [
|
||||
'driver' => 'syslog',
|
||||
'level' => 'debug',
|
||||
],
|
||||
|
||||
'errorlog' => [
|
||||
'driver' => 'errorlog',
|
||||
'level' => 'debug',
|
||||
],
|
||||
|
||||
'null' => [
|
||||
'driver' => 'monolog',
|
||||
'handler' => NullHandler::class,
|
||||
],
|
||||
|
||||
'emergency' => [
|
||||
'path' => storage_path('logs/laravel.log'),
|
||||
],
|
||||
],
|
||||
|
||||
];
|
||||
@@ -164,7 +164,7 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'secure' => env('SESSION_SECURE_COOKIE', false),
|
||||
'secure' => env('SESSION_SECURE_COOKIE', null),
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
|
||||
32
database/migrations/2022_03_15_140911_add_appid_to_items.php
Normal file
32
database/migrations/2022_03_15_140911_add_appid_to_items.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddAppidToItems extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('items', function (Blueprint $table) {
|
||||
$table->string('appid')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('items', function (Blueprint $table) {
|
||||
$table->dropColumn(['appid']);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddClassToApplication extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('applications', function (Blueprint $table) {
|
||||
$table->string('class')->nullable()->index();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('applications', function (Blueprint $table) {
|
||||
$table->dropColumn(['class']);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class AddAppDescriptionToItems extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('items', function (Blueprint $table) {
|
||||
$table->text('appdescription')->nullable();
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('items', function (Blueprint $table) {
|
||||
//
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -44,6 +44,16 @@ class SettingsSeeder extends Seeder
|
||||
$setting_group->title = 'app.settings.miscellaneous';
|
||||
$setting_group->save();
|
||||
}
|
||||
if(!$setting_group = SettingGroup::find(4)) {
|
||||
$setting_group = new SettingGroup;
|
||||
$setting_group->id = 4;
|
||||
$setting_group->title = 'app.settings.advanced';
|
||||
$setting_group->order = 3;
|
||||
$setting_group->save();
|
||||
} else {
|
||||
$setting_group->title = 'app.settings.advanced';
|
||||
$setting_group->save();
|
||||
}
|
||||
|
||||
if($version = Setting::find(1)) {
|
||||
$version->label = 'app.settings.version';
|
||||
@@ -96,7 +106,7 @@ class SettingsSeeder extends Seeder
|
||||
]);
|
||||
|
||||
if(!$setting = Setting::find(4)) {
|
||||
|
||||
|
||||
$setting = new Setting;
|
||||
$setting->id = 4;
|
||||
$setting->group_id = 3;
|
||||
@@ -117,9 +127,10 @@ class SettingsSeeder extends Seeder
|
||||
'en' => 'English',
|
||||
'fi' => 'Suomi (Finnish)',
|
||||
'fr' => 'Français (French)',
|
||||
'el' => 'Ελληνικά (Greek)',
|
||||
'it' => 'Italiano (Italian)',
|
||||
'no' => 'Norsk (Norwegian)',
|
||||
'pl' => 'Polski (Polish)',
|
||||
'no' => 'Norsk (Norwegian)',
|
||||
'pl' => 'Polski (Polish)',
|
||||
'sv' => 'Svenska (Swedish)',
|
||||
'es' => 'Español (Spanish)',
|
||||
'tr' => 'Türkçe (Turkish)',
|
||||
@@ -146,7 +157,7 @@ class SettingsSeeder extends Seeder
|
||||
]);
|
||||
|
||||
if(!$setting = Setting::find(7)) {
|
||||
|
||||
|
||||
$setting = new Setting;
|
||||
$setting->id = 7;
|
||||
$setting->group_id = 3;
|
||||
@@ -193,6 +204,38 @@ class SettingsSeeder extends Seeder
|
||||
$setting->system = true;
|
||||
$setting->save();
|
||||
}
|
||||
|
||||
if(!$setting = Setting::find(10)) {
|
||||
$setting = new Setting;
|
||||
$setting->id = 10;
|
||||
$setting->group_id = 4;
|
||||
$setting->key = 'custom_css';
|
||||
$setting->type = 'textarea';
|
||||
$setting->label = 'app.settings.custom_css';
|
||||
$setting->value = '';
|
||||
$setting->save();
|
||||
} else {
|
||||
$setting->type = 'textarea';
|
||||
$setting->group_id = 4;
|
||||
$setting->label = 'app.settings.custom_css';
|
||||
$setting->save();
|
||||
}
|
||||
|
||||
if(!$setting = Setting::find(11)) {
|
||||
$setting = new Setting;
|
||||
$setting->id = 11;
|
||||
$setting->group_id = 4;
|
||||
$setting->key = 'custom_js';
|
||||
$setting->type = 'textarea';
|
||||
$setting->label = 'app.settings.custom_js';
|
||||
$setting->value = '';
|
||||
$setting->save();
|
||||
} else {
|
||||
$setting->type = 'textarea';
|
||||
$setting->group_id = 4;
|
||||
$setting->label = 'app.settings.custom_js';
|
||||
$setting->save();
|
||||
}
|
||||
|
||||
if(!$home_tag = \App\Item::find(0)) {
|
||||
$home_tag = new \App\Item;
|
||||
|
||||
218
package-lock.json
generated
218
package-lock.json
generated
@@ -1962,6 +1962,17 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"clone-deep": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz",
|
||||
"integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-plain-object": "^2.0.4",
|
||||
"kind-of": "^6.0.2",
|
||||
"shallow-clone": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"coa": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
|
||||
@@ -3643,7 +3654,8 @@
|
||||
"ansi-regex": {
|
||||
"version": "2.1.1",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"aproba": {
|
||||
"version": "1.2.0",
|
||||
@@ -3664,12 +3676,14 @@
|
||||
"balanced-match": {
|
||||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"balanced-match": "^1.0.0",
|
||||
"concat-map": "0.0.1"
|
||||
@@ -3684,17 +3698,20 @@
|
||||
"code-point-at": {
|
||||
"version": "1.1.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"concat-map": {
|
||||
"version": "0.0.1",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"console-control-strings": {
|
||||
"version": "1.1.0",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"core-util-is": {
|
||||
"version": "1.0.2",
|
||||
@@ -3811,7 +3828,8 @@
|
||||
"inherits": {
|
||||
"version": "2.0.3",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"ini": {
|
||||
"version": "1.3.5",
|
||||
@@ -3823,6 +3841,7 @@
|
||||
"version": "1.0.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"number-is-nan": "^1.0.0"
|
||||
}
|
||||
@@ -3837,6 +3856,7 @@
|
||||
"version": "3.0.4",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"brace-expansion": "^1.1.7"
|
||||
}
|
||||
@@ -3844,12 +3864,14 @@
|
||||
"minimist": {
|
||||
"version": "0.0.8",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"minipass": {
|
||||
"version": "2.3.5",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"safe-buffer": "^5.1.2",
|
||||
"yallist": "^3.0.0"
|
||||
@@ -3868,6 +3890,7 @@
|
||||
"version": "0.5.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"minimist": "0.0.8"
|
||||
}
|
||||
@@ -3948,7 +3971,8 @@
|
||||
"number-is-nan": {
|
||||
"version": "1.0.1",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"object-assign": {
|
||||
"version": "4.1.1",
|
||||
@@ -3960,6 +3984,7 @@
|
||||
"version": "1.4.0",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"wrappy": "1"
|
||||
}
|
||||
@@ -4045,7 +4070,8 @@
|
||||
"safe-buffer": {
|
||||
"version": "5.1.2",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"safer-buffer": {
|
||||
"version": "2.1.2",
|
||||
@@ -4081,6 +4107,7 @@
|
||||
"version": "1.0.2",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"code-point-at": "^1.0.0",
|
||||
"is-fullwidth-code-point": "^1.0.0",
|
||||
@@ -4100,6 +4127,7 @@
|
||||
"version": "3.0.1",
|
||||
"bundled": true,
|
||||
"dev": true,
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
@@ -4143,12 +4171,14 @@
|
||||
"wrappy": {
|
||||
"version": "1.0.2",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"yallist": {
|
||||
"version": "3.0.3",
|
||||
"bundled": true,
|
||||
"dev": true
|
||||
"dev": true,
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
@@ -4641,6 +4671,12 @@
|
||||
"loader-utils": "^1.1.0"
|
||||
}
|
||||
},
|
||||
"immutable": {
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/immutable/-/immutable-4.0.0.tgz",
|
||||
"integrity": "sha512-zIE9hX70qew5qTUjSS7wi1iwj/l7+m54KWU247nhM3v806UdGj1yDndXj+IOYxxtW9zyLI+xqFNZjTuDaLUqFw==",
|
||||
"dev": true
|
||||
},
|
||||
"import-cwd": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/import-cwd/-/import-cwd-2.1.0.tgz",
|
||||
@@ -5237,9 +5273,9 @@
|
||||
}
|
||||
},
|
||||
"lodash": {
|
||||
"version": "4.17.11",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
|
||||
"integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
|
||||
"version": "4.17.21",
|
||||
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
|
||||
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
|
||||
"dev": true
|
||||
},
|
||||
"lodash.memoize": {
|
||||
@@ -6132,6 +6168,12 @@
|
||||
"sha.js": "^2.4.8"
|
||||
}
|
||||
},
|
||||
"picomatch": {
|
||||
"version": "2.3.1",
|
||||
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz",
|
||||
"integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==",
|
||||
"dev": true
|
||||
},
|
||||
"pify": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
|
||||
@@ -7195,6 +7237,139 @@
|
||||
"integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
|
||||
"dev": true
|
||||
},
|
||||
"sass": {
|
||||
"version": "1.49.9",
|
||||
"resolved": "https://registry.npmjs.org/sass/-/sass-1.49.9.tgz",
|
||||
"integrity": "sha512-YlYWkkHP9fbwaFRZQRXgDi3mXZShslVmmo+FVK3kHLUELHHEYrCmL1x6IUjC7wLS6VuJSAFXRQS/DxdsC4xL1A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chokidar": ">=3.0.0 <4.0.0",
|
||||
"immutable": "^4.0.0",
|
||||
"source-map-js": ">=0.6.2 <2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"anymatch": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz",
|
||||
"integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"normalize-path": "^3.0.0",
|
||||
"picomatch": "^2.0.4"
|
||||
}
|
||||
},
|
||||
"binary-extensions": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz",
|
||||
"integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==",
|
||||
"dev": true
|
||||
},
|
||||
"braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fill-range": "^7.0.1"
|
||||
}
|
||||
},
|
||||
"chokidar": {
|
||||
"version": "3.5.3",
|
||||
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
|
||||
"integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"anymatch": "~3.1.2",
|
||||
"braces": "~3.0.2",
|
||||
"fsevents": "~2.3.2",
|
||||
"glob-parent": "~5.1.2",
|
||||
"is-binary-path": "~2.1.0",
|
||||
"is-glob": "~4.0.1",
|
||||
"normalize-path": "~3.0.0",
|
||||
"readdirp": "~3.6.0"
|
||||
}
|
||||
},
|
||||
"fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"fsevents": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz",
|
||||
"integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==",
|
||||
"dev": true,
|
||||
"optional": true
|
||||
},
|
||||
"glob-parent": {
|
||||
"version": "5.1.2",
|
||||
"resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz",
|
||||
"integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-glob": "^4.0.1"
|
||||
}
|
||||
},
|
||||
"is-binary-path": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz",
|
||||
"integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"binary-extensions": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"is-number": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz",
|
||||
"integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==",
|
||||
"dev": true
|
||||
},
|
||||
"readdirp": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz",
|
||||
"integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"picomatch": "^2.2.1"
|
||||
}
|
||||
},
|
||||
"to-regex-range": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz",
|
||||
"integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"is-number": "^7.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"sass-loader": {
|
||||
"version": "7.3.1",
|
||||
"resolved": "https://registry.npmjs.org/sass-loader/-/sass-loader-7.3.1.tgz",
|
||||
"integrity": "sha512-tuU7+zm0pTCynKYHpdqaPpe+MMTQ76I9TPZ7i4/5dZsigE350shQWe5EZNl5dBidM49TPET75tNqRbcsUZWeNA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"clone-deep": "^4.0.1",
|
||||
"loader-utils": "^1.0.1",
|
||||
"neo-async": "^2.5.0",
|
||||
"pify": "^4.0.1",
|
||||
"semver": "^6.3.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"semver": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz",
|
||||
"integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"sax": {
|
||||
"version": "1.2.4",
|
||||
"resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
|
||||
@@ -7408,6 +7583,15 @@
|
||||
"safe-buffer": "^5.0.1"
|
||||
}
|
||||
},
|
||||
"shallow-clone": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz",
|
||||
"integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"kind-of": "^6.0.2"
|
||||
}
|
||||
},
|
||||
"shebang-command": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
|
||||
@@ -7642,6 +7826,12 @@
|
||||
"integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
|
||||
"dev": true
|
||||
},
|
||||
"source-map-js": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz",
|
||||
"integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==",
|
||||
"dev": true
|
||||
},
|
||||
"source-map-resolve": {
|
||||
"version": "0.5.2",
|
||||
"resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz",
|
||||
|
||||
5
public/css/all.min.css
vendored
Normal file
5
public/css/all.min.css
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
/*!
|
||||
* Font Awesome Pro 5.15.4 by @fontawesome - https://fontawesome.com
|
||||
* License - https://fontawesome.com/license (Commercial License)
|
||||
*/
|
||||
.fa,.fab,.fad,.fal,.far,.fas{-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased;display:inline-block;font-style:normal;font-variant:normal;text-rendering:auto;line-height:1}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-.0667em}.fa-xs{font-size:.75em}.fa-sm{font-size:.875em}.fa-1x{font-size:1em}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-6x{font-size:6em}.fa-7x{font-size:7em}.fa-8x{font-size:8em}.fa-9x{font-size:9em}.fa-10x{font-size:10em}.fa-fw{text-align:center;width:1.25em}.fa-ul{list-style-type:none;margin-left:2.5em;padding-left:0}.fa-ul>li{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-ban:before{content:"\f05e"}.fa-check:before{content:"\f00c"}.fa-cloud-download:before{content:"\f0ed"}.fa-cogs:before{content:"\f085"}.fa-edit:before{content:"\f044"}.fa-exchange:before{content:"\f0ec"}.fa-list:before{content:"\f03a"}.fa-pencil:before{content:"\f040"}.fa-plus:before{content:"\f067"}.fa-save:before{content:"\f0c7"}.fa-tag:before{content:"\f02b"}.fa-th:before{content:"\f00a"}.fa-thumbtack:before{content:"\f08d"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-user:before{content:"\f007"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Pro";font-style:normal;font-weight:900;font-display:block;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.fas{font-family:"Font Awesome 5 Pro";font-weight:900}
|
||||
2067
public/css/app.css
vendored
2067
public/css/app.css
vendored
File diff suppressed because one or more lines are too long
749
public/js/app.js
vendored
749
public/js/app.js
vendored
File diff suppressed because one or more lines are too long
1
public/js/fontawesome.js
vendored
1
public/js/fontawesome.js
vendored
@@ -480,6 +480,7 @@ function define(prefix, icons) {
|
||||
/* fas icons */
|
||||
var icons = {
|
||||
"arrow-alt-to-right": [448, 512, [], "f34c", "M448 88v336c0 13.3-10.7 24-24 24h-24c-13.3 0-24-10.7-24-24V88c0-13.3 10.7-24 24-24h24c13.3 0 24 10.7 24 24zM24 320h136v87.7c0 17.8 21.5 26.7 34.1 14.1l152.2-152.2c7.5-7.5 7.5-19.8 0-27.3L194.1 90.1c-12.6-12.6-34.1-3.7-34.1 14.1V192H24c-13.3 0-24 10.7-24 24v80c0 13.3 10.7 24 24 24z"],
|
||||
"arrow-rotate-right": [512, 512, [8635, "arrow-right-rotate", "arrow-rotate-forward", "redo"], "f01e", "M496 48V192c0 17.69-14.31 32-32 32H320c-17.69 0-32-14.31-32-32s14.31-32 32-32h63.39c-29.97-39.7-77.25-63.78-127.6-63.78C167.7 96.22 96 167.9 96 256s71.69 159.8 159.8 159.8c34.88 0 68.03-11.03 95.88-31.94c14.22-10.53 34.22-7.75 44.81 6.375c10.59 14.16 7.75 34.22-6.375 44.81c-39.03 29.28-85.36 44.86-134.2 44.86C132.5 479.9 32 379.4 32 256s100.5-223.9 223.9-223.9c69.15 0 134 32.47 176.1 86.12V48c0-17.69 14.31-32 32-32S496 30.31 496 48z"],
|
||||
"ban": [512, 512, [], "f05e", "M256 8C119.034 8 8 119.033 8 256s111.034 248 248 248 248-111.034 248-248S392.967 8 256 8zm130.108 117.892c65.448 65.448 70 165.481 20.677 235.637L150.47 105.216c70.204-49.356 170.226-44.735 235.638 20.676zM125.892 386.108c-65.448-65.448-70-165.481-20.677-235.637L361.53 406.784c-70.203 49.356-170.226 44.736-235.638-20.676z"],
|
||||
"check": [512, 512, [], "f00c", "M173.898 439.404l-166.4-166.4c-9.997-9.997-9.997-26.206 0-36.204l36.203-36.204c9.997-9.998 26.207-9.998 36.204 0L192 312.69 432.095 72.596c9.997-9.997 26.207-9.997 36.204 0l36.203 36.204c9.997 9.997 9.997 26.206 0 36.204l-294.4 294.401c-9.998 9.997-26.207 9.997-36.204-.001z"],
|
||||
"cloud-download": [640, 512, [], "f0ed", "M537.6 226.6c4.1-10.7 6.4-22.4 6.4-34.6 0-53-43-96-96-96-19.7 0-38.1 6-53.3 16.2C367 64.2 315.3 32 256 32c-88.4 0-160 71.6-160 160 0 2.7.1 5.4.2 8.1C40.2 219.8 0 273.2 0 336c0 79.5 64.5 144 144 144h368c70.7 0 128-57.3 128-128 0-61.9-44-113.6-102.4-125.4zm-139.9 93L305 412.3c-9.4 9.4-24.6 9.4-33.9 0l-92.7-92.7c-9.4-9.4-9.4-24.6 0-33.9l10.8-10.8c9.6-9.6 25.2-9.3 34.5.5l32.4 34.5V184c0-13.3 10.7-24 24-24h16c13.3 0 24 10.7 24 24v125.9l32.4-34.5c9.3-9.9 24.9-10.1 34.5-.5l10.8 10.8c9.2 9.3 9.2 24.5-.1 33.9z"],
|
||||
|
||||
2
public/js/jquery-3.3.1.min.js
vendored
2
public/js/jquery-3.3.1.min.js
vendored
File diff suppressed because one or more lines are too long
2
public/js/jquery-3.6.0.min.js
vendored
Normal file
2
public/js/jquery-3.6.0.min.js
vendored
Normal file
File diff suppressed because one or more lines are too long
2
public/manifest.json
generated
2
public/manifest.json
generated
@@ -1,5 +1,5 @@
|
||||
{
|
||||
"name": "App",
|
||||
"name": "Heimdall",
|
||||
"icons": [
|
||||
{
|
||||
"src": "\/android-icon-36x36.png",
|
||||
|
||||
4
public/mix-manifest.json
generated
4
public/mix-manifest.json
generated
@@ -1,4 +1,4 @@
|
||||
{
|
||||
"/css/app.css": "/css/app.css?id=e4ac968c3a08d246c3b0",
|
||||
"/js/app.js": "/js/app.js?id=f5edf362209887248205"
|
||||
"/css/app.css": "/css/app.css?id=ad45b1705b7f7906db0b",
|
||||
"/js/app.js": "/js/app.js?id=5446aeb4aa754e641c77"
|
||||
}
|
||||
|
||||
24
readme.md
24
readme.md
@@ -34,11 +34,11 @@ Supported applications are recognized by the title of the application as entered
|
||||
[](https://apps.heimdall.site/applications/foundation)
|
||||
|
||||
## Installing
|
||||
Apart from the Laravel dependencies, namely PHP >= 7.1.3, OpenSSL PHP Extension, PDO PHP Extension, Filter PHP Extension, Mbstring PHP Extension, Tokenizer PHP Extension, XML PHP Extension, Ctype PHP Extension and JSON PHP Extension, the only other thing Heimdall needs is sqlite support and zip support (php-zip).
|
||||
Apart from the Laravel dependencies, namely PHP >= 7.2.5, BCMath PHP Extension, Ctype PHP Extension, Fileinfo PHP extension, JSON PHP Extension, Mbstring PHP Extension, OpenSSL PHP Extension, PDO PHP Extension, Tokenizer PHP Extension, XML PHP Extension, the only other thing Heimdall needs is sqlite support and zip support (php-zip).
|
||||
|
||||
If you find you can't change the background make sure `php_fileinfo` is enabled in your php.ini. I believe it should be by default, but one user came across the issue on a windows system.
|
||||
|
||||
Installation is as simple as cloning the repository somewhere, or downloading and extracting the zip/tar and pointing your httpd document root to the `/public` folder.
|
||||
Installation is as simple as cloning the repository somewhere, or downloading and extracting the zip/tar and pointing your httpd document root to the `/public` folder then creating the .env file and generating an encryption key (this is all taken care of for you with the docker).
|
||||
|
||||
```
|
||||
cd /path/to/heimdall
|
||||
@@ -52,6 +52,18 @@ There is also a multi-arch Docker which supports x86-64, armhf and arm64, instru
|
||||
|
||||
- https://hub.docker.com/r/linuxserver/heimdall/
|
||||
|
||||
## Updating
|
||||
To update your instance, simply clone this repository or download the zip/tar file with the new version and copy it over the old installation.
|
||||
|
||||
## Search Providers
|
||||
v2.3.0 added the ability for users to customise the search options.
|
||||
|
||||
Options are stored in `/storage/app/searchproviders.yaml` (`/config/www/searchproviders.yaml` on docker installs), feel free to rearrange the options, add new ones, delete ones you don't use, etc.
|
||||
|
||||
Consider contributing to https://github.com/linuxserver/Heimdall/discussions/categories/search-providers to help others add new ones.
|
||||
|
||||
The item at the top of the list `Tiles` allows you to search for apps on your dashboard by name, helpful when you have lots of icons.
|
||||
|
||||
## New background image not being set
|
||||
If you are using the docker image or a default php install you may find images over 2MB wont get set as the background image, you just need to change the `upload_max_filesize` in the php.ini.
|
||||
|
||||
@@ -78,6 +90,7 @@ Currently added languages are
|
||||
- Swedish
|
||||
- Spanish
|
||||
- Turkish
|
||||
- Russian
|
||||
|
||||
## Web Server Configuration
|
||||
|
||||
@@ -129,7 +142,7 @@ location /webfonts {
|
||||
If there are any other locations which might interfere with any of the folders in the `/public` folder, you might have to do the same for those as well, but it's a super fringe case.
|
||||
|
||||
### Reverse proxy
|
||||
If you'd like to reverse proxy this app, we recommend using our letsencrypt/nginx docker image: [Letsencrypt/Nginx](https://hub.docker.com/r/linuxserver/letsencrypt/)
|
||||
If you'd like to reverse proxy this app, we recommend using our letsencrypt/nginx docker image: [SWAG - Secure Web Application Gateway](https://hub.docker.com/r/linuxserver/swag)
|
||||
You can either reverse proxy from the root location, or from a subdomain (subfolder method is currently not supported). For HTTPS proxy, make sure you use the HTTPS port of Heimdall webserver, otherwise some links may break. You can add security through `.htpasswd`
|
||||
|
||||
```
|
||||
@@ -137,12 +150,11 @@ location / {
|
||||
auth_basic "Restricted";
|
||||
auth_basic_user_file /config/nginx/.htpasswd;
|
||||
include /config/nginx/proxy.conf;
|
||||
proxy_pass https://heimdall:443;
|
||||
proxy_set_header X-Forwarded-Proto https;
|
||||
proxy_pass http://heimdall;
|
||||
}
|
||||
```
|
||||
|
||||
If you are using HTTPS and things aren't working try adding `FORCE_HTTPS=true` to the end of your `.env` file or proxy to the https version of the app.
|
||||
|
||||
### Self-signed certificates and local CAs
|
||||
Per default Heimdall uses the standard certificate bundle file (`ca-certificates.crt`) to verify HTTPS sites and will ignore additional certificates placed in `/etc/ssl/certs`. If you wish to use enhanced apps with HTTPS sites that use a self-signed certificate or certs signed with your own local CA, you can override the default bundle:
|
||||
|
||||
|
||||
@@ -60,7 +60,7 @@ $.when( $.ready ).then(function() {
|
||||
var timer = 5000;
|
||||
var fun = function worker() {
|
||||
$.ajax({
|
||||
url: base+'/get_stats/'+id,
|
||||
url: base+'get_stats/'+id,
|
||||
dataType: 'json',
|
||||
success: function(data) {
|
||||
container.html(data.html);
|
||||
@@ -120,7 +120,7 @@ $.when( $.ready ).then(function() {
|
||||
attribute: 'data-id'
|
||||
});
|
||||
$.post(
|
||||
base+'/order',
|
||||
base+'order',
|
||||
{ order:idsInOrder }
|
||||
);
|
||||
}
|
||||
@@ -128,7 +128,49 @@ $.when( $.ready ).then(function() {
|
||||
});
|
||||
$('#sortable').sortable('disable');
|
||||
|
||||
$('#sortable').on('mouseenter', '.item', function () {
|
||||
$(this).siblings('.tooltip').addClass('active')
|
||||
$('.refresh', this).addClass('active')
|
||||
}).on('mouseleave', '.item', function () {
|
||||
$(this).siblings('.tooltip').removeClass('active')
|
||||
$('.refresh', this).removeClass('active')
|
||||
})
|
||||
|
||||
$('#search-container').on('input', 'input[name=q]', function () {
|
||||
const search = this.value
|
||||
const items = $('#sortable').children('.item-container')
|
||||
if($('#search-container select[name=provider]').val() === 'tiles') {
|
||||
if(search.length > 0) {
|
||||
items.hide()
|
||||
items.filter(function () {
|
||||
const name = $(this).data('name').toLowerCase();
|
||||
return name.includes(search.toLowerCase())
|
||||
}).show()
|
||||
} else {
|
||||
items.show()
|
||||
}
|
||||
} else {
|
||||
items.show()
|
||||
}
|
||||
}).on('change', 'select[name=provider]', function () {
|
||||
const items = $('#sortable').children('.item-container')
|
||||
if($(this).val() === 'tiles') {
|
||||
$('#search-container button').hide()
|
||||
const search = $('#search-container input[name=q]').val()
|
||||
if(search.length > 0) {
|
||||
items.hide()
|
||||
items.filter(function () {
|
||||
const name = $(this).data('name').toLowerCase();
|
||||
return name.includes(search.toLowerCase())
|
||||
}).show()
|
||||
} else {
|
||||
items.show()
|
||||
}
|
||||
} else {
|
||||
$('#search-container button').show()
|
||||
items.show()
|
||||
}
|
||||
})
|
||||
|
||||
$('#app').on('click', '#config-button', function(e) {
|
||||
e.preventDefault();
|
||||
@@ -163,7 +205,7 @@ $.when( $.ready ).then(function() {
|
||||
e.preventDefault();
|
||||
var apiurl = $('#create input[name=url]').val();
|
||||
|
||||
var override_url = $('#create input[name="config[override_url]"]').val();
|
||||
var override_url = $('#sapconfig input[name="config[override_url]"]').val();
|
||||
if(override_url.length && override_url != '') {
|
||||
apiurl = override_url;
|
||||
}
|
||||
@@ -175,7 +217,7 @@ $.when( $.ready ).then(function() {
|
||||
data[config] = $(this).val();
|
||||
});
|
||||
|
||||
$.post(base+'/test_config', { data: data }, function(data) {
|
||||
$.post(base+'test_config', { data: data }, function(data) {
|
||||
alert(data);
|
||||
});
|
||||
|
||||
@@ -185,7 +227,7 @@ $.when( $.ready ).then(function() {
|
||||
var current = $(this);
|
||||
var id = current.data('id');
|
||||
var tag = current.data('tag');
|
||||
$.get(base+'/items/pintoggle/'+id+'/true/'+tag, function(data) {
|
||||
$.get(base+'items/pintoggle/'+id+'/true/'+tag, function(data) {
|
||||
var inner = $(data).filter('#sortable').html();
|
||||
$('#sortable').html(inner);
|
||||
current.toggleClass('active');
|
||||
|
||||
@@ -47,6 +47,66 @@ body {
|
||||
}
|
||||
}
|
||||
}
|
||||
#tile-preview {
|
||||
align-items: center;
|
||||
}
|
||||
.create {
|
||||
.textarea {
|
||||
width: 100%;
|
||||
margin: 0px 20px;
|
||||
textarea{
|
||||
width: 100%;
|
||||
border: 1px solid #dedfe2;
|
||||
padding: 15px;
|
||||
border-radius: 6px;
|
||||
height: 100px;
|
||||
font-size: 14px;
|
||||
}
|
||||
label:not(.switch) {
|
||||
width: 100%;
|
||||
font-size: 13px;
|
||||
color: lighten($app-text, 40%);
|
||||
margin-bottom: 15px;
|
||||
display: block;
|
||||
font-weight: 300;
|
||||
}
|
||||
}
|
||||
}
|
||||
.appoptions {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 20px;
|
||||
gap: 5px;
|
||||
.optdetails {
|
||||
display: flex;
|
||||
.input {
|
||||
margin: 0 20px;
|
||||
width: 200px;
|
||||
}
|
||||
}
|
||||
.optvalue {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
opacity: 0;
|
||||
width: 0;
|
||||
height: 0;
|
||||
overflow: hidden;
|
||||
&.active {
|
||||
opacity: 1;
|
||||
width: auto;
|
||||
height: auto;
|
||||
overflow: visible;
|
||||
}
|
||||
}
|
||||
button.dark {
|
||||
background: #1b1b1b;
|
||||
border: none;
|
||||
padding: 12px 15px;
|
||||
border-radius: 4px;
|
||||
color: white;
|
||||
min-width: 240px;
|
||||
}
|
||||
}
|
||||
#app {
|
||||
display: flex;
|
||||
min-height: 100vh;
|
||||
@@ -200,6 +260,59 @@ body {
|
||||
text-align: center;
|
||||
line-height: 30px;
|
||||
display: none;
|
||||
z-index: 1;
|
||||
}
|
||||
|
||||
.tooltip {
|
||||
padding: 25px;
|
||||
border-radius: 5px;
|
||||
background: #000000c8;
|
||||
color: white;
|
||||
position: absolute;
|
||||
bottom: 120px;
|
||||
left: 0;
|
||||
right: 0;
|
||||
font-size: 13px;
|
||||
backdrop-filter: blur(8px);
|
||||
z-index: 0;
|
||||
opacity: 0;
|
||||
transform: translateY(-20px);
|
||||
transition: all 0.3s;
|
||||
&.active {
|
||||
transform: translateY(0);
|
||||
opacity: 1;
|
||||
z-index: 4;
|
||||
}
|
||||
}
|
||||
}
|
||||
.tile-actions {
|
||||
position: absolute;
|
||||
top: 0px;
|
||||
left: 0;
|
||||
padding: 7px;
|
||||
background: #000000d9;
|
||||
font-size: 12px;
|
||||
line-height: 1;
|
||||
border-radius: 6px;
|
||||
width: 80px;
|
||||
height: 90px;
|
||||
display: flex;
|
||||
opacity: 0;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
transition: all 0.3s;
|
||||
flex-direction: column;
|
||||
text-align: center;
|
||||
cursor: pointer;
|
||||
&.active {
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
.refresh {
|
||||
z-index: 3;
|
||||
.icon {
|
||||
font-size: 20px;
|
||||
margin-bottom: 5px;
|
||||
}
|
||||
}
|
||||
.black {
|
||||
@@ -511,6 +624,15 @@ body {
|
||||
}
|
||||
}
|
||||
}
|
||||
.input {
|
||||
position: relative;
|
||||
.help {
|
||||
position: absolute;
|
||||
bottom: -22px;
|
||||
left: 10px;
|
||||
color: #c00;
|
||||
}
|
||||
}
|
||||
div.create {
|
||||
padding: 30px 15px;
|
||||
display: flex;
|
||||
@@ -534,10 +656,19 @@ div.create {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.app-icon-container {
|
||||
width: 60px;
|
||||
height: 60px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
margin-right: 15px;
|
||||
flex: 0 0 60px;
|
||||
}
|
||||
.app-icon {
|
||||
max-width: 60px;
|
||||
margin-right: 15px;
|
||||
display: block;
|
||||
max-height: 60px;
|
||||
}
|
||||
|
||||
.sidenav {
|
||||
@@ -576,6 +707,41 @@ div.create {
|
||||
color: #91a1b3;
|
||||
margin-left: 20px;
|
||||
}
|
||||
#websiteiconoptions {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
padding: 20px;
|
||||
.results {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
gap: 8px;
|
||||
}
|
||||
.header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
gap: 10px;
|
||||
padding: 10px 0;
|
||||
}
|
||||
.selectclose {
|
||||
cursor: pointer;
|
||||
}
|
||||
}
|
||||
.iconbutton {
|
||||
width: 160px;
|
||||
height: 160px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
border: 1px solid #ccc;
|
||||
border-radius: 4px;
|
||||
cursor: pointer;
|
||||
}
|
||||
.selecticon {
|
||||
max-width: 120px;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.switch {
|
||||
position: relative;
|
||||
@@ -694,6 +860,8 @@ div.create {
|
||||
position: relative;
|
||||
width: 100%;
|
||||
max-width: 620px;
|
||||
position: relative;
|
||||
z-index: 4;
|
||||
form {
|
||||
width: 100%;
|
||||
}
|
||||
@@ -784,7 +952,7 @@ div.create {
|
||||
|
||||
#appimage {
|
||||
img {
|
||||
max-width: 95px;
|
||||
width: 95px;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
120
resources/lang/cn/app.php
Normal file
120
resources/lang/cn/app.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => '系统',
|
||||
'settings.appearance' => '外观',
|
||||
'settings.miscellaneous' => '其他',
|
||||
'settings.support' => '支持',
|
||||
'settings.donate' => '捐赠',
|
||||
|
||||
'settings.version' => '版本',
|
||||
'settings.background_image' => '背景图片',
|
||||
'settings.window_target' => '链接打开方式',
|
||||
'settings.window_target.current' => '在当前选项卡中打开',
|
||||
'settings.window_target.one' => '在同一个选项卡中打开',
|
||||
'settings.window_target.new' => '在新的选项卡中打开',
|
||||
'settings.homepage_search' => '主页搜索',
|
||||
'settings.search_provider' => '默认搜索引擎',
|
||||
'settings.language' => '语言',
|
||||
'settings.reset' => '重置为默认值',
|
||||
'settings.remove' => '删除',
|
||||
'settings.search' => '搜索',
|
||||
'settings.no_items' => '没有可用项目',
|
||||
|
||||
|
||||
'settings.label' => '设置项',
|
||||
'settings.value' => '内容',
|
||||
'settings.edit' => '编辑',
|
||||
'settings.view' => '查看',
|
||||
|
||||
'options.none' => '- 未设置 -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.startpage' => 'StartPage',
|
||||
'options.yes' => '是',
|
||||
'options.no' => '否',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => '保存',
|
||||
'buttons.cancel' => '取消',
|
||||
'buttons.add' => '添加',
|
||||
'buttons.upload' => '上传图标',
|
||||
'buttons.downloadapps' => '更新应用列表',
|
||||
|
||||
'dash.pin_item' => '将应用固定到仪表盘',
|
||||
'dash.no_apps' => '当前没有固定的应用, 请 :link1 或 :link2',
|
||||
'dash.link1' => '添加应用',
|
||||
'dash.link2' => '将应用固定到仪表盘',
|
||||
'dash.pinned_items' => '固定应用',
|
||||
|
||||
'apps.app_list' => '应用列表',
|
||||
'apps.view_trash' => '查看垃圾箱',
|
||||
'apps.add_application' => '添加应用',
|
||||
'apps.application_name' => '应用名称',
|
||||
'apps.colour' => '颜色',
|
||||
'apps.icon' => '图标',
|
||||
'apps.pinned' => '固定',
|
||||
'apps.title' => '标题',
|
||||
'apps.hex' => 'Hex颜色',
|
||||
'apps.username' => '用户名称',
|
||||
'apps.password' => '密码',
|
||||
'apps.config' => '配置',
|
||||
'apps.apikey' => 'API 密钥',
|
||||
'apps.enable' => 'Enable',
|
||||
'apps.tag_list' => '标签列表',
|
||||
'apps.add_tag' => '添加标签',
|
||||
'apps.tag_name' => '标签名称',
|
||||
'apps.tags' => '标签',
|
||||
'apps.override' => '如果与主链接不同',
|
||||
'apps.preview' => '预览',
|
||||
'apps.apptype' => '应用类型',
|
||||
|
||||
'dashboard' => '主页-控制台',
|
||||
|
||||
'user.user_list' => '用户',
|
||||
'user.add_user' => '添加用户',
|
||||
'user.username' => '用户名称',
|
||||
'user.avatar' => '头像',
|
||||
'user.email' => '邮箱地址',
|
||||
'user.password_confirm' => '重复密码',
|
||||
'user.secure_front' => '仅设置密码后才允许公开访问.',
|
||||
'user.autologin' => '仅可从特定的链接访问(任何通过链接都可访问).',
|
||||
|
||||
'url' => '链接',
|
||||
'title' => '标题',
|
||||
'delete' => '删除',
|
||||
'optional' => '可选',
|
||||
'restore' => '复位',
|
||||
|
||||
'alert.success.item_created' => '应用添加成功',
|
||||
'alert.success.item_updated' => '应用更新成功',
|
||||
'alert.success.item_deleted' => '应用删除成功',
|
||||
'alert.success.item_restored' => '应用复位成功',
|
||||
'alert.success.updating' => '更新应用列表完成',
|
||||
|
||||
'alert.success.tag_created' => '标签添加成功',
|
||||
'alert.success.tag_updated' => '标签更新成功',
|
||||
'alert.success.tag_deleted' => '标签删除成功',
|
||||
'alert.success.tag_restored' => '标签复位成功',
|
||||
|
||||
'alert.success.setting_updated' => '你已成功编辑此设置',
|
||||
'alert.error.not_exist' => '此设置项不存在.',
|
||||
|
||||
'alert.success.user_created' => '用户添加成功',
|
||||
'alert.success.user_updated' => '用户更新成功',
|
||||
'alert.success.user_deleted' => '用户删除成功',
|
||||
'alert.success.user_restored' => '用户复位成功',
|
||||
|
||||
|
||||
];
|
||||
120
resources/lang/da/app.php
Normal file
120
resources/lang/da/app.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => 'System',
|
||||
'settings.appearance' => 'Appearance',
|
||||
'settings.miscellaneous' => 'Miscellaneous',
|
||||
'settings.support' => 'Support',
|
||||
'settings.donate' => 'Doner',
|
||||
|
||||
'settings.version' => 'Version',
|
||||
'settings.background_image' => 'Baggrundsbillede',
|
||||
'settings.window_target' => 'Link opens in',
|
||||
'settings.window_target.current' => 'Åbn i denne fane',
|
||||
'settings.window_target.one' => 'Åbn i den samme fane',
|
||||
'settings.window_target.new' => 'Åbn i en ny fane',
|
||||
'settings.homepage_search' => 'Homepage Search',
|
||||
'settings.search_provider' => 'Standardsøgemaskine',
|
||||
'settings.language' => 'Sprog',
|
||||
'settings.reset' => 'Nulstil tilbage til standard',
|
||||
'settings.remove' => 'Fjern',
|
||||
'settings.search' => 'søg',
|
||||
'settings.no_items' => 'Intet fundet',
|
||||
|
||||
|
||||
'settings.label' => 'Etiket',
|
||||
'settings.value' => 'Værdi',
|
||||
'settings.edit' => 'Rediger',
|
||||
'settings.view' => 'Vis',
|
||||
|
||||
'options.none' => '- ikke indstillet -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.startpage' => 'Startside',
|
||||
'options.yes' => 'Ja',
|
||||
'options.no' => 'Nej',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => 'Gem',
|
||||
'buttons.cancel' => 'Afbryd',
|
||||
'buttons.add' => 'Tilføj',
|
||||
'buttons.upload' => 'Upload et ikon',
|
||||
'buttons.downloadapps' => 'Opdater apps-listen',
|
||||
|
||||
'dash.pin_item' => 'Fastgør element til dashboard',
|
||||
'dash.no_apps' => 'Der er i øjeblikket ingen fastgjorte applikationer, :link1 eller :link2',
|
||||
'dash.link1' => 'Add an application here',
|
||||
'dash.link2' => 'Pin an item to the dash',
|
||||
'dash.pinned_items' => 'Fastgjorte elementer',
|
||||
|
||||
'apps.app_list' => 'Applikations liste',
|
||||
'apps.view_trash' => 'View trash',
|
||||
'apps.add_application' => 'Tilføj applikation',
|
||||
'apps.application_name' => 'Applikations navn',
|
||||
'apps.colour' => 'Farver',
|
||||
'apps.icon' => 'Ikon',
|
||||
'apps.pinned' => 'Fastgjort',
|
||||
'apps.title' => 'Titel',
|
||||
'apps.hex' => 'Hex farver',
|
||||
'apps.username' => 'brugernavn',
|
||||
'apps.password' => 'kodeord',
|
||||
'apps.config' => 'Config',
|
||||
'apps.apikey' => 'API nøgle',
|
||||
'apps.enable' => 'Aktiver',
|
||||
'apps.tag_list' => 'Tags liste',
|
||||
'apps.add_tag' => 'Tilføj tag',
|
||||
'apps.tag_name' => 'Tag navn',
|
||||
'apps.tags' => 'Tags',
|
||||
'apps.override' => 'Hvis det er anderledes end hovedwebadressen',
|
||||
'apps.preview' => 'Eksempel',
|
||||
'apps.apptype' => 'Applikationstype',
|
||||
|
||||
'dashboard' => 'Home dashboard',
|
||||
|
||||
'user.user_list' => 'Brugere',
|
||||
'user.add_user' => 'Tilføj bruger',
|
||||
'user.username' => 'Brugernavn',
|
||||
'user.avatar' => 'Avatar',
|
||||
'user.email' => 'E-mail',
|
||||
'user.password_confirm' => 'Bekræft kodeord',
|
||||
'user.secure_front' => 'Tillad offentlig adgang til forsiden - Kun håndhævet, hvis der er angivet en adgangskode.',
|
||||
'user.autologin' => 'Tillad at logge ind fra en bestemt URL. Alle med linket kan logge ind.',
|
||||
|
||||
'url' => 'URL',
|
||||
'title' => 'Title',
|
||||
'delete' => 'Slet',
|
||||
'optional' => 'Valgfri',
|
||||
'restore' => 'Genskab',
|
||||
|
||||
'alert.success.item_created' => 'Item created successfully',
|
||||
'alert.success.item_updated' => 'Item updated successfully',
|
||||
'alert.success.item_deleted' => 'Item deleted successfully',
|
||||
'alert.success.item_restored' => 'Item restored successfully',
|
||||
'alert.success.updating' => 'Updating apps list',
|
||||
|
||||
'alert.success.tag_created' => 'Tag oprettet med succes',
|
||||
'alert.success.tag_updated' => 'Tag opdateret med succes',
|
||||
'alert.success.tag_deleted' => 'Tag slettet med succes',
|
||||
'alert.success.tag_restored' => 'Tag genskabt med succes',
|
||||
|
||||
'alert.success.setting_updated' => 'You have successfully edited this setting',
|
||||
'alert.error.not_exist' => 'Denne indstilling findes ikke.',
|
||||
|
||||
'alert.success.user_created' => 'Bruger oprettet med succes',
|
||||
'alert.success.user_updated' => 'Bruger opdateret med succes',
|
||||
'alert.success.user_deleted' => 'Bruger slettet med succes',
|
||||
'alert.success.user_restored' => 'Bruger genskabt med succes',
|
||||
|
||||
|
||||
];
|
||||
19
resources/lang/da/pagination.php
Normal file
19
resources/lang/da/pagination.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Tidligere',
|
||||
'next' => 'Næste »',
|
||||
|
||||
];
|
||||
22
resources/lang/da/passwords.php
Normal file
22
resources/lang/da/passwords.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => 'Adgangskoder skal bestå af mindst seks tegn og matche bekræftelsen.',
|
||||
'reset' => 'Din adgangskode er nulstillet!',
|
||||
'sent' => 'Vi har sendt dig en e-mail med et link til nulstilling af adgangskode!',
|
||||
'token' => 'Dit token er ikke gyldigt!',
|
||||
'user' => "Vi kan ikke finde en bruger med den e-mail-adresse.",
|
||||
|
||||
];
|
||||
@@ -4,16 +4,16 @@ return array (
|
||||
'settings.system' => 'System',
|
||||
'settings.appearance' => 'Aussehen',
|
||||
'settings.miscellaneous' => 'Sonstiges',
|
||||
'settings.version' => 'Ausführung',
|
||||
'settings.version' => 'Version',
|
||||
'settings.background_image' => 'Hintergrundbild',
|
||||
'settings.homepage_search' => 'Homepage Suchen',
|
||||
'settings.homepage_search' => 'Startseite Sucheingabe',
|
||||
'settings.search_provider' => 'Suchanbieter',
|
||||
'settings.language' => 'Sprache',
|
||||
'settings.reset' => 'Zurücksetzen auf Standard zurück',
|
||||
'settings.reset' => 'Zurücksetzen auf Standard',
|
||||
'settings.remove' => 'Entfernen',
|
||||
'settings.search' => 'suche',
|
||||
'settings.no_items' => 'Keine Elemente gefunden',
|
||||
'settings.label' => 'Etikett',
|
||||
'settings.label' => 'Bezeichnung',
|
||||
'settings.value' => 'Wert',
|
||||
'settings.edit' => 'Bearbeiten',
|
||||
'settings.view' => 'Ansicht',
|
||||
@@ -29,9 +29,9 @@ return array (
|
||||
'buttons.add' => 'Hinzufügen',
|
||||
'buttons.upload' => 'Hochladen einer Datei',
|
||||
'dash.pin_item' => 'Element auf dem Dashboard anheften',
|
||||
'dash.no_apps' => 'Derzeit gibt es keine angeheftete Anwendungen :link1 oder :link2',
|
||||
'dash.link1' => 'Hinzufügen einer Anwendung hier',
|
||||
'dash.link2' => 'Heften Sie ein Element auf dem Armaturenbrett',
|
||||
'dash.no_apps' => 'Derzeit gibt es keine angeheftete Anwendungen. :link1 oder :link2',
|
||||
'dash.link1' => 'Anwendung neu hinzufügen',
|
||||
'dash.link2' => 'anheften',
|
||||
'dash.pinned_items' => 'Angeheftete Elemente',
|
||||
'apps.app_list' => 'Anwendungsliste',
|
||||
'apps.view_trash' => 'Ansicht Papierkorb',
|
||||
@@ -39,21 +39,22 @@ return array (
|
||||
'apps.application_name' => 'Anwendungsname',
|
||||
'apps.colour' => 'Farbe',
|
||||
'apps.icon' => 'Symbol',
|
||||
'apps.pinned' => 'Festgesteckt',
|
||||
'apps.pinned' => 'Angeheftet',
|
||||
'apps.title' => 'Titel',
|
||||
'apps.hex' => 'Hex-Farbe',
|
||||
'apps.username' => 'Benutzername',
|
||||
'apps.password' => 'Passwort',
|
||||
'apps.config' => 'Konfig',
|
||||
'url' => 'Url',
|
||||
'apps.config' => 'Konfiguration',
|
||||
'apps.only_admin_account' => 'Nur mit Admin-Konto!',
|
||||
'url' => 'URL',
|
||||
'title' => 'Titel',
|
||||
'delete' => 'Löschen',
|
||||
'optional' => 'Wahlweise',
|
||||
'optional' => 'Optional',
|
||||
'restore' => 'Wiederherstellen',
|
||||
'alert.success.item_created' => 'Element erfolgreich erstellt',
|
||||
'alert.success.item_updated' => 'Artikel erfolgreich aktualisiert',
|
||||
'alert.success.item_updated' => 'Element erfolgreich aktualisiert',
|
||||
'alert.success.item_deleted' => 'Element erfolgreich gelöscht',
|
||||
'alert.success.item_restored' => 'Element erfolgreich wiederhergestellt',
|
||||
'alert.success.setting_updated' => 'Sie haben diese Einstellung erfolgreich bearbeitet',
|
||||
'alert.success.setting_updated' => 'Die Einstellungen wurden übernommen',
|
||||
'alert.error.not_exist' => 'Diese Einstellung existiert nicht.',
|
||||
);
|
||||
120
resources/lang/el/app.php
Normal file
120
resources/lang/el/app.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => 'Σύστημα',
|
||||
'settings.appearance' => 'Εμφάνιση',
|
||||
'settings.miscellaneous' => 'Λοιπά',
|
||||
'settings.support' => 'Υποστήριξη',
|
||||
'settings.donate' => 'Δωρεά',
|
||||
|
||||
'settings.version' => 'Έκδοση',
|
||||
'settings.background_image' => 'Εικόνα Παρασκηνίου',
|
||||
'settings.window_target' => 'Ο Σύνδεσμος ανοίγει σε',
|
||||
'settings.window_target.current' => 'Άνοιγμα σε αυτή την καρτέλα',
|
||||
'settings.window_target.one' => 'Άνοιγμα στην ίδια καρτέλα',
|
||||
'settings.window_target.new' => 'Άνοιγμα σε νέα καρτέλα',
|
||||
'settings.homepage_search' => 'Αναζήτηση στην Αρχική Σελίδα',
|
||||
'settings.search_provider' => 'Προεπιλεγμένος Πάροχος Αναζήτησης',
|
||||
'settings.language' => 'Γλώσσα',
|
||||
'settings.reset' => 'Επαναφορά πίσω στις προεπιλογές',
|
||||
'settings.remove' => 'Αφαίρεση',
|
||||
'settings.search' => 'αναζήτηση',
|
||||
'settings.no_items' => 'Δε βρεθηκαν αποτελέσματα',
|
||||
|
||||
|
||||
'settings.label' => 'Ετικέτα',
|
||||
'settings.value' => 'Τιμή',
|
||||
'settings.edit' => 'Επεξεργασία',
|
||||
'settings.view' => 'Προβολή',
|
||||
|
||||
'options.none' => '- μη ορισμένο -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.startpage' => 'StartPage',
|
||||
'options.yes' => 'Ναι',
|
||||
'options.no' => 'Όχι',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => 'Αποθήκευση',
|
||||
'buttons.cancel' => 'Ακύρωση',
|
||||
'buttons.add' => 'Προσθήκη',
|
||||
'buttons.upload' => 'Μεταφόρτωση ενός αρχείου',
|
||||
'buttons.downloadapps' => 'Ανανέωση Λίστας Εφαρμογών',
|
||||
|
||||
'dash.pin_item' => 'Καρφίτσωμα του αντικειμένου στο ταμπλό',
|
||||
'dash.no_apps' => 'Δεν υπάρχουν προς το παρόν καρφιτσωμένες εφαρμογές, :link1 ή :link2',
|
||||
'dash.link1' => 'Προσθήκη μίας εφαρμογής εδώ',
|
||||
'dash.link2' => 'Καρφίτσωμα ενός αντικειμένου στο ταμπλό',
|
||||
'dash.pinned_items' => 'Καρφιτσωμένα αντικείμενα',
|
||||
|
||||
'apps.app_list' => 'Λίστα Εφαρμογών',
|
||||
'apps.view_trash' => 'Εμφάνιση Απορριμμάτων',
|
||||
'apps.add_application' => 'Προσθήκη εφαρμογής',
|
||||
'apps.application_name' => 'Όνομα Εφαρμογής',
|
||||
'apps.colour' => 'Χρώμα',
|
||||
'apps.icon' => 'Εικονίδιο',
|
||||
'apps.pinned' => 'Καρφιτσωμένο',
|
||||
'apps.title' => 'Τίτλος',
|
||||
'apps.hex' => 'Hex χρώμα',
|
||||
'apps.username' => 'Όνομα χρήστη',
|
||||
'apps.password' => 'Κωδικός πρόσβασης',
|
||||
'apps.config' => 'Ρύθμιση',
|
||||
'apps.apikey' => 'Κλειδί API',
|
||||
'apps.enable' => 'Ενεργοποίηση',
|
||||
'apps.tag_list' => 'Λίστα Ετικετών',
|
||||
'apps.add_tag' => 'Προσθήκη ετικέτας',
|
||||
'apps.tag_name' => 'Όνομα Ετικέτας',
|
||||
'apps.tags' => 'Ετικέτες',
|
||||
'apps.override' => 'Αν διαφορετικό με το κύριο url',
|
||||
'apps.preview' => 'Προεπισκόπιση',
|
||||
'apps.apptype' => 'Τύπος Εφαρμογής',
|
||||
|
||||
'dashboard' => 'Αρχικό ταμπλό',
|
||||
|
||||
'user.user_list' => 'Χρήστες',
|
||||
'user.add_user' => 'Προσθήκη χρήστη',
|
||||
'user.username' => 'Όνομα χρήστη',
|
||||
'user.avatar' => 'Εικόνα χρήστη',
|
||||
'user.email' => 'Email',
|
||||
'user.password_confirm' => 'Επιβεβαίωση κωδικού πρόσβασης',
|
||||
'user.secure_front' => 'Χορήγηση δημόσιας πρόσβασης στο εμπρόσθιο τμήμα - Τίθεται σε ενέργεια μόνο εαν έχει ορισθεί κωδικός.',
|
||||
'user.autologin' => 'Χορήγηση πρόσβασης από ένα συγκεκριμένο URL. Οποιοσδήποτε με τον σύνδεσμο μπορεί να εισέρθει.',
|
||||
|
||||
'url' => 'URL',
|
||||
'title' => 'Τίτλος',
|
||||
'delete' => 'Διαγραφή',
|
||||
'optional' => 'Προεραιτικό',
|
||||
'restore' => 'Επαναφορά',
|
||||
|
||||
'alert.success.item_created' => 'Το αντικείμενο δημιουργήθηκε επιτυχώς',
|
||||
'alert.success.item_updated' => 'Το αντικείμενο ενημερώθηκε επιτυχώς',
|
||||
'alert.success.item_deleted' => 'Το αντικείμενο διαγράφηκε επιτυχώς',
|
||||
'alert.success.item_restored' => 'Το αντικείμενο επαναφέρθηκε επιτυχώς',
|
||||
'alert.success.updating' => 'Η λίστα των εφαρμογών ενημερώνεται',
|
||||
|
||||
'alert.success.tag_created' => 'Η ετικέτα δημιουργήθηκε επιτυχώ',
|
||||
'alert.success.tag_updated' => 'Η ετικέτα ενημερώθηκε επιτυχώς',
|
||||
'alert.success.tag_deleted' => 'Η ετικέτα διαγράφηκε επιτυχώς',
|
||||
'alert.success.tag_restored' => 'Η ετικέτα επαναφέρθηκε επιτυχώς',
|
||||
|
||||
'alert.success.setting_updated' => 'Επεξεργαστήκατε επιτυχώς αυτή τη ρύθμιση',
|
||||
'alert.error.not_exist' => 'Αυτή η ρύθμιση δεν υπάρχει.',
|
||||
|
||||
'alert.success.user_created' => 'Ο χρήστης δημιουργήθηκε επιτυχώς',
|
||||
'alert.success.user_updated' => 'Ο χρήστης ενημερώθηκε επιτυχώς',
|
||||
'alert.success.user_deleted' => 'Ο χρήστης διαγράφηκε επιτυχώς',
|
||||
'alert.success.user_restored' => 'Ο χρήστης επαναφέρθηκε επιτυχώς',
|
||||
|
||||
|
||||
];
|
||||
19
resources/lang/el/auth.php
Normal file
19
resources/lang/el/auth.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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 δευτερόλεπτα.',
|
||||
|
||||
];
|
||||
19
resources/lang/el/pagination.php
Normal file
19
resources/lang/el/pagination.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Προηγούμενη',
|
||||
'next' => 'Επόμενη »',
|
||||
|
||||
];
|
||||
22
resources/lang/el/passwords.php
Normal file
22
resources/lang/el/passwords.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => 'Οι κωδικοί πρόσβασης πρέπει να αποτελλούνται τουλάχιστον από έξι χαρακτήρες και να ταιριάζουν με την επικύρωση.',
|
||||
'reset' => 'Έχει γίνει επαναφορά του κωδικού σας!',
|
||||
'sent' => 'Σας στείλαμε ένα Ε-mail με τον σύνδεσμο για την επαναφορά του κωδικού πρόσβασής σας!',
|
||||
'token' => 'Αυτό το token για την επαναφορά του κωδικού πρόσβασής σας είναι άκυρο.',
|
||||
'user' => "Δεν μπορούμε να βρόυμε κάποιον χρήστη με αυτή τη διεύθυνση E-mail.",
|
||||
|
||||
];
|
||||
121
resources/lang/el/validation.php
Normal file
121
resources/lang/el/validation.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?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' => 'Το πεδίο :attribute πρέπει να έχει γίνει αποδεκτό.',
|
||||
'active_url' => 'Το πεδίο :attribute δέν είναι μία έγκυρη διεύθυνση URL.',
|
||||
'after' => 'Το πεδίο :attribute πρέπει να είναι μία ημερομηνία μετά από :date.',
|
||||
'after_or_equal' => 'Το πεδίο :attribute πρέπει να είναι μία ημερομηνία μετά από :date ή ίδια με :date.',
|
||||
'alpha' => 'Το πεδίο :attribute μπορεί να περιέχει μόνο γράμματαμπορεί να περιέχει μόνο γράμματα.',
|
||||
'alpha_dash' => 'Το πεδίο :attribute μπορεί να περιέχει μόνο γράμματα, αριθμούς, και παύλες.',
|
||||
'alpha_num' => 'Το πεδίο :attribute μπορεί να περιέχει μόνο γράμματα και αριθμούς.',
|
||||
'array' => 'Το πεδίο :attribute πρέπει να είναι ένας πίνακας.',
|
||||
'before' => 'Το πεδίο :attribute πρέπει να είναι μία ημερομηνία πρίν από :date.',
|
||||
'before_or_equal' => 'Το πεδίο :attribute πρέπει να είναι μία ημερομηνία πρίν από :date ή ίση με :date.',
|
||||
'between' => [
|
||||
'numeric' => 'Το πεδίο :attribute πρέπει να είναι μεταξύ από :min και :max.',
|
||||
'file' => 'Το πεδίο :attribute πρέπει να είναι μεταξύ από :min και :max kilobytes.',
|
||||
'string' => 'Το πεδίο :attribute πρέπει να είναι μεταξύ από :min και :max characters.',
|
||||
'array' => 'Το πεδίο :attribute πρέπει να έχει μεταξύ :min και :max αντικείμενα.',
|
||||
],
|
||||
'boolean' => 'Το πεδίο :attribute πρέπει να είναι αληθές ή ψευδές.',
|
||||
'confirmed' => 'Η επικύρωση του πεδίου :attribute δεν ταιριάζει.',
|
||||
'date' => 'Το πεδίο :attribute δεν είναι μία έγκυρη ημερομηνία.',
|
||||
'date_format' => 'Το πεδίο :attribute δεν ταιριάζει με τη μορφή :format.',
|
||||
'different' => 'Τα πεδία :attribute και :other πρέπει να είναι διαφορετικά.',
|
||||
'digits' => 'Το πεδίο :attribute πρέπει να είναι :digits ψηφία.',
|
||||
'digits_between' => 'Το πεδίο :attribute πρέπει να είναι μεταξύ από :min και :max ψηφία.',
|
||||
'dimensions' => 'Το πεδίο :attribute δεν έχει έγκυρες διαστάσεις εικόνας.',
|
||||
'distinct' => 'Το πεδίο :attribute έχει μία διπλότυπη τιμή.',
|
||||
'email' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη διεύθυνση E-mail.',
|
||||
'exists' => 'Το επιλεγμένο πεδίο :attribute είναι άκυρο.',
|
||||
'file' => 'Το πεδίο :attribute πρέπει να έιναι ένα αρχείο.',
|
||||
'filled' => 'Το πεδίο :attribute πρέπει να έχει μία τιμή.',
|
||||
'image' => 'Το πεδίο :attribute πρέπει να είναι μία εικόνα.',
|
||||
'in' => 'Το πεδίο selected :attribute είναι άκυρο.',
|
||||
'in_array' => 'Το πεδίο :attribute δεν υπάρχει στο :other.',
|
||||
'integer' => 'Το πεδίο :attribute πρέπει να είναι ένας ακέραιος αριθμός.',
|
||||
'ip' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη διεύθυνση IP.',
|
||||
'ipv4' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη διεύθυνση IPv4.',
|
||||
'ipv6' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη διεύθυνση IPv6.',
|
||||
'json' => 'Το πεδίο :attribute πρέπει να είναι ένα έγκυρο JSON string.',
|
||||
'max' => [
|
||||
'numeric' => 'Το πεδίο :attribute δεν γίνεται να είναι μεγαλύτερο από :max.',
|
||||
'file' => 'Το πεδίο :attribute δεν γίνεται να είναι μεγαλύτερο από :max kilobytes.',
|
||||
'string' => 'Το πεδίο :attribute δεν γίνεται να είναι μεγαλύτερο από :max χαρακτήρες.',
|
||||
'array' => 'Το πεδίο :attribute δεν γίνεται να έχει περισσότερα από :max αντικείμενα.',
|
||||
],
|
||||
'mimes' => 'Το πεδίο :attribute πρέπει να είναι ένα αρχείου τύπου: :values.',
|
||||
'mimetypes' => 'Το πεδίο :attribute πρέπει να είναι ένα αρχείου τύπου: :values.',
|
||||
'min' => [
|
||||
'numeric' => 'Το πεδίο :attribute πρέπει να είναι τουλάχιστον :min.',
|
||||
'file' => 'Το πεδίο :attribute πρέπει να είναι τουλάχιστον :min kilobytes.',
|
||||
'string' => 'Το πεδίο :attribute πρέπει να είναι τουλάχιστον :min χαρακτήρες.',
|
||||
'array' => 'Το πεδίο :attribute πρέπει να έχει τουλάχιστον :min αντικείμενα.',
|
||||
],
|
||||
'not_in' => 'Το επιλεγμένο πεδίο :attribute είναι άκυρο.',
|
||||
'numeric' => 'Το πεδίο :attribute πρέπει να ένας αριθμός.',
|
||||
'present' => 'Το πεδίο :attribute πρέπει να είναι παρόν.',
|
||||
'regex' => 'Η μορφή του πεδίου :attribute είναι άκυρη.',
|
||||
'required' => 'Το πεδίο :attribute είναι απαιτούμενο.',
|
||||
'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' => 'Το πεδίο :attribute πρέπει να είναι :size.',
|
||||
'file' => 'Το πεδίο :attribute πρέπει να είναι :size kilobytes.',
|
||||
'string' => 'Το πεδίο :attribute πρέπει να είναι :size χαρακτήρες.',
|
||||
'array' => 'Το πεδίο :attribute πρέπει να περιέχει :size αντικείμενα.',
|
||||
],
|
||||
'string' => 'Το πεδίο :attribute πρέπει να είναι ένα string.',
|
||||
'timezone' => 'Το πεδίο :attribute πρέπει να είναι μία έγκυρη ζώνη ώρας.',
|
||||
'unique' => 'Το πεδίο :attribute έχει ήδη χρησιμοποιηθεί.',
|
||||
'uploaded' => 'Το πεδίο :attribute απέτυχε να μεταφορτωθεί.',
|
||||
'url' => 'Η μορφή του πεδίου :attribute είναι άκυρη.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| 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 attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
||||
@@ -12,6 +12,8 @@ return [
|
||||
'settings.system' => 'System',
|
||||
'settings.appearance' => 'Appearance',
|
||||
'settings.miscellaneous' => 'Miscellaneous',
|
||||
'settings.advanced' => 'Advanced',
|
||||
|
||||
'settings.support' => 'Support',
|
||||
'settings.donate' => 'Donate',
|
||||
|
||||
@@ -29,11 +31,13 @@ return [
|
||||
'settings.search' => 'search',
|
||||
'settings.no_items' => 'No items found',
|
||||
|
||||
|
||||
'settings.label' => 'Label',
|
||||
'settings.value' => 'Value',
|
||||
'settings.edit' => 'Edit',
|
||||
'settings.view' => 'View',
|
||||
|
||||
'settings.custom_css' => 'Custom CSS',
|
||||
'settings.custom_js' => 'Custom JavaScript',
|
||||
|
||||
'options.none' => '- not set -',
|
||||
'options.google' => 'Google',
|
||||
@@ -44,11 +48,12 @@ return [
|
||||
'options.yes' => 'Yes',
|
||||
'options.no' => 'No',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => 'Save',
|
||||
'buttons.cancel' => 'Cancel',
|
||||
'buttons.add' => 'Add',
|
||||
'buttons.upload' => 'Upload a file',
|
||||
'buttons.upload' => 'Upload an icon',
|
||||
'buttons.downloadapps' => 'Update Apps List',
|
||||
|
||||
'dash.pin_item' => 'Pin item to dashboard',
|
||||
@@ -78,6 +83,11 @@ return [
|
||||
'apps.override' => 'If different to main url',
|
||||
'apps.preview' => 'Preview',
|
||||
'apps.apptype' => 'Application Type',
|
||||
'apps.website' => 'Website',
|
||||
'apps.description' => 'Description',
|
||||
'apps.only_admin_account' => 'Only if you have admin-account!',
|
||||
'apps.autologin_url' => 'Auto login url',
|
||||
'apps.show_deleted' => 'Showing Deleted Applications',
|
||||
|
||||
'dashboard' => 'Home dashboard',
|
||||
|
||||
|
||||
@@ -22,6 +22,7 @@ return array (
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.jackett' => 'Jackett',
|
||||
'options.yes' => 'Sí',
|
||||
'options.no' => 'No',
|
||||
'buttons.save' => 'Guardar',
|
||||
@@ -29,19 +30,19 @@ return array (
|
||||
'buttons.add' => 'Añadir',
|
||||
'buttons.upload' => 'Cargar un archivo',
|
||||
'dash.pin_item' => 'Pin elemento al tablero',
|
||||
'dash.no_apps' => 'Actualmente no hay anclados aplicaciones :link1 o :link2',
|
||||
'dash.no_apps' => 'Actualmente no hay aplicaciones ancladas, :link1 o :link2',
|
||||
'dash.link1' => 'Agregue una aplicación aquí',
|
||||
'dash.link2' => 'Pin de un elemento en el tablero',
|
||||
'dash.pinned_items' => 'Elementos Anclados',
|
||||
'apps.app_list' => 'Lista de aplicaciones',
|
||||
'apps.view_trash' => 'Vista de la basura',
|
||||
'apps.view_trash' => 'Vista de la papelera de reciclaje',
|
||||
'apps.add_application' => 'Agregar aplicación',
|
||||
'apps.application_name' => 'Nombre de la aplicación',
|
||||
'apps.colour' => 'Color',
|
||||
'apps.icon' => 'Icono',
|
||||
'apps.pinned' => 'Fijado',
|
||||
'apps.title' => 'Título',
|
||||
'apps.hex' => 'Hexagonal de color',
|
||||
'apps.hex' => 'Código de color hexadecimal',
|
||||
'apps.username' => 'Nombre de usuario',
|
||||
'apps.password' => 'Contraseña',
|
||||
'apps.config' => 'Config',
|
||||
@@ -56,4 +57,4 @@ return array (
|
||||
'alert.success.item_restored' => 'Elemento restaurado con éxito',
|
||||
'alert.success.setting_updated' => 'Ha editado con éxito esta configuración',
|
||||
'alert.error.not_exist' => 'Esta configuración no existe.',
|
||||
);
|
||||
);
|
||||
|
||||
@@ -34,11 +34,14 @@ return array (
|
||||
'options.startpage' => 'Page d\'accueil',
|
||||
'options.yes' => 'Oui',
|
||||
'options.no' => 'Non',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => 'Enregistrer',
|
||||
'buttons.cancel' => 'Annuler',
|
||||
'buttons.add' => 'Ajouter',
|
||||
'buttons.upload' => 'Choisir un fichier',
|
||||
'buttons.downloadapps' => 'Mettre à jour la liste',
|
||||
|
||||
'dash.pin_item' => 'Épingler l\'application au tableau de bord',
|
||||
'dash.no_apps' => 'Il n\'existe actuellement aucune application épinglée :link1 ou :link2',
|
||||
@@ -58,13 +61,28 @@ return array (
|
||||
'apps.username' => 'Nom d\'utilisateur',
|
||||
'apps.password' => 'Mot de passe',
|
||||
'apps.config' => 'Config',
|
||||
'apps.apikey' => 'Clé de l\'API',
|
||||
'apps.enable' => 'Actif',
|
||||
'apps.tag_list' => 'Liste des labels',
|
||||
'apps.add_tag' => 'Ajouter un label',
|
||||
'apps.tag_name' => 'Nom du label',
|
||||
'apps.tags' => 'Labels',
|
||||
'apps.override' => 'Si différent de l\'url actuelle',
|
||||
|
||||
'apps.preview' => 'Aperçu',
|
||||
'apps.apptype' => 'Type d\'application ',
|
||||
'apps.only_admin_account' => 'Seulement si vous avez un compte administrateur!',
|
||||
|
||||
'dashboard' => 'Tableau de bord',
|
||||
|
||||
'user.user_list' => 'Utilisateurs',
|
||||
'user.add_user' => 'Ajouter un utilisateur',
|
||||
'user.username' => 'Nom d\'utilisateur',
|
||||
'user.avatar' => 'Avatar',
|
||||
'user.email' => 'Email',
|
||||
'user.password_confirm' => 'Confirmer le mot de passe',
|
||||
'user.secure_front' => 'Autoriser l\'accès public au front - Uniquement appliqué si un mot de passe est défini.',
|
||||
'user.autologin' => 'Autorisez la connexion à partir d\'une URL spécifique. Toute personne disposant du lien peut se connecter.',
|
||||
|
||||
'url' => 'Url',
|
||||
'title' => 'Titre',
|
||||
'delete' => 'Effacer',
|
||||
@@ -75,6 +93,7 @@ return array (
|
||||
'alert.success.item_updated' => 'Application mise à jour avec succès',
|
||||
'alert.success.item_deleted' => 'Application supprimée avec succès',
|
||||
'alert.success.item_restored' => 'Application restaurée avec succès',
|
||||
'alert.success.updating' => 'Liste des applications mise à jour avec succès',
|
||||
|
||||
'alert.success.tag_created' => 'Label crée avec succès',
|
||||
'alert.success.tag_updated' => 'Label mis à jour avec succès',
|
||||
|
||||
19
resources/lang/fr/auth.php
Normal file
19
resources/lang/fr/auth.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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' => 'Ces informations d\'identification ne correspondent pas à nos enregistrements.',
|
||||
'throttle' => 'Trop de tentatives de connexion. Veuillez réessayer dans :seconds secondes.',
|
||||
|
||||
];
|
||||
19
resources/lang/fr/pagination.php
Normal file
19
resources/lang/fr/pagination.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« précédents',
|
||||
'next' => '» suivants',
|
||||
|
||||
];
|
||||
22
resources/lang/fr/passwords.php
Normal file
22
resources/lang/fr/passwords.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => 'Les mots de passe doivent comporter au moins six caractères et correspondre à la confirmation.',
|
||||
'reset' => 'Votre mot de passe a été réinitialisé!',
|
||||
'sent' => 'Nous avons envoyé votre lien de réinitialisation de mot de passe par e-mail!',
|
||||
'token' => 'Ce jeton de réinitialisation de mot de passe n\'est pas valide.',
|
||||
'user' => "Nous ne pouvons pas trouver un utilisateur avec cette adresse e-mail.",
|
||||
|
||||
];
|
||||
121
resources/lang/hu/app.php
Normal file
121
resources/lang/hu/app.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => 'Rendszer',
|
||||
'settings.appearance' => 'Megjelenés',
|
||||
'settings.miscellaneous' => 'Miscellaneous',
|
||||
'settings.support' => 'Támogatás',
|
||||
'settings.donate' => 'Adomány',
|
||||
|
||||
'settings.version' => 'Verzió',
|
||||
'settings.background_image' => 'Háttérkép',
|
||||
'settings.window_target' => 'Link megnyitása',
|
||||
'settings.window_target.current' => 'Ezen a lapon',
|
||||
'settings.window_target.one' => 'Azonos lapon',
|
||||
'settings.window_target.new' => 'Új lapon',
|
||||
'settings.homepage_search' => 'Kezdő oldal kereső',
|
||||
'settings.search_provider' => 'Alapértelmezett kereső motor ',
|
||||
'settings.language' => 'Nyelv',
|
||||
'settings.reset' => 'Alapértelmezetek visszaállítása',
|
||||
'settings.remove' => 'Eltávolítás',
|
||||
'settings.search' => 'keresés',
|
||||
'settings.no_items' => 'Nincs találat',
|
||||
|
||||
|
||||
'settings.label' => 'Címke',
|
||||
'settings.value' => 'Érték',
|
||||
'settings.edit' => 'Módosítás',
|
||||
'settings.view' => 'Megtekintés',
|
||||
|
||||
'options.none' => '- nincs beállítva -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.startpage' => 'Kezdő oldal',
|
||||
'options.yes' => 'Igen',
|
||||
'options.no' => 'Nem',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => 'Mentás',
|
||||
'buttons.cancel' => 'Mégsem',
|
||||
'buttons.add' => 'Hozzáadás',
|
||||
'buttons.upload' => 'Ikon feltöltése',
|
||||
'buttons.downloadapps' => 'Alkalmazás lista frissítése',
|
||||
|
||||
'dash.pin_item' => 'Kitőzés kezdő képernyőre',
|
||||
'dash.no_apps' => 'Jelenleg nincsenek kitűzött alkalmazások, :link1 or :link2',
|
||||
'dash.link1' => 'Alkalmazás hozzáadása',
|
||||
'dash.link2' => 'Elem kitűzése kezdőképernyőre',
|
||||
'dash.pinned_items' => 'Kitűzött elemek',
|
||||
|
||||
'apps.app_list' => 'Alkalmazás lista',
|
||||
'apps.view_trash' => 'Törölt elemek megtekintése',
|
||||
'apps.add_application' => 'Alkalmazás hozzáadása',
|
||||
'apps.application_name' => 'Alkalmazás neve',
|
||||
'apps.colour' => 'Szín',
|
||||
'apps.icon' => 'Ikon',
|
||||
'apps.pinned' => 'Kitűzve',
|
||||
'apps.title' => 'Cím',
|
||||
'apps.hex' => 'Hexa színkód',
|
||||
'apps.username' => 'Felhasználói név',
|
||||
'apps.password' => 'Jelszó',
|
||||
'apps.config' => 'Konfiguráció',
|
||||
'apps.apikey' => 'API Kulcs',
|
||||
'apps.enable' => 'Engedélyezés',
|
||||
'apps.tag_list' => 'Címke lista',
|
||||
'apps.add_tag' => 'Címke hozzáadása',
|
||||
'apps.tag_name' => 'Címke név',
|
||||
'apps.tags' => 'Címke',
|
||||
'apps.override' => 'Eltérő URL alkaplazása.',
|
||||
'apps.preview' => 'Előnézet',
|
||||
'apps.apptype' => 'Alkalmazás Típus',
|
||||
|
||||
'dashboard' => 'Kezdőképernyő',
|
||||
|
||||
'user.user_list' => 'Felhasználük',
|
||||
'user.add_user' => 'Felhasználó hozzáadása',
|
||||
'user.username' => 'Felhasználói név',
|
||||
'user.avatar' => 'Avatar',
|
||||
'user.email' => 'Email',
|
||||
'user.password_confirm' => 'Jelszó megerősítés',
|
||||
'user.secure_front' => 'Nyilvános hozzáférés engedélyezése - Csak jelszó alkalmazása esetén.',
|
||||
'user.autologin' => 'Bejelentkezés URL-el, Link birtokában bárki bejelentkezhet.',
|
||||
|
||||
|
||||
'url' => 'URL',
|
||||
'title' => 'Cím',
|
||||
'delete' => 'Törlés',
|
||||
'optional' => 'Opcionális',
|
||||
'restore' => 'Visszaállítás',
|
||||
|
||||
'alert.success.item_created' => 'Elem sikeresen létrehozva',
|
||||
'alert.success.item_updated' => 'Elem sikeresen frissítve',
|
||||
'alert.success.item_deleted' => 'Elem sikeresen törölve',
|
||||
'alert.success.item_restored' => 'Elem sikeresen visszaállítva',
|
||||
'alert.success.updating' => 'Alkalmazás lista frissítése',
|
||||
|
||||
'alert.success.tag_created' => 'Címkre sikeresen létrehozva',
|
||||
'alert.success.tag_updated' => 'Címke sikeresen frissítve',
|
||||
'alert.success.tag_deleted' => 'Címke sikeresen törölve',
|
||||
'alert.success.tag_restored' => 'Címke sikeresen visszaállítva',
|
||||
|
||||
'alert.success.setting_updated' => 'Sikeres beállítás módosítás.',
|
||||
'alert.error.not_exist' => 'Nem létező beállítás',
|
||||
|
||||
'alert.success.user_created' => 'Felhasználó sikeresen létrehozva',
|
||||
'alert.success.user_updated' => 'Felhasználó sikeresen frissítve',
|
||||
'alert.success.user_deleted' => 'Felhasználó sikeresen törölve',
|
||||
'alert.success.user_restored' => 'Felhasználó sikeresen visszaállítva',
|
||||
|
||||
|
||||
];
|
||||
19
resources/lang/hu/auth.php
Normal file
19
resources/lang/hu/auth.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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' => 'Hitelesítő adat nem egyezik.',
|
||||
'throttle' => 'Túl sok hibás bejelentkezési kísérlet, Próbálja újra :seconds seconds.',
|
||||
|
||||
];
|
||||
19
resources/lang/hu/pagination.php
Normal file
19
resources/lang/hu/pagination.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Előző',
|
||||
'next' => 'Következő »',
|
||||
|
||||
];
|
||||
23
resources/lang/hu/passwords.php
Normal file
23
resources/lang/hu/passwords.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
/*'password' => 'Passwords must be at least six characters and match the confirmation.',*/
|
||||
'password' => 'A jelszónak legalább hat karakter hosszúnak kell lennie.',
|
||||
'reset' => 'A jelszó vissza lett állítva',
|
||||
'sent' => 'A jelszó visszaállító e-mail elküldve!',
|
||||
'token' => 'A jelszó visszaállító token nem érvényes',
|
||||
'user' => "Ezzel az e-mail címmel felhasználó nem található",
|
||||
|
||||
];
|
||||
@@ -1,20 +1,23 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => 'Sistema',
|
||||
'settings.appearance' => 'Aspetto',
|
||||
'settings.miscellaneous' => 'Miscellaneous',
|
||||
|
||||
'settings.miscellaneous' => 'Altre impostazioni',
|
||||
'settings.support' => 'Supporto',
|
||||
'settings.donate' => 'Dona',
|
||||
|
||||
'settings.version' => 'Versione',
|
||||
'settings.background_image' => 'Immagine di sfondo',
|
||||
'settings.window_target' => 'Apri link in',
|
||||
'settings.window_target.current' => 'Apri in questa scheda',
|
||||
'settings.window_target.one' => 'Apri nella stessa scheda',
|
||||
'settings.window_target.new' => 'Apri in una nuova scheda',
|
||||
'settings.homepage_search' => 'Ricerca in homepage',
|
||||
'settings.search_provider' => 'Motore di ricerca',
|
||||
'settings.language' => 'Lingua',
|
||||
@@ -23,33 +26,35 @@ return [
|
||||
'settings.search' => 'Cerca',
|
||||
'settings.no_items' => 'Nessun elemento trovato',
|
||||
|
||||
|
||||
'settings.label' => 'Etichetta',
|
||||
'settings.label' => 'Nome',
|
||||
'settings.value' => 'Valore',
|
||||
'settings.edit' => 'Modifica',
|
||||
'settings.view' => 'Vista',
|
||||
|
||||
'settings.view' => 'Mostra',
|
||||
|
||||
'options.none' => '- non impostato -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.yes' => 'Si',
|
||||
'options.startpage' => 'StartPage',
|
||||
'options.yes' => 'Sì',
|
||||
'options.no' => 'No',
|
||||
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
|
||||
'buttons.save' => 'Salva',
|
||||
'buttons.cancel' => 'Annulla',
|
||||
'buttons.add' => 'Aggiungi',
|
||||
'buttons.upload' => 'Aggiungi un file',
|
||||
|
||||
'buttons.upload' => 'Carica un file',
|
||||
'buttons.downloadapps' => 'Aggiorna lista app',
|
||||
|
||||
'dash.pin_item' => 'Fissa un elemento sulla dashboard',
|
||||
'dash.no_apps' => 'Non ci sono applicazioni fissate, :link1 o :link2',
|
||||
'dash.link1' => 'Aggiungi un\'applicazione qui',
|
||||
'dash.link2' => 'Fissa un elemento alla dashboard',
|
||||
'dash.pinned_items' => 'Elementi fissati',
|
||||
|
||||
'apps.app_list' => 'Lista delle applicazioni',
|
||||
'apps.view_trash' => 'Guarda il cestino',
|
||||
|
||||
'apps.app_list' => 'Lista applicazioni',
|
||||
'apps.view_trash' => 'Mostra cestino',
|
||||
'apps.add_application' => 'Aggiungi applicazione',
|
||||
'apps.application_name' => 'Nome dell\'applicazione',
|
||||
'apps.colour' => 'Colore',
|
||||
@@ -60,22 +65,49 @@ return [
|
||||
'apps.username' => 'Nome utente',
|
||||
'apps.password' => 'Password',
|
||||
'apps.config' => 'Configurazione',
|
||||
'apps.apikey' => 'Api Key',
|
||||
'apps.apikey' => 'Chiave API',
|
||||
'apps.enable' => 'Abilitato',
|
||||
|
||||
'apps.tag_list' => 'Lista tag',
|
||||
'apps.add_tag' => 'Aggiungi tag',
|
||||
'apps.tag_name' => 'Nome tag',
|
||||
'apps.tags' => 'Tag',
|
||||
'apps.override' => 'Se diverso dall\'url principale',
|
||||
'apps.preview' => 'Anteprima',
|
||||
'apps.apptype' => 'Tipo di applicazione',
|
||||
|
||||
'dashboard' => 'Home dashboard',
|
||||
|
||||
'user.user_list' => 'Utenti',
|
||||
'user.add_user' => 'Aggiungi utente',
|
||||
'user.username' => 'Username',
|
||||
'user.avatar' => 'Logo',
|
||||
'user.email' => 'Email',
|
||||
'user.password_confirm' => 'Conferma password',
|
||||
'user.secure_front' => 'Permetti accesso pubblico alla pagina principale - Vale solo se una password è stata definita.',
|
||||
'user.autologin' => 'Abilita login da una URL specifica. Chiunque con questa URL può accedere.',
|
||||
|
||||
'url' => 'Url',
|
||||
'title' => 'Titolo',
|
||||
'delete' => 'Elimina',
|
||||
'optional' => 'Opzionale',
|
||||
'restore' => 'Ripristina',
|
||||
|
||||
'restore' => 'Ripristina',
|
||||
|
||||
'alert.success.item_created' => 'Elemento creato con successo',
|
||||
'alert.success.item_updated' => 'Elemento aggiornato con successo',
|
||||
'alert.success.item_deleted' => 'Elemento cancellato con successo',
|
||||
'alert.success.item_restored' => 'Elemento ripristinato con successo',
|
||||
|
||||
'alert.success.setting_updated' => 'Hai modificato questi settaggi',
|
||||
'alert.error.not_exist' => 'Questi settaggi non esistono.',
|
||||
|
||||
|
||||
];
|
||||
'alert.success.updating' => 'Aggiornamento lista app',
|
||||
|
||||
'alert.success.tag_created' => 'Tag creato con successo',
|
||||
'alert.success.tag_updated' => 'Tag aggiornato con successo',
|
||||
'alert.success.tag_deleted' => 'Tag eliminato con successo',
|
||||
'alert.success.tag_restored' => 'Tag ripristinato con successo',
|
||||
|
||||
'alert.success.setting_updated' => 'Hai modificato questa impostazione con successo',
|
||||
'alert.error.not_exist' => 'Questa impostazione non esiste.',
|
||||
|
||||
'alert.success.user_created' => 'Utente creato con successo',
|
||||
'alert.success.user_updated' => 'Utente aggiornato con successo',
|
||||
'alert.success.user_deleted' => 'Utente eliminato con successo',
|
||||
'alert.success.user_restored' => 'Utente ripristinato con successo',
|
||||
];
|
||||
|
||||
15
resources/lang/it/auth.php
Normal file
15
resources/lang/it/auth.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?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' => 'Le credenziali non sono valide.',
|
||||
'throttle' => 'Troppi tentativi di accesso. Riprovare in :seconds secondi.',
|
||||
];
|
||||
15
resources/lang/it/pagination.php
Normal file
15
resources/lang/it/pagination.php
Normal file
@@ -0,0 +1,15 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
'previous' => '« Precedente',
|
||||
'next' => 'Successivo »',
|
||||
];
|
||||
120
resources/lang/ko/app.php
Normal file
120
resources/lang/ko/app.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => '시스템',
|
||||
'settings.appearance' => '외관',
|
||||
'settings.miscellaneous' => '잡동사니',
|
||||
'settings.support' => '지원',
|
||||
'settings.donate' => '기부',
|
||||
|
||||
'settings.version' => '버전',
|
||||
'settings.background_image' => '배경 이미지',
|
||||
'settings.window_target' => '다음에서 링크 열기',
|
||||
'settings.window_target.current' => '현재 탭에서 열기',
|
||||
'settings.window_target.one' => '같은 탭에서 열기',
|
||||
'settings.window_target.new' => '새 탭에서 열기',
|
||||
'settings.homepage_search' => '홈페이지 검색',
|
||||
'settings.search_provider' => '기본 검색 제공자',
|
||||
'settings.language' => '언어',
|
||||
'settings.reset' => '기본값으로 되돌리기',
|
||||
'settings.remove' => '제거',
|
||||
'settings.search' => '검색',
|
||||
'settings.no_items' => '항목을 찾을 수 없음',
|
||||
|
||||
|
||||
'settings.label' => '레이블',
|
||||
'settings.value' => '값',
|
||||
'settings.edit' => '편집',
|
||||
'settings.view' => '보기',
|
||||
|
||||
'options.none' => '- 구성되지 않음 -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.startpage' => '시작 페이지',
|
||||
'options.yes' => '예',
|
||||
'options.no' => '아니요',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => '저장',
|
||||
'buttons.cancel' => '취소',
|
||||
'buttons.add' => '추가',
|
||||
'buttons.upload' => '아이콘 업로드',
|
||||
'buttons.downloadapps' => '앱 목록 업데이트',
|
||||
|
||||
'dash.pin_item' => '대시보드에 항목 고정',
|
||||
'dash.no_apps' => '현재 고정된 응용 프로그램 없음, :link1 혹은 :link2',
|
||||
'dash.link1' => '여기에 앱 추가',
|
||||
'dash.link2' => '대시에 항목 고정',
|
||||
'dash.pinned_items' => '고정된 항목',
|
||||
|
||||
'apps.app_list' => '앱 목록',
|
||||
'apps.view_trash' => '휴지통 보기',
|
||||
'apps.add_application' => '앱 추가',
|
||||
'apps.application_name' => '앱 이름',
|
||||
'apps.colour' => '색상',
|
||||
'apps.icon' => '아이콘',
|
||||
'apps.pinned' => '고정됨',
|
||||
'apps.title' => '제목',
|
||||
'apps.hex' => '16진수 색상',
|
||||
'apps.username' => '사용자 이름',
|
||||
'apps.password' => '암호',
|
||||
'apps.config' => '설정',
|
||||
'apps.apikey' => 'API 키',
|
||||
'apps.enable' => '활성화',
|
||||
'apps.tag_list' => '태그 목록',
|
||||
'apps.add_tag' => '태그 추가',
|
||||
'apps.tag_name' => '태그 이름',
|
||||
'apps.tags' => '태그',
|
||||
'apps.override' => '기본 URL과 다른 경우',
|
||||
'apps.preview' => '미리보기',
|
||||
'apps.apptype' => '앱 형식',
|
||||
|
||||
'dashboard' => '홈 대시보드',
|
||||
|
||||
'user.user_list' => '사용자',
|
||||
'user.add_user' => '사용자 추가',
|
||||
'user.username' => '사용자 이름',
|
||||
'user.avatar' => '아바타',
|
||||
'user.email' => '전자 메일',
|
||||
'user.password_confirm' => '암호 확인',
|
||||
'user.secure_front' => 'Allow public access to front - Only enforced if a password is set.',
|
||||
'user.autologin' => 'Allow logging in from a specific URL. Anyone with the link can login.',
|
||||
|
||||
'url' => 'URL',
|
||||
'title' => '제목',
|
||||
'delete' => '제거',
|
||||
'optional' => '선택적',
|
||||
'restore' => '복원',
|
||||
|
||||
'alert.success.item_created' => '항목을 성공적으로 만들었습니다',
|
||||
'alert.success.item_updated' => '항목을 성공적으로 업데이트했습니다',
|
||||
'alert.success.item_deleted' => '항목을 성공적으로 제거했습니다',
|
||||
'alert.success.item_restored' => '항목을 성공적으로 복원했습니다',
|
||||
'alert.success.updating' => '앱 목록 업데이트 중',
|
||||
|
||||
'alert.success.tag_created' => '태그를 성공적으로 만들었습니다',
|
||||
'alert.success.tag_updated' => '태그를 성공적으로 업데이트했습니다',
|
||||
'alert.success.tag_deleted' => '태그를 성공적으로 제거했습니다',
|
||||
'alert.success.tag_restored' => '태그를 성공적으로 복원했습니다',
|
||||
|
||||
'alert.success.setting_updated' => '설정을 성공적으로 수정했습니다',
|
||||
'alert.error.not_exist' => '이 설정은 존재하지 않습니다.',
|
||||
|
||||
'alert.success.user_created' => '사용자를 성공적으로 만들었습니다',
|
||||
'alert.success.user_updated' => '사용자를 성공적으로 업데이트했습니다',
|
||||
'alert.success.user_deleted' => '사용자를 성공적으로 제거했습니다',
|
||||
'alert.success.user_restored' => '사용자를 성공적으로 복원했습니다',
|
||||
|
||||
|
||||
];
|
||||
19
resources/lang/ko/auth.php
Normal file
19
resources/lang/ko/auth.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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' => 'These credentials do not match our records.',
|
||||
'throttle' => 'Too many login attempts. Please try again in :seconds seconds.',
|
||||
|
||||
];
|
||||
19
resources/lang/ko/pagination.php
Normal file
19
resources/lang/ko/pagination.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« 이전',
|
||||
'next' => '다음 »',
|
||||
|
||||
];
|
||||
22
resources/lang/ko/passwords.php
Normal file
22
resources/lang/ko/passwords.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => '암호는 6자 이상이어야 하며 확인란과 서로 일치해야 합니다.',
|
||||
'reset' => '암호가 재설정되었습니다!',
|
||||
'sent' => '암호 재설정 링크를 전자 메일로 전송했습니다!',
|
||||
'token' => '이 암호 재설정 토큰은 잘못되었습니다.',
|
||||
'user' => "해당 이메일 주소를 가진 사용자를 찾을 수 없습니다.",
|
||||
|
||||
];
|
||||
121
resources/lang/ko/validation.php
Normal file
121
resources/lang/ko/validation.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?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, and dashes.',
|
||||
'alpha_num' => 'The :attribute may only contain letters and numbers.',
|
||||
'array' => 'The :attribute must be an array.',
|
||||
'before' => 'The :attribute must be a date before :date.',
|
||||
'before_or_equal' => 'The :attribute must be a date before or equal to :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.',
|
||||
],
|
||||
'boolean' => 'The :attribute field must be true or false.',
|
||||
'confirmed' => 'The :attribute confirmation does not match.',
|
||||
'date' => 'The :attribute is not a valid 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' => 'The :attribute must be a valid email address.',
|
||||
'exists' => 'The selected :attribute is invalid.',
|
||||
'file' => 'The :attribute must be a file.',
|
||||
'filled' => 'The :attribute field must have a 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.',
|
||||
'max' => [
|
||||
'numeric' => 'The :attribute may not be greater than :max.',
|
||||
'file' => 'The :attribute may not be greater than :max kilobytes.',
|
||||
'string' => 'The :attribute may not be greater than :max characters.',
|
||||
'array' => 'The :attribute may not have more than :max items.',
|
||||
],
|
||||
'mimes' => 'The :attribute must be a file of type: :values.',
|
||||
'mimetypes' => 'The :attribute must be a file of type: :values.',
|
||||
'min' => [
|
||||
'numeric' => 'The :attribute must be at least :min.',
|
||||
'file' => 'The :attribute must be at least :min kilobytes.',
|
||||
'string' => 'The :attribute must be at least :min characters.',
|
||||
'array' => 'The :attribute must have at least :min items.',
|
||||
],
|
||||
'not_in' => 'The selected :attribute is invalid.',
|
||||
'numeric' => 'The :attribute must be a number.',
|
||||
'present' => 'The :attribute field must be present.',
|
||||
'regex' => 'The :attribute format is invalid.',
|
||||
'required' => 'The :attribute field is required.',
|
||||
'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 is 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.',
|
||||
'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.',
|
||||
],
|
||||
'string' => 'The :attribute must be a string.',
|
||||
'timezone' => 'The :attribute must be a valid zone.',
|
||||
'unique' => 'The :attribute has already been taken.',
|
||||
'uploaded' => 'The :attribute failed to upload.',
|
||||
'url' => 'The :attribute format is invalid.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| 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 attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
||||
@@ -22,11 +22,11 @@ return [
|
||||
'settings.window_target.one' => 'In dezelfde tab openen',
|
||||
'settings.window_target.new' => 'In een nieuwe tab openen',
|
||||
'settings.homepage_search' => 'Zoeken op thuispagina',
|
||||
'settings.search_provider' => 'Zoekaanbieder',
|
||||
'settings.search_provider' => 'Zoekmachine',
|
||||
'settings.language' => 'Taal',
|
||||
'settings.reset' => 'Standaardinstellingen herstellen',
|
||||
'settings.remove' => 'Verwijderen',
|
||||
'settings.search' => 'zoeken',
|
||||
'settings.search' => 'Zoeken',
|
||||
'settings.no_items' => 'Geen items gevonden',
|
||||
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ return [
|
||||
|
|
||||
*/
|
||||
|
||||
'failed' => 'De door u opgegeven referenties komen niet overeen met onze gegevens.',
|
||||
'failed' => 'De door u opgegeven inloggegevens komen niet overeen met onze gegevens.',
|
||||
'throttle' => 'Te veel aanmeldpogingen. Probeer het over :seconds seconden opnieuw.',
|
||||
|
||||
];
|
||||
|
||||
@@ -82,8 +82,8 @@ return [
|
||||
'string' => ':attribute moet :size karakters bevatten.',
|
||||
'array' => ':attribute moet :size items bevatten.',
|
||||
],
|
||||
'string' => ':attribute moet een tekenreekswaarde zijn.',
|
||||
'timezone' => ':attribute moet een geldige zone bevatten.',
|
||||
'string' => ':attribute moet een tekstformaat zijn.',
|
||||
'timezone' => ':attribute moet een geldige tijdzone bevatten.',
|
||||
'unique' => ':attribute is reeds in gebruik.',
|
||||
'uploaded' => 'Het uploaden van :attribute is niet gelukt.',
|
||||
'url' => 'Het formaat van :attribute is ongeldig.',
|
||||
|
||||
120
resources/lang/ru/app.php
Normal file
120
resources/lang/ru/app.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => 'Система',
|
||||
'settings.appearance' => 'Внешний вид',
|
||||
'settings.miscellaneous' => 'Разное',
|
||||
'settings.support' => 'Поддержка',
|
||||
'settings.donate' => 'Пожертвования',
|
||||
|
||||
'settings.version' => 'Версия',
|
||||
'settings.background_image' => 'Фоновое изображение',
|
||||
'settings.window_target' => 'Открывать ссылки в',
|
||||
'settings.window_target.current' => 'Открывать в этой же закладке',
|
||||
'settings.window_target.one' => 'Открывать в той же закладке',
|
||||
'settings.window_target.new' => 'Открывать в новой закладке',
|
||||
'settings.homepage_search' => 'Страница поиска',
|
||||
'settings.search_provider' => 'Поисковая система',
|
||||
'settings.language' => 'Язык',
|
||||
'settings.reset' => 'Вернуть к начальным значениям',
|
||||
'settings.remove' => 'Удалить',
|
||||
'settings.search' => 'найти',
|
||||
'settings.no_items' => 'Ничего не найдено',
|
||||
|
||||
|
||||
'settings.label' => 'Метка',
|
||||
'settings.value' => 'Значение',
|
||||
'settings.edit' => 'Редактировать',
|
||||
'settings.view' => 'Просмотр',
|
||||
|
||||
'options.none' => '- не установлено -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.startpage' => 'Начальная страница',
|
||||
'options.yes' => 'Да',
|
||||
'options.no' => 'Нет',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => 'Сохранить',
|
||||
'buttons.cancel' => 'Отменить',
|
||||
'buttons.add' => 'Добавить',
|
||||
'buttons.upload' => 'Загрузить картинку',
|
||||
'buttons.downloadapps' => 'Обновить список приложений',
|
||||
|
||||
'dash.pin_item' => 'Прикрепить к панели',
|
||||
'dash.no_apps' => 'Нет прикрепленных приложений, :link1 или :link2',
|
||||
'dash.link1' => 'Добавьте приложение',
|
||||
'dash.link2' => 'Прикрепите на доску',
|
||||
'dash.pinned_items' => 'Прикрепленные элементы',
|
||||
|
||||
'apps.app_list' => 'Список приложений',
|
||||
'apps.view_trash' => 'Показать корзину',
|
||||
'apps.add_application' => 'Добавить приложение',
|
||||
'apps.application_name' => 'Имя приложения',
|
||||
'apps.colour' => 'Цвет',
|
||||
'apps.icon' => 'Изображение',
|
||||
'apps.pinned' => 'Прикреплено',
|
||||
'apps.title' => 'Заголовок',
|
||||
'apps.hex' => 'Цвет в Hex',
|
||||
'apps.username' => 'Имя пользователя',
|
||||
'apps.password' => 'Пароль',
|
||||
'apps.config' => 'Настройки',
|
||||
'apps.apikey' => 'Ключ API',
|
||||
'apps.enable' => 'Включено',
|
||||
'apps.tag_list' => 'Список тегов',
|
||||
'apps.add_tag' => 'Добавить тэг',
|
||||
'apps.tag_name' => 'Название тэга',
|
||||
'apps.tags' => 'Тэги',
|
||||
'apps.override' => 'Если отличается от основного url',
|
||||
'apps.preview' => 'Предпросмотр',
|
||||
'apps.apptype' => 'Тип приложения',
|
||||
|
||||
'dashboard' => 'Основная панель',
|
||||
|
||||
'user.user_list' => 'Пользователи',
|
||||
'user.add_user' => 'Добавить пользователя',
|
||||
'user.username' => 'Имя пользователя',
|
||||
'user.avatar' => 'Аватар',
|
||||
'user.email' => 'Email',
|
||||
'user.password_confirm' => 'Подтверждение пароля',
|
||||
'user.secure_front' => 'Разрешить публичный доступ - Возможно только если установлен пароль.',
|
||||
'user.autologin' => 'Автоматический вход с определенного URL. Кто угодно может войти с данной ссылкой.',
|
||||
|
||||
'url' => 'URL',
|
||||
'title' => 'Заголовок',
|
||||
'delete' => 'Удалить',
|
||||
'optional' => 'Опционально',
|
||||
'restore' => 'Восстановить',
|
||||
|
||||
'alert.success.item_created' => 'Элемент создан успешно',
|
||||
'alert.success.item_updated' => 'Элемент обновлен успешно',
|
||||
'alert.success.item_deleted' => 'Элемент удален успешно',
|
||||
'alert.success.item_restored' => 'Элемент восстановлен успешно',
|
||||
'alert.success.updating' => 'Обновлен список приложений',
|
||||
|
||||
'alert.success.tag_created' => 'Тэг создан успешно',
|
||||
'alert.success.tag_updated' => 'Тэг обновлен успешно',
|
||||
'alert.success.tag_deleted' => 'Тэг удален успешно',
|
||||
'alert.success.tag_restored' => 'Тэг восстановлен успешно',
|
||||
|
||||
'alert.success.setting_updated' => 'Вы успешно отредактировали настройки',
|
||||
'alert.error.not_exist' => 'Ваших настроек не существует.',
|
||||
|
||||
'alert.success.user_created' => 'Пользователь создан успешно',
|
||||
'alert.success.user_updated' => 'Пользователь обновлен успешно',
|
||||
'alert.success.user_deleted' => 'Пользователь удален успешно',
|
||||
'alert.success.user_restored' => 'Пользователь восстановлен успешно',
|
||||
|
||||
|
||||
];
|
||||
19
resources/lang/ru/auth.php
Normal file
19
resources/lang/ru/auth.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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' => 'Введенные реквизиты не совпадают c существующими.',
|
||||
'throttle' => 'Слишком много попыток авторизации. Попробуйте снова через :seconds секунд.',
|
||||
|
||||
];
|
||||
19
resources/lang/ru/pagination.php
Normal file
19
resources/lang/ru/pagination.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Предыдущий',
|
||||
'next' => 'Следующий »',
|
||||
|
||||
];
|
||||
22
resources/lang/ru/passwords.php
Normal file
22
resources/lang/ru/passwords.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => 'Длина пароля минимум 6 символов и он должен совпадать с подтверждением.',
|
||||
'reset' => 'Ваш пароль сброшен!',
|
||||
'sent' => 'Мы отправили вам ссылку для сброса пароля!',
|
||||
'token' => 'Неверный токен для сброса пароля.',
|
||||
'user' => "Не могу найти пользователя с таким адресом e-mail.",
|
||||
|
||||
];
|
||||
121
resources/lang/ru/validation.php
Normal file
121
resources/lang/ru/validation.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?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' => ':attribute должен быть подтвержден.',
|
||||
'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' => ':attribute должен быть в интервале :min и :max.',
|
||||
'file' => ':attribute должен быть в интервале :min и :max килобайт.',
|
||||
'string' => ':attribute должен быть в интервале :min и :max символов.',
|
||||
'array' => ':attribute должен иметь :min и :max элементов.',
|
||||
],
|
||||
'boolean' => ':attribute поле должно быть Истина или Ложь.',
|
||||
'confirmed' => ':attribute подтверждение не соответствует.',
|
||||
'date' => ':attribute неверная дата.',
|
||||
'date_format' => ':attribute не совпадает с форматом :format.',
|
||||
'different' => ':attribute и :other должны отличаться.',
|
||||
'digits' => ':attribute должен иметь :digits разрядов.',
|
||||
'digits_between' => ':attribute должен иметь :min и :max разрядов.',
|
||||
'dimensions' => ':attribute имеет неверное разрешение.',
|
||||
'distinct' => ':attribute поле имеет дублирующееся значение.',
|
||||
'email' => ':attribute должен быть правильным адресом email.',
|
||||
'exists' => 'Выбранный :attribute неверный.',
|
||||
'file' => ':attribute должен быть файлом.',
|
||||
'filled' => ':attribute поле должно быть заполнено.',
|
||||
'image' => ':attribute должно быть изображением.',
|
||||
'in' => 'Выбранное :attribute неверно.',
|
||||
'in_array' => ':attribute поле не должно существовать в :other.',
|
||||
'integer' => ':attribute должно быть целым.',
|
||||
'ip' => ':attribute должно содержать правильный адрес IP.',
|
||||
'ipv4' => ':attribute должно содержать правильный адрес IPv4.',
|
||||
'ipv6' => ':attribute должно содержать правильный адрес IPv6.',
|
||||
'json' => ':attribute должно содержать правильную строку JSON.',
|
||||
'max' => [
|
||||
'numeric' => ':attribute не может быть больше :max.',
|
||||
'file' => ':attribute не может быть больше :max килобайт.',
|
||||
'string' => ':attribute не может быть больше :max символов.',
|
||||
'array' => ':attribute не может быть больше :max элементов.',
|
||||
],
|
||||
'mimes' => ':attribute должен быть файлом вида: :values.',
|
||||
'mimetypes' => ':attribute должен быть файлом вида: :values.',
|
||||
'min' => [
|
||||
'numeric' => 'The :attribute должен быть как минимум :min.',
|
||||
'file' => 'The :attribute должен быть :min килобайт.',
|
||||
'string' => 'The :attribute должен быть :min символов.',
|
||||
'array' => 'The :attribute должен иметь минимум :min элементов.',
|
||||
],
|
||||
'not_in' => 'Выбранный :attribute неверен.',
|
||||
'numeric' => ':attribute должен быть числом.',
|
||||
'present' => ':attribute поле должно существовать.',
|
||||
'regex' => ':attribute формат неверен.',
|
||||
'required' => ':attribute поле обязательно.',
|
||||
'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' => ':attribute должен быть :size.',
|
||||
'file' => ':attribute должен быть килобайт.',
|
||||
'string' => ':attribute должен быть символов.',
|
||||
'array' => ':attribute олжен содержать :size элементов.',
|
||||
],
|
||||
'string' => ':attribute должен быть строе=кой.',
|
||||
'timezone' => ':attribute должна быть правильной зоной.',
|
||||
'unique' => ':attribute уже существует.',
|
||||
'uploaded' => ':attribute ошибка загрузки.',
|
||||
'url' => ':attribute неверный формат.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| 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 Validation Attributes
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
| The following language lines are used to swap attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
||||
120
resources/lang/sl/app.php
Normal file
120
resources/lang/sl/app.php
Normal file
@@ -0,0 +1,120 @@
|
||||
<?php
|
||||
|
||||
return [
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| App Language Lines
|
||||
|--------------------------------------------------------------------------
|
||||
|
|
||||
*/
|
||||
|
||||
'settings.system' => 'Sistem',
|
||||
'settings.appearance' => 'Videz',
|
||||
'settings.miscellaneous' => 'Ostalo',
|
||||
'settings.support' => 'Podpora',
|
||||
'settings.donate' => 'Doniraj',
|
||||
|
||||
'settings.version' => 'Verzija',
|
||||
'settings.background_image' => 'Slika za ozadje',
|
||||
'settings.window_target' => 'Povezava se odpre v',
|
||||
'settings.window_target.current' => 'Odpri v tem zavihku',
|
||||
'settings.window_target.one' => 'Odpri v istem zavihku',
|
||||
'settings.window_target.new' => 'Odpri v novem zavihku',
|
||||
'settings.homepage_search' => 'Iskanje po domači strani',
|
||||
'settings.search_provider' => 'Privzeti ponudnik iskanja',
|
||||
'settings.language' => 'Jezik',
|
||||
'settings.reset' => 'Ponastavi na privzeto',
|
||||
'settings.remove' => 'Odstrani',
|
||||
'settings.search' => 'išči',
|
||||
'settings.no_items' => 'Ni najdenih elementov',
|
||||
|
||||
|
||||
'settings.label' => 'Oznaka',
|
||||
'settings.value' => 'Vrednost',
|
||||
'settings.edit' => 'Uredi',
|
||||
'settings.view' => 'Poglej',
|
||||
|
||||
'options.none' => '- ni nastavljeno -',
|
||||
'options.google' => 'Google',
|
||||
'options.ddg' => 'DuckDuckGo',
|
||||
'options.bing' => 'Bing',
|
||||
'options.qwant' => 'Qwant',
|
||||
'options.startpage' => 'StartPage',
|
||||
'options.yes' => 'Da',
|
||||
'options.no' => 'Ne',
|
||||
'options.nzbhydra' => 'NZBHydra',
|
||||
'options.jackett' => 'Jackett',
|
||||
|
||||
'buttons.save' => 'Shrani',
|
||||
'buttons.cancel' => 'Prekliči',
|
||||
'buttons.add' => 'Dodaj',
|
||||
'buttons.upload' => 'Naloži ikono',
|
||||
'buttons.downloadapps' => 'Posodobi Seznam Aplikacij',
|
||||
|
||||
'dash.pin_item' => 'Pripni element na nadzorno ploščo',
|
||||
'dash.no_apps' => 'Trenutno ni pripetih aplikacij, :link1 ali :link2',
|
||||
'dash.link1' => 'Dodaj aplikacijo tukaj',
|
||||
'dash.link2' => 'Pripni aplikacijo na nadzorno ploščo',
|
||||
'dash.pinned_items' => 'Pripeti elementi',
|
||||
|
||||
'apps.app_list' => 'Seznam aplikacij',
|
||||
'apps.view_trash' => 'Poglej smeti',
|
||||
'apps.add_application' => 'Dodaj aplikacijo',
|
||||
'apps.application_name' => 'Ime aplikacije',
|
||||
'apps.colour' => 'Barva',
|
||||
'apps.icon' => 'Ikona',
|
||||
'apps.pinned' => 'Pripeto',
|
||||
'apps.title' => 'Naslov',
|
||||
'apps.hex' => 'Hex barva',
|
||||
'apps.username' => 'Uporabniško ime',
|
||||
'apps.password' => 'Geslo',
|
||||
'apps.config' => 'Konfiguracija',
|
||||
'apps.apikey' => 'API Ključ',
|
||||
'apps.enable' => 'Omogoči',
|
||||
'apps.tag_list' => 'Seznam oznak',
|
||||
'apps.add_tag' => 'Dodaj oznako',
|
||||
'apps.tag_name' => 'Ime oznake',
|
||||
'apps.tags' => 'Oznake',
|
||||
'apps.override' => 'Če je drugače od glavnega url-ja',
|
||||
'apps.preview' => 'Predogled',
|
||||
'apps.apptype' => 'Tip aplikacije',
|
||||
|
||||
'dashboard' => 'Home dashboard',
|
||||
|
||||
'user.user_list' => 'Uporabniki',
|
||||
'user.add_user' => 'Dodaj uporabnika',
|
||||
'user.username' => 'Uporabniško ime',
|
||||
'user.avatar' => 'Avatar',
|
||||
'user.email' => 'Email',
|
||||
'user.password_confirm' => 'Potrdi geslo',
|
||||
'user.secure_front' => 'Dovoli javni dostop do strani - Samo če je nastavljeno geslo.',
|
||||
'user.autologin' => 'Dovoli prijavo iz specifičnega URL-ja. Vsi s povezavo se lahko prijavijo.',
|
||||
|
||||
'url' => 'URL',
|
||||
'title' => 'Naslov',
|
||||
'delete' => 'Izbriši',
|
||||
'optional' => 'Opcijsko',
|
||||
'restore' => 'Obnovi',
|
||||
|
||||
'alert.success.item_created' => 'Element uspešno ustvarjen',
|
||||
'alert.success.item_updated' => 'Element uspešno posodobljen',
|
||||
'alert.success.item_deleted' => 'Element uspešno izbrisan',
|
||||
'alert.success.item_restored' => 'Element uspešno obnovljen',
|
||||
'alert.success.updating' => 'Posodabljam seznam aplikacij',
|
||||
|
||||
'alert.success.tag_created' => 'Oznaka uspešno ustvarjena',
|
||||
'alert.success.tag_updated' => 'Oznaka uspešno posodobljena',
|
||||
'alert.success.tag_deleted' => 'Oznaka uspešno izbrisana',
|
||||
'alert.success.tag_restored' => 'Oznaka uspešno obnovljena',
|
||||
|
||||
'alert.success.setting_updated' => 'Uspešno uredil to oznako',
|
||||
'alert.error.not_exist' => 'Ta nastavitev ne obstaja.',
|
||||
|
||||
'alert.success.user_created' => 'Uporabnik uspešno ustvarjen',
|
||||
'alert.success.user_updated' => 'Uporabnik uspešno posodobljen',
|
||||
'alert.success.user_deleted' => 'Uporabnik uspešno izbrisan',
|
||||
'alert.success.user_restored' => 'Uporabnik uspešno obnovljen',
|
||||
|
||||
|
||||
];
|
||||
19
resources/lang/sl/auth.php
Normal file
19
resources/lang/sl/auth.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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' => 'Podatki za prijavo se ne ujemajo.',
|
||||
'throttle' => 'Preveč poizkusov prijave. Ponovno poizkusi čez :seconds sekund.',
|
||||
|
||||
];
|
||||
19
resources/lang/sl/pagination.php
Normal file
19
resources/lang/sl/pagination.php
Normal file
@@ -0,0 +1,19 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'previous' => '« Prejšna',
|
||||
'next' => 'Naslednja »',
|
||||
|
||||
];
|
||||
22
resources/lang/sl/passwords.php
Normal file
22
resources/lang/sl/passwords.php
Normal file
@@ -0,0 +1,22 @@
|
||||
<?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.
|
||||
|
|
||||
*/
|
||||
|
||||
'password' => 'Geslo mora imeti najmanj šest znakov in se mora ujemati s potrditvijo.',
|
||||
'reset' => 'Tvoje geslo je bilo ponastavljeno!',
|
||||
'sent' => 'Na tvoj email smo poslali povezavo za ponastavitev gesla!',
|
||||
'token' => 'Ta ključ za ponastavitev gesla ni veljaven.',
|
||||
'user' => "Ne najdemo uporabnika s tem e-naslovom.",
|
||||
|
||||
];
|
||||
121
resources/lang/sl/validation.php
Normal file
121
resources/lang/sl/validation.php
Normal file
@@ -0,0 +1,121 @@
|
||||
<?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' => ':attribute mora biti potrjen.',
|
||||
'active_url' => ':attribute ni pravilen URL naslov.',
|
||||
'after' => ':attribute mora biti datum po :date.',
|
||||
'after_or_equal' => ':attribute mora biti datum po ali enak :date.',
|
||||
'alpha' => ':attribute lahko vsebuje samo črke.',
|
||||
'alpha_dash' => ':attribute lahko vsebuje samo črke, številke in pomišljaje.',
|
||||
'alpha_num' => ':attribute lahko vsebuje samo črke in številke.',
|
||||
'array' => ':attribute mora biti niz podatkov.',
|
||||
'before' => ':attribute mora biti datum pred :date.',
|
||||
'before_or_equal' => ':attribute mora biti datum pred ali enak :date.',
|
||||
'between' => [
|
||||
'numeric' => ':attribute mora biti med :min in :max.',
|
||||
'file' => ':attribute mora biti med :min in :max kilobajtov.',
|
||||
'string' => ':attribute mora biti med :min in :max znakov.',
|
||||
'array' => ':attribute mora biti med :min in :max elementov.',
|
||||
],
|
||||
'boolean' => ':attribute polje mora biti true ali false.',
|
||||
'confirmed' => ':attribute potrditev se ne ujema.',
|
||||
'date' => ':attribute ni pravilen datum.',
|
||||
'date_format' => ':attribute se ne ujema s formatom :format.',
|
||||
'different' => ':attribute in :other morata biti različna.',
|
||||
'digits' => ':attribute mora imeti :digits mest.',
|
||||
'digits_between' => ':attribute mora biti med :in and :max mest.',
|
||||
'dimensions' => ':attribute ima nepravilne dimenzije slike.',
|
||||
'distinct' => ':attribute polje ima podvojeno vrednost.',
|
||||
'email' => ':attribute mora biti pravilen e-naslov.',
|
||||
'exists' => 'izbrani :attribute ni pravilen.',
|
||||
'file' => ':attribute mora biti datoteka.',
|
||||
'filled' => ':attribute polje mora imeti vrednost.',
|
||||
'image' => ':attribute mora biti slika.',
|
||||
'in' => 'izbrani :attribute ni pravilen.',
|
||||
'in_array' => ':attribute polje ne obstaja v :other.',
|
||||
'integer' => ':attribute mora biti številka.',
|
||||
'ip' => ':attribute mora biti veljaven IP naslov.',
|
||||
'ipv4' => ':attribute must be a valid IPv4 naslov.',
|
||||
'ipv6' => ':attribute must be a valid IPv6 naslov.',
|
||||
'json' => ':attribute mora biti veljaven JSON.',
|
||||
'max' => [
|
||||
'numeric' => ':attribute ne sme biti več kot :max.',
|
||||
'file' => ':attribute ne sme biti več kot :max kilobajtov.',
|
||||
'string' => ':attribute ne sme biti več kot :max znakov.',
|
||||
'array' => ':attribute ne sme imeti več kot :max elementov.',
|
||||
],
|
||||
'mimes' => ':attribute mora biti datoteka tipa: :values.',
|
||||
'mimetypes' => ':attribute mora biti datoteka tipa: :values.',
|
||||
'min' => [
|
||||
'numeric' => ':attribute mora biti najmanj :min.',
|
||||
'file' => ':attribute mora biti najmanj :min kilobajtov.',
|
||||
'string' => ':attribute mora imeti najmanj :min znakov.',
|
||||
'array' => ':attribute mora imeti najmanj :min elementov.',
|
||||
],
|
||||
'not_in' => 'izbrani :attribute ni pravilen.',
|
||||
'numeric' => ':attribute mora biti številka.',
|
||||
'present' => ':attribute polje mora biti prisotno.',
|
||||
'regex' => ':attribute format ni veljaven.',
|
||||
'required' => ':attribute polje je obvezno.',
|
||||
'required_if' => ':attribute polje je obvezno, če :other je :value.',
|
||||
'required_unless' => ':attribute polje je obvezno, razen če :other je v :values.',
|
||||
'required_with' => ':attribute polje je obvezno, če :values je prisotno.',
|
||||
'required_with_all' => ':attribute polje je obvezno, če :values je prisotno.',
|
||||
'required_without' => ':attribute polje je obvezno, ko :values ni prisotno.',
|
||||
'required_without_all' => ':attribute polje je obvezno, ko nobeden od :values ni prisotnih.',
|
||||
'same' => ':attribute in :other se morata ujemati.',
|
||||
'size' => [
|
||||
'numeric' => ':attribute mora biti :size.',
|
||||
'file' => ':attribute mora biti :size kilobajtov.',
|
||||
'string' => ':attribute mora imeti :size znakov.',
|
||||
'array' => ':attribute mora imeti :size elementov.',
|
||||
],
|
||||
'string' => ':attribute mora biti niz.',
|
||||
'timezone' => ':attribute mora biti veljavno časovna cona.',
|
||||
'unique' => ':attribute je že zasedeno.',
|
||||
'uploaded' => ':attribute nalaganje neuspešno.',
|
||||
'url' => ':attribute format ni pravilen.',
|
||||
|
||||
/*
|
||||
|--------------------------------------------------------------------------
|
||||
| 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 attribute place-holders
|
||||
| with something more reader friendly such as E-Mail Address instead
|
||||
| of "email". This simply helps us make messages a little cleaner.
|
||||
|
|
||||
*/
|
||||
|
||||
'attributes' => [],
|
||||
|
||||
];
|
||||
@@ -73,13 +73,13 @@ return array (
|
||||
'apps.preview' => 'Förhandsvisa',
|
||||
|
||||
|
||||
'user.user_list' => 'Avnändare',
|
||||
'user.user_list' => 'Användare',
|
||||
'user.add_user' => 'Lägg till användare',
|
||||
'user.username' => 'Användarnamn',
|
||||
'user.avatar' => 'Avatar',
|
||||
'user.email' => 'Epost',
|
||||
'user.password_confirm' => 'Upprepa lösenord',
|
||||
'user.secure_front' => 'Tillåt allmän åtkonst till framsidan - Upprätthålls endast om ett lösenord är satt.',
|
||||
'user.secure_front' => 'Tillåt allmän åtkomst till framsidan - Upprätthålls endast om ett lösenord är satt.',
|
||||
'user.autologin' => 'Tillåt inloggning från en specifik URL. Vem som helst med länken kan logga in.',
|
||||
|
||||
|
||||
@@ -90,9 +90,9 @@ return array (
|
||||
'restore' => 'Återställ',
|
||||
|
||||
|
||||
'alert.success.item_created' => 'Artickeln skapad',
|
||||
'alert.success.item_updated' => 'Artickeln uppdaterad',
|
||||
'alert.success.item_deleted' => 'Artickeln borttagen',
|
||||
'alert.success.item_created' => 'Artikeln skapad',
|
||||
'alert.success.item_updated' => 'Artikeln uppdaterad',
|
||||
'alert.success.item_deleted' => 'Artikeln borttagen',
|
||||
'alert.success.item_restored' => 'Artikeln återställd',
|
||||
'alert.success.updating' => 'Uppdaterar app lista',
|
||||
|
||||
|
||||
@@ -1,18 +1,30 @@
|
||||
<section class="item-container{{ $app->droppable }}" data-id="{{ $app->id }}">
|
||||
<section class="item-container{{ $app->droppable }}" data-name="{{ $app->title }}" data-id="{{ $app->id }}">
|
||||
<div class="item" style="background-color: {{ $app->colour }}">
|
||||
@if($app->icon)
|
||||
<img class="app-icon" src="{{ asset('/storage/'.str_replace('supportedapps', 'icons', $app->icon)) }}" />
|
||||
@else
|
||||
<img class="app-icon" src="{{ asset('/img/heimdall-icon-small.png') }}" />
|
||||
@endif
|
||||
<div class="app-icon-container">
|
||||
@if($app->icon)
|
||||
<img class="app-icon" src="{{ asset('/storage/'.str_replace('supportedapps', 'icons', $app->icon)) }}" />
|
||||
@else
|
||||
<img class="app-icon" src="{{ asset('/img/heimdall-icon-small.png') }}" />
|
||||
@endif
|
||||
</div>
|
||||
<div class="details">
|
||||
<div class="title{{ title_color($app->colour) }}">{{ $app->title }}</div>
|
||||
@if($app->enabled())
|
||||
<div data-id="{{ $app->id }}" data-dataonly="{{ $app->getconfig()->dataonly ?? '0' }}" class="livestats-container{{ title_color($app->colour) }}"></div>
|
||||
@endif
|
||||
</div>
|
||||
<a title="{{ App\Item::getApplicationDescription($app->class) }}" class="link{{ title_color($app->colour) }}"{!! $app->link_target !!} href="{{ url($app->link) }}"><i class="fas {{ $app->link_icon }}"></i></a>
|
||||
<a rel="noopener noreferrer" class="link{{ title_color($app->colour) }}"{!! $app->link_target !!} href="{{ $app->link }}"><i class="fas {{ $app->link_icon }}"></i></a>
|
||||
<?php /*
|
||||
@if($app->enhanced() === true && (bool)$app->getConfig()->enabled === true)
|
||||
<div class="tile-actions refresh">
|
||||
<div class="icon">
|
||||
<i class="fas fa-arrow-rotate-right"></i>
|
||||
</div>
|
||||
Refresh Stats
|
||||
</div>
|
||||
@endif
|
||||
*/ ?>
|
||||
</div>
|
||||
<a class="item-edit" href="{{ route($app->link_type.'.edit', [ $app->id ]) }}"><i class="fas fa-pencil"></i></a>
|
||||
|
||||
@if((string)$app->appdescription !== '')<div class="tooltip">{{ $app->appdescription }}</div>@endif
|
||||
</section>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<section class="module-container">
|
||||
<header>
|
||||
<div class="section-title">{{ __('app.apps.add_application') }}</div>
|
||||
<div class="section-title">{{ __('app.apps.preview') }}</div>
|
||||
<div class="module-actions">
|
||||
<div class="toggleinput">
|
||||
<label class="name">{{ __('app.apps.pinned') }}</label>
|
||||
@@ -19,25 +19,56 @@
|
||||
<a href="{{ route('items.index', []) }}" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
|
||||
</div>
|
||||
</header>
|
||||
<div id="create" class="create">
|
||||
|
||||
<div id="tile-preview" class="create">
|
||||
<div class="">
|
||||
@include('items.preview')
|
||||
</div>
|
||||
<div class="appoptions">
|
||||
<div class="optdetails">
|
||||
<div><button class="dark">{{ __('app.apps.apptype') }}</button></div>
|
||||
<div class="optvalue">
|
||||
<div class="input">
|
||||
{!! Form::select('appid', App\Application::applist(), null, array('class' => 'form-control config-item', 'id' => 'apptype', 'data-config' => 'type')) !!}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="searchwebsite" class="optdetails">
|
||||
<div><button class="dark">{{ __('app.apps.website') }}</button></div>
|
||||
<div class="optvalue">
|
||||
<div class="input">
|
||||
{!! Form::text('website', $item->url ?? null, array('placeholder' => __('app.apps.website'), 'id' => 'website', 'class' => 'form-control')) !!}
|
||||
<small class="help">Don't forget http(s)://</small>
|
||||
</div>
|
||||
<div><button class="btn">Go</button></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="websiteiconoptions"></div>
|
||||
</div>
|
||||
|
||||
|
||||
<header style="border-top: 1px solid #dbdce3;">
|
||||
<div class="section-title">{{ __('app.apps.add_application') }}</div>
|
||||
</header>
|
||||
|
||||
|
||||
<div id="create" class="create">
|
||||
{!! csrf_field() !!}
|
||||
<div class="input">
|
||||
<label>{{ __('app.apps.application_name') }} *</label>
|
||||
{!! Form::text('title', null, array('placeholder' => __('app.apps.title'), 'id' => 'appname', 'class' => 'form-control')) !!}
|
||||
</div>
|
||||
<div class="input">
|
||||
<label>{{ __('app.apps.apptype') }} *</label>
|
||||
{!! Form::select('class', App\Application::applist(), null, array('class' => 'form-control config-item', 'id' => 'apptype', 'data-config' => 'type')) !!}
|
||||
</div>
|
||||
|
||||
<div class="input">
|
||||
<label>{{ __('app.apps.colour') }} *</label>
|
||||
{!! Form::text('colour', null, array('placeholder' => __('app.apps.hex'), 'id' => 'appcolour', 'class' => 'form-control color-picker set-bg-elem')) !!}
|
||||
{!! Form::text('colour', $item->colour ?? '#161b1f', array('placeholder' => __('app.apps.hex'), 'id' => 'appcolour', 'class' => 'form-control color-picker set-bg-elem')) !!}
|
||||
</div>
|
||||
|
||||
<div class="input">
|
||||
<label>{{ strtoupper(__('app.url')) }}</label>
|
||||
{!! Form::text('url', null, array('placeholder' => __('app.url'), 'id' => 'appurl', 'class' => 'form-control')) !!}
|
||||
{!! Form::text('url', $item->url ?? null, array('placeholder' => __('app.url'), 'id' => 'appurl', 'class' => 'form-control')) !!}
|
||||
<small class="help">Don't forget http(s)://</small>
|
||||
</div>
|
||||
|
||||
<div class="input">
|
||||
@@ -65,16 +96,14 @@
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
<div class="newblock" style="display: block;">
|
||||
<h2>Preview</h2>
|
||||
</div>
|
||||
|
||||
|
||||
<div id="tile-preview" class="input">
|
||||
@include('items.preview')
|
||||
<header style="border-top: 1px solid #dbdce3; width: 100%;">
|
||||
<div class="section-title">{{ __('app.apps.description') }}</div>
|
||||
</header>
|
||||
<div class="create">
|
||||
<div class="textarea">
|
||||
<textarea name="appdescription" id="appdescription">{{ $item->appdescription ?? '' }}</textarea>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -84,7 +113,7 @@
|
||||
|
||||
<div id="sapconfig" style="display: block;">
|
||||
@if(isset($item))
|
||||
@include('SupportedApps::'.$item->getconfig()->name.'.config')
|
||||
@include('SupportedApps::'.App\Item::nameFromClass($item->class).'.config')
|
||||
@endif
|
||||
</div>
|
||||
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
</div>
|
||||
<a class="link{{ title_color($item->colour) }}"{!! $item->link_target !!} href="{{ $item->link }}"><i class="fas {{ $item->link_icon }}"></i></a>
|
||||
</div>
|
||||
@if(isset($item->id))
|
||||
<a class="item-edit" href="{{ route($item->link_type.'.edit', [ $item->id ]) }}"><i class="fas fa-pencil"></i></a>
|
||||
|
||||
@endif
|
||||
</section>
|
||||
|
||||
@@ -19,13 +19,15 @@
|
||||
});
|
||||
})
|
||||
|
||||
var availableTags = @json(App\Application::all()->pluck('name'));
|
||||
|
||||
var availableTags = @json(App\Application::autocomplete());
|
||||
console.log(availableTags)
|
||||
$( "#appname" ).autocomplete({
|
||||
source: availableTags,
|
||||
select: function( event, ui ) {
|
||||
var appvalue = ui.item.value;
|
||||
appload(appvalue);
|
||||
event.preventDefault();
|
||||
// appload(ui.item.value);
|
||||
$( "#appname" ).val(ui.item.label)
|
||||
$('#apptype').val(ui.item.value).change()
|
||||
}
|
||||
});
|
||||
// initial load
|
||||
@@ -38,30 +40,147 @@
|
||||
$('#tile-preview .title').html($(this).val());
|
||||
})
|
||||
$('#apptype').on('change', function(e) {
|
||||
appload($(this).find('option:selected').text());
|
||||
appload($(this).find('option:selected').val());
|
||||
});
|
||||
$('#appcolour').on('change', function(e) {
|
||||
$('#tile-preview .item').css('backgroundColor', $(this).val());
|
||||
})
|
||||
|
||||
$('#websiteiconoptions').on('click', '.iconbutton', function (e) {
|
||||
const src = $('.selecticon', this).attr('src')
|
||||
$('#appimage').html("<img src='"+src+"' /><input type='hidden' name='icon' value='"+src+"' />");
|
||||
$('#tile-preview .app-icon').attr('src', src);
|
||||
|
||||
}).on('click', '.selectclose', function () {
|
||||
$('#websiteiconoptions').html('')
|
||||
})
|
||||
|
||||
$('.tags').select2();
|
||||
|
||||
if($('#appurl').val() !== '') {
|
||||
if ($('#appurl').val().indexOf("://") !== -1) {
|
||||
$('#appurl').parent().find('.help').hide()
|
||||
}
|
||||
}
|
||||
if($('#website').val() !== '') {
|
||||
if ($('#website').val().indexOf("://") !== -1) {
|
||||
$('#website').parent().find('.help').hide()
|
||||
}
|
||||
}
|
||||
$('#appurl, #website').on('input', function () {
|
||||
if ($(this).val().indexOf("://") !== -1) {
|
||||
$(this).parent().find('.help').hide()
|
||||
}
|
||||
})
|
||||
|
||||
|
||||
$('#searchwebsite').on('click', 'button.btn', function (e) {
|
||||
e.preventDefault()
|
||||
let websiteurl = $('#searchwebsite input').val()
|
||||
website = btoa(websiteurl)
|
||||
$.get(base + 'items/websitelookup/' + website, function (data) {
|
||||
const url = new URL(websiteurl)
|
||||
const websitedata = {}
|
||||
const parser = new DOMParser()
|
||||
const document = parser.parseFromString(data, 'text/html')
|
||||
|
||||
const links = document.getElementsByTagName('link')
|
||||
websitedata.title = document.getElementsByTagName('title')[0].innerText
|
||||
const metas = document.getElementsByTagName('meta')
|
||||
const icons = []
|
||||
|
||||
for (let i = 0; i < metas.length; i++) {
|
||||
if (metas[i].getAttribute('name') === 'description') {
|
||||
websitedata.description = metas[i].getAttribute('content')
|
||||
}
|
||||
}
|
||||
|
||||
for (let i = 0; i < links.length; i++) {
|
||||
const link = links[i]
|
||||
const rel = link.getAttribute('rel')
|
||||
if (rel) {
|
||||
if (rel.toLowerCase().indexOf('icon') > -1) {
|
||||
const href = link.getAttribute('href')
|
||||
// Make sure href is not null / undefined
|
||||
if (href) {
|
||||
if (href.toLowerCase().indexOf('https:') === -1 && href.toLowerCase().indexOf('http:') === -1 && href.indexOf('//') !== 0) {
|
||||
let finalBase = ''
|
||||
if (websiteurl.endsWith('/')) {
|
||||
const baseurl = websiteurl.split('/')
|
||||
baseurl.pop()
|
||||
finalBase = baseurl.join('/')
|
||||
} else {
|
||||
finalBase = websiteurl
|
||||
}
|
||||
|
||||
let absoluteHref = finalBase
|
||||
|
||||
if (href.indexOf('/') === 0) {
|
||||
absoluteHref += href
|
||||
} else {
|
||||
const path = url.pathname.split('/')
|
||||
path.pop()
|
||||
const finalPath = path.join('/')
|
||||
absoluteHref += finalPath + '/' + href
|
||||
}
|
||||
icons.push(encodeURI(absoluteHref))
|
||||
} else if (href.indexOf('//') === 0) {
|
||||
// Absolute url with no protocol
|
||||
const absoluteUrl = url.protocol + href
|
||||
icons.push(encodeURI(absoluteUrl))
|
||||
} else {
|
||||
// Absolute
|
||||
icons.push(encodeURI(href))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
websitedata.icons = icons
|
||||
|
||||
if ($('#appname').val() === '') $('#appname').val(websitedata.title)
|
||||
if ($('#appurl').val() === '') $('#appurl').val(websiteurl)
|
||||
$('input[name=pinned]').prop('checked', true);
|
||||
// $('#appimage').html("<img src='"+websitedata.icons[0]+"' /><input type='hidden' name='icon' value='"+websitedata.icons[0]+"' />");
|
||||
$('#tile-preview .app-icon').attr('src', $('#appimage img').attr('src'));
|
||||
$('#tile-preview .title').text($('#appname').val());
|
||||
$('#websiteiconoptions').html('<div class="header"><span>Select Icon</span><span class="selectclose">Close</span></div><div class="results"></div>')
|
||||
icons.forEach(icon => {
|
||||
$('#websiteiconoptions .results').append('<div class="iconbutton"><img class="selecticon" src="' + icon + '" /></div>')
|
||||
})
|
||||
console.log(websitedata)
|
||||
})
|
||||
console.log(website)
|
||||
})
|
||||
|
||||
$('.optdetails button.dark').on('click', function (e) {
|
||||
e.preventDefault()
|
||||
$(this).parent().next().toggleClass('active')
|
||||
})
|
||||
|
||||
function appload(appvalue) {
|
||||
if(appvalue == 'None') {
|
||||
if(appvalue == 'null') {
|
||||
$('#sapconfig').html('').hide();
|
||||
$('#tile-preview .app-icon').attr('src', '/img/heimdall-icon-small.png');
|
||||
$('#appimage').html("<img src='/img/heimdall-icon-small.png' />");
|
||||
$('#sapconfig').html('').hide();
|
||||
} else {
|
||||
$.post('{{ route('appload') }}', { app: appvalue }, function(data) {
|
||||
// Main details
|
||||
$('#appimage').html("<img src='"+data.iconview+"' /><input type='hidden' name='icon' value='"+data.icon+"' />");
|
||||
$('#appimage').html("<img src='"+data.iconview+"' /><input type='hidden' name='icon' value='"+data.iconview+"' />");
|
||||
$('input[name=colour]').val(data.colour);
|
||||
$('select[name=class]').val(data.class);
|
||||
$('select[name=appid]').val(data.appid);
|
||||
hueb.setColor( data.colour );
|
||||
$('input[name=pinned]').prop('checked', true);
|
||||
// Preview details
|
||||
$('#tile-preview .app-icon').attr('src', data.iconview);
|
||||
$('#tile-preview .title').html(data.name);
|
||||
if(data.config != null) {
|
||||
$.get(base+'/view/'+data.config, function(getdata) {
|
||||
$('#appdescription').val(data.description);
|
||||
if($('#appname').val() === '') {
|
||||
$('#appname').val(data.name)
|
||||
}
|
||||
$('#tile-preview .title').html($('#appname').val());
|
||||
if(data.custom != null) {
|
||||
$.get(base+'view/'+data.custom, function(getdata) {
|
||||
$('#sapconfig').html(getdata).show();
|
||||
});
|
||||
} else {
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<section class="module-container">
|
||||
<header>
|
||||
<div class="section-title">
|
||||
Showing Deleted Applications
|
||||
{{ __('app.apps.show_deleted') }}
|
||||
</div>
|
||||
<div class="module-actions">
|
||||
<a href="{{ route('items.index', []) }}" title="" class="button"><i class="fa fa-ban"></i><span>{{ __('app.buttons.cancel') }}</span></a>
|
||||
|
||||
@@ -20,19 +20,23 @@
|
||||
<link rel="icon" type="image/png" sizes="96x96" href="{{ asset('favicon-96x96.png') }}">
|
||||
<link rel="icon" type="image/png" sizes="16x16" href="{{ asset('favicon-16x16.png') }}">
|
||||
<link rel="mask-icon" href="{{ asset('img/heimdall-logo-small.svg') }}" color="black">
|
||||
<link rel="manifest" href="{{ asset('manifest.json') }}">
|
||||
<meta name="msapplication-TileColor" content="#ffffff">
|
||||
<meta name="msapplication-TileImage" content="{{ asset('ms-icon-144x144.png') }}">
|
||||
<meta name="theme-color" content="#ffffff">
|
||||
<meta name="mobile-web-app-capable" content="yes">
|
||||
<meta name="apple-mobile-web-app-capable" content="yes">
|
||||
<link rel="stylesheet" href="{{ asset('css/app.css?v=2') }}" type="text/css" />
|
||||
<link rel="stylesheet" href="{{ asset('css/all.min.css?v=2') }}" type="text/css" />
|
||||
<script src="{{ asset('js/fontawesome.js') }}"></script>
|
||||
@if(config('app.url') !== 'http://localhost')
|
||||
<base href="{{ config('app.url') }}">
|
||||
@else
|
||||
<base href="{{ url('') }}">
|
||||
@endif
|
||||
<style id="custom_css">
|
||||
/* editable using the 'Settings > Advanced > Custom CSS' option */
|
||||
{!! \App\Setting::fetch('custom_css') !!}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"{!! $alt_bg !!}>
|
||||
@@ -44,6 +48,7 @@
|
||||
@foreach($all_apps as $app)
|
||||
<?php
|
||||
$active = ((bool)$app->pinned === true) ? 'active' : '';
|
||||
if($app->title == 'app.dashboard') continue;
|
||||
?>
|
||||
<li>{{ $app->title }}<a class="{{ $active }}" data-tag="{{ $tag ?? 0 }}" data-id="{{ $app->id }}" href="{{ route('items.pintoggle', [$app->id]) }}"><i class="fas fa-thumbtack"></i></a></li>
|
||||
|
||||
@@ -108,10 +113,14 @@
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script src="{{ asset('js/jquery-3.3.1.min.js') }}"></script>
|
||||
<script src="{{ asset('js/jquery-3.6.0.min.js') }}"></script>
|
||||
<script src="{{ asset('js/jquery-ui.min.js') }}"></script>
|
||||
<script src="{{ asset('js/app.js?v=4') }}"></script>
|
||||
<script src="{{ asset('js/app.js?v=5') }}"></script>
|
||||
@yield('scripts')
|
||||
|
||||
<script id="custom_js">
|
||||
/* editable using the 'Settings > Advanced > Custom JavaScript' option */
|
||||
{!! \App\Setting::fetch('custom_js') !!}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -25,7 +25,11 @@
|
||||
<tr>
|
||||
<td>{{ __($setting->label) }}</td>
|
||||
<td>
|
||||
@if($setting->type === "textarea")
|
||||
<pre>{{ $setting->list_value }}</pre>
|
||||
@else
|
||||
{!! $setting->list_value !!}
|
||||
@endif
|
||||
</td>
|
||||
<td class="text-center">
|
||||
@if((bool)$setting->system !== true)
|
||||
@@ -49,4 +53,4 @@
|
||||
</section>
|
||||
@endforeach
|
||||
|
||||
@endsection
|
||||
@endsection
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
@foreach($apps as $app)
|
||||
<tr>
|
||||
<td>{{ $app->title }}</td>
|
||||
<td><a{{ $app->target }} href="/tag/{{ $app->url }}">{{ $app->link }}</a></td>
|
||||
<td><a{{ $app->target }} href="{{ url('tag/'.$app->link) }}">{{ $app->link }}</a></td>
|
||||
<td class="text-center"><a href="{!! route('tags.edit', [$app->id]) !!}" title="{{ __('app.settings.edit') }} {!! $app->title !!}"><i class="fas fa-edit"></i></a></td>
|
||||
<td class="text-center">
|
||||
{!! Form::open(['method' => 'DELETE','route' => ['tags.destroy', $app->id],'style'=>'display:inline']) !!}
|
||||
@@ -53,4 +53,4 @@
|
||||
</section>
|
||||
|
||||
|
||||
@endsection
|
||||
@endsection
|
||||
|
||||
@@ -23,6 +23,9 @@ Route::get('/autologin/{uuid}', 'Auth\LoginController@autologin')->name('user.au
|
||||
|
||||
Route::get('/', 'ItemController@dash')->name('dash');
|
||||
Route::get('check_app_list', 'ItemController@checkAppList')->name('applist');
|
||||
Route::get('single/{appid}', function($appid) {
|
||||
return json_encode(\App\Application::single($appid));
|
||||
})->name('single');
|
||||
|
||||
Route::resources([
|
||||
'items' => 'ItemController',
|
||||
@@ -35,7 +38,7 @@ Route::get('tag/{slug}', 'TagController@show')->name('tags.show');
|
||||
Route::get('tag/add/{tag}/{item}', 'TagController@add')->name('tags.add');
|
||||
Route::get('tag/restore/{id}', 'TagController@restore')->name('tags.restore');
|
||||
|
||||
|
||||
Route::get('items/websitelookup/{url}', 'ItemController@websitelookup')->name('items.lookup');
|
||||
Route::get('items/pin/{id}', 'ItemController@pin')->name('items.pin');
|
||||
Route::get('items/restore/{id}', 'ItemController@restore')->name('items.restore');
|
||||
Route::get('items/unpin/{id}', 'ItemController@unpin')->name('items.unpin');
|
||||
@@ -44,7 +47,7 @@ Route::post('order', 'ItemController@setOrder')->name('items.order');
|
||||
|
||||
Route::post('appload', 'ItemController@appload')->name('appload');
|
||||
Route::post('test_config', 'ItemController@testConfig')->name('test_config');
|
||||
Route::get('/get_stats/{id}', 'ItemController@getStats')->name('get_stats');
|
||||
Route::get('get_stats/{id}', 'ItemController@getStats')->name('get_stats');
|
||||
|
||||
Route::get('/search', 'SearchController@index')->name('search');
|
||||
|
||||
|
||||
37
storage/app/searchproviders.yaml
Normal file
37
storage/app/searchproviders.yaml
Normal file
@@ -0,0 +1,37 @@
|
||||
tiles:
|
||||
id: tiles
|
||||
name: Tiles
|
||||
target: _blank
|
||||
|
||||
google:
|
||||
id: google
|
||||
url: https://www.google.com/search
|
||||
name: Google
|
||||
method: get
|
||||
target: _blank
|
||||
query: q
|
||||
|
||||
bing:
|
||||
id: bing
|
||||
url: https://www.bing.com/search
|
||||
name: Bing
|
||||
method: get
|
||||
target: _blank
|
||||
query: q
|
||||
|
||||
ddg:
|
||||
id: ddg
|
||||
url: https://duckduckgo.com/
|
||||
name: DuckDuckGo
|
||||
method: get
|
||||
target: _blank
|
||||
query: q
|
||||
|
||||
startpage:
|
||||
id: startpage
|
||||
url: https://www.startpage.com/do/dsearch
|
||||
name: Startpage
|
||||
method: get
|
||||
target: _blank
|
||||
query: query
|
||||
|
||||
1
storage/app/supportedapps.json
Normal file
1
storage/app/supportedapps.json
Normal file
File diff suppressed because one or more lines are too long
117
vendor/bin/carbon
vendored
Normal file
117
vendor/bin/carbon
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Proxy PHP file generated by Composer
|
||||
*
|
||||
* This file includes the referenced bin path (../nesbot/carbon/bin/carbon)
|
||||
* using a stream wrapper to prevent the shebang from being output on PHP<8
|
||||
*
|
||||
* @generated
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
$GLOBALS['_composer_bin_dir'] = __DIR__;
|
||||
$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
|
||||
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
if (!class_exists('Composer\BinProxyWrapper')) {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class BinProxyWrapper
|
||||
{
|
||||
private $handle;
|
||||
private $position;
|
||||
private $realpath;
|
||||
|
||||
public function stream_open($path, $mode, $options, &$opened_path)
|
||||
{
|
||||
// get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
|
||||
$opened_path = substr($path, 17);
|
||||
$this->realpath = realpath($opened_path) ?: $opened_path;
|
||||
$opened_path = $this->realpath;
|
||||
$this->handle = fopen($this->realpath, $mode);
|
||||
$this->position = 0;
|
||||
|
||||
return (bool) $this->handle;
|
||||
}
|
||||
|
||||
public function stream_read($count)
|
||||
{
|
||||
$data = fread($this->handle, $count);
|
||||
|
||||
if ($this->position === 0) {
|
||||
$data = preg_replace('{^#!.*\r?\n}', '', $data);
|
||||
}
|
||||
|
||||
$this->position += strlen($data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function stream_cast($castAs)
|
||||
{
|
||||
return $this->handle;
|
||||
}
|
||||
|
||||
public function stream_close()
|
||||
{
|
||||
fclose($this->handle);
|
||||
}
|
||||
|
||||
public function stream_lock($operation)
|
||||
{
|
||||
return $operation ? flock($this->handle, $operation) : true;
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence)
|
||||
{
|
||||
if (0 === fseek($this->handle, $offset, $whence)) {
|
||||
$this->position = ftell($this->handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function stream_tell()
|
||||
{
|
||||
return $this->position;
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return feof($this->handle);
|
||||
}
|
||||
|
||||
public function stream_stat()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function stream_set_option($option, $arg1, $arg2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function url_stat($path, $flags)
|
||||
{
|
||||
$path = substr($path, 17);
|
||||
if (file_exists($path)) {
|
||||
return stat($path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
|
||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/nesbot/carbon/bin/carbon');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
include __DIR__ . '/..'.'/nesbot/carbon/bin/carbon';
|
||||
5
vendor/bin/carbon.bat
vendored
Normal file
5
vendor/bin/carbon.bat
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
@ECHO OFF
|
||||
setlocal DISABLEDELAYEDEXPANSION
|
||||
SET BIN_TARGET=%~dp0/carbon
|
||||
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
|
||||
php "%BIN_TARGET%" %*
|
||||
117
vendor/bin/commonmark
vendored
Normal file
117
vendor/bin/commonmark
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Proxy PHP file generated by Composer
|
||||
*
|
||||
* This file includes the referenced bin path (../league/commonmark/bin/commonmark)
|
||||
* using a stream wrapper to prevent the shebang from being output on PHP<8
|
||||
*
|
||||
* @generated
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
$GLOBALS['_composer_bin_dir'] = __DIR__;
|
||||
$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
|
||||
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
if (!class_exists('Composer\BinProxyWrapper')) {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class BinProxyWrapper
|
||||
{
|
||||
private $handle;
|
||||
private $position;
|
||||
private $realpath;
|
||||
|
||||
public function stream_open($path, $mode, $options, &$opened_path)
|
||||
{
|
||||
// get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
|
||||
$opened_path = substr($path, 17);
|
||||
$this->realpath = realpath($opened_path) ?: $opened_path;
|
||||
$opened_path = $this->realpath;
|
||||
$this->handle = fopen($this->realpath, $mode);
|
||||
$this->position = 0;
|
||||
|
||||
return (bool) $this->handle;
|
||||
}
|
||||
|
||||
public function stream_read($count)
|
||||
{
|
||||
$data = fread($this->handle, $count);
|
||||
|
||||
if ($this->position === 0) {
|
||||
$data = preg_replace('{^#!.*\r?\n}', '', $data);
|
||||
}
|
||||
|
||||
$this->position += strlen($data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function stream_cast($castAs)
|
||||
{
|
||||
return $this->handle;
|
||||
}
|
||||
|
||||
public function stream_close()
|
||||
{
|
||||
fclose($this->handle);
|
||||
}
|
||||
|
||||
public function stream_lock($operation)
|
||||
{
|
||||
return $operation ? flock($this->handle, $operation) : true;
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence)
|
||||
{
|
||||
if (0 === fseek($this->handle, $offset, $whence)) {
|
||||
$this->position = ftell($this->handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function stream_tell()
|
||||
{
|
||||
return $this->position;
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return feof($this->handle);
|
||||
}
|
||||
|
||||
public function stream_stat()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function stream_set_option($option, $arg1, $arg2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function url_stat($path, $flags)
|
||||
{
|
||||
$path = substr($path, 17);
|
||||
if (file_exists($path)) {
|
||||
return stat($path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
|
||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/league/commonmark/bin/commonmark');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
include __DIR__ . '/..'.'/league/commonmark/bin/commonmark';
|
||||
5
vendor/bin/commonmark.bat
vendored
Normal file
5
vendor/bin/commonmark.bat
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
@ECHO OFF
|
||||
setlocal DISABLEDELAYEDEXPANSION
|
||||
SET BIN_TARGET=%~dp0/commonmark
|
||||
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
|
||||
php "%BIN_TARGET%" %*
|
||||
117
vendor/bin/patch-type-declarations
vendored
Normal file
117
vendor/bin/patch-type-declarations
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Proxy PHP file generated by Composer
|
||||
*
|
||||
* This file includes the referenced bin path (../symfony/error-handler/Resources/bin/patch-type-declarations)
|
||||
* using a stream wrapper to prevent the shebang from being output on PHP<8
|
||||
*
|
||||
* @generated
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
$GLOBALS['_composer_bin_dir'] = __DIR__;
|
||||
$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
|
||||
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
if (!class_exists('Composer\BinProxyWrapper')) {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class BinProxyWrapper
|
||||
{
|
||||
private $handle;
|
||||
private $position;
|
||||
private $realpath;
|
||||
|
||||
public function stream_open($path, $mode, $options, &$opened_path)
|
||||
{
|
||||
// get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
|
||||
$opened_path = substr($path, 17);
|
||||
$this->realpath = realpath($opened_path) ?: $opened_path;
|
||||
$opened_path = $this->realpath;
|
||||
$this->handle = fopen($this->realpath, $mode);
|
||||
$this->position = 0;
|
||||
|
||||
return (bool) $this->handle;
|
||||
}
|
||||
|
||||
public function stream_read($count)
|
||||
{
|
||||
$data = fread($this->handle, $count);
|
||||
|
||||
if ($this->position === 0) {
|
||||
$data = preg_replace('{^#!.*\r?\n}', '', $data);
|
||||
}
|
||||
|
||||
$this->position += strlen($data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function stream_cast($castAs)
|
||||
{
|
||||
return $this->handle;
|
||||
}
|
||||
|
||||
public function stream_close()
|
||||
{
|
||||
fclose($this->handle);
|
||||
}
|
||||
|
||||
public function stream_lock($operation)
|
||||
{
|
||||
return $operation ? flock($this->handle, $operation) : true;
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence)
|
||||
{
|
||||
if (0 === fseek($this->handle, $offset, $whence)) {
|
||||
$this->position = ftell($this->handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function stream_tell()
|
||||
{
|
||||
return $this->position;
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return feof($this->handle);
|
||||
}
|
||||
|
||||
public function stream_stat()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function stream_set_option($option, $arg1, $arg2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function url_stat($path, $flags)
|
||||
{
|
||||
$path = substr($path, 17);
|
||||
if (file_exists($path)) {
|
||||
return stat($path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
|
||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/symfony/error-handler/Resources/bin/patch-type-declarations');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
include __DIR__ . '/..'.'/symfony/error-handler/Resources/bin/patch-type-declarations';
|
||||
5
vendor/bin/patch-type-declarations.bat
vendored
Normal file
5
vendor/bin/patch-type-declarations.bat
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
@ECHO OFF
|
||||
setlocal DISABLEDELAYEDEXPANSION
|
||||
SET BIN_TARGET=%~dp0/patch-type-declarations
|
||||
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
|
||||
php "%BIN_TARGET%" %*
|
||||
1
vendor/bin/php-parse
vendored
1
vendor/bin/php-parse
vendored
@@ -1 +0,0 @@
|
||||
../nikic/php-parser/bin/php-parse
|
||||
117
vendor/bin/php-parse
vendored
Executable file
117
vendor/bin/php-parse
vendored
Executable file
@@ -0,0 +1,117 @@
|
||||
#!/usr/bin/env php
|
||||
<?php
|
||||
|
||||
/**
|
||||
* Proxy PHP file generated by Composer
|
||||
*
|
||||
* This file includes the referenced bin path (../nikic/php-parser/bin/php-parse)
|
||||
* using a stream wrapper to prevent the shebang from being output on PHP<8
|
||||
*
|
||||
* @generated
|
||||
*/
|
||||
|
||||
namespace Composer;
|
||||
|
||||
$GLOBALS['_composer_bin_dir'] = __DIR__;
|
||||
$GLOBALS['_composer_autoload_path'] = __DIR__ . '/..'.'/autoload.php';
|
||||
|
||||
if (PHP_VERSION_ID < 80000) {
|
||||
if (!class_exists('Composer\BinProxyWrapper')) {
|
||||
/**
|
||||
* @internal
|
||||
*/
|
||||
final class BinProxyWrapper
|
||||
{
|
||||
private $handle;
|
||||
private $position;
|
||||
private $realpath;
|
||||
|
||||
public function stream_open($path, $mode, $options, &$opened_path)
|
||||
{
|
||||
// get rid of phpvfscomposer:// prefix for __FILE__ & __DIR__ resolution
|
||||
$opened_path = substr($path, 17);
|
||||
$this->realpath = realpath($opened_path) ?: $opened_path;
|
||||
$opened_path = $this->realpath;
|
||||
$this->handle = fopen($this->realpath, $mode);
|
||||
$this->position = 0;
|
||||
|
||||
return (bool) $this->handle;
|
||||
}
|
||||
|
||||
public function stream_read($count)
|
||||
{
|
||||
$data = fread($this->handle, $count);
|
||||
|
||||
if ($this->position === 0) {
|
||||
$data = preg_replace('{^#!.*\r?\n}', '', $data);
|
||||
}
|
||||
|
||||
$this->position += strlen($data);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
public function stream_cast($castAs)
|
||||
{
|
||||
return $this->handle;
|
||||
}
|
||||
|
||||
public function stream_close()
|
||||
{
|
||||
fclose($this->handle);
|
||||
}
|
||||
|
||||
public function stream_lock($operation)
|
||||
{
|
||||
return $operation ? flock($this->handle, $operation) : true;
|
||||
}
|
||||
|
||||
public function stream_seek($offset, $whence)
|
||||
{
|
||||
if (0 === fseek($this->handle, $offset, $whence)) {
|
||||
$this->position = ftell($this->handle);
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public function stream_tell()
|
||||
{
|
||||
return $this->position;
|
||||
}
|
||||
|
||||
public function stream_eof()
|
||||
{
|
||||
return feof($this->handle);
|
||||
}
|
||||
|
||||
public function stream_stat()
|
||||
{
|
||||
return array();
|
||||
}
|
||||
|
||||
public function stream_set_option($option, $arg1, $arg2)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public function url_stat($path, $flags)
|
||||
{
|
||||
$path = substr($path, 17);
|
||||
if (file_exists($path)) {
|
||||
return stat($path);
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (function_exists('stream_wrapper_register') && stream_wrapper_register('phpvfscomposer', 'Composer\BinProxyWrapper')) {
|
||||
include("phpvfscomposer://" . __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse');
|
||||
exit(0);
|
||||
}
|
||||
}
|
||||
|
||||
include __DIR__ . '/..'.'/nikic/php-parser/bin/php-parse';
|
||||
5
vendor/bin/php-parse.bat
vendored
Normal file
5
vendor/bin/php-parse.bat
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
@ECHO OFF
|
||||
setlocal DISABLEDELAYEDEXPANSION
|
||||
SET BIN_TARGET=%~dp0/php-parse
|
||||
SET COMPOSER_RUNTIME_BIN_DIR=%~dp0
|
||||
php "%BIN_TARGET%" %*
|
||||
1
vendor/bin/phpunit
vendored
1
vendor/bin/phpunit
vendored
@@ -1 +0,0 @@
|
||||
../phpunit/phpunit/phpunit
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user