Compare commits
65 commits
Author | SHA1 | Date | |
---|---|---|---|
![]() |
a00fd5a5e2 | ||
![]() |
0fe1748077 | ||
![]() |
c58a114ac9 | ||
![]() |
23f6b18ffe | ||
![]() |
4ad4b20762 | ||
![]() |
1c2801e2f0 | ||
![]() |
a918c95a56 | ||
![]() |
fa85310d1d | ||
![]() |
8fabc57f04 | ||
![]() |
cd28fe11af | ||
![]() |
687c503efd | ||
![]() |
c6f087e092 | ||
![]() |
4718d8a0b1 | ||
![]() |
bb97621041 | ||
![]() |
49e3110273 | ||
![]() |
41b26f45b7 | ||
![]() |
f2ae33bcd7 | ||
![]() |
96972b8222 | ||
![]() |
06562d194b | ||
![]() |
a600a21753 | ||
![]() |
1193c96966 | ||
![]() |
4946750beb | ||
![]() |
cc8ed75ec6 | ||
![]() |
9dbf1400f6 | ||
![]() |
dd5e30abe2 | ||
![]() |
59c6691585 | ||
![]() |
bd3ca55e20 | ||
![]() |
04a6770f19 | ||
![]() |
a8f26558a6 | ||
![]() |
853ed10e1c | ||
![]() |
25ed553ed1 | ||
![]() |
ab211c571a | ||
![]() |
3f9bc8ae7c | ||
![]() |
2c33f19785 | ||
![]() |
57a66f83bd | ||
![]() |
41870dce76 | ||
![]() |
f5fba276fd | ||
![]() |
b2403baf0b | ||
![]() |
634d301e80 | ||
![]() |
a0f82ae4ab | ||
![]() |
a5e63dcd33 | ||
![]() |
8cda536340 | ||
![]() |
5d99a96f84 | ||
![]() |
68a428b33f | ||
![]() |
76eecb298b | ||
![]() |
903f87e693 | ||
![]() |
eee497669e | ||
![]() |
e7a0a99fe6 | ||
![]() |
ee55a9ea3a | ||
![]() |
7f07ecdfad | ||
![]() |
a11a9307ea | ||
![]() |
32b8a16c40 | ||
![]() |
c8c540ff50 | ||
![]() |
c8fac0a578 | ||
![]() |
35a2e59c6c | ||
![]() |
95b4435e6f | ||
![]() |
0951638dc8 | ||
![]() |
d3fde3e298 | ||
![]() |
69d6ae298e | ||
![]() |
acaceea3f1 | ||
![]() |
58744bd092 | ||
![]() |
4deedda3b6 | ||
![]() |
d6dce885d2 | ||
![]() |
d823230c35 | ||
![]() |
634956cb2d |
37 changed files with 842 additions and 401 deletions
12
CHANGELOG.md
12
CHANGELOG.md
|
@ -5,6 +5,18 @@ 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
|
||||
|
|
|
@ -27,7 +27,7 @@ abstract class AuthController extends Controller
|
|||
|
||||
/**
|
||||
* Connects to LDAP server and logs in with service account (if configured)
|
||||
* @return resource|false
|
||||
* @return \LDAP\Connection|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_error($server));
|
||||
$this->logger->error('LDAP-URI was not parseable');
|
||||
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 resource $server LDAP Server Resource
|
||||
* @param \LDAP\Connection|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, null, LDAP_ESCAPE_FILTER), $this->config['ldap']['search_filter']);
|
||||
$searchFilter = str_replace('????', ldap_escape($username, '', LDAP_ESCAPE_FILTER), $this->config['ldap']['search_filter']);
|
||||
$ldapAddributes = array('dn');
|
||||
$this->logger->debug("LDAP Search filter: $searchFilter");
|
||||
$ldapSearchResp = ldap_search(
|
||||
|
@ -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'];
|
||||
}
|
||||
|
|
|
@ -114,4 +114,35 @@ 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,
|
||||
]
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -188,6 +188,43 @@ 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
|
||||
|
|
|
@ -208,6 +208,7 @@ 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]);
|
||||
|
||||
|
|
|
@ -208,21 +208,38 @@ class MediaRepository
|
|||
array_multisort(array_column($files, 'size'), $this->buildOrderBy(), SORT_NUMERIC, $files);
|
||||
|
||||
$params = [];
|
||||
$queryPagesParams = [];
|
||||
|
||||
if ($this->text !== null) {
|
||||
if ($this->isAdmin) {
|
||||
[$queryMedia,] = $this->buildAdminQueries();
|
||||
[$queryMedia, $queryPages] = $this->buildAdminQueries();
|
||||
} else {
|
||||
[$queryMedia,] = $this->buildUserQueries();
|
||||
[$queryMedia, $queryPages] = $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).'")';
|
||||
|
@ -253,7 +270,7 @@ class MediaRepository
|
|||
}
|
||||
}
|
||||
|
||||
$this->pages = count($this->media) / $limit;
|
||||
$this->pages = $this->db->query($queryPages, $queryPagesParams)->fetch()->count / $limit;
|
||||
|
||||
if ($this->text !== null || $this->tagId !== null) {
|
||||
$this->media = array_slice($this->media, $offset, $limit, true);
|
||||
|
|
2
app/routes.php
Normal file → Executable file
2
app/routes.php
Normal file → Executable file
|
@ -57,11 +57,13 @@ $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');
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
{
|
||||
"name": "sergix44/xbackbone",
|
||||
"license": "AGPL-3.0-only",
|
||||
"version": "3.6.3",
|
||||
"version": "3.7.0",
|
||||
"description": "A lightweight ShareX PHP backend",
|
||||
"type": "project",
|
||||
"require": {
|
||||
|
|
781
composer.lock
generated
781
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -5,6 +5,18 @@ 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
|
||||
|
|
28
package-lock.json
generated
28
package-lock.json
generated
|
@ -339,12 +339,12 @@
|
|||
}
|
||||
},
|
||||
"node_modules/braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"fill-range": "^7.0.1"
|
||||
"fill-range": "^7.1.1"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=8"
|
||||
|
@ -805,9 +805,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"node_modules/fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"dependencies": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
|
@ -3216,12 +3216,12 @@
|
|||
}
|
||||
},
|
||||
"braces": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz",
|
||||
"integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==",
|
||||
"version": "3.0.3",
|
||||
"resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz",
|
||||
"integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fill-range": "^7.0.1"
|
||||
"fill-range": "^7.1.1"
|
||||
}
|
||||
},
|
||||
"buffer": {
|
||||
|
@ -3609,9 +3609,9 @@
|
|||
"dev": true
|
||||
},
|
||||
"fill-range": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz",
|
||||
"integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==",
|
||||
"version": "7.1.1",
|
||||
"resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz",
|
||||
"integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"to-regex-range": "^5.0.1"
|
||||
|
|
|
@ -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' => 'عام',
|
||||
|
@ -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,8 +115,51 @@ return [
|
|||
'clear_account' => 'مسح الحساب',
|
||||
'account_media_deleted' => 'كل الوسائط في الحساب تم حذفها.',
|
||||
'danger_zone' => 'منطقة خطرة',
|
||||
'send_notification' => 'إرسال رسالة إشعار إلكترونية',
|
||||
'send_notification' => 'إرسال إشعار بالبريد الإلكتروني',
|
||||
'mail.new_account' => '%s - إنشاء حساب جديد',
|
||||
'php_info' => 'معلومات PHP',
|
||||
'enforce_language' => 'اللغة الافتراضية',
|
||||
'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>',
|
||||
];
|
||||
|
|
|
@ -54,7 +54,7 @@ return [
|
|||
'reg_date' => 'Registrierungsdatum',
|
||||
'none' => 'keine',
|
||||
'open' => 'Öffnen',
|
||||
'confirm' => 'Bestätigung',
|
||||
'confirm' => 'Bestätigen',
|
||||
'confirm_string' => 'Bist du sicher?',
|
||||
'installed' => 'Installation erfolgreich abgeschlossen!',
|
||||
'bad_login' => 'Falsche Anmeldeinformationen.',
|
||||
|
@ -153,6 +153,7 @@ 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',
|
||||
|
@ -165,4 +166,5 @@ return [
|
|||
'changelog' => 'Änderungsprotokoll',
|
||||
'copied' => 'In Zwischenablage kopiert!',
|
||||
'image_embeds' => 'Bilder einbetten',
|
||||
'vanity_url' => 'Benutzerdefinierte URL',
|
||||
];
|
||||
|
|
4
resources/lang/en.lang.php
Normal file → Executable file
4
resources/lang/en.lang.php
Normal file → Executable file
|
@ -30,6 +30,8 @@ return [
|
|||
'download' => 'Download',
|
||||
'upload' => 'Upload',
|
||||
'delete' => 'Delete',
|
||||
'confirm' => 'Confirm',
|
||||
'vanity_url' => 'Custom URL',
|
||||
'publish' => 'Publish',
|
||||
'hide' => 'Hide',
|
||||
'files' => 'Files',
|
||||
|
@ -58,7 +60,6 @@ return [
|
|||
'reg_date' => 'Registration Date',
|
||||
'none' => 'None',
|
||||
'open' => 'Open',
|
||||
'confirm' => 'Confirmation',
|
||||
'confirm_string' => 'Are you sure?',
|
||||
'installed' => 'Installation completed successfully!',
|
||||
'bad_login' => 'Wrong credentials.',
|
||||
|
@ -155,6 +156,7 @@ 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',
|
||||
|
|
|
@ -54,7 +54,7 @@ return [
|
|||
'reg_date' => 'Fecha de Registración',
|
||||
'none' => 'Ninguno',
|
||||
'open' => 'Abrir',
|
||||
'confirm' => 'Confirmación',
|
||||
'confirm' => 'Confirmar',
|
||||
'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 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_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>',
|
||||
'recaptcha_enabled' => 'reCAPTCHA activado',
|
||||
'account_media_deleted' => 'Se han eliminado todos los archivos de la cuenta.',
|
||||
'clear_account' => 'Limpiar cuenta',
|
||||
|
@ -165,4 +165,6 @@ return [
|
|||
'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',
|
||||
];
|
||||
|
|
|
@ -35,7 +35,7 @@ return [
|
|||
'bad_login' => 'Väärät kirjautumistiedot.',
|
||||
'installed' => 'Asennus suoritettu loppuun onnistuneesti!',
|
||||
'confirm_string' => 'Oletko varma?',
|
||||
'confirm' => 'Vahvistus',
|
||||
'confirm' => 'Vahvista',
|
||||
'open' => 'Auki',
|
||||
'none' => 'Ei mitään',
|
||||
'reg_date' => 'Rekisteröitymis päivä',
|
||||
|
@ -160,4 +160,5 @@ return [
|
|||
'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',
|
||||
];
|
||||
|
|
|
@ -54,7 +54,7 @@ return [
|
|||
'reg_date' => 'Date d\'inscription',
|
||||
'none' => 'Aucun',
|
||||
'open' => 'Ouvrir',
|
||||
'confirm' => 'Confirmation',
|
||||
'confirm' => 'Confirmer',
|
||||
'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,4 +162,5 @@ 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',
|
||||
];
|
||||
|
|
|
@ -64,7 +64,7 @@ return [
|
|||
'cancel' => 'Annuler',
|
||||
'maintenance_in_progress' => 'Plateforme en maintenance, réessayez plus tard…',
|
||||
'updates' => 'Mises à jour',
|
||||
'upgrade' => 'Mettre à jour',
|
||||
'upgrade' => 'Mettre à niveau',
|
||||
'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' => 'Confirmation',
|
||||
'confirm' => 'Confirmer',
|
||||
'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,4 +160,5 @@ return [
|
|||
'enforce_language' => 'Forcer la langue',
|
||||
'copied' => 'Copié dans le presse-papier!',
|
||||
'image_embeds' => 'Intégrer des images',
|
||||
'vanity_url' => 'URL personnalisée',
|
||||
];
|
||||
|
|
|
@ -158,6 +158,7 @@ return [
|
|||
'no' => 'Nem',
|
||||
'yes' => 'Igen',
|
||||
'enforce_language' => 'A nyelv érvényesítése',
|
||||
'lang' => 'Angol',
|
||||
'lang' => 'Magyar',
|
||||
'image_embeds' => 'Képek beágyazása',
|
||||
'vanity_url' => 'Egyedi URL',
|
||||
];
|
||||
|
|
|
@ -160,4 +160,5 @@ return [
|
|||
'custom_head_set' => 'Head HTML khusus diterapkan.',
|
||||
'path_not_writable' => 'Destinasi berkas tidak dapat ditulis.',
|
||||
'image_embeds' => 'Sematkan gambar',
|
||||
'vanity_url' => 'URL kostum',
|
||||
];
|
||||
|
|
|
@ -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,4 +162,5 @@ return [
|
|||
'show_changelog' => 'Mostra registro dei cambiamenti',
|
||||
'copied' => 'Copiato negli appunti!',
|
||||
'image_embeds' => 'Incorpora immagini',
|
||||
'vanity_url' => 'URL personalizzato',
|
||||
];
|
||||
|
|
|
@ -101,7 +101,7 @@ return [
|
|||
'account_disabled' => '당신의 계정은 비활성 상태입니다.',
|
||||
'bad_login' => '잘못된 자격증명입니다.',
|
||||
'installed' => '설치가 완료되었어요!',
|
||||
'confirm' => '재확인',
|
||||
'confirm' => '확인',
|
||||
'confirm_string' => '확실한가요?',
|
||||
'open' => '열기',
|
||||
'none' => '없음',
|
||||
|
@ -160,4 +160,5 @@ return [
|
|||
'yes' => '확인',
|
||||
'enforce_language' => '언어 설정',
|
||||
'lang' => 'Korean',
|
||||
'vanity_url' => '사용자 정의 URL',
|
||||
];
|
||||
|
|
|
@ -54,7 +54,7 @@ return [
|
|||
'reg_date' => 'Registratiedatum',
|
||||
'none' => 'Geen',
|
||||
'open' => 'Open',
|
||||
'confirm' => 'Bevestiging',
|
||||
'confirm' => 'Bevestig',
|
||||
'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' => 'Changelog weergeven',
|
||||
'changelog' => 'Changelog',
|
||||
'zip_ext_not_loaded' => 'De vereiste zip extensie is niet geladen',
|
||||
'show_changelog' => 'Wijzigingslog weergeven',
|
||||
'changelog' => 'Wijzigingslog',
|
||||
'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,4 +164,7 @@ 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',
|
||||
];
|
||||
|
|
|
@ -38,7 +38,7 @@ return [
|
|||
'admin' => 'Admin',
|
||||
'reg_date' => 'Data rejestracji',
|
||||
'open' => 'Otwórz',
|
||||
'confirm' => 'Potwierdzenie',
|
||||
'confirm' => 'Potwierdź',
|
||||
'confirm_string' => 'Jesteś pewien?',
|
||||
'installed' => 'Instalacja zakończona pomyślnie!',
|
||||
'welcome' => 'Witaj, %s!',
|
||||
|
@ -162,4 +162,5 @@ return [
|
|||
'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',
|
||||
];
|
||||
|
|
|
@ -26,7 +26,7 @@ return [
|
|||
'owner' => 'Dono',
|
||||
'date' => 'Data',
|
||||
'raw' => 'Mostrar raw',
|
||||
'download' => 'Transferir',
|
||||
'download' => 'Descarregar',
|
||||
'delete' => 'Apagar',
|
||||
'publish' => 'Publicar',
|
||||
'hide' => 'Esconder',
|
||||
|
@ -54,7 +54,7 @@ return [
|
|||
'reg_date' => 'Data de registo',
|
||||
'none' => 'Nenhum',
|
||||
'open' => 'Abrir',
|
||||
'confirm' => 'Confirmação',
|
||||
'confirm' => 'Confirmar',
|
||||
'confirm_string' => 'Tem a certeza?',
|
||||
'installed' => 'Instalação completa com sucesso!',
|
||||
'bad_login' => 'Login inválido.',
|
||||
|
@ -161,4 +161,5 @@ return [
|
|||
'register' => 'Registar',
|
||||
'settings_saved' => 'Definições de sistema guardadas!',
|
||||
'image_embeds' => 'Embutir imagens',
|
||||
'vanity_url' => 'URL personalizado',
|
||||
];
|
||||
|
|
|
@ -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,6 +163,7 @@ return [
|
|||
'copied' => 'Скопировано!',
|
||||
'system_settings' => 'Системные настройки',
|
||||
'upload' => 'Выгрузить',
|
||||
'php_info' => 'Инфо о PHP',
|
||||
'php_info' => 'Информация о PHP',
|
||||
'image_embeds' => 'Встроенные изображения',
|
||||
'vanity_url' => 'Пользовательский URL',
|
||||
];
|
||||
|
|
|
@ -155,9 +155,11 @@ 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äftelse',
|
||||
'confirm' => 'Bekräfta',
|
||||
'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',
|
||||
];
|
||||
|
|
|
@ -15,7 +15,7 @@ return [
|
|||
'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ş !',
|
||||
'public.telegram' => 'Telegram\'da paylaş',
|
||||
'copy_link' => 'Bağlantıyı kopyala',
|
||||
'pager.previous' => 'Önceki',
|
||||
'pager.next' => 'Sonraki',
|
||||
|
@ -148,7 +148,7 @@ return [
|
|||
'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' => 'Onay',
|
||||
'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!',
|
||||
|
@ -160,4 +160,6 @@ return [
|
|||
'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',
|
||||
];
|
||||
|
|
|
@ -5,7 +5,7 @@ return [
|
|||
'yes' => '是',
|
||||
'enforce_language' => '默认语言',
|
||||
'no' => '否',
|
||||
'lang' => '英语',
|
||||
'lang' => '中文(简体)',
|
||||
'copy_link' => '复制链接',
|
||||
'size' => '大小',
|
||||
'download' => '下载',
|
||||
|
@ -152,4 +152,13 @@ return [
|
|||
'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 密钥都是必需的。',
|
||||
];
|
||||
|
|
19
resources/templates/comp/modal_vanity.twig
Executable file
19
resources/templates/comp/modal_vanity.twig
Executable file
|
@ -0,0 +1,19 @@
|
|||
<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">×</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
Normal file → Executable file
2
resources/templates/dashboard/grid.twig
Normal file → Executable file
|
@ -28,6 +28,7 @@
|
|||
{% 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>
|
||||
|
@ -68,4 +69,5 @@
|
|||
<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
Normal file → Executable file
4
resources/templates/dashboard/list.twig
Normal file → Executable file
|
@ -6,6 +6,7 @@
|
|||
{% 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">
|
||||
|
@ -32,6 +33,7 @@
|
|||
{% 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">
|
||||
|
@ -41,6 +43,7 @@
|
|||
{% else %}
|
||||
<i class="far {{ mime2font(media.mimetype) }} fa-2x"></i>
|
||||
{% endif %}
|
||||
</a>
|
||||
</td>
|
||||
<td>
|
||||
<span class="text-maxlen">{{ media.filename }}</span>
|
||||
|
@ -77,6 +80,7 @@
|
|||
{% 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>
|
||||
|
|
|
@ -16,6 +16,7 @@
|
|||
{% 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 %}
|
||||
|
|
52
resources/templates/scripts/xbackbone_kde_uploader.sh.twig
Normal file
52
resources/templates/scripts/xbackbone_kde_uploader.sh.twig
Normal file
|
@ -0,0 +1,52 @@
|
|||
#!/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
|
2
resources/templates/upload/public.twig
Normal file → Executable file
2
resources/templates/upload/public.twig
Normal file → Executable file
|
@ -49,6 +49,7 @@
|
|||
<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>
|
||||
|
@ -162,4 +163,5 @@
|
|||
</div>
|
||||
</div>
|
||||
{% include 'comp/modal_delete.twig' %}
|
||||
{% include 'comp/modal_vanity.twig' %}
|
||||
{% endblock %}
|
||||
|
|
|
@ -66,7 +66,11 @@
|
|||
<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}) }}" class="btn btn-lg btn-outline-danger"><i class="fas fa-fw fa-download"></i> Linux Script</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>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
45
src/js/app.js
Normal file → Executable file
45
src/js/app.js
Normal file → Executable file
|
@ -29,8 +29,10 @@ 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);
|
||||
|
@ -46,6 +48,10 @@ var app = {
|
|||
$('.alert').slideUp(500);
|
||||
});
|
||||
|
||||
if ($('.dropzone').length > 0) {
|
||||
app.initClipboardPasteToUpload();
|
||||
}
|
||||
|
||||
new ClipboardJS('.btn-clipboard');
|
||||
new Plyr($('#player'), {ratio: '16:9'});
|
||||
|
||||
|
@ -57,6 +63,30 @@ 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);
|
||||
|
@ -226,7 +256,20 @@ 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();
|
||||
|
|
Loading…
Add table
Reference in a new issue