Compare commits

...

551 commits
2.x ... master

Author SHA1 Message Date
Sergio Brighenti
a00fd5a5e2
Merge pull request #579 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2024-08-15 15:10:15 +02:00
Oğuz Ersen
0fe1748077
Translated using Weblate (Turkish)
Currently translated at 100.0% (162 of 162 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/tr/
2024-08-04 20:28:59 +00:00
Hani Rouatbi
c58a114ac9
Translated using Weblate (Arabic)
Currently translated at 100.0% (162 of 162 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ar/
2024-08-04 20:28:58 +00:00
Sectly
23f6b18ffe
Translated using Weblate (Dutch)
Currently translated at 100.0% (162 of 162 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nl/
2024-08-04 20:28:58 +00:00
bittin1ddc447d824349b2
4ad4b20762
Translated using Weblate (Swedish)
Currently translated at 100.0% (162 of 162 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/sv/
2024-08-04 20:28:57 +00:00
gallegonovato
1c2801e2f0
Translated using Weblate (Spanish)
Currently translated at 100.0% (162 of 162 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/
2024-08-04 20:28:56 +00:00
Sergio Brighenti
a918c95a56
Merge pull request #578 from sergix44/dependabot/npm_and_yarn/braces-3.0.3
Bump braces from 3.0.2 to 3.0.3
2024-08-04 22:28:51 +02:00
Sergio Brighenti
fa85310d1d
Merge pull request #586 from samrzhevsky/master
Fix page count calculation
2024-08-04 22:28:21 +02:00
samrzhevsky
8fabc57f04
Fix page count calculation 2024-07-27 23:39:38 +03:00
dependabot[bot]
cd28fe11af
Bump braces from 3.0.2 to 3.0.3
Bumps [braces](https://github.com/micromatch/braces) from 3.0.2 to 3.0.3.
- [Changelog](https://github.com/micromatch/braces/blob/master/CHANGELOG.md)
- [Commits](https://github.com/micromatch/braces/compare/3.0.2...3.0.3)

---
updated-dependencies:
- dependency-name: braces
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2024-06-16 14:57:30 +00:00
Sergio Brighenti
687c503efd
Merge pull request #561 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2024-06-15 21:59:26 +02:00
Vin
c6f087e092
Translated using Weblate (Russian)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ru/
2024-06-15 21:57:04 +02:00
tabby
4718d8a0b1
Translated using Weblate (Korean)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ko/
2024-06-15 21:57:04 +02:00
ssantos
bb97621041
Translated using Weblate (Portuguese)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2024-06-15 21:57:04 +02:00
Eryk Michalak
49e3110273
Translated using Weblate (Polish)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pl/
2024-06-15 21:57:04 +02:00
Mikachu
41b26f45b7
Translated using Weblate (Dutch)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nl/
2024-06-15 21:57:04 +02:00
Gaming Tibor
f2ae33bcd7
Translated using Weblate (Hungarian)
Currently translated at 99.3% (160 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/hu/
2024-06-15 21:57:04 +02:00
LeonMtn05
96972b8222
Translated using Weblate (German)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2024-06-15 21:57:04 +02:00
Sergio Brighenti
06562d194b
Merge pull request #572 from lsgd/master
Enable upload from clipboard
2024-06-15 21:57:01 +02:00
Lukas Schulze
a600a21753 Add link to remove tags filter 2024-04-30 16:15:41 +02:00
lsgd
1193c96966
Merge branch 'sergix44:master' into master 2024-04-30 15:49:54 +02:00
Lukas Schulze
4946750beb enable upload via clipboard paste 2024-04-30 15:49:01 +02:00
Sergio Brighenti
cc8ed75ec6 Update changelog 2024-01-14 14:24:40 +01:00
Sergio Brighenti
9dbf1400f6 Update lock 2024-01-14 14:16:56 +01:00
Sergio Brighenti
dd5e30abe2 Update list preview icon color 2024-01-14 14:15:16 +01:00
Sergio Brighenti
59c6691585
Merge pull request #553 from lsgd/master
Add link to file preview which opens the file itself
2024-01-14 14:04:28 +01:00
Sergio Brighenti
bd3ca55e20
Merge pull request #556 from sergix44/dependabot/composer/aws/aws-sdk-php-3.294.5
Bump aws/aws-sdk-php from 3.271.3 to 3.294.5
2024-01-04 00:06:30 +01:00
Sergio Brighenti
04a6770f19
Merge pull request #546 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2024-01-04 00:05:25 +01:00
ssantos
a8f26558a6
Translated using Weblate (Portuguese)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2024-01-04 00:04:44 +01:00
Oğuz Ersen
853ed10e1c
Translated using Weblate (Turkish)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/tr/
2024-01-04 00:04:44 +01:00
Xin Mu
25ed553ed1
Translated using Weblate (Chinese (Simplified))
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/zh_Hans/
2024-01-04 00:04:44 +01:00
Kalle Laine
ab211c571a
Translated using Weblate (Finnish)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fi/
2024-01-04 00:04:44 +01:00
Reza Almanda
3f9bc8ae7c
Translated using Weblate (Indonesian)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/id/
2024-01-04 00:04:44 +01:00
Caspar Coen Graafstal
2c33f19785
Translated using Weblate (Dutch)
Currently translated at 98.7% (159 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nl/
2024-01-04 00:04:44 +01:00
春末丶冬初
57a66f83bd
Translated using Weblate (Chinese (Simplified))
Currently translated at 98.1% (158 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/zh_Hans/
2024-01-04 00:04:44 +01:00
J. Lavoie
41870dce76
Translated using Weblate (French (Canada))
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr_CA/
2024-01-04 00:04:44 +01:00
J. Lavoie
f5fba276fd
Translated using Weblate (French)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2024-01-04 00:04:44 +01:00
J. Lavoie
b2403baf0b
Translated using Weblate (German)
Currently translated at 99.3% (160 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2024-01-04 00:04:44 +01:00
J. Lavoie
634d301e80
Translated using Weblate (Italian)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/it/
2024-01-04 00:04:44 +01:00
a
a0f82ae4ab
Translated using Weblate (Russian)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ru/
2024-01-04 00:04:44 +01:00
Luna Jernberg
a5e63dcd33
Translated using Weblate (Swedish)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/sv/
2024-01-04 00:04:44 +01:00
gallegonovato
8cda536340
Translated using Weblate (Spanish)
Currently translated at 100.0% (161 of 161 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/
2024-01-04 00:04:44 +01:00
Sergio Brighenti
5d99a96f84
Merge pull request #554 from SrS2225a/master
Add support for kde integration
2024-01-04 00:04:40 +01:00
dependabot[bot]
68a428b33f
Bump aws/aws-sdk-php from 3.271.3 to 3.294.5
Bumps [aws/aws-sdk-php](https://github.com/aws/aws-sdk-php) from 3.271.3 to 3.294.5.
- [Release notes](https://github.com/aws/aws-sdk-php/releases)
- [Commits](https://github.com/aws/aws-sdk-php/compare/3.271.3...3.294.5)

---
updated-dependencies:
- dependency-name: aws/aws-sdk-php
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-12-22 00:11:25 +00:00
SrS2225a
76eecb298b added support for kde intergration 2023-12-17 13:44:29 -08:00
Sergio Brighenti
903f87e693
Merge pull request #547 from samrzhevsky/master
LDAP fixes
2023-12-17 10:45:49 +01:00
Lukas Schulze
eee497669e Add link to file preview which opens the file itself 2023-12-10 20:22:49 +01:00
samrzhevsky
e7a0a99fe6
LDAP fixes
1. Changed `ldap_connect` error handling. `ldap_error` expects `LDAP\Connection`, and `ldap_connect` returns `false` if the syntax check fails
2. Fixed deprecation: passing null to parameter (`$ignore`) of type string
3. Fixed PHPDoc types for compatibility with PHP 8.1+
2023-08-28 00:31:22 +03:00
Sergio Brighenti
ee55a9ea3a
Merge pull request #539 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2023-08-14 22:46:06 +02:00
Sergio Brighenti
7f07ecdfad
Merge pull request #507 from SrS2225a/master
Support For Vanity Urls
2023-08-14 22:45:48 +02:00
SrS2225a
a11a9307ea corrected styleCI issues for sql querys 2023-08-13 23:40:06 -07:00
SrS2225a
32b8a16c40 readded missing function createVanity 2023-08-13 23:29:41 -07:00
SrS2225a
c8c540ff50 fixed grunt conflicts and corrected the lang key 2023-08-13 22:45:37 -07:00
SrS2225a
c8fac0a578 Merge branch 'master' of https://github.com/SergiX44/XBackBone
# Conflicts:
#	app/Controllers/MediaController.php
2023-08-13 22:00:19 -07:00
J. Lavoie
35a2e59c6c
Translated using Weblate (French (Canada))
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr_CA/
2023-06-29 23:49:23 +02:00
J. Lavoie
95b4435e6f
Translated using Weblate (Italian)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/it/
2023-06-29 23:49:22 +02:00
Sergio Brighenti
0951638dc8
Merge pull request #533 from cursey/feature/upload-response-raw-url 2023-05-31 09:54:11 +02:00
cursey
d3fde3e298
Upload: Response now includes raw_url as well 2023-05-29 21:57:55 -07:00
Sergio Brighenti
c7a6dd1c16 update version 2023-05-27 17:09:22 +02:00
Sergio Brighenti
327005833c update changelog 2023-05-27 17:06:28 +02:00
Sergio Brighenti
49c7b60137
Merge pull request #532 from nebulade/patch-1 2023-05-25 10:39:29 +02:00
Johannes Zellner
4d791aad06
Make AuthController.php compatible with php8.1+
php api changed https://www.php.net/manual/en/class.ldap-result.php
2023-05-25 10:12:42 +02:00
Sergio Brighenti
9c85698c28 drop azure blob storage 2023-05-24 00:50:57 +02:00
Sergio Brighenti
91d05884b9
Merge pull request #513 from SergiX44/support_php_82 2023-05-23 23:03:21 +02:00
Sergio Brighenti
707d32ff25
Merge pull request #522 from weblate/weblate-xbackbone-xbackbone 2023-05-23 23:00:32 +02:00
Sergio Brighenti
3702753ade
Merge pull request #529 from SergiX44/analysis-JG7k4o 2023-05-23 23:00:17 +02:00
StyleCI Bot
5e6ba5a0b3
Apply fixes from StyleCI
[ci skip] [skip ci]
2023-05-23 21:00:00 +00:00
Sergio Brighenti
7a4be04917 fix failing test 2023-05-23 22:59:55 +02:00
Reza Almanda
4cf84fdafe
Translated using Weblate (Indonesian)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/id/
2023-05-23 21:42:28 +02:00
Daniel Benyšek
d86d3826d5
Translated using Weblate (Czech)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/cs/
2023-05-23 21:42:28 +02:00
Alexey Gudym
04e42bd456
Translated using Weblate (Russian)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ru/
2023-05-23 21:42:28 +02:00
Sergio Brighenti
c3ebf4d39b
Merge pull request #526 from SergiX44/dependabot/composer/guzzlehttp/psr7-1.9.1 2023-05-23 21:42:23 +02:00
Sergio Brighenti
e05600ec26
Merge pull request #527 from SergiX44/analysis-a60gDB 2023-04-19 23:52:54 +02:00
StyleCI Bot
ae5e2cffb3
Apply fixes from StyleCI
[ci skip] [skip ci]
2023-04-19 21:23:06 +00:00
dependabot[bot]
45dc6ff87b
Bump guzzlehttp/psr7 from 1.9.0 to 1.9.1
Bumps [guzzlehttp/psr7](https://github.com/guzzle/psr7) from 1.9.0 to 1.9.1.
- [Release notes](https://github.com/guzzle/psr7/releases)
- [Changelog](https://github.com/guzzle/psr7/blob/1.9.1/CHANGELOG.md)
- [Commits](https://github.com/guzzle/psr7/compare/1.9.0...1.9.1)

---
updated-dependencies:
- dependency-name: guzzlehttp/psr7
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2023-04-19 21:22:57 +00:00
SrS2225a
69d6ae298e style ci fix 2023-01-17 21:39:40 -08:00
SrS2225a
acaceea3f1 added fixes per request by author 2023-01-17 21:17:52 -08:00
Sergio Brighenti
589720d81b update lock file 2023-01-16 21:06:05 +01:00
Sergio Brighenti
46502074a0 swap implementation psr7
drop direct impl call
2023-01-16 21:03:36 +01:00
Sergio Brighenti
020ad75238 update deps 2023-01-16 18:41:26 +01:00
Sergio Brighenti
02be446c2e
Merge pull request #503 from weblate/weblate-xbackbone-xbackbone 2022-12-31 16:54:35 +01:00
SrS2225a
58744bd092 fixed code styling issues 2022-12-30 21:44:51 -08:00
Özgür
2a789d0f8a
Translated using Weblate (Turkish)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/tr/
2022-12-29 01:14:02 +01:00
Oğuz Ersen
e8c3b75b99
Translated using Weblate (Turkish)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/tr/
2022-12-29 01:14:02 +01:00
Sergio Brighenti
b790d21e01
Merge pull request #502 from SergiX44/dependabot/npm_and_yarn/qs-6.11.0 2022-12-29 01:13:58 +01:00
Sergio Brighenti
237e2f7a57
Merge pull request #501 from samrzhevsky/master 2022-12-29 00:58:19 +01:00
SrS2225a
4deedda3b6 bug fixes for vanity links 2022-12-19 19:42:08 -08:00
SrS2225a
d6dce885d2 added support for vanity links 2022-12-18 21:54:18 -08:00
SrS2225a
d823230c35 Merge branch 'master' of https://github.com/SrS2225a/XBackBone 2022-12-18 21:53:08 -08:00
SrS2225a
634956cb2d added support for vanity links 2022-12-18 21:22:15 -08:00
dependabot[bot]
6a05a5dac8
Bump qs from 6.10.1 to 6.11.0
Bumps [qs](https://github.com/ljharb/qs) from 6.10.1 to 6.11.0.
- [Release notes](https://github.com/ljharb/qs/releases)
- [Changelog](https://github.com/ljharb/qs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/ljharb/qs/compare/v6.10.1...v6.11.0)

---
updated-dependencies:
- dependency-name: qs
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-12-06 14:36:59 +00:00
Sam Rzhevsky
9bddf5940b
Fix filter by tag
Fixed filter by non-existent tag
2022-11-30 21:13:58 +03:00
Sergio Brighenti
b4f720cf21 update changelog 2022-11-27 22:44:17 +01:00
Sergio Brighenti
2bce85ea6a upgraded phpunit 2022-11-27 22:37:22 +01:00
Sergio Brighenti
e2c3aaf89a update deps 2022-11-27 22:34:42 +01:00
Sergio Brighenti
a9c492c99d
Merge pull request #499 from samrzhevsky/master 2022-11-27 22:31:43 +01:00
Sam Rzhevsky
3bb2b7b4ea
Logging fix
PHP Notice: Undefined property: stdClass::$name in app/Controllers/ExportController.php on line 28
2022-11-27 21:37:37 +03:00
Sergio Brighenti
2ddaac8e5a
Merge pull request #496 from FingerlessGlov3s/patch-2
remove duplicate lines
2022-11-08 10:39:27 +01:00
FingerlessGloves
e4e67657d8
remove duplicate lines
meta tags are oddly repeated
2022-11-02 23:18:01 +00:00
Sergio Brighenti
1e0e549938
Merge pull request #495 from FingerlessGlov3s/patch-1
Fixes redirect bug for reverse proxy
2022-11-02 21:04:50 +01:00
FingerlessGloves
9caee0dc5b
Fixes redirect bug for reverse proxy
If you are logged out of XBackbone, and browse to `/upload` for example the direction holds the request URI, which isn't an issue unless you've got a reverse proxy in front of it.
For example, if the app is running in a container on port 8080, and Traefik is doing the reverse proxying, when you try login after being redirected to the login page, the redirectTo session contains the internal port number, which causes you to be redirected to `https://mydomain.com:8080/upload` instead of the correct `https://mydomain.com/upload`
2022-10-31 22:39:32 +00:00
Sergio Brighenti
99c9f50294
Merge pull request #480 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2022-10-26 10:05:38 +02:00
Ho_ Tsuyosi (스넾)
48ba6f009e
Translated using Weblate (Japanese)
Currently translated at 66.2% (106 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ja/
2022-10-26 10:05:28 +02:00
Zsolt Nagy
8379eb41ef
Translated using Weblate (Hungarian)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/hu/
2022-10-26 10:05:28 +02:00
PVPMaster0001
90ac32621a
Translated using Weblate (Finnish)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fi/
2022-10-26 10:05:28 +02:00
PVPMaster0001
80152ac31a
Translated using Weblate (Japanese)
Currently translated at 53.1% (85 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ja/
2022-10-26 10:05:28 +02:00
Denis Branisteanu
3aac808525
Translated using Weblate (Romanian)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ro/
2022-10-26 10:05:28 +02:00
Denis Branisteanu
57122a8f96
Translated using Weblate (Romanian)
Currently translated at 6.2% (10 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ro/
2022-10-26 10:05:28 +02:00
Denis Branisteanu
e155a33f86
Added translation using Weblate (Romanian) 2022-10-26 10:05:28 +02:00
Hien
46341b4e03
Translated using Weblate (Vietnamese)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/vi/
2022-10-26 10:05:28 +02:00
Özgür
a1b3ab47ab
Translated using Weblate (Turkish)
Currently translated at 91.2% (146 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/tr/
2022-10-26 10:05:28 +02:00
Özgür
904795029c
Translated using Weblate (Turkish)
Currently translated at 41.8% (67 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/tr/
2022-10-26 10:05:28 +02:00
Sergio Brighenti
1eebc961ab
Merge pull request #479 from SergiX44/dependabot/composer/guzzlehttp/guzzle-7.4.5
Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5
2022-10-26 10:05:24 +02:00
Sergio Brighenti
0f6cc027f7
Merge pull request #490 from SergiX44/dependabot/composer/twig/twig-2.15.3
Bump twig/twig from 2.15.1 to 2.15.3
2022-10-26 10:05:16 +02:00
dependabot[bot]
c83539245b
Bump twig/twig from 2.15.1 to 2.15.3
Bumps [twig/twig](https://github.com/twigphp/Twig) from 2.15.1 to 2.15.3.
- [Release notes](https://github.com/twigphp/Twig/releases)
- [Changelog](https://github.com/twigphp/Twig/blob/v2.15.3/CHANGELOG)
- [Commits](https://github.com/twigphp/Twig/compare/v2.15.1...v2.15.3)

---
updated-dependencies:
- dependency-name: twig/twig
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-09-30 20:25:52 +00:00
Sergio Brighenti
7af93ae136
Merge pull request #484 from FunctionDJ/patch-1
Update minimum PHP version in docs
2022-08-04 14:44:00 +02:00
Function
96b61b5834
Update minimum PHP version in docs 2022-08-04 13:45:04 +02:00
dependabot[bot]
d6d4fbcf94
Bump guzzlehttp/guzzle from 7.4.4 to 7.4.5
Bumps [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) from 7.4.4 to 7.4.5.
- [Release notes](https://github.com/guzzle/guzzle/releases)
- [Changelog](https://github.com/guzzle/guzzle/blob/master/CHANGELOG.md)
- [Commits](https://github.com/guzzle/guzzle/compare/7.4.4...7.4.5)

---
updated-dependencies:
- dependency-name: guzzlehttp/guzzle
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-21 21:00:12 +00:00
Sergio Brighenti
edc20c30f7 update changelog 2022-06-20 18:13:15 +02:00
Sergio Brighenti
66c708ab77
Update CHANGELOG.md 2022-06-20 18:11:49 +02:00
Sergio Brighenti
469ed2068c fix 2022-06-20 17:36:00 +02:00
Sergio Brighenti
8242ef5443 compress the release zip 2022-06-20 13:56:50 +02:00
Sergio Brighenti
0f1c458e76 fix resize 2022-06-20 13:06:05 +02:00
Sergio Brighenti
87a1b8517a remove workflow 2022-06-19 23:42:33 +02:00
Sergio Brighenti
5399133b65 updated changelog 2022-06-19 23:37:55 +02:00
Sergio Brighenti
59124e994a bump minimum php version 2022-06-19 23:30:14 +02:00
Sergio Brighenti
15e2c3512c
Merge pull request #474 from SergiX44/analysis-o7r0ep
Apply fixes from StyleCI
2022-06-19 23:21:46 +02:00
StyleCI Bot
7f4f262249
Apply fixes from StyleCI
[ci skip] [skip ci]
2022-06-19 21:21:38 +00:00
Sergio Brighenti
1979c3f318 fixed discord video embedding 2022-06-19 23:21:27 +02:00
Sergio Brighenti
8bf64a6537 fix deprecation issue 2022-06-19 22:00:36 +02:00
Sergio Brighenti
d21f678843 fix issue with post max size = 0
fixes #453
2022-06-19 20:20:21 +02:00
Sergio Brighenti
67fdb89ce3 update deps 2022-06-19 20:17:07 +02:00
Sergio Brighenti
badb0c681d
Merge pull request #470 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2022-06-19 14:39:48 +02:00
flakka2022
dfc3ab3bce
Translated using Weblate (Persian)
Currently translated at 16.2% (26 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fa/
2022-06-18 03:20:42 +02:00
flakka2022
87b7f245c9
Added translation using Weblate (Persian) 2022-06-17 02:32:48 +02:00
春末丶冬初
e8a9cfea92
Translated using Weblate (Chinese (Simplified))
Currently translated at 95.0% (152 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/zh_Hans/
2022-06-15 13:31:21 +02:00
Hien
6d43b62677
Translated using Weblate (Vietnamese)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/vi/
2022-06-15 12:18:18 +02:00
Hien
79ed8eeb5e
Added translation using Weblate (Vietnamese) 2022-06-14 06:42:37 +02:00
Sergio Brighenti
2ec7457fcd
Merge pull request #468 from cloudron-io/ldap_auto_create
ldap: ensure missing ldap user is auto-created
2022-06-12 18:12:55 +02:00
Sergio Brighenti
659b31548e
Merge pull request #467 from cloudron-io/ldap_docs
improve ldap docs
2022-06-12 17:44:04 +02:00
Girish Ramakrishnan
538f3d6bd8 ldap: ensure missing ldap user is auto-created 2022-06-12 08:35:22 -07:00
Girish Ramakrishnan
1a418d46e9 ldap docs: remove superfluous brackets in search filter
should also fix #376
2022-06-11 19:33:46 -07:00
Sergio Brighenti
83ec0b5201
Merge pull request #464 from SergiX44/dependabot/composer/guzzlehttp/guzzle-7.4.4
Bump guzzlehttp/guzzle from 7.4.1 to 7.4.4
2022-06-11 13:45:31 +02:00
Sergio Brighenti
ec6b692cc8
Merge pull request #463 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2022-06-11 13:45:23 +02:00
dependabot[bot]
aa2d85f5ee
Bump guzzlehttp/guzzle from 7.4.1 to 7.4.4
Bumps [guzzlehttp/guzzle](https://github.com/guzzle/guzzle) from 7.4.1 to 7.4.4.
- [Release notes](https://github.com/guzzle/guzzle/releases)
- [Changelog](https://github.com/guzzle/guzzle/blob/master/CHANGELOG.md)
- [Commits](https://github.com/guzzle/guzzle/compare/7.4.1...7.4.4)

---
updated-dependencies:
- dependency-name: guzzlehttp/guzzle
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-06-10 06:44:33 +00:00
Kowski
a6bfc32869
Translated using Weblate (Serbian)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/sr/
2022-06-06 11:26:47 +02:00
Kowski
188dce1a56
Added translation using Weblate (Serbian) 2022-06-06 10:38:05 +02:00
Sergio Brighenti
94638ae941
Merge pull request #461 from SergiX44/dependabot/npm_and_yarn/grunt-1.5.3
Bump grunt from 1.5.2 to 1.5.3
2022-06-01 14:30:13 +02:00
dependabot[bot]
f1728d7e91
Bump grunt from 1.5.2 to 1.5.3
Bumps [grunt](https://github.com/gruntjs/grunt) from 1.5.2 to 1.5.3.
- [Release notes](https://github.com/gruntjs/grunt/releases)
- [Changelog](https://github.com/gruntjs/grunt/blob/main/CHANGELOG)
- [Commits](https://github.com/gruntjs/grunt/compare/v1.5.2...v1.5.3)

---
updated-dependencies:
- dependency-name: grunt
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-26 00:12:41 +00:00
Sergio Brighenti
6a4b49f617
Merge pull request #456 from SergiX44/dependabot/npm_and_yarn/async-2.6.4
Bump async from 2.6.3 to 2.6.4
2022-05-17 21:42:56 +02:00
dependabot[bot]
b856ffd530
Bump async from 2.6.3 to 2.6.4
Bumps [async](https://github.com/caolan/async) from 2.6.3 to 2.6.4.
- [Release notes](https://github.com/caolan/async/releases)
- [Changelog](https://github.com/caolan/async/blob/v2.6.4/CHANGELOG.md)
- [Commits](https://github.com/caolan/async/compare/v2.6.3...v2.6.4)

---
updated-dependencies:
- dependency-name: async
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-05-10 21:32:34 +00:00
Sergio Brighenti
1e12a57a0d
Merge pull request #455 from SergiX44/dependabot/npm_and_yarn/grunt-1.5.2
Bump grunt from 1.4.1 to 1.5.2
2022-05-10 23:20:30 +02:00
Sergio Brighenti
9f64b15f91
Merge pull request #454 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2022-05-10 23:20:20 +02:00
dependabot[bot]
daf3665414
Bump grunt from 1.4.1 to 1.5.2
Bumps [grunt](https://github.com/gruntjs/grunt) from 1.4.1 to 1.5.2.
- [Release notes](https://github.com/gruntjs/grunt/releases)
- [Changelog](https://github.com/gruntjs/grunt/blob/main/CHANGELOG)
- [Commits](https://github.com/gruntjs/grunt/compare/v1.4.1...v1.5.2)

---
updated-dependencies:
- dependency-name: grunt
  dependency-type: direct:development
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-04-27 06:27:02 +00:00
Myunker 1MP4C7 Eredzhebov
9c172ce417
Translated using Weblate (Bulgarian)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/bg/
2022-04-26 11:14:42 +02:00
Sergio Brighenti
d123eda772
Merge pull request #452 from R0GGER/patch-1
Fix for issue #450
2022-04-17 14:21:59 +02:00
R0GGER
c830a31157
Fix for issue #450 2022-04-16 22:56:38 +02:00
Sergio Brighenti
714a5e9d6a
Merge pull request #449 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2022-04-10 22:57:56 +02:00
Rubens
e995a2e539
Translated using Weblate (Catalan)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ca/
2022-04-10 22:57:49 +02:00
Rubens
063ecff83f
Added translation using Weblate (Catalan) 2022-04-10 22:57:49 +02:00
Sergio Brighenti
bfed200dcd
Merge pull request #446 from SergiX44/dependabot/composer/guzzlehttp/psr7-1.8.4
Bump guzzlehttp/psr7 from 1.8.3 to 1.8.4
2022-04-10 22:57:46 +02:00
dependabot[bot]
edb1ced704
Bump guzzlehttp/psr7 from 1.8.3 to 1.8.4
Bumps [guzzlehttp/psr7](https://github.com/guzzle/psr7) from 1.8.3 to 1.8.4.
- [Release notes](https://github.com/guzzle/psr7/releases)
- [Changelog](https://github.com/guzzle/psr7/blob/1.8.4/CHANGELOG.md)
- [Commits](https://github.com/guzzle/psr7/compare/1.8.3...1.8.4)

---
updated-dependencies:
- dependency-name: guzzlehttp/psr7
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
2022-03-29 22:16:12 +00:00
Sergio Brighenti
8fc0a35749
Merge pull request #440 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2022-03-10 18:43:01 +01:00
Jaakko Törrö
6ce9041639
Translated using Weblate (Finnish)
Currently translated at 78.7% (126 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fi/
2022-02-18 23:55:58 +01:00
kubab6
d4aca7d3a5
Translated using Weblate (Polish)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pl/
2022-02-18 23:55:58 +01:00
Allan Nordhøy
114504bde0
Translated using Weblate (Norwegian Bokmål)
Currently translated at 92.5% (148 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nb_NO/
2022-02-12 19:54:36 +01:00
SergiX44
7634741676 implemented cache for remote filesystems
fixes #424
2022-02-08 22:24:16 +01:00
SergiX44
dea92d9ada fix test 2022-01-30 11:58:43 +01:00
Sergio Brighenti
1390ee76c6
Merge pull request #431 from weblate/weblate-xbackbone-xbackbone
Translations update from Hosted Weblate
2022-01-30 11:52:11 +01:00
Emilion DK
8f4f523b22
Translated using Weblate (Danish)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/da/
2022-01-17 12:56:08 +01:00
SAMI SAFHI
6134667b32
Translated using Weblate (Arabic)
Currently translated at 63.1% (101 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ar/
2022-01-02 10:52:20 +01:00
春末丶冬初
c16567d0a6
Translated using Weblate (Chinese (Simplified))
Currently translated at 93.7% (150 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/zh_Hans/
2021-12-29 14:53:11 +01:00
春末丶冬初
13979d9117
Translated using Weblate (Chinese (Simplified))
Currently translated at 3.7% (6 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/zh_Hans/
2021-12-28 13:52:38 +01:00
春末丶冬初
31ebf49944
Added translation using Weblate (Chinese (Simplified)) 2021-12-28 13:48:45 +01:00
Sergio Brighenti
a273235b0c
Add files via upload 2021-10-25 12:30:53 +02:00
SergiX44
2ae95bc409 release: 3.5.1 2021-10-22 19:50:34 +02:00
Sergio Brighenti
8894d2bb1c
Merge pull request #398 from TheDevFreak/patch-1
fix for discord UA change.
2021-10-16 21:08:36 +02:00
TheDevFreak
37b2f5a423
fix for discord UA change. 2021-10-16 17:44:57 +01:00
Sergio Brighenti
e0f18fa873
Merge pull request #395 from SergiX44/update_dependencies
update deps
2021-10-06 10:04:31 +02:00
SergiX44
23a44363c3 fix dependencies vulns 2021-10-06 09:58:48 +02:00
SergiX44
3f0f491e6e fix dependencies vulns 2021-10-06 09:53:57 +02:00
Sergio Brighenti
8469e05b02
Merge pull request #393 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-10-05 19:17:32 +02:00
Kami
ffe8d03b19
Translated using Weblate (Spanish)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/
2021-10-02 15:38:39 +02:00
Sergio Brighenti
11c0d578e6 update docs 2021-09-05 18:03:26 +02:00
Sergio Brighenti
26131aa1fa translations update 2021-09-05 18:01:51 +02:00
Sergio Brighenti
1954a3a18f
Merge pull request #379 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-09-05 18:00:45 +02:00
오로라
cfd1ff343b
Translated using Weblate (Korean)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ko/
2021-09-05 17:56:53 +02:00
오로라
d71bf25dbc
Translated using Weblate (Korean)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ko/
2021-09-05 17:56:53 +02:00
오로라
bb5ea36564
Translated using Weblate (Korean)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ko/
2021-09-05 17:56:53 +02:00
ssantos
c2dd20176f
Translated using Weblate (Portuguese)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2021-09-05 17:56:53 +02:00
오로라
dec28fa0e5
Translated using Weblate (Korean)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ko/
2021-09-05 17:56:53 +02:00
오로라
2cd0147888
Added translation using Weblate (Korean) 2021-09-05 17:56:53 +02:00
Sergio Brighenti
6523e87520 dropped theme cli command 2021-09-05 17:56:46 +02:00
Sergio Brighenti
a4077b7844
Merge pull request #377 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-08-24 23:38:16 +02:00
Gediminas Murauskas
0a48ebcab6
Translated using Weblate (Lithuanian)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/lt/
2021-08-20 22:35:03 +02:00
Gediminas Murauskas
52028f5f98
Translated using Weblate (Lithuanian)
Currently translated at 45.0% (72 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/lt/
2021-08-19 21:20:32 +02:00
J. Lavoie
434a5d89b2
Translated using Weblate (French (Canada))
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr_CA/
2021-08-19 21:20:31 +02:00
J. Lavoie
9da5582ff6
Translated using Weblate (French)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2021-08-19 21:20:30 +02:00
J. Lavoie
addde5972a
Translated using Weblate (Spanish)
Currently translated at 96.8% (155 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/
2021-08-19 21:20:30 +02:00
J. Lavoie
01d3147af8
Translated using Weblate (German)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2021-08-19 21:20:30 +02:00
Gediminas Murauskas
662a746809
Added translation using Weblate (Lithuanian) 2021-08-19 19:50:50 +02:00
Sergio Brighenti
a9790f2e25
Merge pull request #374 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-08-18 08:59:34 +02:00
Luna Jernberg
a8ced21fef
Translated using Weblate (Swedish)
Currently translated at 100.0% (160 of 160 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/sv/
2021-08-18 08:57:26 +02:00
SergiX44
d8501f2b33 changed url building 2021-08-18 08:57:21 +02:00
Sergio Brighenti
ef0d3c1708
Update test_suite.yml 2021-08-16 14:11:16 +02:00
SergiX44
7c8a8a3920 update lock 2021-08-16 14:03:16 +02:00
Sergio Brighenti
bf47596765
Merge pull request #372 from SergiX44/analysis-orb6Z5
Apply fixes from StyleCI
2021-08-16 13:56:27 +02:00
Sergio Brighenti
ee796c7ded Apply fixes from StyleCI
[ci skip] [skip ci]
2021-08-16 11:56:07 +00:00
SergiX44
3d248c8cb4 support for theme-park.dev 2021-08-16 13:55:47 +02:00
Sergio Brighenti
6ca60757ae
Merge pull request #371 from SergiX44/analysis-L3eD7n
Apply fixes from StyleCI
2021-08-15 21:34:15 +02:00
Sergio Brighenti
f508686e20 Apply fixes from StyleCI
[ci skip] [skip ci]
2021-08-15 19:34:00 +00:00
SergiX44
54284424ff expose configuration option for s3 2021-08-15 21:33:52 +02:00
Sergio Brighenti
2be6d1994d
Merge pull request #370 from SergiX44/analysis-peb5ok
Apply fixes from StyleCI
2021-08-13 09:38:51 +02:00
Sergio Brighenti
fbcdc8f20e Apply fixes from StyleCI
[ci skip] [skip ci]
2021-08-13 07:17:35 +00:00
SergiX44
bfbbf89d79 refactoring 2021-08-13 09:17:24 +02:00
SergiX44
bddcf34c6d Fix default theme 2021-08-12 22:30:26 +02:00
SergiX44
aeeddfed80 update docs 2021-08-12 22:07:53 +02:00
SergiX44
4d494f3f6c update docs 2021-08-12 18:07:05 +02:00
Sergio Brighenti
d7d2b5801c
Merge pull request #366 from olegkaspersky/master
Fixed missing commas in configurations
2021-08-11 18:21:27 +02:00
Sergio Brighenti
748aa807ca
Merge pull request #367 from SergiX44/analysis-1b7dYN
Apply fixes from StyleCI
2021-08-11 18:20:46 +02:00
Sergio Brighenti
52883982ad Apply fixes from StyleCI
[ci skip] [skip ci]
2021-08-11 16:17:59 +00:00
SergiX44
aa402c9e9d release 3.4.1 2021-08-11 18:17:48 +02:00
olegkaspersky
492ad5e8ea
Update configuration.md 2021-08-11 15:17:49 +03:00
olegkaspersky
085704a3b5
Fixed missing commas in configs 2021-08-11 15:17:28 +03:00
SergiX44
f7d8174cb3 improved check for embeds 2021-08-10 23:52:55 +02:00
SergiX44
bcd5959c9a update lock file 2021-08-10 21:47:56 +02:00
SergiX44
405b42e178 missing extension 2021-08-10 21:42:36 +02:00
SergiX44
09e326326b update lock 2021-08-10 21:40:30 +02:00
Sergio Brighenti
d9aa867c9c
Update test_suite.yml 2021-08-10 17:25:18 +02:00
SergiX44
1fc7da479c update lock 2021-08-10 17:14:44 +02:00
SergiX44
db204f8c48 Merge remote-tracking branch 'origin/master' 2021-08-10 13:51:07 +02:00
SergiX44
11e5a52519 changed copy raw mode added toggle for embed 2021-08-10 13:50:58 +02:00
Sergio Brighenti
e5422f9e7d
Merge pull request #364 from olegkaspersky/patch-1
commas
2021-08-10 09:41:27 +02:00
olegkaspersky
f5922fc12c
commas 2021-08-09 20:17:51 +03:00
Sergio Brighenti
d140b1188a release 3.4.0 2021-08-01 13:24:39 +02:00
SergiX44
37c0701700 improve remember cookie security 2021-08-01 12:52:32 +02:00
Sergio Brighenti
0ef9f0e0a7 Merge remote-tracking branch 'origin/master' 2021-07-31 13:25:38 +02:00
Sergio Brighenti
ab259ed943 composer lock 2021-07-31 13:25:31 +02:00
Sergio Brighenti
7cd502837e
Update test_suite.yml 2021-07-31 13:24:39 +02:00
Sergio Brighenti
f99489cfe5 Merge remote-tracking branch 'origin/master' 2021-07-31 13:12:56 +02:00
Sergio Brighenti
01fca619c6 bump php version to 7.2 2021-07-31 13:09:45 +02:00
Sergio Brighenti
d79225cfc8
Merge pull request #353 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-07-31 13:00:55 +02:00
Sergio Brighenti
285c970933 fix 2021-07-31 13:00:38 +02:00
Sergio Brighenti
dc03734a20 fix 2021-07-31 13:00:21 +02:00
Sergio Brighenti
ab1409e108 add support for secure cookies 2021-07-31 12:55:56 +02:00
Sergio Brighenti
84020830ca address csrf vulnerability
improved discord embed support
2021-07-31 12:37:06 +02:00
Benjamin Jørgensen
ba9d566152
Translated using Weblate (Danish)
Currently translated at 72.9% (116 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/da/
2021-07-30 23:57:31 +02:00
Sergio Brighenti
bff37d6926
Update README.md 2021-07-30 23:57:29 +02:00
Sergio Brighenti
8fc06374a2
Create SECURITY.md 2021-07-30 23:57:11 +02:00
Sergio Brighenti
8668aab500
Merge pull request #351 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-07-16 09:35:34 +02:00
Zsolt Nagy
dd7ae0b89c
Translated using Weblate (Hungarian)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/hu/
2021-07-16 09:34:48 +02:00
Zsolt Nagy
41a5a6edbb
Translated using Weblate (Hungarian)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/hu/
2021-07-14 14:32:32 +02:00
Zsolt Nagy
8ca9626697
Added translation using Weblate (Hungarian) 2021-07-13 12:46:14 +02:00
Sergio Brighenti
0166755a60
Merge pull request #341 from BenTyger/master
Added support for LDAPS, StartTLS, and LDAP User search filters
2021-06-06 19:30:12 +02:00
Ben Tyger
a98f65c9f6 Fixed style error 2021-05-24 09:45:20 -04:00
Ben Tyger
4660ff5317 More style fixes 2021-05-22 13:59:33 -04:00
Ben Tyger
dfe73a34f1 More style fixes 2021-05-22 11:34:34 -04:00
Ben Tyger
53761bdc42 More style formatting fixes. 2021-05-22 11:01:25 -04:00
Ben Tyger
d3c556234b Fixed PHPDoc type and style errors 2021-05-22 10:57:08 -04:00
Ben Tyger
54381b4958 Fixed style formatting 2021-05-22 10:54:44 -04:00
Ben Tyger
3e53b56aec Fixed double if check 2021-05-22 10:53:34 -04:00
Ben Tyger
7c915032c5 Minor bug fixes. Also added ldap_close(); 2021-05-20 15:06:42 -04:00
Ben Tyger
1d5bb6ccc7 Added lots of debug logging. Fix ['schema'] var reference. 2021-05-20 15:05:08 -04:00
Ben Tyger
35ae42510f Updated LDAP configuration docs for use of ['ldap']['schema'] 2021-05-20 15:03:58 -04:00
Ben Tyger
289c0ab4de Documentation update 2021-05-19 14:25:58 -04:00
Ben Tyger
ef74962853 Added better config detection 'service_account_dn' 2021-05-19 13:49:30 -04:00
Ben Tyger
6a5e6431aa Better ldap_schema setting detection 2021-05-19 13:38:24 -04:00
Ben Tyger
ec5e7fc46f Added logic for LDAP user search 2021-05-19 13:11:20 -04:00
Ben Tyger
048b468ba5 Added Comments 2021-05-19 12:39:16 -04:00
Ben Tyger
3c63025a15 Switched from ldap_get_attributes() to more reliable ldap_get_dn() 2021-05-19 09:43:01 -04:00
Ben Tyger
46b20c4d97 Added username ldap escaping for filter search 2021-05-19 09:38:21 -04:00
Ben Tyger
6f46b70b83 Added LDAP StartTLS support 2021-05-18 14:57:28 -04:00
Ben Tyger
f8ec764c4c Added Comments to flow 2021-05-18 14:30:47 -04:00
Ben Tyger
8b333c935d Added LDAP Service account support for LDAP server that don't allow anon 2021-05-18 14:26:52 -04:00
Ben Tyger
7e0e0db384 Updated ldap_connect to use modern LDAP schema for better TLS support. 2021-05-18 14:14:59 -04:00
Sergio Brighenti
63e78d840d
Merge pull request #338 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-05-08 11:42:00 +02:00
ssantos
ea47f3ee93 Translated using Weblate (Portuguese)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2021-05-08 11:41:36 +02:00
Levi
33503092b2 Translated using Weblate (Swedish)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/sv/
2021-05-08 11:41:36 +02:00
Sergio Brighenti
01b8d96798
Merge pull request #340 from SergiX44/dependabot/npm_and_yarn/lodash-4.17.21
Bump lodash from 4.17.19 to 4.17.21
2021-05-08 11:41:34 +02:00
dependabot[bot]
559363925f
Bump lodash from 4.17.19 to 4.17.21
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.19 to 4.17.21.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.19...4.17.21)

Signed-off-by: dependabot[bot] <support@github.com>
2021-05-07 22:44:11 +00:00
Sergio Brighenti
9ea5a9971d Updated changelog 2021-04-25 13:27:49 +02:00
Sergio Brighenti
53715b9747
Update configuration.md 2021-04-25 13:26:05 +02:00
Sergio Brighenti
32de7376e1 Added missing discord bot 2021-04-25 13:07:50 +02:00
Sergio Brighenti
4adde17d25
Merge pull request #332 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-04-24 14:02:03 +02:00
Jonáš Loskot
9d33eb8191 Translated using Weblate (Czech)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/cs/
2021-04-24 14:01:24 +02:00
Jonáš Loskot
151d32f0f4 Translated using Weblate (Czech)
Currently translated at 63.5% (101 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/cs/
2021-04-24 14:01:24 +02:00
Sergio Brighenti
5b954a7853 Add discord back to the bot list 2021-04-24 14:01:18 +02:00
Sergio Brighenti
344e0281f5 Add discord back to the bot list 2021-04-24 13:56:36 +02:00
Sergio Brighenti
90062a668d
Merge pull request #325 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-03-30 19:09:59 +02:00
J. Lavoie
da0b4f92e9
Translated using Weblate (Portuguese)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2021-03-29 15:27:06 +02:00
J. Lavoie
4940fab973
Translated using Weblate (Spanish)
Currently translated at 96.8% (154 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/
2021-03-29 15:27:03 +02:00
J. Lavoie
f3c36e955c
Translated using Weblate (Finnish)
Currently translated at 57.2% (91 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fi/
2021-03-26 03:30:10 +01:00
J. Lavoie
c4ede9591b
Translated using Weblate (Hindi)
Currently translated at 39.6% (63 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/hi/
2021-03-26 03:30:09 +01:00
J. Lavoie
109e3fefbd
Translated using Weblate (Swedish)
Currently translated at 43.3% (69 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/sv/
2021-03-26 03:30:09 +01:00
J. Lavoie
6f7b1b26c5
Translated using Weblate (French (Canada))
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr_CA/
2021-03-26 03:30:09 +01:00
J. Lavoie
4b0f2af8bf
Translated using Weblate (Japanese)
Currently translated at 53.4% (85 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ja/
2021-03-26 03:30:09 +01:00
J. Lavoie
15f100ae79
Translated using Weblate (Danish)
Currently translated at 27.6% (44 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/da/
2021-03-26 03:30:09 +01:00
J. Lavoie
ffabd49990
Translated using Weblate (Bulgarian)
Currently translated at 40.2% (64 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/bg/
2021-03-26 03:30:09 +01:00
J. Lavoie
6a428eee47
Translated using Weblate (Russian)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ru/
2021-03-26 03:30:08 +01:00
J. Lavoie
181bbff605
Translated using Weblate (Portuguese)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2021-03-26 03:30:08 +01:00
J. Lavoie
3aa350b49e
Translated using Weblate (Dutch)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nl/
2021-03-26 03:30:08 +01:00
J. Lavoie
899a6eb794
Translated using Weblate (French)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2021-03-26 03:30:08 +01:00
J. Lavoie
001c681bd8
Translated using Weblate (German)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2021-03-26 03:30:06 +01:00
J. Lavoie
bfefd9e42e
Translated using Weblate (Italian)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/it/
2021-03-26 03:30:06 +01:00
J. Lavoie
d11d73a825
Translated using Weblate (Finnish)
Currently translated at 57.2% (91 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fi/
2021-03-24 14:30:06 +01:00
J. Lavoie
49fb6bc39f
Translated using Weblate (French (Canada))
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr_CA/
2021-03-24 14:30:06 +01:00
J. Lavoie
30311025d1
Translated using Weblate (Indonesian)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/id/
2021-03-24 14:30:05 +01:00
J. Lavoie
349090b359
Translated using Weblate (Polish)
Currently translated at 96.8% (154 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pl/
2021-03-24 14:30:05 +01:00
J. Lavoie
4d6b8aeedd
Translated using Weblate (Japanese)
Currently translated at 52.2% (83 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ja/
2021-03-24 14:30:05 +01:00
J. Lavoie
7bcdfb575c
Translated using Weblate (Danish)
Currently translated at 26.4% (42 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/da/
2021-03-24 14:30:05 +01:00
J. Lavoie
c4f319b820
Translated using Weblate (Portuguese)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2021-03-24 14:30:04 +01:00
J. Lavoie
826ac367a4
Translated using Weblate (Dutch)
Currently translated at 96.2% (153 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nl/
2021-03-24 14:30:04 +01:00
J. Lavoie
709d6af44b
Translated using Weblate (French)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2021-03-24 14:30:04 +01:00
J. Lavoie
a35dafd142
Translated using Weblate (Spanish)
Currently translated at 96.2% (153 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/
2021-03-24 14:30:04 +01:00
J. Lavoie
5175b9fe83
Translated using Weblate (German)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2021-03-24 14:30:03 +01:00
J. Lavoie
ecaa423f62
Translated using Weblate (Norwegian Bokmål)
Currently translated at 92.4% (147 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nb_NO/
2021-03-24 14:30:03 +01:00
J. Lavoie
fe92167c9c
Translated using Weblate (Italian)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/it/
2021-03-24 14:30:01 +01:00
Reza Almanda
9f6b8529a7
Translated using Weblate (Indonesian)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/id/
2021-03-16 15:03:12 +01:00
Tuğhan Belbek
802d767c0b
Translated using Weblate (Turkish)
Currently translated at 28.3% (45 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/tr/
2021-03-09 07:02:52 +01:00
Sergio Brighenti
47ad3353d6 Updated changelog 2021-03-07 18:38:27 +01:00
Sergio Brighenti
b9e7285be1 Fix tests 2021-03-07 18:33:29 +01:00
Sergio Brighenti
09583f6cfe Add ip logging 2021-03-07 18:23:41 +01:00
Sergio Brighenti
f6df098915 Added logging 2021-03-07 17:37:20 +01:00
Sergio Brighenti
b72e9cda30 Update lock 2021-03-07 17:25:32 +01:00
Sergio Brighenti
014b5428aa Improved og implementation
Bugfixes
2021-03-07 17:21:07 +01:00
Sergio Brighenti
7cd172510c
Merge pull request #321 from lukas-jo/master
Allow to change the LDAP rdn attribute
2021-03-04 13:40:19 +01:00
Sergio Brighenti
f73d43ab8b
Merge pull request #314 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2021-03-04 13:38:42 +01:00
Lukas
48d58fbf95 Allow to change the LDAP rdn attribute 2021-03-04 11:59:54 +01:00
Metroseksuaali
17a1c7b76f
Translated using Weblate (Finnish)
Currently translated at 57.2% (91 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fi/
2021-02-26 18:50:57 +01:00
Metroseksuaali
fd9f56c949
Added translation using Weblate (Finnish) 2021-02-25 18:15:37 +01:00
Sergei Myndria
b53f325743 Translated using Weblate (Russian)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ru/
2021-02-18 21:04:02 +01:00
Martim Pinheiro
28c751b1a2 Translated using Weblate (Portuguese)
Currently translated at 98.1% (156 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2021-02-18 21:04:02 +01:00
Cristian
34cb67c40e Translated using Weblate (Spanish)
Currently translated at 96.2% (153 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/
2021-02-18 21:04:02 +01:00
herodev hrd
8bacaa2d14 Translated using Weblate (German)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2021-02-18 21:04:02 +01:00
Amasuke
33c9a11e91 Translated using Weblate (German)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2021-02-18 21:04:02 +01:00
Patrick Fruh
cdaa200e4a
fix bin files for PHP8 (#315) 2021-02-18 21:03:58 +01:00
Weblate (bot)
2519b25612
Translations update from Weblate (#308)
* Added translation using Weblate (Turkish)

* Translated using Weblate (Turkish)

Currently translated at 19.4% (31 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/tr/

* Translated using Weblate (German)

Currently translated at 98.1% (156 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/

Co-authored-by: Hozan Şahin <hozansahin@gmail.com>
Co-authored-by: Joschua <joschua@familie-kreimer.de>
2021-02-15 00:13:43 +01:00
Weblate (bot)
cff3af89bb
Translated using Weblate (Indonesian) (#306)
Currently translated at 81.1% (129 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/id/

Co-authored-by: wickedr0se <andrejulian30@gmail.com>
2021-01-18 17:40:16 +01:00
Weblate (bot)
58a36e0e1a
Translations update from Weblate (#304)
* Translated using Weblate (French)

Currently translated at 97.4% (155 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/

* Added translation using Weblate (Hindi)

* Translated using Weblate (Hindi)

Currently translated at 39.6% (63 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/hi/

Co-authored-by: Jean-Philippe Anthonioz <jp.anthonioz@gmail.com>
Co-authored-by: Lebyy <lebon1377@gmail.com>
2020-12-30 09:23:04 +01:00
Sergio Brighenti
b7a04fb2ca
Update test_suite.yml 2020-12-17 18:36:42 +01:00
Weblate (bot)
fe1c30fe4e
Translated using Weblate (Portuguese) (#300)
Currently translated at 74.2% (118 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/

Co-authored-by: ssantos <ssantos@web.de>
2020-12-17 18:33:33 +01:00
dependabot[bot]
b7d593ffc7
Bump ini from 1.3.5 to 1.3.8 (#301)
Bumps [ini](https://github.com/isaacs/ini) from 1.3.5 to 1.3.8.
- [Release notes](https://github.com/isaacs/ini/releases)
- [Commits](https://github.com/isaacs/ini/compare/v1.3.5...v1.3.8)

Signed-off-by: dependabot[bot] <support@github.com>

Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2020-12-17 18:33:13 +01:00
Weblate (bot)
d9025e77dd
Translated using Weblate (Spanish) (#299)
Currently translated at 69.8% (111 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/

Co-authored-by: Slayer 20 <fdou20@gmail.com>
2020-12-03 19:46:49 +01:00
Sergio Brighenti
1d879a72fe
Update README.md 2020-11-25 00:12:56 +01:00
Weblate (bot)
c0f6827e79
Translated using Weblate (Spanish) (#294)
Currently translated at 64.1% (102 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/

Co-authored-by: xrillex <rojads54@gmail.com>
2020-11-14 21:33:38 +01:00
Sergio Brighenti
8f79ede78f Fixed issue with responsive menu on mobile
updated packages
2020-11-13 22:54:13 +01:00
Sergio Brighenti
614fcd0e83 Changelog 2020-11-12 23:29:06 +01:00
Sergio Brighenti
5f272a7176 Missing flag switch 2020-11-12 23:25:34 +01:00
Sergio Brighenti
763a45a65e Update version and changelog 2020-11-12 23:19:11 +01:00
Sergio Brighenti
c4ca9dc962 Fixed user default view 2020-11-12 23:16:53 +01:00
Sergio Brighenti
9cf8ed2ae0 Fix parameter issue on update check 2020-11-12 23:06:47 +01:00
Sergio Brighenti
37520bb571 Updated changelog 2020-11-12 22:57:39 +01:00
Sergio Brighenti
ab0acea8db Updated changelog 2020-11-12 22:55:30 +01:00
Sergio Brighenti
e04ad4d3f3 Updated changelog 2020-11-12 22:55:08 +01:00
Sergio Brighenti
3ff9fb181c Drop telegram share button 2020-11-12 22:50:18 +01:00
Weblate (bot)
6ddbc0fca3
Translated using Weblate (Norwegian Bokmål) (#292)
Currently translated at 92.4% (147 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nb_NO/

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2020-11-10 21:57:20 +01:00
Sergio Brighenti
f169d20b37
Update CHANGELOG.md 2020-10-25 15:42:25 +01:00
Sergio Brighenti
b04b6ff3ce
Apply fixes from StyleCI (#290)
[ci skip] [skip ci]

Co-authored-by: Sergio Brighenti <SergiX44@users.noreply.github.com>
2020-10-25 14:48:20 +01:00
Sergio Brighenti
e9354f8152 Added password recovery tests 2020-10-25 14:47:31 +01:00
Weblate (bot)
55451903b0
Translated using Weblate (English) (#289)
Currently translated at 100.0% (159 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/en/

Co-authored-by: Sergio Brighenti <sergio@brighenti.me>
2020-10-21 23:29:51 +02:00
Sergio Brighenti
d59be8e2f2 Update dependencies 2020-10-20 22:58:14 +02:00
Weblate (bot)
6bcd455d2e
Translated using Weblate (Italian) (#288)
Currently translated at 99.3% (158 of 159 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/it/

Co-authored-by: Sergio Brighenti <sergio@brighenti.me>
2020-10-20 22:55:51 +02:00
Sergio Brighenti
5b8cc0ecbd Update documentation 2020-10-20 19:56:45 +02:00
Sergio Brighenti
1c8e4dff47 Updated bash script 2020-10-20 19:28:22 +02:00
Sergio Brighenti
8ce337233c
Screencloud support (#287)
* Working on screencloud support

* Working screencloud implementation
2020-10-20 13:34:57 +02:00
Sergio Brighenti
1012984661
Apply fixes from StyleCI (#286)
[ci skip] [skip ci]

Co-authored-by: Sergio Brighenti <SergiX44@users.noreply.github.com>
2020-10-16 23:10:23 +02:00
Pietro Marangon
dbd40f6210
Fix #226 (#281)
* Fix #226

* Fix indentation

* Fix indentation

* Owner visibility
2020-10-16 23:10:00 +02:00
Weblate (bot)
30c83811b9
Translated using Weblate (Portuguese) (#284)
Currently translated at 77.2% (122 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/

Co-authored-by: Dinip <dinis_pimpao@hotmail.com>
2020-10-15 20:31:13 +02:00
Weblate (bot)
9abe5154f9
Translated using Weblate (Norwegian Bokmål) (#282)
Currently translated at 94.9% (150 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nb_NO/

Co-authored-by: Allan Nordhøy <epost@anotheragency.no>
2020-10-13 09:20:54 +02:00
Sergio Brighenti
0bd56d5e1b Completed register controller tests 2020-10-11 17:42:41 +02:00
Sergio Brighenti
50c013af8b
Adding register tests (#280)
* Adding register test, faking mails

* Apply fixes from StyleCI (#279)

[ci skip] [skip ci]

Co-authored-by: Sergio Brighenti <SergiX44@users.noreply.github.com>

* Reduce method complexity

Co-authored-by: Sergio Brighenti <SergiX44@users.noreply.github.com>
2020-10-09 20:01:57 +02:00
Weblate (bot)
c34671d700
Translated using Weblate (Portuguese) (#276)
Currently translated at 68.9% (109 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/

Co-authored-by: ssantos <ssantos@web.de>
2020-10-07 09:21:05 +02:00
Pietro Marangon
0d81256980
Fix #269 (#273)
* Fix #269

* Update CHANGELOG.md
2020-10-03 17:33:21 +02:00
Weblate (bot)
cb48fe30eb
Translations update from Weblate (#270)
* Translated using Weblate (Portuguese)

Currently translated at 68.9% (109 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/

* Fix for php8, adding test for login

* Apply fixes from StyleCI

[ci skip] [skip ci]

* Added main login tests

* Added logout test

Co-authored-by: ssantos <ssantos@web.de>
Co-authored-by: Sergio Brighenti <sergio@brighenti.me>
Co-authored-by: Sergio Brighenti <SergiX44@users.noreply.github.com>
2020-10-03 17:12:46 +02:00
Sergio Brighenti
9a5335ae7f
Merge pull request #272 from SergiX44/login-tests
tests: add Login tests
2020-10-03 17:10:56 +02:00
Sergio Brighenti
00ae95e965 Added logout test 2020-10-03 17:08:31 +02:00
Sergio Brighenti
5af536273e Merge remote-tracking branch 'origin/login-tests' into login-tests
# Conflicts:
#	tests/Feature/LoginControllerTest.php
2020-10-03 16:38:59 +02:00
Sergio Brighenti
89a19006ad Added main login tests 2020-10-03 16:38:19 +02:00
Sergio Brighenti
2fecd2bc22
Merge pull request #271 from SergiX44/analysis-rdKrJQ
Apply fixes from StyleCI
2020-10-03 16:02:35 +02:00
Sergio Brighenti
a130bc17d0 Apply fixes from StyleCI
[ci skip] [skip ci]
2020-10-03 14:01:11 +00:00
Sergio Brighenti
125ae162ff Fix for php8, adding test for login 2020-10-03 16:01:00 +02:00
Sergio Brighenti
333926bbe9
Merge pull request #268 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-10-01 18:17:23 +02:00
Hosted Weblate
d3d06672a9
Merge branch 'origin/master' into Weblate. 2020-10-01 18:08:46 +02:00
Sergio
3d254a9822 Test suite finally working 2020-10-01 18:08:35 +02:00
Sergio
d9be2c7696 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	tests/Feature/LoginControllerTest.php
#	tests/TestCase.php
2020-09-29 09:47:35 +02:00
Artem
4f8b13fd90
Translated using Weblate (Russian)
Currently translated at 59.4% (94 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ru/
2020-09-28 21:41:02 +02:00
Sergio Brighenti
ff25de6ceb
Merge pull request #267 from SergiX44/analysis-EAQjOD
Apply fixes from StyleCI
2020-09-28 18:30:55 +02:00
Sergio Brighenti
20c08eb129 Apply fixes from StyleCI
[ci skip] [skip ci]
2020-09-28 16:20:48 +00:00
Sergio Brighenti
2eb269d6bf Keep an app instace in tests 2020-09-28 18:20:25 +02:00
Sergio
c34faca4d2 Merge remote-tracking branch 'origin/master'
# Conflicts:
#	tests/Client.php
2020-09-28 09:26:24 +02:00
Sergio Brighenti
b94d50e11d
Merge pull request #266 from SergiX44/analysis-BMgalL
Apply fixes from StyleCI
2020-09-27 15:47:50 +02:00
Sergio Brighenti
870464a9ff Apply fixes from StyleCI
[ci skip] [skip ci]
2020-09-27 13:47:33 +00:00
Sergio Brighenti
f2523c24e5 Added temporary database 2020-09-27 15:47:19 +02:00
Sergio Brighenti
9de27e1278 Create config for the test suite 2020-09-26 20:53:07 +02:00
Sergio Brighenti
77bcc18807 Merge remote-tracking branch 'origin/master' 2020-09-26 18:48:53 +02:00
Sergio Brighenti
a11b9dd711 Fix license string 2020-09-26 18:48:42 +02:00
Sergio Brighenti
eb29f9f486
Update sponsor.md 2020-09-26 17:24:57 +02:00
Sergio Brighenti
3b71954b96 Create CNAME 2020-09-06 13:08:27 +02:00
Sergio Brighenti
ead80525ed Release 2020-09-05 11:45:12 +02:00
Sergio
61efafc991 Working on test suite 2020-09-04 17:17:57 +02:00
Sergio
75c7c644aa Fix exclude file 2020-09-02 11:19:19 +02:00
Sergio
619d192d14 Fix and update phpunit 2020-09-01 17:22:16 +02:00
Sergio
d042a3b84a Fix namespace
Improved testing methods
2020-09-01 16:55:40 +02:00
Sergio
afda056ba9 Updated dependencies
Fix namespace
2020-09-01 10:16:08 +02:00
Sergio Brighenti
6724537da2
Merge pull request #246 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-08-13 09:15:38 +02:00
Lexy Cat
f679c19d56
Added translation using Weblate (Czech) 2020-08-06 17:36:57 +02:00
Thomas
cea09407f8
Translated using Weblate (German)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2020-08-04 21:32:46 +02:00
Anosh Soltanabadi
7679212ea9
Translated using Weblate (Swedish)
Currently translated at 44.3% (70 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/sv/
2020-08-03 11:41:58 +02:00
Anosh Soltanabadi
bb8644092c
Added translation using Weblate (Swedish) 2020-08-02 11:12:43 +02:00
Sergio Brighenti
2f03a19b37
Merge pull request #243 from SergiX44/analysis-lKwlDd
Apply fixes from StyleCI
2020-07-28 08:53:50 +02:00
Sergio Brighenti
ae9f2eeee2 Apply fixes from StyleCI
[ci skip] [skip ci]
2020-07-28 06:51:56 +00:00
Sergio Brighenti
15f7cac660
Update sponsor.md 2020-07-28 08:51:49 +02:00
Sergio Brighenti
f30d37b7ba Merge remote-tracking branch 'origin/master' 2020-07-19 19:17:06 +02:00
Sergio Brighenti
ff9d749860 Updated slack image bot preview (fixes #238) 2020-07-19 19:16:49 +02:00
Sergio Brighenti
6e20a9ffc7
Merge pull request #240 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-07-19 18:37:28 +02:00
Hosted Weblate
ea42f93b2f
Merge branch 'origin/master' into Weblate. 2020-07-17 09:04:49 +02:00
Sergio Brighenti
0bee59cfda
Merge pull request #241 from SergiX44/dependabot/npm_and_yarn/lodash-4.17.19
Bump lodash from 4.17.15 to 4.17.19
2020-07-17 09:04:44 +02:00
dependabot[bot]
77dd780063
Bump lodash from 4.17.15 to 4.17.19
Bumps [lodash](https://github.com/lodash/lodash) from 4.17.15 to 4.17.19.
- [Release notes](https://github.com/lodash/lodash/releases)
- [Commits](https://github.com/lodash/lodash/compare/4.17.15...4.17.19)

Signed-off-by: dependabot[bot] <support@github.com>
2020-07-16 14:01:12 +00:00
SlamaFR
b0f56acad5
Translated using Weblate (French)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2020-07-15 20:41:57 +02:00
J. Lavoie
da35036874
Translated using Weblate (French (Canada))
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr_CA/
2020-07-14 10:41:52 +02:00
J. Lavoie
28bbf80326
Translated using Weblate (Portuguese)
Currently translated at 68.9% (109 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pt/
2020-07-14 10:41:52 +02:00
J. Lavoie
f3537761d0
Translated using Weblate (French)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2020-07-14 10:41:51 +02:00
J. Lavoie
eeaa4fc710
Translated using Weblate (Spanish)
Currently translated at 65.8% (104 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/es/
2020-07-14 10:41:51 +02:00
J. Lavoie
fb276227b2
Translated using Weblate (German)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2020-07-14 10:41:51 +02:00
J. Lavoie
3d96301051
Translated using Weblate (Italian)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/it/
2020-07-14 10:41:51 +02:00
Sergio Brighenti
e89791fc80
Merge pull request #229 from SergiX44/dependabot/npm_and_yarn/websocket-extensions-0.1.4
Bump websocket-extensions from 0.1.3 to 0.1.4
2020-06-06 17:55:40 +02:00
dependabot[bot]
90276ce106
Bump websocket-extensions from 0.1.3 to 0.1.4
Bumps [websocket-extensions](https://github.com/faye/websocket-extensions-node) from 0.1.3 to 0.1.4.
- [Release notes](https://github.com/faye/websocket-extensions-node/releases)
- [Changelog](https://github.com/faye/websocket-extensions-node/blob/master/CHANGELOG.md)
- [Commits](https://github.com/faye/websocket-extensions-node/compare/0.1.3...0.1.4)

Signed-off-by: dependabot[bot] <support@github.com>
2020-06-06 12:47:09 +00:00
Sergio Brighenti
eff0bae2c8
Merge pull request #225 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-05-31 13:00:31 +02:00
Brian Heldens
deea5038fb
Translated using Weblate (Dutch)
Currently translated at 99.3% (157 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nl/
2020-05-30 14:46:57 +02:00
Sergio Brighenti
c38a864c19
Update sponsor.md 2020-05-26 12:37:55 +02:00
Sergio Brighenti
db388a1533
Merge pull request #222 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-05-20 12:38:40 +02:00
r4ha
162c2312c2
Translated using Weblate (Japanese)
Currently translated at 54.4% (86 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ja/
2020-05-20 05:41:37 +02:00
Sergio Brighenti
1d31ded143
Update CHANGELOG.md 2020-05-19 17:17:48 +02:00
Sergio Brighenti
cdd58ffc6b
Update changelog.md 2020-05-19 17:17:31 +02:00
Sergio Brighenti
4965a979dd
Update CHANGELOG.md 2020-05-19 17:16:15 +02:00
Sergio Brighenti
de2678c0e5
Merge pull request #221 from watermelonpizza/master
Add Azure blob storage as file storage option
2020-05-19 17:14:57 +02:00
Daniel Miller
8d80bda629 Add Azure blob storage as file storage option 2020-05-20 00:55:30 +10:00
Sergio Brighenti
3711f0e01e
Merge pull request #220 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-05-18 21:42:30 +02:00
Artem
23dc7248a4
Translated using Weblate (Russian)
Currently translated at 59.4% (94 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/ru/
2020-05-18 21:41:37 +02:00
Sergio Brighenti
e073f95c8f Added line numbers 2020-05-18 12:20:59 +02:00
Sergio Brighenti
45cea0e794
Merge pull request #216 from camjac251/master
Add S3 Endpoint Support
2020-05-14 13:41:17 +02:00
Sergio Brighenti
18911de752
Update index.php 2020-05-14 13:39:54 +02:00
Sergio Brighenti
a3092f56c2
Update install.twig 2020-05-14 13:38:32 +02:00
camjac251
ccf7b5d2c6 Fix required flag 2020-05-13 09:08:15 -05:00
camjac251
0484237954 wording 2020-05-12 19:49:18 -05:00
camjac251
4dced7dd20 Add S3 Endpoint Support
This will offer support for other storage platforms that offer S3 like APIs such as
Backblaze B2, Wasabi, and DigitalOcean Spaces
2020-05-12 19:46:56 -05:00
Sergio Brighenti
1d0f5b1527 Merge remote-tracking branch 'origin/master' 2020-05-12 18:03:07 +02:00
Sergio Brighenti
62655f9421 Implemented fix from #215 2020-05-12 18:02:46 +02:00
Sergio Brighenti
3753dae1a1
Merge pull request #212 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-05-06 21:28:09 +02:00
whiskeey
aeb82ffbf9
Translated using Weblate (Polish)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pl/
2020-05-06 21:12:58 +02:00
Sergio Brighenti
4deee18be0
Merge pull request #210 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-05-01 13:18:09 +02:00
Johannes Krüger
a4f5cb97de
Translated using Weblate (German)
Currently translated at 96.2% (152 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2020-05-01 12:11:22 +02:00
Allan Nordhøy
2736ce21c9
Translated using Weblate (Norwegian Bokmål)
Currently translated at 91.7% (145 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nb_NO/
2020-05-01 12:11:21 +02:00
Allan Nordhøy
ee5ebb6f23
Translated using Weblate (English)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/en/
2020-05-01 12:11:21 +02:00
Sergio Brighenti
927ba5dcd5
Merge pull request #209 from SergiX44/dependabot/npm_and_yarn/jquery-3.5.0
Bump jquery from 3.4.1 to 3.5.0
2020-04-30 17:29:53 +02:00
Sergio Brighenti
448395b887
Merge pull request #207 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-30 17:29:42 +02:00
dependabot[bot]
e416d8c831
Bump jquery from 3.4.1 to 3.5.0
Bumps [jquery](https://github.com/jquery/jquery) from 3.4.1 to 3.5.0.
- [Release notes](https://github.com/jquery/jquery/releases)
- [Commits](https://github.com/jquery/jquery/compare/3.4.1...3.5.0)

Signed-off-by: dependabot[bot] <support@github.com>
2020-04-30 00:44:03 +00:00
Allan Nordhøy
923ca80ed1
Translated using Weblate (Norwegian Bokmål)
Currently translated at 91.7% (145 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/nb_NO/
2020-04-27 12:11:18 +02:00
Sergio Brighenti
40edde36c7
Merge pull request #206 from Pe46dro/patch-3
Update migrate
2020-04-26 21:10:38 +02:00
Pietro Marangon
988fcb3b92
Update migrate 2020-04-26 17:58:31 +02:00
Pietro Marangon
5d6754e5b1
Update migrate 2020-04-26 15:00:16 +02:00
Sergio Brighenti
edd00c9f73
Merge pull request #205 from SergiX44/analysis-ADeOEZ
Apply fixes from StyleCI
2020-04-22 16:41:53 +02:00
Sergio Brighenti
669611c8f6 Apply fixes from StyleCI
[ci skip] [skip ci]
2020-04-22 14:41:26 +00:00
Sergio Brighenti
71e9ead655
Update test_suite.yml 2020-04-22 16:41:18 +02:00
Sergio Brighenti
002b16d845 Merge remote-tracking branch 'origin/master' 2020-04-22 16:24:59 +02:00
Sergio Brighenti
edd26b0e35 Added close session before start file stream 2020-04-22 16:24:43 +02:00
Sergio Brighenti
696f47436b
Merge pull request #200 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-19 14:37:09 +02:00
Jeannette L
e37a7bf36b
Translated using Weblate (French (Canada))
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr_CA/
2020-04-19 03:11:26 +02:00
whiskeey
1a8f1101dc
Translated using Weblate (Polish)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pl/
2020-04-19 03:11:23 +02:00
anonymous
9553c09991
Translated using Weblate (French)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2020-04-19 03:11:23 +02:00
Jeannette L
5241cc3366
Translated using Weblate (French)
Currently translated at 100.0% (158 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2020-04-19 03:11:23 +02:00
Jeannette L
d7319faa02
Translated using Weblate (German)
Currently translated at 98.7% (156 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2020-04-19 03:11:22 +02:00
Sergio Brighenti
36498c4605
Merge pull request #199 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-18 22:58:02 +02:00
Jeannette L
8034fe1367
Translated using Weblate (German)
Currently translated at 98.7% (156 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2020-04-18 02:41:43 +02:00
anonymous
2141cf9ab7
Translated using Weblate (German)
Currently translated at 98.7% (156 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2020-04-18 02:41:42 +02:00
Jeannette L
ada419fc51
Added translation using Weblate (French (Canada)) 2020-04-18 02:39:57 +02:00
Sergio Brighenti
95a0c1c85e
Merge pull request #197 from Pe46dro/patch-2
Update xbackbone_uploader.sh.twig
2020-04-16 21:51:40 +02:00
Pietro Marangon
bed9a107d3
Update xbackbone_uploader.sh.twig 2020-04-16 21:49:35 +02:00
Sergio Brighenti
4f75f337be
Create php.yml 2020-04-15 00:15:45 +02:00
Sergio Brighenti
70e1ef826e
Merge pull request #196 from SergiX44/analysis-nNZaLy
Apply fixes from StyleCI
2020-04-15 00:10:32 +02:00
Sergio Brighenti
e6641fe1a9 Apply fixes from StyleCI
[ci skip] [skip ci]
2020-04-14 22:09:23 +00:00
Sergio Brighenti
ce2f0ef72d Merge remote-tracking branch 'origin/master' 2020-04-15 00:09:08 +02:00
Sergio Brighenti
1bb05f5c2b Added test suite 2020-04-15 00:08:51 +02:00
Sergio Brighenti
63ef35a475
Merge pull request #195 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-14 22:15:50 +02:00
Dominik
de8d4595ee
Translated using Weblate (Polish)
Currently translated at 96.8% (153 of 158 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pl/
2020-04-14 20:11:23 +02:00
Sergio Brighenti
704f76986f
Update README.md 2020-04-13 21:55:22 +02:00
Sergio Brighenti
2303cb263f Fixed error with cli command 2020-04-13 17:46:10 +02:00
Sergio Brighenti
5a7c74c5d9 Release 3.1.3 2020-04-13 17:10:17 +02:00
Sergio Brighenti
0629264002
Merge pull request #193 from Lukasss93/luca.patera
Improved changelog + new changelog page
2020-04-13 16:47:53 +02:00
Luca Patera
1689c8d3f3 Fixed .htaccess and nginx.conf 2020-04-13 16:46:53 +02:00
Luca Patera
a37854ef57 Added changelog page 2020-04-13 16:30:05 +02:00
Luca Patera
9cad1dc35b Improved .gitignore file 2020-04-13 16:28:44 +02:00
Luca Patera
0983149dd3 Merge remote-tracking branch 'remotes/upstream/master' into luca.patera 2020-04-13 16:25:48 +02:00
Luca Patera
37b6fdea28 Improved CHANGELOG file using 'Keep a Changelog' 2020-04-13 16:23:39 +02:00
Sergio Brighenti
82af995a75 Update langs names 2020-04-13 13:05:12 +02:00
Sergio Brighenti
8c7dd2bd3f
Merge pull request #192 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-13 12:37:37 +02:00
Serenium
4fbad4186b
Translated using Weblate (Indonesian)
Currently translated at 48.7% (76 of 156 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/id/
2020-04-13 12:34:53 +02:00
Serenium
f8aa2f9175
Added translation using Weblate (Indonesian) 2020-04-13 03:48:58 +02:00
Sergio Brighenti
da0a5e96ba Updated sample config 2020-04-12 19:58:15 +02:00
Sergio Brighenti
1ac9a0d7be Changelog 2020-04-12 19:55:59 +02:00
Sergio Brighenti
9bea86f8f5 Installer improvements
Updated sponsor list
2020-04-12 19:51:27 +02:00
Sergio Brighenti
8fbaded18d Added check of cases like #191 2020-04-12 18:46:25 +02:00
Sergio Brighenti
8fd6a1cb19 Updated website 2020-04-12 13:27:09 +02:00
Sergio Brighenti
96884c3c30 Merge remote-tracking branch 'origin/master' 2020-04-12 13:23:47 +02:00
Sergio Brighenti
004fc27c5f Updated website 2020-04-12 13:23:24 +02:00
Sergio Brighenti
29e63648ce
Merge pull request #189 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-11 18:10:50 +02:00
Johannes Krüger
4042faefb5
Translated using Weblate (German)
Currently translated at 100.0% (156 of 156 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2020-04-11 18:09:40 +02:00
Sergio Brighenti
fca9c1add6 composer lock 2020-04-11 18:03:47 +02:00
Sergio Brighenti
4cefa9ed24 Fixed installation error
(closes #188)
2020-04-11 17:59:14 +02:00
Sergio Brighenti
ccc10f6499 Clean up 2020-04-10 16:45:43 +02:00
Sergio Brighenti
71357755f3 improved mail spamassassin tips 2020-04-09 15:13:35 +02:00
Sergio Brighenti
d6cc4032b8 Fixed button bad layout 2020-04-09 15:10:04 +02:00
Sergio Brighenti
eb0d42a03f Fixed button bad layout 2020-04-09 15:09:49 +02:00
Sergio Brighenti
9890f09e81 Fixed error with raw preview
(Closes #184)
2020-04-09 15:02:05 +02:00
Sergio Brighenti
e81a590eb0
Merge pull request #183 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-09 13:53:13 +02:00
Sergio Brighenti
61bdf97463
Translated using Weblate (Italian)
Currently translated at 100.0% (156 of 156 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/it/
2020-04-09 13:52:37 +02:00
IDBLOCK
aa14e5c2ce Translated using Weblate (French)
Currently translated at 100.0% (155 of 155 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2020-04-09 13:48:43 +02:00
Sergio Brighenti
6081b02dbe 3.1.RC5 2020-04-09 13:48:33 +02:00
Sergio Brighenti
e100cff3de Added check in the installer 2020-04-09 13:10:54 +02:00
Sergio Brighenti
a99d9a7fc7 Added check if the zip extension is not loaded 2020-04-09 13:09:57 +02:00
Sergio Brighenti
d77b83b1d6 Fixed upgrade with php 7.4 2020-04-08 19:02:37 +02:00
Sergio Brighenti
fd11209e08 Improved tag management 2020-04-08 18:36:10 +02:00
Sergio Brighenti
f42064d9ee 3.1.rc3 2020-04-08 14:17:50 +02:00
Sergio Brighenti
b1f9b46c94 Removed invalid translation strings, added check on lang string parameter binding 2020-04-08 14:02:24 +02:00
Sergio Brighenti
c9b6dfab85 enabled recaptcha on password recovery 2020-04-08 13:30:55 +02:00
Sergio Brighenti
90d73bfed1
Merge pull request #181 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-08 13:26:59 +02:00
Sergio Brighenti
fa92309f7b
Translated using Weblate (Italian)
Currently translated at 99.3% (154 of 155 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/it/
2020-04-08 13:24:12 +02:00
whiskeey
3d0ce204ba Translated using Weblate (Polish)
Currently translated at 100.0% (155 of 155 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/pl/
2020-04-08 13:20:15 +02:00
Sergio Brighenti
e37cbbb025 enabled recaptcha on password recovery 2020-04-08 13:19:57 +02:00
Sergio Brighenti
f88bcbc9e7 Fixed message encoding 2020-04-07 23:28:53 +02:00
Sergio Brighenti
4891ce0f9f Fixing error during upload 2020-04-07 23:22:47 +02:00
Sergio Brighenti
041bb9fd55 added tags on the preview page
added a way to disable autotagging
Fixed issue with email content type
the uploads page previews are now with a link
Disabled logging of 404 errors
2020-04-07 18:43:34 +02:00
Sergio Brighenti
afefbfa99d Fixed issue #177 2020-04-06 19:24:26 +02:00
Sergio Brighenti
d5b95f542b 3.1.RC1
renabled remove dir
2020-04-06 12:55:58 +02:00
Sergio Brighenti
1c674e5e67 3.1.RC1
Fixed dns building for non-absolute paths
2020-04-06 12:54:34 +02:00
Sergio Brighenti
63c332a697 3.1.RC1
Fixed installer issues
2020-04-06 12:43:47 +02:00
Sergio Brighenti
ce497f9728 Fixed quota regex 2020-04-06 11:34:18 +02:00
Sergio Brighenti
06fcef7433 Fixed tag add bad alignment 2020-04-05 15:18:39 +02:00
Sergio Brighenti
7ddfb06729
Merge pull request #176 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-05 14:55:57 +02:00
IDBLOCK
5d036c3c18 Translated using Weblate (French)
Currently translated at 100.0% (154 of 154 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2020-04-05 14:53:39 +02:00
IDBLOCK
315d0839c2 Translated using Weblate (English)
Currently translated at 100.0% (154 of 154 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/en/
2020-04-05 14:53:39 +02:00
Sergio Brighenti
a253234bd4 Fixed installer errors 2020-04-05 14:53:22 +02:00
Sergio Brighenti
7e9d43ec71 Added docs favicon 2020-04-04 19:45:28 +02:00
Sergio Brighenti
4bd422c08c Updated website 2020-04-04 19:44:22 +02:00
Sergio Brighenti
f6dccc2e9e Updated website 2020-04-04 19:41:17 +02:00
Sergio Brighenti
b2342f4acb
Merge pull request #175 from SergiX44/analysis-1bWrP1
Apply fixes from StyleCI
2020-04-04 19:29:29 +02:00
Sergio Brighenti
103819827b Apply fixes from StyleCI
[ci skip] [skip ci]
2020-04-04 17:29:15 +00:00
Sergio Brighenti
5606224339 Replaced validation system 2020-04-04 19:29:00 +02:00
Sergio Brighenti
f215dc70e8
Merge pull request #171 from weblate/weblate-xbackbone-xbackbone
Translations update from Weblate
2020-04-04 12:35:17 +02:00
IDBLOCK
a30a4fdf11
Translated using Weblate (French)
Currently translated at 100.0% (154 of 154 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/fr/
2020-04-04 04:55:45 +02:00
Johannes Krüger
f52453cd65
Translated using Weblate (German)
Currently translated at 99.3% (153 of 154 strings)

Translation: XBackBone/XBackBone
Translate-URL: https://hosted.weblate.org/projects/xbackbone/xbackbone/de/
2020-04-04 04:55:44 +02:00
129 changed files with 16106 additions and 3383 deletions

27
.github/workflows/test_suite.yml vendored Normal file
View file

@ -0,0 +1,27 @@
name: PHP Composer
on:
push:
branches: [ master ]
pull_request:
branches: [ master ]
jobs:
build:
runs-on: ubuntu-latest
strategy:
matrix:
operating-system: [ubuntu-latest]
php-versions: ["7.3", "7.4", "8.0", "8.1", "8.2"]
steps:
- uses: actions/checkout@v2
- name: Validate composer.json and composer.lock
run: composer validate --no-check-version
- name: Install dependencies
run: composer install --no-progress
- name: Run test suite
run: vendor/bin/phpunit --no-coverage

11
.gitignore vendored
View file

@ -2,13 +2,10 @@
composer.phar
/vendor/
# Commit your application's lock file http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
composer.lock
### grunt ###
# Grunt usually compiles files inside this directory
dist/
release*.zip
# Grunt usually preprocesses files such as coffeescript, compass... inside the .tmp directory
.tmp/
@ -77,6 +74,7 @@ typings/
# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
# User-specific stuff:
.idea/
.idea/**/workspace.xml
.idea/**/tasks.xml
.idea/dictionaries
@ -137,4 +135,7 @@ resources/database/*.db
resources/sessions/sess_*
logs/log-*.txt
config.php
release.zip
release.zip
/.settings/
/.project
/.buildpath

View file

@ -1,8 +1,8 @@
Options -Indexes
Options -Indexes +SymLinksIfOwnerMatch
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteRule ^(app|bin|bootstrap|resources|storage|vendor|logs)(/.*|)$ - [NC,F]
RewriteRule ^(app|bin|bootstrap|resources|storage|vendor|logs|CHANGELOG.md)(/.*|)$ - [NC,F]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.*)$ index.php [QSA,L]
</IfModule>
</IfModule>

View file

@ -1,189 +1,450 @@
## v.3.1 (WIP)
+ Added tagging system (add, delete, search of tagged files).
+ Added basic media auto-tagging on upload.
+ Added registration system.
+ Added password recovery system.
+ Added ability to export all media of an account.
+ Added ability to choose between default and raw url on copy.
+ Added hide by default option.
+ Added user disk quota.
+ Added reCAPTCHA login protection.
+ Added bulk delete.
+ Added account clean function.
+ Added user disk quota system.
+ Added notification option on account create.
+ Added LDAP authentication.
+ Fixed bug html files raws are rendered in a browser.
+ The theme is now re-applied after every system update.
+ Updated system settings page.
+ Updated translations.
+ Improved grid layout.
+ Fixes and improvements.
# Changelog
All notable changes to this project will be documented in this file.
## v.3.0.2
+ Fixed error with migrate command.
+ Updated translations.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## v.3.0.1
+ Fixed error with older mysql versions.
+ Fixed config is compiled with the di container.
+ Small installer update.
## Unreleased
## v.3.0
+ Upgraded from Slim3 to Slim 4.
+ Added web upload.
+ Added ability to add custom HTML in \<head\> tag.
+ Added ability to show a preview of PDF files.
+ Added remember me functionality.
+ Added delete button on the preview page if the user is logged in.
+ New project icon (by [@SerenaItalia](https://www.deviantart.com/serenaitalia)).
+ Raw URL now accept file extensions.
+ The linux script can be used on headless systems.
+ Improved installer.
+ Improved thumbnail generation.
+ Replaced videojs player with Plyr.
+ Implemented SameSite XSS protection.
+ Small fixes and improvements.
## [3.7.0] - 2024-01-14
### Added
- Added support for vanity urls.
- Added KDE integration for linux script.
## v.2.6.6
+ Ability to choose between releases and prereleases with the web updater.
+ Updated translations.
### Changed
- Updated translations.
- File preview is now clickable to open the file.
## v2.6.5
+ Fixed error after orphaned files removal #74.
+ Fixed update password not correctly removed from log files #74.
+ Changed color to some buttons to address visibility with some themes.
### Fixed
- Fixes for LDAP authentication.
## v2.6.4
+ Filter on displayable images.
+ Fixed during upload error on php compiled for 32 bit.
+ Fixed icons on the installer page.
+ The generated random strings are now more human readable.
## [3.6.3] - 2023-05-27
### Fixed
- Fix LDAP for php >= 8.1
## v2.6.3
+ Fixed #67.
+ Fixed bad preload statement.
+ Fixed wrong redirect after install in subdirs.
## [3.6.2] - 2023-05-24
### Changed
- Support for PHP 8.2
## v2.6.2
+ Use the font awesome web font for better performances.
+ Changed background default color.
+ Added method for cache busting when updating/change theme.
+ Added russian translation from [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
### Removed
- Azure blob storage driver
## v2.6.1
+ Fixed bad redirects on the web installer (#62).
+ Fixed login page with dark themes.
+ Improved shell commands.
+ Added alert if required extensions are not loaded.
+ Updated translations.
## [3.6.1] - 2022-11-27
### Changed
- Upgraded dependencies
- Updated translations
## v2.6
+ Added support to use AWS S3, Google Cloud Storage, Dropbox and FTP(s) accounts as storage location.
+ Fixed missing icon.
+ Added german and norwegian translations from [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
+ Improved lang detection.
+ Added ability to force system language.
### Fixed
- Fixed error in export data (#499)
- Fixed issues with reverse proxies (#495)
- Fixed duplicated twitter tags
## v2.5.3
+ Fixed bad css loading on Firefox (#35).
+ Fixed wrong style for publish/unpublish button.
+ Improved exception stacktrace logging.
## [3.6.0] - 2022-06-20
### Changed
- Improved embedding on discord of large videos.
- Releases are now compressed for faster downloads
- Updated translations
## v2.5.2
+ Improved session handling.
+ Fixed telegram share not working.
+ Fix for big text file now are not rendered in the browser.
+ Added preloading for some resources to improve performances.
+ Added check for block execution on EOL and unsupported PHP versions.
+ Other minor improvements.
### Fixed
- Fixed deprecation notices on php >= 8
- Fixed embed UA for Discord.
- Fixed error with post_max_size = 0
## v2.5.1
+ Fixed bad redirect if the theme folder is not writable. (#27)
+ Improved HTTP partial content implementation for large files.
### Removed
- Support for php 7.2
## v2.5
+ Updated project license to <a href="https://choosealicense.com/licenses/agpl-3.0/">AGPL v3.0</a> (now releases ships with the new license).
+ **[BETA]** Added self update feature.
+ Added partial content implementation (stream seeking on chromium based browsers).
+ Improved video.js alignment with large videos.
+ Optimized output zip release size.
+ Templates cleanup and optimizations.
+ Improved error handling.
+ Added project favicon.
## [3.5.1] - 2021-10-22
### Changed
- Fixed embed UA for Discord.
- Updated translations.
## v2.4.1
+ Fixed error message when the file is too large. (#15)
+ Fixed button alignment.
## [3.5.0] - 2021-09-05
### Added
- Support for theme-park.dev themes.
- Updated translations.
## v2.4
+ Added function to remove orphaned files.
+ Switch between tab and gallery mode using an admin account.
+ Multiple uploads sorting methods.
+ Search in uploads.
+ Internal refactoring and improvements
+ Updated js dependencies.
### Fixed
- Wrong css when reapplying the default theme.
## v2.3.1
+ Fixed en lang.
+ Fixed forced background with dark themes.
+ Added checks during the installation wizard.
+ cURL and Wget can now directly download the file.
### Removed
- Dropped theme cli command.
## v2.3
+ Improved image scaling in user gallery.
+ Added overlay on user gallery images.
+ Fixed IT translation.
+ Fontawesome icon match the single file mime-type.
+ Enable audio player with video.js.
+ Video and audio now starts with volume at 50%.
+ Added linux script to allow uploads from linux screenshot tools.
+ Minor layout fixes.
## [3.4.1] - 2021-08-11
### Added
- Toggle to disable embeds.
## v2.2
+ Added multi-language support.
+ Improved routing.
+ Fixed HTTP/2 push is resetting the current session.
+ Minor improvements and bug fixes.
### Changed
- Raw url copying now contains also the file extension.
## v2.1
+ Improved theme style.
+ Improved page redirecting.
+ Allow e-mail login.
+ Support for ShareX deletion URL.
+ Fixed HTTP/2 push preload.
+ Added video.js support.
## [3.4.0] - 2021-08-01
### Added
- Added image support for OG for Discord only.
## v2.0
+ Migrated from Flight to Slim 3 framework.
+ Added install wizard (using the CLI is no longer required).
+ Allow discord bot to display the preview.
+ Theme switcher on the web UI.
+ Added used space indicator per user.
+ MySQL support.
+ Improvements under the hood.
### Changed
- Updated translations.
- Dropped support for PHP 7.1
## v1.3
+ Added command to switch between bootswatch.com themes.
+ Added popever to write the telegram message when sharing.
+ Packaging improvements.
+ Updated some dependencies.
+ Allow Facebook bots to display the preview.
### Fixed
- Fixed possible XSS and CSRF attacks.
## v1.2
+ Previews are now scaled for better page load.
+ Added auto config generator for ShareX.
+ Show upload file size on the dashboard.
+ Fixed insert for admin user (running `php bin\migrate --install`).
+ Removed HTTP2 push from the dashboard to improve loading time.
## [3.3.5] - 2021-04-25
### Fixed
- Removed OG integration for discord.
## v1.1
+ Added logging.
+ Fixed back to top when click delete or publish/unpublish.
+ Improved migrate system.
+ Login redirect back to the requested page.
+ Updated Bootstrap theme.
+ Added share to Telegram.
### Changed
- Updated translations.
## v1.0
+ Initial version.
## [3.3.4] - 2021-03-07
### Added
- Login failed logging.
- User identifier option for LDAP configurations.
### Fixed
- Fixed open graph meta tags for Discord.
- Fixed custom html tags are not displayed back in the admin setting.
- Fixed python plugin for newer version of Screencloud.
- Fixed accented chars in email subject.
- Fixed error on PHP 8.
## [3.3.3] - 2020-11-13
### Fixed
- Fixed issue with responsive menu on mobile.
## [3.3.2] - 2020-11-12
### Fixed
- Fixed switch not works for the first time for normal users.
## [3.3.1] - 2020-11-12
### Fixed
- Formatting error on the check for updates.
- Fixed default view for normal users.
## [3.3.0] - 2020-11-12
### Added
- Enabled PHP 8 support.
- Added Screencloud client support (https://screencloud.net).
- OpenGraph image tag (issue #269).
- Start adding unit tests.
### Changed
- The list mode is now available also for non-admin accounts (issue #226).
### Fixed
- Linux script strange response code in headless mode.
### Removed
- Dropped Telegram share button.
## [3.2.0] - 2020-09-05
### Added
- Added support to use Azure Blob Storage account as storage location.
- Support for other S3-compatible storage endpoint.
- Line number when showing text files.
### Fixed
- S3 driver file streaming not working properly.
- Fixed Slack image preview.
## [3.1.4] - 2020-04-13
### Changed
- Now the migrate command resync the system quota for each user.
### Fixed
- Fixed error with the migrate command.
## [3.1.3] - 2020-04-13
### Changed
- Added changelog page.
- Updated translations.
## [3.1.2] - 2020-04-12
### Changed
- Improved installer storage checks.
### Fixed
- Fixed upload table lost when updating very old instances.
## [3.1.1] - 2020-04-11
### Fixed
- Fixed error during a fresh installation with sqlite.
## [3.1] - 2020-04-10
### Added
- Added tagging system (add, delete, search of tagged files).
- Added basic media auto-tagging on upload.
- Added registration system.
- Added password recovery system.
- Added ability to export all media of an account.
- Added ability to choose between default and raw url on copy.
- Added hide by default option.
- Added user disk quota.
- Added reCAPTCHA login protection.
- Added bulk delete.
- Added account clean function.
- Added user disk quota system.
- Added notification option on account create.
- Added LDAP authentication.
### Changed
- The theme is now re-applied after every system update.
- Updated system settings page.
- Updated translations.
- Improved grid layout.
### Fixed
- Fixed bug html files raws are rendered in a browser.
- Fixes and improvements.
## [3.0.2] - 2019-12-04
### Changed
- Updated translations.
### Fixed
- Fixed error with migrate command.
## [3.0.1] - 2019-11-25
### Changed
- Small installer update.
### Fixed
- Fixed error with older mysql versions.
- Fixed config is compiled with the di container.
## [3.0] - 2019-11-23
### Added
- Added web upload.
- Added ability to add custom HTML in \<head\> tag.
- Added ability to show a preview of PDF files.
- Added remember me functionality.
- Added delete button on the preview page if the user is logged in.
- New project icon (by [@SerenaItalia](https://www.deviantart.com/serenaitalia)).
- The linux script can be used on headless systems.
- Raw URL now accept file extensions.
- Implemented SameSite XSS protection.
### Changed
- Upgraded from Slim3 to Slim 4.
- Replaced videojs player with Plyr.
- Improved installer.
- Improved thumbnail generation.
- Small fixes and improvements.
## [2.6.6] - 2019-10-23
### Added
- Ability to choose between releases and prereleases with the web updater.
### Changed
- Updated translations.
## [2.6.5] - 2019-09-17
### Changed
- Changed color to some buttons to address visibility with some themes.
### Fixed
- Fixed error after orphaned files removal #74.
- Fixed update password not correctly removed from log files (#74).
## [2.6.4] - 2019-09-15
### Added
- Filter on displayable images.
### Changed
- The generated random strings are now more human readable.
### Fixed
- Fixed during upload error on php compiled for 32 bit.
- Fixed icons on the installer page.
## [2.6.3] - 2019-09-14
### Fixed
- Fixed #67.
- Fixed bad preload statement.
- Fixed wrong redirect after install in subdirs.
## [2.6.2] - 2019-09-06
### Added
- Added method for cache busting when updating/change theme.
- Added russian translation from [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
### Changed
- Changed background default color.
- Use the Font Awesome web font for better performances.
## [2.6.1] - 2019-09-04
### Added
- Added alert if required extensions are not loaded.
### Changed
- Improved shell commands.
- Updated translations.
### Fixed
- Fixed bad redirects on the web installer (#62).
- Fixed login page with dark themes.
## [2.6] - 2019-08-20
### Added
- Added support to use AWS S3, Google Cloud Storage, Dropbox and FTP(s) accounts as storage location.
- Added german and norwegian translations from [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
- Added ability to force system language.
### Changed
- Improved lang detection.
### Fixed
- Fixed missing icon.
## [2.5.3] - 2019-05-12
### Changed
- Improved exception stacktrace logging.
### Fixed
- Fixed bad css loading on Firefox (#35).
- Fixed wrong style for publish/unpublish button.
## [2.5.2] - 2019-05-09
### Added
- Added preloading for some resources to improve performances.
- Added check for block execution on EOL and unsupported PHP versions.
### Changed
- Improved session handling.
- Other minor improvements.
### Fixed
- Fixed telegram share not working.
- Fix for big text file now are not rendered in the browser.
## [2.5.1] - 2019-04-10
### Changed
- Improved HTTP partial content implementation for large files.
### Fixed
- Fixed bad redirect if the theme folder is not writable. (#27)
## [2.5] - 2019-02-10
### Added
- Added partial content implementation (stream seeking on chromium based browsers).
- **[BETA]** Added self update feature.
- Added project favicon.
### Changed
- Updated project license to [AGPL v3.0](https://choosealicense.com/licenses/agpl-3.0/) (now releases ships with the new license).
- Improved video.js alignment with large videos.
- Optimized output zip release size.
- Templates cleanup and optimizations.
- Improved error handling.
## [2.4.1] - 2019-01-24
### Fixed
- Fixed error message when the file is too large. (#15)
- Fixed button alignment.
## [2.4] - 2019-01-22
### Added
- Added function to remove orphaned files.
- Multiple uploads sorting methods.
- Switch between tab and gallery mode using an admin account.
- Search in uploads.
### Changed
- Updated js dependencies.
- Internal refactoring and improvements
## [2.3.1] - 2018-12-09
### Added
- Added checks during the installation wizard.
- cURL and Wget can now directly download the file.
### Fixed
- Fixed english language.
- Fixed forced background with dark themes.
## [2.3] - 2018-11-30
### Added
- Added overlay on user gallery images.
- Added linux script to allow uploads from linux screenshot tools.
- Enable audio player with video.js.
- Font Awesome icon match the single file mime-type.
### Changed
- Improved image scaling in user gallery.
- Video and audio now starts with volume at 50%.
- Minor layout fixes.
### Fixed
- Fixed IT translation.
## [2.2] - 2018-11-20
### Added
- Added multi-language support.
### Fixed
- Improved routing.
- Minor improvements and bug fixes.
- Fixed HTTP/2 push is resetting the current session.
## [2.1] - 2018-11-20
### Added
- Added video.js support.
- Allow e-mail login.
- Support for ShareX deletion URL.
### Changed
- Improved theme style.
- Improved page redirecting.
### Fixed
- Fixed HTTP/2 push preload.
## [2.0] - 2018-11-13
### Added
- Added install wizard (using the CLI is no longer required).
- Added used space indicator per user.
- Allow discord bot to display the preview.
- Theme switcher on the web UI.
- MySQL support.
### Changed
- Migrated from Flight to Slim 3 framework.
- Improvements under the hood.
## [1.3] - 2018-10-14
### Added
- Added command to switch between bootswatch.com themes.
- Added popover to write the telegram message when sharing.
- Allow Facebook bots to display the preview.
### Changed
- Packaging improvements.
- Updated some dependencies.
## [1.2] - 2018-05-01
### Added
- Added auto config generator for ShareX.
- Show upload file size on the dashboard.
### Changed
- Previews are now scaled for better page load.
### Removed
- Removed HTTP2 push from the dashboard to improve loading time.
### Fixed
- Fixed insert for admin user (running `php bin\migrate --install`).
## [1.1] - 2018-04-28
### Added
- Added logging.
- Added share to Telegram.
### Changed
- Improved migrate system.
- Updated Bootstrap theme.
### Fixed
- Fixed back to top when click delete or publish/unpublish.
- Login redirect back to the requested page.
## [1.0] - 2018-04-28
### Added
- Initial version.

View file

@ -94,6 +94,11 @@ module.exports = function (grunt) {
cwd: 'node_modules/highlightjs',
src: ['styles/**/*', 'highlight.pack.min.js'],
dest: 'static/highlightjs'
}, {
expand: true,
cwd: 'node_modules/highlightjs-line-numbers.js/dist',
src: ['highlightjs-line-numbers.min.js'],
dest: 'static/highlightjs'
},
{
expand: true,
@ -123,40 +128,55 @@ 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/**/*',
'static/**/*',
'vendor/**/*',
'.htaccess',
'config.example.php',
'index.php',
'composer.json',
'composer.lock',
'LICENSE',
'favicon.ico',
]
},
shell: {
phpstan: {
command: '"./vendor/bin/phpstan" analyse app resources/lang bin install'
command: '"./vendor/bin/phpstan" --level=0 analyse app resources/lang bin install'
},
composer_no_dev: {
command: 'composer install --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: '/'
}]
}
},
});
@ -165,5 +185,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', 'zip']);
grunt.registerTask('build-release', ['default', 'composer_no_dev', 'compress']);
};

View file

@ -1,5 +1,5 @@
# [![Weblate](https://hosted.weblate.org/widgets/xbackbone/-/xbackbone/svg-badge.svg)](https://hosted.weblate.org/engage/xbackbone/?utm_source=widget) <a href="https://codeclimate.com/github/SergiX44/XBackBone/maintainability"><img src="https://api.codeclimate.com/v1/badges/bf8ee4a8df9c9f0dfa08/maintainability" /></a> [![Donations](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=6RXF8ZGCZBL68&item_name=Support+the+XBackBone+Development&currency_code=EUR&source=url)
# <a href="https://hosted.weblate.org/engage/xbackbone/?utm_source=widget"><img src="https://hosted.weblate.org/widgets/xbackbone/-/xbackbone/svg-badge.svg" alt="Weblate"></a> <a href="https://codeclimate.com/github/SergiX44/XBackBone/maintainability"><img src="https://api.codeclimate.com/v1/badges/bf8ee4a8df9c9f0dfa08/maintainability" alt="Codeclimate"></a> <a href="http://bit.ly/XBackBonePaypal"><img src="https://img.shields.io/badge/donate-PayPal-yellow" alt="Donations"></a> <a href="https://discord.gg/ksPfXFbhDF"><img src="https://img.shields.io/discord/780922715393359904?label=discord%20chat" alt="Discord"></a>
<p align="center">
<img src=".github/xbackbone.png" width="350px">
@ -18,7 +18,7 @@ All the installations, configuration, and usage instructions are available in th
+ Supports every upload type from ShareX.
+ Config generator for ShareX.
+ Low memory footprint.
+ Multiple backends support: Local storage, AWS S3, Google Cloud, Dropbox, FTP(s).
+ Multiple backends support: Local storage, AWS S3, Google Cloud, Azure Blob Storage, Dropbox, FTP(s).
+ Web file upload.
+ Code uploads syntax highlighting.
+ Video and audio uploads webplayer.
@ -42,6 +42,11 @@ All the installations, configuration, and usage instructions are available in th
+ Tag uploads with custom tags for categorization.
+ ... and more.
## Security Vulnerabilities
If you discover a security vulnerability within XBackBone, please send an e-mail to Sergio at sergio@brighenti.me. All security vulnerabilities will be promptly addressed.
## License
This software is licensed under the <a href="https://choosealicense.com/licenses/agpl-3.0/">GNU Affero General Public License v3.0</a>, available in this repository.
As a "copyright notice" it is sufficient to keep the small footer at the bottom of the page, also to help other people to learn about this project!

5
SECURITY.md Normal file
View file

@ -0,0 +1,5 @@
# Security Policy
## Security Vulnerabilities
If you discover a security vulnerability within XBackBone, please send an e-mail to Sergio at sergio@brighenti.me. All security vulnerabilities will be promptly addressed.

View file

@ -3,6 +3,7 @@
namespace App\Controllers;
use App\Database\Migrator;
use App\Web\Theme;
use League\Flysystem\FileNotFoundException;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
@ -21,25 +22,29 @@ class AdminController extends Controller
*/
public function system(Request $request, Response $response): Response
{
$settings = [];
foreach ($this->database->query('SELECT `key`, `value` FROM `settings`') as $setting) {
$settings[$setting->key] = $setting->value;
}
$settings['default_user_quota'] = humanFileSize(
$this->getSetting('default_user_quota', stringToBytes('1G')),
0,
true
);
return view()->render($response, 'dashboard/system.twig', [
'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),
'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),
'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' => phpversion(),
'php_version' => PHP_VERSION,
'max_memory' => ini_get('memory_limit'),
'register_enabled' => $this->getSetting('register_enabled', 'off'),
'hide_by_default' => $this->getSetting('hide_by_default', 'off'),
'copy_url_behavior' => $this->getSetting('copy_url_behavior', 'off'),
'quota_enabled' => $this->getSetting('quota_enabled', 'off'),
'default_user_quota' => humanFileSize($this->getSetting('default_user_quota', stringToBytes('1G')), 0, true),
'recaptcha_enabled' => $this->getSetting('recaptcha_enabled', 'off'),
'recaptcha_site_key' => $this->getSetting('recaptcha_site_key'),
'recaptcha_secret_key' => $this->getSetting('recaptcha_secret_key'),
'settings' => $settings,
]);
}
@ -77,13 +82,15 @@ class AdminController extends Controller
*/
public function getThemes(Response $response): Response
{
$apiJson = json_decode(file_get_contents('https://bootswatch.com/api/4.json'));
$themes = make(Theme::class)->availableThemes();
$out = [];
$out['Default - Bootstrap 4 default theme'] = 'https://bootswatch.com/_vendor/bootstrap/dist/css/bootstrap.min.css';
foreach ($apiJson->themes as $theme) {
$out["{$theme->name} - {$theme->description}"] = $theme->cssMin;
foreach ($themes as $vendor => $list) {
$out["-- {$vendor} --"] = null;
foreach ($list as $name => $url) {
$out[$name] = "{$vendor}|{$url}";
}
}
return json($response, $out);

View file

@ -0,0 +1,123 @@
<?php
namespace App\Controllers\Auth;
use App\Controllers\Controller;
use App\Web\Session;
use App\Web\ValidationHelper;
use Psr\Http\Message\ServerRequestInterface as Request;
abstract class AuthController extends Controller
{
protected function checkRecaptcha(ValidationHelper $validator, Request $request)
{
$validator->callIf($this->getSetting('recaptcha_enabled') === 'on', function (Session $session) use (&$request) {
$recaptcha = json_decode(file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$this->getSetting('recaptcha_secret_key').'&response='.param($request, 'recaptcha_token')));
if ($recaptcha->success && $recaptcha->score < 0.5) {
$session->alert(lang('recaptcha_failed'), 'danger');
return false;
}
return true;
});
return $validator;
}
/**
* Connects to LDAP server and logs in with service account (if configured)
* @return \LDAP\Connection|resource|false
*/
public function ldapConnect()
{
if (!extension_loaded('ldap')) {
$this->logger->error('The LDAP extension is not loaded.');
return false;
}
// Building LDAP URI
$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);
if ($server) {
ldap_set_option($server, LDAP_OPT_PROTOCOL_VERSION, 3);
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');
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->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;
if (is_string($serviceAccountFQDN)) {
if (ldap_bind($server, $serviceAccountFQDN, $this->config['ldap']['service_account_password']) === false) {
$this->logger->debug(ldap_error($server));
$this->logger->error("Bind with service account ($serviceAccountFQDN) failed.");
return false;
}
}
return $server;
}
/**
* Returns User's LDAP DN
* @param string $username
* @param \LDAP\Connection|resource $server LDAP Server Resource
* @return string|null
*/
protected function getLdapRdn(string $username, $server)
{
//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']);
$ldapAddributes = array('dn');
$this->logger->debug("LDAP Search filter: $searchFilter");
$ldapSearchResp = ldap_search(
$server,
$this->config['ldap']['base_domain'],
$searchFilter,
$ldapAddributes
);
if (!$ldapSearchResp) {
$this->logger->debug(ldap_error($server));
$this->logger->error("User LDAP search for user $username failed");
return null;
}
if (ldap_count_entries($server, $ldapSearchResp) !== 1) {
$this->logger->notice("LDAP search for $username not found or had multiple entries");
return null;
}
$ldapEntry = ldap_first_entry($server, $ldapSearchResp);
//Returns full DN
$bindString = ldap_get_dn($server, $ldapEntry);
} else {
// Static LDAP Binding
$bindString = ($this->config['ldap']['rdn_attribute'] ?? 'uid=').addslashes($username);
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'];
}
//returns partial DN
}
return $bindString;
}
}

View file

@ -2,13 +2,12 @@
namespace App\Controllers\Auth;
use App\Controllers\Controller;
use App\Database\Queries\UserQuery;
use App\Web\ValidationChecker;
use App\Database\Repositories\UserRepository;
use App\Web\ValidationHelper;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class LoginController extends Controller
class LoginController extends AuthController
{
/**
* @param Response $response
@ -41,46 +40,42 @@ class LoginController extends Controller
*/
public function login(Request $request, Response $response): Response
{
if ($this->getSetting('recaptcha_enabled') === 'on') {
$recaptcha = json_decode(file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$this->getSetting('recaptcha_secret_key').'&response='.param($request, 'recaptcha_token')));
/** @var ValidationHelper $validator */
$validator = make(ValidationHelper::class);
if ($recaptcha->success && $recaptcha->score < 0.5) {
$this->session->alert(lang('recaptcha_failed'), 'danger');
return redirect($response, route('login'));
}
}
$username = param($request, 'username');
$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->ldap ?? true)) {
$user = $this->ldapLogin($request, $username, param($request, 'password'), $user);
}
$validator = ValidationChecker::make()
->rules([
'login' => $user && password_verify(param($request, 'password'), $user->password),
'maintenance' => !isset($this->config['maintenance']) || !$this->config['maintenance'] || $user->is_admin ?? false,
'user_active' => $user->active ?? false,
])
->onFail(function ($rule) {
$alerts = [
'login' => lang('bad_login'),
'maintenance' => lang('maintenance_in_progress'),
'user_active' => lang('account_disabled'),
];
$this->session->alert($alerts[$rule], $rule === 'maintenance' ? 'info' : 'danger');
});
if ($validator->fails()) {
if ($this->checkRecaptcha($validator, $request)->fails()) {
return redirect($response, route('login'));
}
$this->session->set('logged', true);
$this->session->set('user_id', $user->id);
$this->session->set('username', $user->username);
$this->session->set('admin', $user->is_admin);
$this->session->set('copy_raw', $user->copy_raw);
$username = param($request, 'username');
$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)) {
$user = $this->ldapLogin($request, $username, param($request, 'password'), $user);
}
$validator
->alertIf(!$user || !password_verify($password, $user->password), 'bad_login')
->alertIf(isset($this->config['maintenance']) && $this->config['maintenance'] && !($user->is_admin ?? true), 'maintenance_in_progress', 'info')
->alertIf(!($user->active ?? false), 'account_disabled');
if ($validator->fails()) {
if (!empty($request->getHeaderLine('X-Forwarded-For'))) {
$ip = $request->getHeaderLine('X-Forwarded-For');
} else {
$ip = $request->getServerParams()['REMOTE_ADDR'] ?? null;
}
$this->logger->info("Login failed with username='{$username}', ip={$ip}.");
return redirect($response, route('login'));
}
$this->session->set('logged', true)
->set('user_id', $user->id)
->set('username', $user->username)
->set('admin', $user->is_admin)
->set('copy_raw', $user->copy_raw);
$this->setSessionQuotaInfo($user->current_disk_quota, $user->max_disk_quota);
$this->session->alert(lang('welcome', [$user->username]), 'info');
@ -110,7 +105,7 @@ class LoginController extends Controller
$this->session->alert(lang('goodbye'), 'warning');
if (!empty($request->getCookieParams()['remember'])) {
setcookie('remember', null);
setcookie('remember', null, 0, '', '', false, true);
}
return redirect($response, route('login.show'));
@ -121,60 +116,68 @@ class LoginController extends Controller
* @param string $username
* @param string $password
* @param $dbUser
* @return bool
* @return bool|null
* @throws \Slim\Exception\HttpNotFoundException
* @throws \Slim\Exception\HttpUnauthorizedException
*/
protected function ldapLogin(Request $request, string $username, string $password, $dbUser)
{
// Build LDAP connection
$server = $this->ldapConnect();
if (!$server) {
$this->session->alert(lang('ldap_cant_connect'), 'warning');
return $dbUser;
}
if (!@ldap_bind($server, $this->getLdapRdn($username), $password)) {
//Get LDAP user's (R)DN
$userDN=$this->getLdapRdn($username, $server);
if (!is_string($userDN)) {
return null;
}
//Bind as user to validate password
if (@ldap_bind($server, $userDN, $password)) {
$this->logger->debug("$userDN authenticated against LDAP sucessfully");
} else {
$this->logger->debug("$userDN authenticated against LDAP unsucessfully");
if ($dbUser && !$dbUser->ldap) {
return $dbUser;
}
return null;
}
if (!$dbUser) {
$email = $username;
if (!filter_var($username, FILTER_VALIDATE_EMAIL)) {
$search = ldap_search($server, $this->config['ldap']['base_domain'], 'uid='.addslashes($username), ['mail']);
if (@is_string($this->config['ldap']['search_filter'])) {
$search = ldap_read(
$server,
$userDN,
'objectClass=*',
array('mail',$this->config['ldap']['rdn_attribute'])
);
} else {
$search = ldap_search($server, $this->config['ldap']['base_domain'], ($this->config['ldap']['rdn_attribute'] ?? 'uid=').addslashes($username), ['mail']);
}
$entry = ldap_first_entry($server, $search);
$email = @ldap_get_values($server, $entry, 'mail')[0] ?? platform_mail($username.rand(0, 100)); // if the mail is not set, generate a placeholder
}
/** @var UserQuery $userQuery */
$userQuery = make(UserQuery::class);
/** @var UserRepository $userQuery */
$userQuery = make(UserRepository::class);
$userQuery->create($email, $username, $password, 0, 1, (int) $this->getSetting('default_user_quota', -1), null, 1);
return $userQuery->get($request, $this->database->getPdo()->lastInsertId());
}
if ($server) {
ldap_close($server);
}
if (!password_verify($password, $dbUser->password)) {
$userQuery = make(UserQuery::class);
$userQuery = make(UserRepository::class);
$userQuery->update($dbUser->id, $dbUser->email, $username, $password, $dbUser->is_admin, $dbUser->active, $dbUser->max_disk_quota, $dbUser->ldap);
return $userQuery->get($request, $dbUser->id);
}
return $dbUser;
}
/**
* @param string $username
* @return string
*/
private function getLdapRdn(string $username)
{
$bindString = 'uid='.addslashes($username);
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'];
}
return $bindString;
}
}

View file

@ -3,27 +3,26 @@
namespace App\Controllers\Auth;
use App\Controllers\Controller;
use App\Web\Mail;
use App\Web\ValidationChecker;
use App\Web\ValidationHelper;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Exception\HttpNotFoundException;
class PasswordRecoveryController extends Controller
class PasswordRecoveryController extends AuthController
{
/**
* @param Request $request
* @param Response $response
* @return Response
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
public function recover(Request $request, Response $response): Response
public function recover(Response $response): Response
{
return view()->render($response, 'auth/recover_mail.twig');
return view()->render($response, 'auth/recover_mail.twig', [
'recaptcha_site_key' => $this->getSetting('recaptcha_enabled') === 'on' ? $this->getSetting('recaptcha_site_key') : null,
]);
}
@ -39,6 +38,10 @@ class PasswordRecoveryController extends Controller
return redirect($response, route('home'));
}
if ($this->checkRecaptcha(make(ValidationHelper::class), $request)->fails()) {
return redirect($response, route('recover'));
}
$user = $this->database->query('SELECT `id`, `username` FROM `users` WHERE `email` = ? AND NOT `ldap` LIMIT 1', param($request, 'email'))->fetch();
if (!isset($user->id)) {
@ -60,6 +63,7 @@ class PasswordRecoveryController extends Controller
->message(lang('mail.recover_text', [
$user->username,
route('recover.password', ['resetToken' => $resetToken]),
route('recover.password', ['resetToken' => $resetToken]),
]))
->send();
@ -105,19 +109,10 @@ class PasswordRecoveryController extends Controller
throw new HttpNotFoundException($request);
}
$validator = ValidationChecker::make()
->rules([
'password.required' => !empty(param($request, 'password')),
'password.match' => param($request, 'password') === param($request, 'password_repeat'),
])
->onFail(function ($rule) {
$alerts = [
'password.required' => lang('password_required'),
'password.match' => lang('password_match'),
];
$this->session->alert($alerts[$rule], 'danger');
});
/** @var ValidationHelper $validator */
$validator = make(ValidationHelper::class)
->alertIf(empty(param($request, 'password')), 'password_required')
->alertIf(param($request, 'password') !== param($request, 'password_repeat'), 'password_match');
if ($validator->fails()) {
return redirect($response, route('recover.password', ['resetToken' => $resetToken]));

View file

@ -4,15 +4,15 @@
namespace App\Controllers\Auth;
use App\Controllers\Controller;
use App\Database\Queries\UserQuery;
use App\Database\Repositories\UserRepository;
use App\Web\Mail;
use App\Web\ValidationHelper;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Exception\HttpNotFoundException;
class RegisterController extends Controller
class RegisterController extends AuthController
{
/**
* @param Request $request
* @param Response $response
@ -54,16 +54,11 @@ class RegisterController extends Controller
throw new HttpNotFoundException($request);
}
if ($this->getSetting('recaptcha_enabled') === 'on') {
$recaptcha = json_decode(file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$this->getSetting('recaptcha_secret_key').'&response='.param($request, 'recaptcha_token')));
if ($recaptcha->success && $recaptcha->score < 0.5) {
$this->session->alert(lang('recaptcha_failed'), 'danger');
return redirect($response, route('register.show'));
}
if ($this->checkRecaptcha(make(ValidationHelper::class), $request)->fails()) {
return redirect($response, route('register.show'));
}
$validator = $this->getUserCreateValidator($request);
$validator = $this->getUserCreateValidator($request)->alertIf(empty(param($request, 'password')), 'password_required');
if ($validator->fails()) {
return redirect($response, route('register.show'));
@ -71,7 +66,7 @@ class RegisterController extends Controller
$activateToken = bin2hex(random_bytes(16));
make(UserQuery::class)->create(
make(UserRepository::class)->create(
param($request, 'email'),
param($request, 'username'),
param($request, 'password'),
@ -89,6 +84,8 @@ class RegisterController extends Controller
param($request, 'username'),
$this->config['app_name'],
$this->config['base_url'],
$this->config['base_url'],
route('activate', ['activateToken' => $activateToken]),
route('activate', ['activateToken' => $activateToken]),
]))
->send();

View file

@ -2,9 +2,12 @@
namespace App\Controllers;
use App\Database\Queries\UserQuery;
use App\Database\Repositories\UserRepository;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Exception\HttpNotFoundException;
use ZipStream\Option\Archive;
use ZipStream\ZipStream;
class ClientController extends Controller
{
@ -17,9 +20,9 @@ class ClientController extends Controller
*/
public function getShareXConfig(Request $request, Response $response, int $id): Response
{
$user = make(UserQuery::class)->get($request, $id, true);
$user = make(UserRepository::class)->get($request, $id, true);
if ($user->token === null || $user->token === '') {
if (!$user->token) {
$this->session->alert(lang('no_upload_token'), 'danger');
return redirect($response, $request->getHeaderLine('Referer'));
@ -27,22 +30,60 @@ class ClientController extends Controller
$json = [
'DestinationType' => 'ImageUploader, TextUploader, FileUploader',
'RequestURL' => route('upload'),
'FileFormName' => 'upload',
'Arguments' => [
'file' => '$filename$',
'text' => '$input$',
'RequestURL' => route('upload'),
'FileFormName' => 'upload',
'Arguments' => [
'file' => '$filename$',
'text' => '$input$',
'token' => $user->token,
],
'URL' => '$json:url$',
'URL' => '$json:url$',
'ThumbnailURL' => '$json:url$/raw',
'DeletionURL' => '$json:url$/delete/'.$user->token,
'DeletionURL' => '$json:url$/delete/'.$user->token,
];
return json($response, $json, 200, JSON_UNESCAPED_SLASHES | JSON_PRETTY_PRINT)
->withHeader('Content-Disposition', 'attachment;filename="'.$user->username.'-ShareX.sxcu"');
}
/**
* @param Request $request
* @param string|null $token
* @return Response
* @throws \ZipStream\Exception\FileNotFoundException
* @throws \ZipStream\Exception\FileNotReadableException
* @throws \ZipStream\Exception\OverflowException
* @throws HttpNotFoundException
*/
public function getScreenCloudConfig(Request $request, string $token): Response
{
$user = $this->database->query('SELECT * FROM `users` WHERE `token` = ? LIMIT 1', $token)->fetch();
if (!$user) {
throw new HttpNotFoundException($request);
}
$config = [
'token' => $token,
'host' => route('root'),
];
ob_end_clean();
$options = new Archive();
$options->setSendHttpHeaders(true);
$zip = new ZipStream($user->username.'-screencloud.zip', $options);
$zip->addFileFromPath('main.py', BASE_DIR.'resources/uploaders/screencloud/main.py');
$zip->addFileFromPath('icon.png', BASE_DIR.'static/images/favicon-32x32.png');
$zip->addFileFromPath('metadata.xml', BASE_DIR.'resources/uploaders/screencloud/metadata.xml');
$zip->addFileFromPath('settings.ui', BASE_DIR.'resources/uploaders/screencloud/settings.ui');
$zip->addFile('config.json', json_encode($config, JSON_UNESCAPED_SLASHES));
$zip->finish();
exit(0);
}
/**
* @param Request $request
* @param Response $response
@ -55,20 +96,52 @@ class ClientController extends Controller
*/
public function getBashScript(Request $request, Response $response, int $id): Response
{
$user = make(UserQuery::class)->get($request, $id, true);
$user = make(UserRepository::class)->get($request, $id, true);
if ($user->token === null || $user->token === '') {
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"'),
return view()->render(
$response->withHeader('Content-Disposition', 'attachment;filename="xbackbone_uploader_'.$user->username.'.sh"'),
'scripts/xbackbone_uploader.sh.twig',
[
'username' => $user->username,
'username' => $user->username,
'upload_url' => route('upload'),
'token' => $user->token,
'token' => $user->token,
]
);
}
/**
* @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

@ -3,10 +3,10 @@
namespace App\Controllers;
use App\Database\DB;
use App\Database\Queries\UserQuery;
use App\Database\Repositories\UserRepository;
use App\Web\Lang;
use App\Web\Session;
use App\Web\ValidationChecker;
use App\Web\ValidationHelper;
use App\Web\View;
use DI\Container;
use DI\DependencyException;
@ -71,15 +71,12 @@ abstract class Controller
$this->session->set('current_disk_quota', humanFileSize($current));
if ($this->getSetting('quota_enabled', 'off') === 'on') {
if ($max < 0) {
$this->session->set('max_disk_quota', '∞');
$this->session->set('percent_disk_quota', null);
$this->session->set('max_disk_quota', '∞')->set('percent_disk_quota', null);
} else {
$this->session->set('max_disk_quota', humanFileSize($max));
$this->session->set('percent_disk_quota', round(($current * 100) / $max));
$this->session->set('max_disk_quota', humanFileSize($max))->set('percent_disk_quota', round(($current * 100) / $max));
}
} else {
$this->session->set('max_disk_quota', null);
$this->session->set('percent_disk_quota', null);
$this->session->set('max_disk_quota', null)->set('percent_disk_quota', null);
}
}
@ -92,7 +89,7 @@ abstract class Controller
*/
protected function updateUserQuota(Request $request, $userId, $fileSize, $dec = false)
{
$user = make(UserQuery::class)->get($request, $userId);
$user = make(UserRepository::class)->get($request, $userId);
if ($dec) {
$tot = max($user->current_disk_quota - $fileSize, 0);
@ -131,61 +128,27 @@ abstract class Controller
// Workaround for php <= 7.3
if (PHP_VERSION_ID < 70300) {
setcookie('remember', "{$selector}:{$token}", $expire, '; SameSite=Lax', '', false, true);
setcookie('remember', "{$selector}:{$token}", $expire, '; SameSite=Strict', '', isSecure(), true);
} else {
setcookie('remember', "{$selector}:{$token}", [
'expires' => $expire,
'httponly' => true,
'samesite' => 'Lax',
'samesite' => 'Strict',
'secure' => isSecure(),
]);
}
}
/**
* @param Request $request
* @return ValidationChecker
* @return ValidationHelper
*/
public function getUserCreateValidator(Request $request)
{
return ValidationChecker::make()
->rules([
'email.required' => filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL) !== false,
'username.required' => !empty(param($request, 'username')),
'password.required' => !empty(param($request, 'password')),
'email.unique' => $this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ?', param($request, 'email'))->fetch()->count == 0,
'username.unique' => $this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `username` = ?', param($request, 'username'))->fetch()->count == 0,
])
->onFail(function ($rule) {
$alerts = [
'email.required' => lang('email_required'),
'username.required' => lang('username_required'),
'password.required' => lang('password_required'),
'email.unique' => lang('email_taken'),
'username.unique' => lang('username_taken'),
];
$this->session->alert($alerts[$rule], 'danger');
});
}
/**
* @return bool|false|resource
*/
public function ldapConnect()
{
if (!extension_loaded('ldap')) {
$this->logger->error('The LDAP extension is not loaded.');
return false;
}
$server = ldap_connect($this->config['ldap']['host'], $this->config['ldap']['port']);
if ($server) {
ldap_set_option($server, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($server, LDAP_OPT_REFERRALS, 0);
ldap_set_option($server, LDAP_OPT_NETWORK_TIMEOUT, 10);
}
return $server;
return make(ValidationHelper::class)
->alertIf(empty(param($request, 'username')), 'username_required')
->alertIf(!filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL), 'email_required')
->alertIf($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ?', param($request, 'email'))->fetch()->count != 0, 'email_taken')
->alertIf($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `username` = ?', param($request, 'username'))->fetch()->count != 0, 'username_taken');
}
}

View file

@ -2,8 +2,8 @@
namespace App\Controllers;
use App\Database\Queries\MediaQuery;
use App\Database\Queries\TagQuery;
use App\Database\Repositories\MediaRepository;
use App\Database\Repositories\TagRepository;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
@ -41,33 +41,35 @@ class DashboardController extends Controller
switch (param($request, 'sort', 'time')) {
case 'size':
$order = MediaQuery::ORDER_SIZE;
$order = MediaRepository::ORDER_SIZE;
break;
case 'name':
$order = MediaQuery::ORDER_NAME;
$order = MediaRepository::ORDER_NAME;
break;
default:
case 'time':
$order = MediaQuery::ORDER_TIME;
$order = MediaRepository::ORDER_TIME;
break;
}
/** @var MediaQuery $query */
$query = make(MediaQuery::class, ['isAdmin' => (bool) $this->session->get('admin', false)])
$isAdmin = (bool) $this->session->get('admin', false);
/** @var MediaRepository $query */
$query = make(MediaRepository::class, ['isAdmin' => $isAdmin])
->orderBy($order, param($request, 'order', 'DESC'))
->withUserId($this->session->get('user_id'))
->search(param($request, 'search', null))
->filterByTag(param($request, 'tag'))
->run($page);
$tags = make(TagQuery::class, [
'isAdmin' => (bool) $this->session->get('admin', false),
$tags = make(TagRepository::class, [
'isAdmin' => $isAdmin,
'userId' => $this->session->get('user_id')
])->all();
return view()->render(
$response,
($this->session->get('admin', false) && $this->session->get('gallery_view', true)) ? 'dashboard/list.twig' : 'dashboard/grid.twig',
($this->session->get('gallery_view', $isAdmin)) ? 'dashboard/list.twig' : 'dashboard/grid.twig',
[
'medias' => $query->getMedia(),
'next' => $page < floor($query->getPages()),
@ -86,7 +88,9 @@ class DashboardController extends Controller
*/
public function switchView(Response $response): Response
{
$this->session->set('gallery_view', !$this->session->get('gallery_view', true));
$isAdmin = (bool) $this->session->get('admin', false);
$this->session->set('gallery_view', !$this->session->get('gallery_view', $isAdmin));
return redirect($response, route('home'));
}

View file

@ -3,7 +3,7 @@
namespace App\Controllers;
use App\Database\Queries\UserQuery;
use App\Database\Repositories\UserRepository;
use League\Flysystem\FileNotFoundException;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
@ -21,11 +21,11 @@ class ExportController extends Controller
*/
public function downloadData(Request $request, Response $response, int $id): Response
{
$user = make(UserQuery::class)->get($request, $id, true);
$user = make(UserRepository::class)->get($request, $id, true);
$medias = $this->database->query('SELECT `uploads`.`filename`, `uploads`.`storage_path` FROM `uploads` WHERE `user_id` = ?', $user->id);
$this->logger->info("User $user->id, $user->name, exporting data...");
$this->logger->info("User $user->id, $user->username, exporting data...");
set_time_limit(0);
ob_end_clean();

View file

@ -2,8 +2,8 @@
namespace App\Controllers;
use App\Database\Queries\UserQuery;
use GuzzleHttp\Psr7\Stream;
use App\Database\Repositories\UserRepository;
use App\Web\UA;
use Intervention\Image\Constraint;
use Intervention\Image\ImageManagerStatic as Image;
use League\Flysystem\FileNotFoundException;
@ -13,6 +13,7 @@ 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
{
@ -31,22 +32,30 @@ class MediaController extends Controller
* @throws FileNotFoundException
*
*/
public function show(Request $request, Response $response, string $userCode, string $mediaCode, string $token = null): Response
{
$media = $this->getMedia($userCode, $mediaCode);
public function show(
Request $request,
Response $response,
string $userCode,
string $mediaCode,
string $token = null
): Response {
$media = $this->getMedia($userCode, $mediaCode, true);
if (!$media || (!$media->published && $this->session->get('user_id') !== $media->user_id && !$this->session->get('admin', false))) {
if (!$media || (!$media->published && $this->session->get('user_id') !== $media->user_id && !$this->session->get(
'admin',
false
))) {
throw new HttpNotFoundException($request);
}
$filesystem = $this->storage;
if (isBot($request->getHeaderLine('User-Agent'))) {
return $this->streamMedia($request, $response, $filesystem, $media);
}
$userAgent = $request->getHeaderLine('User-Agent');
$mime = $filesystem->getMimetype($media->storage_path);
try {
$media->mimetype = $filesystem->getMimetype($media->storage_path);
$media->mimetype = $mime;
$media->extension = pathinfo($media->filename, PATHINFO_EXTENSION);
$size = $filesystem->getSize($media->storage_path);
$type = explode('/', $media->mimetype)[0];
@ -55,7 +64,7 @@ class MediaController extends Controller
$media->mimetype = 'application/octet-stream';
}
if ($type === 'text') {
if ($size <= (200 * 1024)) { // less than 200 KB
if ($size <= (500 * 1024)) { // less than 500 KB
$media->text = $filesystem->read($media->storage_path);
} else {
$type = 'application';
@ -67,12 +76,28 @@ 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,
'type' => $type,
'url' => urlFor("/{$userCode}/{$mediaCode}"),
'copy_url_behavior' => $this->getSetting('copy_url_behavior', 'off'),
'url' => urlFor(glue($userCode, $mediaCode)),
'copy_raw' => $this->session->get('copy_raw', false),
]);
}
@ -110,11 +135,19 @@ class MediaController extends Controller
*
* @throws FileNotFoundException
*/
public function getRaw(Request $request, Response $response, string $userCode, string $mediaCode, ?string $ext = null): Response
{
$media = $this->getMedia($userCode, $mediaCode);
public function getRaw(
Request $request,
Response $response,
string $userCode,
string $mediaCode,
?string $ext = null
): Response {
$media = $this->getMedia($userCode, $mediaCode, false);
if (!$media || !$media->published && $this->session->get('user_id') !== $media->user_id && !$this->session->get('admin', false)) {
if (!$media || (!$media->published && $this->session->get('user_id') !== $media->user_id && !$this->session->get(
'admin',
false
))) {
throw new HttpNotFoundException($request);
}
@ -122,8 +155,7 @@ class MediaController extends Controller
throw new HttpBadRequestException($request);
}
// If contains html, return it as text/plain
if (strpos($this->storage->getMimetype($media->storage_path), 'text/htm') !== false) {
if (must_be_escaped($this->storage->getMimetype($media->storage_path))) {
$response = $this->streamMedia($request, $response, $this->storage, $media);
return $response->withHeader('Content-Type', 'text/plain');
}
@ -144,15 +176,55 @@ class MediaController extends Controller
*/
public function download(Request $request, Response $response, string $userCode, string $mediaCode): Response
{
$media = $this->getMedia($userCode, $mediaCode);
$media = $this->getMedia($userCode, $mediaCode, false);
if (!$media || !$media->published && $this->session->get('user_id') !== $media->user_id && !$this->session->get('admin', false)) {
if (!$media || (!$media->published && $this->session->get('user_id') !== $media->user_id && !$this->session->get(
'admin',
false
))) {
throw new HttpNotFoundException($request);
}
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
@ -167,14 +239,20 @@ class MediaController extends Controller
if ($this->session->get('admin')) {
$media = $this->database->query('SELECT * FROM `uploads` WHERE `id` = ? LIMIT 1', $id)->fetch();
} else {
$media = $this->database->query('SELECT * FROM `uploads` WHERE `id` = ? AND `user_id` = ? LIMIT 1', [$id, $this->session->get('user_id')])->fetch();
$media = $this->database->query(
'SELECT * FROM `uploads` WHERE `id` = ? AND `user_id` = ? LIMIT 1',
[$id, $this->session->get('user_id')]
)->fetch();
}
if (!$media) {
throw new HttpNotFoundException($request);
}
$this->database->query('UPDATE `uploads` SET `published`=? WHERE `id`=?', [$media->published ? 0 : 1, $media->id]);
$this->database->query(
'UPDATE `uploads` SET `published`=? WHERE `id`=?',
[$media->published ? 0 : 1, $media->id]
);
return $response;
}
@ -196,19 +274,18 @@ class MediaController extends Controller
throw new HttpNotFoundException($request);
}
if ($this->session->get('admin', false) || $media->user_id === $this->session->get('user_id')) {
$this->deleteMedia($request, $media->storage_path, $id, $media->user_id);
$this->logger->info('User '.$this->session->get('username').' deleted a media.', [$id]);
if ($media->user_id === $this->session->get('user_id')) {
$user = make(UserQuery::class)->get($request, $media->user_id, true);
$this->setSessionQuotaInfo($user->current_disk_quota, $user->max_disk_quota);
}
} else {
if (!$this->session->get('admin', false) && $media->user_id !== $this->session->get('user_id')) {
throw new HttpUnauthorizedException($request);
}
$this->deleteMedia($request, $media->storage_path, $id, $media->user_id);
$this->logger->info('User '.$this->session->get('username').' deleted a media.', [$id]);
if ($media->user_id === $this->session->get('user_id')) {
$user = make(UserRepository::class)->get($request, $media->user_id, true);
$this->setSessionQuotaInfo($user->current_disk_quota, $user->max_disk_quota);
}
if ($request->getMethod() === 'GET') {
return redirect($response, route('home'));
}
@ -228,9 +305,14 @@ class MediaController extends Controller
*
* @throws HttpNotFoundException
*/
public function deleteByToken(Request $request, Response $response, string $userCode, string $mediaCode, string $token): Response
{
$media = $this->getMedia($userCode, $mediaCode);
public function deleteByToken(
Request $request,
Response $response,
string $userCode,
string $mediaCode,
string $token
): Response {
$media = $this->getMedia($userCode, $mediaCode, false);
if (!$media) {
throw new HttpNotFoundException($request);
@ -279,6 +361,7 @@ class MediaController extends Controller
throw new HttpNotFoundException($request);
} finally {
$this->database->query('DELETE FROM `uploads` WHERE `id` = ?', $id);
$this->database->query('DELETE FROM `tags` WHERE `tags`.`id` NOT IN (SELECT `uploads_tags`.`tag_id` FROM `uploads_tags`)');
}
}
@ -286,16 +369,34 @@ class MediaController extends Controller
* @param $userCode
* @param $mediaCode
*
* @param bool $withTags
* @return mixed
*/
protected function getMedia($userCode, $mediaCode)
protected function getMedia($userCode, $mediaCode, $withTags = false)
{
$mediaCode = pathinfo($mediaCode)['filename'];
return $this->database->query('SELECT `uploads`.*, `users`.*, `users`.`id` AS `userId`, `uploads`.`id` AS `mediaId` FROM `uploads` INNER JOIN `users` ON `uploads`.`user_id` = `users`.`id` WHERE `user_code` = ? AND `uploads`.`code` = ? LIMIT 1', [
$userCode,
$mediaCode,
])->fetch();
$media = $this->database->query(
'SELECT `uploads`.*, `users`.*, `users`.`id` AS `userId`, `uploads`.`id` AS `mediaId` FROM `uploads` INNER JOIN `users` ON `uploads`.`user_id` = `users`.`id` WHERE `user_code` = ? AND `uploads`.`code` = ? LIMIT 1',
[
$userCode,
$mediaCode,
]
)->fetch();
if (!$withTags || !$media) {
return $media;
}
$media->tags = [];
foreach ($this->database->query(
'SELECT `tags`.`id`, `tags`.`name` FROM `uploads_tags` INNER JOIN `tags` ON `uploads_tags`.`tag_id` = `tags`.`id` WHERE `uploads_tags`.`upload_id` = ?',
$media->mediaId
) as $tag) {
$media->tags[$tag->id] = $tag->name;
}
return $media;
}
/**
@ -309,32 +410,54 @@ class MediaController extends Controller
* @throws FileNotFoundException
*
*/
protected function streamMedia(Request $request, Response $response, Filesystem $storage, $media, string $disposition = 'inline'): Response
{
protected function streamMedia(
Request $request,
Response $response,
Filesystem $storage,
$media,
string $disposition = 'inline'
): Response {
set_time_limit(0);
$this->session->close();
$mime = $storage->getMimetype($media->storage_path);
if (param($request, 'width') !== null && explode('/', $mime)[0] === 'image') {
return $this->makeThumbnail($storage, $media, param($request, 'width'), param($request, 'height'), $disposition);
} else {
$stream = new Stream($storage->readStream($media->storage_path));
if ((param($request, 'width') !== null || param($request, 'height') !== null) && explode(
'/',
$mime
)[0] === 'image') {
return $this->makeThumbnail(
$storage,
$media,
param($request, 'width'),
param($request, 'height'),
$disposition
);
}
if (!in_array(explode('/', $mime)[0], ['image', 'video', 'audio']) || $disposition === 'attachment') {
return $response->withHeader('Content-Type', $mime)
->withHeader('Content-Disposition', $disposition.'; filename="'.$media->filename.'"')
->withHeader('Content-Length', $stream->getSize())
->withBody($stream);
}
if (isset($request->getServerParams()['HTTP_RANGE'])) {
return $this->handlePartialRequest($response, $stream, $request->getServerParams()['HTTP_RANGE'], $disposition, $media, $mime);
}
$stream = new Stream($storage->readStream($media->storage_path));
if (!in_array(explode('/', $mime)[0], ['image', 'video', 'audio']) || $disposition === 'attachment') {
return $response->withHeader('Content-Type', $mime)
->withHeader('Content-Disposition', $disposition.'; filename="'.$media->filename.'"')
->withHeader('Content-Length', $stream->getSize())
->withHeader('Accept-Ranges', 'bytes')
->withBody($stream);
}
if (isset($request->getServerParams()['HTTP_RANGE'])) {
return $this->handlePartialRequest(
$response,
$stream,
$request->getServerParams()['HTTP_RANGE'],
$disposition,
$media,
$mime
);
}
return $response->withHeader('Content-Type', $mime)
->withHeader('Content-Length', $stream->getSize())
->withHeader('Accept-Ranges', 'bytes')
->withBody($stream);
}
/**
@ -348,15 +471,23 @@ class MediaController extends Controller
* @throws FileNotFoundException
*
*/
protected function makeThumbnail(Filesystem $storage, $media, $width = null, $height = null, string $disposition = 'inline')
{
protected function makeThumbnail(
Filesystem $storage,
$media,
$width = null,
$height = null,
string $disposition = 'inline'
) {
return Image::make($storage->readStream($media->storage_path))
->resize($width, $height, function (Constraint $constraint) {
$constraint->aspectRatio();
})
->resizeCanvas($width, $height, 'center')
->psrResponse('png')
->withHeader('Content-Disposition', $disposition.';filename="scaled-'.pathinfo($media->filename, PATHINFO_FILENAME).'.png"');
->withHeader(
'Content-Disposition',
$disposition.';filename="scaled-'.pathinfo($media->filename, PATHINFO_FILENAME).'.png"'
);
}
/**
@ -369,8 +500,14 @@ class MediaController extends Controller
*
* @return Response
*/
protected function handlePartialRequest(Response $response, Stream $stream, string $range, string $disposition, $media, $mime)
{
protected function handlePartialRequest(
Response $response,
Stream $stream,
string $range,
string $disposition,
$media,
$mime
) {
$end = $stream->getSize() - 1;
[, $range] = explode('=', $range, 2);
@ -392,7 +529,9 @@ class MediaController extends Controller
$end = (isset($range[1]) && is_numeric($range[1])) ? (int) $range[1] : $stream->getSize();
}
$end = ($end > $stream->getSize() - 1) ? $stream->getSize() - 1 : $end;
if ($end > $stream->getSize() - 1) {
$end = $stream->getSize() - 1;
}
$stream->seek($start);
header("Content-Type: $mime");
@ -403,15 +542,7 @@ class MediaController extends Controller
http_response_code(206);
ob_end_clean();
$buffer = 16348;
$readed = $start;
while ($readed < $end) {
if ($readed + $buffer > $end) {
$buffer = $end - $readed + 1;
}
echo $stream->read($buffer);
$readed += $buffer;
}
fpassthru($stream->detach());
exit(0);
}

View file

@ -3,8 +3,8 @@
namespace App\Controllers;
use App\Database\Queries\UserQuery;
use App\Web\ValidationChecker;
use App\Database\Repositories\UserRepository;
use App\Web\ValidationHelper;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
@ -21,11 +21,11 @@ class ProfileController extends Controller
*/
public function profile(Request $request, Response $response): Response
{
$user = make(UserQuery::class)->get($request, $this->session->get('user_id'), true);
$user = make(UserRepository::class)->get($request, $this->session->get('user_id'), true);
return view()->render($response, 'user/edit.twig', [
'profile' => true,
'user' => $user,
'user' => $user,
]);
}
@ -38,21 +38,12 @@ class ProfileController extends Controller
*/
public function profileEdit(Request $request, Response $response, int $id): Response
{
$user = make(UserQuery::class)->get($request, $id, true);
$user = make(UserRepository::class)->get($request, $id, true);
$validator = ValidationChecker::make()
->rules([
'email.required' => filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL),
'email.unique' => $this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ? AND `email` <> ?', [param($request, 'email'), $user->email])->fetch()->count == 0,
])
->onFail(function ($rule) {
$alerts = [
'email.required' => lang('email_required'),
'email.unique' => lang('email_taken'),
];
$this->session->alert($alerts[$rule], 'danger');
});
/** @var ValidationHelper $validator */
$validator = make(ValidationHelper::class)
->alertIf(!filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL), 'email_required')
->alertIf($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ? AND `email` <> ?', [param($request, 'email'), $user->email])->fetch()->count != 0, 'email_taken');
if ($validator->fails()) {
return redirect($response, route('profile'));
@ -75,8 +66,7 @@ class ProfileController extends Controller
]);
}
$this->session->set('copy_raw', param($request, 'copy_raw') !== null ? 1 : 0);
$this->session->alert(lang('profile_updated'), 'success');
$this->session->set('copy_raw', param($request, 'copy_raw') !== null ? 1 : 0)->alert(lang('profile_updated'), 'success');
$this->logger->info('User '.$this->session->get('username')." updated profile of $user->id.");
return redirect($response, route('profile'));

View file

@ -3,9 +3,12 @@
namespace App\Controllers;
use App\Database\Queries\UserQuery;
use App\Database\Repositories\UserRepository;
use App\Web\Theme;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Exception\HttpBadRequestException;
use Slim\Exception\HttpInternalServerErrorException;
class SettingController extends Controller
{
@ -14,6 +17,7 @@ class SettingController extends Controller
* @param Response $response
*
* @return Response
* @throws HttpInternalServerErrorException
*/
public function saveSettings(Request $request, Response $response): Response
{
@ -29,17 +33,19 @@ class SettingController extends Controller
// registrations
$this->updateSetting('register_enabled', param($request, 'register_enabled', 'off'));
$this->updateSetting('auto_tagging', param($request, 'auto_tagging', 'off'));
// quota
$this->updateSetting('quota_enabled', param($request, 'quota_enabled', 'off'));
$this->updateSetting('default_user_quota', stringToBytes(param($request, 'default_user_quota', '1G')));
$user = make(UserQuery::class)->get($request, $this->session->get('user_id'));
$user = make(UserRepository::class)->get($request, $this->session->get('user_id'));
$this->setSessionQuotaInfo($user->current_disk_quota, $user->max_disk_quota);
$this->updateSetting('custom_head', param($request, 'custom_head'));
$this->updateSetting('recaptcha_enabled', param($request, 'recaptcha_enabled', 'off'));
$this->updateSetting('recaptcha_site_key', param($request, 'recaptcha_site_key'));
$this->updateSetting('recaptcha_secret_key', param($request, 'recaptcha_secret_key'));
$this->updateSetting('image_embeds', param($request, 'image_embeds'));
$this->applyTheme($request);
$this->applyLang($request);
@ -62,25 +68,29 @@ class SettingController extends Controller
}
}
/**
* @param Request $request
* @throws HttpInternalServerErrorException
*/
public function applyTheme(Request $request)
{
if (param($request, 'css') !== null) {
if (!is_writable(BASE_DIR.'static/bootstrap/css/bootstrap.min.css')) {
$this->session->alert(lang('cannot_write_file'), 'danger');
} else {
file_put_contents(BASE_DIR.'static/bootstrap/css/bootstrap.min.css', file_get_contents(param($request, 'css')));
}
$css = param($request, 'css');
if ($css === null) {
return;
}
// if is default, remove setting
if (param($request, 'css') !== 'https://bootswatch.com/_vendor/bootstrap/dist/css/bootstrap.min.css') {
$this->updateSetting('css', param($request, 'css'));
} else {
$this->database->query('DELETE FROM `settings` WHERE `key` = \'css\'');
}
if (!is_writable(BASE_DIR.'static/bootstrap/css/bootstrap.min.css')) {
$this->session->alert(lang('cannot_write_file'), 'danger');
throw new HttpInternalServerErrorException($request);
}
make(Theme::class)->applyTheme($css);
// if is default, remove setting
if ($css !== Theme::default()) {
$this->updateSetting('css', $css);
} else {
$this->database->query('DELETE FROM `settings` WHERE `key` = \'css\'');
}
}
@ -91,9 +101,15 @@ class SettingController extends Controller
private function updateSetting($key, $value = null)
{
if (!$this->database->query('SELECT `value` FROM `settings` WHERE `key` = '.$this->database->getPdo()->quote($key))->fetch()) {
$this->database->query('INSERT INTO `settings`(`key`, `value`) VALUES ('.$this->database->getPdo()->quote($key).', ?)', $value);
$this->database->query(
'INSERT INTO `settings`(`key`, `value`) VALUES ('.$this->database->getPdo()->quote($key).', ?)',
$value
);
} else {
$this->database->query('UPDATE `settings` SET `value`=? WHERE `key` = '.$this->database->getPdo()->quote($key), $value);
$this->database->query(
'UPDATE `settings` SET `value`=? WHERE `key` = '.$this->database->getPdo()->quote($key),
$value
);
}
}
}

View file

@ -3,8 +3,8 @@
namespace App\Controllers;
use App\Database\Queries\TagQuery;
use App\Web\ValidationChecker;
use App\Database\Repositories\TagRepository;
use App\Web\ValidationHelper;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Exception\HttpBadRequestException;
@ -12,8 +12,6 @@ use Slim\Exception\HttpNotFoundException;
class TagController extends Controller
{
const PER_MEDIA_LIMIT = 10;
/**
* @param Request $request
* @param Response $response
@ -22,13 +20,13 @@ class TagController extends Controller
*/
public function addTag(Request $request, Response $response): Response
{
$validator = $this->validateTag($request);
$validator = $this->validateTag($request)->failIf(empty(param($request, 'tag')));
if ($validator->fails()) {
throw new HttpBadRequestException($request);
}
[$id, $limit] = make(TagQuery::class)->addTag(param($request, 'tag'), param($request, 'mediaId'));
[$id, $limit] = make(TagRepository::class)->addTag(param($request, 'tag'), param($request, 'mediaId'));
$this->logger->info("Tag added $id.");
@ -48,31 +46,34 @@ class TagController extends Controller
*/
public function removeTag(Request $request, Response $response): Response
{
$validator = $this->validateTag($request)->removeRule('tag.notEmpty');
$validator = $this->validateTag($request);
if ($validator->fails()) {
throw new HttpBadRequestException($request);
}
$result = make(TagQuery::class)->removeTag(param($request, 'tagId'), param($request, 'mediaId'));
$result = make(TagRepository::class)->removeTag(param($request, 'tagId'), param($request, 'mediaId'));
if (!$result) {
if ($result === null) {
throw new HttpNotFoundException($request);
}
$this->logger->info("Tag removed ".param($request, 'tagId').', from media '.param($request, 'mediaId'));
return $response;
return json($response, [
'deleted' => $result,
]);
}
/**
* @param Request $request
* @return ValidationHelper
*/
protected function validateTag(Request $request)
{
return ValidationChecker::make()
->rules([
'tag.notEmpty' => !empty(param($request, 'tag')),
'mediaId.notEmpty' => !empty(param($request, 'mediaId')),
'media.exists' => $this->database->query('SELECT COUNT(*) AS `count` FROM `uploads` WHERE `id` = ?', param($request, 'mediaId'))->fetch()->count > 0,
'sameUserOrAdmin' => $this->session->get('admin', false) || $this->database->query('SELECT * FROM `uploads` WHERE `id` = ? LIMIT 1', param($request, 'mediaId'))->fetch()->user_id === $this->session->get('user_id'),
]);
return make(ValidationHelper::class)
->failIf(empty(param($request, 'mediaId')))
->failIf($this->database->query('SELECT COUNT(*) AS `count` FROM `uploads` WHERE `id` = ?', param($request, 'mediaId'))->fetch()->count == 0)
->failIf(!$this->session->get('admin', false) && $this->database->query('SELECT `user_id` FROM `uploads` WHERE `id` = ? LIMIT 1', param($request, 'mediaId'))->fetch()->user_id != $this->session->get('user_id'));
}
}

View file

@ -2,24 +2,39 @@
namespace App\Controllers;
use App\Web\Session;
use Monolog\Logger;
use Parsedown;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use RuntimeException;
use ZipArchive;
use function glob_recursive;
use function redirect;
use function removeDirectory;
use function route;
use function urlFor;
class UpgradeController extends Controller
{
const GITHUB_SOURCE_API = 'https://api.github.com/repos/SergiX44/XBackBone/releases';
/**
* @param Response $response
* @param Response $response
*
* @param Logger $logger
* @param Session $session
* @return Response
*/
public function upgrade(Response $response): Response
public function upgrade(Response $response, Logger $logger, Session $session): Response
{
if (!extension_loaded('zip')) {
$session->alert(lang('zip_ext_not_loaded'), 'danger');
return redirect($response, route('system'));
}
if (!is_writable(BASE_DIR)) {
$this->session->alert(lang('path_not_writable', BASE_DIR), 'warning');
$session->alert(lang('path_not_writable', BASE_DIR), 'warning');
return redirect($response, route('system'));
}
@ -27,13 +42,13 @@ class UpgradeController extends Controller
try {
$json = $this->getApiJson();
} catch (RuntimeException $e) {
$this->session->alert($e->getMessage(), 'danger');
$session->alert($e->getMessage(), 'danger');
return redirect($response, route('system'));
}
if (version_compare($json[0]->tag_name, PLATFORM_VERSION, '<=')) {
$this->session->alert(lang('already_latest_version'), 'warning');
$session->alert(lang('already_latest_version'), 'warning');
return redirect($response, route('system'));
}
@ -41,17 +56,17 @@ class UpgradeController extends Controller
$tmpFile = sys_get_temp_dir().DIRECTORY_SEPARATOR.'xbackbone_update.zip';
if (file_put_contents($tmpFile, file_get_contents($json[0]->assets[0]->browser_download_url)) === false) {
$this->session->alert(lang('cannot_retrieve_file'), 'danger');
$session->alert(lang('cannot_retrieve_file'), 'danger');
return redirect($response, route('system'));
}
if (filesize($tmpFile) !== $json[0]->assets[0]->size) {
$this->session->alert(lang('file_size_no_match'), 'danger');
$session->alert(lang('file_size_no_match'), 'danger');
return redirect($response, route('system'));
}
$this->logger->info('System update started.');
$logger->info('System update started.');
$config = require BASE_DIR.'config.php';
$config['maintenance'] = true;
@ -83,29 +98,33 @@ class UpgradeController extends Controller
}
}
foreach ($currentFiles as $extraneous) {
unlink($extraneous);
}
$updateZip->close();
unlink($tmpFile);
$this->logger->info('System update completed.');
foreach ($currentFiles as $extraneous) {
if (is_dir($extraneous)) {
removeDirectory($extraneous);
} else {
unlink($extraneous);
}
}
$logger->info('System update completed.');
return redirect($response, urlFor('/install'));
}
/**
* @param Request $request
* @param Response $response
* @param Request $request
* @param Response $response
*
* @return Response
*/
public function checkForUpdates(Request $request, Response $response): Response
{
$jsonResponse = [
'status' => null,
'message' => null,
'status' => 'OK',
'message' => lang('already_latest_version'),
'upgrade' => false,
];
@ -114,17 +133,18 @@ class UpgradeController extends Controller
try {
$json = $this->getApiJson();
$jsonResponse['status'] = 'OK';
foreach ($json as $release) {
if (version_compare($release->tag_name, PLATFORM_VERSION, '>') && ($release->prerelease === $acceptPrerelease)) {
$jsonResponse['message'] = lang('new_version_available', $release->tag_name);
if (
$release->prerelease === $acceptPrerelease &&
version_compare($release->tag_name, PLATFORM_VERSION, '>') &&
version_compare($release->tag_name, '4.0.0', '<')
) {
$jsonResponse['message'] = lang('new_version_available', [$release->tag_name]);
$jsonResponse['upgrade'] = true;
break;
}
if (version_compare($release->tag_name, PLATFORM_VERSION, '<=')) {
$jsonResponse['message'] = lang('already_latest_version');
$jsonResponse['upgrade'] = false;
break;
}
}
@ -136,6 +156,21 @@ class UpgradeController extends Controller
return json($response, $jsonResponse);
}
/**
* @param Request $request
* @param Response $response
* @return Response
* @throws \Twig\Error\LoaderError
* @throws \Twig\Error\RuntimeError
* @throws \Twig\Error\SyntaxError
*/
public function changelog(Request $request, Response $response): Response
{
return view()->render($response, 'dashboard/changelog.twig', [
'content' => Parsedown::instance()->text(file_get_contents('CHANGELOG.md')),
]);
}
protected function getApiJson()
{
$opts = [

View file

@ -2,8 +2,8 @@
namespace App\Controllers;
use App\Database\Queries\TagQuery;
use App\Database\Queries\UserQuery;
use App\Database\Repositories\TagRepository;
use App\Database\Repositories\UserRepository;
use App\Exceptions\ValidationException;
use Exception;
use Psr\Http\Message\ResponseInterface as Response;
@ -45,7 +45,7 @@ class UploadController extends Controller
try {
$file = $this->validateFile($request, $response);
$user = make(UserQuery::class)->get($request, $this->session->get('user_id'));
$user = make(UserRepository::class)->get($request, $this->session->get('user_id'));
$this->validateUser($request, $response, $file, $user);
} catch (ValidationException $e) {
@ -123,7 +123,9 @@ class UploadController extends Controller
*/
protected function validateFile(Request $request, Response $response)
{
if ($request->getServerParams()['CONTENT_LENGTH'] > stringToBytes(ini_get('post_max_size'))) {
$iniValue = ini_get('post_max_size');
$maxPostSize = $iniValue === '0' ? INF : stringToBytes($iniValue);
if ($request->getServerParams()['CONTENT_LENGTH'] > $maxPostSize) {
$this->json['message'] = 'File too large (post_max_size too low?).';
throw new ValidationException(json($response, $this->json, 400));
@ -200,10 +202,13 @@ class UploadController extends Controller
]);
$mediaId = $this->database->getPdo()->lastInsertId();
$this->autoTag($mediaId, $storagePath);
if ($this->getSetting('auto_tagging') === 'on') {
$this->autoTag($mediaId, $storagePath);
}
$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]);
@ -221,11 +226,11 @@ class UploadController extends Controller
[$type, $subtype] = explode('/', $mime);
/** @var TagQuery $query */
$query = make(TagQuery::class);
/** @var TagRepository $query */
$query = make(TagRepository::class);
$query->addTag($type, $mediaId);
if ($type === 'application') {
if ($type === 'application' || $subtype === 'gif') {
$query->addTag($subtype, $mediaId);
}
}

View file

@ -2,9 +2,9 @@
namespace App\Controllers;
use App\Database\Queries\UserQuery;
use App\Database\Repositories\UserRepository;
use App\Web\Mail;
use App\Web\ValidationChecker;
use App\Web\ValidationHelper;
use League\Flysystem\FileNotFoundException;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
@ -31,7 +31,8 @@ class UserController extends Controller
$pages = $this->database->query('SELECT COUNT(*) AS `count` FROM `users`')->fetch()->count / self::PER_PAGE;
return view()->render($response,
return view()->render(
$response,
'user/index.twig',
[
'users' => $users,
@ -69,27 +70,27 @@ class UserController extends Controller
*/
public function store(Request $request, Response $response): Response
{
$validator = $this->getUserCreateValidator($request);
$hasPassword = $validator->removeRule('password.required');
$maxUserQuota = -1;
$validator = $this->getUserCreateValidator($request)
->callIf($this->getSetting('quota_enabled') === 'on', function ($session) use (&$maxUserQuota, &$request) {
$maxUserQuota = param($request, 'max_user_quota', humanFileSize($this->getSetting('default_user_quota'), 0, true));
if (!preg_match('/(^[0-9]+[B|K|M|G|T]$)|(^\-1$)/i', $maxUserQuota)) {
$session->alert(lang('invalid_quota', 'danger'));
return false;
}
if ($maxUserQuota !== '-1') {
$maxUserQuota = stringToBytes($maxUserQuota);
}
return true;
});
if ($validator->fails()) {
return redirect($response, route('user.create'));
}
$maxUserQuota = -1;
if ($this->getSetting('quota_enabled') === 'on') {
$maxUserQuotaStr = param($request, 'max_user_quota', humanFileSize($this->getSetting('default_user_quota', -1), 0, true));
if (!preg_match('/([0-9]+[K|M|G|T])|(\-1)/i', $maxUserQuotaStr)) {
$this->session->alert(lang('invalid_quota', 'danger'));
return redirect($response, route('user.create'));
}
if ($maxUserQuotaStr !== '-1') {
$maxUserQuota = stringToBytes($maxUserQuotaStr);
}
}
make(UserQuery::class)->create(
make(UserRepository::class)->create(
param($request, 'email'),
param($request, 'username'),
param($request, 'password'),
@ -102,7 +103,16 @@ class UserController extends Controller
);
if (param($request, 'send_notification') !== null) {
$this->sendCreateNotification($hasPassword, $request);
$resetToken = null;
if (empty(param($request, 'password'))) {
$resetToken = bin2hex(random_bytes(16));
$this->database->query('UPDATE `users` SET `reset_token`=? WHERE `id` = ?', [
$resetToken,
$this->database->getPdo()->lastInsertId(),
]);
}
$this->sendCreateNotification($request, $resetToken);
}
$this->session->alert(lang('user_created', [param($request, 'username')]), 'success');
@ -123,7 +133,7 @@ class UserController extends Controller
*/
public function edit(Request $request, Response $response, int $id): Response
{
$user = make(UserQuery::class)->get($request, $id);
$user = make(UserRepository::class)->get($request, $id);
return view()->render($response, 'user/edit.twig', [
'profile' => false,
@ -142,46 +152,35 @@ class UserController extends Controller
*/
public function update(Request $request, Response $response, int $id): Response
{
$user = make(UserQuery::class)->get($request, $id);
$user = make(UserRepository::class)->get($request, $id);
$user->max_disk_quota = -1;
$validator = ValidationChecker::make()
->rules([
'email.required' => filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL),
'username.required' => !empty(param($request, 'username')),
'email.unique' => $this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ? AND `email` <> ?', [param($request, 'email'), $user->email])->fetch()->count == 0,
'username.unique' => $this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `username` = ? AND `username` <> ?', [param($request, 'username'), $user->username])->fetch()->count == 0,
'demote' => !($user->id === $this->session->get('user_id') && param($request, 'is_admin') === null),
])
->onFail(function ($rule) {
$alerts = [
'email.required' => lang('email_required'),
'username.required' => lang('username_required'),
'email.unique' => lang('email_taken'),
'username.unique' => lang('username_taken'),
'demote' => lang('cannot_demote'),
];
/** @var ValidationHelper $validator */
$validator = make(ValidationHelper::class)
->alertIf(!filter_var(param($request, 'email'), FILTER_VALIDATE_EMAIL), 'email_required')
->alertIf(empty(param($request, 'username')), 'username_required')
->alertIf($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `email` = ? AND `email` <> ?', [param($request, 'email'), $user->email])->fetch()->count != 0, 'email_taken')
->alertIf($this->database->query('SELECT COUNT(*) AS `count` FROM `users` WHERE `username` = ? AND `username` <> ?', [param($request, 'username'), $user->username])->fetch()->count != 0, 'username_taken')
->alertIf($user->id === $this->session->get('user_id') && param($request, 'is_admin') === null, 'cannot_demote')
->callIf($this->getSetting('quota_enabled') === 'on', function ($session) use (&$user, &$request) {
$maxUserQuota = param($request, 'max_user_quota', humanFileSize($this->getSetting('default_user_quota'), 0, true));
if (!preg_match('/(^[0-9]+[B|K|M|G|T]$)|(^\-1$)/i', $maxUserQuota)) {
$session->alert(lang('invalid_quota', 'danger'));
return false;
}
$this->session->alert($alerts[$rule], 'danger');
if ($maxUserQuota !== '-1') {
$user->max_disk_quota = stringToBytes($maxUserQuota);
}
return true;
});
if ($validator->fails()) {
return redirect($response, route('user.edit', ['id' => $id]));
}
$user->max_disk_quota = -1;
if ($this->getSetting('quota_enabled') === 'on') {
$maxUserQuota = param($request, 'max_user_quota', humanFileSize($this->getSetting('default_user_quota'), 0, true));
if (!preg_match('/([0-9]+[K|M|G|T])|(\-1)/i', $maxUserQuota)) {
$this->session->alert(lang('invalid_quota', 'danger'));
return redirect($response, route('user.create'));
}
if ($maxUserQuota !== '-1') {
$user->max_disk_quota = stringToBytes($maxUserQuota);
}
}
make(UserQuery::class)->update(
make(UserRepository::class)->update(
$user->id,
param($request, 'email'),
param($request, 'username'),
@ -216,7 +215,7 @@ class UserController extends Controller
*/
public function delete(Request $request, Response $response, int $id): Response
{
$user = make(UserQuery::class)->get($request, $id);
$user = make(UserRepository::class)->get($request, $id);
if ($user->id === $this->session->get('user_id')) {
$this->session->alert(lang('cannot_delete'), 'danger');
@ -240,7 +239,7 @@ class UserController extends Controller
*/
public function clearUserMedia(Request $request, Response $response, int $id): Response
{
$user = make(UserQuery::class)->get($request, $id, true);
$user = make(UserRepository::class)->get($request, $id, true);
$medias = $this->database->query('SELECT * FROM `uploads` WHERE `user_id` = ?', $user->id);
@ -270,7 +269,7 @@ class UserController extends Controller
*/
public function refreshToken(Request $request, Response $response, int $id): Response
{
$query = make(UserQuery::class);
$query = make(UserRepository::class);
$user = $query->get($request, $id, true);
$this->logger->info('User '.$this->session->get('username')." refreshed token of user $user->id.");
@ -281,33 +280,29 @@ class UserController extends Controller
}
/**
* @param $hasPassword
* @param $request
* @throws \Exception
* @param null $resetToken
*/
private function sendCreateNotification($hasPassword, $request)
private function sendCreateNotification($request, $resetToken = null)
{
if ($hasPassword) {
if ($resetToken === null && !empty(param($request, 'password'))) {
$message = lang('mail.new_account_text_with_pw', [
param($request, 'username'),
$this->config['app_name'],
$this->config['base_url'],
$this->config['base_url'],
param($request, 'username'),
param($request, 'password'),
route('login.show'),
route('login.show'),
]);
} else {
$resetToken = bin2hex(random_bytes(16));
$this->database->query('UPDATE `users` SET `reset_token`=? WHERE `id` = ?', [
$resetToken,
$this->database->getPdo()->lastInsertId(),
]);
$message = lang('mail.new_account_text_with_reset', [
param($request, 'username'),
$this->config['app_name'],
$this->config['base_url'],
$this->config['base_url'],
route('recover.password', ['resetToken' => $resetToken]),
route('recover.password', ['resetToken' => $resetToken]),
]);
}

View file

@ -16,40 +16,26 @@ class Migrator
* @var string
*/
private $schemaPath;
/**
* @var bool
*/
private $firstMigrate;
/**
* Migrator constructor.
*
* @param DB $db
* @param string $schemaPath
* @param bool $firstMigrate
* @param DB $db
* @param string|null $schemaPath
*/
public function __construct(DB $db, ?string $schemaPath, bool $firstMigrate = false)
public function __construct(DB $db, ?string $schemaPath)
{
$this->db = $db;
$this->schemaPath = $schemaPath;
$this->firstMigrate = $firstMigrate;
}
public function migrate()
public function migrate(): void
{
try {
$this->db->query('SELECT 1 FROM `migrations` LIMIT 1');
} catch (PDOException $exception) {
$this->firstMigrate = true;
}
if ($this->firstMigrate) {
$this->db->getPdo()->exec(file_get_contents($this->schemaPath.DIRECTORY_SEPARATOR.'migrations.sql'));
}
$this->db->getPdo()->exec(file_get_contents($this->schemaPath.DIRECTORY_SEPARATOR.'migrations.sql'));
$files = glob($this->schemaPath.'/'.$this->db->getCurrentDriver().'/*.sql');
$names = array_map(function ($path) {
$names = array_map(static function ($path) {
return basename($path);
}, $files);
@ -65,11 +51,11 @@ class Migrator
if (basename($file) === $migration->name && $migration->migrated) {
$continue = true;
break;
} else {
if (basename($file) === $migration->name && !$migration->migrated) {
$exists = true;
break;
}
}
if (basename($file) === $migration->name && !$migration->migrated) {
$exists = true;
break;
}
}
if ($continue) {

View file

@ -1,20 +1,20 @@
<?php
namespace App\Database\Queries;
namespace App\Database\Repositories;
use App\Database\DB;
use League\Flysystem\FileNotFoundException;
use League\Flysystem\Filesystem;
use League\Flysystem\Plugin\ListWith;
class MediaQuery
class MediaRepository
{
const PER_PAGE = 21;
const PER_PAGE_ADMIN = 27;
public const PER_PAGE = 21;
public const PER_PAGE_ADMIN = 27;
const ORDER_TIME = 0;
const ORDER_NAME = 1;
const ORDER_SIZE = 2;
public const ORDER_TIME = 0;
public const ORDER_NAME = 1;
public const ORDER_SIZE = 2;
/** @var DB */
protected $db;
@ -62,7 +62,7 @@ class MediaQuery
* @param DB $db
* @param bool $isAdmin
* @param Filesystem $storage
* @return MediaQuery
* @return MediaRepository
*/
public static function make(DB $db, Filesystem $storage, bool $isAdmin)
{
@ -74,7 +74,7 @@ class MediaQuery
*
* @return $this
*/
public function withUserId($id)
public function withUserId($id): MediaRepository
{
$this->userId = $id;
@ -87,27 +87,31 @@ class MediaQuery
*
* @return $this
*/
public function orderBy(string $type = null, $mode = 'ASC')
public function orderBy(string $type = null, $mode = 'ASC'): MediaRepository
{
$this->orderBy = ($type === null) ? self::ORDER_TIME : $type;
$this->orderBy = $type ?? self::ORDER_TIME;
$this->orderMode = (strtoupper($mode) === 'ASC') ? 'ASC' : 'DESC';
return $this;
}
/**
* @param string $text
* @param string|null $text
*
* @return $this
*/
public function search(?string $text)
public function search(?string $text): MediaRepository
{
$this->text = $text;
return $this;
}
public function filterByTag($tagId)
/**
* @param $tagId
* @return $this
*/
public function filterByTag($tagId): MediaRepository
{
if ($tagId !== null) {
$this->tagId = (int) $tagId;
@ -117,7 +121,11 @@ class MediaQuery
}
public function run(int $page)
/**
* @param int $page
* @return $this
*/
public function run(int $page): MediaRepository
{
if ($this->orderBy == self::ORDER_SIZE) {
$this->runWithFileSort($page);
@ -128,7 +136,11 @@ class MediaQuery
return $this;
}
public function runWithDbSort(int $page)
/**
* @param int $page
* @return $this
*/
public function runWithDbSort(int $page): MediaRepository
{
$params = [];
if ($this->isAdmin) {
@ -170,7 +182,11 @@ class MediaQuery
return $this;
}
public function runWithFileSort(int $page)
/**
* @param int $page
* @return $this
*/
public function runWithFileSort(int $page): MediaRepository
{
$this->storage->addPlugin(new ListWith());
@ -192,26 +208,41 @@ class MediaQuery
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');
} else {
if ($this->tagId !== null) {
$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).')';
} elseif ($this->tagId !== null) {
if ($this->isAdmin) {
[, $queryPages] = $this->buildAdminQueries();
} else {
$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).'")';
[, $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).'")';
}
$medias = $this->db->query($queryMedia, $params)->fetchAll();
@ -239,7 +270,7 @@ class MediaQuery
}
}
$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);
@ -331,7 +362,7 @@ class MediaQuery
protected function getMediaIdsByTagId($tagId)
{
$mediaIds = $this->db->query('SELECT `upload_id` FROM `uploads_tags` WHERE `tag_id` = ?', $tagId)->fetchAll();
$ids = [];
$ids = [-1];
foreach ($mediaIds as $pivot) {
$ids[] = $pivot->upload_id;
}

View file

@ -1,14 +1,14 @@
<?php
namespace App\Database\Queries;
namespace App\Database\Repositories;
use App\Database\DB;
use PDO;
class TagQuery
class TagRepository
{
const PER_MEDIA_LIMIT = 10;
public const PER_MEDIA_LIMIT = 10;
/**
* @var DB
@ -39,7 +39,7 @@ class TagQuery
return $this->db->query('SELECT * FROM `tags` ORDER BY `name`')->fetchAll();
}
return $this->db->query('SELECT `tags`.* FROM `tags` INNER JOIN `uploads_tags` ON `tags`.`id` = `uploads_tags`.`tag_id` INNER JOIN `uploads` ON `uploads`.`id` = `uploads_tags`.`upload_id` WHERE `uploads`.`user_id` = ? ORDER BY `tags`.`name`', $this->userId)->fetchAll();
return $this->db->query('SELECT DISTINCT `tags`.* FROM `tags` INNER JOIN `uploads_tags` ON `tags`.`id` = `uploads_tags`.`tag_id` INNER JOIN `uploads` ON `uploads`.`id` = `uploads_tags`.`upload_id` WHERE `uploads`.`user_id` = ? ORDER BY `tags`.`name`', $this->userId)->fetchAll();
}
/**
@ -95,11 +95,12 @@ class TagQuery
if ($this->db->query('SELECT COUNT(*) AS `count` FROM `uploads_tags` WHERE `tag_id` = ?', $tag->id)->fetch()->count == 0) {
$this->db->query('DELETE FROM `tags` WHERE `id` = ? ', $tag->id);
return true;
}
return true;
return false;
}
return false;
return null;
}
}

View file

@ -1,15 +1,16 @@
<?php
namespace App\Database\Queries;
namespace App\Database\Repositories;
use App\Database\DB;
use App\Web\Session;
use InvalidArgumentException;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Exception\HttpNotFoundException;
use Slim\Exception\HttpUnauthorizedException;
class UserQuery
class UserRepository
{
/**
* @var DB
@ -34,7 +35,7 @@ class UserQuery
/**
* @param DB $db
* @param Session|null $session
* @return UserQuery
* @return UserRepository
*/
public static function make(DB $db, Session $session = null)
{
@ -59,7 +60,7 @@ class UserQuery
if ($authorize) {
if ($this->session === null) {
throw new \InvalidArgumentException('The session is null.');
throw new InvalidArgumentException('The session is null.');
}
if ($user->id !== $this->session->get('user_id') && !$this->session->get('admin', false)) {
@ -135,19 +136,19 @@ class UserQuery
$copyRaw,
$id,
]);
} else {
return $this->database->query('UPDATE `users` SET `email`=?, `username`=?, `is_admin`=?, `active`=?, `max_disk_quota`=?, `ldap`=?, `hide_uploads`=?, `copy_raw`=? WHERE `id` = ?', [
$email,
$username,
$isAdmin,
$isActive,
$maxUserQuota,
$ldap,
$hideUploads,
$copyRaw,
$id,
]);
}
return $this->database->query('UPDATE `users` SET `email`=?, `username`=?, `is_admin`=?, `active`=?, `max_disk_quota`=?, `ldap`=?, `hide_uploads`=?, `copy_raw`=? WHERE `id` = ?', [
$email,
$username,
$isAdmin,
$isActive,
$maxUserQuota,
$ldap,
$hideUploads,
$copyRaw,
$id,
]);
}
/**

View file

@ -1,8 +1,11 @@
<?php
namespace App\Exception\Handlers;
namespace App\Exceptions\Handlers;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Slim\Handlers\ErrorHandler;
use Throwable;
class AppErrorHandler extends ErrorHandler
{
@ -10,4 +13,15 @@ class AppErrorHandler extends ErrorHandler
{
resolve('logger')->error($error);
}
public function __invoke(ServerRequestInterface $request, Throwable $exception, bool $displayErrorDetails, bool $logErrors, bool $logErrorDetails): ResponseInterface
{
$response = parent::__invoke($request, $exception, $displayErrorDetails, $logErrors, $logErrorDetails);
if ($response->getStatusCode() !== 404) {
$this->writeToErrorLog();
}
return $response;
}
}

View file

@ -1,6 +1,6 @@
<?php
namespace App\Exception\Handlers\Renderers;
namespace App\Exceptions\Handlers\Renderers;
use App\Exceptions\UnderMaintenanceException;
use Slim\Exception\HttpBadRequestException;

View file

@ -14,7 +14,7 @@ class ValidationException extends Exception
*/
private $response;
public function __construct(Response $response, $message = "", $code = 0, Throwable $previous = null)
public function __construct(Response $response, $message = "", Throwable $previous = null)
{
parent::__construct($message, $response->getStatusCode(), $previous);
$this->response = $response;

View file

@ -42,6 +42,7 @@ class ViewFactory
$twig->addFunction(new TwigFunction('inPath', 'inPath'));
$twig->addFunction(new TwigFunction('humanFileSize', 'humanFileSize'));
$twig->addFunction(new TwigFunction('param', 'param'));
$twig->addFunction(new TwigFunction('glue', 'glue'));
return new View($twig);
}

View file

@ -2,7 +2,6 @@
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;
@ -16,7 +15,7 @@ class AdminMiddleware extends Middleware
*
* @throws HttpUnauthorizedException
*
* @return Response
* @return ResponseInterface
*/
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());
$this->session->set('redirectTo', (string) $request->getUri()->getPath());
return redirect(new Response(), route('login.show'));
return redirect((new ResponseFactory())->createResponse(), 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 Response(), route('login.show'));
return redirect((new ResponseFactory())->createResponse(), route('login.show'));
}
return $handler->handle($request);

View file

@ -20,19 +20,20 @@ class RememberMiddleware extends Middleware
if (!$this->session->get('logged', false) && !empty($request->getCookieParams()['remember'])) {
[$selector, $token] = explode(':', $request->getCookieParams()['remember']);
$user = $this->database->query('SELECT `id`, `email`, `username`,`is_admin`, `active`, `remember_token`, `current_disk_quota`, `max_disk_quota` FROM `users` WHERE `remember_selector` = ? AND `remember_expire` > ? LIMIT 1',
$user = $this->database->query(
'SELECT `id`, `username`,`is_admin`, `active`, `remember_token`, `current_disk_quota`, `max_disk_quota`, `copy_raw` FROM `users` WHERE `remember_selector` = ? AND `remember_expire` > ? LIMIT 1',
[$selector, date('Y-m-d\TH:i:s', time())]
)->fetch();
if ($user && password_verify($token, $user->remember_token) && $user->active) {
$this->session->set('logged', true);
$this->session->set('user_id', $user->id);
$this->session->set('username', $user->username);
$this->session->set('admin', $user->is_admin);
$this->session->set('logged', true)
->set('user_id', $user->id)
->set('username', $user->username)
->set('admin', $user->is_admin)
->set('copy_raw', $user->copy_raw);
$this->setSessionQuotaInfo($user->current_disk_quota, $user->max_disk_quota);
$this->refreshRememberCookie($user->id);
}
$this->refreshRememberCookie($user->id);
}
return $handler->handle($request);

View file

@ -144,7 +144,10 @@ class Lang
}
if (array_key_exists($key, $transDict)) {
return vsprintf($transDict[$key], $args);
$string = @vsprintf($transDict[$key], $args);
if ($string !== false) {
return $string;
}
}
if ($lang !== self::DEFAULT_LANG) {

View file

@ -7,6 +7,11 @@ use InvalidArgumentException;
class Mail
{
/**
* @var bool
*/
private static $testing = false;
protected $fromMail = 'no-reply@example.com';
protected $fromName;
@ -26,6 +31,14 @@ class Mail
return new self();
}
/**
* This will skip the email send
*/
public static function fake()
{
self::$testing = true;
}
/**
* @param $mail
* @param $name
@ -47,7 +60,7 @@ class Mail
if (!filter_var($mail, FILTER_VALIDATE_EMAIL)) {
throw new InvalidArgumentException('Mail not valid.');
}
$this->to = $mail;
$this->to = "<$mail>";
return $this;
}
@ -58,7 +71,7 @@ class Mail
*/
public function subject(string $text)
{
$this->subject = htmlentities($text);
$this->subject = $text;
return $this;
}
@ -68,7 +81,7 @@ class Mail
*/
public function message(string $text)
{
$this->message = htmlentities($text);
$this->message = $text;
return $this;
}
@ -92,6 +105,22 @@ class Mail
return $this;
}
/**
* Set headers before send
*/
protected function setHeaders()
{
if ($this->fromName === null) {
$this->addRequiredHeader("From: $this->fromMail");
} else {
$this->addRequiredHeader("From: $this->fromName <$this->fromMail>");
}
$this->addRequiredHeader('X-Mailer: PHP/'.phpversion())
->addRequiredHeader('MIME-Version: 1.0')
->addRequiredHeader('Content-Type: text/html; charset=utf-8');
}
/**
* @return int
*/
@ -109,18 +138,15 @@ class Mail
throw new InvalidArgumentException('Message cannot be null.');
}
if ($this->fromName === null) {
$this->addRequiredHeader("From: $this->fromMail");
} else {
$this->addRequiredHeader("From: $this->fromName <$this->fromMail>");
}
$this->addRequiredHeader('X-Mailer: PHP/'.phpversion());
$this->addRequiredHeader('MIME-Version: 1.0');
$this->addRequiredHeader('Content-Type: text/html; charset=iso-8859-1');
$this->setHeaders();
$this->headers .= $this->additionalHeaders;
$message = html_entity_decode($this->message);
return (int) mail($this->to, $this->subject, $this->message, $this->headers);
if (self::$testing) {
return 1;
}
return (int) mail($this->to, $this->subject, "<html><body>$message</body></html>", $this->headers);
}
}

View file

@ -9,8 +9,8 @@ class Session
/**
* Session constructor.
*
* @param string $name
* @param string $path
* @param string $name
* @param string $path
*
* @throws Exception
*/
@ -26,19 +26,20 @@ class Session
$params = session_get_cookie_params();
session_set_cookie_params(
$params['lifetime'],
$params['path'].'; SameSite=Lax',
$params['path'].'; SameSite=Strict',
$params['domain'],
$params['secure'],
isSecure(),
$params['httponly']
);
}
$started = @session_start([
'name' => $name,
'save_path' => $path,
'name' => $name,
'save_path' => $path,
'cookie_httponly' => true,
'gc_probability' => 25,
'cookie_samesite' => 'Lax', // works only for php >= 7.3
'gc_probability' => 25,
'cookie_samesite' => 'Strict', // works only for php >= 7.3
'cookie_secure' => isSecure(),
]);
if (!$started) {
@ -68,9 +69,10 @@ class Session
/**
* Clear all session stored values.
*/
public function clear(): void
public function clear(): Session
{
$_SESSION = [];
return $this;
}
/**
@ -99,7 +101,7 @@ class Session
* Returned a value given a key.
*
* @param $key
* @param null $default
* @param null $default
*
* @return mixed
*/
@ -113,21 +115,35 @@ class Session
*
* @param $key
* @param $value
* @return Session
*/
public function set($key, $value): void
public function set($key, $value): Session
{
$_SESSION[$key] = $value;
return $this;
}
/**
* Set a flash alert.
*
* @param $message
* @param string $type
* @param string $type
* @return Session
*/
public function alert($message, string $type = 'info'): void
public function alert($message, string $type = 'info'): Session
{
$_SESSION['_flash'][] = [$type => $message];
return $this;
}
/**
* Closes the current session
*
* @return bool|void
*/
public function close()
{
return session_write_close();
}
/**

67
app/Web/Theme.php Normal file
View file

@ -0,0 +1,67 @@
<?php
namespace App\Web;
class Theme
{
public const DEFAULT_THEME_URL = 'https://bootswatch.com/4/_vendor/bootstrap/dist/css/bootstrap.min.css';
/**
* @return array
*/
public function availableThemes(): array
{
$apiJson = json_decode(file_get_contents('https://bootswatch.com/api/4.json'));
$default = [];
$default['Default - Bootstrap 4 default theme'] = self::DEFAULT_THEME_URL;
$bootswatch = [];
foreach ($apiJson->themes as $theme) {
$bootswatch["{$theme->name} - {$theme->description}"] = $theme->cssMin;
}
$apiJson = json_decode(file_get_contents('https://theme-park.dev/themes.json'));
$base = $apiJson->applications->xbackbone->base_css;
$themepark = [];
foreach ($apiJson->themes as $name => $urls) {
$themepark[$name] = "{$base},{$urls->url}";
}
return [
'default' => $default,
'bootswatch.com' => $bootswatch,
'theme-park.dev' => $themepark
];
}
/**
* @param string $input
* @return bool
*/
public function applyTheme(string $input): bool
{
[$vendor, $css] = explode('|', $input, 2);
if ($vendor === 'theme-park.dev') {
[$base, $theme] = explode(',', $css);
$data = file_get_contents(self::DEFAULT_THEME_URL).file_get_contents($base).file_get_contents($theme);
} else {
$data = file_get_contents($css ?? self::DEFAULT_THEME_URL);
}
return (bool) file_put_contents(
BASE_DIR.'static/bootstrap/css/bootstrap.min.css',
$data
);
}
/**
* @return string
*/
public static function default(): string
{
return 'default|'.self::DEFAULT_THEME_URL;
}
}

55
app/Web/UA.php Normal file
View file

@ -0,0 +1,55 @@
<?php
namespace App\Web;
class UA
{
/**
* bot user agent => perform link embed
* @var string[]
*/
private static $bots = [
'TelegramBot' => false,
'facebookexternalhit/' => false,
'Facebot' => false,
'curl/' => false,
'wget/' => false,
'WhatsApp/' => false,
'Slack' => false,
'Twitterbot/' => false,
'discord' => 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,
];
/**
* @param string $userAgent
* @return bool
*/
public static function isBot(string $userAgent): bool
{
foreach (self::$bots as $bot => $embedsLink) {
if (stripos($userAgent, $bot) !== false) {
return true;
}
}
return false;
}
/**
* @param string $userAgent
* @return false|string
*/
public static function embedsLinks(string $userAgent)
{
foreach (self::$bots as $bot => $embedsLink) {
if (stripos($userAgent, $bot) !== false) {
return $embedsLink;
}
}
return false;
}
}

View file

@ -1,88 +0,0 @@
<?php
namespace App\Web;
class ValidationChecker
{
protected $rules = [];
protected $failClosure;
protected $lastRule;
/**
* @return ValidationChecker
*/
public static function make()
{
return new self();
}
/**
* @param array $rules
* @return $this
*/
public function rules(array $rules)
{
$this->rules = $rules;
return $this;
}
/**
* @param callable $closure
* @return $this
*/
public function onFail(callable $closure)
{
$this->failClosure = $closure;
return $this;
}
/**
* @return bool
*/
public function fails()
{
foreach ($this->rules as $rule => $condition) {
if (!$condition) {
$this->lastRule = $rule;
if (is_callable($this->failClosure)) {
($this->failClosure)($rule);
}
return true;
}
}
return false;
}
/**
* @param string $key
* @return ValidationChecker
*/
public function removeRule(string $key)
{
$this->rules[$key];
unset($this->rules[$key]);
return $this;
}
/**
* @param string $key
* @param $condition
* @return ValidationChecker
*/
public function addRule(string $key, $condition)
{
$this->rules[$key] = $condition;
return $this;
}
/**
* @return mixed
*/
public function getLastRule()
{
return $this->lastRule;
}
}

View file

@ -0,0 +1,66 @@
<?php
namespace App\Web;
class ValidationHelper
{
/**
* @var Session
*/
protected $session;
/**
* @var bool
*/
protected $failed;
/**
* Validator constructor.
* @param Session $session
*/
public function __construct(Session $session)
{
$this->session = $session;
$this->failed = false;
}
public function alertIf(bool $condition, string $alert, string $type = 'danger')
{
if (!$this->failed && $condition) {
$this->failed = true;
$this->session->alert(lang($alert), $type);
}
return $this;
}
public function failIf(bool $condition)
{
if (!$this->failed && $condition) {
$this->failed = true;
}
return $this;
}
public function callIf(bool $condition, callable $closure)
{
if (!$this->failed && $condition) {
do {
$result = $closure($this->session);
if (is_callable($result)) {
$closure = $result;
}
} while (!is_bool($result));
$this->failed = !$result;
}
return $this;
}
public function fails()
{
return $this->failed;
}
}

View file

@ -58,7 +58,7 @@ if (!function_exists('isDisplayableImage')) {
*
* @return bool
*/
function isDisplayableImage(string $mime): bool
function isDisplayableImage(?string $mime): bool
{
return in_array($mime, [
'image/apng',
@ -67,14 +67,36 @@ if (!function_exists('isDisplayableImage')) {
'image/x-icon',
'image/jpeg',
'image/png',
'image/svg',
'image/svg+xml',
'image/tiff',
'image/webp',
]);
}
}
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
@ -95,10 +117,13 @@ if (!function_exists('stringToBytes')) {
switch ($last) {
case 't':
$val *= 1024;
// no break
case 'g':
$val *= 1024;
// no break
case 'm':
$val *= 1024;
// no break
case 'k':
$val *= 1024;
}
@ -115,10 +140,7 @@ if (!function_exists('removeDirectory')) {
*/
function removeDirectory($path)
{
$files = glob($path.'/*');
foreach ($files as $file) {
is_dir($file) ? removeDirectory($file) : unlink($file);
}
cleanDirectory($path, true);
rmdir($path);
}
}
@ -128,13 +150,14 @@ if (!function_exists('cleanDirectory')) {
* Removes all directory contents.
*
* @param $path
* @param bool $all
*/
function cleanDirectory($path)
function cleanDirectory($path, $all = false)
{
$directoryIterator = new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS);
$iteratorIterator = new RecursiveIteratorIterator($directoryIterator, RecursiveIteratorIterator::CHILD_FIRST);
foreach ($iteratorIterator as $file) {
if ($file->getFilename() !== '.gitkeep') {
if ($all || $file->getFilename() !== '.gitkeep') {
$file->isDir() ? rmdir($file) : unlink($file);
}
}
@ -261,7 +284,7 @@ if (!function_exists('param')) {
* @param string $name
* @param null $default
*
* @return string
* @return mixed
*/
function param(Request $request, string $name, $default = null)
{
@ -271,11 +294,7 @@ if (!function_exists('param')) {
$params = $request->getParsedBody();
}
if (isset($params[$name])) {
return $params[$name];
}
return $default;
return $params[$name] ?? $default;
}
}
@ -313,37 +332,6 @@ if (!function_exists('lang')) {
}
}
if (!function_exists('isBot')) {
/**
* @param string $userAgent
*
* @return bool
*/
function isBot(string $userAgent)
{
$bots = [
'TelegramBot',
'facebookexternalhit/',
'Discordbot/',
'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.10; rv:38.0) Gecko/20100101 Firefox/38.0', // The discord service bot?
'Facebot',
'curl/',
'wget/',
'WhatsApp/',
'Slackbot',
'Slack-ImgProxy',
];
foreach ($bots as $bot) {
if (stripos($userAgent, $bot) !== false) {
return true;
}
}
return false;
}
}
if (!function_exists('mime2font')) {
/**
* Convert get the icon from the file mimetype.
@ -464,12 +452,19 @@ if (!function_exists('dsnFromConfig')) {
*
* @param array $config
*
* @param string $baseDir
* @return string
*/
function dsnFromConfig(array $config, $baseDir = BASE_DIR): string
function dsnFromConfig(array $config): string
{
$dsn = $config['db']['connection'] === 'sqlite' ? $baseDir.$config['db']['dsn'] : $config['db']['dsn'];
$dsn = $config['db']['dsn'];
if ($config['db']['connection'] === 'sqlite') {
if (getcwd() !== BASE_DIR) { // if in installer, change the working dir to the app dir
chdir(BASE_DIR);
}
if (file_exists($config['db']['dsn'])) {
$dsn = realpath($config['db']['dsn']);
}
}
return $config['db']['connection'].':'.$dsn;
}
@ -487,3 +482,49 @@ if (!function_exists('platform_mail')) {
return $mailbox.'@'.str_ireplace('www.', '', parse_url(resolve('config')['base_url'], PHP_URL_HOST));
}
}
if (!function_exists('must_be_escaped')) {
/**
* Return the system no-reply mail.
*
* @param $mime
* @return bool
*/
function must_be_escaped($mime): bool
{
$mimes = [
'text/htm',
'image/svg',
];
foreach ($mimes as $m) {
if (stripos($mime, $m) !== false) {
return true;
}
}
return false;
}
}
if (!function_exists('isSecure')) {
/**
* @return bool
*/
function isSecure(): bool
{
return (!empty($_SERVER['HTTPS']) && $_SERVER['HTTPS'] !== 'off')
|| (!empty($_SERVER['SERVER_PORT']) && $_SERVER['SERVER_PORT'] === 443);
}
}
if (!function_exists('glue')) {
/**
* @param mixed ...$pieces
* @return string
*/
function glue(...$pieces): string
{
return '/'.implode('/', $pieces);
}
}

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

@ -24,10 +24,9 @@ $app->group('', function (RouteCollectorProxy $group) {
$group->get('/home[/page/{page}]', [DashboardController::class, 'home'])->setName('home');
$group->get('/upload', [UploadController::class, 'uploadWebPage'])->setName('upload.web.show');
$group->post('/upload/web', [UploadController::class, 'uploadWeb'])->setName('upload.web');
$group->get('/home/switchView', [DashboardController::class, 'switchView'])->setName('switchView');
$group->group('', function (RouteCollectorProxy $group) {
$group->get('/home/switchView', [DashboardController::class, 'switchView'])->setName('switchView');
$group->get('/system/deleteOrphanFiles', [AdminController::class, 'deleteOrphanFiles'])->setName('system.deleteOrphanFiles');
$group->get('/system/recalculateUserQuota', [AdminController::class, 'recalculateUserQuota'])->setName('system.recalculateUserQuota');
@ -37,6 +36,7 @@ $app->group('', function (RouteCollectorProxy $group) {
$group->post('/system/upgrade', [UpgradeController::class, 'upgrade'])->setName('system.upgrade');
$group->get('/system/checkForUpdates', [UpgradeController::class, 'checkForUpdates'])->setName('system.checkForUpdates');
$group->get('/system/changelog', [UpgradeController::class, 'changelog'])->setName('system.changelog');
$group->get('/system', [AdminController::class, 'system'])->setName('system');
@ -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');
@ -83,6 +85,7 @@ $app->map(['GET', 'POST'], '/logout', [LoginController::class, 'logout'])->setNa
$app->post('/upload', [UploadController::class, 'uploadEndpoint'])->setName('upload');
$app->get('/user/{token}/config/screencloud', [ClientController::class, 'getScreenCloudConfig'])->setName('config.screencloud')->add(CheckForMaintenanceMiddleware::class);
$app->get('/{userCode}/{mediaCode}', [MediaController::class, 'show'])->setName('public');
$app->get('/{userCode}/{mediaCode}/delete/{token}', [MediaController::class, 'show'])->setName('public.delete.show')->add(CheckForMaintenanceMiddleware::class);
$app->post('/{userCode}/{mediaCode}/delete/{token}', [MediaController::class, 'deleteByToken'])->setName('public.delete')->add(CheckForMaintenanceMiddleware::class);

View file

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

View file

@ -1,33 +1,36 @@
#!/usr/bin/env php
<?php
(PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 1) ?: die('Sorry, PHP 7.1 or above is required to run XBackBone.');
if (php_sapi_name() !== 'cli') {
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.3 or above is required to run XBackBone.');
if (PHP_SAPI !== 'cli') {
die();
}
use App\Database\DB;
use App\Database\Migrator;
use DI\ContainerBuilder;
require __DIR__.'/../vendor/autoload.php';
define('BASE_DIR', realpath(__DIR__.'/../').DIRECTORY_SEPARATOR);
$config = include __DIR__.'/../config.php';
if (!$config) {
die('config.php not found. Please create a new one.');
}
chdir(__DIR__.'/../');
chdir(BASE_DIR);
$firstMigrate = false;
if ($config['db']['connection'] === 'sqlite' && !file_exists(__DIR__.'/../'.$config['db']['dsn'])) {
touch(__DIR__.'/../'.$config['db']['dsn']);
$firstMigrate = true;
}
$builder = new ContainerBuilder();
$builder->addDefinitions(BASE_DIR.'bootstrap/container.php');
$db = new DB(dsnFromConfig($config, getcwd().DIRECTORY_SEPARATOR), $config['db']['username'], $config['db']['password']);
$container = $builder->build();
$container->set('config', $config);
$migrator = new Migrator($db, 'resources/schemas', $firstMigrate);
$db = $container->get('database');
$migrator = new Migrator($db, 'resources/schemas');
$migrator->migrate();
$migrator->reSyncQuotas($container->get('storage'));
if (isset($argv[1]) && $argv[1] === '--install') {
$db->query("INSERT INTO `users` (`email`, `username`, `password`, `is_admin`, `user_code`) VALUES ('admin@example.com', 'admin', ?, 1, ?)", [password_hash('admin', PASSWORD_DEFAULT), humanRandomString(5)]);
@ -37,6 +40,6 @@ if (file_exists(__DIR__.'/../install') && (!isset($config['debug']) || !$config[
removeDirectory(__DIR__.'/../install');
}
echo 'If you are upgrading from a previous version, please run a "php bin\clean".'.PHP_EOL;
echo 'If you are upgrading from a previous version, please run a "php bin' . DIRECTORY_SEPARATOR . 'clean".'.PHP_EOL;
echo 'Done.'.PHP_EOL;
exit(0);
exit(0);

View file

@ -1,36 +0,0 @@
#!/usr/bin/env php
<?php
(PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 1) ?: die('Sorry, PHP 7.1 or above is required to run XBackBone.');
if (php_sapi_name() !== 'cli') {
die();
}
require __DIR__ . '/../vendor/autoload.php';
chdir(__DIR__ . '/../');
$json = json_decode(file_get_contents('https://bootswatch.com/api/4.json'));
if (!isset($argv[1])) {
echo 'Usage: php bin\\theme <theme-name|"default">' . PHP_EOL;
echo 'Here a list of available Bootswatch themes:' . PHP_EOL;
}
if (isset($argv[1]) && strtolower($argv[1]) === 'default') {
file_put_contents('static/bootstrap/css/bootstrap.min.css', file_get_contents('https://bootswatch.com/_vendor/bootstrap/dist/css/bootstrap.min.css'));
echo "Reverted to default theme." . PHP_EOL;
} else {
foreach ($json->themes as $theme) {
if (isset($argv[1]) && strtolower($argv[1]) === strtolower($theme->name)) {
file_put_contents('static/bootstrap/css/bootstrap.min.css', file_get_contents($theme->cssMin));
echo "Installed theme {$theme->name}." . PHP_EOL;
break;
}
if (!isset($argv[1])) {
echo " - {$theme->name} ({$theme->description})[Preview: {$theme->preview}]" . PHP_EOL;
}
}
}
exit(0);

View file

@ -1,39 +1,39 @@
<?php
use App\Exception\Handlers\AppErrorHandler;
use App\Exception\Handlers\Renderers\HtmlErrorRenderer;
use App\Exceptions\Handlers\AppErrorHandler;
use App\Exceptions\Handlers\Renderers\HtmlErrorRenderer;
use App\Factories\ViewFactory;
use App\Middleware\InjectMiddleware;
use App\Middleware\LangMiddleware;
use App\Middleware\RememberMiddleware;
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 Psr\Container\ContainerInterface as Container;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Http\Server\RequestHandlerInterface as RequestHandler;
use function DI\factory;
use function DI\get;
if (!file_exists('config.php') && is_dir('install/')) {
if (!file_exists(CONFIG_FILE) && is_dir(BASE_DIR.'install/')) {
header('Location: ./install/');
exit();
} else {
if (!file_exists('config.php') && !is_dir('install/')) {
exit('Cannot find the config file.');
}
}
if (!file_exists(CONFIG_FILE) && !is_dir(BASE_DIR.'install/')) {
exit('Cannot find the config file.');
}
// Load the config
$config = array_replace_recursive([
'app_name' => 'XBackBone',
'base_url' => isset($_SERVER['HTTPS']) ? 'https://'.$_SERVER['HTTP_HOST'] : 'http://'.$_SERVER['HTTP_HOST'],
'base_url' => isSecure() ? 'https://'.$_SERVER['HTTP_HOST'] : 'http://'.$_SERVER['HTTP_HOST'],
'debug' => false,
'maintenance' => false,
'db' => [
'connection' => 'sqlite',
'dsn' => BASE_DIR.'resources/database/xbackbone.db',
'dsn' => BASE_DIR.implode(DIRECTORY_SEPARATOR, ['resources', 'database', 'xbackbone.db']),
'username' => null,
'password' => null,
],
@ -48,7 +48,7 @@ $config = array_replace_recursive([
'base_domain' => null,
'user_domain' => null,
],
], require BASE_DIR.'config.php');
], require CONFIG_FILE);
$builder = new ContainerBuilder();
@ -58,6 +58,10 @@ if (!$config['debug']) {
}
$builder->addDefinitions([
Session::class => factory(function () {
return new Session('xbackbone_session', BASE_DIR.'resources/sessions');
}),
'session' => get(Session::class),
View::class => factory(function (Container $container) {
return ViewFactory::createAppInstance($container);
}),
@ -66,6 +70,7 @@ $builder->addDefinitions([
$builder->addDefinitions(__DIR__.'/container.php');
global $app;
$app = Bridge::create($builder->build());
$app->getContainer()->set('config', $config);
$app->setBasePath(parse_url($config['base_url'], PHP_URL_PATH) ?: '');
@ -107,7 +112,7 @@ $errorHandler = new AppErrorHandler($app->getCallableResolver(), $app->getRespon
$errorHandler->registerErrorRenderer('text/html', HtmlErrorRenderer::class);
// Add Error Middleware
$errorMiddleware = $app->addErrorMiddleware($config['debug'], true, true);
$errorMiddleware = $app->addErrorMiddleware($config['debug'], false, true);
$errorMiddleware->setDefaultErrorHandler($errorHandler);
// Load the application routes

View file

@ -2,14 +2,17 @@
use App\Database\DB;
use App\Web\Lang;
use App\Web\Session;
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;
use League\Flysystem\Adapter\Ftp as FtpAdapter;
use League\Flysystem\Adapter\Local;
use League\Flysystem\AwsS3v3\AwsS3Adapter;
use League\Flysystem\AzureBlobStorage\AzureBlobStorageAdapter;
use MicrosoftAzure\Storage\Blob\BlobRestProxy;
use League\Flysystem\Filesystem;
use Monolog\Formatter\LineFormatter;
use Monolog\Handler\RotatingFileHandler;
@ -36,11 +39,6 @@ return [
}),
'logger' => get(Logger::class),
Session::class => factory(function () {
return new Session('xbackbone_session', BASE_DIR.'resources/sessions');
}),
'session' => get(Session::class),
DB::class => factory(function (Container $container) {
$config = $container->get('config');
@ -50,45 +48,61 @@ return [
Filesystem::class => factory(function (Container $container) {
$config = $container->get('config');
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'],
'version' => 'latest',
]);
$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],
]);
return new Filesystem(new AwsS3Adapter($client, $config['storage']['bucket'], $config['storage']['path']));
case 'dropbox':
$client = new DropboxClient($config['storage']['token']);
$adapter = new AwsS3Adapter($client, $config['storage']['bucket'], $config['storage']['path']);
} elseif ($driver === 'dropbox') {
$client = new DropboxClient($config['storage']['token']);
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 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 GoogleStorageAdapter($client, $client->bucket($config['storage']['bucket'])));
default:
throw new InvalidArgumentException('The driver specified is not supported.');
$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']
)
);
$adapter = new AzureBlobStorageAdapter($client, $config['storage']['container_name']);
} else {
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,33 +1,39 @@
{
"name": "sergix44/xbackbone",
"version": "3.1",
"license": "AGPL-3.0-only",
"version": "3.7.0",
"description": "A lightweight ShareX PHP backend",
"type": "project",
"require": {
"php": ">=7.1",
"php": ">=7.3",
"ext-filter": "*",
"ext-gd": "*",
"ext-intl": "*",
"ext-json": "*",
"ext-pdo": "*",
"ext-zip": "*",
"guzzlehttp/psr7": "^1.6",
"http-interop/http-factory-guzzle": "^1.0",
"intervention/image": "^2.4",
"league/flysystem": "^1.0.45",
"erusev/parsedown": "^1.7",
"intervention/image": "^2.6",
"league/flysystem": "^1.1.4",
"league/flysystem-aws-s3-v3": "^1.0",
"league/flysystem-cached-adapter": "^1.1",
"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",
"twig/twig": "^2.12",
"ext-ldap": "*"
"twig/twig": "^2.14"
},
"config": {
"optimize-autoloader": true,
"preferred-install": "dist",
"sort-packages": true
"sort-packages": true,
"platform": {
"php": "7.3.33"
}
},
"autoload": {
"files": [
@ -37,14 +43,17 @@
"App\\": "app/"
}
},
"extra": {
"violinist": {
"allow_updates_beyond_constraint": 1,
"blacklist": [],
"update_with_dependencies": 1
"autoload-dev": {
"psr-4": {
"Tests\\": "tests/"
}
},
"minimum-stability": "dev",
"prefer-stable": true,
"require-dev": {
"phpstan/phpstan": "^0.11.5"
"roave/security-advisories": "dev-latest",
"phpstan/phpstan": "^0.11.5",
"phpunit/phpunit": "^9.0",
"symfony/dom-crawler": "^4.4"
}
}

5328
composer.lock generated

File diff suppressed because it is too large Load diff

View file

@ -4,12 +4,12 @@ return [
'base_url' => 'https://localhost', // no trailing slash
'db' => [
'connection' => 'sqlite',
'dsn' => 'resources/database/xbackbone.db',
'dsn' => realpath(__DIR__).'/resources/database/xbackbone.db',
'username' => null,
'password' => null,
],
'storage' => [
'driver' => 'local',
'path' => './storage',
'path' => realpath(__DIR__).'/storage',
],
];

1
docs/CNAME Normal file
View file

@ -0,0 +1 @@
xbackbone.app

View file

@ -2,6 +2,7 @@ remote_theme: pmarsceill/just-the-docs
logo: "img/xbackbone.png"
title: "XBackBone"
aux_links:
"XBackBone on GitHub":
"Star me on GitHub":
- "//github.com/SergiX44/XBackBone"
footer_content: "Copyright &copy; 2020 Sergio Brighenti. Distributed by an <a href=\"https://github.com/SergiX44/XBackBone/blob/master/LICENSE\">AGPL v3.0 license.</a>"
footer_content: "Copyright &copy; 2020 Sergio Brighenti. Distributed under <a href=\"https://github.com/SergiX44/XBackBone/blob/master/LICENSE\">AGPL v3.0 license.</a>"
ga_tracking: UA-55470316-7

View file

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

1
docs/ads.txt Normal file
View file

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

View file

@ -1,195 +1,451 @@
---
layout: default
title: Changelog
nav_order: 8
nav_order: 9
---
# Changelog
## v.3.1 (WIP)
+ Added tagging system (add, delete, search of tagged files).
+ Added basic media auto-tagging on upload.
+ Added registration system.
+ Added password recovery system.
+ Added ability to export all media of an account.
+ Added ability to choose between default and raw url on copy.
+ Added hide by default option.
+ Added user disk quota.
+ Added reCAPTCHA login protection.
+ Added bulk delete.
+ Added account clean function.
+ Added user disk quota system.
+ Added notification option on account create.
+ Added LDAP authentication.
+ Fixed bug html files raws are rendered in a browser.
+ The theme is now re-applied after every system update.
+ Updated system settings page.
+ Updated translations.
+ Improved grid layout.
+ Fixes and improvements.
## [3.7.0] - 2024-01-14
### Added
- Added support for vanity urls.
- Added KDE integration for linux script.
## v.3.0.2
+ Fixed error with migrate command.
+ Updated translations.
### Changed
- Updated translations.
- File preview is now clickable to open the file.
## v.3.0.1
+ Fixed error with older mysql versions.
+ Fixed config is compiled with the di container.
+ Small installer update.
### Fixed
- Fixes for LDAP authentication.
## v.3.0
+ Upgraded from Slim3 to Slim 4.
+ Added web upload.
+ Added ability to add custom HTML in \<head\> tag.
+ Added ability to show a preview of PDF files.
+ Added remember me functionality.
+ Added delete button on the preview page if the user is logged in.
+ New project icon (by [@SerenaItalia](https://www.deviantart.com/serenaitalia)).
+ Raw URL now accept file extensions.
+ The linux script can be used on headless systems.
+ Improved installer.
+ Improved thumbnail generation.
+ Replaced videojs player with Plyr.
+ Implemented SameSite XSS protection.
+ Small fixes and improvements.
## [3.6.3] - 2023-05-27
### Fixed
- Fix LDAP for php >= 8.1
## v.2.6.6
+ Ability to choose between releases and prereleases with the web updater.
+ Updated translations.
## [3.6.2] - 2023-05-24
### Changed
- Support for PHP 8.2
## v2.6.5
+ Fixed error after orphaned files removal #74.
+ Fixed update password not correctly removed from log files #74.
+ Changed color to some buttons to address visibility with some themes.
### Removed
- Azure blob storage driver
## v2.6.4
+ Filter on displayable images.
+ Fixed during upload error on php compiled for 32 bit.
+ Fixed icons on the installer page.
+ The generated random strings are now more human readable.
## [3.6.1] - 2022-11-27
### Changed
- Upgraded dependencies
- Updated translations
## v2.6.3
+ Fixed #67.
+ Fixed bad preload statement.
+ Fixed wrong redirect after install in subdirs.
### Fixed
- Fixed error in export data (#499)
- Fixed issues with reverse proxies (#495)
- Fixed duplicated twitter tags (#496)
## v2.6.2
+ Use the font awesome web font for better performances.
+ Changed background default color.
+ Added method for cache busting when updating/change theme.
+ Added russian translation from [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
## [3.6.0] - 2022-06-20
### Changed
- Improved embedding on discord of large videos.
- Releases are now compressed for faster downloads
- Updated translations
## v2.6.1
+ Fixed bad redirects on the web installer (#62).
+ Fixed login page with dark themes.
+ Improved shell commands.
+ Added alert if required extensions are not loaded.
+ Updated translations.
### Fixed
- Fixed deprecation notices on php >= 8
- Fixed embed UA for Discord.
- Fixed error with post_max_size = 0
## v2.6
+ Added support to use AWS S3, Google Cloud Storage, Dropbox and FTP(s) accounts as storage location.
+ Fixed missing icon.
+ Added german and norwegian translations from [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
+ Improved lang detection.
+ Added ability to force system language.
### Removed
- Support for php 7.2
## v2.5.3
+ Fixed bad css loading on Firefox (#35).
+ Fixed wrong style for publish/unpublish button.
+ Improved exception stacktrace logging.
## [3.5.1] - 2021-10-22
### Changed
- Fixed embed UA for Discord.
- Updated translations.
## v2.5.2
+ Improved session handling.
+ Fixed telegram share not working.
+ Fix for big text file now are not rendered in the browser.
+ Added preloading for some resources to improve performances.
+ Added check for block execution on EOL and unsupported PHP versions.
+ Other minor improvements.
## [3.5.0] - 2021-09-05
### Added
- Support for theme-park.dev themes.
- Updated translations.
## v2.5.1
+ Fixed bad redirect if the theme folder is not writable. (#27)
+ Improved HTTP partial content implementation for large files.
### Fixed
- Wrong css when reapplying the default theme.
## v2.5
+ Updated project license to <a href="https://choosealicense.com/licenses/agpl-3.0/">AGPL v3.0</a> (now releases ships with the new license).
+ **[BETA]** Added self update feature.
+ Added partial content implementation (stream seeking on chromium based browsers).
+ Improved video.js alignment with large videos.
+ Optimized output zip release size.
+ Templates cleanup and optimizations.
+ Improved error handling.
+ Added project favicon.
### Removed
- Dropped theme cli command.
## v2.4.1
+ Fixed error message when the file is too large. (#15)
+ Fixed button alignment.
## v2.4
+ Added function to remove orphaned files.
+ Switch between tab and gallery mode using an admin account.
+ Multiple uploads sorting methods.
+ Search in uploads.
+ Internal refactoring and improvements
+ Updated js dependencies.
## [3.4.1] - 2021-08-11
### Added
- Toggle to disable embeds.
## v2.3.1
+ Fixed en lang.
+ Fixed forced background with dark themes.
+ Added checks during the installation wizard.
+ cURL and Wget can now directly download the file.
### Changed
- Raw url copying now contains also the file extension.
## v2.3
+ Improved image scaling in user gallery.
+ Added overlay on user gallery images.
+ Fixed IT translation.
+ Fontawesome icon match the single file mime-type.
+ Enable audio player with video.js.
+ Video and audio now starts with volume at 50%.
+ Added linux script to allow uploads from linux screenshot tools.
+ Minor layout fixes.
## [3.4.0] - 2021-08-01
### Added
- Added image support for OG for Discord only.
## v2.2
+ Added multi-language support.
+ Improved routing.
+ Fixed HTTP/2 push is resetting the current session.
+ Minor improvements and bug fixes.
### Changed
- Updated translations.
- Dropped support for PHP 7.1
## v2.1
+ Improved theme style.
+ Improved page redirecting.
+ Allow e-mail login.
+ Support for ShareX deletion URL.
+ Fixed HTTP/2 push preload.
+ Added video.js support.
### Fixed
- Fixed possible XSS and CSRF attacks.
## v2.0
+ Migrated from Flight to Slim 3 framework.
+ Added install wizard (using the CLI is no longer required).
+ Allow discord bot to display the preview.
+ Theme switcher on the web UI.
+ Added used space indicator per user.
+ MySQL support.
+ Improvements under the hood.
## [3.3.5] - 2021-04-25
### Fixed
- Removed OG integration for discord.
## v1.3
+ Added command to switch between bootswatch.com themes.
+ Added popever to write the telegram message when sharing.
+ Packaging improvements.
+ Updated some dependencies.
+ Allow Facebook bots to display the preview.
### Changed
- Updated translations.
## v1.2
+ Previews are now scaled for better page load.
+ Added auto config generator for ShareX.
+ Show upload file size on the dashboard.
+ Fixed insert for admin user (running `php bin\migrate --install`).
+ Removed HTTP2 push from the dashboard to improve loading time.
## [3.3.4] - 2021-03-07
### Added
- Login failed logging.
- User identifier option for LDAP configurations.
## v1.1
+ Added logging.
+ Fixed back to top when click delete or publish/unpublish.
+ Improved migrate system.
+ Login redirect back to the requested page.
+ Updated Bootstrap theme.
+ Added share to Telegram.
### Fixed
- Fixed open graph meta tags for Discord.
- Fixed custom html tags are not displayed back in the admin setting.
- Fixed python plugin for newer version of Screencloud.
- Fixed accented chars in email subject.
- Fixed error on PHP 8.
## v1.0
+ Initial version.
## [3.3.3] - 2020-11-13
### Fixed
- Fixed issue with responsive menu on mobile.
## [3.3.2] - 2020-11-12
### Fixed
- Fixed switch not works for the first time for normal users.
## [3.3.1] - 2020-11-12
### Fixed
- Formatting error on the check for updates.
- Fixed default view for normal users.
## [3.3.0] - 2020-11-12
### Added
- Enabled PHP 8 support.
- Added Screencloud client support (https://screencloud.net).
- OpenGraph image tag (issue #269).
- Start adding unit tests.
### Changed
- The list mode is now available also for non-admin accounts (issue #226).
### Fixed
- Linux script strange response code in headless mode.
### Removed
- Dropped Telegram share button.
## [3.2.0] - 2020-09-05
### Added
- Added support to use Azure Blob Storage account as storage location.
- Support for other S3-compatible storage endpoint.
- Line number when showing text files.
### Fixed
- S3 driver file streaming not working properly.
- Fixed Slack image preview.
## [3.1.4] - 2020-04-13
### Changed
- Now the migrate command resync the system quota for each user.
### Fixed
- Fixed error with the migrate command.
## [3.1.3] - 2020-04-13
### Changed
- Added changelog page.
- Updated translations.
## [3.1.2] - 2020-04-12
### Changed
- Improved installer storage checks.
### Fixed
- Fixed upload table lost when updating very old instances.
## [3.1.1] - 2020-04-11
### Fixed
- Fixed error during a fresh installation with sqlite.
## [3.1] - 2020-04-10
### Added
- Added tagging system (add, delete, search of tagged files).
- Added basic media auto-tagging on upload.
- Added registration system.
- Added password recovery system.
- Added ability to export all media of an account.
- Added ability to choose between default and raw url on copy.
- Added hide by default option.
- Added user disk quota.
- Added reCAPTCHA login protection.
- Added bulk delete.
- Added account clean function.
- Added user disk quota system.
- Added notification option on account create.
- Added LDAP authentication.
### Changed
- The theme is now re-applied after every system update.
- Updated system settings page.
- Updated translations.
- Improved grid layout.
### Fixed
- Fixed bug html files raws are rendered in a browser.
- Fixes and improvements.
## [3.0.2] - 2019-12-04
### Changed
- Updated translations.
### Fixed
- Fixed error with migrate command.
## [3.0.1] - 2019-11-25
### Changed
- Small installer update.
### Fixed
- Fixed error with older mysql versions.
- Fixed config is compiled with the di container.
## [3.0] - 2019-11-23
### Added
- Added web upload.
- Added ability to add custom HTML in \<head\> tag.
- Added ability to show a preview of PDF files.
- Added remember me functionality.
- Added delete button on the preview page if the user is logged in.
- New project icon (by [@SerenaItalia](https://www.deviantart.com/serenaitalia)).
- The linux script can be used on headless systems.
- Raw URL now accept file extensions.
- Implemented SameSite XSS protection.
### Changed
- Upgraded from Slim3 to Slim 4.
- Replaced videojs player with Plyr.
- Improved installer.
- Improved thumbnail generation.
- Small fixes and improvements.
## [2.6.6] - 2019-10-23
### Added
- Ability to choose between releases and prereleases with the web updater.
### Changed
- Updated translations.
## [2.6.5] - 2019-09-17
### Changed
- Changed color to some buttons to address visibility with some themes.
### Fixed
- Fixed error after orphaned files removal #74.
- Fixed update password not correctly removed from log files (#74).
## [2.6.4] - 2019-09-15
### Added
- Filter on displayable images.
### Changed
- The generated random strings are now more human readable.
### Fixed
- Fixed during upload error on php compiled for 32 bit.
- Fixed icons on the installer page.
## [2.6.3] - 2019-09-14
### Fixed
- Fixed #67.
- Fixed bad preload statement.
- Fixed wrong redirect after install in subdirs.
## [2.6.2] - 2019-09-06
### Added
- Added method for cache busting when updating/change theme.
- Added russian translation from [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
### Changed
- Changed background default color.
- Use the Font Awesome web font for better performances.
## [2.6.1] - 2019-09-04
### Added
- Added alert if required extensions are not loaded.
### Changed
- Improved shell commands.
- Updated translations.
### Fixed
- Fixed bad redirects on the web installer (#62).
- Fixed login page with dark themes.
## [2.6] - 2019-08-20
### Added
- Added support to use AWS S3, Google Cloud Storage, Dropbox and FTP(s) accounts as storage location.
- Added german and norwegian translations from [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
- Added ability to force system language.
### Changed
- Improved lang detection.
### Fixed
- Fixed missing icon.
## [2.5.3] - 2019-05-12
### Changed
- Improved exception stacktrace logging.
### Fixed
- Fixed bad css loading on Firefox (#35).
- Fixed wrong style for publish/unpublish button.
## [2.5.2] - 2019-05-09
### Added
- Added preloading for some resources to improve performances.
- Added check for block execution on EOL and unsupported PHP versions.
### Changed
- Improved session handling.
- Other minor improvements.
### Fixed
- Fixed telegram share not working.
- Fix for big text file now are not rendered in the browser.
## [2.5.1] - 2019-04-10
### Changed
- Improved HTTP partial content implementation for large files.
### Fixed
- Fixed bad redirect if the theme folder is not writable. (#27)
## [2.5] - 2019-02-10
### Added
- Added partial content implementation (stream seeking on chromium based browsers).
- **[BETA]** Added self update feature.
- Added project favicon.
### Changed
- Updated project license to [AGPL v3.0](https://choosealicense.com/licenses/agpl-3.0/) (now releases ships with the new license).
- Improved video.js alignment with large videos.
- Optimized output zip release size.
- Templates cleanup and optimizations.
- Improved error handling.
## [2.4.1] - 2019-01-24
### Fixed
- Fixed error message when the file is too large. (#15)
- Fixed button alignment.
## [2.4] - 2019-01-22
### Added
- Added function to remove orphaned files.
- Multiple uploads sorting methods.
- Switch between tab and gallery mode using an admin account.
- Search in uploads.
### Changed
- Updated js dependencies.
- Internal refactoring and improvements
## [2.3.1] - 2018-12-09
### Added
- Added checks during the installation wizard.
- cURL and Wget can now directly download the file.
### Fixed
- Fixed english language.
- Fixed forced background with dark themes.
## [2.3] - 2018-11-30
### Added
- Added overlay on user gallery images.
- Added linux script to allow uploads from linux screenshot tools.
- Enable audio player with video.js.
- Font Awesome icon match the single file mime-type.
### Changed
- Improved image scaling in user gallery.
- Video and audio now starts with volume at 50%.
- Minor layout fixes.
### Fixed
- Fixed IT translation.
## [2.2] - 2018-11-20
### Added
- Added multi-language support.
### Fixed
- Improved routing.
- Minor improvements and bug fixes.
- Fixed HTTP/2 push is resetting the current session.
## [2.1] - 2018-11-20
### Added
- Added video.js support.
- Allow e-mail login.
- Support for ShareX deletion URL.
### Changed
- Improved theme style.
- Improved page redirecting.
### Fixed
- Fixed HTTP/2 push preload.
## [2.0] - 2018-11-13
### Added
- Added install wizard (using the CLI is no longer required).
- Added used space indicator per user.
- Allow discord bot to display the preview.
- Theme switcher on the web UI.
- MySQL support.
### Changed
- Migrated from Flight to Slim 3 framework.
- Improvements under the hood.
## [1.3] - 2018-10-14
### Added
- Added command to switch between bootswatch.com themes.
- Added popover to write the telegram message when sharing.
- Allow Facebook bots to display the preview.
### Changed
- Packaging improvements.
- Updated some dependencies.
## [1.2] - 2018-05-01
### Added
- Added auto config generator for ShareX.
- Show upload file size on the dashboard.
### Changed
- Previews are now scaled for better page load.
### Removed
- Removed HTTP2 push from the dashboard to improve loading time.
### Fixed
- Fixed insert for admin user (running `php bin\migrate --install`).
## [1.1] - 2018-04-28
### Added
- Added logging.
- Added share to Telegram.
### Changed
- Improved migrate system.
- Updated Bootstrap theme.
### Fixed
- Fixed back to top when click delete or publish/unpublish.
- Login redirect back to the requested page.
## [1.0] - 2018-04-28
### Added
- Initial version.

View file

@ -1,16 +1,39 @@
---
layout: default
title: Clients
title: Client Configuration
nav_order: 5
---
# Clients Configuration
## ShareX Configuration
## ShareX (Windows)
Once you are logged in, just go in your profile settings and download the ShareX config file for your account.
## Linux/Mac Support
Since ShareX does not support Linux, XBackBone can generate a script that allows you to share an item from any tool:
## Screencloud (Windows, Mac and Linux)
Once you are logged in, go in your profile account and click on the Screencloud button.
Now open Screencloud, open "Preferences" > "Online Services" tab > click "More Services" > and "Install from URL"
and paste the URL copied from XBackBone, and all should work out-of-the-box.
If for whatever reason you need to change the instance url or the token, just edit the settings of the XBackBone plugin.
## MagicCap (Mac and Linux)
MagicCap supports the same file format used by ShareX.
Just download the ShareX config file from your profile, and then on MagicCap open the Preferences > Uploader settings and choose ShareX.
Set the path to the file you have downloaded, and you are good to go!
## uPic (Mac)
This tool does not support plugins or custom configuration, but you can configure it manually:
In preferences, you should add "Custom" host and configure it as follows:
- **API URL:** Your instance upload url, like `http://example.com/upload`
- **Request method:** POST
- **File field:** file
- **URL Path:** ["url"]
- In "Other fields", in the body section, you should add the field `token`, with your upload token.
- In "Other fields", in the headers section, you should add the field `Content-Type`, with the value `application/x-www-form-urlencoded`.
## Bash Script (Linux, Mac, WSL)
XBackBone can generate a script that allows you to share an item from any tool, even headless servers:
+ Login into your account
+ Navigate to your profile and download the Linux script for your account.
+ Place the script where you want (ex. in your user home: `/home/<username>`).
@ -22,4 +45,4 @@ You can use this feature in combination with tools like [Flameshot](https://gith
The script requires `xclip`, `curl`, and `notify-send` on a desktop distribution.
*Note: XXX is the username of your XBackBone account.*
*Note: XXX is the username of your XBackBone account.*

View file

@ -7,10 +7,14 @@ nav_order: 7
# Common Issues
### Error 404 after installation
If you have apache, check if it's reading the file `.htaccess` and the `mod_rewrite` is enabled.
If you have Apache web server, check if it's reading the file `.htaccess` and the module `mod_rewrite` is enabled.
<hr>
### [Discord, Telegram, ...] is not showing the image/video preview of the link.
If you have Cloudflare enabled, check if it's blocking bots. If this function is enabled the Discord bot, Telebot, etc that fetch the preview will be blocked.
If you use Cloudflare, check if the setting that blocks access to bots is active. If enabled, the bots of the respective platforms will not be able to access to download the preview.
### How to increase the max file size?
Increase the post_max_size and upload_max_filesize in your php.ini
<hr>
### How to increase the upload max file size?
Increase the `post_max_size` and `upload_max_filesize` in your `php.ini`.

View file

@ -38,7 +38,7 @@ return array(
'username' => 'xbackbone', // null, if sqlite
'password' => 's3cr3t', // null, if sqlite
),
)
);
```
## LDAP Authentication
@ -46,6 +46,7 @@ return array(
Since the release 3.1, the LDAP integration can be configured.
Edit the `config.php`, and add the following lines:
This configuration requires anonymous LDAP access
```php
return array(
...
@ -55,10 +56,52 @@ return array(
'port' => 389, // ldap port
'base_domain' => 'dc=example,dc=com', // the base_dn string
'user_domain' => 'ou=Users', // the user dn string
)
'rdn_attribute' => 'uid=', // the attribute to identify the user
),
);
```
The following configuration snippet enables authenticated LDAP user lookups
```php
return array(
...
'ldap' => array(
'enabled' => true, // enable it
'schema' => 'ldap', // use 'ldap' or 'ldaps' Default is 'ldap'
'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
'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',
),
);
```
Enabling LDAP over TLS. Make sure to update port number. Merge with your current LDAP configuration.
```php
return array(
...
'ldap' => array(
'schema' => 'ldaps', //defaults to 'ldap'
'port' => 636,
),
);
```
Enabling StartTLS upgrade. Merge with your current LDAP configuration.
```php
return array(
...
'ldap' => array(
...
'useStartTLS' => true, //defaults to false
),
);
```
The 'schema' => 'ldaps' and 'useStartTLS'=> true configuration directives are mutually exclusive. Do no use them together.
By activating this function, it will not be possible for users logging in via LDAP to reset the password from the application (for obvious reasons), and it will also be possible to bring existing users under LDAP authentication.
@ -73,7 +116,7 @@ return array(
'storage' => array (
'driver' => 'local',
'path' => '/path/to/storage/folder',
)
),
);
```
@ -88,7 +131,22 @@ return array(
'region' => 'the-region',
'bucket' => 'bucket-name',
'path' => 'optional/path/prefix',
)
),
);
```
For any filesystem S3-compatible, it's possible to specify an `endpoint` (for i.e. Minio)
```php
return array(
...
'storage' => array (
'driver' => 's3',
'endpoint' => 'my-custom-endpoint',
'key' => 'the-key',
'secret' => 'the-secret',
'region' => 'the-region',
'bucket' => 'bucket-name',
'path' => 'optional/path/prefix',
),
);
```
@ -99,7 +157,7 @@ return array(
'storage' => array (
'driver' => 'dropbox',
'token' => 'the-token',
)
),
);
```
@ -116,7 +174,7 @@ return array(
'path' => 'the/prefix/path/',
'passive' => true/false,
'ssl' => true/false,
)
),
);
```
@ -125,11 +183,11 @@ return array(
return array(
...
'storage' => array (
'driver' => 'google-client',
'driver' => 'google-cloud',
'project_id' => 'the-project-id',
'key_path' => 'the-key-path',
'bucket' => 'bucket-name',
)
),
);
```
@ -153,4 +211,4 @@ return array(
'app_name' => 'This line will overwrite "XBackBone"',
...
);
```
```

BIN
docs/favicon.ico Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

View file

@ -4,23 +4,24 @@ title: Home
nav_order: 1
---
<p align="center">
<p class="text-center">
<img src="img/xbackbone.png" width="400px">
</p>
XBackBone is a simple and lightweight PHP file manager that support the instant sharing tool ShareX and *NIX systems. It supports uploading and displaying images, GIF, video, code, formatted text, pdf, and file downloading and uploading. Also have a web UI with multi user management, media gallery and search support.
{: .fs-5 .fw-300 }
[Download](https://github.com/SergiX44/XBackBone/releases/latest){: .btn .btn-green }
[GitHub](https://github.com/SergiX44/XBackBone){: .btn .btn-blue }
<p class="text-center">
<a href="https://github.com/SergiX44/XBackBone/releases/latest" class="btn btn-green">Download</a>
<a href="https://github.com/SergiX44/XBackBone" class="btn btn-blue">GitHub</a>
<a href="sponsor.html" class="btn btn-purple" style="background-color: #e7af06; background-image: linear-gradient(#f7d12e, #e7af06);">Sponsor</a>
</p>
## Main Features
+ Supports every upload type from ShareX.
+ Config generator for ShareX.
+ Multiple clients supported: ShareX, Screencloud, uPic, ...
+ Config generator for ShareX, Screencloud.
+ Low memory footprint.
+ Multiple backends support: Local storage, AWS S3, Google Cloud, Dropbox, FTP(s).
+ Multiple backends support: Local storage, AWS S3, Google Cloud, Azure Blob Storage, Dropbox, FTP(s).
+ Web file upload.
+ Code uploads syntax highlighting.
+ Video and audio uploads webplayer.
@ -44,13 +45,13 @@ XBackBone is a simple and lightweight PHP file manager that support the instant
+ Tag uploads with custom tags for categorization.
+ ... and more.
### Demo GIF
![img](https://i.imgur.com/iV8Rirn.gif)
## Translations
You can help translating the project on [Weblate](https://hosted.weblate.org/projects/xbackbone/xbackbone/).
<a href="https://hosted.weblate.org/engage/xbackbone/?utm_source=widget">
<img src="https://hosted.weblate.org/widgets/xbackbone/-/xbackbone/multi-auto.svg" alt="Stato traduzione" />
</a>
#### Demo GIF
![img](https://i.imgur.com/iV8Rirn.gif)
</a>

View file

@ -7,13 +7,14 @@ nav_order: 2
# Installation
### Prerequisites
XBackBone require PHP >= `7.1`, with installed the required extensions:
XBackBone require PHP >= `7.3`, with installed the required extensions:
+ `php-sqlite3` for SQLite.
+ `php-mysql` for MariaDB/MySQL.
+ `php-gd` image manipualtion library.
+ `php-json` json file support.
+ `php-intl` internationalization functions.
+ `php-fileinfo` file related functions.
+ `php-zip` compressed files related functions.
+ (optional) `php-ftp` to use the FTP remote storage driver.
+ (optional) `php-ldap` to use LDAP authentication.
@ -40,11 +41,11 @@ return [
'base_url' => 'https://example.com', // no trailing slash
'storage' => [
'driver' => 'local',
'path' => 'storage',
'path' => 'absolute/path/to/storage',
],
'db' => [
'connection' => 'sqlite', // current support for sqlite and mysql
'dsn' => 'resources/database/xbackbone.db',
'dsn' => 'absolute/path/to/resources/database/xbackbone.db', // if sqlite should be an absolute path
'username' => null, // username and password not needed for sqlite
'password' => null,
]
@ -64,4 +65,4 @@ For futher and advanced configurations, see the [configuration page](configurati
## Docker deployment
Alternatively, a docker container is available.
[Docker container](https://hub.docker.com/r/pe46dro/xbackbone-docker){: .btn .btn-purple }
[Docker container](https://fleet.linuxserver.io/image?name=linuxserver/xbackbone){: .btn .btn-purple }

View file

@ -1,7 +1,7 @@
---
layout: default
title: License & Credits
nav_order: 9
nav_order: 10
---
# License

22
docs/sponsor.md Normal file
View file

@ -0,0 +1,22 @@
---
layout: default
title: Sponsorship
nav_order: 8
---
# Sponsor this project
You can give your contribution to this project thanks to a small sponsorship, through GitHub Sponsors, or as a single donation on PayPal.
All those who make the recurring donations, the names or logos will be inserted in this page, if they wish.
[<img src="https://www.gravatar.com/avatar/98b8d56f4a193e3f7154f236c16930b2?s=160" alt="SergiX44" height="100">](https://github.com/SergiX44) |
---|
[SergiX44](https://github.com/SergiX44) |
[GitHub Sponsors](https://github.com/sponsors/SergiX44) |
[PayPal for XBackBone](http://bit.ly/XBackBonePaypal) |
{: .text-center}
## Sponsors
+ [@philw95](https://github.com/philw95)

View file

@ -4,7 +4,7 @@ title: Upgrading
nav_order: 4
---
# How to update
# Upgrading
The system updates can be applied via the web interface by an administrator, or manually via CLI.

View file

@ -1,10 +1,11 @@
<?php
(PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 1) ?: die('Sorry, PHP 7.1 or above is required to run XBackBone.');
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.3 or above is required to run XBackBone.');
require __DIR__.'/vendor/autoload.php';
define('BASE_DIR', realpath(__DIR__).DIRECTORY_SEPARATOR);
define('PLATFORM_VERSION', json_decode(file_get_contents('composer.json'))->version);
define('CONFIG_FILE', BASE_DIR.'config.php');
$app = require_once __DIR__.'/bootstrap/app.php';
$app = require __DIR__.'/bootstrap/app.php';
$app->run();

View file

@ -1,24 +1,21 @@
<?php
(PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 1) ?: die('Sorry, PHP 7.1 or above is required to run XBackBone.');
((PHP_MAJOR_VERSION >= 7 && PHP_MINOR_VERSION >= 3) || PHP_MAJOR_VERSION > 7) ?: die('Sorry, PHP 7.3 or above is required to run XBackBone.');
require __DIR__.'/../vendor/autoload.php';
use App\Database\DB;
use App\Database\Migrator;
use App\Factories\ViewFactory;
use App\Web\Media;
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 League\Flysystem\Filesystem;
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);
@ -29,7 +26,7 @@ $config = [
'debug' => true,
'db' => [
'connection' => 'sqlite',
'dsn' => realpath(__DIR__.'/../').implode(DIRECTORY_SEPARATOR, ['resources', 'database', 'xbackbone.db']),
'dsn' => BASE_DIR.implode(DIRECTORY_SEPARATOR, ['resources', 'database', 'xbackbone.db']),
'username' => null,
'password' => null,
],
@ -39,8 +36,23 @@ $config = [
],
];
$installed = false;
if (file_exists(__DIR__.'/../config.php')) {
$installed = true;
$config = array_replace_recursive($config, require __DIR__.'/../config.php');
if (isset($config['storage_dir'])) { // if from older installations with no support of other than local driver
$config['storage']['driver'] = 'local';
$config['storage']['path'] = $config['storage_dir'];
unset($config['storage_dir']);
}
if ($config['storage']['driver'] === 'local' && !is_dir($config['storage']['path'])) { // if installed with local driver, and the storage dir don't exists
$realPath = realpath(BASE_DIR.$config['storage']['path']);
if (is_dir($realPath) && is_writable($realPath)) { // and was a path relative to the upper folder
$config['storage']['path'] = $realPath; // update the config
}
}
}
$builder = new ContainerBuilder();
@ -51,6 +63,10 @@ $builder->addDefinitions([
return ViewFactory::createInstallerInstance($container);
}),
'view' => get(View::class),
Session::class => factory(function () {
return new Session('xbackbone_session');
}),
'session' => get(Session::class),
]);
$builder->addDefinitions(__DIR__.'/../bootstrap/container.php');
@ -58,7 +74,7 @@ $app = Bridge::create($builder->build());
$app->setBasePath(parse_url($config['base_url'].'/install', PHP_URL_PATH));
$app->addRoutingMiddleware();
$app->get('/', function (Response $response, View $view, Session $session) use (&$config) {
$app->get('/', function (Response $response, View $view, Session $session) {
if (!extension_loaded('gd')) {
$session->alert('The required "gd" extension is not loaded.', 'danger');
}
@ -75,6 +91,10 @@ $app->get('/', function (Response $response, View $view, Session $session) use (
$session->alert('The required "fileinfo" extension is not loaded.', 'danger');
}
if (!extension_loaded('zip')) {
$session->alert('The required "zip" extension is not loaded.', 'danger');
}
if (!is_writable(__DIR__.'/../resources/cache')) {
$session->alert('The cache folder is not writable ('.__DIR__.'/../resources/cache'.')', 'danger');
}
@ -94,16 +114,12 @@ $app->get('/', function (Response $response, View $view, Session $session) use (
]);
})->setName('install');
$app->post('/', function (Request $request, Response $response, Filesystem $storage, Session $session, DB $db) use (&$config) {
// Check if there is a previous installation, if not, setup the config file
$installed = true;
$app->post('/', function (Request $request, Response $response, \DI\Container $container, Session $session) use (&$config, &$installed) {
// disable debug in production
unset($config['debug']);
if (!file_exists(__DIR__.'/../config.php')) {
$installed = false;
// Check if there is a previous installation, if not, setup the config file
if (!$installed) {
// config file setup
$config['base_url'] = param($request, 'base_url');
$config['storage']['driver'] = param($request, 'storage_driver');
@ -118,6 +134,7 @@ $app->post('/', function (Request $request, Response $response, Filesystem $stor
$config['storage']['key'] = param($request, 'storage_key');
$config['storage']['secret'] = param($request, 'storage_secret');
$config['storage']['region'] = param($request, 'storage_region');
$config['storage']['endpoint'] = !empty(param($request, 'storage_endpoint')) ? param($request, 'storage_endpoint') : null;
$config['storage']['bucket'] = param($request, 'storage_bucket');
$config['storage']['path'] = param($request, 'storage_path');
break;
@ -143,21 +160,27 @@ $app->post('/', function (Request $request, Response $response, Filesystem $stor
$config['storage']['key_path'] = param($request, 'storage_key_path');
$config['storage']['bucket'] = param($request, 'storage_bucket');
break;
case 'azure':
$config['storage']['account_name'] = param($request, 'storage_account_name');
$config['storage']['account_key'] = param($request, 'storage_account_key');
$config['storage']['container_name'] = param($request, 'storage_container_name');
break;
case 'local':
default:
$config['storage']['path'] = param($request, 'storage_path');
break;
}
$container->set('config', value($config));
}
$storage = $container->get('storage');
// check if the storage is valid
$storageTestFile = 'storage_test.xbackbone.txt';
$storageTestFile = 'storage_test.txt';
try {
try {
$success = $storage->write($storageTestFile, 'XBACKBONE_TEST_FILE');
$success = $storage->write($storageTestFile, 'TEST_FILE');
} catch (FileExistsException $fileExistsException) {
$success = $storage->update($storageTestFile, 'XBACKBONE_TEST_FILE');
$success = $storage->update($storageTestFile, 'TEST_FILE');
}
if (!$success) {
@ -170,23 +193,10 @@ $app->post('/', function (Request $request, Response $response, Filesystem $stor
return redirect($response, urlFor('/install'));
}
// if from older installations with no support of other than local driver
// update the config
if ($installed && isset($config['storage_dir'])) {
$config['storage']['driver'] = 'local';
$config['storage']['path'] = $config['storage_dir'];
unset($config['storage_dir']);
}
// Build the dns string and run the migrations
// Get the db instance and run migrations
$db = $container->get('database');
try {
$firstMigrate = false;
if ($config['db']['connection'] === 'sqlite' && !file_exists(__DIR__.'/../'.$config['db']['dsn'])) {
touch(__DIR__.'/../'.$config['db']['dsn']);
$firstMigrate = true;
}
$migrator = new Migrator($db, __DIR__.'/../resources/schemas', $firstMigrate);
$migrator = new Migrator($db, __DIR__.'/../resources/schemas');
$migrator->migrate();
$migrator->reSyncQuotas($storage);
} catch (PDOException $e) {
@ -201,12 +211,9 @@ $app->post('/', function (Request $request, Response $response, Filesystem $stor
}
// re-apply the previous theme if is present
$css = $db->query('SELECT `value` FROM `settings` WHERE `key` = \'css\'')->fetch()->value;
if ($css) {
$content = file_get_contents($css);
if ($content !== false) {
file_put_contents(BASE_DIR.'static/bootstrap/css/bootstrap.min.css', $content);
}
$css = $db->query('SELECT `value` FROM `settings` WHERE `key` = \'css\'')->fetch()->value ?? null;
if ($css && strpos($css, '|') !== false) {
$container->make(\App\Web\Theme::class)->applyTheme($css);
}
// if is upgrading and existing installation, put it out maintenance
@ -230,9 +237,7 @@ $app->post('/', function (Request $request, Response $response, Filesystem $stor
cleanDirectory(__DIR__.'/../resources/cache');
cleanDirectory(__DIR__.'/../resources/sessions');
if (!isset($config['debug']) || !$config['debug']) {
removeDirectory(__DIR__.'/../install');
}
removeDirectory(__DIR__.'/../install');
// Installed successfully, destroy the installer session
$session->destroy();

View file

@ -6,13 +6,13 @@
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
<meta name="description" content="XBackBone Installer">
<link href="../static/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="../static/fontawesome/css/all.min.css" rel="stylesheet">
<link href="../static/app/app.css" rel="stylesheet">
<link href="../static/bootstrap/css/bootstrap.min.css?{{ 'now'|date('U') }}" rel="stylesheet">
<link href="../static/fontawesome/css/all.min.css?{{ 'now'|date('U') }}" rel="stylesheet">
<link href="../static/app/app.css?{{ 'now'|date('U') }}" rel="stylesheet">
<script src="../static/jquery/jquery.min.js"></script>
<script src="../static/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="installer.js"></script>
<script src="../static/jquery/jquery.min.js?{{ 'now'|date('U') }}"></script>
<script src="../static/bootstrap/js/bootstrap.bundle.min.js?{{ 'now'|date('U') }}"></script>
<script src="installer.js?{{ 'now'|date('U') }}"></script>
</head>
<body class="bg-light">
<div class="container">
@ -21,7 +21,7 @@
</div>
<div class="row justify-content-center">
<div class="col-md-8">
<div class="card mt-3">
<div class="card mt-3 shadow-sm">
<div class="card-header">Install XBackBone</div>
<div class="card-body">
<form method="post" onsubmit="$('#modalLoading').modal({backdrop: 'static', keyboard: false})">
@ -71,8 +71,9 @@
<select id="storage_driver" name="storage_driver" class="form-control" required>
<option value="local">Local Storage</option>
<option value="ftp">FTP/FTPS</option>
<option value="s3">Amazon AWS S3</option>
<option value="s3">Amazon S3 (or compatible)</option>
<option value="google-cloud">Google Cloud Storage</option>
<option value="azure">Azure Blob Storage</option>
<option value="dropbox">Dropbox</option>
</select>
</div>
@ -101,6 +102,12 @@
<input type="text" class="form-control hook-storage-input" id="storage_region" name="storage_region" placeholder="your-region" autocomplete="off">
</div>
</div>
<div class="form-group row hook-storage">
<label for="storage_region" class="col-sm-3 col-form-label">AWS S3 endpoint</label>
<div class="col-sm-9">
<input type="text" class="form-control hook-storage-input" id="storage_endpoint" name="storage_endpoint" placeholder="optional (for S3-compatible services)" autocomplete="off">
</div>
</div>
<div class="form-group row hook-storage">
<label for="storage_token" class="col-sm-3 col-form-label">Dropbox token</label>
<div class="col-sm-9">
@ -161,6 +168,24 @@
<input type="text" class="form-control hook-storage-input" id="storage_key_path" name="storage_key_path" placeholder="/path/to/service-account.json" autocomplete="off">
</div>
</div>
<div class="form-group row hook-storage">
<label for="storage_account_name" class="col-sm-3 col-form-label">Azure storage account name</label>
<div class="col-sm-9">
<input type="text" class="form-control hook-storage-input" id="storage_account_name" name="storage_account_name" placeholder="your-storage-account-name" autocomplete="off">
</div>
</div>
<div class="form-group row hook-storage">
<label for="storage_account_key" class="col-sm-3 col-form-label">Azure storage account key</label>
<div class="col-sm-9">
<input type="text" class="form-control hook-storage-input" id="storage_account_key" name="storage_account_key" placeholder="Account (Access) Key" autocomplete="off">
</div>
</div>
<div class="form-group row hook-storage">
<label for="storage_container_name" class="col-sm-3 col-form-label">Azure storage container name</label>
<div class="col-sm-9">
<input type="text" class="form-control hook-storage-input" id="storage_container_name" name="storage_container_name" placeholder="your-blob-container-name" autocomplete="off">
</div>
</div>
<div class="form-group row hook-storage">
<label for="storage_bucket" class="col-sm-3 col-form-label">Storage bucket</label>
<div class="col-sm-9">
@ -194,7 +219,7 @@
<div class="form-group row">
<div class="col-sm-12 d-flex justify-content-center">
<button type="submit" class="btn btn-lg btn-outline-primary">
<i class="fas fa-sync fa-fw"></i> Update database
<i class="fas fa-sync fa-fw"></i> Finalize update
</button>
</div>
</div>

View file

@ -28,6 +28,10 @@ location /logs {
return 403;
}
location CHANGELOG.md {
return 403;
}
index index.html index.htm index.php;
charset utf-8;

4999
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,25 +1,26 @@
{
"dependencies": {
"@fortawesome/fontawesome-free": "^5.13.0",
"bootstrap": "^4.4.1",
"@fortawesome/fontawesome-free": "^5.15.2",
"bootstrap": "^4.6.1",
"bootstrap4-toggle": "^3.6.1",
"clipboard": "^2.0.6",
"dropzone": "^5.7.0",
"clipboard": "^2.0.10",
"dropzone": "^5.9.3",
"highlightjs": "^9.16.2",
"jquery": "^3.4.1",
"plyr": "^3.5.10",
"highlightjs-line-numbers.js": "^2.8.0",
"jquery": "^3.6.0",
"plyr": "^3.6.12",
"popper.js": "^1.16.1",
"tooltip.js": "^1.3.3"
},
"devDependencies": {
"grunt": "^1.1.0",
"grunt": "^1.5.3",
"grunt-contrib-compress": "^2.0.0",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-cssmin": "^3.0.0",
"grunt-contrib-jshint": "^2.1.0",
"grunt-contrib-jshint": "^3.1.1",
"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"
}
}

33
phpunit.xml Normal file
View file

@ -0,0 +1,33 @@
<?xml version="1.0" encoding="UTF-8"?>
<phpunit bootstrap="tests/bootstrap.php"
colors="true"
backupGlobals="false"
backupStaticAttributes="false"
stopOnFailure="false"
cacheResult="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true">
<testsuites>
<testsuite name="Feature">
<directory suffix="Test.php">tests/Feature</directory>
</testsuite>
</testsuites>
<filter>
<whitelist processUncoveredFilesFromWhitelist="true">
<directory suffix=".php">app</directory>
<exclude>
<file>app/routes.php</file>
</exclude>
</whitelist>
</filter>
<logging>
<log type="coverage-html" target="./coverage"
lowUpperBound="70"
highLowerBound="90"/>
</logging>
<php>
<server name="HTTP_HOST" value="localhost"/>
<server name="HTTPS" value="false"/>
</php>
</phpunit>

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,18 +101,8 @@ return [
'password_recovery' => 'استعادة كلمة المرور',
'no_account' => 'لا تملك حسابا؟',
'register' => 'تسجيل',
'register_success' => 'تم إنشاء الحساب، تم إرسال رسالة تأكيد إلكترونية.',
'mail.activate_text' => 'مرحبا %s!
شكرات لإنشاء حسابك %s (%s)، انقر على الرابط لتفعيله:
%s',
'register_success' => 'تم إنشاء الحساب، تم إرسال رسالة تأكيد عبر البريد الإلكتروني.',
'mail.activate_account' => '%s - تفعيل الحساب',
'mail.recover_text' => 'مرحبا %
تم طلب استعادة كلمة المرور لهذا الحساب. لإكمال العملية انقر على الرابط التالي:
%s
إذا لم تكن من طلب استعادة كلمة المرور، تجاهل هذه الرسالة.',
'mail.recover_password' => '%s - استعادة كلمة المرور',
'recover_email_sent' => 'إن وجد، سيتم إرسال رسالة إلكترونية لاستعادة كلمة المرور إلى الحساب المحدد.',
'account_activated' => 'تم تفعيل الحساب، الآن يمكنك الدخول!',
@ -125,18 +115,51 @@ return [
'clear_account' => 'مسح الحساب',
'account_media_deleted' => 'كل الوسائط في الحساب تم حذفها.',
'danger_zone' => 'منطقة خطرة',
'send_notification' => 'إرسال رسالة إشعار إلكترونية',
'send_notification' => 'إرسال إشعار بالبريد الإلكتروني',
'mail.new_account' => '%s - إنشاء حساب جديد',
'mail.new_account_text_with_reset' => 'مرحبا %s!
تم إنشائ حساب جديد لك على %s (%s)، انقر على الرابط التالي لتحديد كلمة مرور وتفعيله:
%s',
'mail.new_account_text_with_pw' => 'مرحبا %s!
تم إنشاء حساب جديد على %s (%s)، بالاعتمادات التالية:
اسم المستخدم: %s
كلمة المرور: %s
انقر على الرابط التالي للذهاب إلى صفحة تسجيل الدخول:
%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

@ -1,73 +1,164 @@
<?php
return [
'lang' => 'Bulgarian',
'enforce_language' => 'Изберете език',
'yes' => 'Да',
'no' => 'Не',
'send' => 'Изпрати',
'no_media' => 'Не бяха намерени файлове.',
'login.username' => 'Потребителско име или E-Mail',
'password' => 'Парола',
'login' => 'Влезте',
'username' => 'Потребителско име',
'home' => 'Начална страница',
'users' => 'Потребители',
'system' => 'Система',
'profile' => 'Профил',
'logout' => 'Излезте',
'pager.next' => 'Следващо',
'pager.previous' => 'Предишно',
'copy_link' => 'Копирай линк',
'public.telegram' => 'Сподели по Telegram',
'public.delete_text' => 'Сигурни ли сте, че искате да изтриете това? Ще изчезне завинаги!',
'preview' => 'Предварителен преглед',
'filename' => 'Файлово име',
'size' => 'Размер',
'public' => 'Публично',
'owner' => 'Собственик',
'date' => 'Дата',
'raw' => 'Покажи оригинал',
'download' => 'Изтегли',
'delete' => 'Изтрий',
'publish' => 'Публикувай',
'hide' => 'Скрий',
'files' => 'Файлове',
'orphaned_files' => 'Загубени файлове',
'theme' => 'Тема',
'click_to_load' => 'Натиснете за да заредите...',
'apply' => 'Приложи',
'save' => 'Запомни',
'used' => 'Използвано',
'system_info' => 'Системна информация',
'user.create' => 'Създай потребител',
'user.edit' => 'Редактирай потребител',
'is_active' => 'Е активен',
'is_admin' => 'Е администратор',
'your_profile' => 'Вашия профил',
'token' => 'Ключ',
'copy' => 'Копирай',
'update' => 'Обнови',
'edit' => 'Редактирай',
'client_config' => 'Конфигурация на клиента',
'user_code' => 'Потребителски код',
'active' => 'Активен',
'admin' => 'Админ',
'reg_date' => 'Дата на регистрация',
'confirm' => 'Потвърждение',
'confirm_string' => 'Сигурни ли сте?',
'installed' => 'Инсталацията завърши успешно!',
'welcome' => 'Добре дошли, %s!',
'goodbye' => 'Довиждане!',
'email_required' => 'Имейлът е необходим.',
'email_taken' => 'Имейлът вече се използва.',
'username_required' => 'Потребителското име е необходимо.',
'username_taken' => 'Потребителското име вече е заето.',
'password_required' => 'Паролата е необходима.',
'user_created' => 'Потребител "%s" бе създаден!',
'user_updated' => 'Потребител "%s" бе обновен!',
'profile_updated' => 'Профилът бе обновен успешно!',
'user_deleted' => 'Потребителят бе изтрит.',
'cannot_delete' => 'Не можете да изтриете себе си.',
'gallery' => 'Галерия',
'lang' => 'Bulgarian',
'enforce_language' => 'Изберете език',
'yes' => 'Да',
'no' => 'Не',
'send' => 'Изпрати',
'no_media' => 'Не бяха намерени файлове.',
'login.username' => 'Потребителско име или е-поща',
'password' => 'Парола',
'login' => 'Влезте',
'username' => 'Потребителско име',
'home' => 'Начална страница',
'users' => 'Потребители',
'system' => 'Система',
'profile' => 'Профил',
'logout' => 'Излезте',
'pager.next' => 'Следващо',
'pager.previous' => 'Предишно',
'copy_link' => 'Копирай линк',
'public.telegram' => 'Сподели по Telegram',
'public.delete_text' => 'Наистина ли искате да изтриете този елемент? Няма да можете да го възстановите',
'preview' => 'Предварителен преглед',
'filename' => 'Файлово име',
'size' => 'Размер',
'public' => 'Публично',
'owner' => 'Собственик',
'date' => 'Дата',
'raw' => 'Покажи оригинал',
'download' => 'Изтегли',
'delete' => 'Изтрий',
'publish' => 'Публикувай',
'hide' => 'Скрий',
'files' => 'Файлове',
'orphaned_files' => 'Загубени файлове',
'theme' => 'Тема',
'click_to_load' => 'Щракнете за зареждане…',
'apply' => 'Приложи',
'save' => 'Запомни',
'used' => 'Използвано',
'system_info' => 'Системна информация',
'user.create' => 'Създай потребител',
'user.edit' => 'Редактирай потребител',
'is_active' => 'Е активен',
'is_admin' => 'Е администратор',
'your_profile' => 'Вашия профил',
'token' => 'Ключ',
'copy' => 'Копирай',
'update' => 'Обнови',
'edit' => 'Редактирай',
'client_config' => 'Конфигурация на клиента',
'user_code' => 'Потребителски код',
'active' => 'Активен',
'admin' => 'Админ',
'reg_date' => 'Дата на регистрация',
'confirm' => 'Потвърждение',
'confirm_string' => 'Сигурни ли сте?',
'installed' => 'Инсталацията завърши успешно!',
'welcome' => 'Добре дошли, %s!',
'goodbye' => 'Довиждане!',
'email_required' => 'Изисква се имейл адрес.',
'email_taken' => 'Имейл адресът вече се използва.',
'username_required' => 'Потребителското име е необходимо.',
'username_taken' => 'Потребителското име вече е заето.',
'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>',
];

163
resources/lang/ca.lang.php Normal file
View file

@ -0,0 +1,163 @@
<?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>',
];

163
resources/lang/cs.lang.php Normal file
View file

@ -0,0 +1,163 @@
<?php
return [
'prerelease_channel' => 'Kanál předběžného vydání',
'default_lang_behavior' => 'XBackBone se pokusí ve výchozím nastavení použít jazyk prohlížeče (záloha je angličtina).',
'auto_set' => 'Nastavit automaticky',
'cancel' => 'Zrušit',
'maintenance_in_progress' => 'Platforma je v údržbě, zkuste to znovu později…',
'updates' => 'Aktualizace',
'upgrade' => 'Aktualizovat',
'check_for_updates' => 'Zkontrolovat aktualizace',
'file_size_no_match' => 'Stažený soubor nemá správnou velikost.',
'cannot_retrieve_file' => 'Nemohu získat soubor.',
'new_version_available' => 'Je dostupná nová verze %s!',
'already_latest_version' => 'Již máte nejnovější verzi.',
'path_not_writable' => 'Výstupová cesta není zapisovatelná.',
'clean_orphaned_uploads' => 'Vymazat samostatné nahrávky',
'maintenance' => 'Údržba',
'name' => 'Jméno',
'time' => 'Čas',
'order_by' => 'Řadit podle…',
'dotted_search' => 'Hledat…',
'table' => 'Tabulka',
'gallery' => 'Galerie',
'switch_to' => 'Přepnout na',
'deleted_orphans' => 'Úspěšně odstraněno %d samostatných souborů.',
'cannot_write_file' => 'Cílová cesta není zapisovatelná.',
'cannot_demote' => 'Nemůžete sami sobě snížit role.',
'cannot_delete' => 'Nemůžete odstranit sami sebe.',
'user_deleted' => 'Uživatel odstraněn.',
'profile_updated' => 'Profil úspěšně aktualizován!',
'user_updated' => 'Uživatel "%s" aktualizován!',
'user_created' => 'Uživatel "%s" vytvořen!',
'password_required' => 'Je vyžadováno heslo.',
'username_taken' => 'Uživatelské jméno je již zabrané.',
'username_required' => 'Je vyžadováno uživatelské jméno.',
'email_taken' => 'Daná e-mailová adresa se již používá.',
'email_required' => 'Je vyžadována e-mailová adresa.',
'token_not_found' => 'Zadaný token nenalezen.',
'goodbye' => 'Mějte se!',
'welcome' => 'Vítejte, %s!',
'account_disabled' => 'Váš účet je pozastaven.',
'bad_login' => 'Špatné údaje.',
'installed' => 'Instalace úspěšně dokončena!',
'confirm_string' => 'Jste si jisti?',
'confirm' => 'Potvrzení',
'open' => 'Otevřený',
'none' => 'Žádný',
'reg_date' => 'Datum registrace',
'admin' => 'Admin',
'active' => 'Aktivní',
'user_code' => 'Uživatelský kód',
'client_config' => 'Konfigurace klienta',
'edit' => 'Upravit',
'update' => 'Aktualizovat',
'copied' => 'Zkopírováno do schránky!',
'copy' => 'Zkopírovat',
'token' => 'Token',
'your_profile' => 'Váš profil',
'is_admin' => 'Je administrátor',
'is_active' => 'Je aktivní',
'user.edit' => 'Upravit uživatele',
'user.create' => 'Vytvořit uživatele',
'system_settings' => 'Systémová nastavení',
'php_info' => 'Informace o PHP',
'used' => 'Použito',
'save' => 'Uložit',
'apply' => 'Použít',
'click_to_load' => 'Klikněte pro načtení…',
'theme' => 'Téma',
'orphaned_files' => 'Samotné soubory',
'files' => 'Soubory',
'hide' => 'Skrýt',
'publish' => 'Zveřejnit',
'delete' => 'Odstranit',
'upload' => 'Nahrát',
'download' => 'Stáhnout',
'raw' => 'Zobrazit základní',
'date' => 'Datum',
'owner' => 'Majitel',
'public' => 'Veřejné',
'size' => 'Velikost',
'filename' => 'Název souboru',
'preview' => 'Náhled',
'public.delete_text' => 'Opravdu chcete odstranit tuto položku? Nebudete ji moci později obnovit',
'public.telegram' => 'Sdílet na Telegramu',
'copy_link' => 'Zkopírovat odkaz',
'pager.previous' => 'Předchozí',
'pager.next' => 'Další',
'logout' => 'Odhlásit se',
'profile' => 'Profil',
'system' => 'Systém',
'users' => 'Uživatelé',
'home' => 'Domů',
'username' => 'Uživatelské jméno',
'login' => 'Přihlásit se',
'password' => 'Heslo',
'login.username' => 'Uživatelské jméno nebo e-mail',
'no_media' => 'Nenalezena žádná média.',
'send' => 'Poslat',
'no' => 'Ne',
'yes' => 'Ano',
'enforce_language' => 'Vynutit jazyk',
'lang' => 'Čeština',
'show_changelog' => 'Zobrazit seznam změn',
'changelog' => 'Seznam změn',
'zip_ext_not_loaded' => 'Vyžadované "zip" rozšíření není načteno',
'auto_tagging' => 'Automatické štítkování nahrání',
'no_tags' => 'Nebyly přidány žádné štítky',
'upload_max_file_size' => 'Maximální velikost souboru je momentálně %s.',
'ldap_cant_connect' => 'Nemohu se připojit k ověřovacímu serveru LDAP.',
'user_create_password' => 'Pokud bude ponecháno prázdné, budete možná chtít poslat oznámení na uživatelovu e-mailovou adresu.',
'mail.new_account_text_with_pw' => 'Zdravíme, %s!<br>Byl pro vás vytvořen nový účet na %s (<a href="%s">%s</a>) s následujícími údaji:<br><br>Uživatelské jméno: %s<br>Heslo: %s<br><br>Klikněte na následující odkaz pro vstup na přihlašovací stránku:<br><a href="%s">%s</a>',
'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íč',
'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',
'recaptcha_failed' => 'reCAPTCHA selhala',
'danger_zone' => 'Nebezpečná oblast',
'account_media_deleted' => 'Všechna média na účtu byla odstraněna.',
'clear_account' => 'Promazat účet',
'delete_all' => 'Odstranit vše',
'delete_selected' => 'Odstranit vybrané',
'used_space' => 'Využitý prostor',
'quota_recalculated' => 'Uživatelská kvóta úspěšně přepočítána z disku.',
'recalculate_user_quota' => 'Přepočítat uživatelskou kvótu z disku',
'password_restored' => 'Heslo obnoveno.',
'password_match' => 'Pole Heslo a Heslo znovu se musí shodovat.',
'password_repeat' => 'Heslo znovu',
'quota_enabled' => 'Povolit uživatelskou kvótu',
'account_activated' => 'Účet aktivován, nyní se můžete přihlásit!',
'recover_email_sent' => 'Pokud existuje, byl odeslán obnovovací e-mail na zadaný účet.',
'mail.recover_password' => '%s - obnova hesla',
'mail.recover_text' => 'Zdravíme, %s,<br>u vašeho účtu bylo zažádáno obnovení hesla. Pro dokončení akce klikněte na následující odkaz:<br><br><a href="%s">%s</a><br><br>Pokud jste o obnovení hesla nezažádali vy, jednoduše ignorujte tento e-mail.',
'mail.activate_account' => '%s - aktivace účtu',
'mail.activate_text' => 'Zdravíme, %s!<br>Děkujeme za vytvoření účtu na %s (<a href="%s">%s</a>), klikněte na následující odkaz pro jeho aktivaci:<br><br><a href="%s">%s</a>',
'invalid_quota' => 'Neplatné hodnoty jako výchozí uživatelská kvóta.',
'max_user_quota' => 'Maximální uživatelská kvóta',
'default_user_quota' => 'Výchozí uživatelská kvóta',
'register_success' => 'Účet byl vytvořen a potvrzovací e-mail odeslán.',
'register' => 'Zaregistrovat se',
'no_account' => 'Nemáte účet?',
'password_recovery' => 'Obnovit heslo',
'export_data' => 'Exportovat data',
'settings_saved' => 'Nastavení systému uložena!',
'copy_url_behavior' => 'Režim kopírování URL',
'hide_by_default' => 'Skrýt média ve výchozím nastavení',
'register_enabled' => 'Registrace povoleny',
'dont_close' => 'Nezavírejte tuto kartu před dokončením.',
'please_wait' => 'Čekejte prosím…',
'remember_me' => 'Pamatovat si mě',
'custom_head_set' => 'Vlastní hlavička HTML použita.',
'custom_head_html_hint' => 'Tento obsah bude přidán do tagu <head> na každé stránce.',
'custom_head_html' => 'Vlastní obsah hlavičky HTML',
'donate_text' => 'Pokud se vám líbí XBackBone, zvažte příspěvek na podporu vývoje!',
'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

@ -1,47 +1,164 @@
<?php
return [
'lang' => 'Danish',
'yes' => 'Ja',
'no' => 'Nej',
'send' => 'Send',
'no_media' => 'Intet media fundet.',
'login.username' => 'Brugernavn eller E-Mail',
'password' => 'Adgangskode',
'login' => 'Log på',
'username' => 'Brugernavn',
'home' => 'Hjem',
'users' => 'Brugere',
'system' => 'System',
'profile' => 'Profil',
'logout' => 'Log ud',
'pager.next' => 'Næste',
'pager.previous' => 'Forrige',
'copy_link' => 'Kopier link',
'public.telegram' => 'Del på Telegram',
'public.delete_text' => 'Er du sikker på du vil slette denne genstand? Det vil blive slettet permanent!',
'preview' => 'Forhåndsvisning',
'filename' => 'Filnavn',
'size' => 'Størrelse',
'public' => 'Offentligt',
'owner' => 'Ejer',
'date' => 'Dato',
'raw' => 'Vis rå',
'download' => 'Hent',
'delete' => 'Slet',
'publish' => 'Offentliggøre',
'hide' => 'Skjul',
'files' => 'Filer',
'orphaned_files' => 'Forældreløse filer',
'theme' => 'Tema',
'click_to_load' => 'Klik for at indlæse...',
'apply' => 'Anvend',
'save' => 'Gem',
'used' => 'Brugt',
'system_info' => 'System information',
'user.create' => 'Ny bruger',
'user.edit' => 'Rediger bruger',
'is_active' => 'Er aktiv',
'is_admin' => 'Er administrator',
'your_profile' => 'Din Profil',
'lang' => 'Danish',
'yes' => 'Ja',
'no' => 'Nej',
'send' => 'Send',
'no_media' => 'Intet media fundet.',
'login.username' => 'Brugernavn eller e-mail',
'password' => 'Adgangskode',
'login' => 'Log på',
'username' => 'Brugernavn',
'home' => 'Hjem',
'users' => 'Brugere',
'system' => 'System',
'profile' => 'Profil',
'logout' => 'Log ud',
'pager.next' => 'Næste',
'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',
'preview' => 'Forhåndsvisning',
'filename' => 'Filnavn',
'size' => 'Størrelse',
'public' => 'Offentligt',
'owner' => 'Ejer',
'date' => 'Dato',
'raw' => 'Vis rå',
'download' => 'Hent',
'delete' => 'Slet',
'publish' => 'Offentliggøre',
'hide' => 'Skjul',
'files' => 'Filer',
'orphaned_files' => 'Forældreløse filer',
'theme' => 'Tema',
'click_to_load' => 'Klik for at indlæse…',
'apply' => 'Anvend',
'save' => 'Gem',
'used' => 'Brugt',
'system_info' => 'System information',
'user.create' => 'Ny bruger',
'user.edit' => 'Rediger bruger',
'is_active' => 'Er aktiv',
'is_admin' => 'Er administrator',
'your_profile' => 'Din Profil',
'user_updated' => 'Bruger »%s« er opdateret!',
'user_created' => 'Bruger »%s« oprettet!',
'email_taken' => 'E-mail-adressen er allerede i brug.',
'email_required' => 'E-mail er påkrævet.',
'mail.new_account' => '%s - Oprettelse af ny konto',
'send_notification' => 'Send e-mail notifikation',
'recaptcha_enabled' => 'reCAPTCHA slået til',
'recaptcha_failed' => 'reCAPTCHA fejlede',
'delete_all' => 'Slet alt',
'delete_selected' => 'Slet valgte',
'used_space' => 'Brugt plads',
'password_repeat' => 'Gentag adgangskode',
'account_activated' => 'Konto aktiveret, du kan nu logge ind!',
'register' => 'Tilmeld',
'no_account' => 'Har du ikke en konto?',
'password_recovery' => 'Gendan adgangskode',
'export_data' => 'Eksporter data',
'settings_saved' => 'Systemindstillinger gemt!',
'copy_url_behavior' => 'Kopier URL tilstand',
'hide_by_default' => 'Skjul medie som standard',
'register_enabled' => 'Registreringer slået til',
'please_wait' => 'Vent venligst…',
'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',
'drop_to_upload' => 'Klik eller slip dine filer her for at uploade.',
'auto_set' => 'Sæt 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.',
'new_version_available' => 'Ny version %s tilgængelig!',
'already_latest_version' => 'Du har allerede den seneste version.',
'maintenance' => 'Vedligeholdelse',
'name' => 'Navn',
'time' => 'Tid',
'order_by' => 'Sorter efter…',
'dotted_search' => 'Søg…',
'table' => 'Tabel',
'gallery' => 'Galleri',
'switch_to' => 'Skift til',
'cannot_write_file' => 'Destinationsstien er ikke skrivbar.',
'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 påkrævet.',
'username_taken' => 'Brugernavnet er allerede i brug.',
'username_required' => 'Brugernavnet er påkrævet.',
'goodbye' => 'Farvel!',
'welcome' => 'Velkommen, %s!',
'account_disabled' => 'Din konto er deaktiveret.',
'bad_login' => 'Forkerte loginoplysninger.',
'installed' => 'Installationen blev gennemført!',
'confirm_string' => 'Er du sikker?',
'confirm' => 'Bekræftelse',
'open' => 'Åbn',
'none' => 'Ingen',
'reg_date' => 'Registreringsdato',
'admin' => 'Admin',
'active' => 'Aktiv',
'user_code' => 'Bruger kode',
'client_config' => 'Klientkonfiguration',
'edit' => 'Rediger',
'update' => 'Opdater',
'copied' => 'Kopieret til udklipsholderen!',
'copy' => 'Kopier',
'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.',
];

View file

@ -1,27 +1,27 @@
<?php
return [
'lang' => 'German',
'lang' => 'Deutsch',
'yes' => 'Ja',
'no' => 'Nein',
'send' => 'Senden',
'no_media' => 'Datei nicht gefunden.',
'login.username' => 'Benutzername oder E-Mail',
'password' => 'Passwort',
'login' => 'Login',
'login' => 'Anmelden',
'username' => 'Benutzername',
'home' => 'Startseite',
'users' => 'Benutzer',
'system' => 'System',
'profile' => 'Profil',
'logout' => 'Ausloggen',
'logout' => 'Abmelden',
'pager.next' => 'Nächste',
'pager.previous' => 'Zurück',
'copy_link' => 'Kopiere Link',
'public.telegram' => 'Teile auf Telegram',
'public.delete_text' => 'Möchtest du das wirklich löschen? Es wird dann für immer weg sein!',
'public.delete_text' => 'Möchtest du das wirklich löschen? Es wird dann für immer weg sein',
'preview' => 'Vorschau',
'filename' => 'Dateiname',
'size' => 'Größe aller Datein',
'size' => 'Größe aller Dateien',
'public' => 'Öffentlich',
'owner' => 'Besitzer',
'date' => 'Datum',
@ -33,10 +33,10 @@ return [
'files' => 'Datei(n)',
'orphaned_files' => 'verwaiste Dateien',
'theme' => 'Design',
'click_to_load' => 'Klick um zu laden...',
'click_to_load' => 'Zum Laden klicken ',
'apply' => 'Sichern',
'save' => 'Speichern',
'used' => 'Benutzen',
'used' => 'Benutzt',
'system_info' => 'System Informationen',
'user.create' => 'Benutzer erstellen',
'user.edit' => 'Benutzer bearbeiten',
@ -53,8 +53,8 @@ return [
'admin' => 'Administrator',
'reg_date' => 'Registrierungsdatum',
'none' => 'keine',
'open' => 'Offen',
'confirm' => 'Bestätigung',
'open' => 'Öffnen',
'confirm' => 'Bestätigen',
'confirm_string' => 'Bist du sicher?',
'installed' => 'Installation erfolgreich abgeschlossen!',
'bad_login' => 'Falsche Anmeldeinformationen.',
@ -62,13 +62,13 @@ return [
'welcome' => 'Willkommen, %s!',
'goodbye' => 'Auf Wiedersehen!',
'token_not_found' => 'Das angegebene Schlüssel wurde nicht gefunden.',
'email_required' => 'Die E-Mail ist erforderlich.',
'email_taken' => 'Die E-Mail ist bereits vergeben.',
'email_required' => 'E-Mail-Adresse erforderlich.',
'email_taken' => 'Die E-Mail-Adresse wird bereits verwendet.',
'username_required' => 'Der Benutzername ist erforderlich.',
'username_taken' => 'Der Benutzername ist bereits vergeben.',
'password_required' => 'Das Passwort ist erforderlich.',
'user_created' => 'Benutzer "%s" wurde erstellt!',
'user_updated' => 'Benutzer "%s" wurde aktualisiert!',
'user_created' => 'Benutzer „%s“ wurde erstellt!',
'user_updated' => 'Benutzer „%s“ wurde aktualisiert!',
'profile_updated' => 'Profil erfolgreich aktualisiert!',
'user_deleted' => 'Benutzer gelöscht.',
'cannot_delete' => 'Du kannst dich nicht selbst löschen.',
@ -77,8 +77,8 @@ return [
'switch_to' => 'Wechseln zu',
'gallery' => 'Galerie',
'table' => 'Tabelle',
'dotted_search' => 'Suche...',
'order_by' => 'Sortieren nach...',
'dotted_search' => 'Suche …',
'order_by' => 'Sortieren nach …',
'time' => 'Zeit',
'name' => 'Name',
'maintenance' => 'Wartungsarbeiten',
@ -88,13 +88,13 @@ return [
'new_version_available' => 'Neue Version %s ist verfügbar!',
'cannot_retrieve_file' => 'Die Datei kann nicht abgerufen werden.',
'file_size_no_match' => 'Die heruntergeladene Datei stimmt mit der richtigen Dateigröße nicht überein.',
'check_for_updates' => 'Auf Updates prüfen',
'check_for_updates' => 'Auf Aktualisierungen prüfen',
'upgrade' => 'Aktualisierung',
'updates' => 'Updates',
'maintenance_in_progress' => 'Die Seite macht Wartungsarbeiten, bitte versuche es später noch einmal.',
'updates' => 'Aktualisierungen',
'maintenance_in_progress' => 'Plattform wird gewartet, versuchen Sie es später erneut ',
'cancel' => 'Abbruch',
'deleted_orphans' => '%d verwaiste Dateie(n) wurden erfolgreich gelöscht.',
'enforce_language' => 'Name der Sprache',
'enforce_language' => 'Sprache erzwingen',
'auto_set' => 'Automatisch einstellen',
'translated_strings' => 'übersetzte Zeichen',
'total_strings' => 'Übersetzt',
@ -110,41 +110,31 @@ return [
'custom_head_html' => 'Eigenes HTML Head Content',
'custom_head_html_hint' => 'Dieser Inhalt wird auf jeder Seite am Tag <head> hinzugefügt.',
'custom_head_set' => 'Benutzerdefinierter HTML Head wurde angewendet.',
'remember_me' => 'Erinnere mich daran',
'please_wait' => 'Bitte warten…',
'remember_me' => 'Merken',
'please_wait' => 'Bitte warten …',
'dont_close' => 'Schließe diesen Tab erst wenn fertig.',
'php_info' => 'PHP Informationen',
'system_settings' => 'Systemeinstellungen',
'register_enabled' => 'Registrierungen aktivieren',
'register_enabled' => 'Registrierungen aktiviert',
'hide_by_default' => 'Medien standardmäßig ausblenden',
'copy_url_behavior' => 'URL kopieren Mode',
'settings_saved' => 'Systemeinstellungen gespeichert!',
'export_data' => 'Daten exportieren',
'password_recovery' => 'Passwort wiederherstellen',
'no_account' => 'Du hast noch kein Account?',
'no_account' => 'Haben Sie kein Konto?',
'register' => 'Registrieren',
'default_user_quota' => 'Standard Speicherplatz',
'invalid_quota' => 'Ungültiger Wert für den Speicherplatz.',
'mail.activate_text' => 'Hey %s!
Vielen Dank, dass Sie Ihr Konto auf %s (%s) erstellt haben. Klicken Sie auf den folgenden Link, um es zu aktivieren:
%s',
'register_success' => 'Das Konto wurde erstellt, eine Bestätigungs-E-Mail wurde gesendet.',
'mail.activate_account' => '%s - Konto Aktivierung',
'mail.recover_text' => 'Hey %s,
Für Ihr Konto wurde ein Zurücksetzen des Passworts angefordert. Um den Vorgang abzuschließen, klicken Sie auf den folgenden Link:
%s
Wenn Sie nicht das Zurücksetzen des Passworts angefordert haben, ignorieren Sie diese E-Mail einfach.',
'mail.recover_password' => '%s - Passwort Zurücksetzung',
'mail.activate_account' => '%s Aktivierung des Kontos',
'mail.recover_password' => '%s Zurücksetzung des Passworts',
'recover_email_sent' => 'Falls vorhanden, wurde eine Wiederherstellungs-E-Mail an das angegebene Konto gesendet.',
'account_activated' => 'Account wurde aktiviert, du kannst dich jetzt einloggen!',
'account_activated' => 'Konto wurde aktiviert, du kannst dich jetzt anmelden!',
'quota_enabled' => 'Aktiviere Speicherlimit',
'password_repeat' => 'Passwort wiederholen',
'password_match' => 'Das Passwort und das wiederholte Passwort muss das gleiche sein.',
'password_restored' => 'Passwort wurde zurückgesetzt.',
'recalculate_user_quota' => 'Benutzer Speicher wird neu berechnet',
'recalculate_user_quota' => 'Benutzer Speicher neu berechnen',
'quota_recalculated' => 'Die Berechnung vom Benutzer Speicher war erfolgreich.',
'used_space' => 'Belegter Speicherplatz',
'max_user_quota' => 'Max. Benutzerkontingent',
@ -159,19 +149,22 @@ Wenn Sie nicht das Zurücksetzen des Passworts angefordert haben, ignorieren Sie
'only_recaptcha_v3' => 'Es wird nur reCAPTCHA v3 unterstützt.',
'recaptcha_site_key' => 'reCAPTCHA Websiteschlüssel',
'recaptcha_secret_key' => 'reCAPTCHA geheimen Schlüssel',
'send_notification' => 'Mail-Benachrichtigung senden',
'mail.new_account' => '%s - Erstellung von Konto',
'mail.new_account_text_with_reset' => 'Hallo %s!
Ein neues Konto wurde für Sie auf %s (%s) erstellt, klicken Sie auf den folgenden Link, um ein Passwort festzulegen und es zu aktivieren:
%s',
'mail.new_account_text_with_pw' => 'Hallo %s!
Ein neues Konto wurde für Sie auf %s (%s) mit den folgenden Anmeldeinformationen erstellt:
Benutzername: %s
Kennwort: %s
Klicken Sie auf den folgenden Link, um zur Login-Seite zu gelangen:
%s',
'user_create_password' => 'Wenn Sie keine Angaben gemacht haben, können Sie eine Benachrichtigung an die Benutzer-E-Mail senden.',
'send_notification' => 'E-Mail-Benachrichtigung senden',
'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',
'auto_tagging' => 'Automatische Markierung des Hochladen',
'mail.new_account_text_with_pw' => 'Hallo %s! <br>ein neues Konto wurde für Dich auf %s (<a href="%s">%s</a>) erstellt, mit den folgenden Anmeldeinformationen:<br><br>Benutzername: %s<br>Password: %s<br><br>Klicken Sie auf den folgenden Link, um zur Anmeldeseite zu gelangen:<br><a href="%s">%s</a>',
'mail.new_account_text_with_reset' => 'Hallo %s! <br>ein neues Konto wurde für dich auf %s erstellt (<a href="%s">%s</a>), klicken auf den folgenden Link, um ein Passwort festzulegen und es zu aktivieren:<br><br><a href="%s">%s</a>',
'mail.recover_text' => 'Hallo %s,<br>für Ihr Konto wurde eine Zurücksetzung des Passworts angefordert. Um das Verfahren abzuschließen, klicken Sie auf den folgenden Link:<br><br><a href="%s">%s</a><br><br>Wenn Sie keine Zurücksetzung Ihres Passworts angefordert haben, ignorieren Sie diese E-Mail einfach.',
'mail.activate_text' => 'Hallo %s! <br>Vielen Dank fürs Registrieren auf %s (\'a href="%s">%s</a>), klicken Sie auf den folgenden Link, um es zu aktivieren:<br><br>\'a href="%s">%s</a>',
'show_changelog' => 'Änderungsprotokoll ansehen',
'changelog' => 'Änderungsprotokoll',
'copied' => 'In Zwischenablage kopiert!',
'image_embeds' => 'Bilder einbetten',
'vanity_url' => 'Benutzerdefinierte URL',
];

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

@ -19,7 +19,7 @@ return [
'pager.previous' => 'Previous',
'copy_link' => 'Copy link',
'public.telegram' => 'Share on Telegram',
'public.delete_text' => 'Are you sure you want to delete this item? It will be gone forever!',
'public.delete_text' => 'Are you sure you want to delete this item? You will not be able to recover it',
'preview' => 'Preview',
'filename' => 'Filename',
'size' => 'Size',
@ -30,12 +30,14 @@ return [
'download' => 'Download',
'upload' => 'Upload',
'delete' => 'Delete',
'confirm' => 'Confirm',
'vanity_url' => 'Custom URL',
'publish' => 'Publish',
'hide' => 'Hide',
'files' => 'Files',
'orphaned_files' => 'Orphaned Files',
'theme' => 'Theme',
'click_to_load' => 'Click to load...',
'click_to_load' => 'Click to load',
'apply' => 'Apply',
'save' => 'Save',
'used' => 'Used',
@ -48,6 +50,7 @@ return [
'your_profile' => 'Your Profile',
'token' => 'Token',
'copy' => 'Copy',
'copied' => 'Copied to clipboard!',
'update' => 'Update',
'edit' => 'Edit',
'client_config' => 'Client Configuration',
@ -57,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.',
@ -65,8 +67,8 @@ return [
'welcome' => 'Welcome, %s!',
'goodbye' => 'Goodbye!',
'token_not_found' => 'Token specified not found.',
'email_required' => 'The email is required.',
'email_taken' => 'The email is already taken.',
'email_required' => 'E-mail address required.',
'email_taken' => 'The e-mail address is already in use.',
'username_required' => 'The username is required.',
'username_taken' => 'The username is already taken.',
'password_required' => 'The password is required.',
@ -81,8 +83,8 @@ return [
'switch_to' => 'Switch to',
'gallery' => 'Gallery',
'table' => 'Table',
'dotted_search' => 'Search...',
'order_by' => 'Order by...',
'dotted_search' => 'Search',
'order_by' => 'Order by',
'time' => 'Time',
'name' => 'Name',
'maintenance' => 'Maintenance',
@ -95,7 +97,7 @@ return [
'check_for_updates' => 'Check for updates',
'upgrade' => 'Upgrade',
'updates' => 'Updates',
'maintenance_in_progress' => 'Platform under maintenance, try again later...',
'maintenance_in_progress' => 'Platform under maintenance, try again later',
'cancel' => 'Cancel',
'auto_set' => 'Set automatically',
'default_lang_behavior' => 'XBackBone will try to match the browser language by default (the fallback is English).',
@ -118,15 +120,15 @@ return [
'password_recovery' => 'Recover password',
'no_account' => 'Don\'t have an account?',
'register' => 'Register',
'register_success' => 'The account has been created, a confirmation email has been sent.',
'register_success' => 'The account has been created, a confirmation e-mail has been sent.',
'default_user_quota' => 'Default User Quota',
'max_user_quota' => 'Max User Quota',
'invalid_quota' => 'Invalid values as default user quota.',
'mail.activate_text' => "Hi %s!\nthank you for creating your account on %s (%s), click on the following link to activate it:\n\n%s",
'mail.activate_text' => 'Hi %s!<br>thank you for creating your account on %s (<a href="%s">%s</a>), click on the following link to activate it:<br><br><a href="%s">%s</a>',
'mail.activate_account' => '%s - Account Activation',
'mail.recover_text' => "Hi %s,\na password reset has been requested for your account. To complete the procedure click on the following link:\n\n%s\n\nIf it wasn\'t you who requested the password reset, simply ignore this email.",
'mail.recover_text' => 'Hi %s,<br>a password reset has been requested for your account. To complete the procedure click on the following link:<br><br><a href="%s">%s</a><br><br>If it wasn\'t you who requested the password reset, simply ignore this e-mail.',
'mail.recover_password' => '%s - Password Recovery',
'recover_email_sent' => 'If present, a recovery email was sent to the specified account.',
'recover_email_sent' => 'If present, a recovery e-mail was sent to the specified account.',
'account_activated' => 'Account activated, now you can login!',
'quota_enabled' => 'Enable user quota',
'password_repeat' => 'Repeat Password',
@ -146,12 +148,18 @@ return [
'only_recaptcha_v3' => 'Only reCAPTCHA v3 is supported.',
'recaptcha_site_key' => 'reCAPTCHA Site Key',
'recaptcha_secret_key' => 'reCAPTCHA Secret Key',
'send_notification' => 'Send Mail Notification',
'send_notification' => 'Send E-mail Notification',
'mail.new_account' => '%s - New Account Creation',
'mail.new_account_text_with_reset' => "Hi %s!\na new account was created for you on %s (%s), click on the following link to set a password and activate it:\n\n%s",
'mail.new_account_text_with_pw' => "Hi %s!\na new account was created for you on %s (%s), with the following credentials:\n\nUsername: %s\nPassword: %s\n\nClick on the following link to go to the login page:\n%s",
'user_create_password' => 'If leaved empty, you might want to send a notification to the user email.',
'mail.new_account_text_with_reset' => 'Hi %s!<br>a new account was created for you on %s (<a href="%s">%s</a>), click on the following link to set a password and activate it:<br><br><a href="%s">%s</a>',
'mail.new_account_text_with_pw' => 'Hi %s!<br>a new account was created for you on %s (<a href="%s">%s</a>), with the following credentials:<br><br>Username: %s<br>Password: %s<br><br>Click on the following link to go to the login page:<br><a href="%s">%s</a>',
'user_create_password' => 'If leaved empty, you might want to send a notification to the user e-mail address.',
'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'
'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',
'show_changelog' => 'Show changelog',
'image_embeds' => 'Embed images'
];

View file

@ -1,11 +1,11 @@
<?php
return [
'lang' => 'Spanish',
'yes' => 'Si',
'lang' => 'Español',
'yes' => 'Sí',
'no' => 'No',
'send' => 'Enviar',
'no_media' => 'Contenido no encontrado.',
'login.username' => 'Nombre de usuario o Correo Electrónico',
'login.username' => 'Nombre de usuario o correo electrónico',
'password' => 'Contraseña',
'login' => 'Iniciar sesión',
'username' => 'Nombre de usuario',
@ -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? ¡Será borrado para siempre!',
'public.delete_text' => '¿Está seguro que desea borrar este elemento? No vas a poder recuperarlo',
'preview' => 'Vista previa',
'filename' => 'Nombre del archivo',
'size' => 'Tamaño',
@ -33,7 +33,7 @@ return [
'files' => 'Archivos',
'orphaned_files' => 'Archivos huérfanos',
'theme' => 'Tema',
'click_to_load' => 'Clic para cargar...',
'click_to_load' => 'Clic para cargar',
'apply' => 'Aplicar',
'save' => 'Guardar',
'used' => 'Usado',
@ -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.',
@ -62,13 +62,13 @@ return [
'welcome' => '¡Bienvenido, %s!',
'goodbye' => '¡Adiós!',
'token_not_found' => 'Ficha indicada No encontrada.',
'email_required' => 'El Correo Electrónico es requisito.',
'email_taken' => 'El Correo Electrónico ya está en uso.',
'email_required' => 'El correo electrónico es requisito.',
'email_taken' => 'El correo electrónico ya está en uso.',
'username_required' => 'El Nombre de Usuario es requisito.',
'username_taken' => 'El Nombre de Usuario ya está en uso.',
'password_required' => 'La Contraseña es requisito.',
'user_created' => '¡Usuario "%s" creado!',
'user_updated' => '¡Usuario "%s" actualizado!',
'user_created' => '¡Usuario «%s» creado!',
'user_updated' => '¡Usuario «%s» actualizado!',
'profile_updated' => '¡Perfil actualizado con éxito!',
'user_deleted' => 'Usuario borrado.',
'cannot_delete' => 'No puede borrarse a usted mismo.',
@ -77,8 +77,8 @@ return [
'switch_to' => 'Cambiar a',
'gallery' => 'Galería',
'table' => 'Tabla',
'dotted_search' => 'Búsqueda...',
'order_by' => 'Ordenar por...',
'dotted_search' => 'Búsqueda',
'order_by' => 'Ordenar por',
'time' => 'Tiempo',
'name' => 'Nombre',
'maintenance' => 'Mantenimiento',
@ -90,7 +90,7 @@ return [
'check_for_updates' => 'Buscar actualizaciones',
'upgrade' => 'Mejorar',
'updates' => 'Actualizaciones',
'maintenance_in_progress' => 'Plataforma en mantenimiento, inténtelo más tarde...',
'maintenance_in_progress' => 'Plataforma en mantenimiento, inténtelo más tarde',
'cancel' => 'Cancelar',
'enforce_language' => 'Afirmar lenguaje',
'auto_set' => 'Establecer automáticamente',
@ -105,4 +105,66 @@ return [
'recaptcha_failed' => 'reCAPTCHA Falló',
'php_info' => 'Información PHP',
'system_settings' => 'Configuracion de Systema',
'mail.new_account' => '% s Creación de nueva cuenta',
'send_notification' => 'Enviar notificación por correo electrónico',
'mail.recover_password' => '% s Recuperación de contraseña',
'mail.activate_account' => '%s Activación de la cuenta',
'register_success' => 'La cuenta ha sido creada, se ha enviado un correo electrónico de confirmación.',
'donate_text' => 'Si te gusta XBackBone, considera una donación para apoyar el desarrollo!',
'donation' => 'Donación',
'drop_to_upload' => 'Haz clic o arrastra tus archivos aquí para subirlos.',
'no_upload_token' => 'No tienes una clave personal de carga. (Genera uno e inténtalo de nuevo.)',
'prerelease_channel' => 'Canal de prelanzamiento',
'clean_orphaned_uploads' => 'Limpiar las cargas de los huéspedes',
'cannot_demote' => 'No puedes degradarte.',
'copied' => '¡Copiado en el portapapeles!',
'quota_recalculated' => 'Cuota de usuario recalculada desde el disco con éxito.',
'recalculate_user_quota' => 'Recalcular la cuota de usuarios desde el disco',
'quota_enabled' => 'Activar la cuota de usuarios',
'show_changelog' => 'Mostrar el registro de cambios',
'changelog' => 'Registro de cambios',
'zip_ext_not_loaded' => 'La extensión zip requerida no está cargada',
'auto_tagging' => 'Carga automática de etiquetas',
'no_tags' => 'No se han añadido etiquetas',
'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>',
'recaptcha_enabled' => 'reCAPTCHA activado',
'account_media_deleted' => 'Se han eliminado todos los archivos de la cuenta.',
'clear_account' => 'Limpiar cuenta',
'delete_selected' => 'Eliminar seleccionado',
'used_space' => 'Espacio usado',
'password_restored' => 'Restablecimiento de la contraseña.',
'password_match' => 'La contraseña y la contraseña repetida deben ser las mismas.',
'password_repeat' => 'Repite la contraseñá',
'account_activated' => 'Cuenta activada, ¡ahora puedes iniciar sesión!',
'recover_email_sent' => 'Si está presente, se ha enviado un correo electrónico de recuperación a la cuenta especificada.',
'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',
'default_user_quota' => 'Cuota de usuarios por defecto',
'register' => 'Registrarse',
'no_account' => '¿No tienes cuenta?',
'password_recovery' => 'Recuperar contraseña',
'export_data' => 'Exportar datos',
'settings_saved' => '¡Configuración del sistema guardada!',
'copy_url_behavior' => 'Modo copiar URL',
'hide_by_default' => 'Ocultar media por defecto',
'register_enabled' => 'Registros abiertos',
'dont_close' => 'No cierres esta pestaña hasta que se haya completado.',
'please_wait' => 'Por favor, espera…',
'remember_me' => 'Recuerdame',
'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

@ -0,0 +1,29 @@
<?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' => 'نام فایل',
];

164
resources/lang/fi.lang.php Normal file
View file

@ -0,0 +1,164 @@
<?php
return [
'cannot_retrieve_file' => 'Tiedostoa ei voi palauttaa.',
'new_version_available' => 'Uusi versio %s saatavilla!',
'already_latest_version' => 'Sinulla on jo viimeisin versio.',
'path_not_writable' => 'Ei voida kirjoittaa kohteeseen.',
'clean_orphaned_uploads' => 'Siivoa hylätyt lataukset',
'maintenance' => 'Huoltokatko',
'name' => 'Nimi',
'time' => 'Aika',
'order_by' => 'Järjestä…',
'dotted_search' => 'Haku…',
'gallery' => 'Galleria',
'switch_to' => 'Vaihda',
'deleted_orphans' => '%d Unohdettua tiedostoa poistettu.',
'cannot_write_file' => 'Kohdepolku ei ole kirjoitettavissa.',
'token_not_found' => 'Määritettyä tunnusta ei löydy.',
'client_config' => 'Asiakasohjelman konfigurointi',
'home' => 'Koti',
'enforce_language' => 'Pakota kieli',
'cannot_demote' => 'Et voi alentaa itseäsi.',
'cannot_delete' => 'Et voi poistaa itseäsi.',
'user_deleted' => 'Käyttäjä poistettu.',
'profile_updated' => 'Profiilin päivitys onnistui!',
'user_updated' => 'Käyttäjä ”%s” on päivitetty!',
'user_created' => 'Käyttäjä ”%s” on luotu!',
'password_required' => 'Salasana vaaditaan.',
'username_taken' => 'Käyttäjänimi on jo käytössä.',
'username_required' => 'Käyttäjänimi vaaditaan.',
'email_taken' => 'Sähköpostiosoite on jo käytössä.',
'email_required' => 'Sähköposti vaaditaan.',
'goodbye' => 'Näkemiin!',
'welcome' => 'Tervetuloa %s!',
'account_disabled' => 'Sinun tilisi on jäädytetty.',
'bad_login' => 'Väärät kirjautumistiedot.',
'installed' => 'Asennus suoritettu loppuun onnistuneesti!',
'confirm_string' => 'Oletko varma?',
'confirm' => 'Vahvista',
'open' => 'Auki',
'none' => 'Ei mitään',
'reg_date' => 'Rekisteröitymis päivä',
'admin' => 'Järjestelmänvalvoja',
'active' => 'Aktiivinen',
'user_code' => 'Käyttäjän koodi',
'edit' => 'Muokkaa',
'update' => 'Päivitä',
'copied' => 'Kopioitu leikepöydälle!',
'copy' => 'Kopioi',
'token' => 'Tunnus',
'your_profile' => 'Sinun profiili',
'is_admin' => 'On järjestelmänvalvoja',
'is_active' => 'On aktiivinen',
'user.edit' => 'Muokkaa käyttäjää',
'user.create' => 'Luo käyttäjä',
'system_settings' => 'Järjestelmän asetukset',
'php_info' => 'PHP Informaatiot',
'used' => 'Käytetty',
'save' => 'Tallenna',
'apply' => 'Hyväksy',
'click_to_load' => 'Paina tästä ladataksesi.…',
'theme' => 'Teema',
'orphaned_files' => 'Unohdetut tiedostot',
'files' => 'Tiedostot',
'hide' => 'Piilota',
'publish' => 'Julkaise',
'delete' => 'Poista',
'upload' => 'Lähetä',
'download' => 'Lataa',
'raw' => 'Näytä alkuperäinen',
'date' => 'Päivämäärä',
'owner' => 'Omistaja',
'public' => 'Julkinen',
'size' => 'Koko',
'filename' => 'Tiedoston nimi',
'preview' => 'Esikatsele',
'public.delete_text' => 'Haluatko varmasti poistaa tämän tiedoston? Tiedostoa ei pysty palauttamaan',
'public.telegram' => 'Jaa Telegramissa',
'copy_link' => 'Kopioi linkki',
'pager.previous' => 'Edellinen',
'pager.next' => 'Seuraava',
'logout' => 'Kirjaudu ulos',
'profile' => 'Profiili',
'system' => 'Järjestelmä',
'users' => 'Käyttäjät',
'username' => 'Käyttäjänimi',
'login' => 'Kirjaudu',
'password' => 'Salasana',
'login.username' => 'Käyttäjänimi tai sähköpostiosoite',
'no_media' => 'Mediaa ei löytynyt.',
'send' => 'Lähetä',
'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

@ -1,15 +1,15 @@
<?php
return [
'lang' => 'French',
'lang' => 'Français',
'yes' => 'Oui',
'no' => 'Non',
'send' => 'Envoyer',
'no_media' => 'Pas de média trouvé.',
'login.username' => 'Nom d\'utilisateur ou E-mail',
'no_media' => 'Aucun média trouvé.',
'login.username' => 'Nom d\'utilisateur ou courriel',
'password' => 'Mot de passe',
'login' => 'Identification',
'login' => 'Connexion',
'username' => 'Nom d\'utilisateur',
'home' => 'Menu',
'home' => 'Accueil',
'users' => 'Utilisateurs',
'system' => 'Système',
'profile' => 'Profil',
@ -18,96 +18,149 @@ return [
'pager.previous' => 'Précédent',
'copy_link' => 'Copier le lien',
'public.telegram' => 'Partager via Telegram',
'public.delete_text' => 'Etes-vous sûr de vouloir supprimer ce fichier ? Il disparaitra pour toujours !',
'public.delete_text' => 'Êtes-vous sûr·e de vouloir supprimer ce fichier? Vous ne pourrez pas le récupérer',
'preview' => 'Aperçu',
'filename' => 'Nom de fichier',
'size' => 'Taille',
'public' => 'Publique',
'public' => 'Public',
'owner' => 'Propriétaire',
'date' => 'Date',
'raw' => 'Montrer le texte brut',
'raw' => 'Version brute',
'download' => 'Télécharger',
'delete' => 'Supprimer',
'publish' => 'Publier',
'hide' => 'Cacher',
'files' => 'Fichiers',
'orphaned_files' => 'Fichiers orphelins.',
'orphaned_files' => 'Fichiers orphelins',
'theme' => 'Thème',
'click_to_load' => 'Cliquer pour charger...',
'click_to_load' => 'Cliquer pour charger',
'apply' => 'Appliquer',
'save' => 'Sauvegarder',
'used' => 'Utilisé',
'system_info' => 'Informations du système',
'user.create' => 'Créer un utilisateur',
'user.edit' => 'Editer l\'utilisateur',
'user.edit' => 'Modifier l\'utilisateur',
'is_active' => 'Est actif',
'is_admin' => 'Est administrateur',
'your_profile' => 'Votre profil',
'token' => 'Jeton',
'copy' => 'Copier',
'update' => 'Mettre à jour',
'edit' => 'Editer',
'edit' => 'Modifier',
'client_config' => 'Configuration du client',
'user_code' => 'Code de l\'utilisateur',
'active' => 'Actif',
'admin' => 'Administrateur',
'reg_date' => 'Date d\'enregistrement',
'reg_date' => 'Date d\'inscription',
'none' => 'Aucun',
'open' => 'Ouvert',
'confirm' => 'Confirmation',
'confirm_string' => 'Etes-vous sûr ?',
'installed' => 'L\'installation s\'est déroulée avec succès!',
'bad_login' => 'Mauvais identifiants.',
'open' => 'Ouvrir',
'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.',
'account_disabled' => 'Votre compte est désactivé.',
'table' => 'Table',
'dotted_search' => 'Rechercher...',
'order_by' => 'Trier par...',
'table' => 'Tableau',
'dotted_search' => 'Rechercher',
'order_by' => 'Trier par',
'time' => 'Temps',
'name' => 'Nom',
'maintenance' => 'Maintenance',
'clean_orphaned_uploads' => 'Nettoyer les fichiers orphelins',
'path_not_writable' => 'Le dossier en sortie ne peut être écrit.',
'path_not_writable' => 'Le chemin de sortie n\'est pas accessible en écriture.',
'already_latest_version' => 'Vous avez déjà la dernière version.',
'new_version_available' => 'La nouvelle version %s est disponible!',
'new_version_available' => 'La nouvelle version %s est disponible!',
'cannot_retrieve_file' => 'Impossible de retrouver le fichier.',
'file_size_no_match' => 'Le fichier téléchargé n\'a pas la taille correcte.',
'check_for_updates' => 'Vérifier les mises à jour',
'upgrade' => 'Mettre à jour',
'upgrade' => 'Mettre à niveau',
'updates' => 'Mises à jour',
'maintenance_in_progress' => 'Plateforme en maintenance, réessayez plus tard...',
'maintenance_in_progress' => 'Plateforme en maintenance, réessayez plus tard',
'cancel' => 'Annuler',
'enforce_language' => 'Forcer la langue',
'auto_set' => 'Définir automatiquement',
'default_lang_behavior' => 'XBackBone va essayer de trouver la langue par défaut du navigateur (l\'Anglais en recours).',
'lang_set' => 'Langue du système forcée en "%s"',
'prerelease_channel' => 'Canal de pré-distribution',
'upload' => 'Envoyer',
'no_upload_token' => 'Vous n\'avez pas un jeton personnel d\'envoi. ( Générez-en un et réessayer.)',
'drop_to_upload' => 'Cliquer ou déposer vos fichiers ici pour les envoyer.',
'upload' => 'Téléverser',
'no_upload_token' => 'Vous n\'avez pas de jeton personnel d\'envoi. (Générez-en un et réessayer.)',
'drop_to_upload' => 'Cliquez ou déposez vos fichiers ici pour les téléverser.',
'donation' => 'Don',
'donate_text' => 'Si vous aimez XBackBone, pensez à donner pour soutenir le développement!',
'donate_text' => 'Si vous aimez XBackBone, pensez à faire un don pour soutenir le développement!',
'custom_head_html' => 'En-tête de contenu HTML personnalisé',
'custom_head_html_hint' => 'Ce contenu sera ajouté à la balise <head> dans chaque page.',
'custom_head_set' => 'En-tête HTML personnalisé appliqué.',
'remember_me' => 'Se souvenir de moi',
'please_wait' => 'Veuillez patienter…',
'dont_close' => 'Ne fermez pas cette fenêtre jusqu\'à complétion.',
'welcome' => 'Bienvenue, %s!',
'goodbye' => 'Au revoir!',
'token_not_found' => 'Le token spécifié n\'a pas été trouvé.',
'email_required' => 'Une adresse e-mail est requise.',
'email_taken' => 'L\'adresse e-mail est déjà utilisée.',
'username_required' => 'Un nom d\'utilisateur est requis.',
'welcome' => 'Bienvenue, %s !',
'goodbye' => 'Au revoir !',
'token_not_found' => 'Le jeton spécifié n\'a pas été trouvé.',
'email_required' => 'L\'adresse courriel est requise.',
'email_taken' => 'L\'adresse courriel est déjà utilisée.',
'username_required' => 'Le nom d\'utilisateur est requis.',
'username_taken' => 'Le nom d\'utilisateur est déjà utilisé.',
'password_required' => 'Le mot de passe est requis.',
'user_created' => 'L\'utilisateur"%s" à été créé !',
'user_updated' => 'L\'utilisateur"%s" à été mis à jour!',
'profile_updated' => 'Profil mis-à-jour avec succès!',
'user_deleted' => 'Utilisateur Supprimé.',
'user_created' => 'L\'utilisateur « %s » a été créé !',
'user_updated' => 'L\'utilisateur « %s » a été mis à jour !',
'profile_updated' => 'Profil mis à jour avec succès!',
'user_deleted' => 'Utilisateur supprimé.',
'cannot_delete' => 'Vous ne pouvez pas vous supprimer.',
'cannot_demote' => 'Vous ne pouvez pas vous rétrograder.',
'cannot_write_file' => 'Le chemin de destination n\'est pas accessible en écriture.',
'deleted_orphans' => 'Fichiers orphelins supprimés avec succès.',
'switch_to' => 'Changer à',
'deleted_orphans' => '%d fichier(s) orphelin(s) supprimé(s) avec succès.',
'switch_to' => 'Afficher en',
'gallery' => 'Galerie',
'no_tags' => 'Aucun tag ajouté',
'upload_max_file_size' => 'La taille maximale du fichier est actuellement %s.',
'ldap_cant_connect' => 'Impossible de se connecter au serveur d\'authentification LDAP.',
'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',
'send_notification' => 'Envoyer une notification par courriel',
'recaptcha_secret_key' => 'Clé secrète reCAPTCHA',
'recaptcha_site_key' => 'Clé du site reCAPTCHA',
'only_recaptcha_v3' => 'Seul reCAPTCHA v3 est pris en charge.',
'recaptcha_keys_required' => 'Toutes les clés reCAPTCHA sont requises.',
'recaptcha_enabled' => 'reCAPTCHA activé',
'recaptcha_failed' => 'reCAPTCHA échoué',
'danger_zone' => 'Zone dangereuse',
'account_media_deleted' => 'Tous les médias du compte ont été supprimés.',
'clear_account' => 'Effacer le compte',
'delete_all' => 'Supprimer tout',
'delete_selected' => 'Supprimer la selection',
'used_space' => 'Espace utilisé',
'quota_recalculated' => 'Quota utilisateur recalculé à partir du disque avec succès.',
'recalculate_user_quota' => 'Recalculer le quota utilisateur à partir du disque',
'password_restored' => 'Réinitialisation du mot de passe.',
'password_match' => 'Le mot de passe et le mot de passe de répétition doivent être identiques.',
'password_repeat' => 'Répéter le mot de passe',
'quota_enabled' => 'Activer le quota d\'utilisateurs',
'account_activated' => 'Compte activé, vous pouvez maintenant vous connecter!',
'recover_email_sent' => 'S\'il est présent, un courriel de récupération a été envoyé au compte spécifié.',
'mail.recover_password' => '%s Récupération de mot de passe',
'mail.activate_account' => '%s Activation du compte',
'invalid_quota' => 'Valeurs non valides comme quota utilisateur par défaut.',
'max_user_quota' => 'Quota utilisateur maximum',
'default_user_quota' => 'Quota utilisateur par défaut',
'register_success' => 'Le compte a été créé, un courriel de confirmation a été envoyé.',
'register' => 'S\'inscrire',
'no_account' => 'Vous n\'avez pas de compte?',
'password_recovery' => 'Récupérer mot de passe',
'export_data' => 'Exporter les données',
'settings_saved' => 'Paramètres système enregistrés!',
'copy_url_behavior' => 'Mode copier l\'URL',
'hide_by_default' => 'Masquer les médias par défaut',
'register_enabled' => 'Inscriptions activées',
'system_settings' => 'Paramètres système',
'php_info' => 'Informations PHP',
'auto_tagging' => 'Étiquetage automatique du téléversement',
'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>',
'mail.activate_text' => 'Bonjour %s !<br> merci d\'avoir créé votre compte sur %s (<a href="%s">%s </a>), cliquez sur le lien suivant pour l\'activer : <br> <br> <a href = "%s">',
'mail.new_account_text_with_reset' => 'Bonjour %s ! <br>un nouveau compte a été créé pour vous sur %s (<a href="%s">%s</a>), cliquez sur le lien suivant pour définir un mot de passe et l\'activer : <br> <br> <a href="%s">%s</a>',
'mail.recover_text' => 'Bonjour %s, <br> une réinitialisation du mot de passe a été demandée pour votre compte, pour terminer la procédure, cliquez sur le lien suivant : <br> <br> <a href="%s">%s </a> <br> <br> Si ce n\'est pas vous qui avez demandé la réinitialisation du mot de passe, ignorer ce courriel.',
'show_changelog' => 'Afficher le journal des changements',
'changelog' => 'Journal des changements',
'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

@ -0,0 +1,164 @@
<?php
return [
'profile_updated' => 'Profil mis à jour avec succès!',
'user_updated' => 'L\'utilisateur « %s » a été mis à jour!',
'user_created' => 'L\'utilisateur « %s » a été créé!',
'goodbye' => 'Au revoir!',
'welcome' => 'Bienvenue, %s!',
'installed' => 'L\'installation s\'est déroulée avec succès!',
'no_account' => 'Vous n\'avez pas de compte?',
'confirm_string' => 'Êtes-vous sûr·e?',
'public.delete_text' => 'Êtes-vous sûr·e de bien vouloir supprimer ce fichier? Vous ne pourrez pas le récupérer',
'show_changelog' => 'Afficher le journal des changements',
'changelog' => 'Journal des changements',
'zip_ext_not_loaded' => 'L\'extension zip requise n\'est pas chargée',
'auto_tagging' => 'Étiquetage automatique du téléversement',
'no_tags' => 'Aucun tag ajouté',
'upload_max_file_size' => 'La taille maximale du fichier est actuellement %s.',
'ldap_cant_connect' => 'Impossible de se connecter au serveur d\'authentification LDAP.',
'send_notification' => 'Envoyer une notification par courriel',
'recaptcha_secret_key' => 'Clé secrète reCAPTCHA',
'recaptcha_site_key' => 'Clé du site reCAPTCHA',
'only_recaptcha_v3' => 'Seul reCAPTCHA v3 est pris en charge.',
'recaptcha_keys_required' => 'Toutes les clés reCAPTCHA sont requises.',
'recaptcha_enabled' => 'reCAPTCHA activé',
'recaptcha_failed' => 'reCAPTCHA échouée',
'danger_zone' => 'Zone dangereuse',
'account_media_deleted' => 'Tous les médias du compte ont été supprimés.',
'clear_account' => 'Effacer le compte',
'delete_all' => 'Supprimer tout',
'delete_selected' => 'Supprimer sélectionnée',
'max_user_quota' => 'Quota utilisateur maximum',
'used_space' => 'Espace utilisé',
'quota_recalculated' => 'Quota utilisateur recalculé à partir du disque avec succès.',
'recalculate_user_quota' => 'Recalculer le quota utilisateur à partir du disque',
'password_restored' => 'Réinitialisation du mot de passe.',
'password_match' => 'Le mot de passe et le mot de passe de répétition doivent être identiques.',
'password_repeat' => 'Répéter le mot de passe',
'quota_enabled' => 'Activer le quota d\'utilisateurs',
'mail.recover_text' => 'Bonjour %s, <br> une réinitialisation du mot de passe a été demandée pour votre compte, pour terminer la procédure, cliquez sur le lien suivant : <br> <br> <a href="%s">%s </a> <br> <br> Si ce n\'est pas vous qui avez demandé la réinitialisation du mot de passe, ignorer ce courriel.',
'register_success' => 'Le compte a été créé, un courriel de confirmation a été envoyé.',
'mail.activate_text' => 'Bonjour %s!<br> merci d\'avoir créé votre compte sur %s (<a href="%s">%s </a>), cliquez sur le lien suivant pour l\'activer : <br> <br> <a href = "%s">',
'invalid_quota' => 'Valeurs non valides comme quota utilisateur par défaut.',
'default_user_quota' => 'Quota utilisateur par défaut',
'register' => 'S\'inscrire',
'password_recovery' => 'Récupérer mot de passe',
'export_data' => 'Exporter les données',
'copy_url_behavior' => 'Mode copier l\'URL',
'hide_by_default' => 'Masquer les médias par défaut',
'register_enabled' => 'Inscriptions activées',
'system_settings' => 'Paramètres système',
'php_info' => 'Informations PHP',
'dont_close' => 'Ne fermez pas cette fenêtre jusqu\'à complétion.',
'please_wait' => 'Veuillez patienter…',
'remember_me' => 'Se souvenir de moi',
'custom_head_set' => 'En-tête HTML personnalisé appliqué.',
'custom_head_html_hint' => 'Ce contenu sera ajouté à la balise <head> dans chaque page.',
'custom_head_html' => 'En-tête de contenu HTML personnalisé',
'donation' => 'Don',
'drop_to_upload' => 'Cliquer ou déposer vos fichiers ici pour les téléverser.',
'no_upload_token' => 'Vous n\'avez pas de jeton personnel de téléversement. (Générez-en un et réessayer.)',
'prerelease_channel' => 'Canal de pré-distribution',
'default_lang_behavior' => 'XBackBone va essayer de trouver la langue par défaut du navigateur (l\'Anglais en recours).',
'auto_set' => 'Définir automatiquement',
'cancel' => 'Annuler',
'maintenance_in_progress' => 'Plateforme en maintenance, réessayez plus tard…',
'updates' => 'Mises à 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.',
'already_latest_version' => 'Vous avez déjà la dernière version.',
'path_not_writable' => 'Le dossier en sortie ne peut être écrit.',
'clean_orphaned_uploads' => 'Nettoyer les téléversements orphelins',
'name' => 'Nom',
'time' => 'Temps',
'order_by' => 'Trier par…',
'dotted_search' => 'Rechercher…',
'table' => 'Table',
'gallery' => 'Galerie',
'switch_to' => 'Changer à',
'deleted_orphans' => 'Fichiers orphelins supprimés avec succès.',
'cannot_write_file' => 'Le chemin de destination n\'est pas accessible en écriture.',
'cannot_demote' => 'Vous ne pouvez pas vous rétrograder.',
'cannot_delete' => 'Vous ne pouvez pas vous supprimer.',
'user_deleted' => 'Utilisateur Supprimé.',
'password_required' => 'Le mot de passe est requis.',
'username_taken' => 'Le nom d\'utilisateur est déjà utilisé.',
'username_required' => 'Le nom d\'utilisateur est requis.',
'email_taken' => 'L\'adresse courriel est déjà utilisée.',
'email_required' => 'L\'adresse courriel est requise.',
'token_not_found' => 'Le jeton spécifié n\'a pas été trouvé.',
'account_disabled' => 'Votre compte est désactivé.',
'bad_login' => 'Mauvais identifiants.',
'open' => 'Ouvert',
'none' => 'Aucun',
'reg_date' => 'Date d\'inscription',
'admin' => 'Administrateur',
'active' => 'Actif',
'user_code' => 'Code de l\'utilisateur',
'client_config' => 'Configuration du client',
'edit' => 'Modifier',
'update' => 'Mettre à jour',
'copy' => 'Copier',
'token' => 'Jeton',
'your_profile' => 'Votre profil',
'is_admin' => 'Est administrateur',
'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',
'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',
'mail.activate_account' => '%s Activation du compte',
'recover_email_sent' => 'S\'il est présent, un courriel de récupération a été envoyé au compte spécifié.',
'mail.new_account_text_with_reset' => 'Bonjour %s! <br>un nouveau compte a été créé pour vous sur %s (<a href="%s">% s </a>), cliquez sur le lien suivant pour définir un mot de passe et l\'activer : <br> <br> <a href="%s">% </a>',
'account_activated' => 'Compte activé, vous pouvez maintenant vous connecter!',
'settings_saved' => 'Paramètres système enregistrés!',
'donate_text' => 'Si vous aimez XBackBone, pensez à faire un don pour soutenir le développement!',
'new_version_available' => 'La nouvelle version %s est disponible!',
'is_active' => 'Est actif',
'user.edit' => 'Modifier l\'utilisateur',
'user.create' => 'Créer un utilisateur',
'used' => 'Utilisé',
'save' => 'Sauvegarder',
'apply' => 'Appliquer',
'click_to_load' => 'Cliquer pour charger…',
'theme' => 'Thème',
'orphaned_files' => 'Fichiers orphelins',
'files' => 'Fichiers',
'hide' => 'Cacher',
'publish' => 'Publier',
'delete' => 'Supprimer',
'upload' => 'Téléverser',
'download' => 'Télécharger',
'raw' => 'Montrer le texte brut',
'date' => 'Date',
'owner' => 'Propriétaire',
'public' => 'Publique',
'size' => 'Taille',
'filename' => 'Nom de fichier',
'preview' => 'Aperçu',
'public.telegram' => 'Partager via Telegram',
'copy_link' => 'Copier le lien',
'pager.previous' => 'Précédent',
'pager.next' => 'Suivant',
'logout' => 'Se déconnecter',
'profile' => 'Profil',
'system' => 'Système',
'users' => 'Utilisateurs',
'home' => 'Accueil',
'username' => 'Nom d\'utilisateur',
'login' => 'Se connecter',
'password' => 'Mot de passe',
'login.username' => 'Nom d\'utilisateur ou courriel',
'no_media' => 'Aucun média trouvé.',
'send' => 'Envoyer',
'no' => 'Non',
'yes' => 'Oui',
'enforce_language' => 'Forcer la langue',
'copied' => 'Copié dans le presse-papier!',
'image_embeds' => 'Intégrer des images',
'vanity_url' => 'URL personnalisée',
];

View file

@ -0,0 +1,66 @@
<?php
return [
'account_disabled' => 'योर अकाउंट इस दिसब्लेंड.',
'bad_login' => 'रॉंग क्रेडेंशियल्स.',
'installed' => 'इंस्टालेशन कम्प्लेटेड सक्सेसफुल्ली!',
'confirm_string' => 'अरे यू सूरे?',
'confirm' => 'कन्फर्मेशन',
'open' => 'ओपन',
'none' => 'नोने',
'reg_date' => 'रजिस्ट्रेशन डेट',
'admin' => 'एडमिन',
'active' => 'एक्टिव',
'user_code' => 'यूजर कोड',
'client_config' => 'क्लाइंट कन्फगुरेशन',
'edit' => 'एडिट',
'update' => 'अपडेट',
'copied' => 'कॉपीएड तो क्लिपबोर्ड!',
'copy' => 'कॉपी',
'token' => 'टोकन',
'your_profile' => 'योर प्रोफाइल',
'is_admin' => 'इस एडमिनिस्ट्रेटर',
'is_active' => 'इस एक्टिव',
'user.edit' => 'एडिट यूजर',
'user.create' => 'क्रिएट यूजर',
'system_settings' => 'सिस्टम सेटिंग्स',
'php_info' => 'फप्टो इनफार्मेशन्स',
'used' => 'ुसेड',
'save' => 'सेव',
'apply' => 'अप्लाई',
'click_to_load' => 'क्लिक तो लोड…',
'theme' => 'थीम',
'orphaned_files' => 'औरफानेड फाइल्स',
'files' => 'फाइल्स',
'hide' => 'हाईड',
'publish' => 'पब्लिश',
'delete' => 'डिलीट',
'upload' => 'अपलोड',
'download' => 'डाउनलोड',
'raw' => 'शो राव',
'date' => 'डेट',
'owner' => 'ओनर',
'public' => 'पब्लिक',
'size' => 'साइज',
'filename' => 'फिलेनामे',
'preview' => 'परिव्यु',
'public.delete_text' => 'अरे यू सूरे यू वांटेड तो डिलीट थिस आइटम? यू विल नोट बे अबले तो रिकवर इतना',
'public.telegram' => 'शेयर ऑन टेलीग्राम',
'copy_link' => 'कॉपी लिंक',
'pager.previous' => 'प्रीवियस',
'pager.next' => 'नेक्स्ट',
'logout' => 'लॉगआउट',
'profile' => 'प्रोफाइल',
'system' => 'सिस्टम',
'users' => 'उसेर्स',
'home' => 'Home',
'username' => 'यूजरनाम',
'login' => 'लॉगिन',
'password' => 'पासवर्ड',
'login.username' => 'यूज़रनेम या ईमेल',
'no_media' => 'नो मीडिया फाउंड.',
'send' => 'सेंड',
'no' => 'नो',
'yes' => 'यस',
'enforce_language' => 'इनफ़ोर्स लैंग्वेज',
'lang' => 'हिंदी',
];

164
resources/lang/hu.lang.php Normal file
View file

@ -0,0 +1,164 @@
<?php
return [
'user_create_password' => 'Ha ezt üresen hagyod, akkor érdemes értesítést küldeni a felhasználónak e-mailben.',
'clean_orphaned_uploads' => 'Tiszta maradványfájl feltöltések',
'clear_account' => 'Fiók adatainak törlése',
'show_changelog' => 'Változási napló mutatása',
'changelog' => 'Változási napló',
'zip_ext_not_loaded' => 'A szükséges "zip" kiterjesztés nincs betöltve',
'auto_tagging' => 'Automatikus feltöltési címkézés',
'no_tags' => 'Nincs hozzáadott címke',
'upload_max_file_size' => 'A maximális fájlméret jelenleg %s.',
'ldap_cant_connect' => 'Nem lehet csatlakozni az LDAP hitelesítő kiszolgálóhoz.',
'mail.new_account_text_with_pw' => 'Szia %s!<br>Az új fiókod elkészült %s (<a href="%s">%s</a>), a következő hitelesítési adatokkal:<br><br>Felhasználónév: %s<br>Jelszó: %s<br><br>Kattints a következő linkre, hogy a bejelentkezési oldalra ugorj:<br><a href="%s">%s</a>',
'mail.new_account_text_with_reset' => 'Szia %s!<br>Az új fiókod elkészült %s (<a href="%s">%s</a>), Kattints a következő linkre a jelszó beállításához és az aktiváláshoz:<br><br><a href="%s">%s</a>',
'mail.new_account' => '%s - Új fiók létrehozása',
'send_notification' => 'E-mail értesítés küldése',
'recaptcha_secret_key' => 'reCAPTCHA titkos kulcs',
'recaptcha_site_key' => 'reCAPTCHA oldal kulcs',
'only_recaptcha_v3' => 'Csak a reCAPTCHA v3 támogatott.',
'recaptcha_keys_required' => 'Az összes reCAPTCHA kulcs szükséges.',
'recaptcha_enabled' => 'reCAPTCHA engedélyezve',
'recaptcha_failed' => 'reCAPTCHA nem sikerült',
'danger_zone' => 'Veszélyes zóna',
'account_media_deleted' => 'Az összes fájl törölve lett a fiókból.',
'delete_all' => 'Összes törlése',
'delete_selected' => 'Kiválasztottak törlése',
'used_space' => 'Felhasznált hely',
'quota_recalculated' => 'Felhasználói kvóta újraszámolása a lemezen, sikeresen megtörtént.',
'recover_email_sent' => 'Ha adtál meg, a visszaállítási e-mail-t elküldtök a fiókodnak.',
'recalculate_user_quota' => 'Felhasználói kvóta újraszámolása a lemezen',
'password_restored' => 'Jelszó visszaállítás.',
'password_match' => 'A jelszavaknak egyezniük kell.',
'password_repeat' => 'Jelszó mégegyszer',
'quota_enabled' => 'Felhasználói kvóta engedélyezése',
'account_activated' => 'Fiók aktiválva, most már beléphetsz!',
'mail.recover_password' => '%s - Jelszó visszaállítás',
'mail.recover_text' => 'Szia %s,<br>jelszó-visszaállítási kérelem érkezett a fiókodtól. A folyamat befejezéséhez kattints a következő linkre:<br><br><a href="%s">%s</a><br><br>Ha nem te kértél jelszó-visszaállítást, akkor ne foglalkozz ezzel az e-mail-el.',
'mail.activate_account' => '%s - Fiók aktiválása',
'mail.activate_text' => 'Szia! %s!<br>Köszönöm, hogy készítettél egy fiókot %s (<a href="%s">%s</a>),kattints a következő linkre az aktiváláshoz:<br><br><a href="%s">%s</a>',
'invalid_quota' => 'Érvénytelen értékek alapértelmezett felhasználói kvótaként.',
'max_user_quota' => 'Maximum Felhasználói kvóta',
'default_user_quota' => 'Alapértelmezett Felhasználói kvóta',
'register_success' => 'Az fiók elkészült, a visszaigazoló emailt elküldtük.',
'register' => 'Regisztrálás',
'no_account' => 'Nincs fiókod?',
'password_recovery' => 'Jelszó visszaállítása',
'export_data' => 'Adat exportálása',
'settings_saved' => 'Rendszerbeállítások mentve!',
'copy_url_behavior' => 'URL másolás mód',
'hide_by_default' => 'A média elrejtése alapértelmezés szerint',
'register_enabled' => 'A regisztráció engedélyezve van',
'dont_close' => 'Ne zárd be ezt a lapot, amíg a folyamat nem fejeződik be.',
'please_wait' => 'Kérlek várj…',
'remember_me' => 'Emlékezz rám',
'custom_head_set' => 'Egyedi HTML head hozzáadva.',
'custom_head_html' => 'Egyedi HTML head tartalom',
'custom_head_html_hint' => 'Ez a tartalom hozzá lesz adva <head> részhez minden oldalon.',
'donate_text' => 'Ha kedveled az XBackBone-t, fontold meg a fejlesztés támogatását!',
'donation' => 'Támogatás',
'drop_to_upload' => 'Kattints, vagy helyezd ide a fájljaidat a feltöltéshez.',
'no_upload_token' => 'Nem rendelkezel feltöltési tokennel. (Generálj egyet és próbáld újra.)',
'prerelease_channel' => 'Előzetes csatorna',
'default_lang_behavior' => 'Az XBackBone mepróbálja a nyelvet a böngésző nyelvére állítani.',
'auto_set' => 'Automatikus beállítás',
'cancel' => 'Mégse',
'maintenance_in_progress' => 'A felület karbantartás alatt áll, próbáld később…',
'updates' => 'Frissítések',
'upgrade' => 'Frissítés',
'check_for_updates' => 'Frissítések keresése',
'file_size_no_match' => 'A letöltött fájl mérete nem egyezik meg.',
'cannot_retrieve_file' => 'Nem hozhatod vissza a fájlokat.',
'new_version_available' => 'Új verzió %s elérhető!',
'already_latest_version' => 'A legfrissebb verzióval rendelkezel.',
'path_not_writable' => 'A kimeneti elérési út nem írható.',
'cannot_write_file' => 'A cél elérési út nem írható.',
'maintenance' => 'Karbantartás',
'name' => 'Név',
'time' => 'Idő',
'order_by' => 'Rendezés…',
'dotted_search' => 'Keresés…',
'table' => 'Táblázat',
'gallery' => 'Galéria',
'switch_to' => 'Váltás a',
'deleted_orphans' => 'Sikeresen törölve lettek a %d maradványfájlok.',
'cannot_demote' => 'Nem fokozhatod le magad.',
'cannot_delete' => 'Nem törölheted magad.',
'user_deleted' => 'Felhasználó törölve.',
'profile_updated' => 'A profil sikeresen frissítve lett!',
'user_updated' => '"%s" felhasználó frissítve lett!',
'user_created' => '"%s" felhasználó elkészült!',
'password_required' => 'Jelszó szükséges.',
'username_taken' => 'A felhasználónév foglalt.',
'username_required' => 'Felhasználónév szükséges.',
'email_taken' => 'Az e-mail cím már használatban van.',
'email_required' => 'E-mail cím szükséges.',
'token_not_found' => 'A megadott token nem található.',
'goodbye' => 'Viszlát!',
'welcome' => 'Üdvözöllek, %s!',
'account_disabled' => 'A fiókod tiltva van.',
'bad_login' => 'Helytelen hitelesítő adatok.',
'installed' => 'A telepítés sikeresen befejeződött!',
'confirm_string' => 'Biztos vagy benne?',
'confirm' => 'Jóváhagyás',
'open' => 'Nyitva',
'none' => 'Senki',
'reg_date' => 'Regisztráció dátuma',
'admin' => 'Rendszergazda',
'active' => 'Aktív',
'user_code' => 'Felhasználói kód',
'client_config' => 'Kliens konfigurálása',
'edit' => 'Szerkesztés',
'update' => 'Frissítés',
'copied' => 'Vágólapra másolva!',
'copy' => 'Másolás',
'token' => 'Token',
'your_profile' => 'Profilod',
'is_admin' => 'Adminisztrátor',
'is_active' => 'Aktív',
'user.edit' => 'Felhasználó szerkesztése',
'user.create' => 'Felhasználó létrehozása',
'system_settings' => 'Rendszerbeállítások',
'php_info' => 'PHP Információk',
'used' => 'Használt',
'save' => 'Mentés',
'apply' => 'Alkalmaz',
'click_to_load' => 'Kattints a feltöltéshez…',
'theme' => 'Téma',
'orphaned_files' => 'Maradványfájlok',
'files' => 'Fájlok',
'hide' => 'Elrejt',
'publish' => 'Közzététel',
'delete' => 'Törlés',
'upload' => 'Feltöltés',
'download' => 'Letöltés',
'raw' => 'Nyers mutatása',
'date' => 'Dátum',
'owner' => 'Tulajdonos',
'public' => 'Nyilvános',
'size' => 'Méret',
'filename' => 'Fájlnév',
'preview' => 'Előnézet',
'public.delete_text' => 'Biztos vagy benne, hogy törölni akarod ezt az elemet? Nem fogod tudni visszaállítani',
'public.telegram' => 'Megosztás Telegramon',
'copy_link' => 'Link másolása',
'pager.previous' => 'Előző',
'pager.next' => 'Következő',
'logout' => 'Kilépés',
'profile' => 'Profil',
'system' => 'Rendszer',
'users' => 'Felhasználók',
'home' => 'Otthon',
'username' => 'Felhasználónév',
'login' => 'Belépés',
'password' => 'Jelszó',
'login.username' => 'Felhasználónév vagy E-mail cím',
'no_media' => 'Nem található média fájl.',
'send' => 'Küldés',
'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',
];

164
resources/lang/id.lang.php Normal file
View file

@ -0,0 +1,164 @@
<?php
return [
'clean_orphaned_uploads' => 'Hapus Unggahan Berkas Tunggal',
'maintenance' => 'Sedang dalam perbaikan',
'name' => 'Nama',
'time' => 'Pukul',
'order_by' => 'Urutkan berdasarkan…',
'dotted_search' => 'Cari…',
'table' => 'Tabel',
'gallery' => 'Galeri',
'switch_to' => 'Pindah ke',
'deleted_orphans' => 'Berkas tunggal %d berhasil dihapus.',
'cannot_write_file' => 'Destinasi berkas tidak dapat ditulis.',
'cannot_demote' => 'Anda takbisa memecat diri sendiri.',
'cannot_delete' => 'Anda tidak bisa menghapus diri sendiri.',
'user_deleted' => 'Pengguna dihapus.',
'profile_updated' => 'Pembaruan profil berhasil!',
'user_updated' => 'Pengguna “%s” diperbarui!',
'user_created' => 'Pengguna “%s” telah dibuat!',
'password_required' => 'Kata sandi dibutuhkan.',
'username_taken' => 'Nama pengguna telah dipakai.',
'username_required' => 'Nama pengguna diperlukan.',
'email_taken' => 'Surel sudah dipakai.',
'email_required' => 'Surel dibutuhkan.',
'token_not_found' => 'Token tidak ditemukan.',
'goodbye' => 'Sampai bertemu kembali!',
'welcome' => 'Selamat datang, %s!',
'account_disabled' => 'Akun telah dinonaktifkan.',
'bad_login' => 'Kesalahan mandat.',
'installed' => 'Pemasangan berhasil!',
'confirm_string' => 'Apa Anda yakin?',
'confirm' => 'Konfirmasi',
'open' => 'Buka',
'none' => 'Kosong',
'reg_date' => 'Tanggal Daftar',
'admin' => 'Admin',
'active' => 'Aktif',
'user_code' => 'Kode pengguna',
'client_config' => 'Konfigurasi klien',
'edit' => 'Ubah',
'update' => 'Perbarui',
'copy' => 'Salin',
'token' => 'Token',
'your_profile' => 'Profil Anda',
'is_admin' => 'Adalah admin',
'is_active' => 'Sedang aktif',
'user.edit' => 'Ubah pengguna',
'user.create' => 'Buat pengguna',
'system_settings' => 'Pengaturan Sistem',
'php_info' => 'Informasi PHP',
'used' => 'Digunakan',
'save' => 'Simpan',
'apply' => 'Terapkan',
'click_to_load' => 'Klik untuk memuat …',
'theme' => 'Tema',
'orphaned_files' => 'Berkas tunggal',
'files' => 'Berkas',
'hide' => 'Sembunyikan',
'publish' => 'Terbitkan',
'delete' => 'Hapus',
'upload' => 'Unggah',
'download' => 'Unduh',
'raw' => 'Lihat mentahan',
'date' => 'Tanggal',
'owner' => 'Pemilik',
'public' => 'Publik',
'size' => 'Ukuran',
'filename' => 'Nama berkas',
'preview' => 'Pratinjau',
'public.delete_text' => 'Anda yakin ingin menghapusnya? Jika iya, berkas takbisa dipulihkan kembali',
'public.telegram' => 'Bagikan ke Telegram',
'copy_link' => 'Salin taut',
'pager.previous' => 'Sebelumnya',
'pager.next' => 'Selanjutnya',
'logout' => 'Keluar',
'profile' => 'Profil',
'system' => 'Sistem',
'users' => 'Pengguna',
'home' => 'Beranda',
'username' => 'Nama panggilan',
'login' => 'Masuk',
'password' => 'Kata sandi',
'login.username' => 'Nama panggilan atau surel',
'no_media' => 'Media tidak ditemukan.',
'send' => 'Kirim',
'no' => 'Tidak',
'yes' => 'Ya',
'enforce_language' => 'Memaksakan bahasa',
'lang' => 'Indonesian',
'password_repeat' => 'Ulangi kata sandi',
'quota_enabled' => 'Aktifkan kuota pengguna',
'account_activated' => 'Akun telah aktif, sekarang Anda bisa login!',
'recover_email_sent' => 'Jika ada, email pemulihan telah dikirim ke akun yang ditentukan.',
'mail.recover_password' => '%s - Pemulihan kata sandi',
'mail.activate_text' => 'Halo %s!<br>terima kasih telah membuat akun di %s (<a href="%s">%s</a>), klik tautan berikut untuk mengaktifkan akun anda:<br><br><a href="%s">%s</a>',
'mail.recover_text' => 'Halo %s,<br>permintaan reset kata sandi telah diminta untuk akun Anda. Untuk menyelesaikan prosedur, klik tautan berikut ini:<br><br><a href="%s">%s</a><br><br>Jika bukan Anda yang meminta pengaturan ulang kata sandi, abaikan email ini.',
'mail.activate_account' => '%s - Aktivasi akun',
'invalid_quota' => 'Nilai tidak valid sebagai kuota pengguna default.',
'max_user_quota' => 'Kuota Pengguna Maksimum',
'default_user_quota' => 'Kuota Pengguna Default',
'register_success' => 'Akun telah dibuat, email konfirmasi telah dikirim.',
'register' => 'Daftar',
'no_account' => 'Tidak memiliki akun?',
'password_recovery' => 'Pulihkan kata sandi',
'export_data' => 'Ekspor data',
'settings_saved' => 'Pengaturan sistem disimpan!',
'copy_url_behavior' => 'Salin mode URL',
'hide_by_default' => 'Sembunyikan media secara default',
'register_enabled' => 'Pendaftaran diaktifkan',
'dont_close' => 'Jangan tutup tab ini hingga selesai.',
'please_wait' => 'Mohon tunggu…',
'remember_me' => 'Ingat saya',
'custom_head_html_hint' => 'Konten ini akan ada di <head> tag dalam semua halaman.',
'custom_head_html' => 'Konten HTML Head khusus',
'donate_text' => 'Jika anda menyukai XBackBone, pertimbangkan donasi untuk mendukung pengembangan!',
'donation' => 'Donasi',
'drop_to_upload' => 'Klik atau jatuhkan untuk mengunggah berkas.',
'no_upload_token' => 'Anda tidak memiliki token upload personal. (Buat satu dan coba lagi.)',
'prerelease_channel' => 'Saluran prarilis',
'default_lang_behavior' => 'XBackBone akan berusaha untuk menyesuaikan bahasa default (penggantinya adalah Bahasa Inggris).',
'auto_set' => 'Diatur secara otomatis',
'cancel' => 'Batal',
'maintenance_in_progress' => 'Platform sedang dalam perbaikan, cobalagi nanti…',
'updates' => 'Pembaharuan',
'upgrade' => 'Meningkatkan versi',
'check_for_updates' => 'Periksa untuk update',
'file_size_no_match' => 'Berkas yang telah terunduh tidak sesuai dengan ukuran yang benar.',
'cannot_retrieve_file' => 'Tidak bisa mengambil berkas.',
'new_version_available' => 'Versi baru %s tersedia!',
'already_latest_version' => 'Anda telah memiliki versi terbaru.',
'copied' => 'Tersimpan di papan clip!',
'clear_account' => 'Bersihkan Akun',
'show_changelog' => 'Tampilkan log perubahan',
'changelog' => 'Rilis perubahan',
'zip_ext_not_loaded' => 'Ekstensi zip yang diperlukan tidak dimuat',
'auto_tagging' => 'Pemberian tag unggahan otomatis',
'no_tags' => 'Tidak ada tag yang ditambahkan',
'upload_max_file_size' => 'Ukuran file maksimal saat ini %s.',
'ldap_cant_connect' => 'Tidak dapat terhubung ke server auth LDAP.',
'user_create_password' => 'Jika dibiarkan kosong, Anda mungkin ingin mengirim pemberitahuan ke alamat email pengguna.',
'mail.new_account_text_with_pw' => 'Hai %s! <br>akun baru telah dibuat di% s (<a href="%s">%s</a>), dengan kredensial berikut: <br><br>Nama pengguna:%s <br>Sandi: %s<br><br>Klik tautan berikut untuk ke halaman login: <br> <a href="%s">% s </a>',
'mail.new_account_text_with_reset' => 'Hai% s! <br> sebuah akun baru telah dibuat untuk Anda di% s (<a href="%s">% s </a>), klik tautan berikut untuk menyetel kata sandi dan mengaktifkannya: <br > <br> <a href="%s">% s </a>',
'mail.new_account' => '%s - Pembuatan Akun Baru',
'send_notification' => 'Kirim Email Pemberitahuan',
'recaptcha_secret_key' => 'Kunci Rahasia reCAPTCHA',
'recaptcha_site_key' => 'Kunci Situs reCAPTCHA',
'only_recaptcha_v3' => 'Hanya reCAPTCHA v3 yang didukung.',
'recaptcha_keys_required' => 'Semua kunci reCAPTCHA diperlukan.',
'recaptcha_enabled' => 'reCAPTCHA Diaktifkan',
'recaptcha_failed' => 'reCAPTCHA Gagal',
'danger_zone' => 'Area Berbahaya',
'account_media_deleted' => 'Semua media dalam akun telah dihapus.',
'delete_all' => 'Hapus Semua',
'delete_selected' => 'Hapus Yang Terpilih',
'used_space' => 'Ruang yang digunakan',
'quota_recalculated' => 'Kuota pengguna berhasil dihitung ulang dari disk.',
'recalculate_user_quota' => 'Hitung ulang kuota pengguna dari disk',
'password_restored' => 'Atur ulang kata sandi.',
'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

@ -1,15 +1,15 @@
<?php
return [
'lang' => 'Italian',
'lang' => 'Italiano',
'yes' => 'Sì',
'no' => 'No',
'send' => 'Invia',
'no_media' => 'Nessun media trovato.',
'login.username' => 'Username o E-Mail',
'login.username' => 'Nome utente o e-mail',
'password' => 'Password',
'login' => 'Accedi',
'username' => 'Username',
'home' => 'Home',
'username' => 'Nome utente',
'home' => 'Pagina principale',
'users' => 'Utenti',
'system' => 'Sistema',
'profile' => 'Profilo',
@ -18,7 +18,7 @@ return [
'pager.previous' => 'Indietro',
'copy_link' => 'Copia link',
'public.telegram' => 'Condividi su Telegram',
'public.delete_text' => 'Sei sicuro di voler eliminare questo elemento? Andrà perso per sempre!',
'public.delete_text' => 'Sei sicuro/a di voler eliminare questo elemento? Andrà perso per sempre',
'preview' => 'Anteprima',
'filename' => 'Nome file',
'size' => 'Dimensione',
@ -34,15 +34,15 @@ return [
'files' => 'File',
'orphaned_files' => 'File orfani',
'theme' => 'Tema',
'click_to_load' => 'Clicca per caricare...',
'click_to_load' => 'Clicca per caricare',
'apply' => 'Applica',
'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',
@ -60,16 +60,16 @@ return [
'installed' => 'Installazione completata!',
'bad_login' => 'Credenziali errate.',
'account_disabled' => 'Il tuo account è disattivato.',
'welcome' => 'Benvenuto, %s!',
'welcome' => 'Benvenuto/a, %s!',
'goodbye' => 'Arrivederci!',
'token_not_found' => 'Il token specificato non è stato trovato.',
'email_required' => 'Email obbligatoria.',
'email_taken' => 'Email già in uso.',
'username_required' => 'Username obbligatorio.',
'username_taken' => 'Username già in uso.',
'email_required' => 'E-mail obbligatoria.',
'email_taken' => 'Indirizzo e-mail già in uso.',
'username_required' => 'Nome utente obbligatorio.',
'username_taken' => 'Nome utente già in uso.',
'password_required' => 'Password obbligatoria.',
'user_created' => 'L\'utente "%s" è stato creato!',
'user_updated' => 'L\'utente "%s" è stato aggiornato!',
'user_created' => 'L\'utente «%s» è stato creato!',
'user_updated' => 'L\'utente «%s» è stato aggiornato!',
'profile_updated' => 'Profilo aggiornato con successo!',
'user_deleted' => 'Utente rimosso.',
'cannot_delete' => 'Non puoi eliminare te stesso.',
@ -79,23 +79,23 @@ return [
'switch_to' => 'Vedi come',
'gallery' => 'Galleria',
'table' => 'Tabella',
'dotted_search' => 'Cerca...',
'order_by' => 'Ordina per...',
'dotted_search' => 'Cerca',
'order_by' => 'Ordina per',
'time' => 'Data',
'name' => 'Nome',
'maintenance' => 'Manutenzione',
'clean_orphaned_uploads' => 'Pulisci upload orfani',
'path_not_writable' => 'Il percorso di output non è scrivibile.',
'already_latest_version' => 'Hai già l\'ultima versione disponibile.',
'new_version_available' => 'Nuova versione disponibile: %s',
'new_version_available' => 'Nuova versione %s disponibile!',
'cannot_retrieve_file' => 'Impossibile scaricare il file.',
'file_size_no_match' => 'La dimensione del file scaricato non è corretta.',
'check_for_updates' => 'Controllo aggiornamenti',
'upgrade' => 'Upgrade',
'upgrade' => 'Aggiorna',
'updates' => 'Aggiornamenti',
'maintenance_in_progress' => 'Manutenzione in corso, riprova più tardi.',
'maintenance_in_progress' => 'Manutenzione in corso, riprova più tardi',
'cancel' => 'Annulla',
'enforce_language' => 'Imponi lingua',
'enforce_language' => 'Imponi la lingua',
'auto_set' => 'Imposta automaticamente',
'default_lang_behavior' => 'Per impostazione predefinita, XBackbone cercherà di abbinare la lingua del browser (il fallback è l\'Inglese).',
'lang_set' => 'Lingua di sistema applicata a "%s"',
@ -108,7 +108,7 @@ return [
'custom_head_html_hint' => 'Questo contenuto sarà aggiunto al tag <head> in ogni pagina.',
'custom_head_set' => 'Custom Head HTML applicato con successo.',
'remember_me' => 'Ricordami',
'please_wait' => 'Attendere prego...',
'please_wait' => 'Si prega di attendere…',
'dont_close' => 'Non chiudere questa scheda fino al completamento.',
'php_info' => 'Informazioni PHP',
'system_settings' => 'Impostazioni di sistema',
@ -122,19 +122,9 @@ return [
'register' => 'Registrati',
'default_user_quota' => 'Quota utente predefinita',
'invalid_quota' => 'Valore non valido per la quota utente predefinita.',
'mail.activate_text' => 'Ciao %s!
grazie per aver creato il tuo account su %s (%s), fai clic sul seguente link per attivarlo:
%s',
'register_success' => 'L\'account è stato creato, è stata inviata un\'e-mail di conferma.',
'mail.activate_account' => '%s - Attivazione account',
'mail.recover_text' => 'Ciao %s,
è stata richiesta una reimpostazione della password per il tuo account. Per completare la procedura clicca sul seguente link:
%s
Se non sei stato tu a richiedere la reimpostazione della password, ignora semplicemente questa e-mail.',
'mail.recover_password' => '%s - Recupero password',
'mail.activate_account' => '%s Attivazione account',
'mail.recover_password' => '%s Recupero la password',
'recover_email_sent' => 'Se presente, è stata inviata un\'e-mail di recupero all\'account specificato.',
'account_activated' => 'Account attivato, ora è possibile effettuare il login!',
'quota_enabled' => 'Abilita quota utente',
@ -149,7 +139,7 @@ Se non sei stato tu a richiedere la reimpostazione della password, ignora sempli
'delete_all' => 'Elimina tutto',
'clear_account' => 'Pulisci account',
'account_media_deleted' => 'Tutti i media nell\'account sono stati eliminati.',
'danger_zone' => 'Zona Pericolosa',
'danger_zone' => 'Zona pericolosa',
'recaptcha_failed' => 'reCAPTCHA fallito',
'recaptcha_enabled' => 'reCAPTCHA Abilitato',
'recaptcha_keys_required' => 'Tutte le chiavi reCAPTCHA sono obbligatorie.',
@ -157,21 +147,20 @@ Se non sei stato tu a richiedere la reimpostazione della password, ignora sempli
'recaptcha_site_key' => 'reCAPTCHA Site Key',
'recaptcha_secret_key' => 'reCAPTCHA Secret Key',
'no_tags' => 'Nessun tag aggiunto',
'upload_max_file_size' => 'La dimensione massima del file è attualmente %s.',
'upload_max_file_size' => 'La dimensione massima di un file caricabile è %s.',
'ldap_cant_connect' => 'Impossibile connettersi al server di autenticazione LDAP.',
'user_create_password' => 'Se lasciato vuoto, si consiglia di inviare una notifica all\'utente via e-mail.',
'mail.new_account_text_with_pw' => 'Ciao %s!
un nuovo account è stato creato per te su %s (%s), con le seguenti credenziali:
Username: %s
Password: %s
Clicca su questo link per andare alla pagina di login:
%s',
'mail.new_account_text_with_reset' => 'Ciao %s!
un nuovo account è stato creato per te su %s (%s), clicca sul seguente link per impostare una password e attivarlo:
%s',
'mail.new_account' => '%s - Nuovo account creato',
'mail.new_account' => '%s Nuovo account creato',
'send_notification' => 'Invia notifica e-mail',
'auto_tagging' => 'Tagging automatico degli upload',
'mail.new_account_text_with_pw' => 'Ciao %s!<br>un nuovo account è stato creato per te su %s (<a href="%s">%s</a>), con le seguenti credenziali:<br><br>Nome utente: %s<br>Password: %s<br><br>Clicca su questo collegamento per andare alla pagina di accesso:<br><a href="%s">%s</a>',
'mail.new_account_text_with_reset' => 'Ciao %s!<br>un nuovo account è stato creato per te su %s (<a href="%s">%s</a>), clicca sul seguente collegamento per impostare una password e attivarlo:<br><br><a href="%s">%s</a>',
'mail.recover_text' => 'Ciao %s,<br>è stata richiesta una reimpostazione della password per il tuo account. Per completare la procedura clicca sul seguente collegamento:<br><br><a href="%s">%s</a><br><br>Se non sei stato/a tu a richiedere la reimpostazione della password, ignora semplicemente questa e-mail.',
'mail.activate_text' => 'Ciao %s!<br>grazie per aver creato il tuo account su %s (<a href="%s">%s</a>), fai clic sul seguente collegamento per attivarlo:<br><br><a href="%s">%s</a>',
'zip_ext_not_loaded' => 'L\'estensione zip richiesta non è caricata',
'changelog' => 'Registro dei cambiamenti',
'show_changelog' => 'Mostra registro dei cambiamenti',
'copied' => 'Copiato negli appunti!',
'image_embeds' => 'Incorpora immagini',
'vanity_url' => 'URL personalizzato',
];

View file

@ -6,7 +6,7 @@ return [
'no' => 'いいえ',
'send' => '送信',
'no_media' => 'メディアが見つかりません。',
'login.username' => 'ユーザー名またはメールアドレス',
'login.username' => 'ユーザー名または電子メール',
'password' => 'パスワード',
'login' => 'ログイン',
'username' => 'ユーザー名',
@ -35,7 +35,7 @@ return [
'files' => 'ファイル',
'orphaned_files' => '所有者のいないファイル',
'theme' => 'テーマ',
'click_to_load' => 'クリックしてロード...',
'click_to_load' => 'クリックしてロード',
'apply' => '適用',
'save' => '保存',
'system_info' => 'システム情報',
@ -63,14 +63,52 @@ return [
'welcome' => 'ようこそ、 %sさん',
'goodbye' => 'さようなら!',
'token_not_found' => '指定されたトークンが見つかりません。',
'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' => '自分自身を削除することはできません。',
'drop_to_upload' => 'クリックまたはファイルをここにドロップしてアップロード。',
'prerelease_channel' => 'プレリリースチャンネル',
'auto_set' => '自動で設定',
'maintenance_in_progress' => '只今メンテナンス中です。 しばらくお待ち下さい...',
'upgrade' => 'アップグレード',
'file_size_no_match' => 'ダウンロードしたファイルのサイズが正しくありません。',
'new_version_available' => '新しいバージョン %s が利用可能です!',
'path_not_writable' => '出力先は書き込み可能ではありません。',
'maintenance' => 'メンテナンス',
'time' => '時間',
'dotted_search' => '検索...',
'gallery' => 'ギャラリー',
'deleted_orphans' => '所有者のいないファイルを %d 個 削除しました。',
'cannot_demote' => '自分自身を降格させることはできません。',
'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' => 'アップロードのための個人トークンがありません。(まず新しく生成してもう一度試してください)',
];

164
resources/lang/ko.lang.php Normal file
View file

@ -0,0 +1,164 @@
<?php
return [
'zip_ext_not_loaded' => '필요한 "zip" 확장자가 불러와지지 않았어요',
'image_embeds' => '임베드 이미지',
'show_changelog' => '변경사항 보기',
'changelog' => '변경사항',
'auto_tagging' => '자동 업로드 태그 지정',
'no_tags' => '추가된 태그 없음',
'upload_max_file_size' => '최대 파일 크기는 %s 에요.',
'ldap_cant_connect' => 'LDAP 인증 서버에 연결할 수 없어요.',
'user_create_password' => '만약 비어 있다면, 사용자의 이메일로 알림을 보내는 게 좋을 거예요.',
'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>',
'mail.new_account' => '%s - 새로운 계정 생성',
'send_notification' => '이메일 알림 보내기',
'recaptcha_secret_key' => '리캡챠 Secret Key',
'recaptcha_site_key' => '리캡챠 Site Key',
'only_recaptcha_v3' => '리캡챠 v3만 지원해요.',
'recaptcha_keys_required' => '모든 리캡챠 키가 필요해요.',
'recaptcha_enabled' => '리캡챠 켜기',
'recaptcha_failed' => '리캡챠 실패',
'danger_zone' => '위험 구역',
'account_media_deleted' => '계정의 모든 미디어가 삭제되었어요.',
'clear_account' => '계정 지우기',
'delete_all' => '모두 삭제하기',
'clean_orphaned_uploads' => '존재하지 않는 파일 삭제하기',
'delete_selected' => '선택한 항목 삭제',
'used_space' => '사용된 공간',
'quota_recalculated' => '사용자 할당량 계산이 완료되었어요.',
'recalculate_user_quota' => '디스크에서 사용자 할당량 다시 계산하기',
'password_match' => '비밀번호와 재입력 값은 같아야 해요.',
'password_restored' => '비밀번호 초기화.',
'password_repeat' => '비밀번호 재입력',
'quota_enabled' => '사용자 할당량 켜기',
'account_activated' => '계정이 활성화되었어요, 이제 로그인을 할 수 있을거에요!',
'recover_email_sent' => '존재하는 계정이라면, 복구용 이메일이 전송되었을 거예요.',
'mail.recover_password' => '%s - 암호 재설정',
'mail.recover_text' => '%s 님 안녕하세요,<br>암호 재설정이 요청되었어요. 완료하려면 다음 링크를 클릭해주세요:<br><br><a href="%s">%s</a><br><br>만약 재설정을 요청하지 않았다면, 그냥 이 이메일은 무시해도 괜찮아요.',
'mail.activate_account' => '%s - 계정 활성화',
'mail.activate_text' => '%s 님 안녕하세요!<br>%s에 계정을 만들어 주셔서 감사합니다(<a href="%s">%s</a>), 다음 링크를 클릭하여 활성화하세요:<br><br><a href="%s">%s</a>',
'invalid_quota' => '기본 사용자 할당량 값이 잘못됐어요.',
'max_user_quota' => '최대 사용자 할당량',
'default_user_quota' => '기본 사용자 할당량',
'register_success' => '계정이 생성되었으며, 확인 이메일이 전송되었어요.',
'register' => '가입하기',
'no_account' => '혹시 계정이 없으신가요?',
'password_recovery' => '비밀번호 찾기',
'export_data' => '파일 내보내기',
'settings_saved' => '시스템 설정을 저장했어요!',
'copy_url_behavior' => 'URL 복사 모드',
'hide_by_default' => '기본적으로 미디어 숨기기',
'register_enabled' => '회원가입 활성화',
'dont_close' => '완료될 때까지 창을 닫지 마세요...',
'please_wait' => '잠시만 기다려주세요…',
'remember_me' => '로그인 상태 유지',
'custom_head_set' => '커스텀 HTML Head를 적용했어요.',
'custom_head_html_hint' => '입력된 값은 모든 페이지의 <head> 태그에 적용될 거에요.',
'maintenance_in_progress' => '유지보수 중 이에요, 나중에 다시 시도해주세요…',
'custom_head_html' => '커스텀 HTML Head',
'donate_text' => 'XBackBone이 마음에 든다면, 개발 지원을 위한 후원을 고려해보세요!',
'donation' => '기부',
'drop_to_upload' => '파일을 업로드하려면 클릭하거나 여기에 놓아주세요.',
'no_upload_token' => '개인 업로드 토큰이 없어요. (생성하고 다시 시도해 주세요.)',
'prerelease_channel' => 'Prerelease 채널',
'default_lang_behavior' => '기본적으로 브라우저의 언어와 똑같이 설정할 거에요 (만약 없다면 영어로 선택될거에요).',
'auto_set' => '자동 설정',
'cancel' => '취소',
'updates' => '업데이트',
'upgrade' => '업그레이드',
'check_for_updates' => '업데이트 확인',
'file_size_no_match' => '다운로드한 파일의 크기가 올바르지 않아요.',
'cannot_retrieve_file' => '파일을 검색할 수 없어요.',
'new_version_available' => '새로운 버전 %s 이 존재해요!',
'already_latest_version' => '이미 최신버전을 사용하고 있어요.',
'path_not_writable' => '출력 경로에 쓸 수 없어요.',
'maintenance' => '관리',
'name' => '이름순',
'time' => '날짜순',
'order_by' => '정렬하기…',
'dotted_search' => '검색…',
'table' => '테이블뷰',
'gallery' => '갤러리뷰',
'switch_to' => '전환하기',
'deleted_orphans' => '%d 개의 존재하지 않는 파일을 삭제했어요.',
'orphaned_files' => '존재하지 않는 파일',
'cannot_write_file' => '대상 경로에는 쓸 수 없어요.',
'cannot_demote' => '나 자신을 강등시킬 순 없어요.',
'cannot_delete' => '나 자신을 삭제할 순 없죠.',
'user_deleted' => '사용자를 삭제했어요.',
'profile_updated' => '프로필이 정상적으로 업데이트 되었어요!',
'user_updated' => '사용자 "%s" 가 업데이트 되었어요!',
'user_created' => '사용자 "%s" 가 생성되었어요!',
'password_required' => '비밀번호가 필요해요.',
'username_taken' => '이 이름은 이미 사용 중이에요.',
'username_required' => '이름이 필요해요.',
'email_taken' => '이 이메일 주소는 이미 사용 중이에요.',
'email_required' => '이메일 주소가 필요해요.',
'token_not_found' => '토큰을 찾을 수 없어요.',
'goodbye' => '잘가요!',
'welcome' => '%s 님 어서오세요!',
'account_disabled' => '당신의 계정은 비활성 상태입니다.',
'bad_login' => '잘못된 자격증명입니다.',
'installed' => '설치가 완료되었어요!',
'confirm' => '확인',
'confirm_string' => '확실한가요?',
'open' => '열기',
'none' => '없음',
'reg_date' => '생성된 날짜',
'admin' => '관리자',
'active' => '활성화',
'user_code' => '사용자 코드',
'user.edit' => '사용자 수정',
'user.create' => '사용자 생성',
'users' => '사용자',
'client_config' => '클라이언트 설정 파일',
'edit' => '수정',
'update' => '재생성',
'copied' => '클립보드에 복사 완료!',
'copy' => '복사',
'token' => '토큰',
'your_profile' => '나의 프로필',
'is_admin' => '관리자',
'is_active' => '활성화',
'system_settings' => '시스템 설정',
'php_info' => 'PHP 정보',
'used' => '사용량',
'save' => '저장',
'apply' => '적용',
'click_to_load' => '눌러서 불러오기…',
'theme' => '테마',
'files' => '파일',
'hide' => '숨기기',
'publish' => '공개',
'delete' => '삭제',
'upload' => '업로드',
'download' => '다운로드',
'raw' => '원본 보기',
'owner' => '소유자',
'date' => '날짜',
'public' => '공개',
'size' => '용량',
'filename' => '파일이름',
'preview' => '미리보기',
'no_media' => '아무 것도 없어요.',
'login.username' => '이름 또는 이메일',
'password' => '비밀번호',
'public.delete_text' => '정말 이 항목을 삭제할까요? 이 선택은 되돌릴 수 없어요',
'public.telegram' => '텔레그램에 공유하기',
'copy_link' => '링크 복사',
'pager.previous' => '이전',
'pager.next' => '다음',
'logout' => '로그아웃',
'profile' => '프로필',
'system' => '시스템',
'home' => '홈',
'username' => '이름',
'login' => '로그인',
'send' => '보내기',
'no' => '취소',
'yes' => '확인',
'enforce_language' => '언어 설정',
'lang' => 'Korean',
'vanity_url' => '사용자 정의 URL',
];

163
resources/lang/lt.lang.php Normal file
View file

@ -0,0 +1,163 @@
<?php
return [
'dotted_search' => 'Ieškoti…',
'table' => 'Lentelė',
'gallery' => 'Galerija',
'cannot_demote' => 'Negalite pažeminti savo pareigų.',
'cannot_delete' => 'Negalite ištrinti savęs.',
'user_deleted' => 'Vartotojas panaikintas.',
'profile_updated' => 'Profilis sėkmingai atnaujintas!',
'user_updated' => 'Vartotojas „%s“ atnaujintas!',
'user_created' => 'Vartotojas „%s“ sukurtas!',
'password_required' => 'Būtinas slaptažodis.',
'username_taken' => 'Vartotojo vardas jau užimtas.',
'username_required' => 'Vartotojo vardas yra būtinas.',
'email_taken' => 'El. pašto adresas jau yra naudojamas.',
'email_required' => 'Būtinas el. pašto adresas.',
'goodbye' => 'Iki pasimatymo!',
'welcome' => 'Sveiki, %s!',
'bad_login' => 'Neteisingi įgaliojimai.',
'installed' => 'Diegimas sėkmingai baigtas!',
'confirm_string' => 'Ar tikrai?',
'confirm' => 'Patvirtinimas',
'none' => 'Nėra',
'reg_date' => 'Registracijos data',
'admin' => 'Administratorius',
'active' => 'Aktyvus',
'user_code' => 'Vartotojo kodas',
'client_config' => 'Kliento konfigūracija',
'edit' => 'Redaguoti',
'update' => 'Atnaujinti',
'copied' => 'Nukopijuota į iškarpinę!',
'copy' => 'Kopijuoti',
'token' => 'Žetonas',
'your_profile' => 'Jūsų profilis',
'is_admin' => 'Yra administratorius',
'is_active' => 'Yra aktyvus',
'user.edit' => 'Redaguoti vartotoją',
'user.create' => 'Sukurti vartotoją',
'system_settings' => 'Sistemos nustatymai',
'php_info' => 'PHP informacija',
'save' => 'Išsaugoti',
'apply' => 'Taikyti',
'click_to_load' => 'Spustelėkite norėdami įkelti…',
'theme' => 'Tema',
'files' => 'Failai',
'hide' => 'Slėpti',
'delete' => 'Ištrinti',
'upload' => 'Įkelti',
'download' => 'Atsisiųsti',
'raw' => 'Rodyti neapdorotą',
'date' => 'Data',
'owner' => 'Savininkas',
'public' => 'Viešas',
'size' => 'Dydis',
'filename' => 'Failo pavadinimas',
'preview' => 'Peržiūra',
'public.delete_text' => 'Ar tikrai norite ištrinti šį elementą? Jūs negalėsite jo susigrąžinti',
'public.telegram' => 'Bendrinti Telegram',
'copy_link' => 'Kopijuoti nuorodą',
'pager.previous' => 'Ankstesnis',
'pager.next' => 'Kitas',
'logout' => 'Atsijungti',
'profile' => 'Profilis',
'system' => 'Sistema',
'users' => 'Vartotojai',
'home' => 'Pagrindinis',
'username' => 'Vartotojo vardas',
'login' => 'Prisijungti',
'password' => 'Slaptažodis',
'login.username' => 'Vartotojo vardas arba el. paštas',
'send' => 'Siųsti',
'no' => 'Ne',
'yes' => 'Taip',
'lang' => 'Lietuvių',
'account_media_deleted' => 'Visa paskyros medija buvo ištrinta.',
'copy_url_behavior' => 'URL kopijavimo režimas',
'hide_by_default' => 'Slėpti mediją pagal numatytuosius nustatymus',
'custom_head_set' => 'Pritaikyta pasirinktinė HTML „head“.',
'custom_head_html_hint' => 'Šis turinys bus pridėtas prie kiekvieno puslapio žymos <head>.',
'custom_head_html' => 'Pasirinktinis HTML „Head“ turinys',
'no_upload_token' => 'Neturite asmeninio įkėlimo prieigos rakto. (Sukurkite vieną ir bandykite dar kartą.)',
'path_not_writable' => 'Išvesties kelyje nėra galimybės įrašyti.',
'clean_orphaned_uploads' => 'Valyti vienišus įkėlimus',
'order_by' => 'Rūšiuoti pagal…',
'switch_to' => 'Pereiti prie',
'deleted_orphans' => 'Sėkmingai ištrinta %d vienišų failų.',
'cannot_write_file' => 'Paskirties kelyje nėra galimybės įrašyti.',
'token_not_found' => 'Nurodytas prieigos raktas nerastas.',
'account_disabled' => 'Jūsų paskyra išjungta.',
'open' => 'Atidaryti',
'used' => 'Naudojama',
'orphaned_files' => 'Vieniši failai',
'publish' => 'Publikuoti',
'no_media' => 'Jokia medija nerasta.',
'enforce_language' => 'Priverstinis kalbos naudojimas',
'image_embeds' => 'Įterpti vaizdai',
'show_changelog' => 'Rodyti pakeitimų žurnalą',
'changelog' => 'Pakeitimų žurnalas',
'zip_ext_not_loaded' => 'Reikalingas „zip“ plėtinys neįkeltas',
'auto_tagging' => 'Automatinis įkėlimo žymėjimas',
'no_tags' => 'Nėra pridėtų žymų',
'upload_max_file_size' => 'Maksimalus failo dydis šiuo metu yra %s.',
'ldap_cant_connect' => 'Nepavyksta prisijungti prie LDAP autentifikavimo serverio.',
'user_create_password' => 'Jei paliksite tuščią, galbūt norėsite nusiųsti pranešimą vartotojo el. pašto adresu.',
'mail.new_account_text_with_pw' => 'Sveiki, %s!<br>jums buvo sukurta nauja paskyra %s (<a href="%s">%s</a>) naudojant šiuos kredencialus:<br><br>Vartotojo vardas: %s<br> Slaptažodis:%s <br><br>Spustelėkite šią nuorodą, kad patektumėte į prisijungimo puslapį:<br><a href="%s">%s</a>',
'mail.new_account_text_with_reset' => 'Sveiki, %s! <br>jums buvo sukurta nauja paskyra %s (<a href="%s">%s</a>), spustelėkite šią nuorodą, kad nustatytumėte slaptažodį ir jį suaktyvintumėte: <br><br><a href="%s">%s</a>',
'mail.new_account' => '%s - naujos paskyros kūrimas',
'send_notification' => 'Siųsti el. pašto pranešimą',
'recaptcha_secret_key' => 'reCAPTCHA slaptas raktas',
'recaptcha_site_key' => 'reCAPTCHA svetainės raktas',
'only_recaptcha_v3' => 'Palaikomas tik reCAPTCHA v3.',
'recaptcha_keys_required' => 'Reikalingi visi reCAPTCHA raktai.',
'recaptcha_enabled' => 'reCAPTCHA įjungta',
'recaptcha_failed' => 'reCAPTCHA nepavyko',
'danger_zone' => 'Pavojaus zona',
'clear_account' => 'Išvalyti paskyrą',
'delete_all' => 'Ištrinti viską',
'delete_selected' => 'Ištrinti pasirinktą',
'used_space' => 'Naudojama talpa',
'quota_recalculated' => 'Vartotojo kvota sėkmingai perskaičiuota iš disko.',
'recalculate_user_quota' => 'Perskaičiuoti vartotojo kvotą iš disko',
'password_restored' => 'Slaptažodis nustatytas iš naujo.',
'password_match' => 'Slaptažodis ir pakartotinis slaptažodis turi būti vienodi.',
'password_repeat' => 'Pakartokite slaptažodį',
'quota_enabled' => 'Įgalinti vartotojo kvotą',
'account_activated' => 'Paskyra suaktyvinta, dabar galite prisijungti!',
'recover_email_sent' => 'Jei yra, atkūrimo el. laiškas buvo išsiųstas į nurodytą abonementą.',
'mail.recover_password' => '%s slaptažodžio atkūrimas',
'mail.recover_text' => 'Sveiki, %s,<br>paprašyta iš naujo nustatyti jūsų paskyros slaptažodį. Norėdami užbaigti procedūrą, spustelėkite šią nuorodą:<br><br><a href="%s">%s</a><br><br> Jei ne jūs paprašėte iš naujo nustatyti slaptažodį, tiesiog ignoruoti šį laišką.',
'mail.activate_account' => '%s - paskyros aktyvinimas',
'mail.activate_text' => 'Sveiki, %s!<br>ačiū, kad sukūrėte paskyrą %s (<a href="%s">%s</a>), spustelėkite šią nuorodą, kad ją suaktyvintumėte: <br><br><a href="%s">%s</a>',
'invalid_quota' => 'Neleistinos reikšmės kaip numatytoji vartotojo kvota.',
'max_user_quota' => 'Maksimali vartotojo kvota',
'default_user_quota' => 'Numatytoji vartotojo kvota',
'register_success' => 'Paskyra sukurta, patvirtinimo el. laiškas išsiųstas.',
'register' => 'Registruotis',
'no_account' => 'Neturite paskyros?',
'password_recovery' => 'Atkurti slaptažodį',
'export_data' => 'Eksportuoti duomenis',
'settings_saved' => 'Sistemos nustatymai išsaugoti!',
'register_enabled' => 'Registracijos įgalintos',
'dont_close' => 'Neuždarykite šio skirtuko iki kol bus pabaigta.',
'please_wait' => 'Prašome palaukti…',
'remember_me' => 'Atsiminti mane',
'donate_text' => 'Jei jums patinka XBackBone, apsvarstykite paaukoti, kad paremtumėte kūrimą!',
'donation' => 'Parama',
'drop_to_upload' => 'Spustelėkite arba numeskite failus čia, kad įkeltumėte.',
'prerelease_channel' => 'Išankstinių versijų kanalas',
'default_lang_behavior' => 'XBackBone bandys suderinti naršyklės kalbą pagal nutylėjimą (atsarginė yra anglų kalba).',
'auto_set' => 'Nustatyti automatiškai',
'cancel' => 'Atšaukti',
'maintenance_in_progress' => 'Platforma tvarkoma, bandykite dar kartą vėliau …',
'updates' => 'Atnaujinimai',
'upgrade' => 'Atnaujinti',
'check_for_updates' => 'Tikrinti, ar yra naujinimų',
'file_size_no_match' => 'Atsisiųstas failas neatitinka tinkamo failo dydžio.',
'cannot_retrieve_file' => 'Neįmanoma nuskaityti failo.',
'new_version_available' => 'Nauja versija %s pasiekiama!',
'already_latest_version' => 'Jūs jau turite naujausią versiją.',
'maintenance' => 'Palaikymas',
'name' => 'Vardas',
'time' => 'Laikas',
];

View file

@ -13,7 +13,7 @@ return [
'edit' => 'Rediger',
'no_media' => 'Fant inne noe media.',
'account_disabled' => 'Kontoen din er deaktivert.',
'user_created' => 'Bruker "%s" opprettet!',
'user_created' => 'Bruker «%s» opprettet!',
'installed' => 'Installasjon vellykket!',
'check_for_updates' => 'Se etter oppdateringer',
'home' => 'Hjem',
@ -47,7 +47,7 @@ return [
'lang' => 'Norwegian Bokmål',
'upgrade' => 'Oppgrader',
'updates' => 'Oppdateringer',
'user_updated' => 'Bruker "%s" oppdatert!',
'user_updated' => 'Bruker «%s» oppdatert!',
'system' => 'System',
'copy' => 'Kopier',
'maintenance_in_progress' => 'Det utføres vedlikehold på plattformen, prøv igjen senere…',
@ -127,17 +127,7 @@ return [
'invalid_quota' => 'Forvalgt brukerkvote har ugyldige verdier.',
'mail.activate_account' => '%s - Kontoaktivering',
'mail.recover_password' => '%s - Passordgjenoppretting',
'mail.activate_text' => 'Hei %s!
takk for at du opprettet en konto hos %s (%s), klikk følgende link for å aktivere den.
%s',
'register_success' => 'Kontoen har blitt opprettet, en bekreftelsese-post har blitt sendt.',
'mail.recover_text' => 'Hei %s,
en tilbakestilling av passord har blitt forespurt for din konto. For å fullføre prosedyren, klikk følgende lenke:
%s
Ignorer denne e-posten hvis forespørselen om å tilbakestille passordet, ikke kommer fra deg.',
'recover_email_sent' => 'Hvis tilstede, har en gjenopprettingse-epost blitt sendt til den spesifiserte kontoen.',
'account_activated' => 'Kontoen er aktivert, du kan nå logge in!',
'quota_enabled' => 'Tillat brukerkvote',
@ -159,4 +149,18 @@ Ignorer denne e-posten hvis forespørselen om å tilbakestille passordet, ikke k
'only_recaptcha_v3' => 'Bare reCAPTCHA v3 støttes.',
'recaptcha_site_key' => 'reCAPTCHA Sidenøkkel',
'recaptcha_secret_key' => 'reCAPTCHA Hemmelig Nøkkel',
'show_changelog' => 'Vis endringslogg',
'changelog' => 'Endringslogg',
'mail.new_account_text_with_reset' => 'Hei %s.<br>en ny konto ble opprettet for deg på %s (<a href="%s">%s</a>), klikk på følgende lenke for å sette et passord og aktivere den:<br><br><a href="%s">%s</a>',
'no_tags' => 'Ingen etiketter lagt til',
'upload_max_file_size' => 'Maksimal filstørrelse er for tiden %s.',
'ldap_cant_connect' => 'Kan ikke koble til LDAP-identitetsbekreftelsestjener.',
'zip_ext_not_loaded' => 'Påkrevd zip-utvidelse er ikke innlastet',
'auto_tagging' => 'Last opp etikettmerking automatisk',
'user_create_password' => 'Hvis levnet tom, vil du kanskje finne det naturlig å sende en merknad til brukerens e-postadresse.',
'mail.new_account_text_with_pw' => 'Hei %s!<br>en ny konto ble opprettet for deg på %s (<a href="%s">%s</a>), med følgende identitetsdetaljer:<br><br>Brukernavn: %s<br>Passord: %s<br><br>Klikk på følgende lenke for å gå til innloggingssiden:<br><a href="%s">%s</a>',
'mail.new_account' => '%s - Opprettelse av ny konto',
'send_notification' => 'Send e-postmerknad',
'copied' => 'Kopiert til utklippstavle.',
'image_embeds' => 'Integrer bilder',
];

View file

@ -1,105 +1,170 @@
<?php
return [
'lang' => 'Dutch',
'yes' => 'Ja',
'no' => 'Nee',
'send' => 'Versturen',
'no_media' => 'Geen media gevonden.',
'login.username' => 'Gebruikersnaam of E-Mail',
'password' => 'Wachtwoord',
'login' => 'Inloggen',
'username' => 'Gebruikersnaam',
'home' => 'Home',
'users' => 'Gebruikers',
'system' => 'Systeem',
'profile' => 'Profiel',
'logout' => 'Uitloggen',
'pager.next' => 'Volgende',
'pager.previous' => 'Vorige',
'copy_link' => 'Link kopiëren',
'public.telegram' => 'Delen op Telegram',
'public.delete_text' => 'Weet je zeker dat je dit item wilt verwijderen? Dit is permanent!',
'preview' => 'Voorbeeld',
'filename' => 'Bestandsnaam',
'size' => 'Grootte',
'public' => 'Publiek',
'owner' => 'Eigenaar',
'date' => 'Datum',
'raw' => 'Bekijk raw',
'download' => 'Download',
'delete' => 'Verwijderen',
'publish' => 'Publiceren',
'hide' => 'Verbergen',
'files' => 'Bestanden',
'orphaned_files' => 'Weesbestanden',
'theme' => 'Thema',
'click_to_load' => 'Klik om te laden...',
'apply' => 'Toepassen',
'save' => 'Opslaan',
'used' => 'Gebruikt',
'system_info' => 'Systeem informatie',
'user.create' => 'Gebruiker aanmaken',
'user.edit' => 'Gebruiker aanpassen',
'is_active' => 'Is actief',
'is_admin' => 'Is administrator',
'your_profile' => 'Jouw profiel',
'token' => 'Token',
'copy' => 'Kopiëren',
'update' => 'Updaten',
'edit' => 'Aanpassen',
'client_config' => 'Client configuratie',
'user_code' => 'Gebruikerscode',
'active' => 'Actief',
'admin' => 'Administrator',
'reg_date' => 'Registratiedatum',
'none' => 'Geen',
'open' => 'Open',
'confirm' => 'Bevestiging',
'confirm_string' => 'Weet je het zeker?',
'installed' => 'Installatie succesvol voltooid!',
'bad_login' => 'Verkeerde verificatiegegevens.',
'account_disabled' => 'Je account is gedeactiveerd.',
'welcome' => 'Welkom, %s!',
'goodbye' => 'Tot ziens!',
'token_not_found' => 'Gespecificeerde token niet gevonden.',
'email_required' => 'Het email adres is noodzakelijk.',
'email_taken' => 'Het email adres is al in gebruik.',
'username_required' => 'De gebruikersnaam is noodzakelijk.',
'username_taken' => 'De gebruikersnaam is al in gebruik.',
'password_required' => 'Het wachtwoord is verplicht.',
'user_created' => 'Gebruiker "%s" aangemaakt!',
'user_updated' => 'Gebruiker "%s" gewijzigd!',
'profile_updated' => 'Profiel succesvol geüpdatet!',
'user_deleted' => 'Gebruiker verwijderd.',
'cannot_delete' => 'Je kan jezelf niet verwijderen.',
'cannot_demote' => 'Je kan je eigen niveau niet verlagen.',
'cannot_write_file' => 'Het opgegeven bestandspad is niet beschrijfbaar.',
'deleted_orphans' => '%d weesbestanden succesvol verwijderd.',
'switch_to' => 'Wijzig naar',
'gallery' => 'Galerij',
'table' => 'Tabel',
'dotted_search' => 'Zoeken...',
'order_by' => 'Sorteren op…',
'time' => 'Tijd',
'name' => 'Naam',
'maintenance' => 'Onderhoud',
'clean_orphaned_uploads' => 'Weesbestanden opschonen',
'path_not_writable' => 'Het pad is niet beschrijfbaar.',
'already_latest_version' => 'Je gebruikt al de nieuwste versie.',
'new_version_available' => 'Nieuwe versie %s beschikbaar!',
'cannot_retrieve_file' => 'Kan het bestand niet ophalen.',
'file_size_no_match' => 'Het gedownloade bestand is niet de correcte grootte.',
'check_for_updates' => 'Controleer op updates',
'upgrade' => 'Upgraden',
'updates' => 'Updates',
'maintenance_in_progress' => 'Platform in onderhoud, probeer het later nog eens...',
'cancel' => 'Annuleren',
'enforce_language' => 'Taal afdwingen',
'auto_set' => 'Automatisch instellen',
'translated_strings' => 'vertaalde strings',
'total_strings' => 'Totaal aantal strings',
'lang_name' => 'Taal',
'default_lang_behavior' => 'XBackBone probeert standaard de taal van de browser te matchen (fallback is Engels).',
'lang_set' => 'Systeemtaal "%s" afgedwongen',
'lang' => 'Dutch',
'yes' => 'Ja',
'no' => 'Nee',
'send' => 'Versturen',
'no_media' => 'Geen media gevonden.',
'login.username' => 'Gebruikersnaam of e-mail',
'password' => 'Wachtwoord',
'login' => 'Inloggen',
'username' => 'Gebruikersnaam',
'home' => 'Home',
'users' => 'Gebruikers',
'system' => 'Systeem',
'profile' => 'Profiel',
'logout' => 'Uitloggen',
'pager.next' => 'Volgende',
'pager.previous' => 'Vorige',
'copy_link' => 'Link kopiëren',
'public.telegram' => 'Delen op Telegram',
'public.delete_text' => 'Weet je zeker dat je dit item wilt verwijderen? Je zal het niet kunnen herstellen',
'preview' => 'Voorbeeld',
'filename' => 'Bestandsnaam',
'size' => 'Grootte',
'public' => 'Publiek',
'owner' => 'Eigenaar',
'date' => 'Datum',
'raw' => 'Bekijk raw',
'download' => 'Download',
'delete' => 'Verwijderen',
'publish' => 'Publiceren',
'hide' => 'Verbergen',
'files' => 'Bestanden',
'orphaned_files' => 'Weesbestanden',
'theme' => 'Thema',
'click_to_load' => 'Klik om te laden…',
'apply' => 'Toepassen',
'save' => 'Opslaan',
'used' => 'Gebruikt',
'system_info' => 'Systeem informatie',
'user.create' => 'Gebruiker aanmaken',
'user.edit' => 'Gebruiker aanpassen',
'is_active' => 'Is actief',
'is_admin' => 'Is administrator',
'your_profile' => 'Jouw profiel',
'token' => 'Token',
'copy' => 'Kopiëren',
'update' => 'Updaten',
'edit' => 'Aanpassen',
'client_config' => 'Client configuratie',
'user_code' => 'Gebruikerscode',
'active' => 'Actief',
'admin' => 'Administrator',
'reg_date' => 'Registratiedatum',
'none' => 'Geen',
'open' => 'Open',
'confirm' => 'Bevestig',
'confirm_string' => 'Weet je het zeker?',
'installed' => 'Installatie succesvol voltooid!',
'bad_login' => 'Verkeerde verificatiegegevens.',
'account_disabled' => 'Je account is gedeactiveerd.',
'welcome' => 'Welkom, %s!',
'goodbye' => 'Tot ziens!',
'token_not_found' => 'Gespecificeerde token niet gevonden.',
'email_required' => 'E-mailadres verplicht.',
'email_taken' => 'Het e-mailadres is al in gebruik.',
'username_required' => 'De gebruikersnaam is noodzakelijk.',
'username_taken' => 'De gebruikersnaam is al in gebruik.',
'password_required' => 'Het wachtwoord is verplicht.',
'user_created' => 'Gebruiker %s aangemaakt!',
'user_updated' => 'Gebruiker %s gewijzigd!',
'profile_updated' => 'Profiel succesvol geüpdatet!',
'user_deleted' => 'Gebruiker verwijderd.',
'cannot_delete' => 'Je kan jezelf niet verwijderen.',
'cannot_demote' => 'Je kan je eigen niveau niet verlagen.',
'cannot_write_file' => 'Het opgegeven bestandspad is niet beschrijfbaar.',
'deleted_orphans' => '%d weesbestanden succesvol verwijderd.',
'switch_to' => 'Wijzig naar',
'gallery' => 'Galerij',
'table' => 'Tabel',
'dotted_search' => 'Zoeken…',
'order_by' => 'Sorteren op…',
'time' => 'Tijd',
'name' => 'Naam',
'maintenance' => 'Onderhoud',
'clean_orphaned_uploads' => 'Weesbestanden opschonen',
'path_not_writable' => 'Het pad is niet beschrijfbaar.',
'already_latest_version' => 'Je gebruikt al de nieuwste versie.',
'new_version_available' => 'Nieuwe versie %s beschikbaar!',
'cannot_retrieve_file' => 'Kan het bestand niet ophalen.',
'file_size_no_match' => 'Het gedownloade bestand is niet de correcte grootte.',
'check_for_updates' => 'Controleer op updates',
'upgrade' => 'Upgraden',
'updates' => 'Updates',
'maintenance_in_progress' => 'Platform is in onderhoud, probeer het later nog eens…',
'cancel' => 'Annuleren',
'enforce_language' => 'Taal afdwingen',
'auto_set' => 'Automatisch instellen',
'translated_strings' => 'vertaalde strings',
'total_strings' => 'Totaal aantal strings',
'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',
'auto_tagging' => 'Automatisch tags aanmaken',
'no_tags' => 'Geen tags toegevoegd',
'upload_max_file_size' => 'De maximale bestandsgrootte is momenteel %s.',
'ldap_cant_connect' => 'Kan niet verbinden met de LDAP auth server.',
'user_create_password' => 'Indien leeg gelaten, wilt u misschien een melding sturen naar het e-mailadres van de gebruiker.',
'mail.new_account_text_with_pw' => 'Hallo %s!<br>er is een nieuw account voor je aangemaakt op %s (<a href="%s">%s</a>), met de volgende inloggegevens:<br><br>Gebruikersnaam: %s<br>Wachtwoord: %s<br><br>Klik op de volgende link om naar de inlogpagina te gaan:<br><a href="%s">%s</a>',
'mail.new_account_text_with_reset' => 'Hallo %s!<br>er is een nieuw account voor je aangemaakt op %s (<a href="%s">%s</a>), klik op de volgende link om een wachtwoord aan te maken en te activeren:<br><br><a href="%s">%s</a>',
'mail.new_account' => 'Nieuwe account aanmaken',
'send_notification' => 'Verstuur e-mail notificatie',
'recaptcha_secret_key' => 'reCAPTCHA geheime sleutel',
'recaptcha_site_key' => 'reCAPTCHA site sleutel',
'only_recaptcha_v3' => 'Alleen reCAPTCHA v3 wordt ondersteund.',
'recaptcha_keys_required' => 'Alle reCAPTCHA sleutels zijn vereist.',
'recaptcha_enabled' => 'reCAPTCHA ingeschakeld',
'recaptcha_failed' => 'reCAPTCHA mislukt',
'danger_zone' => 'Gevarenzone',
'account_media_deleted' => 'Alle media in het accounts is verwijderd.',
'clear_account' => 'Account wissen',
'delete_all' => 'Verwijder alles',
'delete_selected' => 'Verwijder geselecteerde',
'used_space' => 'Gebruikte ruimte',
'quota_recalculated' => 'Gebruikersquota succesvol herberekend vanaf schijf.',
'recalculate_user_quota' => 'Herbereken gebruikersquota vanaf schijf',
'password_restored' => 'Wachtwoord reset.',
'password_match' => 'Wachtwoord en herhaal wachtwoord dienen identiek te zijn.',
'password_repeat' => 'Herhaal wachtwoord',
'quota_enabled' => 'Gebruikersquota inschakelen',
'account_activated' => 'Account geactiveerd, je kunt nu inloggen!',
'recover_email_sent' => 'Indien het account bestaat, is er een e-mail verzonden.',
'mail.recover_password' => '%s Wachtwoordherstel',
'mail.recover_text' => 'Hallo %s,<br>een wachtwoord reset is voor dit account aangevraagd. Klik om de volgende link om de procedure te voltooien:<br><br><a href="%s">%s</a><br><br>Als je geen wachtwoord reset hebt aangevraagd, dan kun je deze e-mail negeren.',
'mail.activate_account' => '%s Accountactivatie',
'mail.activate_text' => 'Hallo %s!<br>bedankt voor het aanmaken van een account op %s (<a href="%s">%s</a>), klik op de volgende link om je account te activeren:<br><br><a href="%s">%s</a>',
'invalid_quota' => 'Ongeldige waarde als standaard gebruikersquota.',
'max_user_quota' => 'Max gebruikersquota',
'default_user_quota' => 'Standaard gebruikersquotum',
'register_success' => 'Het account is aangemaakt, een verificatie e-mail is verzonden.',
'register' => 'Registreren',
'no_account' => 'Heb je geen account?',
'password_recovery' => 'Wachtwoord herstellen',
'export_data' => 'Exporteer data',
'settings_saved' => 'Systeeminstellingen opgeslagen!',
'copy_url_behavior' => 'Kopieer URL mode',
'hide_by_default' => 'Verberg media standaard',
'register_enabled' => 'Registraties ingeschakeld',
'dont_close' => 'Sluit dit tabblad niet totdat het is voltooid.',
'please_wait' => 'Wacht alsjeblieft…',
'remember_me' => 'Onthoud me',
'custom_head_set' => 'Custom HTML head toegepast.',
'custom_head_html_hint' => 'Deze inhoud wordt toegevoegd aan de <head> tag op elke pagina.',
'custom_head_html' => 'Aangepaste HTML Head inhoud',
'donate_text' => 'Als je XBackBone leuk vindt, overweeg dan een donatie om ontwikkeling te ondersteunen!',
'donation' => 'Donatie',
'drop_to_upload' => 'Klik of sleep je bestanden hier om ze te uploaden.',
'no_upload_token' => 'Je hebt geen persoonlijke upload token. (Genereer er een en probeer het opnieuw.)',
'prerelease_channel' => 'Pre release kanaal',
'system_settings' => 'Systeem instellingen',
'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

@ -1,10 +1,10 @@
<?php
return [
'lang' => 'Polski',
'lang' => 'Polish',
'yes' => 'Tak',
'no' => 'Nie',
'send' => 'Wyślij',
'no_media' => 'Nie znaleziono pliku.',
'no_media' => 'Nie znaleziono plików.',
'login.username' => 'Nazwa użytkownika lub e-mail',
'password' => 'Hasło',
'login' => 'Login',
@ -17,11 +17,11 @@ return [
'pager.previous' => 'Poprzednia',
'copy_link' => 'Skopiuj link',
'public.telegram' => 'Udostępnij na Telegram',
'public.delete_text' => 'Jesteś pewien, że chcesz usunąć ten element? Nie będzie się dało go już odzyskać!',
'public.delete_text' => 'Jesteś pewien, że chcesz usunąć ten element? Nie będzie możliwości odzyskania go',
'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,15 +38,15 @@ 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!',
'email_required' => 'Email jest wymagany.',
'email_required' => 'Adres e-mail jest wymagany.',
'username_required' => 'Nazwa użytkownika jest wymagana.',
'username_taken' => 'Nazwa użytkownika jest już zajęta.',
'password_required' => 'Hasło jest wymagane.',
'user_created' => 'Użytkownik "%s" utworzony!',
'user_created' => 'Użytkownik „%s” utworzony!',
'profile_updated' => 'Profil zaktualizowany pomyślnie!',
'enforce_language' => 'Wymuś język',
'home' => 'Strona główna',
@ -70,8 +70,8 @@ return [
'account_disabled' => 'Twoje konto jest wyłączone.',
'goodbye' => 'Do zobaczenia!',
'token_not_found' => 'Nie znaleziono określonego tokena.',
'email_taken' => 'Ten email jest już zajęty.',
'user_updated' => 'Użytkownik "%s" zaktualizowany!',
'email_taken' => 'Ten adres e-mail jest już zajęty.',
'user_updated' => 'Użytkownik „%s” zaktualizowany!',
'user_deleted' => 'Użytkownik usunięty.',
'cannot_delete' => 'Nie możesz usunąć siebie.',
'cannot_demote' => 'Nie możesz siebie zdegradować.',
@ -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' => 'Platforma w trakcie konserwacji, spróbuj ponownie później...',
'maintenance_in_progress' => 'Trwają prace techniczne, 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).',
@ -122,20 +122,10 @@ return [
'register' => 'Rejestracja',
'default_user_quota' => 'Domyślny przydział użytkownika',
'invalid_quota' => 'Nieprawidłowe wartości jako domyślny przydział użytkownika.',
'mail.activate_text' => 'Hej %s!
dziękujemy za stworzenie konta na %s (%s), kliknij poniższy link w celu jego aktywacji:
%s',
'register_success' => 'Konto zostało utworzone, email potwierdzający został wysłany.',
'register_success' => 'Konto zostało utworzone, e-mail potwierdzający został wysłany.',
'mail.activate_account' => '%s - Aktywacja konta',
'mail.recover_text' => 'Hej %s,
została wysłana prośba o zresetowanie hasła dla twojego konta. Aby ukończyć procedurę, kliknij w poniższy link:
%s
Jeżeli to nie ty zażądałeś zmiany hasła, po prostu zignoruj ten email.',
'mail.recover_password' => '%s - Odzyskiwanie hasła',
'recover_email_sent' => 'Jeżeli istnieje, wiadomość email do odzyskiwania hasła została wysłane na określone konto.',
'recover_email_sent' => 'Jeżeli istnieje, wiadomość e-mail do odzyskiwania hasła została wysłane na określone konto.',
'account_activated' => 'Konto aktywowane, teraz możesz się zalogować!',
'quota_enabled' => 'Włącz przydział użytkownika',
'password_repeat' => 'Powtórz hasło',
@ -156,4 +146,21 @@ Jeżeli to nie ty zażądałeś zmiany hasła, po prostu zignoruj ten email.',
'only_recaptcha_v3' => 'Tylko reCAPTCHA v3 jest obsługiwana.',
'recaptcha_site_key' => 'Klucz strony reCAPTCHA',
'recaptcha_secret_key' => 'Sekretny klucz reCAPTCHA',
'send_notification' => 'Wyślij powiadomienie e-mail',
'auto_tagging' => 'Automatyczne tagowanie po przesłaniu',
'no_tags' => 'Nie dodano tagów',
'upload_max_file_size' => 'Obecnie maksymalny rozmiar pliku wynosi %s.',
'ldap_cant_connect' => 'Nie można połączyć z serwerem uwierzytelniającym LDAP.',
'user_create_password' => 'Jeśli pozostawiono puste, możesz wysłać powiadomienie na adres e-mail użytkownika.',
'mail.new_account' => '%s - Tworzenie nowego konta',
'show_changelog' => 'Pokaż dziennik zmian',
'changelog' => 'Dziennik zmian',
'zip_ext_not_loaded' => 'Wymagane rozszerzenie zip nie jest załadowane',
'mail.new_account_text_with_pw' => 'Cześć %s!<br>zostało utworzone nowe konto dla Ciebie na %s (<a href="%s">%s</a>), z następującymi danymi logowania:<br><br>Nazwa użytkownika: %s<br>Hasło: %s<br><br>Kliknij w poniższy link, aby przejść na stronę logowania:<br><a href="%s">%s</a>',
'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

@ -1,15 +1,15 @@
<?php
return [
'lang' => 'Portuguese',
'lang' => 'Português',
'yes' => 'Sim',
'no' => 'Não',
'send' => 'Enviar',
'no_media' => 'Nenhuma mídia encontrada.',
'login.username' => 'Username ou E-Mail',
'password' => 'Password',
'login' => 'Login',
'username' => 'Nome de Utilizador',
'home' => 'Home',
'login.username' => 'Nome de utilizador ou e-mail',
'password' => 'Palavra-passe',
'login' => 'Iniciar sessão',
'username' => 'Nome de utilizador',
'home' => 'Início',
'users' => 'Utilizadores',
'system' => 'Sistema',
'profile' => 'Perfil',
@ -18,7 +18,7 @@ return [
'pager.previous' => 'Anterior',
'copy_link' => 'Copiar link',
'public.telegram' => 'Partilhar no Telegram',
'public.delete_text' => 'Tem a certeza que pretende apagar este item ? Vai desaparecer para sempre!',
'public.delete_text' => 'Tem a certeza que pretende apagar este item ? Não será possível reverter essa ação',
'preview' => 'Pré-visualização',
'filename' => 'Nome do ficheiro',
'size' => 'Tamanho',
@ -26,7 +26,7 @@ return [
'owner' => 'Dono',
'date' => 'Data',
'raw' => 'Mostrar raw',
'download' => 'Transferir',
'download' => 'Descarregar',
'delete' => 'Apagar',
'publish' => 'Publicar',
'hide' => 'Esconder',
@ -44,7 +44,7 @@ return [
'token' => 'Token',
'copy' => 'Copiar',
'upload' => 'Enviar',
'click_to_load' => 'Clique para carregar...',
'click_to_load' => 'Clique para carregar...',
'update' => 'Atualizar',
'edit' => 'Editar',
'client_config' => 'Configuração do cliente',
@ -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.',
@ -62,34 +62,34 @@ return [
'welcome' => 'Bem vindo, %s!',
'goodbye' => 'Adeus!',
'token_not_found' => 'O token indicado não é válido.',
'email_required' => 'O email é necessário.',
'email_taken' => 'Este endereço de email já foi utilizado.',
'email_required' => 'Endereço de e-mail necessário.',
'email_taken' => 'Este endereço de e-mail já foi utilizado.',
'username_required' => 'O nome de utilizador é necessário.',
'username_taken' => 'Este nome de utilizador já foi utilizado.',
'password_required' => 'A senha é necessária.',
'user_created' => 'Utilizador "%s" criado!',
'user_updated' => 'Utilizador "%s" atualizado!',
'password_required' => 'A palavra-passe é necessária.',
'user_created' => 'Utilizador «%s» criado!',
'user_updated' => 'Utilizador «%s» atualizado!',
'profile_updated' => 'Perfil atualizado com sucesso!',
'user_deleted' => 'Utilizador apagado.',
'cannot_delete' => 'Você não pode se excluir.',
'cannot_delete' => 'Não pode apagar a si próprio.',
'cannot_demote' => 'Você não pode se rebaixar.',
'cannot_write_file' => 'O caminho de destino não pode ser escrito.',
'switch_to' => 'Mudar para',
'gallery' => 'Galeria',
'table' => 'Tabela',
'dotted_search' => 'Pesquisar...',
'order_by' => 'Ordenar por...',
'dotted_search' => 'Pesquisar',
'order_by' => 'Ordenar por',
'time' => 'Data',
'name' => 'Nome',
'maintenance' => 'Manutenção',
'path_not_writable' => 'O caminho de destino não pode ser escrito.',
'already_latest_version' => 'Já tem a versão mais recente.',
'new_version_available' => 'Nova versão %s está disponível!',
'file_size_no_match' => 'O arquivo baixado não corresponde ao tamanho correto do arquivo.',
'file_size_no_match' => 'O ficheiro descarregado não corresponde ao tamanho correto do ficheiro.',
'check_for_updates' => 'Verifique se há atualizações',
'upgrade' => 'Atualizar',
'updates' => 'Atualizações',
'maintenance_in_progress' => 'Plataforma em manutenção, tente novamente mais tarde...',
'maintenance_in_progress' => 'Plataforma sob manutenção, tente novamente mais tarde…',
'cancel' => 'Cancelar',
'auto_set' => 'Definir automaticamente',
'default_lang_behavior' => 'O XBackBone tentará corresponder ao idioma do navegador por padrão (a alternativa é o inglês).',
@ -101,4 +101,65 @@ return [
'remember_me' => 'Lembrar-me',
'please_wait' => 'Por favor aguarde…',
'dont_close' => 'Não feche esta janela até a conclusão.',
'custom_head_set' => 'HTML head personalizado aplicado com sucesso.',
'custom_head_html_hint' => 'Esse conteúdo será adicionado ao <head> de todas as páginas.',
'custom_head_html' => 'HTML Head personalizado',
'cannot_retrieve_file' => 'Não é possível acessar o ficheiro.',
'deleted_orphans' => '%d ficheiros órfãos apagados com sucesso.',
'system_settings' => 'Configurações do sistema',
'php_info' => 'Informações PHP',
'orphaned_files' => 'Ficheiros órfãos',
'enforce_language' => 'Forçar idioma',
'mail.activate_account' => '%s - Ativação de conta',
'only_recaptcha_v3' => 'Apenas o reCAPTCHA v3 é suportado.',
'recaptcha_enabled' => 'reCAPTCHA Activado',
'recaptcha_failed' => 'reCAPTCHA Falhou',
'delete_all' => 'Apagar tudo',
'used_space' => 'Espaço Utilizado',
'quota_enabled' => 'Ativar quota de utilizador',
'mail.recover_password' => '%s - Recuperação de palavra-passe',
'default_user_quota' => 'Quota de utilizador predefinida',
'register_success' => 'A conta foi criada, um e-mail de confirmação foi enviado.',
'no_account' => 'Não tem uma conta?',
'password_recovery' => 'Recuperar palavra-passe',
'export_data' => 'Exportar dados',
'zip_ext_not_loaded' => 'A extensão zip necessária não foi executada',
'auto_tagging' => 'Etiquetagem de carregamento automático',
'user_create_password' => 'Se deixado em branco, deverá enviar uma notificação para o e-mail do utilizador.',
'mail.new_account_text_with_pw' => 'Olá %s!<br>Foi criada uma nova conta no %s (<a href="%s">%s</a>), com as seguintes credenciais:<br><br>Nome de utilizador: %s<br>Palavra-passe: %s<br><br>Carregue na seguinte ligação para aceder à página de inicio de sessão:<br><a href="%s">%s</a>',
'danger_zone' => 'Zona perigosa',
'copy_url_behavior' => 'Copiar modo URL',
'hide_by_default' => 'Ocultar média por predefinição',
'register_enabled' => 'Registos ativados',
'clean_orphaned_uploads' => 'Deletar uploads órfãos',
'copied' => 'Copiado para a área de transferência!',
'show_changelog' => 'Mostrar Registo de Alterações',
'changelog' => 'Registo de Alterações',
'no_tags' => 'Sem marcadores adicionados',
'upload_max_file_size' => 'O tamanho máximo para um ficheiro é %s.',
'ldap_cant_connect' => 'Não foi possível ligar ao servidor de autenticação LDAP.',
'mail.new_account_text_with_reset' => 'Olá, %s!<br>Foi criada uma nova conta no %s (<a href="%s">%s</a>). Carregue no seguinte ligação para definir uma palavra-passe e proceder à ativação da conta. it:<br><br><a href="%s">%s</a>',
'mail.new_account' => '%s - Criação de Nova Conta',
'send_notification' => 'Enviar Notificação via E-mail',
'recaptcha_secret_key' => 'Chave reCAPTCHA Secreta',
'recaptcha_site_key' => 'Chave reCAPTCHA do site',
'recaptcha_keys_required' => 'Todas as chaves reCAPTCHA são necessárias.',
'account_media_deleted' => 'Todo o média nesta conta foi apagado.',
'clear_account' => 'Limpar Conta',
'delete_selected' => 'Apagar os selecionados',
'quota_recalculated' => 'Quota de utilizadores recalculada do disco com sucesso.',
'recalculate_user_quota' => 'Recalcular quota de utilizadores do disco',
'password_restored' => 'Redefinir palavra passe.',
'password_match' => 'A palavra passe e a sua repetição têm de ser iguais.',
'password_repeat' => 'Repetir palavra passe',
'account_activated' => 'Conta ativada, já podes iniciar sessão!',
'recover_email_sent' => 'Se existente, um e-mail de recuperação será enviado para a conta especificada.',
'mail.recover_text' => 'Olá %s,<br>uma redefinição de palavra passe foi pedida para a tua conta. Para completares este procedimento, carrega na seguinte ligação:<br><br><a href="%s">%s</a><br><br> Caso não tenhas pedido uma redefinição de palavra-passe, simplesmente ignora esta mensagem.',
'mail.activate_text' => 'Olá %s!<br>Obrigado por teres criado a tua conta no %s (<a href="%s">%s</a>), carrega na ligação a seguir to ativá-las:<br><br><a href="%s">%s</a>',
'invalid_quota' => 'Valores inválidos definidos para a quota predefinida dos utilizadores.',
'max_user_quota' => 'Quota Máxima do Utilizador',
'register' => 'Registar',
'settings_saved' => 'Definições de sistema guardadas!',
'image_embeds' => 'Embutir imagens',
'vanity_url' => 'URL personalizado',
];

163
resources/lang/ro.lang.php Normal file
View file

@ -0,0 +1,163 @@
<?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

@ -5,7 +5,7 @@ return [
'no' => 'Нет',
'send' => 'Отправить',
'no_media' => 'Файлы не найдены.',
'login.username' => 'Имя пользователя или E-Mail',
'login.username' => 'Имя пользователя или эл. почта',
'password' => 'Пароль',
'login' => 'Войти',
'username' => 'Имя пользователя',
@ -18,7 +18,7 @@ return [
'pager.previous' => 'Предыдущая',
'copy_link' => 'Скопировать ссылку',
'public.telegram' => 'Отправить в Telegram',
'public.delete_text' => 'Вы уверены, что хотите удалить это? Восстановление будет невозможно!',
'public.delete_text' => 'Вы уверены, что хотите удалить это? Восстановление будет невозможно',
'preview' => 'Превью',
'filename' => 'Имя файла',
'size' => 'Размер',
@ -33,7 +33,7 @@ return [
'files' => 'Файлы',
'orphaned_files' => 'Потерянные файлы',
'theme' => 'Тема',
'click_to_load' => 'Нажмите для загрузки...',
'click_to_load' => 'Нажмите для загрузки',
'apply' => 'Применить',
'save' => 'Сохранить',
'used' => 'Использовано',
@ -44,17 +44,17 @@ return [
'is_admin' => 'Администратор',
'your_profile' => 'Ваш профиль',
'token' => 'Ключ',
'copy' => 'Скопировать',
'update' => 'Обновить',
'copy' => 'Копировать',
'update' => 'Обновление',
'edit' => 'Редактировать',
'client_config' => 'Конфигурация клиента',
'user_code' => 'Код пользователя',
'active' => 'Активен',
'active' => 'Активный',
'admin' => 'Админ',
'reg_date' => 'Дата регистрации',
'none' => 'Нет',
'none' => 'Никак',
'open' => 'Открыть',
'confirm' => 'Подтверждение',
'confirm' => 'Потвердить',
'confirm_string' => 'Вы уверены?',
'installed' => 'Установка успешно завершена!',
'bad_login' => 'Неверные учетные данные.',
@ -62,13 +62,13 @@ return [
'welcome' => 'Добро пожаловать, %s!',
'goodbye' => 'До встречи!',
'token_not_found' => 'Указанный ключ не найден.',
'email_required' => 'Требуется указать e-mail.',
'email_taken' => 'E-mail уже занят.',
'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' => 'Вы не можете удалить самого себя.',
@ -78,8 +78,8 @@ return [
'switch_to' => 'Переключиться на',
'gallery' => 'Галерея',
'table' => 'Таблица',
'dotted_search' => 'Поиск...',
'order_by' => 'Сортировка...',
'dotted_search' => 'Поиск',
'order_by' => 'Сортировка',
'time' => 'Время',
'name' => 'Название',
'maintenance' => 'Обслуживание',
@ -92,7 +92,7 @@ return [
'check_for_updates' => 'Проверить обновления',
'upgrade' => 'Обновить',
'updates' => 'Обновления',
'maintenance_in_progress' => 'Система на обслуживании, попробуйте позже...',
'maintenance_in_progress' => 'Система на обслуживании, попробуйте позже',
'cancel' => 'Отмена',
'enforce_language' => 'Выбрать язык',
'auto_set' => 'Выбрать автоматически',
@ -101,4 +101,69 @@ return [
'lang_name' => 'язык',
'default_lang_behavior' => 'XBackBone попробует выбрать язык вашего браузера по умолчанию, иначе будет выбран Английский.',
'lang_set' => 'Выбран следующий язык: "%s"',
'zip_ext_not_loaded' => 'Необходимое zip расширение не загружено',
'settings_saved' => 'Системные настройки сохранены!',
'copy_url_behavior' => 'Режим копирования URL',
'hide_by_default' => 'Скрывать медиа по-умолчанию',
'register_enabled' => 'Регистрация включена',
'dont_close' => 'Не закрывайте эту вкладку до полного завершения.',
'please_wait' => 'Ждите…',
'custom_head_set' => 'Ваш HTML заголовок применен.',
'custom_head_html_hint' => 'Эти данные будут добавлены в тег <head> на каждой странице.',
'custom_head_html' => 'Задать свои данные в заголовоке HTML',
'donate_text' => 'Если вам нравится XBackBone, вы можете пожертвовать деньги для поддержки разработки!',
'drop_to_upload' => 'Нажмите или перетащите сюда файлы для выгрузки.',
'no_upload_token' => 'У вас нет личного ключа для выгрузки. (Сгенерируйте и попробуйте снова.)',
'prerelease_channel' => 'Предварительные версии',
'changelog' => 'Изменения',
'auto_tagging' => 'Авто теги при выгрузке',
'no_tags' => 'Нет добавленных тегов',
'upload_max_file_size' => 'Максимальный размер файла %s.',
'ldap_cant_connect' => 'Не удается подключиться к серверу авторизации LDAP.',
'user_create_password' => 'Если поле пустое, вы можете отправить уведомление на почту пользователя.',
'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>',
'mail.new_account_text_with_reset' => 'Привет %s!<br>ваш новый аккаунт был создан на %s (<a href="%s">%s</a>), нажмите на ссылку для установки пароля и активации аккаунта:<br><br><a href="%s">%s</a>',
'mail.new_account' => '%s - создание нового аккаунта',
'send_notification' => 'Отправить уведомление на почту',
'recaptcha_secret_key' => 'Секретный ключ reCAPTCHA',
'recaptcha_site_key' => 'Ключ сайта reCAPTCHA',
'only_recaptcha_v3' => 'Поддерживается только reCAPTCHA v3.',
'recaptcha_keys_required' => 'Все ключи reCAPTCHA обязательны.',
'recaptcha_enabled' => 'reCAPTCHA включена',
'recaptcha_failed' => 'reCAPTCHA неверна',
'danger_zone' => 'Опасная зона',
'account_media_deleted' => 'Все медиа на аккаунте были удалены.',
'clear_account' => 'Очистить аккаунт',
'delete_all' => 'Удалить все',
'delete_selected' => 'Удалить выбранное',
'used_space' => 'Использовано места',
'quota_recalculated' => 'Квота пользователя с диска пересчитана успешно.',
'recalculate_user_quota' => 'Пересчитать квоту пользователя на диске',
'password_restored' => 'Сброс пароля.',
'password_match' => 'Пароли в обоих полях должны совпадать.',
'password_repeat' => 'Повторите пароль',
'quota_enabled' => 'Включить квоту на пользователей',
'account_activated' => 'Аккаунт активирован, теперь вы можете войти!',
'recover_email_sent' => 'Если активно, на указанную почту был отправлен запрос о восстановлении пароля.',
'mail.recover_password' => '%s - восстановление пароля',
'mail.recover_text' => 'Привет %s,<br>на ваш аккаунт получен запрос о сбросе пароля. Для завершения процедуры нажмите на ссылку:<br><br><a href="%s">%s</a><br><br>Если вы не запрашивали сброс пароля, просто проигнорируйте это письмо.',
'mail.activate_account' => '%s активация аккаунта',
'mail.activate_text' => 'Привет %s!<br>спасибо за создание аккаунта на %s (<a href="%s">%s</a>), нажмите на ссылку для его активации:<br><br><a href="%s">%s</a>',
'invalid_quota' => 'Неверное значение квоты в поле.',
'max_user_quota' => 'Макс. квота пользователей',
'default_user_quota' => 'Квота пользователей',
'register_success' => 'Аккаунт был создан, на вашу почту отправлено письмо для подтверждения.',
'register' => 'Регистрация',
'no_account' => 'Нет аккаунта?',
'password_recovery' => 'Восстановить пароль',
'export_data' => 'Экспорт данных',
'show_changelog' => 'Показать изменения',
'remember_me' => 'Запомнить меня',
'donation' => 'Пожертвование',
'copied' => 'Скопировано!',
'system_settings' => 'Системные настройки',
'upload' => 'Выгрузить',
'php_info' => 'Информация о PHP',
'image_embeds' => 'Встроенные изображения',
'vanity_url' => 'Пользовательский URL',
];

163
resources/lang/sr.lang.php Normal file
View file

@ -0,0 +1,163 @@
<?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.',
];

165
resources/lang/sv.lang.php Normal file
View file

@ -0,0 +1,165 @@
<?php
return [
'cannot_delete' => 'Du kan inte ta bort dig själv.',
'user_deleted' => 'Användare borttagen.',
'profile_updated' => 'Profiluppdatering lyckades!',
'user_updated' => 'Användare ”%s” uppdaterad!',
'user_created' => 'Användare ”%s” skapad!',
'password_required' => 'Lösenord krävs.',
'username_taken' => 'Användarnamnet används redan.',
'username_required' => 'Användarnamn krävs.',
'email_taken' => 'E-postadressen används redan.',
'email_required' => 'E-postadress krävs.',
'goodbye' => 'Hejdå!',
'welcome' => 'Välkommen, %s!',
'account_disabled' => 'Ditt konto är avstängt.',
'bad_login' => 'Fel uppgifter.',
'installed' => 'Installationen lyckades!',
'confirm_string' => 'Är du säker?',
'open' => 'Öppna',
'none' => 'Ingen',
'reg_date' => 'Registreringsdatum',
'admin' => 'Admin',
'active' => 'Aktiv',
'user_code' => 'Användarkod',
'client_config' => 'Klientkonfiguration',
'edit' => 'Ändra',
'update' => 'Uppdatera',
'copy' => 'Kopiera',
'your_profile' => 'Din profil',
'is_admin' => 'Är administratör',
'is_active' => 'Är aktiv',
'user.edit' => 'Ändra Användare',
'user.create' => 'Skapa användare',
'system_settings' => 'Systeminställningar',
'php_info' => 'PHP-Information',
'used' => 'Använd',
'save' => 'Spara',
'apply' => 'Applicera',
'click_to_load' => 'Klicka för att ladda…',
'theme' => 'Tema',
'files' => 'Filer',
'hide' => 'Göm',
'publish' => 'Publicera',
'delete' => 'Ta bort',
'upload' => 'Ladda upp',
'download' => 'Ladda ner',
'raw' => 'Visa omodifierad',
'date' => 'Datum',
'owner' => 'Ägare',
'public' => 'Offentligt',
'size' => 'Storlek',
'filename' => 'Filnamn',
'preview' => 'Förhandsgranskning',
'public.delete_text' => 'Är du säker på att du vill ta bort detta? Det går inte att återställa',
'public.telegram' => 'Dela på Telegram',
'copy_link' => 'Kopiera länken',
'pager.previous' => 'Tidigare',
'pager.next' => 'Nästa',
'logout' => 'Logga ut',
'profile' => 'Profil',
'system' => 'System',
'users' => 'Användare',
'home' => 'Hem',
'username' => 'Användarnamn',
'login' => 'Inloggning',
'password' => 'Lösenord',
'login.username' => 'Användarnamn eller e-post',
'no_media' => 'Ingen media kunde hittas.',
'send' => 'Skicka',
'no' => 'Nej',
'yes' => 'Ja',
'lang' => 'Engelska',
'enforce_language' => 'Verkställ språk',
'show_changelog' => 'Visa förändringslogg',
'changelog' => 'Förändringslogg',
'zip_ext_not_loaded' => 'Det nödvändiga "zip"-tillägget har ej laddats',
'auto_tagging' => 'Automatisk taggning av uppladdningar',
'no_tags' => 'Inga taggar tillagt',
'upload_max_file_size' => 'Den maximala filstorleken är för närvarande %s.',
'ldap_cant_connect' => 'Kan ej ansluta till LDAP auth-servern.',
'user_create_password' => 'Om fältet lämnas blankt bör du skicka ett meddelande till användarens e-postadress.',
'mail.new_account_text_with_pw' => 'Hej %s!<br>ett nytt konto skapades åt dig hos %s (<a href="%s">%s</a>), med följande inloggningsuppgifter:<br><br>Användarnamn: %s<br>Lösenord: %s<br><br>Klicka på följande länk för att logga in:<br><a href="%s">%s</a>',
'mail.new_account_text_with_reset' => 'Hej %s!<br>ett nytt konto skapades för dig hos %s (<a href="%s">%s</a>), klicka på följande länk för att ställa in lösenord och aktivera kontot:<br><br><a href="%s">%s</a>',
'mail.new_account' => '%s - Skapa Nytt Konto',
'send_notification' => 'Skicka påminnelser via mejl',
'recaptcha_secret_key' => 'reCAPTCHA Secret Key',
'recaptcha_site_key' => 'reCAPTCHA Site Key',
'only_recaptcha_v3' => 'Endast reCAPTCHA v3 stöds.',
'recaptcha_keys_required' => 'Alla reCAPTCHA-nycklar är obligatoriska.',
'recaptcha_enabled' => 'reCAPTCHA Aktiverad',
'recaptcha_failed' => 'reCAPTCHA Misslyckades',
'danger_zone' => 'Farozon',
'account_media_deleted' => 'All media på kontot har raderats.',
'clear_account' => 'Rensa Konto',
'delete_all' => 'Radera Alla',
'delete_selected' => 'Radera Markerat',
'used_space' => 'Använt Utrymme',
'quota_recalculated' => 'Omräkning av användarkvot lyckades.',
'recalculate_user_quota' => 'Räkna om användarkvot från disk',
'password_restored' => 'Lösenordsåterställning.',
'password_match' => 'Lösenordet och det bekräftade lösenordet måste stämma överens.',
'password_repeat' => 'Bekräfta Lösenord',
'quota_enabled' => 'Aktivera användarkvot',
'account_activated' => 'Konto aktiverades, nu kan du logga in!',
'recover_email_sent' => 'Om tillgängligt skickades ett mejl med återställning av lösenord till det angivna kontot.',
'mail.recover_password' => '%s - Återställning av Lösenord',
'mail.recover_text' => 'Hej %s,<br>en återställning av lösenord har begärts för ditt konto. För att utföra återställningen, klicka på följande länk:<br><br><a href="%s">%s</a><br><br>Om du inte begärt återställning av lösenord kan du ignorera detta mejl.',
'mail.activate_account' => '%s - Kontoaktivering',
'mail.activate_text' => 'Hej %s!<br>tack för att du skapat ett konto hos %s (<a href="%s">%s</a>), klicka på följande länk för att aktivera:<br><br><a href="%s">%s</a>',
'invalid_quota' => 'Ogiltiga värden som standard användarkvot.',
'max_user_quota' => 'Maximal Användarkvot',
'default_user_quota' => 'Användarkvot som standard',
'register_success' => 'Kontot skapades, ett bekräftelsemejl har skickats.',
'register' => 'Registrera',
'no_account' => 'Inget konto?',
'password_recovery' => 'Återställ lösenord',
'export_data' => 'Exportera data',
'settings_saved' => 'Systeminställningar sparades!',
'copy_url_behavior' => 'Kopiera URL-läge',
'hide_by_default' => 'Dölj media som standard',
'register_enabled' => 'Registrering aktiverad',
'dont_close' => 'Stäng ej denna tabb innan processen är klar.',
'please_wait' => 'Vänligen vänta…',
'remember_me' => 'Kom ihåg mig',
'custom_head_html' => 'Anpassat HTML Head-innehåll',
'custom_head_set' => 'Anpassad HTML head tillämpad.',
'custom_head_html_hint' => 'Innehållet kommer läggas till i <head>-taggen på varje sida.',
'donate_text' => 'Om du gillar XBackBone, överväg att donera för att främja fortsatt utveckling!',
'donation' => 'Donera',
'drop_to_upload' => 'Klicka eller släpp dina filer här för att ladda upp.',
'no_upload_token' => 'Du har ingen personlig uppladdningstoken (Skapa en och försök igen.)',
'prerelease_channel' => 'Kanal för tidiga utgåvor',
'default_lang_behavior' => 'XBackBone kommer försöka matcha webbläsarens språk som standard (Engelska är i reserv).',
'auto_set' => 'Ställ in automatiskt',
'cancel' => 'Avbryt',
'maintenance_in_progress' => 'Plattformen genomgår underhåll, försök igen senare…',
'updates' => 'Uppdateringar',
'upgrade' => 'Uppgradera',
'check_for_updates' => 'Sök efter uppdateringar',
'file_size_no_match' => 'Den nedladdade filen matchar ej den korrekta filstorleken.',
'cannot_retrieve_file' => 'Kan ej hämta filen.',
'new_version_available' => 'Ny version %s tillgänglig!',
'already_latest_version' => 'Du har redan den senaste versionen.',
'path_not_writable' => 'Den utgående sökvägen är ej skrivbar.',
'clean_orphaned_uploads' => 'Rensa Föräldralösa Uppladdningar',
'maintenance' => 'Underhåll',
'name' => 'Namn',
'time' => 'Tid',
'order_by' => 'Sortera efter…',
'dotted_search' => 'Sök…',
'table' => 'Tabell',
'gallery' => 'Galleri',
'switch_to' => 'Byt till',
'deleted_orphans' => 'Borttagning av %d föräldralösa filer lyckades.',
'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',
'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',
];

165
resources/lang/tr.lang.php Normal file
View file

@ -0,0 +1,165 @@
<?php
return [
'orphaned_files' => 'Sahipsiz Dosyalar',
'files' => 'Dosyalar',
'hide' => 'Gizle',
'publish' => 'Yayınla',
'delete' => 'Sil',
'upload' => 'Yükle',
'download' => 'İndir',
'raw' => 'Kaynak göster',
'date' => 'Tarih',
'owner' => 'Sahip',
'public' => 'Herkese açık',
'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ş',
'copy_link' => 'Bağlantıyı kopyala',
'pager.previous' => 'Önceki',
'pager.next' => 'Sonraki',
'logout' => 'Oturumu kapat',
'profile' => 'Profil',
'system' => 'Sistem',
'users' => 'Kullanıcılar',
'home' => 'Ana sayfa',
'username' => 'Kullanıcı adı',
'login' => 'Oturum aç',
'password' => 'Parola',
'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',
'copy' => 'Kopyala',
'token' => 'Belirteç',
'your_profile' => 'Profiliniz',
'is_admin' => 'Yönetici mi',
'is_active' => 'Etkin mi',
'user.edit' => 'Kullanıcıyı düzenle',
'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…',
'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',
];

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