Compare commits

...

62 Commits

Author SHA1 Message Date
KodeStar
3a043e0165 Update app.php 2022-03-25 15:02:35 +00:00
KodeStar
ac37c60e1f Merge pull request #800 from xiazeyu/baidu
added Baidu and sort order by alphabet
2022-03-25 15:01:22 +00:00
S4kura0ne
937e576520 move tiles to the first 2022-03-25 01:00:07 +08:00
KodeStar
9086e9bd75 Merge pull request #794 from xiazeyu/2.x
Latest Chinese translation combined #789 and #617
2022-03-24 13:21:07 +00:00
s4kura0ne
4c90d8c87e added Baidu and sort order by alphabet 2022-03-24 09:25:30 +08:00
s4kura0ne
a4cceb3ae0 remove Baidu in searchprovides.yaml 2022-03-24 09:20:46 +08:00
s4kura0ne
90c21d700d merged old 'zh' translation, improved translation 2022-03-24 00:33:36 +08:00
s4kura0ne
15b1f3234b added translation for baidu 2022-03-24 00:23:08 +08:00
s4kura0ne
a116345d60 remove unused translation 2022-03-24 00:21:47 +08:00
s4kura0ne
2b4e6d372c remove changes in outdated SettingsSeeder.php 2022-03-24 00:19:43 +08:00
s4kura0ne
d370f2c3ee finished chinese translation 2022-03-23 10:09:18 +08:00
S4kura0ne
ade09f3b1c Merge pull request #3 from xiazeyu/master
https://github.com/xiazeyu/Heimdall/pull/2
2022-03-23 09:31:58 +08:00
s4kura0ne
80aa120086 solved Russian readme conflict 2022-03-23 09:28:39 +08:00
S4kura0ne
a5cbcaca03 Merge pull request #1 from anerg2046/2.x
Merge Chinese translate from anerg2046
2022-03-23 09:24:33 +08:00
Kode
f2bfc26c5e Update app.php 2022-03-21 21:37:44 +00:00
Kode
9f0abb6f4d Strip out invalid characters from tile background 2022-03-21 21:37:14 +00:00
KodeStar
9ca2078e7d Add app version to asset url to bust cache 2022-03-21 06:42:59 +00:00
罗翀
9e4a06999b Chinese translate
add baidu search
2022-03-21 00:53:28 +08:00
KodeStar
8b72ff0a0d Merge pull request #787 from KodeStar/2.x
Laravel shift and update defaults
2022-03-19 15:07:11 +00:00
Kode
51ddaccc16 Update defaults 2022-03-19 15:04:26 +00:00
KodeStar
4ff1a4aec4 Merge pull request #1 from KodeStar/shift-58933
Upgrade Checker
2022-03-19 14:27:44 +00:00
KodeStar
d5bd614cc6 Update Application.php 2022-03-19 14:05:01 +00:00
Shift
0f498eca75 Remove explicit deleted_at date cast 2022-03-19 13:54:34 +00:00
Shift
3dac9828c8 Convert to new helper methods
Laravel 5 added several new helper functions, including:

- `view()`
- `response()`
- `redirect()`
- `config()`
- `abort()`

Review the [helpers][1] documentation for more details.

[1]: https://laravel.com/docs/5.0/helpers
2022-03-19 13:54:34 +00:00
Shift
297c2bb30f Shift bindings
PHP 5.5.9+ adds the new static `class` property which provides the fully qualified class name. This is preferred over using strings for class names since the `class` property references are checked by PHP.
2022-03-19 13:54:33 +00:00
Shift
b1dc4d4a41 Apply Laravel coding style
Shift automatically applies the Laravel coding style - which uses the PSR-2 coding style as a base with some minor additions.

You may customize the adopted coding style by adding a [PHP CS Fixer][1] or [PHP CodeSniffer][2] config to your project root. Feel free to use [Shift's Laravel ruleset][3] to help you get started.

For more information on customizing the code style applied by Shift, [watch this short video][4].

[1]: https://github.com/FriendsOfPHP/PHP-CS-Fixer
[2]: https://github.com/squizlabs/PHP_CodeSniffer
[3]: https://gist.github.com/laravel-shift/cab527923ed2a109dda047b97d53c200
[4]: https://laravelshift.com/videos/shift-code-style
2022-03-19 13:54:32 +00:00
KodeStar
0fe6565346 Update app.php 2022-03-19 07:06:02 +00:00
KodeStar
85c68c1f46 Merge pull request #783 from xavier-GitHub76/2.x
Update app.php (French translations Fix) + version app (2.4.4)
2022-03-18 16:40:10 +00:00
Kode
fc2191b8db Fix preview image 2022-03-18 16:36:05 +00:00
xavier-GitHub76
ee36a0cfae Update app.php
Update version app to 2.4.4
2022-03-18 14:32:15 +01:00
Kode
a868a6cac1 Fix for creating tags not setting home dashboard as default 2022-03-18 10:10:00 +00:00
xavier-GitHub76
574756b236 Update app.php
French translate fix
2022-03-17 22:43:05 +01:00
Kode
f9599079e5 Update app.php 2022-03-17 19:04:39 +00:00
Kode
10afffb71d Fix test button 2022-03-17 19:03:06 +00:00
KodeStar
79d53af339 Update app.php 2022-03-17 13:42:07 +00:00
KodeStar
8cc6a9cc63 Pull missing apps on update apps list 2022-03-17 13:41:50 +00:00
KodeStar
18001fbdd0 Get app regardless of if it's enhanced (might be a search provider) 2022-03-17 12:56:51 +00:00
KodeStar
398df75865 Merge branch '2.x' 2022-03-17 11:01:43 +00:00
KodeStar
41c2983312 Add warning about http being needed in url 2022-03-17 10:55:52 +00:00
KodeStar
bd3b882b3a Squashed commit of the following:
commit e52bc9c6b2
Author: KodeStar <kodestar@gmail.com>
Date:   Thu Mar 17 10:23:15 2022 +0000

    Update supportedapps.json

commit a16233ee10
Author: KodeStar <kodestar@gmail.com>
Date:   Thu Mar 17 10:21:24 2022 +0000

    Fix for displaying svg icons correctly
2022-03-17 10:24:31 +00:00
KodeStar
e52bc9c6b2 Update supportedapps.json 2022-03-17 10:23:15 +00:00
KodeStar
a16233ee10 Fix for displaying svg icons correctly 2022-03-17 10:21:24 +00:00
Kode
5b177f1127 Merge branch '2.3' into 2.x 2022-03-16 20:16:04 +00:00
Kode
f7633b6a5f Update mix-manifest.json 2022-03-16 20:15:22 +00:00
Kode
d58e6cb560 Fix for #774 2022-03-16 20:13:16 +00:00
Kode
87fe9c1771 Move setLocale out of vie composer so it's available everywhere
Fixes #776
2022-03-16 20:07:43 +00:00
Kode
95d9e9edb9 Update app.php 2022-03-16 19:43:03 +00:00
Kode
f7b2c51f9d Fix for old apps and icon selector 2022-03-16 19:41:01 +00:00
Kode
72c70e27f2 Remove refresh button for now as update code isn't ready yet 2022-03-16 18:39:47 +00:00
Kode
becbe5ab96 More work on apps 2022-03-16 18:35:40 +00:00
Kode
f5bce95808 Add missing lang string, fixed #773 2022-03-16 18:34:48 +00:00
KodeStar
1e2b807e05 Lots of work on apps 2022-03-16 15:49:44 +00:00
Kode
ed3dbf2f14 More work on enhanced apps 2022-03-15 20:09:22 +00:00
Kode
1e35f83fed Changes to the tooltips 2022-03-15 19:08:10 +00:00
KodeStar
8499d100ff More work on apps 2022-03-15 18:19:01 +00:00
KodeStar
bdeae6a722 Add missing files 2022-03-15 11:30:21 +00:00
Kode
4c63b66dbf Initial start of replacing apps list to use github generated list 2022-03-14 15:56:36 +00:00
Kode
371f52f92e Fixes #469 2022-03-14 12:25:20 +00:00
KodeStar
6daaf94974 Add details for search providers 2022-03-14 10:34:37 +00:00
Kode
b8e5a22648 Update app.php 2022-03-14 07:56:41 +00:00
Kode
e821edf01a Fix tags url
Fixes #763
2022-03-14 07:56:02 +00:00
Kode
188316df47 Fix search using incorrect value
fixes #764
2022-03-14 07:55:26 +00:00
126 changed files with 2403 additions and 1371 deletions

View File

@@ -13,14 +13,13 @@ class Application extends Model
//
public function icon()
{
if(!file_exists(storage_path('app/public/'.$this->icon))) {
if (! file_exists(storage_path('app/public/'.$this->icon))) {
$img_src = app_path('SupportedApps/'.$this->name.'/'.str_replace('icons/', '', $this->icon));
$img_dest = storage_path('app/public/'.$this->icon);
//die("i: ".$img_src);
@copy($img_src, $img_dest);
}
return $this->icon;
}
@@ -32,33 +31,103 @@ class Application extends Model
public function defaultColour()
{
// check if light or dark
if($this->tile_background == 'light') return '#fafbfc';
if ($this->tile_background == 'light') {
return '#fafbfc';
}
return '#161b1f';
}
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 = self::where('appid', $appid)->first();
$app = self::single($appid);
$application = ($localapp) ? $localapp : new self;
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);
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
$list['\App\SupportedApps\\'.$name.'\\'.$name] = $app->name;
$apps = self::apps();
foreach ($apps as $app) {
$list[$app->appid] = $app->name;
}
return $list;
}
}

View File

@@ -2,9 +2,9 @@
namespace App\Console\Commands;
use Illuminate\Console\Command;
use App\Application;
use App\SupportedApps;
use Illuminate\Console\Command;
class RegisterApp extends Command
{
@@ -40,40 +40,38 @@ class RegisterApp extends Command
public function handle()
{
$folder = $this->argument('folder');
if($folder == 'all') {
if ($folder == 'all') {
$apps = scandir(app_path('SupportedApps'));
foreach($apps as $folder) {
if($folder == '.' || $folder == '..') continue;
foreach ($apps as $folder) {
if ($folder == '.' || $folder == '..') {
continue;
}
$this->addApp($folder);
}
} else {
$this->addApp($folder);
}
}
public function addApp($folder)
{
$json = app_path('SupportedApps/'.$folder.'/app.json');
if(file_exists($json)) {
if (file_exists($json)) {
$app = json_decode(file_get_contents($json));
if(isset($app->appid)) {
if (isset($app->appid)) {
$exists = Application::find($app->appid);
if($exists) {
$this->error('Application already registered - '.$exists->name." - ".$exists->appid);
if ($exists) {
$this->error('Application already registered - '.$exists->name.' - '.$exists->appid);
} else {
// Doesn't exist so add it
SupportedApps::saveApp($app, new Application);
$this->info("Application Added - ".$app->name." - ".$app->appid);
$this->info('Application Added - '.$app->name.' - '.$app->appid);
}
} else {
$this->error('No App ID for - '.$folder);
}
} else {
$this->error('Could not find '.$json);
}
}
}

View File

@@ -1,12 +1,15 @@
<?php namespace App;
<?php
namespace App;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
interface EnhancedApps
{
public function test();
public function livestats();
public function url($endpoint);
}
public function livestats();
public function url($endpoint);
}

View File

@@ -4,13 +4,18 @@ use Illuminate\Support\Str;
function format_bytes($bytes, $is_drive_size = true, $beforeunit = '', $afterunit = '')
{
$btype = ($is_drive_size === true) ? 1000 : 1024;
$labels = array('B','KB','MB','GB','TB');
for($x = 0; $bytes >= $btype && $x < (count($labels) - 1); $bytes /= $btype, $x++); // use 1000 rather than 1024 to simulate HD size not real size
if($labels[$x] == "TB") return(round($bytes, 3).$beforeunit.$labels[$x].$afterunit);
elseif($labels[$x] == "GB") return(round($bytes, 2).$beforeunit.$labels[$x].$afterunit);
elseif($labels[$x] == "MB") return(round($bytes, 2).$beforeunit.$labels[$x].$afterunit);
else return(round($bytes, 0).$beforeunit.$labels[$x].$afterunit);
$btype = ($is_drive_size === true) ? 1000 : 1024;
$labels = ['B', 'KB', 'MB', 'GB', 'TB'];
for ($x = 0; $bytes >= $btype && $x < (count($labels) - 1); $bytes /= $btype, $x++); // use 1000 rather than 1024 to simulate HD size not real size
if ($labels[$x] == 'TB') {
return round($bytes, 3).$beforeunit.$labels[$x].$afterunit;
} elseif ($labels[$x] == 'GB') {
return round($bytes, 2).$beforeunit.$labels[$x].$afterunit;
} elseif ($labels[$x] == 'MB') {
return round($bytes, 2).$beforeunit.$labels[$x].$afterunit;
} else {
return round($bytes, 0).$beforeunit.$labels[$x].$afterunit;
}
}
function str_slug($title, $separator = '-', $language = 'en')
@@ -34,24 +39,26 @@ if (! function_exists('str_is')) {
}
}
function get_brightness($hex) {
function get_brightness($hex)
{
// returns brightness value from 0 to 255
// strip off any leading #
$hex = str_replace('#', '', $hex);
if(strlen($hex) == 3) {
// $hex = str_replace('#', '', $hex);
$hex = preg_replace("/[^0-9A-Fa-f]/", '', $hex);
if (strlen($hex) == 3) {
$hex = $hex[0].$hex[0].$hex[1].$hex[1].$hex[2].$hex[2];
}
$c_r = hexdec(substr($hex, 0, 2));
$c_g = hexdec(substr($hex, 2, 2));
$c_b = hexdec(substr($hex, 4, 2));
return (($c_r * 299) + ($c_g * 587) + ($c_b * 114)) / 1000;
}
function title_color($hex)
{
if(get_brightness($hex) > 130) {
if (get_brightness($hex) > 130) {
return ' black';
} else {
return ' white';
@@ -62,18 +69,16 @@ function getLinkTargetAttribute()
{
$target = \App\Setting::fetch('window_target');
if($target === 'current') {
if ($target === 'current') {
return '';
} else {
return ' target="' . $target . '"';
return ' target="'.$target.'"';
}
}
function className($name)
{
$name = preg_replace('/\PL/u', '', $name);
$name = preg_replace('/[^\p{L}\p{N}]/u', '', $name);
return $name;
}

View File

@@ -3,8 +3,8 @@
namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use App\User;
use Illuminate\Foundation\Auth\AuthenticatesUsers;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Session;
@@ -92,6 +92,7 @@ class LoginController extends Controller
{
Auth::logout();
session(['current_user' => $user]);
return redirect()->route('dash');
}
@@ -100,6 +101,7 @@ class LoginController extends Controller
$user = User::where('autologin', $uuid)->first();
Auth::login($user, true);
session(['current_user' => $user]);
return redirect()->route('dash');
}
@@ -122,5 +124,4 @@ class LoginController extends Controller
{
return Session::get('url.intended') ? Session::get('url.intended') : $this->redirectTo;
}
}

View File

@@ -2,10 +2,10 @@
namespace App\Http\Controllers\Auth;
use App\User;
use App\Http\Controllers\Controller;
use Illuminate\Support\Facades\Validator;
use App\User;
use Illuminate\Foundation\Auth\RegistersUsers;
use Illuminate\Support\Facades\Validator;
class RegisterController extends Controller
{

View File

@@ -2,12 +2,12 @@
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Support\Facades\Auth;
use App\User;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Support\Facades\Auth;
class Controller extends BaseController
{
@@ -22,7 +22,6 @@ class Controller extends BaseController
//print_r($this->user);
return $next($request);
});
}
public function user()

View File

@@ -2,18 +2,21 @@
namespace App\Http\Controllers;
use Artisan;
use App\Application;
use App\Item;
use App\Setting;
use App\User;
use GrahamCampbell\GitHub\Facades\GitHub;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Storage;
use App\SupportedApps;
use App\Jobs\ProcessApps;
use App\Search;
use App\Setting;
use App\SupportedApps;
use App\User;
use Artisan;
use GrahamCampbell\GitHub\Facades\GitHub;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Route;
use Illuminate\Support\Facades\Storage;
class ItemController extends Controller
{
@@ -21,7 +24,8 @@ class ItemController extends Controller
{
$this->middleware('allowed');
}
/**
/**
* Display a listing of the resource on the dashboard.
*
* @return \Illuminate\Http\Response
@@ -41,7 +45,7 @@ class ItemController extends Controller
return view('welcome', $data);
}
/**
/**
* Set order on the dashboard.
*
* @return \Illuminate\Http\Response
@@ -49,7 +53,7 @@ class ItemController extends Controller
public function setOrder(Request $request)
{
$order = array_filter($request->input('order'));
foreach($order as $o => $id) {
foreach ($order as $o => $id) {
$item = Item::find($id);
$item->order = $o;
$item->save();
@@ -67,10 +71,11 @@ class ItemController extends Controller
$item->pinned = true;
$item->save();
$route = route('dash', []);
return redirect($route);
}
/**
/**
* Unpin item on the dashboard.
*
* @return \Illuminate\Http\Response
@@ -81,36 +86,38 @@ class ItemController extends Controller
$item->pinned = false;
$item->save();
$route = route('dash', []);
return redirect($route);
}
/**
/**
* Unpin item on the dashboard.
*
* @return \Illuminate\Http\Response
*/
public function pinToggle($id, $ajax=false, $tag=false)
public function pinToggle($id, $ajax = false, $tag = false)
{
$item = Item::findOrFail($id);
$new = ((bool)$item->pinned === true) ? false : true;
$new = ((bool) $item->pinned === true) ? false : true;
$item->pinned = $new;
$item->save();
if($ajax) {
if(is_numeric($tag) && $tag > 0) {
if ($ajax) {
if (is_numeric($tag) && $tag > 0) {
$item = Item::whereId($tag)->first();
$data['apps'] = $item->children()->pinned()->orderBy('order', 'asc')->get();
} else {
$data['apps'] = Item::pinned()->orderBy('order', 'asc')->get();
}
$data['ajax'] = true;
return view('sortable', $data);
} else {
$route = route('dash', []);
return redirect($route);
}
}
/**
* Display a listing of the resource.
*
@@ -118,18 +125,17 @@ class ItemController extends Controller
*/
public function index(Request $request)
{
$trash = (bool)$request->input('trash');
$trash = (bool) $request->input('trash');
$data['apps'] = Item::ofType('item')->orderBy('title', 'asc')->get();
$data['trash'] = Item::ofType('item')->onlyTrashed()->get();
if($trash) {
if ($trash) {
return view('items.trash', $data);
} else {
return view('items.list', $data);
}
}
/**
* Show the form for creating a new resource.
*
@@ -140,9 +146,93 @@ 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')]);
return view('items.create', $data);
$data['current_tags'] = '0';
return view('items.create', $data);
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
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',
]);
if ($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$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'));
$current_user = User::currentUser();
$request->merge([
'description' => $config,
'user_id' => $current_user->id,
]);
if ($request->input('appid') === 'null') {
$request->merge([
'class' => null,
]);
} else {
$request->merge([
'class' => Application::classFromName($application->name),
]);
}
if ($id === null) {
$item = Item::create($request->all());
} else {
$item = Item::find($id);
$item->update($request->all());
}
$item->parents()->sync($request->tags);
}
/**
@@ -153,42 +243,10 @@ class ItemController extends Controller
*/
public function store(Request $request)
{
//
$validatedData = $request->validate([
'title' => 'required|max:255',
'url' => 'required',
]);
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,
]);
}
//die(print_r($request->input('config')));
$item = Item::create($request->all());
//Search::storeSearchProvider($request->input('class'), $item);
$item->parents()->sync($request->tags);
$this->storelogic($request);
$route = route('dash', []);
return redirect($route)
->with('success', __('app.alert.success.item_created'));
}
@@ -204,25 +262,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,42 +271,11 @@ 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'));
->with('success', __('app.alert.success.item_updated'));
}
/**
@@ -279,8 +287,8 @@ class ItemController extends Controller
public function destroy(Request $request, $id)
{
//
$force = (bool)$request->input('force');
if($force) {
$force = (bool) $request->input('force');
if ($force) {
Item::withTrashed()
->where('id', $id)
->forceDelete();
@@ -289,8 +297,9 @@ class ItemController extends Controller
}
$route = route('items.index', []);
return redirect($route)
->with('success',__('app.alert.success.item_deleted'));
return redirect($route)
->with('success', __('app.alert.success.item_deleted'));
}
/**
@@ -304,11 +313,12 @@ class ItemController extends Controller
//
Item::withTrashed()
->where('id', $id)
->restore();
->restore();
$route = route('items.index', []);
return redirect($route)
->with('success',__('app.alert.success.item_restored'));
->with('success', __('app.alert.success.item_restored'));
}
/**
@@ -319,7 +329,12 @@ 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 +353,25 @@ 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 ((bool) $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,39 +379,68 @@ 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->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);
$config = $item->getconfig();
if(isset($item->class)) {
if (isset($item->class)) {
$application = new $item->class;
$application->config = $config;
echo $application->livestats();
}
}
public function checkAppList()
{
ProcessApps::dispatch();
$route = route('items.index');
return redirect($route)
->with('success', __('app.alert.success.updating'));
}
}

View File

@@ -2,9 +2,9 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Search;
use Illuminate\Http\Request;
class SearchController extends Controller
{
@@ -15,9 +15,9 @@ class SearchController extends Controller
$provider = Search::providerDetails($requestprovider);
if($provider->type == 'standard') {
return redirect($provider->url.'?'.$provider->var.'='.urlencode($query));
} elseif($provider->type == 'external') {
if ($provider->type == 'standard') {
return redirect($provider->url.'?'.$provider->query.'='.urlencode($query));
} elseif ($provider->type == 'external') {
$class = new $provider->class;
//print_r($provider);
return $class->getResults($query, $provider);

View File

@@ -2,12 +2,12 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\Setting;
use App\SettingGroup;
use App\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use App\Http\Controllers\Controller;
class SettingsController extends Controller
{
@@ -40,15 +40,18 @@ class SettingsController extends Controller
$setting = Setting::find($id);
//die("s: ".$setting->label);
if((bool)$setting->system === true) return abort(404);
if ((bool) $setting->system === true) {
return abort(404);
}
if (!is_null($setting)) {
if (! is_null($setting)) {
return view('settings.edit')->with([
'setting' => $setting,
]);
} else {
$route = route('settings.list', []);
return redirect($route)
return redirect($route)
->with([
'error' => __('app.alert.error.not_exist'),
]);
@@ -65,39 +68,39 @@ class SettingsController extends Controller
$setting = Setting::find($id);
$user = $this->user();
if (!is_null($setting)) {
if (! is_null($setting)) {
$data = Setting::getInput($request);
$setting_value = null;
if ($setting->type == 'image') {
if($request->hasFile('value')) {
if ($request->hasFile('value')) {
$path = $request->file('value')->store('backgrounds');
$setting_value = $path;
}
} else {
$setting_value = $data->value;
}
$user->settings()->detach($setting->id);
$user->settings()->save($setting, ['uservalue' => $setting_value]);
$route = route('settings.index', []);
return redirect($route)
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'),
]);
} else {
$route = route('settings.index', []);
return redirect($route)
return redirect($route)
->with([
'error' => __('app.alert.error.not_exist'),
]);
}
}
/**
* @param int $id
*
@@ -107,21 +110,19 @@ class SettingsController extends Controller
{
$user = $this->user();
$setting = Setting::find($id);
if((bool)$setting->system !== true) {
if ((bool) $setting->system !== true) {
$user->settings()->detach($setting->id);
$user->settings()->save($setting, ['uservalue' => '']);
}
$route = route('settings.index', []);
return redirect($route)
return redirect($route)
->with([
'success' => __('app.alert.success.setting_updated'),
]);
}
public function search(Request $request)
{
}
}

View File

@@ -2,10 +2,10 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Item;
use App\User;
use DB;
use Illuminate\Http\Request;
class TagController extends Controller
{
@@ -13,6 +13,7 @@ class TagController extends Controller
{
$this->middleware('allowed');
}
/**
* Display a listing of the resource.
*
@@ -20,11 +21,11 @@ class TagController extends Controller
*/
public function index(Request $request)
{
$trash = (bool)$request->input('trash');
$trash = (bool) $request->input('trash');
$data['apps'] = Item::ofType('tag')->where('id', '>', 0)->orderBy('title', 'asc')->get();
$data['trash'] = Item::ofType('tag')->where('id', '>', 0)->onlyTrashed()->get();
if($trash) {
if ($trash) {
return view('tags.trash', $data);
} else {
return view('tags.list', $data);
@@ -39,6 +40,7 @@ class TagController extends Controller
public function create()
{
$data = [];
return view('tags.create', $data);
}
@@ -54,10 +56,10 @@ class TagController extends Controller
'title' => 'required|max:255',
]);
if($request->hasFile('file')) {
if ($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
'icon' => $path,
]);
}
@@ -69,12 +71,13 @@ class TagController extends Controller
$request->merge([
'type' => '1',
'url' => $slug,
'user_id' => $current_user->id
'user_id' => $current_user->id,
]);
//die(print_r($request->all()));
Item::create($request->all());
$route = route('dash', []);
return redirect($route)
->with('success', __('app.alert.success.tag_created'));
}
@@ -92,6 +95,7 @@ class TagController extends Controller
$data['apps'] = $item->children()->pinned()->orderBy('order', 'asc')->get();
$data['tag'] = $item->id;
$data['all_apps'] = $item->children;
return view('welcome', $data);
}
@@ -108,7 +112,7 @@ class TagController extends Controller
// show the edit form and pass the nerd
return view('tags.edit')
->with('item', $item);
->with('item', $item);
}
/**
@@ -124,24 +128,25 @@ class TagController extends Controller
'title' => 'required|max:255',
]);
if($request->hasFile('file')) {
if ($request->hasFile('file')) {
$path = $request->file('file')->store('icons');
$request->merge([
'icon' => $path
'icon' => $path,
]);
}
$slug = str_slug($request->title, '-');
// set item type to tag
$request->merge([
'url' => $slug
'url' => $slug,
]);
Item::find($id)->update($request->all());
$route = route('dash', []);
return redirect($route)
->with('success',__('app.alert.success.tag_updated'));
->with('success', __('app.alert.success.tag_updated'));
}
/**
@@ -153,18 +158,19 @@ class TagController extends Controller
public function destroy(Request $request, $id)
{
//
$force = (bool)$request->input('force');
if($force) {
$force = (bool) $request->input('force');
if ($force) {
Item::withTrashed()
->where('id', $id)
->forceDelete();
} else {
Item::find($id)->delete();
}
$route = route('tags.index', []);
return redirect($route)
->with('success',__('app.alert.success.item_deleted'));
->with('success', __('app.alert.success.item_deleted'));
}
/**
@@ -178,10 +184,11 @@ class TagController extends Controller
//
Item::withTrashed()
->where('id', $id)
->restore();
->restore();
$route = route('tags.index', []);
return redirect($route)
->with('success',__('app.alert.success.item_restored'));
->with('success', __('app.alert.success.item_restored'));
}
public function add($tag, $item)
@@ -189,14 +196,15 @@ class TagController extends Controller
$output = 0;
$tag = Item::find($tag);
$item = Item::find($item);
if($tag && $item) {
if ($tag && $item) {
// only add items, not cats
if((int)$item->type === 0) {
if ((int) $item->type === 0) {
$tag->children()->attach($item);
return 1;
}
}
return $output;
}
}

View File

@@ -2,11 +2,11 @@
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use App\User;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Str;
class UserController extends Controller
{
@@ -14,6 +14,7 @@ class UserController extends Controller
{
$this->middleware('allowed')->except(['selectUser']);
}
/**
* Display a listing of the resource.
*
@@ -22,6 +23,7 @@ class UserController extends Controller
public function index()
{
$data['users'] = User::all();
return view('users.index', $data);
}
@@ -33,6 +35,7 @@ class UserController extends Controller
public function create()
{
$data = [];
return view('users.create', $data);
}
@@ -40,8 +43,8 @@ class UserController extends Controller
{
Auth::logout();
$data['users'] = User::all();
return view('userselect', $data);
return view('userselect', $data);
}
/**
@@ -56,7 +59,7 @@ class UserController extends Controller
'username' => 'required|max:255|unique:users',
'email' => 'required|email',
'password' => 'nullable|confirmed',
'password_confirmation' => 'nullable'
'password_confirmation' => 'nullable',
]);
$user = new User;
@@ -65,24 +68,25 @@ class UserController extends Controller
$user->public_front = $request->input('public_front');
$password = $request->input('password');
if(!empty($password)) {
if (! empty($password)) {
$user->password = bcrypt($password);
}
if($request->hasFile('file')) {
if ($request->hasFile('file')) {
$path = $request->file('file')->store('avatars');
$user->avatar = $path;
}
if ((bool)$request->input('autologin_allow') === true) {
$user->autologin = (string)Str::uuid();
if ((bool) $request->input('autologin_allow') === true) {
$user->autologin = (string) Str::uuid();
}
$user->save();
$route = route('dash', []);
return redirect($route)
->with('success',__('app.alert.success.user_updated'));
->with('success', __('app.alert.success.user_updated'));
}
/**
@@ -105,8 +109,8 @@ class UserController extends Controller
public function edit(User $user)
{
$data['user'] = $user;
return view('users.edit', $data);
return view('users.edit', $data);
}
/**
@@ -122,28 +126,28 @@ class UserController extends Controller
'username' => 'required|max:255|unique:users,username,'.$user->id,
'email' => 'required|email',
'password' => 'nullable|confirmed',
'password_confirmation' => 'nullable'
'password_confirmation' => 'nullable',
]);
//die(print_r($request->all()));
//die(print_r($request->all()));
$user->username = $request->input('username');
$user->email = $request->input('email');
$user->public_front = $request->input('public_front');
$password = $request->input('password');
if(!empty($password)) {
if (! empty($password)) {
$user->password = bcrypt($password);
} elseif($password == 'null') {
} elseif ($password == 'null') {
$user->password = null;
}
if($request->hasFile('file')) {
if ($request->hasFile('file')) {
$path = $request->file('file')->store('avatars');
$user->avatar = $path;
}
if ((bool)$request->input('autologin_allow') === true) {
$user->autologin = (is_null($user->autologin)) ? (string)Str::uuid() : $user->autologin;
if ((bool) $request->input('autologin_allow') === true) {
$user->autologin = (is_null($user->autologin)) ? (string) Str::uuid() : $user->autologin;
} else {
$user->autologin = null;
}
@@ -151,9 +155,9 @@ class UserController extends Controller
$user->save();
$route = route('dash', []);
return redirect($route)
->with('success',__('app.alert.success.user_updated'));
return redirect($route)
->with('success', __('app.alert.success.user_updated'));
}
/**
@@ -164,12 +168,12 @@ class UserController extends Controller
*/
public function destroy(User $user)
{
if($user->id !== 1) {
if ($user->id !== 1) {
$user->delete();
$route = route('dash', []);
return redirect($route)
->with('success',__('app.alert.success.user_deleted'));
return redirect($route)
->with('success', __('app.alert.success.user_deleted'));
}
}
}

View File

@@ -2,9 +2,9 @@
namespace App\Http\Middleware;
use App\User;
use Closure;
use Illuminate\Support\Facades\Auth;
use App\User;
use Illuminate\Support\Facades\Route;
use Session;
@@ -22,27 +22,32 @@ class CheckAllowed
$route = Route::currentRouteName();
$current_user = User::currentUser();
if(str_is('users*', $route)) {
if($current_user->id !== 1) {
if (str_is('users*', $route)) {
if ($current_user->id !== 1) {
return redirect()->route('dash');
}
}
if($route == 'dash') {
if ($route == 'dash') {
//print_r(User::all());
//die("here".var_dump($current_user->password));
if((bool)$current_user->public_front === true) return $next($request);
if ((bool) $current_user->public_front === true) {
return $next($request);
}
}
if(empty($current_user->password)) return $next($request);
if (empty($current_user->password)) {
return $next($request);
}
// Check if user is logged in as $current_user
if (Auth::check()) {
$loggedin_user = Auth::user();
if($loggedin_user->id === $current_user->id) return $next($request);
if ($loggedin_user->id === $current_user->id) {
return $next($request);
}
}
return Auth::authenticate();
}
}

View File

@@ -2,8 +2,8 @@
namespace App\Http\Middleware;
use Illuminate\Http\Request;
use Fideloper\Proxy\TrustProxies as Middleware;
use Illuminate\Http\Request;
class TrustProxies extends Middleware
{
@@ -12,7 +12,7 @@ class TrustProxies extends Middleware
*
* @var array
*/
protected $proxies = ['192.168.0.0/16', '172.16.0.0/12','10.0.0.0/8', '127.0.0.1'];
protected $proxies = ['192.168.0.0/16', '172.16.0.0/12', '10.0.0.0/8', '127.0.0.1'];
/**
* The current proxy header mappings.

View File

@@ -54,5 +54,4 @@ class VerifyCsrfToken extends Middleware
{
return EncryptCookies::serialized('HEIMDALL-XSRF-TOKEN');
}
}

View File

@@ -2,13 +2,13 @@
namespace App;
use Illuminate\Database\Eloquent\Model;
use Symfony\Component\ClassLoader\ClassMapGenerator;
use Illuminate\Database\Eloquent\SoftDeletes;
use Illuminate\Database\Eloquent\Builder;
use App\User;
use App\ItemTag;
use App\Application;
use App\ItemTag;
use App\User;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\SoftDeletes;
use Symfony\Component\ClassLoader\ClassMapGenerator;
class Item extends Model
{
@@ -20,7 +20,7 @@ class Item extends Model
static::addGlobalScope('user_id', function (Builder $builder) {
$current_user = User::currentUser();
if($current_user) {
if ($current_user) {
$builder->where('user_id', $current_user->id)->orWhere('user_id', 0);
} else {
$builder->where('user_id', 0);
@@ -30,15 +30,10 @@ 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',
];
/**
* The attributes that should be mutated to dates.
*
* @var array
*/
protected $dates = ['deleted_at'];
/**
* Scope a query to only include pinned items.
@@ -53,47 +48,49 @@ class Item extends Model
public static function checkConfig($config)
{
if(empty($config)) {
// die(print_r($config));
if (empty($config)) {
$config = null;
} else {
$config = json_encode($config);
}
return $config;
}
public function tags()
{
$id = $this->id;
$tags = ItemTag::select('tag_id')->where('item_id', $id)->pluck('tag_id')->toArray();
$tagdetails = Item::select('id', 'title', 'url', 'pinned')->whereIn('id', $tags)->get();
$tagdetails = self::select('id', 'title', 'url', 'pinned')->whereIn('id', $tags)->get();
//print_r($tags);
if(in_array(0, $tags)) {
$details = new Item([
"id" => 0,
"title" => __('app.dashboard'),
"url" => '',
"pinned" => 0
if (in_array(0, $tags)) {
$details = new self([
'id' => 0,
'title' => __('app.dashboard'),
'url' => '',
'pinned' => 0,
]);
$tagdetails->prepend($details);
}
return $tagdetails;
}
public function parents()
{
return $this->belongsToMany('App\Item', 'item_tag', 'item_id', 'tag_id');
return $this->belongsToMany(\App\Item::class, 'item_tag', 'item_id', 'tag_id');
}
public function children()
{
return $this->belongsToMany('App\Item', 'item_tag', 'tag_id', 'item_id');
return $this->belongsToMany(\App\Item::class, 'item_tag', 'tag_id', 'item_id');
}
public function getLinkAttribute()
{
if((int)$this->type === 1) {
return env('APP_URL').'/tag/'.$this->url;
if ((int) $this->type === 1) {
return url('tag/'.$this->url);
} else {
return $this->url;
}
@@ -101,7 +98,7 @@ class Item extends Model
public function getDroppableAttribute()
{
if((int)$this->type === 1) {
if ((int) $this->type === 1) {
return ' droppable';
} else {
return '';
@@ -112,24 +109,25 @@ class Item extends Model
{
$target = Setting::fetch('window_target');
if((int)$this->type === 1 || $target === 'current') {
if ((int) $this->type === 1 || $target === 'current') {
return '';
} else {
return ' target="' . $target . '"';
return ' target="'.$target.'"';
}
}
public function getLinkIconAttribute()
{
if((int)$this->type === 1) {
if ((int) $this->type === 1) {
return 'fa-tag';
} else {
return 'fa-arrow-alt-to-right';
}
}
public function getLinkTypeAttribute()
{
if((int)$this->type === 1) {
if ((int) $this->type === 1) {
return 'tags';
} else {
return 'items';
@@ -140,13 +138,13 @@ class Item extends Model
{
$explode = explode('\\', $class);
$name = end($explode);
return $name;
}
public function scopeOfType($query, $type)
{
switch($type) {
switch ($type) {
case 'item':
$typeid = 0;
break;
@@ -160,87 +158,92 @@ 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)
{
if($class === null || $class === 'null') return false;
if ($class === null || $class === 'null') {
return false;
}
$app = new $class;
return (bool)($app instanceof \App\EnhancedApps);
return (bool) ($app instanceof \App\EnhancedApps);
}
public static function isSearchProvider($class)
{
$app = new $class;
return ((bool)($app instanceof \App\SearchInterface)) ? $app : false;
return ((bool) ($app instanceof \App\SearchInterface)) ? $app : false;
}
public function enabled()
{
if($this->enhanced()) {
if ($this->enhanced()) {
$config = $this->getconfig();
if($config) {
if ($config) {
return (bool) $config->enabled;
}
}
return false;
}
public function getconfig()
{
$explode = explode('\\', $this->class);
// $explode = explode('\\', $this->class);
if(!isset($this->description) || empty($this->description)) {
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;
}
$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)) {
if (isset($config->override_url) && ! empty($config->override_url)) {
$config->url = $config->override_url;
} else {
$config->override_url = null;
}
return $config;
}
public static function applicationDetails($class)
{
if(!empty($class)) {
if (! empty($class)) {
$name = self::nameFromClass($class);
$application = Application::where('name', $name)->first();
if($application) return $application;
if ($application) {
return $application;
}
}
return false;
}
public static function getApplicationDescription($class)
{
$details = self::applicationDetails($class);
if($details !== false) {
if ($details !== false) {
return $details->description.' - '.$details->license;
}
return '';
}
@@ -249,8 +252,6 @@ class Item extends Model
*/
public function user()
{
return $this->belongsTo('App\User');
}
return $this->belongsTo(\App\User::class);
}
}

View File

@@ -6,5 +6,4 @@ use Illuminate\Database\Eloquent\Relations\Pivot;
class ItemTag extends Pivot
{
}
}

View File

@@ -2,13 +2,15 @@
namespace App\Jobs;
use App\Application;
use App\Item;
use App\SupportedApps;
use Illuminate\Bus\Queueable;
use Illuminate\Queue\SerializesModels;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use App\Application;
use App\SupportedApps;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;
use Illuminate\Support\Facades\Storage;
class ProcessApps implements ShouldQueue
{
@@ -31,36 +33,22 @@ 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
}
}

View File

@@ -2,13 +2,13 @@
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Artisan;
use Schema;
use App\Setting;
use App\User;
use App\Application;
use App\Jobs\ProcessApps;
use App\Setting;
use App\User;
use Artisan;
use Illuminate\Support\ServiceProvider;
use Schema;
class AppServiceProvider extends ServiceProvider
{
@@ -19,71 +19,67 @@ class AppServiceProvider extends ServiceProvider
*/
public function boot()
{
if(!is_file(base_path('.env'))) {
if (! is_file(base_path('.env'))) {
copy(base_path('.env.example'), base_path('.env'));
}
$this->genKey();
if(!is_file(database_path('app.sqlite'))) {
if (! is_file(database_path('app.sqlite'))) {
// first time setup
touch(database_path('app.sqlite'));
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true));
Artisan::call('migrate', ['--path' => 'database/migrations', '--force' => true, '--seed' => true]);
//Cache
//Artisan::call('config:cache');
//Artisan::call('route:cache');
}
if(is_file(database_path('app.sqlite'))) {
if(Schema::hasTable('settings')) {
if (is_file(database_path('app.sqlite'))) {
if (Schema::hasTable('settings')) {
// check version to see if an upgrade is needed
$db_version = Setting::_fetch('version');
$app_version = config('app.version');
if(version_compare($app_version, $db_version) == 1) { // app is higher than db, so need to run migrations etc
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true));
if (version_compare($app_version, $db_version) == 1) { // app is higher than db, so need to run migrations etc
Artisan::call('migrate', ['--path' => 'database/migrations', '--force' => true, '--seed' => true]);
}
} else {
Artisan::call('migrate', array('--path' => 'database/migrations', '--force' => true, '--seed' => true));
Artisan::call('migrate', ['--path' => 'database/migrations', '--force' => true, '--seed' => true]);
}
}
if(!is_file(public_path('storage/.gitignore'))) {
if (! is_file(public_path('storage/.gitignore'))) {
Artisan::call('storage:link');
\Session::put('current_user', null);
}
$lang = Setting::fetch('language');
\App::setLocale($lang);
$applications = Application::all();
if($applications->count() <= 0) {
if ($applications->count() <= 0) {
if (class_exists('ZipArchive')) {
ProcessApps::dispatch();
} else {
die("You are missing php-zip");
die('You are missing php-zip');
}
}
// User specific settings need to go here as session isn't available at this point in the app
view()->composer('*', function ($view)
{
if(isset($_SERVER['HTTP_AUTHORIZATION']) && !empty($_SERVER['HTTP_AUTHORIZATION'])) {
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
view()->composer('*', function ($view) {
if (isset($_SERVER['HTTP_AUTHORIZATION']) && ! empty($_SERVER['HTTP_AUTHORIZATION'])) {
list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
}
if(!\Auth::check()) {
if(isset($_SERVER['PHP_AUTH_USER']) && isset($_SERVER['PHP_AUTH_PW'])
&& !empty($_SERVER['PHP_AUTH_USER']) && !empty($_SERVER['PHP_AUTH_PW'])) {
if (! \Auth::check()) {
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)) {
// Authentication passed...
$user = \Auth::user();
//\Session::put('current_user', $user);
session(['current_user' => $user]);
session(['current_user' => $user]);
}
}
elseif(isset($_SERVER['REMOTE_USER']) && !empty($_SERVER['REMOTE_USER'])) {
} elseif (isset($_SERVER['REMOTE_USER']) && ! empty($_SERVER['REMOTE_USER'])) {
$user = User::where('username', $_SERVER['REMOTE_USER'])->first();
if ($user) {
\Auth::login($user, true);
@@ -92,54 +88,44 @@ class AppServiceProvider extends ServiceProvider
}
}
$alt_bg = '';
if($bg_image = Setting::fetch('background_image')) {
if ($bg_image = Setting::fetch('background_image')) {
$alt_bg = ' style="background-image: url(storage/'.$bg_image.')"';
}
$lang = Setting::fetch('language');
\App::setLocale($lang);
$allusers = User::all();
$current_user = User::currentUser();
$view->with('alt_bg', $alt_bg );
$view->with('allusers', $allusers );
$view->with('current_user', $current_user );
});
$view->with('alt_bg', $alt_bg);
$view->with('allusers', $allusers);
$view->with('current_user', $current_user);
});
$this->app['view']->addNamespace('SupportedApps', app_path('SupportedApps'));
if (env('FORCE_HTTPS') === true) {
\URL::forceScheme('https');
}
if(env('APP_URL') != 'http://localhost') {
if (env('APP_URL') != 'http://localhost') {
\URL::forceRootUrl(env('APP_URL'));
}
}
/**
/**
* Generate app key if missing and .env exists
*
* @return void
*/
public function genKey()
{
if(is_file(base_path('.env'))) {
if(empty(env('APP_KEY'))) {
Artisan::call('key:generate', array('--force' => true, '--no-interaction' => true));
if (is_file(base_path('.env'))) {
if (empty(env('APP_KEY'))) {
Artisan::call('key:generate', ['--force' => true, '--no-interaction' => true]);
}
}
}
/**
* Register any application services.
*

View File

@@ -2,8 +2,8 @@
namespace App\Providers;
use Illuminate\Support\Facades\Gate;
use Illuminate\Foundation\Support\Providers\AuthServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Gate;
class AuthServiceProvider extends ServiceProvider
{

View File

@@ -2,8 +2,8 @@
namespace App\Providers;
use Illuminate\Support\ServiceProvider;
use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\ServiceProvider;
class BroadcastServiceProvider extends ServiceProvider
{

View File

@@ -2,8 +2,8 @@
namespace App\Providers;
use Illuminate\Support\Facades\Event;
use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Event;
class EventServiceProvider extends ServiceProvider
{

View File

@@ -2,8 +2,8 @@
namespace App\Providers;
use Illuminate\Support\Facades\Route;
use Illuminate\Foundation\Support\Providers\RouteServiceProvider as ServiceProvider;
use Illuminate\Support\Facades\Route;
class RouteServiceProvider extends ServiceProvider
{

View File

@@ -1,44 +1,49 @@
<?php namespace App;
<?php
namespace App;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use App\Item;
use App\Setting;
use Form;
use Cache;
use Form;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Yaml;
abstract class Search
{
/**
* List of all search providers
*
* @return Array
*
* @return array
*/
public static function providers()
{
$providers = self::standardProviders();
$providers = $providers + self::appProviders();
return collect($providers);
}
/**
* Gets details for a single provider
*
* @return Object
*
* @return object
*/
public static function providerDetails($provider)
{
$providers = self::providers();
if(!isset($providers[$provider])) return false;
return (object)$providers[$provider] ?? false;
if (! isset($providers[$provider])) {
return false;
}
return (object) $providers[$provider] ?? false;
}
/**
* Array of the standard providers
*
* @return Array
*
* @return array
*/
public static function standardProviders()
{
@@ -46,7 +51,7 @@ abstract class Search
// print_r($providers);
$providers = Yaml::parseFile(storage_path('app/searchproviders.yaml'));
$all = [];
foreach($providers as $key => $provider) {
foreach ($providers as $key => $provider) {
$all[$key] = $provider;
$all[$key]['type'] = 'standard';
}
@@ -57,16 +62,18 @@ abstract class Search
/**
* Loops through users apps to see if app is a search provider, might be worth
* looking into caching this at some point
*
* @return Array
*
* @return array
*/
public static function appProviders()
{
$providers = [];
$userapps = Item::all();
foreach($userapps as $app) {
if(empty($app->class)) continue;
if(($provider = Item::isSearchProvider($app->class)) !== false) {
foreach ($userapps as $app) {
if (empty($app->class)) {
continue;
}
if (($provider = Item::isSearchProvider($app->class)) !== false) {
$name = Item::nameFromClass($app->class);
$providers[$app->id] = [
'id' => $app->id,
@@ -76,17 +83,17 @@ abstract class Search
'name' => $app->title,
'colour' => $app->colour,
'icon' => $app->icon,
'description' => $app->description
'description' => $app->description,
];
}
}
return $providers;
}
/**
* Outputs the search form
*
*
* @return html
*/
public static function form()
@@ -96,15 +103,16 @@ abstract class Search
$search_provider = Setting::where('key', '=', 'search_provider')->first();
$user_search_provider = Setting::fetch('search_provider');
//die(print_r($search_provider));
//die(var_dump($user_search_provider));
// return early if search isn't applicable
if((bool)$homepage_search !== true) return $output;
if ((bool) $homepage_search !== true) {
return $output;
}
$user_search_provider = $user_search_provider ?? 'none';
if((bool)$homepage_search && (bool)$search_provider) {
if((bool)$user_search_provider) {
if ((bool) $homepage_search && (bool) $search_provider) {
if ((bool) $user_search_provider) {
$name = 'app.options.'.$user_search_provider;
$provider = self::providerDetails($user_search_provider);
@@ -112,8 +120,8 @@ abstract class Search
$output .= '<form action="'.url('search').'"'.getLinkTargetAttribute().' method="get">';
$output .= '<div id="search-container" class="input-container">';
$output .= '<select name="provider">';
foreach(self::providers() as $key => $searchprovider) {
$selected = ((string)$key === (string)$user_search_provider) ? ' selected="selected"' : '';
foreach (self::providers() as $key => $searchprovider) {
$selected = ((string) $key === (string) $user_search_provider) ? ' selected="selected"' : '';
$output .= '<option value="'.$key.'"'.$selected.'>'.$searchprovider['name'].'</option>';
}
$output .= '</select>';
@@ -124,8 +132,7 @@ abstract class Search
$output .= '</div>';
}
}
return $output;
}
}

View File

@@ -1,10 +1,11 @@
<?php namespace App;
<?php
namespace App;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
interface SearchInterface
{
public function getResults($query, $providerdetails);
}
}

View File

@@ -2,13 +2,13 @@
namespace App;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Facades\Input;
use Form;
use Illuminate\Support\Facades\Auth;
use App\User;
use App\Search;
use App\User;
use Form;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
class Setting extends Model
{
@@ -20,7 +20,7 @@ class Setting extends Model
protected $table = 'settings';
protected $fillable = [
'id', 'group_id', 'key', 'type', 'options', 'label', 'value', 'order', 'system'
'id', 'group_id', 'key', 'type', 'options', 'label', 'value', 'order', 'system',
];
/**
@@ -50,37 +50,37 @@ class Setting extends Model
public function getListValueAttribute()
{
if((bool)$this->system === true) {
if ((bool) $this->system === true) {
$value = self::_fetch($this->key);
} else {
$value = self::fetch($this->key);
}
$this->value = $value;
switch($this->type) {
switch ($this->type) {
case 'image':
if(!empty($this->value)) {
if (! empty($this->value)) {
$value = '<a href="'.asset('storage/'.$this->value).'" title="'.__('app.settings.view').'" target="_blank">'.__('app.settings.view').'</a>';
} else {
$value = __('app.options.none');
}
}
break;
case 'boolean':
if((bool)$this->value === true) {
if ((bool) $this->value === true) {
$value = __('app.options.yes');
} else {
$value = __('app.options.no');
}
}
break;
case 'select':
if(!empty($this->value) && $this->value !== 'none') {
$options = (array)json_decode($this->options);
if($this->key === 'search_provider') {
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');
}
}
break;
default:
$value = __($this->value);
@@ -88,32 +88,33 @@ class Setting extends Model
}
return $value;
}
public function getEditValueAttribute()
{
if((bool)$this->system === true) {
if ((bool) $this->system === true) {
$value = self::_fetch($this->key);
} else {
$value = self::fetch($this->key);
}
$this->value = $value;
switch($this->type) {
switch ($this->type) {
case 'image':
$value = '';
if(isset($this->value) && !empty($this->value)) {
if (isset($this->value) && ! empty($this->value)) {
$value .= '<a class="setting-view-image" href="'.asset('storage/'.$this->value).'" title="'.__('app.settings.view').'" target="_blank"><img src="'.asset('storage/'.$this->value).'" /></a>';
}
$value .= Form::file('value', ['class' => 'form-control']);
if(isset($this->value) && !empty($this->value)) {
if (isset($this->value) && ! empty($this->value)) {
$value .= '<a class="settinglink" href="'.route('settings.clear', $this->id).'" title="'.__('app.settings.remove').'">'.__('app.settings.reset').'</a>';
}
break;
case 'boolean':
$checked = false;
if(isset($this->value) && (bool)$this->value === true) $checked = true;
if (isset($this->value) && (bool) $this->value === true) {
$checked = true;
}
$set_checked = ($checked) ? ' checked="checked"' : '';
$value = '
<input type="hidden" name="value" value="0" />
@@ -125,10 +126,10 @@ class Setting extends Model
break;
case 'select':
$options = json_decode($this->options);
if($this->key === 'search_provider') {
if ($this->key === 'search_provider') {
$options = Search::providers()->pluck('name', 'id');
}
foreach($options as $key => $opt) {
foreach ($options as $key => $opt) {
$options->$key = __($opt);
}
$value = Form::select('value', $options, null, ['class' => 'form-control']);
@@ -142,15 +143,13 @@ class Setting extends Model
}
return $value;
}
public function group()
{
return $this->belongsTo('App\SettingGroup', 'group_id');
return $this->belongsTo(\App\SettingGroup::class, 'group_id');
}
/**
* @param string $key
*
@@ -159,53 +158,54 @@ class Setting extends Model
public static function fetch($key)
{
$user = self::user();
return self::_fetch($key, $user);
}
/**
* @param string $key
*
* @return mixed
*/
public static function _fetch($key, $user=null)
public static function _fetch($key, $user = null)
{
#$cachekey = ($user === null) ? $key : $key.'-'.$user->id;
#if (Setting::cached($cachekey)) {
# return Setting::$cache[$cachekey];
#} else {
$find = self::where('key', '=', $key)->first();
//$cachekey = ($user === null) ? $key : $key.'-'.$user->id;
//if (Setting::cached($cachekey)) {
// return Setting::$cache[$cachekey];
//} else {
$find = self::where('key', '=', $key)->first();
if (!is_null($find)) {
if((bool)$find->system === true) { // if system variable use global value
if (! is_null($find)) {
if ((bool) $find->system === true) { // if system variable use global value
$value = $find->value;
} else { // not system variable so use user specific value
// check if user specified value has been set
//print_r($user);
$usersetting = $user->settings()->where('id', $find->id)->first();
//print_r($user->settings);
//die(var_dump($usersetting));
//->pivot->value;
//echo "user: ".$user->id." --- ".$usersettings;
if (isset($usersetting) && ! empty($usersetting)) {
$value = $usersetting->pivot->uservalue;
} else { // if not get default from base setting
//$user->settings()->save($find, ['value' => $find->value]);
//$has_setting = $user->settings()->where('id', $find->id)->exists();
//if($has_setting) {
// $user->settings()->updateExistingPivot($find->id, ['uservalue' => (string)$find->value]);
//} else {
// $user->settings()->save($find, ['uservalue' => (string)$find->value]);
//}
$value = $find->value;
} else { // not system variable so use user specific value
// check if user specified value has been set
//print_r($user);
$usersetting = $user->settings()->where('id', $find->id)->first();
//print_r($user->settings);
//die(var_dump($usersetting));
//->pivot->value;
//echo "user: ".$user->id." --- ".$usersettings;
if(isset($usersetting) && !empty($usersetting)) {
$value = $usersetting->pivot->uservalue;
} else { // if not get default from base setting
//$user->settings()->save($find, ['value' => $find->value]);
#$has_setting = $user->settings()->where('id', $find->id)->exists();
#if($has_setting) {
# $user->settings()->updateExistingPivot($find->id, ['uservalue' => (string)$find->value]);
#} else {
# $user->settings()->save($find, ['uservalue' => (string)$find->value]);
#}
$value = $find->value;
}
}
#Setting::add($cachekey, $value);
return $value;
} else {
return false;
}
#}
//Setting::add($cachekey, $value);
return $value;
} else {
return false;
}
//}
}
/**
@@ -214,7 +214,7 @@ class Setting extends Model
*/
public static function add($key, $value)
{
Setting::$cache[$key] = $value;
self::$cache[$key] = $value;
}
/**
@@ -224,22 +224,19 @@ class Setting extends Model
*/
public static function cached($key)
{
return array_key_exists($key, Setting::$cache);
return array_key_exists($key, self::$cache);
}
/**
* The users that belong to the setting.
*/
public function users()
{
return $this->belongsToMany('App\User')->using('App\SettingUser')->withPivot('uservalue');
return $this->belongsToMany(\App\User::class)->using(\App\SettingUser::class)->withPivot('uservalue');
}
public static function user()
{
return User::currentUser();
}
}

View File

@@ -22,6 +22,6 @@ class SettingGroup extends Model
public function settings()
{
return $this->hasMany('App\Setting', 'group_id');
return $this->hasMany(\App\Setting::class, 'group_id');
}
}

View File

@@ -1,34 +1,37 @@
<?php namespace App;
<?php
namespace App;
use GuzzleHttp\Exception\GuzzleException;
use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;
use Illuminate\Support\Facades\Log;
abstract class SupportedApps
{
protected $jar = false;
protected $method = 'GET';
protected $error;
public function appTest($url, $attrs = [], $overridevars=false)
public function appTest($url, $attrs = [], $overridevars = false)
{
if(empty($this->config->url)) {
return (object)[
if (empty($this->config->url)) {
return (object) [
'code' => 404,
'status' => 'No URL has been specified',
'response' => 'No URL has been specified',
];
];
}
$res = $this->execute($url, $attrs);
if($res == null) {
return (object)[
if ($res == null) {
return (object) [
'code' => null,
'status' => $this->error,
'response' => 'Connection failed',
];
}
switch($res->getStatusCode()) {
switch ($res->getStatusCode()) {
case 200:
$status = 'Successfully communicated with the API';
break;
@@ -42,21 +45,22 @@ abstract class SupportedApps
$status = 'Something went wrong... Code: '.$res->getStatusCode();
break;
}
return (object)[
return (object) [
'code' => $res->getStatusCode(),
'status' => $status,
'response' => $res->getBody(),
];
}
public function execute($url, $attrs = [], $overridevars=false, $overridemethod=false)
public function execute($url, $attrs = [], $overridevars = false, $overridemethod = false)
{
$res = null;
$vars = ($overridevars !== false) ?
$overridevars : [
'http_errors' => false,
'timeout' => 15,
'http_errors' => false,
'timeout' => 15,
'connect_timeout' => 15,
];
@@ -65,35 +69,34 @@ abstract class SupportedApps
$method = ($overridemethod !== false) ? $overridemethod : $this->method;
try {
return $client->request($method, $url, $attrs);
return $client->request($method, $url, $attrs);
} catch (\GuzzleHttp\Exception\ConnectException $e) {
Log::error("Connection refused");
Log::error('Connection refused');
Log::debug($e->getMessage());
$this->error = "Connection refused - ".(string) $e->getMessage();
$this->error = 'Connection refused - '.(string) $e->getMessage();
} catch (\GuzzleHttp\Exception\ServerException $e) {
Log::debug($e->getMessage());
$this->error = (string) $e->getResponse()->getBody();
}
$this->error = 'General error connecting with API';
return $res;
}
public function login()
{
}
public function normaliseurl($url, $addslash=true)
public function normaliseurl($url, $addslash = true)
{
$url = rtrim($url, '/');
if($addslash) $url .= '/';
if ($addslash) {
$url .= '/';
}
return $url;
}
public function getLiveStats($status, $data)
{
$className = get_class($this);
@@ -101,31 +104,37 @@ abstract class SupportedApps
$name = end($explode);
$html = view('SupportedApps::'.$name.'.livestats', $data)->with('data', $data)->render();
return json_encode(['status' => $status, 'html' => $html]);
//return
//return
}
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);
}
public static function configValue($item=null, $key=null)
public static function configValue($item = null, $key = null)
{
if(isset($item) && !empty($item)) {
if (isset($item) && ! empty($item)) {
return $item->getconfig()->$key;
} else return null;
} else {
return null;
}
}
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);
if(!file_exists(app_path('SupportedApps'))) {
if (! file_exists(app_path('SupportedApps'))) {
mkdir(app_path('SupportedApps'), 0777, true);
}
@@ -138,35 +147,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);
$enhanced = (bool) ($application instanceof \App\EnhancedApps);
$app->class = $appclass;
$app->enhanced = $enhanced;
$app->tile_background = $details->tile_background;
$app->save();
}
}
return $app;
}
}

View File

@@ -2,8 +2,8 @@
namespace App;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;
class User extends Authenticatable
{
@@ -32,7 +32,7 @@ class User extends Authenticatable
*/
public function items()
{
return $this->hasMany('App\Item');
return $this->hasMany(\App\Item::class);
}
/**
@@ -40,7 +40,7 @@ class User extends Authenticatable
*/
public function settings()
{
return $this->belongsToMany('App\Setting')->withPivot('uservalue');
return $this->belongsToMany(\App\Setting::class)->withPivot('uservalue');
}
public static function currentUser()
@@ -49,15 +49,13 @@ class User extends Authenticatable
if ($current_user) { // if logged in, set this user
return $current_user;
} else { // not logged in, get first user
$user = User::where('public_front',true)->first();
if(!$user) {
$user = User::first();
$user = self::where('public_front', true)->first();
if (! $user) {
$user = self::first();
}
session(['current_user' => $user]);
return $user;
}
}
}

View File

@@ -12,7 +12,7 @@
*/
$app = new Illuminate\Foundation\Application(
realpath(__DIR__.'/../')
$_ENV['APP_BASE_PATH'] ?? dirname(__DIR__)
);
/*

2
composer.lock generated
View File

@@ -8154,5 +8154,5 @@
"php": ">=7.2.5"
},
"platform-dev": [],
"plugin-api-version": "2.1.0"
"plugin-api-version": "2.2.0"
}

View File

@@ -13,8 +13,8 @@ return [
|
*/
'name' => env('APP_NAME', 'Heimdall'),
'version' => '2.3.1',
'name' => env('APP_NAME', 'Heimdall'),
'version' => '2.4.7',
/*
|--------------------------------------------------------------------------
@@ -40,7 +40,7 @@ return [
|
*/
'debug' => env('APP_DEBUG', false),
'debug' => (bool) env('APP_DEBUG', false),
/*
|--------------------------------------------------------------------------
@@ -55,6 +55,9 @@ return [
'url' => env('APP_URL', 'http://localhost'),
'asset_url' => env('ASSET_URL', null),
'appsource' => env('APP_SOURCE', 'https://appslist.heimdall.site/'),
/*
|--------------------------------------------------------------------------
| Application Timezone
@@ -94,6 +97,19 @@ return [
'fallback_locale' => 'en',
/*
|--------------------------------------------------------------------------
| Faker Locale
|--------------------------------------------------------------------------
|
| This locale will be used by the Faker PHP library when generating fake
| data for your database seeds. For example, this will be used to get
| localized telephone numbers, street address information and more.
|
*/
'faker_locale' => 'en_US',
/*
|--------------------------------------------------------------------------
| Encryption Key
@@ -109,23 +125,6 @@ return [
'cipher' => 'AES-256-CBC',
/*
|--------------------------------------------------------------------------
| Logging Configuration
|--------------------------------------------------------------------------
|
| Here you may configure the log settings 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 Settings: "single", "daily", "syslog", "errorlog"
|
*/
'log' => env('APP_LOG', 'single'),
'log_level' => env('APP_LOG_LEVEL', 'debug'),
/*
|--------------------------------------------------------------------------
| Autoloaded Service Providers
@@ -194,6 +193,7 @@ return [
'aliases' => [
'App' => Illuminate\Support\Facades\App::class,
'Arr' => Illuminate\Support\Arr::class,
'Artisan' => Illuminate\Support\Facades\Artisan::class,
'Auth' => Illuminate\Support\Facades\Auth::class,
'Blade' => Illuminate\Support\Facades\Blade::class,
@@ -211,6 +211,7 @@ return [
'Gate' => Illuminate\Support\Facades\Gate::class,
'Hash' => Illuminate\Support\Facades\Hash::class,
'Html' => Collective\Html\HtmlFacade::class,
'Http' => Illuminate\Support\Facades\Http::class,
'Lang' => Illuminate\Support\Facades\Lang::class,
'Log' => Illuminate\Support\Facades\Log::class,
'Mail' => Illuminate\Support\Facades\Mail::class,
@@ -225,6 +226,7 @@ return [
'Schema' => Illuminate\Support\Facades\Schema::class,
'Session' => Illuminate\Support\Facades\Session::class,
'Storage' => Illuminate\Support\Facades\Storage::class,
'Str' => Illuminate\Support\Str::class,
'URL' => Illuminate\Support\Facades\URL::class,
'Validator' => Illuminate\Support\Facades\Validator::class,
'View' => Illuminate\Support\Facades\View::class,

View File

@@ -44,6 +44,7 @@ return [
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => false,
],
],
@@ -96,7 +97,21 @@ return [
'provider' => 'users',
'table' => 'password_resets',
'expire' => 60,
'throttle' => 60,
],
],
/*
|--------------------------------------------------------------------------
| Password Confirmation Timeout
|--------------------------------------------------------------------------
|
| Here you may define the amount of seconds before a password confirmation
| times out and the user is prompted to re-enter their password via the
| confirmation screen. By default, the timeout lasts for three hours.
|
*/
'password_timeout' => 10800,
];

View File

@@ -37,7 +37,7 @@ return [
'app_id' => env('PUSHER_APP_ID'),
'options' => [
'cluster' => env('PUSHER_APP_CLUSTER'),
'encrypted' => true,
'useTLS' => true,
],
],

View File

@@ -1,5 +1,7 @@
<?php
use Illuminate\Support\Str;
return [
/*
@@ -36,6 +38,7 @@ return [
'array' => [
'driver' => 'array',
'serialize' => false,
],
'database' => [
@@ -73,6 +76,15 @@ return [
'connection' => 'default',
],
'dynamodb' => [
'driver' => 'dynamodb',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
'table' => env('DYNAMODB_CACHE_TABLE', 'cache'),
'endpoint' => env('DYNAMODB_ENDPOINT'),
],
],
/*
@@ -86,9 +98,6 @@ return [
|
*/
'prefix' => env(
'CACHE_PREFIX',
str_slug(env('APP_NAME', 'laravel'), '_').'_cache'
),
'prefix' => env('CACHE_PREFIX', Str::slug(env('APP_NAME', 'laravel'), '_').'_cache'),
];

View File

@@ -44,6 +44,7 @@ return [
'mysql' => [
'driver' => 'mysql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '3306'),
'database' => env('DB_DATABASE', 'forge'),
@@ -53,12 +54,17 @@ return [
'charset' => 'utf8mb4',
'collation' => 'utf8mb4_unicode_ci',
'prefix' => '',
'prefix_indexes' => true,
'strict' => true,
'engine' => null,
'options' => extension_loaded('pdo_mysql') ? array_filter([
PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
]) : [],
],
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
@@ -66,12 +72,14 @@ return [
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
'sqlsrv' => [
'driver' => 'sqlsrv',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', 'localhost'),
'port' => env('DB_PORT', '1433'),
'database' => env('DB_DATABASE', 'forge'),
@@ -79,8 +87,9 @@ return [
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
],
],
/*

View File

@@ -61,8 +61,10 @@ return [
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION'),
'bucket' => env('AWS_BUCKET'),
'url' => env('AWS_URL'),
'endpoint' => env('AWS_ENDPOINT'),
],
],
];

52
config/hashing.php Normal file
View File

@@ -0,0 +1,52 @@
<?php
return [
/*
|--------------------------------------------------------------------------
| Default Hash Driver
|--------------------------------------------------------------------------
|
| This option controls the default hash driver that will be used to hash
| passwords for your application. By default, the bcrypt algorithm is
| used; however, you remain free to modify this option if you wish.
|
| Supported: "bcrypt", "argon", "argon2id"
|
*/
'driver' => 'bcrypt',
/*
|--------------------------------------------------------------------------
| Bcrypt Options
|--------------------------------------------------------------------------
|
| Here you may specify the configuration options that should be used when
| passwords are hashed using the Bcrypt algorithm. This will allow you
| to control the amount of time it takes to hash the given password.
|
*/
'bcrypt' => [
'rounds' => env('BCRYPT_ROUNDS', 10),
],
/*
|--------------------------------------------------------------------------
| Argon Options
|--------------------------------------------------------------------------
|
| Here you may specify the configuration options that should be used when
| passwords are hashed using the Argon algorithm. These will allow you
| to control the amount of time it takes to hash the given password.
|
*/
'argon' => [
'memory' => 1024,
'threads' => 2,
'time' => 2,
],
];

View File

@@ -101,4 +101,4 @@ return [
],
],
];
];

View File

@@ -4,18 +4,16 @@ return [
/*
|--------------------------------------------------------------------------
| Default Queue Driver
| Default Queue Connection Name
|--------------------------------------------------------------------------
|
| Laravel's queue API supports an assortment of back-ends via a single
| API, giving you convenient access to each back-end using the same
| syntax for each one. Here you may set the default queue driver.
|
| Supported: "sync", "database", "beanstalkd", "sqs", "redis", "null"
| syntax for every one. Here you may define a default connection.
|
*/
'default' => env('QUEUE_DRIVER', 'sync'),
'default' => env('QUEUE_CONNECTION', 'sync'),
/*
|--------------------------------------------------------------------------
@@ -26,6 +24,8 @@ return [
| is used by your application. A default configuration has been added
| for each back-end shipped with Laravel. You are free to add more.
|
| Drivers: "sync", "database", "beanstalkd", "sqs", "redis", "null"
|
*/
'connections' => [
@@ -46,22 +46,25 @@ return [
'host' => 'localhost',
'queue' => 'default',
'retry_after' => 90,
'block_for' => 0,
],
'sqs' => [
'driver' => 'sqs',
'key' => env('SQS_KEY', 'your-public-key'),
'secret' => env('SQS_SECRET', 'your-secret-key'),
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'prefix' => env('SQS_PREFIX', 'https://sqs.us-east-1.amazonaws.com/your-account-id'),
'queue' => env('SQS_QUEUE', 'your-queue-name'),
'region' => env('SQS_REGION', 'us-east-1'),
'suffix' => env('SQS_SUFFIX'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
'redis' => [
'driver' => 'redis',
'connection' => 'default',
'queue' => 'default',
'queue' => env('REDIS_QUEUE', 'default'),
'retry_after' => 90,
'block_for' => null,
],
],
@@ -78,6 +81,7 @@ return [
*/
'failed' => [
'driver' => env('QUEUE_FAILED_DRIVER', 'database'),
'database' => env('DB_CONNECTION', 'mysql'),
'table' => 'failed_jobs',
],

View File

@@ -8,31 +8,26 @@ return [
|--------------------------------------------------------------------------
|
| This file is for storing the credentials for third party services such
| as Stripe, Mailgun, SparkPost and others. This file provides a sane
| default location for this type of information, allowing packages
| to have a conventional place to find your various credentials.
| as Mailgun, Postmark, AWS and more. This file provides the de facto
| location for this type of information, allowing packages to have
| a conventional file to locate the various service credentials.
|
*/
'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
'endpoint' => env('MAILGUN_ENDPOINT', 'api.mailgun.net'),
],
'postmark' => [
'token' => env('POSTMARK_TOKEN'),
],
'ses' => [
'key' => env('SES_KEY'),
'secret' => env('SES_SECRET'),
'region' => 'us-east-1',
'key' => env('AWS_ACCESS_KEY_ID'),
'secret' => env('AWS_SECRET_ACCESS_KEY'),
'region' => env('AWS_DEFAULT_REGION', 'us-east-1'),
],
'sparkpost' => [
'secret' => env('SPARKPOST_SECRET'),
],
'stripe' => [
'model' => App\User::class,
'key' => env('STRIPE_KEY'),
'secret' => env('STRIPE_SECRET'),
],
];

View File

@@ -1,5 +1,7 @@
<?php
use Illuminate\Support\Str;
return [
/*
@@ -70,7 +72,7 @@ return [
|
*/
'connection' => null,
'connection' => env('SESSION_CONNECTION', null),
/*
|--------------------------------------------------------------------------
@@ -96,7 +98,7 @@ return [
|
*/
'store' => null,
'store' => env('SESSION_STORE', null),
/*
|--------------------------------------------------------------------------
@@ -124,7 +126,7 @@ return [
'cookie' => env(
'SESSION_COOKIE',
str_slug(env('APP_NAME', 'laravel'), '_').'_session'
Str::slug(env('APP_NAME', 'laravel'), '_').'_session'
),
/*
@@ -164,7 +166,7 @@ return [
|
*/
'secure' => env('SESSION_SECURE_COOKIE', null),
'secure' => env('SESSION_SECURE_COOKIE'),
/*
|--------------------------------------------------------------------------

View File

@@ -28,6 +28,9 @@ return [
|
*/
'compiled' => realpath(storage_path('framework/views')),
'compiled' => env(
'VIEW_COMPILED_PATH',
realpath(storage_path('framework/views'))
),
];
];

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateItemsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSettingsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSettingGroupsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddColumnsToItemsForGroups extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class ItemTag extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateUsersTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreatePasswordResetsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddUserIdToItemsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateSettingUserPivotTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateApplicationsTable extends Migration
{
@@ -14,7 +14,6 @@ class CreateApplicationsTable extends Migration
public function up()
{
Schema::create('applications', function (Blueprint $table) {
$table->string('appid')->unique();
$table->string('name')->unique();
$table->string('sha')->unique()->nullable();

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddClassToItemsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateJobsTable extends Migration
{

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Support\Facades\Schema;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class CreateFailedJobsTable extends Migration
{

View 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']);
});
}
}

View File

@@ -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']);
});
}
}

View File

@@ -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) {
//
});
}
}

View File

@@ -1,8 +1,8 @@
<?php
use Illuminate\Database\Seeder;
use App\Setting;
use App\SettingGroup;
use Illuminate\Database\Seeder;
class SettingsSeeder extends Seeder
{
@@ -14,7 +14,7 @@ class SettingsSeeder extends Seeder
public function run()
{
// Groups
if(!$setting_group = SettingGroup::find(1)) {
if (! $setting_group = SettingGroup::find(1)) {
$setting_group = new SettingGroup;
$setting_group->id = 1;
$setting_group->title = 'app.settings.system';
@@ -24,7 +24,7 @@ class SettingsSeeder extends Seeder
$setting_group->title = 'app.settings.system';
$setting_group->save();
}
if(!$setting_group = SettingGroup::find(2)) {
if (! $setting_group = SettingGroup::find(2)) {
$setting_group = new SettingGroup;
$setting_group->id = 2;
$setting_group->title = 'app.settings.appearance';
@@ -34,7 +34,7 @@ class SettingsSeeder extends Seeder
$setting_group->title = 'app.settings.appearance';
$setting_group->save();
}
if(!$setting_group = SettingGroup::find(3)) {
if (! $setting_group = SettingGroup::find(3)) {
$setting_group = new SettingGroup;
$setting_group->id = 3;
$setting_group->title = 'app.settings.miscellaneous';
@@ -44,7 +44,7 @@ class SettingsSeeder extends Seeder
$setting_group->title = 'app.settings.miscellaneous';
$setting_group->save();
}
if(!$setting_group = SettingGroup::find(4)) {
if (! $setting_group = SettingGroup::find(4)) {
$setting_group = new SettingGroup;
$setting_group->id = 4;
$setting_group->title = 'app.settings.advanced';
@@ -55,7 +55,7 @@ class SettingsSeeder extends Seeder
$setting_group->save();
}
if($version = Setting::find(1)) {
if ($version = Setting::find(1)) {
$version->label = 'app.settings.version';
$version->value = config('app.version');
$version->save();
@@ -71,7 +71,7 @@ class SettingsSeeder extends Seeder
$setting->save();
}
if(!$setting = Setting::find(2)) {
if (! $setting = Setting::find(2)) {
$setting = new Setting;
$setting->id = 2;
$setting->group_id = 2;
@@ -83,7 +83,7 @@ class SettingsSeeder extends Seeder
$setting->label = 'app.settings.background_image';
$setting->save();
}
if(!$setting = Setting::find(3)) {
if (! $setting = Setting::find(3)) {
$setting = new Setting;
$setting->id = 3;
$setting->group_id = 3;
@@ -105,8 +105,7 @@ class SettingsSeeder extends Seeder
'startpage' => 'app.options.startpage',
]);
if(!$setting = Setting::find(4)) {
if (! $setting = Setting::find(4)) {
$setting = new Setting;
$setting->id = 4;
$setting->group_id = 3;
@@ -121,10 +120,10 @@ class SettingsSeeder extends Seeder
$setting->save();
}
$language_options = json_encode([
'de' => 'Deutsch (German)',
'en' => 'English',
'cn' => '简体中文 (Simplified Chinese)',
'fi' => 'Suomi (Finnish)',
'fr' => 'Français (French)',
'el' => 'Ελληνικά (Greek)',
@@ -135,7 +134,7 @@ class SettingsSeeder extends Seeder
'es' => 'Español (Spanish)',
'tr' => 'Türkçe (Turkish)',
]);
if($languages = Setting::find(5)) {
if ($languages = Setting::find(5)) {
$languages->options = $language_options;
$languages->save();
} else {
@@ -156,8 +155,7 @@ class SettingsSeeder extends Seeder
'_blank' => 'app.settings.window_target.new',
]);
if(!$setting = Setting::find(7)) {
if (! $setting = Setting::find(7)) {
$setting = new Setting;
$setting->id = 7;
$setting->group_id = 3;
@@ -173,7 +171,7 @@ class SettingsSeeder extends Seeder
$setting->save();
}
if($support = Setting::find(8)) {
if ($support = Setting::find(8)) {
$support->label = 'app.settings.support';
$support->value = '<a rel="noopener" target="_blank" href="https://discord.gg/CCjHKn4">Discord</a> | <a rel="noopener" target="_blank" href="https://github.com/linuxserver/Heimdall">Github</a> | <a rel="noopener" target="_blank" href="https://blog.heimdall.site/">Blog</a>';
$support->save();
@@ -189,7 +187,7 @@ class SettingsSeeder extends Seeder
$setting->save();
}
if($donate = Setting::find(9)) {
if ($donate = Setting::find(9)) {
$donate->label = 'app.settings.donate';
$donate->value = '<a rel="noopener" target="_blank" href="https://www.paypal.me/heimdall">Paypal</a>';
$donate->save();
@@ -204,8 +202,8 @@ class SettingsSeeder extends Seeder
$setting->system = true;
$setting->save();
}
if(!$setting = Setting::find(10)) {
if (! $setting = Setting::find(10)) {
$setting = new Setting;
$setting->id = 10;
$setting->group_id = 4;
@@ -221,7 +219,7 @@ class SettingsSeeder extends Seeder
$setting->save();
}
if(!$setting = Setting::find(11)) {
if (! $setting = Setting::find(11)) {
$setting = new Setting;
$setting->id = 11;
$setting->group_id = 4;
@@ -237,7 +235,7 @@ class SettingsSeeder extends Seeder
$setting->save();
}
if(!$home_tag = \App\Item::find(0)) {
if (! $home_tag = \App\Item::find(0)) {
$home_tag = new \App\Item;
$home_tag->id = 0;
$home_tag->title = 'app.dashboard';
@@ -248,11 +246,12 @@ class SettingsSeeder extends Seeder
$home_tag->save();
$homeapps = \App\Item::withoutGlobalScope('user_id')->doesntHave('parents')->get();
foreach($homeapps as $app) {
if($app->id === 0) continue;
foreach ($homeapps as $app) {
if ($app->id === 0) {
continue;
}
$app->parents()->attach(0);
}
}
}
}

View File

@@ -1,7 +1,7 @@
<?php
use Illuminate\Database\Seeder;
use App\User;
use Illuminate\Database\Seeder;
class UsersSeeder extends Seeder
{
@@ -13,7 +13,7 @@ class UsersSeeder extends Seeder
public function run()
{
// Groups
if(!$user = User::find(1)) {
if (! $user = User::find(1)) {
$user = new User;
$user->id = 1;
$user->username = 'admin';

View File

@@ -1,21 +1,16 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
<phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="./vendor/phpunit/phpunit/phpunit.xsd"
bootstrap="vendor/autoload.php"
colors="true"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false">
>
<testsuites>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
<testsuite name="Unit">
<directory suffix="Test.php">./tests/Unit</directory>
</testsuite>
<testsuite name="Feature">
<directory suffix="Test.php">./tests/Feature</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
@@ -23,9 +18,14 @@
</whitelist>
</filter>
<php>
<env name="APP_ENV" value="testing"/>
<env name="CACHE_DRIVER" value="array"/>
<env name="SESSION_DRIVER" value="array"/>
<env name="QUEUE_DRIVER" value="sync"/>
<server name="APP_ENV" value="testing"/>
<server name="BCRYPT_ROUNDS" value="4"/>
<server name="CACHE_DRIVER" value="array"/>
<!-- <server name="DB_CONNECTION" value="sqlite"/> -->
<!-- <server name="DB_DATABASE" value=":memory:"/> -->
<server name="MAIL_MAILER" value="array"/>
<server name="QUEUE_CONNECTION" value="sync"/>
<server name="SESSION_DRIVER" value="array"/>
<server name="TELESCOPE_ENABLED" value="false"/>
</php>
</phpunit>
</phpunit>

181
public/css/app.css vendored
View File

@@ -269,6 +269,67 @@ body {
background: #d64d55;
}
#tile-preview {
align-items: center;
}
.create .textarea {
width: 100%;
margin: 0px 20px;
}
.create .textarea textarea {
width: 100%;
border: 1px solid #dedfe2;
padding: 15px;
border-radius: 6px;
height: 100px;
font-size: 14px;
}
.create .textarea label:not(.switch) {
width: 100%;
font-size: 13px;
color: #9094a5;
margin-bottom: 15px;
display: block;
font-weight: 300;
}
.appoptions {
display: flex;
flex-direction: column;
padding: 20px;
gap: 5px;
}
.appoptions .optdetails {
display: flex;
}
.appoptions .optdetails .input {
margin: 0 20px;
width: 200px;
}
.appoptions .optvalue {
display: flex;
align-items: center;
opacity: 0;
width: 0;
height: 0;
overflow: hidden;
}
.appoptions .optvalue.active {
opacity: 1;
width: auto;
height: auto;
overflow: visible;
}
.appoptions button.dark {
background: #1b1b1b;
border: none;
padding: 12px 15px;
border-radius: 4px;
color: white;
min-width: 240px;
}
#app {
display: flex;
min-height: 100vh;
@@ -419,6 +480,61 @@ body {
text-align: center;
line-height: 30px;
display: none;
z-index: 1;
}
.item-container .tooltip {
padding: 25px;
border-radius: 5px;
background: #000000c8;
color: white;
position: absolute;
bottom: 120px;
left: 0;
right: 0;
font-size: 13px;
-webkit-backdrop-filter: blur(8px);
backdrop-filter: blur(8px);
z-index: 0;
opacity: 0;
transform: translateY(-20px);
transition: all 0.3s;
}
.item-container .tooltip.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;
}
.tile-actions.active {
opacity: 1;
}
.refresh {
z-index: 3;
}
.refresh .icon {
font-size: 20px;
margin-bottom: 5px;
}
.black {
@@ -708,6 +824,16 @@ body {
margin: 0;
}
.input {
position: relative;
}
.input .help {
position: absolute;
bottom: -22px;
left: 10px;
color: #c00;
}
div.create {
padding: 30px 15px;
display: flex;
@@ -732,9 +858,20 @@ div.create .input input, div.create .input select {
border-radius: 6px;
}
.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 {
@@ -775,6 +912,44 @@ div.create .input input, div.create .input select {
margin-left: 20px;
}
#websiteiconoptions {
display: flex;
flex-direction: column;
padding: 20px;
}
#websiteiconoptions .results {
display: flex;
flex-wrap: wrap;
align-items: center;
gap: 8px;
}
#websiteiconoptions .header {
display: flex;
justify-content: space-between;
align-items: center;
gap: 10px;
padding: 10px 0;
}
#websiteiconoptions .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;
display: inline-block;
@@ -895,6 +1070,8 @@ a.settinglink {
position: relative;
width: 100%;
max-width: 620px;
position: relative;
z-index: 4;
}
.searchform form {
width: 100%;
@@ -977,7 +1154,7 @@ a.settinglink {
}
#appimage img {
max-width: 95px;
width: 95px;
}
#sapconfig, .newblock {

9
public/js/app.js vendored
View File

@@ -641,6 +641,13 @@ $.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 () {
var search = this.value;
var items = $('#sortable').children('.item-container');
@@ -709,7 +716,7 @@ $.when($.ready).then(function () {
}).on('click', '#test_config', function (e) {
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;

View File

@@ -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"],

View File

@@ -1,4 +1,4 @@
{
"/css/app.css": "/css/app.css?id=bafda2139c75830558d2",
"/js/app.js": "/js/app.js?id=0ff185efa8c02e94999e"
"/css/app.css": "/css/app.css?id=ad45b1705b7f7906db0b",
"/js/app.js": "/js/app.js?id=5446aeb4aa754e641c77"
}

View File

@@ -55,6 +55,15 @@ There is also a multi-arch Docker which supports x86-64, armhf and arm64, instru
## 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.
@@ -82,6 +91,7 @@ Currently added languages are
- Spanish
- Turkish
- Russian
- Chinese
## Web Server Configuration

View File

@@ -128,6 +128,14 @@ $.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')
@@ -197,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;
}

View File

@@ -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;
}
}

View File

@@ -29,7 +29,6 @@ return [
'settings.search' => 'busca',
'settings.no_items' => 'Nenhum item encontrado',
'settings.label' => 'Rótulo',
'settings.value' => 'Valor',
'settings.edit' => 'Editar',

View File

@@ -11,7 +11,9 @@ return [
'settings.system' => '系统',
'settings.appearance' => '外观',
'settings.miscellaneous' => '其他',
'settings.miscellaneous' => '杂项',
'settings.advanced' => '高级',
'settings.support' => '支持',
'settings.donate' => '捐赠',
@@ -25,22 +27,25 @@ return [
'settings.search_provider' => '默认搜索引擎',
'settings.language' => '语言',
'settings.reset' => '重置为默认值',
'settings.remove' => '除',
'settings.remove' => '除',
'settings.search' => '搜索',
'settings.no_items' => '没有可用项目',
'settings.label' => '设置项',
'settings.value' => '内容',
'settings.edit' => '编辑',
'settings.view' => '查看',
'settings.custom_css' => '自定义 CSS',
'settings.custom_js' => '自定义 JavaScript',
'options.none' => '- 未设置 -',
'options.google' => 'Google',
'options.baidu' => '百度',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.startpage' => 'StartPage',
'options.startpage' => '起始页',
'options.yes' => '是',
'options.no' => '否',
'options.nzbhydra' => 'NZBHydra',
@@ -52,11 +57,11 @@ return [
'buttons.upload' => '上传图标',
'buttons.downloadapps' => '更新应用列表',
'dash.pin_item' => '将应用固定到仪表盘',
'dash.no_apps' => '当前没有固定的应用, :link1 或 :link2',
'dash.pin_item' => '固定应用到仪表盘',
'dash.no_apps' => '当前没有固定的应用, :link1 或 :link2',
'dash.link1' => '添加应用',
'dash.link2' => '将应用固定到仪表盘',
'dash.pinned_items' => '固定应用',
'dash.pinned_items' => '固定应用',
'apps.app_list' => '应用列表',
'apps.view_trash' => '查看垃圾箱',
@@ -66,12 +71,12 @@ return [
'apps.icon' => '图标',
'apps.pinned' => '固定',
'apps.title' => '标题',
'apps.hex' => 'Hex色',
'apps.username' => '用户名',
'apps.hex' => 'Hex色',
'apps.username' => '用户名',
'apps.password' => '密码',
'apps.config' => '配置',
'apps.apikey' => 'API 密钥',
'apps.enable' => 'Enable',
'apps.enable' => '开启',
'apps.tag_list' => '标签列表',
'apps.add_tag' => '添加标签',
'apps.tag_name' => '标签名称',
@@ -79,42 +84,46 @@ return [
'apps.override' => '如果与主链接不同',
'apps.preview' => '预览',
'apps.apptype' => '应用类型',
'apps.website' => '网址',
'apps.description' => '描述',
'apps.only_admin_account' => '您必须拥有管理员账户!',
'apps.autologin_url' => '自动登录网址',
'apps.show_deleted' => '显示已移除的应用',
'dashboard' => '主页-控制台',
'dashboard' => '仪表盘',
'user.user_list' => '用户',
'user.add_user' => '加用户',
'user.username' => '用户名',
'user.add_user' => '加用户',
'user.username' => '用户名',
'user.avatar' => '头像',
'user.email' => '邮箱地址',
'user.password_confirm' => '重复密码',
'user.secure_front' => '仅设置密码后才允许公开访问.',
'user.autologin' => '仅可从特定链接访问(任何通过链接都可访问).',
'user.email' => '邮箱',
'user.password_confirm' => '确认密码',
'user.secure_front' => '允许公开访问 - 仅在设置密码时有效',
'user.autologin' => '允许从特定链接进入 - 任何拥有链接的人均可访问',
'url' => '链接',
'url' => '网址',
'title' => '标题',
'delete' => '除',
'delete' => '除',
'optional' => '可选',
'restore' => '复',
'restore' => '复',
'alert.success.item_created' => '应用添加成功',
'alert.success.item_updated' => '应用更新成功',
'alert.success.item_deleted' => '应用除成功',
'alert.success.item_restored' => '应用复成功',
'alert.success.updating' => '更新应用列表完成',
'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.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' => '用户复位成功',
'alert.success.setting_updated' => '成功编辑此设置',
'alert.error.not_exist' => '此设置项不存在',
'alert.success.user_created' => '用户创建成功',
'alert.success.user_updated' => '用户修改成功',
'alert.success.user_deleted' => '用户移除成功',
'alert.success.user_restored' => '用户恢复成功',
];

View 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 秒后重试.',
];

View 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' => '&laquo; 上一页',
'next' => '下一页 &raquo;',
];

View 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' => "我们无法找到该邮箱对应的用户.",
];

View 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 不是一个有效的网址.',
'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 必须是有效的邮箱地址.',
'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' => ':attribute 不应比 :min 小.',
'file' => ':attribute 不应比 :min 千字节 少.',
'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 千字节.',
'string' => ':attribute 必须是 :size 个字符.',
'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' => [],
];

View File

@@ -29,7 +29,6 @@ return [
'settings.search' => 'søg',
'settings.no_items' => 'Intet fundet',
'settings.label' => 'Etiket',
'settings.value' => 'Værdi',
'settings.edit' => 'Rediger',
@@ -116,5 +115,4 @@ return [
'alert.success.user_deleted' => 'Bruger slettet med succes',
'alert.success.user_restored' => 'Bruger genskabt med succes',
];

View File

@@ -17,6 +17,6 @@ return [
'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.",
'user' => 'Vi kan ikke finde en bruger med den e-mail-adresse.',
];

View File

@@ -1,60 +1,60 @@
<?php
return array (
'settings.system' => 'System',
'settings.appearance' => 'Aussehen',
'settings.miscellaneous' => 'Sonstiges',
'settings.version' => 'Version',
'settings.background_image' => 'Hintergrundbild',
'settings.homepage_search' => 'Startseite Sucheingabe',
'settings.search_provider' => 'Suchanbieter',
'settings.language' => 'Sprache',
'settings.reset' => 'Zurücksetzen auf Standard',
'settings.remove' => 'Entfernen',
'settings.search' => 'suche',
'settings.no_items' => 'Keine Elemente gefunden',
'settings.label' => 'Bezeichnung',
'settings.value' => 'Wert',
'settings.edit' => 'Bearbeiten',
'settings.view' => 'Ansicht',
'options.none' => '- nicht festgelegt -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.yes' => 'Ja',
'options.no' => 'Nein',
'buttons.save' => 'Speichern',
'buttons.cancel' => 'Abbrechen',
'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' => 'Anwendung neu hinzufügen',
'dash.link2' => 'anheften',
'dash.pinned_items' => 'Angeheftete Elemente',
'apps.app_list' => 'Anwendungsliste',
'apps.view_trash' => 'Ansicht Papierkorb',
'apps.add_application' => 'Anwendung hinzufügen',
'apps.application_name' => 'Anwendungsname',
'apps.colour' => 'Farbe',
'apps.icon' => 'Symbol',
'apps.pinned' => 'Angeheftet',
'apps.title' => 'Titel',
'apps.hex' => 'Hex-Farbe',
'apps.username' => 'Benutzername',
'apps.password' => 'Passwort',
'apps.config' => 'Konfiguration',
'apps.only_admin_account' => 'Nur mit Admin-Konto!',
'url' => 'URL',
'title' => 'Titel',
'delete' => 'Löschen',
'optional' => 'Optional',
'restore' => 'Wiederherstellen',
'alert.success.item_created' => 'Element erfolgreich erstellt',
'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' => 'Die Einstellungen wurden übernommen',
'alert.error.not_exist' => 'Diese Einstellung existiert nicht.',
);
return [
'settings.system' => 'System',
'settings.appearance' => 'Aussehen',
'settings.miscellaneous' => 'Sonstiges',
'settings.version' => 'Version',
'settings.background_image' => 'Hintergrundbild',
'settings.homepage_search' => 'Startseite Sucheingabe',
'settings.search_provider' => 'Suchanbieter',
'settings.language' => 'Sprache',
'settings.reset' => 'Zurücksetzen auf Standard',
'settings.remove' => 'Entfernen',
'settings.search' => 'suche',
'settings.no_items' => 'Keine Elemente gefunden',
'settings.label' => 'Bezeichnung',
'settings.value' => 'Wert',
'settings.edit' => 'Bearbeiten',
'settings.view' => 'Ansicht',
'options.none' => '- nicht festgelegt -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.yes' => 'Ja',
'options.no' => 'Nein',
'buttons.save' => 'Speichern',
'buttons.cancel' => 'Abbrechen',
'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' => 'Anwendung neu hinzufügen',
'dash.link2' => 'anheften',
'dash.pinned_items' => 'Angeheftete Elemente',
'apps.app_list' => 'Anwendungsliste',
'apps.view_trash' => 'Ansicht Papierkorb',
'apps.add_application' => 'Anwendung hinzufügen',
'apps.application_name' => 'Anwendungsname',
'apps.colour' => 'Farbe',
'apps.icon' => 'Symbol',
'apps.pinned' => 'Angeheftet',
'apps.title' => 'Titel',
'apps.hex' => 'Hex-Farbe',
'apps.username' => 'Benutzername',
'apps.password' => 'Passwort',
'apps.config' => 'Konfiguration',
'apps.only_admin_account' => 'Nur mit Admin-Konto!',
'url' => 'URL',
'title' => 'Titel',
'delete' => 'Löschen',
'optional' => 'Optional',
'restore' => 'Wiederherstellen',
'alert.success.item_created' => 'Element erfolgreich erstellt',
'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' => 'Die Einstellungen wurden übernommen',
'alert.error.not_exist' => 'Diese Einstellung existiert nicht.',
];

View File

@@ -29,7 +29,6 @@ return [
'settings.search' => 'αναζήτηση',
'settings.no_items' => 'Δε βρεθηκαν αποτελέσματα',
'settings.label' => 'Ετικέτα',
'settings.value' => 'Τιμή',
'settings.edit' => 'Επεξεργασία',
@@ -116,5 +115,4 @@ return [
'alert.success.user_deleted' => 'Ο χρήστης διαγράφηκε επιτυχώς',
'alert.success.user_restored' => 'Ο χρήστης επαναφέρθηκε επιτυχώς',
];

View File

@@ -17,6 +17,6 @@ return [
'reset' => 'Έχει γίνει επαναφορά του κωδικού σας!',
'sent' => 'Σας στείλαμε ένα Ε-mail με τον σύνδεσμο για την επαναφορά του κωδικού πρόσβασής σας!',
'token' => 'Αυτό το token για την επαναφορά του κωδικού πρόσβασής σας είναι άκυρο.',
'user' => "Δεν μπορούμε να βρόυμε κάποιον χρήστη με αυτή τη διεύθυνση E-mail.",
'user' => 'Δεν μπορούμε να βρόυμε κάποιον χρήστη με αυτή τη διεύθυνση E-mail.',
];

View File

@@ -13,7 +13,7 @@ return [
'settings.appearance' => 'Appearance',
'settings.miscellaneous' => 'Miscellaneous',
'settings.advanced' => 'Advanced',
'settings.support' => 'Support',
'settings.donate' => 'Donate',
@@ -35,7 +35,7 @@ return [
'settings.value' => 'Value',
'settings.edit' => 'Edit',
'settings.view' => 'View',
'settings.custom_css' => 'Custom CSS',
'settings.custom_js' => 'Custom JavaScript',
@@ -83,7 +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',
@@ -121,5 +125,4 @@ return [
'alert.success.user_deleted' => 'User deleted successfully',
'alert.success.user_restored' => 'User restored successfully',
];

View File

@@ -1,60 +1,60 @@
<?php
return array (
'settings.system' => 'Sistema',
'settings.appearance' => 'Apariencia',
'settings.miscellaneous' => 'Miscelánea',
'settings.version' => 'Versión',
'settings.background_image' => 'Imagen De Fondo',
'settings.homepage_search' => 'Página De Inicio De Búsqueda',
'settings.search_provider' => 'Proveedor de búsqueda',
'settings.language' => 'Idioma',
'settings.reset' => 'Restablecer a predeterminado',
'settings.remove' => 'Quitar',
'settings.search' => 'búsqueda',
'settings.no_items' => 'No se encontraron elementos',
'settings.label' => 'Etiqueta',
'settings.value' => 'Valor',
'settings.edit' => 'Editar',
'settings.view' => 'Ver',
'options.none' => '- no establecido -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.jackett' => 'Jackett',
'options.yes' => 'Sí',
'options.no' => 'No',
'buttons.save' => 'Guardar',
'buttons.cancel' => 'Cancelar',
'buttons.add' => 'Añadir',
'buttons.upload' => 'Cargar un archivo',
'dash.pin_item' => 'Pin elemento al tablero',
'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 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' => 'Código de color hexadecimal',
'apps.username' => 'Nombre de usuario',
'apps.password' => 'Contraseña',
'apps.config' => 'Config',
'url' => 'Url',
'title' => 'Título',
'delete' => 'Borrar',
'optional' => 'Opcional',
'restore' => 'Restaurar',
'alert.success.item_created' => 'Elemento creado con éxito',
'alert.success.item_updated' => 'Artículo actualizado con éxito',
'alert.success.item_deleted' => 'Elemento eliminado correctamente',
'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.',
);
return [
'settings.system' => 'Sistema',
'settings.appearance' => 'Apariencia',
'settings.miscellaneous' => 'Miscelánea',
'settings.version' => 'Versión',
'settings.background_image' => 'Imagen De Fondo',
'settings.homepage_search' => 'Página De Inicio De Búsqueda',
'settings.search_provider' => 'Proveedor de búsqueda',
'settings.language' => 'Idioma',
'settings.reset' => 'Restablecer a predeterminado',
'settings.remove' => 'Quitar',
'settings.search' => 'búsqueda',
'settings.no_items' => 'No se encontraron elementos',
'settings.label' => 'Etiqueta',
'settings.value' => 'Valor',
'settings.edit' => 'Editar',
'settings.view' => 'Ver',
'options.none' => '- no establecido -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.jackett' => 'Jackett',
'options.yes' => 'Sí',
'options.no' => 'No',
'buttons.save' => 'Guardar',
'buttons.cancel' => 'Cancelar',
'buttons.add' => 'Añadir',
'buttons.upload' => 'Cargar un archivo',
'dash.pin_item' => 'Pin elemento al tablero',
'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 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' => 'Código de color hexadecimal',
'apps.username' => 'Nombre de usuario',
'apps.password' => 'Contraseña',
'apps.config' => 'Config',
'url' => 'Url',
'title' => 'Título',
'delete' => 'Borrar',
'optional' => 'Opcional',
'restore' => 'Restaurar',
'alert.success.item_created' => 'Elemento creado con éxito',
'alert.success.item_updated' => 'Artículo actualizado con éxito',
'alert.success.item_deleted' => 'Elemento eliminado correctamente',
'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.',
];

View File

@@ -1,115 +1,104 @@
<?php
return array (
'settings.system' => 'Järjestelmä',
'settings.appearance' => 'Ulkonäkö',
'settings.miscellaneous' => 'Sekalainen',
'settings.support' => 'Tue',
'settings.donate' => 'Lahjoita',
return [
'settings.system' => 'Järjestelmä',
'settings.appearance' => 'Ulkonäkö',
'settings.miscellaneous' => 'Sekalainen',
'settings.support' => 'Tue',
'settings.donate' => 'Lahjoita',
'settings.version' => 'Versio',
'settings.background_image' => 'Taustakuva',
'settings.window_target' => 'Linkit aukeaa',
'settings.window_target.current' => 'Avaa tässä välilehdessä',
'settings.window_target.one' => 'Avaa samassa välilehdessä',
'settings.window_target.new' => 'Avaa uudessa välilehdessä',
'settings.homepage_search' => 'Kotisivu Haku',
'settings.search_provider' => 'Hakupalvelu',
'settings.language' => 'Kieli',
'settings.reset' => 'Palauta oletusasetukset',
'settings.remove' => 'Poista',
'settings.search' => 'haku',
'settings.no_items' => 'Kohteita ei löytynyt',
'settings.version' => 'Versio',
'settings.background_image' => 'Taustakuva',
'settings.window_target' => 'Linkit aukeaa',
'settings.window_target.current' => 'Avaa tässä välilehdessä',
'settings.window_target.one' => 'Avaa samassa välilehdessä',
'settings.window_target.new' => 'Avaa uudessa välilehdessä',
'settings.homepage_search' => 'Kotisivu Haku',
'settings.search_provider' => 'Hakupalvelu',
'settings.language' => 'Kieli',
'settings.reset' => 'Palauta oletusasetukset',
'settings.remove' => 'Poista',
'settings.search' => 'haku',
'settings.no_items' => 'Kohteita ei löytynyt',
'settings.label' => 'Etiketti',
'settings.value' => 'Arvo',
'settings.edit' => 'Muokkaa',
'settings.view' => 'Näkymä',
'settings.label' => 'Etiketti',
'settings.value' => 'Arvo',
'settings.edit' => 'Muokkaa',
'settings.view' => 'Näkymä',
'options.none' => '- ei asetettu -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.startpage' => 'Etusivu',
'options.yes' => 'Kyllä',
'options.no' => 'Ei',
'buttons.save' => 'Tallenna',
'buttons.cancel' => 'Peruuta',
'buttons.add' => 'Lisää',
'buttons.upload' => 'Lataa tiedosto',
'buttons.downloadapps' => 'Päivitä sovelluslistaa',
'options.none' => '- ei asetettu -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.startpage' => 'Etusivu',
'options.yes' => 'Kyllä',
'options.no' => 'Ei',
'dash.pin_item' => 'Kiinnitä kohde hallintapaneliin',
'dash.no_apps' => 'Tällä hetkellä ei ole kiinnitettyjä sovelluksia :link1 tai :link2',
'dash.link1' => 'Lisää sovellus tähän',
'dash.link2' => 'Kiinnitä kohde hallintapaneliin',
'dash.pinned_items' => 'Kiinnitetyt Kohteet',
'apps.app_list' => 'Sovellusluettelo',
'apps.view_trash' => 'Näytä roskakori',
'apps.add_application' => 'Lisää sovellus',
'apps.application_name' => 'Sovelluksen nimi',
'apps.colour' => 'Väri',
'apps.icon' => 'Kuvake',
'apps.pinned' => 'Kiinnitetty',
'apps.title' => 'Otsikko',
'apps.hex' => 'Hex väri',
'apps.username' => 'Käyttäjätunnus',
'apps.password' => 'Salasana',
'apps.config' => 'Konfiguraatio',
'apps.apikey' => 'API Avain',
'apps.enable' => 'Aktivoi',
'apps.tag_list' => 'Tagi lista',
'apps.add_tag' => 'Lisää tagi',
'apps.tag_name' => 'Tagin nimi',
'apps.tags' => 'Tagit',
'apps.override' => 'Jos eri kuin pää-osoite',
'apps.preview' => 'Esikatsele',
'buttons.save' => 'Tallenna',
'buttons.cancel' => 'Peruuta',
'buttons.add' => 'Lisää',
'buttons.upload' => 'Lataa tiedosto',
'buttons.downloadapps' => 'Päivitä sovelluslistaa',
'user.user_list' => 'Käyttäjät',
'user.add_user' => 'Lisää käyttäjä',
'user.username' => 'Käyttäjänimi',
'user.avatar' => 'Avatar',
'user.email' => 'Sähköposti',
'user.password_confirm' => 'Vahvista salasana',
'user.secure_front' => 'Salli yleinen pääsy etusivulle - Pakotetaan ainoastaan jos salasana on asetettu.',
'user.autologin' => 'Salli sisäänkirjautuminen tietystä URLista. Linkilläk uka tahansa pystyy kirjautua.',
'url' => 'Url',
'title' => 'Otsikko',
'delete' => 'Poistaa',
'optional' => 'Valinnainen',
'restore' => 'Palauta',
'dash.pin_item' => 'Kiinnitä kohde hallintapaneliin',
'dash.no_apps' => 'Tällä hetkellä ei ole kiinnitettyjä sovelluksia :link1 tai :link2',
'dash.link1' => 'Lisää sovellus tähän',
'dash.link2' => 'Kiinnitä kohde hallintapaneliin',
'dash.pinned_items' => 'Kiinnitetyt Kohteet',
'alert.success.item_created' => 'Kohde luotu onnistuneesti',
'alert.success.item_updated' => 'Kohde päivitetty onnistuneesti',
'alert.success.item_deleted' => 'Kohde poistettu onnistuneesti',
'alert.success.item_restored' => 'Kohde palautettu onnistuneesti',
'alert.success.tag_created' => 'Tagi luotu onnistuneesti',
'alert.success.tag_updated' => 'Tagi päivitetty onnistuneesti',
'alert.success.tag_deleted' => 'Tagi poistettu onnistuneesti',
'alert.success.tag_restored' => 'Tagi palautettu onnistuneesti',
'alert.success.updating' => 'Päivitetään sovelluslistaa',
'apps.app_list' => 'Sovellusluettelo',
'apps.view_trash' => 'Näytä roskakori',
'apps.add_application' => 'Lisää sovellus',
'apps.application_name' => 'Sovelluksen nimi',
'apps.colour' => 'Väri',
'apps.icon' => 'Kuvake',
'apps.pinned' => 'Kiinnitetty',
'apps.title' => 'Otsikko',
'apps.hex' => 'Hex väri',
'apps.username' => 'Käyttäjätunnus',
'apps.password' => 'Salasana',
'apps.config' => 'Konfiguraatio',
'apps.apikey' => 'API Avain',
'apps.enable' => 'Aktivoi',
'apps.tag_list' => 'Tagi lista',
'apps.add_tag' => 'Lisää tagi',
'apps.tag_name' => 'Tagin nimi',
'apps.tags' => 'Tagit',
'apps.override' => 'Jos eri kuin pää-osoite',
'apps.preview' => 'Esikatsele',
'alert.success.setting_updated' => 'Asetus muokattu onnistuneesti',
'alert.error.not_exist' => 'Tätä asetusta ei ole olemassa.',
'user.user_list' => 'Käyttäjät',
'user.add_user' => 'Lisää käyttäjä',
'user.username' => 'Käyttäjänimi',
'user.avatar' => 'Avatar',
'user.email' => 'Sähköposti',
'user.password_confirm' => 'Vahvista salasana',
'user.secure_front' => 'Salli yleinen pääsy etusivulle - Pakotetaan ainoastaan jos salasana on asetettu.',
'user.autologin' => 'Salli sisäänkirjautuminen tietystä URLista. Linkilläk uka tahansa pystyy kirjautua.',
'url' => 'Url',
'title' => 'Otsikko',
'delete' => 'Poistaa',
'optional' => 'Valinnainen',
'restore' => 'Palauta',
'alert.success.item_created' => 'Kohde luotu onnistuneesti',
'alert.success.item_updated' => 'Kohde päivitetty onnistuneesti',
'alert.success.item_deleted' => 'Kohde poistettu onnistuneesti',
'alert.success.item_restored' => 'Kohde palautettu onnistuneesti',
'alert.success.tag_created' => 'Tagi luotu onnistuneesti',
'alert.success.tag_updated' => 'Tagi päivitetty onnistuneesti',
'alert.success.tag_deleted' => 'Tagi poistettu onnistuneesti',
'alert.success.tag_restored' => 'Tagi palautettu onnistuneesti',
'alert.success.updating' => 'Päivitetään sovelluslistaa',
'alert.success.setting_updated' => 'Asetus muokattu onnistuneesti',
'alert.error.not_exist' => 'Tätä asetusta ei ole olemassa.',
'alert.success.user_created' => 'Käyttäjä luotu onnistuneesti',
'alert.success.user_updated' => 'Käyttäjä päivitetty onnistuneesti',
'alert.success.user_deleted' => 'Käyttäjä poistettu onnistuneesti',
'alert.success.user_restored' => 'Käyttäjä palautettu onnistuneesti',
);
'alert.success.user_created' => 'Käyttäjä luotu onnistuneesti',
'alert.success.user_updated' => 'Käyttäjä päivitetty onnistuneesti',
'alert.success.user_deleted' => 'Käyttäjä poistettu onnistuneesti',
'alert.success.user_restored' => 'Käyttäjä palautettu onnistuneesti',
];

View File

@@ -1,111 +1,114 @@
<?php
return array (
'settings.system' => 'Système',
'settings.appearance' => 'Apparence',
'settings.miscellaneous' => 'Divers',
'settings.support' => 'Support',
'settings.donate' => 'Contribuer',
'settings.version' => 'Version',
'settings.background_image' => 'Image d\'arrière-plan',
'settings.window_target' => 'Ouverture des liens',
'settings.window_target.current' => 'Dans l\'onglet courant',
'settings.window_target.one' => 'Dans le même nouvel onglet',
'settings.window_target.new' => 'Dans un nouvel onglet',
'settings.homepage_search' => 'Barre de recherche',
'settings.search_provider' => 'Moteur de recherche',
'settings.language' => 'Langue',
'settings.reset' => 'Réinitialiser les valeurs par défaut',
'settings.remove' => 'Supprimer',
'settings.search' => 'Chercher',
'settings.no_items' => 'Aucun élement trouvé',
'settings.label' => 'Étiquette',
'settings.value' => 'Valeur',
'settings.edit' => 'Modifier',
'settings.view' => 'Vue',
'options.none' => '- non défini -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'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',
'dash.link1' => 'Ajouter une application',
'dash.link2' => 'Épingler une application au tableau de bord',
'dash.pinned_items' => 'Applications épinglées',
'apps.app_list' => 'Liste des applications',
'apps.view_trash' => 'Voir la corbeille',
'apps.add_application' => 'Ajouter une application',
'apps.application_name' => 'Nom de l\'application',
'apps.colour' => 'Couleur',
'apps.icon' => 'Icône',
'apps.pinned' => 'Épinglée',
'apps.title' => 'Titre',
'apps.hex' => 'Hexadécimal de la couleur',
'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!',
return [
'settings.system' => 'Système',
'settings.appearance' => 'Apparence',
'settings.miscellaneous' => 'Divers',
'settings.support' => 'Support',
'settings.donate' => 'Contribuer',
'settings.advanced' => 'Options avancées',
'dashboard' => 'Tableau de bord',
'settings.version' => 'Version',
'settings.background_image' => 'Image d\'arrière-plan',
'settings.window_target' => 'Ouverture des liens',
'settings.window_target.current' => 'Dans l\'onglet courant',
'settings.window_target.one' => 'Dans le même nouvel onglet',
'settings.window_target.new' => 'Dans un nouvel onglet',
'settings.homepage_search' => 'Barre de recherche',
'settings.search_provider' => 'Moteur de recherche',
'settings.language' => 'Langue',
'settings.reset' => 'Réinitialiser les valeurs par défaut',
'settings.remove' => 'Supprimer',
'settings.search' => 'Chercher',
'settings.no_items' => 'Aucun élement trouvé',
'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.',
'settings.label' => 'Étiquette',
'settings.value' => 'Valeur',
'settings.edit' => 'Modifier',
'settings.view' => 'Vue',
'url' => 'Url',
'title' => 'Titre',
'delete' => 'Effacer',
'optional' => 'Optionnel',
'restore' => 'Restaurer',
'alert.success.item_created' => 'Application créée avec succès',
'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',
'alert.success.tag_deleted' => 'Label supprimé avec succès',
'alert.success.tag_restored' => 'Label restauré avec succès',
'alert.success.setting_updated' => 'Paramètre mis à jour avec succès',
'alert.error.not_exist' => 'Ce paramètre n\'existe pas.',
'alert.success.user_created' => 'Utilisateur crée avec succès',
'alert.success.user_updated' => 'Utilisateur mis à jour avec succès',
'alert.success.user_deleted' => 'Utilisateur supprimé avec succès',
'alert.success.user_restored' => 'Utilisateur restoré avec succès',
);
'options.none' => '- non défini -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'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',
'dash.link1' => 'Ajouter une application',
'dash.link2' => 'Épingler une application au tableau de bord',
'dash.pinned_items' => 'Applications épinglées',
'apps.app_list' => 'Liste des applications',
'apps.view_trash' => 'Voir la corbeille',
'apps.add_application' => 'Ajouter une application',
'apps.application_name' => 'Nom de l\'application',
'apps.colour' => 'Couleur',
'apps.icon' => 'Icône',
'apps.pinned' => 'Épinglée',
'apps.title' => 'Titre',
'apps.hex' => 'Hexadécimal de la couleur',
'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!',
'apps.autologin_url' => 'URL de connexion automatique',
'apps.show_deleted' => 'Afficher les applications supprimées',
'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',
'optional' => 'Optionnel',
'restore' => 'Restaurer',
'alert.success.item_created' => 'Application créée avec succès',
'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',
'alert.success.tag_deleted' => 'Label supprimé avec succès',
'alert.success.tag_restored' => 'Label restauré avec succès',
'alert.success.setting_updated' => 'Paramètre mis à jour avec succès',
'alert.error.not_exist' => 'Ce paramètre n\'existe pas.',
'alert.success.user_created' => 'Utilisateur crée avec succès',
'alert.success.user_updated' => 'Utilisateur mis à jour avec succès',
'alert.success.user_deleted' => 'Utilisateur supprimé avec succès',
'alert.success.user_restored' => 'Utilisateur restoré avec succès',
];

View File

@@ -17,6 +17,6 @@ return [
'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.",
'user' => 'Nous ne pouvons pas trouver un utilisateur avec cette adresse e-mail.',
];

View File

@@ -29,7 +29,6 @@ return [
'settings.search' => 'keresés',
'settings.no_items' => 'Nincs találat',
'settings.label' => 'Címke',
'settings.value' => 'Érték',
'settings.edit' => 'Módosítás',
@@ -90,8 +89,7 @@ return [
'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',
@@ -117,5 +115,4 @@ return [
'alert.success.user_deleted' => 'Felhasználó sikeresen törölve',
'alert.success.user_restored' => 'Felhasználó sikeresen visszaállítva',
];

View File

@@ -18,6 +18,6 @@ return [
'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ó",
'user' => 'Ezzel az e-mail címmel felhasználó nem található',
];

View File

@@ -1,4 +1,5 @@
<?php
return [
/*
|--------------------------------------------------------------------------
@@ -9,13 +10,13 @@ return [
'settings.system' => 'Sistema',
'settings.appearance' => 'Aspetto',
'settings.miscellaneous' => 'Altre impostazioni',
'settings.support' => 'Supporto',
'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' => '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',
@@ -25,34 +26,34 @@ return [
'settings.remove' => 'Rimuovi',
'settings.search' => 'Cerca',
'settings.no_items' => 'Nessun elemento trovato',
'settings.label' => 'Nome',
'settings.value' => 'Valore',
'settings.edit' => 'Modifica',
'settings.view' => 'Mostra',
'settings.label' => 'Nome',
'settings.value' => 'Valore',
'settings.edit' => 'Modifica',
'settings.view' => 'Mostra',
'options.none' => '- non impostato -',
'options.google' => 'Google',
'options.ddg' => 'DuckDuckGo',
'options.bing' => 'Bing',
'options.qwant' => 'Qwant',
'options.startpage' => 'StartPage',
'options.startpage' => 'StartPage',
'options.yes' => 'Sì',
'options.no' => 'No',
'options.nzbhydra' => 'NZBHydra',
'options.nzbhydra' => 'NZBHydra',
'buttons.save' => 'Salva',
'buttons.cancel' => 'Annulla',
'buttons.add' => 'Aggiungi',
'buttons.upload' => 'Carica un file',
'buttons.downloadapps' => 'Aggiorna lista app',
'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 applicazioni',
'apps.view_trash' => 'Mostra cestino',
'apps.add_application' => 'Aggiungi applicazione',
@@ -67,47 +68,47 @@ return [
'apps.config' => 'Configurazione',
'apps.apikey' => 'Chiave API',
'apps.enable' => 'Abilitato',
'apps.tag_list' => 'Lista tag',
'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',
'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.',
'user.autologin' => 'Abilita login da una URL specifica. Chiunque con questa URL può accedere.',
'url' => 'Url',
'title' => 'Titolo',
'delete' => 'Elimina',
'optional' => 'Opzionale',
'restore' => 'Ripristina',
'delete' => 'Elimina',
'optional' => 'Opzionale',
'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.updating' => 'Aggiornamento lista app',
'alert.success.tag_created' => 'Tag creato con successo',
'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',
];
];

View File

@@ -1,4 +1,5 @@
<?php
return [
/*
|--------------------------------------------------------------------------

View File

@@ -1,4 +1,5 @@
<?php
return [
/*
|--------------------------------------------------------------------------

View File

@@ -29,7 +29,6 @@ return [
'settings.search' => '검색',
'settings.no_items' => '항목을 찾을 수 없음',
'settings.label' => '레이블',
'settings.value' => '값',
'settings.edit' => '편집',
@@ -116,5 +115,4 @@ return [
'alert.success.user_deleted' => '사용자를 성공적으로 제거했습니다',
'alert.success.user_restored' => '사용자를 성공적으로 복원했습니다',
];

View File

@@ -17,6 +17,6 @@ return [
'reset' => '암호가 재설정되었습니다!',
'sent' => '암호 재설정 링크를 전자 메일로 전송했습니다!',
'token' => '이 암호 재설정 토큰은 잘못되었습니다.',
'user' => "해당 이메일 주소를 가진 사용자를 찾을 수 없습니다.",
'user' => '해당 이메일 주소를 가진 사용자를 찾을 수 없습니다.',
];

View File

@@ -29,7 +29,6 @@ return [
'settings.search' => 'Zoeken',
'settings.no_items' => 'Geen items gevonden',
'settings.label' => 'Label',
'settings.value' => 'Waarde',
'settings.edit' => 'Bewerken',
@@ -91,7 +90,7 @@ return [
'url' => 'URL',
'title' => 'Titel',
'delete' => 'Verwijderen',
'optional' => 'Optioneel',
'optional' => 'Optioneel',
'restore' => 'Herstellen',
'alert.success.item_created' => 'Item met succes aangemaakt',
@@ -113,5 +112,4 @@ return [
'alert.success.user_deleted' => 'Gebruiker met succes verwijderd',
'alert.success.user_restored' => 'Gebruiker met succes hersteld',
];

View File

@@ -17,6 +17,6 @@ return [
'reset' => 'Uw wachtwoord is opnieuw ingesteld!',
'sent' => 'De link voor het opnieuw instellen van uw wachtwoord is naar u gemaild!',
'token' => 'Deze token voor het opnieuw instellen van een wachtwoord is ongeldig.',
'user' => "Er bestaat geen gebruiker met het opgegeven e-mailadres.",
'user' => 'Er bestaat geen gebruiker met het opgegeven e-mailadres.',
];

View File

@@ -22,12 +22,11 @@ return [
'settings.remove' => 'Fjern',
'settings.search' => 'søk',
'settings.no_items' => 'Ingen funn',
'settings.label' => 'Merkelapp',
'settings.value' => 'Verdi',
'settings.edit' => 'Endre',
'settings.view' => 'Se',
'settings.label' => 'Merkelapp',
'settings.value' => 'Verdi',
'settings.edit' => 'Endre',
'settings.view' => 'Se',
'options.none' => '- ikke valgt -',
'options.google' => 'Google',
@@ -65,9 +64,9 @@ return [
'url' => 'Url',
'title' => 'Tittel',
'delete' => 'Slett',
'optional' => 'Valgfritt',
'restore' => 'Tilbakestill',
'delete' => 'Slett',
'optional' => 'Valgfritt',
'restore' => 'Tilbakestill',
'alert.success.item_created' => 'Objektet ble opprettet',
'alert.success.item_updated' => 'Objektet ble oppdatert',
@@ -77,5 +76,4 @@ return [
'alert.success.setting_updated' => 'Du har oppdatert denne innstillingen',
'alert.error.not_exist' => 'Denne innstillingen eksisterer ikke.',
];

View File

@@ -17,6 +17,6 @@ return [
'reset' => 'Passordet ditt har blitt tilbakestilt!',
'sent' => 'Vi har sendt deg en e-post med en tilbakestillingslink for ditt passord!',
'token' => 'Denne tilgangstoken er ikke gyldig.',
'user' => "Vi fant ingen med den e-postadressen.",
'user' => 'Vi fant ingen med den e-postadressen.',
];

View File

@@ -22,12 +22,11 @@ return [
'settings.remove' => 'Usuń',
'settings.search' => 'szukaj',
'settings.no_items' => 'Nic nie znaleziono',
'settings.label' => 'Etykieta',
'settings.value' => 'Wartość',
'settings.edit' => 'Edytuj',
'settings.view' => 'Widok',
'settings.label' => 'Etykieta',
'settings.value' => 'Wartość',
'settings.edit' => 'Edytuj',
'settings.view' => 'Widok',
'options.none' => '- not set -',
'options.google' => 'Google',
@@ -65,9 +64,9 @@ return [
'url' => 'URL',
'title' => 'Tytuł',
'delete' => 'Usuń',
'optional' => 'Opcjonalny',
'restore' => 'Przywróć',
'delete' => 'Usuń',
'optional' => 'Opcjonalny',
'restore' => 'Przywróć',
'alert.success.item_created' => 'Element utworzony',
'alert.success.item_updated' => 'Element zaktualizowany',
@@ -77,5 +76,4 @@ return [
'alert.success.setting_updated' => 'Ustawienie zostało zaktualizowane',
'alert.error.not_exist' => 'Takie ustawienie nie istnieje',
];

View File

@@ -29,7 +29,6 @@ return [
'settings.search' => 'procura',
'settings.no_items' => 'Nenhum item encontrado',
'settings.label' => 'Etiqueta',
'settings.value' => 'Valor',
'settings.edit' => 'Editar',
@@ -112,5 +111,4 @@ return [
'alert.success.user_deleted' => 'Utilizador apagada com sucesso',
'alert.success.user_restored' => 'Utilizador restaurada com sucesso',
];

View File

@@ -17,6 +17,6 @@ return [
'reset' => 'A sua palavra-passe foi restabelecida!',
'sent' => 'Enviámos-lhe por email o seu link de restauro de palavra-passe!',
'token' => 'Este token de restabelecimento de palavra-passe é inválido.',
'user' => "Não conseguimos encontrar nenhum utilizador com este endereço de email.",
'user' => 'Não conseguimos encontrar nenhum utilizador com este endereço de email.',
];

View File

@@ -29,7 +29,6 @@ return [
'settings.search' => 'найти',
'settings.no_items' => 'Ничего не найдено',
'settings.label' => 'Метка',
'settings.value' => 'Значение',
'settings.edit' => 'Редактировать',
@@ -116,5 +115,4 @@ return [
'alert.success.user_deleted' => 'Пользователь удален успешно',
'alert.success.user_restored' => 'Пользователь восстановлен успешно',
];

Some files were not shown because too many files have changed in this diff Show More