Compare commits
551 commits
Author | SHA1 | Date | |
---|---|---|---|
|
a00fd5a5e2 | ||
|
0fe1748077 | ||
|
c58a114ac9 | ||
|
23f6b18ffe | ||
|
4ad4b20762 | ||
|
1c2801e2f0 | ||
|
a918c95a56 | ||
|
fa85310d1d | ||
|
8fabc57f04 | ||
|
cd28fe11af | ||
|
687c503efd | ||
|
c6f087e092 | ||
|
4718d8a0b1 | ||
|
bb97621041 | ||
|
49e3110273 | ||
|
41b26f45b7 | ||
|
f2ae33bcd7 | ||
|
96972b8222 | ||
|
06562d194b | ||
|
a600a21753 | ||
|
1193c96966 | ||
|
4946750beb | ||
|
cc8ed75ec6 | ||
|
9dbf1400f6 | ||
|
dd5e30abe2 | ||
|
59c6691585 | ||
|
bd3ca55e20 | ||
|
04a6770f19 | ||
|
a8f26558a6 | ||
|
853ed10e1c | ||
|
25ed553ed1 | ||
|
ab211c571a | ||
|
3f9bc8ae7c | ||
|
2c33f19785 | ||
|
57a66f83bd | ||
|
41870dce76 | ||
|
f5fba276fd | ||
|
b2403baf0b | ||
|
634d301e80 | ||
|
a0f82ae4ab | ||
|
a5e63dcd33 | ||
|
8cda536340 | ||
|
5d99a96f84 | ||
|
68a428b33f | ||
|
76eecb298b | ||
|
903f87e693 | ||
|
eee497669e | ||
|
e7a0a99fe6 | ||
|
ee55a9ea3a | ||
|
7f07ecdfad | ||
|
a11a9307ea | ||
|
32b8a16c40 | ||
|
c8c540ff50 | ||
|
c8fac0a578 | ||
|
35a2e59c6c | ||
|
95b4435e6f | ||
|
0951638dc8 | ||
|
d3fde3e298 | ||
|
c7a6dd1c16 | ||
|
327005833c | ||
|
49c7b60137 | ||
|
4d791aad06 | ||
|
9c85698c28 | ||
|
91d05884b9 | ||
|
707d32ff25 | ||
|
3702753ade | ||
|
5e6ba5a0b3 | ||
|
7a4be04917 | ||
|
4cf84fdafe | ||
|
d86d3826d5 | ||
|
04e42bd456 | ||
|
c3ebf4d39b | ||
|
e05600ec26 | ||
|
ae5e2cffb3 | ||
|
45dc6ff87b | ||
|
69d6ae298e | ||
|
acaceea3f1 | ||
|
589720d81b | ||
|
46502074a0 | ||
|
020ad75238 | ||
|
02be446c2e | ||
|
58744bd092 | ||
|
2a789d0f8a | ||
|
e8c3b75b99 | ||
|
b790d21e01 | ||
|
237e2f7a57 | ||
|
4deedda3b6 | ||
|
d6dce885d2 | ||
|
d823230c35 | ||
|
634956cb2d | ||
|
6a05a5dac8 | ||
|
9bddf5940b | ||
|
b4f720cf21 | ||
|
2bce85ea6a | ||
|
e2c3aaf89a | ||
|
a9c492c99d | ||
|
3bb2b7b4ea | ||
|
2ddaac8e5a | ||
|
e4e67657d8 | ||
|
1e0e549938 | ||
|
9caee0dc5b | ||
|
99c9f50294 | ||
|
48ba6f009e | ||
|
8379eb41ef | ||
|
90ac32621a | ||
|
80152ac31a | ||
|
3aac808525 | ||
|
57122a8f96 | ||
|
e155a33f86 | ||
|
46341b4e03 | ||
|
a1b3ab47ab | ||
|
904795029c | ||
|
1eebc961ab | ||
|
0f6cc027f7 | ||
|
c83539245b | ||
|
7af93ae136 | ||
|
96b61b5834 | ||
|
d6d4fbcf94 | ||
|
edc20c30f7 | ||
|
66c708ab77 | ||
|
469ed2068c | ||
|
8242ef5443 | ||
|
0f1c458e76 | ||
|
87a1b8517a | ||
|
5399133b65 | ||
|
59124e994a | ||
|
15e2c3512c | ||
|
7f4f262249 | ||
|
1979c3f318 | ||
|
8bf64a6537 | ||
|
d21f678843 | ||
|
67fdb89ce3 | ||
|
badb0c681d | ||
|
dfc3ab3bce | ||
|
87b7f245c9 | ||
|
e8a9cfea92 | ||
|
6d43b62677 | ||
|
79ed8eeb5e | ||
|
2ec7457fcd | ||
|
659b31548e | ||
|
538f3d6bd8 | ||
|
1a418d46e9 | ||
|
83ec0b5201 | ||
|
ec6b692cc8 | ||
|
aa2d85f5ee | ||
|
a6bfc32869 | ||
|
188dce1a56 | ||
|
94638ae941 | ||
|
f1728d7e91 | ||
|
6a4b49f617 | ||
|
b856ffd530 | ||
|
1e12a57a0d | ||
|
9f64b15f91 | ||
|
daf3665414 | ||
|
9c172ce417 | ||
|
d123eda772 | ||
|
c830a31157 | ||
|
714a5e9d6a | ||
|
e995a2e539 | ||
|
063ecff83f | ||
|
bfed200dcd | ||
|
edb1ced704 | ||
|
8fc0a35749 | ||
|
6ce9041639 | ||
|
d4aca7d3a5 | ||
|
114504bde0 | ||
|
7634741676 | ||
|
dea92d9ada | ||
|
1390ee76c6 | ||
|
8f4f523b22 | ||
|
6134667b32 | ||
|
c16567d0a6 | ||
|
13979d9117 | ||
|
31ebf49944 | ||
|
a273235b0c | ||
|
2ae95bc409 | ||
|
8894d2bb1c | ||
|
37b2f5a423 | ||
|
e0f18fa873 | ||
|
23a44363c3 | ||
|
3f0f491e6e | ||
|
8469e05b02 | ||
|
ffe8d03b19 | ||
|
11c0d578e6 | ||
|
26131aa1fa | ||
|
1954a3a18f | ||
|
cfd1ff343b | ||
|
d71bf25dbc | ||
|
bb5ea36564 | ||
|
c2dd20176f | ||
|
dec28fa0e5 | ||
|
2cd0147888 | ||
|
6523e87520 | ||
|
a4077b7844 | ||
|
0a48ebcab6 | ||
|
52028f5f98 | ||
|
434a5d89b2 | ||
|
9da5582ff6 | ||
|
addde5972a | ||
|
01d3147af8 | ||
|
662a746809 | ||
|
a9790f2e25 | ||
|
a8ced21fef | ||
|
d8501f2b33 | ||
|
ef0d3c1708 | ||
|
7c8a8a3920 | ||
|
bf47596765 | ||
|
ee796c7ded | ||
|
3d248c8cb4 | ||
|
6ca60757ae | ||
|
f508686e20 | ||
|
54284424ff | ||
|
2be6d1994d | ||
|
fbcdc8f20e | ||
|
bfbbf89d79 | ||
|
bddcf34c6d | ||
|
aeeddfed80 | ||
|
4d494f3f6c | ||
|
d7d2b5801c | ||
|
748aa807ca | ||
|
52883982ad | ||
|
aa402c9e9d | ||
|
492ad5e8ea | ||
|
085704a3b5 | ||
|
f7d8174cb3 | ||
|
bcd5959c9a | ||
|
405b42e178 | ||
|
09e326326b | ||
|
d9aa867c9c | ||
|
1fc7da479c | ||
|
db204f8c48 | ||
|
11e5a52519 | ||
|
e5422f9e7d | ||
|
f5922fc12c | ||
|
d140b1188a | ||
|
37c0701700 | ||
|
0ef9f0e0a7 | ||
|
ab259ed943 | ||
|
7cd502837e | ||
|
f99489cfe5 | ||
|
01fca619c6 | ||
|
d79225cfc8 | ||
|
285c970933 | ||
|
dc03734a20 | ||
|
ab1409e108 | ||
|
84020830ca | ||
|
ba9d566152 | ||
|
bff37d6926 | ||
|
8fc06374a2 | ||
|
8668aab500 | ||
|
dd7ae0b89c | ||
|
41a5a6edbb | ||
|
8ca9626697 | ||
|
0166755a60 | ||
|
a98f65c9f6 | ||
|
4660ff5317 | ||
|
dfe73a34f1 | ||
|
53761bdc42 | ||
|
d3c556234b | ||
|
54381b4958 | ||
|
3e53b56aec | ||
|
7c915032c5 | ||
|
1d5bb6ccc7 | ||
|
35ae42510f | ||
|
289c0ab4de | ||
|
ef74962853 | ||
|
6a5e6431aa | ||
|
ec5e7fc46f | ||
|
048b468ba5 | ||
|
3c63025a15 | ||
|
46b20c4d97 | ||
|
6f46b70b83 | ||
|
f8ec764c4c | ||
|
8b333c935d | ||
|
7e0e0db384 | ||
|
63e78d840d | ||
|
ea47f3ee93 | ||
|
33503092b2 | ||
|
01b8d96798 | ||
|
559363925f | ||
|
9ea5a9971d | ||
|
53715b9747 | ||
|
32de7376e1 | ||
|
4adde17d25 | ||
|
9d33eb8191 | ||
|
151d32f0f4 | ||
|
5b954a7853 | ||
|
344e0281f5 | ||
|
90062a668d | ||
|
da0b4f92e9 | ||
|
4940fab973 | ||
|
f3c36e955c | ||
|
c4ede9591b | ||
|
109e3fefbd | ||
|
6f7b1b26c5 | ||
|
4b0f2af8bf | ||
|
15f100ae79 | ||
|
ffabd49990 | ||
|
6a428eee47 | ||
|
181bbff605 | ||
|
3aa350b49e | ||
|
899a6eb794 | ||
|
001c681bd8 | ||
|
bfefd9e42e | ||
|
d11d73a825 | ||
|
49fb6bc39f | ||
|
30311025d1 | ||
|
349090b359 | ||
|
4d6b8aeedd | ||
|
7bcdfb575c | ||
|
c4f319b820 | ||
|
826ac367a4 | ||
|
709d6af44b | ||
|
a35dafd142 | ||
|
5175b9fe83 | ||
|
ecaa423f62 | ||
|
fe92167c9c | ||
|
9f6b8529a7 | ||
|
802d767c0b | ||
|
47ad3353d6 | ||
|
b9e7285be1 | ||
|
09583f6cfe | ||
|
f6df098915 | ||
|
b72e9cda30 | ||
|
014b5428aa | ||
|
7cd172510c | ||
|
f73d43ab8b | ||
|
48d58fbf95 | ||
|
17a1c7b76f | ||
|
fd9f56c949 | ||
|
b53f325743 | ||
|
28c751b1a2 | ||
|
34cb67c40e | ||
|
8bacaa2d14 | ||
|
33c9a11e91 | ||
|
cdaa200e4a | ||
|
2519b25612 | ||
|
cff3af89bb | ||
|
58a36e0e1a | ||
|
b7a04fb2ca | ||
|
fe1c30fe4e | ||
|
b7d593ffc7 | ||
|
d9025e77dd | ||
|
1d879a72fe | ||
|
c0f6827e79 | ||
|
8f79ede78f | ||
|
614fcd0e83 | ||
|
5f272a7176 | ||
|
763a45a65e | ||
|
c4ca9dc962 | ||
|
9cf8ed2ae0 | ||
|
37520bb571 | ||
|
ab0acea8db | ||
|
e04ad4d3f3 | ||
|
3ff9fb181c | ||
|
6ddbc0fca3 | ||
|
f169d20b37 | ||
|
b04b6ff3ce | ||
|
e9354f8152 | ||
|
55451903b0 | ||
|
d59be8e2f2 | ||
|
6bcd455d2e | ||
|
5b8cc0ecbd | ||
|
1c8e4dff47 | ||
|
8ce337233c | ||
|
1012984661 | ||
|
dbd40f6210 | ||
|
30c83811b9 | ||
|
9abe5154f9 | ||
|
0bd56d5e1b | ||
|
50c013af8b | ||
|
c34671d700 | ||
|
0d81256980 | ||
|
cb48fe30eb | ||
|
9a5335ae7f | ||
|
00ae95e965 | ||
|
5af536273e | ||
|
89a19006ad | ||
|
2fecd2bc22 | ||
|
a130bc17d0 | ||
|
125ae162ff | ||
|
333926bbe9 | ||
|
d3d06672a9 | ||
|
3d254a9822 | ||
|
d9be2c7696 | ||
|
4f8b13fd90 | ||
|
ff25de6ceb | ||
|
20c08eb129 | ||
|
2eb269d6bf | ||
|
c34faca4d2 | ||
|
b94d50e11d | ||
|
870464a9ff | ||
|
f2523c24e5 | ||
|
9de27e1278 | ||
|
77bcc18807 | ||
|
a11b9dd711 | ||
|
eb29f9f486 | ||
|
3b71954b96 | ||
|
ead80525ed | ||
|
61efafc991 | ||
|
75c7c644aa | ||
|
619d192d14 | ||
|
d042a3b84a | ||
|
afda056ba9 | ||
|
6724537da2 | ||
|
f679c19d56 | ||
|
cea09407f8 | ||
|
7679212ea9 | ||
|
bb8644092c | ||
|
2f03a19b37 | ||
|
ae9f2eeee2 | ||
|
15f7cac660 | ||
|
f30d37b7ba | ||
|
ff9d749860 | ||
|
6e20a9ffc7 | ||
|
ea42f93b2f | ||
|
0bee59cfda | ||
|
77dd780063 | ||
|
b0f56acad5 | ||
|
da35036874 | ||
|
28bbf80326 | ||
|
f3537761d0 | ||
|
eeaa4fc710 | ||
|
fb276227b2 | ||
|
3d96301051 | ||
|
e89791fc80 | ||
|
90276ce106 | ||
|
eff0bae2c8 | ||
|
deea5038fb | ||
|
c38a864c19 | ||
|
db388a1533 | ||
|
162c2312c2 | ||
|
1d31ded143 | ||
|
cdd58ffc6b | ||
|
4965a979dd | ||
|
de2678c0e5 | ||
|
8d80bda629 | ||
|
3711f0e01e | ||
|
23dc7248a4 | ||
|
e073f95c8f | ||
|
45cea0e794 | ||
|
18911de752 | ||
|
a3092f56c2 | ||
|
ccf7b5d2c6 | ||
|
0484237954 | ||
|
4dced7dd20 | ||
|
1d0f5b1527 | ||
|
62655f9421 | ||
|
3753dae1a1 | ||
|
aeb82ffbf9 | ||
|
4deee18be0 | ||
|
a4f5cb97de | ||
|
2736ce21c9 | ||
|
ee5ebb6f23 | ||
|
927ba5dcd5 | ||
|
448395b887 | ||
|
e416d8c831 | ||
|
923ca80ed1 | ||
|
40edde36c7 | ||
|
988fcb3b92 | ||
|
5d6754e5b1 | ||
|
edd00c9f73 | ||
|
669611c8f6 | ||
|
71e9ead655 | ||
|
002b16d845 | ||
|
edd26b0e35 | ||
|
696f47436b | ||
|
e37a7bf36b | ||
|
1a8f1101dc | ||
|
9553c09991 | ||
|
5241cc3366 | ||
|
d7319faa02 | ||
|
36498c4605 | ||
|
8034fe1367 | ||
|
2141cf9ab7 | ||
|
ada419fc51 | ||
|
95a0c1c85e | ||
|
bed9a107d3 | ||
|
4f75f337be | ||
|
70e1ef826e | ||
|
e6641fe1a9 | ||
|
ce2f0ef72d | ||
|
1bb05f5c2b | ||
|
63ef35a475 | ||
|
de8d4595ee | ||
|
704f76986f | ||
|
2303cb263f | ||
|
5a7c74c5d9 | ||
|
0629264002 | ||
|
1689c8d3f3 | ||
|
a37854ef57 | ||
|
9cad1dc35b | ||
|
0983149dd3 | ||
|
37b6fdea28 | ||
|
82af995a75 | ||
|
8c7dd2bd3f | ||
|
4fbad4186b | ||
|
f8aa2f9175 | ||
|
da0a5e96ba | ||
|
1ac9a0d7be | ||
|
9bea86f8f5 | ||
|
8fbaded18d | ||
|
8fd6a1cb19 | ||
|
96884c3c30 | ||
|
004fc27c5f | ||
|
29e63648ce | ||
|
4042faefb5 | ||
|
fca9c1add6 | ||
|
4cefa9ed24 | ||
|
ccc10f6499 | ||
|
71357755f3 | ||
|
d6cc4032b8 | ||
|
eb0d42a03f | ||
|
9890f09e81 | ||
|
e81a590eb0 | ||
|
61bdf97463 | ||
|
aa14e5c2ce | ||
|
6081b02dbe | ||
|
e100cff3de | ||
|
a99d9a7fc7 | ||
|
d77b83b1d6 | ||
|
fd11209e08 | ||
|
f42064d9ee | ||
|
b1f9b46c94 | ||
|
c9b6dfab85 | ||
|
90d73bfed1 | ||
|
fa92309f7b | ||
|
3d0ce204ba | ||
|
e37cbbb025 | ||
|
f88bcbc9e7 | ||
|
4891ce0f9f | ||
|
041bb9fd55 | ||
|
afefbfa99d | ||
|
d5b95f542b | ||
|
1c674e5e67 | ||
|
63c332a697 | ||
|
ce497f9728 | ||
|
06fcef7433 | ||
|
7ddfb06729 | ||
|
5d036c3c18 | ||
|
315d0839c2 | ||
|
a253234bd4 | ||
|
7e9d43ec71 | ||
|
4bd422c08c | ||
|
f6dccc2e9e | ||
|
b2342f4acb | ||
|
103819827b | ||
|
5606224339 | ||
|
f215dc70e8 | ||
|
a30a4fdf11 | ||
|
f52453cd65 |
129 changed files with 16106 additions and 3383 deletions
27
.github/workflows/test_suite.yml
vendored
Normal file
27
.github/workflows/test_suite.yml
vendored
Normal 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
11
.gitignore
vendored
|
@ -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
|
||||
|
|
|
@ -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>
|
||||
|
|
589
CHANGELOG.md
589
CHANGELOG.md
|
@ -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.
|
||||
|
|
78
Gruntfile.js
78
Gruntfile.js
|
@ -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']);
|
||||
};
|
|
@ -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¤cy_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
5
SECURITY.md
Normal 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.
|
|
@ -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);
|
||||
|
|
123
app/Controllers/Auth/AuthController.php
Normal file
123
app/Controllers/Auth/AuthController.php
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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]));
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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,
|
||||
]
|
||||
);
|
||||
}
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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'));
|
||||
|
|
|
@ -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
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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'));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 = [
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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]),
|
||||
]);
|
||||
}
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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;
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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,
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
namespace App\Exception\Handlers\Renderers;
|
||||
namespace App\Exceptions\Handlers\Renderers;
|
||||
|
||||
use App\Exceptions\UnderMaintenanceException;
|
||||
use Slim\Exception\HttpBadRequestException;
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
|
@ -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
|
||||
{
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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) {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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
67
app/Web/Theme.php
Normal 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
55
app/Web/UA.php
Normal 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;
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
}
|
66
app/Web/ValidationHelper.php
Normal file
66
app/Web/ValidationHelper.php
Normal 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;
|
||||
}
|
||||
}
|
139
app/helpers.php
139
app/helpers.php
|
@ -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
7
app/routes.php
Normal file → Executable 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);
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
|
||||
|
|
29
bin/migrate
29
bin/migrate
|
@ -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);
|
||||
|
|
36
bin/theme
36
bin/theme
|
@ -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);
|
|
@ -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
|
||||
|
|
|
@ -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),
|
||||
|
||||
|
|
|
@ -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
5328
composer.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -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
1
docs/CNAME
Normal file
|
@ -0,0 +1 @@
|
|||
xbackbone.app
|
|
@ -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 © 2020 Sergio Brighenti. Distributed by an <a href=\"https://github.com/SergiX44/XBackBone/blob/master/LICENSE\">AGPL v3.0 license.</a>"
|
||||
footer_content: "Copyright © 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
|
1
docs/_includes/head_custom.html
Normal file
1
docs/_includes/head_custom.html
Normal 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
1
docs/ads.txt
Normal file
|
@ -0,0 +1 @@
|
|||
google.com, pub-1835087833720665, DIRECT, f08c47fec0942fa0
|
|
@ -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.
|
||||
|
|
|
@ -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.*
|
||||
|
|
|
@ -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`.
|
|
@ -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
BIN
docs/favicon.ico
Normal file
Binary file not shown.
After Width: | Height: | Size: 15 KiB |
|
@ -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>
|
|
@ -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 }
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
---
|
||||
layout: default
|
||||
title: License & Credits
|
||||
nav_order: 9
|
||||
nav_order: 10
|
||||
---
|
||||
|
||||
# License
|
||||
|
|
22
docs/sponsor.md
Normal file
22
docs/sponsor.md
Normal 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)
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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
4999
package-lock.json
generated
File diff suppressed because it is too large
Load diff
19
package.json
19
package.json
|
@ -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
33
phpunit.xml
Normal 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>
|
|
@ -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،
|
||||
تم طلب استعادة كلمة المرور لهذا الحساب. لإكمال العملية انقر على الرابط التالي:
|
||||
|
||||
%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>',
|
||||
];
|
||||
|
|
|
@ -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
163
resources/lang/ca.lang.php
Normal 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
163
resources/lang/cs.lang.php
Normal 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',
|
||||
];
|
|
@ -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.',
|
||||
];
|
||||
|
|
|
@ -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
42
resources/lang/en.lang.php
Normal file → Executable 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'
|
||||
];
|
||||
|
|
|
@ -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',
|
||||
];
|
||||
|
|
29
resources/lang/fa.lang.php
Normal file
29
resources/lang/fa.lang.php
Normal 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
164
resources/lang/fi.lang.php
Normal 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',
|
||||
];
|
|
@ -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',
|
||||
];
|
||||
|
|
164
resources/lang/fr_CA.lang.php
Normal file
164
resources/lang/fr_CA.lang.php
Normal 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',
|
||||
];
|
66
resources/lang/hi.lang.php
Normal file
66
resources/lang/hi.lang.php
Normal 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
164
resources/lang/hu.lang.php
Normal 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
164
resources/lang/id.lang.php
Normal 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',
|
||||
];
|
|
@ -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',
|
||||
];
|
||||
|
|
|
@ -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
164
resources/lang/ko.lang.php
Normal 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
163
resources/lang/lt.lang.php
Normal 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',
|
||||
];
|
|
@ -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 på 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 på 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',
|
||||
];
|
||||
|
|
|
@ -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',
|
||||
];
|
||||
|
|
|
@ -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',
|
||||
];
|
||||
|
|
|
@ -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
163
resources/lang/ro.lang.php
Normal 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>',
|
||||
];
|
|
@ -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
163
resources/lang/sr.lang.php
Normal 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
165
resources/lang/sv.lang.php
Normal 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
165
resources/lang/tr.lang.php
Normal 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
Loading…
Reference in a new issue