Compare commits

...

128 Commits

Author SHA1 Message Date
Oleg Lobanov
e9c0369062 chore(release): 2.12.1 2021-03-07 15:25:34 +01:00
Oleg Lobanov
7358b3fe31 fix: add missing default config into the docker image 2021-03-07 15:23:12 +01:00
Oleg Lobanov
2fccb8c367 chore(release): 2.12.0 2021-03-04 13:12:19 +01:00
Oleg Lobanov
e039d95192 chore: fix major docker tag name 2021-03-04 13:12:03 +01:00
Oleg Lobanov
0f96031d6f Merge pull request #1305 from filebrowser/github_actions 2021-03-04 11:39:30 +01:00
Oleg Lobanov
6214fc84fa chore: add github action badge 2021-03-04 11:35:52 +01:00
Oleg Lobanov
47578e02e3 ci: migrate to github actions 2021-03-04 11:35:52 +01:00
Oleg Lobanov
35a4379b67 chore: go mod tidy 2021-03-04 00:57:35 +01:00
Oleg Lobanov
23f84642e6 build: use make for building the project (#1304) 2021-03-04 00:10:08 +01:00
Oleg Lobanov
2d2c598fa6 feat: add homebrew tap 2021-03-03 16:25:03 +01:00
Oleg Lobanov
cf4836dc75 feat: build multi-arch docker images 2021-03-03 13:46:22 +01:00
WeidiDeng
e8c9d1c539 feat: added tiff files preview support (#1222) 2021-03-02 12:14:32 +01:00
Alvaro Aleman
d8f415f8ab feat: allow to password protect shares (#1252)
This changes allows to password protect shares. It works by:
* Allowing to optionally pass a password when creating a share
* If set, the password + salt that is configured via a new flag will be
  hashed via bcrypt and the hash stored together with the rest of the
  share
* Additionally, a random 96 byte long token gets generated and stored
  as part of the share
* When the backend retrieves an unauthenticated request for a share that
  has authentication configured, it will return a http 401
* The frontend detects this and will show a login prompt
* The actual download links are protected via an url arg that contains
  the previously generated token. This allows us to avoid buffering the
  download in the browser and allows pasting the link without breaking
  it
2021-03-02 12:00:18 +01:00
Alvaro Aleman
977ec33918 chore: close preview on esc key press (#1288) 2021-02-16 17:15:04 +01:00
niubility000
f1b7bd59f6 fix: double click to zoom pics in phone's browser (#1274)
fixed this : https://github.com/filebrowser/filebrowser/issues/1266
2021-02-08 09:54:40 +01:00
WeidiDeng
f3afd5cb79 fix: environmental variables not expanded in command (#1241) 2021-01-19 17:02:46 +01:00
Oleg Lobanov
e6a5bf116e chore: remove empty string from locales (closes #1245) 2021-01-19 16:56:06 +01:00
Oleg Lobanov
21b5a76fa7 chore: refactor search function 2021-01-12 19:14:23 +01:00
WeidiDeng
b6263eb607 chore: search by type with empty file name (#1228) 2021-01-12 18:08:23 +01:00
WeidiDeng
c8257e848e chore: move single click to user profile page (#1236)
Single clicks applies to FileList component.
2021-01-12 00:15:26 +01:00
叫我彭一凡
05bb7c8553 fix: fetch resource api once when sorting (closes #1172) (#1202) 2021-01-12 00:00:40 +01:00
WeidiDeng
b600b11415 feat: share management delete confirm (#1212) 2021-01-11 23:54:16 +01:00
Oleg Lobanov
019ce80fc5 fix: don't allow to remove root user 2021-01-11 22:33:36 +01:00
Adam Dobrawy
8cea2f75b3 chore: fix url to documentation in templates (#1231) 2021-01-07 11:48:53 +01:00
WeidiDeng
6914063853 feat: allow disabling file detections by reading header (#1175) 2021-01-07 11:30:17 +01:00
Oleg Lobanov
43e0d4a856 chore: fix translation files indent 2020-12-31 12:31:26 +01:00
Oleg Lobanov
066d8e8d6c chore: add ru translation 2020-12-31 12:26:49 +01:00
Oleg Lobanov
948e05c083 chore(release): 2.11.0 2020-12-28 17:37:19 +01:00
WeidiDeng
fb5b28d9cb feat: download shared subdirectory (#1184)
Co-authored-by: Oleg Lobanov <oleg@lobanov.me>
2020-12-28 17:35:29 +01:00
WeidiDeng
677bce376b feat: add sharing management (#1178) (closes #1000) 2020-12-24 19:02:28 +01:00
Alexis Lefebvre
8faa96f5e6 chore: fix typo costumize -> costumize (#1194) 2020-12-24 18:24:15 +01:00
WeidiDeng
f62806f6c9 fix: check user input to prevent permission elevation (#1196) (closes #1195) 2020-12-24 18:22:48 +01:00
Oleg Lobanov
58835b7e53 fix: move files between different volumes (closes #1177) 2020-12-24 17:50:27 +01:00
WeidiDeng
7a5298a755 fix: delete extra remove prefix (#1186)
Fix file actions within /files dir
2020-12-16 16:08:56 +01:00
WeidiDeng
bc4a6462ce chore: use command key to select multiple files on mac (#1183) 2020-12-12 14:09:50 +01:00
WeidiDeng
ac3673e111 fix: recaptcha race condition (#1176) 2020-12-08 11:26:29 +01:00
Oleg Lobanov
c746c1931d chore(release): 2.10.0 2020-11-24 12:00:10 +01:00
Oleg Lobanov
586d198d47 fix: fix hanging when reading a named pipe file (closes #1155) 2020-11-24 11:37:31 +01:00
Matt Doyle
9515ceeb42 feat: automatically jump to the next photo when deleting while previewing (#1143) 2020-11-23 19:08:14 +01:00
Julien Loir
e8b4e9af46 feat: add single click mode (#1139) 2020-11-23 19:06:37 +01:00
Tiger Nie
10e399b3c3 feat: add hide dotfiles param (#1148) 2020-11-20 11:51:28 +01:00
Oleg Lobanov
dcbc3286e2 Merge pull request #1133 from ramiresviana/fixes-5
Some fixes and shared view improvements
2020-11-04 17:58:18 +01:00
xufanglu
b185f9b56e chore: fix typo in config_init.go (#1131) 2020-11-04 17:47:36 +01:00
Ramires Viana
7096b3dab9 fix: empty folder in archive 2020-11-04 15:56:27 +00:00
Ramires Viana
36cacdf598 feat: shared item information 2020-11-04 15:56:27 +00:00
Ramires Viana
4e48ffc14d fix: previewer title overflow 2020-11-04 15:56:27 +00:00
Ramires Viana
e119bc55ea feat: shared folder file listing 2020-11-04 15:56:05 +00:00
Ramires Viana
1ce3068a99 fix: resource rename action invalid path 2020-11-03 12:30:56 +00:00
Liubomyr Piadyk
d562d1a60d chore: fix readme typo (#1128)
Commander runner -> Command runner
At other places it's referenced as Command runner.
2020-10-29 17:29:29 +01:00
Oleg Lobanov
9f858398ab chore(release): 2.9.0 2020-10-21 16:52:29 +02:00
Aiden McClelland
0ac80e8387 feat: support WKWebview custom protocol (#1113) 2020-10-21 16:41:09 +02:00
Hissy
0dca0b92d1 chore: update zh-cn and zh-tw (#1121) 2020-10-21 16:39:41 +02:00
Oleg Lobanov
c9b36ba32e Merge pull request #1124 from ramiresviana/fixes-4 2020-10-21 16:37:39 +02:00
Ramires Viana
f2c4e78381 fix: allow start from Windows explorer 2020-10-19 13:41:40 +00:00
Ramires Viana
05bff54b71 fix: preview case sensitive file extension 2020-10-19 13:25:09 +00:00
Ramires Viana
2bd163d92a fix: search missing path slash 2020-10-19 13:14:36 +00:00
Ramires Viana
5e27ba5c8c fix: file upload missing path slash 2020-10-19 13:11:26 +00:00
Oleg Lobanov
5aaeb3b76d chore(release): 2.8.0 2020-10-05 09:53:09 +02:00
Daniel Pham
36fb9f562a fix: fix empty command name (#1106) 2020-10-05 09:52:27 +02:00
Xabi
ad99bf1801 fix: fix panic when accessing nonexistent .js file in static path (#1105) 2020-10-02 15:09:03 +02:00
Oleg Lobanov
4c2a094255 Merge pull request #1100 from ramiresviana/fixes-3 2020-10-01 16:53:35 +02:00
Keagan McClelland
97693cc611 feat: add disable exec flag (#1090) 2020-10-01 16:45:24 +02:00
Ramires Viana
c6d4fcd08f fix: empty commands setting 2020-09-29 14:05:03 +00:00
Ramires Viana
dd7b9ddd85 fix: preview key shortcut conflict 2020-09-29 14:04:55 +00:00
Ramires Viana
26d62e4117 fix: search results absolute url 2020-09-29 14:04:43 +00:00
Ramires Viana
babd7783af fix: file upload path encoding 2020-09-29 14:04:03 +00:00
Oleg Lobanov
1529e796df chore(release): 2.7.0 2020-09-11 19:21:08 +02:00
Oleg Lobanov
d4b904b92b chore: pass docker password via stdin 2020-09-11 18:57:14 +02:00
Oleg Lobanov
12d4177823 build: bump go version to 1.15.2 (#1081) 2020-09-11 18:07:01 +02:00
Oleg Lobanov
8142b32f38 feat: put selected files in the root of the archive (closes #1065) 2020-09-11 16:54:22 +02:00
Oleg Lobanov
c5abbb4e1c chore: fix lint errors 2020-09-11 16:02:16 +02:00
Oleg Lobanov
65ac73414f feat: add --socket-perm flag to control unix socket file permissions (closes #1060) 2020-09-11 15:59:06 +02:00
Oleg Lobanov
ede4213c8e chore: fix french translation (closes #1071) 2020-09-11 15:16:58 +02:00
Agneev Mukherjee
b60d291490 chore: fix URLs for assets (#1074) 2020-09-05 15:23:42 +02:00
Oleg Lobanov
b9ede79888 Merge pull request #1066 from ramiresviana/preview-mobile-dropdown 2020-08-25 16:33:57 +02:00
Ramires Viana
3d2cb838d1 feat: preview size button 2020-08-25 14:14:15 +00:00
Ramires Viana
778734419d feat: preview mobile dropdown 2020-08-18 12:47:23 +00:00
Oleg Lobanov
be8683f556 chore(release): 2.6.2 2020-08-05 11:55:16 +02:00
Davide Maggio
c3450f4614 chore: return text/plain header in auth response (#1051) 2020-08-05 10:48:03 +02:00
Oleg Lobanov
5881bc9ab0 chore: fix preview of files with non-latin names (closes #1056) 2020-08-05 10:40:03 +02:00
Oleg Lobanov
a2fb499a20 chore(release): 2.6.1 2020-07-28 13:40:19 +02:00
Oleg Lobanov
411a928fea chore: fix lint errors 2020-07-28 13:40:06 +02:00
Oleg Lobanov
f5d02cdde9 fix: delete cached previews when deleting file 2020-07-28 11:59:55 +02:00
Oleg Lobanov
c9340af8d0 fix: escape special characters in preview url (closes #1002) 2020-07-28 11:59:32 +02:00
Oleg Lobanov
a722bcc13f chore(release): 2.6.0 2020-07-27 19:52:48 +02:00
Oleg Lobanov
77fe3cfc60 ci: fix go version on release step 2020-07-27 19:51:09 +02:00
Oleg Lobanov
470f93cefc Merge pull request #1044 from filebrowser/fix_img_resize 2020-07-27 19:39:08 +02:00
Oleg Lobanov
92fde4dd12 build: set limit for vuejs build threads 2020-07-27 19:35:02 +02:00
Oleg Lobanov
95bc92955f feat: cache resized images 2020-07-27 19:26:45 +02:00
Oleg Lobanov
f2f914221c chore: bump go to 1.14.6 2020-07-27 19:26:45 +02:00
Oleg Lobanov
c2d8038c63 chore: add testing step to ci 2020-07-27 19:26:44 +02:00
Oleg Lobanov
cb8ac5ebf1 chore: add resize tests 2020-07-27 19:26:44 +02:00
Oleg Lobanov
aa78e3ab1f feat: add param to disable img resizing 2020-07-27 19:26:44 +02:00
Oleg Lobanov
bc00165094 feat: add lazy load of image thumbnails 2020-07-27 19:26:44 +02:00
Oleg Lobanov
94ef59602f feat: limit image resize workers 2020-07-27 19:26:44 +02:00
Oleg Lobanov
14e2f84ceb Merge pull request #1042 from ramiresviana/fixes-2 2020-07-23 15:03:10 +02:00
Ramires Viana
f228fa5540 fix: conflict handling on upload button 2020-07-23 12:02:09 +00:00
Ramires Viana
f2d2c1cbf8 fix: drop feedback 2020-07-23 12:02:09 +00:00
Ramires Viana
d9be370e24 fix: missing error message 2020-07-23 12:02:09 +00:00
Ramires Viana
727c63b98e fix: parent verification on copy 2020-07-23 12:02:02 +00:00
Ramires Viana
34dfb49b71 fix: path separator inconsistency on rename 2020-07-20 17:45:45 +00:00
Henrique Dias
0b0a704d44 chore: remove hacdias/fileutils dep (#1037) 2020-07-18 20:10:22 +02:00
Oleg Lobanov
2d99d0bf13 chore(release): 2.5.0 2020-07-17 18:12:00 +02:00
Oleg Lobanov
1790df2090 Merge pull request #1026 from ramiresviana/fixes 2020-07-17 17:41:17 +02:00
Ramires Viana
10570ade44 fix: reset clipboard after pasting cutted files 2020-07-17 14:11:23 +00:00
Ramires Viana
43526d9d1a feat: duplicate files in the same directory 2020-07-17 14:11:23 +00:00
Ramires Viana
2636f876ab feat: rename option on replace prompt 2020-07-17 14:11:15 +00:00
Ramires Viana
eed9da1471 feat: file copy, move and paste conflict checking 2020-07-17 12:37:52 +00:00
Ramires Viana
9a2ebbabe2 fix: blinking previewer 2020-07-17 12:37:52 +00:00
Ramires Viana
716396a726 feat: add previewer title and loading indicator 2020-07-17 12:32:21 +00:00
Ramires Viana
0727496601 fix: remove incomplete uploaded files 2020-07-14 00:21:15 +00:00
Ramires Viana
194030fcfc fix: prompt before closing window 2020-07-14 00:12:41 +00:00
Ramires Viana
b3b644527d fix: dark theme colors 2020-07-14 00:12:33 +00:00
Ramires Viana
7e5beeff46 fix: directory conflict checking 2020-07-13 14:20:56 +00:00
Oleg Lobanov
a47b69bcec Merge pull request #1021 from ramiresviana/upload-queue 2020-07-13 11:20:59 +02:00
Ramires Viana
6ec6a23861 feat: upload queue 2020-07-10 00:01:37 +00:00
Ramires Viana
c9cc0d3d5d refactor: upload vuex module 2020-07-10 00:01:37 +00:00
Ramires Viana
28d2b35718 refactor: upload utils 2020-07-10 00:01:37 +00:00
Ramires Viana
b4f131be50 refactor: uploading counters vuex state 2020-07-10 00:01:37 +00:00
Oleg Lobanov
d0b359561f chore(release): 2.4.0 2020-07-07 16:53:51 +02:00
Fabian Fritzsche
453636dfe2 fix: add preview bypass for .gif files (#1012) 2020-07-07 16:47:11 +02:00
Oleg Lobanov
b1605aa6d3 Merge pull request #1014 from ramiresviana/full-screen-editor 2020-07-06 17:06:12 +02:00
Oleg Lobanov
23503b80a4 Merge pull request #1015 from ramiresviana/prompt-key-shortcut-conflict 2020-07-06 17:03:05 +02:00
Ramires Viana
0d69fbd9a3 fix: prompt key shortcut conflict 2020-07-04 14:19:03 +00:00
Ramires Viana
0d665e528f feat: full screen editor 2020-07-04 03:11:51 +00:00
Oleg Lobanov
de0b8bb7b2 chore(release): 2.3.0 2020-06-26 12:14:44 +02:00
Thomas Queste
84da110085 fix: typo in image_templates (apline -> alpine) (#1005) 2020-06-25 09:37:55 +02:00
monkeyWie
6b0d49b1fc feat: add image thumbnails support (#980)
* set max image preview size to 1080x1080px
2020-06-25 09:37:13 +02:00
148 changed files with 6577 additions and 2698 deletions

View File

@@ -1,79 +0,0 @@
version: 2
jobs:
lint:
docker:
- image: golangci/golangci-lint:v1.27.0
steps:
- checkout
- run: golangci-lint run -v
build-node:
docker:
- image: circleci/node
steps:
- checkout
- run:
name: "Build"
command: ./wizard.sh -a
- run:
name: "Cleanup"
command: rm -rf frontend/node_modules
- persist_to_workspace:
root: .
paths:
- '*'
build-go:
docker:
- image: circleci/golang:1.14.3
steps:
- attach_workspace:
at: '~/project'
- run:
name: "Compile"
command: GOOS=linux GOARCH=amd64 ./wizard.sh -c
- run:
name: "Cleanup"
command: |
rm -rf frontend/build
git checkout -- go.sum # TODO: why is it being changed?
- persist_to_workspace:
root: .
paths:
- '*'
release:
docker:
- image: circleci/golang:1.14.3
steps:
- attach_workspace:
at: '~/project'
- setup_remote_docker
- run: docker login -u $DOCKER_USERNAME -p $DOCKER_PASSWORD
- run: curl -sL https://git.io/goreleaser | bash
- run: docker logout
workflows:
version: 2
build-workflow:
jobs:
- lint:
filters:
tags:
only: /.*/
- build-node:
filters:
tags:
only: /.*/
- build-go:
filters:
tags:
only: /.*/
requires:
- build-node
- lint
- release:
context: deploy
requires:
- build-go
filters:
tags:
only: /^v.*/
branches:
ignore: /.*/

View File

@@ -5,4 +5,4 @@
"log": "stdout", "log": "stdout",
"database": "/database.db", "database": "/database.db",
"root": "/srv" "root": "/srv"
} }

View File

@@ -1,3 +1,2 @@
testdata/ *
.github/ !filebrowser
**.git

5
.github/CODEOWNERS vendored Normal file
View File

@@ -0,0 +1,5 @@
# These owners will be the default owners for everything in the repo.
# Unless a later match takes precedence, @o1egl will be requested for
# review when someone opens a pull request.
* @o1egl

66
.github/workflows/main.yaml vendored Normal file
View File

@@ -0,0 +1,66 @@
name: main
on:
push:
branches:
- 'master'
tags:
- 'v*'
pull_request:
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
go-version: 1.16
- uses: actions/setup-node@v2
with:
node-version: '14'
- run: npm i -g commitlint
- run: make lint
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
with:
go-version: 1.16
- uses: actions/setup-node@v2
with:
node-version: '14'
- run: make test
release:
runs-on: ubuntu-latest
needs: [lint, test]
if: startsWith(github.event.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v2
with:
fetch-depth: 0
- uses: actions/setup-go@v2
with:
go-version: 1.16
- uses: actions/setup-node@v2
with:
node-version: '14'
- name: Set up QEMU
uses: docker/setup-qemu-action@v1
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v1
- name: Build fronetend
run: make build-frontend
- name: Login to Docker Hub
uses: docker/login-action@v1
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Run GoReleaser
uses: goreleaser/goreleaser-action@v2
with:
version: latest
args: release --rm-dist
env:
GITHUB_TOKEN: ${{ secrets.GH_PAT }}

2
.gitignore vendored
View File

@@ -28,3 +28,5 @@ yarn-error.log*
*.njsproj *.njsproj
*.sln *.sln
*.sw* *.sw*
bin/
build/

View File

@@ -63,7 +63,6 @@ linters:
- goconst - goconst
- gocritic - gocritic
- gocyclo - gocyclo
- gofmt
- goimports - goimports
- golint - golint
- gomnd - gomnd

View File

@@ -5,7 +5,7 @@ env:
before: before:
hooks: hooks:
- go mod download - make bundle-frontend
build: build:
env: env:
@@ -19,10 +19,6 @@ build:
- linux - linux
- windows - windows
- freebsd - freebsd
- netbsd
- openbsd
- dragonfly
- solaris
goarch: goarch:
- amd64 - amd64
- 386 - 386
@@ -35,14 +31,8 @@ build:
ignore: ignore:
- goos: darwin - goos: darwin
goarch: 386 goarch: 386
- goos: openbsd
goarch: arm
- goos: freebsd - goos: freebsd
goarch: arm goarch: arm
- goos: netbsd
goarch: arm
- goos: solaris
goarch: arm
archives: archives:
- -
@@ -55,53 +45,106 @@ archives:
dockers: dockers:
- -
dockerfile: Dockerfile dockerfile: Dockerfile
binaries: use_buildx: true
- filebrowser build_flag_templates:
- "--pull"
- "--label=org.opencontainers.image.created={{.Date}}"
- "--label=org.opencontainers.image.name={{.ProjectName}}"
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
- "--label=org.opencontainers.image.version={{.Version}}"
- "--label=org.opencontainers.image.source={{.GitURL}}"
- "--platform=linux/amd64"
goos: linux goos: linux
goarch: amd64 goarch: amd64
goarm: ''
image_templates: image_templates:
- "filebrowser/filebrowser:latest" - "filebrowser/filebrowser:{{ .Tag }}-amd64"
- "filebrowser/filebrowser:{{ .Tag }}" - "filebrowser/filebrowser:v{{ .Major }}-amd64"
- "filebrowser/filebrowser:v{{ .Major }}"
extra_files: extra_files:
- .docker.json - .docker.json
- -
dockerfile: Dockerfile dockerfile: Dockerfile
binaries: use_buildx: true
- filebrowser build_flag_templates:
- "--pull"
- "--label=org.opencontainers.image.created={{.Date}}"
- "--label=org.opencontainers.image.name={{.ProjectName}}"
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
- "--label=org.opencontainers.image.version={{.Version}}"
- "--label=org.opencontainers.image.source={{.GitURL}}"
- "--platform=linux/arm64"
goos: linux
goarch: arm64
image_templates:
- "filebrowser/filebrowser:{{ .Tag }}-arm64"
- "filebrowser/filebrowser:v{{ .Major }}-arm64"
extra_files:
- .docker.json
-
dockerfile: Dockerfile
use_buildx: true
build_flag_templates:
- "--pull"
- "--label=org.opencontainers.image.created={{.Date}}"
- "--label=org.opencontainers.image.name={{.ProjectName}}"
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
- "--label=org.opencontainers.image.version={{.Version}}"
- "--label=org.opencontainers.image.source={{.GitURL}}"
- "--platform=linux/arm/v6"
goos: linux goos: linux
goarch: arm goarch: arm
goarm: '5' goarm: '6'
image_templates: image_templates:
- "filebrowser/filebrowser:pi" - "filebrowser/filebrowser:{{ .Tag }}-armv6"
- "filebrowser/filebrowser:{{ .Tag }}-pi" - "filebrowser/filebrowser:v{{ .Major }}-armv6"
- "filebrowser/filebrowser:v{{ .Major }}-pi"
extra_files: extra_files:
- .docker.json - .docker.json
- -
dockerfile: Dockerfile.alpine dockerfile: Dockerfile
binaries: use_buildx: true
- filebrowser build_flag_templates:
- "--pull"
- "--label=org.opencontainers.image.created={{.Date}}"
- "--label=org.opencontainers.image.name={{.ProjectName}}"
- "--label=org.opencontainers.image.revision={{.FullCommit}}"
- "--label=org.opencontainers.image.version={{.Version}}"
- "--label=org.opencontainers.image.source={{.GitURL}}"
- "--platform=linux/arm/v7"
goos: linux goos: linux
goarch: amd64 goarch: arm
goarm: '' goarm: '7'
image_templates: image_templates:
- "filebrowser/filebrowser:alpine" - "filebrowser/filebrowser:{{ .Tag }}-armv7"
- "filebrowser/filebrowser:{{ .Tag }}-apline" - "filebrowser/filebrowser:v{{ .Major }}-armv7"
- "filebrowser/filebrowser:v{{ .Major }}-alpine"
extra_files: extra_files:
- .docker.json - .docker.json
- docker_manifests:
dockerfile: Dockerfile.debian - name_template: "filebrowser/filebrowser:latest"
binaries:
- filebrowser
goos: linux
goarch: amd64
goarm: ''
image_templates: image_templates:
- "filebrowser/filebrowser:debian" - "filebrowser/filebrowser:{{ .Tag }}-amd64"
- "filebrowser/filebrowser:{{ .Tag }}-debian" - "filebrowser/filebrowser:{{ .Tag }}-arm64"
- "filebrowser/filebrowser:v{{ .Major }}-debian" - "filebrowser/filebrowser:{{ .Tag }}-armv6"
extra_files: - "filebrowser/filebrowser:{{ .Tag }}-armv7"
- .docker.json - name_template: "filebrowser/filebrowser:{{ .Tag }}"
image_templates:
- "filebrowser/filebrowser:{{ .Tag }}-amd64"
- "filebrowser/filebrowser:{{ .Tag }}-arm64"
- "filebrowser/filebrowser:{{ .Tag }}-armv6"
- "filebrowser/filebrowser:{{ .Tag }}-armv7"
- name_template: "filebrowser/filebrowser:v{{ .Major }}"
image_templates:
- "filebrowser/filebrowser:v{{ .Major }}-amd64"
- "filebrowser/filebrowser:v{{ .Major }}-arm64"
- "filebrowser/filebrowser:v{{ .Major }}-armv6"
- "filebrowser/filebrowser:v{{ .Major }}-armv7"
brews:
- name: filebrowser
tap:
owner: filebrowser
name: homebrew-tap
folder: Formula
homepage: https://filebrowser.org
commit_author:
name: FileBrowser Robot
email: robot@filebrowser.org
description: File Browser is a create-your-own-cloud-kind of software where you can install it on a server, direct it to a path and then access your files through a nice web interface
license: "MIT"

14
.versionrc Normal file
View File

@@ -0,0 +1,14 @@
{
"types": [
{ "type": "feat", "section": "Features" },
{ "type": "fix", "section": "Bug Fixes" },
{ "type": "perf", "section": "Performance improvements" },
{ "type": "revert", "section": "Reverts" },
{ "type": "refactor", "section": "Refactorings" },
{ "type": "build", "section": "Build" },
{ "type": "ci", "hidden": true },
{ "type": "test", "hidden": true },
{ "type": "chore", "hidden": true },
{ "type": "docs", "hidden": true }
]
}

View File

@@ -2,6 +2,190 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
### [2.12.1](https://github.com/filebrowser/filebrowser/compare/v2.12.0...v2.12.1) (2021-03-07)
### Bug Fixes
* add missing default config into the docker image ([7358b3f](https://github.com/filebrowser/filebrowser/commit/7358b3fe3178c20007b4b5ef5c03705badd538c4))
## [2.12.0](https://github.com/filebrowser/filebrowser/compare/v2.11.0...v2.12.0) (2021-03-04)
### Features
* add homebrew tap ([2d2c598](https://github.com/filebrowser/filebrowser/commit/2d2c598fa6bd1ecaf39c542182890c8dd9b1cad0))
* added tiff files preview support ([#1222](https://github.com/filebrowser/filebrowser/issues/1222)) ([e8c9d1c](https://github.com/filebrowser/filebrowser/commit/e8c9d1c53989b4b52f6fba2a8ac41ae612c03a7c))
* allow disabling file detections by reading header ([#1175](https://github.com/filebrowser/filebrowser/issues/1175)) ([6914063](https://github.com/filebrowser/filebrowser/commit/6914063853a8a3f3cecfa4b21f223820c2a0b7df))
* allow to password protect shares ([#1252](https://github.com/filebrowser/filebrowser/issues/1252)) ([d8f415f](https://github.com/filebrowser/filebrowser/commit/d8f415f8abd0c4301803bd968c54429dd3fe4b59))
* build multi-arch docker images ([cf4836d](https://github.com/filebrowser/filebrowser/commit/cf4836dc757ef79ad615179bb7a6c7bbd3b09c2c))
* share management delete confirm ([#1212](https://github.com/filebrowser/filebrowser/issues/1212)) ([b600b11](https://github.com/filebrowser/filebrowser/commit/b600b11415fd1fb90ff2f5136be95a9c737ae1cb))
### Bug Fixes
* don't allow to remove root user ([019ce80](https://github.com/filebrowser/filebrowser/commit/019ce80fc529a0437984fdc3d1ab6916f34dd594))
* double click to zoom pics in phone's browser ([#1274](https://github.com/filebrowser/filebrowser/issues/1274)) ([f1b7bd5](https://github.com/filebrowser/filebrowser/commit/f1b7bd59f67e719b7bfd203b0d7ec016fd21ab49))
* environmental variables not expanded in command ([#1241](https://github.com/filebrowser/filebrowser/issues/1241)) ([f3afd5c](https://github.com/filebrowser/filebrowser/commit/f3afd5cb79d6ad8b9cc8d54cb8fc2344b7c07d3d))
* fetch resource api once when sorting (closes [#1172](https://github.com/filebrowser/filebrowser/issues/1172)) ([#1202](https://github.com/filebrowser/filebrowser/issues/1202)) ([05bb7c8](https://github.com/filebrowser/filebrowser/commit/05bb7c85531349f3e9d1d8a523bb1243587b2ebc))
### Build
* use make for building the project ([#1304](https://github.com/filebrowser/filebrowser/issues/1304)) ([23f8464](https://github.com/filebrowser/filebrowser/commit/23f84642e6c1e07f89f98d2c1bb6fc9da36cc71c))
## [2.11.0](https://github.com/filebrowser/filebrowser/compare/v2.10.0...v2.11.0) (2020-12-28)
### Features
* add sharing management ([#1178](https://github.com/filebrowser/filebrowser/issues/1178)) (closes [#1000](https://github.com/filebrowser/filebrowser/issues/1000)) ([677bce3](https://github.com/filebrowser/filebrowser/commit/677bce376b024d9ff38f34e74243034fe5a1ec3c))
* download shared subdirectory ([#1184](https://github.com/filebrowser/filebrowser/issues/1184)) ([fb5b28d](https://github.com/filebrowser/filebrowser/commit/fb5b28d9cbdee10d38fcd719b9fd832121be58ef))
### Bug Fixes
* check user input to prevent permission elevation ([#1196](https://github.com/filebrowser/filebrowser/issues/1196)) (closes [#1195](https://github.com/filebrowser/filebrowser/issues/1195)) ([f62806f](https://github.com/filebrowser/filebrowser/commit/f62806f6c9e9c7f392d1b747d65b8fe40b313e89))
* delete extra remove prefix ([#1186](https://github.com/filebrowser/filebrowser/issues/1186)) ([7a5298a](https://github.com/filebrowser/filebrowser/commit/7a5298a7556f7dcc52f59b8ea76d040d3ddc3d12))
* move files between different volumes (closes [#1177](https://github.com/filebrowser/filebrowser/issues/1177)) ([58835b7](https://github.com/filebrowser/filebrowser/commit/58835b7e535cc96e1c8a5d85821c1545743ca757))
* recaptcha race condition ([#1176](https://github.com/filebrowser/filebrowser/issues/1176)) ([ac3673e](https://github.com/filebrowser/filebrowser/commit/ac3673e111afac6616af9650ca07028b6c27e6cd))
## [2.10.0](https://github.com/filebrowser/filebrowser/compare/v2.9.0...v2.10.0) (2020-11-24)
### Features
* add hide dotfiles param ([#1148](https://github.com/filebrowser/filebrowser/issues/1148)) ([10e399b](https://github.com/filebrowser/filebrowser/commit/10e399b3c3dbdcfb4465a9d4138e1da6bae0873d))
* add single click mode ([#1139](https://github.com/filebrowser/filebrowser/issues/1139)) ([e8b4e9a](https://github.com/filebrowser/filebrowser/commit/e8b4e9af46d6e99dbeb965dd9727d9ed017d52a2))
* automatically jump to the next photo when deleting while previewing ([#1143](https://github.com/filebrowser/filebrowser/issues/1143)) ([9515cee](https://github.com/filebrowser/filebrowser/commit/9515ceeb42e5ef5267400220a2082dec775e843d))
* shared folder file listing ([e119bc5](https://github.com/filebrowser/filebrowser/commit/e119bc55ea82cefcbcc0571650107dfd5d73f570))
* shared item information ([36cacdf](https://github.com/filebrowser/filebrowser/commit/36cacdf598e4e09f064c8ace0ca7a6c24b23028e))
### Bug Fixes
* empty folder in archive ([7096b3d](https://github.com/filebrowser/filebrowser/commit/7096b3dab92441981c9964e4a6175af0a255d2be))
* fix hanging when reading a named pipe file (closes [#1155](https://github.com/filebrowser/filebrowser/issues/1155)) ([586d198](https://github.com/filebrowser/filebrowser/commit/586d198d47b525eeccc6fe587573a3ad83adb4f6))
* previewer title overflow ([4e48ffc](https://github.com/filebrowser/filebrowser/commit/4e48ffc14d09dabeea12dc495144277db62b5b7d))
* resource rename action invalid path ([1ce3068](https://github.com/filebrowser/filebrowser/commit/1ce3068a99c80c153fd41359255d173bce6e79e8))
## [2.9.0](https://github.com/filebrowser/filebrowser/compare/v2.8.0...v2.9.0) (2020-10-21)
### Features
* support WKWebview custom protocol ([#1113](https://github.com/filebrowser/filebrowser/issues/1113)) ([0ac80e8](https://github.com/filebrowser/filebrowser/commit/0ac80e8387a69924284259bde448af2813d84ed1))
### Bug Fixes
* allow start from Windows explorer ([f2c4e78](https://github.com/filebrowser/filebrowser/commit/f2c4e78381610879eda5316d38a999c89df6c14a))
* file upload missing path slash ([5e27ba5](https://github.com/filebrowser/filebrowser/commit/5e27ba5c8c1be603c6ae7fec8de48e3532dea1f7))
* preview case sensitive file extension ([05bff54](https://github.com/filebrowser/filebrowser/commit/05bff54b71543fd232f1089c40504d0cbfd106be))
* search missing path slash ([2bd163d](https://github.com/filebrowser/filebrowser/commit/2bd163d92a856d65c8d4615e37898470c1edf2f4))
## [2.8.0](https://github.com/filebrowser/filebrowser/compare/v2.7.0...v2.8.0) (2020-10-05)
### Features
* add disable exec flag ([#1090](https://github.com/filebrowser/filebrowser/issues/1090)) ([97693cc](https://github.com/filebrowser/filebrowser/commit/97693cc6117ce1c956baede91de5dd48b904e175))
### Bug Fixes
* empty commands setting ([c6d4fcd](https://github.com/filebrowser/filebrowser/commit/c6d4fcd08f5f1531c2cef514dc86019e23e7289f))
* file upload path encoding ([babd778](https://github.com/filebrowser/filebrowser/commit/babd7783afe85b790e1c558375d7b5013b2d366f))
* fix empty command name ([#1106](https://github.com/filebrowser/filebrowser/issues/1106)) ([36fb9f5](https://github.com/filebrowser/filebrowser/commit/36fb9f562a2c005ca4390fdebde0b4690201dff9))
* fix panic when accessing nonexistent .js file in static path ([#1105](https://github.com/filebrowser/filebrowser/issues/1105)) ([ad99bf1](https://github.com/filebrowser/filebrowser/commit/ad99bf180197e0e6d82231a86457585de16366a8))
* preview key shortcut conflict ([dd7b9dd](https://github.com/filebrowser/filebrowser/commit/dd7b9ddd8546361060ef99e838a691b2fc6c495a))
* search results absolute url ([26d62e4](https://github.com/filebrowser/filebrowser/commit/26d62e411716a5eb9a5a703e47484cfb3fbf3bd0))
## [2.7.0](https://github.com/filebrowser/filebrowser/compare/v2.6.2...v2.7.0) (2020-09-11)
### Features
* add --socket-perm flag to control unix socket file permissions (closes [#1060](https://github.com/filebrowser/filebrowser/issues/1060)) ([65ac734](https://github.com/filebrowser/filebrowser/commit/65ac73414fadc4686c94803a93ff319e8f7ce9d1))
* preview mobile dropdown ([7787344](https://github.com/filebrowser/filebrowser/commit/778734419de314d4cb64d07109bbab73f8e2e42a))
* preview size button ([3d2cb83](https://github.com/filebrowser/filebrowser/commit/3d2cb838d111ee61047599f49e76de80c821f341))
* put selected files in the root of the archive (closes [#1065](https://github.com/filebrowser/filebrowser/issues/1065)) ([8142b32](https://github.com/filebrowser/filebrowser/commit/8142b32f3865eccd3331328e0d087f805d186ed5))
### [2.6.2](https://github.com/filebrowser/filebrowser/compare/v2.6.1...v2.6.2) (2020-08-05)
### [2.6.1](https://github.com/filebrowser/filebrowser/compare/v2.6.0...v2.6.1) (2020-07-28)
### Bug Fixes
* delete cached previews when deleting file ([f5d02cd](https://github.com/filebrowser/filebrowser/commit/f5d02cdde97923b963878abf5a300393b9feb348))
* escape special characters in preview url (closes [#1002](https://github.com/filebrowser/filebrowser/issues/1002)) ([c9340af](https://github.com/filebrowser/filebrowser/commit/c9340af8d045671ad3338c5d2d887c335ab92de4))
## [2.6.0](https://github.com/filebrowser/filebrowser/compare/v2.5.0...v2.6.0) (2020-07-27)
### Features
* add lazy load of image thumbnails ([bc00165](https://github.com/filebrowser/filebrowser/commit/bc001650944ae963b12b5b2538a68de7cd0d8f82))
* add param to disable img resizing ([aa78e3a](https://github.com/filebrowser/filebrowser/commit/aa78e3ab1fcae6f618e811ba4e315a7a209f9df2))
* cache resized images ([95bc929](https://github.com/filebrowser/filebrowser/commit/95bc92955f391ece22c40d9592f2a3e6e26907b9))
* limit image resize workers ([94ef596](https://github.com/filebrowser/filebrowser/commit/94ef59602fb50fc21b1164feda90a3b9aeb5e972))
### Bug Fixes
* conflict handling on upload button ([f228fa5](https://github.com/filebrowser/filebrowser/commit/f228fa55408824618e9f0879da67c86d22b0d324))
* drop feedback ([f2d2c1c](https://github.com/filebrowser/filebrowser/commit/f2d2c1cbf85fba3edffb7b079f121ed3f0bc1e02))
* missing error message ([d9be370](https://github.com/filebrowser/filebrowser/commit/d9be370e2474b8070fa58db920c9481270cc4a48))
* parent verification on copy ([727c63b](https://github.com/filebrowser/filebrowser/commit/727c63b98e2964d0960d25914c296570f6c79478))
* path separator inconsistency on rename ([34dfb49](https://github.com/filebrowser/filebrowser/commit/34dfb49b719c948e709a4639b4af2c5cb73b3887))
## [2.5.0](https://github.com/filebrowser/filebrowser/compare/v2.4.0...v2.5.0) (2020-07-17)
### Features
* add previewer title and loading indicator ([716396a](https://github.com/filebrowser/filebrowser/commit/716396a726329f0ba42fc34167dd07497c5bf47c))
* duplicate files in the same directory ([43526d9](https://github.com/filebrowser/filebrowser/commit/43526d9d1a8c837245e3f5059e0b4737583eeaeb))
* file copy, move and paste conflict checking ([eed9da1](https://github.com/filebrowser/filebrowser/commit/eed9da1471723ed3fbe6c00b1d6362b1c5fd8b04))
* rename option on replace prompt ([2636f87](https://github.com/filebrowser/filebrowser/commit/2636f876ab8f88eea6d9548de524ca2339eb0843))
* upload queue ([6ec6a23](https://github.com/filebrowser/filebrowser/commit/6ec6a2386173410f5cab9941dbf1bacb6b70ddd2))
### Bug Fixes
* blinking previewer ([9a2ebba](https://github.com/filebrowser/filebrowser/commit/9a2ebbabe2e9f0c292701d33f36f9b7a457b1164))
* dark theme colors ([b3b6445](https://github.com/filebrowser/filebrowser/commit/b3b644527d5673e16e61d404ff58a3c7bd6b6637))
* directory conflict checking ([7e5beef](https://github.com/filebrowser/filebrowser/commit/7e5beeff464e75ab185c430cd96e7cc67209ccc1))
* prompt before closing window ([194030f](https://github.com/filebrowser/filebrowser/commit/194030fcfcf54a2cf5e2f8ececcbb4754474d8f8))
* remove incomplete uploaded files ([0727496](https://github.com/filebrowser/filebrowser/commit/0727496601a9918c8131c56f62419bfac7ac589a))
* reset clipboard after pasting cutted files ([10570ad](https://github.com/filebrowser/filebrowser/commit/10570ade442b573ebe00af08369e28b1b0688df6))
## [2.4.0](https://github.com/filebrowser/filebrowser/compare/v2.3.0...v2.4.0) (2020-07-07)
### Features
* full screen editor ([0d665e5](https://github.com/filebrowser/filebrowser/commit/0d665e528f880ceda0976ceed66070ac34de7969))
### Bug Fixes
* add preview bypass for .gif files ([#1012](https://github.com/filebrowser/filebrowser/issues/1012)) ([453636d](https://github.com/filebrowser/filebrowser/commit/453636dfe2bbf177c74617862eb763485d4774bf))
* prompt key shortcut conflict ([0d69fbd](https://github.com/filebrowser/filebrowser/commit/0d69fbd9a342aa2695859021df0c423e3ae4a4fa))
## [2.3.0](https://github.com/filebrowser/filebrowser/compare/v2.2.0...v2.3.0) (2020-06-26)
### Features
* add image thumbnails support ([#980](https://github.com/filebrowser/filebrowser/issues/980)) ([6b0d49b](https://github.com/filebrowser/filebrowser/commit/6b0d49b1fc8bdce89576ba91cc0b8ec594fcd625))
### Bug Fixes
* typo in image_templates (apline -> alpine) ([#1005](https://github.com/filebrowser/filebrowser/issues/1005)) ([84da110](https://github.com/filebrowser/filebrowser/commit/84da11008516a371fc0446d97863dc14d337aa25))
## [2.2.0](https://github.com/filebrowser/filebrowser/compare/v2.1.2...v2.2.0) (2020-06-22) ## [2.2.0](https://github.com/filebrowser/filebrowser/compare/v2.1.2...v2.2.0) (2020-06-22)

View File

@@ -1,15 +1,11 @@
FROM alpine:latest as alpine FROM alpine:latest
RUN apk --update add ca-certificates RUN apk --update add ca-certificates
RUN apk --update add mailcap RUN apk --update add mailcap
FROM scratch
COPY --from=alpine /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/ca-certificates.crt
COPY --from=alpine /etc/mime.types /etc/mime.types
VOLUME /srv VOLUME /srv
EXPOSE 80 EXPOSE 80
COPY .docker.json /.filebrowser.json COPY .docker.json /.filebrowser.json
COPY filebrowser /filebrowser COPY filebrowser /filebrowser
ENTRYPOINT [ "/filebrowser" ] ENTRYPOINT [ "/filebrowser" ]

View File

@@ -1,11 +0,0 @@
FROM alpine:latest as alpine
RUN apk --update add ca-certificates
RUN apk --update add mailcap
VOLUME /srv
EXPOSE 80
COPY .docker.json /.filebrowser.json
COPY filebrowser /filebrowser
ENTRYPOINT [ "/filebrowser" ]

View File

@@ -1,9 +0,0 @@
FROM debian:buster
VOLUME /srv
EXPOSE 80
COPY .docker.json /.filebrowser.json
COPY filebrowser /filebrowser
ENTRYPOINT [ "/filebrowser" ]

100
Makefile Normal file
View File

@@ -0,0 +1,100 @@
SHELL := /bin/bash
BASE_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
VERSION ?= $(shell git describe --tags --always --match=v* 2> /dev/null || \
cat $(CURDIR)/.version 2> /dev/null || echo v0)
VERSION_HASH = $(shell git rev-parse HEAD)
BIN = $(BASE_PATH)/bin
PATH := $(BIN):$(PATH)
export PATH
# printing
V = 0
Q = $(if $(filter 1,$V),,@)
M = $(shell printf "\033[34;1m▶\033[0m")
GO = GOGC=off go
# go module
MODULE = $(shell env GO111MODULE=on $(GO) list -m)
DATE ?= $(shell date +%FT%T%z)
VERSION ?= $(shell git describe --tags --always --match=v* 2> /dev/null || \
cat $(CURDIR)/.version 2> /dev/null || echo v0)
VERSION_HASH = $(shell git rev-parse HEAD)
BRANCH = $(shell git rev-parse --abbrev-ref HEAD)
LDFLAGS += -X "$(MODULE)/varsion.Version=$(VERSION)" -X "$(MODULE)/varsion.CommitSHA=$(VERSION_HASH)"
# tools
$(BIN):
@mkdir -p $@
$(BIN)/%: | $(BIN) ; $(info $(M) installing $(PACKAGE))
$Q env GOBIN=$(BIN) $(GO) install $(PACKAGE)
GOLANGCI_LINT = $(BIN)/golangci-lint
$(BIN)/golangci-lint: PACKAGE=github.com/golangci/golangci-lint/cmd/golangci-lint@v1.37.1
GOIMPORTS = $(BIN)/goimports
$(BIN)/goimports: PACKAGE=golang.org/x/tools/cmd/goimports@v0.1.0
RICE = $(BIN)/rice
$(BIN)/rice: PACKAGE=github.com/GeertJohan/go.rice/rice@v1.0.2
## build: Build
.PHONY: build
build: | build-frontend build-backend ; $(info $(M) building)
## build-frontend: Build frontend
.PHONY: build-frontend
build-frontend: | ; $(info $(M) building frontend)
$Q cd frontend && npm ci && npm run build
## build-backend: Build backend
.PHONY: build-backend
build-backend: bundle-frontend | ; $(info $(M) building backend)
$Q $(GO) build -ldflags '$(LDFLAGS)' -o filebrowser
bundle-frontend: | $(RICE) ; $(info $(M) building backend)
$Q cd ./http && rm -rf rice-box.go && $(RICE) embed-go
## test: Run all tests
.PHONY: test
test: | test-frontend test-backend ; $(info $(M) running tests)
## test-frontend: Run frontend tests
.PHONY: test-frontend
test-frontend: | ; $(info $(M) running frontend tests)
## test-backend: Run backend tests
.PHONY: test-backend
test-backend: | $(RICE) ; $(info $(M) running backend tests)
$Q $(GO) test -v ./...
## lint: Lint
.PHONY: lint
lint: lint-frontend lint-backend lint-commits | ; $(info $(M) running all linters)
## lint-frontend: Lint frontend
.PHONY: lint-frontend
lint-frontend: | ; $(info $(M) running frontend linters)
$Q cd frontend && npm ci && npm run lint
## lint-backend: Lint backend
.PHONY: lint-backend
lint-backend: | $(GOLANGCI_LINT) ; $(info $(M) running backend linters)
$Q $(GOLANGCI_LINT) run
## lint-commits: Lint commits
.PHONY: lint-commits
lint-commits: | ; $(info $(M) running commitlint)
$Q ./scripts/commitlint.sh
## bump-version: Bump app version
.PHONY: bump-version
bump-version: | ; $(info $(M) creating a new release)
$Q ./scripts/bump_version.sh
## help: Show this help
.PHONY: help
help:
@sed -n 's/^## //p' $(MAKEFILE_LIST) | column -t -s ':' | sed -e 's/^/ /' | sort

View File

@@ -4,7 +4,7 @@
![Preview](https://user-images.githubusercontent.com/5447088/50716739-ebd26700-107a-11e9-9817-14230c53efd2.gif) ![Preview](https://user-images.githubusercontent.com/5447088/50716739-ebd26700-107a-11e9-9817-14230c53efd2.gif)
[![Travis](https://img.shields.io/travis/com/filebrowser/filebrowser.svg?style=flat-square)](https://travis-ci.com/filebrowser/filebrowser) [![Build](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml/badge.svg)](https://github.com/filebrowser/filebrowser/actions/workflows/main.yaml)
[![Go Report Card](https://goreportcard.com/badge/github.com/filebrowser/filebrowser?style=flat-square)](https://goreportcard.com/report/github.com/filebrowser/filebrowser) [![Go Report Card](https://goreportcard.com/badge/github.com/filebrowser/filebrowser?style=flat-square)](https://goreportcard.com/report/github.com/filebrowser/filebrowser)
[![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](http://godoc.org/github.com/filebrowser/filebrowser) [![Documentation](https://img.shields.io/badge/godoc-reference-blue.svg?style=flat-square)](http://godoc.org/github.com/filebrowser/filebrowser)
[![Version](https://img.shields.io/github/release/filebrowser/filebrowser.svg?style=flat-square)](https://github.com/filebrowser/filebrowser/releases/latest) [![Version](https://img.shields.io/github/release/filebrowser/filebrowser.svg?style=flat-square)](https://github.com/filebrowser/filebrowser/releases/latest)
@@ -24,7 +24,7 @@ For installation instructions please refer to our docs at [https://filebrowser.o
[Authentication Method](https://filebrowser.org/configuration/authentication-method) - You can change the way the user authenticates with the filebrowser server [Authentication Method](https://filebrowser.org/configuration/authentication-method) - You can change the way the user authenticates with the filebrowser server
[Commander Runner](https://filebrowser.org/configuration/command-runner) - The command runner is a feature that enables you to execute any shell command you want before or after a certain event. [Command Runner](https://filebrowser.org/configuration/command-runner) - The command runner is a feature that enables you to execute any shell command you want before or after a certain event.
[Custom Branding](https://filebrowser.org/configuration/custom-branding) - You can customize your File Browser installation by change its name to any other you want, by adding a global custom style sheet and by using your own logotype if you want. [Custom Branding](https://filebrowser.org/configuration/custom-branding) - You can customize your File Browser installation by change its name to any other you want, by adding a global custom style sheet and by using your own logotype if you want.

View File

@@ -9,7 +9,7 @@ import (
// Auther is the authentication interface. // Auther is the authentication interface.
type Auther interface { type Auther interface {
// Auth is called to authenticate a request. // Auth is called to authenticate a request.
Auth(r *http.Request, s *users.Storage, root string) (*users.User, error) Auth(r *http.Request, s users.Store, root string) (*users.User, error)
// LoginPage indicates if this auther needs a login page. // LoginPage indicates if this auther needs a login page.
LoginPage() bool LoginPage() bool
} }

View File

@@ -26,7 +26,7 @@ type JSONAuth struct {
} }
// Auth authenticates the user via a json in content body. // Auth authenticates the user via a json in content body.
func (a JSONAuth) Auth(r *http.Request, sto *users.Storage, root string) (*users.User, error) { func (a JSONAuth) Auth(r *http.Request, sto users.Store, root string) (*users.User, error) {
var cred jsonCred var cred jsonCred
if r.Body == nil { if r.Body == nil {
@@ -40,7 +40,7 @@ func (a JSONAuth) Auth(r *http.Request, sto *users.Storage, root string) (*users
// If ReCaptcha is enabled, check the code. // If ReCaptcha is enabled, check the code.
if a.ReCaptcha != nil && len(a.ReCaptcha.Secret) > 0 { if a.ReCaptcha != nil && len(a.ReCaptcha.Secret) > 0 {
ok, err := a.ReCaptcha.Ok(cred.ReCaptcha) //nolint:shadow ok, err := a.ReCaptcha.Ok(cred.ReCaptcha) //nolint:govet
if err != nil { if err != nil {
return nil, err return nil, err

View File

@@ -14,7 +14,7 @@ const MethodNoAuth settings.AuthMethod = "noauth"
type NoAuth struct{} type NoAuth struct{}
// Auth uses authenticates user 1. // Auth uses authenticates user 1.
func (a NoAuth) Auth(r *http.Request, sto *users.Storage, root string) (*users.User, error) { func (a NoAuth) Auth(r *http.Request, sto users.Store, root string) (*users.User, error) {
return sto.Get(root, uint(1)) return sto.Get(root, uint(1))
} }

View File

@@ -18,7 +18,7 @@ type ProxyAuth struct {
} }
// Auth authenticates the user via an HTTP header. // Auth authenticates the user via an HTTP header.
func (a ProxyAuth) Auth(r *http.Request, sto *users.Storage, root string) (*users.User, error) { func (a ProxyAuth) Auth(r *http.Request, sto users.Store, root string) (*users.User, error) {
username := r.Header.Get(a.Header) username := r.Header.Get(a.Header)
user, err := sto.Get(root, username) user, err := sto.Get(root, username)
if err == errors.ErrNotExist { if err == errors.ErrNotExist {

View File

@@ -14,7 +14,7 @@ var cmdsAddCmd = &cobra.Command{
Use: "add <event> <command>", Use: "add <event> <command>",
Short: "Add a command to run on a specific event", Short: "Add a command to run on a specific event",
Long: `Add a command to run on a specific event.`, Long: `Add a command to run on a specific event.`,
Args: cobra.MinimumNArgs(2), //nolint:mnd Args: cobra.MinimumNArgs(2), //nolint:gomnd
Run: python(func(cmd *cobra.Command, args []string, d pythonData) { Run: python(func(cmd *cobra.Command, args []string, d pythonData) {
s, err := d.store.Settings.Get() s, err := d.store.Settings.Get()
checkErr(err) checkErr(err)

View File

@@ -23,7 +23,7 @@ You can also specify an optional parameter (index_end) so
you can remove all commands from 'index' to 'index_end', you can remove all commands from 'index' to 'index_end',
including 'index_end'.`, including 'index_end'.`,
Args: func(cmd *cobra.Command, args []string) error { Args: func(cmd *cobra.Command, args []string) error {
if err := cobra.RangeArgs(2, 3)(cmd, args); err != nil { //nolint:mnd if err := cobra.RangeArgs(2, 3)(cmd, args); err != nil { //nolint:gomnd
return err return err
} }
@@ -43,7 +43,7 @@ including 'index_end'.`,
i, err := strconv.Atoi(args[1]) i, err := strconv.Atoi(args[1])
checkErr(err) checkErr(err)
f := i f := i
if len(args) == 3 { //nolint:mnd if len(args) == 3 { //nolint:gomnd
f, err = strconv.Atoi(args[2]) f, err = strconv.Atoi(args[2])
checkErr(err) checkErr(err)
} }

View File

@@ -140,10 +140,12 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
fmt.Fprintf(w, "\tAddress:\t%s\n", ser.Address) fmt.Fprintf(w, "\tAddress:\t%s\n", ser.Address)
fmt.Fprintf(w, "\tTLS Cert:\t%s\n", ser.TLSCert) fmt.Fprintf(w, "\tTLS Cert:\t%s\n", ser.TLSCert)
fmt.Fprintf(w, "\tTLS Key:\t%s\n", ser.TLSKey) fmt.Fprintf(w, "\tTLS Key:\t%s\n", ser.TLSKey)
fmt.Fprintf(w, "\tExec Enabled:\t%t\n", ser.EnableExec)
fmt.Fprintln(w, "\nDefaults:") fmt.Fprintln(w, "\nDefaults:")
fmt.Fprintf(w, "\tScope:\t%s\n", set.Defaults.Scope) fmt.Fprintf(w, "\tScope:\t%s\n", set.Defaults.Scope)
fmt.Fprintf(w, "\tLocale:\t%s\n", set.Defaults.Locale) fmt.Fprintf(w, "\tLocale:\t%s\n", set.Defaults.Locale)
fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode) fmt.Fprintf(w, "\tView mode:\t%s\n", set.Defaults.ViewMode)
fmt.Fprintf(w, "\tSingle Click:\t%t\n", set.Defaults.SingleClick)
fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " ")) fmt.Fprintf(w, "\tCommands:\t%s\n", strings.Join(set.Defaults.Commands, " "))
fmt.Fprintf(w, "\tSorting:\n") fmt.Fprintf(w, "\tSorting:\n")
fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By) fmt.Fprintf(w, "\t\tBy:\t%s\n", set.Defaults.Sorting.By)

View File

@@ -2,7 +2,6 @@ package cmd
import ( import (
"fmt" "fmt"
"strings"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@@ -32,7 +31,7 @@ override the options.`,
s := &settings.Settings{ s := &settings.Settings{
Key: generateKey(), Key: generateKey(),
Signup: mustGetBool(flags, "signup"), Signup: mustGetBool(flags, "signup"),
Shell: strings.Split(strings.TrimSpace(mustGetString(flags, "shell")), " "), Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")),
AuthMethod: authMethod, AuthMethod: authMethod,
Defaults: defaults, Defaults: defaults,
Branding: settings.Branding{ Branding: settings.Branding{
@@ -62,7 +61,7 @@ override the options.`,
fmt.Printf(` fmt.Printf(`
Congratulations! You've set up your database to use with File Browser. Congratulations! You've set up your database to use with File Browser.
Now add your first user via 'filebrowser users new' and then you just Now add your first user via 'filebrowser users add' and then you just
need to call the main command to boot up the server. need to call the main command to boot up the server.
`) `)
printSettings(ser, s, auther) printSettings(ser, s, auther)

View File

@@ -1,8 +1,6 @@
package cmd package cmd
import ( import (
"strings"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag" "github.com/spf13/pflag"
) )
@@ -50,7 +48,7 @@ you want to change. Other options will remain unchanged.`,
case "auth.method": case "auth.method":
hasAuth = true hasAuth = true
case "shell": case "shell":
set.Shell = strings.Split(strings.TrimSpace(mustGetString(flags, flag.Name)), " ") set.Shell = convertCmdStrToCmdArray(mustGetString(flags, flag.Name))
case "branding.name": case "branding.name":
set.Branding.Name = mustGetString(flags, flag.Name) set.Branding.Name = mustGetString(flags, flag.Name)
case "branding.disableExternal": case "branding.disableExternal":

View File

@@ -14,13 +14,16 @@ import (
"syscall" "syscall"
homedir "github.com/mitchellh/go-homedir" homedir "github.com/mitchellh/go-homedir"
"github.com/spf13/afero"
"github.com/spf13/cobra" "github.com/spf13/cobra"
"github.com/spf13/pflag" "github.com/spf13/pflag"
v "github.com/spf13/viper" v "github.com/spf13/viper"
lumberjack "gopkg.in/natefinch/lumberjack.v2" lumberjack "gopkg.in/natefinch/lumberjack.v2"
"github.com/filebrowser/filebrowser/v2/auth" "github.com/filebrowser/filebrowser/v2/auth"
"github.com/filebrowser/filebrowser/v2/diskcache"
fbhttp "github.com/filebrowser/filebrowser/v2/http" fbhttp "github.com/filebrowser/filebrowser/v2/http"
"github.com/filebrowser/filebrowser/v2/img"
"github.com/filebrowser/filebrowser/v2/settings" "github.com/filebrowser/filebrowser/v2/settings"
"github.com/filebrowser/filebrowser/v2/storage" "github.com/filebrowser/filebrowser/v2/storage"
"github.com/filebrowser/filebrowser/v2/users" "github.com/filebrowser/filebrowser/v2/users"
@@ -32,6 +35,7 @@ var (
func init() { func init() {
cobra.OnInitialize(initConfig) cobra.OnInitialize(initConfig)
cobra.MousetrapHelpText = ""
rootCmd.SetVersionTemplate("File Browser version {{printf \"%s\" .Version}}\n") rootCmd.SetVersionTemplate("File Browser version {{printf \"%s\" .Version}}\n")
@@ -55,7 +59,14 @@ func addServerFlags(flags *pflag.FlagSet) {
flags.StringP("key", "k", "", "tls key") flags.StringP("key", "k", "", "tls key")
flags.StringP("root", "r", ".", "root to prepend to relative paths") flags.StringP("root", "r", ".", "root to prepend to relative paths")
flags.String("socket", "", "socket to listen to (cannot be used with address, port, cert nor key flags)") flags.String("socket", "", "socket to listen to (cannot be used with address, port, cert nor key flags)")
flags.Uint32("socket-perm", 0666, "unix socket file permissions")
flags.StringP("baseurl", "b", "", "base url") flags.StringP("baseurl", "b", "", "base url")
flags.String("cache-dir", "", "file cache directory (disabled if empty)")
flags.Int("img-processors", 4, "image processors count")
flags.Bool("disable-thumbnails", false, "disable image thumbnails")
flags.Bool("disable-preview-resize", false, "disable resize of image previews")
flags.Bool("disable-exec", false, "disables Command Runner feature")
flags.Bool("disable-type-detection-by-header", false, "disables type detection by reading file headers")
} }
var rootCmd = &cobra.Command{ var rootCmd = &cobra.Command{
@@ -103,6 +114,24 @@ user created with the credentials from options "username" and "password".`,
quickSetup(cmd.Flags(), d) quickSetup(cmd.Flags(), d)
} }
// build img service
workersCount, err := cmd.Flags().GetInt("img-processors")
checkErr(err)
if workersCount < 1 {
log.Fatal("Image resize workers count could not be < 1")
}
imgSvc := img.New(workersCount)
var fileCache diskcache.Interface = diskcache.NewNoOp()
cacheDir, err := cmd.Flags().GetString("cache-dir")
checkErr(err)
if cacheDir != "" {
if err := os.MkdirAll(cacheDir, 0700); err != nil { //nolint:govet
log.Fatalf("can't make directory %s: %s", cacheDir, err)
}
fileCache = diskcache.New(afero.NewOsFs(), cacheDir)
}
server := getRunParams(cmd.Flags(), d.store) server := getRunParams(cmd.Flags(), d.store)
setupLog(server.Log) setupLog(server.Log)
@@ -118,13 +147,20 @@ user created with the credentials from options "username" and "password".`,
case server.Socket != "": case server.Socket != "":
listener, err = net.Listen("unix", server.Socket) listener, err = net.Listen("unix", server.Socket)
checkErr(err) checkErr(err)
case server.TLSKey != "" && server.TLSCert != "": socketPerm, err := cmd.Flags().GetUint32("socket-perm") //nolint:govet
cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) //nolint:shadow
checkErr(err) checkErr(err)
listener, err = tls.Listen("tcp", adr, &tls.Config{Certificates: []tls.Certificate{cer}}) //nolint:shadow err = os.Chmod(server.Socket, os.FileMode(socketPerm))
checkErr(err)
case server.TLSKey != "" && server.TLSCert != "":
cer, err := tls.LoadX509KeyPair(server.TLSCert, server.TLSKey) //nolint:govet
checkErr(err)
listener, err = tls.Listen("tcp", adr, &tls.Config{
MinVersion: tls.VersionTLS12,
Certificates: []tls.Certificate{cer}},
)
checkErr(err) checkErr(err)
default: default:
listener, err = net.Listen("tcp", adr) //nolint:shadow listener, err = net.Listen("tcp", adr)
checkErr(err) checkErr(err)
} }
@@ -132,7 +168,7 @@ user created with the credentials from options "username" and "password".`,
signal.Notify(sigc, os.Interrupt, syscall.SIGTERM) signal.Notify(sigc, os.Interrupt, syscall.SIGTERM)
go cleanupHandler(listener, sigc) go cleanupHandler(listener, sigc)
handler, err := fbhttp.NewHandler(d.store, server) handler, err := fbhttp.NewHandler(imgSvc, fileCache, d.store, server)
checkErr(err) checkErr(err)
defer listener.Close() defer listener.Close()
@@ -205,6 +241,18 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server {
server.Socket = "" server.Socket = ""
} }
_, disableThumbnails := getParamB(flags, "disable-thumbnails")
server.EnableThumbnails = !disableThumbnails
_, disablePreviewResize := getParamB(flags, "disable-preview-resize")
server.ResizePreview = !disablePreviewResize
_, disableTypeDetectionByHeader := getParamB(flags, "disable-type-detection-by-header")
server.TypeDetectionByHeader = !disableTypeDetectionByHeader
_, disableExec := getParamB(flags, "disable-exec")
server.EnableExec = !disableExec
return server return server
} }
@@ -261,8 +309,9 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) {
Signup: false, Signup: false,
CreateUserDir: false, CreateUserDir: false,
Defaults: settings.UserDefaults{ Defaults: settings.UserDefaults{
Scope: ".", Scope: ".",
Locale: "en", Locale: "en",
SingleClick: false,
Perm: users.Permissions{ Perm: users.Permissions{
Admin: false, Admin: false,
Execute: true, Execute: true,

View File

@@ -44,7 +44,7 @@ including 'index_end'.`,
i, err := strconv.Atoi(args[0]) i, err := strconv.Atoi(args[0])
checkErr(err) checkErr(err)
f := i f := i
if len(args) == 2 { //nolint:mnd if len(args) == 2 { //nolint:gomnd
f, err = strconv.Atoi(args[1]) f, err = strconv.Atoi(args[1])
checkErr(err) checkErr(err)
} }

View File

@@ -27,15 +27,16 @@ var usersCmd = &cobra.Command{
func printUsers(usrs []*users.User) { func printUsers(usrs []*users.User) {
w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0) w := tabwriter.NewWriter(os.Stdout, 0, 0, 2, ' ', 0)
fmt.Fprintln(w, "ID\tUsername\tScope\tLocale\tV. Mode\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock") fmt.Fprintln(w, "ID\tUsername\tScope\tLocale\tV. Mode\tS.Click\tAdmin\tExecute\tCreate\tRename\tModify\tDelete\tShare\tDownload\tPwd Lock")
for _, u := range usrs { for _, u := range usrs {
fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n", fmt.Fprintf(w, "%d\t%s\t%s\t%s\t%s\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t%t\t\n",
u.ID, u.ID,
u.Username, u.Username,
u.Scope, u.Scope,
u.Locale, u.Locale,
u.ViewMode, u.ViewMode,
u.SingleClick,
u.Perm.Admin, u.Perm.Admin,
u.Perm.Execute, u.Perm.Execute,
u.Perm.Create, u.Perm.Create,
@@ -75,6 +76,7 @@ func addUserFlags(flags *pflag.FlagSet) {
flags.String("scope", ".", "scope for users") flags.String("scope", ".", "scope for users")
flags.String("locale", "en", "locale for users") flags.String("locale", "en", "locale for users")
flags.String("viewMode", string(users.ListViewMode), "view mode for users") flags.String("viewMode", string(users.ListViewMode), "view mode for users")
flags.Bool("singleClick", false, "use single clicks only")
} }
func getViewMode(flags *pflag.FlagSet) users.ViewMode { func getViewMode(flags *pflag.FlagSet) users.ViewMode {
@@ -95,6 +97,8 @@ func getUserDefaults(flags *pflag.FlagSet, defaults *settings.UserDefaults, all
defaults.Locale = mustGetString(flags, flag.Name) defaults.Locale = mustGetString(flags, flag.Name)
case "viewMode": case "viewMode":
defaults.ViewMode = getViewMode(flags) defaults.ViewMode = getViewMode(flags)
case "singleClick":
defaults.SingleClick = mustGetBool(flags, flag.Name)
case "perm.admin": case "perm.admin":
defaults.Perm.Admin = mustGetBool(flags, flag.Name) defaults.Perm.Admin = mustGetBool(flags, flag.Name)
case "perm.execute": case "perm.execute":

View File

@@ -15,7 +15,7 @@ var usersAddCmd = &cobra.Command{
Use: "add <username> <password>", Use: "add <username> <password>",
Short: "Create a new user", Short: "Create a new user",
Long: `Create a new user and add it to the database.`, Long: `Create a new user and add it to the database.`,
Args: cobra.ExactArgs(2), //nolint:mnd Args: cobra.ExactArgs(2), //nolint:gomnd
Run: python(func(cmd *cobra.Command, args []string, d pythonData) { Run: python(func(cmd *cobra.Command, args []string, d pythonData) {
s, err := d.store.Settings.Get() s, err := d.store.Settings.Get()
checkErr(err) checkErr(err)

View File

@@ -67,7 +67,7 @@ list or set it to 0.`,
// with the new username. If there is, print an error and cancel the // with the new username. If there is, print an error and cancel the
// operation // operation
if user.Username != onDB.Username { if user.Username != onDB.Username {
if conflictuous, err := d.store.Users.Get("", user.Username); err == nil { //nolint:shadow if conflictuous, err := d.store.Users.Get("", user.Username); err == nil { //nolint:govet
checkErr(usernameConflictError(user.Username, conflictuous.ID, user.ID)) checkErr(usernameConflictError(user.Username, conflictuous.ID, user.ID))
} }
} }

View File

@@ -41,17 +41,19 @@ options you want to change.`,
checkErr(err) checkErr(err)
defaults := settings.UserDefaults{ defaults := settings.UserDefaults{
Scope: user.Scope, Scope: user.Scope,
Locale: user.Locale, Locale: user.Locale,
ViewMode: user.ViewMode, ViewMode: user.ViewMode,
Perm: user.Perm, SingleClick: user.SingleClick,
Sorting: user.Sorting, Perm: user.Perm,
Commands: user.Commands, Sorting: user.Sorting,
Commands: user.Commands,
} }
getUserDefaults(flags, &defaults, false) getUserDefaults(flags, &defaults, false)
user.Scope = defaults.Scope user.Scope = defaults.Scope
user.Locale = defaults.Locale user.Locale = defaults.Locale
user.ViewMode = defaults.ViewMode user.ViewMode = defaults.ViewMode
user.SingleClick = defaults.SingleClick
user.Perm = defaults.Perm user.Perm = defaults.Perm
user.Commands = defaults.Commands user.Commands = defaults.Commands
user.Sorting = defaults.Sorting user.Sorting = defaults.Sorting

View File

@@ -7,6 +7,7 @@ import (
"log" "log"
"os" "os"
"path/filepath" "path/filepath"
"strings"
"github.com/asdine/storm" "github.com/asdine/storm"
"github.com/spf13/cobra" "github.com/spf13/cobra"
@@ -71,7 +72,7 @@ func dbExists(path string) (bool, error) {
d := filepath.Dir(path) d := filepath.Dir(path)
_, err = os.Stat(d) _, err = os.Stat(d)
if os.IsNotExist(err) { if os.IsNotExist(err) {
if err := os.MkdirAll(d, 0700); err != nil { //nolint:shadow if err := os.MkdirAll(d, 0700); err != nil { //nolint:govet
return false, err return false, err
} }
return false, nil return false, nil
@@ -178,3 +179,15 @@ func cleanUpMapValue(v interface{}) interface{} {
return v return v
} }
} }
// convertCmdStrToCmdArray checks if cmd string is blank (whitespace included)
// then returns empty string array, else returns the splitted word array of cmd.
// This is to ensure the result will never be []string{""}
func convertCmdStrToCmdArray(cmd string) []string {
var cmdArray []string
trimmedCmdStr := strings.TrimSpace(cmd)
if trimmedCmdStr != "" {
cmdArray = strings.Split(trimmedCmdStr, " ")
}
return cmdArray
}

34
commitlint.config.js Normal file
View File

@@ -0,0 +1,34 @@
module.exports = {
rules: {
'body-leading-blank': [1, 'always'],
'body-max-line-length': [2, 'always', 100],
'footer-leading-blank': [1, 'always'],
'footer-max-line-length': [2, 'always', 100],
'header-max-length': [2, 'always', 100],
'scope-case': [2, 'always', 'lower-case'],
'subject-case': [
2,
'never',
['sentence-case', 'start-case', 'pascal-case', 'upper-case'],
],
'subject-full-stop': [2, 'never', '.'],
'type-case': [2, 'always', 'lower-case'],
'type-empty': [2, 'never'],
'type-enum': [
2,
'always',
[
'feat',
'fix',
'perf',
'revert',
'refactor',
'build',
'ci',
'test',
'chore',
'docs',
],
],
},
};

11
diskcache/cache.go Normal file
View File

@@ -0,0 +1,11 @@
package diskcache
import (
"context"
)
type Interface interface {
Store(ctx context.Context, key string, value []byte) error
Load(ctx context.Context, key string) (value []byte, exist bool, err error)
Delete(ctx context.Context, key string) error
}

110
diskcache/file_cache.go Normal file
View File

@@ -0,0 +1,110 @@
package diskcache
import (
"context"
"crypto/sha1" //nolint:gosec
"encoding/hex"
"errors"
"fmt"
"io/ioutil"
"os"
"path/filepath"
"sync"
"github.com/spf13/afero"
)
type FileCache struct {
fs afero.Fs
// granular locks
scopedLocks struct {
sync.Mutex
sync.Once
locks map[string]sync.Locker
}
}
func New(fs afero.Fs, root string) *FileCache {
return &FileCache{
fs: afero.NewBasePathFs(fs, root),
}
}
func (f *FileCache) Store(ctx context.Context, key string, value []byte) error {
mu := f.getScopedLocks(key)
mu.Lock()
defer mu.Unlock()
fileName := f.getFileName(key)
if err := f.fs.MkdirAll(filepath.Dir(fileName), 0700); err != nil {
return err
}
if err := afero.WriteFile(f.fs, fileName, value, 0700); err != nil {
return err
}
return nil
}
func (f *FileCache) Load(ctx context.Context, key string) (value []byte, exist bool, err error) {
r, ok, err := f.open(key)
if err != nil || !ok {
return nil, ok, err
}
defer r.Close()
value, err = ioutil.ReadAll(r)
if err != nil {
return nil, false, err
}
return value, true, nil
}
func (f *FileCache) Delete(ctx context.Context, key string) error {
mu := f.getScopedLocks(key)
mu.Lock()
defer mu.Unlock()
fileName := f.getFileName(key)
if err := f.fs.Remove(fileName); err != nil && !errors.Is(err, os.ErrNotExist) {
return err
}
return nil
}
func (f *FileCache) open(key string) (afero.File, bool, error) {
fileName := f.getFileName(key)
file, err := f.fs.Open(fileName)
if err != nil {
if errors.Is(err, os.ErrNotExist) {
return nil, false, nil
}
return nil, false, err
}
return file, true, nil
}
// getScopedLocks pull lock from the map if found or create a new one
func (f *FileCache) getScopedLocks(key string) (lock sync.Locker) {
f.scopedLocks.Do(func() { f.scopedLocks.locks = map[string]sync.Locker{} })
f.scopedLocks.Lock()
lock, ok := f.scopedLocks.locks[key]
if !ok {
lock = &sync.Mutex{}
f.scopedLocks.locks[key] = lock
}
f.scopedLocks.Unlock()
return lock
}
func (f *FileCache) getFileName(key string) string {
hasher := sha1.New() //nolint:gosec
_, _ = hasher.Write([]byte(key))
hash := hex.EncodeToString(hasher.Sum(nil))
return fmt.Sprintf("%s/%s/%s", hash[:1], hash[1:3], hash)
}

View File

@@ -0,0 +1,55 @@
package diskcache
import (
"context"
"path/filepath"
"testing"
"github.com/spf13/afero"
"github.com/stretchr/testify/require"
)
func TestFileCache(t *testing.T) {
ctx := context.Background()
const (
key = "key"
value = "some text"
newValue = "new text"
cacheRoot = "/cache"
cachedFilePath = "a/62/a62f2225bf70bfaccbc7f1ef2a397836717377de"
)
fs := afero.NewMemMapFs()
cache := New(fs, "/cache")
// store new key
err := cache.Store(ctx, key, []byte(value))
require.NoError(t, err)
checkValue(t, ctx, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, value)
// update existing key
err = cache.Store(ctx, key, []byte(newValue))
require.NoError(t, err)
checkValue(t, ctx, fs, filepath.Join(cacheRoot, cachedFilePath), cache, key, newValue)
// delete key
err = cache.Delete(ctx, key)
require.NoError(t, err)
exists, err := afero.Exists(fs, filepath.Join(cacheRoot, cachedFilePath))
require.NoError(t, err)
require.False(t, exists)
}
func checkValue(t *testing.T, ctx context.Context, fs afero.Fs, fileFullPath string, cache *FileCache, key, wantValue string) { //nolint:golint
t.Helper()
// check actual file content
b, err := afero.ReadFile(fs, fileFullPath)
require.NoError(t, err)
require.Equal(t, wantValue, string(b))
// check cache content
b, ok, err := cache.Load(ctx, key)
require.NoError(t, err)
require.True(t, ok)
require.Equal(t, wantValue, string(b))
}

24
diskcache/noop_cache.go Normal file
View File

@@ -0,0 +1,24 @@
package diskcache
import (
"context"
)
type NoOp struct {
}
func NewNoOp() *NoOp {
return &NoOp{}
}
func (n *NoOp) Store(ctx context.Context, key string, value []byte) error {
return nil
}
func (n *NoOp) Load(ctx context.Context, key string) (value []byte, exist bool, err error) {
return nil, false, nil
}
func (n *NoOp) Delete(ctx context.Context, key string) error {
return nil
}

View File

@@ -16,4 +16,6 @@ var (
ErrInvalidAuthMethod = errors.New("invalid auth method") ErrInvalidAuthMethod = errors.New("invalid auth method")
ErrPermissionDenied = errors.New("permission denied") ErrPermissionDenied = errors.New("permission denied")
ErrInvalidRequestParams = errors.New("invalid request params") ErrInvalidRequestParams = errors.New("invalid request params")
ErrSourceIsParent = errors.New("source is parent")
ErrRootUserDeletion = errors.New("user with id 1 can't be deleted")
) )

View File

@@ -38,15 +38,18 @@ type FileInfo struct {
Subtitles []string `json:"subtitles,omitempty"` Subtitles []string `json:"subtitles,omitempty"`
Content string `json:"content,omitempty"` Content string `json:"content,omitempty"`
Checksums map[string]string `json:"checksums,omitempty"` Checksums map[string]string `json:"checksums,omitempty"`
Token string `json:"token,omitempty"`
} }
// FileOptions are the options when getting a file info. // FileOptions are the options when getting a file info.
type FileOptions struct { type FileOptions struct {
Fs afero.Fs Fs afero.Fs
Path string Path string
Modify bool Modify bool
Expand bool Expand bool
Checker rules.Checker ReadHeader bool
Token string
Checker rules.Checker
} }
// NewFileInfo creates a File object from a path and a given user. This File // NewFileInfo creates a File object from a path and a given user. This File
@@ -71,17 +74,18 @@ func NewFileInfo(opts FileOptions) (*FileInfo, error) {
IsDir: info.IsDir(), IsDir: info.IsDir(),
Size: info.Size(), Size: info.Size(),
Extension: filepath.Ext(info.Name()), Extension: filepath.Ext(info.Name()),
Token: opts.Token,
} }
if opts.Expand { if opts.Expand {
if file.IsDir { if file.IsDir {
if err := file.readListing(opts.Checker); err != nil { //nolint:shadow if err := file.readListing(opts.Checker, opts.ReadHeader); err != nil { //nolint:govet
return nil, err return nil, err
} }
return file, nil return file, nil
} }
err = file.detectType(opts.Modify, true) err = file.detectType(opts.Modify, true, true)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -134,11 +138,60 @@ func (i *FileInfo) Checksum(algo string) error {
//nolint:goconst //nolint:goconst
//TODO: use constants //TODO: use constants
func (i *FileInfo) detectType(modify, saveContent bool) error { func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error {
if IsNamedPipe(i.Mode) {
i.Type = "blob"
return nil
}
// failing to detect the type should not return error. // failing to detect the type should not return error.
// imagine the situation where a file in a dir with thousands // imagine the situation where a file in a dir with thousands
// of files couldn't be opened: we'd have immediately // of files couldn't be opened: we'd have immediately
// a 500 even though it doesn't matter. So we just log it. // a 500 even though it doesn't matter. So we just log it.
var buffer []byte
mimetype := mime.TypeByExtension(i.Extension)
if mimetype == "" && readHeader {
buffer = i.readFirstBytes()
mimetype = http.DetectContentType(buffer)
}
switch {
case strings.HasPrefix(mimetype, "video"):
i.Type = "video"
i.detectSubtitles()
return nil
case strings.HasPrefix(mimetype, "audio"):
i.Type = "audio"
return nil
case strings.HasPrefix(mimetype, "image"):
i.Type = "image"
return nil
case (strings.HasPrefix(mimetype, "text") || (len(buffer) > 0 && !isBinary(buffer))) && i.Size <= 10*1024*1024: // 10 MB
i.Type = "text"
if !modify {
i.Type = "textImmutable"
}
if saveContent {
afs := &afero.Afero{Fs: i.Fs}
content, err := afs.ReadFile(i.Path)
if err != nil {
return err
}
i.Content = string(content)
}
return nil
default:
i.Type = "blob"
}
return nil
}
func (i *FileInfo) readFirstBytes() []byte {
reader, err := i.Fs.Open(i.Path) reader, err := i.Fs.Open(i.Path)
if err != nil { if err != nil {
log.Print(err) log.Print(err)
@@ -155,44 +208,7 @@ func (i *FileInfo) detectType(modify, saveContent bool) error {
return nil return nil
} }
mimetype := mime.TypeByExtension(i.Extension) return buffer[:n]
if mimetype == "" {
mimetype = http.DetectContentType(buffer[:n])
}
switch {
case strings.HasPrefix(mimetype, "video"):
i.Type = "video"
i.detectSubtitles()
return nil
case strings.HasPrefix(mimetype, "audio"):
i.Type = "audio"
return nil
case strings.HasPrefix(mimetype, "image"):
i.Type = "image"
return nil
case isBinary(buffer[:n], n) || i.Size > 10*1024*1024: // 10 MB
i.Type = "blob"
return nil
default:
i.Type = "text"
if !modify {
i.Type = "textImmutable"
}
if saveContent {
afs := &afero.Afero{Fs: i.Fs}
content, err := afs.ReadFile(i.Path)
if err != nil {
return err
}
i.Content = string(content)
}
}
return nil
} }
func (i *FileInfo) detectSubtitles() { func (i *FileInfo) detectSubtitles() {
@@ -211,7 +227,7 @@ func (i *FileInfo) detectSubtitles() {
} }
} }
func (i *FileInfo) readListing(checker rules.Checker) error { func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error {
afs := &afero.Afero{Fs: i.Fs} afs := &afero.Afero{Fs: i.Fs}
dir, err := afs.ReadDir(i.Path) dir, err := afs.ReadDir(i.Path)
if err != nil { if err != nil {
@@ -232,9 +248,9 @@ func (i *FileInfo) readListing(checker rules.Checker) error {
continue continue
} }
if strings.HasPrefix(f.Mode().String(), "L") { if IsSymlink(f.Mode()) {
// It's a symbolic link. We try to follow it. If it doesn't work, // It's a symbolic link. We try to follow it. If it doesn't work,
// we stay with the link information instead if the target's. // we stay with the link information instead of the target's.
info, err := i.Fs.Stat(fPath) info, err := i.Fs.Stat(fPath)
if err == nil { if err == nil {
f = info f = info
@@ -257,7 +273,7 @@ func (i *FileInfo) readListing(checker rules.Checker) error {
} else { } else {
listing.NumFiles++ listing.NumFiles++
err := file.detectType(true, false) err := file.detectType(true, false, readHeader)
if err != nil { if err != nil {
return err return err
} }

View File

@@ -1,10 +1,11 @@
package files package files
import ( import (
"os"
"unicode/utf8" "unicode/utf8"
) )
func isBinary(content []byte, _ int) bool { func isBinary(content []byte) bool {
maybeStr := string(content) maybeStr := string(content)
runeCnt := utf8.RuneCount(content) runeCnt := utf8.RuneCount(content)
runeIndex := 0 runeIndex := 0
@@ -48,3 +49,11 @@ func isBinary(content []byte, _ int) bool {
} }
return false return false
} }
func IsNamedPipe(mode os.FileMode) bool {
return mode&os.ModeNamedPipe != 0
}
func IsSymlink(mode os.FileMode) bool {
return mode&os.ModeSymlink != 0
}

View File

@@ -2,11 +2,32 @@ package fileutils
import ( import (
"io" "io"
"os"
"path"
"path/filepath" "path/filepath"
"github.com/spf13/afero" "github.com/spf13/afero"
) )
// MoveFile moves file from src to dst.
// By default the rename filesystem system call is used. If src and dst point to different volumes
// the file copy is used as a fallback
func MoveFile(fs afero.Fs, src, dst string) error {
if fs.Rename(src, dst) == nil {
return nil
}
// fallback
err := CopyFile(fs, src, dst)
if err != nil {
_ = fs.Remove(dst)
return err
}
if err := fs.Remove(src); err != nil {
return err
}
return nil
}
// CopyFile copies a file from source to dest and returns // CopyFile copies a file from source to dest and returns
// an error if any. // an error if any.
func CopyFile(fs afero.Fs, source, dest string) error { func CopyFile(fs afero.Fs, source, dest string) error {
@@ -25,7 +46,7 @@ func CopyFile(fs afero.Fs, source, dest string) error {
} }
// Create the destination file. // Create the destination file.
dst, err := fs.Create(dest) dst, err := fs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775)
if err != nil { if err != nil {
return err return err
} }
@@ -37,15 +58,71 @@ func CopyFile(fs afero.Fs, source, dest string) error {
return err return err
} }
// Copy the mode if the user can't // Copy the mode
// open the file.
info, err := fs.Stat(source) info, err := fs.Stat(source)
if err != nil { if err != nil {
err = fs.Chmod(dest, info.Mode()) return err
if err != nil { }
return err err = fs.Chmod(dest, info.Mode())
} if err != nil {
return err
} }
return nil return nil
} }
// CommonPrefix returns common directory path of provided files
func CommonPrefix(sep byte, paths ...string) string {
// Handle special cases.
switch len(paths) {
case 0:
return ""
case 1:
return path.Clean(paths[0])
}
// Note, we treat string as []byte, not []rune as is often
// done in Go. (And sep as byte, not rune). This is because
// most/all supported OS' treat paths as string of non-zero
// bytes. A filename may be displayed as a sequence of Unicode
// runes (typically encoded as UTF-8) but paths are
// not required to be valid UTF-8 or in any normalized form
// (e.g. "é" (U+00C9) and "é" (U+0065,U+0301) are different
// file names.
c := []byte(path.Clean(paths[0]))
// We add a trailing sep to handle the case where the
// common prefix directory is included in the path list
// (e.g. /home/user1, /home/user1/foo, /home/user1/bar).
// path.Clean will have cleaned off trailing / separators with
// the exception of the root directory, "/" (in which case we
// make it "//", but this will get fixed up to "/" bellow).
c = append(c, sep)
// Ignore the first path since it's already in c
for _, v := range paths[1:] {
// Clean up each path before testing it
v = path.Clean(v) + string(sep)
// Find the first non-common byte and truncate c
if len(v) < len(c) {
c = c[:len(v)]
}
for i := 0; i < len(c); i++ {
if v[i] != c[i] {
c = c[:i]
break
}
}
}
// Remove trailing non-separator characters and the final separator
for i := len(c) - 1; i >= 0; i-- {
if c[i] == sep {
c = c[:i]
break
}
}
return string(c)
}

46
fileutils/file_test.go Normal file
View File

@@ -0,0 +1,46 @@
package fileutils
import "testing"
func TestCommonPrefix(t *testing.T) {
testCases := map[string]struct {
paths []string
want string
}{
"same lvl": {
paths: []string{
"/home/user/file1",
"/home/user/file2",
},
want: "/home/user",
},
"sub folder": {
paths: []string{
"/home/user/folder",
"/home/user/folder/file",
},
want: "/home/user/folder",
},
"relative path": {
paths: []string{
"/home/user/folder",
"/home/user/folder/../folder2",
},
want: "/home/user",
},
"no common path": {
paths: []string{
"/home/user/folder",
"/etc/file",
},
want: "",
},
}
for name, tt := range testCases {
t.Run(name, func(t *testing.T) {
if got := CommonPrefix('/', tt.paths...); got != tt.want {
t.Errorf("CommonPrefix() = %v, want %v", got, tt.want)
}
})
}
}

View File

@@ -9929,8 +9929,7 @@
"pako": { "pako": {
"version": "1.0.8", "version": "1.0.8",
"resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz", "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.8.tgz",
"integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA==", "integrity": "sha512-6i0HVbUfcKaTv+EG8ZTr75az7GFXcLYk9UyLEg7Notv/Ma+z/UG3TCoz6GiNeOrn1E/e63I0X/Hpw18jHOTUnA=="
"dev": true
}, },
"parallel-transform": { "parallel-transform": {
"version": "1.1.0", "version": "1.1.0",
@@ -12895,6 +12894,14 @@
"integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
"dev": true "dev": true
}, },
"utif": {
"version": "3.1.0",
"resolved": "http://mirrors.cloud.tencent.com/npm/utif/-/utif-3.1.0.tgz",
"integrity": "sha512-WEo4D/xOvFW53K5f5QTaTbbiORcm2/pCL9P6qmJnup+17eYfKaEhDeX9PeQkuyEoIxlbGklDuGl8xwuXYMrrXQ==",
"requires": {
"pako": "^1.0.5"
}
},
"util": { "util": {
"version": "0.11.1", "version": "0.11.1",
"resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz", "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
@@ -13030,6 +13037,11 @@
"resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.15.3.tgz", "resolved": "https://registry.npmjs.org/vue-i18n/-/vue-i18n-8.15.3.tgz",
"integrity": "sha512-PVNgo6yhOmacZVFjSapZ314oewwLyXHjJwAqjnaPN1GJAJd/dvsrShGzSiJuCX4Hc36G4epJvNXUwO8y7wEKew==" "integrity": "sha512-PVNgo6yhOmacZVFjSapZ314oewwLyXHjJwAqjnaPN1GJAJd/dvsrShGzSiJuCX4Hc36G4epJvNXUwO8y7wEKew=="
}, },
"vue-lazyload": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/vue-lazyload/-/vue-lazyload-1.3.3.tgz",
"integrity": "sha512-uHnq0FTEeNmqnbBC2aRKlmtd9LofMZ6Q3mWvgfLa+i9vhxU8fDK+nGs9c1iVT85axSua/AUnMttIq3xPaU9G3A=="
},
"vue-loader": { "vue-loader": {
"version": "15.8.3", "version": "15.8.3",
"resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.8.3.tgz", "resolved": "https://registry.npmjs.org/vue-loader/-/vue-loader-15.8.3.tgz",

View File

@@ -19,8 +19,10 @@
"normalize.css": "^8.0.1", "normalize.css": "^8.0.1",
"noty": "^3.2.0-beta", "noty": "^3.2.0-beta",
"qrcode.vue": "^1.7.0", "qrcode.vue": "^1.7.0",
"utif": "^3.1.0",
"vue": "^2.6.10", "vue": "^2.6.10",
"vue-i18n": "^8.15.3", "vue-i18n": "^8.15.3",
"vue-lazyload": "^1.3.3",
"vue-router": "^3.1.3", "vue-router": "^3.1.3",
"vuex": "^3.1.2", "vuex": "^3.1.2",
"vuex-router-sync": "^5.0.0" "vuex-router-sync": "^5.0.0"

View File

@@ -13,24 +13,25 @@
<link rel="icon" type="image/png" sizes="32x32" href="[{[ .StaticURL ]}]/img/icons/favicon-32x32.png"> <link rel="icon" type="image/png" sizes="32x32" href="[{[ .StaticURL ]}]/img/icons/favicon-32x32.png">
<link rel="icon" type="image/png" sizes="16x16" href="[{[ .StaticURL ]}]/img/icons/favicon-16x16.png"> <link rel="icon" type="image/png" sizes="16x16" href="[{[ .StaticURL ]}]/img/icons/favicon-16x16.png">
<!-- Add to home screen for Android and modern mobile browsers --> <!-- Add to home screen for Android and modern mobile browsers -->
<link rel="manifest" id="manifestPlaceholder" crossorigin="use-credentials"> <link rel="manifest" id="manifestPlaceholder" crossorigin="use-credentials">
<meta name="theme-color" content="#2979ff"> <meta name="theme-color" content="#2979ff">
<!-- Add to home screen for Safari on iOS --> <!-- Add to home screen for Safari on iOS/iPadOS -->
<meta name="apple-mobile-web-app-capable" content="yes"> <meta name="apple-mobile-web-app-capable" content="yes">
<meta name="apple-mobile-web-app-status-bar-style" content="black"> <meta name="apple-mobile-web-app-status-bar-style" content="black">
<meta name="apple-mobile-web-app-title" content="assets"> <meta name="apple-mobile-web-app-title" content="assets">
<link rel="apple-touch-icon" href="[{[ .StaticURL ]}]/img/icons/apple-touch-icon-152x152.png"> <link rel="apple-touch-icon" href="[{[ .StaticURL ]}]/img/icons/apple-touch-icon.png">
<!-- Add to home screen for Windows --> <!-- Add to home screen for Windows -->
<meta name="msapplication-TileImage" content="[{[ .StaticURL ]}]/img/icons/msapplication-icon-144x144.png"> <meta name="msapplication-TileImage" content="[{[ .StaticURL ]}]/img/icons/mstile-144x144.png">
<meta name="msapplication-TileColor" content="#2979ff"> <meta name="msapplication-TileColor" content="#2979ff">
<!-- Inject Some Variables and generate the manifest json --> <!-- Inject Some Variables and generate the manifest json -->
<script> <script>
window.FileBrowser = JSON.parse(`[{[ .Json ]}]`); window.FileBrowser = JSON.parse(`[{[ .Json ]}]`);
var fullStaticURL = window.location.origin + window.FileBrowser.StaticURL; var fullStaticURL = window.location.origin + window.FileBrowser.StaticURL;
var dynamicManifest = { var dynamicManifest = {
"name": window.FileBrowser.Name || 'File Browser', "name": window.FileBrowser.Name || 'File Browser',

View File

@@ -1,7 +1,7 @@
:root { :root {
--background: #121212; --background: #141D24;
--surfacePrimary: #171819; --surfacePrimary: #20292F;
--surfaceSecondary: #212528; --surfaceSecondary: #3A4147;
--divider: rgba(255, 255, 255, 0.12); --divider: rgba(255, 255, 255, 0.12);
--icon: #ffffff; --icon: #ffffff;
--textPrimary: rgba(255, 255, 255, 0.87); --textPrimary: rgba(255, 255, 255, 0.87);
@@ -16,7 +16,7 @@ body {
#loading { #loading {
background: var(--background); background: var(--background);
} }
#loading .spinner div { #loading .spinner div, #previewer .loading .spinner div {
background: var(--icon); background: var(--icon);
} }
@@ -30,25 +30,34 @@ header {
#search #input { #search #input {
background: var(--surfaceSecondary); background: var(--surfaceSecondary);
border-color: var(--surfacePrimary);
} }
#search.active #input, #search #input input::placeholder {
#search.active .boxes { color: var(--textSecondary);
}
#search.active #input {
background: var(--surfacePrimary); background: var(--surfacePrimary);
} }
#search.active input { #search.active input {
color: var(--textPrimary); color: var(--textPrimary);
} }
#search.active #result { #search #result {
background: var(--background); background: var(--background);
color: var(--textPrimary); color: var(--textPrimary);
} }
#search.active .boxes h3 { #search .boxes {
background: var(--surfaceSecondary);
}
#search .boxes h3 {
color: var(--textPrimary); color: var(--textPrimary);
} }
.action { .action {
color: var(--textPrimary) !important; color: var(--textPrimary) !important;
} }
.action:hover {
background-color: rgba(255, 255, 255, .1);
}
.action i { .action i {
color: var(--icon) !important; color: var(--icon) !important;
} }
@@ -93,6 +102,10 @@ nav > div {
background: var(--background); background: var(--background);
} }
.message {
color: var(--textPrimary);
}
.card { .card {
background: var(--surfacePrimary); background: var(--surfacePrimary);
color: var(--textPrimary); color: var(--textPrimary);
@@ -106,9 +119,23 @@ nav > div {
.dashboard p label { .dashboard p label {
color: var(--textPrimary); color: var(--textPrimary);
} }
.card#share ul li input,
.card#share ul li select,
.input { .input {
background: var(--surfaceSecondary); background: var(--surfaceSecondary);
color: var(--textPrimary); color: var(--textPrimary);
border: 1px solid rgba(255, 255, 255, 0.05);
}
.input:hover,
.input:focus {
border-color: rgba(255, 255, 255, 0.15);
}
.input--red {
background: #73302D;
}
.input--green {
background: #147A41;
} }
.dashboard #nav li, .dashboard #nav li,
@@ -119,10 +146,35 @@ nav > div {
color: var(--textPrimary); color: var(--textPrimary);
} }
table th {
color: var(--textSecondary);
}
.file-list li:hover {
background: var(--surfaceSecondary);
}
.file-list li:before {
color: var(--textSecondary);
}
.file-list li[aria-selected=true]:before {
color: var(--icon);
}
.shell { .shell {
background: var(--surfacePrimary); background: var(--surfacePrimary);
color: var(--textPrimary); color: var(--textPrimary);
} }
.shell__result {
border-top: 1px solid var(--divider);
}
#editor-container {
background: var(--background);
}
#editor-container .bar {
background: var(--surfacePrimary);
}
@media (max-width: 736px) { @media (max-width: 736px) {
#file-selection { #file-selection {
@@ -138,3 +190,12 @@ nav > div {
background: var(--surfaceSecondary) !important; background: var(--surfaceSecondary) !important;
} }
} }
.share__box {
background: var(--surfacePrimary) !important;
color: var(--textPrimary);
}
.share__box__element {
border-top-color: var(--divider);
}

View File

@@ -43,7 +43,7 @@ async function resourceAction (url, method, content) {
const res = await fetchURL(`/api/resources${url}`, opts) const res = await fetchURL(`/api/resources${url}`, opts)
if (res.status !== 200) { if (res.status !== 200) {
throw new Error(res.responseText) throw new Error(await res.text())
} else { } else {
return res return res
} }
@@ -58,7 +58,7 @@ export async function put (url, content = '') {
} }
export function download (format, ...files) { export function download (format, ...files) {
let url = `${baseURL}/api/raw` let url = store.getters['isSharing'] ? `${baseURL}/api/public/dl/${store.state.hash}` : `${baseURL}/api/raw`
if (files.length === 1) { if (files.length === 1) {
url += removePrefix(files[0]) + '?' url += removePrefix(files[0]) + '?'
@@ -77,14 +77,24 @@ export function download (format, ...files) {
if (format !== null) { if (format !== null) {
url += `algo=${format}&` url += `algo=${format}&`
} }
if (store.state.jwt !== ''){
url += `auth=${store.state.jwt}&`
}
if (store.state.token !== ''){
url += `token=${store.state.token}`
}
url += `auth=${store.state.jwt}`
window.open(url) window.open(url)
} }
export async function post (url, content = '', overwrite = false, onupload) { export async function post (url, content = '', overwrite = false, onupload) {
url = removePrefix(url) url = removePrefix(url)
let bufferContent
if (content instanceof Blob && !['http:', 'https:'].includes(window.location.protocol)) {
bufferContent = await new Response(content).arrayBuffer()
}
return new Promise((resolve, reject) => { return new Promise((resolve, reject) => {
let request = new XMLHttpRequest() let request = new XMLHttpRequest()
request.open('POST', `${baseURL}/api/resources${url}?override=${overwrite}`, true) request.open('POST', `${baseURL}/api/resources${url}?override=${overwrite}`, true)
@@ -94,9 +104,6 @@ export async function post (url, content = '', overwrite = false, onupload) {
request.upload.onprogress = onupload request.upload.onprogress = onupload
} }
// Send a message to user before closing the tab during file upload
window.onbeforeunload = () => "Files are being uploaded."
request.onload = () => { request.onload = () => {
if (request.status === 200) { if (request.status === 200) {
resolve(request.responseText) resolve(request.responseText)
@@ -111,30 +118,29 @@ export async function post (url, content = '', overwrite = false, onupload) {
reject(error) reject(error)
} }
request.send(content) request.send(bufferContent || content)
// Upload is done no more message before closing the tab })
}).finally(() => { window.onbeforeunload = null })
} }
function moveCopy (items, copy = false) { function moveCopy (items, copy = false, overwrite = false, rename = false) {
let promises = [] let promises = []
for (let item of items) { for (let item of items) {
const from = removePrefix(item.from) const from = item.from
const to = encodeURIComponent(removePrefix(item.to)) const to = encodeURIComponent(removePrefix(item.to))
const url = `${from}?action=${copy ? 'copy' : 'rename'}&destination=${to}` const url = `${from}?action=${copy ? 'copy' : 'rename'}&destination=${to}&override=${overwrite}&rename=${rename}`
promises.push(resourceAction(url, 'PATCH')) promises.push(resourceAction(url, 'PATCH'))
} }
return Promise.all(promises) return Promise.all(promises)
} }
export function move (items) { export function move (items, overwrite = false, rename = false) {
return moveCopy(items) return moveCopy(items, false, overwrite, rename)
} }
export function copy (items) { export function copy (items, overwrite = false, rename = false) {
return moveCopy(items, true) return moveCopy(items, true, overwrite, rename)
} }
export async function checksum (url, algo) { export async function checksum (url, algo) {

View File

@@ -1,8 +1,31 @@
import { fetchJSON, removePrefix } from './utils' import { fetchURL, removePrefix } from './utils'
import url from '../utils/url'
export default async function search (url, query) { export default async function search (base, query) {
url = removePrefix(url) base = removePrefix(base)
query = encodeURIComponent(query) query = encodeURIComponent(query)
return fetchJSON(`/api/search${url}?query=${query}`, {}) if (!base.endsWith('/')) {
} base += '/'
}
let res = await fetchURL(`/api/search${base}?query=${query}`, {})
if (res.status === 200) {
let data = await res.json()
data = data.map((item) => {
item.url = `/files${base}` + url.encodePath(item.path)
if (item.dir) {
item.url += '/'
}
return item
})
return data
} else {
throw Error(res.status)
}
}

View File

@@ -1,7 +1,13 @@
import { fetchURL, fetchJSON, removePrefix } from './utils' import { fetchURL, fetchJSON, removePrefix } from './utils'
export async function getHash(hash) { export async function list() {
return fetchJSON(`/api/public/share/${hash}`) return fetchJSON('/api/shares')
}
export async function getHash(hash, password = "") {
return fetchJSON(`/api/public/share/${hash}`, {
headers: {'X-SHARE-PASSWORD': password},
})
} }
export async function get(url) { export async function get(url) {
@@ -19,14 +25,18 @@ export async function remove(hash) {
} }
} }
export async function create(url, expires = '', unit = 'hours') { export async function create(url, password = '', expires = '', unit = 'hours') {
url = removePrefix(url) url = removePrefix(url)
url = `/api/share${url}` url = `/api/share${url}`
if (expires !== '') { if (expires !== '') {
url += `?expires=${expires}&unit=${unit}` url += `?expires=${expires}&unit=${unit}`
} }
let body = '{}';
if (password != '' || expires !== '' || unit !== 'hours') {
body = JSON.stringify({password: password, expires: expires, unit: unit})
}
return fetchJSON(url, { return fetchJSON(url, {
method: 'POST' method: 'POST',
body: body,
}) })
} }

View File

@@ -36,6 +36,8 @@ export async function fetchJSON (url, opts) {
export function removePrefix (url) { export function removePrefix (url) {
if (url.startsWith('/files')) { if (url.startsWith('/files')) {
url = url.slice(6) url = url.slice(6)
} else if (store.getters['isSharing']) {
url = url.slice(7 + store.state.hash.length)
} }
if (url === '') url = '/' if (url === '') url = '/'

View File

@@ -1,5 +1,5 @@
<template> <template>
<header> <header v-if="!isEditor && !isPreview">
<div> <div>
<button @click="openSidebar" :aria-label="$t('buttons.toggleSidebar')" :title="$t('buttons.toggleSidebar')" class="action"> <button @click="openSidebar" :aria-label="$t('buttons.toggleSidebar')" :title="$t('buttons.toggleSidebar')" class="action">
<i class="material-icons">menu</i> <i class="material-icons">menu</i>
@@ -8,21 +8,17 @@
<search v-if="isLogged"></search> <search v-if="isLogged"></search>
</div> </div>
<div> <div>
<template v-if="isLogged"> <template v-if="isLogged || isSharing">
<button @click="openSearch" :aria-label="$t('buttons.search')" :title="$t('buttons.search')" class="search-button action"> <button v-show="!isSharing" @click="openSearch" :aria-label="$t('buttons.search')" :title="$t('buttons.search')" class="search-button action">
<i class="material-icons">search</i> <i class="material-icons">search</i>
</button> </button>
<button v-show="showSaveButton" :aria-label="$t('buttons.save')" :title="$t('buttons.save')" class="action" id="save-button">
<i class="material-icons">save</i>
</button>
<button @click="openMore" id="more" :aria-label="$t('buttons.more')" :title="$t('buttons.more')" class="action"> <button @click="openMore" id="more" :aria-label="$t('buttons.more')" :title="$t('buttons.more')" class="action">
<i class="material-icons">more_vert</i> <i class="material-icons">more_vert</i>
</button> </button>
<!-- Menu that shows on listing AND mobile when there are files selected --> <!-- Menu that shows on listing AND mobile when there are files selected -->
<div id="file-selection" v-if="isMobile && isListing"> <div id="file-selection" v-if="isMobile && isListing && !isSharing">
<span v-if="selectedCount > 0">{{ selectedCount }} selected</span> <span v-if="selectedCount > 0">{{ selectedCount }} selected</span>
<share-button v-show="showShareButton"></share-button> <share-button v-show="showShareButton"></share-button>
<rename-button v-show="showRenameButton"></rename-button> <rename-button v-show="showRenameButton"></rename-button>
@@ -41,13 +37,13 @@
<delete-button v-show="showDeleteButton"></delete-button> <delete-button v-show="showDeleteButton"></delete-button>
</div> </div>
<shell-button v-show="user.perm.execute" /> <shell-button v-if="isExecEnabled && !isSharing && user.perm.execute" />
<switch-button v-show="isListing"></switch-button> <switch-button v-show="isListing"></switch-button>
<download-button v-show="showDownloadButton"></download-button> <download-button v-show="showDownloadButton"></download-button>
<upload-button v-show="showUpload"></upload-button> <upload-button v-show="showUpload"></upload-button>
<info-button v-show="isFiles"></info-button> <info-button v-show="isFiles"></info-button>
<button v-show="isListing" @click="toggleMultipleSelection" :aria-label="$t('buttons.selectMultiple')" :title="$t('buttons.selectMultiple')" class="action" > <button v-show="isListing || (isSharing && req.isDir)" @click="toggleMultipleSelection" :aria-label="$t('buttons.selectMultiple')" :title="$t('buttons.selectMultiple')" class="action" >
<i class="material-icons">check_circle</i> <i class="material-icons">check_circle</i>
<span>{{ $t('buttons.select') }}</span> <span>{{ $t('buttons.select') }}</span>
</button> </button>
@@ -72,7 +68,7 @@ import CopyButton from './buttons/Copy'
import ShareButton from './buttons/Share' import ShareButton from './buttons/Share'
import ShellButton from './buttons/Shell' import ShellButton from './buttons/Shell'
import {mapGetters, mapState} from 'vuex' import {mapGetters, mapState} from 'vuex'
import { logoURL } from '@/utils/constants' import { logoURL, enableExec } from '@/utils/constants'
import * as api from '@/api' import * as api from '@/api'
import buttons from '@/utils/buttons' import buttons from '@/utils/buttons'
@@ -112,8 +108,10 @@ export default {
'selectedCount', 'selectedCount',
'isFiles', 'isFiles',
'isEditor', 'isEditor',
'isPreview',
'isListing', 'isListing',
'isLogged' 'isLogged',
'isSharing'
]), ]),
...mapState([ ...mapState([
'req', 'req',
@@ -123,17 +121,15 @@ export default {
'multiple' 'multiple'
]), ]),
logoURL: () => logoURL, logoURL: () => logoURL,
isExecEnabled: () => enableExec,
isMobile () { isMobile () {
return this.width <= 736 return this.width <= 736
}, },
showUpload () { showUpload () {
return this.isListing && this.user.perm.create return this.isListing && this.user.perm.create
}, },
showSaveButton () {
return this.isEditor && this.user.perm.modify
},
showDownloadButton () { showDownloadButton () {
return this.isFiles && this.user.perm.download return (this.isFiles && this.user.perm.download) || (this.isSharing && this.selectedCount > 0)
}, },
showDeleteButton () { showDeleteButton () {
return this.isFiles && (this.isListing return this.isFiles && (this.isListing
@@ -161,7 +157,7 @@ export default {
: this.user.perm.create) : this.user.perm.create)
}, },
showMore () { showMore () {
return this.isFiles && this.$store.state.show === 'more' return (this.isFiles || this.isSharing) && this.$store.state.show === 'more'
}, },
showOverlay () { showOverlay () {
return this.showMore return this.showMore

View File

@@ -49,7 +49,7 @@
</template> </template>
<ul v-show="results.length > 0"> <ul v-show="results.length > 0">
<li v-for="(s,k) in filteredResults" :key="k"> <li v-for="(s,k) in filteredResults" :key="k">
<router-link @click.native="close" :to="'./' + s.path"> <router-link @click.native="close" :to="s.url">
<i v-if="s.dir" class="material-icons">folder</i> <i v-if="s.dir" class="material-icons">folder</i>
<i v-else class="material-icons">insert_drive_file</i> <i v-else class="material-icons">insert_drive_file</i>
<span>./{{ s.path }}</span> <span>./{{ s.path }}</span>
@@ -136,12 +136,6 @@ export default {
} }
}, },
mounted() { mounted() {
window.addEventListener("keydown", event => {
if (event.keyCode === 27) {
this.closeHovers()
}
})
this.$refs.result.addEventListener('scroll', event => { this.$refs.result.addEventListener('scroll', event => {
if (event.target.offsetHeight + event.target.scrollTop >= event.target.scrollHeight - 100) { if (event.target.offsetHeight + event.target.scrollTop >= event.target.scrollHeight - 100) {
this.resultsCount += 50 this.resultsCount += 50
@@ -189,8 +183,12 @@ export default {
this.ongoing = true this.ongoing = true
try {
this.results = await search(path, this.value)
} catch (error) {
this.$showError(error)
}
this.results = await search(path, this.value)
this.ongoing = false this.ongoing = false
} }
} }

View File

@@ -14,11 +14,11 @@ export default {
name: 'download-button', name: 'download-button',
computed: { computed: {
...mapState(['req', 'selected']), ...mapState(['req', 'selected']),
...mapGetters(['isListing', 'selectedCount']) ...mapGetters(['isListing', 'selectedCount', 'isSharing'])
}, },
methods: { methods: {
download: function () { download: function () {
if (!this.isListing) { if (!this.isListing && !this.isSharing) {
api.download(null, this.$route.path) api.download(null, this.$route.path)
return return
} }

View File

@@ -0,0 +1,22 @@
<template>
<button :title="$t('buttons.info')" :aria-label="$t('buttons.info')" class="action" @click="$emit('change-size')">
<i class="material-icons">{{ this.icon }}</i>
<span>{{ $t('buttons.info') }}</span>
</button>
</template>
<script>
export default {
name: 'preview-size-button',
props: [ 'size' ],
computed: {
icon () {
if (this.size) {
return 'photo_size_select_large'
}
return 'hd'
}
}
}
</script>

View File

@@ -1,11 +1,37 @@
<template> <template>
<form id="editor"></form> <div id="editor-container">
<div class="bar">
<button @click="back" :title="$t('files.closePreview')" :aria-label="$t('files.closePreview')" id="close" class="action">
<i class="material-icons">close</i>
</button>
<div class="title">
<span>{{ req.name }}</span>
</div>
<button @click="save" v-show="user.perm.modify" :aria-label="$t('buttons.save')" :title="$t('buttons.save')" id="save-button" class="action">
<i class="material-icons">save</i>
</button>
</div>
<div id="breadcrumbs">
<span><i class="material-icons">home</i></span>
<span v-for="(link, index) in breadcrumbs" :key="index">
<span class="chevron"><i class="material-icons">keyboard_arrow_right</i></span>
<span>{{ link.name }}</span>
</span>
</div>
<form id="editor"></form>
</div>
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import { files as api } from '@/api' import { files as api } from '@/api'
import buttons from '@/utils/buttons' import buttons from '@/utils/buttons'
import url from '@/utils/url'
import ace from 'ace-builds/src-min-noconflict/ace.js' import ace from 'ace-builds/src-min-noconflict/ace.js'
import modelist from 'ace-builds/src-min-noconflict/ext-modelist.js' import modelist from 'ace-builds/src-min-noconflict/ext-modelist.js'
@@ -14,27 +40,52 @@ import { theme } from '@/utils/constants'
export default { export default {
name: 'editor', name: 'editor',
computed: {
...mapState(['req'])
},
data: function () { data: function () {
return {} return {}
}, },
computed: {
...mapState(['req', 'user']),
breadcrumbs () {
let parts = this.$route.path.split('/')
if (parts[0] === '') {
parts.shift()
}
if (parts[parts.length - 1] === '') {
parts.pop()
}
let breadcrumbs = []
for (let i = 0; i < parts.length; i++) {
breadcrumbs.push({ name: decodeURIComponent(parts[i]) })
}
breadcrumbs.shift()
if (breadcrumbs.length > 3) {
while (breadcrumbs.length !== 4) {
breadcrumbs.shift()
}
breadcrumbs[0].name = '...'
}
return breadcrumbs
}
},
created () { created () {
window.addEventListener('keydown', this.keyEvent) window.addEventListener('keydown', this.keyEvent)
document.getElementById('save-button').addEventListener('click', this.save)
}, },
beforeDestroy () { beforeDestroy () {
window.removeEventListener('keydown', this.keyEvent) window.removeEventListener('keydown', this.keyEvent)
document.getElementById('save-button').removeEventListener('click', this.save)
this.editor.destroy(); this.editor.destroy();
}, },
mounted: function () { mounted: function () {
const fileContent = this.req.content || ''; const fileContent = this.req.content || '';
this.editor = ace.edit('editor', { this.editor = ace.edit('editor', {
maxLines: 80,
minLines: 20,
value: fileContent, value: fileContent,
showPrintMargin: false, showPrintMargin: false,
readOnly: this.req.type === 'textImmutable', readOnly: this.req.type === 'textImmutable',
@@ -48,6 +99,10 @@ export default {
} }
}, },
methods: { methods: {
back () {
let uri = url.removeLastDir(this.$route.path) + '/'
this.$router.push({ path: uri })
},
keyEvent (event) { keyEvent (event) {
if (!event.ctrlKey && !event.metaKey) { if (!event.ctrlKey && !event.metaKey) {
return return

View File

@@ -10,10 +10,13 @@
@mouseup="mouseUp" @mouseup="mouseUp"
@wheel="wheelMove" @wheel="wheelMove"
> >
<img :src="src" class="image-ex-img" ref="imgex" @load="setCenter"> <img src="" class="image-ex-img image-ex-img-center" ref="imgex" @load="onLoad">
</div> </div>
</template> </template>
<script> <script>
import throttle from 'lodash.throttle'
import UTIF from 'utif'
export default { export default {
props: { props: {
src: String, src: String,
@@ -50,10 +53,18 @@ export default {
inDrag: false, inDrag: false,
lastTouchDistance: 0, lastTouchDistance: 0,
moveDisabled: false, moveDisabled: false,
disabledTimer: null disabledTimer: null,
imageLoaded: false,
position: {
center: { x: 0, y: 0 },
relative: { x: 0, y: 0 }
}
} }
}, },
mounted() { mounted() {
if (!this.decodeUTIF()) {
this.$refs.imgex.src = this.src
}
let container = this.$refs.container let container = this.$refs.container
this.classList.forEach(className => container.classList.add(className)) this.classList.forEach(className => container.classList.add(className))
// set width and height if they are zero // set width and height if they are zero
@@ -63,24 +74,68 @@ export default {
if (getComputedStyle(container).height === "0px") { if (getComputedStyle(container).height === "0px") {
container.style.height = "100%" container.style.height = "100%"
} }
window.addEventListener('resize', this.onResize)
},
beforeDestroy () {
window.removeEventListener('resize', this.onResize)
document.removeEventListener('mouseup', this.onMouseUp)
},
watch: {
src: function () {
this.scale = 1
this.setZoom()
this.setCenter()
}
}, },
methods: { methods: {
// Modified from UTIF.replaceIMG
decodeUTIF() {
const sufs = ["tif", "tiff", "dng", "cr2", "nef"]
let suff = document.location.pathname.split(".").pop().toLowerCase()
if (sufs.indexOf(suff) == -1) return false
let xhr = new XMLHttpRequest()
UTIF._xhrs.push(xhr)
UTIF._imgs.push(this.$refs.imgex)
xhr.open("GET", this.src)
xhr.responseType = "arraybuffer"
xhr.onload = UTIF._imgLoaded
xhr.send()
return true
},
onLoad() {
let img = this.$refs.imgex
this.imageLoaded = true
if (img === undefined) {
return
}
img.classList.remove('image-ex-img-center')
this.setCenter()
img.classList.add('image-ex-img-ready')
document.addEventListener('mouseup', this.onMouseUp)
},
onMouseUp() {
this.inDrag = false
},
onResize: throttle(function() {
if (this.imageLoaded) {
this.setCenter()
this.doMove(this.position.relative.x, this.position.relative.y)
}
}, 100),
setCenter() { setCenter() {
let container = this.$refs.container let container = this.$refs.container
let img = this.$refs.imgex let img = this.$refs.imgex
let rate = Math.min( this.position.center.x = Math.floor((container.clientWidth - img.clientWidth) / 2)
container.clientWidth / img.clientWidth, this.position.center.y = Math.floor((container.clientHeight - img.clientHeight) / 2)
container.clientHeight / img.clientHeight
) img.style.left = this.position.center.x + 'px'
if (!this.autofill && rate > 1) { img.style.top = this.position.center.y + 'px'
rate = 1
}
// height will be auto set
img.width = Math.floor(img.clientWidth * rate)
img.style.top = `${Math.floor((container.clientHeight - img.clientHeight) / 2)}px`
img.style.left = `${Math.floor((container.clientWidth - img.clientWidth) / 2)}px`
document.addEventListener('mouseup', () => this.inDrag = false )
}, },
mousedownStart(event) { mousedownStart(event) {
this.lastX = null this.lastX = null
@@ -101,6 +156,15 @@ export default {
this.lastX = null this.lastX = null
this.lastY = null this.lastY = null
this.lastTouchDistance = null this.lastTouchDistance = null
if (event.targetTouches.length < 2) {
setTimeout(() => {
this.touches = 0
}, 300)
this.touches++
if (this.touches > 1) {
this.zoomAuto(event)
}
}
event.preventDefault() event.preventDefault()
}, },
zoomAuto(event) { zoomAuto(event) {
@@ -114,6 +178,7 @@ export default {
default: default:
case 4: case 4:
this.scale = 1 this.scale = 1
this.setCenter()
break break
} }
this.setZoom() this.setZoom()
@@ -159,8 +224,22 @@ export default {
}, },
doMove(x, y) { doMove(x, y) {
let style = this.$refs.imgex.style let style = this.$refs.imgex.style
style.left = `${this.pxStringToNumber(style.left) + x}px` let posX = this.pxStringToNumber(style.left) + x
style.top = `${this.pxStringToNumber(style.top) + y}px` let posY = this.pxStringToNumber(style.top) + y
style.left = posX + 'px'
style.top = posY + 'px'
this.position.relative.x = Math.abs(this.position.center.x - posX)
this.position.relative.y = Math.abs(this.position.center.y - posY)
if (posX < this.position.center.x) {
this.position.relative.x = this.position.relative.x * -1
}
if (posY < this.position.center.y) {
this.position.relative.y = this.position.relative.y * -1
}
}, },
wheelMove(event) { wheelMove(event) {
this.scale += (event.wheelDeltaY / 100) * this.zoomStep this.scale += (event.wheelDeltaY / 100) * this.zoomStep
@@ -185,9 +264,20 @@ export default {
} }
.image-ex-img { .image-ex-img {
position: absolute;
}
.image-ex-img-center {
left: 50%;
top: 50%;
transform: translate(-50%, -50%);
position: absolute;
transition: none;
}
.image-ex-img-ready {
left: 0; left: 0;
top: 0; top: 0;
position: absolute;
transition: transform 0.1s ease; transition: transform 0.1s ease;
} }
</style> </style>

View File

@@ -8,9 +8,7 @@
<input style="display:none" type="file" id="upload-folder-input" @change="uploadInput($event)" webkitdirectory multiple> <input style="display:none" type="file" id="upload-folder-input" @change="uploadInput($event)" webkitdirectory multiple>
</div> </div>
<div v-else id="listing" <div v-else id="listing"
:class="user.viewMode" :class="user.viewMode">
@dragenter="dragEnter"
@dragend="dragEnd">
<div> <div>
<div class="item header"> <div class="item header">
<div></div> <div></div>
@@ -89,29 +87,22 @@
<script> <script>
import { mapState, mapMutations } from 'vuex' import { mapState, mapMutations } from 'vuex'
import throttle from 'lodash.throttle'
import Item from './ListingItem' import Item from './ListingItem'
import css from '@/utils/css' import css from '@/utils/css'
import { users, files as api } from '@/api' import { users, files as api } from '@/api'
import buttons from '@/utils/buttons' import * as upload from '@/utils/upload'
import url from '@/utils/url'
export default { export default {
name: 'listing', name: 'listing',
components: { Item }, components: { Item },
data: function () { data: function () {
return { return {
show: 50, showLimit: 50,
uploading: { dragCounter: 0
id: 0,
count: 0,
size: 0,
progress: []
}
} }
}, },
computed: { computed: {
...mapState(['req', 'selected', 'user']), ...mapState(['req', 'selected', 'user', 'show']),
nameSorted () { nameSorted () {
return (this.req.sorting.by === 'name') return (this.req.sorting.by === 'name')
}, },
@@ -139,14 +130,14 @@ export default {
return { dirs, files } return { dirs, files }
}, },
dirs () { dirs () {
return this.items.dirs.slice(0, this.show) return this.items.dirs.slice(0, this.showLimit)
}, },
files () { files () {
let show = this.show - this.items.dirs.length let showLimit = this.showLimit - this.items.dirs.length
if (show < 0) show = 0 if (showLimit < 0) showLimit = 0
return this.items.files.slice(0, show) return this.items.files.slice(0, showLimit)
}, },
nameIcon () { nameIcon () {
if (this.nameSorted && !this.ascOrdered) { if (this.nameSorted && !this.ascOrdered) {
@@ -179,6 +170,8 @@ export default {
window.addEventListener('resize', this.resizeEvent) window.addEventListener('resize', this.resizeEvent)
window.addEventListener('scroll', this.scrollEvent) window.addEventListener('scroll', this.scrollEvent)
document.addEventListener('dragover', this.preventDefault) document.addEventListener('dragover', this.preventDefault)
document.addEventListener('dragenter', this.dragEnter)
document.addEventListener('dragleave', this.dragLeave)
document.addEventListener('drop', this.drop) document.addEventListener('drop', this.drop)
}, },
beforeDestroy () { beforeDestroy () {
@@ -187,6 +180,8 @@ export default {
window.removeEventListener('resize', this.resizeEvent) window.removeEventListener('resize', this.resizeEvent)
window.removeEventListener('scroll', this.scrollEvent) window.removeEventListener('scroll', this.scrollEvent)
document.removeEventListener('dragover', this.preventDefault) document.removeEventListener('dragover', this.preventDefault)
document.removeEventListener('dragenter', this.dragEnter)
document.removeEventListener('dragleave', this.dragLeave)
document.removeEventListener('drop', this.drop) document.removeEventListener('drop', this.drop)
}, },
methods: { methods: {
@@ -195,6 +190,10 @@ export default {
return window.btoa(unescape(encodeURIComponent(name))) return window.btoa(unescape(encodeURIComponent(name)))
}, },
keyEvent (event) { keyEvent (event) {
if (this.show !== null) {
return
}
if (!event.ctrlKey && !event.metaKey) { if (!event.ctrlKey && !event.metaKey) {
return return
} }
@@ -252,7 +251,8 @@ export default {
this.$store.commit('updateClipboard', { this.$store.commit('updateClipboard', {
key: key, key: key,
items: items items: items,
path: this.$route.path
}) })
}, },
paste (event) { paste (event) {
@@ -265,23 +265,56 @@ export default {
for (let item of this.$store.state.clipboard.items) { for (let item of this.$store.state.clipboard.items) {
const from = item.from.endsWith('/') ? item.from.slice(0, -1) : item.from const from = item.from.endsWith('/') ? item.from.slice(0, -1) : item.from
const to = this.$route.path + item.name const to = this.$route.path + item.name
items.push({ from, to }) items.push({ from, to, name: item.name })
} }
if (items.length === 0) { if (items.length === 0) {
return return
} }
if (this.$store.state.clipboard.key === 'x') { let action = (overwrite, rename) => {
api.move(items).then(() => { api.copy(items, overwrite, rename).then(() => {
this.$store.commit('setReload', true) this.$store.commit('setReload', true)
}).catch(this.$showError) }).catch(this.$showError)
}
if (this.$store.state.clipboard.key === 'x') {
action = (overwrite, rename) => {
api.move(items, overwrite, rename).then(() => {
this.$store.commit('resetClipboard')
this.$store.commit('setReload', true)
}).catch(this.$showError)
}
}
if (this.$store.state.clipboard.path == this.$route.path) {
action(false, true)
return return
} }
api.copy(items).then(() => { let conflict = upload.checkConflict(items, this.req.items)
this.$store.commit('setReload', true)
}).catch(this.$showError) let overwrite = false
let rename = false
if (conflict) {
this.$store.commit('showHover', {
prompt: 'replace-rename',
confirm: (event, option) => {
overwrite = option == 'overwrite'
rename = option == 'rename'
event.preventDefault()
this.$store.commit('closeHovers')
action(overwrite, rename)
}
})
return
}
action(overwrite, rename)
}, },
resizeEvent () { resizeEvent () {
// Update the columns size based on the window width. // Update the columns size based on the window width.
@@ -292,10 +325,12 @@ export default {
}, },
scrollEvent () { scrollEvent () {
if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) { if ((window.innerHeight + window.scrollY) >= document.body.offsetHeight) {
this.show += 50 this.showLimit += 50
} }
}, },
dragEnter () { dragEnter () {
this.dragCounter++
// When the user starts dragging an item, put every // When the user starts dragging an item, put every
// file on the listing with 50% opacity. // file on the listing with 50% opacity.
let items = document.getElementsByClassName('item') let items = document.getElementsByClassName('item')
@@ -304,11 +339,16 @@ export default {
file.style.opacity = 0.5 file.style.opacity = 0.5
}) })
}, },
dragEnd () { dragLeave () {
this.resetOpacity() this.dragCounter--
if (this.dragCounter == 0) {
this.resetOpacity()
}
}, },
drop: function (event) { drop: async function (event) {
event.preventDefault() event.preventDefault()
this.dragCounter = 0
this.resetOpacity() this.resetOpacity()
let dt = event.dataTransfer let dt = event.dataTransfer
@@ -327,65 +367,34 @@ export default {
base = el.querySelector('.name').innerHTML + '/' base = el.querySelector('.name').innerHTML + '/'
} }
if (base === '') { let files = await upload.scanFiles(dt)
this.scanFiles(dt).then((result) => { let path = this.$route.path.endsWith('/') ? this.$route.path + base : this.$route.path + '/' + base
this.checkConflict(result, this.req.items, base) let items = this.req.items
})
} else { if (base !== '') {
this.scanFiles(dt).then((result) => { try {
api.fetch(this.$route.path + base) items = (await api.fetch(path)).items
.then(req => { } catch (error) {
this.checkConflict(result, req.items, base) this.$showError(error)
}) }
.catch(this.$showError)
})
}
},
checkConflict (files, items, base) {
if (typeof items === 'undefined' || items === null) {
items = []
} }
let folder_upload = false let conflict = upload.checkConflict(files, items)
if (files[0].fullPath !== undefined) {
folder_upload = true
}
let conflict = false if (conflict) {
for (let i = 0; i < files.length; i++) { this.$store.commit('showHover', {
let file = files[i] prompt: 'replace',
let name = file.name confirm: (event) => {
event.preventDefault()
if (folder_upload) { this.$store.commit('closeHovers')
let dirs = file.fullPath.split("/") upload.handleFiles(files, path, true)
if (dirs.length > 1) {
name = dirs[0]
} }
} })
let res = items.findIndex(function hasConflict (element) {
return (element.name === this)
}, name)
if (res >= 0) {
conflict = true
break
}
}
if (!conflict) {
this.handleFiles(files, base)
return return
} }
this.$store.commit('showHover', { upload.handleFiles(files, path)
prompt: 'replace',
confirm: (event) => {
event.preventDefault()
this.$store.commit('closeHovers')
this.handleFiles(files, base, true)
}
})
}, },
uploadInput (event) { uploadInput (event) {
this.$store.commit('closeHovers') this.$store.commit('closeHovers')
@@ -400,7 +409,23 @@ export default {
} }
} }
this.checkConflict(files, this.req.items, '') let path = this.$route.path.endsWith('/') ? this.$route.path : this.$route.path + '/'
let conflict = upload.checkConflict(files, this.req.items)
if (conflict) {
this.$store.commit('showHover', {
prompt: 'replace',
confirm: (event) => {
event.preventDefault()
this.$store.commit('closeHovers')
upload.handleFiles(files, path, true)
}
})
return
}
upload.handleFiles(files, path)
}, },
resetOpacity () { resetOpacity () {
let items = document.getElementsByClassName('item') let items = document.getElementsByClassName('item')
@@ -409,145 +434,6 @@ export default {
file.style.opacity = 1 file.style.opacity = 1
}) })
}, },
scanFiles(dt) {
return new Promise((resolve) => {
let reading = 0
const contents = []
if (dt.items !== undefined) {
for (let item of dt.items) {
if (item.kind === "file" && typeof item.webkitGetAsEntry === "function") {
const entry = item.webkitGetAsEntry()
readEntry(entry)
}
}
} else {
resolve(dt.files)
}
function readEntry(entry, directory = "") {
if (entry.isFile) {
reading++
entry.file(file => {
reading--
file.fullPath = `${directory}${file.name}`
contents.push(file)
if (reading === 0) {
resolve(contents)
}
})
} else if (entry.isDirectory) {
const dir = {
isDir: true,
path: `${directory}${entry.name}`
}
contents.push(dir)
readReaderContent(entry.createReader(), `${directory}${entry.name}`)
}
}
function readReaderContent(reader, directory) {
reading++
reader.readEntries(function (entries) {
reading--
if (entries.length > 0) {
for (const entry of entries) {
readEntry(entry, `${directory}/`)
}
readReaderContent(reader, `${directory}/`)
}
if (reading === 0) {
resolve(contents)
}
})
}
})
},
setProgress: throttle(function() {
if (this.uploading.count == 0) {
return
}
let sum = this.uploading.progress.reduce((acc, val) => acc + val)
this.$store.commit('setProgress', Math.ceil(sum / this.uploading.size * 100))
}, 100, {leading: false, trailing: true}),
handleFiles (files, base, overwrite = false) {
if (this.uploading.count == 0) {
buttons.loading('upload')
}
let promises = []
let onupload = (id) => (event) => {
this.uploading.progress[id] = event.loaded
this.setProgress()
}
for (let i = 0; i < files.length; i++) {
let file = files[i]
if (!file.isDir) {
let filename = (file.fullPath !== undefined) ? file.fullPath : file.name
let filenameEncoded = url.encodeRFC5987ValueChars(filename)
let id = this.uploading.id
this.uploading.size += file.size
this.uploading.id++
this.uploading.count++
let promise = api.post(this.$route.path + base + filenameEncoded, file, overwrite, throttle(onupload(id), 100)).finally(() => {
this.uploading.count--
})
promises.push(promise)
} else {
let uri = this.$route.path + base
let folders = file.path.split("/")
for (let i = 0; i < folders.length; i++) {
let folder = folders[i]
let folderEncoded = encodeURIComponent(folder)
uri += folderEncoded + "/"
}
api.post(uri)
}
}
let finish = () => {
if (this.uploading.count > 0) {
return
}
buttons.success('upload')
this.$store.commit('setProgress', 0)
this.$store.commit('setReload', true)
this.uploading.id = 0
this.uploading.sizes = []
this.uploading.progress = []
}
Promise.all(promises)
.then(() => {
finish()
})
.catch(error => {
finish()
this.$showError(error)
})
return false
},
async sort (by) { async sort (by) {
let asc = false let asc = false

View File

@@ -6,14 +6,15 @@
@dragstart="dragStart" @dragstart="dragStart"
@dragover="dragOver" @dragover="dragOver"
@drop="drop" @drop="drop"
@click="click" @click="itemClick"
@dblclick="open" @dblclick="dblclick"
@touchstart="touchstart" @touchstart="touchstart"
:data-dir="isDir" :data-dir="isDir"
:aria-label="name" :aria-label="name"
:aria-selected="isSelected"> :aria-selected="isSelected">
<div> <div>
<i class="material-icons">{{ icon }}</i> <img v-if="type==='image' && isThumbsEnabled && !isSharing" v-lazy="thumbnailUrl">
<i v-else class="material-icons">{{ icon }}</i>
</div> </div>
<div> <div>
@@ -30,10 +31,12 @@
</template> </template>
<script> <script>
import { baseURL, enableThumbs } from '@/utils/constants'
import { mapMutations, mapGetters, mapState } from 'vuex' import { mapMutations, mapGetters, mapState } from 'vuex'
import filesize from 'filesize' import filesize from 'filesize'
import moment from 'moment' import moment from 'moment'
import { files as api } from '@/api' import { files as api } from '@/api'
import * as upload from '@/utils/upload'
export default { export default {
name: 'item', name: 'item',
@@ -44,8 +47,12 @@ export default {
}, },
props: ['name', 'isDir', 'url', 'type', 'size', 'modified', 'index'], props: ['name', 'isDir', 'url', 'type', 'size', 'modified', 'index'],
computed: { computed: {
...mapState(['selected', 'req', 'user']), ...mapState(['user', 'selected', 'req', 'jwt']),
...mapGetters(['selectedCount']), ...mapGetters(['selectedCount', 'isSharing']),
singleClick () {
if (this.isSharing) return false
return this.user.singleClick
},
isSelected () { isSelected () {
return (this.selected.indexOf(this.index) !== -1) return (this.selected.indexOf(this.index) !== -1)
}, },
@@ -57,10 +64,10 @@ export default {
return 'insert_drive_file' return 'insert_drive_file'
}, },
isDraggable () { isDraggable () {
return this.user.perm.rename return !this.isSharing && this.user.perm.rename
}, },
canDrop () { canDrop () {
if (!this.isDir) return false if (!this.isDir || this.isSharing) return false
for (let i of this.selected) { for (let i of this.selected) {
if (this.req.items[i].url === this.url) { if (this.req.items[i].url === this.url) {
@@ -69,6 +76,13 @@ export default {
} }
return true return true
},
thumbnailUrl () {
const path = this.url.replace(/^\/files\//, '')
return `${baseURL}/api/preview/thumb/${path}?auth=${this.jwt}&inline=true`
},
isThumbsEnabled () {
return enableThumbs
} }
}, },
methods: { methods: {
@@ -104,29 +118,68 @@ export default {
el.style.opacity = 1 el.style.opacity = 1
}, },
drop: function (event) { drop: async function (event) {
if (!this.canDrop) return if (!this.canDrop) return
event.preventDefault() event.preventDefault()
if (this.selectedCount === 0) return if (this.selectedCount === 0) return
let el = event.target
for (let i = 0; i < 5; i++) {
if (el !== null && !el.classList.contains('item')) {
el = el.parentElement
}
}
let items = [] let items = []
for (let i of this.selected) { for (let i of this.selected) {
items.push({ items.push({
from: this.req.items[i].url, from: this.req.items[i].url,
to: this.url + this.req.items[i].name to: this.url + this.req.items[i].name,
name: this.req.items[i].name
}) })
}
let base = el.querySelector('.name').innerHTML + '/'
let path = this.$route.path + base
let baseItems = (await api.fetch(path)).items
let action = (overwrite, rename) => {
api.move(items, overwrite, rename).then(() => {
this.$store.commit('setReload', true)
}).catch(this.$showError)
} }
api.move(items) let conflict = upload.checkConflict(items, baseItems)
.then(() => {
this.$store.commit('setReload', true) let overwrite = false
let rename = false
if (conflict) {
this.$store.commit('showHover', {
prompt: 'replace-rename',
confirm: (event, option) => {
overwrite = option == 'overwrite'
rename = option == 'rename'
event.preventDefault()
this.$store.commit('closeHovers')
action(overwrite, rename)
}
}) })
.catch(this.$showError)
return
}
action(overwrite, rename)
},
itemClick: function(event) {
if (this.singleClick && !this.$store.state.multiple) this.open()
else this.click(event)
}, },
click: function (event) { click: function (event) {
if (this.selectedCount !== 0) event.preventDefault() if (!this.singleClick && this.selectedCount !== 0) event.preventDefault()
if (this.$store.state.selected.indexOf(this.index) !== -1) { if (this.$store.state.selected.indexOf(this.index) !== -1) {
this.removeSelected(this.index) this.removeSelected(this.index)
return return
@@ -153,9 +206,12 @@ export default {
return return
} }
if (!event.ctrlKey && !this.$store.state.multiple) this.resetSelected() if (!this.singleClick && !event.ctrlKey && !event.metaKey && !this.$store.state.multiple) this.resetSelected()
this.addSelected(this.index) this.addSelected(this.index)
}, },
dblclick: function () {
if (!this.singleClick) this.open()
},
touchstart () { touchstart () {
setTimeout(() => { setTimeout(() => {
this.touches = 0 this.touches = 0
@@ -171,4 +227,4 @@ export default {
} }
} }
} }
</script> </script>

View File

@@ -5,10 +5,27 @@
<i class="material-icons">close</i> <i class="material-icons">close</i>
</button> </button>
<rename-button v-if="user.perm.rename"></rename-button> <div class="title">{{ this.name }}</div>
<delete-button v-if="user.perm.delete"></delete-button>
<download-button v-if="user.perm.download"></download-button> <preview-size-button v-if="isResizeEnabled && this.req.type === 'image'" @change-size="toggleSize" v-bind:size="fullSize" :disabled="loading"></preview-size-button>
<info-button></info-button> <button @click="openMore" id="more" :aria-label="$t('buttons.more')" :title="$t('buttons.more')" class="action">
<i class="material-icons">more_vert</i>
</button>
<div id="dropdown" :class="{ active : showMore }">
<rename-button :disabled="loading" v-if="user.perm.rename"></rename-button>
<delete-button :disabled="loading" v-if="user.perm.delete"></delete-button>
<download-button :disabled="loading" v-if="user.perm.download"></download-button>
<info-button :disabled="loading"></info-button>
</div>
</div>
<div class="loading" v-if="loading">
<div class="spinner">
<div class="bounce1"></div>
<div class="bounce2"></div>
<div class="bounce3"></div>
</div>
</div> </div>
<button class="action" @click="prev" v-show="hasPrevious" :aria-label="$t('buttons.previous')" :title="$t('buttons.previous')"> <button class="action" @click="prev" v-show="hasPrevious" :aria-label="$t('buttons.previous')" :title="$t('buttons.previous')">
@@ -18,33 +35,38 @@
<i class="material-icons">chevron_right</i> <i class="material-icons">chevron_right</i>
</button> </button>
<div class="preview"> <template v-if="!loading">
<ExtendedImage v-if="req.type == 'image'" :src="raw"></ExtendedImage> <div class="preview">
<audio v-else-if="req.type == 'audio'" :src="raw" autoplay controls></audio> <ExtendedImage v-if="req.type == 'image'" :src="raw"></ExtendedImage>
<video v-else-if="req.type == 'video'" :src="raw" autoplay controls> <audio v-else-if="req.type == 'audio'" :src="raw" autoplay controls></audio>
<track <video v-else-if="req.type == 'video'" :src="raw" autoplay controls>
kind="captions" <track
v-for="(sub, index) in subtitles" kind="captions"
:key="index" v-for="(sub, index) in subtitles"
:src="sub" :key="index"
:label="'Subtitle ' + index" :default="index === 0"> :src="sub"
Sorry, your browser doesn't support embedded videos, :label="'Subtitle ' + index" :default="index === 0">
but don't worry, you can <a :href="download">download it</a> Sorry, your browser doesn't support embedded videos,
and watch it with your favorite video player! but don't worry, you can <a :href="download">download it</a>
</video> and watch it with your favorite video player!
<object v-else-if="req.extension == '.pdf'" class="pdf" :data="raw"></object> </video>
<a v-else-if="req.type == 'blob'" :href="download"> <object v-else-if="req.extension.toLowerCase() == '.pdf'" class="pdf" :data="raw"></object>
<h2 class="message">{{ $t('buttons.download') }} <i class="material-icons">file_download</i></h2> <a v-else-if="req.type == 'blob'" :href="download">
</a> <h2 class="message">{{ $t('buttons.download') }} <i class="material-icons">file_download</i></h2>
</div> </a>
</div>
</template>
<div v-show="showMore" @click="resetPrompts" class="overlay"></div>
</div> </div>
</template> </template>
<script> <script>
import { mapState } from 'vuex' import { mapState } from 'vuex'
import url from '@/utils/url' import url from '@/utils/url'
import { baseURL } from '@/utils/constants' import { baseURL, resizePreview } from '@/utils/constants'
import { files as api } from '@/api' import { files as api } from '@/api'
import PreviewSizeButton from '@/components/buttons/PreviewSize'
import InfoButton from '@/components/buttons/Info' import InfoButton from '@/components/buttons/Info'
import DeleteButton from '@/components/buttons/Delete' import DeleteButton from '@/components/buttons/Delete'
import RenameButton from '@/components/buttons/Rename' import RenameButton from '@/components/buttons/Rename'
@@ -61,6 +83,7 @@ const mediaTypes = [
export default { export default {
name: 'preview', name: 'preview',
components: { components: {
PreviewSizeButton,
InfoButton, InfoButton,
DeleteButton, DeleteButton,
RenameButton, RenameButton,
@@ -72,11 +95,13 @@ export default {
previousLink: '', previousLink: '',
nextLink: '', nextLink: '',
listing: null, listing: null,
subtitles: [] name: '',
subtitles: [],
fullSize: false
} }
}, },
computed: { computed: {
...mapState(['req', 'user', 'oldReq', 'jwt']), ...mapState(['req', 'user', 'oldReq', 'jwt', 'loading', 'show']),
hasPrevious () { hasPrevious () {
return (this.previousLink !== '') return (this.previousLink !== '')
}, },
@@ -84,36 +109,55 @@ export default {
return (this.nextLink !== '') return (this.nextLink !== '')
}, },
download () { download () {
return `${baseURL}/api/raw${this.req.path}?auth=${this.jwt}` return `${baseURL}/api/raw${url.encodePath(this.req.path)}?auth=${this.jwt}`
},
previewUrl () {
if (this.req.type === 'image' && !this.fullSize) {
return `${baseURL}/api/preview/big${url.encodePath(this.req.path)}?auth=${this.jwt}`
}
return `${baseURL}/api/raw${url.encodePath(this.req.path)}?auth=${this.jwt}`
}, },
raw () { raw () {
return `${this.download}&inline=true` return `${this.previewUrl}&inline=true`
},
showMore () {
return this.$store.state.show === 'more'
},
isResizeEnabled () {
return resizePreview
}
},
watch: {
$route: function () {
this.updatePreview()
} }
}, },
async mounted () { async mounted () {
window.addEventListener('keyup', this.key) window.addEventListener('keydown', this.key)
this.$store.commit('setPreviewMode', true)
if (this.req.subtitles) { this.listing = this.oldReq.items
this.subtitles = this.req.subtitles.map(sub => `${baseURL}/api/raw${sub}?auth=${this.jwt}&inline=true`) this.$root.$on('preview-deleted', this.deleted)
} this.updatePreview()
try {
if (this.oldReq.items) {
this.updateLinks(this.oldReq.items)
} else {
const path = url.removeLastDir(this.$route.path)
const res = await api.fetch(path)
this.updateLinks(res.items)
}
} catch (e) {
this.$showError(e)
}
}, },
beforeDestroy () { beforeDestroy () {
window.removeEventListener('keyup', this.key) window.removeEventListener('keydown', this.key)
this.$store.commit('setPreviewMode', false)
this.$root.$off('preview-deleted', this.deleted)
}, },
methods: { methods: {
deleted () {
this.listing = this.listing.filter(item => item.name !== this.name)
if (this.hasNext) {
this.next()
} else if (!this.hasPrevious && !this.hasNext) {
this.back()
} else {
this.prev()
}
},
back () { back () {
this.$store.commit('setPreviewMode', false)
let uri = url.removeLastDir(this.$route.path) + '/' let uri = url.removeLastDir(this.$route.path) + '/'
this.$router.push({ path: uri }) this.$router.push({ path: uri })
}, },
@@ -124,36 +168,70 @@ export default {
this.$router.push({ path: this.nextLink }) this.$router.push({ path: this.nextLink })
}, },
key (event) { key (event) {
event.preventDefault()
if (this.show !== null) {
return
}
if (event.which === 13 || event.which === 39) { // right arrow if (event.which === 13 || event.which === 39) { // right arrow
if (this.hasNext) this.next() if (this.hasNext) this.next()
} else if (event.which === 37) { // left arrow } else if (event.which === 37) { // left arrow
if (this.hasPrevious) this.prev() if (this.hasPrevious) this.prev()
} else if (event.which === 27) { // esc
this.back()
} }
}, },
updateLinks (items) { async updatePreview () {
for (let i = 0; i < items.length; i++) { if (this.req.subtitles) {
if (items[i].name !== this.req.name) { this.subtitles = this.req.subtitles.map(sub => `${baseURL}/api/raw${sub}?auth=${this.jwt}&inline=true`)
}
let dirs = this.$route.fullPath.split("/")
this.name = decodeURIComponent(dirs[dirs.length - 1])
if (!this.listing) {
try {
const path = url.removeLastDir(this.$route.path)
const res = await api.fetch(path)
this.listing = res.items
} catch (e) {
this.$showError(e)
}
}
this.previousLink = ''
this.nextLink = ''
for (let i = 0; i < this.listing.length; i++) {
if (this.listing[i].name !== this.name) {
continue continue
} }
for (let j = i - 1; j >= 0; j--) { for (let j = i - 1; j >= 0; j--) {
if (mediaTypes.includes(items[j].type)) { if (mediaTypes.includes(this.listing[j].type)) {
this.previousLink = items[j].url this.previousLink = this.listing[j].url
break break
} }
} }
for (let j = i + 1; j < items.length; j++) { for (let j = i + 1; j < this.listing.length; j++) {
if (mediaTypes.includes(items[j].type)) { if (mediaTypes.includes(this.listing[j].type)) {
this.nextLink = items[j].url this.nextLink = this.listing[j].url
break break
} }
} }
return return
} }
},
openMore () {
this.$store.commit('showHover', 'more')
},
resetPrompts () {
this.$store.commit('closeHovers')
},
toggleSize () {
this.fullSize = !this.fullSize
} }
} }
} }

View File

@@ -16,7 +16,6 @@
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button> :title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="button button--flat" <button class="button button--flat"
@click="copy" @click="copy"
:disabled="$route.path === dest"
:aria-label="$t('buttons.copy')" :aria-label="$t('buttons.copy')"
:title="$t('buttons.copy')">{{ $t('buttons.copy') }}</button> :title="$t('buttons.copy')">{{ $t('buttons.copy') }}</button>
</div> </div>
@@ -28,6 +27,7 @@ import { mapState } from 'vuex'
import FileList from './FileList' import FileList from './FileList'
import { files as api } from '@/api' import { files as api } from '@/api'
import buttons from '@/utils/buttons' import buttons from '@/utils/buttons'
import * as upload from '@/utils/upload'
export default { export default {
name: 'copy', name: 'copy',
@@ -42,25 +42,66 @@ export default {
methods: { methods: {
copy: async function (event) { copy: async function (event) {
event.preventDefault() event.preventDefault()
buttons.loading('copy')
let items = [] let items = []
// Create a new promise for each file. // Create a new promise for each file.
for (let item of this.selected) { for (let item of this.selected) {
items.push({ items.push({
from: this.req.items[item].url, from: this.req.items[item].url,
to: this.dest + encodeURIComponent(this.req.items[item].name) to: this.dest + encodeURIComponent(this.req.items[item].name),
name: this.req.items[item].name
}) })
} }
try { let action = async (overwrite, rename) => {
await api.copy(items) buttons.loading('copy')
buttons.success('copy')
this.$router.push({ path: this.dest }) await api.copy(items, overwrite, rename).then(() => {
} catch (e) { buttons.success('copy')
buttons.done('copy')
this.$showError(e) if (this.$route.path === this.dest) {
this.$store.commit('setReload', true)
return
}
this.$router.push({ path: this.dest })
}).catch((e) => {
buttons.done('copy')
this.$showError(e)
})
} }
if (this.$route.path === this.dest) {
this.$store.commit('closeHovers')
action(false, true)
return
}
let dstItems = (await api.fetch(this.dest)).items
let conflict = upload.checkConflict(items, dstItems)
let overwrite = false
let rename = false
if (conflict) {
this.$store.commit('showHover', {
prompt: 'replace-rename',
confirm: (event, option) => {
overwrite = option == 'overwrite'
rename = option == 'rename'
event.preventDefault()
this.$store.commit('closeHovers')
action(overwrite, rename)
}
})
return
}
action(overwrite, rename)
} }
} }
} }

View File

@@ -20,7 +20,6 @@
<script> <script>
import {mapGetters, mapMutations, mapState} from 'vuex' import {mapGetters, mapMutations, mapState} from 'vuex'
import { files as api } from '@/api' import { files as api } from '@/api'
import url from '@/utils/url'
import buttons from '@/utils/buttons' import buttons from '@/utils/buttons'
export default { export default {
@@ -32,17 +31,20 @@ export default {
methods: { methods: {
...mapMutations(['closeHovers']), ...mapMutations(['closeHovers']),
submit: async function () { submit: async function () {
this.closeHovers()
buttons.loading('delete') buttons.loading('delete')
try { try {
if (!this.isListing) { if (!this.isListing) {
await api.remove(this.$route.path) await api.remove(this.$route.path)
buttons.success('delete') buttons.success('delete')
this.$router.push({ path: url.removeLastDir(this.$route.path) + '/' })
this.$root.$emit('preview-deleted')
this.closeHovers()
return return
} }
this.closeHovers()
if (this.selectedCount === 0) { if (this.selectedCount === 0) {
return return
} }

View File

@@ -1,7 +1,7 @@
<template> <template>
<div> <div>
<ul class="file-list"> <ul class="file-list">
<li @click="select" <li @click="itemClick"
@touchstart="touchstart" @touchstart="touchstart"
@dblclick="next" @dblclick="next"
role="button" role="button"
@@ -35,25 +35,13 @@ export default {
} }
}, },
computed: { computed: {
...mapState([ 'req' ]), ...mapState([ 'req', 'user' ]),
nav () { nav () {
return decodeURIComponent(this.current) return decodeURIComponent(this.current)
} }
}, },
mounted () { mounted () {
// If we're showing this on a listing, this.fillOptions(this.req)
// we can use the current request object
// to fill the move options.
if (this.req.kind === 'listing') {
this.fillOptions(this.req)
return
}
// Otherwise, we must be on a preview or editor
// so we fetch the data from the previous directory.
files.fetch(url.removeLastDir(this.$route.path))
.then(this.fillOptions)
.catch(this.$showError)
}, },
methods: { methods: {
fillOptions (req) { fillOptions (req) {
@@ -123,6 +111,10 @@ export default {
this.next(event) this.next(event)
} }
}, },
itemClick: function (event) {
if (this.user.singleClick) this.next(event)
else this.select(event)
},
select: function (event) { select: function (event) {
// If the element is already selected, unselect it. // If the element is already selected, unselect it.
if (this.selected === event.currentTarget.dataset.url) { if (this.selected === event.currentTarget.dataset.url) {

View File

@@ -27,6 +27,7 @@ import { mapState } from 'vuex'
import FileList from './FileList' import FileList from './FileList'
import { files as api } from '@/api' import { files as api } from '@/api'
import buttons from '@/utils/buttons' import buttons from '@/utils/buttons'
import * as upload from '@/utils/upload'
export default { export default {
name: 'move', name: 'move',
@@ -41,26 +42,51 @@ export default {
methods: { methods: {
move: async function (event) { move: async function (event) {
event.preventDefault() event.preventDefault()
buttons.loading('move')
let items = [] let items = []
for (let item of this.selected) { for (let item of this.selected) {
items.push({ items.push({
from: this.req.items[item].url, from: this.req.items[item].url,
to: this.dest + encodeURIComponent(this.req.items[item].name) to: this.dest + encodeURIComponent(this.req.items[item].name),
name: this.req.items[item].name
}) })
} }
try { let action = async (overwrite, rename) => {
api.move(items) buttons.loading('move')
buttons.success('move')
this.$router.push({ path: this.dest }) await api.move(items, overwrite, rename).then(() => {
} catch (e) { buttons.success('move')
buttons.done('move') this.$router.push({ path: this.dest })
this.$showError(e) }).catch((e) => {
buttons.done('move')
this.$showError(e)
})
} }
event.preventDefault() let dstItems = (await api.fetch(this.dest)).items
let conflict = upload.checkConflict(items, dstItems)
let overwrite = false
let rename = false
if (conflict) {
this.$store.commit('showHover', {
prompt: 'replace-rename',
confirm: (event, option) => {
overwrite = option == 'overwrite'
rename = option == 'rename'
event.preventDefault()
this.$store.commit('closeHovers')
action(overwrite, rename)
}
})
return
}
action(overwrite, rename)
} }
} }
} }

View File

@@ -16,8 +16,10 @@ import Copy from './Copy'
import NewFile from './NewFile' import NewFile from './NewFile'
import NewDir from './NewDir' import NewDir from './NewDir'
import Replace from './Replace' import Replace from './Replace'
import ReplaceRename from './ReplaceRename'
import Share from './Share' import Share from './Share'
import Upload from './Upload' import Upload from './Upload'
import ShareDelete from './ShareDelete'
import { mapState } from 'vuex' import { mapState } from 'vuex'
import buttons from '@/utils/buttons' import buttons from '@/utils/buttons'
@@ -35,7 +37,9 @@ export default {
NewDir, NewDir,
Help, Help,
Replace, Replace,
Upload ReplaceRename,
Upload,
ShareDelete
}, },
data: function () { data: function () {
return { return {
@@ -52,7 +56,7 @@ export default {
return return
let prompt = this.$refs.currentComponent; let prompt = this.$refs.currentComponent;
// Enter // Enter
if (event.keyCode == 13) { if (event.keyCode == 13) {
switch (this.show) { switch (this.show) {
@@ -87,8 +91,10 @@ export default {
'newDir', 'newDir',
'download', 'download',
'replace', 'replace',
'replace-rename',
'share', 'share',
'upload' 'upload',
'share-delete'
].indexOf(this.show) >= 0; ].indexOf(this.show) >= 0;
return matched && this.show || null; return matched && this.show || null;

View File

@@ -0,0 +1,35 @@
<template>
<div class="card floating">
<div class="card-title">
<h2>{{ $t('prompts.replace') }}</h2>
</div>
<div class="card-content">
<p>{{ $t('prompts.replaceMessage') }}</p>
</div>
<div class="card-action">
<button class="button button--flat button--grey"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="button button--flat button--blue"
@click="(event) => showConfirm(event, 'rename')"
:aria-label="$t('buttons.rename')"
:title="$t('buttons.rename')">{{ $t('buttons.rename') }}</button>
<button class="button button--flat button--red"
@click="(event) => showConfirm(event, 'overwrite')"
:aria-label="$t('buttons.replace')"
:title="$t('buttons.replace')">{{ $t('buttons.replace') }}</button>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'replace-rename',
computed: mapState(['showConfirm'])
}
</script>

View File

@@ -1,14 +1,11 @@
<template> <template>
<div class="card floating" id="share"> <div class="card floating share__promt__card" id="share">
<div class="card-title"> <div class="card-title">
<h2>{{ $t('buttons.share') }}</h2> <h2>{{ $t('buttons.share') }}</h2>
</div> </div>
<div class="card-content"> <div class="card-content">
<ul> <ul>
<li v-if="!hasPermanent">
<a @click="getPermalink" :aria-label="$t('buttons.permalink')">{{ $t('buttons.permalink') }}</a>
</li>
<li v-for="link in links" :key="link.hash"> <li v-for="link in links" :key="link.hash">
<a :href="buildLink(link.hash)" target="_blank"> <a :href="buildLink(link.hash)" target="_blank">
@@ -27,6 +24,13 @@
:title="$t('buttons.copyToClipboard')"><i class="material-icons">content_paste</i></button> :title="$t('buttons.copyToClipboard')"><i class="material-icons">content_paste</i></button>
</li> </li>
<li v-if="!hasPermanent">
<div>
<input type="password" :placeholder="$t('prompts.optionalPassword')" v-model="passwordPermalink">
<a @click="getPermalink" :aria-label="$t('buttons.permalink')">{{ $t('buttons.permalink') }}</a>
</div>
</li>
<li> <li>
<input v-focus <input v-focus
type="number" type="number"
@@ -40,6 +44,7 @@
<option value="hours">{{ $t('time.hours') }}</option> <option value="hours">{{ $t('time.hours') }}</option>
<option value="days">{{ $t('time.days') }}</option> <option value="days">{{ $t('time.days') }}</option>
</select> </select>
<input type="password" :placeholder="$t('prompts.optionalPassword')" v-model="password">
<button class="action" <button class="action"
@click="submit" @click="submit"
:aria-label="$t('buttons.create')" :aria-label="$t('buttons.create')"
@@ -72,7 +77,9 @@ export default {
unit: 'hours', unit: 'hours',
hasPermanent: false, hasPermanent: false,
links: [], links: [],
clip: null clip: null,
password: '',
passwordPermalink: ''
} }
}, },
computed: { computed: {
@@ -121,7 +128,7 @@ export default {
if (!this.time) return if (!this.time) return
try { try {
const res = await api.create(this.url, this.time, this.unit) const res = await api.create(this.url, this.password, this.time, this.unit)
this.links.push(res) this.links.push(res)
this.sort() this.sort()
} catch (e) { } catch (e) {
@@ -130,7 +137,7 @@ export default {
}, },
getPermalink: async function () { getPermalink: async function () {
try { try {
const res = await api.create(this.url) const res = await api.create(this.url, this.passwordPermalink)
this.links.push(res) this.links.push(res)
this.sort() this.sort()
this.hasPermanent = true this.hasPermanent = true

View File

@@ -0,0 +1,47 @@
<template>
<div class="card floating">
<div class="card-content">
<p>{{ $t('prompts.deleteMessageShare', {path: hash.path}) }}</p>
</div>
<div class="card-action">
<button @click="$store.commit('closeHovers')"
class="button button--flat button--grey"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button @click="submit"
class="button button--flat button--red"
:aria-label="$t('buttons.delete')"
:title="$t('buttons.delete')">{{ $t('buttons.delete') }}</button>
</div>
</div>
</template>
<script>
import {mapMutations, mapState} from 'vuex'
import { share as api } from '@/api'
import buttons from '@/utils/buttons'
export default {
name: 'share-delete',
computed: {
...mapState(['hash'])
},
methods: {
...mapMutations(['closeHovers']),
submit: async function () {
buttons.loading('delete')
try {
await api.remove(this.hash.hash)
buttons.success('delete')
this.$root.$emit('share-deleted', this.hash.hash)
this.closeHovers()
} catch (e) {
buttons.done('delete')
this.$showError(e)
}
}
}
}
</script>

View File

@@ -27,9 +27,11 @@ export default {
name: 'upload', name: 'upload',
methods: { methods: {
uploadFile: function () { uploadFile: function () {
document.getElementById('upload-input').value = ''
document.getElementById('upload-input').click() document.getElementById('upload-input').click()
}, },
uploadFolder: function () { uploadFolder: function () {
document.getElementById('upload-folder-input').value = ''
document.getElementById('upload-folder-input').click() document.getElementById('upload-folder-input').click()
} }
} }

View File

@@ -16,7 +16,11 @@ export default {
return this.commands.join(' ') return this.commands.join(' ')
}, },
set (value) { set (value) {
this.$emit('update:commands', value.split(' ')) if (value !== '') {
this.$emit('update:commands', value.split(' '))
} else {
this.$emit('update:commands', [])
}
} }
} }
} }

View File

@@ -9,13 +9,14 @@
<p><input type="checkbox" :disabled="admin" v-model="perm.delete"> {{ $t('settings.perm.delete') }}</p> <p><input type="checkbox" :disabled="admin" v-model="perm.delete"> {{ $t('settings.perm.delete') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.download"> {{ $t('settings.perm.download') }}</p> <p><input type="checkbox" :disabled="admin" v-model="perm.download"> {{ $t('settings.perm.download') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.modify"> {{ $t('settings.perm.modify') }}</p> <p><input type="checkbox" :disabled="admin" v-model="perm.modify"> {{ $t('settings.perm.modify') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.execute"> {{ $t('settings.perm.execute') }}</p> <p v-if="isExecEnabled"><input type="checkbox" :disabled="admin" v-model="perm.execute"> {{ $t('settings.perm.execute') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.rename"> {{ $t('settings.perm.rename') }}</p> <p><input type="checkbox" :disabled="admin" v-model="perm.rename"> {{ $t('settings.perm.rename') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.share"> {{ $t('settings.perm.share') }}</p> <p><input type="checkbox" :disabled="admin" v-model="perm.share"> {{ $t('settings.perm.share') }}</p>
</div> </div>
</template> </template>
<script> <script>
import { enableExec } from '@/utils/constants'
export default { export default {
name: 'permissions', name: 'permissions',
props: ['perm'], props: ['perm'],
@@ -33,7 +34,8 @@ export default {
this.perm.admin = value this.perm.admin = value
} }
} },
isExecEnabled: () => enableExec
} }
} }
</script> </script>

View File

@@ -25,7 +25,7 @@
</p> </p>
<permissions :perm.sync="user.perm" /> <permissions :perm.sync="user.perm" />
<commands :commands.sync="user.commands" /> <commands v-if="isExecEnabled" :commands.sync="user.commands" />
<div v-if="!isDefault"> <div v-if="!isDefault">
<h3>{{ $t('settings.rules') }}</h3> <h3>{{ $t('settings.rules') }}</h3>
@@ -40,6 +40,7 @@ import Languages from './Languages'
import Rules from './Rules' import Rules from './Rules'
import Permissions from './Permissions' import Permissions from './Permissions'
import Commands from './Commands' import Commands from './Commands'
import { enableExec } from '@/utils/constants'
export default { export default {
name: 'user', name: 'user',
@@ -53,7 +54,8 @@ export default {
computed: { computed: {
passwordPlaceholder () { passwordPlaceholder () {
return this.isNew ? '' : this.$t('settings.avoidChanges') return this.isNew ? '' : this.$t('settings.avoidChanges')
} },
isExecEnabled: () => enableExec
}, },
watch: { watch: {
'user.perm.admin': function () { 'user.perm.admin': function () {

View File

@@ -25,8 +25,8 @@
background: var(--red); background: var(--red);
} }
.button--red:hover { .button--blue {
background: var(--dark-red); background: var(--blue);
} }
.button--flat { .button--flat {

View File

@@ -1,29 +1,78 @@
.share__box { .share {
text-align: center; display: flex;
box-shadow: rgba(0, 0, 0, 0.06) 0px 1px 3px, rgba(0, 0, 0, 0.12) 0px 1px 2px; flex-wrap: wrap;
background: #fff; justify-content: center;
display: block; align-items: flex-start;
border-radius: 0.2em;
width: 90%;
max-width: 25em;
margin: 6em auto;
} }
.share__box__download { @media (max-width: 736px) {
width: 100%; .share {
display: block;
}
}
.share__box {
box-shadow: rgba(0, 0, 0, 0.06) 0px 1px 3px, rgba(0, 0, 0, 0.12) 0px 1px 2px;
background: #fff;
border-radius: 0.2em;
margin: 5px;
overflow: hidden;
}
.share__box__header {
padding: 1em; padding: 1em;
cursor: pointer; text-align: center;
background: #ffffff; }
color: rgba(0, 0, 0, 0.5);
border-bottom: 1px solid rgba(0, 0, 0, 0.05); .share__box__icon i {
font-size: 10em;
color: #40c4ff;
}
.share__box__center {
text-align: center;
} }
.share__box__info { .share__box__info {
padding: 2em 3em; flex: 1 1 auto;
} }
.share__box__title { .share__box__element {
margin-top: .2em; padding: 1em;
overflow: hidden; border-top: 1px solid rgba(0, 0, 0, 0.1);
text-overflow: ellipsis; word-break: break-all;
}
.share__box__items {
text-align: left;
flex: 10 0 25em;
}
.share__box__items #listing.list .item {
cursor: pointer;
border-left: 0;
border-right: 0;
border-bottom: 0;
border-top: 1px solid rgba(0, 0, 0, 0.1);
}
.share__box__items #listing.list .item .name {
width: 50%;
}
.share__box__items #listing.list .item .modified {
width: 25%;
}
.share__wrong__password {
background: var(--red);
color: #fff;
padding: .5em;
text-align: center;
animation: .2s opac forwards;
}
.share__promt__card {
max-width: max-content !important;
width: auto !important;
} }

View File

@@ -52,6 +52,13 @@
vertical-align: bottom; vertical-align: bottom;
} }
#listing .item img {
width: 4em;
height: 4em;
margin-right: 0.1em;
vertical-align: bottom;
}
.message { .message {
text-align: center; text-align: center;
font-size: 2em; font-size: 2em;
@@ -129,6 +136,11 @@
font-size: 2em; font-size: 2em;
} }
#listing.list .item div:first-of-type img {
width: 2em;
height: 2em;
}
#listing.list .item div:last-of-type { #listing.list .item div:last-of-type {
width: calc(100% - 3em); width: calc(100% - 3em);
display: flex; display: flex;

View File

@@ -119,14 +119,24 @@
#previewer .bar { #previewer .bar {
width: 100%; width: 100%;
text-align: right;
display: flex; display: flex;
padding: 0.5em; padding: 0.5em;
height: 3.7em; height: 3.7em;
} }
#previewer .action:first-of-type { #previewer .bar > * {
margin-right: auto; flex: 0 0 auto;
}
#previewer .bar .title {
display: block;
flex: 1 1 auto;
padding: 0 1em;
line-height: 2.3em;
overflow: hidden;
text-overflow: ellipsis;
font-size: 1.2em;
color: #fff;
} }
#previewer .action i { #previewer .action i {
@@ -184,6 +194,54 @@
right: 0.5em; right: 0.5em;
} }
/* EDITOR */
#editor-container {
background-color: #fafafa;
position: fixed;
top: 0;
left: 0;
width: 100%;
z-index: 9999;
overflow: hidden;
}
#editor-container .bar {
width: 100%;
text-align: right;
display: flex;
padding: 0.5em;
height: 3.7em;
background-color: #fff;
border-bottom: 1px solid rgba(0, 0, 0, 0.075);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
}
#editor-container .title {
margin-right: auto;
padding: 0 1em;
line-height: 2.7em;
overflow: hidden;
word-break: break-word;
}
#previewer .loading {
height: 100%;
width: 100%;
}
#editor-container #editor {
height: calc(100vh - 8.2em);
}
#editor-container #breadcrumbs {
height: 2.3em;
padding: 0 1em;
}
#editor-container #breadcrumbs span {
font-size: 12px;
}
/* * * * * * * * * * * * * * * * /* * * * * * * * * * * * * * * *
* PROMPT * * PROMPT *

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "دائم",
"buttons": { "buttons": {
"shell": "Toggle shell",
"cancel": "إلغاء", "cancel": "إلغاء",
"close": "إغلاق", "close": "إغلاق",
"copy": "نسخ", "copy": "نسخ",
@@ -10,6 +8,7 @@
"create": "إنشاء", "create": "إنشاء",
"delete": "حذف", "delete": "حذف",
"download": "تحميل", "download": "تحميل",
"hideDotfiles": "",
"info": "معلومات", "info": "معلومات",
"more": "المزيد", "more": "المزيد",
"move": "نقل", "move": "نقل",
@@ -17,25 +16,28 @@
"new": "جديد", "new": "جديد",
"next": "التالي", "next": "التالي",
"ok": "موافق", "ok": "موافق",
"replace": "استبدال", "permalink": "الحصول على لنك دائم",
"previous": "السابق", "previous": "السابق",
"publish": "نشر",
"rename": "إعادة تسمية", "rename": "إعادة تسمية",
"replace": "استبدال",
"reportIssue": "إبلاغ عن مشكلة", "reportIssue": "إبلاغ عن مشكلة",
"save": "حفظ", "save": "حفظ",
"schedule": "جدولة",
"search": "بحث", "search": "بحث",
"select": "تحديد", "select": "تحديد",
"share": "مشاركة",
"publish": "نشر",
"selectMultiple": "تحديد متعدد", "selectMultiple": "تحديد متعدد",
"schedule": "جدولة", "share": "مشاركة",
"shell": "Toggle shell",
"switchView": "تغيير العرض", "switchView": "تغيير العرض",
"toggleSidebar": "تبديل الشريط الجانبي", "toggleSidebar": "تبديل الشريط الجانبي",
"update": "تحديث", "update": "تحديث",
"upload": "رفع", "upload": "رفع"
"permalink": "الحصول على لنك دائم"
}, },
"success": { "download": {
"linkCopied": "تم نسخ الملف" "downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "You don't have permissions to access this.", "forbidden": "You don't have permissions to access this.",
@@ -43,11 +45,11 @@
"notFound": "لا يمكن الوصول لهذا المحتوى." "notFound": "لا يمكن الوصول لهذا المحتوى."
}, },
"files": { "files": {
"folders": "المجلدات",
"files": "الملفات",
"body": "الصفحة", "body": "الصفحة",
"clear": "مسح", "clear": "مسح",
"closePreview": "إغلاق العرض", "closePreview": "إغلاق العرض",
"files": "الملفات",
"folders": "المجلدات",
"home": "الصفحة الاولى", "home": "الصفحة الاولى",
"lastModified": "آخر تعديل", "lastModified": "آخر تعديل",
"loading": "جاري التحميل...", "loading": "جاري التحميل...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "التحديد المتعدد مفعل", "multipleSelectionEnabled": "التحديد المتعدد مفعل",
"name": "الإسم", "name": "الإسم",
"size": "الحجم", "size": "الحجم",
"sortByLastModified": "الترتيب بآخر تعديل",
"sortByName": "الترتيب بالإسم", "sortByName": "الترتيب بالإسم",
"sortBySize": "الترتيب بالحجم", "sortBySize": "الترتيب بالحجم"
"sortByLastModified": "الترتيب بآخر تعديل"
}, },
"help": { "help": {
"click": "حدد الملف أو المجلد", "click": "حدد الملف أو المجلد",
@@ -74,18 +76,39 @@
"f2": "إعادة تسمية الملف", "f2": "إعادة تسمية الملف",
"help": "مساعدة" "help": "مساعدة"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "كلمة المرور",
"passwordConfirm": "Password Confirmation",
"submit": "تسجيل دخول",
"createAnAccount": "Create an account", "createAnAccount": "Create an account",
"loginInstead": "Already have an account", "loginInstead": "Already have an account",
"password": "كلمة المرور",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match", "passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup", "signup": "Signup",
"submit": "تسجيل دخول",
"username": "إسم المستخدم", "username": "إسم المستخدم",
"usernameTaken": "Username already taken",
"wrongCredentials": "بيانات دخول خاطئة" "wrongCredentials": "بيانات دخول خاطئة"
}, },
"permanent": "دائم",
"prompts": { "prompts": {
"copy": "نسخ", "copy": "نسخ",
"copyMessage": "رجاء حدد المكان لنسخ ملفاتك فيه:", "copyMessage": "رجاء حدد المكان لنسخ ملفاتك فيه:",
@@ -102,43 +125,64 @@
"lastModified": "آخر تعديل", "lastModified": "آخر تعديل",
"move": "نقل", "move": "نقل",
"moveMessage": "إختر مكان جديد للملفات أو المجلدات المراد نقلها:", "moveMessage": "إختر مكان جديد للملفات أو المجلدات المراد نقلها:",
"newArchetype": "إنشاء منشور من المنشور الأصلي. الملف سيتم انشاءه في مجلد المحتويات.",
"newDir": "مجلد جديد", "newDir": "مجلد جديد",
"newDirMessage": "رجاء أدخل اسم المجلد الجديد.", "newDirMessage": "رجاء أدخل اسم المجلد الجديد.",
"newFile": "ملف جديد", "newFile": "ملف جديد",
"newFileMessage": "رجاء ادخل اسم الملف الجديد.", "newFileMessage": "رجاء ادخل اسم الملف الجديد.",
"numberDirs": "عدد المجلدات", "numberDirs": "عدد المجلدات",
"numberFiles": "عدد الملفات", "numberFiles": "عدد الملفات",
"replace": "إستبدال",
"replaceMessage": "أحد الملفات التي تحاول رفعها يتعارض مع ملف موجود بنفس الإسم. هل تريد إستبدال الملف الموجود؟\n",
"rename": "إعادة تسمية", "rename": "إعادة تسمية",
"renameMessage": "إدراج اسم جديد لـ", "renameMessage": "إدراج اسم جديد لـ",
"show": "عرض", "replace": "إستبدال",
"size": "الحجم", "replaceMessage": "أحد الملفات التي تحاول رفعها يتعارض مع ملف موجود بنفس الإسم. هل تريد إستبدال الملف الموجود؟\n",
"schedule": "جدولة", "schedule": "جدولة",
"scheduleMessage": "أختر الوقت والتاريخ لجدولة نشر هذا المقال.", "scheduleMessage": "أختر الوقت والتاريخ لجدولة نشر هذا المقال.",
"newArchetype": "إنشاء منشور من المنشور الأصلي. الملف سيتم انشاءه في مجلد المحتويات." "show": "عرض",
"size": "الحجم",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "الصور",
"music": "الموسيقى",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "البحث...",
"typeToSearch": "Type to search...",
"types": "الأنواع",
"video": "فيديوهات"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "تنفيذ الأوامر", "allowCommands": "تنفيذ الأوامر",
"allowEdit": "تعديل، إعادة تسمية وحذف الملفات والمجلدات", "allowEdit": "تعديل، إعادة تسمية وحذف الملفات والمجلدات",
"allowNew": "إنشاء ملفات ومجلدات جديدة", "allowNew": "إنشاء ملفات ومجلدات جديدة",
"allowPublish": "نشر مقالات وصفحات جديدة", "allowPublish": "نشر مقالات وصفحات جديدة",
"allowSignup": "Allow users to signup",
"avoidChanges": "(أتركه فارغاً إن لم ترد تغييره)", "avoidChanges": "(أتركه فارغاً إن لم ترد تغييره)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "تغيير كلمة المرور", "changePassword": "تغيير كلمة المرور",
"commandRunner": "Command runner", "commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "تم تحديث الأوامر", "commandsUpdated": "تم تحديث الأوامر",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "ستايل مخصص", "customStylesheet": "ستايل مخصص",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"documentation": "documentation",
"examples": "أمثلة", "examples": "أمثلة",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"globalSettings": "إعدادات عامة", "globalSettings": "إعدادات عامة",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"language": "اللغة", "language": "اللغة",
"lockPassword": "منع المستخدم من تغيير كلمة المرور", "lockPassword": "منع المستخدم من تغيير كلمة المرور",
"newPassword": "كلمة المرور الجديدة", "newPassword": "كلمة المرور الجديدة",
@@ -146,6 +190,16 @@
"newUser": "مستخدم جديد", "newUser": "مستخدم جديد",
"password": "كلمة المرور", "password": "كلمة المرور",
"passwordUpdated": "تم تغيير كلمة المرور", "passwordUpdated": "تم تغيير كلمة المرور",
"path": "",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
},
"permissions": "الصلاحيات", "permissions": "الصلاحيات",
"permissionsHelp": "يمكنك تعيين المستخدم كـ \"مدير\" أو تحديد الصلاحيات بشكل منفرد.\n إذا قمت بتحديد المستخدم كـ \"مدير\"، باقي الخيارات سيتم تحديدها تلقائياً.\n إدارة المستخدمين تبقى صلاحية فريدة للـ \"مدير\" فقط.\n", "permissionsHelp": "يمكنك تعيين المستخدم كـ \"مدير\" أو تحديد الصلاحيات بشكل منفرد.\n إذا قمت بتحديد المستخدم كـ \"مدير\"، باقي الخيارات سيتم تحديدها تلقائياً.\n إدارة المستخدمين تبقى صلاحية فريدة للـ \"مدير\" فقط.\n",
"profileSettings": "إعدادات الحساب", "profileSettings": "إعدادات الحساب",
@@ -155,82 +209,46 @@
"rulesHelp": "يمكنك هنا تحديد مجموعة من شروط السماح والمنع لهذا المستخدم. الملفات الممنوعة لن تظهر ضمن القائمة لهذا المستخدم ولن يستطيع الوصول لها. هنا ندعم الـ regex والـ relative path لنطاق المستخدمين.\n", "rulesHelp": "يمكنك هنا تحديد مجموعة من شروط السماح والمنع لهذا المستخدم. الملفات الممنوعة لن تظهر ضمن القائمة لهذا المستخدم ولن يستطيع الوصول لها. هنا ندعم الـ regex والـ relative path لنطاق المستخدمين.\n",
"scope": "نطاق", "scope": "نطاق",
"settingsUpdated": "تم تعديل الإعدادات", "settingsUpdated": "تم تعديل الإعدادات",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "المستخدم", "user": "المستخدم",
"userCommands": "الأوامر", "userCommands": "الأوامر",
"userCommandsHelp": "الأوامر المتاحة لهذا المستخدم مفصولة فيما بينها بمسافة. مثال:\n", "userCommandsHelp": "الأوامر المتاحة لهذا المستخدم مفصولة فيما بينها بمسافة. مثال:\n",
"userCreated": "تم إنشاء المستخدم", "userCreated": "تم إنشاء المستخدم",
"userDefaults": "User default settings",
"userDeleted": "تم حذف المستخدم", "userDeleted": "تم حذف المستخدم",
"userManagement": "إدارة المستخدمين", "userManagement": "إدارة المستخدمين",
"username": "إسم المستخدم",
"users": "المستخدمين",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "تم تعديل المستخدم", "userUpdated": "تم تعديل المستخدم",
"userDefaults": "User default settings", "username": "إسم المستخدم",
"defaultUserDescription": "This are the default settings for new users.", "users": "المستخدمين"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"modify": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
}, },
"sidebar": { "sidebar": {
"help": "مساعدة", "help": "مساعدة",
"hugoNew": "هيوجو جديد",
"login": "Login", "login": "Login",
"signup": "Signup",
"logout": "تسجيل خروج", "logout": "تسجيل خروج",
"myFiles": "ملفاتي", "myFiles": "ملفاتي",
"newFile": "ملف جديد", "newFile": "ملف جديد",
"newFolder": "مجلد جديد", "newFolder": "مجلد جديد",
"preview": "معاينة",
"settings": "الإعدادات", "settings": "الإعدادات",
"siteSettings": "إعدادات الموقع", "signup": "Signup",
"hugoNew": "هيوجو جديد", "siteSettings": "إعدادات الموقع"
"preview": "معاينة"
}, },
"search": { "success": {
"images": "الصور", "linkCopied": "تم نسخ الملف"
"music": "الموسيقى",
"pdf": "PDF",
"types": "الأنواع",
"video": "فيديوهات",
"search": "البحث...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "وحدة الوقت", "days": "أيام",
"seconds": "ثواني",
"minutes": "دقائق",
"hours": "ساعات", "hours": "ساعات",
"days": "أيام" "minutes": "دقائق",
}, "seconds": "ثواني",
"download": { "unit": "وحدة الوقت"
"downloadFile": "Download File",
"downloadFolder": "Download Folder"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanent",
"buttons": { "buttons": {
"shell": "Kommandozeile ein/ausschalten",
"cancel": "Abbrechen", "cancel": "Abbrechen",
"close": "Schließen", "close": "Schließen",
"copy": "Kopieren", "copy": "Kopieren",
@@ -10,6 +8,7 @@
"create": "Neu", "create": "Neu",
"delete": "Löschen", "delete": "Löschen",
"download": "Downloaden", "download": "Downloaden",
"hideDotfiles": "",
"info": "Info", "info": "Info",
"more": "mehr", "more": "mehr",
"move": "Verschieben", "move": "Verschieben",
@@ -17,25 +16,28 @@
"new": "Neu", "new": "Neu",
"next": "nächste", "next": "nächste",
"ok": "OK", "ok": "OK",
"replace": "Ersetzen", "permalink": "permanenten Verweis anzeigen",
"previous": "vorherige", "previous": "vorherige",
"publish": "Veröffentlichen",
"rename": "umbenennen", "rename": "umbenennen",
"replace": "Ersetzen",
"reportIssue": "Fehler melden", "reportIssue": "Fehler melden",
"save": "Speichern", "save": "Speichern",
"schedule": "Planung",
"search": "Suchen", "search": "Suchen",
"select": "Auswählen", "select": "Auswählen",
"share": "Teilen",
"publish": "Veröffentlichen",
"selectMultiple": "Mehrfachauswahl", "selectMultiple": "Mehrfachauswahl",
"schedule": "Planung", "share": "Teilen",
"shell": "Kommandozeile ein/ausschalten",
"switchView": "Ansicht wechseln", "switchView": "Ansicht wechseln",
"toggleSidebar": "Seitenleiste anzeigen", "toggleSidebar": "Seitenleiste anzeigen",
"update": "Update", "update": "Update",
"upload": "Upload", "upload": "Upload"
"permalink": "permanenten Verweis anzeigen"
}, },
"success": { "download": {
"linkCopied": "Verweis wurde kopiert!" "downloadFile": "Download Datei",
"downloadFolder": "Download Ordner",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "Sie haben keine Berechtigung dies abzurufen.", "forbidden": "Sie haben keine Berechtigung dies abzurufen.",
@@ -43,11 +45,11 @@
"notFound": "Dieser Ort kann nicht angezeigt werden." "notFound": "Dieser Ort kann nicht angezeigt werden."
}, },
"files": { "files": {
"folders": "Ordner",
"files": "Dateien",
"body": "Body", "body": "Body",
"clear": "Clear", "clear": "Clear",
"closePreview": "Vorschau schließen", "closePreview": "Vorschau schließen",
"files": "Dateien",
"folders": "Ordner",
"home": "Home", "home": "Home",
"lastModified": "zuletzt verändert", "lastModified": "zuletzt verändert",
"loading": "Lade...", "loading": "Lade...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Mehrfachauswahl ausgewählt", "multipleSelectionEnabled": "Mehrfachauswahl ausgewählt",
"name": "Name", "name": "Name",
"size": "Größe", "size": "Größe",
"sortByLastModified": "Nach Änderungsdatum sortieren",
"sortByName": "Nach Namen sortieren", "sortByName": "Nach Namen sortieren",
"sortBySize": "Nach Größe sortieren", "sortBySize": "Nach Größe sortieren"
"sortByLastModified": "Nach Änderungsdatum sortieren"
}, },
"help": { "help": {
"click": "wähle Datei oder Ordner", "click": "wähle Datei oder Ordner",
@@ -74,18 +76,39 @@
"f2": "Datei umbenennen", "f2": "Datei umbenennen",
"help": "Hilfe" "help": "Hilfe"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Passwort",
"passwordConfirm": "Passwort Bestätigung",
"submit": "Login",
"createAnAccount": "Account erstellen", "createAnAccount": "Account erstellen",
"loginInstead": "Account besteht bereits", "loginInstead": "Account besteht bereits",
"password": "Passwort",
"passwordConfirm": "Passwort Bestätigung",
"passwordsDontMatch": "Passwörter stimmen nicht überein", "passwordsDontMatch": "Passwörter stimmen nicht überein",
"usernameTaken": "Benutzername ist bereits vergeben",
"signup": "Registrieren", "signup": "Registrieren",
"submit": "Login",
"username": "Benutzername", "username": "Benutzername",
"usernameTaken": "Benutzername ist bereits vergeben",
"wrongCredentials": "Falsche Zugangsdaten" "wrongCredentials": "Falsche Zugangsdaten"
}, },
"permanent": "Permanent",
"prompts": { "prompts": {
"copy": "Kopieren", "copy": "Kopieren",
"copyMessage": "Wählen Sie einen Zielort zum Kopieren:", "copyMessage": "Wählen Sie einen Zielort zum Kopieren:",
@@ -102,43 +125,64 @@
"lastModified": "Zuletzt geändert", "lastModified": "Zuletzt geändert",
"move": "Verschieben", "move": "Verschieben",
"moveMessage": "Wählen sie einen neuen Platz für ihre Datei(en)/Ordner:", "moveMessage": "Wählen sie einen neuen Platz für ihre Datei(en)/Ordner:",
"newArchetype": "Erstelle neuen Beitrag auf dem Archetyp. Ihre Datei wird im Inhalteordner erstellt.",
"newDir": "Neuer Ordner", "newDir": "Neuer Ordner",
"newDirMessage": "Geben Sie den Namen des neuen Ordners an.", "newDirMessage": "Geben Sie den Namen des neuen Ordners an.",
"newFile": "Neue Datei", "newFile": "Neue Datei",
"newFileMessage": "Geben Sie den Namen der neuen Datei an.", "newFileMessage": "Geben Sie den Namen der neuen Datei an.",
"numberDirs": "Anzahl der Ordner", "numberDirs": "Anzahl der Ordner",
"numberFiles": "Anzahl der Dateien", "numberFiles": "Anzahl der Dateien",
"replace": "Ersetzen",
"replaceMessage": "Eine der Datei mit dem gleichen Namen, wie die Sie hochladen wollen, existiert bereits. Soll die vorhandene Datei ersetzt werden ?\n",
"rename": "Umbenennen", "rename": "Umbenennen",
"renameMessage": "Fügen Sie einen Namen ein für", "renameMessage": "Fügen Sie einen Namen ein für",
"show": "Anzeigen", "replace": "Ersetzen",
"size": "Größe", "replaceMessage": "Eine der Datei mit dem gleichen Namen, wie die Sie hochladen wollen, existiert bereits. Soll die vorhandene Datei ersetzt werden ?\n",
"schedule": "Plan", "schedule": "Plan",
"scheduleMessage": "Wählen Sie ein Datum und eine Zeit für die Veröffentlichung dieses Beitrags.", "scheduleMessage": "Wählen Sie ein Datum und eine Zeit für die Veröffentlichung dieses Beitrags.",
"newArchetype": "Erstelle neuen Beitrag auf dem Archetyp. Ihre Datei wird im Inhalteordner erstellt." "show": "Anzeigen",
"size": "Größe",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Bilder",
"music": "Musik",
"pdf": "PDF",
"pressToSearch": "Drücken sie Enter um zu suchen...",
"search": "Suche...",
"typeToSearch": "Tippe um zu suchen...",
"types": "Typen",
"video": "Video"
}, },
"settings": { "settings": {
"instanceName": "Instanzname",
"brandingDirectoryPath": "Markenverzeichnispfad",
"documentation": "Dokumentation",
"branding": "Marke",
"disableExternalLinks": "Externe Links deaktivieren (außer Dokumentation)",
"brandingHelp": "Sie können das Erscheinungsbild ihres File Browser anpassen, in dem sie den Namen ändern, das Logo austauchsen oder eigene Stile definieren und sogar externe Links zu GitHub deaktivieren.\nUm mehr Informationen zum Anpassen an ihre Marke zu bekommen, gehen sie bitte zu {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Befehle ausführen", "allowCommands": "Befehle ausführen",
"allowEdit": "Bearbeiten, Umbenennen und Löschen von Dateien oder Ordnern", "allowEdit": "Bearbeiten, Umbenennen und Löschen von Dateien oder Ordnern",
"allowNew": "Erstellen neuer Dateien und Ordner", "allowNew": "Erstellen neuer Dateien und Ordner",
"allowPublish": "Veröffentlichen von neuen Beiträgen und Seiten", "allowPublish": "Veröffentlichen von neuen Beiträgen und Seiten",
"allowSignup": "Erlaube Benutzern sich zu registrieren",
"avoidChanges": "(leer lassen um Änderungen zu vermeiden)", "avoidChanges": "(leer lassen um Änderungen zu vermeiden)",
"branding": "Marke",
"brandingDirectoryPath": "Markenverzeichnispfad",
"brandingHelp": "Sie können das Erscheinungsbild ihres File Browser anpassen, in dem sie den Namen ändern, das Logo austauchsen oder eigene Stile definieren und sogar externe Links zu GitHub deaktivieren.\nUm mehr Informationen zum Anpassen an ihre Marke zu bekommen, gehen sie bitte zu {0}.",
"changePassword": "Ändere das Passwort", "changePassword": "Ändere das Passwort",
"commandRunner": "Befehlseingabe", "commandRunner": "Befehlseingabe",
"commandRunnerHelp": "Hier könne sie Befehle eintragen die bei benannten Aktionen ausgeführt werden. Sie müssen pro Zeile jeweils einen eingeben. Die Umgebungsvariable {0} und {1} sind verfügbar, wobei {0} relative zu {1} ist. Für mehr Informationen über diese Funktion und die verfügbaren Umgebungsvariablen, lesen sie bitte das {2}.", "commandRunnerHelp": "Hier könne sie Befehle eintragen die bei benannten Aktionen ausgeführt werden. Sie müssen pro Zeile jeweils einen eingeben. Die Umgebungsvariable {0} und {1} sind verfügbar, wobei {0} relative zu {1} ist. Für mehr Informationen über diese Funktion und die verfügbaren Umgebungsvariablen, lesen sie bitte das {2}.",
"commandsUpdated": "Befehle aktualisiert!", "commandsUpdated": "Befehle aktualisiert!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "Individuelles Stylesheet", "customStylesheet": "Individuelles Stylesheet",
"defaultUserDescription": "Das sind die Standard Einstellunge für Benutzer",
"disableExternalLinks": "Externe Links deaktivieren (außer Dokumentation)",
"documentation": "Dokumentation",
"examples": "Beispiele", "examples": "Beispiele",
"executeOnShell": "In shell ausführen",
"executeOnShellDescription": "Es ist voreingestellt das der File Brower Befehle ausführt in dem er die Befehlsdatein direkt auf ruft. Wenn sie wollen das sie auf einer Kommandozeile (wo Bash oder PowerShell) laufen, könne sie das hier definieren mit allen bennötigten Argumenten und Optionen. Wenn gesetzt, wird das Kommando das ausgeführt werden soll als Parameter angehängt. Das gilt für Benuzerkommandos sowie auch für Ereignisse.",
"globalRules": "Das ist ein globales Set von Regeln die erlauben oder nicht erlauben. Die sind für alle Benutzer zutreffend. Es können spezielle Regeln in den Einstellungen der Benutzer definiert werden die diese übersteuern.",
"globalSettings": "Globale Einstellungen", "globalSettings": "Globale Einstellungen",
"hideDotfiles": "",
"insertPath": "Pfad einfügen",
"insertRegex": "Regex Ausdruck einfügen",
"instanceName": "Instanzname",
"language": "Sprache", "language": "Sprache",
"lockPassword": "Verhindere, dass der Benutzer sein Passwort ändert", "lockPassword": "Verhindere, dass der Benutzer sein Passwort ändert",
"newPassword": "Ihr neues Passwort.", "newPassword": "Ihr neues Passwort.",
@@ -146,6 +190,16 @@
"newUser": "Neuer Benutzer", "newUser": "Neuer Benutzer",
"password": "Passwort", "password": "Passwort",
"passwordUpdated": "Passwort aktualisiert!", "passwordUpdated": "Passwort aktualisiert!",
"path": "",
"perm": {
"create": "Dateien und Ordner erstellen",
"delete": "Dateien und Ordner löschen",
"download": "Download",
"execute": "Befehle ausführen",
"modify": "Dateien editieren",
"rename": "Umbenennen oder Verschieben von Dateien oder Ordnern",
"share": "Datei teilen"
},
"permissions": "Berechtigungen", "permissions": "Berechtigungen",
"permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigunen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n", "permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigunen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n",
"profileSettings": "Profileinstellungen", "profileSettings": "Profileinstellungen",
@@ -155,82 +209,46 @@
"rulesHelp": "Hier können Sie erlaubte und verbotene Aktionen für einen einzelnen Benutzer festlegen. Bockierte Dateien werden nicht im Listing angezeigt und sind nicht erreichbar für den Nutzer. Wir unterstützen reguläre Ausdrücke (Regex) und Pfade die relativ zum Benutzerordner sind. \n", "rulesHelp": "Hier können Sie erlaubte und verbotene Aktionen für einen einzelnen Benutzer festlegen. Bockierte Dateien werden nicht im Listing angezeigt und sind nicht erreichbar für den Nutzer. Wir unterstützen reguläre Ausdrücke (Regex) und Pfade die relativ zum Benutzerordner sind. \n",
"scope": "Scope", "scope": "Scope",
"settingsUpdated": "Einstellungen aktualisiert!", "settingsUpdated": "Einstellungen aktualisiert!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Benutzer", "user": "Benutzer",
"userCommands": "Befehle", "userCommands": "Befehle",
"userCommandsHelp": "Eine Liste, mit einem Leerzeichen als Trennung, mit den für diesen Nutzer verfügbaren Befehlen. Example:\n", "userCommandsHelp": "Eine Liste, mit einem Leerzeichen als Trennung, mit den für diesen Nutzer verfügbaren Befehlen. Example:\n",
"userCreated": "Benutzer angelegt!", "userCreated": "Benutzer angelegt!",
"userDefaults": "Benutzer Standard Einstellungen",
"userDeleted": "Benutzer gelöscht!", "userDeleted": "Benutzer gelöscht!",
"userManagement": "Benutzerverwaltung", "userManagement": "Benutzerverwaltung",
"username": "Nutzername",
"users": "Nutzer",
"globalRules": "Das ist ein globales Set von Regeln die erlauben oder nicht erlauben. Die sind für alle Benutzer zutreffend. Es können spezielle Regeln in den Einstellungen der Benutzer definiert werden die diese übersteuern.",
"allowSignup": "Erlaube Benutzern sich zu registrieren",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Regex Ausdruck einfügen",
"insertPath": "Pfad einfügen",
"userUpdated": "Benutzer aktualisiert!", "userUpdated": "Benutzer aktualisiert!",
"userDefaults": "Benutzer Standard Einstellungen", "username": "Nutzername",
"defaultUserDescription": "Das sind die Standard Einstellunge für Benutzer", "users": "Nutzer"
"executeOnShell": "In shell ausführen",
"executeOnShellDescription": "Es ist voreingestellt das der File Brower Befehle ausführt in dem er die Befehlsdatein direkt auf ruft. Wenn sie wollen das sie auf einer Kommandozeile (wo Bash oder PowerShell) laufen, könne sie das hier definieren mit allen bennötigten Argumenten und Optionen. Wenn gesetzt, wird das Kommando das ausgeführt werden soll als Parameter angehängt. Das gilt für Benuzerkommandos sowie auch für Ereignisse.",
"perm": {
"create": "Dateien und Ordner erstellen",
"delete": "Dateien und Ordner löschen",
"download": "Download",
"modify": "Dateien editieren",
"execute": "Befehle ausführen",
"rename": "Umbenennen oder Verschieben von Dateien oder Ordnern",
"share": "Datei teilen"
}
}, },
"sidebar": { "sidebar": {
"help": "Hilfe", "help": "Hilfe",
"hugoNew": "Hugo Neu",
"login": "Anmelden", "login": "Anmelden",
"signup": "Registrieren",
"logout": "Logout", "logout": "Logout",
"myFiles": "Meine Dateien", "myFiles": "Meine Dateien",
"newFile": "Neue Datei", "newFile": "Neue Datei",
"newFolder": "Neuer Ordner", "newFolder": "Neuer Ordner",
"preview": "Vorschau",
"settings": "Einstellungen", "settings": "Einstellungen",
"siteSettings": "Seiteneinstellungen", "signup": "Registrieren",
"hugoNew": "Hugo Neu", "siteSettings": "Seiteneinstellungen"
"preview": "Vorschau"
}, },
"search": { "success": {
"images": "Bilder", "linkCopied": "Verweis wurde kopiert!"
"music": "Musik",
"pdf": "PDF",
"types": "Typen",
"video": "Video",
"search": "Suche...",
"typeToSearch": "Tippe um zu suchen...",
"pressToSearch": "Drücken sie Enter um zu suchen..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Zeiteinheit", "days": "Tage",
"seconds": "Sekunden",
"minutes": "Minuten",
"hours": "Stunden", "hours": "Stunden",
"days": "Tage" "minutes": "Minuten",
}, "seconds": "Sekunden",
"download": { "unit": "Zeiteinheit"
"downloadFile": "Download Datei",
"downloadFolder": "Download Ordner"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanent",
"buttons": { "buttons": {
"shell": "Toggle shell",
"cancel": "Cancel", "cancel": "Cancel",
"close": "Close", "close": "Close",
"copy": "Copy", "copy": "Copy",
@@ -10,6 +8,7 @@
"create": "Create", "create": "Create",
"delete": "Delete", "delete": "Delete",
"download": "Download", "download": "Download",
"hideDotfiles": "Hide dotfiles",
"info": "Info", "info": "Info",
"more": "More", "more": "More",
"move": "Move", "move": "Move",
@@ -17,25 +16,29 @@
"new": "New", "new": "New",
"next": "Next", "next": "Next",
"ok": "OK", "ok": "OK",
"replace": "Replace", "permalink": "Get Permanent Link",
"previous": "Previous", "previous": "Previous",
"publish": "Publish",
"rename": "Rename", "rename": "Rename",
"replace": "Replace",
"reportIssue": "Report Issue", "reportIssue": "Report Issue",
"save": "Save", "save": "Save",
"schedule": "Schedule",
"search": "Search", "search": "Search",
"select": "Select", "select": "Select",
"share": "Share",
"publish": "Publish",
"selectMultiple": "Select multiple", "selectMultiple": "Select multiple",
"schedule": "Schedule", "share": "Share",
"shell": "Toggle shell",
"submit": "Submit",
"switchView": "Switch view", "switchView": "Switch view",
"toggleSidebar": "Toggle sidebar", "toggleSidebar": "Toggle sidebar",
"update": "Update", "update": "Update",
"upload": "Upload", "upload": "Upload"
"permalink": "Get Permanent Link"
}, },
"success": { "download": {
"linkCopied": "Link copied!" "downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": "Download Selected"
}, },
"errors": { "errors": {
"forbidden": "You don't have permissions to access this.", "forbidden": "You don't have permissions to access this.",
@@ -43,11 +46,11 @@
"notFound": "This location can't be reached." "notFound": "This location can't be reached."
}, },
"files": { "files": {
"folders": "Folders",
"files": "Files",
"body": "Body", "body": "Body",
"clear": "Clear", "clear": "Clear",
"closePreview": "Close preview", "closePreview": "Close preview",
"files": "Files",
"folders": "Folders",
"home": "Home", "home": "Home",
"lastModified": "Last modified", "lastModified": "Last modified",
"loading": "Loading...", "loading": "Loading...",
@@ -56,9 +59,9 @@
"multipleSelectionEnabled": "Multiple selection enabled", "multipleSelectionEnabled": "Multiple selection enabled",
"name": "Name", "name": "Name",
"size": "Size", "size": "Size",
"sortByLastModified": "Sort by last modified",
"sortByName": "Sort by name", "sortByName": "Sort by name",
"sortBySize": "Sort by size", "sortBySize": "Sort by size"
"sortByLastModified": "Sort by last modified"
}, },
"help": { "help": {
"click": "select file or directory", "click": "select file or directory",
@@ -74,24 +77,46 @@
"f2": "rename file", "f2": "rename file",
"help": "Help" "help": "Help"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"svSE": "Swedish (Sweden)",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Password",
"passwordConfirm": "Password Confirmation",
"submit": "Login",
"createAnAccount": "Create an account", "createAnAccount": "Create an account",
"loginInstead": "Already have an account", "loginInstead": "Already have an account",
"password": "Password",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match", "passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup", "signup": "Signup",
"submit": "Login",
"username": "Username", "username": "Username",
"usernameTaken": "Username already taken",
"wrongCredentials": "Wrong credentials" "wrongCredentials": "Wrong credentials"
}, },
"permanent": "Permanent",
"prompts": { "prompts": {
"copy": "Copy", "copy": "Copy",
"copyMessage": "Choose the place to copy your files:", "copyMessage": "Choose the place to copy your files:",
"currentlyNavigating": "Currently navigating on:", "currentlyNavigating": "Currently navigating on:",
"deleteMessageMultiple": "Are you sure you want to delete {count} file(s)?", "deleteMessageMultiple": "Are you sure you want to delete {count} file(s)?",
"deleteMessageSingle": "Are you sure you want to delete this file/folder?", "deleteMessageSingle": "Are you sure you want to delete this file/folder?",
"deleteMessageShare": "Are you sure you want to delete this share({path})?",
"deleteTitle": "Delete files", "deleteTitle": "Delete files",
"displayName": "Display Name:", "displayName": "Display Name:",
"download": "Download files", "download": "Download files",
@@ -102,50 +127,65 @@
"lastModified": "Last Modified", "lastModified": "Last Modified",
"move": "Move", "move": "Move",
"moveMessage": "Choose new house for your file(s)/folder(s):", "moveMessage": "Choose new house for your file(s)/folder(s):",
"newArchetype": "Create a new post based on an archetype. Your file will be created on content folder.",
"newDir": "New directory", "newDir": "New directory",
"newDirMessage": "Write the name of the new directory.", "newDirMessage": "Write the name of the new directory.",
"newFile": "New file", "newFile": "New file",
"newFileMessage": "Write the name of the new file.", "newFileMessage": "Write the name of the new file.",
"numberDirs": "Number of directories", "numberDirs": "Number of directories",
"numberFiles": "Number of files", "numberFiles": "Number of files",
"replace": "Replace",
"replaceMessage": "One of the files you're trying to upload is conflicting because of its name. Do you wish to replace the existing one?\n",
"rename": "Rename", "rename": "Rename",
"renameMessage": "Insert a new name for", "renameMessage": "Insert a new name for",
"show": "Show", "replace": "Replace",
"size": "Size", "replaceMessage": "One of the files you're trying to upload is conflicting because of its name. Do you wish to replace the existing one?\n",
"schedule": "Schedule", "schedule": "Schedule",
"scheduleMessage": "Pick a date and time to schedule the publication of this post.", "scheduleMessage": "Pick a date and time to schedule the publication of this post.",
"newArchetype": "Create a new post based on an archetype. Your file will be created on content folder.", "show": "Show",
"size": "Size",
"upload": "Upload", "upload": "Upload",
"uploadMessage": "Select an option to upload." "uploadMessage": "Select an option to upload.",
"optionalPassword": "Optional password"
},
"search": {
"images": "Images",
"music": "Music",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "Search...",
"typeToSearch": "Type to search...",
"types": "Types",
"video": "Video"
}, },
"settings": { "settings": {
"themes": {
"title": "Theme",
"light": "Light",
"dark": "Dark"
},
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Execute commands", "allowCommands": "Execute commands",
"allowEdit": "Edit, rename and delete files or directories", "allowEdit": "Edit, rename and delete files or directories",
"allowNew": "Create new files and directories", "allowNew": "Create new files and directories",
"allowPublish": "Publish new posts and pages", "allowPublish": "Publish new posts and pages",
"allowSignup": "Allow users to signup",
"avoidChanges": "(leave blank to avoid changes)", "avoidChanges": "(leave blank to avoid changes)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "Change Password", "changePassword": "Change Password",
"commandRunner": "Command runner", "commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "Commands updated!", "commandsUpdated": "Commands updated!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "Custom Stylesheet", "customStylesheet": "Custom Stylesheet",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"documentation": "documentation",
"examples": "Examples", "examples": "Examples",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"globalSettings": "Global Settings", "globalSettings": "Global Settings",
"hideDotfiles": "Hide dotfiles",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"language": "Language", "language": "Language",
"lockPassword": "Prevent the user from changing the password", "lockPassword": "Prevent the user from changing the password",
"newPassword": "Your new password", "newPassword": "Your new password",
@@ -153,6 +193,16 @@
"newUser": "New User", "newUser": "New User",
"password": "Password", "password": "Password",
"passwordUpdated": "Password updated!", "passwordUpdated": "Password updated!",
"path": "Path",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
},
"permissions": "Permissions", "permissions": "Permissions",
"permissionsHelp": "You can set the user to be an administrator or choose the permissions individually. If you select \"Administrator\", all of the other options will be automatically checked. The management of users remains a privilege of an administrator.\n", "permissionsHelp": "You can set the user to be an administrator or choose the permissions individually. If you select \"Administrator\", all of the other options will be automatically checked. The management of users remains a privilege of an administrator.\n",
"profileSettings": "Profile Settings", "profileSettings": "Profile Settings",
@@ -162,86 +212,46 @@
"rulesHelp": "Here you can define a set of allow and disallow rules for this specific user. The blocked files won't show up in the listings and they wont be accessible to the user. We support regex and paths relative to the users scope.\n", "rulesHelp": "Here you can define a set of allow and disallow rules for this specific user. The blocked files won't show up in the listings and they wont be accessible to the user. We support regex and paths relative to the users scope.\n",
"scope": "Scope", "scope": "Scope",
"settingsUpdated": "Settings updated!", "settingsUpdated": "Settings updated!",
"shareDuration": "Share Duration",
"shareManagement": "Share Management",
"singleClick": "Use single clicks to open files and directories",
"themes": {
"dark": "Dark",
"light": "Light",
"title": "Theme"
},
"user": "User", "user": "User",
"userCommands": "Commands", "userCommands": "Commands",
"userCommandsHelp": "A space separated list with the available commands for this user. Example:\n", "userCommandsHelp": "A space separated list with the available commands for this user. Example:\n",
"userCreated": "User created!", "userCreated": "User created!",
"userDefaults": "User default settings",
"userDeleted": "User deleted!", "userDeleted": "User deleted!",
"userManagement": "User Management", "userManagement": "User Management",
"username": "Username",
"users": "Users",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "User updated!", "userUpdated": "User updated!",
"userDefaults": "User default settings", "username": "Username",
"defaultUserDescription": "This are the default settings for new users.", "users": "Users"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"modify": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
}, },
"sidebar": { "sidebar": {
"help": "Help", "help": "Help",
"hugoNew": "Hugo New",
"login": "Login", "login": "Login",
"signup": "Signup",
"logout": "Logout", "logout": "Logout",
"myFiles": "My files", "myFiles": "My files",
"newFile": "New file", "newFile": "New file",
"newFolder": "New folder", "newFolder": "New folder",
"preview": "Preview",
"settings": "Settings", "settings": "Settings",
"siteSettings": "Site Settings", "signup": "Signup",
"hugoNew": "Hugo New", "siteSettings": "Site Settings"
"preview": "Preview"
}, },
"search": { "success": {
"images": "Images", "linkCopied": "Link copied!"
"music": "Music",
"pdf": "PDF",
"types": "Types",
"video": "Video",
"search": "Search...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"is": "Icelandic",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어",
"nlBE": "Dutch (Belgium)",
"ro": "Romanian",
"svSE": "Swedish (Sweden)"
}, },
"time": { "time": {
"unit": "Time Unit", "days": "Days",
"seconds": "Seconds",
"minutes": "Minutes",
"hours": "Hours", "hours": "Hours",
"days": "Days" "minutes": "Minutes",
}, "seconds": "Seconds",
"download": { "unit": "Time Unit"
"downloadFile": "Download File",
"downloadFolder": "Download Folder"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanente",
"buttons": { "buttons": {
"shell": "Presiona Enter para buscar...",
"cancel": "Cancelar", "cancel": "Cancelar",
"close": "Cerrar", "close": "Cerrar",
"copy": "Copiar", "copy": "Copiar",
@@ -10,6 +8,7 @@
"create": "Crear", "create": "Crear",
"delete": "Borrar", "delete": "Borrar",
"download": "Descargar", "download": "Descargar",
"hideDotfiles": "",
"info": "Info", "info": "Info",
"more": "Más", "more": "Más",
"move": "Mover", "move": "Mover",
@@ -17,25 +16,28 @@
"new": "Nuevo", "new": "Nuevo",
"next": "Siguiente", "next": "Siguiente",
"ok": "OK", "ok": "OK",
"replace": "Reemplazar", "permalink": "Link permanente",
"previous": "Anterior", "previous": "Anterior",
"publish": "Publicar",
"rename": "Renombrar", "rename": "Renombrar",
"replace": "Reemplazar",
"reportIssue": "Reportar problema", "reportIssue": "Reportar problema",
"save": "Guardar", "save": "Guardar",
"schedule": "Programar",
"search": "Buscar", "search": "Buscar",
"select": "Seleccionar", "select": "Seleccionar",
"share": "Compartir",
"publish": "Publicar",
"selectMultiple": "Selección múltiple", "selectMultiple": "Selección múltiple",
"schedule": "Programar", "share": "Compartir",
"shell": "Presiona Enter para buscar...",
"switchView": "Cambiar vista", "switchView": "Cambiar vista",
"toggleSidebar": "Mostrar/Ocultar menú", "toggleSidebar": "Mostrar/Ocultar menú",
"update": "Actualizar", "update": "Actualizar",
"upload": "Subir", "upload": "Subir"
"permalink": "Link permanente"
}, },
"success": { "download": {
"linkCopied": "¡Link copiado!" "downloadFile": "Descargar fichero",
"downloadFolder": "Descargar directorio",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "No tienes los permisos necesarios para acceder.", "forbidden": "No tienes los permisos necesarios para acceder.",
@@ -43,11 +45,11 @@
"notFound": "No se puede acceder a este lugar." "notFound": "No se puede acceder a este lugar."
}, },
"files": { "files": {
"folders": "Carpetas",
"files": "Archivos",
"body": "Cuerpo", "body": "Cuerpo",
"clear": "Limpiar", "clear": "Limpiar",
"closePreview": "Cerrar vista previa", "closePreview": "Cerrar vista previa",
"files": "Archivos",
"folders": "Carpetas",
"home": "Inicio", "home": "Inicio",
"lastModified": "Última modificación", "lastModified": "Última modificación",
"loading": "Cargando...", "loading": "Cargando...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Selección múltiple activada", "multipleSelectionEnabled": "Selección múltiple activada",
"name": "Nombre", "name": "Nombre",
"size": "Tamaño", "size": "Tamaño",
"sortByLastModified": "Ordenar por última modificación",
"sortByName": "Ordenar por nombre", "sortByName": "Ordenar por nombre",
"sortBySize": "Ordenar por tamaño", "sortBySize": "Ordenar por tamaño"
"sortByLastModified": "Ordenar por última modificación"
}, },
"help": { "help": {
"click": "seleccionar archivo o carpeta", "click": "seleccionar archivo o carpeta",
@@ -74,18 +76,39 @@
"f2": "renombrar archivo", "f2": "renombrar archivo",
"help": "Ayuda" "help": "Ayuda"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Contraseña",
"passwordConfirm": "Confirmación de contraseña",
"submit": "Iniciar sesión",
"createAnAccount": "Crear una cuenta", "createAnAccount": "Crear una cuenta",
"loginInstead": "Usuario ya existente", "loginInstead": "Usuario ya existente",
"password": "Contraseña",
"passwordConfirm": "Confirmación de contraseña",
"passwordsDontMatch": "Las contraseñas no coinciden", "passwordsDontMatch": "Las contraseñas no coinciden",
"usernameTaken": "Nombre usuario no disponible",
"signup": "Registrate", "signup": "Registrate",
"submit": "Iniciar sesión",
"username": "Usuario", "username": "Usuario",
"usernameTaken": "Nombre usuario no disponible",
"wrongCredentials": "Usuario y/o contraseña incorrectos" "wrongCredentials": "Usuario y/o contraseña incorrectos"
}, },
"permanent": "Permanente",
"prompts": { "prompts": {
"copy": "Copiar", "copy": "Copiar",
"copyMessage": "Elige el lugar donde quieres copiar tus archivos:", "copyMessage": "Elige el lugar donde quieres copiar tus archivos:",
@@ -102,43 +125,64 @@
"lastModified": "Última modificación", "lastModified": "Última modificación",
"move": "Mover", "move": "Mover",
"moveMessage": "Elige una nueva casa para tus archivo(s)/carpeta(s):", "moveMessage": "Elige una nueva casa para tus archivo(s)/carpeta(s):",
"newArchetype": "Crea un nuevo post basado en un arquetipo. Tu archivo será creado en la carpeta de contenido.",
"newDir": "Nueva carpeta", "newDir": "Nueva carpeta",
"newDirMessage": "Escribe el nombre de la nueva carpeta.", "newDirMessage": "Escribe el nombre de la nueva carpeta.",
"newFile": "Nuevo archivo", "newFile": "Nuevo archivo",
"newFileMessage": "Escribe el nombre del nuevo archivo.", "newFileMessage": "Escribe el nombre del nuevo archivo.",
"numberDirs": "Número de carpetas", "numberDirs": "Número de carpetas",
"numberFiles": "Número de archivos", "numberFiles": "Número de archivos",
"replace": "Reemplazar",
"replaceMessage": "Uno de los archivos ue intentas subir está creando conflicto por su nombre. ¿Quieres cambiar el nombre del ya existente?\n",
"rename": "Renombrar", "rename": "Renombrar",
"renameMessage": "Escribe el nuevo nombre para", "renameMessage": "Escribe el nuevo nombre para",
"show": "Mostrar", "replace": "Reemplazar",
"size": "Tamaño", "replaceMessage": "Uno de los archivos ue intentas subir está creando conflicto por su nombre. ¿Quieres cambiar el nombre del ya existente?\n",
"schedule": "Programar", "schedule": "Programar",
"scheduleMessage": "Elige una hora y fecha para programar la publicación de este post.", "scheduleMessage": "Elige una hora y fecha para programar la publicación de este post.",
"newArchetype": "Crea un nuevo post basado en un arquetipo. Tu archivo será creado en la carpeta de contenido." "show": "Mostrar",
"size": "Tamaño",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Images",
"music": "Música",
"pdf": "PDF",
"pressToSearch": "Presiona enter para buscar...",
"search": "Buscar...",
"typeToSearch": "Escribe para realizar una busqueda...",
"types": "Tipos",
"video": "Vídeo"
}, },
"settings": { "settings": {
"instanceName": "Nombre de la instancia",
"brandingDirectoryPath": "Ruta de la carpeta de personalizacion de marca",
"documentation": "documentación",
"branding": "Marca",
"disableExternalLinks": "Deshabilitar enlaces externos (excepto documentación)",
"brandingHelp": "Tú puedes personalizar como se ve tu instancia de FileBrowser cambiándole el nombre, reemplazando ellogo, agregar estilos personalizados e incluso deshabilitando loslinks externos que apuntan hacia GitHub. \nPara mayor información acerca de personalización de marca, por favor revisa el {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrador", "administrator": "Administrador",
"allowCommands": "Ejecutar comandos", "allowCommands": "Ejecutar comandos",
"allowEdit": "Editar, renombrar y borrar archivos o carpetas", "allowEdit": "Editar, renombrar y borrar archivos o carpetas",
"allowNew": "Crear nuevos archivos y carpetas", "allowNew": "Crear nuevos archivos y carpetas",
"allowPublish": "Publicar nuevos posts y páginas", "allowPublish": "Publicar nuevos posts y páginas",
"allowSignup": "Permitir registro de usuarios",
"avoidChanges": "(dejar en blanco para evitar cambios)", "avoidChanges": "(dejar en blanco para evitar cambios)",
"branding": "Marca",
"brandingDirectoryPath": "Ruta de la carpeta de personalizacion de marca",
"brandingHelp": "Tú puedes personalizar como se ve tu instancia de FileBrowser cambiándole el nombre, reemplazando ellogo, agregar estilos personalizados e incluso deshabilitando loslinks externos que apuntan hacia GitHub. \nPara mayor información acerca de personalización de marca, por favor revisa el {0}.",
"changePassword": "Cambiar contraseña", "changePassword": "Cambiar contraseña",
"commandRunner": "Executor de comandos", "commandRunner": "Executor de comandos",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "¡Comandos actualizados!", "commandsUpdated": "¡Comandos actualizados!",
"createUserDir": "Crea automaticamente una carpeta de inicio cuando se agrega un usuario",
"customStylesheet": "Modificar hoja de estilos", "customStylesheet": "Modificar hoja de estilos",
"defaultUserDescription": "Estas son las configuraciones por defecto para nuevos usuarios.",
"disableExternalLinks": "Deshabilitar enlaces externos (excepto documentación)",
"documentation": "documentación",
"examples": "Ejemplos", "examples": "Ejemplos",
"executeOnShell": "Ejecutar en la shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"globalSettings": "Ajustes globales", "globalSettings": "Ajustes globales",
"hideDotfiles": "",
"insertPath": "Introduce la ruta",
"insertRegex": "Introducir expresión regular",
"instanceName": "Nombre de la instancia",
"language": "Idioma", "language": "Idioma",
"lockPassword": "Evitar que el usuario cambie la contraseña", "lockPassword": "Evitar que el usuario cambie la contraseña",
"newPassword": "Tu nueva contraseña", "newPassword": "Tu nueva contraseña",
@@ -146,6 +190,16 @@
"newUser": "Nuevo usuario", "newUser": "Nuevo usuario",
"password": "Contraseña", "password": "Contraseña",
"passwordUpdated": "¡Contraseña actualizada!", "passwordUpdated": "¡Contraseña actualizada!",
"path": "",
"perm": {
"create": "Crear ficheros y directorios",
"delete": "Eliminar ficheros y directorios",
"download": "Descargar",
"execute": "Executar comandos",
"modify": "Editar ficheros",
"rename": "Renombrar o mover ficheros y directorios",
"share": "Compartir ficheros"
},
"permissions": "Permisos", "permissions": "Permisos",
"permissionsHelp": "Puedes nombrar al usuario como administrador o elegir los permisos individualmente. Si seleccionas \"Administrador\", todas las otras opciones serán activadas automáticamente. La administración de usuarios es un privilegio de administrador.\n", "permissionsHelp": "Puedes nombrar al usuario como administrador o elegir los permisos individualmente. Si seleccionas \"Administrador\", todas las otras opciones serán activadas automáticamente. La administración de usuarios es un privilegio de administrador.\n",
"profileSettings": "Ajustes del perfil", "profileSettings": "Ajustes del perfil",
@@ -155,82 +209,46 @@
"rulesHelp": "Aquí puedes definir un conjunto de reglas de permisos para este usuario específico. Los archivos bloqueados no se mostrarán en las listas y no serán accesibles por el usuario. Puedes utilizar regex y rutas relativas a la raíz del usuario.\n", "rulesHelp": "Aquí puedes definir un conjunto de reglas de permisos para este usuario específico. Los archivos bloqueados no se mostrarán en las listas y no serán accesibles por el usuario. Puedes utilizar regex y rutas relativas a la raíz del usuario.\n",
"scope": "Raíz", "scope": "Raíz",
"settingsUpdated": "¡Ajustes actualizados!", "settingsUpdated": "¡Ajustes actualizados!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Usuario", "user": "Usuario",
"userCommands": "Comandos", "userCommands": "Comandos",
"userCommandsHelp": "Una lista separada por espacios con los comandos permitidos para este usuario. Ejemplo:\n", "userCommandsHelp": "Una lista separada por espacios con los comandos permitidos para este usuario. Ejemplo:\n",
"userCreated": "¡Usuario creado!", "userCreated": "¡Usuario creado!",
"userDefaults": "Configuración de usuario por defecto",
"userDeleted": "¡Usuario eliminado!", "userDeleted": "¡Usuario eliminado!",
"userManagement": "Administración de usuarios", "userManagement": "Administración de usuarios",
"username": "Usuario",
"users": "Usuarios",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Permitir registro de usuarios",
"createUserDir": "Crea automaticamente una carpeta de inicio cuando se agrega un usuario",
"insertRegex": "Introducir expresión regular",
"insertPath": "Introduce la ruta",
"userUpdated": "¡Usuario actualizado!", "userUpdated": "¡Usuario actualizado!",
"userDefaults": "Configuración de usuario por defecto", "username": "Usuario",
"defaultUserDescription": "Estas son las configuraciones por defecto para nuevos usuarios.", "users": "Usuarios"
"executeOnShell": "Ejecutar en la shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Crear ficheros y directorios",
"delete": "Eliminar ficheros y directorios",
"download": "Descargar",
"modify": "Editar ficheros",
"execute": "Executar comandos",
"rename": "Renombrar o mover ficheros y directorios",
"share": "Compartir ficheros"
}
}, },
"sidebar": { "sidebar": {
"help": "Ayuda", "help": "Ayuda",
"hugoNew": "Nuevo Hugo",
"login": "Iniciar sesión", "login": "Iniciar sesión",
"signup": "Registrate",
"logout": "Cerrar sesión", "logout": "Cerrar sesión",
"myFiles": "Mis archivos", "myFiles": "Mis archivos",
"newFile": "Nuevo archivo", "newFile": "Nuevo archivo",
"newFolder": "Nueva carpeta", "newFolder": "Nueva carpeta",
"preview": "Vista previa",
"settings": "Ajustes", "settings": "Ajustes",
"siteSettings": "Ajustes del sitio", "signup": "Registrate",
"hugoNew": "Nuevo Hugo", "siteSettings": "Ajustes del sitio"
"preview": "Vista previa"
}, },
"search": { "success": {
"images": "Images", "linkCopied": "¡Link copiado!"
"music": "Música",
"pdf": "PDF",
"types": "Tipos",
"video": "Vídeo",
"search": "Buscar...",
"typeToSearch": "Escribe para realizar una busqueda...",
"pressToSearch": "Presiona enter para buscar..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Unidad", "days": "Días",
"seconds": "Segundos",
"minutes": "Minutos",
"hours": "Horas", "hours": "Horas",
"days": "Días" "minutes": "Minutos",
}, "seconds": "Segundos",
"download": { "unit": "Unidad"
"downloadFile": "Descargar fichero",
"downloadFolder": "Descargar directorio"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanent",
"buttons": { "buttons": {
"shell": "Toggle shell",
"cancel": "Annuler", "cancel": "Annuler",
"close": "Fermer", "close": "Fermer",
"copy": "Copier", "copy": "Copier",
@@ -10,6 +8,7 @@
"create": "Créer", "create": "Créer",
"delete": "Supprimer", "delete": "Supprimer",
"download": "Télécharger", "download": "Télécharger",
"hideDotfiles": "",
"info": "Info", "info": "Info",
"more": "Plus", "more": "Plus",
"move": "Déplacer", "move": "Déplacer",
@@ -17,25 +16,28 @@
"new": "Nouveau", "new": "Nouveau",
"next": "Suivant", "next": "Suivant",
"ok": "OK", "ok": "OK",
"replace": "Remplacer", "permalink": "Obtenir un lien permanent",
"previous": "Précédent", "previous": "Précédent",
"publish": "Publier",
"rename": "Renommer", "rename": "Renommer",
"replace": "Remplacer",
"reportIssue": "Rapport d'erreur", "reportIssue": "Rapport d'erreur",
"save": "Enregistrer", "save": "Enregistrer",
"schedule": "Fixer la date",
"search": "Chercher", "search": "Chercher",
"select": "Sélectionner", "select": "Sélectionner",
"share": "Partager",
"publish": "Publier",
"selectMultiple": "Sélection multiple", "selectMultiple": "Sélection multiple",
"schedule": "Fixer la date", "share": "Partager",
"shell": "Toggle shell",
"switchView": "Changer le mode d'affichage", "switchView": "Changer le mode d'affichage",
"toggleSidebar": "Afficher/Masquer la barre latérale", "toggleSidebar": "Afficher/Masquer la barre latérale",
"update": "Mettre à jour", "update": "Mettre à jour",
"upload": "Importer", "upload": "Importer"
"permalink": "Obtenir un lien permanent"
}, },
"success": { "download": {
"linkCopied": "Link copied!" "downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "You don't have permissions to access this.", "forbidden": "You don't have permissions to access this.",
@@ -43,22 +45,22 @@
"notFound": "Impossible d'accéder à cet emplacement." "notFound": "Impossible d'accéder à cet emplacement."
}, },
"files": { "files": {
"folders": "Dossiers",
"files": "Fichiers",
"body": "Corps", "body": "Corps",
"clear": "Fermer", "clear": "Fermer",
"closePreview": "Fermer la prévisualisation", "closePreview": "Fermer la prévisualisation",
"files": "Fichiers",
"folders": "Dossiers",
"home": "Accueil", "home": "Accueil",
"lastModified": "Dernière modification", "lastModified": "Dernière modification",
"loading": "Chargement...", "loading": "Chargement...",
"lonely": "Il semble qu'il n'y ai rien par ici...", "lonely": "Il semble qu'il n'y ait rien par ici...",
"metadata": "Metadonnées", "metadata": "Metadonnées",
"multipleSelectionEnabled": "Sélection multiple activée", "multipleSelectionEnabled": "Sélection multiple activée",
"name": "Nom", "name": "Nom",
"size": "Taille", "size": "Taille",
"sortByLastModified": "Trier par date de dernière modification",
"sortByName": "Trier par nom", "sortByName": "Trier par nom",
"sortBySize": "Trier par taille", "sortBySize": "Trier par taille"
"sortByLastModified": "Trier par date de dernière modification"
}, },
"help": { "help": {
"click": "Sélectionner un élément", "click": "Sélectionner un élément",
@@ -74,18 +76,39 @@
"f2": "Renommer le fichier", "f2": "Renommer le fichier",
"help": "Aide" "help": "Aide"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Mot de passe",
"passwordConfirm": "Password Confirmation",
"submit": "Se connecter",
"createAnAccount": "Create an account", "createAnAccount": "Create an account",
"loginInstead": "Already have an account", "loginInstead": "Already have an account",
"password": "Mot de passe",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match", "passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup", "signup": "Signup",
"submit": "Se connecter",
"username": "Utilisateur", "username": "Utilisateur",
"usernameTaken": "Username already taken",
"wrongCredentials": "Identifiants incorrects !" "wrongCredentials": "Identifiants incorrects !"
}, },
"permanent": "Permanent",
"prompts": { "prompts": {
"copy": "Copier", "copy": "Copier",
"copyMessage": "Choisissez l'emplacement où copier la sélection :", "copyMessage": "Choisissez l'emplacement où copier la sélection :",
@@ -102,43 +125,64 @@
"lastModified": "Dernière modification", "lastModified": "Dernière modification",
"move": "Déplacer", "move": "Déplacer",
"moveMessage": "Choisissez l'emplacement où déplacer la sélection :", "moveMessage": "Choisissez l'emplacement où déplacer la sélection :",
"newArchetype": "Créer un nouveau post basé sur un archétype. Votre fichier sera créé dans le dossier de contenu.",
"newDir": "Nouveau dossier", "newDir": "Nouveau dossier",
"newDirMessage": "Nom du nouveau dossier :", "newDirMessage": "Nom du nouveau dossier :",
"newFile": "Nouveau fichier", "newFile": "Nouveau fichier",
"newFileMessage": "Nom du nouveau fichier :", "newFileMessage": "Nom du nouveau fichier :",
"numberDirs": "Nombre de dossiers", "numberDirs": "Nombre de dossiers",
"numberFiles": "Nombre de fichiers", "numberFiles": "Nombre de fichiers",
"replace": "Remplacer",
"replaceMessage": "Un des fichiers que vous êtes en train d'importer a le même nom qu'un autre déjà présent. Voulez-vous remplacer le fichier actuel par le nouveau ?\n",
"rename": "Renommer", "rename": "Renommer",
"renameMessage": "Nouveau nom pour", "renameMessage": "Nouveau nom pour",
"show": "Montrer", "replace": "Remplacer",
"size": "Taille", "replaceMessage": "Un des fichiers que vous êtes en train d'importer a le même nom qu'un autre déjà présent. Voulez-vous remplacer le fichier actuel par le nouveau ?\n",
"schedule": "Fixer la date", "schedule": "Fixer la date",
"scheduleMessage": "Choisissez une date pour planifier la publication de ce post", "scheduleMessage": "Choisissez une date pour planifier la publication de ce post",
"newArchetype": "Créer un nouveau post basé sur un archétype. Votre fichier sera créé dans le dossier de contenu." "show": "Montrer",
"size": "Taille",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Images",
"music": "Musique",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "Recherche en cours...",
"typeToSearch": "Type to search...",
"types": "Types",
"video": "Video"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrateur", "administrator": "Administrateur",
"allowCommands": "Exécuter des commandes", "allowCommands": "Exécuter des commandes",
"allowEdit": "Editer, renommer et supprimer des fichiers ou des dossiers", "allowEdit": "Editer, renommer et supprimer des fichiers ou des dossiers",
"allowNew": "Créer de nouveaux fichiers et dossiers", "allowNew": "Créer de nouveaux fichiers et dossiers",
"allowPublish": "Publier de nouveaux posts et pages", "allowPublish": "Publier de nouveaux posts et pages",
"allowSignup": "Allow users to signup",
"avoidChanges": "(Laisser vide pour conserver l'actuel)", "avoidChanges": "(Laisser vide pour conserver l'actuel)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "Modifier le mot de passe", "changePassword": "Modifier le mot de passe",
"commandRunner": "Command runner", "commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "Commandes mises à jour !", "commandsUpdated": "Commandes mises à jour !",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "Feuille de style personnalisée", "customStylesheet": "Feuille de style personnalisée",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"documentation": "documentation",
"examples": "Exemples", "examples": "Exemples",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"globalSettings": "Paramètres généraux", "globalSettings": "Paramètres généraux",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"language": "Langue", "language": "Langue",
"lockPassword": "Prevent the user from changing the password", "lockPassword": "Prevent the user from changing the password",
"newPassword": "Votre nouveau mot de passe", "newPassword": "Votre nouveau mot de passe",
@@ -146,6 +190,16 @@
"newUser": "Nouvel Utilisateur", "newUser": "Nouvel Utilisateur",
"password": "Mot de passe", "password": "Mot de passe",
"passwordUpdated": "Mot de passe mis à jour !", "passwordUpdated": "Mot de passe mis à jour !",
"path": "",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
},
"permissions": "Permissions", "permissions": "Permissions",
"permissionsHelp": "Vous pouvez définir l'utilisateur comme étant un administrateur ou encore choisir les permissions individuellement. Si vous sélectionnez \"Administrateur\", toutes les autres options seront automatiquement activées. La gestion des utilisateurs est un privilège que seul l'administrateur possède.\n", "permissionsHelp": "Vous pouvez définir l'utilisateur comme étant un administrateur ou encore choisir les permissions individuellement. Si vous sélectionnez \"Administrateur\", toutes les autres options seront automatiquement activées. La gestion des utilisateurs est un privilège que seul l'administrateur possède.\n",
"profileSettings": "Paramètres du profil", "profileSettings": "Paramètres du profil",
@@ -155,82 +209,46 @@
"rulesHelp": "Vous pouvez définir ici un ensemble de règles pour cet utilisateur. Les fichiers bloqués ne seront pas affichés et ne seront pas accessibles par l'utilisateur. Les expressions régulières sont supportées et les chemins d'accès sont relatifs par rapport au dossier de l'utilisateur.\n", "rulesHelp": "Vous pouvez définir ici un ensemble de règles pour cet utilisateur. Les fichiers bloqués ne seront pas affichés et ne seront pas accessibles par l'utilisateur. Les expressions régulières sont supportées et les chemins d'accès sont relatifs par rapport au dossier de l'utilisateur.\n",
"scope": "Portée du dossier utilisateur", "scope": "Portée du dossier utilisateur",
"settingsUpdated": "Les paramètres ont été mis à jour !", "settingsUpdated": "Les paramètres ont été mis à jour !",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Utilisateur", "user": "Utilisateur",
"userCommands": "Commandes", "userCommands": "Commandes",
"userCommandsHelp": "Une liste séparée par des espaces des commandes permises pour l'utilisateur. Exemple :", "userCommandsHelp": "Une liste séparée par des espaces des commandes permises pour l'utilisateur. Exemple :",
"userCreated": "Utilisateur créé !", "userCreated": "Utilisateur créé !",
"userDefaults": "User default settings",
"userDeleted": "Utilisateur supprimé !", "userDeleted": "Utilisateur supprimé !",
"userManagement": "Gestion des utilisateurs", "userManagement": "Gestion des utilisateurs",
"username": "Nom d'utilisateur",
"users": "Utilisateurs",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Utilisateur mis à jour !", "userUpdated": "Utilisateur mis à jour !",
"userDefaults": "User default settings", "username": "Nom d'utilisateur",
"defaultUserDescription": "This are the default settings for new users.", "users": "Utilisateurs"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"modify": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
}, },
"sidebar": { "sidebar": {
"help": "Aide", "help": "Aide",
"hugoNew": "Nouveau Hugo",
"login": "Login", "login": "Login",
"signup": "Signup",
"logout": "Se déconnecter", "logout": "Se déconnecter",
"myFiles": "Mes fichiers", "myFiles": "Mes fichiers",
"newFile": "Nouveau fichier", "newFile": "Nouveau fichier",
"newFolder": "Nouveau dossier", "newFolder": "Nouveau dossier",
"preview": "Prévisualiser",
"settings": "Paramètres", "settings": "Paramètres",
"siteSettings": "Paramètres du site", "signup": "Signup",
"hugoNew": "Nouveau Hugo", "siteSettings": "Paramètres du site"
"preview": "Prévisualiser"
}, },
"search": { "success": {
"images": "Images", "linkCopied": "Link copied!"
"music": "Musique",
"pdf": "PDF",
"types": "Types",
"video": "Video",
"search": "Recherche en cours...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Unité de temps", "days": "Jours",
"seconds": "Secondes",
"minutes": "Minutes",
"hours": "Heures", "hours": "Heures",
"days": "Jours" "minutes": "Minutes",
}, "seconds": "Secondes",
"download": { "unit": "Unité de temps"
"downloadFile": "Download File",
"downloadFolder": "Download Folder"
} }
} }

View File

@@ -77,28 +77,39 @@ export function detectLocale () {
return locale return locale
} }
const removeEmpty = (obj) =>
Object.keys(obj)
.filter((k) => obj[k] !== null && obj[k] !== undefined && obj[k] !== '') // Remove undef. and null and empty.string.
.reduce(
(newObj, k) =>
typeof obj[k] === 'object'
? Object.assign(newObj, { [k]: removeEmpty(obj[k]) }) // Recurse.
: Object.assign(newObj, { [k]: obj[k] }), // Copy value.
{},
);
const i18n = new VueI18n({ const i18n = new VueI18n({
locale: detectLocale(), locale: detectLocale(),
fallbackLocale: 'en', fallbackLocale: 'en',
messages: { messages: {
'ar': ar, 'ar': removeEmpty(ar),
'de': de, 'de': removeEmpty(de),
'en': en, 'en': en,
'es': es, 'es': removeEmpty(es),
'fr': fr, 'fr': removeEmpty(fr),
'is': is, 'is': removeEmpty(is),
'it': it, 'it': removeEmpty(it),
'ja': ja, 'ja': removeEmpty(ja),
'ko': ko, 'ko': removeEmpty(ko),
'nl-be': nlBE, 'nl-be': removeEmpty(nlBE),
'pl': pl, 'pl': removeEmpty(pl),
'pt-br': ptBR, 'pt-br': removeEmpty(ptBR),
'pt': pt, 'pt': removeEmpty(pt),
'ru': ru, 'ru': removeEmpty(ru),
'ro': ro, 'ro': removeEmpty(ro),
'sv-se': svSE, 'sv-se': removeEmpty(svSE),
'zh-cn': zhCN, 'zh-cn': removeEmpty(zhCN),
'zh-tw': zhTW 'zh-tw': removeEmpty(zhTW)
} }
}) })

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Varanlegt",
"buttons": { "buttons": {
"shell": "Sýna skipanaglugga",
"cancel": "Hætta við", "cancel": "Hætta við",
"close": "Loka", "close": "Loka",
"copy": "Afrita", "copy": "Afrita",
@@ -10,6 +8,7 @@
"create": "Búa til", "create": "Búa til",
"delete": "Eyða", "delete": "Eyða",
"download": "Sækja", "download": "Sækja",
"hideDotfiles": "",
"info": "Upplýsingar", "info": "Upplýsingar",
"more": "Meira", "more": "Meira",
"move": "Færa", "move": "Færa",
@@ -17,25 +16,28 @@
"new": "Nýtt", "new": "Nýtt",
"next": "Næsta", "next": "Næsta",
"ok": "OK", "ok": "OK",
"replace": "Skipta út", "permalink": "Sækja fastan hlekk",
"previous": "Fyrri", "previous": "Fyrri",
"publish": "Gefa út",
"rename": "Endurnefna", "rename": "Endurnefna",
"replace": "Skipta út",
"reportIssue": "Tilkynna vandamál", "reportIssue": "Tilkynna vandamál",
"save": "Vista", "save": "Vista",
"schedule": "Áætlun",
"search": "Leita", "search": "Leita",
"select": "Velja", "select": "Velja",
"share": "Deila",
"publish": "Gefa út",
"selectMultiple": "Velja mörg", "selectMultiple": "Velja mörg",
"schedule": "Áætlun", "share": "Deila",
"shell": "Sýna skipanaglugga",
"switchView": "Skipta um útlit", "switchView": "Skipta um útlit",
"toggleSidebar": "Sýna hliðarstiku", "toggleSidebar": "Sýna hliðarstiku",
"update": "Vista", "update": "Vista",
"upload": "Hlaða upp", "upload": "Hlaða upp"
"permalink": "Sækja fastan hlekk"
}, },
"success": { "download": {
"linkCopied": "Hlekkur afritaður!" "downloadFile": "Sækja skjal",
"downloadFolder": "Sækja möppu",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "Þú hefur ekki aðgang að þessari síðu.", "forbidden": "Þú hefur ekki aðgang að þessari síðu.",
@@ -43,11 +45,11 @@
"notFound": "Ekki er hægt að opna þessa síðu." "notFound": "Ekki er hægt að opna þessa síðu."
}, },
"files": { "files": {
"folders": "Möppur",
"files": "Skjöl",
"body": "Meginmál", "body": "Meginmál",
"clear": "Hreinsa", "clear": "Hreinsa",
"closePreview": "Loka forskoðun", "closePreview": "Loka forskoðun",
"files": "Skjöl",
"folders": "Möppur",
"home": "Heim", "home": "Heim",
"lastModified": "Seinast breytt", "lastModified": "Seinast breytt",
"loading": "Hleð...", "loading": "Hleð...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Hægt að velja mörg skjöl/möppur", "multipleSelectionEnabled": "Hægt að velja mörg skjöl/möppur",
"name": "Nafn", "name": "Nafn",
"size": "Stærð", "size": "Stærð",
"sortByLastModified": "Flokka eftir Seinast breytt",
"sortByName": "Flokka eftir nafni", "sortByName": "Flokka eftir nafni",
"sortBySize": "Flokka eftir stærð", "sortBySize": "Flokka eftir stærð"
"sortByLastModified": "Flokka eftir Seinast breytt"
}, },
"help": { "help": {
"click": "velja skjal eða möppu", "click": "velja skjal eða möppu",
@@ -74,18 +76,39 @@
"f2": "endurnefna skjal", "f2": "endurnefna skjal",
"help": "Hjálp" "help": "Hjálp"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Lykilorð",
"passwordConfirm": "Staðfesting lykilorðs",
"submit": "Innskráning",
"createAnAccount": "Búa til nýjan aðgang", "createAnAccount": "Búa til nýjan aðgang",
"loginInstead": "Þú ert þegar með aðgang", "loginInstead": "Þú ert þegar með aðgang",
"password": "Lykilorð",
"passwordConfirm": "Staðfesting lykilorðs",
"passwordsDontMatch": "Lykilorð eru mismunandi", "passwordsDontMatch": "Lykilorð eru mismunandi",
"usernameTaken": "Þetta norendanafn er þegar í notkun",
"signup": "Nýskráning", "signup": "Nýskráning",
"submit": "Innskráning",
"username": "Notendanafn", "username": "Notendanafn",
"usernameTaken": "Þetta norendanafn er þegar í notkun",
"wrongCredentials": "Rangar notendaupplýsingar" "wrongCredentials": "Rangar notendaupplýsingar"
}, },
"permanent": "Varanlegt",
"prompts": { "prompts": {
"copy": "Afrita", "copy": "Afrita",
"copyMessage": "Veldu staðsetningu til að afrita gögn: ", "copyMessage": "Veldu staðsetningu til að afrita gögn: ",
@@ -102,43 +125,64 @@
"lastModified": "Seinast breytt", "lastModified": "Seinast breytt",
"move": "Færa", "move": "Færa",
"moveMessage": "Velja nýtt hús fyrir skjöl/möppur:", "moveMessage": "Velja nýtt hús fyrir skjöl/möppur:",
"newArchetype": "Búðu til nýja færslu sem byggir á frumgerð. Skjalið verður búið til í content möppu. ",
"newDir": "Ný mappa", "newDir": "Ný mappa",
"newDirMessage": "Hvað á mappan að heita?", "newDirMessage": "Hvað á mappan að heita?",
"newFile": "Nýtt skjal", "newFile": "Nýtt skjal",
"newFileMessage": "Hvað á skjalið að heita?", "newFileMessage": "Hvað á skjalið að heita?",
"numberDirs": "Fjöldi mappa", "numberDirs": "Fjöldi mappa",
"numberFiles": "Fjöldi skjala", "numberFiles": "Fjöldi skjala",
"replace": "Skipta út",
"replaceMessage": "Eitt af skjölunum sem þú ert að reyna að hlaða upp hefur sama nafn og annað skjal. Viltu skipta nýja skjalinu út fyrir það gamla?\n",
"rename": "Endurnefna", "rename": "Endurnefna",
"renameMessage": "Settu inn nýtt nafn fyrir", "renameMessage": "Settu inn nýtt nafn fyrir",
"show": "Sýna", "replace": "Skipta út",
"size": "Stærð", "replaceMessage": "Eitt af skjölunum sem þú ert að reyna að hlaða upp hefur sama nafn og annað skjal. Viltu skipta nýja skjalinu út fyrir það gamla?\n",
"schedule": "Áætlun", "schedule": "Áætlun",
"scheduleMessage": "Veldu dagsetningu og tíma fyrir áætlaða útgáfu. ", "scheduleMessage": "Veldu dagsetningu og tíma fyrir áætlaða útgáfu. ",
"newArchetype": "Búðu til nýja færslu sem byggir á frumgerð. Skjalið verður búið til í content möppu. " "show": "Sýna",
"size": "Stærð",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Myndir",
"music": "Tónlist",
"pdf": "PDF",
"pressToSearch": "Ýttu á Enter til að leita...",
"search": "Leita...",
"typeToSearch": "Skrifaðu til að leita...",
"types": "Skrárgerðir",
"video": "Myndbönd"
}, },
"settings": { "settings": {
"instanceName": "Nafn tilviks",
"brandingDirectoryPath": "Mappa fyrir branding-skjöl",
"documentation": "leiðbeiningar",
"branding": "Útlit",
"disableExternalLinks": "Sýna ytri-hlekki (fyrir utan leiðbeiningar)",
"brandingHelp": "Þú getur breytt því hvernig File Browser lítur út með því að breyta nafninu, setja inn nýtt lógó, búa til þína eigin stíla og tekið út GitHub-hlekki. \nTil að lesa meira um custom-branding, kíktu á {0}.",
"admin": "Stjórnandi", "admin": "Stjórnandi",
"administrator": "Stjórnandi", "administrator": "Stjórnandi",
"allowCommands": "Senda skipanir", "allowCommands": "Senda skipanir",
"allowEdit": "Breyta, endurnefna og eyða skjölum eða möppum", "allowEdit": "Breyta, endurnefna og eyða skjölum eða möppum",
"allowNew": "Búa til ný skjöl og möppur", "allowNew": "Búa til ný skjöl og möppur",
"allowPublish": "Gefa út nýjar færslur og síður", "allowPublish": "Gefa út nýjar færslur og síður",
"allowSignup": "Leyfa nýjum notendum að skrá sig",
"avoidChanges": "(engar breytingar ef ekkert er skrifað)", "avoidChanges": "(engar breytingar ef ekkert er skrifað)",
"branding": "Útlit",
"brandingDirectoryPath": "Mappa fyrir branding-skjöl",
"brandingHelp": "Þú getur breytt því hvernig File Browser lítur út með því að breyta nafninu, setja inn nýtt lógó, búa til þína eigin stíla og tekið út GitHub-hlekki. \nTil að lesa meira um custom-branding, kíktu á {0}.",
"changePassword": "Breyta lykilorði", "changePassword": "Breyta lykilorði",
"commandRunner": "Skipanagluggi", "commandRunner": "Skipanagluggi",
"commandRunnerHelp": "Hér geturðu sett inn skipanir sem eru keyrðar eftir því sem þú tilgreinir. Skrifaðu eina skipun í hverja línu. Umhverfisbreyturnar {0} og {1} verða aðgengilegar ({0} miðast við {1}). Til að lesa meira og sjá lista yfir þær skipanir sem eru í boði, vinsamlegast lestu {2}. ", "commandRunnerHelp": "Hér geturðu sett inn skipanir sem eru keyrðar eftir því sem þú tilgreinir. Skrifaðu eina skipun í hverja línu. Umhverfisbreyturnar {0} og {1} verða aðgengilegar ({0} miðast við {1}). Til að lesa meira og sjá lista yfir þær skipanir sem eru í boði, vinsamlegast lestu {2}. ",
"commandsUpdated": "Skipanastillingar vistaðar!", "commandsUpdated": "Skipanastillingar vistaðar!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "Custom Stylesheet", "customStylesheet": "Custom Stylesheet",
"defaultUserDescription": "Þetta eru sjálfgefnar stillingar fyrir nýja notendur.",
"disableExternalLinks": "Sýna ytri-hlekki (fyrir utan leiðbeiningar)",
"documentation": "leiðbeiningar",
"examples": "Dæmi", "examples": "Dæmi",
"executeOnShell": "Keyra í skel",
"executeOnShellDescription": "Sjálfgefnar stillingar File Browser eru að keyra skipanir beint með því að sækja binaries. Ef þú villt keyra skipanir í skel (t.d. í Bash eða PowerShell), þá geturðu skilgreint það hér með nauðsynlegum arguments og flags. Ef þetta er stillt, þá verður skipuninni bætt fyrir aftan sem argument. Þetta gildir bæði um skipanir notenda og event hooks.",
"globalRules": "Þetta eru sjálfgegnar aðgangsreglur. Þær gilda um alla notendur. Þú getur tilgreint sérstakar reglur í stillingum fyrir hvern notenda til að ógilda þessar reglur. ",
"globalSettings": "Global stillingar", "globalSettings": "Global stillingar",
"hideDotfiles": "",
"insertPath": "Settu inn slóð",
"insertRegex": "Setja inn reglulega segð",
"instanceName": "Nafn tilviks",
"language": "Tungumál", "language": "Tungumál",
"lockPassword": "Koma í veg fyrir að notandi breyti lykilorðinu", "lockPassword": "Koma í veg fyrir að notandi breyti lykilorðinu",
"newPassword": "Nýja lykilorðið þitt", "newPassword": "Nýja lykilorðið þitt",
@@ -146,6 +190,16 @@
"newUser": "Nýr notandi", "newUser": "Nýr notandi",
"password": "Lykilorð", "password": "Lykilorð",
"passwordUpdated": "Lykilorð vistað!", "passwordUpdated": "Lykilorð vistað!",
"path": "",
"perm": {
"create": "Búa til sköl og möppur",
"delete": "Eyða skjölum og möppum",
"download": "Sækja",
"execute": "Keyra skipanir",
"modify": "Breyta skjölum",
"rename": "Endurnefna eða færa skjöl og möppur",
"share": "Deila skjölum"
},
"permissions": "Heimildir", "permissions": "Heimildir",
"permissionsHelp": "Þú getur stillt notenda sem stjórnanda eða valið einstaklingsbundnar heimildir. Ef þú velur \"Stjórnandi\", þá verða allir aðrir valmöguleikar valdir sjálfrafa. Aðgangstýring notenda er á hendi stjórnenda. \n", "permissionsHelp": "Þú getur stillt notenda sem stjórnanda eða valið einstaklingsbundnar heimildir. Ef þú velur \"Stjórnandi\", þá verða allir aðrir valmöguleikar valdir sjálfrafa. Aðgangstýring notenda er á hendi stjórnenda. \n",
"profileSettings": "Stilla prófíl", "profileSettings": "Stilla prófíl",
@@ -155,82 +209,46 @@
"rulesHelp": "Hér getur þú skilgreint hvaða reglur gilda um notandann. Skjölin sem hann hefur ekki aðgang að eru óaðgengileg og hann sér þau ekki. Stuðst er við reglulegar segðir og slóðir sem miðast við sýn notandans. ", "rulesHelp": "Hér getur þú skilgreint hvaða reglur gilda um notandann. Skjölin sem hann hefur ekki aðgang að eru óaðgengileg og hann sér þau ekki. Stuðst er við reglulegar segðir og slóðir sem miðast við sýn notandans. ",
"scope": "Sýn notandans", "scope": "Sýn notandans",
"settingsUpdated": "Stillingar vistaðar!", "settingsUpdated": "Stillingar vistaðar!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Notandi", "user": "Notandi",
"userCommands": "Skipanir", "userCommands": "Skipanir",
"userCommandsHelp": "Listi þar sem gildum er skipt upp með bili og inniheldur tiltækar skipanir fyrir þennan notanda. Til dæmis:\n", "userCommandsHelp": "Listi þar sem gildum er skipt upp með bili og inniheldur tiltækar skipanir fyrir þennan notanda. Til dæmis:\n",
"userCreated": "Notandi stofnaður!", "userCreated": "Notandi stofnaður!",
"userDefaults": "Sjálfgefnar notendastillingar",
"userDeleted": "Notanda eytt!", "userDeleted": "Notanda eytt!",
"userManagement": "Notendastýring", "userManagement": "Notendastýring",
"username": "Notendanafn",
"users": "Notendur",
"globalRules": "Þetta eru sjálfgegnar aðgangsreglur. Þær gilda um alla notendur. Þú getur tilgreint sérstakar reglur í stillingum fyrir hvern notenda til að ógilda þessar reglur. ",
"allowSignup": "Leyfa nýjum notendum að skrá sig",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Setja inn reglulega segð",
"insertPath": "Settu inn slóð",
"userUpdated": "Notandastillingar vistaðar!", "userUpdated": "Notandastillingar vistaðar!",
"userDefaults": "Sjálfgefnar notendastillingar", "username": "Notendanafn",
"defaultUserDescription": "Þetta eru sjálfgefnar stillingar fyrir nýja notendur.", "users": "Notendur"
"executeOnShell": "Keyra í skel",
"executeOnShellDescription": "Sjálfgefnar stillingar File Browser eru að keyra skipanir beint með því að sækja binaries. Ef þú villt keyra skipanir í skel (t.d. í Bash eða PowerShell), þá geturðu skilgreint það hér með nauðsynlegum arguments og flags. Ef þetta er stillt, þá verður skipuninni bætt fyrir aftan sem argument. Þetta gildir bæði um skipanir notenda og event hooks.",
"perm": {
"create": "Búa til sköl og möppur",
"delete": "Eyða skjölum og möppum",
"download": "Sækja",
"modify": "Breyta skjölum",
"execute": "Keyra skipanir",
"rename": "Endurnefna eða færa skjöl og möppur",
"share": "Deila skjölum"
}
}, },
"sidebar": { "sidebar": {
"help": "Hjálp", "help": "Hjálp",
"hugoNew": "Hugo New",
"login": "Innskráning", "login": "Innskráning",
"signup": "Nýskráning",
"logout": "Útskráning", "logout": "Útskráning",
"myFiles": "Gögnin mín", "myFiles": "Gögnin mín",
"newFile": "Nýtt skjal", "newFile": "Nýtt skjal",
"newFolder": "Ný mappa", "newFolder": "Ný mappa",
"preview": "Sýnishorn",
"settings": "Stillingar", "settings": "Stillingar",
"siteSettings": "Stillingar síðu", "signup": "Nýskráning",
"hugoNew": "Hugo New", "siteSettings": "Stillingar síðu"
"preview": "Sýnishorn"
}, },
"search": { "success": {
"images": "Myndir", "linkCopied": "Hlekkur afritaður!"
"music": "Tónlist",
"pdf": "PDF",
"types": "Skrárgerðir",
"video": "Myndbönd",
"search": "Leita...",
"typeToSearch": "Skrifaðu til að leita...",
"pressToSearch": "Ýttu á Enter til að leita..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Tímastilling", "days": "Dagar",
"seconds": "Sekúndur",
"minutes": "Mínútur",
"hours": "Klukkutímar", "hours": "Klukkutímar",
"days": "Dagar" "minutes": "Mínútur",
}, "seconds": "Sekúndur",
"download": { "unit": "Tímastilling"
"downloadFile": "Sækja skjal",
"downloadFolder": "Sækja möppu"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanente",
"buttons": { "buttons": {
"shell": "Toggle shell",
"cancel": "Annulla", "cancel": "Annulla",
"close": "Chiudi", "close": "Chiudi",
"copy": "Copia", "copy": "Copia",
@@ -10,6 +8,7 @@
"create": "Crea", "create": "Crea",
"delete": "Elimina", "delete": "Elimina",
"download": "Scarica", "download": "Scarica",
"hideDotfiles": "",
"info": "Informazioni", "info": "Informazioni",
"more": "Altro", "more": "Altro",
"move": "Sposta", "move": "Sposta",
@@ -17,25 +16,28 @@
"new": "Nuovo", "new": "Nuovo",
"next": "Successivo", "next": "Successivo",
"ok": "OK", "ok": "OK",
"replace": "Sostituisci", "permalink": "Ottieni link permanente",
"previous": "Precedente", "previous": "Precedente",
"publish": "Publica",
"rename": "Rinomina", "rename": "Rinomina",
"replace": "Sostituisci",
"reportIssue": "Segnala un problema", "reportIssue": "Segnala un problema",
"save": "Salva", "save": "Salva",
"schedule": "Programma",
"search": "Cerca", "search": "Cerca",
"select": "Seleziona", "select": "Seleziona",
"share": "Condividi",
"publish": "Publica",
"selectMultiple": "Seleziona molteplici", "selectMultiple": "Seleziona molteplici",
"schedule": "Programma", "share": "Condividi",
"shell": "Toggle shell",
"switchView": "Cambia vista", "switchView": "Cambia vista",
"toggleSidebar": "Mostra/nascondi la barra laterale", "toggleSidebar": "Mostra/nascondi la barra laterale",
"update": "Aggiorna", "update": "Aggiorna",
"upload": "Carica", "upload": "Carica"
"permalink": "Ottieni link permanente"
}, },
"success": { "download": {
"linkCopied": "Link copiato!" "downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "You don't have permissions to access this.", "forbidden": "You don't have permissions to access this.",
@@ -43,11 +45,11 @@
"notFound": "Questo percorso non può essere raggiunto." "notFound": "Questo percorso non può essere raggiunto."
}, },
"files": { "files": {
"folders": "Cartelle",
"files": "Files",
"body": "Contenuto", "body": "Contenuto",
"clear": "Cancella", "clear": "Cancella",
"closePreview": "Chiudi anteprima", "closePreview": "Chiudi anteprima",
"files": "Files",
"folders": "Cartelle",
"home": "Home", "home": "Home",
"lastModified": "Ultima modifica", "lastModified": "Ultima modifica",
"loading": "Caricamento...", "loading": "Caricamento...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Selezione multipla attivata", "multipleSelectionEnabled": "Selezione multipla attivata",
"name": "Nome", "name": "Nome",
"size": "Grandezza", "size": "Grandezza",
"sortByLastModified": "Ordina per ultima modifica",
"sortByName": "Ordina per nome", "sortByName": "Ordina per nome",
"sortBySize": "Ordina per dimensione", "sortBySize": "Ordina per dimensione"
"sortByLastModified": "Ordina per ultima modifica"
}, },
"help": { "help": {
"click": "seleziona un file o una cartella", "click": "seleziona un file o una cartella",
@@ -74,18 +76,39 @@
"f2": "rinomina un file", "f2": "rinomina un file",
"help": "Aiuto" "help": "Aiuto"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Password",
"passwordConfirm": "Password Confirmation",
"submit": "Entra",
"createAnAccount": "Create an account", "createAnAccount": "Create an account",
"loginInstead": "Already have an account", "loginInstead": "Already have an account",
"password": "Password",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match", "passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup", "signup": "Signup",
"submit": "Entra",
"username": "Nome utente", "username": "Nome utente",
"usernameTaken": "Username already taken",
"wrongCredentials": "Credenziali errate" "wrongCredentials": "Credenziali errate"
}, },
"permanent": "Permanente",
"prompts": { "prompts": {
"copy": "Copia", "copy": "Copia",
"copyMessage": "Seleziona la cartella in cui copiare i file:", "copyMessage": "Seleziona la cartella in cui copiare i file:",
@@ -102,43 +125,64 @@
"lastModified": "Ultima modifica", "lastModified": "Ultima modifica",
"move": "Sposta", "move": "Sposta",
"moveMessage": "Seleziona la nuova posizione per i tuoi file e/o cartella/e:", "moveMessage": "Seleziona la nuova posizione per i tuoi file e/o cartella/e:",
"newArchetype": "Crea un nuovo post basato su un modello. Il tuo file verrà creato nella cartella.",
"newDir": "Nuova cartella", "newDir": "Nuova cartella",
"newDirMessage": "Scrivi il nome della nuova cartella.", "newDirMessage": "Scrivi il nome della nuova cartella.",
"newFile": "Nuovo file", "newFile": "Nuovo file",
"newFileMessage": "Scrivi il nome del nuovo file.", "newFileMessage": "Scrivi il nome del nuovo file.",
"numberDirs": "Numero di cartelle", "numberDirs": "Numero di cartelle",
"numberFiles": "Numero di files", "numberFiles": "Numero di files",
"replace": "Sostituisci",
"replaceMessage": "Uno dei file che stai cercando di caricare sta generando un conflitto per via del suo nome. Desideri sostituire il file già esistente?\n",
"rename": "Rinomina", "rename": "Rinomina",
"renameMessage": "Inserisci un nuovo nome per", "renameMessage": "Inserisci un nuovo nome per",
"show": "Mostra", "replace": "Sostituisci",
"size": "Grandezza", "replaceMessage": "Uno dei file che stai cercando di caricare sta generando un conflitto per via del suo nome. Desideri sostituire il file già esistente?\n",
"schedule": "Pianifica", "schedule": "Pianifica",
"scheduleMessage": "Seleziona data e ora per programmare la pubbilicazione di questo post", "scheduleMessage": "Seleziona data e ora per programmare la pubbilicazione di questo post",
"newArchetype": "Crea un nuovo post basato su un modello. Il tuo file verrà creato nella cartella." "show": "Mostra",
"size": "Grandezza",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Immagini",
"music": "Musica",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "Cerca...",
"typeToSearch": "Type to search...",
"types": "Tipi",
"video": "Video"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Amministratore", "administrator": "Amministratore",
"allowCommands": "Esegui comandi", "allowCommands": "Esegui comandi",
"allowEdit": "Modifica, rinomina ed elimina file o cartelle", "allowEdit": "Modifica, rinomina ed elimina file o cartelle",
"allowNew": "Crea nuovi files o cartelle", "allowNew": "Crea nuovi files o cartelle",
"allowPublish": "Pubblica nuovi post e pagine", "allowPublish": "Pubblica nuovi post e pagine",
"allowSignup": "Allow users to signup",
"avoidChanges": "(lascia vuoto per evitare cambiamenti)", "avoidChanges": "(lascia vuoto per evitare cambiamenti)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "Modifica password", "changePassword": "Modifica password",
"commandRunner": "Command runner", "commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "Comandi aggiornati!", "commandsUpdated": "Comandi aggiornati!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "Folgio di stile personalizzato", "customStylesheet": "Folgio di stile personalizzato",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"documentation": "documentation",
"examples": "Esempi", "examples": "Esempi",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"globalSettings": "Impostazioni Globali", "globalSettings": "Impostazioni Globali",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"language": "Lingua", "language": "Lingua",
"lockPassword": "Impedisci all'utente di modificare la password", "lockPassword": "Impedisci all'utente di modificare la password",
"newPassword": "La tua nuova password", "newPassword": "La tua nuova password",
@@ -146,6 +190,16 @@
"newUser": "Nuovo utente", "newUser": "Nuovo utente",
"password": "Password", "password": "Password",
"passwordUpdated": "Password aggiornata!", "passwordUpdated": "Password aggiornata!",
"path": "",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
},
"permissions": "Permessi", "permissions": "Permessi",
"permissionsHelp": "È possibile impostare l'utente come amministratore o scegliere i permessi singolarmente. Se si seleziona \"Amministratore\", tutte le altre opzioni saranno automaticamente assegnate. La gestione degli utenti rimane un privilegio di un amministratore.\n", "permissionsHelp": "È possibile impostare l'utente come amministratore o scegliere i permessi singolarmente. Se si seleziona \"Amministratore\", tutte le altre opzioni saranno automaticamente assegnate. La gestione degli utenti rimane un privilegio di un amministratore.\n",
"profileSettings": "Impostazioni del profilo", "profileSettings": "Impostazioni del profilo",
@@ -155,82 +209,46 @@
"rulesHelp": "Qui è possibile definire una serie di regole e permessi per questo specifico utente. I file bloccati non appariranno negli elenchi e non saranno accessibili dagli utenti. all'utente. Sia regex che i percorsi relativi all'ambito di applicazione degli utenti sono supportati.\n", "rulesHelp": "Qui è possibile definire una serie di regole e permessi per questo specifico utente. I file bloccati non appariranno negli elenchi e non saranno accessibili dagli utenti. all'utente. Sia regex che i percorsi relativi all'ambito di applicazione degli utenti sono supportati.\n",
"scope": "Scopo", "scope": "Scopo",
"settingsUpdated": "Impostazioni aggiornate!", "settingsUpdated": "Impostazioni aggiornate!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Utente", "user": "Utente",
"userCommands": "Comandi", "userCommands": "Comandi",
"userCommandsHelp": "Una lista separata dal spazi con i comandi disponibili per questo utente. Example:\n", "userCommandsHelp": "Una lista separata dal spazi con i comandi disponibili per questo utente. Example:\n",
"userCreated": "Utente creato!", "userCreated": "Utente creato!",
"userDefaults": "User default settings",
"userDeleted": "Utente eliminato!", "userDeleted": "Utente eliminato!",
"userManagement": "Gestione degli utenti", "userManagement": "Gestione degli utenti",
"username": "Nome utente",
"users": "Utenti",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Utente aggiornato!", "userUpdated": "Utente aggiornato!",
"userDefaults": "User default settings", "username": "Nome utente",
"defaultUserDescription": "This are the default settings for new users.", "users": "Utenti"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"modify": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
}, },
"sidebar": { "sidebar": {
"help": "Aiuto", "help": "Aiuto",
"hugoNew": "Hugo New",
"login": "Login", "login": "Login",
"signup": "Signup",
"logout": "Esci", "logout": "Esci",
"myFiles": "I miei file", "myFiles": "I miei file",
"newFile": "Nuovo file", "newFile": "Nuovo file",
"newFolder": "Nuova cartella", "newFolder": "Nuova cartella",
"preview": "Anteprima",
"settings": "Impostazioni", "settings": "Impostazioni",
"siteSettings": "Impostaizoni del sito", "signup": "Signup",
"hugoNew": "Hugo New", "siteSettings": "Impostaizoni del sito"
"preview": "Anteprima"
}, },
"search": { "success": {
"images": "Immagini", "linkCopied": "Link copiato!"
"music": "Musica",
"pdf": "PDF",
"types": "Tipi",
"video": "Video",
"search": "Cerca...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Unità di tempo", "days": "Giorni",
"seconds": "Secondi",
"minutes": "Minuti",
"hours": "Ore", "hours": "Ore",
"days": "Giorni" "minutes": "Minuti",
}, "seconds": "Secondi",
"download": { "unit": "Unità di tempo"
"downloadFile": "Download File",
"downloadFolder": "Download Folder"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "永久",
"buttons": { "buttons": {
"shell": "Toggle shell",
"cancel": "キャンセル", "cancel": "キャンセル",
"close": "閉じる", "close": "閉じる",
"copy": "コピー", "copy": "コピー",
@@ -10,6 +8,7 @@
"create": "作成", "create": "作成",
"delete": "削除", "delete": "削除",
"download": "ダウンロード", "download": "ダウンロード",
"hideDotfiles": "",
"info": "情報", "info": "情報",
"more": "More", "more": "More",
"move": "移動", "move": "移動",
@@ -17,25 +16,28 @@
"new": "新規", "new": "新規",
"next": "次", "next": "次",
"ok": "OK", "ok": "OK",
"replace": "置き換える", "permalink": "固定リンク",
"previous": "前", "previous": "前",
"publish": "発表",
"rename": "名前を変更", "rename": "名前を変更",
"replace": "置き換える",
"reportIssue": "問題を報告", "reportIssue": "問題を報告",
"save": "保存", "save": "保存",
"schedule": "スケジュール",
"search": "検索", "search": "検索",
"select": "選択", "select": "選択",
"share": "シェア",
"publish": "発表",
"selectMultiple": "複数選択", "selectMultiple": "複数選択",
"schedule": "スケジュール", "share": "シェア",
"shell": "Toggle shell",
"switchView": "表示を切り替わる", "switchView": "表示を切り替わる",
"toggleSidebar": "サイドバーを表示する", "toggleSidebar": "サイドバーを表示する",
"update": "更新", "update": "更新",
"upload": "アップロード", "upload": "アップロード"
"permalink": "固定リンク"
}, },
"success": { "download": {
"linkCopied": "リンクがコピーされました!" "downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "You don't have permissions to access this.", "forbidden": "You don't have permissions to access this.",
@@ -43,11 +45,11 @@
"notFound": "リソースが見つからなりませんでした。" "notFound": "リソースが見つからなりませんでした。"
}, },
"files": { "files": {
"folders": "フォルダ",
"files": "ファイル",
"body": "本文", "body": "本文",
"clear": "クリアー", "clear": "クリアー",
"closePreview": "プレビューを閉じる", "closePreview": "プレビューを閉じる",
"files": "ファイル",
"folders": "フォルダ",
"home": "ホーム", "home": "ホーム",
"lastModified": "最終変更", "lastModified": "最終変更",
"loading": "ローディング...", "loading": "ローディング...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "複数選択有効", "multipleSelectionEnabled": "複数選択有効",
"name": "名前", "name": "名前",
"size": "サイズ", "size": "サイズ",
"sortByLastModified": "最終変更日付によるソート",
"sortByName": "名前によるソート", "sortByName": "名前によるソート",
"sortBySize": "サイズによるソート", "sortBySize": "サイズによるソート"
"sortByLastModified": "最終変更日付によるソート"
}, },
"help": { "help": {
"click": "ファイルやディレクトリを選択", "click": "ファイルやディレクトリを選択",
@@ -74,18 +76,39 @@
"f2": "ファイルの名前を変更", "f2": "ファイルの名前を変更",
"help": "ヘルプ" "help": "ヘルプ"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "パスワード",
"passwordConfirm": "Password Confirmation",
"submit": "ログイン",
"createAnAccount": "Create an account", "createAnAccount": "Create an account",
"loginInstead": "Already have an account", "loginInstead": "Already have an account",
"password": "パスワード",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match", "passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup", "signup": "Signup",
"submit": "ログイン",
"username": "ユーザ名", "username": "ユーザ名",
"usernameTaken": "Username already taken",
"wrongCredentials": "ユーザ名またはパスワードが間違っています。" "wrongCredentials": "ユーザ名またはパスワードが間違っています。"
}, },
"permanent": "永久",
"prompts": { "prompts": {
"copy": "コピー", "copy": "コピー",
"copyMessage": "コピーの目標ディレクトリを選択してください:", "copyMessage": "コピーの目標ディレクトリを選択してください:",
@@ -102,43 +125,64 @@
"lastModified": "最終変更", "lastModified": "最終変更",
"move": "移動", "move": "移動",
"moveMessage": "移動の目標ディレクトリを選択してください:", "moveMessage": "移動の目標ディレクトリを選択してください:",
"newArchetype": "ある元型に基づいて新しいポストを作成します。ファイルは コンテンツフォルダに作成されます。",
"newDir": "新しいディレクトリを作成", "newDir": "新しいディレクトリを作成",
"newDirMessage": "新しいディレクトリの名前を入力してください。", "newDirMessage": "新しいディレクトリの名前を入力してください。",
"newFile": "新しいファイルを作成", "newFile": "新しいファイルを作成",
"newFileMessage": "新しいファイルの名前を入力してください。", "newFileMessage": "新しいファイルの名前を入力してください。",
"numberDirs": "ディレクトリ個数", "numberDirs": "ディレクトリ個数",
"numberFiles": "ファイル個数", "numberFiles": "ファイル個数",
"replace": "置き換える",
"replaceMessage": "アップロードするファイルの中でかち合う名前が一つあります。 既存のファイルを置き換えりませんか。\n",
"rename": "名前を変更", "rename": "名前を変更",
"renameMessage": "名前を変更しようファイルは:", "renameMessage": "名前を変更しようファイルは:",
"show": "表示", "replace": "置き換える",
"size": "サイズ", "replaceMessage": "アップロードするファイルの中でかち合う名前が一つあります。 既存のファイルを置き換えりませんか。\n",
"schedule": "スケジュール", "schedule": "スケジュール",
"scheduleMessage": "このポストの発表日付をスケジュールしてください。", "scheduleMessage": "このポストの発表日付をスケジュールしてください。",
"newArchetype": "ある元型に基づいて新しいポストを作成します。ファイルは コンテンツフォルダに作成されます。" "show": "表示",
"size": "サイズ",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "画像",
"music": "音楽",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "検索...",
"typeToSearch": "Type to search...",
"types": "種類",
"video": "ビデオ"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "管理者", "admin": "管理者",
"administrator": "管理者", "administrator": "管理者",
"allowCommands": "コマンドの実行", "allowCommands": "コマンドの実行",
"allowEdit": "ファイルやディレクトリの編集、名前変更と削除", "allowEdit": "ファイルやディレクトリの編集、名前変更と削除",
"allowNew": "ファイルとディレクトリの作成", "allowNew": "ファイルとディレクトリの作成",
"allowPublish": "ポストとぺーじの発表", "allowPublish": "ポストとぺーじの発表",
"allowSignup": "Allow users to signup",
"avoidChanges": "(変更を避けるために空白にしてください)", "avoidChanges": "(変更を避けるために空白にしてください)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "パスワードを変更", "changePassword": "パスワードを変更",
"commandRunner": "Command runner", "commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "コマンドは更新されました!", "commandsUpdated": "コマンドは更新されました!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "カスタムスタイルシ ート", "customStylesheet": "カスタムスタイルシ ート",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"documentation": "documentation",
"examples": "例", "examples": "例",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"globalSettings": "グローバル設定", "globalSettings": "グローバル設定",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"language": "言語", "language": "言語",
"lockPassword": "新しいパスワードを変更に禁止", "lockPassword": "新しいパスワードを変更に禁止",
"newPassword": "新しいパスワード", "newPassword": "新しいパスワード",
@@ -146,6 +190,16 @@
"newUser": "新しいユーザー", "newUser": "新しいユーザー",
"password": "パスワード", "password": "パスワード",
"passwordUpdated": "パスワードは更新されました!", "passwordUpdated": "パスワードは更新されました!",
"path": "",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
},
"permissions": "権限", "permissions": "権限",
"permissionsHelp": "あなたはユーザーを管理者に設定し、または権限を個々に設定しできます。\"管理者\"を選択する場合、その他のすべての選択肢は自動的に設定されます。ユーザーの管理は管理者の権限として保留されました。", "permissionsHelp": "あなたはユーザーを管理者に設定し、または権限を個々に設定しできます。\"管理者\"を選択する場合、その他のすべての選択肢は自動的に設定されます。ユーザーの管理は管理者の権限として保留されました。",
"profileSettings": "プロファイル設定", "profileSettings": "プロファイル設定",
@@ -155,82 +209,46 @@
"rulesHelp": "ここに、あなたはこのユーザーの許可または拒否規則を設定できます。ブロックされたファイルはリストに表示されません、それではアクセスも制限されます。正規表現(regex)のサポートと範囲に相対のパスが提供されています。", "rulesHelp": "ここに、あなたはこのユーザーの許可または拒否規則を設定できます。ブロックされたファイルはリストに表示されません、それではアクセスも制限されます。正規表現(regex)のサポートと範囲に相対のパスが提供されています。",
"scope": "範囲", "scope": "範囲",
"settingsUpdated": "設定は更新されました!", "settingsUpdated": "設定は更新されました!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "ユーザー", "user": "ユーザー",
"userCommands": "ユーザーのコマンド", "userCommands": "ユーザーのコマンド",
"userCommandsHelp": "空白区切りの有効のコマンドのリストを指定してください。例:", "userCommandsHelp": "空白区切りの有効のコマンドのリストを指定してください。例:",
"userCreated": "ユーザーは作成されました!", "userCreated": "ユーザーは作成されました!",
"userDefaults": "User default settings",
"userDeleted": "ユーザーは削除されました!", "userDeleted": "ユーザーは削除されました!",
"userManagement": "ユーザー管理", "userManagement": "ユーザー管理",
"username": "ユーザー名",
"users": "ユーザー",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "ユーザーは更新されました!", "userUpdated": "ユーザーは更新されました!",
"userDefaults": "User default settings", "username": "ユーザー名",
"defaultUserDescription": "This are the default settings for new users.", "users": "ユーザー"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"modify": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
}, },
"sidebar": { "sidebar": {
"help": "ヘルプ", "help": "ヘルプ",
"hugoNew": "Hugo New",
"login": "Login", "login": "Login",
"signup": "Signup",
"logout": "ログアウト", "logout": "ログアウト",
"myFiles": "私のファイル", "myFiles": "私のファイル",
"newFile": "新しいファイルを作成", "newFile": "新しいファイルを作成",
"newFolder": "新しいフォルダを作成", "newFolder": "新しいフォルダを作成",
"preview": "プレビュー",
"settings": "設定", "settings": "設定",
"siteSettings": "サイト設定", "signup": "Signup",
"hugoNew": "Hugo New", "siteSettings": "サイト設定"
"preview": "プレビュー"
}, },
"search": { "success": {
"images": "画像", "linkCopied": "リンクがコピーされました!"
"music": "音楽",
"pdf": "PDF",
"types": "種類",
"video": "ビデオ",
"search": "検索...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "時間単位", "days": "",
"seconds": "秒",
"minutes": "分",
"hours": "時間", "hours": "時間",
"days": "日" "minutes": "分",
}, "seconds": "秒",
"download": { "unit": "時間単位"
"downloadFile": "Download File",
"downloadFolder": "Download Folder"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "영구",
"buttons": { "buttons": {
"shell": "쉘 전환",
"cancel": "취소", "cancel": "취소",
"close": "닫기", "close": "닫기",
"copy": "복사", "copy": "복사",
@@ -10,6 +8,7 @@
"create": "생성", "create": "생성",
"delete": "삭제", "delete": "삭제",
"download": "다운로드", "download": "다운로드",
"hideDotfiles": "",
"info": "정보", "info": "정보",
"more": "더보기", "more": "더보기",
"move": "이동", "move": "이동",
@@ -17,25 +16,28 @@
"new": "신규", "new": "신규",
"next": "다음", "next": "다음",
"ok": "확인", "ok": "확인",
"replace": "대체", "permalink": "링크 얻기",
"previous": "이전", "previous": "이전",
"publish": "게시",
"rename": "이름 바꾸기", "rename": "이름 바꾸기",
"replace": "대체",
"reportIssue": "이슈 보내기", "reportIssue": "이슈 보내기",
"save": "저장", "save": "저장",
"schedule": "일정",
"search": "검색", "search": "검색",
"select": "선택", "select": "선택",
"share": "공유",
"publish": "게시",
"selectMultiple": "다중 선택", "selectMultiple": "다중 선택",
"schedule": "일정", "share": "공유",
"shell": "쉘 전환",
"switchView": "보기 전환", "switchView": "보기 전환",
"toggleSidebar": "사이드바 전환", "toggleSidebar": "사이드바 전환",
"update": "업데이트", "update": "업데이트",
"upload": "업로드", "upload": "업로드"
"permalink": "링크 얻기"
}, },
"success": { "download": {
"linkCopied": "링크가 복사되었습니다!" "downloadFile": "파일 다운로드",
"downloadFolder": "폴더 다운로드",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "접근 권한이 없습니다.", "forbidden": "접근 권한이 없습니다.",
@@ -43,11 +45,11 @@
"notFound": "해당 경로를 찾을 수 없습니다." "notFound": "해당 경로를 찾을 수 없습니다."
}, },
"files": { "files": {
"folders": "폴더",
"files": "파일",
"body": "본문", "body": "본문",
"clear": "지우기", "clear": "지우기",
"closePreview": "미리보기 닫기", "closePreview": "미리보기 닫기",
"files": "파일",
"folders": "폴더",
"home": "홈", "home": "홈",
"lastModified": "최종 수정", "lastModified": "최종 수정",
"loading": "로딩중...", "loading": "로딩중...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "다중 선택 켜짐", "multipleSelectionEnabled": "다중 선택 켜짐",
"name": "이름", "name": "이름",
"size": "크기", "size": "크기",
"sortByLastModified": "수정시간순 정렬",
"sortByName": "이름순", "sortByName": "이름순",
"sortBySize": "크기순", "sortBySize": "크기순"
"sortByLastModified": "수정시간순 정렬"
}, },
"help": { "help": {
"click": "파일이나 디렉토리를 선택해주세요.", "click": "파일이나 디렉토리를 선택해주세요.",
@@ -74,18 +76,39 @@
"f2": "파일 이름 변경", "f2": "파일 이름 변경",
"help": "도움말" "help": "도움말"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "비밀번호",
"passwordConfirm": "비밀번호 확인",
"submit": "로그인",
"createAnAccount": "계정 생성", "createAnAccount": "계정 생성",
"loginInstead": "이미 계정이 있습니다", "loginInstead": "이미 계정이 있습니다",
"password": "비밀번호",
"passwordConfirm": "비밀번호 확인",
"passwordsDontMatch": "비밀번호가 일치하지 않습니다", "passwordsDontMatch": "비밀번호가 일치하지 않습니다",
"usernameTaken": "사용자 이름이 존재합니다",
"signup": "가입하기", "signup": "가입하기",
"submit": "로그인",
"username": "사용자 이름", "username": "사용자 이름",
"usernameTaken": "사용자 이름이 존재합니다",
"wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오" "wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오"
}, },
"permanent": "영구",
"prompts": { "prompts": {
"copy": "복사", "copy": "복사",
"copyMessage": "복사할 디렉토리:", "copyMessage": "복사할 디렉토리:",
@@ -102,43 +125,64 @@
"lastModified": "최종 수정", "lastModified": "최종 수정",
"move": "이동", "move": "이동",
"moveMessage": "이동할 화일 또는 디렉토리를 선택하세요:", "moveMessage": "이동할 화일 또는 디렉토리를 선택하세요:",
"newArchetype": "원형을 유지하는 포스트를 생성합니다. 파일은 컨텐트 폴더에 생성됩니다.",
"newDir": "새 디렉토리", "newDir": "새 디렉토리",
"newDirMessage": "새 디렉토리 이름을 입력해주세요.", "newDirMessage": "새 디렉토리 이름을 입력해주세요.",
"newFile": "새 파일", "newFile": "새 파일",
"newFileMessage": "새 파일 이름을 입력해주세요.", "newFileMessage": "새 파일 이름을 입력해주세요.",
"numberDirs": "디렉토리 수", "numberDirs": "디렉토리 수",
"numberFiles": "파일 수", "numberFiles": "파일 수",
"replace": "대체하기",
"replaceMessage": "동일한 파일 이름이 존재합니다. 현재 파일을 덮어쓸까요?\n",
"rename": "이름 변경", "rename": "이름 변경",
"renameMessage": "새로운 이름을 입력하세요.", "renameMessage": "새로운 이름을 입력하세요.",
"show": "기", "replace": "대체하기",
"size": "크기", "replaceMessage": "동일한 파일 이름이 존재합니다. 현재 파일을 덮어쓸까요?\n",
"schedule": "일정", "schedule": "일정",
"scheduleMessage": "이 글을 공개할 시간을 알려주세요.", "scheduleMessage": "이 글을 공개할 시간을 알려주세요.",
"newArchetype": "원형을 유지하는 포스트를 생성합니다. 파일은 컨텐트 폴더에 생성됩니다." "show": "보기",
"size": "크기",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "이미지",
"music": "음악",
"pdf": "PDF",
"pressToSearch": "검색하려면 엔터를 입력하세요",
"search": "검색...",
"typeToSearch": "검색어 입력...",
"types": "Types",
"video": "비디오"
}, },
"settings": { "settings": {
"instanceName": "인스턴스 이름",
"brandingDirectoryPath": "브랜드 디렉토리 경로",
"documentation": "문서",
"branding": "브랜딩",
"disableExternalLinks": "외부 링크 감추기",
"brandingHelp": "File Browser 인스턴스는 이름, 로고, 스타일 등을 변경할 수 있습니다. 자세한 사항은 여기{0}에서 확인하세요.",
"admin": "관리자", "admin": "관리자",
"administrator": "관리자", "administrator": "관리자",
"allowCommands": "명령 실행", "allowCommands": "명령 실행",
"allowEdit": "파일/디렉토리의 수정/변경/삭제 허용", "allowEdit": "파일/디렉토리의 수정/변경/삭제 허용",
"allowNew": "파일/디렉토리 생성 허용", "allowNew": "파일/디렉토리 생성 허용",
"allowPublish": "새 포스트/페이지 생성 허용", "allowPublish": "새 포스트/페이지 생성 허용",
"allowSignup": "사용자 가입 허용",
"avoidChanges": "(수정하지 않으면 비워두세요)", "avoidChanges": "(수정하지 않으면 비워두세요)",
"branding": "브랜딩",
"brandingDirectoryPath": "브랜드 디렉토리 경로",
"brandingHelp": "File Browser 인스턴스는 이름, 로고, 스타일 등을 변경할 수 있습니다. 자세한 사항은 여기{0}에서 확인하세요.",
"changePassword": "비밀번호 변경", "changePassword": "비밀번호 변경",
"commandRunner": "명령 실행기", "commandRunner": "명령 실행기",
"commandRunnerHelp": "이벤트에 해당하는 명령을 설정하세요. 줄당 1개의 명령을 적으세요. 환경 변수{0} 와 {1}이 사용가능하며, {0} 은 {1}에 상대 경로 입니다. 자세한 사항은 {2} 를 참조하세요.", "commandRunnerHelp": "이벤트에 해당하는 명령을 설정하세요. 줄당 1개의 명령을 적으세요. 환경 변수{0} 와 {1}이 사용가능하며, {0} 은 {1}에 상대 경로 입니다. 자세한 사항은 {2} 를 참조하세요.",
"commandsUpdated": "명령 수정됨!", "commandsUpdated": "명령 수정됨!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "커스텀 스타일시트", "customStylesheet": "커스텀 스타일시트",
"defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.",
"disableExternalLinks": "외부 링크 감추기",
"documentation": "문서",
"examples": "예", "examples": "예",
"executeOnShell": "쉘에서 실행",
"executeOnShellDescription": "기본적으로 File Browser 는 바이너리를 명령어로 호출하여 실행합니다. 쉘을 통해 실행하기를 원한다면, Bash 또는 PowerShell 에 필요한 인수와 플래그를 설정하세요. 사용자 명령어와 이벤트 훅에 모두 적용됩니다.",
"globalRules": "규칙에 대한 전역설정으로 모든 사용자에게 적용됩니다. 지정된 규칙은 사용자 설정을 덮어쓰기 합니다.",
"globalSettings": "전역 설정", "globalSettings": "전역 설정",
"hideDotfiles": "",
"insertPath": "경로 입력",
"insertRegex": "정규식 입력",
"instanceName": "인스턴스 이름",
"language": "언어", "language": "언어",
"lockPassword": "사용자에 의한 비밀번호 변경을 허용하지 않음", "lockPassword": "사용자에 의한 비밀번호 변경을 허용하지 않음",
"newPassword": "새로운 비밀번호", "newPassword": "새로운 비밀번호",
@@ -146,6 +190,16 @@
"newUser": "새로운 사용자", "newUser": "새로운 사용자",
"password": "비밀번호", "password": "비밀번호",
"passwordUpdated": "비밀번호 수정 완료!", "passwordUpdated": "비밀번호 수정 완료!",
"path": "",
"perm": {
"create": "파일이나 디렉토리 생성하기",
"delete": "화일이나 디렉토리 삭제하기",
"download": "다운로드",
"execute": "명령 실행",
"modify": "파일 편집",
"rename": "파일 이름 변경 또는 디렉토리 이동",
"share": "파일 공유하기"
},
"permissions": "권한", "permissions": "권한",
"permissionsHelp": "사용자를 관리자로 만들거나 권한을 부여할 수 있습니다. 관리자를 선택하면, 모든 옵션이 자동으로 선택됩니다. 사용자 관리는 현재 관리자만 할 수 있습니다.\n", "permissionsHelp": "사용자를 관리자로 만들거나 권한을 부여할 수 있습니다. 관리자를 선택하면, 모든 옵션이 자동으로 선택됩니다. 사용자 관리는 현재 관리자만 할 수 있습니다.\n",
"profileSettings": "프로필 설정", "profileSettings": "프로필 설정",
@@ -155,82 +209,46 @@
"rulesHelp": "사용자별로 규칙을 허용/방지를 지정할 수 있습니다. 방지된 파일은 보이지 않고 사용자들은 접근할 수 없습니다. 사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.\n", "rulesHelp": "사용자별로 규칙을 허용/방지를 지정할 수 있습니다. 방지된 파일은 보이지 않고 사용자들은 접근할 수 없습니다. 사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.\n",
"scope": "범위", "scope": "범위",
"settingsUpdated": "설정 수정됨!", "settingsUpdated": "설정 수정됨!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "사용자", "user": "사용자",
"userCommands": "명령어", "userCommands": "명령어",
"userCommandsHelp": "사용에게 허용할 명령어를 공백으로 구분하여 입력하세요. 예:\n", "userCommandsHelp": "사용에게 허용할 명령어를 공백으로 구분하여 입력하세요. 예:\n",
"userCreated": "사용자 생성됨!", "userCreated": "사용자 생성됨!",
"userDefaults": "사용자 기본 설정",
"userDeleted": "사용자 삭제됨!", "userDeleted": "사용자 삭제됨!",
"userManagement": "사용자 관리", "userManagement": "사용자 관리",
"username": "사용자 이름",
"users": "사용자",
"globalRules": "규칙에 대한 전역설정으로 모든 사용자에게 적용됩니다. 지정된 규칙은 사용자 설정을 덮어쓰기 합니다.",
"allowSignup": "사용자 가입 허용",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "정규식 입력",
"insertPath": "경로 입력",
"userUpdated": "사용자 수정됨!", "userUpdated": "사용자 수정됨!",
"userDefaults": "사용자 기본 설정", "username": "사용자 이름",
"defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.", "users": "사용자"
"executeOnShell": "쉘에서 실행",
"executeOnShellDescription": "기본적으로 File Browser 는 바이너리를 명령어로 호출하여 실행합니다. 쉘을 통해 실행하기를 원한다면, Bash 또는 PowerShell 에 필요한 인수와 플래그를 설정하세요. 사용자 명령어와 이벤트 훅에 모두 적용됩니다.",
"perm": {
"create": "파일이나 디렉토리 생성하기",
"delete": "화일이나 디렉토리 삭제하기",
"download": "다운로드",
"modify": "파일 편집",
"execute": "명령 실행",
"rename": "파일 이름 변경 또는 디렉토리 이동",
"share": "파일 공유하기"
}
}, },
"sidebar": { "sidebar": {
"help": "도움말", "help": "도움말",
"hugoNew": "Hugo New",
"login": "로그인", "login": "로그인",
"signup": "가입하기",
"logout": "로그아웃", "logout": "로그아웃",
"myFiles": "내 파일", "myFiles": "내 파일",
"newFile": "새로운 파일", "newFile": "새로운 파일",
"newFolder": "새로운 폴더", "newFolder": "새로운 폴더",
"preview": "미리보기",
"settings": "설정", "settings": "설정",
"siteSettings": "사이트 설정", "signup": "가입하기",
"hugoNew": "Hugo New", "siteSettings": "사이트 설정"
"preview": "미리보기"
}, },
"search": { "success": {
"images": "이미지", "linkCopied": "링크가 복사되었습니다!"
"music": "음악",
"pdf": "PDF",
"types": "Types",
"video": "비디오",
"search": "검색...",
"typeToSearch": "검색어 입력...",
"pressToSearch": "검색하려면 엔터를 입력하세요"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Time Unit", "days": "",
"seconds": "초",
"minutes": "분",
"hours": "시", "hours": "시",
"days": "일" "minutes": "분",
}, "seconds": "초",
"download": { "unit": "Time Unit"
"downloadFile": "파일 다운로드",
"downloadFolder": "폴더 다운로드"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanent",
"buttons": { "buttons": {
"shell": "Open shell",
"cancel": "Annuleren", "cancel": "Annuleren",
"close": "Sluiten", "close": "Sluiten",
"copy": "Kopiëren", "copy": "Kopiëren",
@@ -10,6 +8,7 @@
"create": "Aanmaken", "create": "Aanmaken",
"delete": "Verwijderen", "delete": "Verwijderen",
"download": "Downloaden", "download": "Downloaden",
"hideDotfiles": "",
"info": "Info", "info": "Info",
"more": "Meer", "more": "Meer",
"move": "Verplaatsen", "move": "Verplaatsen",
@@ -17,25 +16,28 @@
"new": "Nieuw", "new": "Nieuw",
"next": "Volgende", "next": "Volgende",
"ok": "OK", "ok": "OK",
"replace": "Vervangen", "permalink": "Maak permanente link",
"previous": "Vorige", "previous": "Vorige",
"publish": "Publiceren",
"rename": "Hernoemen", "rename": "Hernoemen",
"replace": "Vervangen",
"reportIssue": "Fout rapporteren", "reportIssue": "Fout rapporteren",
"save": "Opslaan", "save": "Opslaan",
"schedule": "Plannen",
"search": "Zoeken", "search": "Zoeken",
"select": "Selecteren", "select": "Selecteren",
"share": "Delen",
"publish": "Publiceren",
"selectMultiple": "Meerdere selecteren", "selectMultiple": "Meerdere selecteren",
"schedule": "Plannen", "share": "Delen",
"shell": "Open shell",
"switchView": "Beeld wisselen", "switchView": "Beeld wisselen",
"toggleSidebar": "Zijbalk tonen", "toggleSidebar": "Zijbalk tonen",
"update": "Updaten", "update": "Updaten",
"upload": "Uploaden", "upload": "Uploaden"
"permalink": "Maak permanente link"
}, },
"success": { "download": {
"linkCopied": "Link gekopieerd!" "downloadFile": "Bestand downloaden",
"downloadFolder": "Map downloaden",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "U hebt geen rechten om hier toegang toe te krijgen.", "forbidden": "U hebt geen rechten om hier toegang toe te krijgen.",
@@ -43,11 +45,11 @@
"notFound": "Deze locatie kan niet worden bereikt." "notFound": "Deze locatie kan niet worden bereikt."
}, },
"files": { "files": {
"folders": "Mappen",
"files": "Bestanden",
"body": "Body", "body": "Body",
"clear": "Wissen", "clear": "Wissen",
"closePreview": "Voorvertoon sluiten", "closePreview": "Voorvertoon sluiten",
"files": "Bestanden",
"folders": "Mappen",
"home": "Home", "home": "Home",
"lastModified": "Laatst bewerkt", "lastModified": "Laatst bewerkt",
"loading": "Laden...", "loading": "Laden...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Meerdere items selecteren ingeschakeld", "multipleSelectionEnabled": "Meerdere items selecteren ingeschakeld",
"name": "Naam", "name": "Naam",
"size": "Grootte", "size": "Grootte",
"sortByLastModified": "Sorteren op laatst bewerkt",
"sortByName": "Sorteren op naam", "sortByName": "Sorteren op naam",
"sortBySize": "Sorteren op grootte", "sortBySize": "Sorteren op grootte"
"sortByLastModified": "Sorteren op laatst bewerkt"
}, },
"help": { "help": {
"click": "selecteer bestand of map", "click": "selecteer bestand of map",
@@ -74,18 +76,39 @@
"f2": "bestand herbenoemen", "f2": "bestand herbenoemen",
"help": "Help" "help": "Help"
}, },
"languages": {
"ar": "Arabisch",
"de": "Duits",
"en": "Engels",
"es": "Spaans",
"fr": "Frans",
"is": "",
"it": "Italiaans",
"ja": "Japans",
"ko": "Koreaans",
"nlBE": "",
"pl": "Pools",
"pt": "Portugees",
"ptBR": "Portugees (Brazilië)",
"ro": "",
"ru": "Russisch",
"svSE": "",
"zhCN": "Chinees (vereenvoudigd)",
"zhTW": "Chinees (traditioneel)"
},
"login": { "login": {
"password": "Wachtwoord",
"passwordConfirm": "Wachtwoordbevestiging ",
"submit": "Log in",
"createAnAccount": "Account aanmaken", "createAnAccount": "Account aanmaken",
"loginInstead": "Heeft al een account", "loginInstead": "Heeft al een account",
"password": "Wachtwoord",
"passwordConfirm": "Wachtwoordbevestiging ",
"passwordsDontMatch": "Wachtwoorden komen niet overeen", "passwordsDontMatch": "Wachtwoorden komen niet overeen",
"usernameTaken": "Gebruikersnaam reeds in gebruik",
"signup": "Registeren", "signup": "Registeren",
"submit": "Log in",
"username": "Gebruikersnaam", "username": "Gebruikersnaam",
"usernameTaken": "Gebruikersnaam reeds in gebruik",
"wrongCredentials": "Verkeerde inloggegevens" "wrongCredentials": "Verkeerde inloggegevens"
}, },
"permanent": "Permanent",
"prompts": { "prompts": {
"copy": "Kopiëren", "copy": "Kopiëren",
"copyMessage": "Kies een locatie om uw bestanden te kopiëren: ", "copyMessage": "Kies een locatie om uw bestanden te kopiëren: ",
@@ -102,43 +125,64 @@
"lastModified": "Laatst Bewerkt", "lastModified": "Laatst Bewerkt",
"move": "Verplaatsen", "move": "Verplaatsen",
"moveMessage": "Kies een nieuwe locatie voor je bestand(en)/map(pen)", "moveMessage": "Kies een nieuwe locatie voor je bestand(en)/map(pen)",
"newArchetype": "Maak een nieuw bericht op basis van een archetype. Uw bestand wordt aangemaakt in de inhoudsmap.",
"newDir": "Nieuwe map", "newDir": "Nieuwe map",
"newDirMessage": "Schrijf de naam van de nieuwe map", "newDirMessage": "Schrijf de naam van de nieuwe map",
"newFile": "Nieuw bestand", "newFile": "Nieuw bestand",
"newFileMessage": "Schrijf de naam van het nieuwe bestand", "newFileMessage": "Schrijf de naam van het nieuwe bestand",
"numberDirs": "Aantal mappen", "numberDirs": "Aantal mappen",
"numberFiles": "Aantal bestanden", "numberFiles": "Aantal bestanden",
"replace": "Vervangen",
"replaceMessage": "Een van de bestanden die u probeert te uploaden, geeft conflicten i.v.m. de naamgeving. Wilt u de bestaande bestanden vervangen?\n",
"rename": "Hernoemen", "rename": "Hernoemen",
"renameMessage": "Voer een nieuwe naam in voor", "renameMessage": "Voer een nieuwe naam in voor",
"show": "Tonen", "replace": "Vervangen",
"size": "Grootte", "replaceMessage": "Een van de bestanden die u probeert te uploaden, geeft conflicten i.v.m. de naamgeving. Wilt u de bestaande bestanden vervangen?\n",
"schedule": "Plannen", "schedule": "Plannen",
"scheduleMessage": "Kies een datum en tijd om de publicatie van dit bericht in te plannen.", "scheduleMessage": "Kies een datum en tijd om de publicatie van dit bericht in te plannen.",
"newArchetype": "Maak een nieuw bericht op basis van een archetype. Uw bestand wordt aangemaakt in de inhoudsmap." "show": "Tonen",
"size": "Grootte",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Afbeeldingen",
"music": "Muziek",
"pdf": "PDF",
"pressToSearch": "Druk op enter om te zoeken...",
"search": "Zoeken...",
"typeToSearch": "Typ om te zoeken...",
"types": "Types",
"video": "Video"
}, },
"settings": { "settings": {
"instanceName": "Instantienaam",
"brandingDirectoryPath": "Branding directory path",
"documentation": "Documentatie",
"branding": "Branding",
"disableExternalLinks": "Schakel externe links uit (behalve documentatie)",
"brandingHelp": "U kunt de looks en feels hoe File Browser wordt getoond wijzigen door de naam aan te passen, het logo te vervangen, een aangepast stylesheet toe te voegen en/of de externe links naar GitHub uit te schakelen.\nVoor meer informatie over custom branding, bekijk {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Commando's uitvoeren", "allowCommands": "Commando's uitvoeren",
"allowEdit": "Bestanden of mappen aanpassen, hernoemen of verwijderen", "allowEdit": "Bestanden of mappen aanpassen, hernoemen of verwijderen",
"allowNew": "Nieuwe bestanden of mappen aanmaken", "allowNew": "Nieuwe bestanden of mappen aanmaken",
"allowPublish": "Publiceer nieuwe berichten en pagina's", "allowPublish": "Publiceer nieuwe berichten en pagina's",
"allowSignup": "Sta gebruikers toe om zich te registreren",
"avoidChanges": "(laat leeg om wijzigingen te voorkomen)", "avoidChanges": "(laat leeg om wijzigingen te voorkomen)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "U kunt de looks en feels hoe File Browser wordt getoond wijzigen door de naam aan te passen, het logo te vervangen, een aangepast stylesheet toe te voegen en/of de externe links naar GitHub uit te schakelen.\nVoor meer informatie over custom branding, bekijk {0}.",
"changePassword": "Wijzig Wachtwoord", "changePassword": "Wijzig Wachtwoord",
"commandRunner": "Command runner", "commandRunner": "Command runner",
"commandRunnerHelp": "Hier kunt u opdrachten instellen die worden uitgevoerd in de benoemde gebeurtenissen. U moet er één per regel schrijven. De omgevingsvariabelen {0} en {1} zijn beschikbaar, zijnde {0} relatief ten opzichte van {1}. Raadpleeg {2} voor meer informatie over deze functie en de beschikbare omgevingsvariabelen.", "commandRunnerHelp": "Hier kunt u opdrachten instellen die worden uitgevoerd in de benoemde gebeurtenissen. U moet er één per regel schrijven. De omgevingsvariabelen {0} en {1} zijn beschikbaar, zijnde {0} relatief ten opzichte van {1}. Raadpleeg {2} voor meer informatie over deze functie en de beschikbare omgevingsvariabelen.",
"commandsUpdated": "Commando's bijgewerkt!", "commandsUpdated": "Commando's bijgewerkt!",
"createUserDir": "Maak automatisch een thuismap aan wanneer een nieuwe gebruiker wordt aangemaakt",
"customStylesheet": "Aangepast Stylesheet", "customStylesheet": "Aangepast Stylesheet",
"defaultUserDescription": "Dit zijn de standaardinstellingen voor nieuwe gebruikers.",
"disableExternalLinks": "Schakel externe links uit (behalve documentatie)",
"documentation": "Documentatie",
"examples": "Voorbeelden", "examples": "Voorbeelden",
"executeOnShell": "Uitvoeren in de shell",
"executeOnShellDescription": "File Browser voert de opdrachten standaard uit door hun binaire bestanden rechtstreeks op te roepen. Als u ze in plaats daarvan wilt uitvoeren op een shell (zoals Bash of PowerShell), kunt u dit hier definiëren met de vereiste argumenten en vlaggen. Indien ingesteld, wordt de opdracht die u uitvoert, toegevoegd als een argument. Dit is van toepassing op zowel gebruikersopdrachten als event hooks.",
"globalRules": "Dit is een algemene reeks toegestane en niet toegestane regels. Ze zijn van toepassing op elke gebruiker. U kunt specifieke regels voor de instellingen van elke gebruiker definiëren om deze te overschrijven.",
"globalSettings": "Algemene Instellingen", "globalSettings": "Algemene Instellingen",
"hideDotfiles": "",
"insertPath": "Voeg een pad toe",
"insertRegex": "Regex expressie invoeren",
"instanceName": "Instantienaam",
"language": "Taal", "language": "Taal",
"lockPassword": "Voorkom dat de gebruiker het wachtwoord wijzigt", "lockPassword": "Voorkom dat de gebruiker het wachtwoord wijzigt",
"newPassword": "Uw nieuw wachtwoord", "newPassword": "Uw nieuw wachtwoord",
@@ -146,6 +190,16 @@
"newUser": "Nieuwe gebruiker", "newUser": "Nieuwe gebruiker",
"password": "Wachtwoord", "password": "Wachtwoord",
"passwordUpdated": "Wachtwoord bijgewerkt!", "passwordUpdated": "Wachtwoord bijgewerkt!",
"path": "",
"perm": {
"create": "Bestanden en mappen aanmaken",
"delete": "Bestanden en mappen verwijderen",
"download": "Downloaden",
"execute": "Commando's uitvoeren",
"modify": "Bestanden aanpassen",
"rename": "Bestanden of mappen hernoemen of verplaatsen",
"share": "Bestanden delen"
},
"permissions": "Permissies", "permissions": "Permissies",
"permissionsHelp": "U kunt de gebruiker instellen als beheerder of de machtigingen afzonderlijk kiezen. Als u \"Beheerder\" selecteert, worden alle andere opties automatisch gecontroleerd. Het beheer van gebruikers blijft een privilege van een beheerder.\n", "permissionsHelp": "U kunt de gebruiker instellen als beheerder of de machtigingen afzonderlijk kiezen. Als u \"Beheerder\" selecteert, worden alle andere opties automatisch gecontroleerd. Het beheer van gebruikers blijft een privilege van een beheerder.\n",
"profileSettings": "Profielinstellingen", "profileSettings": "Profielinstellingen",
@@ -155,82 +209,46 @@
"rulesHelp": "Hier kunt u een reeks regels voor toestaan en niet toestaan voor deze specifieke gebruiker definiëren. De geblokkeerde bestanden verschijnen niet in de lijsten en zijn niet toegankelijk voor de gebruiker. We ondersteunen regex en paden relatief ten opzichte van het bereik van gebruikers. \n", "rulesHelp": "Hier kunt u een reeks regels voor toestaan en niet toestaan voor deze specifieke gebruiker definiëren. De geblokkeerde bestanden verschijnen niet in de lijsten en zijn niet toegankelijk voor de gebruiker. We ondersteunen regex en paden relatief ten opzichte van het bereik van gebruikers. \n",
"scope": "Scope", "scope": "Scope",
"settingsUpdated": "Instellingen bijgewerkt!", "settingsUpdated": "Instellingen bijgewerkt!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Gebruiker", "user": "Gebruiker",
"userCommands": "Commando's", "userCommands": "Commando's",
"userCommandsHelp": "Een lijst met beschikbare commando's voor de gebruiker gescheiden door spaties. Voorbeeld: \n", "userCommandsHelp": "Een lijst met beschikbare commando's voor de gebruiker gescheiden door spaties. Voorbeeld: \n",
"userCreated": "Gebruiker aangemaakt!", "userCreated": "Gebruiker aangemaakt!",
"userDefaults": "Standaardinstellingen gebruiker",
"userDeleted": "Gebruiker verwijderd!", "userDeleted": "Gebruiker verwijderd!",
"userManagement": "Gebruikersbeheer", "userManagement": "Gebruikersbeheer",
"username": "Gebruikersnaam",
"users": "Gebruikers",
"globalRules": "Dit is een algemene reeks toegestane en niet toegestane regels. Ze zijn van toepassing op elke gebruiker. U kunt specifieke regels voor de instellingen van elke gebruiker definiëren om deze te overschrijven.",
"allowSignup": "Sta gebruikers toe om zich te registreren",
"createUserDir": "Maak automatisch een thuismap aan wanneer een nieuwe gebruiker wordt aangemaakt",
"insertRegex": "Regex expressie invoeren",
"insertPath": "Voeg een pad toe",
"userUpdated": "Gebruiker bijgewerkt!", "userUpdated": "Gebruiker bijgewerkt!",
"userDefaults": "Standaardinstellingen gebruiker", "username": "Gebruikersnaam",
"defaultUserDescription": "Dit zijn de standaardinstellingen voor nieuwe gebruikers.", "users": "Gebruikers"
"executeOnShell": "Uitvoeren in de shell",
"executeOnShellDescription": "File Browser voert de opdrachten standaard uit door hun binaire bestanden rechtstreeks op te roepen. Als u ze in plaats daarvan wilt uitvoeren op een shell (zoals Bash of PowerShell), kunt u dit hier definiëren met de vereiste argumenten en vlaggen. Indien ingesteld, wordt de opdracht die u uitvoert, toegevoegd als een argument. Dit is van toepassing op zowel gebruikersopdrachten als event hooks.",
"perm": {
"create": "Bestanden en mappen aanmaken",
"delete": "Bestanden en mappen verwijderen",
"download": "Downloaden",
"modify": "Bestanden aanpassen",
"execute": "Commando's uitvoeren",
"rename": "Bestanden of mappen hernoemen of verplaatsen",
"share": "Bestanden delen"
}
}, },
"sidebar": { "sidebar": {
"help": "Help", "help": "Help",
"hugoNew": "Hugo nieuw",
"login": "Log in", "login": "Log in",
"signup": "Registeren",
"logout": "Uitloggen", "logout": "Uitloggen",
"myFiles": "Mijn bestanden", "myFiles": "Mijn bestanden",
"newFile": "Nieuw bestand", "newFile": "Nieuw bestand",
"newFolder": "Nieuwe map", "newFolder": "Nieuwe map",
"preview": "Voorbeeld",
"settings": "Instellingen", "settings": "Instellingen",
"siteSettings": "Site-instellingen", "signup": "Registeren",
"hugoNew": "Hugo nieuw", "siteSettings": "Site-instellingen"
"preview": "Voorbeeld"
}, },
"search": { "success": {
"images": "Afbeeldingen", "linkCopied": "Link gekopieerd!"
"music": "Muziek",
"pdf": "PDF",
"types": "Types",
"video": "Video",
"search": "Zoeken...",
"typeToSearch": "Typ om te zoeken...",
"pressToSearch": "Druk op enter om te zoeken..."
},
"languages": {
"ar": "Arabisch",
"en": "Engels",
"it": "Italiaans",
"fr": "Frans",
"pt": "Portugees",
"ptBR": "Portugees (Brazilië)",
"ja": "Japans",
"zhCN": "Chinees (vereenvoudigd)",
"zhTW": "Chinees (traditioneel)",
"es": "Spaans",
"de": "Duits",
"ru": "Russisch",
"pl": "Pools",
"ko": "Koreaans"
}, },
"time": { "time": {
"unit": "Tijdseenheid", "days": "Dagen",
"seconds": "Seconden",
"minutes": "Minuten",
"hours": "Uren", "hours": "Uren",
"days": "Dagen" "minutes": "Minuten",
}, "seconds": "Seconden",
"download": { "unit": "Tijdseenheid"
"downloadFile": "Bestand downloaden",
"downloadFolder": "Map downloaden"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanent",
"buttons": { "buttons": {
"shell": "Toggle shell",
"cancel": "Anuluj", "cancel": "Anuluj",
"close": "Zamknij", "close": "Zamknij",
"copy": "Kopiuj", "copy": "Kopiuj",
@@ -10,6 +8,7 @@
"create": "Utwórz", "create": "Utwórz",
"delete": "Usuń", "delete": "Usuń",
"download": "Pobierz", "download": "Pobierz",
"hideDotfiles": "",
"info": "Informacja", "info": "Informacja",
"more": "Więce", "more": "Więce",
"move": "Przenieś", "move": "Przenieś",
@@ -17,25 +16,28 @@
"new": "Nowy", "new": "Nowy",
"next": "Następny", "next": "Następny",
"ok": "OK", "ok": "OK",
"replace": "Zamień", "permalink": "Get Permanent Link",
"previous": "Poprzedni", "previous": "Poprzedni",
"publish": "Opublikuj",
"rename": "Zmień Nazwę", "rename": "Zmień Nazwę",
"replace": "Zamień",
"reportIssue": "Zgłoś Problem", "reportIssue": "Zgłoś Problem",
"save": "Zapisz", "save": "Zapisz",
"schedule": "Grafik",
"search": "Szukaj", "search": "Szukaj",
"select": "Wybierz", "select": "Wybierz",
"share": "Udostępnij",
"publish": "Opublikuj",
"selectMultiple": "Zaznacz wiele", "selectMultiple": "Zaznacz wiele",
"schedule": "Grafik", "share": "Udostępnij",
"shell": "Toggle shell",
"switchView": "Zmień widok", "switchView": "Zmień widok",
"toggleSidebar": "Toggle sidebar", "toggleSidebar": "Toggle sidebar",
"update": "Aktualizuj", "update": "Aktualizuj",
"upload": "Upload", "upload": "Upload"
"permalink": "Get Permanent Link"
}, },
"success": { "download": {
"linkCopied": "Link Skopiowany!" "downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "You don't have permissions to access this.", "forbidden": "You don't have permissions to access this.",
@@ -43,11 +45,11 @@
"notFound": "Ten adres nie jest poprawny." "notFound": "Ten adres nie jest poprawny."
}, },
"files": { "files": {
"folders": "Foldery",
"files": "Pliki",
"body": "Body", "body": "Body",
"clear": "Wyczyść", "clear": "Wyczyść",
"closePreview": "Zamknij poprzednie", "closePreview": "Zamknij poprzednie",
"files": "Pliki",
"folders": "Foldery",
"home": "Home", "home": "Home",
"lastModified": "Ostatnio modyfikowane", "lastModified": "Ostatnio modyfikowane",
"loading": "Ładowanie...", "loading": "Ładowanie...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Multiple selection enabled", "multipleSelectionEnabled": "Multiple selection enabled",
"name": "Nazwa", "name": "Nazwa",
"size": "Rozmiar", "size": "Rozmiar",
"sortByLastModified": "Sortuj po dacie modyfikacji",
"sortByName": "Sortuj po nazwie", "sortByName": "Sortuj po nazwie",
"sortBySize": "Sortuj po rozmiarze", "sortBySize": "Sortuj po rozmiarze"
"sortByLastModified": "Sortuj po dacie modyfikacji"
}, },
"help": { "help": {
"click": "wybierz plik lub foler", "click": "wybierz plik lub foler",
@@ -74,18 +76,39 @@
"f2": "zmień nazwę pliku", "f2": "zmień nazwę pliku",
"help": "Pomoc" "help": "Pomoc"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Hasło",
"passwordConfirm": "Password Confirmation",
"submit": "Login",
"createAnAccount": "Create an account", "createAnAccount": "Create an account",
"loginInstead": "Already have an account", "loginInstead": "Already have an account",
"password": "Hasło",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match", "passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup", "signup": "Signup",
"submit": "Login",
"username": "Nazwa użytkownika", "username": "Nazwa użytkownika",
"usernameTaken": "Username already taken",
"wrongCredentials": "Błędne dane logowania" "wrongCredentials": "Błędne dane logowania"
}, },
"permanent": "Permanent",
"prompts": { "prompts": {
"copy": "Kopiuj", "copy": "Kopiuj",
"copyMessage": "Wybierz lokalizację do której mają być skopiowane wybrane pliki", "copyMessage": "Wybierz lokalizację do której mają być skopiowane wybrane pliki",
@@ -102,43 +125,64 @@
"lastModified": "Osatnio Zmodyfikowane", "lastModified": "Osatnio Zmodyfikowane",
"move": "Przenieś", "move": "Przenieś",
"moveMessage": "Wybierz nową lokalizację dla swoich plik(ów)/folder(ów):", "moveMessage": "Wybierz nową lokalizację dla swoich plik(ów)/folder(ów):",
"newArchetype": "Utwórz nowy wpis na bazie wybranego wzorca. Twój plik będzie utworzony w wybranym folderze.",
"newDir": "Nowy folder", "newDir": "Nowy folder",
"newDirMessage": "Podaj nazwę tworzonego folderu.", "newDirMessage": "Podaj nazwę tworzonego folderu.",
"newFile": "Nowy plik", "newFile": "Nowy plik",
"newFileMessage": "Podaj nazwętworzonego pliku.", "newFileMessage": "Podaj nazwętworzonego pliku.",
"numberDirs": "Ilość katalogów", "numberDirs": "Ilość katalogów",
"numberFiles": "Ilość plików", "numberFiles": "Ilość plików",
"replace": "Zamień",
"replaceMessage": "Jednen z plików który próbujesz wrzucić próbje nadpisać plik o tej samej nazwie. Czy chcesz nadpisać poprzedni plik?\n",
"rename": "Zmień nazwę", "rename": "Zmień nazwę",
"renameMessage": "Podaj nową nazwę dla", "renameMessage": "Podaj nową nazwę dla",
"show": "Pokaż", "replace": "Zamień",
"size": "Rozmiar", "replaceMessage": "Jednen z plików który próbujesz wrzucić próbje nadpisać plik o tej samej nazwie. Czy chcesz nadpisać poprzedni plik?\n",
"schedule": "Grafi", "schedule": "Grafi",
"scheduleMessage": "Wybierz datę i czas dla publikacji tego wpisu.", "scheduleMessage": "Wybierz datę i czas dla publikacji tego wpisu.",
"newArchetype": "Utwórz nowy wpis na bazie wybranego wzorca. Twój plik będzie utworzony w wybranym folderze." "show": "Pokaż",
"size": "Rozmiar",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Zdjęcia",
"music": "Muzyka",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "Szukaj...",
"typeToSearch": "Type to search...",
"types": "Typy",
"video": "Video"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Wykonaj polecenie", "allowCommands": "Wykonaj polecenie",
"allowEdit": "Edycja, zmiana nazwy i usuniecie plików lub folderów", "allowEdit": "Edycja, zmiana nazwy i usuniecie plików lub folderów",
"allowNew": "Tworzenie nowych plików lub folderów", "allowNew": "Tworzenie nowych plików lub folderów",
"allowPublish": "Tworzenie nowych wpisów i stron", "allowPublish": "Tworzenie nowych wpisów i stron",
"allowSignup": "Allow users to signup",
"avoidChanges": "(pozostaw puste aby nie zosatało zmienione)", "avoidChanges": "(pozostaw puste aby nie zosatało zmienione)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "Zmień Hasło", "changePassword": "Zmień Hasło",
"commandRunner": "Command runner", "commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "Polecenie zaktualizowane!", "commandsUpdated": "Polecenie zaktualizowane!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "Własny Stylesheet", "customStylesheet": "Własny Stylesheet",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"documentation": "documentation",
"examples": "Przykłady", "examples": "Przykłady",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"globalSettings": "Ustawienia Globalne", "globalSettings": "Ustawienia Globalne",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"language": "Język", "language": "Język",
"lockPassword": "Zablokuj użytkownikowi możliwość zmiany hasła", "lockPassword": "Zablokuj użytkownikowi możliwość zmiany hasła",
"newPassword": "Twoje nowe hasło", "newPassword": "Twoje nowe hasło",
@@ -146,6 +190,16 @@
"newUser": "Nowy Użytkownik", "newUser": "Nowy Użytkownik",
"password": "Hasło", "password": "Hasło",
"passwordUpdated": "Hasło zostało zapisane!", "passwordUpdated": "Hasło zostało zapisane!",
"path": "",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
},
"permissions": "Uprawnienia", "permissions": "Uprawnienia",
"permissionsHelp": "You can set the user to be an administrator or choose the permissions individually. If you select \"Administrator\", all of the other options will be automatically checked. The management of users remains a privilege of an administrator.\n", "permissionsHelp": "You can set the user to be an administrator or choose the permissions individually. If you select \"Administrator\", all of the other options will be automatically checked. The management of users remains a privilege of an administrator.\n",
"profileSettings": "Twój profil", "profileSettings": "Twój profil",
@@ -155,82 +209,46 @@
"rulesHelp": "Here you can define a set of allow and disallow rules for this specific user. The blocked files won't show up in the listings and they wont be accessible to the user. We support regex and paths relative to the users scope.\n", "rulesHelp": "Here you can define a set of allow and disallow rules for this specific user. The blocked files won't show up in the listings and they wont be accessible to the user. We support regex and paths relative to the users scope.\n",
"scope": "Scope", "scope": "Scope",
"settingsUpdated": "Uprawnienia Zapisane!", "settingsUpdated": "Uprawnienia Zapisane!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Użytkownik", "user": "Użytkownik",
"userCommands": "Polecenia", "userCommands": "Polecenia",
"userCommandsHelp": "A space separated list with the available commands for this user. Example:\n", "userCommandsHelp": "A space separated list with the available commands for this user. Example:\n",
"userCreated": "Użytkownik zapisany!", "userCreated": "Użytkownik zapisany!",
"userDefaults": "User default settings",
"userDeleted": "Użytkownik usunięty!", "userDeleted": "Użytkownik usunięty!",
"userManagement": "Zarządzanie użytkownikami", "userManagement": "Zarządzanie użytkownikami",
"username": "Nazwa użytkownika",
"users": "Użytkownicy",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Użytkownik zapisany!", "userUpdated": "Użytkownik zapisany!",
"userDefaults": "User default settings", "username": "Nazwa użytkownika",
"defaultUserDescription": "This are the default settings for new users.", "users": "Użytkownicy"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"modify": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
}, },
"sidebar": { "sidebar": {
"help": "Pomoc", "help": "Pomoc",
"hugoNew": "Hugo New",
"login": "Login", "login": "Login",
"signup": "Signup",
"logout": "Wyloguj", "logout": "Wyloguj",
"myFiles": "Moje pliki", "myFiles": "Moje pliki",
"newFile": "Nowy plik", "newFile": "Nowy plik",
"newFolder": "Nowy folder", "newFolder": "Nowy folder",
"preview": "Podgląd",
"settings": "Ustawienia", "settings": "Ustawienia",
"siteSettings": "Ustawienia Strony", "signup": "Signup",
"hugoNew": "Hugo New", "siteSettings": "Ustawienia Strony"
"preview": "Podgląd"
}, },
"search": { "success": {
"images": "Zdjęcia", "linkCopied": "Link Skopiowany!"
"music": "Muzyka",
"pdf": "PDF",
"types": "Typy",
"video": "Video",
"search": "Szukaj...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Jednostka czasu", "days": "Dni",
"seconds": "Sekundy",
"minutes": "Minuty",
"hours": "Godziny", "hours": "Godziny",
"days": "Dni" "minutes": "Minuty",
}, "seconds": "Sekundy",
"download": { "unit": "Jednostka czasu"
"downloadFile": "Download File",
"downloadFolder": "Download Folder"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanente",
"buttons": { "buttons": {
"shell": "Toggle shell",
"cancel": "Cancelar", "cancel": "Cancelar",
"close": "Fechar", "close": "Fechar",
"copy": "Copiar", "copy": "Copiar",
@@ -10,6 +8,7 @@
"create": "Criar", "create": "Criar",
"delete": "Deletar", "delete": "Deletar",
"download": "Baixar", "download": "Baixar",
"hideDotfiles": "",
"info": "Informações", "info": "Informações",
"more": "Mais", "more": "Mais",
"move": "Mover", "move": "Mover",
@@ -17,25 +16,28 @@
"new": "Novo", "new": "Novo",
"next": "Próximo", "next": "Próximo",
"ok": "Ok", "ok": "Ok",
"replace": "Substituir", "permalink": "Obter link permanente",
"previous": "Anterior", "previous": "Anterior",
"publish": "Publicar",
"rename": "Renomear", "rename": "Renomear",
"replace": "Substituir",
"reportIssue": "Reportar erro", "reportIssue": "Reportar erro",
"save": "Salvar", "save": "Salvar",
"schedule": "Agendar",
"search": "Pesquisar", "search": "Pesquisar",
"select": "Selecionar", "select": "Selecionar",
"share": "Compartilhar",
"publish": "Publicar",
"selectMultiple": "Selecionar múltiplos", "selectMultiple": "Selecionar múltiplos",
"schedule": "Agendar", "share": "Compartilhar",
"shell": "Toggle shell",
"switchView": "Alterar modo de visão", "switchView": "Alterar modo de visão",
"toggleSidebar": "Alternar barra lateral", "toggleSidebar": "Alternar barra lateral",
"update": "Atualizar", "update": "Atualizar",
"upload": "Enviar", "upload": "Enviar"
"permalink": "Obter link permanente"
}, },
"success": { "download": {
"linkCopied": "Link copiado!" "downloadFile": "Baixar arquivo",
"downloadFolder": "Baixar pasta",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "You don't have permissions to access this.", "forbidden": "You don't have permissions to access this.",
@@ -43,11 +45,11 @@
"notFound": "Ops! Nada foi encontrado." "notFound": "Ops! Nada foi encontrado."
}, },
"files": { "files": {
"folders": "Pastas",
"files": "Arquivos",
"body": "Corpo", "body": "Corpo",
"clear": "Limpar", "clear": "Limpar",
"closePreview": "Fechar pré-visualização", "closePreview": "Fechar pré-visualização",
"files": "Arquivos",
"folders": "Pastas",
"home": "Início", "home": "Início",
"lastModified": "Última modificação", "lastModified": "Última modificação",
"loading": "Carregando. Aguarde, por favor.", "loading": "Carregando. Aguarde, por favor.",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Seleção múltipla ativada", "multipleSelectionEnabled": "Seleção múltipla ativada",
"name": "Nome", "name": "Nome",
"size": "Tamanho", "size": "Tamanho",
"sortByLastModified": "Ordenar pela última modificação",
"sortByName": "Ordenar pelo nome", "sortByName": "Ordenar pelo nome",
"sortBySize": "Ordenar pelo tamanho", "sortBySize": "Ordenar pelo tamanho"
"sortByLastModified": "Ordenar pela última modificação"
}, },
"help": { "help": {
"click": "selecionar pasta ou arquivo", "click": "selecionar pasta ou arquivo",
@@ -74,18 +76,39 @@
"f2": "renomear arquivo", "f2": "renomear arquivo",
"help": "Ajuda" "help": "Ajuda"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Senha",
"passwordConfirm": "Password Confirmation",
"submit": "Login",
"createAnAccount": "Create an account", "createAnAccount": "Create an account",
"loginInstead": "Already have an account", "loginInstead": "Already have an account",
"password": "Senha",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match", "passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup", "signup": "Signup",
"submit": "Login",
"username": "Nome do usuário", "username": "Nome do usuário",
"usernameTaken": "Username already taken",
"wrongCredentials": "Ops! Dados incorretos." "wrongCredentials": "Ops! Dados incorretos."
}, },
"permanent": "Permanente",
"prompts": { "prompts": {
"copy": "Copiar", "copy": "Copiar",
"copyMessage": "Escolha um lugar para copiar os arquivos:", "copyMessage": "Escolha um lugar para copiar os arquivos:",
@@ -102,43 +125,64 @@
"lastModified": "Última modificação", "lastModified": "Última modificação",
"move": "Mover", "move": "Mover",
"moveMessage": "Escolha uma nova pasta para os seus arquivos:", "moveMessage": "Escolha uma nova pasta para os seus arquivos:",
"newArchetype": "Criar um novo post baseado num \"archetype\". O seu arquivo será criado na pasta \"content\".",
"newDir": "Nova pasta", "newDir": "Nova pasta",
"newDirMessage": "Escreva o nome da nova pasta.", "newDirMessage": "Escreva o nome da nova pasta.",
"newFile": "Novo arquivo", "newFile": "Novo arquivo",
"newFileMessage": "Escreva o nome do novo arquivo.", "newFileMessage": "Escreva o nome do novo arquivo.",
"numberDirs": "Número de pastas", "numberDirs": "Número de pastas",
"numberFiles": "Número de arquivos", "numberFiles": "Número de arquivos",
"replace": "Substituir",
"replaceMessage": "Já existe um arquivo com nome igual a um dos que está tentando enviar. Deseja substituir?\n",
"rename": "Renomear", "rename": "Renomear",
"renameMessage": "Insira um novo nome para", "renameMessage": "Insira um novo nome para",
"show": "Mostrar", "replace": "Substituir",
"size": "Tamanho", "replaceMessage": "Já existe um arquivo com nome igual a um dos que está tentando enviar. Deseja substituir?\n",
"schedule": "Agendar", "schedule": "Agendar",
"scheduleMessage": "Escolha uma data para publicar este post.", "scheduleMessage": "Escolha uma data para publicar este post.",
"newArchetype": "Criar um novo post baseado num \"archetype\". O seu arquivo será criado na pasta \"content\"." "show": "Mostrar",
"size": "Tamanho",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Imagens",
"music": "Música",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "Pesquise...",
"typeToSearch": "Type to search...",
"types": "Tipos",
"video": "Vídeos"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentação",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrador", "administrator": "Administrador",
"allowCommands": "Executar comandos", "allowCommands": "Executar comandos",
"allowEdit": "Editar, renomear e deletar arquivos ou pastas", "allowEdit": "Editar, renomear e deletar arquivos ou pastas",
"allowNew": "Criar novos arquivos e pastas", "allowNew": "Criar novos arquivos e pastas",
"allowPublish": "Publicar novas páginas e conteúdos", "allowPublish": "Publicar novas páginas e conteúdos",
"allowSignup": "Allow users to signup",
"avoidChanges": "(deixe em branco para manter)", "avoidChanges": "(deixe em branco para manter)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "Alterar senha", "changePassword": "Alterar senha",
"commandRunner": "Command runner", "commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "Comandos atualizados!", "commandsUpdated": "Comandos atualizados!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "Estilos personalizados", "customStylesheet": "Estilos personalizados",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"documentation": "documentação",
"examples": "Exemplos", "examples": "Exemplos",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"globalSettings": "Configurações globais", "globalSettings": "Configurações globais",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Inserir expressão regular",
"instanceName": "Instance name",
"language": "Linguagem", "language": "Linguagem",
"lockPassword": "Não permitir que o usuário altere a senha", "lockPassword": "Não permitir que o usuário altere a senha",
"newPassword": "Nova senha", "newPassword": "Nova senha",
@@ -146,6 +190,16 @@
"newUser": "Novo usuário", "newUser": "Novo usuário",
"password": "Senha", "password": "Senha",
"passwordUpdated": "Senha atualizada!", "passwordUpdated": "Senha atualizada!",
"path": "",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Baixar",
"execute": "Execute commands",
"modify": "Editar arquivos",
"rename": "Rename or move files and directories",
"share": "Compartilhar arquivos"
},
"permissions": "Permissões", "permissions": "Permissões",
"permissionsHelp": "Pode definir o usuário como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos usuários é um privilégio restringido aos administradores.\n", "permissionsHelp": "Pode definir o usuário como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos usuários é um privilégio restringido aos administradores.\n",
"profileSettings": "Configurações do usuário", "profileSettings": "Configurações do usuário",
@@ -155,82 +209,46 @@
"rulesHelp": "Aqui pode definir um conjunto de regras para permitir ou bloquear o acesso do utilizador a determinados arquivos ou pastas. Os arquivos bloqueados não irão aparecer durante a navegação. Suportamos expressões regulares e os caminhos dos arquivos devem ser relativos à base do usuário.\n", "rulesHelp": "Aqui pode definir um conjunto de regras para permitir ou bloquear o acesso do utilizador a determinados arquivos ou pastas. Os arquivos bloqueados não irão aparecer durante a navegação. Suportamos expressões regulares e os caminhos dos arquivos devem ser relativos à base do usuário.\n",
"scope": "Base", "scope": "Base",
"settingsUpdated": "Configurações atualizadas!", "settingsUpdated": "Configurações atualizadas!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Usuário", "user": "Usuário",
"userCommands": "Comandos", "userCommands": "Comandos",
"userCommandsHelp": "Uma lista, separada com espaços, de comandos disponíveis para este usuário. Exemplo:", "userCommandsHelp": "Uma lista, separada com espaços, de comandos disponíveis para este usuário. Exemplo:",
"userCreated": "Usuário criado!", "userCreated": "Usuário criado!",
"userDefaults": "User default settings",
"userDeleted": "Usuário eliminado!", "userDeleted": "Usuário eliminado!",
"userManagement": "Gestão de usuários", "userManagement": "Gestão de usuários",
"username": "Nome do usuário",
"users": "Usuários",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Inserir expressão regular",
"insertPath": "Insert the path",
"userUpdated": "Usuário atualizado!", "userUpdated": "Usuário atualizado!",
"userDefaults": "User default settings", "username": "Nome do usuário",
"defaultUserDescription": "This are the default settings for new users.", "users": "Usuários"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Baixar",
"modify": "Editar arquivos",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Compartilhar arquivos"
}
}, },
"sidebar": { "sidebar": {
"help": "Ajuda", "help": "Ajuda",
"hugoNew": "Hugo New",
"login": "Login", "login": "Login",
"signup": "Signup",
"logout": "Sair", "logout": "Sair",
"myFiles": "Arquivos", "myFiles": "Arquivos",
"newFile": "Novo arquivo", "newFile": "Novo arquivo",
"newFolder": "Nova pasta", "newFolder": "Nova pasta",
"preview": "Pré-visualizar",
"settings": "Configurações", "settings": "Configurações",
"siteSettings": "Configurações do site", "signup": "Signup",
"hugoNew": "Hugo New", "siteSettings": "Configurações do site"
"preview": "Pré-visualizar"
}, },
"search": { "success": {
"images": "Imagens", "linkCopied": "Link copiado!"
"music": "Música",
"pdf": "PDF",
"types": "Tipos",
"video": "Vídeos",
"search": "Pesquise...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Unidades de Tempo", "days": "Dias",
"seconds": "Segundos",
"minutes": "Minutos",
"hours": "Horas", "hours": "Horas",
"days": "Dias" "minutes": "Minutos",
}, "seconds": "Segundos",
"download": { "unit": "Unidades de Tempo"
"downloadFile": "Baixar arquivo",
"downloadFolder": "Baixar pasta"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanente",
"buttons": { "buttons": {
"shell": "Alternar shell",
"cancel": "Cancelar", "cancel": "Cancelar",
"close": "Fechar", "close": "Fechar",
"copy": "Copiar", "copy": "Copiar",
@@ -10,6 +8,7 @@
"create": "Criar", "create": "Criar",
"delete": "Eliminar", "delete": "Eliminar",
"download": "Descarregar", "download": "Descarregar",
"hideDotfiles": "",
"info": "Info", "info": "Info",
"more": "Mais", "more": "Mais",
"move": "Mover", "move": "Mover",
@@ -17,25 +16,28 @@
"new": "Novo", "new": "Novo",
"next": "Próximo", "next": "Próximo",
"ok": "OK", "ok": "OK",
"replace": "Substituir", "permalink": "Obter link permanente",
"previous": "Anterior", "previous": "Anterior",
"publish": "Publicar",
"rename": "Alterar nome", "rename": "Alterar nome",
"replace": "Substituir",
"reportIssue": "Reportar erro", "reportIssue": "Reportar erro",
"save": "Guardar", "save": "Guardar",
"schedule": "Agendar",
"search": "Pesquisar", "search": "Pesquisar",
"select": "Selecionar", "select": "Selecionar",
"share": "Partilhar",
"publish": "Publicar",
"selectMultiple": "Selecionar vários", "selectMultiple": "Selecionar vários",
"schedule": "Agendar", "share": "Partilhar",
"shell": "Alternar shell",
"switchView": "Alterar vista", "switchView": "Alterar vista",
"toggleSidebar": "Alternar barra lateral", "toggleSidebar": "Alternar barra lateral",
"update": "Atualizar", "update": "Atualizar",
"upload": "Enviar", "upload": "Enviar"
"permalink": "Obter link permanente"
}, },
"success": { "download": {
"linkCopied": "Link copiado!" "downloadFile": "Descarregar ficheiro",
"downloadFolder": "Descarregar pasta",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "Não tem permissões para aceder a isto", "forbidden": "Não tem permissões para aceder a isto",
@@ -43,11 +45,11 @@
"notFound": "Esta localização não é alcançável." "notFound": "Esta localização não é alcançável."
}, },
"files": { "files": {
"folders": "Pastas",
"files": "Ficheiros",
"body": "Corpo", "body": "Corpo",
"clear": "Limpar", "clear": "Limpar",
"closePreview": "Fechar pré-visualização", "closePreview": "Fechar pré-visualização",
"files": "Ficheiros",
"folders": "Pastas",
"home": "Início", "home": "Início",
"lastModified": "Última alteração", "lastModified": "Última alteração",
"loading": "A carregar...", "loading": "A carregar...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Seleção múltipla ativada", "multipleSelectionEnabled": "Seleção múltipla ativada",
"name": "Nome", "name": "Nome",
"size": "Tamanho", "size": "Tamanho",
"sortByLastModified": "Ordenar pela última alteração",
"sortByName": "Ordenar pelo nome", "sortByName": "Ordenar pelo nome",
"sortBySize": "Ordenar pelo tamanho", "sortBySize": "Ordenar pelo tamanho"
"sortByLastModified": "Ordenar pela última alteração"
}, },
"help": { "help": {
"click": "selecionar pasta ou ficheiro", "click": "selecionar pasta ou ficheiro",
@@ -74,18 +76,39 @@
"f2": "alterar nome do ficheiro", "f2": "alterar nome do ficheiro",
"help": "Ajuda" "help": "Ajuda"
}, },
"languages": {
"ar": "Árabe",
"de": "Alemão",
"en": "Inglês",
"es": "Espanhol",
"fr": "Francês",
"is": "",
"it": "Italiano",
"ja": "Japonês",
"ko": "Coreano",
"nlBE": "",
"pl": "Polaco",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Russo",
"svSE": "",
"zhCN": "Chinês simplificado",
"zhTW": "Chinês tradicional"
},
"login": { "login": {
"password": "Palavra-passe",
"passwordConfirm": "Confirmação da palavra-passe",
"submit": "Entrar na conta",
"createAnAccount": "Criar uma conta", "createAnAccount": "Criar uma conta",
"loginInstead": "Já tenho uma conta", "loginInstead": "Já tenho uma conta",
"password": "Palavra-passe",
"passwordConfirm": "Confirmação da palavra-passe",
"passwordsDontMatch": "As palavras-passe não coincidem", "passwordsDontMatch": "As palavras-passe não coincidem",
"usernameTaken": "O nome de utilizador já está registado",
"signup": "Registar", "signup": "Registar",
"submit": "Entrar na conta",
"username": "Nome de utilizador", "username": "Nome de utilizador",
"usernameTaken": "O nome de utilizador já está registado",
"wrongCredentials": "Dados errados" "wrongCredentials": "Dados errados"
}, },
"permanent": "Permanente",
"prompts": { "prompts": {
"copy": "Copiar", "copy": "Copiar",
"copyMessage": "Escolha um lugar para onde copiar os ficheiros:", "copyMessage": "Escolha um lugar para onde copiar os ficheiros:",
@@ -102,43 +125,64 @@
"lastModified": "Última alteração", "lastModified": "Última alteração",
"move": "Mover", "move": "Mover",
"moveMessage": "Escolha uma nova casa para os seus ficheiros/pastas:", "moveMessage": "Escolha uma nova casa para os seus ficheiros/pastas:",
"newArchetype": "Criar um novo post baseado num \"archetype\". O seu ficheiro será criado na pasta \"content\".",
"newDir": "Nova pasta", "newDir": "Nova pasta",
"newDirMessage": "Escreva o nome da nova pasta.", "newDirMessage": "Escreva o nome da nova pasta.",
"newFile": "Novo ficheiro", "newFile": "Novo ficheiro",
"newFileMessage": "Escreva o nome do novo ficheiro.", "newFileMessage": "Escreva o nome do novo ficheiro.",
"numberDirs": "Número de pastas", "numberDirs": "Número de pastas",
"numberFiles": "Número de ficheiros", "numberFiles": "Número de ficheiros",
"replace": "Substituir",
"replaceMessage": "Já existe um ficheiro com nome igual a um dos que está a tentar enviar. Quer substituí-lo?\n",
"rename": "Alterar nome", "rename": "Alterar nome",
"renameMessage": "Insira um novo nome para", "renameMessage": "Insira um novo nome para",
"show": "Mostrar", "replace": "Substituir",
"size": "Tamanho", "replaceMessage": "Já existe um ficheiro com nome igual a um dos que está a tentar enviar. Quer substituí-lo?\n",
"schedule": "Agendar", "schedule": "Agendar",
"scheduleMessage": "Escolha uma data para publicar este post.", "scheduleMessage": "Escolha uma data para publicar este post.",
"newArchetype": "Criar um novo post baseado num \"archetype\". O seu ficheiro será criado na pasta \"content\"." "show": "Mostrar",
"size": "Tamanho",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Imagens",
"music": "Música",
"pdf": "PDF",
"pressToSearch": "Tecla Enter para pesquisar...",
"search": "Pesquisar...",
"typeToSearch": "Escrever para pesquisar...",
"types": "Tipos",
"video": "Vídeos"
}, },
"settings": { "settings": {
"instanceName": "Nome da instância",
"brandingDirectoryPath": "Caminho da pasta de marca",
"documentation": "documentação",
"branding": "Marca",
"disableExternalLinks": "Desativar links externos (exceto documentação)",
"brandingHelp": "Pode personalizar a aparência do seu Navegador de Ficheiros, alterar o nome, substituindo o logótipo, adicionando estilos personalizados e mesmo desativando links externos para o GitHub.\nPara mais informações sobre marca personalizada, por favor veja {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrador", "administrator": "Administrador",
"allowCommands": "Executar comandos", "allowCommands": "Executar comandos",
"allowEdit": "Editar, renomear e eliminar ficheiros ou pastas", "allowEdit": "Editar, renomear e eliminar ficheiros ou pastas",
"allowNew": "Criar novos ficheiros e pastas", "allowNew": "Criar novos ficheiros e pastas",
"allowPublish": "Publicar novas páginas e conteúdos", "allowPublish": "Publicar novas páginas e conteúdos",
"allowSignup": "Permitir que os utilizadores criem contas",
"avoidChanges": "(deixe em branco para manter)", "avoidChanges": "(deixe em branco para manter)",
"branding": "Marca",
"brandingDirectoryPath": "Caminho da pasta de marca",
"brandingHelp": "Pode personalizar a aparência do seu Navegador de Ficheiros, alterar o nome, substituindo o logótipo, adicionando estilos personalizados e mesmo desativando links externos para o GitHub.\nPara mais informações sobre marca personalizada, por favor veja {0}.",
"changePassword": "Alterar palavra-passe", "changePassword": "Alterar palavra-passe",
"commandRunner": "Execução de comandos", "commandRunner": "Execução de comandos",
"commandRunnerHelp": "Aqui pode definir comandos que são executados nos eventos nomeados. Tem de escrever um por linha. As variáveis de ambiente {0} e {1} estarão disponíveis, sendo {0} relativo a {1}. Para mais informações sobre esta funcionalidade e as variáveis de ambiente, veja {2}.", "commandRunnerHelp": "Aqui pode definir comandos que são executados nos eventos nomeados. Tem de escrever um por linha. As variáveis de ambiente {0} e {1} estarão disponíveis, sendo {0} relativo a {1}. Para mais informações sobre esta funcionalidade e as variáveis de ambiente, veja {2}.",
"commandsUpdated": "Comandos atualizados!", "commandsUpdated": "Comandos atualizados!",
"createUserDir": "Criar automaticamente a pasta de início ao adicionar um novo utilizador",
"customStylesheet": "Folha de estilos personalizada", "customStylesheet": "Folha de estilos personalizada",
"defaultUserDescription": "Estas são as configurações padrão para novos utilizadores.",
"disableExternalLinks": "Desativar links externos (exceto documentação)",
"documentation": "documentação",
"examples": "Exemplos", "examples": "Exemplos",
"executeOnShell": "Executar na shell",
"executeOnShellDescription": "Por padrão, o Navegador de Ficheiros executa os comandos chamando os seus binários diretamente. Se em vez disso, quiser executá-los numa shell (como Bash ou PowerShell), pode definir isso aqui com os argumentos e bandeiras necessários. Se definido, o comando que executa será anexado como um argumento. Isto aplica-se tanto a comandos do utilizador como a hooks de eventos.",
"globalRules": "Isto é um conjunto global de regras de permissão e negação. Elas aplicam-se a todos os utilizadores. Pode especificar regras específicas para cada configuração do utilizador para sobreporem-se a estas.",
"globalSettings": "Configurações globais", "globalSettings": "Configurações globais",
"hideDotfiles": "",
"insertPath": "Inserir o caminho",
"insertRegex": "Inserir expressão regular",
"instanceName": "Nome da instância",
"language": "Linguagem", "language": "Linguagem",
"lockPassword": "Não permitir que o utilizador altere a palavra-passe", "lockPassword": "Não permitir que o utilizador altere a palavra-passe",
"newPassword": "Nova palavra-passe", "newPassword": "Nova palavra-passe",
@@ -146,6 +190,16 @@
"newUser": "Novo utilizador", "newUser": "Novo utilizador",
"password": "Palavra-passe", "password": "Palavra-passe",
"passwordUpdated": "Palavra-passe atualizada!", "passwordUpdated": "Palavra-passe atualizada!",
"path": "",
"perm": {
"create": "Criar ficheiros e pastas",
"delete": "Eliminar ficheiros e pastas",
"download": "Descarregar",
"execute": "Executar comandos",
"modify": "Editar ficheiros",
"rename": "Alterar o nome ou mover ficheiros e pastas",
"share": "Partilhar ficheiros"
},
"permissions": "Permissões", "permissions": "Permissões",
"permissionsHelp": "Pode definir o utilizador como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos utilizadores é um privilégio restringido aos administradores.\n", "permissionsHelp": "Pode definir o utilizador como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos utilizadores é um privilégio restringido aos administradores.\n",
"profileSettings": "Configurações do utilizador", "profileSettings": "Configurações do utilizador",
@@ -155,82 +209,46 @@
"rulesHelp": "Aqui pode definir um conjunto de regras para permitir ou bloquear o acesso do utilizador a determinados ficheiros ou pastas. Os ficheiros bloqueados não irão aparecer durante a navegação. Suportamos expressões regulares e os caminhos dos ficheiros devem ser relativos à base do utilizador.\n", "rulesHelp": "Aqui pode definir um conjunto de regras para permitir ou bloquear o acesso do utilizador a determinados ficheiros ou pastas. Os ficheiros bloqueados não irão aparecer durante a navegação. Suportamos expressões regulares e os caminhos dos ficheiros devem ser relativos à base do utilizador.\n",
"scope": "Base", "scope": "Base",
"settingsUpdated": "Configurações atualizadas!", "settingsUpdated": "Configurações atualizadas!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Utilizador", "user": "Utilizador",
"userCommands": "Comandos", "userCommands": "Comandos",
"userCommandsHelp": "Uma lista, separada com espaços, de comandos disponíveis para este utilizados. Exemplo:", "userCommandsHelp": "Uma lista, separada com espaços, de comandos disponíveis para este utilizados. Exemplo:",
"userCreated": "Utilizador criado!", "userCreated": "Utilizador criado!",
"userDefaults": "Configurações padrão do utilizador",
"userDeleted": "Utilizador eliminado!", "userDeleted": "Utilizador eliminado!",
"userManagement": "Gestão de utilizadores", "userManagement": "Gestão de utilizadores",
"username": "Nome de utilizador",
"users": "Utilizadores",
"globalRules": "Isto é um conjunto global de regras de permissão e negação. Elas aplicam-se a todos os utilizadores. Pode especificar regras específicas para cada configuração do utilizador para sobreporem-se a estas.",
"allowSignup": "Permitir que os utilizadores criem contas",
"createUserDir": "Criar automaticamente a pasta de início ao adicionar um novo utilizador",
"insertRegex": "Inserir expressão regular",
"insertPath": "Inserir o caminho",
"userUpdated": "Utilizador atualizado!", "userUpdated": "Utilizador atualizado!",
"userDefaults": "Configurações padrão do utilizador", "username": "Nome de utilizador",
"defaultUserDescription": "Estas são as configurações padrão para novos utilizadores.", "users": "Utilizadores"
"executeOnShell": "Executar na shell",
"executeOnShellDescription": "Por padrão, o Navegador de Ficheiros executa os comandos chamando os seus binários diretamente. Se em vez disso, quiser executá-los numa shell (como Bash ou PowerShell), pode definir isso aqui com os argumentos e bandeiras necessários. Se definido, o comando que executa será anexado como um argumento. Isto aplica-se tanto a comandos do utilizador como a hooks de eventos.",
"perm": {
"create": "Criar ficheiros e pastas",
"delete": "Eliminar ficheiros e pastas",
"download": "Descarregar",
"modify": "Editar ficheiros",
"execute": "Executar comandos",
"rename": "Alterar o nome ou mover ficheiros e pastas",
"share": "Partilhar ficheiros"
}
}, },
"sidebar": { "sidebar": {
"help": "Ajuda", "help": "Ajuda",
"hugoNew": "Hugo New",
"login": "Entrar", "login": "Entrar",
"signup": "Registar",
"logout": "Sair", "logout": "Sair",
"myFiles": "Meus ficheiros", "myFiles": "Meus ficheiros",
"newFile": "Novo ficheiro", "newFile": "Novo ficheiro",
"newFolder": "Nova pasta", "newFolder": "Nova pasta",
"preview": "Pré-visualizar",
"settings": "Configurações", "settings": "Configurações",
"siteSettings": "Configurações do site", "signup": "Registar",
"hugoNew": "Hugo New", "siteSettings": "Configurações do site"
"preview": "Pré-visualizar"
}, },
"search": { "success": {
"images": "Imagens", "linkCopied": "Link copiado!"
"music": "Música",
"pdf": "PDF",
"types": "Tipos",
"video": "Vídeos",
"search": "Pesquisar...",
"typeToSearch": "Escrever para pesquisar...",
"pressToSearch": "Tecla Enter para pesquisar..."
},
"languages": {
"ar": "Árabe",
"en": "Inglês",
"it": "Italiano",
"fr": "Francês",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "Japonês",
"zhCN": "Chinês simplificado",
"zhTW": "Chinês tradicional",
"es": "Espanhol",
"de": "Alemão",
"ru": "Russo",
"pl": "Polaco",
"ko": "Coreano"
}, },
"time": { "time": {
"unit": "Unidades de tempo", "days": "Dias",
"seconds": "Segundos",
"minutes": "Minutos",
"hours": "Horas", "hours": "Horas",
"days": "Dias" "minutes": "Minutos",
}, "seconds": "Segundos",
"download": { "unit": "Unidades de tempo"
"downloadFile": "Descarregar ficheiro",
"downloadFolder": "Descarregar pasta"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanent",
"buttons": { "buttons": {
"shell": "Comută linia de comandă",
"cancel": "Anulează", "cancel": "Anulează",
"close": "Închide", "close": "Închide",
"copy": "Copiază", "copy": "Copiază",
@@ -10,6 +8,7 @@
"create": "Crează", "create": "Crează",
"delete": "Șterge", "delete": "Șterge",
"download": "Descarcă", "download": "Descarcă",
"hideDotfiles": "",
"info": "Info", "info": "Info",
"more": "Mai mult", "more": "Mai mult",
"move": "Mută", "move": "Mută",
@@ -17,25 +16,28 @@
"new": "Nou", "new": "Nou",
"next": "Următor", "next": "Următor",
"ok": "OK", "ok": "OK",
"replace": "Înlocuiește", "permalink": "Obține legătura permanentă",
"previous": "Precedent", "previous": "Precedent",
"publish": "Puplică",
"rename": "Redenumește", "rename": "Redenumește",
"replace": "Înlocuiește",
"reportIssue": "Raportează problemă", "reportIssue": "Raportează problemă",
"save": "Salvează", "save": "Salvează",
"schedule": "Programare",
"search": "Caută", "search": "Caută",
"select": "Selectează", "select": "Selectează",
"share": "Distribuie",
"publish": "Puplică",
"selectMultiple": "Selecție multiplă", "selectMultiple": "Selecție multiplă",
"schedule": "Programare", "share": "Distribuie",
"shell": "Comută linia de comandă",
"switchView": "Schimba vizualizarea", "switchView": "Schimba vizualizarea",
"toggleSidebar": "Comută bara laterală", "toggleSidebar": "Comută bara laterală",
"update": "Actualizează", "update": "Actualizează",
"upload": "Încarcă", "upload": "Încarcă"
"permalink": "Obține legătura permanentă"
}, },
"success": { "download": {
"linkCopied": "Legătură copiată!" "downloadFile": "Descarcă fișier",
"downloadFolder": "Descarcă director",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "Nu ai permisiuni sa accesezi asta.", "forbidden": "Nu ai permisiuni sa accesezi asta.",
@@ -43,11 +45,11 @@
"notFound": "Aceasta locație nu poate fi accesată." "notFound": "Aceasta locație nu poate fi accesată."
}, },
"files": { "files": {
"folders": "Directoare",
"files": "Fișiere",
"body": "Corp", "body": "Corp",
"clear": "Curăță", "clear": "Curăță",
"closePreview": "Închide previzualizarea", "closePreview": "Închide previzualizarea",
"files": "Fișiere",
"folders": "Directoare",
"home": "Acasă", "home": "Acasă",
"lastModified": "Ultima modificare", "lastModified": "Ultima modificare",
"loading": "Se încarcă...", "loading": "Se încarcă...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Selecție multiplă activată", "multipleSelectionEnabled": "Selecție multiplă activată",
"name": "Nume", "name": "Nume",
"size": "Dimensiune", "size": "Dimensiune",
"sortByLastModified": "Ordonează dup ultima modificare",
"sortByName": "Ordonează după nume", "sortByName": "Ordonează după nume",
"sortBySize": "Ordonează după dimensiune", "sortBySize": "Ordonează după dimensiune"
"sortByLastModified": "Ordonează dup ultima modificare"
}, },
"help": { "help": {
"click": "alege fișier sau director", "click": "alege fișier sau director",
@@ -74,18 +76,39 @@
"f2": "redenumește fișierul", "f2": "redenumește fișierul",
"help": "Ajutor" "help": "Ajutor"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Parola",
"passwordConfirm": "Confirmă parola",
"submit": "Autentificare",
"createAnAccount": "Crează cont", "createAnAccount": "Crează cont",
"loginInstead": "Am deja cont", "loginInstead": "Am deja cont",
"password": "Parola",
"passwordConfirm": "Confirmă parola",
"passwordsDontMatch": "Parolele nu se potrivesc", "passwordsDontMatch": "Parolele nu se potrivesc",
"usernameTaken": "Utilizatorul există",
"signup": "Înregistrare", "signup": "Înregistrare",
"submit": "Autentificare",
"username": "Utilizator", "username": "Utilizator",
"usernameTaken": "Utilizatorul există",
"wrongCredentials": "Informații greșite" "wrongCredentials": "Informații greșite"
}, },
"permanent": "Permanent",
"prompts": { "prompts": {
"copy": "Copiază", "copy": "Copiază",
"copyMessage": "Alege unde vrei să copiezi fișierele:", "copyMessage": "Alege unde vrei să copiezi fișierele:",
@@ -102,43 +125,64 @@
"lastModified": "Ultima modificare", "lastModified": "Ultima modificare",
"move": "Mută", "move": "Mută",
"moveMessage": "Alege destinația:", "moveMessage": "Alege destinația:",
"newArchetype": "Crează o nouă postare pe baza unui șablon. Fișierul va fi creat in directorul conținut.",
"newDir": "Director nou", "newDir": "Director nou",
"newDirMessage": "Scrie numele noului director.", "newDirMessage": "Scrie numele noului director.",
"newFile": "Fișier nou", "newFile": "Fișier nou",
"newFileMessage": "Scrie numele noului fișier.", "newFileMessage": "Scrie numele noului fișier.",
"numberDirs": "Numărul directoarelor", "numberDirs": "Numărul directoarelor",
"numberFiles": "Numărul fișierelor", "numberFiles": "Numărul fișierelor",
"replace": "Înlocuiește",
"replaceMessage": "Unul din fișierele încărcate intră în conflict din cauza denumrii. Vrei să înlocuiești fișierul existent?\n",
"rename": "Redenumește", "rename": "Redenumește",
"renameMessage": "Redactează un nou nume pentru", "renameMessage": "Redactează un nou nume pentru",
"show": "Arată", "replace": "Înlocuiește",
"size": "Dimensiune", "replaceMessage": "Unul din fișierele încărcate intră în conflict din cauza denumrii. Vrei să înlocuiești fișierul existent?\n",
"schedule": "Programare", "schedule": "Programare",
"scheduleMessage": "Alege data si ora pentru a programa publicarea acestei postări.", "scheduleMessage": "Alege data si ora pentru a programa publicarea acestei postări.",
"newArchetype": "Crează o nouă postare pe baza unui șablon. Fișierul va fi creat in directorul conținut." "show": "Arată",
"size": "Dimensiune",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Imagini",
"music": "Muzică",
"pdf": "PDF",
"pressToSearch": "Apasă enter pentru a căuta...",
"search": "Caută...",
"typeToSearch": "Scrie pentru a căuta...",
"types": "Tipuri",
"video": "Video"
}, },
"settings": { "settings": {
"instanceName": "Numele instanței",
"brandingDirectoryPath": "Calea către directorul de branding",
"documentation": "documentație",
"branding": "Branding",
"disableExternalLinks": "Dezactivează linkurile externe (exceptând documentația)",
"brandingHelp": "Poți personaliza cum arată instanța ta de File Browser modificându-i numele, înlocuindu-i logo-ul, adăugându-i stiluri personalizate si chiar dezactivând linkurile catre GitHub.\nPentru mai multe informații despre branding fă click aici",
"admin": "Admin", "admin": "Admin",
"administrator": "Administrator", "administrator": "Administrator",
"allowCommands": "Execută comenzi", "allowCommands": "Execută comenzi",
"allowEdit": "Modifică, redenumește și șterge fișiere sau directoare", "allowEdit": "Modifică, redenumește și șterge fișiere sau directoare",
"allowNew": "Crează noi fișiere sau directoare", "allowNew": "Crează noi fișiere sau directoare",
"allowPublish": "Publică noi pagini și postări", "allowPublish": "Publică noi pagini și postări",
"allowSignup": "Permite utilizatorilor să se înregistreze",
"avoidChanges": "(lasă gol pentru a nu schimba)", "avoidChanges": "(lasă gol pentru a nu schimba)",
"branding": "Branding",
"brandingDirectoryPath": "Calea către directorul de branding",
"brandingHelp": "Poți personaliza cum arată instanța ta de File Browser modificându-i numele, înlocuindu-i logo-ul, adăugându-i stiluri personalizate si chiar dezactivând linkurile catre GitHub.\nPentru mai multe informații despre branding fă click aici",
"changePassword": "Schimbă parola", "changePassword": "Schimbă parola",
"commandRunner": "Rulează comenzi", "commandRunner": "Rulează comenzi",
"commandRunnerHelp": "Aici poti seta comenzile care sunt executate in evenimente. Trebuie să scrii una pe linie. Variabilele de mediu {0} și {1} vor fi disponile, {0} fiind relativă la {1}. Pentru mai multe informații despre acest feature si variabilele de mediu disponibile, cititi {2}.", "commandRunnerHelp": "Aici poti seta comenzile care sunt executate in evenimente. Trebuie să scrii una pe linie. Variabilele de mediu {0} și {1} vor fi disponile, {0} fiind relativă la {1}. Pentru mai multe informații despre acest feature si variabilele de mediu disponibile, cititi {2}.",
"commandsUpdated": "Comenzi actualizate!", "commandsUpdated": "Comenzi actualizate!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "CSS personalizat", "customStylesheet": "CSS personalizat",
"defaultUserDescription": "Acestea sunt setările implicite pentru noii utilizatori.",
"disableExternalLinks": "Dezactivează linkurile externe (exceptând documentația)",
"documentation": "documentație",
"examples": "Exemple", "examples": "Exemple",
"executeOnShell": "Execută in linia de comandă",
"executeOnShellDescription": "Implicit, File Browser execută comenzile prin apelare directă a binarelor. Daca vrei sa le rulezi într-un shell (cum ar fi Bash sau PowerShell), le poți defini aici cu argumentele necesare. Daca este setata, comanda va fi adăugată ca argument. Se aplică pentru comenzi si hookuri.",
"globalRules": "Acesta este un set global de reguli. Se aplică tuturor utilizatorilor. Poți defini reguli specifice din setările fiecărui utilizator pentru a le suprascrie pe acestea.",
"globalSettings": "Setări globale", "globalSettings": "Setări globale",
"hideDotfiles": "",
"insertPath": "Redactează calea",
"insertRegex": "Redactează expresia regulată",
"instanceName": "Numele instanței",
"language": "Limba", "language": "Limba",
"lockPassword": "Împiedică utilizatorul să-și schimbe parola", "lockPassword": "Împiedică utilizatorul să-și schimbe parola",
"newPassword": "Noua ta parolă", "newPassword": "Noua ta parolă",
@@ -146,6 +190,16 @@
"newUser": "Utilizator nou", "newUser": "Utilizator nou",
"password": "Parola", "password": "Parola",
"passwordUpdated": "Parola actualizată!", "passwordUpdated": "Parola actualizată!",
"path": "",
"perm": {
"create": "Crează fișiere și directoare",
"delete": "Șterge fișiere și directoare",
"download": "Descarcă",
"execute": "Execută comenzi",
"modify": "Modifică fișiere",
"rename": "Redenumește sau mută fișiere și directoare",
"share": "Distribuie fișiere"
},
"permissions": "Permisiuni", "permissions": "Permisiuni",
"permissionsHelp": "Poți alege ca un utilizator să fie administrator sau să-i alegi permisiunile individual. Dacă alegi \"Administrator\", toate celelalte opțiuni vor fi bifate automat. Gestionarea utilizatorilor rămâne un privilegiu exclusiv al administratorilor.\n", "permissionsHelp": "Poți alege ca un utilizator să fie administrator sau să-i alegi permisiunile individual. Dacă alegi \"Administrator\", toate celelalte opțiuni vor fi bifate automat. Gestionarea utilizatorilor rămâne un privilegiu exclusiv al administratorilor.\n",
"profileSettings": "Setări profil", "profileSettings": "Setări profil",
@@ -155,82 +209,46 @@
"rulesHelp": "Aici poți defini un set de reguli pentru acest utilizator. Fișierele blocate nu vor apărea in lista și nici nu vor putea fi accesate de utilizator. Expresiile regulate si căile relative la domeniul utilizatorului sunt permise.\n", "rulesHelp": "Aici poți defini un set de reguli pentru acest utilizator. Fișierele blocate nu vor apărea in lista și nici nu vor putea fi accesate de utilizator. Expresiile regulate si căile relative la domeniul utilizatorului sunt permise.\n",
"scope": "Domeniu", "scope": "Domeniu",
"settingsUpdated": "Setări actualizate!", "settingsUpdated": "Setări actualizate!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Utilizator", "user": "Utilizator",
"userCommands": "Comenzi", "userCommands": "Comenzi",
"userCommandsHelp": "O lista de comenzi disponibile acestui utilizator separate de spații. Exemplu:\n", "userCommandsHelp": "O lista de comenzi disponibile acestui utilizator separate de spații. Exemplu:\n",
"userCreated": "Utilizator creat!", "userCreated": "Utilizator creat!",
"userDefaults": "Setări implicite",
"userDeleted": "Utilizator șters!", "userDeleted": "Utilizator șters!",
"userManagement": "Gestionare utilizatori", "userManagement": "Gestionare utilizatori",
"username": "Utilizator",
"users": "Utilizatori",
"globalRules": "Acesta este un set global de reguli. Se aplică tuturor utilizatorilor. Poți defini reguli specifice din setările fiecărui utilizator pentru a le suprascrie pe acestea.",
"allowSignup": "Permite utilizatorilor să se înregistreze",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Redactează expresia regulată",
"insertPath": "Redactează calea",
"userUpdated": "Utilizator actualizat!", "userUpdated": "Utilizator actualizat!",
"userDefaults": "Setări implicite", "username": "Utilizator",
"defaultUserDescription": "Acestea sunt setările implicite pentru noii utilizatori.", "users": "Utilizatori"
"executeOnShell": "Execută in linia de comandă",
"executeOnShellDescription": "Implicit, File Browser execută comenzile prin apelare directă a binarelor. Daca vrei sa le rulezi într-un shell (cum ar fi Bash sau PowerShell), le poți defini aici cu argumentele necesare. Daca este setata, comanda va fi adăugată ca argument. Se aplică pentru comenzi si hookuri.",
"perm": {
"create": "Crează fișiere și directoare",
"delete": "Șterge fișiere și directoare",
"download": "Descarcă",
"modify": "Modifică fișiere",
"execute": "Execută comenzi",
"rename": "Redenumește sau mută fișiere și directoare",
"share": "Distribuie fișiere"
}
}, },
"sidebar": { "sidebar": {
"help": "Ajutor", "help": "Ajutor",
"hugoNew": "Hugo nou",
"login": "Autentificare", "login": "Autentificare",
"signup": "Înregistrare",
"logout": "Logout", "logout": "Logout",
"myFiles": "Fișierele mele", "myFiles": "Fișierele mele",
"newFile": "Fișier nou", "newFile": "Fișier nou",
"newFolder": "Director nou", "newFolder": "Director nou",
"preview": "Previzualizare",
"settings": "Setări", "settings": "Setări",
"siteSettings": "Setări site", "signup": "Înregistrare",
"hugoNew": "Hugo nou", "siteSettings": "Setări site"
"preview": "Previzualizare"
}, },
"search": { "success": {
"images": "Imagini", "linkCopied": "Legătură copiată!"
"music": "Muzică",
"pdf": "PDF",
"types": "Tipuri",
"video": "Video",
"search": "Caută...",
"typeToSearch": "Scrie pentru a căuta...",
"pressToSearch": "Apasă enter pentru a căuta..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Unitate de timp", "days": "Zile",
"seconds": "Secunde",
"minutes": "Minute",
"hours": "Ore", "hours": "Ore",
"days": "Zile" "minutes": "Minute",
}, "seconds": "Secunde",
"download": { "unit": "Unitate de timp"
"downloadFile": "Descarcă fișier",
"downloadFolder": "Descarcă director"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Постоянный",
"buttons": { "buttons": {
"shell": "Toggle shell",
"cancel": "Отмена", "cancel": "Отмена",
"close": "Закрыть", "close": "Закрыть",
"copy": "Копировать", "copy": "Копировать",
@@ -10,6 +8,7 @@
"create": "Создать", "create": "Создать",
"delete": "Удалить", "delete": "Удалить",
"download": "Скачать", "download": "Скачать",
"hideDotfiles": "Скрыть точечные файлы",
"info": "Инфо", "info": "Инфо",
"more": "Еще", "more": "Еще",
"move": "Переместить", "move": "Переместить",
@@ -17,38 +16,41 @@
"new": "Новый", "new": "Новый",
"next": "Вперед", "next": "Вперед",
"ok": "OK", "ok": "OK",
"replace": "Перезаписать", "permalink": "Получить постоянную ссылку",
"previous": "Назад", "previous": "Назад",
"publish": "Опубликовать",
"rename": "Переименовать", "rename": "Переименовать",
"replace": "Перезаписать",
"reportIssue": "Сообщить о проблеме", "reportIssue": "Сообщить о проблеме",
"save": "Сохранить", "save": "Сохранить",
"schedule": "Планировка",
"search": "Поиск", "search": "Поиск",
"select": "Выбрать", "select": "Выбрать",
"share": "Поделиться",
"publish": "Опубликовать",
"selectMultiple": "Мультивыбор", "selectMultiple": "Мультивыбор",
"schedule": ланировка", "share": оделиться",
"shell": "Командная строка",
"switchView": "Вид", "switchView": "Вид",
"toggleSidebar": "Боковая панель", "toggleSidebar": "Боковая панель",
"update": "Обновить", "update": "Обновить",
"upload": "Загрузить", "upload": "Загрузить"
"permalink": "Получить постоянную ссылку"
}, },
"success": { "download": {
"linkCopied": "Ссылка скопирована!" "downloadFile": "Скачать файл",
"downloadFolder": "Загрузить папку",
"downloadSelected": "Скачать выбранное"
}, },
"errors": { "errors": {
"forbidden": "You don't have permissions to access this.", "forbidden": "У вас нет прав доступа к этому.",
"internal": "Что-то пошло не так.", "internal": "Что-то пошло не так.",
"notFound": "Неправильная ссылка." "notFound": "Неправильная ссылка."
}, },
"files": { "files": {
"folders": "Каталоги",
"files": "Файлы",
"body": "Тело", "body": "Тело",
"clear": "Очистить", "clear": "Очистить",
"closePreview": "Закрыть", "closePreview": "Закрыть",
"home": "Дом", "files": "Файлы",
"folders": "Папки",
"home": "Главная",
"lastModified": "Последнее изменение", "lastModified": "Последнее изменение",
"loading": "Загрузка...", "loading": "Загрузка...",
"lonely": "Здесь пусто...", "lonely": "Здесь пусто...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Мультивыбор включен", "multipleSelectionEnabled": "Мультивыбор включен",
"name": "Имя", "name": "Имя",
"size": "Размер", "size": "Размер",
"sortByLastModified": "Сортировка по дате изменения",
"sortByName": "Сортировка по имени", "sortByName": "Сортировка по имени",
"sortBySize": "Сортировка по размеру", "sortBySize": "Сортировка по размеру"
"sortByLastModified": "Сортировка по изменению"
}, },
"help": { "help": {
"click": "выбрать файл или каталог", "click": "выбрать файл или каталог",
@@ -74,18 +76,39 @@
"f2": "переименовать файл", "f2": "переименовать файл",
"help": "Помощь" "help": "Помощь"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"createAnAccount": "Создать аккаунт",
"loginInstead": "Уже есть аккаунт",
"password": "Пароль", "password": "Пароль",
"passwordConfirm": "Password Confirmation", "passwordConfirm": "Подтверждение пароля",
"passwordsDontMatch": "Пароли не совпадают",
"signup": "Зарегистрироваться",
"submit": "Войти", "submit": "Войти",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Имя пользователя", "username": "Имя пользователя",
"usernameTaken": "Данное имя пользователя уже занято",
"wrongCredentials": "Неверные данные" "wrongCredentials": "Неверные данные"
}, },
"permanent": "Постоянный",
"prompts": { "prompts": {
"copy": "Копировать", "copy": "Копировать",
"copyMessage": "Копировать в:", "copyMessage": "Копировать в:",
@@ -95,50 +118,71 @@
"deleteTitle": "Удалить файлы", "deleteTitle": "Удалить файлы",
"displayName": "Отображаемое имя:", "displayName": "Отображаемое имя:",
"download": "Скачать файлы", "download": "Скачать файлы",
"downloadMessage": "Скачать каталог в следующем формате.", "downloadMessage": "Выберите формат а котором хотите скачать.",
"error": "Ошибка", "error": "Ошибка",
"fileInfo": "Информация о файле", "fileInfo": "Информация о файле",
"filesSelected": "Файлов выбрано: {count}.", "filesSelected": "Файлов выбрано: {count}.",
"lastModified": "Последнее изменение", "lastModified": "Последнее изменение",
"move": "Переместить", "move": "Переместить",
"moveMessage": "Переместить в:", "moveMessage": "Переместить в:",
"newArchetype": "Создайте новую запись на основе архетипа. Файл будет создан в каталоге.",
"newDir": "Новый каталог", "newDir": "Новый каталог",
"newDirMessage": "Имя нового каталога.", "newDirMessage": "Имя нового каталога.",
"newFile": "Новый файл", "newFile": "Новый файл",
"newFileMessage": "Имя нового файла.", "newFileMessage": "Имя нового файла.",
"numberDirs": "Количество каталогов", "numberDirs": "Количество каталогов",
"numberFiles": "Количество файлов", "numberFiles": "Количество файлов",
"replace": "Заменить",
"replaceMessage": "Имя одного из загружаемых файлов совпадает с уже существующим файлом. Вы хотите заменить существующий?\n",
"rename": "Переименовать", "rename": "Переименовать",
"renameMessage": "Новое имя", "renameMessage": "Новое имя",
"show": "Показать", "replace": "Заменить",
"size": "Размер", "replaceMessage": "Имя одного из загружаемых файлов совпадает с уже существующим файлом. Вы хотите заменить существующий?\n",
"schedule": "Планировка", "schedule": "Планировка",
"scheduleMessage": "Запланировать дату и время публикации.", "scheduleMessage": "Запланировать дату и время публикации.",
"newArchetype": "Создайте новую запись на основе архетипа. Файл будет создан в каталоге." "show": "Показать",
"size": "Размер",
"upload": "Загрузить",
"uploadMessage": "Выберите вариант для загрузки."
},
"search": {
"images": "Изображения",
"music": "Музыка",
"pdf": "PDF",
"pressToSearch": "Нажмите Enter для поиска ...",
"search": "Поиск...",
"typeToSearch": "Введите имя файла ...",
"types": "Типы",
"video": "Видео"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Админ", "admin": "Админ",
"administrator": "Администратор", "administrator": "Администратор",
"allowCommands": "Запуск команд", "allowCommands": "Запуск команд",
"allowEdit": "Редактирование, переименование и удаление файлов или каталогов", "allowEdit": "Редактирование, переименование и удаление файлов или каталогов",
"allowNew": "Создание новых файлов или каталогов", "allowNew": "Создание новых файлов или каталогов",
"allowPublish": "Публикация новых записей и страниц", "allowPublish": "Публикация новых записей и страниц",
"avoidChanges": "(пусто для пропуска)", "allowSignup": "Разрешить пользователям регистрироваться",
"avoidChanges": "(оставьте поле пустым, чтобы избежать изменений)",
"branding": "Брендинг",
"brandingDirectoryPath": "Путь к каталогу брендов",
"brandingHelp": "Вы можете настроить внешний вид файлового браузера, изменив его имя, заменив логотип, добавив собственные стили и даже отключив внешние ссылки на GitHub.\nДополнительную информацию о персонализированном брендинге можно найти на странице {0}.",
"changePassword": "Изменение пароля", "changePassword": "Изменение пароля",
"commandRunner": "Command runner", "commandRunner": "Запуск команд",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "Здесь вы можете установить команды, которые будут выполняться в указанных событиях. Вы должны указать по одной команде в каждой строке. Переменные среды {0} и {1} будут доступны, будучи {0} относительно {1}. Дополнительные сведения об этой функции и доступных переменных среды см. В {2}.",
"commandsUpdated": "Команды обновлены!", "commandsUpdated": "Команды обновлены!",
"createUserDir": "Автоматическое создание домашнего каталога пользователя при добавлении нового пользователя",
"customStylesheet": "Свой стиль", "customStylesheet": "Свой стиль",
"defaultUserDescription": "Это настройки по умолчанию для новых пользователей.",
"disableExternalLinks": "Отключить внешние ссылки (кроме документации)",
"documentation": "документация",
"examples": "Примеры", "examples": "Примеры",
"executeOnShell": "Выполнить в командной строке",
"executeOnShellDescription": "По умолчанию File Browser выполняет команды, напрямую вызывая их бинарные файлы. Если вы хотите вместо этого запускать их в оболочке (например, Bash или PowerShell), вы можете определить их здесь с необходимыми аргументами и флагами. Если установлено, выполняемая вами команда будет добавлена в качестве аргумента. Это относится как к пользовательским командам, так и к обработчикам событий.",
"globalRules": "Это глобальный набор разрешающих и запрещающих правил. Они применимы к каждому пользователю. Вы можете определить определенные правила для настроек каждого пользователя, чтобы переопределить их.",
"globalSettings": "Глобальные настройки", "globalSettings": "Глобальные настройки",
"hideDotfiles": "Скрыть точечные файлы",
"insertPath": "Вставьте путь",
"insertRegex": "Вставить регулярное выражение",
"instanceName": "Instance name",
"language": "Язык", "language": "Язык",
"lockPassword": "Запретить пользователю менять пароль", "lockPassword": "Запретить пользователю менять пароль",
"newPassword": "Новый пароль", "newPassword": "Новый пароль",
@@ -146,6 +190,16 @@
"newUser": "Новый пользователь", "newUser": "Новый пользователь",
"password": "Пароль", "password": "Пароль",
"passwordUpdated": "Пароль обновлен!", "passwordUpdated": "Пароль обновлен!",
"path": "Путь",
"perm": {
"create": "Создавать файлы и каталоги",
"delete": "Удалять файлы и каталоги",
"download": "Скачивать",
"execute": "Выполнять команды",
"modify": "Редактировать файлы",
"rename": "Переименовывать или перемещать файлы и каталоги",
"share": "Делиться файлами"
},
"permissions": "Права доступа", "permissions": "Права доступа",
"permissionsHelp": "Можно настроить пользователя как администратора или выбрать разрешения индивидуально. При выборе \"Администратор\", все остальные параметры будут автоматически выбраны. Управление пользователями - привилегия администратора.\n", "permissionsHelp": "Можно настроить пользователя как администратора или выбрать разрешения индивидуально. При выборе \"Администратор\", все остальные параметры будут автоматически выбраны. Управление пользователями - привилегия администратора.\n",
"profileSettings": "Настройки профиля", "profileSettings": "Настройки профиля",
@@ -155,82 +209,46 @@
"rulesHelp": "Здесь вы можете определить набор разрешающих и запрещающих правил для этого конкретного пользователь. Блокированные файлы не будут отображаться в списках, и не будут доступны для пользователя. Есть поддержка регулярных выражений и относительных путей.\n", "rulesHelp": "Здесь вы можете определить набор разрешающих и запрещающих правил для этого конкретного пользователь. Блокированные файлы не будут отображаться в списках, и не будут доступны для пользователя. Есть поддержка регулярных выражений и относительных путей.\n",
"scope": "Корень", "scope": "Корень",
"settingsUpdated": "Настройки применены!", "settingsUpdated": "Настройки применены!",
"shareDuration": "Время расшаренной ссылки",
"shareManagement": "Управление расшаренными ссылками",
"singleClick": "Открытие файлов и каталогов одним кликом",
"themes": {
"dark": "Темная",
"light": "Светлая",
"title": "Тема"
},
"user": "Пользователь", "user": "Пользователь",
"userCommands": "Команды", "userCommands": "Команды",
"userCommandsHelp": "Список команд доступных пользователю, разделенный пробелами. Пример:\n", "userCommandsHelp": "Список команд доступных пользователю, разделенный пробелами. Пример:\n",
"userCreated": "Пользователь создан!", "userCreated": "Пользователь создан!",
"userDefaults": "Настройки пользователя по умолчанию",
"userDeleted": "Пользователь удален!", "userDeleted": "Пользователь удален!",
"userManagement": "Управление пользователями", "userManagement": "Управление пользователями",
"username": "Имя пользователя",
"users": "Пользователи",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Пользователь изменен!", "userUpdated": "Пользователь изменен!",
"userDefaults": "User default settings", "username": "Имя пользователя",
"defaultUserDescription": "This are the default settings for new users.", "users": "Пользователи"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"modify": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
}, },
"sidebar": { "sidebar": {
"help": "Помощь", "help": "Помощь",
"login": "Login", "hugoNew": "Hugo New",
"signup": "Signup", "login": "Войти",
"logout": "Выход", "logout": "Выйти",
"myFiles": "Файлы", "myFiles": "Файлы",
"newFile": "Новый файл", "newFile": "Новый файл",
"newFolder": "Новый каталог", "newFolder": "Новый каталог",
"preview": "Предпросмотр",
"settings": "Настройки", "settings": "Настройки",
"siteSettings": "Настройки сайта", "signup": "Зарегистрироваться",
"hugoNew": "Hugo New", "siteSettings": "Настройки сайта"
"preview": "Предпросмотр"
}, },
"search": { "success": {
"images": "Изображения", "linkCopied": "Ссылка скопирована!"
"music": "Музыка",
"pdf": "PDF",
"types": "Типы",
"video": "Видео",
"search": "Поиск...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Единица времени", "days": "Дни",
"seconds": "Секунды",
"minutes": "Минуты",
"hours": "Часы", "hours": "Часы",
"days": "Дни" "minutes": "Минуты",
}, "seconds": "Секунды",
"download": { "unit": "Единица времени"
"downloadFile": "Download File",
"downloadFolder": "Download Folder"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "Permanent",
"buttons": { "buttons": {
"shell": "Växla skal",
"cancel": "Avbryt", "cancel": "Avbryt",
"close": "Stäng", "close": "Stäng",
"copy": "Kopiera", "copy": "Kopiera",
@@ -10,6 +8,7 @@
"create": "Skapa", "create": "Skapa",
"delete": "Ta bort", "delete": "Ta bort",
"download": "Ladda ner", "download": "Ladda ner",
"hideDotfiles": "",
"info": "Info", "info": "Info",
"more": "Mer", "more": "Mer",
"move": "Flytta", "move": "Flytta",
@@ -17,25 +16,28 @@
"new": "Nytt", "new": "Nytt",
"next": "Nästa", "next": "Nästa",
"ok": "OK", "ok": "OK",
"replace": "Ersätt", "permalink": "Skapa en permanent länk",
"previous": "Föregående", "previous": "Föregående",
"publish": "Publisera",
"rename": "Ändra namn", "rename": "Ändra namn",
"replace": "Ersätt",
"reportIssue": "Rapportera problem", "reportIssue": "Rapportera problem",
"save": "Spara", "save": "Spara",
"schedule": "Schema",
"search": "Sök", "search": "Sök",
"select": "Välj", "select": "Välj",
"share": "Dela",
"publish": "Publisera",
"selectMultiple": "Välj flera", "selectMultiple": "Välj flera",
"schedule": "Schema", "share": "Dela",
"shell": "Växla skal",
"switchView": "Byt vy", "switchView": "Byt vy",
"toggleSidebar": "Växla sidofält", "toggleSidebar": "Växla sidofält",
"update": "Uppdatera", "update": "Uppdatera",
"upload": "Ladda upp", "upload": "Ladda upp"
"permalink": "Skapa en permanent länk"
}, },
"success": { "download": {
"linkCopied": "Länk kopierad" "downloadFile": "Ladda ner fil",
"downloadFolder": "Ladda ner mapp",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "Du saknar rättigheter till detta", "forbidden": "Du saknar rättigheter till detta",
@@ -43,11 +45,11 @@
"notFound": "Det går inte att nå den här platsen." "notFound": "Det går inte att nå den här platsen."
}, },
"files": { "files": {
"folders": "Mappar",
"files": "Filer",
"body": "Huvud", "body": "Huvud",
"clear": "Rensa", "clear": "Rensa",
"closePreview": "Stäng förhands granskningen", "closePreview": "Stäng förhands granskningen",
"files": "Filer",
"folders": "Mappar",
"home": "Hem", "home": "Hem",
"lastModified": "Senast ändrad", "lastModified": "Senast ändrad",
"loading": "Laddar.....", "loading": "Laddar.....",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "Flerval är på", "multipleSelectionEnabled": "Flerval är på",
"name": "Namn", "name": "Namn",
"size": "Storlek", "size": "Storlek",
"sortByLastModified": "Sortera på senast ändrad",
"sortByName": "Sortera på namn", "sortByName": "Sortera på namn",
"sortBySize": "Sortera på storlek", "sortBySize": "Sortera på storlek"
"sortByLastModified": "Sortera på senast ändrad"
}, },
"help": { "help": {
"click": "välj fil eller mapp", "click": "välj fil eller mapp",
@@ -74,18 +76,39 @@
"f2": "ändra namnet på filen", "f2": "ändra namnet på filen",
"help": "Hjälp" "help": "Hjälp"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ru": "Русский",
"svSE": "",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "Lösenord",
"passwordConfirm": "Bekräfta lösenord",
"submit": "Logga in",
"createAnAccount": "Skapa ett konto", "createAnAccount": "Skapa ett konto",
"loginInstead": "Du har redan ett konto", "loginInstead": "Du har redan ett konto",
"password": "Lösenord",
"passwordConfirm": "Bekräfta lösenord",
"passwordsDontMatch": "Lösenord matchar inte", "passwordsDontMatch": "Lösenord matchar inte",
"usernameTaken": "Användarnamn upptaget",
"signup": "Registrera", "signup": "Registrera",
"submit": "Logga in",
"username": "Användarnamn", "username": "Användarnamn",
"usernameTaken": "Användarnamn upptaget",
"wrongCredentials": "Fel inloggning" "wrongCredentials": "Fel inloggning"
}, },
"permanent": "Permanent",
"prompts": { "prompts": {
"copy": "Kopiera", "copy": "Kopiera",
"copyMessage": "Välj var dina filer skall sparas:", "copyMessage": "Välj var dina filer skall sparas:",
@@ -102,43 +125,64 @@
"lastModified": "Senast ändrad", "lastModified": "Senast ändrad",
"move": "Flytta", "move": "Flytta",
"moveMessage": "Välj ny plats för din fil (er)/mapp (ar):", "moveMessage": "Välj ny plats för din fil (er)/mapp (ar):",
"newArchetype": "Skapa ett nytt inlägg baserat på en arketyp. Din fil kommer att skapas på innehållsmapp.",
"newDir": "Ny mapp", "newDir": "Ny mapp",
"newDirMessage": "Ange namn på din nya mapp.", "newDirMessage": "Ange namn på din nya mapp.",
"newFile": "Ny fil", "newFile": "Ny fil",
"newFileMessage": "Ange namn på din nya fil.", "newFileMessage": "Ange namn på din nya fil.",
"numberDirs": "Antal kataloger", "numberDirs": "Antal kataloger",
"numberFiles": "Antal filer", "numberFiles": "Antal filer",
"replace": "Ersätt",
"replaceMessage": "En av filerna som du försöker överföra är i konflikt på grund av dess namn. Vill du ersätta den befintliga?\n",
"rename": "Ändra namn", "rename": "Ändra namn",
"renameMessage": "Infoga ett nytt namn för", "renameMessage": "Infoga ett nytt namn för",
"show": "Visa", "replace": "Ersätt",
"size": "Storlek", "replaceMessage": "En av filerna som du försöker överföra är i konflikt på grund av dess namn. Vill du ersätta den befintliga?\n",
"schedule": "Schema", "schedule": "Schema",
"scheduleMessage": "Pick a date and time to schedule the publication of this post.", "scheduleMessage": "Pick a date and time to schedule the publication of this post.",
"newArchetype": "Skapa ett nytt inlägg baserat på en arketyp. Din fil kommer att skapas på innehållsmapp." "show": "Visa",
"size": "Storlek",
"upload": "",
"uploadMessage": ""
},
"search": {
"images": "Bilder",
"music": "Musik",
"pdf": "PDF",
"pressToSearch": "Tryck på enter för att söka...",
"search": "Sök...",
"typeToSearch": "Skriv för att söka....",
"types": "Typ",
"video": "Video"
}, },
"settings": { "settings": {
"instanceName": "Instans namn",
"brandingDirectoryPath": "Sökväg till varumärkes katalog",
"documentation": "dokumentation",
"branding": "Varumärke",
"disableExternalLinks": "Inaktivera externa länkar (förutom dokumentation)",
"brandingHelp": "Du kan skräddarsyr hur din fil hanterar instansen ser ut och känns genom att ändra dess namn, ersätter logo typen, lägga till egna stilar och även inaktivera externa länkar till GitHub.\nMer information om anpassad varumärkes profilering finns i {0}.",
"admin": "Admin", "admin": "Admin",
"administrator": "Administratör", "administrator": "Administratör",
"allowCommands": "Exekvera kommandon", "allowCommands": "Exekvera kommandon",
"allowEdit": "Ändra, döp om och ta bort filer eller mappar", "allowEdit": "Ändra, döp om och ta bort filer eller mappar",
"allowNew": "Skapa nya filer eller mappar", "allowNew": "Skapa nya filer eller mappar",
"allowPublish": "Publicera nya inlägg och sidor", "allowPublish": "Publicera nya inlägg och sidor",
"allowSignup": "Tillåt användare att registrera sig",
"avoidChanges": "(lämna blankt för att undvika ändringar)", "avoidChanges": "(lämna blankt för att undvika ändringar)",
"branding": "Varumärke",
"brandingDirectoryPath": "Sökväg till varumärkes katalog",
"brandingHelp": "Du kan skräddarsyr hur din fil hanterar instansen ser ut och känns genom att ändra dess namn, ersätter logo typen, lägga till egna stilar och även inaktivera externa länkar till GitHub.\nMer information om anpassad varumärkes profilering finns i {0}.",
"changePassword": "Ändra lösenord", "changePassword": "Ändra lösenord",
"commandRunner": "Kommando körare", "commandRunner": "Kommando körare",
"commandRunnerHelp": "Här kan du ange kommandon som körs i de namngivna händelserna. Du måste skriva en per rad. Miljövariablerna {0} och {1} kommer att vara tillgängliga, och vara {0} i förhållande till {1}. För mer information om den här funktionen och de tillgängliga miljövariablerna, vänligen läs {2}.", "commandRunnerHelp": "Här kan du ange kommandon som körs i de namngivna händelserna. Du måste skriva en per rad. Miljövariablerna {0} och {1} kommer att vara tillgängliga, och vara {0} i förhållande till {1}. För mer information om den här funktionen och de tillgängliga miljövariablerna, vänligen läs {2}.",
"commandsUpdated": "Kommandon uppdaterade!", "commandsUpdated": "Kommandon uppdaterade!",
"createUserDir": "Auto skapa användarens hemkatalog när du lägger till nya användare",
"customStylesheet": "Anpassad formatmall", "customStylesheet": "Anpassad formatmall",
"defaultUserDescription": "Detta är standard inställningar för användare.",
"disableExternalLinks": "Inaktivera externa länkar (förutom dokumentation)",
"documentation": "dokumentation",
"examples": "Exempel", "examples": "Exempel",
"executeOnShell": "Exekvera på skal",
"executeOnShellDescription": "Som standard kör fil bläddraren kommandona genom att anropa deras binärfiler direkt. Om du vill köra dem på ett skal i stället (till exempel bash eller PowerShell), kan du definiera det här med nödvändiga argument och flaggor. Om det är inställt kommer kommandot du kör att läggas till som ett argument. Detta gäller både användar kommandon och händelse krokar.",
"globalRules": "Det här är en global uppsättning regler för att tillåta och inte tillåta. De gäller för alla användare. Du kan definiera specifika regler för varje användares inställningar för att åsidosätta de här inställningarna.",
"globalSettings": "Globala inställningar", "globalSettings": "Globala inställningar",
"hideDotfiles": "",
"insertPath": "Ange sökväg",
"insertRegex": "Sätt in regex expression",
"instanceName": "Instans namn",
"language": "Språk", "language": "Språk",
"lockPassword": "Förhindra att användare kan byta lösenord", "lockPassword": "Förhindra att användare kan byta lösenord",
"newPassword": "Ditt nya lösenord", "newPassword": "Ditt nya lösenord",
@@ -146,6 +190,16 @@
"newUser": "Ny användare", "newUser": "Ny användare",
"password": "Lösenord", "password": "Lösenord",
"passwordUpdated": "Lösenord uppdaterat", "passwordUpdated": "Lösenord uppdaterat",
"path": "",
"perm": {
"create": "Skapa filer och mappar",
"delete": "Ta bort filer och mappar",
"download": "Ladda ner",
"execute": "Exekvera kommandon",
"modify": "Ändra fil",
"rename": "Byta namn på eller flytta filer och kataloger",
"share": "Dela filer"
},
"permissions": "Rättigheter", "permissions": "Rättigheter",
"permissionsHelp": "Du kan ange att användaren ska vara administratör eller välja behörigheterna individuellt. Om du väljer \"administratör \" kommer alla andra alternativ att kontrolleras automatiskt. Hanteringen av användare är fortfarande ett privilegium för en administratör.\n", "permissionsHelp": "Du kan ange att användaren ska vara administratör eller välja behörigheterna individuellt. Om du väljer \"administratör \" kommer alla andra alternativ att kontrolleras automatiskt. Hanteringen av användare är fortfarande ett privilegium för en administratör.\n",
"profileSettings": "Profil inställningar", "profileSettings": "Profil inställningar",
@@ -155,82 +209,46 @@
"rulesHelp": "Här kan du definiera en uppsättning regler för godkänna och neka för den här specifika användaren. Den blockerade filen kommer inte upp i listningarna och kommer inte att vara tillgänglig till användaren. Vi stöder regex och sökvägar i förhållande till användarnas omfång.\n", "rulesHelp": "Här kan du definiera en uppsättning regler för godkänna och neka för den här specifika användaren. Den blockerade filen kommer inte upp i listningarna och kommer inte att vara tillgänglig till användaren. Vi stöder regex och sökvägar i förhållande till användarnas omfång.\n",
"scope": "Omfattning", "scope": "Omfattning",
"settingsUpdated": "Inställning uppdaterad!", "settingsUpdated": "Inställning uppdaterad!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "",
"light": "",
"title": ""
},
"user": "Användare", "user": "Användare",
"userCommands": "Kommandon", "userCommands": "Kommandon",
"userCommandsHelp": "En utrymmesseparerad lista med tillgängliga kommandon för den här användaren. Exempel:\n", "userCommandsHelp": "En utrymmesseparerad lista med tillgängliga kommandon för den här användaren. Exempel:\n",
"userCreated": "Användare skapad", "userCreated": "Användare skapad",
"userDefaults": "Standard inställning för användare",
"userDeleted": "Användare borttagen", "userDeleted": "Användare borttagen",
"userManagement": "Användarehantering", "userManagement": "Användarehantering",
"username": "Användarnamn",
"users": "Användare",
"globalRules": "Det här är en global uppsättning regler för att tillåta och inte tillåta. De gäller för alla användare. Du kan definiera specifika regler för varje användares inställningar för att åsidosätta de här inställningarna.",
"allowSignup": "Tillåt användare att registrera sig",
"createUserDir": "Auto skapa användarens hemkatalog när du lägger till nya användare",
"insertRegex": "Sätt in regex expression",
"insertPath": "Ange sökväg",
"userUpdated": "Användare uppdaterad!", "userUpdated": "Användare uppdaterad!",
"userDefaults": "Standard inställning för användare", "username": "Användarnamn",
"defaultUserDescription": "Detta är standard inställningar för användare.", "users": "Användare"
"executeOnShell": "Exekvera på skal",
"executeOnShellDescription": "Som standard kör fil bläddraren kommandona genom att anropa deras binärfiler direkt. Om du vill köra dem på ett skal i stället (till exempel bash eller PowerShell), kan du definiera det här med nödvändiga argument och flaggor. Om det är inställt kommer kommandot du kör att läggas till som ett argument. Detta gäller både användar kommandon och händelse krokar.",
"perm": {
"create": "Skapa filer och mappar",
"delete": "Ta bort filer och mappar",
"download": "Ladda ner",
"modify": "Ändra fil",
"execute": "Exekvera kommandon",
"rename": "Byta namn på eller flytta filer och kataloger",
"share": "Dela filer"
}
}, },
"sidebar": { "sidebar": {
"help": "Hjälp", "help": "Hjälp",
"hugoNew": "Hugo ny",
"login": "Logga in", "login": "Logga in",
"signup": "Registrera",
"logout": "Logga ut", "logout": "Logga ut",
"myFiles": "Mina filer", "myFiles": "Mina filer",
"newFile": "Ny fil", "newFile": "Ny fil",
"newFolder": "Ny mapp", "newFolder": "Ny mapp",
"preview": "Visa",
"settings": "Inställningar", "settings": "Inställningar",
"siteSettings": "System inställningar", "signup": "Registrera",
"hugoNew": "Hugo ny", "siteSettings": "System inställningar"
"preview": "Visa"
}, },
"search": { "success": {
"images": "Bilder", "linkCopied": "Länk kopierad"
"music": "Musik",
"pdf": "PDF",
"types": "Typ",
"video": "Video",
"search": "Sök...",
"typeToSearch": "Skriv för att söka....",
"pressToSearch": "Tryck på enter för att söka..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "Tidsenhet", "days": "Dagar",
"seconds": "Sekunder",
"minutes": "Minuter",
"hours": "Timmar", "hours": "Timmar",
"days": "Dagar" "minutes": "Minuter",
}, "seconds": "Sekunder",
"download": { "unit": "Tidsenhet"
"downloadFile": "Ladda ner fil",
"downloadFolder": "Ladda ner mapp"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "永久",
"buttons": { "buttons": {
"shell": "激活 shell",
"cancel": "取消", "cancel": "取消",
"close": "关闭", "close": "关闭",
"copy": "复制", "copy": "复制",
@@ -10,6 +8,7 @@
"create": "创建", "create": "创建",
"delete": "删除", "delete": "删除",
"download": "下载", "download": "下载",
"hideDotfiles": "",
"info": "信息", "info": "信息",
"more": "更多", "more": "更多",
"move": "移动", "move": "移动",
@@ -17,25 +16,28 @@
"new": "新", "new": "新",
"next": "下一个", "next": "下一个",
"ok": "确定", "ok": "确定",
"replace": "替换", "permalink": "获取永久链接",
"previous": "上一个", "previous": "上一个",
"publish": "发布",
"rename": "重命名", "rename": "重命名",
"replace": "替换",
"reportIssue": "报告问题", "reportIssue": "报告问题",
"save": "保存", "save": "保存",
"schedule": "计划",
"search": "搜索", "search": "搜索",
"select": "选择", "select": "选择",
"share": "分享",
"publish": "发布",
"selectMultiple": "选择多个", "selectMultiple": "选择多个",
"schedule": "计划", "share": "分享",
"shell": "激活 shell",
"switchView": "切换显示方式", "switchView": "切换显示方式",
"toggleSidebar": "切换侧边栏", "toggleSidebar": "切换侧边栏",
"update": "更新", "update": "更新",
"upload": "上传", "upload": "上传"
"permalink": "获取永久链接"
}, },
"success": { "download": {
"linkCopied": "链接已复制!" "downloadFile": "下载文件",
"downloadFolder": "下载文件夹",
"downloadSelected": "下载已选"
}, },
"errors": { "errors": {
"forbidden": "你无权限访问", "forbidden": "你无权限访问",
@@ -43,11 +45,11 @@
"notFound": "找不到文件。" "notFound": "找不到文件。"
}, },
"files": { "files": {
"folders": "文件夹",
"files": "文件",
"body": "内容", "body": "内容",
"clear": "清空", "clear": "清空",
"closePreview": "关闭预览", "closePreview": "关闭预览",
"files": "文件",
"folders": "文件夹",
"home": "主页", "home": "主页",
"lastModified": "最后修改", "lastModified": "最后修改",
"loading": "加载中...", "loading": "加载中...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "多选模式已开启", "multipleSelectionEnabled": "多选模式已开启",
"name": "名称", "name": "名称",
"size": "大小", "size": "大小",
"sortByLastModified": "按最后修改时间排序",
"sortByName": "按名称排序", "sortByName": "按名称排序",
"sortBySize": "按大小排序", "sortBySize": "按大小排序"
"sortByLastModified": "按最后修改时间排序"
}, },
"help": { "help": {
"click": "选择文件或目录", "click": "选择文件或目录",
@@ -74,24 +76,46 @@
"f2": "重命名文件/文件夹", "f2": "重命名文件/文件夹",
"help": "帮助" "help": "帮助"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "DutchBelgium",
"pl": "Polski",
"pt": "Português",
"ptBR": "PortuguêsBrasil",
"ro": "Romanian",
"ru": "Русский",
"svSE": "SwedishSweden",
"zhCN": "中文(简体)",
"zhTW": "中文(繁體)"
},
"login": { "login": {
"password": "密码",
"passwordConfirm": "确认密码",
"submit": "登录",
"createAnAccount": "创建用户", "createAnAccount": "创建用户",
"loginInstead": "已有用户登录", "loginInstead": "已有用户登录",
"password": "密码",
"passwordConfirm": "确认密码",
"passwordsDontMatch": "密码不一致", "passwordsDontMatch": "密码不一致",
"usernameTaken": "用户名已经被使用",
"signup": "注册", "signup": "注册",
"submit": "登录",
"username": "用户名", "username": "用户名",
"usernameTaken": "用户名已经被使用",
"wrongCredentials": "用户名或密码错误" "wrongCredentials": "用户名或密码错误"
}, },
"permanent": "永久",
"prompts": { "prompts": {
"copy": "复制", "copy": "复制",
"copyMessage": "请选择欲复制至的目录:", "copyMessage": "请选择欲复制至的目录:",
"currentlyNavigating": "当前目录:", "currentlyNavigating": "当前目录:",
"deleteMessageMultiple": "你确定要删除这 {count} 个文件吗?", "deleteMessageMultiple": "你确定要删除这 {count} 个文件吗",
"deleteMessageSingle": "你确定要删除这个文件/文件夹吗?", "deleteMessageSingle": "你确定要删除这个文件/文件夹吗",
"deleteMessageShare": "你确定要删除这个分享({path})吗?",
"deleteTitle": "删除文件", "deleteTitle": "删除文件",
"displayName": "名称:", "displayName": "名称:",
"download": "下载文件", "download": "下载文件",
@@ -102,43 +126,64 @@
"lastModified": "最后修改", "lastModified": "最后修改",
"move": "移动", "move": "移动",
"moveMessage": "请选择欲移动至的目录:", "moveMessage": "请选择欲移动至的目录:",
"newArchetype": "创建一个基于原型的新帖子。您的文件将会创建在内容文件夹中。",
"newDir": "新建目录", "newDir": "新建目录",
"newDirMessage": "请输入新目录的名称。", "newDirMessage": "请输入新目录的名称。",
"newFile": "新建文件", "newFile": "新建文件",
"newFileMessage": "请输入新文件的名称。", "newFileMessage": "请输入新文件的名称。",
"numberDirs": "目录数", "numberDirs": "目录数",
"numberFiles": "文件数", "numberFiles": "文件数",
"replace": "替换",
"replaceMessage": "您尝试上传的文件中有一个与现有文件的名称存在冲突。是否替换现有的同名文件?",
"rename": "重命名", "rename": "重命名",
"renameMessage": "请输入新名称,旧名称为:", "renameMessage": "请输入新名称,旧名称为:",
"show": "揭示", "replace": "替换",
"size": "大小", "replaceMessage": "您尝试上传的文件中有一个与现有文件的名称存在冲突。是否替换现有的同名文件?",
"schedule": "计划", "schedule": "计划",
"scheduleMessage": "请选择发布这篇帖子的日期。", "scheduleMessage": "请选择发布这篇帖子的日期。",
"newArchetype": "创建一个基于原型的新帖子。您的文件将会创建在内容文件夹中。" "show": "点击以显示",
"size": "大小",
"upload": "上传",
"uploadMessage": "选择上传项。"
},
"search": {
"images": "图像",
"music": "音乐",
"pdf": "PDF",
"pressToSearch": "回车搜索...",
"search": "搜索...",
"typeToSearch": "输入搜索...",
"types": "类型",
"video": "视频"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "品牌信息文件夹路径",
"documentation": "帮助文档",
"branding": "品牌",
"disableExternalLinks": "禁止外部链接(帮助文档除外)",
"brandingHelp": "您可以通过改变名称更换商标加入自定义样式甚至禁用外部链接来自定义File Browser的外观和给人的感觉。\n想获得更多信息请查看 {0} 。",
"admin": "管理员", "admin": "管理员",
"administrator": "管理员", "administrator": "管理员",
"allowCommands": "执行命令(Linux 代码)", "allowCommands": "执行命令shell 命令)",
"allowEdit": "编辑、重命名或删除文件/目录", "allowEdit": "编辑、重命名或删除文件/目录",
"allowNew": "创建新文件和目录", "allowNew": "创建新文件和目录",
"allowPublish": "发布新的帖子与页面", "allowPublish": "发布新的帖子与页面",
"avoidChanges": "(留空以避免更改)", "allowSignup": "允许用户注册",
"avoidChanges": "(留空以避免更改)",
"branding": "品牌",
"brandingDirectoryPath": "品牌信息文件夹路径",
"brandingHelp": "您可以通过改变实例名称更换Logo加入自定义样式甚至禁用到Github的外部链接来自定义File Browser的外观和给人的感觉。\n想获得更多信息请查看 {0} 。",
"changePassword": "更改密码", "changePassword": "更改密码",
"commandRunner": "命令执行器", "commandRunner": "命令执行器",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "在这里你可以设置在下面的事件中执行的命令。每行必须写一条命令。可以在命令中使用环境变量 {0} 和 {1}。关于此功能和可用环境变量的更多信息,请阅读{2}.",
"commandsUpdated": "命令已更新!", "commandsUpdated": "命令已更新!",
"customStylesheet": "自定义样式表", "createUserDir": "在添加新用户的同时自动创建用户的个人目录",
"customStylesheet": "自定义样式表CSS",
"defaultUserDescription": "这些是新用户的默认设置。",
"disableExternalLinks": "禁止外部链接(帮助文档除外)",
"documentation": "帮助文档",
"examples": "例子", "examples": "例子",
"executeOnShell": "在Shell中执行",
"executeOnShellDescription": "默认情况下File Browser通过直接调用命令的二进制包来执行命令如果想在shell中执行如Bash、PowerShell你可以在这里定义所使用的shell和参数。如果设置了这个选项所执行的命令会作为参数追加在后面。本选项对用户命令和事件钩子都生效。",
"globalRules": "这是全局允许与禁止规则。它们作用于所有用户。您可以给每个用户定义单独的特殊规则来覆盖全局规则。",
"globalSettings": "全局设置", "globalSettings": "全局设置",
"hideDotfiles": "",
"insertPath": "插入路径",
"insertRegex": "插入正则表达式",
"instanceName": "实例名称",
"language": "语言", "language": "语言",
"lockPassword": "禁止用户修改密码", "lockPassword": "禁止用户修改密码",
"newPassword": "您的新密码", "newPassword": "您的新密码",
@@ -146,91 +191,65 @@
"newUser": "新建用户", "newUser": "新建用户",
"password": "密码", "password": "密码",
"passwordUpdated": "密码已更新!", "passwordUpdated": "密码已更新!",
"path": "路径",
"perm": {
"create": "创建文件和文件夹",
"delete": "删除文件和文件夹",
"download": "下载",
"execute": "执行命令",
"modify": "编辑",
"rename": "重命名或移动文件和文件夹",
"share": "分享文件"
},
"permissions": "权限", "permissions": "权限",
"permissionsHelp": "您可以将该用户设置为管理员,也可以单独选择各项权限。如果选择了“管理员”,则其他的选项会被自动勾上,同时该用户可以管理其他用户。", "permissionsHelp": "您可以将该用户设置为管理员,也可以单独选择各项权限。如果选择了“管理员”,则其他的选项会被自动勾上,同时该用户可以管理其他用户。",
"profileSettings": "个人设置", "profileSettings": "个人设置",
"ruleExample1": "阻止用户访问所有文件夹下任何以 . 开头的文件(隐藏文件, 例如: .git, .gitignore)。", "ruleExample1": "阻止用户访问所有文件夹下任何以 . 开头的文件隐藏文件, 例如: .git, .gitignore。",
"ruleExample2": "阻止用户访问其目录范围的根目录下名为 Caddyfile 的文件。", "ruleExample2": "阻止用户访问其目录范围的根目录下名为 Caddyfile 的文件。",
"rules": "规则", "rules": "规则",
"rulesHelp": "您可以为该用户制定一组黑名单或白名单式的规则,被屏蔽的文件将不会显示在列表中,用户也无权限访问,支持相对于目录范围的路径。", "rulesHelp": "您可以为该用户制定一组黑名单或白名单式的规则,被屏蔽的文件将不会显示在列表中,用户也无权限访问,支持相对于目录范围的路径。",
"scope": "目录范围", "scope": "目录范围",
"settingsUpdated": "设置已更新!", "settingsUpdated": "设置已更新!",
"shareDuration": "分享期限",
"shareManagement": "分享管理",
"singleClick": "",
"themes": {
"dark": "深色",
"light": "浅色",
"title": "主题"
},
"user": "用户", "user": "用户",
"userCommands": "用户命令(Linux 代码)", "userCommands": "用户命令shell 命令)",
"userCommandsHelp": "指定该用户可以执行的命令(Linux 代码),用空格分隔。例如:", "userCommandsHelp": "指定该用户可以执行的命令shell 代码,用空格分隔。例如:",
"userCreated": "用户已创建!", "userCreated": "用户已创建!",
"userDefaults": "用户默认设置",
"userDeleted": "用户已删除!", "userDeleted": "用户已删除!",
"userManagement": "用户管理", "userManagement": "用户管理",
"username": "用户名",
"users": "用户",
"globalRules": "这是全局允许与禁止规则。它们作用于所有用户。您可以给每个用户定义单独的特殊规则来覆盖全局规则。",
"allowSignup": "允许用户注册",
"createUserDir": "在添加新用户的同时自动创建用户的个人目录",
"insertRegex": "插入正则表达式",
"insertPath": "Insert the path",
"userUpdated": "用户已更新!", "userUpdated": "用户已更新!",
"userDefaults": "用户默认设置", "username": "用户",
"defaultUserDescription": "这些是新用户的默认设置", "users": "用户"
"executeOnShell": "在Shell中执行",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "创建文件和文件夹",
"delete": "删除文件和文件夹",
"download": "下载",
"modify": "编辑",
"execute": "执行命令",
"rename": "重命名或移动文件和文件夹",
"share": "分享文件"
}
}, },
"sidebar": { "sidebar": {
"help": "帮助", "help": "帮助",
"hugoNew": "Hugo New",
"login": "登录", "login": "登录",
"signup": "注册",
"logout": "登出", "logout": "登出",
"myFiles": "我的文件", "myFiles": "我的文件",
"newFile": "新建文件", "newFile": "新建文件",
"newFolder": "新建文件夹", "newFolder": "新建文件夹",
"preview": "预览",
"settings": "设置", "settings": "设置",
"siteSettings": "网站设置", "signup": "注册",
"hugoNew": "Hugo New", "siteSettings": "网站设置"
"preview": "预览"
}, },
"search": { "success": {
"images": "图像", "linkCopied": "链接已复制!"
"music": "音乐",
"pdf": "PDF",
"types": "类型",
"video": "视频",
"search": "搜索...",
"typeToSearch": "输入搜索...",
"pressToSearch": "回车搜索..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "时间单位", "days": "",
"seconds": "秒",
"minutes": "分钟",
"hours": "小时", "hours": "小时",
"days": "天" "minutes": "分钟",
}, "seconds": "秒",
"download": { "unit": "时间单位"
"downloadFile": "下载文件",
"downloadFolder": "下载文件夹"
} }
} }

View File

@@ -1,7 +1,5 @@
{ {
"permanent": "永久",
"buttons": { "buttons": {
"shell": "切換 shell",
"cancel": "取消", "cancel": "取消",
"close": "關閉", "close": "關閉",
"copy": "複製", "copy": "複製",
@@ -10,6 +8,7 @@
"create": "建立", "create": "建立",
"delete": "刪除", "delete": "刪除",
"download": "下載", "download": "下載",
"hideDotfiles": "",
"info": "資訊", "info": "資訊",
"more": "更多", "more": "更多",
"move": "移動", "move": "移動",
@@ -17,25 +16,28 @@
"new": "新", "new": "新",
"next": "下一個", "next": "下一個",
"ok": "確認", "ok": "確認",
"replace": "更換", "permalink": "獲取永久連結",
"previous": "上一個", "previous": "上一個",
"publish": "發佈",
"rename": "重新命名", "rename": "重新命名",
"replace": "更換",
"reportIssue": "報告問題", "reportIssue": "報告問題",
"save": "儲存", "save": "儲存",
"schedule": "計畫",
"search": "搜尋", "search": "搜尋",
"select": "選擇", "select": "選擇",
"share": "分享",
"publish": "發佈",
"selectMultiple": "選擇多個", "selectMultiple": "選擇多個",
"schedule": "計畫", "share": "分享",
"shell": "切換 shell",
"switchView": "切換顯示方式", "switchView": "切換顯示方式",
"toggleSidebar": "切換側邊欄", "toggleSidebar": "切換側邊欄",
"update": "更新", "update": "更新",
"upload": "上傳", "upload": "上傳"
"permalink": "獲取永久連結"
}, },
"success": { "download": {
"linkCopied": "連結已複製!" "downloadFile": "下載檔案",
"downloadFolder": "下載資料夾",
"downloadSelected": ""
}, },
"errors": { "errors": {
"forbidden": "您無權訪問。", "forbidden": "您無權訪問。",
@@ -43,11 +45,11 @@
"notFound": "找不到檔案。" "notFound": "找不到檔案。"
}, },
"files": { "files": {
"folders": "資料夾",
"files": "檔案",
"body": "内容", "body": "内容",
"clear": "清空", "clear": "清空",
"closePreview": "關閉預覽", "closePreview": "關閉預覽",
"files": "檔案",
"folders": "資料夾",
"home": "主頁", "home": "主頁",
"lastModified": "最後修改", "lastModified": "最後修改",
"loading": "讀取中...", "loading": "讀取中...",
@@ -56,9 +58,9 @@
"multipleSelectionEnabled": "多選模式已開啟", "multipleSelectionEnabled": "多選模式已開啟",
"name": "名稱", "name": "名稱",
"size": "大小", "size": "大小",
"sortByLastModified": "按最後修改時間排序",
"sortByName": "按名稱排序", "sortByName": "按名稱排序",
"sortBySize": "按大小排序", "sortBySize": "按大小排序"
"sortByLastModified": "按最後修改時間排序"
}, },
"help": { "help": {
"click": "選擇檔案或目錄", "click": "選擇檔案或目錄",
@@ -74,18 +76,39 @@
"f2": "重新命名檔案/資料夾", "f2": "重新命名檔案/資料夾",
"help": "幫助" "help": "幫助"
}, },
"languages": {
"ar": "العربية",
"de": "Deutsch",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "DutchBelgium",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "Romanian",
"ru": "Русский",
"svSE": "SwedishSweden",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": { "login": {
"password": "密碼",
"passwordConfirm": "確認密碼",
"submit": "登入",
"createAnAccount": "新建賬戶", "createAnAccount": "新建賬戶",
"loginInstead": "已有賬戶登錄", "loginInstead": "已有賬戶登錄",
"password": "密碼",
"passwordConfirm": "確認密碼",
"passwordsDontMatch": "密碼不匹配", "passwordsDontMatch": "密碼不匹配",
"usernameTaken": "用戶名已存在",
"signup": "註冊", "signup": "註冊",
"submit": "登入",
"username": "帳號", "username": "帳號",
"usernameTaken": "用戶名已存在",
"wrongCredentials": "帳號或密碼錯誤" "wrongCredentials": "帳號或密碼錯誤"
}, },
"permanent": "永久",
"prompts": { "prompts": {
"copy": "複製", "copy": "複製",
"copyMessage": "請選擇欲複製至的目錄:", "copyMessage": "請選擇欲複製至的目錄:",
@@ -102,43 +125,64 @@
"lastModified": "最後修改", "lastModified": "最後修改",
"move": "移動", "move": "移動",
"moveMessage": "請選擇欲移動至的目錄:", "moveMessage": "請選擇欲移動至的目錄:",
"newArchetype": "建立一個基於原型的新貼文。您的檔案將會建立在內容資料夾中。",
"newDir": "建立目錄", "newDir": "建立目錄",
"newDirMessage": "請輸入新目錄的名稱。", "newDirMessage": "請輸入新目錄的名稱。",
"newFile": "建立檔案", "newFile": "建立檔案",
"newFileMessage": "請輸入新檔案的名稱。", "newFileMessage": "請輸入新檔案的名稱。",
"numberDirs": "目錄數", "numberDirs": "目錄數",
"numberFiles": "檔案數", "numberFiles": "檔案數",
"replace": "替換",
"replaceMessage": "您嘗試上傳的檔案中有一個與現有檔案的名稱存在衝突。是否取代現有的同名檔案?",
"rename": "重新命名", "rename": "重新命名",
"renameMessage": "請輸入新名稱,舊名稱為:", "renameMessage": "請輸入新名稱,舊名稱為:",
"show": "顯示", "replace": "替換",
"size": "大小", "replaceMessage": "您嘗試上傳的檔案中有一個與現有檔案的名稱存在衝突。是否取代現有的同名檔案?",
"schedule": "計畫", "schedule": "計畫",
"scheduleMessage": "請選擇發佈這篇貼文的日期。", "scheduleMessage": "請選擇發佈這篇貼文的日期。",
"newArchetype": "建立一個基於原型的新貼文。您的檔案將會建立在內容資料夾中。" "show": "顯示",
"size": "大小",
"upload": "上傳",
"uploadMessage": "選擇上傳項。"
},
"search": {
"images": "影像",
"music": "音樂",
"pdf": "PDF",
"pressToSearch": "按確認鍵搜尋...",
"search": "搜尋...",
"typeToSearch": "輸入以搜尋...",
"types": "類型",
"video": "影片"
}, },
"settings": { "settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "管理員", "admin": "管理員",
"administrator": "管理員", "administrator": "管理員",
"allowCommands": "執行命令", "allowCommands": "執行命令",
"allowEdit": "編輯、重命名或刪除檔案/目錄", "allowEdit": "編輯、重命名或刪除檔案/目錄",
"allowNew": "創建新檔案和目錄", "allowNew": "創建新檔案和目錄",
"allowPublish": "發佈新的貼文與頁面", "allowPublish": "發佈新的貼文與頁面",
"allowSignup": "允許使用者註冊",
"avoidChanges": "(留空以避免更改)", "avoidChanges": "(留空以避免更改)",
"branding": "品牌",
"brandingDirectoryPath": "品牌資訊資料夾路徑",
"brandingHelp": "您可以通過改變例項名稱更換Logo加入自定義樣式甚至禁用到Github的外部連結來自定義File Browser的外觀和給人的感覺。\n想獲得更多資訊請檢視 {0} 。",
"changePassword": "更改密碼", "changePassword": "更改密碼",
"commandRunner": "Command runner", "commandRunner": "命令執行器",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.", "commandRunnerHelp": "在這裡你可以設定在下面的事件中執行的命令。每行必須寫一條命令。可以在命令中使用環境變數 {0} 和 {1}。關於此功能和可用環境變數的更多資訊,請閱讀{2}.",
"commandsUpdated": "命令已更新!", "commandsUpdated": "命令已更新!",
"createUserDir": "在新增新使用者的同時自動建立使用者的個人目錄",
"customStylesheet": "自定義樣式表", "customStylesheet": "自定義樣式表",
"defaultUserDescription": "這些是新使用者的預設設定。",
"disableExternalLinks": "禁止外部連結(幫助文件除外)",
"documentation": "幫助文件",
"examples": "範例", "examples": "範例",
"executeOnShell": "在Shell中執行",
"executeOnShellDescription": "預設情況下File Browser通過直接呼叫命令的二進位制包來執行命令如果想在shell中執行如Bash、PowerShell你可以在這裡定義所使用的shell和參數。如果設定了這個選項所執行的命令會作為參數追加在後面。本選項對使用者命令和事件鉤子都生效。",
"globalRules": "這是全局允許與禁止規則。它們作用於所有使用者。您可以給每個使用者定義單獨的特殊規則來覆蓋全局規則。",
"globalSettings": "全域設定", "globalSettings": "全域設定",
"hideDotfiles": "",
"insertPath": "插入路徑",
"insertRegex": "插入正規表示式",
"instanceName": "例項名稱",
"language": "語言", "language": "語言",
"lockPassword": "禁止使用者修改密碼", "lockPassword": "禁止使用者修改密碼",
"newPassword": "您的新密碼", "newPassword": "您的新密碼",
@@ -146,6 +190,16 @@
"newUser": "建立使用者", "newUser": "建立使用者",
"password": "密碼", "password": "密碼",
"passwordUpdated": "密碼已更新!", "passwordUpdated": "密碼已更新!",
"path": "",
"perm": {
"create": "建立檔案和資料夾",
"delete": "刪除檔案和資料夾",
"download": "下載",
"execute": "執行命令",
"modify": "編輯檔案",
"rename": "重命名或移動檔案/資料夾",
"share": "分享檔案"
},
"permissions": "權限", "permissions": "權限",
"permissionsHelp": "您可以將該使用者設置為管理員,也可以單獨選擇各項權限。如果選擇了“管理員”,則其他的選項會被自動勾上,同時該使用者可以管理其他使用者。", "permissionsHelp": "您可以將該使用者設置為管理員,也可以單獨選擇各項權限。如果選擇了“管理員”,則其他的選項會被自動勾上,同時該使用者可以管理其他使用者。",
"profileSettings": "個人設定", "profileSettings": "個人設定",
@@ -155,82 +209,46 @@
"rulesHelp": "您可以為該使用者製定一組黑名單或白名單式的規則,被屏蔽的檔案將不會顯示在清單中,使用者也無權限存取,支持相對於目錄範圍的路徑。", "rulesHelp": "您可以為該使用者製定一組黑名單或白名單式的規則,被屏蔽的檔案將不會顯示在清單中,使用者也無權限存取,支持相對於目錄範圍的路徑。",
"scope": "目錄範圍", "scope": "目錄範圍",
"settingsUpdated": "設定已更新!", "settingsUpdated": "設定已更新!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"themes": {
"dark": "深色",
"light": "淺色",
"title": "主題"
},
"user": "使用者", "user": "使用者",
"userCommands": "使用者命令", "userCommands": "使用者命令",
"userCommandsHelp": "指定該使用者可以執行的命令,用空格分隔。例如:", "userCommandsHelp": "指定該使用者可以執行的命令,用空格分隔。例如:",
"userCreated": "使用者已建立!", "userCreated": "使用者已建立!",
"userDefaults": "使用者預設選項",
"userDeleted": "使用者已刪除!", "userDeleted": "使用者已刪除!",
"userManagement": "使用者管理", "userManagement": "使用者管理",
"username": "使用者名稱",
"users": "使用者",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"createUserDir": "Auto create user home dir while adding new user",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "使用者已更新!", "userUpdated": "使用者已更新!",
"userDefaults": "User default settings", "username": "使用者名稱",
"defaultUserDescription": "This are the default settings for new users.", "users": "使用者"
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "建立檔案和資料夾",
"delete": "刪除檔案和資料夾",
"download": "下載",
"modify": "編輯檔案",
"execute": "Execute commands",
"rename": "重命名或移動檔案/資料夾",
"share": "分享檔案"
}
}, },
"sidebar": { "sidebar": {
"help": "幫助", "help": "幫助",
"hugoNew": "Hugo New",
"login": "登入", "login": "登入",
"signup": "註冊",
"logout": "登出", "logout": "登出",
"myFiles": "我的檔案", "myFiles": "我的檔案",
"newFile": "建立檔案", "newFile": "建立檔案",
"newFolder": "建立資料夾", "newFolder": "建立資料夾",
"preview": "預覽",
"settings": "設定", "settings": "設定",
"siteSettings": "網站設定", "signup": "註冊",
"hugoNew": "Hugo New", "siteSettings": "網站設定"
"preview": "預覽"
}, },
"search": { "success": {
"images": "影像", "linkCopied": "連結已複製!"
"music": "音樂",
"pdf": "PDF",
"types": "類型",
"video": "影片",
"search": "搜尋...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
}, },
"time": { "time": {
"unit": "時間單位", "days": "",
"seconds": "秒",
"minutes": "分鐘",
"hours": "小時", "hours": "小時",
"days": "天" "minutes": "分鐘",
}, "seconds": "秒",
"download": { "unit": "時間單位"
"downloadFile": "下載檔案",
"downloadFolder": "下載資料夾"
} }
} }

View File

@@ -9,6 +9,7 @@ import User from '@/views/settings/User'
import Settings from '@/views/Settings' import Settings from '@/views/Settings'
import GlobalSettings from '@/views/settings/Global' import GlobalSettings from '@/views/settings/Global'
import ProfileSettings from '@/views/settings/Profile' import ProfileSettings from '@/views/settings/Profile'
import Shares from '@/views/settings/Shares'
import Error403 from '@/views/errors/403' import Error403 from '@/views/errors/403'
import Error404 from '@/views/errors/404' import Error404 from '@/views/errors/404'
import Error500 from '@/views/errors/500' import Error500 from '@/views/errors/500'
@@ -67,6 +68,11 @@ const router = new Router({
name: 'Profile Settings', name: 'Profile Settings',
component: ProfileSettings component: ProfileSettings
}, },
{
path: '/settings/shares',
name: 'Shares',
component: Shares
},
{ {
path: '/settings/global', path: '/settings/global',
name: 'Global Settings', name: 'Global Settings',

View File

@@ -3,7 +3,17 @@ const getters = {
isFiles: state => !state.loading && state.route.name === 'Files', isFiles: state => !state.loading && state.route.name === 'Files',
isListing: (state, getters) => getters.isFiles && state.req.isDir, isListing: (state, getters) => getters.isFiles && state.req.isDir,
isEditor: (state, getters) => getters.isFiles && (state.req.type === 'text' || state.req.type === 'textImmutable'), isEditor: (state, getters) => getters.isFiles && (state.req.type === 'text' || state.req.type === 'textImmutable'),
selectedCount: state => state.selected.length isPreview: state => state.previewMode,
isSharing: state => !state.loading && state.route.name === 'Share',
selectedCount: state => state.selected.length,
progress : state => {
if (state.upload.progress.length == 0) {
return 0;
}
let sum = state.upload.progress.reduce((acc, val) => acc + val)
return Math.ceil(sum / state.upload.size * 100);
}
} }
export default getters export default getters

View File

@@ -2,6 +2,7 @@ import Vue from 'vue'
import Vuex from 'vuex' import Vuex from 'vuex'
import mutations from './mutations' import mutations from './mutations'
import getters from './getters' import getters from './getters'
import upload from './modules/upload'
Vue.use(Vuex) Vue.use(Vuex)
@@ -22,12 +23,16 @@ const state = {
show: null, show: null,
showShell: false, showShell: false,
showMessage: null, showMessage: null,
showConfirm: null showConfirm: null,
previewMode: false,
hash: '',
token: '',
} }
export default new Vuex.Store({ export default new Vuex.Store({
strict: true, strict: true,
state, state,
getters, getters,
mutations mutations,
modules: { upload }
}) })

View File

@@ -0,0 +1,102 @@
import Vue from 'vue'
import { files as api } from '@/api'
import throttle from 'lodash.throttle'
import buttons from '@/utils/buttons'
const UPLOADS_LIMIT = 5;
const state = {
id: 0,
size: 0,
progress: [],
queue: [],
uploads: {}
}
const mutations = {
setProgress(state, { id, loaded }) {
Vue.set(state.progress, id, loaded)
},
reset: (state) => {
state.id = 0
state.size = 0
state.progress = []
},
addJob: (state, item) => {
state.queue.push(item)
state.size += item.file.size
state.id++
},
moveJob(state) {
const item = state.queue[0]
state.queue.shift()
Vue.set(state.uploads, item.id, item)
},
removeJob(state, id) {
delete state.uploads[id]
}
}
const beforeUnload = (event) => {
event.preventDefault()
event.returnValue = ''
}
const actions = {
upload: (context, item) => {
let uploadsCount = Object.keys(context.state.uploads).length;
let isQueueEmpty = context.state.queue.length == 0
let isUploadsEmpty = uploadsCount == 0
if (isQueueEmpty && isUploadsEmpty) {
window.addEventListener('beforeunload', beforeUnload)
buttons.loading('upload')
}
context.commit('addJob', item)
context.dispatch('processUploads')
},
finishUpload: (context, item) => {
context.commit('setProgress', { id: item.id, loaded: item.file.size })
context.commit('removeJob', item.id)
context.dispatch('processUploads')
},
processUploads: async (context) => {
let uploadsCount = Object.keys(context.state.uploads).length;
let isBellowLimit = uploadsCount < UPLOADS_LIMIT
let isQueueEmpty = context.state.queue.length == 0
let isUploadsEmpty = uploadsCount == 0
let isFinished = isQueueEmpty && isUploadsEmpty
let canProcess = isBellowLimit && !isQueueEmpty
if (isFinished) {
window.removeEventListener('beforeunload', beforeUnload)
buttons.success('upload')
context.commit('reset')
context.commit('setReload', true, { root: true })
}
if (canProcess) {
const item = context.state.queue[0];
context.commit('moveJob')
if (item.file.isDir) {
await api.post(item.path).catch(Vue.prototype.$showError)
} else {
let onUpload = throttle(
(event) => context.commit('setProgress', { id: item.id, loaded: event.loaded }),
100, { leading: true, trailing: false }
)
await api.post(item.path, item.file, item.overwrite, onUpload).catch(Vue.prototype.$showError)
}
context.dispatch('finishUpload', item)
}
}
}
export default { state, mutations, actions, namespaced: true }

View File

@@ -46,6 +46,7 @@ const mutations = {
state.user = value state.user = value
}, },
setJWT: (state, value) => (state.jwt = value), setJWT: (state, value) => (state.jwt = value),
setToken: (state, value ) => (state.token = value),
multiple: (state, value) => (state.multiple = value), multiple: (state, value) => (state.multiple = value),
addSelected: (state, value) => (state.selected.push(value)), addSelected: (state, value) => (state.selected.push(value)),
addPlugin: (state, value) => { addPlugin: (state, value) => {
@@ -78,14 +79,16 @@ const mutations = {
updateClipboard: (state, value) => { updateClipboard: (state, value) => {
state.clipboard.key = value.key state.clipboard.key = value.key
state.clipboard.items = value.items state.clipboard.items = value.items
state.clipboard.path = value.path
}, },
resetClipboard: (state) => { resetClipboard: (state) => {
state.clipboard.key = '' state.clipboard.key = ''
state.clipboard.items = [] state.clipboard.items = []
}, },
setProgress: (state, value) => { setPreviewMode(state, value) {
state.progress = value state.previewMode = value
} },
setHash: (state, value) => (state.hash = value),
} }
export default mutations export default mutations

View File

@@ -11,6 +11,9 @@ const noAuth = window.FileBrowser.NoAuth
const authMethod = window.FileBrowser.AuthMethod const authMethod = window.FileBrowser.AuthMethod
const loginPage = window.FileBrowser.LoginPage const loginPage = window.FileBrowser.LoginPage
const theme = window.FileBrowser.Theme const theme = window.FileBrowser.Theme
const enableThumbs = window.FileBrowser.EnableThumbs
const resizePreview = window.FileBrowser.ResizePreview
const enableExec = window.FileBrowser.EnableExec
export { export {
name, name,
@@ -24,5 +27,8 @@ export {
noAuth, noAuth,
authMethod, authMethod,
loginPage, loginPage,
theme theme,
enableThumbs,
resizePreview,
enableExec
} }

View File

@@ -0,0 +1,124 @@
import store from '@/store'
import url from '@/utils/url'
export function checkConflict(files, items) {
if (typeof items === 'undefined' || items === null) {
items = []
}
let folder_upload = files[0].fullPath !== undefined
let conflict = false
for (let i = 0; i < files.length; i++) {
let file = files[i]
let name = file.name
if (folder_upload) {
let dirs = file.fullPath.split("/")
if (dirs.length > 1) {
name = dirs[0]
}
}
let res = items.findIndex(function hasConflict(element) {
return (element.name === this)
}, name)
if (res >= 0) {
conflict = true
break
}
}
return conflict
}
export function scanFiles(dt) {
return new Promise((resolve) => {
let reading = 0
const contents = []
if (dt.items !== undefined) {
for (let item of dt.items) {
if (item.kind === "file" && typeof item.webkitGetAsEntry === "function") {
const entry = item.webkitGetAsEntry()
readEntry(entry)
}
}
} else {
resolve(dt.files)
}
function readEntry(entry, directory = "") {
if (entry.isFile) {
reading++
entry.file(file => {
reading--
file.fullPath = `${directory}${file.name}`
contents.push(file)
if (reading === 0) {
resolve(contents)
}
})
} else if (entry.isDirectory) {
const dir = {
isDir: true,
size: 0,
fullPath: `${directory}${entry.name}`
}
contents.push(dir)
readReaderContent(entry.createReader(), `${directory}${entry.name}`)
}
}
function readReaderContent(reader, directory) {
reading++
reader.readEntries(function (entries) {
reading--
if (entries.length > 0) {
for (const entry of entries) {
readEntry(entry, `${directory}/`)
}
readReaderContent(reader, `${directory}/`)
}
if (reading === 0) {
resolve(contents)
}
})
}
})
}
export function handleFiles(files, base, overwrite = false) {
for (let i = 0; i < files.length; i++) {
let id = store.state.upload.id
let path = base
let file = files[i]
if (file.fullPath !== undefined) {
path += url.encodePath(file.fullPath)
} else {
path += url.encodeRFC5987ValueChars(file.name)
}
if (file.isDir) {
path += '/'
}
const item = {
id,
path,
file,
overwrite
}
store.dispatch('upload/upload', item);
}
}

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