Compare commits

..

No commits in common. "master" and "3.5.0" have entirely different histories.

71 changed files with 2005 additions and 5534 deletions

View file

@ -12,7 +12,7 @@ jobs:
strategy:
matrix:
operating-system: [ubuntu-latest]
php-versions: ["7.3", "7.4", "8.0", "8.1", "8.2"]
php-versions: ["7.2", "7.3", "7.4", "8.0"]
steps:
- uses: actions/checkout@v2

View file

@ -5,58 +5,6 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
## [3.7.0] - 2024-01-14
### Added
- Added support for vanity urls.
- Added KDE integration for linux script.
### Changed
- Updated translations.
- File preview is now clickable to open the file.
### Fixed
- Fixes for LDAP authentication.
## [3.6.3] - 2023-05-27
### Fixed
- Fix LDAP for php >= 8.1
## [3.6.2] - 2023-05-24
### Changed
- Support for PHP 8.2
### Removed
- Azure blob storage driver
## [3.6.1] - 2022-11-27
### Changed
- Upgraded dependencies
- Updated translations
### Fixed
- Fixed error in export data (#499)
- Fixed issues with reverse proxies (#495)
- Fixed duplicated twitter tags
## [3.6.0] - 2022-06-20
### Changed
- Improved embedding on discord of large videos.
- Releases are now compressed for faster downloads
- Updated translations
### Fixed
- Fixed deprecation notices on php >= 8
- Fixed embed UA for Discord.
- Fixed error with post_max_size = 0
### Removed
- Support for php 7.2
## [3.5.1] - 2021-10-22
### Changed
- Fixed embed UA for Discord.
- Updated translations.
## [3.5.0] - 2021-09-05
### Added
- Support for theme-park.dev themes.

View file

@ -128,6 +128,33 @@ module.exports = function (grunt) {
],
},
},
zip: {
[releaseFilename]: [
'app/**/*',
'bin/**/*',
'bootstrap/**/*',
'install/**/*',
'logs/**/',
'resources/cache',
'resources/sessions',
'resources/database',
'resources/lang/**/*',
'resources/templates/**/*',
'resources/schemas/**/*',
'resources/lang/**/*',
'resources/uploaders/**/*',
'static/**/*',
'vendor/**/*',
'.htaccess',
'config.example.php',
'index.php',
'composer.json',
'composer.lock',
'LICENSE',
'favicon.ico',
'CHANGELOG.md'
]
},
shell: {
phpstan: {
@ -136,47 +163,7 @@ module.exports = function (grunt) {
composer_no_dev: {
command: 'composer install --no-dev --prefer-dist'
}
},
compress: {
main: {
options: {
archive: releaseFilename,
mode: 'zip',
level: 9,
},
files: [{
expand: true,
cwd: './',
src: [
'app/**/*',
'bin/**/*',
'bootstrap/**/*',
'install/**/*',
'logs/**/',
'resources/cache',
'resources/sessions',
'resources/database',
'resources/lang/**/*',
'resources/templates/**/*',
'resources/schemas/**/*',
'resources/lang/**/*',
'resources/uploaders/**/*',
'static/**/*',
'vendor/**/*',
'.htaccess',
'config.example.php',
'index.php',
'composer.json',
'composer.lock',
'LICENSE',
'favicon.ico',
'CHANGELOG.md'
],
dest: '/'
}]
}
},
}
});
@ -185,5 +172,5 @@ module.exports = function (grunt) {
grunt.registerTask('test', ['jshint']);
grunt.registerTask('phpstan', ['shell:phpstan']);
grunt.registerTask('composer_no_dev', ['shell:composer_no_dev']);
grunt.registerTask('build-release', ['default', 'composer_no_dev', 'compress']);
grunt.registerTask('build-release', ['default', 'composer_no_dev', 'zip']);
};

View file

@ -34,15 +34,15 @@ class AdminController extends Controller
);
return view()->render($response, 'dashboard/system.twig', [
'usersCount' => $this->database->query('SELECT COUNT(*) AS `count` FROM `users`')->fetch()->count,
'mediasCount' => $this->database->query('SELECT COUNT(*) AS `count` FROM `uploads`')->fetch()->count,
'orphanFilesCount' => $this->database->query('SELECT COUNT(*) AS `count` FROM `uploads` WHERE `user_id` IS NULL')->fetch()->count,
'totalSize' => humanFileSize($this->database->query('SELECT SUM(`current_disk_quota`) AS `sum` FROM `users`')->fetch()->sum ?? 0),
'usersCount' => $usersCount = $this->database->query('SELECT COUNT(*) AS `count` FROM `users`')->fetch()->count,
'mediasCount' => $mediasCount = $this->database->query('SELECT COUNT(*) AS `count` FROM `uploads`')->fetch()->count,
'orphanFilesCount' => $orphanFilesCount = $this->database->query('SELECT COUNT(*) AS `count` FROM `uploads` WHERE `user_id` IS NULL')->fetch()->count,
'totalSize' => humanFileSize($totalSize = $this->database->query('SELECT SUM(`current_disk_quota`) AS `sum` FROM `users`')->fetch()->sum ?? 0),
'post_max_size' => ini_get('post_max_size'),
'upload_max_filesize' => ini_get('upload_max_filesize'),
'installed_lang' => $this->lang->getList(),
'forced_lang' => $request->getAttribute('forced_lang'),
'php_version' => PHP_VERSION,
'php_version' => phpversion(),
'max_memory' => ini_get('memory_limit'),
'settings' => $settings,
]);

View file

@ -27,7 +27,7 @@ abstract class AuthController extends Controller
/**
* Connects to LDAP server and logs in with service account (if configured)
* @return \LDAP\Connection|resource|false
* @return resource|false
*/
public function ldapConnect()
{
@ -39,7 +39,7 @@ abstract class AuthController extends Controller
$ldapSchema=(@is_string($this->config['ldap']['schema'])) ?
strtolower($this->config['ldap']['schema']) : 'ldap';
$ldapURI="$ldapSchema://".$this->config['ldap']['host'].':'.$this->config['ldap']['port'];
// Connecting to LDAP server
$this->logger->debug("Connecting to $ldapURI");
$server = ldap_connect($ldapURI);
@ -48,18 +48,18 @@ abstract class AuthController extends Controller
ldap_set_option($server, LDAP_OPT_REFERRALS, 0);
ldap_set_option($server, LDAP_OPT_NETWORK_TIMEOUT, 10);
} else {
$this->logger->error('LDAP-URI was not parseable');
$this->logger->error(ldap_error($server));
return false;
}
// Upgrade to StartTLS
$useStartTLS = @is_bool($this->config['ldap']['useStartTLS']) ? $this->config['ldap']['useStartTLS'] : false;
if (($useStartTLS === true) && (ldap_start_tls($server) === false)) {
$this->logger->debug(ldap_error($server));
$this->logger-debug(ldap_error($server));
$this->logger->error("Failed to establish secure LDAP swith StartTLS");
return false;
}
// Authenticating LDAP service account (if configured)
$serviceAccountFQDN= (@is_string($this->config['ldap']['service_account_dn'])) ?
$this->config['ldap']['service_account_dn'] : null;
@ -77,7 +77,7 @@ abstract class AuthController extends Controller
/**
* Returns User's LDAP DN
* @param string $username
* @param \LDAP\Connection|resource $server LDAP Server Resource
* @param resource $server LDAP Server Resource
* @return string|null
*/
protected function getLdapRdn(string $username, $server)
@ -85,7 +85,7 @@ abstract class AuthController extends Controller
//Dynamic LDAP User Binding
if (@is_string($this->config['ldap']['search_filter'])) {
//Replace ???? with username
$searchFilter = str_replace('????', ldap_escape($username, '', LDAP_ESCAPE_FILTER), $this->config['ldap']['search_filter']);
$searchFilter = str_replace('????', ldap_escape($username, null, LDAP_ESCAPE_FILTER), $this->config['ldap']['search_filter']);
$ldapAddributes = array('dn');
$this->logger->debug("LDAP Search filter: $searchFilter");
$ldapSearchResp = ldap_search(
@ -94,7 +94,7 @@ abstract class AuthController extends Controller
$searchFilter,
$ldapAddributes
);
if (!$ldapSearchResp) {
if (!is_resource($ldapSearchResp)) {
$this->logger->debug(ldap_error($server));
$this->logger->error("User LDAP search for user $username failed");
return null;
@ -112,7 +112,7 @@ abstract class AuthController extends Controller
if ($this->config['ldap']['user_domain'] !== null) {
$bindString .= ','.$this->config['ldap']['user_domain'];
}
if ($this->config['ldap']['base_domain'] !== null) {
$bindString .= ','.$this->config['ldap']['base_domain'];
}

View file

@ -51,7 +51,7 @@ class LoginController extends AuthController
$password = param($request, 'password');
$user = $this->database->query('SELECT `id`, `email`, `username`, `password`,`is_admin`, `active`, `current_disk_quota`, `max_disk_quota`, `ldap`, `copy_raw` FROM `users` WHERE `username` = ? OR `email` = ? LIMIT 1', [$username, $username])->fetch();
if ($this->config['ldap']['enabled'] && (!$user || $user->ldap ?? true)) {
if ($this->config['ldap']['enabled'] && ($user->ldap ?? true)) {
$user = $this->ldapLogin($request, $username, param($request, 'password'), $user);
}

View file

@ -11,6 +11,7 @@ use Slim\Exception\HttpNotFoundException;
class PasswordRecoveryController extends AuthController
{
/**
* @param Response $response
* @return Response

View file

@ -13,6 +13,7 @@ use Slim\Exception\HttpNotFoundException;
class RegisterController extends AuthController
{
/**
* @param Request $request
* @param Response $response

View file

@ -114,35 +114,4 @@ class ClientController extends Controller
]
);
}
/**
* @param Request $request
* @param Response $response
* @param int $id
*
* @return Response
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
public function getKDEScript(Request $request, Response $response, int $id): Response
{
$user = make(UserRepository::class)->get($request, $id, true);
if (!$user->token) {
$this->session->alert(lang('no_upload_token'), 'danger');
return redirect($response, $request->getHeaderLine('Referer'));
}
return view()->render(
$response->withHeader('Content-Disposition', 'attachment;filename="xbackbone_uploader_'.$user->username.'.sh"'),
'scripts/xbackbone_kde_uploader.sh.twig',
[
'username' => $user->username,
'upload_url' => route('upload'),
'token' => $user->token,
]
);
}
}

View file

@ -25,7 +25,7 @@ class ExportController extends Controller
$medias = $this->database->query('SELECT `uploads`.`filename`, `uploads`.`storage_path` FROM `uploads` WHERE `user_id` = ?', $user->id);
$this->logger->info("User $user->id, $user->username, exporting data...");
$this->logger->info("User $user->id, $user->name, exporting data...");
set_time_limit(0);
ob_end_clean();

View file

@ -4,6 +4,7 @@ namespace App\Controllers;
use App\Database\Repositories\UserRepository;
use App\Web\UA;
use GuzzleHttp\Psr7\Stream;
use Intervention\Image\Constraint;
use Intervention\Image\ImageManagerStatic as Image;
use League\Flysystem\FileNotFoundException;
@ -13,7 +14,6 @@ use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Exception\HttpBadRequestException;
use Slim\Exception\HttpNotFoundException;
use Slim\Exception\HttpUnauthorizedException;
use Slim\Psr7\Stream;
class MediaController extends Controller
{
@ -53,6 +53,10 @@ class MediaController extends Controller
$userAgent = $request->getHeaderLine('User-Agent');
$mime = $filesystem->getMimetype($media->storage_path);
if (UA::isBot($userAgent) && !(UA::embedsLinks($userAgent) && isDisplayableImage($mime) && $this->getSetting('image_embeds') === 'on')) {
return $this->streamMedia($request, $response, $filesystem, $media);
}
try {
$media->mimetype = $mime;
$media->extension = pathinfo($media->filename, PATHINFO_EXTENSION);
@ -76,22 +80,6 @@ class MediaController extends Controller
throw new HttpNotFoundException($request);
}
if (
UA::isBot($userAgent) &&
!(
// embed if enabled
(UA::embedsLinks($userAgent) &&
isEmbeddable($mime) &&
$this->getSetting('image_embeds') === 'on') ||
// if the file is too large to be displayed as non embedded
(UA::embedsLinks($userAgent) &&
isEmbeddable($mime) &&
$size >= (8 * 1024 * 1024))
)
) {
return $this->streamMedia($request, $response, $filesystem, $media);
}
return view()->render($response, 'upload/public.twig', [
'delete_token' => $token,
'media' => $media,
@ -188,43 +176,6 @@ class MediaController extends Controller
return $this->streamMedia($request, $response, $this->storage, $media, 'attachment');
}
/**
* @param Request $request
* @param Response $response
* @param string $vanity
* @param string $id
*
* @return Response
* @throws HttpNotFoundException
* @throws HttpBadRequestException
*/
public function createVanity(Request $request, Response $response, int $id): Response
{
$media = $this->database->query('SELECT * FROM `uploads` WHERE `id` = ? LIMIT 1', $id)->fetch();
$vanity = param($request, 'vanity');
$vanity = preg_replace('/[^a-z0-9]+/', '-', strtolower($vanity));
//handle collisions
$collision = $this->database->query('SELECT * FROM `uploads` WHERE `code` = ? AND `id` != ? LIMIT 1', [$vanity, $id])->fetch();
if (!$media) {
throw new HttpNotFoundException($request);
}
if ($vanity === '' || $collision) {
throw new HttpBadRequestException($request);
}
$this->database->query('UPDATE `uploads` SET `code` = ? WHERE `id` = ?', [$vanity, $media->id]);
$media->code = $vanity;
$response->getBody()->write(json_encode($media));
$this->logger->info('User '.$this->session->get('username').' created a vanity link for media '.$media->id);
return $response;
}
/**
* @param Request $request
* @param Response $response

View file

@ -12,6 +12,7 @@ use Slim\Exception\HttpNotFoundException;
class TagController extends Controller
{
/**
* @param Request $request
* @param Response $response

View file

@ -123,9 +123,7 @@ class UploadController extends Controller
*/
protected function validateFile(Request $request, Response $response)
{
$iniValue = ini_get('post_max_size');
$maxPostSize = $iniValue === '0' ? INF : stringToBytes($iniValue);
if ($request->getServerParams()['CONTENT_LENGTH'] > $maxPostSize) {
if ($request->getServerParams()['CONTENT_LENGTH'] > stringToBytes(ini_get('post_max_size'))) {
$this->json['message'] = 'File too large (post_max_size too low?).';
throw new ValidationException(json($response, $this->json, 400));
@ -208,7 +206,6 @@ class UploadController extends Controller
$this->json['message'] = 'OK';
$this->json['url'] = urlFor("/{$user->user_code}/{$code}.{$fileInfo['extension']}");
$this->json['raw_url'] = urlFor("/{$user->user_code}/{$code}/raw.{$fileInfo['extension']}");
$this->logger->info("User $user->username uploaded new media.", [$mediaId]);

View file

@ -208,38 +208,21 @@ class MediaRepository
array_multisort(array_column($files, 'size'), $this->buildOrderBy(), SORT_NUMERIC, $files);
$params = [];
$queryPagesParams = [];
if ($this->text !== null) {
if ($this->isAdmin) {
[$queryMedia, $queryPages] = $this->buildAdminQueries();
[$queryMedia,] = $this->buildAdminQueries();
} else {
[$queryMedia, $queryPages] = $this->buildUserQueries();
[$queryMedia,] = $this->buildUserQueries();
$params[] = $this->userId;
}
$params[] = '%'.htmlentities($this->text).'%';
$queryPagesParams = $params;
$paths = array_column($files, 'path');
} elseif ($this->tagId !== null) {
if ($this->isAdmin) {
[, $queryPages] = $this->buildAdminQueries();
} else {
[, $queryPages] = $this->buildUserQueries();
$queryPagesParams[] = $this->userId;
}
$paths = array_column($files, 'path');
$ids = $this->getMediaIdsByTagId($this->tagId);
$queryMedia = 'SELECT `uploads`.*, `users`.`user_code`, `users`.`username` FROM `uploads` LEFT JOIN `users` ON `uploads`.`user_id` = `users`.`id` WHERE `uploads`.`storage_path` IN ("'.implode('","', $paths).'") AND `uploads`.`id` IN ('.implode(',', $ids).')';
} else {
if ($this->isAdmin) {
[, $queryPages] = $this->buildAdminQueries();
} else {
[, $queryPages] = $this->buildUserQueries();
$queryPagesParams[] = $this->userId;
}
$files = array_slice($files, $offset, $limit, true);
$paths = array_column($files, 'path');
$queryMedia = 'SELECT `uploads`.*, `users`.`user_code`, `users`.`username` FROM `uploads` LEFT JOIN `users` ON `uploads`.`user_id` = `users`.`id` WHERE `uploads`.`storage_path` IN ("'.implode('","', $paths).'")';
@ -270,7 +253,7 @@ class MediaRepository
}
}
$this->pages = $this->db->query($queryPages, $queryPagesParams)->fetch()->count / $limit;
$this->pages = count($this->media) / $limit;
if ($this->text !== null || $this->tagId !== null) {
$this->media = array_slice($this->media, $offset, $limit, true);
@ -362,7 +345,7 @@ class MediaRepository
protected function getMediaIdsByTagId($tagId)
{
$mediaIds = $this->db->query('SELECT `upload_id` FROM `uploads_tags` WHERE `tag_id` = ?', $tagId)->fetchAll();
$ids = [-1];
$ids = [];
foreach ($mediaIds as $pivot) {
$ids[] = $pivot->upload_id;
}

View file

@ -2,6 +2,7 @@
namespace App\Middleware;
use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
@ -15,7 +16,7 @@ class AdminMiddleware extends Middleware
*
* @throws HttpUnauthorizedException
*
* @return ResponseInterface
* @return Response
*/
public function __invoke(Request $request, RequestHandler $handler): ResponseInterface
{

View file

@ -2,10 +2,10 @@
namespace App\Middleware;
use GuzzleHttp\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use Slim\Psr7\Factory\ResponseFactory;
class AuthMiddleware extends Middleware
{
@ -18,16 +18,16 @@ class AuthMiddleware extends Middleware
public function __invoke(Request $request, RequestHandler $handler): ResponseInterface
{
if (!$this->session->get('logged', false)) {
$this->session->set('redirectTo', (string) $request->getUri()->getPath());
$this->session->set('redirectTo', (string) $request->getUri());
return redirect((new ResponseFactory())->createResponse(), route('login.show'));
return redirect(new Response(), route('login.show'));
}
if (!$this->database->query('SELECT `id`, `active` FROM `users` WHERE `id` = ? LIMIT 1', [$this->session->get('user_id')])->fetch()->active) {
$this->session->alert(lang('account_disabled'), 'danger');
$this->session->set('logged', false);
return redirect((new ResponseFactory())->createResponse(), route('login.show'));
return redirect(new Response(), route('login.show'));
}
return $handler->handle($request);

View file

@ -4,6 +4,7 @@ namespace App\Web;
class UA
{
/**
* bot user agent => perform link embed
* @var string[]
@ -18,9 +19,8 @@ class UA
'Slack' => false,
'Twitterbot/' => false,
'discord' => true,
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0' => true
// discord image bot
'Mozilla/5.0 (Macintosh; Intel Mac OS X 11.6; rv:92.0) Gecko/20100101 Firefox/92.0' => true,
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0' => true,
];
/**

View file

@ -73,30 +73,6 @@ if (!function_exists('isDisplayableImage')) {
}
}
if (!function_exists('isEmbeddable')) {
/**
* @param ?string $mime
*
* @return bool
*/
function isEmbeddable(?string $mime): bool
{
return in_array($mime, [
'image/apng',
'image/bmp',
'image/gif',
'image/x-icon',
'image/jpeg',
'image/png',
'image/tiff',
'image/webp',
'video/mp4',
'video/ogg',
'video/webm',
]);
}
}
if (!function_exists('stringToBytes')) {
/**
* @param $str
@ -117,13 +93,13 @@ if (!function_exists('stringToBytes')) {
switch ($last) {
case 't':
$val *= 1024;
// no break
// no break
case 'g':
$val *= 1024;
// no break
// no break
case 'm':
$val *= 1024;
// no break
// no break
case 'k':
$val *= 1024;
}

2
app/routes.php Executable file → Normal file
View file

@ -57,13 +57,11 @@ $app->group('', function (RouteCollectorProxy $group) {
$group->post('/user/{id}/refreshToken', [UserController::class, 'refreshToken'])->setName('refreshToken');
$group->get('/user/{id}/config/sharex', [ClientController::class, 'getShareXConfig'])->setName('config.sharex');
$group->get('/user/{id}/config/script', [ClientController::class, 'getBashScript'])->setName('config.script');
$group->get('/user/{id}/config/kde_script', [ClientController::class, 'getKDEScript'])->setName('kde_config.script');
$group->get('/user/{id}/export', [ExportController::class, 'downloadData'])->setName('export.data');
$group->post('/upload/{id}/publish', [MediaController::class, 'togglePublish'])->setName('upload.publish');
$group->post('/upload/{id}/unpublish', [MediaController::class, 'togglePublish'])->setName('upload.unpublish');
$group->post('/upload/{id}/vanity', [MediaController::class, 'createVanity'])->setName('upload.vanity');
$group->get('/upload/{id}/raw', [MediaController::class, 'getRawById'])->add(AdminMiddleware::class)->setName('upload.raw');
$group->map(['GET', 'POST'], '/upload/{id}/delete', [MediaController::class, 'delete'])->setName('upload.delete');

View file

@ -1,6 +1,6 @@
#!/usr/bin/env php
<?php
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.3 or above is required to run XBackBone.');
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 2) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.2 or above is required to run XBackBone.');
if (PHP_SAPI !== 'cli') {
die();
}

View file

@ -1,6 +1,6 @@
#!/usr/bin/env php
<?php
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.3 or above is required to run XBackBone.');
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 2) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.2 or above is required to run XBackBone.');
if (PHP_SAPI !== 'cli') {
die();
}

View file

@ -3,8 +3,6 @@
use App\Database\DB;
use App\Web\Lang;
use Aws\S3\S3Client;
use League\Flysystem\Cached\CachedAdapter;
use League\Flysystem\Cached\Storage\Adapter;
use function DI\factory;
use function DI\get;
use Google\Cloud\Storage\StorageClient;
@ -48,61 +46,58 @@ return [
Filesystem::class => factory(function (Container $container) {
$config = $container->get('config');
$driver = $config['storage']['driver'];
if ($driver === 'local') {
return new Filesystem(new Local($config['storage']['path']));
} elseif ($driver === 's3') {
$client = new S3Client([
'credentials' => [
'key' => $config['storage']['key'],
'secret' => $config['storage']['secret'],
],
'region' => $config['storage']['region'],
'endpoint' => $config['storage']['endpoint'],
'version' => 'latest',
'use_path_style_endpoint' => $config['storage']['use_path_style_endpoint'] ?? false,
'@http' => ['stream' => true],
]);
switch ($config['storage']['driver']) {
case 'local':
return new Filesystem(new Local($config['storage']['path']));
case 's3':
$client = new S3Client([
'credentials' => [
'key' => $config['storage']['key'],
'secret' => $config['storage']['secret'],
],
'region' => $config['storage']['region'],
'endpoint' => $config['storage']['endpoint'],
'version' => 'latest',
'use_path_style_endpoint' => $config['storage']['use_path_style_endpoint'] ?? false,
'@http' => ['stream' => true],
]);
$adapter = new AwsS3Adapter($client, $config['storage']['bucket'], $config['storage']['path']);
} elseif ($driver === 'dropbox') {
$client = new DropboxClient($config['storage']['token']);
return new Filesystem(new AwsS3Adapter($client, $config['storage']['bucket'], $config['storage']['path']));
case 'dropbox':
$client = new DropboxClient($config['storage']['token']);
$adapter = new DropboxAdapter($client);
} elseif ($driver === 'ftp') {
$adapter = new FtpAdapter([
'host' => $config['storage']['host'],
'username' => $config['storage']['username'],
'password' => $config['storage']['password'],
'port' => $config['storage']['port'],
'root' => $config['storage']['path'],
'passive' => $config['storage']['passive'],
'ssl' => $config['storage']['ssl'],
'timeout' => 30,
]);
} elseif ($driver === 'google-cloud') {
$client = new StorageClient([
'projectId' => $config['storage']['project_id'],
'keyFilePath' => $config['storage']['key_path'],
]);
return new Filesystem(new DropboxAdapter($client), ['case_sensitive' => false]);
case 'ftp':
return new Filesystem(new FtpAdapter([
'host' => $config['storage']['host'],
'username' => $config['storage']['username'],
'password' => $config['storage']['password'],
'port' => $config['storage']['port'],
'root' => $config['storage']['path'],
'passive' => $config['storage']['passive'],
'ssl' => $config['storage']['ssl'],
'timeout' => 30,
]));
case 'google-cloud':
$client = new StorageClient([
'projectId' => $config['storage']['project_id'],
'keyFilePath' => $config['storage']['key_path'],
]);
$adapter = new GoogleStorageAdapter($client, $client->bucket($config['storage']['bucket']));
} elseif ($driver === 'azure') {
$client = BlobRestProxy::createBlobService(
sprintf(
'DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;',
$config['storage']['account_name'],
$config['storage']['account_key']
)
);
return new Filesystem(new GoogleStorageAdapter($client, $client->bucket($config['storage']['bucket'])));
case 'azure':
$client = BlobRestProxy::createBlobService(
sprintf(
'DefaultEndpointsProtocol=https;AccountName=%s;AccountKey=%s;',
$config['storage']['account_name'],
$config['storage']['account_key']
)
);
$adapter = new AzureBlobStorageAdapter($client, $config['storage']['container_name']);
} else {
throw new InvalidArgumentException('The driver specified is not supported.');
return new Filesystem(new AzureBlobStorageAdapter($client, $config['storage']['container_name']));
default:
throw new InvalidArgumentException('The driver specified is not supported.');
}
$cache = new Adapter(new Local(BASE_DIR.'resources/cache/fs'), 'file', 300); // 5min
return new Filesystem(new CachedAdapter($adapter, $cache));
}),
'storage' => get(Filesystem::class),

View file

@ -1,27 +1,27 @@
{
"name": "sergix44/xbackbone",
"license": "AGPL-3.0-only",
"version": "3.7.0",
"version": "3.5.0",
"description": "A lightweight ShareX PHP backend",
"type": "project",
"require": {
"php": ">=7.3",
"ext-filter": "*",
"php": ">=7.2",
"ext-gd": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-pdo": "*",
"ext-zip": "*",
"ext-filter": "*",
"erusev/parsedown": "^1.7",
"guzzlehttp/psr7": "^1.6",
"http-interop/http-factory-guzzle": "^1.0",
"intervention/image": "^2.6",
"league/flysystem": "^1.1.4",
"league/flysystem-aws-s3-v3": "^1.0",
"league/flysystem-cached-adapter": "^1.1",
"league/flysystem-azure-blob-storage": "^0.1.6",
"maennchen/zipstream-php": "^2.0",
"monolog/monolog": "^1.23",
"php-di/slim-bridge": "^3.0",
"sapphirecat/slim4-http-interop-adapter": "^1.0",
"slim/psr7": "^1.5",
"slim/slim": "^4.0",
"spatie/flysystem-dropbox": "^1.0",
"superbalist/flysystem-google-storage": "^7.2",
@ -32,7 +32,7 @@
"preferred-install": "dist",
"sort-packages": true,
"platform": {
"php": "7.3.33"
"php": "7.2.34"
}
},
"autoload": {
@ -48,12 +48,10 @@
"Tests\\": "tests/"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"require-dev": {
"roave/security-advisories": "dev-latest",
"phpstan/phpstan": "^0.11.5",
"phpunit/phpunit": "^9.0",
"phpunit/phpunit": "^8.5",
"symfony/dom-crawler": "^4.4"
}
}

3575
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -1 +0,0 @@
<script async src="https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=ca-pub-1835087833720665" crossorigin="anonymous"></script>

View file

@ -1 +0,0 @@
google.com, pub-1835087833720665, DIRECT, f08c47fec0942fa0

View file

@ -5,58 +5,6 @@ nav_order: 9
---
# Changelog
## [3.7.0] - 2024-01-14
### Added
- Added support for vanity urls.
- Added KDE integration for linux script.
### Changed
- Updated translations.
- File preview is now clickable to open the file.
### Fixed
- Fixes for LDAP authentication.
## [3.6.3] - 2023-05-27
### Fixed
- Fix LDAP for php >= 8.1
## [3.6.2] - 2023-05-24
### Changed
- Support for PHP 8.2
### Removed
- Azure blob storage driver
## [3.6.1] - 2022-11-27
### Changed
- Upgraded dependencies
- Updated translations
### Fixed
- Fixed error in export data (#499)
- Fixed issues with reverse proxies (#495)
- Fixed duplicated twitter tags (#496)
## [3.6.0] - 2022-06-20
### Changed
- Improved embedding on discord of large videos.
- Releases are now compressed for faster downloads
- Updated translations
### Fixed
- Fixed deprecation notices on php >= 8
- Fixed embed UA for Discord.
- Fixed error with post_max_size = 0
### Removed
- Support for php 7.2
## [3.5.1] - 2021-10-22
### Changed
- Fixed embed UA for Discord.
- Updated translations.
## [3.5.0] - 2021-09-05
### Added
- Support for theme-park.dev themes.

View file

@ -71,7 +71,7 @@ return array(
'host' => 'ad.example.com', // set the ldap host
'port' => 389, // ldap port
'base_domain' => 'dc=example,dc=com', // the base_dn string
'search_filter' => '(&(objectClass=user)(sAMAccountName=????))', // ???? is replaced with user provided username
'search_filter' => '(&((objectClass=user)(sAMAccountName=????)))', // ???? is replaced with user provided username
'rdn_attribute' => 'sAMAccountName', // the attribute to use as username
'service_account_dn' => 'cn=xbackbone,cn=Users,dc=example,dc=com', // LDAP Service Account Full DN
'service_account_password' => 'examplepassword',
@ -191,6 +191,19 @@ return array(
);
```
+ Azure Blob Storage
```php
return array(
...
'storage' => array (
'driver' => 'azure',
'account_name' => 'the-storage-account-name',
'account_key' => 'the-account-key',
'container_name' => 'container-name',
),
);
```
## Changing themes
XBackBone supports all [bootswatch.com](https://bootswatch.com/) themes.

View file

@ -7,7 +7,7 @@ nav_order: 2
# Installation
### Prerequisites
XBackBone require PHP >= `7.3`, with installed the required extensions:
XBackBone require PHP >= `7.2`, with installed the required extensions:
+ `php-sqlite3` for SQLite.
+ `php-mysql` for MariaDB/MySQL.
+ `php-gd` image manipualtion library.

View file

@ -1,6 +1,6 @@
<?php
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.3 or above is required to run XBackBone.');
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 2) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.2 or above is required to run XBackBone.');
require __DIR__.'/vendor/autoload.php';
define('BASE_DIR', realpath(__DIR__).DIRECTORY_SEPARATOR);

View file

@ -1,6 +1,6 @@
<?php
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.3 or above is required to run XBackBone.');
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 2) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.2 or above is required to run XBackBone.');
require __DIR__.'/../vendor/autoload.php';
use App\Database\Migrator;
@ -9,13 +9,13 @@ use App\Web\Session;
use App\Web\View;
use DI\Bridge\Slim\Bridge;
use DI\ContainerBuilder;
use function DI\factory;
use function DI\get;
use function DI\value;
use League\Flysystem\FileExistsException;
use Psr\Container\ContainerInterface as Container;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use function DI\factory;
use function DI\get;
use function DI\value;
define('PLATFORM_VERSION', json_decode(file_get_contents(__DIR__.'/../composer.json'))->version);
define('BASE_DIR', realpath(__DIR__.'/../').DIRECTORY_SEPARATOR);

1830
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,26 +1,26 @@
{
"dependencies": {
"@fortawesome/fontawesome-free": "^5.15.2",
"bootstrap": "^4.6.1",
"bootstrap": "^4.6.0",
"bootstrap4-toggle": "^3.6.1",
"clipboard": "^2.0.10",
"dropzone": "^5.9.3",
"clipboard": "^2.0.7",
"dropzone": "^5.8.0",
"highlightjs": "^9.16.2",
"highlightjs-line-numbers.js": "^2.8.0",
"jquery": "^3.6.0",
"plyr": "^3.6.12",
"plyr": "^3.6.4",
"popper.js": "^1.16.1",
"tooltip.js": "^1.3.3"
},
"devDependencies": {
"grunt": "^1.5.3",
"grunt-contrib-compress": "^2.0.0",
"grunt": "^1.3.0",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-cssmin": "^3.0.0",
"grunt-contrib-jshint": "^3.1.1",
"grunt-contrib-jshint": "^2.1.0",
"grunt-contrib-uglify": "^4.0.1",
"grunt-contrib-watch": "^1.1.0",
"grunt-shell": "^3.0.1",
"grunt-zip": "^0.18.2",
"load-grunt-tasks": "^4.0.0"
}
}

View file

@ -17,9 +17,9 @@ return [
'pager.next' => 'التالي',
'pager.previous' => 'السابق',
'copy_link' => 'نسخ الرابط',
'public.telegram' => 'شارك على تيليجرام',
'public.delete_text' => 'هل أنت متأكد من أنك تريد حذف هذا العنصر؟ لن تتمكن من استعادته',
'preview' => 'استعراض',
'public.telegram' => 'مشاركة عبر تلغرام',
'public.delete_text' => 'هل تريد بالتأكيد حذف هذا العنصر؟ سيحذف نهائيا!',
'preview' => 'السابق',
'filename' => 'اسم الملف',
'size' => 'حجم',
'public' => 'عام',
@ -33,7 +33,7 @@ return [
'hide' => 'إخفاء',
'files' => 'ملفات',
'theme' => 'سمة',
'click_to_load' => 'انقر للتحميل',
'click_to_load' => 'انقر للتحميل...',
'apply' => 'تطبيق',
'save' => 'حفظ',
'used' => 'مستخدَم',
@ -59,13 +59,13 @@ return [
'account_disabled' => 'حسابك معطل.',
'welcome' => 'مرحبا، %s!',
'goodbye' => 'وداعا!',
'email_required' => 'عنوان البريد الإلكتروني مطلوب.',
'email_taken' => 'عنوان البريد الإلكتروني قيد الاستخدام بالفعل.',
'email_required' => 'البريد الإلكتروني مطلوب.',
'email_taken' => 'البريد الإلكتروني قيد الاستخدام.',
'username_required' => 'اسم المستخدم مطلوب.',
'username_taken' => 'اسم المستخدم قيد الاستخدام.',
'password_required' => 'كلمة المرور مطلوبة.',
'user_created' => 'تم إنشاء المستخدم "٪s"!',
'user_updated' => 'تم تحديث المستخدم "%s"!',
'user_created' => 'المستخدم "%s" أنشئ!',
'user_updated' => 'المستخدم "%s" تم تحديثه!',
'profile_updated' => 'تم تحديث الملف الشخصي بنجاح!',
'user_deleted' => 'تم حذف المستخدم.',
'cannot_delete' => 'لا يمكنك حذف نفسك.',
@ -73,8 +73,8 @@ return [
'switch_to' => 'تبديل إلى',
'gallery' => 'معرض',
'table' => 'جدول',
'dotted_search' => 'بحث',
'order_by' => 'ترتيب حسب',
'dotted_search' => 'بحث...',
'order_by' => 'ترتيب حسب...',
'time' => 'وقت',
'name' => 'اسم',
'maintenance' => 'صيانة',
@ -88,7 +88,7 @@ return [
'updates' => 'تحديثات',
'cancel' => 'إلغاء',
'auto_set' => 'حدد تلقائيا',
'prerelease_channel' => 'قناة ما قبل الإصدار',
'prerelease_channel' => 'قناة إصدار تجريبي',
'drop_to_upload' => 'انقر أو اسحب ملفاتك هنا للرفع.',
'donation' => 'تبرع',
'remember_me' => 'تذكرني',
@ -101,7 +101,7 @@ return [
'password_recovery' => 'استعادة كلمة المرور',
'no_account' => 'لا تملك حسابا؟',
'register' => 'تسجيل',
'register_success' => 'تم إنشاء الحساب، تم إرسال رسالة تأكيد عبر البريد الإلكتروني.',
'register_success' => 'تم إنشاء الحساب، تم إرسال رسالة تأكيد إلكترونية.',
'mail.activate_account' => '%s - تفعيل الحساب',
'mail.recover_password' => '%s - استعادة كلمة المرور',
'recover_email_sent' => 'إن وجد، سيتم إرسال رسالة إلكترونية لاستعادة كلمة المرور إلى الحساب المحدد.',
@ -115,51 +115,6 @@ return [
'clear_account' => 'مسح الحساب',
'account_media_deleted' => 'كل الوسائط في الحساب تم حذفها.',
'danger_zone' => 'منطقة خطرة',
'send_notification' => 'إرسال إشعار بالبريد الإلكتروني',
'send_notification' => 'إرسال رسالة إشعار إلكترونية',
'mail.new_account' => '%s - إنشاء حساب جديد',
'php_info' => 'معلومات الPHP',
'enforce_language' => 'فرض اللغة',
'image_embeds' => 'تضمين الصور',
'token_not_found' => 'لم يتم العثور على الرمز المميز المحدد.',
'clean_orphaned_uploads' => 'تنظيف التحميلات المعزولة',
'show_all_tags' => 'إظهار جميع العلامات',
'cannot_demote' => 'لا يمكنك تخفيض رتبتك.',
'recaptcha_secret_key' => 'المفتاح السري reCAPTCHA',
'recaptcha_failed' => 'فشل reCAPTCHA',
'recaptcha_enabled' => 'تم تفعيل reCAPTCHA',
'default_user_quota' => 'الحصة الافتراضية للمستخدم',
'invalid_quota' => 'قيم غير صالحة كحصة مستخدم افتراضية.',
'copy_url_behavior' => 'نسخ وضع الرابط',
'token' => 'الرمز المميز',
'vanity_url' => 'رابط مخصص',
'orphaned_files' => 'الملفات المعزولة',
'copied' => 'تم النسخ إلى الحافظة!',
'client_config' => 'إعدادات العميل',
'deleted_orphans' => 'تم حذف %d من الملفات المعزولة بنجاح.',
'maintenance_in_progress' => 'المنصة تحت الصيانة، حاول مرة أخرى لاحقاً…',
'default_lang_behavior' => 'سيحاول XBackBone مطابقة لغة المتصفح افتراضيا (الاحتياطي هو الإنجليزية).',
'no_upload_token' => 'ليس لديك رمز مميز شخصي للتحميل. (قم بإنشاء واحد وحاول مرة أخرى.)',
'donate_text' => 'إذا كنت تحب XBackBone، ففكر في التبرع لدعم التطوير!',
'custom_head_html' => 'محتوى رأس HTML مخصص',
'custom_head_html_hint' => 'ستتم إضافة هذا المحتوى عند علامة <head> في كل صفحة.',
'custom_head_set' => 'تم تطبيق رأس HTML المخصص.',
'max_user_quota' => 'الحد الأقصى لحصة المستخدم',
'quota_enabled' => 'تفعيل حصة المستخدم',
'recalculate_user_quota' => 'إعادة حساب حصة المستخدم من القرص',
'mail.activate_text' => 'مرحبًا %s!<br>شكرًا لك على إنشاء حسابك على %s (<a href="%s">%s</a>)، انقر على الرابط التالي لتفعيله:<br><br><a href="%s">%s</a>',
'quota_recalculated' => 'تمت إعادة حساب حصة المستخدم من القرص بنجاح.',
'only_recaptcha_v3' => 'يتم دعم reCAPTCHA v3 فقط.',
'recaptcha_site_key' => 'مفتاح موقع reCAPTCHA',
'ldap_cant_connect' => 'لا يمكن الاتصال بخادم مصادقة LDAP.',
'upload_max_file_size' => 'الحد الأقصى لحجم الملف حاليًا هو %s.',
'zip_ext_not_loaded' => 'لم يتم تحميل الامتداد "zip" المطلوب',
'no_tags' => 'لم تتم إضافة أي علامات',
'changelog' => 'سجل التغيير',
'show_changelog' => 'عرض سجل التغيير',
'auto_tagging' => 'تحميل العلامات تلقائيًا',
'recaptcha_keys_required' => 'جميع مفاتيح reCAPTCHA مطلوبة.',
'user_create_password' => 'إذا تركت فارغة، فقد تحتاج إلى إرسال إعلام إلى عنوان البريد الإلكتروني للمستخدم.',
'mail.recover_text' => 'مرحبًا %s،<br>لقد تم طلب إعادة تعيين كلمة المرور لحسابك. لإكمال الإجراء انقر على الرابط التالي:<br><br><a href="%s">%s</a><br><br>إذا لم تكن أنت من طلب إعادة تعيين كلمة المرور، فما عليك سوى تجاهل هذا البريد الإلكتروني.',
'mail.new_account_text_with_reset' => 'مرحبًا %s!<br>تم إنشاء حساب جديد لك على %s (<a href="%s">%s</a>)، انقر على الرابط التالي لتعيين كلمة مرور وتنشيطها:<br ><br><a href="%s">%s</a>',
'mail.new_account_text_with_pw' => 'مرحبًا %s!<br>تم إنشاء حساب جديد لك على %s (<a href="%s">%s</a>)، باستخدام بيانات الاعتماد التالية:<br><br>اسم المستخدم: %s <br>كلمة المرور: %s<br><br>انقر على الرابط التالي للانتقال إلى صفحة تسجيل الدخول:<br><a href="%s">%s</a>',
];

View file

@ -19,7 +19,7 @@ return [
'pager.previous' => 'Предишно',
'copy_link' => 'Копирай линк',
'public.telegram' => 'Сподели по Telegram',
'public.delete_text' => 'Наистина ли искате да изтриете този елемент? Няма да можете да го възстановите',
'public.delete_text' => 'Сигурни ли сте, че искате да изтриете това? Ще изчезне завинаги!',
'preview' => 'Предварителен преглед',
'filename' => 'Файлово име',
'size' => 'Размер',
@ -34,7 +34,7 @@ return [
'files' => 'Файлове',
'orphaned_files' => 'Загубени файлове',
'theme' => 'Тема',
'click_to_load' => 'Щракнете за зареждане…',
'click_to_load' => 'Натиснете за да заредите...',
'apply' => 'Приложи',
'save' => 'Запомни',
'used' => 'Използвано',
@ -58,107 +58,15 @@ return [
'installed' => 'Инсталацията завърши успешно!',
'welcome' => 'Добре дошли, %s!',
'goodbye' => 'Довиждане!',
'email_required' => зисква се имейл адрес.',
'email_taken' => 'Имейл адресът вече се използва.',
'email_required' => мейлът е необходим.',
'email_taken' => 'Имейлът вече се използва.',
'username_required' => 'Потребителското име е необходимо.',
'username_taken' => 'Потребителското име вече е заето.',
'password_required' => 'Паролата е задължителна.',
'password_required' => 'Паролата е необходима.',
'user_created' => 'Потребител „%s“ бе създаден!',
'user_updated' => 'Потребител „%s“ бе обновен!',
'profile_updated' => 'Профилът бе обновен успешно!',
'user_deleted' => 'Потребителят бе изтрит.',
'cannot_delete' => 'Не можете да изтриете себе си.',
'gallery' => 'Галерия',
'image_embeds' => 'Вграждане на изображения',
'bad_login' => 'Грешни идентификационни данни.',
'account_disabled' => 'Вашият акаунт е деактивиран.',
'copied' => 'Копирано в клипборда!',
'none' => 'Нито един',
'open' => 'Отвори',
'token_not_found' => 'Посоченият токен не е намерен.',
'cannot_demote' => 'Не можете да се понижавате.',
'cannot_write_file' => 'Пътят на дестинацията не е за запис.',
'deleted_orphans' => 'Успешно изтрити %d осиротели файла.',
'switch_to' => 'Преминат към',
'table' => 'Таблица',
'time' => 'Време',
'name' => 'Име',
'maintenance' => 'Поддръжка',
'clean_orphaned_uploads' => 'Изчистване на остарели качвания',
'path_not_writable' => 'Изходният път не е за запис.',
'already_latest_version' => 'Вече имате най-новата версия.',
'new_version_available' => 'Налична е нова версия %s!',
'cannot_retrieve_file' => 'Файлът не може да бъде извлечен.',
'upgrade' => 'Подобряване',
'updates' => 'Надстройки',
'auto_set' => 'Задайте автоматично',
'default_lang_behavior' => 'XBackBone ще се опита да съвпадне с езика на браузъра по подразбиране (резервният вариант е английски).',
'donation' => 'Дарение',
'donate_text' => 'Ако харесвате XBackBone, помислете за дарение в подкрепа на развитието!',
'custom_head_html' => 'Персонализирано съдържание на HTML Head',
'custom_head_html_hint' => 'Това съдържание ще бъде добавено към маркера <head> на всяка страница.',
'custom_head_set' => 'Приложена е персонализирана HTML Head.',
'remember_me' => 'Помни ме',
'please_wait' => 'Моля изчакай…',
'dont_close' => 'Не затваряйте този раздел до приключване.',
'copy_url_behavior' => 'Режим на копиране на URL',
'dotted_search' => 'Търсене…',
'order_by' => 'Подредени по…',
'file_size_no_match' => 'Изтегленият файл не съответства на правилния размер на файла.',
'check_for_updates' => 'Провери за актуализации',
'no_account' => 'Нямате акаунт?',
'default_user_quota' => 'Потребителска квота по подразбиране',
'register' => 'Регистрация',
'max_user_quota' => 'Максимална потребителска квота',
'invalid_quota' => 'Невалидни стойности като потребителска квота по подразбиране.',
'account_activated' => 'Акаунтът е активиран, сега можете да влезете!',
'quota_enabled' => 'Активиране на потребителска квота',
'password_restored' => 'Нулиране на паролата.',
'quota_recalculated' => 'Потребителската квота е преизчислена от диска успешно.',
'delete_selected' => 'Изтрий избраното',
'delete_all' => 'Изтриване на всички',
'account_media_deleted' => 'Всички медии в акаунта са изтрити.',
'danger_zone' => 'Опасна зона',
'recaptcha_failed' => 'reCAPTCHA неуспешно',
'recaptcha_enabled' => 'reCAPTCHA е активирана',
'recaptcha_keys_required' => 'Всички ключове reCAPTCHA са задължителни.',
'recaptcha_site_key' => 'Ключ на сайта reCAPTCHA',
'send_notification' => 'Изпращане на известие по имейл',
'mail.new_account' => '%s - Създаване на нов акаунт',
'user_create_password' => 'Ако се остави празно, може да искате да изпратите известие до имейл адреса на потребителя.',
'ldap_cant_connect' => 'Не може да се свърже към LDAP сървъра за удостоверяване.',
'upload_max_file_size' => 'Максималният размер на файла в момента е %s.',
'no_tags' => 'Няма добавени тагове',
'auto_tagging' => 'Маркиране за автоматично качване',
'zip_ext_not_loaded' => 'Необходимото разширение "zip" не е заредено',
'changelog' => 'Регистър на промените',
'show_changelog' => 'Показване на регистъра на промените',
'register_success' => 'Акаунтът е създаден, изпратен е имейл за потвърждение.',
'recover_email_sent' => 'Ако е налице, имейл за възстановяване е изпратен до посочения акаунт.',
'mail.recover_password' => '%s - Възстановяване на парола',
'php_info' => 'PHP информация',
'system_settings' => 'Системни настройки',
'upload' => 'Качване',
'prerelease_channel' => 'Предварителен канал',
'settings_saved' => 'Системните настройки са запазени!',
'export_data' => 'Експортиране на данни',
'cancel' => 'Отмяна',
'no_upload_token' => 'Нямате личен токен за качване. (Генерирайте един и опитайте отново.)',
'maintenance_in_progress' => 'Платформата е в процес на поддръжка, опитайте отново по-късно…',
'drop_to_upload' => 'Щракнете или пуснете вашите файлове тук, за да ги качите.',
'register_enabled' => 'Регистрациите са активирани',
'hide_by_default' => 'Скриване на медиите по подразбиране',
'password_recovery' => 'Възстановяване на парола',
'mail.activate_text' => 'Здравейте %s!<br>благодаря ви, че създадохте своя акаунт в %s (<a href="%s">%s</a>), щракнете върху следната връзка, за да го активирате:<br><br>< a href="%s">%s</a>',
'mail.activate_account' => '%s - Активиране на акаунт',
'mail.recover_text' => 'Здравейте %s,<br>за вашия акаунт бе поискано нулиране на паролата. За да завършите процедурата, щракнете върху следната връзка:<br><br><a href="%s">%s</a><br><br>Ако не вие сте поискали нулирането на паролата, просто игнорирайте този имейл.',
'password_match' => 'Паролата и повторната парола трябва да са еднакви.',
'recalculate_user_quota' => 'Преизчисляване на потребителската квота от диска',
'password_repeat' => 'Повтори паролата',
'recaptcha_secret_key' => 'Секретен ключ на reCAPTCHA',
'mail.new_account_text_with_reset' => 'Здравейте %s!<br>за вас беше създаден нов акаунт на %s (<a href="%s">%s</a>), щракнете върху следната връзка, за да зададете парола и да я активирате:<br ><br><a href="%s">%s</a>',
'used_space' => 'Използвано пространство',
'clear_account' => 'Изчистване на акаунта',
'only_recaptcha_v3' => 'Поддържа се само reCAPTCHA v3.',
'mail.new_account_text_with_pw' => 'Здравейте %s!<br>за вас бе създаден нов акаунт на %s (<a href="%s">%s</a>) със следните идентификационни данни:<br><br>Потребителско име: %s <br>Парола: %s<br><br>Щракнете върху следната връзка, за да отидете на страницата за вход:<br><a href="%s">%s</a>',
];

View file

@ -1,163 +0,0 @@
<?php
return [
'no_media' => 'Sense medis.',
'raw' => 'Mostra raw',
'lang' => 'Anglès',
'enforce_language' => 'Aplicar idioma',
'no' => 'No',
'send' => 'Envia',
'login.username' => 'Nom d\'usuari o Email',
'password' => 'Contrasenya',
'login' => 'Registre',
'username' => 'Nom Usuari',
'home' => 'Casa',
'copy_link' => 'Copiar Link',
'public.telegram' => 'Compartir a Telegram',
'public.delete_text' => 'Segur que vols esborrar l\'element? No el podràs recuperar',
'preview' => 'Vista prèvia',
'filename' => 'Nom Arxiu',
'size' => 'Mida',
'public' => 'Public',
'owner' => 'Propietari',
'date' => 'Data',
'upload' => 'Puja',
'delete' => 'Esborra',
'hide' => 'Oculta',
'files' => 'Arxius',
'orphaned_files' => 'Arxius orfes',
'theme' => 'Tema',
'click_to_load' => 'Click per pujar…',
'apply' => 'Aplicar',
'save' => 'Guardar',
'used' => 'Usat',
'php_info' => 'Informació PHP',
'system_settings' => 'Opcions de Sistema',
'user.create' => 'Crear Usuari',
'user.edit' => 'Editar Usuari',
'is_active' => 'Està Actiu',
'is_admin' => 'és administrador',
'your_profile' => 'el teu perfil',
'token' => 'Token',
'copy' => 'Copiar',
'copied' => 'Copiat al portaretalls!',
'client_config' => 'Configuració Client',
'user_code' => 'Codi Usuari',
'active' => 'Actiu',
'reg_date' => 'Data Registre',
'none' => 'Cap',
'open' => 'Obert',
'confirm' => 'Confirmació',
'confirm_string' => 'Estàs segur?',
'installed' => 'Instal·lació satisfactòria!',
'bad_login' => 'Credencials Errònies.',
'account_disabled' => 'Compte Deshabilitat.',
'goodbye' => 'Adéu!',
'token_not_found' => 'Token no trobat.',
'email_taken' => 'Compte de correu en ús.',
'username_required' => 'Nom usuari Requerit.',
'username_taken' => 'Nom d\'usuari ja en ús.',
'password_required' => 'Contrasenya requerida.',
'user_created' => 'Usuari "%s" creat!',
'user_updated' => 'Usuari "%s" actualitzat!',
'profile_updated' => 'Perfil Actualitzat!',
'user_deleted' => 'Usuari esborrat.',
'cannot_delete' => 'No pots esborrar.-te.',
'cannot_demote' => 'No et pots degradar.',
'cannot_write_file' => 'No es pot escriure al path.',
'deleted_orphans' => '%d Fitxers orfes esborrats.',
'dotted_search' => 'Cerca…',
'order_by' => 'Endreça per.…',
'time' => 'Temps',
'name' => 'Nom',
'maintenance' => 'Manteniment',
'clean_orphaned_uploads' => 'Neteja càrregues orfes',
'path_not_writable' => 'No es pot escriure al path de sortida.',
'already_latest_version' => 'Ja estàs a la darrera versió.',
'new_version_available' => 'Nova versió %s disponible!',
'cannot_retrieve_file' => 'No es pot recuperar el fitxer.',
'file_size_no_match' => 'El fitxer baixat no coincideix amb la mida correcta del fitxer.',
'upgrade' => 'Actualitza',
'maintenance_in_progress' => 'En manteniment, torna-ho a provar més tard…',
'cancel' => 'Cancel·la',
'auto_set' => 'Estableix automàticament',
'default_lang_behavior' => 'XBackBone intentarà fer coincidir l\'idioma del navegador de manera predeterminada (la alternativa és l\'anglès).',
'prerelease_channel' => 'Canal de preestrena',
'drop_to_upload' => 'Feu clic o deixeu anar els vostres fitxers aquí per carregar-los.',
'donation' => 'Donatiu',
'custom_head_html' => 'Contingut de capçalera HTML personalitzat',
'custom_head_set' => 'Capçalera HTML personalitzada aplicada.',
'remember_me' => 'Recorda\'m',
'please_wait' => 'Esperi…',
'dont_close' => 'No tanquis la pestanya.',
'register_enabled' => 'Registres habilitats',
'hide_by_default' => 'Amaga medis per defecte',
'copy_url_behavior' => 'Mode copia URL',
'password_recovery' => 'Recupera password',
'no_account' => 'No tens compte?',
'register' => 'Registre',
'register_success' => 'S\'ha creat el compte, s\'ha enviat un correu electrònic de confirmació.',
'default_user_quota' => 'Quota d\'usuari per defecte',
'max_user_quota' => 'Quota màxima d\'usuari',
'invalid_quota' => 'Valors no vàlids com a quota d\'usuari predeterminada.',
'mail.activate_account' => '%s - Activació del compte',
'mail.recover_password' => '%s - Recuperació de la contrasenya',
'recover_email_sent' => 'Si existeix, s\'enviarà un correu electrònic de recuperació al compte especificat.',
'account_activated' => 'Compte activat, ara pots iniciar sessió!',
'quota_enabled' => 'Activa la quota d\'usuari',
'password_repeat' => 'Repeteix Contrasenya',
'password_match' => 'Les contrasenyes han de coincidir.',
'password_restored' => 'Contrasenya restablerta.',
'recalculate_user_quota' => 'Torneu a calcular la quota d\'usuari del disc',
'quota_recalculated' => 'La quota d\'usuari s\'ha recalculat des del disc correctament.',
'used_space' => 'Espai Utilitzat',
'delete_selected' => 'Esborra seleccionat',
'delete_all' => 'Esborra Tot',
'clear_account' => 'Esborra el compte',
'account_media_deleted' => 'S\'han suprimit tots els mitjans del compte.',
'danger_zone' => 'Zona Perillosa',
'recaptcha_failed' => 'reCAPTCHA Erroni',
'recaptcha_keys_required' => 'Calen totes les claus reCAPTCHA.',
'only_recaptcha_v3' => 'Només s\'admet reCAPTCHA v3.',
'recaptcha_site_key' => 'Clau del lloc reCAPTCHA',
'recaptcha_secret_key' => 'Clau secreta reCAPTCHA',
'send_notification' => 'Envia notificació per e-mail',
'mail.new_account' => '%s - Creació nou Compte',
'users' => 'Usuaris',
'system' => 'Sistema',
'mail.new_account_text_with_pw' => 'Hola, %s!<br>s\'ha creat un compte nou a %s (<a href="%s">%s</a>), amb les credencials següents:<br><br>Nom d\'usuari: %s <br>Contrasenya: %s<br><br>Feu clic a l\'enllaç següent per anar a la pàgina d\'inici de sessió:<br><a href="%s">%s</a>',
'user_create_password' => 'Si es deixa buit, és possible que vulgueu enviar una notificació a l\'adreça de correu electrònic de l\'usuari.',
'ldap_cant_connect' => 'No es pot connectar al servidor d\'autenticació LDAP.',
'upload_max_file_size' => 'La mida màxima del fitxer és actualment %s.',
'no_tags' => 'Sense Etiquetes',
'auto_tagging' => 'Etiquetatge de càrrega automàtica',
'zip_ext_not_loaded' => 'L\'extensió "zip" necessària no està carregada',
'changelog' => 'Codi de canvis',
'show_changelog' => 'Mostra canvis',
'image_embeds' => 'Insereix imatges',
'yes' => 'Sí',
'profile' => 'Perfil',
'pager.previous' => 'Anterior',
'logout' => 'Tancar Sessió',
'pager.next' => 'Següent',
'publish' => 'Publica',
'download' => 'Descarrega',
'update' => 'Actualitza',
'admin' => 'Admin',
'edit' => 'Edita',
'welcome' => 'Benvolgut, %s!',
'email_required' => 'Adreça email requerida.',
'gallery' => 'Galeria',
'switch_to' => 'Canvia a',
'no_upload_token' => 'No tens cap testimoni de càrrega personal. (Genereu-ne un i torneu-ho a provar.)',
'table' => 'Taula',
'check_for_updates' => 'Comprova actualitzacions',
'updates' => 'Actualitzacions',
'donate_text' => 'Si t\'agrada XBackBone, considera una donació per donar suport al desenvolupament!',
'settings_saved' => 'Opcions de sistema gravades!',
'export_data' => 'Exporta dades',
'custom_head_html_hint' => 'Aquest contingut s\'afegirà a l\'etiqueta <head> de cada pàgina.',
'mail.activate_text' => 'Hola, %s!<br>gràcies per crear el vostre compte a %s (<a href="%s">%s</a>), feu clic a l\'enllaç següent per activar-lo:<br><br>< a href="%s">%s</a>',
'mail.recover_text' => 'Hola %s,<br>s\'ha sol·licitat un restabliment de la contrasenya per al vostre compte. Per completar el procediment, feu clic a l\'enllaç següent:<br><br><a href="%s">%s</a><br><br>Si no heu estat vosaltres qui heu sol·licitat la restabliment de la contrasenya, simplement ignora aquest correu electrònic.',
'recaptcha_enabled' => 'reCAPTCHA Habilitat',
'mail.new_account_text_with_reset' => 'Hola, %s!<br>s\'ha creat un compte nou a %s (<a href="%s">%s</a>), feu clic a l\'enllaç següent per establir una contrasenya i activar-la:<br ><br><a href="%s">%s</a>',
];

View file

@ -113,8 +113,8 @@ return [
'mail.new_account_text_with_reset' => 'Zdravíme, %s!<br>Byl pro vás vytvořen nový účet na %s (<a href="%s">%s</a>). Klikněte na následující odkaz pro nastavení hesla a aktivaci účtu:<br><br><a href="%s">%s</a>',
'mail.new_account' => '%s - tvorba nového účtu',
'send_notification' => 'Poslat e-mailové oznámení',
'recaptcha_secret_key' => 'reCAPTCHA Tajný klíč',
'recaptcha_site_key' => 'reCAPTCHA Webový Klíč',
'recaptcha_secret_key' => 'reCAPTCHA Secret Key',
'recaptcha_site_key' => 'reCAPTCHA Site Key',
'only_recaptcha_v3' => 'Je podporována pouze reCAPTCHA v3.',
'recaptcha_keys_required' => 'Jsou vyžadovány všechny klíče reCAPTCHA.',
'recaptcha_enabled' => 'reCAPTCHA povolena',
@ -159,5 +159,4 @@ return [
'donation' => 'Přispět',
'drop_to_upload' => 'Klikněte nebo sem přetáhněte soubory pro nahrání.',
'no_upload_token' => 'Nemáte osobní nahrávací token. (Vygenerujte si jej a zkuste to znovu.)',
'image_embeds' => 'Vložené obrázky',
];

View file

@ -18,7 +18,7 @@ return [
'pager.previous' => 'Forrige',
'copy_link' => 'Kopier link',
'public.telegram' => 'Del på Telegram',
'public.delete_text' => 'Er du sikker på, at du vil slette dette element? Du vil ikke være i stand til at gendanne den',
'public.delete_text' => 'Er du sikker på du vil slette dette element? Du vil ikke kunne gendanne det',
'preview' => 'Forhåndsvisning',
'filename' => 'Filnavn',
'size' => 'Størrelse',
@ -68,19 +68,19 @@ return [
'remember_me' => 'Husk mig',
'custom_head_html' => 'Tilpasset HTML Head indhold',
'donate_text' => 'Hvis du kan lide XBackBone, kan du overveje en donation for at støtte udviklingen!',
'donation' => 'Donering',
'donation' => 'Donation',
'drop_to_upload' => 'Klik eller slip dine filer her for at uploade.',
'auto_set' => 'Sæt automatisk',
'auto_set' => 'Indstil automatisk',
'cancel' => 'Annuller',
'maintenance_in_progress' => 'Platformen er under vedligeholdelse, prøv igen senere…',
'updates' => 'Opdateringer',
'upgrade' => 'Opgrader',
'check_for_updates' => 'Søg efter opdateringer',
'file_size_no_match' => 'Den downloadede fil matcher ikke den korrekte filstørrelse.',
'cannot_retrieve_file' => 'Filen kan ikke hentes.',
'cannot_retrieve_file' => 'Kan ikke hente filen.',
'new_version_available' => 'Ny version %s tilgængelig!',
'already_latest_version' => 'Du har allerede den seneste version.',
'maintenance' => 'Vedligeholdelse',
'maintenance' => 'Vedligehold',
'name' => 'Navn',
'time' => 'Tid',
'order_by' => 'Sorter efter…',
@ -92,14 +92,14 @@ return [
'cannot_demote' => 'Du kan ikke degradere dig selv.',
'cannot_delete' => 'Du kan ikke slette dig selv.',
'user_deleted' => 'Bruger slettet.',
'profile_updated' => 'Profilen blev opdateret!',
'password_required' => 'Adgangskoden er krævet.',
'profile_updated' => 'Profil opdateret!',
'password_required' => 'Adgangskoden er krævet.',
'username_taken' => 'Brugernavnet er allerede i brug.',
'username_required' => 'Brugernavnet er krævet.',
'username_required' => 'Brugernavnet er krævet.',
'goodbye' => 'Farvel!',
'welcome' => 'Velkommen, %s!',
'account_disabled' => 'Din konto er deaktiveret.',
'bad_login' => 'Forkerte loginoplysninger.',
'account_disabled' => 'Din konto er slået fra.',
'bad_login' => 'Forkerte legitimationsoplysninger.',
'installed' => 'Installationen blev gennemført!',
'confirm_string' => 'Er du sikker?',
'confirm' => 'Bekræftelse',
@ -117,48 +117,6 @@ return [
'token' => 'Nøgle',
'system_settings' => 'Systemindstillinger',
'php_info' => 'PHP Informationer',
'upload' => 'Overfør',
'enforce_language' => 'Håndhæve sproget',
'deleted_orphans' => 'Slettet %d forældreløse filer.',
'default_lang_behavior' => 'XBackBone vil prøve at matche browsersproget som standard (tilbagefaldet er Engelsk).',
'prerelease_channel' => 'Forhåndsudgivelse Kanal',
'token_not_found' => 'Den angivne token blev ikke fundet.',
'clean_orphaned_uploads' => 'Fjern forældreløse overførsler',
'custom_head_set' => 'Brugerdefineret HTML-hoved anvendt.',
'dont_close' => 'Luk ikke denne fane, før den er færdig.',
'default_user_quota' => 'Standard bruger plads',
'max_user_quota' => 'Max bruger plads',
'invalid_quota' => 'Ugyldige værdier som standard bruger plads.',
'mail.activate_account' => '%s - Aktivering af konto',
'mail.recover_password' => '%s - Gendan adgangskode',
'password_restored' => 'Nulstil kodeord.',
'recalculate_user_quota' => 'Genberegn bruger plads fra disk',
'quota_recalculated' => 'Bruger pladsen genberegnet fra disken med succes.',
'account_media_deleted' => 'Alle medier på kontoen er blevet slettet.',
'danger_zone' => 'Farligt område',
'recaptcha_keys_required' => 'Alle reCAPTCHA nøgler er påkrævet.',
'recaptcha_site_key' => 'reCAPTCHA webstedsnøgle',
'recaptcha_secret_key' => 'reCAPTCHA hemmelig nøgle',
'mail.new_account_text_with_reset' => 'Hej %s!<br>en ny konto blev oprettet til dig den %s (<a href="%s">%s</a>), klik på følgende link for at indstille en adgangskode og aktivere den:<br><br><a href="%s">%s</a>',
'user_create_password' => 'Hvis den efterlades tom, vil det være en god idé selv at sende en meddelelse til brugerens e-mailadresse.',
'ldap_cant_connect' => 'Kan ikke oprette forbindelse til LDAP-godkendelsesserveren.',
'upload_max_file_size' => 'Den maksimale filstørrelse er i øjeblikket %s.',
'no_tags' => 'Ingen tags tilføjet',
'auto_tagging' => 'Automatisk upload tagging',
'zip_ext_not_loaded' => 'Den nødvendige "zip"-udvidelse er ikke indlæst',
'changelog' => 'Ændringslog',
'show_changelog' => 'Vis ændringslog',
'no_upload_token' => 'Du har ikke et personligt upload token. (Generer en og prøv igen.)',
'custom_head_html_hint' => 'Dette indhold vil blive tilføjet ved <head> tagget på hver side.',
'register_success' => 'Kontoen er oprettet, en bekræftelses-e-mail er blevet sendt.',
'quota_enabled' => 'Aktiver brugerkvote',
'mail.activate_text' => 'Hej %s!<br>tak fordi du oprettede din konto på %s (<a href="%s">%s</a>), klik på følgende link for at aktivere den:<br><br><a href="%s">%s</a>',
'mail.recover_text' => 'Hej %s,<br>der er blevet anmodet om en nulstilling af adgangskoden til din konto. For at fuldføre proceduren, klik på følgende link:<br><br><a href="%s">%s</a><br><br>Hvis det ikke var dig, der anmodede om nulstilling af adgangskoden, skal du blot ignorere denne e-mail.',
'recover_email_sent' => 'Hvis tilstede, blev der sendt en gendannelses-e-mail til den angivne konto.',
'password_match' => 'Adgangskode og den gentaget adgangskode skal være ens.',
'clear_account' => 'Ryd Konto',
'only_recaptcha_v3' => 'Kun reCAPTCHA v3 understøttes.',
'image_embeds' => 'Integrer billeder',
'mail.new_account_text_with_pw' => 'Hej %s!<br>en ny konto blev oprettet til dig den %s (<a href="%s">%s</a>), med følgende oplysninger:<br><br>Brugernavn: %s<br>Adgangskode: %s<br><br>Klik på følgende link for at gå til login-siden:<br><a href="%s">%s</a>',
'path_not_writable' => 'Outputstien er ikke skrivbar.',
'upload' => 'Upload',
'enforce_language' => 'Håndhæv sprog',
];

View file

@ -54,7 +54,7 @@ return [
'reg_date' => 'Registrierungsdatum',
'none' => 'keine',
'open' => 'Öffnen',
'confirm' => 'Bestätigen',
'confirm' => 'Bestätigung',
'confirm_string' => 'Bist du sicher?',
'installed' => 'Installation erfolgreich abgeschlossen!',
'bad_login' => 'Falsche Anmeldeinformationen.',
@ -153,7 +153,6 @@ return [
'mail.new_account' => '%s Erstellung von Konto',
'user_create_password' => 'Wenn das leer bleibt, wollen Sie vielleicht eine Benachrichtigung an die Benutzer per E-Mail senden.',
'no_tags' => 'Keine Tags hinzugefügt',
'show_all_tags' => 'Alle Tags anzeigen',
'upload_max_file_size' => 'Die maximale Dateigröße beträgt derzeit %s.',
'ldap_cant_connect' => 'Es kann keine Verbindung zum LDAP-Auth-Server hergestellt werden.',
'zip_ext_not_loaded' => 'Die zip-Erweiterung ist erforderlich',
@ -166,5 +165,4 @@ return [
'changelog' => 'Änderungsprotokoll',
'copied' => 'In Zwischenablage kopiert!',
'image_embeds' => 'Bilder einbetten',
'vanity_url' => 'Benutzerdefinierte URL',
];

4
resources/lang/en.lang.php Executable file → Normal file
View file

@ -30,8 +30,6 @@ return [
'download' => 'Download',
'upload' => 'Upload',
'delete' => 'Delete',
'confirm' => 'Confirm',
'vanity_url' => 'Custom URL',
'publish' => 'Publish',
'hide' => 'Hide',
'files' => 'Files',
@ -60,6 +58,7 @@ return [
'reg_date' => 'Registration Date',
'none' => 'None',
'open' => 'Open',
'confirm' => 'Confirmation',
'confirm_string' => 'Are you sure?',
'installed' => 'Installation completed successfully!',
'bad_login' => 'Wrong credentials.',
@ -156,7 +155,6 @@ return [
'ldap_cant_connect' => 'Can\'t connect to the LDAP auth server.',
'upload_max_file_size' => 'The max file size is currently %s.',
'no_tags' => 'No tags added',
'show_all_tags' => 'Show all tags',
'auto_tagging' => 'Auto upload tagging',
'zip_ext_not_loaded' => 'The required "zip" extension is not loaded',
'changelog' => 'Changelog',

View file

@ -18,7 +18,7 @@ return [
'pager.previous' => 'Previo',
'copy_link' => 'Copiar enlace',
'public.telegram' => 'Compartir en Telegram',
'public.delete_text' => '¿Está seguro que desea borrar este elemento? No vas a poder recuperarlo',
'public.delete_text' => '¿Está seguro que desea borrar este elemento? ¡Será borrado para siempre!',
'preview' => 'Vista previa',
'filename' => 'Nombre del archivo',
'size' => 'Tamaño',
@ -54,7 +54,7 @@ return [
'reg_date' => 'Fecha de Registración',
'none' => 'Ninguno',
'open' => 'Abrir',
'confirm' => 'Confirmar',
'confirm' => 'Confirmación',
'confirm_string' => '¿Está seguro?',
'installed' => '¡Instalación completa!',
'bad_login' => 'Credenciales incorrectas.',
@ -129,8 +129,8 @@ return [
'upload_max_file_size' => 'El tamaño máximo del archivo es actualmente %s.',
'ldap_cant_connect' => 'No se puede conectar con el servidor de autentificación LDAP.',
'user_create_password' => 'Si se deja vacío, es posible que desee enviar una notificación a la dirección de correo electrónico del usuario.',
'mail.new_account_text_with_pw' => '¡Hola %s!<br>se ha creado una nueva cuenta para ti en %s (<a href="%s">%s</a>), haz clic en el siguiente enlace para establecer una contraseña y activarla:<br><br><a href="%s">%s</a>',
'mail.new_account_text_with_reset' => '¡Hola, %s!<br>Se creó una nueva cuenta para ti en %s (<a href="%s">%s</a>), haz clic en el siguiente enlace para establecer una contraseña y activarla:<br ><br><a href="%s">%s</a>',
'mail.new_account_text_with_pw' => 'Hola %s!<br>se ha creado una nueva cuenta para ti en %s (<a href="%s">%s</a>), haz clic en el siguiente enlace para establecer una contraseña y activarla:<br><br><a href="%s">%s</a>',
'mail.new_account_text_with_reset' => 'Hola %s!<br>se ha creado una nueva cuenta para ti en %s (<a href="%s">%s</a>), haz clic en el siguiente enlace para establecer una contraseña y activarla:<br><br><a href="%s">%s</a>',
'recaptcha_enabled' => 'reCAPTCHA activado',
'account_media_deleted' => 'Se han eliminado todos los archivos de la cuenta.',
'clear_account' => 'Limpiar cuenta',
@ -144,7 +144,7 @@ return [
'mail.recover_text' => 'Hola %s,<br>se ha solicitado el restablecimiento de la contraseña de su cuenta. Para completar el procedimiento haga clic en el siguiente enlace:<br><br><a href="%s">%s</a><br>Si no fue usted quien solicitó el restablecimiento de la contraseña, simplemente ignore este correo electrónico.',
'mail.activate_text' => 'Hola %s!<br>gracias por crear tu cuenta en %s (<a href="%s">%s</a>), haz clic en el siguiente enlace para activarla:<br><br><a href="%s">%s</a>',
'invalid_quota' => 'Valores no válidos como cuota de usuario por defecto.',
'max_user_quota' => 'Cuota máxima del usuario',
'max_user_quota' => 'Cuota máxima del usuario',
'default_user_quota' => 'Cuota de usuarios por defecto',
'register' => 'Registrarse',
'no_account' => '¿No tienes cuenta?',
@ -160,11 +160,4 @@ return [
'custom_head_html_hint' => 'Este contenido se añadirá en la etiqueta <head> de cada página.',
'custom_head_html' => 'Contenido personalizado del encabezado HTML',
'image_embeds' => 'Incrustar imágenes',
'recaptcha_keys_required' => 'Todas las claves reCAPTCHA son requeridas.',
'recaptcha_secret_key' => 'Clave secreta de reCAPTCHA',
'recaptcha_site_key' => 'Clave del sitio reCAPTCHA',
'only_recaptcha_v3' => 'Solo reCAPTCHA v3 está soportado.',
'custom_head_set' => 'Cabecera HTML personalizada aplicada.',
'vanity_url' => 'URL personalizada',
'show_all_tags' => 'Mostrar todas las etiquetas',
];

View file

@ -1,29 +0,0 @@
<?php
return [
'lang' => 'انگلیسی',
'login.username' => 'نام کاربری یا صندوق پستی الکترونیک',
'enforce_language' => 'اجرا کردن زبان',
'yes' => 'بله',
'send' => 'ارسال',
'no_media' => 'رسانه ای یافت نشد .',
'home' => 'خانه',
'users' => 'کاربران',
'system' => 'سیستم',
'profile' => 'حساب کاربری',
'logout' => 'خارج شدن',
'public.telegram' => 'اشتراک گذاری در تلگرام',
'public.delete_text' => 'آیا مطمعن به حذف این آیتم هستید ؟ غیرقابل بازیابی بعد از حذف',
'preview' => 'پیش نمایش',
'size' => 'سایز',
'public' => 'عمومی',
'owner' => 'مالک',
'date' => 'تاریخ',
'no' => 'خیر',
'password' => 'کلمه عبور',
'login' => 'وارد شدن',
'username' => 'نام کاربری',
'pager.next' => 'بعدی',
'pager.previous' => 'قبلی',
'copy_link' => 'رونوشت از پیوند',
'filename' => 'نام فایل',
];

View file

@ -17,7 +17,7 @@ return [
'token_not_found' => 'Määritettyä tunnusta ei löydy.',
'client_config' => 'Asiakasohjelman konfigurointi',
'home' => 'Koti',
'enforce_language' => 'Pakota kieli',
'enforce_language' => 'Vahvista kieli',
'cannot_demote' => 'Et voi alentaa itseäsi.',
'cannot_delete' => 'Et voi poistaa itseäsi.',
'user_deleted' => 'Käyttäjä poistettu.',
@ -35,7 +35,7 @@ return [
'bad_login' => 'Väärät kirjautumistiedot.',
'installed' => 'Asennus suoritettu loppuun onnistuneesti!',
'confirm_string' => 'Oletko varma?',
'confirm' => 'Vahvista',
'confirm' => 'Vahvistus',
'open' => 'Auki',
'none' => 'Ei mitään',
'reg_date' => 'Rekisteröitymis päivä',
@ -91,74 +91,4 @@ return [
'no' => 'Ei',
'yes' => 'Kyllä',
'lang' => 'Englanti',
'recaptcha_enabled' => 'reCAPTCHA Käytössä',
'cancel' => 'Peruuta',
'send_notification' => 'Lähetä sähköpostivahvistus',
'auto_set' => 'Määritä automaattisesti',
'drop_to_upload' => 'Lähetä tiedostosi painamalla tai tiputtamalla tähän.',
'account_activated' => 'Käyttäjä aktivoitu, voit nyt kirjautua sisään!',
'used_space' => 'Käytetty Tila',
'delete_selected' => 'Poista Valitut',
'delete_all' => 'Poista Kaikki',
'danger_zone' => 'Vaarallinen Alue',
'recaptcha_failed' => 'reCAPTCHA Epäonnistui',
'only_recaptcha_v3' => 'Vain reCAPTCHA v3 on tuettu.',
'upload_max_file_size' => 'Suurin tiedostokoko on tällä hetkellä %s.',
'changelog' => 'Muutosloki',
'show_changelog' => 'Näytä muutosloki',
'please_wait' => 'Odota…',
'hide_by_default' => 'Piilota media oletuksena',
'settings_saved' => 'Järjestelmäasetukset tallennettu!',
'export_data' => 'Vie dataa',
'dont_close' => 'Älä sulje tätä välilehteä ennen kuin on valmista.',
'donation' => 'Lahjoitus',
'donate_text' => 'Jos tykkäät XBackBone-sovelluksesta, harkitse lahjoittamista kannattaaksesi sovelluksen ohjelmointia/kehittämistä!',
'table' => 'Pöytä',
'check_for_updates' => 'Tarkista päivitykset',
'upgrade' => 'Päivitä',
'updates' => 'Päivitykset',
'maintenance_in_progress' => 'Alusta huollossa, yritä myöhemmin uudelleen…',
'password_recovery' => 'Palauta salasana',
'no_account' => 'Eikö sinulla ole käyttäjää?',
'register' => 'Rekisteröidy',
'register_success' => 'Käyttäjä on luotu, vahvistussähköposti on lähetetty.',
'mail.recover_password' => '%s - Salasanan Palautus',
'password_repeat' => 'Toista salasana',
'password_match' => 'Salasanan ja uudelleenkirjoitetun salasanan täytyy olla sama.',
'password_restored' => 'Salana nollattu.',
'image_embeds' => 'Kuvien upottaminen',
'recalculate_user_quota' => 'Käyttäjäkiintiön laskeminen uudelleen levyltä',
'quota_recalculated' => 'Käyttäjäkiintiö lasketaan uudelleen levyltä onnistuneesti.',
'recaptcha_secret_key' => 'reCAPTCHA:n salainen avain',
'recaptcha_keys_required' => 'Kaikki reCAPTCHA-näppäimet ovat pakollisia.',
'mail.new_account' => '%s - Uuden tilin luominen',
'no_tags' => 'Tunnisteita ei ole lisätty',
'auto_tagging' => 'Automaattisen latauksen taggaus',
'zip_ext_not_loaded' => 'Vaadittua "zip" -laajennusta ei ladata',
'remember_me' => 'Muista minut',
'copy_url_behavior' => 'Kopioi URL-osoite -tila',
'register_enabled' => 'Rekisteröinnit käytössä',
'no_upload_token' => 'Sinulla ei ole henkilökohtaista lataustunnusta. (Luo sellainen ja yritä uudelleen.)',
'custom_head_html_hint' => 'Tämä sisältö lisätään <head> jokaisen sivun tunnisteeseen.',
'custom_head_set' => 'Mukautettu HTML-pää käytössä.',
'file_size_no_match' => 'Ladattu tiedosto ei vastaa oikeaa tiedostokokoa.',
'prerelease_channel' => 'Ennakkojulkaisukanava',
'default_user_quota' => 'Käyttäjän oletuskiintiö',
'max_user_quota' => 'Käyttäjän enimmäiskiintiö',
'mail.activate_account' => '%s - Tilin aktivointi',
'recover_email_sent' => 'Jos sellainen on, tietylle tilille lähetettiin palautussähköpostiviesti.',
'clear_account' => 'Tyhjennä tili',
'user_create_password' => 'Jos sinut jätetään tyhjäksi, sinun kannattaa ehkä lähettää ilmoitus käyttäjän sähköpostiosoitteeseen.',
'default_lang_behavior' => 'XBackBone yrittää oletusarvoisesti vastata selaimen kieltä (vara on englanti).',
'mail.activate_text' => 'Hei %s! <br>kiitos, että loit tilisi %s(<a href="%s":lle">%s</a>), napsauta seuraavaa linkkiä aktivoidaksesi sen:<br><br><a href="%s">%s</a>',
'account_media_deleted' => 'Kaikki tilin mediat on poistettu.',
'mail.new_account_text_with_reset' => 'Hei %s! <br>sinulle luotiin uusi tili %s(<a href="%s">%s</a>), napsauta seuraavaa linkkiä asettaaksesi salasanan ja aktivoidaksesi sen:<br><br><a href="%s">%s</a>',
'mail.new_account_text_with_pw' => 'Hei %s! <br>sinulle luotiin uusi tili %s(<a href="%s">%s</a>), jolla on seuraavat tunnistetiedot:<br><br>Käyttäjänimi: %s<br>Salasana: %s<br><br>Napsauta seuraavaa linkkiä siirtyäksesi kirjautumissivulle:<br><a href="%s">%s</a>',
'ldap_cant_connect' => 'Yhteyden muodostaminen LDAP-todennuspalvelimeen ei onnistu.',
'recaptcha_site_key' => 'reCAPTCHA-sivuston avain',
'custom_head_html' => 'Mukautettu HTML Head -sisältö',
'invalid_quota' => 'Virheelliset arvot oletuskäyttäjäkiintiönä.',
'mail.recover_text' => 'Hei %s, <br>tilillesi on pyydetty salasanan palautusta. Suorita toimenpide napsauttamalla seuraavaa linkkiä:<br><br><a href="%s">%s</a><br><br>Jos et ollut sinä, joka pyysit salasanan vaihtamista, ohita tämä sähköposti.',
'quota_enabled' => 'Käyttäjäkiintiön ottaminen käyttöön',
'vanity_url' => 'Mukautettu URL',
];

View file

@ -54,7 +54,7 @@ return [
'reg_date' => 'Date d\'inscription',
'none' => 'Aucun',
'open' => 'Ouvrir',
'confirm' => 'Confirmer',
'confirm' => 'Confirmation',
'confirm_string' => 'Êtes-vous sûr·e ?',
'installed' => 'L\'installation s\'est déroulée avec succès!',
'bad_login' => 'Identifiant ou mot de passe incorrect.',
@ -162,5 +162,4 @@ return [
'zip_ext_not_loaded' => 'L\'extension zip requise n\'est pas chargée',
'copied' => 'Copié dans le presse-papier !',
'image_embeds' => 'Intégrer des images',
'vanity_url' => 'URL personnalisée',
];

View file

@ -64,7 +64,7 @@ return [
'cancel' => 'Annuler',
'maintenance_in_progress' => 'Plateforme en maintenance, réessayez plus tard…',
'updates' => 'Mises à jour',
'upgrade' => 'Mettre à niveau',
'upgrade' => 'Mettre à jour',
'check_for_updates' => 'Vérifier les mises à jour',
'file_size_no_match' => 'Le fichier téléchargé n\'a pas la taille correcte.',
'cannot_retrieve_file' => 'Impossible de retrouver le fichier.',
@ -107,7 +107,7 @@ return [
'lang' => 'Français (Canada)',
'mail.new_account_text_with_pw' => 'Bonjour %s! <br> un nouveau compte a été créé pour vous sur %s (<a href="%s">% s</a>), avec les informations d\'identification suivantes : <br> <br> Nom d\'utilisateur :%s <br> Mot de passe :%s <br> <br> Cliquez sur le lien suivant pour accéder à la page de connexion : <br> <a href="%s">%s </a>',
'maintenance' => 'Maintenance',
'confirm' => 'Confirmer',
'confirm' => 'Confirmation',
'user_create_password' => 'Si laissé vide, vous souhaiterez peut-être envoyer une notification à l\'utilisateur par courriel.',
'mail.new_account' => '%s Création d\'un nouveau compte',
'mail.recover_password' => '%s Récupération de mot de passe',
@ -160,5 +160,4 @@ return [
'enforce_language' => 'Forcer la langue',
'copied' => 'Copié dans le presse-papier!',
'image_embeds' => 'Intégrer des images',
'vanity_url' => 'URL personnalisée',
];

View file

@ -158,7 +158,5 @@ return [
'no' => 'Nem',
'yes' => 'Igen',
'enforce_language' => 'A nyelv érvényesítése',
'lang' => 'Magyar',
'image_embeds' => 'Képek beágyazása',
'vanity_url' => 'Egyedi URL',
'lang' => 'Angol',
];

View file

@ -159,6 +159,4 @@ return [
'password_match' => 'Kata sandi harus sama.',
'custom_head_set' => 'Head HTML khusus diterapkan.',
'path_not_writable' => 'Destinasi berkas tidak dapat ditulis.',
'image_embeds' => 'Sematkan gambar',
'vanity_url' => 'URL kostum',
];

View file

@ -39,10 +39,10 @@ return [
'save' => 'Salva',
'used' => 'Usato',
'system_info' => 'Informazioni di Sistema',
'user.create' => 'Crea utente',
'user.edit' => 'Modifica utente',
'is_active' => 'È attivo',
'is_admin' => 'È amministratore',
'user.create' => 'Crea Utente',
'user.edit' => 'Modifica Utente',
'is_active' => 'Attivo',
'is_admin' => 'Amministratore',
'your_profile' => 'Il tuo profilo',
'token' => 'Token',
'copy' => 'Copia',
@ -162,5 +162,4 @@ return [
'show_changelog' => 'Mostra registro dei cambiamenti',
'copied' => 'Copiato negli appunti!',
'image_embeds' => 'Incorpora immagini',
'vanity_url' => 'URL personalizzato',
];

View file

@ -35,7 +35,7 @@ return [
'files' => 'ファイル',
'orphaned_files' => '所有者のいないファイル',
'theme' => 'テーマ',
'click_to_load' => 'クリックしてロード',
'click_to_load' => 'クリックしてロード...',
'apply' => '適用',
'save' => '保存',
'system_info' => 'システム情報',
@ -90,25 +90,4 @@ return [
'system_settings' => 'システム設定',
'php_info' => 'PHPの情報',
'used' => '使用済み',
'switch_to' => '転換する:',
'table' => 'テーブル形',
'name' => 'ファイル名順',
'clean_orphaned_uploads' => '所有者のないファイルを削除',
'already_latest_version' => 'もうすでに最新のXbackboneを使っています。',
'check_for_updates' => '更新を確認',
'updates' => '更新内容',
'cancel' => 'キャンセル',
'default_lang_behavior' => 'Xbackboneで使用者のブラウザの言語を自動的に検索Defaultは英語.',
'donation' => '支援',
'donate_text' => '支援も受け入れていますので、Xbackboneが気に入った場合、よろしくお願いいたします',
'custom_head_html' => 'HTML Headのコンテンツをカスタマイズ',
'register_enabled' => '登録を活性化',
'order_by' => '…順',
'custom_head_set' => 'HTML Headのカスタマイズが適用されました。',
'copied' => 'コピーしました!',
'custom_head_html_hint' => 'この部分に入力した内容は全てのページの<head></head>の中に入ります.',
'remember_me' => 'ログイン情報を保存',
'please_wait' => '少々お待ちください…',
'dont_close' => '作業を完了する前にはこのタブを閉じないでください。',
'no_upload_token' => 'アップロードのための個人トークンがありません。(まず新しく生成してもう一度試してください)',
];

View file

@ -101,7 +101,7 @@ return [
'account_disabled' => '당신의 계정은 비활성 상태입니다.',
'bad_login' => '잘못된 자격증명입니다.',
'installed' => '설치가 완료되었어요!',
'confirm' => '확인',
'confirm' => '확인',
'confirm_string' => '확실한가요?',
'open' => '열기',
'none' => '없음',
@ -160,5 +160,4 @@ return [
'yes' => '확인',
'enforce_language' => '언어 설정',
'lang' => 'Korean',
'vanity_url' => '사용자 정의 URL',
];

View file

@ -162,5 +162,4 @@ return [
'mail.new_account' => '%s - Opprettelse av ny konto',
'send_notification' => 'Send e-postmerknad',
'copied' => 'Kopiert til utklippstavle.',
'image_embeds' => 'Integrer bilder',
];

View file

@ -54,7 +54,7 @@ return [
'reg_date' => 'Registratiedatum',
'none' => 'Geen',
'open' => 'Open',
'confirm' => 'Bevestig',
'confirm' => 'Bevestiging',
'confirm_string' => 'Weet je het zeker?',
'installed' => 'Installatie succesvol voltooid!',
'bad_login' => 'Verkeerde verificatiegegevens.',
@ -101,9 +101,9 @@ return [
'lang_name' => 'Taal',
'default_lang_behavior' => 'XBackBone probeert standaard de taal van de browser te matchen (fallback is Engels).',
'lang_set' => 'Systeemtaal "%s" afgedwongen',
'show_changelog' => 'Wijzigingslog weergeven',
'changelog' => 'Wijzigingslog',
'zip_ext_not_loaded' => 'De vereiste "zip" extensie is niet geladen',
'show_changelog' => 'Changelog weergeven',
'changelog' => 'Changelog',
'zip_ext_not_loaded' => 'De vereiste zip extensie is niet geladen',
'auto_tagging' => 'Automatisch tags aanmaken',
'no_tags' => 'Geen tags toegevoegd',
'upload_max_file_size' => 'De maximale bestandsgrootte is momenteel %s.',
@ -164,7 +164,4 @@ return [
'php_info' => 'PHP Informatie',
'upload' => 'Uploaden',
'copied' => 'Gekopieerd naar klembord!',
'vanity_url' => 'Eigen URL',
'image_embeds' => 'Afbeeldingen insluiten',
'show_all_tags' => 'Toon alle tags',
];

View file

@ -21,7 +21,7 @@ return [
'delete' => 'Usuń',
'hide' => 'Ukryj',
'files' => 'Pliki',
'click_to_load' => 'Kliknij, aby załadować',
'click_to_load' => 'Kliknij, aby załadować...',
'apply' => 'Zastosuj',
'save' => 'Zapisz',
'system_info' => 'Informacje o systemie',
@ -38,7 +38,7 @@ return [
'admin' => 'Admin',
'reg_date' => 'Data rejestracji',
'open' => 'Otwórz',
'confirm' => 'Potwierdź',
'confirm' => 'Potwierdzenie',
'confirm_string' => 'Jesteś pewien?',
'installed' => 'Instalacja zakończona pomyślnie!',
'welcome' => 'Witaj, %s!',
@ -80,8 +80,8 @@ return [
'switch_to' => 'Przełącz na',
'gallery' => 'Galeria',
'table' => 'Tabela',
'dotted_search' => 'Szukaj',
'order_by' => 'Sortuj',
'dotted_search' => 'Szukaj...',
'order_by' => 'Sortuj...',
'time' => 'Czas',
'name' => 'Nazwa',
'maintenance' => 'Konserwacja',
@ -94,7 +94,7 @@ return [
'check_for_updates' => 'Sprawdź aktualizacje',
'upgrade' => 'Aktualizuj',
'updates' => 'Aktualizacje',
'maintenance_in_progress' => 'Trwają prace techniczne, spróbuj ponownie później…',
'maintenance_in_progress' => 'Platforma w trakcie konserwacji, spróbuj ponownie później...',
'cancel' => 'Anuluj',
'auto_set' => 'Ustaw automatycznie',
'default_lang_behavior' => 'XBackBone domyślnie spróbuje dopasować język przeglądarki (zastępczym jest Angielski).',
@ -160,7 +160,4 @@ return [
'mail.new_account_text_with_reset' => 'Cześć %s!<br>zostało utworzone nowe konto dla Ciebie na %s (<a href="%s">%s</a>), kliknij w poniższy link aby ustawić hasło i aktywować je:<br><br><a href="%s">%s</a>',
'mail.recover_text' => 'Cześć %s,<br>została wysłana prośba o zresetowanie hasła do twojego konta. Aby zakończyć procedurę, kliknij w poniższy link:<br><br><a href="%s">%s</a><br><br>Jeśli to nie ty poprosiłeś o zresetowanie hasła, po prostu zignoruj ten e-mail.',
'mail.activate_text' => 'Cześć %s!<br>dziękuję za utworzenie konta na %s (<a href="%s">%s</a>), kliknij w poniższy link, aby je aktywować:<br><br><a href="%s">%s</a>',
'image_embeds' => 'Osadź obrazy',
'copied' => 'Skopiowano!',
'vanity_url' => 'Niestandardowy adres URL',
];

View file

@ -26,7 +26,7 @@ return [
'owner' => 'Dono',
'date' => 'Data',
'raw' => 'Mostrar raw',
'download' => 'Descarregar',
'download' => 'Transferir',
'delete' => 'Apagar',
'publish' => 'Publicar',
'hide' => 'Esconder',
@ -54,7 +54,7 @@ return [
'reg_date' => 'Data de registo',
'none' => 'Nenhum',
'open' => 'Abrir',
'confirm' => 'Confirmar',
'confirm' => 'Confirmação',
'confirm_string' => 'Tem a certeza?',
'installed' => 'Instalação completa com sucesso!',
'bad_login' => 'Login inválido.',
@ -161,5 +161,4 @@ return [
'register' => 'Registar',
'settings_saved' => 'Definições de sistema guardadas!',
'image_embeds' => 'Embutir imagens',
'vanity_url' => 'URL personalizado',
];

View file

@ -1,163 +0,0 @@
<?php
return [
'login' => 'Autentificare',
'password' => 'Parola',
'lang' => 'Română',
'enforce_language' => 'Aplică limba',
'yes' => 'Da',
'username' => 'Utilizator',
'send' => 'Trimite',
'no_media' => 'Nu s-a gasit media.',
'login.username' => 'Utilizator sau E-Mail',
'no' => 'Nu',
'users' => 'Utilizatori',
'system' => 'Sistem',
'profile' => 'Profil',
'pager.previous' => 'Anterior',
'public.telegram' => 'Distribuie pe Telegram',
'home' => 'Acasa',
'logout' => 'Iesire',
'pager.next' => 'Urmatorul',
'copy_link' => 'Copiaza link-ul',
'public.delete_text' => 'Esti sigur ca doresti sa stergi acest element? Nu il vei putea recupera',
'preview' => 'Previzualizeaza',
'filename' => 'Numele fisierului',
'size' => 'Dimensiune',
'public' => 'Public',
'delete' => 'Elimina',
'publish' => 'Publica',
'hide' => 'Ascunde',
'files' => 'Fisiere',
'orphaned_files' => 'Fisiere Orfane',
'theme' => 'Tema',
'click_to_load' => 'Apasa pentru a incarca…',
'apply' => 'Aplica',
'save' => 'Salveaza',
'used' => 'Folosit',
'php_info' => 'Informatii PHP',
'system_settings' => 'Setari de Sistem',
'user.create' => 'Creaza Utilizator',
'is_active' => 'Este activ',
'is_admin' => 'Este administrator',
'your_profile' => 'Profilul Tau',
'token' => 'Token',
'copy' => 'Copiaza',
'copied' => 'Copiat in clipboard!',
'update' => 'Actualizare',
'edit' => 'Editare',
'client_config' => 'Configuratie Client',
'user_code' => 'Cod Utilizator',
'active' => 'Activ',
'admin' => 'Admin',
'reg_date' => 'Data de Inregistrare',
'none' => 'Nimic',
'open' => 'Deschis',
'confirm' => 'Confirmare',
'bad_login' => 'Date gresite.',
'account_disabled' => 'Contul tau este dezactivat.',
'welcome' => 'Bine ai venit, %s!',
'goodbye' => 'La revedere!',
'email_required' => 'Adresa de e-mail este necesara.',
'email_taken' => 'Adresa de e-mail este deja folosita.',
'username_required' => 'Numele de utilizator este necesar.',
'username_taken' => 'Numele de utilizator este deja folosit.',
'cannot_demote' => 'Nu te poti retrograda.',
'cannot_write_file' => 'Nu se poate scrie in calea de destinatie.',
'deleted_orphans' => 'S-au sters cu succes %d fisiere orfane.',
'switch_to' => 'Comuta la',
'gallery' => 'Galerie',
'order_by' => 'Comanda dupa…',
'time' => 'Timp',
'name' => 'Nume',
'maintenance' => 'Mentenanta',
'clean_orphaned_uploads' => 'Curata Incarcarile Orfane',
'path_not_writable' => 'Nu se poate scrie in calea de iesire.',
'already_latest_version' => 'Ai deja ultima versiune.',
'new_version_available' => 'Versiune noua %s valabila!',
'cannot_retrieve_file' => 'Nu se poate recupera fisierul.',
'file_size_no_match' => 'Fisierul descarcat nu se potriveste cu dimensiunea corecta a fisierului.',
'check_for_updates' => 'Verifica actualizari',
'upgrade' => 'Actualizare',
'updates' => 'Actualizari',
'cancel' => 'Anuleaza',
'auto_set' => 'Seteaza automat',
'default_lang_behavior' => 'XBackBone va incerca in mod implicit sa foloseasca limba browser-ului (limba de rezerva este Engleza).',
'prerelease_channel' => 'Canal Pre-Lansari',
'no_upload_token' => 'Nu ai un token personal de incarcare. (Genereaza unul si incearca din nou.)',
'drop_to_upload' => 'Apasa sau lasa fisierele aici pentru a le incarca.',
'donation' => 'Donatie',
'donate_text' => 'Daca-ti place XBackBone, ia in considerare o donatie pentru a sprijini dezvoltarea lui!',
'custom_head_html' => 'Continut personalizat HTML Head',
'custom_head_html_hint' => 'Acest continut va fi adaugat in tagul <head> pe fiecare pagina.',
'custom_head_set' => 'HTML head personalizat aplicat.',
'remember_me' => 'Nu ma uita',
'please_wait' => 'Te rog sa astepti…',
'dont_close' => 'Nu inchide acest tab inainte de finalizare.',
'register_enabled' => 'Inregistrari active',
'hide_by_default' => 'Ascunde media in mod implicit',
'copy_url_behavior' => 'Modul Copiere URL',
'settings_saved' => 'Setari de sistem salvate!',
'export_data' => 'Exporta data',
'password_recovery' => 'Recupereaza parola',
'no_account' => 'Nu ai un cont?',
'register' => 'Inregistrare',
'register_success' => 'Contul a fost creat, un e-mail de confirmare a fost trimis.',
'default_user_quota' => 'Quota User Implicit',
'max_user_quota' => 'Quota User Maxim',
'invalid_quota' => 'Valori invalide ca si user quota in mod implicit.',
'mail.recover_password' => '%s - Recuperare Parola',
'recover_email_sent' => 'Daca exista, un e-mail pentru recuperare a fost trimis catre contul specificat.',
'account_activated' => 'Cont activat, acum te poti autentifica!',
'quota_enabled' => 'Activeaza user quota',
'password_repeat' => 'Repeta Parola',
'password_match' => 'Parola si parola repetata trebuie sa fie identice.',
'password_restored' => 'Parola resetata.',
'recalculate_user_quota' => 'Recalculeaza user quota de pe disc',
'quota_recalculated' => 'User quota recalculata de pe disc cu succes.',
'used_space' => 'Spatiu Utilizat',
'delete_selected' => 'Sterge cele Selectate',
'delete_all' => 'Sterge Tot',
'clear_account' => 'Curata Contul',
'recaptcha_failed' => 'reCAPTCHA Esuat',
'recaptcha_enabled' => 'reCAPTCHA Activat',
'recaptcha_keys_required' => 'Toate cheile reCAPTCHA sunt necesare.',
'only_recaptcha_v3' => 'Doar reCAPTCHA v3 este suportat.',
'recaptcha_site_key' => 'reCAPTCHA Cheie Site',
'recaptcha_secret_key' => 'reCAPTCHA Cheie Secreta',
'send_notification' => 'Trimite Notificare prin E-mail',
'mail.new_account' => '%s - Crearea Unui Cont Nou',
'mail.new_account_text_with_reset' => 'Hey %s!<br>un nou cont a fost creat pentru tine pe %s (<a href="%s">%s</a>), apasa pe urmatorul link pentru a-ti seta o parola si a-ti activa contul:<br><br><a href="%s">%s</a>',
'user_create_password' => 'Daca este lasat gol, este posibil sa doresti sa trimiti o notificare la adresa de e-mail a utilizatorului.',
'ldap_cant_connect' => 'Nu se poate conecta la serverul de autentificare LDAP.',
'upload_max_file_size' => 'In acest moment dimensiunea maxima pentru un fisier este %s.',
'no_tags' => 'Nu s-au adaugat etichete',
'auto_tagging' => 'Incarcare automata a etichetarii',
'zip_ext_not_loaded' => 'Extensia "zip" necesara nu este incarcata',
'show_changelog' => 'Afiseaza jurnalul cu schimbari',
'image_embeds' => 'Incorporeaza imagini',
'user_updated' => 'Utilizator "%s" actualizat!',
'user_deleted' => 'Utilizator eliminat.',
'owner' => 'Proprietar',
'date' => 'Data',
'upload' => 'Incarca',
'user.edit' => 'Editeaza Utilizator',
'confirm_string' => 'Esti sigur?',
'raw' => 'Afiseaza brut',
'download' => 'Descarca',
'password_required' => 'Parola este necesara.',
'user_created' => 'Utilizator "%s" creat!',
'table' => 'Tabel',
'dotted_search' => 'Cauta…',
'installed' => 'Instalarea s-a completat cu succes!',
'profile_updated' => 'Profil actualizat cu succes!',
'mail.recover_text' => 'Hey %s,<br>o resetare de parola a fost ceruta pentru contul tau. Pentru a completa procedura, apasa pe urmatorul link:<br><br><a href="%s">%s</a><br><br>Daca nu ai fost tu cel care a cerut resetarea, te rog sa ignori acest e-mail.',
'token_not_found' => 'Token-ul specificat nu a fost gasit.',
'cannot_delete' => 'Nu te poti elimina pe tine.',
'maintenance_in_progress' => 'Platforma este in mentenanta, incearca mai tarziu…',
'mail.activate_text' => 'Hey %s!<br>iti multumesc ca ti-ai creat cont pe %s (<a href="%s">%s</a>), apasa pe urmatorul link pentru a-ti activa contul:<br><br><a href="%s">%s</a>',
'danger_zone' => 'Zona Periculoasa',
'mail.activate_account' => '%s - Activare Cont',
'account_media_deleted' => 'Toata media de pe cont a fost eliminata.',
'changelog' => 'Schimbari',
'mail.new_account_text_with_pw' => 'Hey %s!<br>un nou cont a fost creat pentru tine pe %s (<a href="%s">%s</a>), cu urmatoarele date:<br><br>Nume de utilizator: %s<br>Parola: %s<br><br>Apasa pe urmatorul link pentru a te autentifica:<br><a href="%s">%s</a>',
];

View file

@ -45,16 +45,16 @@ return [
'your_profile' => 'Ваш профиль',
'token' => 'Ключ',
'copy' => 'Копировать',
'update' => 'Обновление',
'update' => 'Обновить',
'edit' => 'Редактировать',
'client_config' => 'Конфигурация клиента',
'user_code' => 'Код пользователя',
'active' => 'Активный',
'active' => 'Активен',
'admin' => 'Админ',
'reg_date' => 'Дата регистрации',
'none' => 'Никак',
'none' => 'Нет',
'open' => 'Открыть',
'confirm' => 'Потвердить',
'confirm' => 'Подтверждение',
'confirm_string' => 'Вы уверены?',
'installed' => 'Установка успешно завершена!',
'bad_login' => 'Неверные учетные данные.',
@ -163,7 +163,5 @@ return [
'copied' => 'Скопировано!',
'system_settings' => 'Системные настройки',
'upload' => 'Выгрузить',
'php_info' => 'Информация о PHP',
'image_embeds' => 'Встроенные изображения',
'vanity_url' => 'Пользовательский URL',
'php_info' => 'Инфо о PHP',
];

View file

@ -1,163 +0,0 @@
<?php
return [
'no' => 'Ne',
'yes' => 'Da',
'send' => 'Pošalji',
'no_media' => 'Nije pronađen nijedan medija.',
'login.username' => 'Korisničko ime ili e-mail',
'password' => 'Lozinka',
'login' => 'Prijavite se',
'username' => 'Korisničko ime',
'home' => 'Kuća',
'users' => 'Korisnici',
'profile' => 'Profil',
'logout' => 'Odjavi se',
'pager.next' => 'Sledeće',
'pager.previous' => 'Prethodno',
'copy_link' => 'Kopiraj link',
'public.telegram' => 'Podeli na Telegramu',
'public.delete_text' => 'Da li ste sigurni da želite da izbrišete ovu stvar? Nećete moći da ga povratite',
'preview' => 'Pregled',
'size' => 'Veličina',
'public' => 'Javno',
'owner' => 'Vlasnik',
'date' => 'Datum',
'raw' => 'Prikaži raw',
'download' => 'Preuzimanje',
'delete' => 'Izbriši',
'publish' => 'Objavite',
'hide' => 'Sakri',
'files' => 'Fajlovi',
'theme' => 'Tema',
'click_to_load' => 'Kliknite za učitavanje…',
'apply' => 'Primeniti',
'save' => 'Sačuvaj',
'used' => 'Korišćeno',
'php_info' => 'PHP informacije',
'user.create' => 'Napravi korisnika',
'upload' => 'Upload',
'orphaned_files' => 'Orphaned Fajlovi',
'is_active' => 'Aktivan',
'is_admin' => 'Je administrator',
'token' => 'Token',
'copy' => 'Kopiraj',
'update' => 'Ažuriraj',
'edit' => 'Urediti',
'client_config' => 'Konfiguracija klijenta',
'user_code' => 'Korisnički kod',
'active' => 'Aktivan',
'admin' => 'Admin',
'reg_date' => 'Datum registracije',
'none' => 'Nijedan',
'open' => 'Otvori',
'confirm' => 'Potvrda',
'installed' => 'Instalacija je uspešno završena!',
'bad_login' => 'Pogrešne akreditive.',
'account_disabled' => 'Vaš nalog je onemogućen.',
'welcome' => 'Dobrodošli, %s!',
'goodbye' => 'Doviđenja!',
'token_not_found' => 'Navedeni token nije pronađen.',
'email_required' => 'E-mail adresa je obavezna.',
'email_taken' => 'E-mail adresa je već u upotrebi.',
'username_required' => 'Korisničko ime je obavezno.',
'user_created' => 'Korisnik "%s“ je kreiran!',
'user_updated' => 'Korisnik "%s“ je ažuriran!',
'profile_updated' => 'Profil je uspešno ažuriran!',
'user_deleted' => 'Korisnik je obrisan.',
'cannot_delete' => 'Ne možete da sami sebe izbrisati.',
'deleted_orphans' => 'Uspešno izbrisano %d orphaned files.',
'switch_to' => 'Prebacite na',
'gallery' => 'Galerija',
'table' => 'Sto',
'dotted_search' => 'Pretraga…',
'order_by' => 'Pretraga po…',
'time' => 'Vreme',
'name' => 'Ime',
'maintenance' => 'Održavanje',
'clean_orphaned_uploads' => 'Očistite neispunjene otpremanja',
'path_not_writable' => 'Na izlaznu putanju nije moguće pisati.',
'already_latest_version' => 'Već imate najnoviju verziju.',
'new_version_available' => 'Dostupna je nova verzija %s!',
'file_size_no_match' => 'Preuzet fajl ne odgovara ispravnoj veličini fajla.',
'check_for_updates' => 'Proveri ažuriranja',
'upgrade' => 'Nadogradi',
'updates' => 'Ažuriranja',
'cancel' => 'Otkaži',
'auto_set' => 'Podesite automatski',
'default_lang_behavior' => 'KSBackBone će pokušati da podrazumeva jezik pretraživača (zamena je engleski).',
'prerelease_channel' => 'Prerelease kanal',
'no_upload_token' => 'Nemate lični token za otpremanje. (Generišite jedan i pokušajte ponovo.)',
'donation' => 'Donacija',
'donate_text' => 'Ako vam se sviđa KSBackBone, razmislite o donaciji za podršku razvoju!',
'custom_head_html' => 'Prilagođeni sadržaj HTML glave',
'custom_head_html_hint' => 'Ovaj sadržaj će biti dodat u oznaku <head> na svakoj stranici.',
'custom_head_set' => 'Primenjena prilagođena HTML glava.',
'remember_me' => 'Zapamti me',
'dont_close' => 'Ne zatvarajte ovu karticu dok se ne završi.',
'hide_by_default' => 'Podrazumevano sakrijte medije',
'copy_url_behavior' => 'Režim kopiranja URL-a',
'settings_saved' => 'Podešavanja sistema su sačuvana!',
'export_data' => 'Izvadi podatke',
'password_recovery' => 'Oporavi lozinku',
'no_account' => 'Nemate nalog?',
'register' => 'Registrujte se',
'default_user_quota' => 'Podrazumevana korisnička kvota',
'max_user_quota' => 'Maksimalna kvota korisnika',
'invalid_quota' => 'Nevažeće vrednosti kao podrazumevana korisnička kvota.',
'mail.activate_account' => '%s - Aktivacija naloga',
'mail.recover_password' => '%s - Oporavak lozinke',
'recover_email_sent' => 'Ako postoji, na navedeni nalog je poslata e-pošta za oporavak.',
'account_activated' => 'Nalog je aktiviran, sada možete da se prijavite!',
'quota_enabled' => 'Omogući korisničku kvotu',
'password_repeat' => 'Ponovite lozinku',
'password_match' => 'Lozinka i lozinka za ponavljanje moraju biti iste.',
'password_restored' => 'Resetovanje lozinke.',
'recalculate_user_quota' => 'Ponovo izračunajte korisničku kvotu sa diska',
'lang' => 'Engleski',
'quota_recalculated' => 'Korisnička kvota je ponovo izračunata sa diska.',
'used_space' => 'Iskorišćeni prostor',
'delete_selected' => 'Izbriši izabrano',
'delete_all' => 'Izbriši sve',
'clear_account' => 'Obriši nalog',
'account_media_deleted' => 'Svi mediji na nalogu su izbrisani.',
'danger_zone' => 'Opasna zona',
'recaptcha_failed' => 'reCAPTCHA nije uspela',
'recaptcha_enabled' => 'reCAPTCHA je omogućena',
'recaptcha_keys_required' => 'Svi reCAPTCHA ključevi su obavezni.',
'only_recaptcha_v3' => 'Samo je reCAPTCHA v3 podržan.',
'recaptcha_site_key' => 'reCAPTCHA ključ sajta',
'recaptcha_secret_key' => 'reCAPTCHA tajni ključ',
'send_notification' => 'Pošaljite obaveštenje e-poštom',
'mail.new_account' => '%s - Kreiranje novog naloga',
'mail.new_account_text_with_reset' => 'Zdravo %s!<br>novi nalog je napravljen za vas na %s (<a href="%s">%s</a>), kliknite na sledeću vezu da postavite lozinku i aktivirate je:<br ><br><a href="%s">%s</a>',
'mail.new_account_text_with_pw' => 'Zdravo %s!<br>novi nalog je napravljen za vas na %s (<a href="%s">%s</a>), sa sledećim akreditivima:<br><br>Korisničko ime: %s <br>Lozinka: %s<br><br>Kliknite na sledeću vezu da biste otišli na stranicu za prijavu:<br><a href="%s">%s</a>',
'user_create_password' => 'Ako ostavite prazno, možda ćete želeti da pošaljete obaveštenje na adresu e-pošte korisnika.',
'ldap_cant_connect' => 'Ne mogu da se povežem sa LDAP serverom za potvrdu identiteta.',
'upload_max_file_size' => 'Maksimalna veličina fajla je trenutno %s.',
'no_tags' => 'Nema dodatih oznaka',
'auto_tagging' => 'Automatsko otpremanje oznaka',
'zip_ext_not_loaded' => 'Potrebna ekstenzija "zip" nije učitana',
'changelog' => 'Dnevnik pronena',
'show_changelog' => 'Prikaži dnevnik promena',
'image_embeds' => 'Ugradi slike',
'enforce_language' => 'Sprovedite jezik',
'user.edit' => 'Uredi korisnika',
'system' => 'Sistem',
'filename' => 'Naziv dokumenta',
'system_settings' => 'Podešavanja sistema',
'your_profile' => 'Tvoj profil',
'copied' => 'Kopirano u međuspremnik!',
'confirm_string' => 'Da li ste sigurni?',
'username_taken' => 'Korisničko ime je već zauzeto.',
'cannot_retrieve_file' => 'Nije moguće preuzeti fajl.',
'cannot_write_file' => 'Putanja odredišta nije upisiva.',
'maintenance_in_progress' => 'Platforma se održava, pokušajte ponovo kasnije…',
'password_required' => 'Lozinka je obavezna.',
'cannot_demote' => 'Ne možete sami sebe degradirati.',
'drop_to_upload' => 'Kliknite ili otpustite svoje fajlove ovde da biste ih otpremili.',
'register_enabled' => 'Registracije su omogućene',
'please_wait' => 'Sačekajte…',
'register_success' => 'Nalog je kreiran, e-mail za potvrdu je poslat.',
'mail.activate_text' => 'Zdravo %s!<br>hvala što ste otvorili svoj nalog na %s (<a href="%s">%s</a>), kliknite na sledeću vezu da biste ga aktivirali:<br><br>< a href="%s">%s</a>',
'mail.recover_text' => 'Zdravo %s,<br>zatraženo je resetovanje lozinke za vaš nalog. Da biste završili proceduru kliknite na sledeću vezu:<br><br><a href="%s">%s</a><br><br>Ako niste vi tražili resetovanje lozinke, jednostavno ignorišite ovu e-poštu.',
];

View file

@ -155,11 +155,9 @@ return [
'cannot_write_file' => 'Destinationens sökväg är ej skrivbar.',
'cannot_demote' => 'Du kan inte degradera dig själv.',
'token_not_found' => 'Den token som angavs hittades inte.',
'confirm' => 'Bekräfta',
'confirm' => 'Bekräftelse',
'copied' => 'Kopierat till urklipp!',
'token' => 'Token',
'orphaned_files' => 'Föräldralösa Filer',
'image_embeds' => 'Inbäddade bilder',
'vanity_url' => 'Anpassad URL',
'show_all_tags' => 'Visa alla taggar',
];

View file

@ -1,165 +1,51 @@
<?php
return [
'orphaned_files' => 'Sahipsiz Dosyalar',
'orphaned_files' => 'Çöp dosyalar',
'files' => 'Dosyalar',
'hide' => 'Gizle',
'publish' => 'Yayınla',
'publish' => 'yayınla',
'delete' => 'Sil',
'upload' => 'Yükle',
'download' => 'İndir',
'raw' => 'Kaynak göster',
'upload' => 'yükle',
'download' => 'indir',
'raw' => 'kaynak göster',
'date' => 'Tarih',
'owner' => 'Sahip',
'public' => 'Herkese açık',
'size' => 'Boyut',
'size' => 'boyut',
'filename' => 'Dosya adı',
'preview' => 'Ön izleme',
'public.delete_text' => 'Bu ögeyi silmek istediğinizden emin misiniz? Geri dönüşü olmayacaktır',
'public.telegram' => 'Telegram\'da paylaş',
'preview' => 'Önizle',
'public.delete_text' => 'Bu öğeyi silmek istediğinizden emin misiniz? geri dönüşü olmayacaktır',
'public.telegram' => 'Telegram\'da paylaş !',
'copy_link' => 'Bağlantıyı kopyala',
'pager.previous' => 'Önceki',
'pager.next' => 'Sonraki',
'logout' => 'Oturumu kapat',
'logout' => 'Çıkış yap',
'profile' => 'Profil',
'system' => 'Sistem',
'users' => 'Kullanıcılar',
'home' => 'Ana sayfa',
'home' => 'Anasayfa',
'username' => 'Kullanıcı adı',
'login' => 'Oturum aç',
'password' => 'Parola',
'login' => 'Giriş',
'password' => 'Şifre',
'login.username' => 'Kullanıcı adı veya e-posta',
'no_media' => 'Medya ortamı bulunamadı.',
'send' => 'Gönder',
'no' => 'Hayır',
'yes' => 'Evet',
'enforce_language' => 'Dili uygula',
'lang' => 'Türkçe',
'enforce_language' => 'Mevcut dile zorla',
'lang' => 'ingilizce',
'copy' => 'Kopyala',
'token' => 'Belirteç',
'token' => 'Token',
'your_profile' => 'Profiliniz',
'is_admin' => 'Yönetici mi',
'is_active' => 'Etkin mi',
'user.edit' => 'Kullanıcıyı düzenle',
'is_active' => 'Aktif mi',
'user.edit' => 'Kullanıcı bilgilerini değiştir',
'user.create' => 'Kullanıcı oluştur',
'system_settings' => 'Sistem Ayarları',
'php_info' => 'PHP Bilgileri',
'used' => 'Kullanılan',
'save' => 'Kaydet',
'apply' => 'Uygula',
'click_to_load' => 'Yüklemek için tıklayın…',
'click_to_load' => 'Yüklemek için tıklayınız…',
'theme' => 'Tema',
'username_taken' => 'Kullanıcı adı zaten alınmış.',
'password_required' => 'Parola gerekli.',
'reg_date' => 'Kayıt Tarihi',
'active' => 'Etkin',
'none' => 'Yok',
'open' => 'Açık',
'admin' => 'Yönetici',
'copied' => 'Panoya kopyalandı!',
'update' => 'Güncelle',
'edit' => 'Düzenle',
'client_config' => 'İstemci Yapılandırması',
'user_code' => 'Kullanıcı kodu',
'confirm_string' => 'Emin misiniz?',
'installed' => 'Kurulum başarıyla tamamlandı!',
'bad_login' => 'Yanlış kimlik bilgileri.',
'account_disabled' => 'Hesabınız devre dışı bırakıldı.',
'welcome' => 'Hoş geldiniz, %s!',
'goodbye' => 'Hoşça kal!',
'token_not_found' => 'Belirtilen belirteç bulunamadı.',
'email_required' => 'E-posta adresi gerekli.',
'email_taken' => 'Bu e-posta adresi zaten kullanılıyor.',
'username_required' => 'Kullanıcı adı gerekli.',
'image_embeds' => 'Gömülü görüntü',
'default_lang_behavior' => 'XBackBone varsayılan olarak tarayıcı diliyle eşleşmeye çalışacaktır (yedek dil İngilizce\'dir).',
'no_upload_token' => 'Kişisel bir yükleme belirteciniz yok. (Bir tane oluşturun ve tekrar deneyin.)',
'copy_url_behavior' => 'URL\'i kopyalama modu',
'delete_all' => 'Hepsini Sil',
'max_user_quota' => 'Azami Kullanıcı Kotası',
'mail.recover_text' => 'Merhaba %s,<br>hesabınız için bir parola sıfırlama istendi. İşlemleri tamamlamak için aşağıdaki bağlantıya tıklayın:<br><br><a href="%s">%s</a><br><br>Parola sıfırlamayı isteyen siz değilseniz bu e-postayı dikkate almayın.',
'clear_account' => 'Hesabı Temizle',
'mail.new_account_text_with_pw' => 'Merhaba %s!<br>, %s (<a href="%s">%s</a>) tarihinde sizin için aşağıdaki kimlik bilgileriyle yeni bir hesap oluşturuldu:<br><br>Kullanıcı adı: %s<br>Parola: %s<br><br>Oturum açma sayfasına gitmek için aşağıdaki bağlantıya tıklayın:<br><a href="%s">%s</a>',
'upload_max_file_size' => 'Azami dosya boyutu şu anda %s.',
'recover_email_sent' => 'Varsa, belirtilen hesaba bir kurtarma e-postası gönderildi.',
'cannot_demote' => 'Kendinizi rütbenizi indiremezsiniz.',
'cannot_write_file' => 'Hedef yol yazılabilir değil.',
'deleted_orphans' => '%d sahipsiz dosya başarıyla silindi.',
'gallery' => 'Galeri',
'table' => 'Tablo',
'dotted_search' => 'Ara…',
'time' => 'Zaman',
'name' => 'Ad',
'maintenance' => 'Bakım',
'path_not_writable' => ıkış yolu yazılabilir değil.',
'already_latest_version' => 'Zaten son sürüme sahipsiniz.',
'new_version_available' => 'Yeni %s sürümü var!',
'cannot_retrieve_file' => 'Dosya alınamıyor.',
'file_size_no_match' => 'İndirilen dosya doğru dosya boyutu ile eşleşmiyor.',
'check_for_updates' => 'Güncellemeleri denetle',
'upgrade' => 'Güncelle',
'updates' => 'Güncellemeler',
'maintenance_in_progress' => 'Platform bakımda, daha sonra tekrar deneyin…',
'cancel' => 'İptal',
'auto_set' => 'Otomatik olarak ayarla',
'prerelease_channel' => 'Ön Yayın Kanalı',
'drop_to_upload' => 'Yüklemek için dosyalarınızı buraya bırakın veya tıklayın.',
'donation' => 'Bağış',
'donate_text' => 'XBackBone\'u beğendiyseniz, geliştirmeyi desteklemek için bir bağış yapmayı düşünün!',
'custom_head_html_hint' => 'Bu içerik her sayfanın <head> etiketine eklenecek.',
'remember_me' => 'Beni hatırla',
'please_wait' => 'Lütfen bekleyin…',
'dont_close' => 'Tamamlanana kadar bu sekmeyi kapatmayın.',
'register_enabled' => 'Kayıtlar etkinleştirildi',
'hide_by_default' => 'Varsayılan olarak medyayı gizle',
'settings_saved' => 'Sistem ayarları kaydedildi!',
'export_data' => 'Veriyi dışarı çıkar',
'password_recovery' => 'Parolayı kurtar',
'no_account' => 'Hesabınız yok mu?',
'register' => 'Kaydol',
'register_success' => 'Hesap oluşturuldu, bir onay e-postası gönderildi.',
'default_user_quota' => 'Varsayılan Kullanıcı Kotası',
'invalid_quota' => 'Varsayılan kullanıcı kotası geçersiz değer.',
'mail.activate_account' => '%s - Hesap Etkinleştirme',
'mail.recover_password' => '%s - Parola Kurtarma',
'account_activated' => 'Hesap etkinleştirildi, artık oturum açabilirsiniz!',
'quota_enabled' => 'Kullanıcı kotasını etkinleştir',
'password_repeat' => 'Parolayı Tekrarla',
'password_match' => 'Parola ve tekrarlanan parola aynı olmalıdır.',
'password_restored' => 'Parola sıfırlandı.',
'recalculate_user_quota' => 'Diskten kullanıcı kotasını yeniden hesapla',
'quota_recalculated' => 'Diskten kullanıcı kotası başarıyla yeniden hesaplandı.',
'used_space' => 'Kullanılan Alan',
'delete_selected' => 'Seçilenleri Sil',
'account_media_deleted' => 'Hesaptaki tüm medya silindi.',
'danger_zone' => 'Tehlike Bölgesi',
'recaptcha_failed' => 'reCAPTCHA Başarısız oldu',
'recaptcha_enabled' => 'reCAPTCHA etkinleştirildi',
'recaptcha_keys_required' => 'Bütün reCAPTCHA anahtarları gerekli.',
'only_recaptcha_v3' => 'Yalnızca reCAPTCHA v3 desteklenmektedir.',
'recaptcha_site_key' => 'reCAPTCHA Site Anahtarı',
'recaptcha_secret_key' => 'reCAPTCHA Gizli Anahtarı',
'send_notification' => 'E-posta Bildirimi Gönder',
'mail.new_account' => '%s - Yeni Hesap Oluşturma',
'mail.new_account_text_with_reset' => 'Merhaba %s!<br>, %s (<a href="%s">%s</a>) tarihinde sizin için yeni bir hesap oluşturuldu, bir parola belirlemek ve etkinleştirmek için aşağıdaki bağlantıya tıklayın:<br><br><a href="%s">%s</a>',
'user_create_password' => 'Boş bırakılırsa, kullanıcı e-posta adresine bir bildirim göndermek isteyebilirsiniz.',
'ldap_cant_connect' => 'LDAP kimlik doğrulama sunucusuna bağlanılamıyor.',
'no_tags' => 'Etiket eklenmedi',
'auto_tagging' => 'Otomatik yükleme etiketleme',
'zip_ext_not_loaded' => 'Gereken "zip" eklentisi yüklenmedi',
'changelog' => 'Değişiklik Günlüğü (Yama Notları)',
'show_changelog' => 'Değişiklik günlüğünü göster',
'confirm' => 'Onayla',
'user_created' => '"%s" kullanıcısı oluşturuldu!',
'user_updated' => '"%s" kullanıcısı güncellendi!',
'profile_updated' => 'Profil başarıyla güncellendi!',
'user_deleted' => 'Kullanıcı silindi.',
'cannot_delete' => 'Kendi kullanıcınızı silemezsiniz.',
'order_by' => 'Sıralama ölçütü…',
'clean_orphaned_uploads' => 'Sahipsiz Yüklemeleri Temizle',
'custom_head_html' => 'Özel HTML başlık içeriği',
'custom_head_set' => 'Özel HTML başlığı uygulandı.',
'mail.activate_text' => 'Merhaba %s!<br>%s (<a href="%s">%s</a>) hesabınızı oluşturduğunuz için teşekkür ederiz, etkinleştirmek için aşağıdaki bağlantıya tıklayın:<br><br><a href="%s">%s</a>',
'switch_to' => 'Şuna geç',
'vanity_url' => 'Özel URL',
'show_all_tags' => 'Tüm etiketleri göster',
];

View file

@ -1,163 +0,0 @@
<?php
return [
'yes' => 'Có',
'reg_date' => 'Ngày đăng ký',
'lang' => 'Tiếng Việt',
'enforce_language' => 'Cài đặt ngôn ngữ',
'send' => 'Gửi',
'login.username' => 'Tên đăng nhập hoặc Email',
'password' => 'Mật khẩu',
'users' => 'Người dùng',
'system' => 'Hệ thống',
'profile' => 'Hồ sơ',
'logout' => 'Thoát',
'pager.previous' => 'Trước',
'copy_link' => 'Copy đường link',
'pager.next' => 'Tiếp',
'public.telegram' => 'Chia sẻ lên Telegram',
'public.delete_text' => 'Bạn có chắc là muốn xoá mục này? Bạn sẽ không thể khôi phục lại nó sau khi xoá',
'preview' => 'Xem trước',
'filename' => 'Tên tập tin',
'size' => 'Kích cỡ',
'public' => 'Chia sẻ công cộng',
'owner' => 'Chủ sở hữu',
'date' => 'Ngày',
'raw' => 'Xem dạng thuần',
'download' => 'Tải xuống',
'delete' => 'Xoá',
'publish' => 'Đăng lên',
'hide' => 'Ẩn đi',
'files' => 'Tập tin',
'theme' => 'Phông nền',
'click_to_load' => 'Bấm vào để tải…',
'save' => 'Lưu',
'used' => 'Đã sử dụng',
'php_info' => 'Thông tin PHP',
'no_media' => 'Không tìm thấy dữ liệu.',
'orphaned_files' => 'Tập tin với thư mục chính đã bị xoá',
'user.edit' => 'Chỉnh sửa Người dùng',
'is_active' => 'Đang hoạt động',
'token' => 'Mã token',
'copied' => 'Đã sao chép!',
'update' => 'Cập nhật',
'edit' => 'Chỉnh sửa',
'user_code' => 'Mã Người dùng',
'none' => 'Không có',
'open' => 'Mở',
'confirm' => 'Xác nhận',
'confirm_string' => 'Bạn có chắc chứ?',
'installed' => 'Đã hoàn thành cài đặt thành công!',
'welcome' => 'Chào mừng vào XBackBone, %s!',
'goodbye' => 'Gặp lại lần sau nhé!',
'token_not_found' => 'Mã token nhập vào không được tìm thấy.',
'email_taken' => 'Địa chỉ email đã được sử dụng.',
'username_taken' => 'Tên đăng nhập này đã có người sử dụng rồi.',
'password_required' => 'Bạn cần nhập mật khẩu.',
'user_created' => 'Người dùng "%s" đã được tạo!',
'user_updated' => 'Người dùng "%s" đã được cập nhật!',
'user_deleted' => 'Đã xoá người dùng.',
'cannot_demote' => 'Bạn không thể tự giáng cấp tài khoản người dùng của mình.',
'cannot_write_file' => 'Đường dẫn đích không thể ghi dữ liệu vào được.',
'switch_to' => 'Chuyển về',
'gallery' => 'Xem theo ô',
'table' => 'Xem dạng bảng',
'path_not_writable' => 'Đường dẫn xuất ra không ghi dữ liệu vào được.',
'already_latest_version' => 'Bạn đang dùng phiên bản mới nhất.',
'cannot_retrieve_file' => 'Không thể trích xuất tập tin.',
'check_for_updates' => 'Kiểm tra phiên bản mới',
'upgrade' => 'Nâng cấp',
'updates' => 'Cập nhật',
'maintenance_in_progress' => 'Hệ thống đang bảo trì, vui lòng thử lại sau…',
'cancel' => 'Bỏ',
'auto_set' => 'Tự động cài đặt',
'no_upload_token' => 'Bạn chưa có một mã tải lên cá nhân. (Hãy tạo một mã và thử lại nhé.)',
'drop_to_upload' => 'Bấm vào hoặc bỏ tập tin của bạn vào đây để tải lên.',
'donate_text' => 'Nếu bạn thích XBackBone, xin hãy quyên góp để hỗ trợ việc phát triển phần mềm cho người dùng!',
'custom_head_html' => 'Nội dung phần đầu dạng HTML tuỳ chỉnh',
'remember_me' => 'Nhớ tên đăng nhập',
'please_wait' => 'Xin chờ một chút…',
'settings_saved' => 'Cài đặt hệ thống đã được lưu!',
'export_data' => 'Xuất dữ liệu',
'password_recovery' => 'Khôi phục mật khẩu',
'no_account' => 'Bạn chưa có tài khoản?',
'register' => 'Hãy đăng ký',
'register_success' => 'Tài khoản của bạn đã được tạo, email xác nhận đã được gửi cho bạn.',
'default_user_quota' => 'Dung lượng mặc định cho người dùng',
'invalid_quota' => 'Thông tin dung lượng người dùng mặc định nhập vào không hợp lệ.',
'mail.activate_account' => '%s - Kích hoạt tài khoản',
'mail.recover_text' => 'Chào bạn %s,<br>một lệnh khôi phục mật khẩu đã được yêu cầu cho tài khoản của bạn. Để hoàn thành khôi phục mật khẩu bạn hãy bấm vào đường link sau :<br><br><a href="%s">%s</a><br><br>Nếu bạn không gửi yêu cầu, hãy bỏ qua email này.',
'mail.recover_password' => '%s - Khôi phục mật khẩu',
'recover_email_sent' => 'Nếu tài khoản hiện hữu, hệ thống sẽ gửi một email khôi phục mật khẩu đến tài khoản bạn đã nhập vào.',
'password_match' => 'Mật khẩu nhập vào và nhập lại phải trùng khớp nhau.',
'password_restored' => 'Đặt lại mật khẩu.',
'recalculate_user_quota' => 'Chỉnh lại dung lượng cho người dùng dựa trên ổ đĩa',
'quota_recalculated' => 'Dung lượng cho người dùng đã được chỉnh lại thành công theo dung lượng ổ đĩa.',
'delete_selected' => 'Xoá phần được chọn',
'delete_all' => 'Xoá hết',
'clear_account' => 'Xoá dữ liệu trong tài khoản',
'recaptcha_failed' => 'Xác minh reCAPTCHA thất bại',
'recaptcha_enabled' => 'Xác minh reCAPTCHA đã được bật',
'mail.new_account' => '%s - Tạo tài khoản mới',
'recaptcha_site_key' => 'Mã reCAPTCHA chia sẻ công cộng',
'user_create_password' => 'Nếu mật khẩu để trống, bạn có thể sẽ muốn gửi một thông báo đến email người dùng.',
'upload_max_file_size' => 'Kích cỡ tập tin tối đa hiện giờ là %s.',
'no_tags' => 'Không có thẻ nào được thêm vào',
'auto_tagging' => 'Tự động gắn thẻ vào các tập tin tải lên',
'zip_ext_not_loaded' => 'Gói mở rộng zip được yêu cầu không được tải thành công',
'changelog' => 'Nhật ký những thay đổi',
'show_changelog' => 'Hiển thị nhật ký những thay đổi',
'image_embeds' => 'Chèn hình ảnh',
'no' => 'Không',
'login' => 'Đăng nhập',
'username' => 'Tên đăng nhập',
'home' => 'Trang chủ',
'is_admin' => 'Là quản trị viên',
'copy_url_behavior' => 'Chế độ sao chép URL',
'upload' => 'Tải lên',
'your_profile' => 'Hồ sơ của bạn',
'email_required' => 'Bạn cần nhập địa chỉ email.',
'maintenance' => 'Bảo trì',
'username_required' => 'Bạn cần nhập tên đăng nhập.',
'system_settings' => 'Cài đặt hệ thống',
'apply' => 'Áp dụng',
'client_config' => 'Cấu hình client',
'account_disabled' => 'Tài khoản của bạn đang bị vô hiệu hoá.',
'name' => 'Tên',
'user.create' => 'Tạo Người dùng',
'copy' => 'Sao chép',
'bad_login' => 'Sai tên hoặc mật khẩu.',
'active' => 'Đang hoạt động',
'admin' => 'Quản trị viên',
'profile_updated' => 'Hồ sơ được cập nhật thành công!',
'cannot_delete' => 'Bạn không thể tự xoá tài khoản người dùng của bạn.',
'deleted_orphans' => 'Đã xoá %d tập tin không còn thư mục chính thành công.',
'dotted_search' => 'Tìm kiếm…',
'time' => 'Thời gian',
'order_by' => 'Sắp xếp theo…',
'new_version_available' => 'Đã có phiên bản %s mới!',
'custom_head_html_hint' => 'Nội dung này sẽ được thêm vào phần thẻ <head> trên mỗi trang.',
'clean_orphaned_uploads' => 'Xoá những phần tải lên với thư mục chính đã bị xoá',
'file_size_no_match' => 'Tập tin tải xuống không cùng kích cỡ đúng.',
'default_lang_behavior' => 'XBackBone sẽ khớp ngôn ngữ bạn đang sử dụng mặc định trên trình duyệt (trường hợp ngôn ngữ bạn dùng chưa hỗ trợ, ngôn ngữ dự phòng là tiếng Anh).',
'donation' => 'Quyên góp',
'dont_close' => 'Xin đừng đóng tab này đến khi đã hoàn thành xử lý.',
'register_enabled' => 'Đã bật chế độ cho người dùng đăng ký',
'prerelease_channel' => 'Kênh phát hành phiên bản sớm',
'hide_by_default' => 'Mặc định ẩn đi hình ảnh video tải lên',
'custom_head_set' => 'Phần đầu HTML tuỳ chỉnh đã được áp dụng.',
'mail.activate_text' => 'Xin chào %s!<br>cảm ơn bạn đã tạp tài khảon trên %s (<a href="%s">%s</a>), hãy bấm vào đường link sau để kích hoạt tài khoản của bạn:<br><br><a href="%s">%s</a>',
'max_user_quota' => 'Dung lượng tối đa cho người dùng',
'only_recaptcha_v3' => 'Chỉ hỗ trợ reCAPTCHA v3.',
'account_activated' => 'Tài khoản đã được kích hoạt, bạn có thể đăng nhập vào rồi!',
'password_repeat' => 'Nhập lại mật khẩu',
'recaptcha_keys_required' => 'Tất cả những mã reCAPTCHA đều buộc phải có.',
'send_notification' => 'Gửi email thông báo',
'quota_enabled' => 'Bật dung lượng cho người dùng',
'used_space' => 'Dung lượng đã dùng',
'danger_zone' => 'Vùng nguy hiểm',
'account_media_deleted' => 'Tất cả những hình ảnh video có trong tài khoản đã được xoá.',
'recaptcha_secret_key' => 'Mã reCAPTCHA bí mật',
'mail.new_account_text_with_reset' => 'Xin chào %s!<br>một tài khoản mới đã được tạo cho bạn ở %s (<a href="%s">%s</a>), hãy bấm vào đường link sau để cài mật khẩu và kích hoạt tài khoản nhé:<br><br><a href="%s">%s</a>',
'mail.new_account_text_with_pw' => 'Xin chào %s!<br>một tài khoản mới đã được tạo cho bạn trên %s (<a href="%s">%s</a>), với thông tin đăng nhập như sau:<br><br>Tên đăng nhập: %s<br>Mật khẩu: %s<br><br>Hãy bấm vào đường link sau đây để truy cập trang đăng nhập tài khoản nhé:<br><a href="%s">%s</a>',
'ldap_cant_connect' => 'Không thể kết nối với máy chủ xác minh LDAP.',
];

View file

@ -1,164 +0,0 @@
<?php
return [
'send' => '发送',
'no_media' => '未找到媒体。',
'yes' => '是',
'enforce_language' => '默认语言',
'no' => '否',
'lang' => '中文(简体)',
'copy_link' => '复制链接',
'size' => '大小',
'download' => '下载',
'user.edit' => '编辑用户',
'deleted_orphans' => '已成功删除 %d 个孤立文件。',
'drop_to_upload' => '单击或将您的文件拖放到此处进行上传。',
'settings_saved' => '系统设置已保存!',
'file_size_no_match' => '下载的文件与正确的文件大小不匹配。',
'default_lang_behavior' => '默认情况下XBackBone 将尝试匹配浏览器语言(后备为英语)。',
'custom_head_html' => '自定义 HTML Head 内容',
'remember_me' => '记住我',
'recover_email_sent' => '如果存在,则恢复电子邮件已发送到指定帐户。',
'hide_by_default' => '默认隐藏媒体',
'password_recovery' => '恢复密码',
'password' => '密码',
'login' => '登录',
'home' => '家',
'users' => '用户',
'profile' => '用户资料',
'pager.next' => '下一页',
'public.telegram' => '在Telegram上分享',
'preview' => '预览',
'filename' => '文件名',
'upload' => '上传',
'delete' => '删除',
'publish' => '发布',
'hide' => '隐藏',
'files' => '文件',
'orphaned_files' => '孤立文件',
'theme' => '主题',
'click_to_load' => '点击加载…',
'apply' => '应用',
'save' => '保存',
'php_info' => 'PHP 信息',
'system_settings' => '系统设置',
'user.create' => '创建用户',
'update' => '更新',
'is_active' => '是普通用户',
'is_admin' => '是管理员',
'token' => '令牌',
'your_profile' => '你的个人资料',
'user_code' => '用户代码',
'reg_date' => '注册日期',
'open' => '打开',
'confirm_string' => '你确定吗?',
'installed' => '安装成功完成!',
'bad_login' => '错误的凭据。',
'welcome' => '欢迎, %s!',
'goodbye' => '再见!',
'token_not_found' => '未找到指定的令牌。',
'email_required' => '需要电子邮件地址。',
'email_taken' => '电子邮件地址已被使用。',
'username_taken' => '用户名已被占用。',
'password_required' => '密码是必需的。',
'user_created' => '用户 "%s" 创建成功!',
'none' => '空',
'confirm' => '确认',
'cannot_write_file' => '目标路径不可写。',
'switch_to' => '切换到',
'table' => '表格',
'dotted_search' => '搜索…',
'order_by' => '分组…',
'gallery' => '大图模式',
'time' => '时间',
'name' => '名称',
'maintenance' => '维护',
'new_version_available' => '新版本 %s 可用!',
'donation' => '捐款',
'register_success' => '帐户已创建,确认电子邮件已发送。',
'max_user_quota' => '最大用户配额',
'invalid_quota' => '作为默认用户配额的值无效。',
'mail.activate_text' => '你好 %s !<br>感谢您创建您的帐户 %s (<a href="%s">%s</a>), 点击以下链接激活它:<br><br><a href="%s">%s</a>',
'mail.activate_account' => '%s - 帐号激活',
'mail.recover_password' => '%s - 密码恢复',
'recalculate_user_quota' => '从磁盘重新计算用户配额',
'danger_zone' => '危险区',
'send_notification' => '发送电子邮件通知',
'mail.new_account_text_with_reset' => '你好 %s !<br>为您创建了一个新帐户 %s (<a href="%s">%s</a>), 点击以下链接设置密码并激活:<br><br><a href="%s">%s</a>',
'user_create_password' => '如果留空,您可能希望向用户电子邮件地址发送通知。',
'ldap_cant_connect' => '无法连接到 LDAP 身份验证服务器。',
'auto_tagging' => '自动上传标签',
'account_disabled' => '您的帐户已被禁用。',
'copy_url_behavior' => '复制网址方式',
'zip_ext_not_loaded' => '未加载所需的zip扩展名',
'changelog' => '变更日志',
'show_changelog' => '显示日志',
'image_embeds' => '嵌入图像',
'already_latest_version' => '您已经拥有最新版本。',
'edit' => '编辑',
'system' => '系统',
'owner' => '所有者',
'date' => '日期',
'client_config' => '客户端配置',
'active' => '普通用户',
'login.username' => '用户名或电子邮件',
'username' => '用户名',
'logout' => '注销',
'pager.previous' => '上一页',
'public' => '公共',
'public.delete_text' => '你确定要删除这个项目吗?你将无法恢复它',
'raw' => '显示原始',
'copy' => '复制',
'copied' => '已复制到剪贴板!',
'admin' => '管理员',
'username_required' => '用户名是必需的。',
'user_updated' => '用户"%s" 更新成功!',
'cannot_delete' => '您不能删除自己。',
'cannot_demote' => '你不能禁用自己。',
'clean_orphaned_uploads' => '清理孤立上传',
'path_not_writable' => '输出路径不可写。',
'cannot_retrieve_file' => '无法检索文件。',
'profile_updated' => '个人资料更新成功!',
'user_deleted' => '用户已删除。',
'check_for_updates' => '检查更新',
'updates' => '更新',
'maintenance_in_progress' => '平台维护中,稍后再试…',
'auto_set' => '自动设置',
'upgrade' => '升级',
'cancel' => '取消',
'please_wait' => '请稍等…',
'no_upload_token' => '您没有个人上传令牌。 (生成一个并重试。)',
'custom_head_html_hint' => '此内容将添加到每个页面的 <head> 标记处。',
'custom_head_set' => '应用了自定义 HTML 头。',
'dont_close' => '在完成之前不要关闭此选项卡。',
'donate_text' => '如果您喜欢 XBackBone请考虑捐赠以支持开发',
'register_enabled' => '已启用注册',
'no_account' => '没有帐户?',
'account_activated' => '帐号已激活,现在您可以登录了!',
'quota_enabled' => '启用用户配额',
'password_match' => '密码和重复密码必须相同。',
'password_restored' => '重设密码。',
'export_data' => '导出数据',
'default_user_quota' => '默认用户配额',
'register' => '注册',
'password_repeat' => '重复输入密码',
'quota_recalculated' => '成功从磁盘重新计算用户配额。',
'delete_all' => '删除全部',
'clear_account' => '清除帐户',
'account_media_deleted' => '帐户中的所有媒体均已删除。',
'mail.new_account_text_with_pw' => '你好 %s !<br>为您创建了一个新帐户 %s (<a href="%s">%s</a>), 一下是登录信息:<br><br>用户名: %s <br>密码: %s <br><br>点击以下链接进入登录页面:<br><a href="%s"> %s </a>',
'used_space' => '已用空间',
'delete_selected' => '删除所选',
'upload_max_file_size' => '当前最大文件大小为 %s.',
'no_tags' => '未添加标签',
'mail.recover_text' => 'Hi %s,<br>已为您的帐户请求重置密码。要完成该过程,请单击以下链接:<br><br><a href="%s">%s</a><br><br>如果不是您要求重置密码,请忽略此电子邮件。',
'used' => '使用中',
'recaptcha_site_key' => 'reCAPTCHA 站点密钥',
'only_recaptcha_v3' => '只支持reCAPTCHA v3.',
'vanity_url' => '自定义网址',
'mail.new_account' => '新帐户创建',
'recaptcha_failed' => '验证失败',
'recaptcha_enabled' => '验证码启用',
'recaptcha_secret_key' => 'reCAPTCHA 密钥',
'prerelease_channel' => '预发布渠道',
'recaptcha_keys_required' => '所有 reCAPTCHA 密钥都是必需的。',
];

View file

@ -1,19 +0,0 @@
<div class="modal fade" id="modalVanity" tabindex="-1" role="dialog" aria-hidden="true">
<div class="modal-dialog modal-sm">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">{{ lang('vanity_url') }}</h5>
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
</div>
<div class="modal-body">
<input type="text" class="form-control" id="modalVanity-input" maxlength="64">
</div>
<div class="modal-footer">
<button class="btn btn-primary media-vanity" id="modalVanity-link"><i class="fas fa-check fa-fw"></i> {{ lang('confirm') }}</button>
<button type="button" class="btn btn-secondary" data-dismiss="modal">{{ lang('no') }}</button>
</div>
</div>
</div>
</div>

2
resources/templates/dashboard/grid.twig Executable file → Normal file
View file

@ -28,7 +28,6 @@
{% else %}
<a class="btn btn-sm btn-info publish-toggle" data-toggle="tooltip" title="{{ lang('publish') }}" data-id="{{ media.id }}" data-published="{{ media.published }}"><i class="fas fa-check-circle"></i></a>
{% endif %}
<button class="btn btn-info btn-sm public-vanity" data-id="{{ media.id }}" data-toggle="tooltip" title="{{ lang('vanity_url') }}"><i class="fas fa-star"></i></button>
<button type="button" class="btn btn-sm btn-danger media-delete" data-link="{{ route('upload.delete', {'id': media.id}) }}" data-id="{{ media.id }}" data-toggle="tooltip" title="{{ lang('delete') }}">
<i class="fas fa-trash"></i>
</button>
@ -69,5 +68,4 @@
<div class="text-center text-muted"><i>{{ lang('no_media') }}</i></div>
{% endif %}
</div>
{% include 'comp/modal_vanity.twig' %}
{% endblock %}

4
resources/templates/dashboard/list.twig Executable file → Normal file
View file

@ -6,7 +6,6 @@
{% include 'comp/navbar.twig' %}
<div class="container">
{% include 'comp/alert.twig' %}
{% include 'comp/modal_vanity.twig' %}
<div class="card shadow-sm">
<div class="card-body">
@ -33,7 +32,6 @@
{% for media in medias %}
<tr id="media_{{ media.id }}" class="bulk-selector" data-id="{{ media.id }}">
<td class="text-center">
<a href="{{ urlFor('/' ~ media.user_code ~ '/' ~ media.code ~ '.' ~ media.extension) }}" target="_blank" class="text-dark">
{% if isDisplayableImage(media.mimetype) %}
{% if media.username is not null %}
<img src="{{ urlFor('/' ~ media.user_code ~ '/' ~ media.code ~ '.' ~ media.extension ~ '/raw?width=84&height=42') }}" class="img-fluid rounded">
@ -43,7 +41,6 @@
{% else %}
<i class="far {{ mime2font(media.mimetype) }} fa-2x"></i>
{% endif %}
</a>
</td>
<td>
<span class="text-maxlen">{{ media.filename }}</span>
@ -80,7 +77,6 @@
{% else %}
<a href="javascript:void(0)" class="btn btn-sm btn-outline-info publish-toggle" data-toggle="tooltip" title="{{ lang('publish') }}" data-id="{{ media.id }}" data-published="{{ media.published }}"><i class="fas fa-check-circle"></i></a>
{% endif %}
<a href="javascript:void(0)" class="btn btn-sm btn-outline-info public-vanity" data-id="{{ media.id }}" data-toggle="tooltip" title="{{ lang('vanity_url') }}"><i class="fas fa-star"></i></a>
<a href="javascript:void(0)" class="btn btn-sm btn-outline-danger media-delete" data-link="{{ route('upload.delete', {'id': media.id}) }}" data-id="{{ media.id }}" data-toggle="tooltip" title="{{ lang('delete') }}"><i class="fas fa-trash"></i></a>
</div>
</td>

View file

@ -16,7 +16,6 @@
{% if tags is empty %}
<h6 class="dropdown-header">{{ lang('no_tags') }}</h6>
{% else %}
<a class="dropdown-item" href="{{ route('home') }}">{{ lang('show_all_tags') }}</a>
{% for tag in tags %}
<a class="dropdown-item {{ request.queryParams['tag'] == tag.id ? 'active' }}" href="{{ queryParams({'tag': tag.id}) }}" data-id="{{ tag.id }}">{{ tag.name }}</a>
{% endfor %}

View file

@ -1,52 +0,0 @@
#!/bin/bash
create_desktop_entry() {
cat << "EOF" > "$HOME/.local/share/kio/servicemenus/xbackbone-uploader.desktop"
[Desktop Entry]
Type=Service
ServiceTypes=KonqPopupMenu/Plugin
Icon=imaga
X-KDE-StartupNotify=false
X-KDE-Priority=TopLevel
MimeType=image/*;
Actions=xbackbone_upload
[Desktop Action xbackbone_upload]
Name=Upload with XBackBone
Exec=sh -c 'RESPONSE="$(curl -s -F "token={{ token }}" -F "upload=@%u" {{ upload_url }})"; if [ "$(echo "${RESPONSE}" | jq -r ".message")" = "OK" ]; then URL="$(echo "${RESPONSE}" | jq -r ".url")"; if [ "${DESKTOP_SESSION}" != "" ]; then echo "${URL}" | xclip -selection c; notify-send "Upload completed!" "${URL}"; else echo "${URL}"; fi; exit 0; else MESSAGE="$(echo "${RESPONSE}" | jq -r ".message")"; if [ $? -ne 0 ]; then echo "Unexpected response:"; echo "${RESPONSE}"; exit 1; fi; if [ "${DESKTOP_SESSION}" != "" ]; then notify-send "Error!" "${MESSAGE}"; else echo "Error! ${MESSAGE}"; fi; exit 1; fi'
Icon=image
EOF
echo "Service menu created!";
}
check() {
ERRORS=0;
if [ ! -x "$(command -v jq)" ]; then
echo "jq command not found.";
ERRORS=1;
fi
if [ ! -x "$(command -v curl)" ]; then
echo "curl command not found.";
ERRORS=1;
fi
if [ ! -x "$(command -v xclip)" ] && [ "${DESKTOP_SESSION}" != "" ]; then
echo "xclip command not found.";
ERRORS=1;
fi
if [ ! -x "$(command -v notify-send)" ] && [ "${DESKTOP_SESSION}" != "" ]; then
echo "notify-send command not found.";
ERRORS=1;
fi
if [ "${ERRORS}" -eq 1 ]; then
exit 1;
fi
}
check
create_desktop_entry

22
resources/templates/upload/public.twig Executable file → Normal file
View file

@ -17,22 +17,8 @@
<meta id="embed-image" property="og:image" content="{{ url }}/raw">
<meta id="discord" name="twitter:image" content="{{ url }}/raw">
<meta id="image-src" name="twitter:image:src" content="{{ url }}/raw">
{% elseif type == 'video' %}
<meta name="twitter:card" content="player" />
<meta name="twitter:title" content="{{ media.filename }} ({{ media.size }})" />
<meta name="twitter:image" content="0" />
<meta name="twitter:player:stream" content="{{ url }}/raw" />
<meta name="twitter:player:width" content="720" />
<meta name="twitter:player:height" content="480" />
<meta name="twitter:player:stream:content_type" content="{{ media.mimetype }}" />
<meta property="og:url" content="{{ url }}/raw" />
<meta property="og:video" content="{{ url }}/raw" />
<meta property="og:video:secure_url" content="{{ url }}/raw" />
<meta property="og:video:type" content="{{ media.mimetype }}" />
<meta property="og:video:width" content="720" />
<meta property="og:video:height" content="480" />
<meta property="og:image" content="0" />
<meta id="discord" name="twitter:image" content="{{ url }}/raw">
<meta id="image-src" name="twitter:image:src" content="{{ url }}/raw">
{% endif %}
{% endblock %}
@ -49,7 +35,6 @@
<a href="{{ url }}/raw" class="btn btn-secondary my-2 my-sm-0" data-toggle="tooltip" title="{{ lang('raw') }}"><i class="fas fa-file-alt fa-lg fa-fw"></i></a>
<a href="{{ url }}/download" class="btn btn-warning my-2 my-sm-0" data-toggle="tooltip" title="{{ lang('download') }}"><i class="fas fa-cloud-download-alt fa-lg fa-fw"></i></a>
{% if session.get('logged') %}
<a href="javascript:void(0)" class="btn btn-info my-2 my-sm-0 public-vanity" data-link="{{ route('upload.vanity', {'id': media.mediaId}) }}" data-id="{{ media.mediaId }}" data-toggle="tooltip" title="{{ lang('vanity') }}"><i class="fas fa-star fa-lg fa-fw"></i></a>
<a href="javascript:void(0)" class="btn btn-danger my-2 my-sm-0 public-delete" data-link="{{ route('upload.delete', {'id': media.mediaId}) }}" data-toggle="tooltip" title="{{ lang('delete') }}"><i class="fas fa-trash fa-lg fa-fw"></i></a>
{% endif %}
</div>
@ -58,7 +43,7 @@
</nav>
<div class="container-fluid">
{% include 'comp/alert.twig' %}
<div class="row">
<div class="row ml-auto mr-auto">
<div class="col-md-12 justify-content-center">
{% if delete_token is not null %}
<form method="post" action="{{ url }}/delete/{{ delete_token }}">
@ -163,5 +148,4 @@
</div>
</div>
{% include 'comp/modal_delete.twig' %}
{% include 'comp/modal_vanity.twig' %}
{% endblock %}

View file

@ -66,11 +66,7 @@
<div class="btn-group">
<a href="{{ route('config.sharex', {'id': user.id}) }}" class="btn btn-lg btn-outline-dark"><i class="fas fa-fw fa-download"></i> ShareX</a>
<a href="javascript:alert('{{ lang('copied') }}')" data-clipboard-text="{{ route('config.screencloud', {'token': user.token}) }}" class="btn btn-lg btn-outline-info btn-clipboard"><i class="fas fa-fw fa-download"></i> Screencloud</a>
<a href="{{ route('config.script', {'id': user.id}) }}" type="button" class="btn btn-lg btn-outline-danger"><i class="fas fa-fw fa-download"></i> Linux Script</a>
<button type="button" class="btn btn-outline-danger dropdown-toggle dropdown-toggle-split" id="userDropdown" data-toggle="dropdown" aria-expanded="false"></button>
<ul class="dropdown-menu">
<li><a class="dropdown-item text-danger" href="{{ route('kde_config.script', {'id': user.id}) }}"><i class="fas fa-fw fa-download"></i> KDE Linux Script</a></li>
</ul>
<a href="{{ route('config.script', {'id': user.id}) }}" class="btn btn-lg btn-outline-danger"><i class="fas fa-fw fa-download"></i> Linux Script</a>
</div>
</div>
</div>

45
src/js/app.js Executable file → Normal file
View file

@ -29,10 +29,8 @@ var app = {
$('.user-delete').click(app.modalDelete);
$('.public-delete').click(app.modalDelete);
$('.public-vanity').click(app.modalVanity);
$('.media-delete').click(app.mediaDelete);
$('.publish-toggle').click(app.publishToggle);
$('.refresh-token').click(app.refreshToken);
$('#themes').mousedown(app.loadThemes);
$('.checkForUpdatesButton').click(app.checkForUpdates);
@ -48,10 +46,6 @@ var app = {
$('.alert').slideUp(500);
});
if ($('.dropzone').length > 0) {
app.initClipboardPasteToUpload();
}
new ClipboardJS('.btn-clipboard');
new Plyr($('#player'), {ratio: '16:9'});
@ -63,30 +57,6 @@ var app = {
$('#modalDelete-link').attr('href', $(this).data('link'));
$('#modalDelete').modal('show');
},
modalVanity: function () {
var id = $(this).data('id');
$('#modalVanity').modal('show');
$('#modalVanity-link').click(function () {
var $callerButton = $(this);
$.post(window.AppConfig.base_url + '/upload/' + id + '/vanity', {vanity: $('#modalVanity-input').val()}, function (responseData, status) {
$callerButton.tooltip('dispose');
$('#modalVanity').modal('hide');
$('#modalVanity-input').val('');
var parsedData = JSON.parse(responseData);
if ($('#media_' + id).find('.btn-group').length > 0) {
$('#media_' + id).find('.btn-group').find('a').each(function (item) {
var oldUrl = $(this).attr('href');
var newUrl = oldUrl.replace(oldUrl.substr(oldUrl.lastIndexOf('/') + 1), parsedData.code.code);
$(this).attr('href', newUrl);
});
} else {
var oldUrl = window.location.href;
var newUrl = oldUrl.replace(oldUrl.substr(oldUrl.lastIndexOf('/') + 1), parsedData.code.code);
window.location.href = newUrl;
}
});
});
},
publishToggle: function () {
var id = $(this).data('id');
var $callerButton = $(this);
@ -256,20 +226,7 @@ var app = {
$('#dropdown-tag-list > a[data-id="' + $tag.data('id') + '"]').remove();
}
});
},
initClipboardPasteToUpload: function() {
document.onpaste = function(event){
if (event.clipboardData || event.originalEvent.clipboardData) {
const items = (event.clipboardData || event.originalEvent.clipboardData).items;
items.forEach((item) => {
if (item.kind === 'file') {
// Add the file to the dropzone instance.
Dropzone.forElement('.dropzone').addFile(item.getAsFile());
}
});
}
}
},
}
};
app.init();

View file

@ -7,6 +7,7 @@ use Tests\TestCase;
class LoginControllerTest extends TestCase
{
/** @test */
public function it_loads_the_login_page()
{

View file

@ -97,7 +97,7 @@ class RegisterControllerTest extends TestCase
$this->assertSame(route('login'), $response->getHeaderLine('Location'));
$result = $this->database()->query('SELECT * FROM users WHERE id = ?', $userId)->fetch();
$this->assertSame(1, (int) $result->active);
$this->assertSame('1', $result->active);
$this->assertNull($result->activate_token);
}