Compare commits
125 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e3b35b30e | ||
|
|
05bfae264a | ||
|
|
4c233c3db3 | ||
|
|
7797a4ef18 | ||
|
|
d70650689c | ||
|
|
8dddc8a450 | ||
|
|
cdf8def330 | ||
|
|
e167c3e1ef | ||
|
|
fe5ca74aa1 | ||
|
|
dfad87386f | ||
|
|
6d7ba65faf | ||
|
|
d5487ba6fa | ||
|
|
34a08170c8 | ||
|
|
d49c3dfacf | ||
|
|
2cfee2183c | ||
|
|
fb1a09c7c1 | ||
|
|
b19710efca | ||
|
|
ff9502ff34 | ||
|
|
62f0dfb302 | ||
|
|
81cd8fc6d3 | ||
|
|
70c826133b | ||
|
|
2f6c473977 | ||
|
|
bf36cc00f1 | ||
|
|
883383a571 | ||
|
|
0a05f8c01f | ||
|
|
a4b089a6db | ||
|
|
5c5ab6b875 | ||
|
|
04e03a83b4 | ||
|
|
c4e955acf4 | ||
|
|
fc04578e28 | ||
|
|
3264cea830 | ||
|
|
748af7172c | ||
|
|
da595326ee | ||
|
|
821fba41a2 | ||
|
|
cfafefa35a | ||
|
|
391a078cd4 | ||
|
|
fc2ee37353 | ||
|
|
a09dfa8d9f | ||
|
|
4dbc802972 | ||
|
|
d59ad594b8 | ||
|
|
a4cb813ddf | ||
|
|
4d0a68e787 | ||
|
|
a744bd224f | ||
|
|
da1fe7c9d7 | ||
|
|
7fabadc871 | ||
|
|
c3079d30e2 | ||
|
|
6a31af6c0a | ||
|
|
21d361ad30 | ||
|
|
d574fb6d1a | ||
|
|
bb4bb508a9 | ||
|
|
edd808f124 | ||
|
|
cdcd9a313a | ||
|
|
d0c3aeace1 | ||
|
|
9484454584 | ||
|
|
bd3c1941ff | ||
|
|
01f7842a18 | ||
|
|
38f7788255 | ||
|
|
c1fb4004f7 | ||
|
|
584b706b1e | ||
|
|
ecdd684bf1 | ||
|
|
36af01daa6 | ||
|
|
d0c3b8033d | ||
|
|
aa00c1c89c | ||
|
|
a404fb043d | ||
|
|
95fec7f694 | ||
|
|
5994224468 | ||
|
|
374bbd3ec1 | ||
|
|
2c97573301 | ||
|
|
70eba7ecc9 | ||
|
|
7a4d0c0c08 | ||
|
|
8838a09cf5 | ||
|
|
184b7c14f2 | ||
|
|
289c8e6f32 | ||
|
|
ff1e0b8185 | ||
|
|
0ac39684f1 | ||
|
|
fa390c498d | ||
|
|
4b72bbfc7f | ||
|
|
2a4a46c61a | ||
|
|
efd41cc4c1 | ||
|
|
912f27a9e3 | ||
|
|
4e28cc13c9 | ||
|
|
f37513c45e | ||
|
|
4d77ce0955 | ||
|
|
66dfbb303c | ||
|
|
9bf6b856e5 | ||
|
|
051104bfa0 | ||
|
|
b8ee3404ee | ||
|
|
853ec906ef | ||
|
|
7b35815754 | ||
|
|
2744f7d5b9 | ||
|
|
b508ac3d4f | ||
|
|
ff4375cf6c | ||
|
|
a664ba1f9d | ||
|
|
bb3486286c | ||
|
|
ecfcbfd216 | ||
|
|
9bcfa900f9 | ||
|
|
c2f1423c02 | ||
|
|
6744cd47ce | ||
|
|
a4ef02a47b | ||
|
|
1a5b999545 | ||
|
|
10d628aecc | ||
|
|
fa95299df4 | ||
|
|
fd22e0b163 | ||
|
|
428c1c606d | ||
|
|
60d1e2d291 | ||
|
|
11e9202160 | ||
|
|
59619ba34f | ||
|
|
73dd066670 | ||
|
|
2b2c1085fb | ||
|
|
02db83c72e | ||
|
|
3a0dace9a9 | ||
|
|
a5757b94e8 | ||
|
|
1ebfc64ea1 | ||
|
|
2c14146a31 | ||
|
|
a49105db1d | ||
|
|
0401adf7f4 | ||
|
|
c1e6d5869a | ||
|
|
db0a23aec0 | ||
|
|
350c73d78e | ||
|
|
daf36b28fd | ||
|
|
57c99e0e26 | ||
|
|
aaed985699 | ||
|
|
0ed32c6af8 | ||
|
|
dda9a389f3 | ||
|
|
f80b016ef0 |
@@ -1,3 +1,5 @@
|
|||||||
*
|
*
|
||||||
!docker/*
|
!docker/*
|
||||||
|
!healthcheck.sh
|
||||||
|
!docker_config.json
|
||||||
!filebrowser
|
!filebrowser
|
||||||
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
3
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -4,12 +4,11 @@ Please explain the changes you made here.
|
|||||||
If the feature changes current behaviour, explain why your solution is better.
|
If the feature changes current behaviour, explain why your solution is better.
|
||||||
-->
|
-->
|
||||||
|
|
||||||
:rotating_light: Before submitting your PR, please read [community](https://github.com/filebrowser/community), and indicate which issues (in any of the repos) are either fixed or closed by this PR. See [GitHub Help: Closing issues using keywords](https://help.github.com/articles/closing-issues-via-commit-messages/).
|
:rotating_light: Before submitting your PR, please indicate which issues are either fixed or closed by this PR. See [GitHub Help: Closing issues using keywords](https://help.github.com/articles/closing-issues-via-commit-messages/).
|
||||||
|
|
||||||
- [ ] DO make sure you are requesting to **pull a topic/feature/bugfix branch** (right side). Don't request your master!
|
- [ ] DO make sure you are requesting to **pull a topic/feature/bugfix branch** (right side). Don't request your master!
|
||||||
- [ ] DO make sure you are making a pull request against the **master branch** (left side). Also you should start *your branch* off *our master*.
|
- [ ] DO make sure you are making a pull request against the **master branch** (left side). Also you should start *your branch* off *our master*.
|
||||||
- [ ] DO make sure that File Browser can be successfully built. See [builds](https://github.com/filebrowser/community/blob/master/builds.md) and [development](https://github.com/filebrowser/community/blob/master/development.md).
|
- [ ] DO make sure that File Browser can be successfully built. See [builds](https://github.com/filebrowser/community/blob/master/builds.md) and [development](https://github.com/filebrowser/community/blob/master/development.md).
|
||||||
- [ ] DO make sure that related issues are opened in other repositories. I.e., the frontend, caddy plugins or the web page need to be updated accordingly.
|
|
||||||
- [ ] AVOID breaking the continuous integration build.
|
- [ ] AVOID breaking the continuous integration build.
|
||||||
|
|
||||||
**Further comments**
|
**Further comments**
|
||||||
|
|||||||
42
.github/workflows/main.yaml
vendored
42
.github/workflows/main.yaml
vendored
@@ -13,28 +13,28 @@ jobs:
|
|||||||
lint-frontend:
|
lint-frontend:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '16'
|
node-version: '18'
|
||||||
- run: make lint-frontend
|
- run: make lint-frontend
|
||||||
lint-backend:
|
lint-backend:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v2
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: 1.18.3
|
go-version: 1.21.0
|
||||||
- run: make lint-backend
|
- run: make lint-backend
|
||||||
lint-commits:
|
lint-commits:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '16'
|
node-version: '18'
|
||||||
- run: make lint-commits
|
- run: make lint-commits
|
||||||
lint:
|
lint:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -46,18 +46,18 @@ jobs:
|
|||||||
test-frontend:
|
test-frontend:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '16'
|
node-version: '18'
|
||||||
- run: make test-frontend
|
- run: make test-frontend
|
||||||
test-backend:
|
test-backend:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
- uses: actions/setup-go@v2
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: 1.18.3
|
go-version: 1.21.0
|
||||||
- run: make test-backend
|
- run: make test-backend
|
||||||
test:
|
test:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
@@ -71,15 +71,15 @@ jobs:
|
|||||||
needs: [lint, test]
|
needs: [lint, test]
|
||||||
if: startsWith(github.event.ref, 'refs/tags/v')
|
if: startsWith(github.event.ref, 'refs/tags/v')
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
- uses: actions/setup-go@v2
|
- uses: actions/setup-go@v5
|
||||||
with:
|
with:
|
||||||
go-version: 1.18.3
|
go-version: 1.21.0
|
||||||
- uses: actions/setup-node@v2
|
- uses: actions/setup-node@v4
|
||||||
with:
|
with:
|
||||||
node-version: '16'
|
node-version: '18'
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v1
|
uses: docker/setup-qemu-action@v1
|
||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
@@ -95,6 +95,6 @@ jobs:
|
|||||||
uses: goreleaser/goreleaser-action@v2
|
uses: goreleaser/goreleaser-action@v2
|
||||||
with:
|
with:
|
||||||
version: latest
|
version: latest
|
||||||
args: release --rm-dist
|
args: release --clean
|
||||||
env:
|
env:
|
||||||
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
|
GITHUB_TOKEN: ${{ secrets.GH_PAT }}
|
||||||
|
|||||||
24
.github/workflows/stale.yml
vendored
Normal file
24
.github/workflows/stale.yml
vendored
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
name: 'Close stale issues and PRs'
|
||||||
|
permissions:
|
||||||
|
issues: write
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
on:
|
||||||
|
schedule:
|
||||||
|
- cron: '30 1 * * *'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
stale:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/stale@v5
|
||||||
|
with:
|
||||||
|
stale-pr-message: 'This PR is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
|
||||||
|
close-pr-message: 'This PR was closed because it has been stalled for 5 days with no activity.'
|
||||||
|
stale-issue-message: 'This issue is stale because it has been open 30 days with no activity. Remove stale label or comment or this will be closed in 5 days.'
|
||||||
|
close-issue-message: 'This issue was closed because it has been stalled for 5 days with no activity.'
|
||||||
|
days-before-stale: 30
|
||||||
|
days-before-close: 5
|
||||||
|
exempt-issue-labels: 'feature ☘,enhancement ⚙,bug 🐞'
|
||||||
|
exempt-pr-labels: 'need-help,wip'
|
||||||
|
operations-per-run: 100
|
||||||
3
.gitignore
vendored
3
.gitignore
vendored
@@ -29,3 +29,6 @@ yarn-error.log*
|
|||||||
*.sw*
|
*.sw*
|
||||||
bin/
|
bin/
|
||||||
build/
|
build/
|
||||||
|
|
||||||
|
/frontend/dist/*
|
||||||
|
!/frontend/dist/.gitkeep
|
||||||
|
|||||||
@@ -54,7 +54,6 @@ linters:
|
|||||||
enable:
|
enable:
|
||||||
- bodyclose
|
- bodyclose
|
||||||
- deadcode
|
- deadcode
|
||||||
- depguard
|
|
||||||
- dogsled
|
- dogsled
|
||||||
- dupl
|
- dupl
|
||||||
- errcheck
|
- errcheck
|
||||||
|
|||||||
108
.goreleaser.yml
108
.goreleaser.yml
@@ -3,32 +3,33 @@ project_name: filebrowser
|
|||||||
env:
|
env:
|
||||||
- GO111MODULE=on
|
- GO111MODULE=on
|
||||||
|
|
||||||
build:
|
builds:
|
||||||
env:
|
- env:
|
||||||
- CGO_ENABLED=0
|
- CGO_ENABLED=0
|
||||||
ldflags:
|
ldflags:
|
||||||
- -s -w -X github.com/filebrowser/filebrowser/v2/version.Version={{ .Version }} -X github.com/filebrowser/filebrowser/v2/version.CommitSHA={{ .ShortCommit }}
|
- -s -w -X github.com/filebrowser/filebrowser/v2/version.Version={{ .Version }} -X github.com/filebrowser/filebrowser/v2/version.CommitSHA={{ .ShortCommit }}
|
||||||
main: main.go
|
main: main.go
|
||||||
binary: filebrowser
|
binary: filebrowser
|
||||||
goos:
|
goos:
|
||||||
- darwin
|
- darwin
|
||||||
- linux
|
- linux
|
||||||
- windows
|
- windows
|
||||||
- freebsd
|
- freebsd
|
||||||
goarch:
|
goarch:
|
||||||
- amd64
|
- amd64
|
||||||
- 386
|
- 386
|
||||||
- arm
|
- arm
|
||||||
- arm64
|
- arm64
|
||||||
goarm:
|
- riscv64
|
||||||
- 5
|
goarm:
|
||||||
- 6
|
- 5
|
||||||
- 7
|
- 6
|
||||||
ignore:
|
- 7
|
||||||
- goos: darwin
|
ignore:
|
||||||
goarch: 386
|
- goos: darwin
|
||||||
- goos: freebsd
|
goarch: 386
|
||||||
goarch: arm
|
- goos: freebsd
|
||||||
|
goarch: arm
|
||||||
|
|
||||||
archives:
|
archives:
|
||||||
-
|
-
|
||||||
@@ -57,6 +58,7 @@ dockers:
|
|||||||
- "filebrowser/filebrowser:v{{ .Major }}-amd64"
|
- "filebrowser/filebrowser:v{{ .Major }}-amd64"
|
||||||
extra_files:
|
extra_files:
|
||||||
- docker_config.json
|
- docker_config.json
|
||||||
|
- healthcheck.sh
|
||||||
-
|
-
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
use: buildx
|
use: buildx
|
||||||
@@ -75,6 +77,7 @@ dockers:
|
|||||||
- "filebrowser/filebrowser:v{{ .Major }}-arm64"
|
- "filebrowser/filebrowser:v{{ .Major }}-arm64"
|
||||||
extra_files:
|
extra_files:
|
||||||
- docker_config.json
|
- docker_config.json
|
||||||
|
- healthcheck.sh
|
||||||
-
|
-
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
use: buildx
|
use: buildx
|
||||||
@@ -94,6 +97,7 @@ dockers:
|
|||||||
- "filebrowser/filebrowser:v{{ .Major }}-armv6"
|
- "filebrowser/filebrowser:v{{ .Major }}-armv6"
|
||||||
extra_files:
|
extra_files:
|
||||||
- docker_config.json
|
- docker_config.json
|
||||||
|
- healthcheck.sh
|
||||||
-
|
-
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
use: buildx
|
use: buildx
|
||||||
@@ -113,6 +117,7 @@ dockers:
|
|||||||
- "filebrowser/filebrowser:v{{ .Major }}-armv7"
|
- "filebrowser/filebrowser:v{{ .Major }}-armv7"
|
||||||
extra_files:
|
extra_files:
|
||||||
- docker_config.json
|
- docker_config.json
|
||||||
|
- healthcheck.sh
|
||||||
## s6 based docker images
|
## s6 based docker images
|
||||||
-
|
-
|
||||||
dockerfile: Dockerfile.s6
|
dockerfile: Dockerfile.s6
|
||||||
@@ -150,85 +155,38 @@ dockers:
|
|||||||
- "filebrowser/filebrowser:v{{ .Major }}-arm64-s6"
|
- "filebrowser/filebrowser:v{{ .Major }}-arm64-s6"
|
||||||
extra_files:
|
extra_files:
|
||||||
- docker/root
|
- docker/root
|
||||||
-
|
|
||||||
dockerfile: Dockerfile.s6.armhf
|
|
||||||
use: buildx
|
|
||||||
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
|
|
||||||
goarch: arm
|
|
||||||
goarm: '6'
|
|
||||||
image_templates:
|
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv6-s6"
|
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-armv6-s6"
|
|
||||||
extra_files:
|
|
||||||
- docker/root
|
|
||||||
-
|
|
||||||
dockerfile: Dockerfile.s6.armhf
|
|
||||||
use: buildx
|
|
||||||
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
|
|
||||||
goarch: arm
|
|
||||||
goarm: '7'
|
|
||||||
image_templates:
|
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv7-s6"
|
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-armv7-s6"
|
|
||||||
extra_files:
|
|
||||||
- docker/root
|
|
||||||
docker_manifests:
|
docker_manifests:
|
||||||
- name_template: "filebrowser/filebrowser:latest"
|
- name_template: "filebrowser/filebrowser:latest"
|
||||||
image_templates:
|
image_templates:
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-amd64"
|
- "filebrowser/filebrowser:{{ .Tag }}-amd64"
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-arm64"
|
- "filebrowser/filebrowser:{{ .Tag }}-arm64"
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv6"
|
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv7"
|
- "filebrowser/filebrowser:{{ .Tag }}-armv7"
|
||||||
- name_template: "filebrowser/filebrowser:{{ .Tag }}"
|
- name_template: "filebrowser/filebrowser:{{ .Tag }}"
|
||||||
image_templates:
|
image_templates:
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-amd64"
|
- "filebrowser/filebrowser:{{ .Tag }}-amd64"
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-arm64"
|
- "filebrowser/filebrowser:{{ .Tag }}-arm64"
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv6"
|
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv7"
|
- "filebrowser/filebrowser:{{ .Tag }}-armv7"
|
||||||
- name_template: "filebrowser/filebrowser:v{{ .Major }}"
|
- name_template: "filebrowser/filebrowser:v{{ .Major }}"
|
||||||
image_templates:
|
image_templates:
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-amd64"
|
- "filebrowser/filebrowser:v{{ .Major }}-amd64"
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-arm64"
|
- "filebrowser/filebrowser:v{{ .Major }}-arm64"
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-armv6"
|
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-armv7"
|
- "filebrowser/filebrowser:v{{ .Major }}-armv7"
|
||||||
## s6 image manifests
|
## s6 image manifests
|
||||||
- name_template: "filebrowser/filebrowser:s6"
|
- name_template: "filebrowser/filebrowser:s6"
|
||||||
image_templates:
|
image_templates:
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-amd64-s6"
|
- "filebrowser/filebrowser:{{ .Tag }}-amd64-s6"
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-arm64-s6"
|
- "filebrowser/filebrowser:{{ .Tag }}-arm64-s6"
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv6-s6"
|
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv7-s6"
|
|
||||||
- name_template: "filebrowser/filebrowser:{{ .Tag }}-s6"
|
- name_template: "filebrowser/filebrowser:{{ .Tag }}-s6"
|
||||||
image_templates:
|
image_templates:
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-amd64-s6"
|
- "filebrowser/filebrowser:{{ .Tag }}-amd64-s6"
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-arm64-s6"
|
- "filebrowser/filebrowser:{{ .Tag }}-arm64-s6"
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv6-s6"
|
|
||||||
- "filebrowser/filebrowser:{{ .Tag }}-armv7-s6"
|
|
||||||
- name_template: "filebrowser/filebrowser:v{{ .Major }}-s6"
|
- name_template: "filebrowser/filebrowser:v{{ .Major }}-s6"
|
||||||
image_templates:
|
image_templates:
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-amd64-s6"
|
- "filebrowser/filebrowser:v{{ .Major }}-amd64-s6"
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-arm64-s6"
|
- "filebrowser/filebrowser:v{{ .Major }}-arm64-s6"
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-armv6-s6"
|
|
||||||
- "filebrowser/filebrowser:v{{ .Major }}-armv7-s6"
|
|
||||||
brews:
|
brews:
|
||||||
- name: filebrowser
|
- name: filebrowser
|
||||||
tap:
|
repository:
|
||||||
owner: filebrowser
|
owner: filebrowser
|
||||||
name: homebrew-tap
|
name: homebrew-tap
|
||||||
folder: Formula
|
folder: Formula
|
||||||
@@ -237,4 +195,4 @@ brews:
|
|||||||
name: FileBrowser Robot
|
name: FileBrowser Robot
|
||||||
email: robot@filebrowser.org
|
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
|
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"
|
license: "MIT"
|
||||||
|
|||||||
203
CHANGELOG.md
203
CHANGELOG.md
@@ -2,6 +2,209 @@
|
|||||||
|
|
||||||
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.28.0](https://github.com/filebrowser/filebrowser/compare/v2.27.0...v2.28.0) (2024-04-01)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* allow to configure if home directory is automatically created from cli ([#2963](https://github.com/filebrowser/filebrowser/issues/2963)) ([a4b089a](https://github.com/filebrowser/filebrowser/commit/a4b089a6dbf9821ecede428cd7d13e69c8b85231))
|
||||||
|
* auto hiding header bar in preview to enlarge the preview window ([#3024](https://github.com/filebrowser/filebrowser/issues/3024)) ([d706506](https://github.com/filebrowser/filebrowser/commit/d70650689c34ce9f631fda6a453fd521faef22fa))
|
||||||
|
* close editor when click escape key ([#2947](https://github.com/filebrowser/filebrowser/issues/2947)) ([70c8261](https://github.com/filebrowser/filebrowser/commit/70c826133b8578b8712e6db8f762a15a076cd9a9))
|
||||||
|
* enable preview in shared folder ([#3055](https://github.com/filebrowser/filebrowser/issues/3055)) ([4c233c3](https://github.com/filebrowser/filebrowser/commit/4c233c3db39ea5a00d6e602ec0ecbddecb590877))
|
||||||
|
* focus editor when opened ([#2946](https://github.com/filebrowser/filebrowser/issues/2946)) ([b19710e](https://github.com/filebrowser/filebrowser/commit/b19710efca6daa7af56dc211d0051d500d2eea22))
|
||||||
|
* freezing the list in the backgroud while previewing a file ([#3004](https://github.com/filebrowser/filebrowser/issues/3004)) ([e167c3e](https://github.com/filebrowser/filebrowser/commit/e167c3e1efed8b16be45d994a8d443fda1d8cf49))
|
||||||
|
* prompt to confirm discard editor changes ([#2948](https://github.com/filebrowser/filebrowser/issues/2948)) ([fb1a09c](https://github.com/filebrowser/filebrowser/commit/fb1a09c7c172b913c12b30975ca545e505df0c05))
|
||||||
|
* select multiple files with ctrl even with singleClick option ([#2953](https://github.com/filebrowser/filebrowser/issues/2953)) ([d49c3df](https://github.com/filebrowser/filebrowser/commit/d49c3dfacfc0ff07e620b3ad2700e64927b06235))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* dashboard buttons position in rtl layout ([#2949](https://github.com/filebrowser/filebrowser/issues/2949)) ([2cfee21](https://github.com/filebrowser/filebrowser/commit/2cfee2183c98d0cb67fc4e9788644ed4278e25bc))
|
||||||
|
* editor discard prompt ([#2990](https://github.com/filebrowser/filebrowser/issues/2990)) ([34a0817](https://github.com/filebrowser/filebrowser/commit/34a08170c894321d49bb843e259a0e59e2245998))
|
||||||
|
* files and directories are created with the correct permissions ([#2966](https://github.com/filebrowser/filebrowser/issues/2966)) ([5c5ab6b](https://github.com/filebrowser/filebrowser/commit/5c5ab6b8750a5168f0ae2a26bd5de41e0b6d9637))
|
||||||
|
* fix lint warnings ([#2976](https://github.com/filebrowser/filebrowser/issues/2976)) ([fe5ca74](https://github.com/filebrowser/filebrowser/commit/fe5ca74aa1e4257e5cb36f1de58daa0c3548319f))
|
||||||
|
* **healthcheck:** use address configured if not empty ([#2938](https://github.com/filebrowser/filebrowser/issues/2938)) ([81cd8fc](https://github.com/filebrowser/filebrowser/commit/81cd8fc6d307b00af278beefcdbad4158a128fea))
|
||||||
|
* keyboard shortcut to confirm prompts ([#2932](https://github.com/filebrowser/filebrowser/issues/2932)) ([ff9502f](https://github.com/filebrowser/filebrowser/commit/ff9502ff34790c46f31d175911cd51c9b62804fb))
|
||||||
|
* moment locale ([#2952](https://github.com/filebrowser/filebrowser/issues/2952)) ([883383a](https://github.com/filebrowser/filebrowser/commit/883383a5715d82883c51138dfb547805dfad2a3c))
|
||||||
|
* shell direction ([#2980](https://github.com/filebrowser/filebrowser/issues/2980)) ([6d7ba65](https://github.com/filebrowser/filebrowser/commit/6d7ba65faf576ee4ed095f3d0c41775b21e498de))
|
||||||
|
* stay in the same position after renaming or deleting ([#3039](https://github.com/filebrowser/filebrowser/issues/3039)) ([cdf8def](https://github.com/filebrowser/filebrowser/commit/cdf8def3304315bef261da7f52f8599d90b1f0f0))
|
||||||
|
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* **deps-dev:** bump vite from 4.4.12 to 4.5.2 in /frontend ([#2951](https://github.com/filebrowser/filebrowser/issues/2951)) ([bf36cc0](https://github.com/filebrowser/filebrowser/commit/bf36cc00f1369dd10a422f230ccabcbeefae1517))
|
||||||
|
* **deps:** bump google.golang.org/protobuf from 1.31.0 to 1.33.0 ([#3045](https://github.com/filebrowser/filebrowser/issues/3045)) ([05bfae2](https://github.com/filebrowser/filebrowser/commit/05bfae264a7a477d1b7db582f06f4efb24d26ec9))
|
||||||
|
* **deps:** bump google.golang.org/protobuf in /tools ([#3044](https://github.com/filebrowser/filebrowser/issues/3044)) ([7797a4e](https://github.com/filebrowser/filebrowser/commit/7797a4ef18038a877df31bd34f2ebf70d18823f8))
|
||||||
|
|
||||||
|
## [2.27.0](https://github.com/filebrowser/filebrowser/compare/v2.26.0...v2.27.0) (2024-01-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* allow setting theme via cli ([#2881](https://github.com/filebrowser/filebrowser/issues/2881)) ([748af71](https://github.com/filebrowser/filebrowser/commit/748af7172ce96f0b66c394e88839bd57c194ffc7))
|
||||||
|
* display image resolutions in file details ([#2830](https://github.com/filebrowser/filebrowser/issues/2830)) ([a09dfa8](https://github.com/filebrowser/filebrowser/commit/a09dfa8d9f190243d811a841de44c4abb4403d87))
|
||||||
|
* make user session timeout configurable by flags ([#2845](https://github.com/filebrowser/filebrowser/issues/2845)) ([391a078](https://github.com/filebrowser/filebrowser/commit/391a078cd486e618c95a0c5850326076cbc025b6))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* delete message when delete file from preview ([3264cea](https://github.com/filebrowser/filebrowser/commit/3264cea8307dca9ab5463dc81f2a10a817eb3d54))
|
||||||
|
* fix typo ([#2843](https://github.com/filebrowser/filebrowser/issues/2843)) ([4dbc802](https://github.com/filebrowser/filebrowser/commit/4dbc802972c930f5f42fc27507fac35c28c42afd))
|
||||||
|
* set correct port in docker healthcheck ([#2812](https://github.com/filebrowser/filebrowser/issues/2812)) ([d59ad59](https://github.com/filebrowser/filebrowser/commit/d59ad594b8649f57f61453b0dfbc350c57b690a2))
|
||||||
|
* typo in build error [#2903](https://github.com/filebrowser/filebrowser/issues/2903) ([#2904](https://github.com/filebrowser/filebrowser/issues/2904)) ([c4e955a](https://github.com/filebrowser/filebrowser/commit/c4e955acf4a1a8f8e8e94f697ffc838515e69a60))
|
||||||
|
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* **deps-dev:** bump vite from 4.4.9 to 4.4.12 in /frontend ([#2862](https://github.com/filebrowser/filebrowser/issues/2862)) ([fc2ee37](https://github.com/filebrowser/filebrowser/commit/fc2ee373536584d024f7def62f350bdbb712d927))
|
||||||
|
* **deps:** bump golang.org/x/crypto from 0.14.0 to 0.17.0 ([#2890](https://github.com/filebrowser/filebrowser/issues/2890)) ([821fba4](https://github.com/filebrowser/filebrowser/commit/821fba41a25ba99d47641f01b10ac51960157888))
|
||||||
|
|
||||||
|
## [2.26.0](https://github.com/filebrowser/filebrowser/compare/v2.25.0...v2.26.0) (2023-11-02)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add modern greek translation ([#2778](https://github.com/filebrowser/filebrowser/issues/2778)) ([c3079d3](https://github.com/filebrowser/filebrowser/commit/c3079d30e22385d7e677f172324cd9cbab6487ce))
|
||||||
|
* make user session timeout configurable ([#2753](https://github.com/filebrowser/filebrowser/issues/2753)) ([7fabadc](https://github.com/filebrowser/filebrowser/commit/7fabadc871ea91ea22fe9454e2ca4b33e5c211be))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* avoid the front-end calling api/renew loop ([#2792](https://github.com/filebrowser/filebrowser/issues/2792)) ([edd808f](https://github.com/filebrowser/filebrowser/commit/edd808f124f4ada99bcbe4bca98ddbe20e5a424c))
|
||||||
|
* disable static resource files listing ([da1fe7c](https://github.com/filebrowser/filebrowser/commit/da1fe7c9d76a9c6a25bfa19ebd6cf8023eff5d62))
|
||||||
|
* display file size as base 2 (KiB instead of KB) ([#2779](https://github.com/filebrowser/filebrowser/issues/2779)) ([cdcd9a3](https://github.com/filebrowser/filebrowser/commit/cdcd9a313aa50c2e6806a182b6838462d42dcafe))
|
||||||
|
* goreleaser yaml ([4d0a68e](https://github.com/filebrowser/filebrowser/commit/4d0a68e7875274f4c939f2bfa15739a9b0ecf70a))
|
||||||
|
* revert fetchURL changes in auth (Fixes [#2729](https://github.com/filebrowser/filebrowser/issues/2729)) ([#2739](https://github.com/filebrowser/filebrowser/issues/2739)) ([bd3c194](https://github.com/filebrowser/filebrowser/commit/bd3c1941ff8289a5dae877e08f7e25fa9b2a92c5))
|
||||||
|
* solve docker build failed issue ([#2797](https://github.com/filebrowser/filebrowser/issues/2797)) ([6a31af6](https://github.com/filebrowser/filebrowser/commit/6a31af6c0a144128af865d802c8039fa5250e946))
|
||||||
|
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* **deps-dev:** bump postcss from 8.4.27 to 8.4.31 in /frontend ([#2749](https://github.com/filebrowser/filebrowser/issues/2749)) ([21d361a](https://github.com/filebrowser/filebrowser/commit/21d361ad308d109d2a6b323597019aaa09ce1781))
|
||||||
|
* **deps:** bump @babel/traverse in /frontend ([#2775](https://github.com/filebrowser/filebrowser/issues/2775)) ([bb4bb50](https://github.com/filebrowser/filebrowser/commit/bb4bb508a9d71516e8fa80b3a6285fe002a059d2))
|
||||||
|
* **deps:** bump golang.org/x/image from 0.5.0 to 0.10.0 ([#2800](https://github.com/filebrowser/filebrowser/issues/2800)) ([a744bd2](https://github.com/filebrowser/filebrowser/commit/a744bd224f0ff1efc53ab94481fa76ef68788df1))
|
||||||
|
* **deps:** bump golang.org/x/net from 0.11.0 to 0.17.0 ([#2758](https://github.com/filebrowser/filebrowser/issues/2758)) ([d574fb6](https://github.com/filebrowser/filebrowser/commit/d574fb6d1af41ec31778b0f402674e5111a7875d))
|
||||||
|
* fix deprecated goreleaser config options ([38f7788](https://github.com/filebrowser/filebrowser/commit/38f77882559133b9ff330cfb955a9d4ea4728cf8))
|
||||||
|
|
||||||
|
## [2.25.0](https://github.com/filebrowser/filebrowser/compare/v2.24.2...v2.25.0) (2023-09-14)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add new folder button to move/create dialogs ([#2667](https://github.com/filebrowser/filebrowser/issues/2667)) ([5994224](https://github.com/filebrowser/filebrowser/commit/599422446849fa37d5ab448bbf464afb7304b99d))
|
||||||
|
* added shell resizing ([#2648](https://github.com/filebrowser/filebrowser/issues/2648)) ([584b706](https://github.com/filebrowser/filebrowser/commit/584b706b1e310297acc2580c60442ff5c11ae432))
|
||||||
|
* implement abort upload functionality ([#2673](https://github.com/filebrowser/filebrowser/issues/2673)) ([a404fb0](https://github.com/filebrowser/filebrowser/commit/a404fb043da2573bf04385863b2d34b1f918b8e1))
|
||||||
|
* implement upload speed calculation and ETA estimation ([#2677](https://github.com/filebrowser/filebrowser/issues/2677)) ([ecdd684](https://github.com/filebrowser/filebrowser/commit/ecdd684bf1d537a4591caa38348102b61dd51e5d))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* refactor path resolution logic for project root ([#2674](https://github.com/filebrowser/filebrowser/issues/2674)) ([95fec7f](https://github.com/filebrowser/filebrowser/commit/95fec7f69430c108e5cf95c428db9d671cd97a94))
|
||||||
|
* tus upload with cloudflare proxy ([36af01d](https://github.com/filebrowser/filebrowser/commit/36af01daa6e04005ce3d18985eebaeef06f7393d)), closes [#2593](https://github.com/filebrowser/filebrowser/issues/2593)
|
||||||
|
|
||||||
|
|
||||||
|
### Refactorings
|
||||||
|
|
||||||
|
* migrate frontend tooling to vite 4 ([#2645](https://github.com/filebrowser/filebrowser/issues/2645)) ([8838a09](https://github.com/filebrowser/filebrowser/commit/8838a09cf5104deac22b6143050588040c6825e6))
|
||||||
|
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* bump go version to 1.21.0 ([#2672](https://github.com/filebrowser/filebrowser/issues/2672)) ([2c97573](https://github.com/filebrowser/filebrowser/commit/2c97573301a1b13179678fb7f9bd8316539ecdff))
|
||||||
|
* bump node version to 18 ([#2671](https://github.com/filebrowser/filebrowser/issues/2671)) ([70eba7e](https://github.com/filebrowser/filebrowser/commit/70eba7ecc9d19545c0899ae40eb3897a7c48562f))
|
||||||
|
|
||||||
|
|
||||||
|
### Performance improvements
|
||||||
|
|
||||||
|
* **backend:** optimize subtitles detection performance ([#2637](https://github.com/filebrowser/filebrowser/issues/2637)) ([374bbd3](https://github.com/filebrowser/filebrowser/commit/374bbd3ec199fddbe491ab2b74e520a10a73e54b))
|
||||||
|
|
||||||
|
### [2.24.2](https://github.com/filebrowser/filebrowser/compare/v2.24.1...v2.24.2) (2023-08-08)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* 403 error error when uploading ([#2598](https://github.com/filebrowser/filebrowser/issues/2598)) ([289c8e6](https://github.com/filebrowser/filebrowser/commit/289c8e6f32eb520cc711389f6b6a4ed94a73ecd4))
|
||||||
|
* config init for branding.disableUsedPercentage ([#2576](https://github.com/filebrowser/filebrowser/issues/2576)) ([#2596](https://github.com/filebrowser/filebrowser/issues/2596)) ([ff1e0b8](https://github.com/filebrowser/filebrowser/commit/ff1e0b8185faf14b1f8e91830ca5e71e68ab672e))
|
||||||
|
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* add riscv64 binary releases ([#2587](https://github.com/filebrowser/filebrowser/issues/2587)) ([0ac3968](https://github.com/filebrowser/filebrowser/commit/0ac39684f175487314e97403406f4d2c482e3d79))
|
||||||
|
|
||||||
|
### [2.24.1](https://github.com/filebrowser/filebrowser/compare/v2.24.0...v2.24.1) (2023-07-31)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add directory creation code to partial upload handler ([#2575](https://github.com/filebrowser/filebrowser/issues/2575)) ([#2580](https://github.com/filebrowser/filebrowser/issues/2580)) ([912f27a](https://github.com/filebrowser/filebrowser/commit/912f27a9e3286ee4bf2a27b366a1d35b3b55799c))
|
||||||
|
* resolved CSS rendering issue in Chrome browser ([#2582](https://github.com/filebrowser/filebrowser/issues/2582)) ([2a4a46c](https://github.com/filebrowser/filebrowser/commit/2a4a46c61a5d5376bea65b28d0eb6a7ec2fdf4e5))
|
||||||
|
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* **backend:** upgrade golangci-lint to v1.53.3 ([efd41cc](https://github.com/filebrowser/filebrowser/commit/efd41cc4c147b8d2d5e61fb2642df8d934f49362))
|
||||||
|
|
||||||
|
## [2.24.0](https://github.com/filebrowser/filebrowser/compare/v2.23.0...v2.24.0) (2023-07-29)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add a healthcheck script that works with a dynamic port ([#2510](https://github.com/filebrowser/filebrowser/issues/2510)) ([ff4375c](https://github.com/filebrowser/filebrowser/commit/ff4375cf6ce849459889f892dd91304703c52dcd))
|
||||||
|
* add a new setting that disables the display of the disk usage ([#2136](https://github.com/filebrowser/filebrowser/issues/2136)) ([428c1c6](https://github.com/filebrowser/filebrowser/commit/428c1c606d1b858ed0eb58b7c31f570bc6a9b792))
|
||||||
|
* add Hungarian translation ([#2232](https://github.com/filebrowser/filebrowser/issues/2232)) ([11e9202](https://github.com/filebrowser/filebrowser/commit/11e92021607e12efff9fb2d5c8728483eee31199))
|
||||||
|
* add option to copy download links from shares ([#2442](https://github.com/filebrowser/filebrowser/issues/2442)) ([a4ef02a](https://github.com/filebrowser/filebrowser/commit/a4ef02a47b53742a0ac1f639563b0c67116619c8))
|
||||||
|
* integrate tus.io for resumable and chunked uploads ([#2145](https://github.com/filebrowser/filebrowser/issues/2145)) ([7b35815](https://github.com/filebrowser/filebrowser/commit/7b35815754690540f76e3ffe114eedb47cfd5c7e))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* added an early return on non-existent items ([#2571](https://github.com/filebrowser/filebrowser/issues/2571)) ([2744f7d](https://github.com/filebrowser/filebrowser/commit/2744f7d5b9106c7c2eec69010e550e0939c23d80))
|
||||||
|
* build on FreeBSD and non-Linux platforms ([#2332](https://github.com/filebrowser/filebrowser/issues/2332)) ([60d1e2d](https://github.com/filebrowser/filebrowser/commit/60d1e2d2913cce591fbee97337bd58310480269f))
|
||||||
|
* error while using fallback of dir move ([#2349](https://github.com/filebrowser/filebrowser/issues/2349)) ([853ec90](https://github.com/filebrowser/filebrowser/commit/853ec906efbdee9013c5d34ed1d9b8fee88a6b29))
|
||||||
|
* filter ANSI color for shell ([#2529](https://github.com/filebrowser/filebrowser/issues/2529)) ([9bcfa90](https://github.com/filebrowser/filebrowser/commit/9bcfa900f904fe683c8d9085947f57932bfe22a0))
|
||||||
|
* goreleaser docker build ([051104b](https://github.com/filebrowser/filebrowser/commit/051104bfa061720d4402c612e61bb0fc80a946bf))
|
||||||
|
* solve broken Docker build with alpine image ([#2486](https://github.com/filebrowser/filebrowser/issues/2486)) ([b8ee340](https://github.com/filebrowser/filebrowser/commit/b8ee3404ee480ef1fd439543ab6d46f318ff3647))
|
||||||
|
* video preview click next or prev button subtitles not update ([#2423](https://github.com/filebrowser/filebrowser/issues/2423)) ([6744cd4](https://github.com/filebrowser/filebrowser/commit/6744cd47cef87e3a76a2190bdf123b6c2197fe6f))
|
||||||
|
* xss vulnerability in /api/raw ([#2570](https://github.com/filebrowser/filebrowser/issues/2570)) ([#2572](https://github.com/filebrowser/filebrowser/issues/2572)) ([b508ac3](https://github.com/filebrowser/filebrowser/commit/b508ac3d4f7f0f75d6b49c99bdc661a6d2173f30))
|
||||||
|
|
||||||
|
|
||||||
|
### Refactorings
|
||||||
|
|
||||||
|
* replace username old focus logic with the autofocus attribute ([#2223](https://github.com/filebrowser/filebrowser/issues/2223)) ([2b2c108](https://github.com/filebrowser/filebrowser/commit/2b2c1085fb50ad68612ad438e527fd316d8aafee))
|
||||||
|
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* **backend:** bump go version to 1.20.1 ([fa95299](https://github.com/filebrowser/filebrowser/commit/fa95299df4aa7e4c54d872e786a91ded5bdb01c1))
|
||||||
|
* **backend:** bump go version to 1.20.6 ([9bf6b85](https://github.com/filebrowser/filebrowser/commit/9bf6b856e5411e635ba9102ff53dfe927183848e))
|
||||||
|
* **deps-dev:** bump word-wrap from 1.2.3 to 1.2.4 in /frontend ([#2556](https://github.com/filebrowser/filebrowser/issues/2556)) ([bb34862](https://github.com/filebrowser/filebrowser/commit/bb3486286c0da112ad97456ad258ddcdfe17c154))
|
||||||
|
* **deps:** bump minimatch from 3.0.4 to 3.1.2 in /tools ([#2561](https://github.com/filebrowser/filebrowser/issues/2561)) ([a664ba1](https://github.com/filebrowser/filebrowser/commit/a664ba1f9df45c7f6d03492c85466c5aa07c740e))
|
||||||
|
* **deps:** bump semver from 5.7.1 to 5.7.2 in /tools ([#2546](https://github.com/filebrowser/filebrowser/issues/2546)) ([c2f1423](https://github.com/filebrowser/filebrowser/commit/c2f1423c02e4736f4c243c3164dc671879e065f3))
|
||||||
|
* remove armv6-s6 docker target ([66dfbb3](https://github.com/filebrowser/filebrowser/commit/66dfbb303cf792b7b01650d0125d948ab8d81ddd))
|
||||||
|
* remove armv7-s6 docker target ([4d77ce0](https://github.com/filebrowser/filebrowser/commit/4d77ce0955644551f891af3e4098c37e9cc37e40))
|
||||||
|
|
||||||
|
## [2.23.0](https://github.com/filebrowser/filebrowser/compare/v2.22.4...v2.23.0) (2022-11-05)
|
||||||
|
|
||||||
|
|
||||||
|
### Features
|
||||||
|
|
||||||
|
* add rtl support ([#2178](https://github.com/filebrowser/filebrowser/issues/2178)) ([2c14146](https://github.com/filebrowser/filebrowser/commit/2c14146a314bb271be66a36c63b64852a2848e26))
|
||||||
|
* hebrew translation ([#2168](https://github.com/filebrowser/filebrowser/issues/2168)) ([a49105d](https://github.com/filebrowser/filebrowser/commit/a49105db1d5f0d8f3d6641940ea86da959ffe006))
|
||||||
|
* hook authentication method ([dda9a38](https://github.com/filebrowser/filebrowser/commit/dda9a389f387e94643a9a2ae56027260b210152a))
|
||||||
|
* update Polish translation ([#2089](https://github.com/filebrowser/filebrowser/issues/2089)) ([57c99e0](https://github.com/filebrowser/filebrowser/commit/57c99e0e261b4ed4c2cf468ce3ab09f1a440b359))
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* missing video controls on mobile ([#2180](https://github.com/filebrowser/filebrowser/issues/2180)) ([a5757b9](https://github.com/filebrowser/filebrowser/commit/a5757b94e8ed492d454b9e427b7f45824cc56c5c))
|
||||||
|
* modify the delete confirmation interface logic. ([#2138](https://github.com/filebrowser/filebrowser/issues/2138)) ([0401adf](https://github.com/filebrowser/filebrowser/commit/0401adf7f4dd76760fe26b5baee02ebc726b51a9))
|
||||||
|
|
||||||
|
|
||||||
|
### Build
|
||||||
|
|
||||||
|
* **deps:** bump ansi-html and webpack-dev-server in /frontend ([#2184](https://github.com/filebrowser/filebrowser/issues/2184)) ([3a0dace](https://github.com/filebrowser/filebrowser/commit/3a0dace9a93f9d57855801de548891010cf0830e))
|
||||||
|
* **deps:** bump terser from 4.8.0 to 4.8.1 in /frontend ([#2054](https://github.com/filebrowser/filebrowser/issues/2054)) ([aaed985](https://github.com/filebrowser/filebrowser/commit/aaed985699b3c63092ecb02c8bc07634123360ab))
|
||||||
|
|
||||||
### [2.22.4](https://github.com/filebrowser/filebrowser/compare/v2.22.3...v2.22.4) (2022-07-18)
|
### [2.22.4](https://github.com/filebrowser/filebrowser/compare/v2.22.3...v2.22.4) (2022-07-18)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,10 +1,14 @@
|
|||||||
FROM alpine:latest
|
FROM alpine:latest
|
||||||
RUN apk --update add ca-certificates \
|
RUN apk --update add ca-certificates \
|
||||||
mailcap \
|
mailcap \
|
||||||
curl
|
curl \
|
||||||
|
jq
|
||||||
|
|
||||||
|
COPY healthcheck.sh /healthcheck.sh
|
||||||
|
RUN chmod +x /healthcheck.sh # Make the script executable
|
||||||
|
|
||||||
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \
|
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \
|
||||||
CMD curl -f http://localhost/health || exit 1
|
CMD /healthcheck.sh || exit 1
|
||||||
|
|
||||||
VOLUME /srv
|
VOLUME /srv
|
||||||
EXPOSE 80
|
EXPOSE 80
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM ghcr.io/linuxserver/baseimage-alpine:3.14
|
FROM ghcr.io/linuxserver/baseimage-alpine:3.17
|
||||||
|
|
||||||
RUN apk --update add ca-certificates \
|
RUN apk --update add ca-certificates \
|
||||||
mailcap \
|
mailcap \
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.14
|
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.17
|
||||||
|
|
||||||
RUN apk --update add ca-certificates \
|
RUN apk --update add ca-certificates \
|
||||||
mailcap \
|
mailcap \
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.14
|
FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.17
|
||||||
|
|
||||||
RUN apk --update add ca-certificates \
|
RUN apk --update add ca-certificates \
|
||||||
mailcap \
|
mailcap \
|
||||||
|
|||||||
@@ -12,6 +12,12 @@
|
|||||||
|
|
||||||
filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app.
|
filebrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files. It allows the creation of multiple users and each user can have its own directory. It can be used as a standalone app.
|
||||||
|
|
||||||
|
## Demo
|
||||||
|
|
||||||
|
url: https://demo.filebrowser.org/
|
||||||
|
|
||||||
|
credentials: `demo`/`demo`
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
|
|
||||||
Please refer to our docs at [https://filebrowser.org/features](https://filebrowser.org/features)
|
Please refer to our docs at [https://filebrowser.org/features](https://filebrowser.org/features)
|
||||||
|
|||||||
@@ -3,13 +3,14 @@ package auth
|
|||||||
import (
|
import (
|
||||||
"net/http"
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/filebrowser/filebrowser/v2/settings"
|
||||||
"github.com/filebrowser/filebrowser/v2/users"
|
"github.com/filebrowser/filebrowser/v2/users"
|
||||||
)
|
)
|
||||||
|
|
||||||
// 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.Store, root string) (*users.User, error)
|
Auth(r *http.Request, usr users.Store, stg *settings.Settings, srv *settings.Server) (*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
|
||||||
}
|
}
|
||||||
|
|||||||
302
auth/hook.go
Normal file
302
auth/hook.go
Normal file
@@ -0,0 +1,302 @@
|
|||||||
|
package auth
|
||||||
|
|
||||||
|
import (
|
||||||
|
"encoding/json"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
|
"os"
|
||||||
|
"os/exec"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/filebrowser/filebrowser/v2/errors"
|
||||||
|
"github.com/filebrowser/filebrowser/v2/files"
|
||||||
|
"github.com/filebrowser/filebrowser/v2/settings"
|
||||||
|
"github.com/filebrowser/filebrowser/v2/users"
|
||||||
|
)
|
||||||
|
|
||||||
|
// MethodHookAuth is used to identify hook auth.
|
||||||
|
const MethodHookAuth settings.AuthMethod = "hook"
|
||||||
|
|
||||||
|
type hookCred struct {
|
||||||
|
Password string `json:"password"`
|
||||||
|
Username string `json:"username"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// HookAuth is a hook implementation of an Auther.
|
||||||
|
type HookAuth struct {
|
||||||
|
Users users.Store `json:"-"`
|
||||||
|
Settings *settings.Settings `json:"-"`
|
||||||
|
Server *settings.Server `json:"-"`
|
||||||
|
Cred hookCred `json:"-"`
|
||||||
|
Fields hookFields `json:"-"`
|
||||||
|
Command string `json:"command"`
|
||||||
|
}
|
||||||
|
|
||||||
|
// Auth authenticates the user via a json in content body.
|
||||||
|
func (a *HookAuth) Auth(r *http.Request, usr users.Store, stg *settings.Settings, srv *settings.Server) (*users.User, error) {
|
||||||
|
var cred hookCred
|
||||||
|
|
||||||
|
if r.Body == nil {
|
||||||
|
return nil, os.ErrPermission
|
||||||
|
}
|
||||||
|
|
||||||
|
err := json.NewDecoder(r.Body).Decode(&cred)
|
||||||
|
if err != nil {
|
||||||
|
return nil, os.ErrPermission
|
||||||
|
}
|
||||||
|
|
||||||
|
a.Users = usr
|
||||||
|
a.Settings = stg
|
||||||
|
a.Server = srv
|
||||||
|
a.Cred = cred
|
||||||
|
|
||||||
|
action, err := a.RunCommand()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
switch action {
|
||||||
|
case "auth":
|
||||||
|
u, err := a.SaveUser()
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return u, nil
|
||||||
|
case "block":
|
||||||
|
return nil, os.ErrPermission
|
||||||
|
case "pass":
|
||||||
|
u, err := a.Users.Get(a.Server.Root, a.Cred.Username)
|
||||||
|
if err != nil || !users.CheckPwd(a.Cred.Password, u.Password) {
|
||||||
|
return nil, os.ErrPermission
|
||||||
|
}
|
||||||
|
return u, nil
|
||||||
|
default:
|
||||||
|
return nil, fmt.Errorf("invalid hook action: %s", action)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// LoginPage tells that hook auth requires a login page.
|
||||||
|
func (a *HookAuth) LoginPage() bool {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
// RunCommand starts the hook command and returns the action
|
||||||
|
func (a *HookAuth) RunCommand() (string, error) {
|
||||||
|
command := strings.Split(a.Command, " ")
|
||||||
|
envMapping := func(key string) string {
|
||||||
|
switch key {
|
||||||
|
case "USERNAME":
|
||||||
|
return a.Cred.Username
|
||||||
|
case "PASSWORD":
|
||||||
|
return a.Cred.Password
|
||||||
|
default:
|
||||||
|
return os.Getenv(key)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i, arg := range command {
|
||||||
|
if i == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
command[i] = os.Expand(arg, envMapping)
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd := exec.Command(command[0], command[1:]...) //nolint:gosec
|
||||||
|
cmd.Env = append(os.Environ(), fmt.Sprintf("USERNAME=%s", a.Cred.Username))
|
||||||
|
cmd.Env = append(cmd.Env, fmt.Sprintf("PASSWORD=%s", a.Cred.Password))
|
||||||
|
out, err := cmd.Output()
|
||||||
|
if err != nil {
|
||||||
|
return "", err
|
||||||
|
}
|
||||||
|
|
||||||
|
a.GetValues(string(out))
|
||||||
|
|
||||||
|
return a.Fields.Values["hook.action"], nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetValues creates a map with values from the key-value format string
|
||||||
|
func (a *HookAuth) GetValues(s string) {
|
||||||
|
m := map[string]string{}
|
||||||
|
|
||||||
|
// make line breaks consistent on Windows platform
|
||||||
|
s = strings.ReplaceAll(s, "\r\n", "\n")
|
||||||
|
|
||||||
|
// iterate input lines
|
||||||
|
for _, val := range strings.Split(s, "\n") {
|
||||||
|
v := strings.SplitN(val, "=", 2) //nolint: gomnd
|
||||||
|
|
||||||
|
// skips non key and value format
|
||||||
|
if len(v) != 2 { //nolint: gomnd
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
fieldKey := strings.TrimSpace(v[0])
|
||||||
|
fieldValue := strings.TrimSpace(v[1])
|
||||||
|
|
||||||
|
if a.Fields.IsValid(fieldKey) {
|
||||||
|
m[fieldKey] = fieldValue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a.Fields.Values = m
|
||||||
|
}
|
||||||
|
|
||||||
|
// SaveUser updates the existing user or creates a new one when not found
|
||||||
|
func (a *HookAuth) SaveUser() (*users.User, error) {
|
||||||
|
u, err := a.Users.Get(a.Server.Root, a.Cred.Username)
|
||||||
|
if err != nil && err != errors.ErrNotExist {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
if u == nil {
|
||||||
|
pass, err := users.HashPwd(a.Cred.Password)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// create user with the provided credentials
|
||||||
|
d := &users.User{
|
||||||
|
Username: a.Cred.Username,
|
||||||
|
Password: pass,
|
||||||
|
Scope: a.Settings.Defaults.Scope,
|
||||||
|
Locale: a.Settings.Defaults.Locale,
|
||||||
|
ViewMode: a.Settings.Defaults.ViewMode,
|
||||||
|
SingleClick: a.Settings.Defaults.SingleClick,
|
||||||
|
Sorting: a.Settings.Defaults.Sorting,
|
||||||
|
Perm: a.Settings.Defaults.Perm,
|
||||||
|
Commands: a.Settings.Defaults.Commands,
|
||||||
|
HideDotfiles: a.Settings.Defaults.HideDotfiles,
|
||||||
|
}
|
||||||
|
u = a.GetUser(d)
|
||||||
|
|
||||||
|
userHome, err := a.Settings.MakeUserDir(u.Username, u.Scope, a.Server.Root)
|
||||||
|
if err != nil {
|
||||||
|
return nil, fmt.Errorf("user: failed to mkdir user home dir: [%s]", userHome)
|
||||||
|
}
|
||||||
|
u.Scope = userHome
|
||||||
|
log.Printf("user: %s, home dir: [%s].", u.Username, userHome)
|
||||||
|
|
||||||
|
err = a.Users.Save(u)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
} else if p := !users.CheckPwd(a.Cred.Password, u.Password); len(a.Fields.Values) > 1 || p {
|
||||||
|
u = a.GetUser(u)
|
||||||
|
|
||||||
|
// update the password when it doesn't match the current
|
||||||
|
if p {
|
||||||
|
pass, err := users.HashPwd(a.Cred.Password)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
u.Password = pass
|
||||||
|
}
|
||||||
|
|
||||||
|
// update user with provided fields
|
||||||
|
err := a.Users.Update(u)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return u, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetUser returns a User filled with hook values or provided defaults
|
||||||
|
func (a *HookAuth) GetUser(d *users.User) *users.User {
|
||||||
|
// adds all permissions when user is admin
|
||||||
|
isAdmin := a.Fields.GetBoolean("user.perm.admin", d.Perm.Admin)
|
||||||
|
perms := users.Permissions{
|
||||||
|
Admin: isAdmin,
|
||||||
|
Execute: isAdmin || a.Fields.GetBoolean("user.perm.execute", d.Perm.Execute),
|
||||||
|
Create: isAdmin || a.Fields.GetBoolean("user.perm.create", d.Perm.Create),
|
||||||
|
Rename: isAdmin || a.Fields.GetBoolean("user.perm.rename", d.Perm.Rename),
|
||||||
|
Modify: isAdmin || a.Fields.GetBoolean("user.perm.modify", d.Perm.Modify),
|
||||||
|
Delete: isAdmin || a.Fields.GetBoolean("user.perm.delete", d.Perm.Delete),
|
||||||
|
Share: isAdmin || a.Fields.GetBoolean("user.perm.share", d.Perm.Share),
|
||||||
|
Download: isAdmin || a.Fields.GetBoolean("user.perm.download", d.Perm.Download),
|
||||||
|
}
|
||||||
|
user := users.User{
|
||||||
|
ID: d.ID,
|
||||||
|
Username: d.Username,
|
||||||
|
Password: d.Password,
|
||||||
|
Scope: a.Fields.GetString("user.scope", d.Scope),
|
||||||
|
Locale: a.Fields.GetString("user.locale", d.Locale),
|
||||||
|
ViewMode: users.ViewMode(a.Fields.GetString("user.viewMode", string(d.ViewMode))),
|
||||||
|
SingleClick: a.Fields.GetBoolean("user.singleClick", d.SingleClick),
|
||||||
|
Sorting: files.Sorting{
|
||||||
|
Asc: a.Fields.GetBoolean("user.sorting.asc", d.Sorting.Asc),
|
||||||
|
By: a.Fields.GetString("user.sorting.by", d.Sorting.By),
|
||||||
|
},
|
||||||
|
Commands: a.Fields.GetArray("user.commands", d.Commands),
|
||||||
|
HideDotfiles: a.Fields.GetBoolean("user.hideDotfiles", d.HideDotfiles),
|
||||||
|
Perm: perms,
|
||||||
|
LockPassword: true,
|
||||||
|
}
|
||||||
|
|
||||||
|
return &user
|
||||||
|
}
|
||||||
|
|
||||||
|
// hookFields is used to access fields from the hook
|
||||||
|
type hookFields struct {
|
||||||
|
Values map[string]string
|
||||||
|
}
|
||||||
|
|
||||||
|
// validHookFields contains names of the fields that can be used
|
||||||
|
var validHookFields = []string{
|
||||||
|
"hook.action",
|
||||||
|
"user.scope",
|
||||||
|
"user.locale",
|
||||||
|
"user.viewMode",
|
||||||
|
"user.singleClick",
|
||||||
|
"user.sorting.by",
|
||||||
|
"user.sorting.asc",
|
||||||
|
"user.commands",
|
||||||
|
"user.hideDotfiles",
|
||||||
|
"user.perm.admin",
|
||||||
|
"user.perm.execute",
|
||||||
|
"user.perm.create",
|
||||||
|
"user.perm.rename",
|
||||||
|
"user.perm.modify",
|
||||||
|
"user.perm.delete",
|
||||||
|
"user.perm.share",
|
||||||
|
"user.perm.download",
|
||||||
|
}
|
||||||
|
|
||||||
|
// IsValid checks if the provided field is on the valid fields list
|
||||||
|
func (hf *hookFields) IsValid(field string) bool {
|
||||||
|
for _, val := range validHookFields {
|
||||||
|
if field == val {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetString returns the string value or provided default
|
||||||
|
func (hf *hookFields) GetString(k, dv string) string {
|
||||||
|
val, ok := hf.Values[k]
|
||||||
|
if ok {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
return dv
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetBoolean returns the bool value or provided default
|
||||||
|
func (hf *hookFields) GetBoolean(k string, dv bool) bool {
|
||||||
|
val, ok := hf.Values[k]
|
||||||
|
if ok {
|
||||||
|
return val == "true"
|
||||||
|
}
|
||||||
|
return dv
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetArray returns the array value or provided default
|
||||||
|
func (hf *hookFields) GetArray(k string, dv []string) []string {
|
||||||
|
val, ok := hf.Values[k]
|
||||||
|
if ok && strings.TrimSpace(val) != "" {
|
||||||
|
return strings.Split(val, " ")
|
||||||
|
}
|
||||||
|
return dv
|
||||||
|
}
|
||||||
@@ -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.Store, root string) (*users.User, error) {
|
func (a JSONAuth) Auth(r *http.Request, usr users.Store, stg *settings.Settings, srv *settings.Server) (*users.User, error) {
|
||||||
var cred jsonCred
|
var cred jsonCred
|
||||||
|
|
||||||
if r.Body == nil {
|
if r.Body == nil {
|
||||||
@@ -51,7 +51,7 @@ func (a JSONAuth) Auth(r *http.Request, sto users.Store, root string) (*users.Us
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
u, err := sto.Get(root, cred.Username)
|
u, err := usr.Get(srv.Root, cred.Username)
|
||||||
if err != nil || !users.CheckPwd(cred.Password, u.Password) {
|
if err != nil || !users.CheckPwd(cred.Password, u.Password) {
|
||||||
return nil, os.ErrPermission
|
return nil, os.ErrPermission
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,8 +14,8 @@ 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.Store, root string) (*users.User, error) {
|
func (a NoAuth) Auth(r *http.Request, usr users.Store, stg *settings.Settings, srv *settings.Server) (*users.User, error) {
|
||||||
return sto.Get(root, uint(1))
|
return usr.Get(srv.Root, uint(1))
|
||||||
}
|
}
|
||||||
|
|
||||||
// LoginPage tells that no auth doesn't require a login page.
|
// LoginPage tells that no auth doesn't require a login page.
|
||||||
|
|||||||
@@ -18,9 +18,9 @@ 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.Store, root string) (*users.User, error) {
|
func (a ProxyAuth) Auth(r *http.Request, usr users.Store, stg *settings.Settings, srv *settings.Server) (*users.User, error) {
|
||||||
username := r.Header.Get(a.Header)
|
username := r.Header.Get(a.Header)
|
||||||
user, err := sto.Get(root, username)
|
user, err := usr.Get(srv.Root, username)
|
||||||
if err == errors.ErrNotExist {
|
if err == errors.ErrNotExist {
|
||||||
return nil, os.ErrPermission
|
return nil, os.ErrPermission
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,19 +31,23 @@ func addConfigFlags(flags *pflag.FlagSet) {
|
|||||||
addServerFlags(flags)
|
addServerFlags(flags)
|
||||||
addUserFlags(flags)
|
addUserFlags(flags)
|
||||||
flags.BoolP("signup", "s", false, "allow users to signup")
|
flags.BoolP("signup", "s", false, "allow users to signup")
|
||||||
|
flags.Bool("create-user-dir", false, "generate user's home directory automatically")
|
||||||
flags.String("shell", "", "shell command to which other commands should be appended")
|
flags.String("shell", "", "shell command to which other commands should be appended")
|
||||||
|
|
||||||
flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type")
|
flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type")
|
||||||
flags.String("auth.header", "", "HTTP header for auth.method=proxy")
|
flags.String("auth.header", "", "HTTP header for auth.method=proxy")
|
||||||
|
flags.String("auth.command", "", "command for auth.method=hook")
|
||||||
|
|
||||||
flags.String("recaptcha.host", "https://www.google.com", "use another host for ReCAPTCHA. recaptcha.net might be useful in China")
|
flags.String("recaptcha.host", "https://www.google.com", "use another host for ReCAPTCHA. recaptcha.net might be useful in China")
|
||||||
flags.String("recaptcha.key", "", "ReCaptcha site key")
|
flags.String("recaptcha.key", "", "ReCaptcha site key")
|
||||||
flags.String("recaptcha.secret", "", "ReCaptcha secret")
|
flags.String("recaptcha.secret", "", "ReCaptcha secret")
|
||||||
|
|
||||||
flags.String("branding.name", "", "replace 'File Browser' by this name")
|
flags.String("branding.name", "", "replace 'File Browser' by this name")
|
||||||
|
flags.String("branding.theme", "", "set the theme")
|
||||||
flags.String("branding.color", "", "set the theme color")
|
flags.String("branding.color", "", "set the theme color")
|
||||||
flags.String("branding.files", "", "path to directory with images and custom styles")
|
flags.String("branding.files", "", "path to directory with images and custom styles")
|
||||||
flags.Bool("branding.disableExternal", false, "disable external links such as GitHub links")
|
flags.Bool("branding.disableExternal", false, "disable external links such as GitHub links")
|
||||||
|
flags.Bool("branding.disableUsedPercentage", false, "disable used disk percentage graph")
|
||||||
}
|
}
|
||||||
|
|
||||||
//nolint:gocyclo
|
//nolint:gocyclo
|
||||||
@@ -114,6 +118,20 @@ func getAuthentication(flags *pflag.FlagSet, defaults ...interface{}) (settings.
|
|||||||
auther = jsonAuth
|
auther = jsonAuth
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if method == auth.MethodHookAuth {
|
||||||
|
command := mustGetString(flags, "auth.command")
|
||||||
|
|
||||||
|
if command == "" {
|
||||||
|
command = defaultAuther["command"].(string)
|
||||||
|
}
|
||||||
|
|
||||||
|
if command == "" {
|
||||||
|
checkErr(nerrors.New("you must set the flag 'auth.command' for method 'hook'"))
|
||||||
|
}
|
||||||
|
|
||||||
|
auther = &auth.HookAuth{Command: command}
|
||||||
|
}
|
||||||
|
|
||||||
if auther == nil {
|
if auther == nil {
|
||||||
panic(errors.ErrInvalidAuthMethod)
|
panic(errors.ErrInvalidAuthMethod)
|
||||||
}
|
}
|
||||||
@@ -132,7 +150,9 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
|
|||||||
fmt.Fprintf(w, "\tName:\t%s\n", set.Branding.Name)
|
fmt.Fprintf(w, "\tName:\t%s\n", set.Branding.Name)
|
||||||
fmt.Fprintf(w, "\tFiles override:\t%s\n", set.Branding.Files)
|
fmt.Fprintf(w, "\tFiles override:\t%s\n", set.Branding.Files)
|
||||||
fmt.Fprintf(w, "\tDisable external links:\t%t\n", set.Branding.DisableExternal)
|
fmt.Fprintf(w, "\tDisable external links:\t%t\n", set.Branding.DisableExternal)
|
||||||
|
fmt.Fprintf(w, "\tDisable used disk percentage graph:\t%t\n", set.Branding.DisableUsedPercentage)
|
||||||
fmt.Fprintf(w, "\tColor:\t%s\n", set.Branding.Color)
|
fmt.Fprintf(w, "\tColor:\t%s\n", set.Branding.Color)
|
||||||
|
fmt.Fprintf(w, "\tTheme:\t%s\n", set.Branding.Theme)
|
||||||
fmt.Fprintln(w, "\nServer:")
|
fmt.Fprintln(w, "\nServer:")
|
||||||
fmt.Fprintf(w, "\tLog:\t%s\n", ser.Log)
|
fmt.Fprintf(w, "\tLog:\t%s\n", ser.Log)
|
||||||
fmt.Fprintf(w, "\tPort:\t%s\n", ser.Port)
|
fmt.Fprintf(w, "\tPort:\t%s\n", ser.Port)
|
||||||
|
|||||||
@@ -70,6 +70,8 @@ The path must be for a json or yaml file.`,
|
|||||||
auther = getAuther(auth.NoAuth{}, rawAuther).(*auth.NoAuth)
|
auther = getAuther(auth.NoAuth{}, rawAuther).(*auth.NoAuth)
|
||||||
case auth.MethodProxyAuth:
|
case auth.MethodProxyAuth:
|
||||||
auther = getAuther(auth.ProxyAuth{}, rawAuther).(*auth.ProxyAuth)
|
auther = getAuther(auth.ProxyAuth{}, rawAuther).(*auth.ProxyAuth)
|
||||||
|
case auth.MethodHookAuth:
|
||||||
|
auther = getAuther(&auth.HookAuth{}, rawAuther).(*auth.HookAuth)
|
||||||
default:
|
default:
|
||||||
checkErr(errors.New("invalid auth method"))
|
checkErr(errors.New("invalid auth method"))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,15 +29,18 @@ override the options.`,
|
|||||||
authMethod, auther := getAuthentication(flags)
|
authMethod, auther := getAuthentication(flags)
|
||||||
|
|
||||||
s := &settings.Settings{
|
s := &settings.Settings{
|
||||||
Key: generateKey(),
|
Key: generateKey(),
|
||||||
Signup: mustGetBool(flags, "signup"),
|
Signup: mustGetBool(flags, "signup"),
|
||||||
Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")),
|
CreateUserDir: mustGetBool(flags, "create-user-dir"),
|
||||||
AuthMethod: authMethod,
|
Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")),
|
||||||
Defaults: defaults,
|
AuthMethod: authMethod,
|
||||||
|
Defaults: defaults,
|
||||||
Branding: settings.Branding{
|
Branding: settings.Branding{
|
||||||
Name: mustGetString(flags, "branding.name"),
|
Name: mustGetString(flags, "branding.name"),
|
||||||
DisableExternal: mustGetBool(flags, "branding.disableExternal"),
|
DisableExternal: mustGetBool(flags, "branding.disableExternal"),
|
||||||
Files: mustGetString(flags, "branding.files"),
|
DisableUsedPercentage: mustGetBool(flags, "branding.disableUsedPercentage"),
|
||||||
|
Theme: mustGetString(flags, "branding.theme"),
|
||||||
|
Files: mustGetString(flags, "branding.files"),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -49,12 +49,18 @@ you want to change. Other options will remain unchanged.`,
|
|||||||
hasAuth = true
|
hasAuth = true
|
||||||
case "shell":
|
case "shell":
|
||||||
set.Shell = convertCmdStrToCmdArray(mustGetString(flags, flag.Name))
|
set.Shell = convertCmdStrToCmdArray(mustGetString(flags, flag.Name))
|
||||||
|
case "create-user-dir":
|
||||||
|
set.CreateUserDir = mustGetBool(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.color":
|
case "branding.color":
|
||||||
set.Branding.Color = mustGetString(flags, flag.Name)
|
set.Branding.Color = mustGetString(flags, flag.Name)
|
||||||
|
case "branding.theme":
|
||||||
|
set.Branding.Theme = mustGetString(flags, flag.Name)
|
||||||
case "branding.disableExternal":
|
case "branding.disableExternal":
|
||||||
set.Branding.DisableExternal = mustGetBool(flags, flag.Name)
|
set.Branding.DisableExternal = mustGetBool(flags, flag.Name)
|
||||||
|
case "branding.disableUsedPercentage":
|
||||||
|
set.Branding.DisableUsedPercentage = mustGetBool(flags, flag.Name)
|
||||||
case "branding.files":
|
case "branding.files":
|
||||||
set.Branding.Files = mustGetString(flags, flag.Name)
|
set.Branding.Files = mustGetString(flags, flag.Name)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -98,12 +98,12 @@ func generateMarkdown(cmd *cobra.Command, w io.Writer) {
|
|||||||
buf.WriteString(long + "\n\n")
|
buf.WriteString(long + "\n\n")
|
||||||
|
|
||||||
if cmd.Runnable() {
|
if cmd.Runnable() {
|
||||||
buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.UseLine()))
|
_, _ = fmt.Fprintf(buf, "```\n%s\n```\n\n", cmd.UseLine())
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(cmd.Example) > 0 {
|
if len(cmd.Example) > 0 {
|
||||||
buf.WriteString("## Examples\n\n")
|
buf.WriteString("## Examples\n\n")
|
||||||
buf.WriteString(fmt.Sprintf("```\n%s\n```\n\n", cmd.Example))
|
_, _ = fmt.Fprintf(buf, "```\n%s\n```\n\n", cmd.Example)
|
||||||
}
|
}
|
||||||
|
|
||||||
printOptions(buf, cmd)
|
printOptions(buf, cmd)
|
||||||
|
|||||||
16
cmd/root.go
16
cmd/root.go
@@ -64,6 +64,7 @@ func addServerFlags(flags *pflag.FlagSet) {
|
|||||||
flags.Uint32("socket-perm", 0666, "unix socket file permissions") //nolint:gomnd
|
flags.Uint32("socket-perm", 0666, "unix socket file permissions") //nolint:gomnd
|
||||||
flags.StringP("baseurl", "b", "", "base url")
|
flags.StringP("baseurl", "b", "", "base url")
|
||||||
flags.String("cache-dir", "", "file cache directory (disabled if empty)")
|
flags.String("cache-dir", "", "file cache directory (disabled if empty)")
|
||||||
|
flags.String("token-expiration-time", "2h", "user session timeout")
|
||||||
flags.Int("img-processors", 4, "image processors count") //nolint:gomnd
|
flags.Int("img-processors", 4, "image processors count") //nolint:gomnd
|
||||||
flags.Bool("disable-thumbnails", false, "disable image thumbnails")
|
flags.Bool("disable-thumbnails", false, "disable image thumbnails")
|
||||||
flags.Bool("disable-preview-resize", false, "disable resize of image previews")
|
flags.Bool("disable-preview-resize", false, "disable resize of image previews")
|
||||||
@@ -181,6 +182,7 @@ user created with the credentials from options "username" and "password".`,
|
|||||||
defer listener.Close()
|
defer listener.Close()
|
||||||
|
|
||||||
log.Println("Listening on", listener.Addr().String())
|
log.Println("Listening on", listener.Addr().String())
|
||||||
|
//nolint: gosec
|
||||||
if err := http.Serve(listener, handler); err != nil {
|
if err := http.Serve(listener, handler); err != nil {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@@ -260,6 +262,10 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server {
|
|||||||
_, disableExec := getParamB(flags, "disable-exec")
|
_, disableExec := getParamB(flags, "disable-exec")
|
||||||
server.EnableExec = !disableExec
|
server.EnableExec = !disableExec
|
||||||
|
|
||||||
|
if val, set := getParamB(flags, "token-expiration-time"); set {
|
||||||
|
server.TokenExpirationTime = val
|
||||||
|
}
|
||||||
|
|
||||||
return server
|
return server
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -333,9 +339,13 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) {
|
|||||||
},
|
},
|
||||||
AuthMethod: "",
|
AuthMethod: "",
|
||||||
Branding: settings.Branding{},
|
Branding: settings.Branding{},
|
||||||
Commands: nil,
|
Tus: settings.Tus{
|
||||||
Shell: nil,
|
ChunkSize: settings.DefaultTusChunkSize,
|
||||||
Rules: nil,
|
RetryCount: settings.DefaultTusRetryCount,
|
||||||
|
},
|
||||||
|
Commands: nil,
|
||||||
|
Shell: nil,
|
||||||
|
Rules: nil,
|
||||||
}
|
}
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
|
|||||||
@@ -53,7 +53,7 @@ func printUsers(usrs []*users.User) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func parseUsernameOrID(arg string) (username string, id uint) {
|
func parseUsernameOrID(arg string) (username string, id uint) {
|
||||||
id64, err := strconv.ParseUint(arg, 10, 64) //nolint:gomnd
|
id64, err := strconv.ParseUint(arg, 10, 64)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return arg, 0
|
return arg, 0
|
||||||
}
|
}
|
||||||
|
|||||||
11
cmd/utils.go
11
cmd/utils.go
@@ -87,16 +87,23 @@ func python(fn pythonFunc, cfg pythonConfig) cobraFunc {
|
|||||||
data := pythonData{hadDB: true}
|
data := pythonData{hadDB: true}
|
||||||
|
|
||||||
path := getParam(cmd.Flags(), "database")
|
path := getParam(cmd.Flags(), "database")
|
||||||
|
absPath, err := filepath.Abs(path)
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
exists, err := dbExists(path)
|
exists, err := dbExists(path)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
} else if exists && cfg.noDB {
|
} else if exists && cfg.noDB {
|
||||||
log.Fatal(path + " already exists")
|
log.Fatal(absPath + " already exists")
|
||||||
} else if !exists && !cfg.noDB && !cfg.allowNoDB {
|
} else if !exists && !cfg.noDB && !cfg.allowNoDB {
|
||||||
log.Fatal(path + " does not exist. Please run 'filebrowser config init' first.")
|
log.Fatal(absPath + " does not exist. Please run 'filebrowser config init' first.")
|
||||||
|
} else if !exists && !cfg.noDB {
|
||||||
|
log.Println("Warning: filebrowser.db can't be found. Initialing in " + strings.TrimSuffix(absPath, "filebrowser.db"))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
log.Println("Using database: " + absPath)
|
||||||
data.hadDB = exists
|
data.hadDB = exists
|
||||||
db, err := storm.Open(path)
|
db, err := storm.Open(path)
|
||||||
checkErr(err)
|
checkErr(err)
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
SHELL := /bin/bash
|
SHELL := /usr/bin/env bash
|
||||||
DATE ?= $(shell date +%FT%T%z)
|
DATE ?= $(shell date +%FT%T%z)
|
||||||
BASE_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
BASE_PATH := $(shell dirname $(realpath $(lastword $(MAKEFILE_LIST))))
|
||||||
VERSION ?= $(shell git describe --tags --always --match=v* 2> /dev/null || \
|
VERSION ?= $(shell git describe --tags --always --match=v* 2> /dev/null || \
|
||||||
@@ -25,4 +25,4 @@ RESET := $(shell tput -Txterm sgr0)
|
|||||||
|
|
||||||
define global_option
|
define global_option
|
||||||
printf " ${YELLOW}%-20s${GREEN}%s${RESET}\n" $(1) $(2)
|
printf " ${YELLOW}%-20s${GREEN}%s${RESET}\n" $(1) $(2)
|
||||||
endef
|
endef
|
||||||
|
|||||||
120
files/file.go
120
files/file.go
@@ -7,6 +7,7 @@ import (
|
|||||||
"crypto/sha512"
|
"crypto/sha512"
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
"hash"
|
"hash"
|
||||||
|
"image"
|
||||||
"io"
|
"io"
|
||||||
"log"
|
"log"
|
||||||
"mime"
|
"mime"
|
||||||
@@ -23,23 +24,28 @@ import (
|
|||||||
"github.com/filebrowser/filebrowser/v2/rules"
|
"github.com/filebrowser/filebrowser/v2/rules"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const PermFile = 0644
|
||||||
|
const PermDir = 0755
|
||||||
|
|
||||||
// FileInfo describes a file.
|
// FileInfo describes a file.
|
||||||
type FileInfo struct {
|
type FileInfo struct {
|
||||||
*Listing
|
*Listing
|
||||||
Fs afero.Fs `json:"-"`
|
Fs afero.Fs `json:"-"`
|
||||||
Path string `json:"path"`
|
Path string `json:"path"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
Size int64 `json:"size"`
|
Size int64 `json:"size"`
|
||||||
Extension string `json:"extension"`
|
Extension string `json:"extension"`
|
||||||
ModTime time.Time `json:"modified"`
|
ModTime time.Time `json:"modified"`
|
||||||
Mode os.FileMode `json:"mode"`
|
Mode os.FileMode `json:"mode"`
|
||||||
IsDir bool `json:"isDir"`
|
IsDir bool `json:"isDir"`
|
||||||
IsSymlink bool `json:"isSymlink"`
|
IsSymlink bool `json:"isSymlink"`
|
||||||
Type string `json:"type"`
|
Type string `json:"type"`
|
||||||
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"`
|
Token string `json:"token,omitempty"`
|
||||||
|
currentDir []os.FileInfo `json:"-"`
|
||||||
|
Resolution *ImageResolution `json:"resolution,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// FileOptions are the options when getting a file info.
|
// FileOptions are the options when getting a file info.
|
||||||
@@ -54,6 +60,11 @@ type FileOptions struct {
|
|||||||
Content bool
|
Content bool
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ImageResolution struct {
|
||||||
|
Width int `json:"width"`
|
||||||
|
Height int `json:"height"`
|
||||||
|
}
|
||||||
|
|
||||||
// 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
|
||||||
// object will be automatically filled depending on if it is a directory
|
// object will be automatically filled depending on if it is a directory
|
||||||
// or a file. If it's a video file, it will also detect any subtitles.
|
// or a file. If it's a video file, it will also detect any subtitles.
|
||||||
@@ -198,8 +209,9 @@ func (i *FileInfo) RealPath() string {
|
|||||||
return i.Path
|
return i.Path
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO: use constants
|
||||||
|
//
|
||||||
//nolint:goconst
|
//nolint:goconst
|
||||||
//TODO: use constants
|
|
||||||
func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error {
|
func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error {
|
||||||
if IsNamedPipe(i.Mode) {
|
if IsNamedPipe(i.Mode) {
|
||||||
i.Type = "blob"
|
i.Type = "blob"
|
||||||
@@ -231,6 +243,12 @@ func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error {
|
|||||||
return nil
|
return nil
|
||||||
case strings.HasPrefix(mimetype, "image"):
|
case strings.HasPrefix(mimetype, "image"):
|
||||||
i.Type = "image"
|
i.Type = "image"
|
||||||
|
resolution, err := calculateImageResolution(i.Fs, i.Path)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error calculating image resolution: %v", err)
|
||||||
|
} else {
|
||||||
|
i.Resolution = resolution
|
||||||
|
}
|
||||||
return nil
|
return nil
|
||||||
case strings.HasSuffix(mimetype, "pdf"):
|
case strings.HasSuffix(mimetype, "pdf"):
|
||||||
i.Type = "pdf"
|
i.Type = "pdf"
|
||||||
@@ -259,6 +277,28 @@ func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func calculateImageResolution(fs afero.Fs, filePath string) (*ImageResolution, error) {
|
||||||
|
file, err := fs.Open(filePath)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer func() {
|
||||||
|
if cErr := file.Close(); cErr != nil {
|
||||||
|
log.Printf("Failed to close file: %v", cErr)
|
||||||
|
}
|
||||||
|
}()
|
||||||
|
|
||||||
|
config, _, err := image.DecodeConfig(file)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &ImageResolution{
|
||||||
|
Width: config.Width,
|
||||||
|
Height: config.Height,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
func (i *FileInfo) readFirstBytes() []byte {
|
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 {
|
||||||
@@ -290,13 +330,21 @@ func (i *FileInfo) detectSubtitles() {
|
|||||||
// detect multiple languages. Base*.vtt
|
// detect multiple languages. Base*.vtt
|
||||||
// TODO: give subtitles descriptive names (lang) and track attributes
|
// TODO: give subtitles descriptive names (lang) and track attributes
|
||||||
parentDir := strings.TrimRight(i.Path, i.Name)
|
parentDir := strings.TrimRight(i.Path, i.Name)
|
||||||
dir, err := afero.ReadDir(i.Fs, parentDir)
|
var dir []os.FileInfo
|
||||||
if err == nil {
|
if len(i.currentDir) > 0 {
|
||||||
base := strings.TrimSuffix(i.Name, ext)
|
dir = i.currentDir
|
||||||
for _, f := range dir {
|
} else {
|
||||||
if !f.IsDir() && strings.HasPrefix(f.Name(), base) && strings.HasSuffix(f.Name(), ".vtt") {
|
var err error
|
||||||
i.Subtitles = append(i.Subtitles, path.Join(parentDir, f.Name()))
|
dir, err = afero.ReadDir(i.Fs, parentDir)
|
||||||
}
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
base := strings.TrimSuffix(i.Name, ext)
|
||||||
|
for _, f := range dir {
|
||||||
|
if !f.IsDir() && strings.HasPrefix(f.Name(), base) && strings.HasSuffix(f.Name(), ".vtt") {
|
||||||
|
i.Subtitles = append(i.Subtitles, path.Join(parentDir, f.Name()))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -336,15 +384,25 @@ func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
file := &FileInfo{
|
file := &FileInfo{
|
||||||
Fs: i.Fs,
|
Fs: i.Fs,
|
||||||
Name: name,
|
Name: name,
|
||||||
Size: f.Size(),
|
Size: f.Size(),
|
||||||
ModTime: f.ModTime(),
|
ModTime: f.ModTime(),
|
||||||
Mode: f.Mode(),
|
Mode: f.Mode(),
|
||||||
IsDir: f.IsDir(),
|
IsDir: f.IsDir(),
|
||||||
IsSymlink: isSymlink,
|
IsSymlink: isSymlink,
|
||||||
Extension: filepath.Ext(name),
|
Extension: filepath.Ext(name),
|
||||||
Path: fPath,
|
Path: fPath,
|
||||||
|
currentDir: dir,
|
||||||
|
}
|
||||||
|
|
||||||
|
if !file.IsDir && strings.HasPrefix(mime.TypeByExtension(file.Extension), "image/") {
|
||||||
|
resolution, err := calculateImageResolution(file.Fs, file.Path)
|
||||||
|
if err != nil {
|
||||||
|
log.Printf("Error calculating resolution for image %s: %v", file.Path, err)
|
||||||
|
} else {
|
||||||
|
file.Resolution = resolution
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if file.IsDir {
|
if file.IsDir {
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ type Listing struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ApplySort applies the sort order using .Order and .Sort
|
// ApplySort applies the sort order using .Order and .Sort
|
||||||
|
//
|
||||||
//nolint:goconst
|
//nolint:goconst
|
||||||
func (l Listing) ApplySort() {
|
func (l Listing) ApplySort() {
|
||||||
// Check '.Order' to know how to sort
|
// Check '.Order' to know how to sort
|
||||||
|
|||||||
@@ -7,6 +7,8 @@ import (
|
|||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
"github.com/spf13/afero"
|
"github.com/spf13/afero"
|
||||||
|
|
||||||
|
"github.com/filebrowser/filebrowser/v2/files"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MoveFile moves file from src to dst.
|
// MoveFile moves file from src to dst.
|
||||||
@@ -17,12 +19,12 @@ func MoveFile(fs afero.Fs, src, dst string) error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// fallback
|
// fallback
|
||||||
err := CopyFile(fs, src, dst)
|
err := Copy(fs, src, dst)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
_ = fs.Remove(dst)
|
_ = fs.Remove(dst)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := fs.Remove(src); err != nil {
|
if err := fs.RemoveAll(src); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@@ -40,13 +42,13 @@ func CopyFile(fs afero.Fs, source, dest string) error {
|
|||||||
|
|
||||||
// Makes the directory needed to create the dst
|
// Makes the directory needed to create the dst
|
||||||
// file.
|
// file.
|
||||||
err = fs.MkdirAll(filepath.Dir(dest), 0666) //nolint:gomnd
|
err = fs.MkdirAll(filepath.Dir(dest), files.PermDir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create the destination file.
|
// Create the destination file.
|
||||||
dst, err := fs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) //nolint:gomnd
|
dst, err := fs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, files.PermFile)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|||||||
20
frontend/.eslintrc.json
Normal file
20
frontend/.eslintrc.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"root": true,
|
||||||
|
"env": {
|
||||||
|
"node": true
|
||||||
|
},
|
||||||
|
"extends": [
|
||||||
|
"plugin:vue/essential",
|
||||||
|
"eslint:recommended",
|
||||||
|
"@vue/eslint-config-prettier"
|
||||||
|
],
|
||||||
|
"rules": {
|
||||||
|
"vue/multi-word-component-names": "off",
|
||||||
|
"vue/no-reserved-component-names": "warn",
|
||||||
|
"vue/no-mutating-props": "warn"
|
||||||
|
},
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaVersion": "latest",
|
||||||
|
"sourceType": "module"
|
||||||
|
}
|
||||||
|
}
|
||||||
2
frontend/.prettierignore
Normal file
2
frontend/.prettierignore
Normal file
@@ -0,0 +1,2 @@
|
|||||||
|
# Ignore artifacts:
|
||||||
|
dist
|
||||||
3
frontend/.prettierrc.json
Normal file
3
frontend/.prettierrc.json
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
{
|
||||||
|
"trailingComma": "es5"
|
||||||
|
}
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
module.exports = {
|
|
||||||
presets: ["@vue/app"],
|
|
||||||
};
|
|
||||||
4
frontend/dist/.gitignore
vendored
4
frontend/dist/.gitignore
vendored
@@ -1,4 +0,0 @@
|
|||||||
# Ignore everything in this directory
|
|
||||||
*
|
|
||||||
# Except this file
|
|
||||||
!.gitignore
|
|
||||||
0
frontend/dist/.gitkeep
vendored
Normal file
0
frontend/dist/.gitkeep
vendored
Normal file
192
frontend/index.html
Normal file
192
frontend/index.html
Normal file
@@ -0,0 +1,192 @@
|
|||||||
|
<!doctype html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="utf-8" />
|
||||||
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1, user-scalable=no"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<title>File Browser</title>
|
||||||
|
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
type="image/png"
|
||||||
|
sizes="32x32"
|
||||||
|
href="/img/icons/favicon-32x32.png"
|
||||||
|
/>
|
||||||
|
<link
|
||||||
|
rel="icon"
|
||||||
|
type="image/png"
|
||||||
|
sizes="16x16"
|
||||||
|
href="/img/icons/favicon-16x16.png"
|
||||||
|
/>
|
||||||
|
|
||||||
|
<!-- Add to home screen for Android and modern mobile browsers -->
|
||||||
|
<link
|
||||||
|
rel="manifest"
|
||||||
|
id="manifestPlaceholder"
|
||||||
|
crossorigin="use-credentials"
|
||||||
|
/>
|
||||||
|
<meta name="theme-color" content="#2979ff" />
|
||||||
|
|
||||||
|
<!-- Add to home screen for Safari on iOS/iPadOS -->
|
||||||
|
<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-title" content="assets" />
|
||||||
|
<link rel="apple-touch-icon" href="/img/icons/apple-touch-icon.png" />
|
||||||
|
|
||||||
|
<!-- Add to home screen for Windows -->
|
||||||
|
<meta
|
||||||
|
name="msapplication-TileImage"
|
||||||
|
content="/img/icons/mstile-144x144.png"
|
||||||
|
/>
|
||||||
|
<meta name="msapplication-TileColor" content="#2979ff" />
|
||||||
|
|
||||||
|
<!-- Inject Some Variables and generate the manifest json -->
|
||||||
|
<script>
|
||||||
|
// We can assign JSON directly
|
||||||
|
window.FileBrowser = {
|
||||||
|
AuthMethod: "json",
|
||||||
|
BaseURL: "",
|
||||||
|
CSS: false,
|
||||||
|
Color: "",
|
||||||
|
DisableExternal: false,
|
||||||
|
DisableUsedPercentage: false,
|
||||||
|
EnableExec: true,
|
||||||
|
EnableThumbs: true,
|
||||||
|
LoginPage: true,
|
||||||
|
Name: "",
|
||||||
|
NoAuth: false,
|
||||||
|
ReCaptcha: false,
|
||||||
|
ResizePreview: true,
|
||||||
|
Signup: false,
|
||||||
|
StaticURL: "",
|
||||||
|
Theme: "",
|
||||||
|
TusSettings: { chunkSize: 10485760, retryCount: 5 },
|
||||||
|
Version: "(untracked)",
|
||||||
|
};
|
||||||
|
// Global function to prepend static url
|
||||||
|
window.__prependStaticUrl = (url) => {
|
||||||
|
return `${window.FileBrowser.StaticURL}/${url.replace(/^\/+/, "")}`;
|
||||||
|
};
|
||||||
|
var dynamicManifest = {
|
||||||
|
name: window.FileBrowser.Name || "File Browser",
|
||||||
|
short_name: window.FileBrowser.Name || "File Browser",
|
||||||
|
icons: [
|
||||||
|
{
|
||||||
|
src: window.__prependStaticUrl(
|
||||||
|
"/img/icons/android-chrome-192x192.png"
|
||||||
|
),
|
||||||
|
sizes: "192x192",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: window.__prependStaticUrl(
|
||||||
|
"/img/icons/android-chrome-512x512.png"
|
||||||
|
),
|
||||||
|
sizes: "512x512",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
start_url: window.location.origin + window.FileBrowser.BaseURL,
|
||||||
|
display: "standalone",
|
||||||
|
background_color: "#ffffff",
|
||||||
|
theme_color: window.FileBrowser.Color || "#455a64",
|
||||||
|
};
|
||||||
|
|
||||||
|
const stringManifest = JSON.stringify(dynamicManifest);
|
||||||
|
const blob = new Blob([stringManifest], { type: "application/json" });
|
||||||
|
const manifestURL = URL.createObjectURL(blob);
|
||||||
|
document
|
||||||
|
.querySelector("#manifestPlaceholder")
|
||||||
|
.setAttribute("href", manifestURL);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style>
|
||||||
|
#loading {
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: #fff;
|
||||||
|
z-index: 9999;
|
||||||
|
transition: 0.1s ease opacity;
|
||||||
|
-webkit-transition: 0.1s ease opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading.done {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading .spinner {
|
||||||
|
width: 70px;
|
||||||
|
text-align: center;
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading .spinner > div {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-color: #333;
|
||||||
|
border-radius: 100%;
|
||||||
|
display: inline-block;
|
||||||
|
-webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
|
||||||
|
animation: sk-bouncedelay 1.4s infinite ease-in-out both;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading .spinner .bounce1 {
|
||||||
|
-webkit-animation-delay: -0.32s;
|
||||||
|
animation-delay: -0.32s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading .spinner .bounce2 {
|
||||||
|
-webkit-animation-delay: -0.16s;
|
||||||
|
animation-delay: -0.16s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes sk-bouncedelay {
|
||||||
|
0%,
|
||||||
|
80%,
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(0);
|
||||||
|
}
|
||||||
|
40% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@keyframes sk-bouncedelay {
|
||||||
|
0%,
|
||||||
|
80%,
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(0);
|
||||||
|
transform: scale(0);
|
||||||
|
}
|
||||||
|
40% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
|
||||||
|
<div id="loading">
|
||||||
|
<div class="spinner">
|
||||||
|
<div class="bounce1"></div>
|
||||||
|
<div class="bounce2"></div>
|
||||||
|
<div class="bounce3"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<script type="module" src="/src/main.js"></script>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
10
frontend/jsconfig.json
Normal file
10
frontend/jsconfig.json
Normal file
@@ -0,0 +1,10 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"baseUrl": ".",
|
||||||
|
"paths": {
|
||||||
|
"@/*": ["./src/*"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"include": ["src/**/*"],
|
||||||
|
"exclude": ["node_modules", "dist"]
|
||||||
|
}
|
||||||
29094
frontend/package-lock.json
generated
29094
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -2,70 +2,59 @@
|
|||||||
"name": "filebrowser-frontend",
|
"name": "filebrowser-frontend",
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
|
"type": "module",
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"serve": "vue-cli-service serve",
|
"dev": "vite dev",
|
||||||
"build": "find ./dist -maxdepth 1 -mindepth 1 ! -name '.gitignore' -exec rm -r {} + && vue-cli-service build --no-clean",
|
"serve": "vite serve",
|
||||||
"lint": "npx vue-cli-service lint --no-fix --max-warnings=0",
|
"build": "vite build",
|
||||||
"fix": "npx vue-cli-service lint",
|
"watch": "vite build --watch",
|
||||||
"watch": "find ./dist -maxdepth 1 -mindepth 1 ! -name '.gitignore' -exec rm -r {} + && vue-cli-service build --watch --no-clean"
|
"clean": "find ./dist -maxdepth 1 -mindepth 1 ! -name '.gitkeep' -exec rm -r {} +",
|
||||||
|
"lint": "eslint --ext .vue,.js src/",
|
||||||
|
"lint:fix": "eslint --ext .vue,.js --fix src/",
|
||||||
|
"format": "prettier --write ."
|
||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"ace-builds": "^1.4.7",
|
"ace-builds": "^1.23.4",
|
||||||
"clipboard": "^2.0.4",
|
"clipboard": "^2.0.11",
|
||||||
"core-js": "^3.9.1",
|
"core-js": "^3.32.0",
|
||||||
"css-vars-ponyfill": "^2.4.3",
|
"css-vars-ponyfill": "^2.4.8",
|
||||||
"js-base64": "^2.5.1",
|
"filesize": "^10.0.8",
|
||||||
|
"js-base64": "^3.7.5",
|
||||||
"lodash.clonedeep": "^4.5.0",
|
"lodash.clonedeep": "^4.5.0",
|
||||||
"lodash.throttle": "^4.1.1",
|
"lodash.throttle": "^4.1.1",
|
||||||
"material-icons": "^1.10.5",
|
"material-icons": "^1.13.9",
|
||||||
"moment": "^2.29.4",
|
"moment": "^2.29.4",
|
||||||
"normalize.css": "^8.0.1",
|
"normalize.css": "^8.0.1",
|
||||||
"noty": "^3.2.0-beta",
|
"noty": "^3.2.0-beta",
|
||||||
"pretty-bytes": "^6.0.0",
|
"pretty-bytes": "^6.1.1",
|
||||||
"qrcode.vue": "^1.7.0",
|
"qrcode.vue": "^1.7.0",
|
||||||
|
"tus-js-client": "^3.1.1",
|
||||||
"utif": "^3.1.0",
|
"utif": "^3.1.0",
|
||||||
"vue": "^2.6.10",
|
"vue": "^2.7.14",
|
||||||
"vue-async-computed": "^3.9.0",
|
"vue-async-computed": "^3.9.0",
|
||||||
"vue-i18n": "^8.15.3",
|
"vue-i18n": "^8.28.2",
|
||||||
"vue-lazyload": "^1.3.3",
|
"vue-lazyload": "^1.3.5",
|
||||||
"vue-router": "^3.1.3",
|
"vue-router": "^3.6.5",
|
||||||
"vue-simple-progress": "^1.1.1",
|
"vue-simple-progress": "^1.1.1",
|
||||||
"vuex": "^3.1.2",
|
"vuex": "^3.6.2",
|
||||||
"vuex-router-sync": "^5.0.0",
|
"vuex-router-sync": "^5.0.0",
|
||||||
"whatwg-fetch": "^3.6.2"
|
"whatwg-fetch": "^3.6.17"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@vue/cli-plugin-babel": "^4.1.2",
|
"@vitejs/plugin-legacy": "^4.1.1",
|
||||||
"@vue/cli-plugin-eslint": "~4.5.0",
|
"@vitejs/plugin-vue2": "^2.2.0",
|
||||||
"@vue/cli-service": "^4.1.2",
|
"@vue/eslint-config-prettier": "^8.0.0",
|
||||||
"@vue/eslint-config-prettier": "^6.0.0",
|
"autoprefixer": "^10.4.14",
|
||||||
"babel-eslint": "^10.1.0",
|
"eslint": "^8.46.0",
|
||||||
"compression-webpack-plugin": "^6.0.3",
|
"eslint-plugin-prettier": "^5.0.0",
|
||||||
"eslint": "^6.7.2",
|
"eslint-plugin-vue": "^9.16.1",
|
||||||
"eslint-plugin-prettier": "^3.3.1",
|
"jsdom": "^22.1.0",
|
||||||
"eslint-plugin-vue": "^6.2.2",
|
"postcss": "^8.4.31",
|
||||||
"prettier": "^2.2.1",
|
"prettier": "^3.0.1",
|
||||||
"vue-template-compiler": "^2.6.10"
|
"terser": "^5.19.2",
|
||||||
},
|
"vite": "^4.5.2",
|
||||||
"eslintConfig": {
|
"vite-plugin-compression2": "^0.10.3",
|
||||||
"root": true,
|
"vite-plugin-rewrite-all": "^1.0.1"
|
||||||
"env": {
|
|
||||||
"node": true
|
|
||||||
},
|
|
||||||
"extends": [
|
|
||||||
"plugin:vue/essential",
|
|
||||||
"eslint:recommended",
|
|
||||||
"@vue/prettier"
|
|
||||||
],
|
|
||||||
"rules": {},
|
|
||||||
"parserOptions": {
|
|
||||||
"parser": "babel-eslint"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"postcss": {
|
|
||||||
"plugins": {
|
|
||||||
"autoprefixer": {}
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
"browserslist": [
|
"browserslist": [
|
||||||
"> 1%",
|
"> 1%",
|
||||||
|
|||||||
5
frontend/postcss.config.cjs
Normal file
5
frontend/postcss.config.cjs
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
module.exports = {
|
||||||
|
plugins: {
|
||||||
|
autoprefixer: {},
|
||||||
|
},
|
||||||
|
};
|
||||||
0
frontend/public/.gitkeep
Normal file
0
frontend/public/.gitkeep
Normal file
@@ -1,144 +1,195 @@
|
|||||||
<!DOCTYPE html>
|
<!doctype html>
|
||||||
<html lang="en">
|
<html lang="en">
|
||||||
<head>
|
<head>
|
||||||
<meta charset="utf-8">
|
<meta charset="utf-8" />
|
||||||
<meta http-equiv="X-UA-Compatible" content="IE=edge">
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=no">
|
<meta
|
||||||
|
name="viewport"
|
||||||
|
content="width=device-width, initial-scale=1, user-scalable=no"
|
||||||
|
/>
|
||||||
|
|
||||||
[{[ if .ReCaptcha -]}]
|
[{[ if .ReCaptcha -]}]
|
||||||
<script src="[{[ .ReCaptchaHost ]}]/recaptcha/api.js?render=explicit"></script>
|
<script src="[{[ .ReCaptchaHost ]}]/recaptcha/api.js?render=explicit"></script>
|
||||||
[{[ end ]}]
|
[{[ end ]}]
|
||||||
|
|
||||||
<title>[{[ if .Name -]}][{[ .Name ]}][{[ else ]}]File Browser[{[ end ]}]</title>
|
<title>
|
||||||
|
[{[ if .Name -]}][{[ .Name ]}][{[ else ]}]File Browser[{[ end ]}]
|
||||||
|
</title>
|
||||||
|
|
||||||
<link rel="icon" type="image/png" sizes="32x32" href="[{[ .StaticURL ]}]/img/icons/favicon-32x32.png">
|
<meta name="robots" content="noindex,nofollow">
|
||||||
<link rel="icon" type="image/png" sizes="16x16" href="[{[ .StaticURL ]}]/img/icons/favicon-16x16.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"
|
||||||
|
/>
|
||||||
|
|
||||||
<!-- 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
|
||||||
<meta name="theme-color" content="[{[ if .Color -]}][{[ .Color ]}][{[ else ]}]#2979ff[{[ end ]}]">
|
rel="manifest"
|
||||||
|
id="manifestPlaceholder"
|
||||||
|
crossorigin="use-credentials"
|
||||||
|
/>
|
||||||
|
<meta
|
||||||
|
name="theme-color"
|
||||||
|
content="[{[ if .Color -]}][{[ .Color ]}][{[ else ]}]#2979ff[{[ end ]}]"
|
||||||
|
/>
|
||||||
|
|
||||||
<!-- Add to home screen for Safari on iOS/iPadOS -->
|
<!-- 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.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/mstile-144x144.png">
|
<meta
|
||||||
<meta name="msapplication-TileColor" content="[{[ if .Color -]}][{[ .Color ]}][{[ else ]}]#2979ff[{[ end ]}]">
|
name="msapplication-TileImage"
|
||||||
|
content="[{[ .StaticURL ]}]/img/icons/mstile-144x144.png"
|
||||||
|
/>
|
||||||
|
<meta
|
||||||
|
name="msapplication-TileColor"
|
||||||
|
content="[{[ if .Color -]}][{[ .Color ]}][{[ else ]}]#2979ff[{[ end ]}]"
|
||||||
|
/>
|
||||||
|
|
||||||
<!-- Inject Some Variables and generate the manifest json -->
|
<!-- Inject Some Variables and generate the manifest json -->
|
||||||
<script>
|
<script>
|
||||||
window.FileBrowser = JSON.parse('[{[ .Json ]}]');
|
// We can assign JSON directly
|
||||||
|
window.FileBrowser = [{[ .Json ]}];
|
||||||
|
// Global function to prepend static url
|
||||||
|
window.__prependStaticUrl = (url) => {
|
||||||
|
return `${window.FileBrowser.StaticURL}/${url.replace(/^\/+/, "")}`;
|
||||||
|
};
|
||||||
|
var dynamicManifest = {
|
||||||
|
name: window.FileBrowser.Name || "File Browser",
|
||||||
|
short_name: window.FileBrowser.Name || "File Browser",
|
||||||
|
icons: [
|
||||||
|
{
|
||||||
|
src: window.__prependStaticUrl("/img/icons/android-chrome-192x192.png"),
|
||||||
|
sizes: "192x192",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
src: window.__prependStaticUrl("/img/icons/android-chrome-512x512.png"),
|
||||||
|
sizes: "512x512",
|
||||||
|
type: "image/png",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
start_url: window.location.origin + window.FileBrowser.BaseURL,
|
||||||
|
display: "standalone",
|
||||||
|
background_color: "#ffffff",
|
||||||
|
theme_color: window.FileBrowser.Color || "#455a64",
|
||||||
|
};
|
||||||
|
|
||||||
var fullStaticURL = window.location.origin + window.FileBrowser.StaticURL;
|
const stringManifest = JSON.stringify(dynamicManifest);
|
||||||
var dynamicManifest = {
|
const blob = new Blob([stringManifest], { type: "application/json" });
|
||||||
"name": window.FileBrowser.Name || 'File Browser',
|
const manifestURL = URL.createObjectURL(blob);
|
||||||
"short_name": window.FileBrowser.Name || 'File Browser',
|
document
|
||||||
"icons": [
|
.querySelector("#manifestPlaceholder")
|
||||||
{
|
.setAttribute("href", manifestURL);
|
||||||
"src": fullStaticURL + "/img/icons/android-chrome-192x192.png",
|
</script>
|
||||||
"sizes": "192x192",
|
|
||||||
"type": "image/png"
|
<style>
|
||||||
},
|
#loading {
|
||||||
{
|
position: fixed;
|
||||||
"src": fullStaticURL + "/img/icons/android-chrome-512x512.png",
|
top: 0;
|
||||||
"sizes": "512x512",
|
left: 0;
|
||||||
"type": "image/png"
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
background: #fff;
|
||||||
|
z-index: 9999;
|
||||||
|
transition: 0.1s ease opacity;
|
||||||
|
-webkit-transition: 0.1s ease opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading.done {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading .spinner {
|
||||||
|
width: 70px;
|
||||||
|
text-align: center;
|
||||||
|
position: fixed;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
-webkit-transform: translate(-50%, -50%);
|
||||||
|
transform: translate(-50%, -50%);
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading .spinner > div {
|
||||||
|
width: 18px;
|
||||||
|
height: 18px;
|
||||||
|
background-color: #333;
|
||||||
|
border-radius: 100%;
|
||||||
|
display: inline-block;
|
||||||
|
-webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
|
||||||
|
animation: sk-bouncedelay 1.4s infinite ease-in-out both;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading .spinner .bounce1 {
|
||||||
|
-webkit-animation-delay: -0.32s;
|
||||||
|
animation-delay: -0.32s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#loading .spinner .bounce2 {
|
||||||
|
-webkit-animation-delay: -0.16s;
|
||||||
|
animation-delay: -0.16s;
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes sk-bouncedelay {
|
||||||
|
0%,
|
||||||
|
80%,
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(0);
|
||||||
}
|
}
|
||||||
],
|
40% {
|
||||||
"start_url": window.location.origin + window.FileBrowser.BaseURL,
|
-webkit-transform: scale(1);
|
||||||
"display": "standalone",
|
}
|
||||||
"background_color": "#ffffff",
|
}
|
||||||
"theme_color": window.FileBrowser.Color || "#455a64"
|
|
||||||
}
|
|
||||||
|
|
||||||
const stringManifest = JSON.stringify(dynamicManifest);
|
@keyframes sk-bouncedelay {
|
||||||
const blob = new Blob([stringManifest], {type: 'application/json'});
|
0%,
|
||||||
const manifestURL = URL.createObjectURL(blob);
|
80%,
|
||||||
document.querySelector('#manifestPlaceholder').setAttribute('href', manifestURL);
|
100% {
|
||||||
</script>
|
-webkit-transform: scale(0);
|
||||||
|
transform: scale(0);
|
||||||
|
}
|
||||||
|
40% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="app"></div>
|
||||||
|
|
||||||
<style>
|
<div id="loading">
|
||||||
#loading {
|
<div class="spinner">
|
||||||
position: fixed;
|
<div class="bounce1"></div>
|
||||||
top: 0;
|
<div class="bounce2"></div>
|
||||||
left: 0;
|
<div class="bounce3"></div>
|
||||||
width: 100%;
|
</div>
|
||||||
height: 100%;
|
|
||||||
background: #fff;
|
|
||||||
z-index: 9999;
|
|
||||||
transition: .1s ease opacity;
|
|
||||||
-webkit-transition: .1s ease opacity;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loading.done {
|
|
||||||
opacity: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loading .spinner {
|
|
||||||
width: 70px;
|
|
||||||
text-align: center;
|
|
||||||
position: fixed;
|
|
||||||
top: 50%;
|
|
||||||
left: 50%;
|
|
||||||
-webkit-transform: translate(-50%, -50%);
|
|
||||||
transform: translate(-50%, -50%);
|
|
||||||
}
|
|
||||||
|
|
||||||
#loading .spinner > div {
|
|
||||||
width: 18px;
|
|
||||||
height: 18px;
|
|
||||||
background-color: #333;
|
|
||||||
border-radius: 100%;
|
|
||||||
display: inline-block;
|
|
||||||
-webkit-animation: sk-bouncedelay 1.4s infinite ease-in-out both;
|
|
||||||
animation: sk-bouncedelay 1.4s infinite ease-in-out both;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loading .spinner .bounce1 {
|
|
||||||
-webkit-animation-delay: -0.32s;
|
|
||||||
animation-delay: -0.32s;
|
|
||||||
}
|
|
||||||
|
|
||||||
#loading .spinner .bounce2 {
|
|
||||||
-webkit-animation-delay: -0.16s;
|
|
||||||
animation-delay: -0.16s;
|
|
||||||
}
|
|
||||||
|
|
||||||
@-webkit-keyframes sk-bouncedelay {
|
|
||||||
0%, 80%, 100% { -webkit-transform: scale(0) }
|
|
||||||
40% { -webkit-transform: scale(1.0) }
|
|
||||||
}
|
|
||||||
|
|
||||||
@keyframes sk-bouncedelay {
|
|
||||||
0%, 80%, 100% {
|
|
||||||
-webkit-transform: scale(0);
|
|
||||||
transform: scale(0);
|
|
||||||
} 40% {
|
|
||||||
-webkit-transform: scale(1.0);
|
|
||||||
transform: scale(1.0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
</style>
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<div id="app"></div>
|
|
||||||
|
|
||||||
<div id="loading">
|
|
||||||
<div class="spinner">
|
|
||||||
<div class="bounce1"></div>
|
|
||||||
<div class="bounce2"></div>
|
|
||||||
<div class="bounce3"></div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
|
|
||||||
[{[ if .Theme -]}]
|
<script type="module" src="/src/main.js"></script>
|
||||||
<link rel="stylesheet" href="[{[ .StaticURL ]}]/themes/[{[ .Theme ]}].css" />
|
|
||||||
[{[ end ]}]
|
[{[ if .Theme -]}]
|
||||||
[{[ if .CSS -]}]
|
<link
|
||||||
|
rel="stylesheet"
|
||||||
|
href="[{[ .StaticURL ]}]/themes/[{[ .Theme ]}].css"
|
||||||
|
/>
|
||||||
|
[{[ end ]}] [{[ if .CSS -]}]
|
||||||
<link rel="stylesheet" href="[{[ .StaticURL ]}]/custom.css" />
|
<link rel="stylesheet" href="[{[ .StaticURL ]}]/custom.css" />
|
||||||
[{[ end ]}]
|
[{[ end ]}]
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -174,6 +174,12 @@ table th {
|
|||||||
background: var(--surfacePrimary);
|
background: var(--surfacePrimary);
|
||||||
color: var(--textPrimary);
|
color: var(--textPrimary);
|
||||||
}
|
}
|
||||||
|
.shell__divider {
|
||||||
|
background: rgba(255, 255, 255, 0.1);
|
||||||
|
}
|
||||||
|
.shell__divider:hover {
|
||||||
|
background: rgba(255, 255, 255, 0.4);
|
||||||
|
}
|
||||||
.shell__result {
|
.shell__result {
|
||||||
border-top: 1px solid var(--divider);
|
border-top: 1px solid var(--divider);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,7 +6,7 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
// eslint-disable-next-line no-undef
|
// eslint-disable-next-line no-undef
|
||||||
__webpack_public_path__ = window.FileBrowser.StaticURL + "/";
|
// __webpack_public_path__ = window.FileBrowser.StaticURL + "/";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "app",
|
name: "app",
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import { createURL, fetchURL, removePrefix } from "./utils";
|
import { createURL, fetchURL, removePrefix } from "./utils";
|
||||||
import { baseURL } from "@/utils/constants";
|
import { baseURL } from "@/utils/constants";
|
||||||
import store from "@/store";
|
import store from "@/store";
|
||||||
|
import { upload as postTus, useTus } from "./tus";
|
||||||
|
|
||||||
export async function fetch(url) {
|
export async function fetch(url) {
|
||||||
url = removePrefix(url);
|
url = removePrefix(url);
|
||||||
@@ -78,6 +79,21 @@ export function download(format, ...files) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export async function post(url, content = "", overwrite = false, onupload) {
|
export async function post(url, content = "", overwrite = false, onupload) {
|
||||||
|
// Use the pre-existing API if:
|
||||||
|
const useResourcesApi =
|
||||||
|
// a folder is being created
|
||||||
|
url.endsWith("/") ||
|
||||||
|
// We're not using http(s)
|
||||||
|
(content instanceof Blob &&
|
||||||
|
!["http:", "https:"].includes(window.location.protocol)) ||
|
||||||
|
// Tus is disabled / not applicable
|
||||||
|
!(await useTus(content));
|
||||||
|
return useResourcesApi
|
||||||
|
? postResources(url, content, overwrite, onupload)
|
||||||
|
: postTus(url, content, overwrite, onupload);
|
||||||
|
}
|
||||||
|
|
||||||
|
async function postResources(url, content = "", overwrite = false, onupload) {
|
||||||
url = removePrefix(url);
|
url = removePrefix(url);
|
||||||
|
|
||||||
let bufferContent;
|
let bufferContent;
|
||||||
|
|||||||
195
frontend/src/api/tus.js
Normal file
195
frontend/src/api/tus.js
Normal file
@@ -0,0 +1,195 @@
|
|||||||
|
import * as tus from "tus-js-client";
|
||||||
|
import { baseURL, tusEndpoint, tusSettings } from "@/utils/constants";
|
||||||
|
import store from "@/store";
|
||||||
|
import { removePrefix } from "@/api/utils";
|
||||||
|
import { fetchURL } from "./utils";
|
||||||
|
|
||||||
|
const RETRY_BASE_DELAY = 1000;
|
||||||
|
const RETRY_MAX_DELAY = 20000;
|
||||||
|
const SPEED_UPDATE_INTERVAL = 1000;
|
||||||
|
const ALPHA = 0.2;
|
||||||
|
const ONE_MINUS_ALPHA = 1 - ALPHA;
|
||||||
|
const RECENT_SPEEDS_LIMIT = 5;
|
||||||
|
const MB_DIVISOR = 1024 * 1024;
|
||||||
|
const CURRENT_UPLOAD_LIST = {};
|
||||||
|
|
||||||
|
export async function upload(
|
||||||
|
filePath,
|
||||||
|
content = "",
|
||||||
|
overwrite = false,
|
||||||
|
onupload
|
||||||
|
) {
|
||||||
|
if (!tusSettings) {
|
||||||
|
// Shouldn't happen as we check for tus support before calling this function
|
||||||
|
throw new Error("Tus.io settings are not defined");
|
||||||
|
}
|
||||||
|
|
||||||
|
filePath = removePrefix(filePath);
|
||||||
|
let resourcePath = `${tusEndpoint}${filePath}?override=${overwrite}`;
|
||||||
|
|
||||||
|
await createUpload(resourcePath);
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
let upload = new tus.Upload(content, {
|
||||||
|
uploadUrl: `${baseURL}${resourcePath}`,
|
||||||
|
chunkSize: tusSettings.chunkSize,
|
||||||
|
retryDelays: computeRetryDelays(tusSettings),
|
||||||
|
parallelUploads: 1,
|
||||||
|
storeFingerprintForResuming: false,
|
||||||
|
headers: {
|
||||||
|
"X-Auth": store.state.jwt,
|
||||||
|
},
|
||||||
|
onError: function (error) {
|
||||||
|
if (CURRENT_UPLOAD_LIST[filePath].interval) {
|
||||||
|
clearInterval(CURRENT_UPLOAD_LIST[filePath].interval);
|
||||||
|
}
|
||||||
|
delete CURRENT_UPLOAD_LIST[filePath];
|
||||||
|
reject("Upload failed: " + error);
|
||||||
|
},
|
||||||
|
onProgress: function (bytesUploaded) {
|
||||||
|
let fileData = CURRENT_UPLOAD_LIST[filePath];
|
||||||
|
fileData.currentBytesUploaded = bytesUploaded;
|
||||||
|
|
||||||
|
if (!fileData.hasStarted) {
|
||||||
|
fileData.hasStarted = true;
|
||||||
|
fileData.lastProgressTimestamp = Date.now();
|
||||||
|
|
||||||
|
fileData.interval = setInterval(() => {
|
||||||
|
calcProgress(filePath);
|
||||||
|
}, SPEED_UPDATE_INTERVAL);
|
||||||
|
}
|
||||||
|
if (typeof onupload === "function") {
|
||||||
|
onupload({ loaded: bytesUploaded });
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onSuccess: function () {
|
||||||
|
if (CURRENT_UPLOAD_LIST[filePath].interval) {
|
||||||
|
clearInterval(CURRENT_UPLOAD_LIST[filePath].interval);
|
||||||
|
}
|
||||||
|
delete CURRENT_UPLOAD_LIST[filePath];
|
||||||
|
resolve();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
CURRENT_UPLOAD_LIST[filePath] = {
|
||||||
|
upload: upload,
|
||||||
|
recentSpeeds: [],
|
||||||
|
initialBytesUploaded: 0,
|
||||||
|
currentBytesUploaded: 0,
|
||||||
|
currentAverageSpeed: 0,
|
||||||
|
lastProgressTimestamp: null,
|
||||||
|
sumOfRecentSpeeds: 0,
|
||||||
|
hasStarted: false,
|
||||||
|
interval: null,
|
||||||
|
};
|
||||||
|
upload.start();
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
async function createUpload(resourcePath) {
|
||||||
|
let headResp = await fetchURL(resourcePath, {
|
||||||
|
method: "POST",
|
||||||
|
});
|
||||||
|
if (headResp.status !== 201) {
|
||||||
|
throw new Error(
|
||||||
|
`Failed to create an upload: ${headResp.status} ${headResp.statusText}`
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function computeRetryDelays(tusSettings) {
|
||||||
|
if (!tusSettings.retryCount || tusSettings.retryCount < 1) {
|
||||||
|
// Disable retries altogether
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
// The tus client expects our retries as an array with computed backoffs
|
||||||
|
// E.g.: [0, 3000, 5000, 10000, 20000]
|
||||||
|
const retryDelays = [];
|
||||||
|
let delay = 0;
|
||||||
|
|
||||||
|
for (let i = 0; i < tusSettings.retryCount; i++) {
|
||||||
|
retryDelays.push(Math.min(delay, RETRY_MAX_DELAY));
|
||||||
|
delay =
|
||||||
|
delay === 0 ? RETRY_BASE_DELAY : Math.min(delay * 2, RETRY_MAX_DELAY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return retryDelays;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function useTus(content) {
|
||||||
|
return isTusSupported() && content instanceof Blob;
|
||||||
|
}
|
||||||
|
|
||||||
|
function isTusSupported() {
|
||||||
|
return tus.isSupported === true;
|
||||||
|
}
|
||||||
|
|
||||||
|
function computeETA(state) {
|
||||||
|
if (state.speedMbyte === 0) {
|
||||||
|
return Infinity;
|
||||||
|
}
|
||||||
|
const totalSize = state.sizes.reduce((acc, size) => acc + size, 0);
|
||||||
|
const uploadedSize = state.progress.reduce(
|
||||||
|
(acc, progress) => acc + progress,
|
||||||
|
0
|
||||||
|
);
|
||||||
|
const remainingSize = totalSize - uploadedSize;
|
||||||
|
const speedBytesPerSecond = state.speedMbyte * 1024 * 1024;
|
||||||
|
return remainingSize / speedBytesPerSecond;
|
||||||
|
}
|
||||||
|
|
||||||
|
function computeGlobalSpeedAndETA() {
|
||||||
|
let totalSpeed = 0;
|
||||||
|
let totalCount = 0;
|
||||||
|
|
||||||
|
for (let filePath in CURRENT_UPLOAD_LIST) {
|
||||||
|
totalSpeed += CURRENT_UPLOAD_LIST[filePath].currentAverageSpeed;
|
||||||
|
totalCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (totalCount === 0) return { speed: 0, eta: Infinity };
|
||||||
|
|
||||||
|
const averageSpeed = totalSpeed / totalCount;
|
||||||
|
const averageETA = computeETA(store.state.upload, averageSpeed);
|
||||||
|
|
||||||
|
return { speed: averageSpeed, eta: averageETA };
|
||||||
|
}
|
||||||
|
|
||||||
|
function calcProgress(filePath) {
|
||||||
|
let fileData = CURRENT_UPLOAD_LIST[filePath];
|
||||||
|
|
||||||
|
let elapsedTime = (Date.now() - fileData.lastProgressTimestamp) / 1000;
|
||||||
|
let bytesSinceLastUpdate =
|
||||||
|
fileData.currentBytesUploaded - fileData.initialBytesUploaded;
|
||||||
|
let currentSpeed = bytesSinceLastUpdate / MB_DIVISOR / elapsedTime;
|
||||||
|
|
||||||
|
if (fileData.recentSpeeds.length >= RECENT_SPEEDS_LIMIT) {
|
||||||
|
fileData.sumOfRecentSpeeds -= fileData.recentSpeeds.shift();
|
||||||
|
}
|
||||||
|
|
||||||
|
fileData.recentSpeeds.push(currentSpeed);
|
||||||
|
fileData.sumOfRecentSpeeds += currentSpeed;
|
||||||
|
|
||||||
|
let avgRecentSpeed =
|
||||||
|
fileData.sumOfRecentSpeeds / fileData.recentSpeeds.length;
|
||||||
|
fileData.currentAverageSpeed =
|
||||||
|
ALPHA * avgRecentSpeed + ONE_MINUS_ALPHA * fileData.currentAverageSpeed;
|
||||||
|
|
||||||
|
const { speed, eta } = computeGlobalSpeedAndETA();
|
||||||
|
store.commit("setUploadSpeed", speed);
|
||||||
|
store.commit("setETA", eta);
|
||||||
|
|
||||||
|
fileData.initialBytesUploaded = fileData.currentBytesUploaded;
|
||||||
|
fileData.lastProgressTimestamp = Date.now();
|
||||||
|
}
|
||||||
|
|
||||||
|
export function abortAllUploads() {
|
||||||
|
for (let filePath in CURRENT_UPLOAD_LIST) {
|
||||||
|
if (CURRENT_UPLOAD_LIST[filePath].interval) {
|
||||||
|
clearInterval(CURRENT_UPLOAD_LIST[filePath].interval);
|
||||||
|
}
|
||||||
|
if (CURRENT_UPLOAD_LIST[filePath].upload) {
|
||||||
|
CURRENT_UPLOAD_LIST[filePath].upload.abort(true);
|
||||||
|
}
|
||||||
|
delete CURRENT_UPLOAD_LIST[filePath];
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -8,7 +8,6 @@ export async function fetchURL(url, opts, auth = true) {
|
|||||||
opts.headers = opts.headers || {};
|
opts.headers = opts.headers || {};
|
||||||
|
|
||||||
let { headers, ...rest } = opts;
|
let { headers, ...rest } = opts;
|
||||||
|
|
||||||
let res;
|
let res;
|
||||||
try {
|
try {
|
||||||
res = await fetch(`${baseURL}${url}`, {
|
res = await fetch(`${baseURL}${url}`, {
|
||||||
|
|||||||
@@ -90,10 +90,10 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
watch: {
|
watch: {
|
||||||
show(val, old) {
|
currentPrompt(val, old) {
|
||||||
this.active = val === "search";
|
this.active = val?.prompt === "search";
|
||||||
|
|
||||||
if (old === "search" && !this.active) {
|
if (old?.prompt === "search" && !this.active) {
|
||||||
if (this.reload) {
|
if (this.reload) {
|
||||||
this.setReload(true);
|
this.setReload(true);
|
||||||
}
|
}
|
||||||
@@ -116,8 +116,8 @@ export default {
|
|||||||
},
|
},
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(["user", "show"]),
|
...mapState(["user"]),
|
||||||
...mapGetters(["isListing"]),
|
...mapGetters(["isListing", "currentPrompt"]),
|
||||||
boxes() {
|
boxes() {
|
||||||
return boxes;
|
return boxes;
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -1,37 +1,54 @@
|
|||||||
<template>
|
<template>
|
||||||
<div
|
<div
|
||||||
@click="focus"
|
|
||||||
class="shell"
|
class="shell"
|
||||||
ref="scrollable"
|
|
||||||
:class="{ ['shell--hidden']: !showShell }"
|
:class="{ ['shell--hidden']: !showShell }"
|
||||||
|
:style="{ height: `${this.shellHeight}em`, direction: 'ltr' }"
|
||||||
>
|
>
|
||||||
<div v-for="(c, index) in content" :key="index" class="shell__result">
|
<div
|
||||||
<div class="shell__prompt">
|
@pointerdown="startDrag()"
|
||||||
<i class="material-icons">chevron_right</i>
|
@pointerup="stopDrag()"
|
||||||
|
class="shell__divider"
|
||||||
|
:style="this.shellDrag ? { background: `${checkTheme()}` } : ''"
|
||||||
|
></div>
|
||||||
|
<div @click="focus" class="shell__content" ref="scrollable">
|
||||||
|
<div v-for="(c, index) in content" :key="index" class="shell__result">
|
||||||
|
<div class="shell__prompt">
|
||||||
|
<i class="material-icons">chevron_right</i>
|
||||||
|
</div>
|
||||||
|
<pre class="shell__text">{{ c.text }}</pre>
|
||||||
</div>
|
</div>
|
||||||
<pre class="shell__text">{{ c.text }}</pre>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div class="shell__result" :class="{ 'shell__result--hidden': !canInput }">
|
<div
|
||||||
<div class="shell__prompt">
|
class="shell__result"
|
||||||
<i class="material-icons">chevron_right</i>
|
:class="{ 'shell__result--hidden': !canInput }"
|
||||||
|
>
|
||||||
|
<div class="shell__prompt">
|
||||||
|
<i class="material-icons">chevron_right</i>
|
||||||
|
</div>
|
||||||
|
<pre
|
||||||
|
tabindex="0"
|
||||||
|
ref="input"
|
||||||
|
class="shell__text"
|
||||||
|
contenteditable="true"
|
||||||
|
@keydown.prevent.38="historyUp"
|
||||||
|
@keydown.prevent.40="historyDown"
|
||||||
|
@keypress.prevent.enter="submit"
|
||||||
|
/>
|
||||||
</div>
|
</div>
|
||||||
<pre
|
|
||||||
tabindex="0"
|
|
||||||
ref="input"
|
|
||||||
class="shell__text"
|
|
||||||
contenteditable="true"
|
|
||||||
@keydown.prevent.38="historyUp"
|
|
||||||
@keydown.prevent.40="historyDown"
|
|
||||||
@keypress.prevent.enter="submit"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
|
<div
|
||||||
|
@pointerup="stopDrag()"
|
||||||
|
class="shell__overlay"
|
||||||
|
v-show="this.shellDrag"
|
||||||
|
></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapMutations, mapState, mapGetters } from "vuex";
|
import { mapMutations, mapState, mapGetters } from "vuex";
|
||||||
import { commands } from "@/api";
|
import { commands } from "@/api";
|
||||||
|
import { throttle } from "lodash";
|
||||||
|
import { theme } from "@/utils/constants";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "shell",
|
name: "shell",
|
||||||
@@ -51,9 +68,55 @@ export default {
|
|||||||
history: [],
|
history: [],
|
||||||
historyPos: 0,
|
historyPos: 0,
|
||||||
canInput: true,
|
canInput: true,
|
||||||
|
shellDrag: false,
|
||||||
|
shellHeight: 25,
|
||||||
|
fontsize: parseFloat(getComputedStyle(document.documentElement).fontSize),
|
||||||
}),
|
}),
|
||||||
|
mounted() {
|
||||||
|
window.addEventListener("resize", this.resize);
|
||||||
|
},
|
||||||
|
beforeDestroy() {
|
||||||
|
window.removeEventListener("resize", this.resize);
|
||||||
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapMutations(["toggleShell"]),
|
...mapMutations(["toggleShell"]),
|
||||||
|
checkTheme() {
|
||||||
|
if (theme == "dark") {
|
||||||
|
return "rgba(255, 255, 255, 0.4)";
|
||||||
|
}
|
||||||
|
return "rgba(127, 127, 127, 0.4)";
|
||||||
|
},
|
||||||
|
startDrag() {
|
||||||
|
document.addEventListener("pointermove", this.handleDrag);
|
||||||
|
this.shellDrag = true;
|
||||||
|
},
|
||||||
|
stopDrag() {
|
||||||
|
document.removeEventListener("pointermove", this.handleDrag);
|
||||||
|
this.shellDrag = false;
|
||||||
|
},
|
||||||
|
handleDrag: throttle(function (event) {
|
||||||
|
const top = window.innerHeight / this.fontsize - 4;
|
||||||
|
const userPos = (window.innerHeight - event.clientY) / this.fontsize;
|
||||||
|
const bottom =
|
||||||
|
2.25 +
|
||||||
|
document.querySelector(".shell__divider").offsetHeight / this.fontsize;
|
||||||
|
|
||||||
|
if (userPos <= top && userPos >= bottom) {
|
||||||
|
this.shellHeight = userPos.toFixed(2);
|
||||||
|
}
|
||||||
|
}, 32),
|
||||||
|
resize: throttle(function () {
|
||||||
|
const top = window.innerHeight / this.fontsize - 4;
|
||||||
|
const bottom =
|
||||||
|
2.25 +
|
||||||
|
document.querySelector(".shell__divider").offsetHeight / this.fontsize;
|
||||||
|
|
||||||
|
if (this.shellHeight > top) {
|
||||||
|
this.shellHeight = top;
|
||||||
|
} else if (this.shellHeight < bottom) {
|
||||||
|
this.shellHeight = bottom;
|
||||||
|
}
|
||||||
|
}, 32),
|
||||||
scroll: function () {
|
scroll: function () {
|
||||||
this.$refs.scrollable.scrollTop = this.$refs.scrollable.scrollHeight;
|
this.$refs.scrollable.scrollTop = this.$refs.scrollable.scrollHeight;
|
||||||
},
|
},
|
||||||
@@ -113,7 +176,10 @@ export default {
|
|||||||
this.scroll();
|
this.scroll();
|
||||||
},
|
},
|
||||||
() => {
|
() => {
|
||||||
results.text = results.text.trimEnd();
|
results.text = results.text
|
||||||
|
// eslint-disable-next-line no-control-regex
|
||||||
|
.replace(/\u001b\[[0-9;]+m/g, "") // Filter ANSI color for now
|
||||||
|
.trimEnd();
|
||||||
this.canInput = true;
|
this.canInput = true;
|
||||||
this.$refs.input.focus();
|
this.$refs.input.focus();
|
||||||
this.scroll();
|
this.scroll();
|
||||||
|
|||||||
@@ -45,7 +45,7 @@
|
|||||||
</button>
|
</button>
|
||||||
|
|
||||||
<button
|
<button
|
||||||
v-if="authMethod == 'json'"
|
v-if="canLogout"
|
||||||
@click="logout"
|
@click="logout"
|
||||||
class="action"
|
class="action"
|
||||||
id="logout"
|
id="logout"
|
||||||
@@ -82,7 +82,9 @@
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
class="credits"
|
class="credits"
|
||||||
v-if="$router.currentRoute.path.includes('/files/')"
|
v-if="
|
||||||
|
$router.currentRoute.path.includes('/files/') && !disableUsedPercentage
|
||||||
|
"
|
||||||
style="width: 90%; margin: 2em 2.5em 3em 2.5em"
|
style="width: 90%; margin: 2em 2.5em 3em 2.5em"
|
||||||
>
|
>
|
||||||
<progress-bar :val="usage.usedPercentage" size="small"></progress-bar>
|
<progress-bar :val="usage.usedPercentage" size="small"></progress-bar>
|
||||||
@@ -116,8 +118,9 @@ import {
|
|||||||
version,
|
version,
|
||||||
signup,
|
signup,
|
||||||
disableExternal,
|
disableExternal,
|
||||||
|
disableUsedPercentage,
|
||||||
noAuth,
|
noAuth,
|
||||||
authMethod,
|
loginPage,
|
||||||
} from "@/utils/constants";
|
} from "@/utils/constants";
|
||||||
import { files as api } from "@/api";
|
import { files as api } from "@/api";
|
||||||
import ProgressBar from "vue-simple-progress";
|
import ProgressBar from "vue-simple-progress";
|
||||||
@@ -130,15 +133,15 @@ export default {
|
|||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(["user"]),
|
...mapState(["user"]),
|
||||||
...mapGetters(["isLogged"]),
|
...mapGetters(["isLogged", "currentPrompt"]),
|
||||||
active() {
|
active() {
|
||||||
return this.$store.state.show === "sidebar";
|
return this.currentPrompt?.prompt === "sidebar";
|
||||||
},
|
},
|
||||||
signup: () => signup,
|
signup: () => signup,
|
||||||
version: () => version,
|
version: () => version,
|
||||||
disableExternal: () => disableExternal,
|
disableExternal: () => disableExternal,
|
||||||
noAuth: () => noAuth,
|
disableUsedPercentage: () => disableUsedPercentage,
|
||||||
authMethod: () => authMethod,
|
canLogout: () => !noAuth && loginPage,
|
||||||
},
|
},
|
||||||
asyncComputed: {
|
asyncComputed: {
|
||||||
usage: {
|
usage: {
|
||||||
@@ -147,6 +150,9 @@ export default {
|
|||||||
? this.$route.path
|
? this.$route.path
|
||||||
: this.$route.path + "/";
|
: this.$route.path + "/";
|
||||||
let usageStats = { used: 0, total: 0, usedPercentage: 0 };
|
let usageStats = { used: 0, total: 0, usedPercentage: 0 };
|
||||||
|
if (this.disableUsedPercentage) {
|
||||||
|
return usageStats;
|
||||||
|
}
|
||||||
try {
|
try {
|
||||||
let usage = await api.usage(path);
|
let usage = await api.usage(path);
|
||||||
usageStats = {
|
usageStats = {
|
||||||
|
|||||||
@@ -10,12 +10,7 @@
|
|||||||
@mouseup="mouseUp"
|
@mouseup="mouseUp"
|
||||||
@wheel="wheelMove"
|
@wheel="wheelMove"
|
||||||
>
|
>
|
||||||
<img
|
<img class="image-ex-img image-ex-img-center" ref="imgex" @load="onLoad" />
|
||||||
src=""
|
|
||||||
class="image-ex-img image-ex-img-center"
|
|
||||||
ref="imgex"
|
|
||||||
@load="onLoad"
|
|
||||||
/>
|
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
<script>
|
<script>
|
||||||
|
|||||||
@@ -37,8 +37,8 @@
|
|||||||
<script>
|
<script>
|
||||||
import { enableThumbs } from "@/utils/constants";
|
import { enableThumbs } from "@/utils/constants";
|
||||||
import { mapMutations, mapGetters, mapState } from "vuex";
|
import { mapMutations, mapGetters, mapState } from "vuex";
|
||||||
import filesize from "filesize";
|
import { filesize } from "@/utils";
|
||||||
import moment from "moment";
|
import moment from "moment/min/moment-with-locales";
|
||||||
import { files as api } from "@/api";
|
import { files as api } from "@/api";
|
||||||
import * as upload from "@/utils/upload";
|
import * as upload from "@/utils/upload";
|
||||||
|
|
||||||
@@ -191,7 +191,12 @@ export default {
|
|||||||
action(overwrite, rename);
|
action(overwrite, rename);
|
||||||
},
|
},
|
||||||
itemClick: function (event) {
|
itemClick: function (event) {
|
||||||
if (this.singleClick && !this.$store.state.multiple) this.open();
|
if (
|
||||||
|
!(event.ctrlKey || event.metaKey) &&
|
||||||
|
this.singleClick &&
|
||||||
|
!this.$store.state.multiple
|
||||||
|
)
|
||||||
|
this.open();
|
||||||
else this.click(event);
|
else this.click(event);
|
||||||
},
|
},
|
||||||
click: function (event) {
|
click: function (event) {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@
|
|||||||
|
|
||||||
<slot />
|
<slot />
|
||||||
|
|
||||||
<div id="dropdown" :class="{ active: this.$store.state.show === 'more' }">
|
<div id="dropdown" :class="{ active: this.currentPromptName === 'more' }">
|
||||||
<slot name="actions" />
|
<slot name="actions" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
@@ -25,7 +25,7 @@
|
|||||||
|
|
||||||
<div
|
<div
|
||||||
class="overlay"
|
class="overlay"
|
||||||
v-show="this.$store.state.show == 'more'"
|
v-show="this.currentPromptName == 'more'"
|
||||||
@click="$store.commit('closeHovers')"
|
@click="$store.commit('closeHovers')"
|
||||||
/>
|
/>
|
||||||
</header>
|
</header>
|
||||||
@@ -34,7 +34,8 @@
|
|||||||
<script>
|
<script>
|
||||||
import { logoURL } from "@/utils/constants";
|
import { logoURL } from "@/utils/constants";
|
||||||
|
|
||||||
import Action from "@/components/header/Action";
|
import Action from "@/components/header/Action.vue";
|
||||||
|
import { mapGetters } from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "header-bar",
|
name: "header-bar",
|
||||||
@@ -52,6 +53,9 @@ export default {
|
|||||||
this.$store.commit("showHover", "sidebar");
|
this.$store.commit("showHover", "sidebar");
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
computed: {
|
||||||
|
...mapGetters(["currentPromptName"]),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|
||||||
|
|||||||
@@ -6,33 +6,50 @@
|
|||||||
|
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
<p>{{ $t("prompts.copyMessage") }}</p>
|
<p>{{ $t("prompts.copyMessage") }}</p>
|
||||||
<file-list @update:selected="(val) => (dest = val)"></file-list>
|
<file-list ref="fileList" @update:selected="(val) => (dest = val)">
|
||||||
|
</file-list>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card-action">
|
<div
|
||||||
<button
|
class="card-action"
|
||||||
class="button button--flat button--grey"
|
style="display: flex; align-items: center; justify-content: space-between"
|
||||||
@click="$store.commit('closeHovers')"
|
>
|
||||||
:aria-label="$t('buttons.cancel')"
|
<template v-if="user.perm.create">
|
||||||
:title="$t('buttons.cancel')"
|
<button
|
||||||
>
|
class="button button--flat"
|
||||||
{{ $t("buttons.cancel") }}
|
@click="$refs.fileList.createDir()"
|
||||||
</button>
|
:aria-label="$t('sidebar.newFolder')"
|
||||||
<button
|
:title="$t('sidebar.newFolder')"
|
||||||
class="button button--flat"
|
style="justify-self: left"
|
||||||
@click="copy"
|
>
|
||||||
:aria-label="$t('buttons.copy')"
|
<span>{{ $t("sidebar.newFolder") }}</span>
|
||||||
:title="$t('buttons.copy')"
|
</button>
|
||||||
>
|
</template>
|
||||||
{{ $t("buttons.copy") }}
|
<div>
|
||||||
</button>
|
<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"
|
||||||
|
@click="copy"
|
||||||
|
:aria-label="$t('buttons.copy')"
|
||||||
|
:title="$t('buttons.copy')"
|
||||||
|
>
|
||||||
|
{{ $t("buttons.copy") }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState } from "vuex";
|
import { mapState } from "vuex";
|
||||||
import FileList from "./FileList";
|
import FileList from "./FileList.vue";
|
||||||
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";
|
import * as upload from "@/utils/upload";
|
||||||
@@ -46,7 +63,7 @@ export default {
|
|||||||
dest: null,
|
dest: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: mapState(["req", "selected"]),
|
computed: mapState(["req", "selected", "user"]),
|
||||||
methods: {
|
methods: {
|
||||||
copy: async function (event) {
|
copy: async function (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
<template>
|
<template>
|
||||||
<div class="card floating">
|
<div class="card floating">
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
<p v-if="req.kind !== 'listing'">
|
<p v-if="!this.isListing || selectedCount === 1">
|
||||||
{{ $t("prompts.deleteMessageSingle") }}
|
{{ $t("prompts.deleteMessageSingle") }}
|
||||||
</p>
|
</p>
|
||||||
<p v-else>
|
<p v-else>
|
||||||
@@ -37,20 +37,21 @@ import buttons from "@/utils/buttons";
|
|||||||
export default {
|
export default {
|
||||||
name: "delete",
|
name: "delete",
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(["isListing", "selectedCount"]),
|
...mapGetters(["isListing", "selectedCount", "currentPrompt"]),
|
||||||
...mapState(["req", "selected", "showConfirm"]),
|
...mapState(["req", "selected"]),
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
...mapMutations(["closeHovers"]),
|
...mapMutations(["closeHovers"]),
|
||||||
submit: async function () {
|
submit: async function () {
|
||||||
buttons.loading("delete");
|
buttons.loading("delete");
|
||||||
|
|
||||||
|
window.sessionStorage.setItem("modified", "true");
|
||||||
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.showConfirm();
|
this.currentPrompt?.confirm();
|
||||||
this.closeHovers();
|
this.closeHovers();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
45
frontend/src/components/prompts/DiscardEditorChanges.vue
Normal file
45
frontend/src/components/prompts/DiscardEditorChanges.vue
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
<template>
|
||||||
|
<div class="card floating">
|
||||||
|
<div class="card-content">
|
||||||
|
<p>
|
||||||
|
{{ $t("prompts.discardEditorChanges") }}
|
||||||
|
</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.discardChanges')"
|
||||||
|
:title="$t('buttons.discardChanges')"
|
||||||
|
>
|
||||||
|
{{ $t("buttons.discardChanges") }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import { mapMutations } from "vuex";
|
||||||
|
import url from "@/utils/url";
|
||||||
|
|
||||||
|
export default {
|
||||||
|
name: "discardEditorChanges",
|
||||||
|
methods: {
|
||||||
|
...mapMutations(["closeHovers"]),
|
||||||
|
submit: async function () {
|
||||||
|
this.$store.commit("updateRequest", {});
|
||||||
|
|
||||||
|
let uri = url.removeLastDir(this.$route.path) + "/";
|
||||||
|
this.$router.push({ path: uri });
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
</script>
|
||||||
@@ -11,7 +11,7 @@
|
|||||||
v-for="(ext, format) in formats"
|
v-for="(ext, format) in formats"
|
||||||
:key="format"
|
:key="format"
|
||||||
class="button button--block"
|
class="button button--block"
|
||||||
@click="showConfirm(format)"
|
@click="currentPrompt.confirm(format)"
|
||||||
v-focus
|
v-focus
|
||||||
>
|
>
|
||||||
{{ ext }}
|
{{ ext }}
|
||||||
@@ -21,7 +21,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState } from "vuex";
|
import { mapGetters } from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "download",
|
name: "download",
|
||||||
@@ -38,6 +38,8 @@ export default {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: mapState(["showConfirm"]),
|
computed: {
|
||||||
|
...mapGetters(["currentPrompt"]),
|
||||||
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -133,6 +133,17 @@ export default {
|
|||||||
this.selected = event.currentTarget.dataset.url;
|
this.selected = event.currentTarget.dataset.url;
|
||||||
this.$emit("update:selected", this.selected);
|
this.$emit("update:selected", this.selected);
|
||||||
},
|
},
|
||||||
|
createDir: async function () {
|
||||||
|
this.$store.commit("showHover", {
|
||||||
|
prompt: "newDir",
|
||||||
|
action: null,
|
||||||
|
confirm: null,
|
||||||
|
props: {
|
||||||
|
redirect: false,
|
||||||
|
base: this.current === this.$route.path ? null : this.current,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -12,10 +12,17 @@
|
|||||||
<p class="break-word" v-if="selected.length < 2">
|
<p class="break-word" v-if="selected.length < 2">
|
||||||
<strong>{{ $t("prompts.displayName") }}</strong> {{ name }}
|
<strong>{{ $t("prompts.displayName") }}</strong> {{ name }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p v-if="!dir || selected.length > 1">
|
<p v-if="!dir || selected.length > 1">
|
||||||
<strong>{{ $t("prompts.size") }}:</strong>
|
<strong>{{ $t("prompts.size") }}:</strong>
|
||||||
<span id="content_length"></span> {{ humanSize }}
|
<span id="content_length"></span> {{ humanSize }}
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
|
<div v-if="resolution">
|
||||||
|
<strong>{{ $t("prompts.resolution") }}:</strong>
|
||||||
|
{{ resolution.width }} x {{ resolution.height }}
|
||||||
|
</div>
|
||||||
|
|
||||||
<p v-if="selected.length < 2" :title="modTime">
|
<p v-if="selected.length < 2" :title="modTime">
|
||||||
<strong>{{ $t("prompts.lastModified") }}:</strong> {{ humanTime }}
|
<strong>{{ $t("prompts.lastModified") }}:</strong> {{ humanTime }}
|
||||||
</p>
|
</p>
|
||||||
@@ -81,8 +88,8 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState, mapGetters } from "vuex";
|
import { mapState, mapGetters } from "vuex";
|
||||||
import filesize from "filesize";
|
import { filesize } from "@/utils";
|
||||||
import moment from "moment";
|
import moment from "moment/min/moment-with-locales";
|
||||||
import { files as api } from "@/api";
|
import { files as api } from "@/api";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -126,6 +133,17 @@ export default {
|
|||||||
: this.req.items[this.selected[0]].isDir)
|
: this.req.items[this.selected[0]].isDir)
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
|
resolution: function () {
|
||||||
|
if (this.selectedCount === 1) {
|
||||||
|
const selectedItem = this.req.items[this.selected[0]];
|
||||||
|
if (selectedItem && selectedItem.type === "image") {
|
||||||
|
return selectedItem.resolution;
|
||||||
|
}
|
||||||
|
} else if (this.req && this.req.type === "image") {
|
||||||
|
return this.req.resolution;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
checksum: async function (event, algo) {
|
checksum: async function (event, algo) {
|
||||||
@@ -142,7 +160,7 @@ export default {
|
|||||||
try {
|
try {
|
||||||
const hash = await api.checksum(link, algo);
|
const hash = await api.checksum(link, algo);
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
event.target.innerHTML = hash
|
event.target.innerHTML = hash;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.$showError(e);
|
this.$showError(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,34 +5,51 @@
|
|||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card-content">
|
<div class="card-content">
|
||||||
<file-list @update:selected="(val) => (dest = val)"></file-list>
|
<file-list ref="fileList" @update:selected="(val) => (dest = val)">
|
||||||
|
</file-list>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="card-action">
|
<div
|
||||||
<button
|
class="card-action"
|
||||||
class="button button--flat button--grey"
|
style="display: flex; align-items: center; justify-content: space-between"
|
||||||
@click="$store.commit('closeHovers')"
|
>
|
||||||
:aria-label="$t('buttons.cancel')"
|
<template v-if="user.perm.create">
|
||||||
:title="$t('buttons.cancel')"
|
<button
|
||||||
>
|
class="button button--flat"
|
||||||
{{ $t("buttons.cancel") }}
|
@click="$refs.fileList.createDir()"
|
||||||
</button>
|
:aria-label="$t('sidebar.newFolder')"
|
||||||
<button
|
:title="$t('sidebar.newFolder')"
|
||||||
class="button button--flat"
|
style="justify-self: left"
|
||||||
@click="move"
|
>
|
||||||
:disabled="$route.path === dest"
|
<span>{{ $t("sidebar.newFolder") }}</span>
|
||||||
:aria-label="$t('buttons.move')"
|
</button>
|
||||||
:title="$t('buttons.move')"
|
</template>
|
||||||
>
|
<div>
|
||||||
{{ $t("buttons.move") }}
|
<button
|
||||||
</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"
|
||||||
|
@click="move"
|
||||||
|
:disabled="$route.path === dest"
|
||||||
|
:aria-label="$t('buttons.move')"
|
||||||
|
:title="$t('buttons.move')"
|
||||||
|
>
|
||||||
|
{{ $t("buttons.move") }}
|
||||||
|
</button>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState } from "vuex";
|
import { mapState } from "vuex";
|
||||||
import FileList from "./FileList";
|
import FileList from "./FileList.vue";
|
||||||
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";
|
import * as upload from "@/utils/upload";
|
||||||
@@ -46,7 +63,7 @@ export default {
|
|||||||
dest: null,
|
dest: null,
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: mapState(["req", "selected"]),
|
computed: mapState(["req", "selected", "user"]),
|
||||||
methods: {
|
methods: {
|
||||||
move: async function (event) {
|
move: async function (event) {
|
||||||
event.preventDefault();
|
event.preventDefault();
|
||||||
|
|||||||
@@ -43,6 +43,16 @@ import url from "@/utils/url";
|
|||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "new-dir",
|
name: "new-dir",
|
||||||
|
props: {
|
||||||
|
redirect: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true,
|
||||||
|
},
|
||||||
|
base: {
|
||||||
|
type: [String, null],
|
||||||
|
default: null,
|
||||||
|
},
|
||||||
|
},
|
||||||
data: function () {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
name: "",
|
name: "",
|
||||||
@@ -57,7 +67,11 @@ export default {
|
|||||||
if (this.new === "") return;
|
if (this.new === "") return;
|
||||||
|
|
||||||
// Build the path of the new directory.
|
// Build the path of the new directory.
|
||||||
let uri = this.isFiles ? this.$route.path + "/" : "/";
|
let uri;
|
||||||
|
|
||||||
|
if (this.base) uri = this.base;
|
||||||
|
else if (this.isFiles) uri = this.$route.path + "/";
|
||||||
|
else uri = "/";
|
||||||
|
|
||||||
if (!this.isListing) {
|
if (!this.isListing) {
|
||||||
uri = url.removeLastDir(uri) + "/";
|
uri = url.removeLastDir(uri) + "/";
|
||||||
@@ -65,10 +79,14 @@ export default {
|
|||||||
|
|
||||||
uri += encodeURIComponent(this.name) + "/";
|
uri += encodeURIComponent(this.name) + "/";
|
||||||
uri = uri.replace("//", "/");
|
uri = uri.replace("//", "/");
|
||||||
|
|
||||||
try {
|
try {
|
||||||
await api.post(uri);
|
await api.post(uri);
|
||||||
this.$router.push({ path: uri });
|
if (this.redirect) {
|
||||||
|
this.$router.push({ path: uri });
|
||||||
|
} else if (!this.base) {
|
||||||
|
const res = await api.fetch(url.removeLastDir(uri) + "/");
|
||||||
|
this.$store.commit("updateRequest", res);
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
this.$showError(e);
|
this.$showError(e);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,26 +1,34 @@
|
|||||||
<template>
|
<template>
|
||||||
<div>
|
<div>
|
||||||
<component ref="currentComponent" :is="currentComponent"></component>
|
<component
|
||||||
|
v-if="showOverlay"
|
||||||
|
:ref="currentPromptName"
|
||||||
|
:is="currentPromptName"
|
||||||
|
v-bind="currentPrompt.props"
|
||||||
|
>
|
||||||
|
</component>
|
||||||
<div v-show="showOverlay" @click="resetPrompts" class="overlay"></div>
|
<div v-show="showOverlay" @click="resetPrompts" class="overlay"></div>
|
||||||
</div>
|
</div>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Help from "./Help";
|
import Help from "./Help.vue";
|
||||||
import Info from "./Info";
|
import Info from "./Info.vue";
|
||||||
import Delete from "./Delete";
|
import Delete from "./Delete.vue";
|
||||||
import Rename from "./Rename";
|
import Rename from "./Rename.vue";
|
||||||
import Download from "./Download";
|
import Download from "./Download.vue";
|
||||||
import Move from "./Move";
|
import Move from "./Move.vue";
|
||||||
import Copy from "./Copy";
|
import Copy from "./Copy.vue";
|
||||||
import NewFile from "./NewFile";
|
import NewFile from "./NewFile.vue";
|
||||||
import NewDir from "./NewDir";
|
import NewDir from "./NewDir.vue";
|
||||||
import Replace from "./Replace";
|
import Replace from "./Replace.vue";
|
||||||
import ReplaceRename from "./ReplaceRename";
|
import ReplaceRename from "./ReplaceRename.vue";
|
||||||
import Share from "./Share";
|
import Share from "./Share.vue";
|
||||||
import Upload from "./Upload";
|
import Upload from "./Upload.vue";
|
||||||
import ShareDelete from "./ShareDelete";
|
import ShareDelete from "./ShareDelete.vue";
|
||||||
import { mapState } from "vuex";
|
import Sidebar from "../Sidebar.vue";
|
||||||
|
import DiscardEditorChanges from "./DiscardEditorChanges.vue";
|
||||||
|
import { mapGetters, mapState } from "vuex";
|
||||||
import buttons from "@/utils/buttons";
|
import buttons from "@/utils/buttons";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -40,6 +48,8 @@ export default {
|
|||||||
ReplaceRename,
|
ReplaceRename,
|
||||||
Upload,
|
Upload,
|
||||||
ShareDelete,
|
ShareDelete,
|
||||||
|
Sidebar,
|
||||||
|
DiscardEditorChanges,
|
||||||
},
|
},
|
||||||
data: function () {
|
data: function () {
|
||||||
return {
|
return {
|
||||||
@@ -52,19 +62,18 @@ export default {
|
|||||||
},
|
},
|
||||||
created() {
|
created() {
|
||||||
window.addEventListener("keydown", (event) => {
|
window.addEventListener("keydown", (event) => {
|
||||||
if (this.show == null) return;
|
if (this.currentPrompt == null) return;
|
||||||
|
|
||||||
let prompt = this.$refs.currentComponent;
|
const promptName = this.currentPrompt.prompt;
|
||||||
|
const prompt = this.$refs[promptName];
|
||||||
|
|
||||||
// Esc!
|
if (event.code === "Escape") {
|
||||||
if (event.keyCode === 27) {
|
|
||||||
event.stopImmediatePropagation();
|
event.stopImmediatePropagation();
|
||||||
this.$store.commit("closeHovers");
|
this.$store.commit("closeHovers");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Enter
|
if (event.code === "Enter") {
|
||||||
if (event.keyCode == 13) {
|
switch (promptName) {
|
||||||
switch (this.show) {
|
|
||||||
case "delete":
|
case "delete":
|
||||||
prompt.submit();
|
prompt.submit();
|
||||||
break;
|
break;
|
||||||
@@ -82,31 +91,13 @@ export default {
|
|||||||
});
|
});
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(["show", "plugins"]),
|
...mapState(["plugins"]),
|
||||||
currentComponent: function () {
|
...mapGetters(["currentPrompt", "currentPromptName"]),
|
||||||
const matched =
|
|
||||||
[
|
|
||||||
"info",
|
|
||||||
"help",
|
|
||||||
"delete",
|
|
||||||
"rename",
|
|
||||||
"move",
|
|
||||||
"copy",
|
|
||||||
"newFile",
|
|
||||||
"newDir",
|
|
||||||
"download",
|
|
||||||
"replace",
|
|
||||||
"replace-rename",
|
|
||||||
"share",
|
|
||||||
"upload",
|
|
||||||
"share-delete",
|
|
||||||
].indexOf(this.show) >= 0;
|
|
||||||
|
|
||||||
return (matched && this.show) || null;
|
|
||||||
},
|
|
||||||
showOverlay: function () {
|
showOverlay: function () {
|
||||||
return (
|
return (
|
||||||
this.show !== null && this.show !== "search" && this.show !== "more"
|
this.currentPrompt !== null &&
|
||||||
|
this.currentPrompt.prompt !== "search" &&
|
||||||
|
this.currentPrompt.prompt !== "more"
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -88,6 +88,7 @@ export default {
|
|||||||
newLink =
|
newLink =
|
||||||
url.removeLastDir(oldLink) + "/" + encodeURIComponent(this.name);
|
url.removeLastDir(oldLink) + "/" + encodeURIComponent(this.name);
|
||||||
|
|
||||||
|
window.sessionStorage.setItem("modified", "true");
|
||||||
try {
|
try {
|
||||||
await api.move([{ from: oldLink, to: newLink }]);
|
await api.move([{ from: oldLink, to: newLink }]);
|
||||||
if (!this.isListing) {
|
if (!this.isListing) {
|
||||||
|
|||||||
@@ -17,9 +17,17 @@
|
|||||||
>
|
>
|
||||||
{{ $t("buttons.cancel") }}
|
{{ $t("buttons.cancel") }}
|
||||||
</button>
|
</button>
|
||||||
|
<button
|
||||||
|
class="button button--flat button--blue"
|
||||||
|
@click="currentPrompt.action"
|
||||||
|
:aria-label="$t('buttons.continue')"
|
||||||
|
:title="$t('buttons.continue')"
|
||||||
|
>
|
||||||
|
{{ $t("buttons.continue") }}
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
class="button button--flat button--red"
|
class="button button--flat button--red"
|
||||||
@click="showConfirm"
|
@click="currentPrompt.confirm"
|
||||||
:aria-label="$t('buttons.replace')"
|
:aria-label="$t('buttons.replace')"
|
||||||
:title="$t('buttons.replace')"
|
:title="$t('buttons.replace')"
|
||||||
>
|
>
|
||||||
@@ -30,10 +38,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState } from "vuex";
|
import { mapGetters } from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "replace",
|
name: "replace",
|
||||||
computed: mapState(["showConfirm"]),
|
computed: mapGetters(["currentPrompt"]),
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -19,7 +19,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="button button--flat button--blue"
|
class="button button--flat button--blue"
|
||||||
@click="(event) => showConfirm(event, 'rename')"
|
@click="(event) => currentPrompt.confirm(event, 'rename')"
|
||||||
:aria-label="$t('buttons.rename')"
|
:aria-label="$t('buttons.rename')"
|
||||||
:title="$t('buttons.rename')"
|
:title="$t('buttons.rename')"
|
||||||
>
|
>
|
||||||
@@ -27,7 +27,7 @@
|
|||||||
</button>
|
</button>
|
||||||
<button
|
<button
|
||||||
class="button button--flat button--red"
|
class="button button--flat button--red"
|
||||||
@click="(event) => showConfirm(event, 'overwrite')"
|
@click="(event) => currentPrompt.confirm(event, 'overwrite')"
|
||||||
:aria-label="$t('buttons.replace')"
|
:aria-label="$t('buttons.replace')"
|
||||||
:title="$t('buttons.replace')"
|
:title="$t('buttons.replace')"
|
||||||
>
|
>
|
||||||
@@ -38,10 +38,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState } from "vuex";
|
import { mapGetters } from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "replace-rename",
|
name: "replace-rename",
|
||||||
computed: mapState(["showConfirm"]),
|
computed: mapGetters(["currentPrompt"]),
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -32,6 +32,16 @@
|
|||||||
<i class="material-icons">content_paste</i>
|
<i class="material-icons">content_paste</i>
|
||||||
</button>
|
</button>
|
||||||
</td>
|
</td>
|
||||||
|
<td class="small" v-if="hasDownloadLink()">
|
||||||
|
<button
|
||||||
|
class="action copy-clipboard"
|
||||||
|
:data-clipboard-text="buildDownloadLink(link)"
|
||||||
|
:aria-label="$t('buttons.copyDownloadLinkToClipboard')"
|
||||||
|
:title="$t('buttons.copyDownloadLinkToClipboard')"
|
||||||
|
>
|
||||||
|
<i class="material-icons">content_paste_go</i>
|
||||||
|
</button>
|
||||||
|
</td>
|
||||||
<td class="small">
|
<td class="small">
|
||||||
<button
|
<button
|
||||||
class="action"
|
class="action"
|
||||||
@@ -117,8 +127,8 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState, mapGetters } from "vuex";
|
import { mapState, mapGetters } from "vuex";
|
||||||
import { share as api } from "@/api";
|
import { share as api, pub as pub_api } from "@/api";
|
||||||
import moment from "moment";
|
import moment from "moment/min/moment-with-locales";
|
||||||
import Clipboard from "clipboard";
|
import Clipboard from "clipboard";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
@@ -215,6 +225,14 @@ export default {
|
|||||||
buildLink(share) {
|
buildLink(share) {
|
||||||
return api.getShareURL(share);
|
return api.getShareURL(share);
|
||||||
},
|
},
|
||||||
|
hasDownloadLink() {
|
||||||
|
return (
|
||||||
|
this.selected.length === 1 && !this.req.items[this.selected[0]].isDir
|
||||||
|
);
|
||||||
|
},
|
||||||
|
buildDownloadLink(share) {
|
||||||
|
return pub_api.getDownloadURL(share);
|
||||||
|
},
|
||||||
sort() {
|
sort() {
|
||||||
this.links = this.links.sort((a, b) => {
|
this.links = this.links.sort((a, b) => {
|
||||||
if (a.expire === 0) return -1;
|
if (a.expire === 0) return -1;
|
||||||
|
|||||||
@@ -25,16 +25,16 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState } from "vuex";
|
import { mapGetters } from "vuex";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "share-delete",
|
name: "share-delete",
|
||||||
computed: {
|
computed: {
|
||||||
...mapState(["showConfirm"]),
|
...mapGetters(["currentPrompt"]),
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
submit: function () {
|
submit: function () {
|
||||||
this.showConfirm();
|
this.currentPrompt?.confirm();
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -7,7 +7,18 @@
|
|||||||
<div class="card floating">
|
<div class="card floating">
|
||||||
<div class="card-title">
|
<div class="card-title">
|
||||||
<h2>{{ $t("prompts.uploadFiles", { files: filesInUploadCount }) }}</h2>
|
<h2>{{ $t("prompts.uploadFiles", { files: filesInUploadCount }) }}</h2>
|
||||||
|
<div class="upload-info">
|
||||||
|
<div class="upload-speed">{{ uploadSpeed.toFixed(2) }} MB/s</div>
|
||||||
|
<div class="upload-eta">{{ formattedETA }} remaining</div>
|
||||||
|
</div>
|
||||||
|
<button
|
||||||
|
class="action"
|
||||||
|
@click="abortAll"
|
||||||
|
aria-label="Abort upload"
|
||||||
|
title="Abort upload"
|
||||||
|
>
|
||||||
|
<i class="material-icons">{{ "cancel" }}</i>
|
||||||
|
</button>
|
||||||
<button
|
<button
|
||||||
class="action"
|
class="action"
|
||||||
@click="toggle"
|
@click="toggle"
|
||||||
@@ -42,7 +53,9 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapGetters } from "vuex";
|
import { mapGetters, mapMutations } from "vuex";
|
||||||
|
import { abortAllUploads } from "@/api/tus";
|
||||||
|
import buttons from "@/utils/buttons";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
name: "uploadFiles",
|
name: "uploadFiles",
|
||||||
@@ -52,12 +65,42 @@ export default {
|
|||||||
};
|
};
|
||||||
},
|
},
|
||||||
computed: {
|
computed: {
|
||||||
...mapGetters(["filesInUpload", "filesInUploadCount"]),
|
...mapGetters([
|
||||||
|
"filesInUpload",
|
||||||
|
"filesInUploadCount",
|
||||||
|
"uploadSpeed",
|
||||||
|
"eta",
|
||||||
|
]),
|
||||||
|
...mapMutations(["resetUpload"]),
|
||||||
|
formattedETA() {
|
||||||
|
if (!this.eta || this.eta === Infinity) {
|
||||||
|
return "--:--:--";
|
||||||
|
}
|
||||||
|
|
||||||
|
let totalSeconds = this.eta;
|
||||||
|
const hours = Math.floor(totalSeconds / 3600);
|
||||||
|
totalSeconds %= 3600;
|
||||||
|
const minutes = Math.floor(totalSeconds / 60);
|
||||||
|
const seconds = Math.round(totalSeconds % 60);
|
||||||
|
|
||||||
|
return `${hours.toString().padStart(2, "0")}:${minutes
|
||||||
|
.toString()
|
||||||
|
.padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
|
||||||
|
},
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
toggle: function () {
|
toggle: function () {
|
||||||
this.open = !this.open;
|
this.open = !this.open;
|
||||||
},
|
},
|
||||||
|
abortAll() {
|
||||||
|
if (confirm(this.$t("upload.abortUpload"))) {
|
||||||
|
abortAllUploads();
|
||||||
|
buttons.done("upload");
|
||||||
|
this.open = false;
|
||||||
|
this.$store.commit("resetUpload");
|
||||||
|
this.$store.commit("setReload", true);
|
||||||
|
}
|
||||||
|
},
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
</script>
|
</script>
|
||||||
|
|||||||
@@ -13,8 +13,11 @@ export default {
|
|||||||
data() {
|
data() {
|
||||||
let dataObj = {
|
let dataObj = {
|
||||||
locales: {
|
locales: {
|
||||||
|
he: "he",
|
||||||
|
hu: "hu",
|
||||||
ar: "ar",
|
ar: "ar",
|
||||||
de: "de",
|
de: "de",
|
||||||
|
el: "el",
|
||||||
en: "en",
|
en: "en",
|
||||||
es: "es",
|
es: "es",
|
||||||
fr: "fr",
|
fr: "fr",
|
||||||
|
|||||||
@@ -67,10 +67,10 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import Languages from "./Languages";
|
import Languages from "./Languages.vue";
|
||||||
import Rules from "./Rules";
|
import Rules from "./Rules.vue";
|
||||||
import Permissions from "./Permissions";
|
import Permissions from "./Permissions.vue";
|
||||||
import Commands from "./Commands";
|
import Commands from "./Commands.vue";
|
||||||
import { enableExec } from "@/utils/constants";
|
import { enableExec } from "@/utils/constants";
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
|
|||||||
@@ -2,18 +2,50 @@
|
|||||||
position: fixed;
|
position: fixed;
|
||||||
bottom: 0;
|
bottom: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
height: 25em;
|
|
||||||
max-height: calc(100% - 4em);
|
max-height: calc(100% - 4em);
|
||||||
background: white;
|
background: white;
|
||||||
color: #212121;
|
color: #212121;
|
||||||
z-index: 9999;
|
z-index: 9997;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
|
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
|
||||||
|
transition: .2s ease transform;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shell__divider {
|
||||||
|
position: relative;
|
||||||
|
height: 8px;
|
||||||
|
z-index: 9999;
|
||||||
|
background: rgba(127, 127, 127, 0.1);
|
||||||
|
transition: 0.2s ease background;
|
||||||
|
cursor: ns-resize;
|
||||||
|
touch-action: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shell__divider:hover {
|
||||||
|
background: rgba(127, 127, 127, 0.4);
|
||||||
|
}
|
||||||
|
|
||||||
|
.shell__content {
|
||||||
|
height: 100%;
|
||||||
font-family: monospace;
|
font-family: monospace;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
cursor: text;
|
cursor: text;
|
||||||
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
|
}
|
||||||
transition: .2s ease transform;
|
|
||||||
|
.shell__overlay {
|
||||||
|
position: fixed;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
top: 0px;
|
||||||
|
left: 0px;
|
||||||
|
z-index: 9998;
|
||||||
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
|
}
|
||||||
|
|
||||||
|
body.rtl .shell-content {
|
||||||
|
direction: ltr;
|
||||||
}
|
}
|
||||||
|
|
||||||
.shell__result {
|
.shell__result {
|
||||||
|
|||||||
@@ -5,6 +5,10 @@ body {
|
|||||||
color: #333333;
|
color: #333333;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl {
|
||||||
|
direction: rtl;
|
||||||
|
}
|
||||||
|
|
||||||
* {
|
* {
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
}
|
}
|
||||||
@@ -58,6 +62,11 @@ nav {
|
|||||||
left: 0;
|
left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl nav {
|
||||||
|
left: unset;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
nav .action {
|
nav .action {
|
||||||
width: 100%;
|
width: 100%;
|
||||||
display: block;
|
display: block;
|
||||||
@@ -69,6 +78,11 @@ nav .action {
|
|||||||
text-overflow: ellipsis;
|
text-overflow: ellipsis;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl .action {
|
||||||
|
direction: rtl;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
nav > div {
|
nav > div {
|
||||||
border-top: 1px solid rgba(0, 0, 0, 0.05);
|
border-top: 1px solid rgba(0, 0, 0, 0.05);
|
||||||
}
|
}
|
||||||
@@ -101,6 +115,10 @@ main {
|
|||||||
border-radius: 0.125em;
|
border-radius: 0.125em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl .breadcrumbs a {
|
||||||
|
transform: translateX(-16em);
|
||||||
|
}
|
||||||
|
|
||||||
.breadcrumbs a:hover {
|
.breadcrumbs a:hover {
|
||||||
background-color: rgba(0, 0, 0, 0.05);
|
background-color: rgba(0, 0, 0, 0.05);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,10 @@
|
|||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl .dashboard .row {
|
||||||
|
margin-right: 16em;
|
||||||
|
}
|
||||||
|
|
||||||
.dashboard .row .column {
|
.dashboard .row .column {
|
||||||
display: flex;
|
display: flex;
|
||||||
padding: 0 .5em;
|
padding: 0 .5em;
|
||||||
@@ -60,6 +64,10 @@ p code {
|
|||||||
border-bottom: 2px solid rgba(0, 0, 0, 0.05);
|
border-bottom: 2px solid rgba(0, 0, 0, 0.05);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl #nav .wrapper {
|
||||||
|
margin-right: 16em;
|
||||||
|
}
|
||||||
|
|
||||||
.dashboard #nav ul {
|
.dashboard #nav ul {
|
||||||
list-style: none;
|
list-style: none;
|
||||||
display: flex;
|
display: flex;
|
||||||
@@ -138,6 +146,13 @@ table tr>*:first-child {
|
|||||||
padding-left: 1em;
|
padding-left: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl table tr>* {
|
||||||
|
padding-left: unset;
|
||||||
|
padding-right: 1em;
|
||||||
|
text-align: right;
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
table tr>*:last-child {
|
table tr>*:last-child {
|
||||||
padding-right: 1em;
|
padding-right: 1em;
|
||||||
}
|
}
|
||||||
@@ -160,7 +175,6 @@ table tr>*:last-child {
|
|||||||
max-width: 25em;
|
max-width: 25em;
|
||||||
width: 90%;
|
width: 90%;
|
||||||
max-height: 95%;
|
max-height: 95%;
|
||||||
z-index: 99999;
|
|
||||||
animation: .1s show forwards;
|
animation: .1s show forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -181,6 +195,11 @@ table tr>*:last-child {
|
|||||||
margin-right: auto;
|
margin-right: auto;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl .card .card-title>*:first-child {
|
||||||
|
margin-right: 0;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
.card>div {
|
.card>div {
|
||||||
padding: 1em 1em;
|
padding: 1em 1em;
|
||||||
}
|
}
|
||||||
@@ -201,6 +220,10 @@ table tr>*:last-child {
|
|||||||
text-align: right;
|
text-align: right;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl .card .card-action {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
.card .card-content.full {
|
.card .card-content.full {
|
||||||
padding-bottom: 0;
|
padding-bottom: 0;
|
||||||
overflow: auto;
|
overflow: auto;
|
||||||
@@ -299,6 +322,8 @@ table tr>*:last-child {
|
|||||||
height: 100%;
|
height: 100%;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
z-index: 9999;
|
z-index: 9999;
|
||||||
|
visibility: hidden;
|
||||||
|
opacity: 0;
|
||||||
animation: .1s show forwards;
|
animation: .1s show forwards;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -360,15 +385,15 @@ table tr>*:last-child {
|
|||||||
|
|
||||||
@keyframes show {
|
@keyframes show {
|
||||||
0% {
|
0% {
|
||||||
display: none;
|
visibility: hidden;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
1% {
|
1% {
|
||||||
display: block;
|
visibility: visible;
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
}
|
}
|
||||||
100% {
|
100% {
|
||||||
display: block;
|
visibility: visible;
|
||||||
opacity: 1;
|
opacity: 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -461,4 +486,10 @@ table tr>*:last-child {
|
|||||||
.card .card-action.full .action .title {
|
.card .card-action.full .action .title {
|
||||||
font-size: 1.5em;
|
font-size: 1.5em;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** RTL - Fix disk usage information (in english) ***/
|
||||||
|
body.rtl .credits {
|
||||||
|
text-align: right;
|
||||||
|
direction: ltr;
|
||||||
}
|
}
|
||||||
@@ -1,173 +1,242 @@
|
|||||||
|
@import "material-icons/iconfont/filled.css";
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: local('Roboto'), local('Roboto-Regular'), url(../assets/fonts/roboto/normal-cyrillic-ext.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto"),
|
||||||
|
local("Roboto-Regular"),
|
||||||
|
url(../assets/fonts/roboto/normal-cyrillic-ext.woff2) format("woff2");
|
||||||
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: local('Roboto'), local('Roboto-Regular'), url(../assets/fonts/roboto/normal-cyrillic.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto"),
|
||||||
|
local("Roboto-Regular"),
|
||||||
|
url(../assets/fonts/roboto/normal-cyrillic.woff2) format("woff2");
|
||||||
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: local('Roboto'), local('Roboto-Regular'), url(../assets/fonts/roboto/normal-greek-ext.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto"),
|
||||||
|
local("Roboto-Regular"),
|
||||||
|
url(../assets/fonts/roboto/normal-greek-ext.woff2) format("woff2");
|
||||||
unicode-range: U+1F00-1FFF;
|
unicode-range: U+1F00-1FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: local('Roboto'), local('Roboto-Regular'), url(../assets/fonts/roboto/normal-greek.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto"),
|
||||||
|
local("Roboto-Regular"),
|
||||||
|
url(../assets/fonts/roboto/normal-greek.woff2) format("woff2");
|
||||||
unicode-range: U+0370-03FF;
|
unicode-range: U+0370-03FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: local('Roboto'), local('Roboto-Regular'), url(../assets/fonts/roboto/normal-vietnamese.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto"),
|
||||||
|
local("Roboto-Regular"),
|
||||||
|
url(../assets/fonts/roboto/normal-vietnamese.woff2) format("woff2");
|
||||||
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: local('Roboto'), local('Roboto-Regular'), url(../assets/fonts/roboto/normal-latin-ext.woff2) format('woff2');
|
src:
|
||||||
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
local("Roboto"),
|
||||||
|
local("Roboto-Regular"),
|
||||||
|
url(../assets/fonts/roboto/normal-latin-ext.woff2) format("woff2");
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F,
|
||||||
|
U+A720-A7FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 400;
|
font-weight: 400;
|
||||||
src: local('Roboto'), local('Roboto-Regular'), url(../assets/fonts/roboto/normal-latin.woff2) format('woff2');
|
src:
|
||||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
local("Roboto"),
|
||||||
|
local("Roboto-Regular"),
|
||||||
|
url(../assets/fonts/roboto/normal-latin.woff2) format("woff2");
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC,
|
||||||
|
U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
src: local('Roboto Medium'), local('Roboto-Medium'), url(../assets/fonts/roboto/medium-cyrillic-ext.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Medium"),
|
||||||
|
local("Roboto-Medium"),
|
||||||
|
url(../assets/fonts/roboto/medium-cyrillic-ext.woff2) format("woff2");
|
||||||
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
src: local('Roboto Medium'), local('Roboto-Medium'), url(../assets/fonts/roboto/medium-cyrillic.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Medium"),
|
||||||
|
local("Roboto-Medium"),
|
||||||
|
url(../assets/fonts/roboto/medium-cyrillic.woff2) format("woff2");
|
||||||
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
src: local('Roboto Medium'), local('Roboto-Medium'), url(../assets/fonts/roboto/medium-greek-ext.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Medium"),
|
||||||
|
local("Roboto-Medium"),
|
||||||
|
url(../assets/fonts/roboto/medium-greek-ext.woff2) format("woff2");
|
||||||
unicode-range: U+1F00-1FFF;
|
unicode-range: U+1F00-1FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
src: local('Roboto Medium'), local('Roboto-Medium'), url(../assets/fonts/roboto/medium-greek.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Medium"),
|
||||||
|
local("Roboto-Medium"),
|
||||||
|
url(../assets/fonts/roboto/medium-greek.woff2) format("woff2");
|
||||||
unicode-range: U+0370-03FF;
|
unicode-range: U+0370-03FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
src: local('Roboto Medium'), local('Roboto-Medium'), url(../assets/fonts/roboto/medium-vietnamese.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Medium"),
|
||||||
|
local("Roboto-Medium"),
|
||||||
|
url(../assets/fonts/roboto/medium-vietnamese.woff2) format("woff2");
|
||||||
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
src: local('Roboto Medium'), local('Roboto-Medium'), url(../assets/fonts/roboto/medium-latin-ext.woff2) format('woff2');
|
src:
|
||||||
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
local("Roboto Medium"),
|
||||||
|
local("Roboto-Medium"),
|
||||||
|
url(../assets/fonts/roboto/medium-latin-ext.woff2) format("woff2");
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F,
|
||||||
|
U+A720-A7FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 500;
|
font-weight: 500;
|
||||||
src: local('Roboto Medium'), local('Roboto-Medium'), url(../assets/fonts/roboto/medium-latin.woff2) format('woff2');
|
src:
|
||||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
local("Roboto Medium"),
|
||||||
|
local("Roboto-Medium"),
|
||||||
|
url(../assets/fonts/roboto/medium-latin.woff2) format("woff2");
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC,
|
||||||
|
U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: local('Roboto Bold'), local('Roboto-Bold'), url(../assets/fonts/roboto/bold-cyrillic-ext.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Bold"),
|
||||||
|
local("Roboto-Bold"),
|
||||||
|
url(../assets/fonts/roboto/bold-cyrillic-ext.woff2) format("woff2");
|
||||||
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
unicode-range: U+0460-052F, U+20B4, U+2DE0-2DFF, U+A640-A69F;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: local('Roboto Bold'), local('Roboto-Bold'), url(../assets/fonts/roboto/bold-cyrillic.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Bold"),
|
||||||
|
local("Roboto-Bold"),
|
||||||
|
url(../assets/fonts/roboto/bold-cyrillic.woff2) format("woff2");
|
||||||
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
unicode-range: U+0400-045F, U+0490-0491, U+04B0-04B1, U+2116;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: local('Roboto Bold'), local('Roboto-Bold'), url(../assets/fonts/roboto/bold-greek-ext.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Bold"),
|
||||||
|
local("Roboto-Bold"),
|
||||||
|
url(../assets/fonts/roboto/bold-greek-ext.woff2) format("woff2");
|
||||||
unicode-range: U+1F00-1FFF;
|
unicode-range: U+1F00-1FFF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: local('Roboto Bold'), local('Roboto-Bold'), url(../assets/fonts/roboto/bold-greek.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Bold"),
|
||||||
|
local("Roboto-Bold"),
|
||||||
|
url(../assets/fonts/roboto/bold-greek.woff2) format("woff2");
|
||||||
unicode-range: U+0370-03FF;
|
unicode-range: U+0370-03FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: local('Roboto Bold'), local('Roboto-Bold'), url(../assets/fonts/roboto/bold-vietnamese.woff2) format('woff2');
|
src:
|
||||||
|
local("Roboto Bold"),
|
||||||
|
local("Roboto-Bold"),
|
||||||
|
url(../assets/fonts/roboto/bold-vietnamese.woff2) format("woff2");
|
||||||
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
unicode-range: U+0102-0103, U+1EA0-1EF9, U+20AB;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: local('Roboto Bold'), local('Roboto-Bold'), url(../assets/fonts/roboto/bold-latin-ext.woff2) format('woff2');
|
src:
|
||||||
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F, U+A720-A7FF;
|
local("Roboto Bold"),
|
||||||
|
local("Roboto-Bold"),
|
||||||
|
url(../assets/fonts/roboto/bold-latin-ext.woff2) format("woff2");
|
||||||
|
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF, U+2C60-2C7F,
|
||||||
|
U+A720-A7FF;
|
||||||
}
|
}
|
||||||
|
|
||||||
@font-face {
|
@font-face {
|
||||||
font-family: 'Roboto';
|
font-family: "Roboto";
|
||||||
font-style: normal;
|
font-style: normal;
|
||||||
font-weight: 700;
|
font-weight: 700;
|
||||||
src: local('Roboto Bold'), local('Roboto-Bold'), url(../assets/fonts/roboto/bold-latin.woff2) format('woff2');
|
src:
|
||||||
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
local("Roboto Bold"),
|
||||||
|
local("Roboto-Bold"),
|
||||||
|
url(../assets/fonts/roboto/bold-latin.woff2) format("woff2");
|
||||||
|
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC,
|
||||||
|
U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
|
||||||
}
|
}
|
||||||
|
|
||||||
@import '~material-icons/iconfont/filled.css';
|
|
||||||
|
|
||||||
.material-icons {
|
.material-icons {
|
||||||
font-size: 1.5rem;
|
font-size: 1.5rem;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -135,10 +135,25 @@ header .menu-button {
|
|||||||
z-index: 1;
|
z-index: 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl #search #result {
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
|
||||||
#search #result>div>*:first-child {
|
#search #result>div>*:first-child {
|
||||||
margin-top: 0;
|
margin-top: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl #search #result {
|
||||||
|
direction: rtl;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*** RTL - Keep search result LTR because it has paths (in english) ***/
|
||||||
|
body.rtl #search #result ul>* {
|
||||||
|
direction: ltr;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
#search.active #result {
|
#search.active #result {
|
||||||
padding: .5em;
|
padding: .5em;
|
||||||
height: calc(100% - 4em);
|
height: calc(100% - 4em);
|
||||||
@@ -224,6 +239,10 @@ header .menu-button {
|
|||||||
padding: .5em;
|
padding: .5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl #search .boxes h3 {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
#search .boxes>div {
|
#search .boxes>div {
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-wrap: wrap;
|
flex-wrap: wrap;
|
||||||
|
|||||||
@@ -2,6 +2,10 @@
|
|||||||
--item-selected: white;
|
--item-selected: white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl #listing {
|
||||||
|
margin-right: 16em;
|
||||||
|
}
|
||||||
|
|
||||||
#listing h2 {
|
#listing h2 {
|
||||||
margin: 0 0 0 0.5em;
|
margin: 0 0 0 0.5em;
|
||||||
font-size: .9em;
|
font-size: .9em;
|
||||||
|
|||||||
@@ -40,6 +40,13 @@
|
|||||||
transform-origin: top right;
|
transform-origin: top right;
|
||||||
z-index: 99999;
|
z-index: 99999;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl #dropdown {
|
||||||
|
right: unset;
|
||||||
|
left: 1em;
|
||||||
|
transform-origin: top left;
|
||||||
|
}
|
||||||
|
|
||||||
#dropdown > div {
|
#dropdown > div {
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
@@ -95,9 +102,24 @@
|
|||||||
transition: .1s ease left;
|
transition: .1s ease left;
|
||||||
left: -17em;
|
left: -17em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl nav {
|
||||||
|
left: unset;
|
||||||
|
right: -17em;
|
||||||
|
}
|
||||||
nav.active {
|
nav.active {
|
||||||
left: 0;
|
left: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl nav.active {
|
||||||
|
left: unset;
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shell__divider {
|
||||||
|
height: 12px;
|
||||||
|
}
|
||||||
|
|
||||||
header .search-button,
|
header .search-button,
|
||||||
header .menu-button {
|
header .menu-button {
|
||||||
display: inherit;
|
display: inherit;
|
||||||
@@ -108,6 +130,23 @@
|
|||||||
#listing {
|
#listing {
|
||||||
margin-bottom: 5em;
|
margin-bottom: 5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body.rtl #listing {
|
||||||
|
margin-right: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.rtl .breadcrumbs {
|
||||||
|
transform: translateX(16em);
|
||||||
|
}
|
||||||
|
|
||||||
|
body.rtl #nav .wrapper {
|
||||||
|
margin-right: unset;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.rtl .dashboard .row {
|
||||||
|
margin-right: unset;
|
||||||
|
}
|
||||||
|
|
||||||
main {
|
main {
|
||||||
margin: 0 1em;
|
margin: 0 1em;
|
||||||
width: calc(100% - 2em);
|
width: calc(100% - 2em);
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
@import "~normalize.css/normalize.css";
|
@import "normalize.css/normalize.css";
|
||||||
@import "~noty/lib/noty.css";
|
@import "noty/lib/noty.css";
|
||||||
@import "~noty/lib/themes/mint.css";
|
@import "noty/lib/themes/mint.css";
|
||||||
@import "./_variables.css";
|
@import "./_variables.css";
|
||||||
@import "./_buttons.css";
|
@import "./_buttons.css";
|
||||||
@import "./_inputs.css";
|
@import "./_inputs.css";
|
||||||
@@ -14,6 +14,7 @@
|
|||||||
@import "./upload-files.css";
|
@import "./upload-files.css";
|
||||||
@import "./dashboard.css";
|
@import "./dashboard.css";
|
||||||
@import "./login.css";
|
@import "./login.css";
|
||||||
|
@import "./mobile.css";
|
||||||
|
|
||||||
.link {
|
.link {
|
||||||
color: var(--blue);
|
color: var(--blue);
|
||||||
@@ -27,9 +28,9 @@ main .spinner {
|
|||||||
}
|
}
|
||||||
|
|
||||||
main .spinner > div {
|
main .spinner > div {
|
||||||
width: .8em;
|
width: 0.8em;
|
||||||
height: .8em;
|
height: 0.8em;
|
||||||
margin: 0 .1em;
|
margin: 0 0.1em;
|
||||||
font-size: 1em;
|
font-size: 1em;
|
||||||
background-color: rgba(0, 0, 0, 0.3);
|
background-color: rgba(0, 0, 0, 0.3);
|
||||||
border-radius: 100%;
|
border-radius: 100%;
|
||||||
@@ -71,7 +72,7 @@ main .spinner .bounce2 {
|
|||||||
transition: 0.2s ease all;
|
transition: 0.2s ease all;
|
||||||
border: 0;
|
border: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
color: #546E7A;
|
color: #546e7a;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
background: transparent;
|
background: transparent;
|
||||||
padding: 0;
|
padding: 0;
|
||||||
@@ -88,12 +89,12 @@ main .spinner .bounce2 {
|
|||||||
|
|
||||||
.action i {
|
.action i {
|
||||||
padding: 0.4em;
|
padding: 0.4em;
|
||||||
transition: .1s ease-in-out all;
|
transition: 0.1s ease-in-out all;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
}
|
}
|
||||||
|
|
||||||
.action:hover {
|
.action:hover {
|
||||||
background-color: rgba(0, 0, 0, .1);
|
background-color: rgba(0, 0, 0, 0.1);
|
||||||
}
|
}
|
||||||
|
|
||||||
.action ul {
|
.action ul {
|
||||||
@@ -109,8 +110,8 @@ main .spinner .bounce2 {
|
|||||||
|
|
||||||
.action ul li {
|
.action ul li {
|
||||||
line-height: 1;
|
line-height: 1;
|
||||||
padding: .7em;
|
padding: 0.7em;
|
||||||
transition: .1s ease background-color;
|
transition: 0.1s ease background-color;
|
||||||
}
|
}
|
||||||
|
|
||||||
.action ul li:hover {
|
.action ul li:hover {
|
||||||
@@ -128,7 +129,7 @@ main .spinner .bounce2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#click-overlay.active {
|
#click-overlay.active {
|
||||||
display: block;
|
visibility: visible;
|
||||||
}
|
}
|
||||||
|
|
||||||
.action .counter {
|
.action .counter {
|
||||||
@@ -139,7 +140,7 @@ main .spinner .bounce2 {
|
|||||||
background: var(--blue);
|
background: var(--blue);
|
||||||
color: #fff;
|
color: #fff;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
font-size: .75em;
|
font-size: 0.75em;
|
||||||
width: 1.8em;
|
width: 1.8em;
|
||||||
height: 1.8em;
|
height: 1.8em;
|
||||||
text-align: center;
|
text-align: center;
|
||||||
@@ -148,12 +149,10 @@ main .spinner .bounce2 {
|
|||||||
border: 2px solid white;
|
border: 2px solid white;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* PREVIEWER */
|
/* PREVIEWER */
|
||||||
|
|
||||||
#previewer {
|
#previewer {
|
||||||
background-color: rgba(0, 0, 0, 0.9);
|
background-color: rgba(0, 0, 0, 0.99);
|
||||||
padding-top: 4em;
|
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: 0;
|
top: 0;
|
||||||
left: 0;
|
left: 0;
|
||||||
@@ -166,20 +165,30 @@ main .spinner .bounce2 {
|
|||||||
#previewer header {
|
#previewer header {
|
||||||
background: none;
|
background: none;
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
border-bottom: 0px;
|
||||||
|
box-shadow: 0px 0px 0px;
|
||||||
|
z-index: 19999;
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer header > .action i {
|
#previewer header > .action i {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
text-shadow: 1px 1px 1px #000000;
|
||||||
|
}
|
||||||
|
|
||||||
|
#previewer header > title {
|
||||||
|
white-space: nowrap;
|
||||||
|
text-shadow: 1px 1px 1px #000000;
|
||||||
}
|
}
|
||||||
|
|
||||||
@media (min-width: 738px) {
|
@media (min-width: 738px) {
|
||||||
#previewer header #dropdown .action i {
|
#previewer header #dropdown .action i {
|
||||||
color: #fff;
|
color: #fff;
|
||||||
|
text-shadow: 1px 1px 1px #000000;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer header .action:hover {
|
#previewer header .action:hover {
|
||||||
background-color: rgba(255, 255, 255, 0.3)
|
background-color: rgba(255, 255, 255, 0.3);
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer header .action span {
|
#previewer header .action span {
|
||||||
@@ -188,7 +197,7 @@ main .spinner .bounce2 {
|
|||||||
|
|
||||||
#previewer .preview {
|
#previewer .preview {
|
||||||
text-align: center;
|
text-align: center;
|
||||||
height: calc(100vh - 4em);
|
height: 100%;
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer .preview pre {
|
#previewer .preview pre {
|
||||||
@@ -203,6 +212,12 @@ main .spinner .bounce2 {
|
|||||||
margin: 0;
|
margin: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#previewer .preview audio {
|
||||||
|
width: 95%;
|
||||||
|
height: 88%;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
#previewer .preview video {
|
#previewer .preview video {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
}
|
}
|
||||||
@@ -220,14 +235,14 @@ main .spinner .bounce2 {
|
|||||||
}
|
}
|
||||||
#previewer .preview .info .title i {
|
#previewer .preview .info .title i {
|
||||||
display: block;
|
display: block;
|
||||||
margin-bottom: .1em;
|
margin-bottom: 0.1em;
|
||||||
font-size: 4em;
|
font-size: 4em;
|
||||||
}
|
}
|
||||||
#previewer .preview .info .button {
|
#previewer .preview .info .button {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
}
|
}
|
||||||
#previewer .preview .info .button:hover {
|
#previewer .preview .info .button:hover {
|
||||||
background-color: rgba(255, 255, 255, 0.2)
|
background-color: rgba(255, 255, 255, 0.2);
|
||||||
}
|
}
|
||||||
#previewer .preview .info .button i {
|
#previewer .preview .info .button i {
|
||||||
display: block;
|
display: block;
|
||||||
@@ -241,15 +256,15 @@ main .spinner .bounce2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
#previewer h2.message {
|
#previewer h2.message {
|
||||||
color: rgba(255, 255, 255, 0.5)
|
color: rgba(255, 255, 255, 0.5);
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer>button {
|
#previewer > button {
|
||||||
margin: 0;
|
margin: 0;
|
||||||
position: fixed;
|
position: fixed;
|
||||||
top: calc(50% + 1.85em);
|
top: 50%;
|
||||||
transform: translateY(-50%);
|
transform: translateY(-50%);
|
||||||
background-color: rgba(80, 80, 80, .5);
|
background-color: rgba(80, 80, 80, 0.5);
|
||||||
color: white;
|
color: white;
|
||||||
border-radius: 50%;
|
border-radius: 50%;
|
||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
@@ -259,20 +274,20 @@ main .spinner .bounce2 {
|
|||||||
transition: 0.2s ease all;
|
transition: 0.2s ease all;
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer>button.hidden {
|
#previewer > button.hidden {
|
||||||
opacity: 0;
|
opacity: 0;
|
||||||
visibility: hidden;
|
visibility: hidden;
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer>button>i {
|
#previewer > button > i {
|
||||||
padding: 0.4em;
|
padding: 0.4em;
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer>button:first-of-type {
|
#previewer > button:first-of-type {
|
||||||
left: 0.5em;
|
left: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
#previewer>button:last-of-type {
|
#previewer > button:last-of-type {
|
||||||
right: 0.5em;
|
right: 0.5em;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -315,8 +330,13 @@ main .spinner .bounce2 {
|
|||||||
padding: 0 1em;
|
padding: 0 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*** RTL - flip and position arrow of path ***/
|
||||||
|
body.rtl .breadcrumbs .chevron {
|
||||||
|
transform: scaleX(-1) translateX(16em);
|
||||||
|
}
|
||||||
|
|
||||||
#editor-container .breadcrumbs span {
|
#editor-container .breadcrumbs span {
|
||||||
font-size: .75rem;
|
font-size: 0.75rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
#editor-container .breadcrumbs i {
|
#editor-container .breadcrumbs i {
|
||||||
@@ -334,7 +354,7 @@ main .spinner .bounce2 {
|
|||||||
|
|
||||||
.noty_buttons button {
|
.noty_buttons button {
|
||||||
background: rgba(0, 0, 0, 0.05);
|
background: rgba(0, 0, 0, 0.05);
|
||||||
border: 1px solid rgba(0,0,0,0.1);
|
border: 1px solid rgba(0, 0, 0, 0.1);
|
||||||
box-shadow: 0 0 0 0;
|
box-shadow: 0 0 0 0;
|
||||||
font-size: 1rem;
|
font-size: 1rem;
|
||||||
}
|
}
|
||||||
@@ -351,7 +371,7 @@ main .spinner .bounce2 {
|
|||||||
|
|
||||||
.credits > span {
|
.credits > span {
|
||||||
display: block;
|
display: block;
|
||||||
margin: .3em 0;
|
margin: 0.3em 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.credits a,
|
.credits a,
|
||||||
@@ -360,7 +380,6 @@ main .spinner .bounce2 {
|
|||||||
cursor: pointer;
|
cursor: pointer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * *
|
||||||
* ANIMATIONS *
|
* ANIMATIONS *
|
||||||
* * * * * * * * * * * * * * * */
|
* * * * * * * * * * * * * * * */
|
||||||
@@ -371,6 +390,16 @@ main .spinner .bounce2 {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* * * * * * * * * * * * * * * *
|
||||||
|
* SETTINGS TUS *
|
||||||
|
* * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
.tusConditionalSettings input:disabled {
|
||||||
|
background-color: #ddd;
|
||||||
|
color: #999;
|
||||||
|
cursor: not-allowed;
|
||||||
|
}
|
||||||
|
|
||||||
/* * * * * * * * * * * * * * * *
|
/* * * * * * * * * * * * * * * *
|
||||||
* SETTINGS RULES *
|
* SETTINGS RULES *
|
||||||
* * * * * * * * * * * * * * * */
|
* * * * * * * * * * * * * * * */
|
||||||
@@ -378,20 +407,20 @@ main .spinner .bounce2 {
|
|||||||
.rules > div {
|
.rules > div {
|
||||||
display: flex;
|
display: flex;
|
||||||
align-items: center;
|
align-items: center;
|
||||||
margin: .5rem 0;
|
margin: 0.5rem 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rules input[type="checkbox"] {
|
.rules input[type="checkbox"] {
|
||||||
margin-right: .2rem;
|
margin-right: 0.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rules input[type="text"] {
|
.rules input[type="text"] {
|
||||||
border: 1px solid#ddd;
|
border: 1px solid#ddd;
|
||||||
padding: .2rem;
|
padding: 0.2rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rules label {
|
.rules label {
|
||||||
margin-right: .5rem;
|
margin-right: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
.rules button {
|
.rules button {
|
||||||
@@ -399,8 +428,25 @@ main .spinner .bounce2 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.rules button.delete {
|
.rules button.delete {
|
||||||
padding: .2rem .5rem;
|
padding: 0.2rem 0.5rem;
|
||||||
margin-left: .5rem;
|
margin-left: 0.5rem;
|
||||||
}
|
}
|
||||||
|
|
||||||
@import './mobile.css';
|
/* * * * * * * * * * * * * * * *
|
||||||
|
* RTL overrides *
|
||||||
|
* * * * * * * * * * * * * * * */
|
||||||
|
|
||||||
|
body.rtl .card-content textarea {
|
||||||
|
direction: ltr;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.rtl .card-content .small + input {
|
||||||
|
direction: ltr;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
body.rtl .card.floating .card-content .file-list {
|
||||||
|
direction: ltr;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,10 +5,13 @@
|
|||||||
"copy": "نسخ",
|
"copy": "نسخ",
|
||||||
"copyFile": "نسخ الملف",
|
"copyFile": "نسخ الملف",
|
||||||
"copyToClipboard": "نسخ الى الحافظة",
|
"copyToClipboard": "نسخ الى الحافظة",
|
||||||
|
"copyDownloadLinkToClipboard": "نسخ رابط التحميل الى الحافظة",
|
||||||
"create": "إنشاء",
|
"create": "إنشاء",
|
||||||
"delete": "حذف",
|
"delete": "حذف",
|
||||||
"download": "تحميل",
|
"download": "تحميل",
|
||||||
"hideDotfiles": "",
|
"file": "ملف",
|
||||||
|
"folder": "مجلد",
|
||||||
|
"hideDotfiles": "إخفاء ملفات النقطة",
|
||||||
"info": "معلومات",
|
"info": "معلومات",
|
||||||
"more": "المزيد",
|
"more": "المزيد",
|
||||||
"move": "نقل",
|
"move": "نقل",
|
||||||
@@ -16,7 +19,7 @@
|
|||||||
"new": "جديد",
|
"new": "جديد",
|
||||||
"next": "التالي",
|
"next": "التالي",
|
||||||
"ok": "موافق",
|
"ok": "موافق",
|
||||||
"permalink": "الحصول على لنك دائم",
|
"permalink": "الحصول على رابط دائم",
|
||||||
"previous": "السابق",
|
"previous": "السابق",
|
||||||
"publish": "نشر",
|
"publish": "نشر",
|
||||||
"rename": "إعادة تسمية",
|
"rename": "إعادة تسمية",
|
||||||
@@ -28,21 +31,28 @@
|
|||||||
"select": "تحديد",
|
"select": "تحديد",
|
||||||
"selectMultiple": "تحديد متعدد",
|
"selectMultiple": "تحديد متعدد",
|
||||||
"share": "مشاركة",
|
"share": "مشاركة",
|
||||||
"shell": "Toggle shell",
|
"shell": "تفعيل/إغلاق واجهة اﻷوامر (shell)",
|
||||||
|
"submit": "تسليم",
|
||||||
"switchView": "تغيير العرض",
|
"switchView": "تغيير العرض",
|
||||||
"toggleSidebar": "تبديل الشريط الجانبي",
|
"toggleSidebar": "تبديل الشريط الجانبي",
|
||||||
"update": "تحديث",
|
"update": "تحديث",
|
||||||
"upload": "رفع"
|
"upload": "رفع",
|
||||||
|
"openFile": "فتح الملف",
|
||||||
|
"continue": "متابعة"
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"downloadFile": "Download File",
|
"downloadFile": "تحميل الملف",
|
||||||
"downloadFolder": "Download Folder",
|
"downloadFolder": "تحميل المجلد",
|
||||||
"downloadSelected": ""
|
"downloadSelected": "تحميل الملفات المحددة"
|
||||||
|
},
|
||||||
|
"upload": {
|
||||||
|
"abortUpload": "هل تريد بالتاكيد إلغاء الرفع؟"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"forbidden": "You don't have permissions to access this.",
|
"forbidden": "ليست لديك الصلاحيات للوصول لهذا المحتوى.",
|
||||||
"internal": "لقد حدث خطأ ما.",
|
"internal": "لقد حدث خطأ ما.",
|
||||||
"notFound": "لا يمكن الوصول لهذا المحتوى."
|
"notFound": "لا يمكن الوصول لهذا المحتوى.",
|
||||||
|
"connection": "لا يمكن اﻹتصال بالخادم."
|
||||||
},
|
},
|
||||||
"files": {
|
"files": {
|
||||||
"body": "الصفحة",
|
"body": "الصفحة",
|
||||||
@@ -50,17 +60,18 @@
|
|||||||
"closePreview": "إغلاق العرض",
|
"closePreview": "إغلاق العرض",
|
||||||
"files": "الملفات",
|
"files": "الملفات",
|
||||||
"folders": "المجلدات",
|
"folders": "المجلدات",
|
||||||
"home": "الصفحة الاولى",
|
"home": "الصفحة الرئيسية",
|
||||||
"lastModified": "آخر تعديل",
|
"lastModified": "آخر تعديل",
|
||||||
"loading": "جاري التحميل...",
|
"loading": "جاري التحميل...",
|
||||||
"lonely": "تبدو وحيدا هنا...",
|
"lonely": "تبدو وحيدا هنا...",
|
||||||
"metadata": "بيانات تعريفية",
|
"metadata": "بيانات وصفية",
|
||||||
"multipleSelectionEnabled": "التحديد المتعدد مفعل",
|
"multipleSelectionEnabled": "التحديد المتعدد مفعل",
|
||||||
"name": "الإسم",
|
"name": "اﻹسم",
|
||||||
"size": "الحجم",
|
"size": "الحجم",
|
||||||
"sortByLastModified": "الترتيب بآخر تعديل",
|
"sortByLastModified": "الترتيب بآخر تعديل",
|
||||||
"sortByName": "الترتيب بالإسم",
|
"sortByName": "الترتيب باﻹسم",
|
||||||
"sortBySize": "الترتيب بالحجم"
|
"sortBySize": "الترتيب بالحجم",
|
||||||
|
"noPreview": "لا يوجد عرض مسبق لهذا الملف."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"click": "حدد الملف أو المجلد",
|
"click": "حدد الملف أو المجلد",
|
||||||
@@ -71,55 +82,59 @@
|
|||||||
},
|
},
|
||||||
"del": "حذف البيانات المحددة",
|
"del": "حذف البيانات المحددة",
|
||||||
"doubleClick": "فتح المجلد او الملف",
|
"doubleClick": "فتح المجلد او الملف",
|
||||||
"esc": "مسح التحديد وإغلاق النافذة المنبثقة",
|
"esc": "مسح التحديد و إغلاق النافذة المنبثقة",
|
||||||
"f1": "هذه المعلومات",
|
"f1": "هذه المعلومات",
|
||||||
"f2": "إعادة تسمية الملف",
|
"f2": "إعادة تسمية الملف",
|
||||||
"help": "مساعدة"
|
"help": "مساعدة"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
|
"el": "Ελληνικά",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
"es": "Español",
|
"es": "Español",
|
||||||
"fr": "Français",
|
"fr": "Français",
|
||||||
"is": "",
|
"is": "Icelandic",
|
||||||
"it": "Italiano",
|
"it": "Italiano",
|
||||||
"ja": "日本語",
|
"ja": "日本語",
|
||||||
"ko": "한국어",
|
"ko": "한국어",
|
||||||
"nlBE": "",
|
"nlBE": "Dutch (Belgium)",
|
||||||
"pl": "Polski",
|
"pl": "Polski",
|
||||||
"pt": "Português",
|
"pt": "Português",
|
||||||
"ptBR": "Português (Brasil)",
|
"ptBR": "Português (Brasil)",
|
||||||
"ro": "",
|
"ro": "Romanian",
|
||||||
"ru": "Русский",
|
"ru": "Русский",
|
||||||
"sk": "Slovenčina",
|
"sk": "Slovenčina",
|
||||||
"svSE": "",
|
"svSE": "Swedish (Sweden)",
|
||||||
"tr" : "Türkçe",
|
"tr": "Türkçe",
|
||||||
"ua": "Українська",
|
"ua": "Українська",
|
||||||
"zhCN": "中文 (简体)",
|
"zhCN": "中文 (简体)",
|
||||||
"zhTW": "中文 (繁體)"
|
"zhTW": "中文 (繁體)"
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"createAnAccount": "Create an account",
|
"createAnAccount": "إنشاء حساب جديد",
|
||||||
"loginInstead": "Already have an account",
|
"loginInstead": "هل لديك حساب",
|
||||||
"password": "كلمة المرور",
|
"password": "كلمة المرور",
|
||||||
"passwordConfirm": "Password Confirmation",
|
"passwordConfirm": "تأكيد كلمة المرور",
|
||||||
"passwordsDontMatch": "Passwords don't match",
|
"passwordsDontMatch": "كلمة المرور غير متطابقة",
|
||||||
"signup": "Signup",
|
"signup": "إشترك",
|
||||||
"submit": "تسجيل دخول",
|
"submit": "تسجيل دخول",
|
||||||
"username": "إسم المستخدم",
|
"username": "إسم المستخدم",
|
||||||
"usernameTaken": "Username already taken",
|
"usernameTaken": "إسم المستخدم غير متاح",
|
||||||
"wrongCredentials": "بيانات دخول خاطئة"
|
"wrongCredentials": "بيانات دخول خاطئة"
|
||||||
},
|
},
|
||||||
"permanent": "دائم",
|
"permanent": "دائم",
|
||||||
"prompts": {
|
"prompts": {
|
||||||
"copy": "نسخ",
|
"copy": "نسخ",
|
||||||
"copyMessage": "رجاء حدد المكان لنسخ ملفاتك فيه:",
|
"copyMessage": "حدد المكان لنسخ ملفاتك فيه:",
|
||||||
"currentlyNavigating": "يتم الإنتقال حاليا إلى:",
|
"currentlyNavigating": "يتم اﻹنتقال حاليا إلى:",
|
||||||
"deleteMessageMultiple": "هل تريد بالتأكيد حذف {count} ملف؟",
|
"deleteMessageMultiple": "هل تريد بالتأكيد حذف {count} ملف؟",
|
||||||
"deleteMessageSingle": "هل تريد بالتأكيد حذف هذا الملف/المجلد؟",
|
"deleteMessageSingle": "هل تريد بالتأكيد حذف هذا الملف/المجلد؟",
|
||||||
|
"deleteMessageShare": "هل تريد بالتأكيد إلغاء مشاركة هذا الملف/المجلد ({path})؟",
|
||||||
"deleteTitle": "حذف الملفات",
|
"deleteTitle": "حذف الملفات",
|
||||||
"displayName": "الإسم:",
|
"displayName": "عرض اﻹسم:",
|
||||||
"download": "تحميل الملفات",
|
"download": "تحميل الملفات",
|
||||||
"downloadMessage": "حدد إمتداد الملف المراد تحميله.",
|
"downloadMessage": "حدد إمتداد الملف المراد تحميله.",
|
||||||
"error": "لقد حدث خطأ ما",
|
"error": "لقد حدث خطأ ما",
|
||||||
@@ -128,80 +143,90 @@
|
|||||||
"lastModified": "آخر تعديل",
|
"lastModified": "آخر تعديل",
|
||||||
"move": "نقل",
|
"move": "نقل",
|
||||||
"moveMessage": "إختر مكان جديد للملفات أو المجلدات المراد نقلها:",
|
"moveMessage": "إختر مكان جديد للملفات أو المجلدات المراد نقلها:",
|
||||||
"newArchetype": "إنشاء منشور من المنشور الأصلي. الملف سيتم انشاءه في مجلد المحتويات.",
|
"newArchetype": "إنشاء منشور من المنشور اﻷصلي. الملف سيتم انشاءه في مجلد المحتويات.",
|
||||||
"newDir": "مجلد جديد",
|
"newDir": "مجلد جديد",
|
||||||
"newDirMessage": "رجاء أدخل اسم المجلد الجديد.",
|
"newDirMessage": "أدخل اسم المجلد الجديد.",
|
||||||
"newFile": "ملف جديد",
|
"newFile": "ملف جديد",
|
||||||
"newFileMessage": "رجاء ادخل اسم الملف الجديد.",
|
"newFileMessage": "ادخل اسم الملف الجديد.",
|
||||||
"numberDirs": "عدد المجلدات",
|
"numberDirs": "عدد المجلدات",
|
||||||
"numberFiles": "عدد الملفات",
|
"numberFiles": "عدد الملفات",
|
||||||
"rename": "إعادة تسمية",
|
"rename": "إعادة تسمية",
|
||||||
"renameMessage": "إدراج اسم جديد لـ",
|
"renameMessage": "إدراج اسم جديد لـ",
|
||||||
"replace": "إستبدال",
|
"replace": "إستبدال",
|
||||||
"replaceMessage": "أحد الملفات التي تحاول رفعها يتعارض مع ملف موجود بنفس الإسم. هل تريد إستبدال الملف الموجود؟\n",
|
"replaceMessage": "أحد الملفات التي تحاول رفعها يتعارض مع ملف موجود بنفس اﻹسم. هل المتابعة مع تخطي هذا الملف ام تريد إستبدال الملف الموجود؟\n",
|
||||||
"schedule": "جدولة",
|
"schedule": "جدولة",
|
||||||
"scheduleMessage": "أختر الوقت والتاريخ لجدولة نشر هذا المقال.",
|
"scheduleMessage": "أختر الوقت و التاريخ لجدولة نشر هذا المقال.",
|
||||||
"show": "عرض",
|
"show": "عرض",
|
||||||
"size": "الحجم",
|
"size": "الحجم",
|
||||||
"upload": "",
|
"upload": "رفع",
|
||||||
"uploadMessage": ""
|
"uploadFiles": "يتم رفع {files} ملفات.",
|
||||||
|
"uploadMessage": "إختر الملفات التي تريد رفعها.",
|
||||||
|
"optionalPassword": "كلمة مرور إختيارية"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"images": "الصور",
|
"images": "الصور",
|
||||||
"music": "الموسيقى",
|
"music": "الموسيقى",
|
||||||
"pdf": "PDF",
|
"pdf": "PDF",
|
||||||
"pressToSearch": "Press enter to search...",
|
"pressToSearch": "أضغط زر اﻹدخال للبحث...",
|
||||||
"search": "البحث...",
|
"search": "البحث...",
|
||||||
"typeToSearch": "Type to search...",
|
"typeToSearch": "اكتب للبحث...",
|
||||||
"types": "الأنواع",
|
"types": "اﻷنواع",
|
||||||
"video": "فيديوهات"
|
"video": "فيديوهات"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"admin": "Admin",
|
"admin": "إدارة",
|
||||||
"administrator": "Administrator",
|
"administrator": "مدير",
|
||||||
"allowCommands": "تنفيذ الأوامر",
|
"allowCommands": "تنفيذ اﻷوامر",
|
||||||
"allowEdit": "تعديل، إعادة تسمية وحذف الملفات والمجلدات",
|
"allowEdit": "تعديل، إعادة تسمية و حذف الملفات و المجلدات",
|
||||||
"allowNew": "إنشاء ملفات ومجلدات جديدة",
|
"allowNew": "إنشاء ملفات و مجلدات جديدة",
|
||||||
"allowPublish": "نشر مقالات وصفحات جديدة",
|
"allowPublish": "نشر مقالات و صفحات جديدة",
|
||||||
"allowSignup": "Allow users to signup",
|
"allowSignup": "اسمح للمستخدمين بالاشتراك",
|
||||||
"avoidChanges": "(أتركه فارغاً إن لم ترد تغييره)",
|
"avoidChanges": "(أتركه فارغاً إن لم ترد تغييره)",
|
||||||
"branding": "Branding",
|
"branding": "الشعار",
|
||||||
"brandingDirectoryPath": "Branding directory path",
|
"brandingDirectoryPath": "مسار مجلد الشعار",
|
||||||
"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}.",
|
"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": "هنا بإمكانك تعيين اﻷوامر التي سيتم تنفيذها في اﻷحداث المسماة. يجب كتابة أمر واحد في كل سطر. ستكون المتغيرات البيئية (env) {0} و {1} متاحة، حيث {0} نسبي لـ {1}. لمزيد من المعلومات حول هذه الميزة و المتغيرات البيئية المتاحة، يرجى قراءة {2}.",
|
||||||
"commandsUpdated": "تم تحديث الأوامر",
|
"commandsUpdated": "تم تحديث اﻷوامر",
|
||||||
"createUserDir": "Auto create user home dir while adding new user",
|
"createUserDir": "إنشاء مجلد المستخدم (home) تلقائياً عند إنشاء مستخدم جديد",
|
||||||
|
"tusUploads": "التحميلات المتقطعة",
|
||||||
|
"tusUploadsHelp": "يدعم متصفح الملفات تحميل الملفات المتقطعة، مما يسمح بتحميلات الملفات بشكل فعال و موثوق و قابلة للمتابغة و متقطعة حتى على الشبكات غير الموثوقة.",
|
||||||
|
"tusUploadsChunkSize": "يشير إلى الحد اﻷقصى لحجم الطلب (سيتم استخدام التحميل المباشر للتحميلات صغيرة الخحم). يمكنك إدخال عدد صحيح عادي يدل على الحجم بوحدة البايت أو نمظ مثل10MB, 1GB, إلخ.",
|
||||||
|
"tusUploadsRetryCount": "عدد مرات إعادة المحاولة إذا فشلت عملية تحميل القطعة.",
|
||||||
|
"userHomeBasePath": "المسار الرئيسي لمجلد المستخدم (home)",
|
||||||
|
"userScopeGenerationPlaceholder": "سيتم تعيين نطاق المستخدم تلقائياً",
|
||||||
|
"createUserHomeDirectory": "إنشاء مجلد المستخدم (home)",
|
||||||
"customStylesheet": "ستايل مخصص",
|
"customStylesheet": "ستايل مخصص",
|
||||||
"defaultUserDescription": "This are the default settings for new users.",
|
"defaultUserDescription": "هذه اﻹعدادات اﻹفتراضية للمستخدمين الجدد.",
|
||||||
"disableExternalLinks": "Disable external links (except documentation)",
|
"disableExternalLinks": "تعطيل الروابط الخارجية (بإسثناء الوثائق)",
|
||||||
"documentation": "documentation",
|
"disableUsedDiskPercentage": "تعطيل الرسم البياني لنسبة القرص المستخدم",
|
||||||
|
"documentation": "التوثيق",
|
||||||
"examples": "أمثلة",
|
"examples": "أمثلة",
|
||||||
"executeOnShell": "Execute on shell",
|
"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.",
|
"executeOnShellDescription": "يقوم متصفح الملفات بتنفيذ اﻷوامر عن طريق استدعاء البرامج المنفذة مباشرة. إذا كنت تريد تشغيلها عن ظريق واجهة اﻷوامر (shell) مثل Bash أو PowerShell، يمكنك تعريفها هنا مع الوسائظ (arguments) المطلوبة. إذا تم تعيينها، سيتم إضافة اﻷمر الذي تقوم بتنفيذه كوسيط. ينطبق هذا على كل من أوامر المستخدم روابظ الحدث (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.",
|
"globalRules": "هذه مجموعة من القواعد العامة للسماح و المنع. تطبق على كل المستخدمين. يمكنك تحديد قواعد محددة لكل مستخدم لتجاوز القواعد الغامة.",
|
||||||
"globalSettings": "إعدادات عامة",
|
"globalSettings": "إعدادات عامة",
|
||||||
"hideDotfiles": "",
|
"hideDotfiles": "إخفاء ملفات النقطة",
|
||||||
"insertPath": "Insert the path",
|
"insertPath": "ادخل المسار",
|
||||||
"insertRegex": "Insert regex expression",
|
"insertRegex": "ادخل تعبيراً منطقياً (regex)",
|
||||||
"instanceName": "Instance name",
|
"instanceName": "اسم النسخة",
|
||||||
"language": "اللغة",
|
"language": "اللغة",
|
||||||
"lockPassword": "منع المستخدم من تغيير كلمة المرور",
|
"lockPassword": "منع المستخدم من تغيير كلمة المرور",
|
||||||
"newPassword": "كلمة المرور الجديدة",
|
"newPassword": "كلمة المرور الجديدة",
|
||||||
"newPasswordConfirm": "تأكيد كلمة المرور",
|
"newPasswordConfirm": "تأكيد كلمة المرور",
|
||||||
"newUser": "مستخدم جديد",
|
"newUser": "مستخدم جديد",
|
||||||
"password": "كلمة المرور",
|
"password": "كلمة المرور",
|
||||||
"passwordUpdated": "تم تغيير كلمة المرور",
|
"passwordUpdated": "تم تغيير كلمة المرور!",
|
||||||
"path": "",
|
"path": "المسار",
|
||||||
"perm": {
|
"perm": {
|
||||||
"create": "Create files and directories",
|
"create": "إنشاء ملفات و مجلدات جديدة",
|
||||||
"delete": "Delete files and directories",
|
"delete": "حذف ملفات و مجلدات",
|
||||||
"download": "Download",
|
"download": "تحميل",
|
||||||
"execute": "Execute commands",
|
"execute": "تنفيذ اﻷوامر",
|
||||||
"modify": "Edit files",
|
"modify": "تعديل محتويات الملفات",
|
||||||
"rename": "Rename or move files and directories",
|
"rename": "إعادة تسمية او نقل ملفات و مجلدات",
|
||||||
"share": "Share files"
|
"share": "مشاركة ملفات"
|
||||||
},
|
},
|
||||||
"permissions": "الصلاحيات",
|
"permissions": "الصلاحيات",
|
||||||
"permissionsHelp": "يمكنك تعيين المستخدم كـ \"مدير\" أو تحديد الصلاحيات بشكل منفرد.\n إذا قمت بتحديد المستخدم كـ \"مدير\"، باقي الخيارات سيتم تحديدها تلقائياً.\n إدارة المستخدمين تبقى صلاحية فريدة للـ \"مدير\" فقط.\n",
|
"permissionsHelp": "يمكنك تعيين المستخدم كـ \"مدير\" أو تحديد الصلاحيات بشكل منفرد.\n إذا قمت بتحديد المستخدم كـ \"مدير\"، باقي الخيارات سيتم تحديدها تلقائياً.\n إدارة المستخدمين تبقى صلاحية فريدة للـ \"مدير\" فقط.\n",
|
||||||
@@ -209,22 +234,24 @@
|
|||||||
"ruleExample1": "منع الوصول إلى الملفات التي تبدأ بنقطة مثل (.git، و .gitignore) في كل مجلد.\n",
|
"ruleExample1": "منع الوصول إلى الملفات التي تبدأ بنقطة مثل (.git، و .gitignore) في كل مجلد.\n",
|
||||||
"ruleExample2": "منع الوصول إلى الملف المسمى Caddyfile في نطاق الجذر.",
|
"ruleExample2": "منع الوصول إلى الملف المسمى Caddyfile في نطاق الجذر.",
|
||||||
"rules": "المجموعات",
|
"rules": "المجموعات",
|
||||||
"rulesHelp": "يمكنك هنا تحديد مجموعة من شروط السماح والمنع لهذا المستخدم. الملفات الممنوعة لن تظهر ضمن القائمة لهذا المستخدم ولن يستطيع الوصول لها. هنا ندعم الـ regex والـ relative path لنطاق المستخدمين.\n",
|
"rulesHelp": "يمكنك هنا تحديد مجموعة من شروط السماح و المنع لهذا المستخدم. الملفات الممنوعة لن تظهر ضمن القائمة لهذا المستخدم و لن يستطيع الوصول لها. هنا ندعم الـ regex و الـ relative path لنطاق المستخدمين.\n",
|
||||||
"scope": "نطاق",
|
"scope": "نطاق",
|
||||||
"settingsUpdated": "تم تعديل الإعدادات",
|
"setDateFormat": "حدد تنسيق التاريخ",
|
||||||
"shareDuration": "",
|
"settingsUpdated": "تم تعديل اﻹعدادات",
|
||||||
"shareManagement": "",
|
"shareDuration": "مدة المشاركة",
|
||||||
"singleClick": "",
|
"shareManagement": "إدارة المشاركات",
|
||||||
|
"shareDeleted": "تم حذف المشاركة!",
|
||||||
|
"singleClick": "استخدم النقرة الواحدة لفتح الملفات",
|
||||||
"themes": {
|
"themes": {
|
||||||
"dark": "",
|
"dark": "غامق",
|
||||||
"light": "",
|
"light": "فاتح",
|
||||||
"title": ""
|
"title": "موضوع"
|
||||||
},
|
},
|
||||||
"user": "المستخدم",
|
"user": "المستخدم",
|
||||||
"userCommands": "الأوامر",
|
"userCommands": "اﻷوامر",
|
||||||
"userCommandsHelp": "الأوامر المتاحة لهذا المستخدم مفصولة فيما بينها بمسافة. مثال:\n",
|
"userCommandsHelp": "اﻷوامر المتاحة لهذا المستخدم مفصولة فيما بينها بمسافة. مثال:\n",
|
||||||
"userCreated": "تم إنشاء المستخدم",
|
"userCreated": "تم إنشاء المستخدم",
|
||||||
"userDefaults": "User default settings",
|
"userDefaults": "إعدادات المستخدم اﻹفتراضية",
|
||||||
"userDeleted": "تم حذف المستخدم",
|
"userDeleted": "تم حذف المستخدم",
|
||||||
"userManagement": "إدارة المستخدمين",
|
"userManagement": "إدارة المستخدمين",
|
||||||
"userUpdated": "تم تعديل المستخدم",
|
"userUpdated": "تم تعديل المستخدم",
|
||||||
@@ -234,14 +261,14 @@
|
|||||||
"sidebar": {
|
"sidebar": {
|
||||||
"help": "مساعدة",
|
"help": "مساعدة",
|
||||||
"hugoNew": "هيوجو جديد",
|
"hugoNew": "هيوجو جديد",
|
||||||
"login": "Login",
|
"login": "تسجيل دخول",
|
||||||
"logout": "تسجيل خروج",
|
"logout": "تسجيل خروج",
|
||||||
"myFiles": "ملفاتي",
|
"myFiles": "ملفاتي",
|
||||||
"newFile": "ملف جديد",
|
"newFile": "ملف جديد",
|
||||||
"newFolder": "مجلد جديد",
|
"newFolder": "مجلد جديد",
|
||||||
"preview": "معاينة",
|
"preview": "عرض مسبق",
|
||||||
"settings": "الإعدادات",
|
"settings": "اﻹعدادات",
|
||||||
"signup": "Signup",
|
"signup": "إشتراك",
|
||||||
"siteSettings": "إعدادات الموقع"
|
"siteSettings": "إعدادات الموقع"
|
||||||
},
|
},
|
||||||
"success": {
|
"success": {
|
||||||
@@ -255,3 +282,4 @@
|
|||||||
"unit": "وحدة الوقت"
|
"unit": "وحدة الوقت"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -36,7 +36,8 @@
|
|||||||
"toggleSidebar": "Seitenleiste anzeigen",
|
"toggleSidebar": "Seitenleiste anzeigen",
|
||||||
"update": "Update",
|
"update": "Update",
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"openFile": "Datei öffnen"
|
"openFile": "Datei öffnen",
|
||||||
|
"continue": "Fortfahren"
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"downloadFile": "Download Datei",
|
"downloadFile": "Download Datei",
|
||||||
@@ -83,6 +84,8 @@
|
|||||||
"help": "Hilfe"
|
"help": "Hilfe"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -145,7 +148,7 @@
|
|||||||
"rename": "Umbenennen",
|
"rename": "Umbenennen",
|
||||||
"renameMessage": "Fügen Sie einen Namen ein für",
|
"renameMessage": "Fügen Sie einen Namen ein für",
|
||||||
"replace": "Ersetzen",
|
"replace": "Ersetzen",
|
||||||
"replaceMessage": "Eine der Datei mit dem gleichen Namen, wie die Sie hochladen wollen, existiert bereits. Soll die vorhandene Datei ersetzt werden ?\n",
|
"replaceMessage": "Eine der Datei mit dem gleichen Namen, wie die Sie hochladen wollen, existiert bereits. Soll die vorhandene Datei übersprungen oder 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.",
|
||||||
"show": "Anzeigen",
|
"show": "Anzeigen",
|
||||||
@@ -182,9 +185,14 @@
|
|||||||
"commandRunnerHelp": "Hier könne Sie Befehle eintragen, welche bei den benannten Aktionen ausgeführt werden. Sie müssen pro Zeile jeweils einen Befehl 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 die {2}.",
|
"commandRunnerHelp": "Hier könne Sie Befehle eintragen, welche bei den benannten Aktionen ausgeführt werden. Sie müssen pro Zeile jeweils einen Befehl 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 die {2}.",
|
||||||
"commandsUpdated": "Befehle aktualisiert!",
|
"commandsUpdated": "Befehle aktualisiert!",
|
||||||
"createUserDir": "Automatisches Erstellen des Home-Verzeichnisses beim Anlegen neuer Benutzer",
|
"createUserDir": "Automatisches Erstellen des Home-Verzeichnisses beim Anlegen neuer Benutzer",
|
||||||
|
"tusUploads": "Gestückelter Upload",
|
||||||
|
"tusUploadsHelp": "File Browser unterstützt das Hochladen von gestückelten Dateien und ermöglicht so einen effizienten, zuverlässigen, fortsetzbaren und gestückelten Datei-Upload auch in unzuverlässigen Netzwerken.",
|
||||||
|
"tusUploadsChunkSize": "Gibt die maximale Größe pro Anfrage an (direkte Uploads werden für kleinere Uploads verwendet). Bitte geben Sie eine Byte-Angabe oder eine Zeichenfolge wie 10 MB, 1 GB usw. an",
|
||||||
|
"tusUploadsRetryCount": "Anzahl der Wiederholungsversuche, wenn das Hochladen eines Stückes fehlschlägt.",
|
||||||
"customStylesheet": "Individuelles Stylesheet",
|
"customStylesheet": "Individuelles Stylesheet",
|
||||||
"defaultUserDescription": "Das sind die Standardeinstellung für Benutzer",
|
"defaultUserDescription": "Das sind die Standardeinstellung für Benutzer",
|
||||||
"disableExternalLinks": "Externe Links deaktivieren (außer Dokumentation)",
|
"disableExternalLinks": "Externe Links deaktivieren (außer Dokumentation)",
|
||||||
|
"disableUsedDiskPercentage": "Diagramm zur Festplattennutzung deaktivieren",
|
||||||
"documentation": "Dokumentation",
|
"documentation": "Dokumentation",
|
||||||
"examples": "Beispiele",
|
"examples": "Beispiele",
|
||||||
"executeOnShell": "In Shell ausführen",
|
"executeOnShell": "In Shell ausführen",
|
||||||
|
|||||||
282
frontend/src/i18n/el.json
Normal file
282
frontend/src/i18n/el.json
Normal file
@@ -0,0 +1,282 @@
|
|||||||
|
{
|
||||||
|
"buttons": {
|
||||||
|
"cancel": "Ακύρωση",
|
||||||
|
"close": "Κλείσιμο",
|
||||||
|
"copy": "Αντιγραφή",
|
||||||
|
"copyFile": "Αντιγραφή αρχείου",
|
||||||
|
"copyToClipboard": "Αντιγραφή στο πρόχειρο",
|
||||||
|
"copyDownloadLinkToClipboard": "Αντιγραφή συνδέσμου λήψης στο πρόχειρο",
|
||||||
|
"create": "Δημιουργία",
|
||||||
|
"delete": "Διαγραφή",
|
||||||
|
"download": "Λήψη",
|
||||||
|
"file": "Αρχείο",
|
||||||
|
"folder": "Φάκελος",
|
||||||
|
"hideDotfiles": "Απόκρυψη κρυφών αρχείων",
|
||||||
|
"info": "Πληροφορίες",
|
||||||
|
"more": "Περισσότερα",
|
||||||
|
"move": "Μετακίνηση",
|
||||||
|
"moveFile": "Μετακίνηση αρχείου",
|
||||||
|
"new": "Νέο",
|
||||||
|
"next": "Επόμενο",
|
||||||
|
"ok": "Εντάξει",
|
||||||
|
"permalink": "Λήψη μόνιμου συνδέσμου",
|
||||||
|
"previous": "Προηγούμενο",
|
||||||
|
"publish": "Δημοσίευση",
|
||||||
|
"rename": "Μετονομασία",
|
||||||
|
"replace": "Αντικατάσταση",
|
||||||
|
"reportIssue": "Αναφορά προβλήματος",
|
||||||
|
"save": "Αποθήκευση",
|
||||||
|
"schedule": "Προγραμματισμός",
|
||||||
|
"search": "Αναζήτηση",
|
||||||
|
"select": "Επιλογή",
|
||||||
|
"selectMultiple": "Επιλογή πολλαπλών",
|
||||||
|
"share": "Κοινοποίηση",
|
||||||
|
"submit": "Υποβολή",
|
||||||
|
"switchView": "Εναλλαγή προβολής",
|
||||||
|
"toggleSidebar": "(Απ-)ενεργοποίησης της πλευρικής μπάρας",
|
||||||
|
"update": "Ενημέρωση",
|
||||||
|
"upload": "Μεταφόρτωση",
|
||||||
|
"openFile": "Άνοιγμα αρχείου",
|
||||||
|
"continue": "Συνέχεια"
|
||||||
|
},
|
||||||
|
"download": {
|
||||||
|
"downloadFile": "Λήψη αρχείου",
|
||||||
|
"downloadFolder": "Λήψη φακέλου",
|
||||||
|
"downloadSelected": "Λήψη επιλεγμένων"
|
||||||
|
},
|
||||||
|
"upload": {
|
||||||
|
"abortUpload": "Είστε σίγουροι ότι θέλετε να διακόψετε τη μεταφόρτωση;"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"forbidden": "Δεν έχετε άδεια πρόσβασης σε αυτό.",
|
||||||
|
"internal": "Προέκυψε εσωτερικό σφάλμα.",
|
||||||
|
"notFound": "Αυτή η τοποθεσία δεν μπορεί να βρεθεί.",
|
||||||
|
"connection": "Ο διακομιστής δεν είναι διαθέσιμος."
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"body": "Περιεχόμενο",
|
||||||
|
"clear": "Καθαρισμός",
|
||||||
|
"closePreview": "Κλείσιμο προεπισκόπησης",
|
||||||
|
"files": "Αρχεία",
|
||||||
|
"folders": "Φάκελοι",
|
||||||
|
"home": "Αρχική",
|
||||||
|
"lastModified": "Τελευταία τροποποίηση",
|
||||||
|
"loading": "Φορτώνει…",
|
||||||
|
"lonely": "Δεν υπάρχει τίποτα εδώ (ακόμη)…",
|
||||||
|
"metadata": "Μεταδεδομένα",
|
||||||
|
"multipleSelectionEnabled": "Ενεργοποιημένη επιλογή πολλαπλών",
|
||||||
|
"name": "Όνομα",
|
||||||
|
"size": "Μέγεθος",
|
||||||
|
"sortByLastModified": "Ταξινόμηση κατά πρόσφατη τροποποίηση",
|
||||||
|
"sortByName": "Ταξινόμηση κατά όνομα",
|
||||||
|
"sortBySize": "Ταξινόμηση κατά μέγεθος",
|
||||||
|
"noPreview": "Η προεπισκόπηση δεν είναι διαθέσιμη για αυτό το αρχείο."
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"click": "επιλέξτε αρχείο ή φάκελο",
|
||||||
|
"ctrl": {
|
||||||
|
"click": "επιλογή πολλαπλών αρχείων ή φακέλων",
|
||||||
|
"f": "ανοίγει την αναζήτηση",
|
||||||
|
"s": "αποθηκεύει ένα αρχείο ή εκκινεί λήψη του φακέλου στον οποίο βρίσκεστε"
|
||||||
|
},
|
||||||
|
"del": "διαγραφή επιλεγμένων στοιχείων",
|
||||||
|
"doubleClick": "ανοίγει ένα αρχείο ή φάκελο",
|
||||||
|
"esc": "καθαρίζει την επιλογή ή/και κλείνει το παράθυρο",
|
||||||
|
"f1": "αυτή η πληροφορία",
|
||||||
|
"f2": "μετονομασία αρχείου",
|
||||||
|
"help": "Βοήθεια"
|
||||||
|
},
|
||||||
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
|
"ar": "العربية",
|
||||||
|
"de": "Deutsch",
|
||||||
|
"en": "English",
|
||||||
|
"es": "Español",
|
||||||
|
"el": "Ελληνικά",
|
||||||
|
"fr": "Français",
|
||||||
|
"is": "Icelandic",
|
||||||
|
"it": "Italiano",
|
||||||
|
"ja": "日本語",
|
||||||
|
"ko": "한국어",
|
||||||
|
"nlBE": "Dutch (Belgium)",
|
||||||
|
"pl": "Polski",
|
||||||
|
"pt": "Português",
|
||||||
|
"ptBR": "Português (Brasil)",
|
||||||
|
"ro": "Romanian",
|
||||||
|
"ru": "Русский",
|
||||||
|
"sk": "Slovenčina",
|
||||||
|
"svSE": "Swedish (Sweden)",
|
||||||
|
"tr": "Türkçe",
|
||||||
|
"ua": "Українська",
|
||||||
|
"zhCN": "中文 (简体)",
|
||||||
|
"zhTW": "中文 (繁體)"
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"createAnAccount": "Δημιουργία λογαριασμού",
|
||||||
|
"loginInstead": "Έχετε ήδη λογαριασμό",
|
||||||
|
"password": "Κωδικός πρόσβασης",
|
||||||
|
"passwordConfirm": "Επιβεβαίωση κωδικού πρόσβασης",
|
||||||
|
"passwordsDontMatch": "Οι κωδικοί πρόσβασης δεν ταιριάζουν",
|
||||||
|
"signup": "Εγγραφή",
|
||||||
|
"submit": "Είσοδος",
|
||||||
|
"username": "Όνομα χρήστη",
|
||||||
|
"usernameTaken": "Το όνομα χρήστη χρησιμοποιείται ήδη",
|
||||||
|
"wrongCredentials": "Λάθος όνομα ή/και κωδικός πρόσβασης"
|
||||||
|
},
|
||||||
|
"permanent": "Μόνιμο",
|
||||||
|
"prompts": {
|
||||||
|
"copy": "Αντιγραφή",
|
||||||
|
"copyMessage": "Επιλέξτε τοποθεσία για αντιγραφή των αρχείων σας:",
|
||||||
|
"deleteMessageMultiple": "Είστε σίγουροι ότι θέλετε να διαγράψετε {count} αρχεία;",
|
||||||
|
"deleteMessageSingle": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτό το αρχείο/φάκελο;",
|
||||||
|
"deleteMessageShare": "Είστε σίγουροι ότι θέλετε να διαγράψετε αυτή την κοινοποίηση ({path});",
|
||||||
|
"deleteTitle": "Διαγραφή αρχείων",
|
||||||
|
"displayName": "Εμφάνιση ονόματος:",
|
||||||
|
"download": "Λήψη αρχείων",
|
||||||
|
"downloadMessage": "Επιλέξτε τη μορφή που θέλετε να λάβετε.",
|
||||||
|
"error": "Προέκυψε κάποιο σφάλμα",
|
||||||
|
"fileInfo": "Πληροφορίες αρχείου",
|
||||||
|
"filesSelected": "Επιλέχθηκαν {count} αρχεία.",
|
||||||
|
"lastModified": "Τελευταία τροποποίηση",
|
||||||
|
"move": "Μετακίνηση",
|
||||||
|
"moveMessage": "Επιλέξτε νέα τοποθεσία για τα αρχεία / τους φακέλους σας:",
|
||||||
|
"newArchetype": "Δημιουργία νέας ανάρτησης με βάση έναν αρχέτυπο. Το αρχείο σας θα δημιουργηθεί στο φάκελο περιεχομένου.",
|
||||||
|
"newDir": "Νέος φάκελος",
|
||||||
|
"newDirMessage": "Γράψτε το όνομα του νέου φακέλου.",
|
||||||
|
"newFile": "Νέο αρχείο",
|
||||||
|
"newFileMessage": "Γράψτε το όνομα του νέου αρχείου.",
|
||||||
|
"numberDirs": "Αριθμός φακέλων",
|
||||||
|
"numberFiles": "Αριθμός αρχείων",
|
||||||
|
"rename": "Μετονομασία",
|
||||||
|
"renameMessage": "Εισαγάγετε ένα νέο όνομα για το",
|
||||||
|
"replace": "Αντικατάσταση",
|
||||||
|
"replaceMessage": "Ένα από τα αρχεία που προσπαθείτε να μεταφορτώσετε δημιουργεί σύγκρουση με υπάρχον αρχείο λόγω του ονόματός του. Θέλετε να συνεχίσετε τη μεταφόρτωση ή να αντικαταστήσετε το υπάρχον;\n",
|
||||||
|
"schedule": "Προγραμματισμός",
|
||||||
|
"scheduleMessage": "Επιλέξτε μια ημερομηνία και ώρα για τον προγραμματισμό της δημοσίευσης αυτής της ανάρτησης.",
|
||||||
|
"show": "Εμφάνιση",
|
||||||
|
"size": "Μέγεθος",
|
||||||
|
"upload": "Μεταφόρτωση",
|
||||||
|
"uploadFiles": "Μεταφόρτωση {files} αρχείων…",
|
||||||
|
"uploadMessage": "Επιλέξτε μια επιλογή για τη μεταφόρτωση.",
|
||||||
|
"optionalPassword": "Προαιρετικός κωδικός πρόσβασης"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"images": "Εικόνες",
|
||||||
|
"music": "Μουσική",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"pressToSearch": "Πατήστε Enter για αναζήτηση…",
|
||||||
|
"search": "Αναζήτηση…",
|
||||||
|
"typeToSearch": "Πληκτρολογήστε για αναζήτηση…",
|
||||||
|
"types": "Τύποι",
|
||||||
|
"video": "Βίντεο"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"admin": "Διαχειριστής",
|
||||||
|
"administrator": "Διαχειριστής",
|
||||||
|
"allowCommands": "Εκτέλεση εντολών",
|
||||||
|
"allowEdit": "Επεξεργασία, μετονομασία και διαγραφή αρχείων ή φακέλων",
|
||||||
|
"allowNew": "Δημιουργία νέων αρχείων και φακέλων",
|
||||||
|
"allowPublish": "Δημοσίευση νέων αναρτήσεων και σελίδων",
|
||||||
|
"allowSignup": "Να επιτρέπεται η εγγραφή νέων χρηστών",
|
||||||
|
"avoidChanges": "(αφήστε το κενό για αποφυγή αλλαγών)",
|
||||||
|
"branding": "Εξατομίκευση",
|
||||||
|
"brandingDirectoryPath": "Διαδρομή φακέλου εξατομίκευσης",
|
||||||
|
"brandingHelp": "Μπορείτε να προσαρμόσετε την εμφάνισης της εφαρμογής File Browser αλλάζοντας το όνομά της, αντικαθιστώντας το λογότυπό της, προσθέτοντας προσαρμοσμένα στυλ και ακόμα και απενεργοποιώντας εξωτερικούς συνδέσμους προς το GitHub.\nΓια περισσότερες πληροφορίες σχετικά με αυτές τις προσαρμογές, ελέγξτε το {0}.",
|
||||||
|
"changePassword": "Αλλαγή κωδικού πρόσβασης",
|
||||||
|
"commandRunner": "Εκτέλεση εντολών",
|
||||||
|
"commandRunnerHelp": "Εδώ μπορείτε να ορίσετε εντολές που εκτελούνται στα ονομασμένα γεγονότα και δραστηριότητες. Πρέπει να γράψετε μία εντολή ανά γραμμή. Οι μεταβλητές περιβάλλοντος {0} και {1} θα είναι διαθέσιμες, και θα είναι {0} σχετικές με το {1}. Για περισσότερες πληροφορίες σχετικά με αυτή τη λειτουργία και τις διαθέσιμες μεταβλητές περιβάλλοντος, παρακαλώ διαβάστε το {2}.",
|
||||||
|
"commandsUpdated": "Οι εντολές ενημερώθηκαν!",
|
||||||
|
"createUserDir": "Αυτόματη δημιουργία φακέλου χρήστη κατά την προσθήκη νέου χρήστη",
|
||||||
|
"tusUploads": "Τμηματικές μεταφορές αρχείων",
|
||||||
|
"tusUploadsHelp": "Η εφαρμογή File Browser υποστηρίζει τμηματικές μεταφορτώσεις αρχείων, επιτρέποντας την αποδοτική, αξιόπιστη και συνεχιζόμενη μεταφόρτωση αρχείων ακόμα και σε ασταθείς συνδέσεις δικτύου.",
|
||||||
|
"tusUploadsChunkSize": "Υποδεικνύει το μέγιστο μέγεθος ενός αιτήματος μεταφόρτωσης (για μικρότερες μεταφορές αρχείων θα χρησιμοποιηθούν απευθείας και όχι τμηματικές μεταφορτώσεις). Μπορείτε να εισάγετε έναν ακέραιο αριθμό που υποδηλώνει το μέγεθος σε bytes, ή κείμενο με αριθμό και μονάδα μέτρησης μεγέθους δεδομένων, όπως 10MB, 1GB κλπ.",
|
||||||
|
"tusUploadsRetryCount": "Αριθμός επαναληπτικών δοκιμών που θα πραγματοποιηθούν αν αποτύχει η μεταφόρτωση ενός τμήματος.",
|
||||||
|
"userHomeBasePath": "Βασική διαδρομή αρχείων για τους φακέλους των χρηστών",
|
||||||
|
"userScopeGenerationPlaceholder": "Η εμβέλεια εφαρμογής θα δημιουργηθεί αυτόματα",
|
||||||
|
"createUserHomeDirectory": "Δημιουργία φακέλου χρήστη",
|
||||||
|
"customStylesheet": "Προσαρμοσμένο στυλ εμφάνισης (stylesheet)",
|
||||||
|
"defaultUserDescription": "Αυτές είναι οι προεπιλεγμένες ρυθμίσεις για νέους χρήστες.",
|
||||||
|
"disableExternalLinks": "Απενεργοποίηση εξωτερικών συνδέσμων (εκτός από συνδέσμους προς τις οδηγίες χρήσης)",
|
||||||
|
"disableUsedDiskPercentage": "Απενεργοποίηση γραφήματος ποσοστού χρήσης χώρου αποθήκευσης",
|
||||||
|
"documentation": "οδηγίες χρήσης",
|
||||||
|
"examples": "Παραδείγματα",
|
||||||
|
"executeOnShell": "Εκτέλεση στο κέλυφος",
|
||||||
|
"executeOnShellDescription": "Από προεπιλογή, η εφαρμογή File Browser εκτελεί τις εντολές καλώντας τα προγράμματα των εντολών απευθείας. Αν θέλετε να τις εκτελέσετε σε ένα κέλυφος (όπως το Bash ή το PowerShell), μπορείτε να το καθορίσετε εδώ με τις απαιτούμενες παραμέτρους. Εάν οριστεί, η εντολή που εκτελείτε θα προστίθεται ως παράμετρος. Αυτό ισχύει τόσο για τις εντολές χρήστη όσο και για τους αγκίστρους συμβάντων (event hooks).",
|
||||||
|
"globalRules": "Πρόκειται για ένα γενικό σύνολο κανόνων που επιτρέπουν και απαγορεύουν διάφορες λειτουργίες και ισχύουν για κάθε χρήστη. Μπορείτε να καθορίσετε συγκεκριμένους κανόνες στις ρυθμίσεις κάθε χρήστη για να παρακάμψετε τους γενικούς κανόνες.",
|
||||||
|
"globalSettings": "Γενικές ρυθμίσεις",
|
||||||
|
"hideDotfiles": "Απόκρυψη κρυφών αρχείων (dotfiles)",
|
||||||
|
"insertPath": "Εισάγετε διαδρομή",
|
||||||
|
"insertRegex": "Εισάγετε έκφραση regex",
|
||||||
|
"instanceName": "Όνομα περιβάλλοντος",
|
||||||
|
"language": "Γλώσσα",
|
||||||
|
"lockPassword": "Αποτρέψτε τον χρήστη από την αλλαγή του κωδικού πρόσβασης",
|
||||||
|
"newPassword": "Νέος κωδικός πρόσβασης",
|
||||||
|
"newPasswordConfirm": "Επιβεβαιώστε τον νέο κωδικό πρόσβασης",
|
||||||
|
"newUser": "Νέος χρήστης",
|
||||||
|
"password": "Κωδικός πρόσβασης",
|
||||||
|
"passwordUpdated": "Ο κωδικός πρόσβασης ενημερώθηκε!",
|
||||||
|
"path": "Διαδρομή",
|
||||||
|
"perm": {
|
||||||
|
"create": "Δημιουργία αρχείων και φακέλων",
|
||||||
|
"delete": "Διαγραφή αρχείων και φακέλων",
|
||||||
|
"download": "Λήψη",
|
||||||
|
"execute": "Εκτέλεση εντολών",
|
||||||
|
"modify": "Επεξεργασία αρχείων",
|
||||||
|
"rename": "Μετονομασία ή μετακίνηση αρχείων και φακέλων",
|
||||||
|
"share": "Κοινοποίηση αρχείων"
|
||||||
|
},
|
||||||
|
"permissions": "Δικαιώματα",
|
||||||
|
"permissionsHelp": "Μπορείτε να ορίσετε τον χρήστη ως διαχειριστή ή να επιλέξετε τα δικαιώματα μεμονωμένα. Αν επιλέξετε \"Διαχειριστής\", όλες οι υπόλοιπες επιλογές θα είναι αυτόματα επιλεγμένες. Η διαχείριση χρηστών παραμένει προνόμιο ενός χρήστη με τον ρόλο του διαχειριστή.\n",
|
||||||
|
"profileSettings": "Ρυθμίσεις προφίλ",
|
||||||
|
"ruleExample1": "αποκλείει την πρόσβαση σε οποιοδήποτε κρυφό αρχείο (όπως .git, .gitignore) σε κάθε φάκελο.\n",
|
||||||
|
"ruleExample2": "αποκλείει την πρόσβαση στο αρχείο με το όνομα Caddyfile στον ριζικό φάκελο της εμβέλειας του κανόνα.",
|
||||||
|
"rules": "Κανόνες",
|
||||||
|
"rulesHelp": "Εδώ μπορείτε να ορίσετε ένα σύνολο κανόνων που επιτρέπουν και απαγορεύουν διάφορες λειτουργίες για τον συγκεκριμένο χρήστη. Τα αποκλεισμένα αρχεία δεν θα εμφανίζονται στα περιεχόμενα των αντίστοιχων φακέλων και δεν θα είναι προσβάσιμα από τον χρήστη. Υποστηρίζονται εκφράσεις regex και διαδρομές σχετικές με την εμβέλεια αρχείων των χρηστών.\n",
|
||||||
|
"scope": "Εμβέλεια",
|
||||||
|
"setDateFormat": "Ορισμός ακριβούς μορφής ημερομηνίας",
|
||||||
|
"settingsUpdated": "Οι ρυθμίσεις ενημερώθηκαν!",
|
||||||
|
"shareDuration": "Διάρκεια κοινοποίησης",
|
||||||
|
"shareManagement": "Διαχείριση κοινοποίησης",
|
||||||
|
"shareDeleted": "Η κοινοποίηση διαγράφηκε!",
|
||||||
|
"singleClick": "Χρήση μονού κλικ για να ανοίξετε αρχεία και φακέλους",
|
||||||
|
"themes": {
|
||||||
|
"dark": "Σκοτεινό",
|
||||||
|
"light": "Φωτεινό",
|
||||||
|
"title": "Μοτίβο"
|
||||||
|
},
|
||||||
|
"user": "Χρήστης",
|
||||||
|
"userCommands": "Εντολές χρήστη",
|
||||||
|
"userCommandsHelp": "Μια λίστα με τις διαθέσιμες εντολές για αυτόν το χρήστη, χωρισμένες μεταξύ τους με κενά. Παράδειγμα:\n",
|
||||||
|
"userCreated": "Ο χρήστης δημιουργήθηκε!",
|
||||||
|
"userDefaults": "Προεπιλεγμένες ρυθμίσεις χρήστη",
|
||||||
|
"userDeleted": "Ο χρήστης διαγράφηκε!",
|
||||||
|
"userManagement": "Διαχείριση χρηστών",
|
||||||
|
"userUpdated": "Ο χρήστης ενημερώθηκε!",
|
||||||
|
"username": "Όνομα χρήστη",
|
||||||
|
"users": "Χρήστες"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"help": "Βοήθεια",
|
||||||
|
"hugoNew": "Νέο Hugo",
|
||||||
|
"login": "Σύνδεση",
|
||||||
|
"logout": "Αποσύνδεση",
|
||||||
|
"myFiles": "Τα αρχεία μου",
|
||||||
|
"newFile": "Νέο αρχείο",
|
||||||
|
"newFolder": "Νέος φάκελος",
|
||||||
|
"preview": "Προεπισκόπηση",
|
||||||
|
"settings": "Ρυθμίσεις",
|
||||||
|
"signup": "Εγγραφή",
|
||||||
|
"siteSettings": "Ρυθμίσεις ιστότοπου"
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"linkCopied": "Ο σύνδεσμος αντιγράφηκε!"
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"days": "Ημέρες",
|
||||||
|
"hours": "Ώρες",
|
||||||
|
"minutes": "Λεπτά",
|
||||||
|
"seconds": "Δευτερόλεπτα",
|
||||||
|
"unit": "Μονάδα χρόνου"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -5,6 +5,7 @@
|
|||||||
"copy": "Copy",
|
"copy": "Copy",
|
||||||
"copyFile": "Copy file",
|
"copyFile": "Copy file",
|
||||||
"copyToClipboard": "Copy to clipboard",
|
"copyToClipboard": "Copy to clipboard",
|
||||||
|
"copyDownloadLinkToClipboard": "Copy download link to clipboard",
|
||||||
"create": "Create",
|
"create": "Create",
|
||||||
"delete": "Delete",
|
"delete": "Delete",
|
||||||
"download": "Download",
|
"download": "Download",
|
||||||
@@ -36,13 +37,18 @@
|
|||||||
"toggleSidebar": "Toggle sidebar",
|
"toggleSidebar": "Toggle sidebar",
|
||||||
"update": "Update",
|
"update": "Update",
|
||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"openFile": "Open file"
|
"openFile": "Open file",
|
||||||
|
"continue": "Continue",
|
||||||
|
"discardChanges": "Discard"
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"downloadFile": "Download File",
|
"downloadFile": "Download File",
|
||||||
"downloadFolder": "Download Folder",
|
"downloadFolder": "Download Folder",
|
||||||
"downloadSelected": "Download Selected"
|
"downloadSelected": "Download Selected"
|
||||||
},
|
},
|
||||||
|
"upload": {
|
||||||
|
"abortUpload": "Are you sure you wish to abort?"
|
||||||
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"forbidden": "You don't have permissions to access this.",
|
"forbidden": "You don't have permissions to access this.",
|
||||||
"internal": "Something really went wrong.",
|
"internal": "Something really went wrong.",
|
||||||
@@ -83,8 +89,11 @@
|
|||||||
"help": "Help"
|
"help": "Help"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
|
"el": "Ελληνικά",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
"es": "Español",
|
"es": "Español",
|
||||||
"fr": "Français",
|
"fr": "Français",
|
||||||
@@ -120,32 +129,32 @@
|
|||||||
"permanent": "Permanent",
|
"permanent": "Permanent",
|
||||||
"prompts": {
|
"prompts": {
|
||||||
"copy": "Copy",
|
"copy": "Copy",
|
||||||
"copyMessage": "Choose the place to copy your files:",
|
"copyMessage": "Choose the location to copy your files to:",
|
||||||
"currentlyNavigating": "Currently navigating on:",
|
"currentlyNavigating": "Currently navigating on:",
|
||||||
"deleteMessageMultiple": "Are you sure you want to delete {count} file(s)?",
|
"deleteMessageMultiple": "Are you sure you wish to delete {count} file(s)?",
|
||||||
"deleteMessageSingle": "Are you sure you want to delete this file/folder?",
|
"deleteMessageSingle": "Are you sure you wish to delete this file/folder?",
|
||||||
"deleteMessageShare": "Are you sure you want to delete this share({path})?",
|
"deleteMessageShare": "Are you sure you wish to delete this share({path})?",
|
||||||
"deleteTitle": "Delete files",
|
"deleteTitle": "Delete files",
|
||||||
"displayName": "Display Name:",
|
"displayName": "Display Name:",
|
||||||
"download": "Download files",
|
"download": "Download files",
|
||||||
"downloadMessage": "Choose the format you want to download.",
|
"downloadMessage": "Choose the format you wish to download.",
|
||||||
"error": "Something went wrong",
|
"error": "Something went wrong",
|
||||||
"fileInfo": "File information",
|
"fileInfo": "File information",
|
||||||
"filesSelected": "{count} files selected.",
|
"filesSelected": "{count} files selected.",
|
||||||
"lastModified": "Last Modified",
|
"lastModified": "Last Modified",
|
||||||
"move": "Move",
|
"move": "Move",
|
||||||
"moveMessage": "Choose new house for your file(s)/folder(s):",
|
"moveMessage": "Choose new home for your file(s)/folder(s):",
|
||||||
"newArchetype": "Create a new post based on an archetype. Your file will be created on content folder.",
|
"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": "Name your new directory.",
|
||||||
"newFile": "New file",
|
"newFile": "New file",
|
||||||
"newFileMessage": "Write the name of the new file.",
|
"newFileMessage": "Name your new file.",
|
||||||
"numberDirs": "Number of directories",
|
"numberDirs": "Number of directories",
|
||||||
"numberFiles": "Number of files",
|
"numberFiles": "Number of files",
|
||||||
"rename": "Rename",
|
"rename": "Rename",
|
||||||
"renameMessage": "Insert a new name for",
|
"renameMessage": "Insert a new name for",
|
||||||
"replace": "Replace",
|
"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",
|
"replaceMessage": "One of the files you're trying to upload has a conflicting name. Do you wish to skip this file and continue to upload or 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.",
|
||||||
"show": "Show",
|
"show": "Show",
|
||||||
@@ -153,7 +162,9 @@
|
|||||||
"upload": "Upload",
|
"upload": "Upload",
|
||||||
"uploadFiles": "Uploading {files} files...",
|
"uploadFiles": "Uploading {files} files...",
|
||||||
"uploadMessage": "Select an option to upload.",
|
"uploadMessage": "Select an option to upload.",
|
||||||
"optionalPassword": "Optional password"
|
"optionalPassword": "Optional password",
|
||||||
|
"resolution": "Resolution",
|
||||||
|
"discardEditorChanges": "Are you sure you wish to discard the changes you've made?"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"images": "Images",
|
"images": "Images",
|
||||||
@@ -182,17 +193,22 @@
|
|||||||
"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",
|
"createUserDir": "Auto create user home dir while adding new user",
|
||||||
|
"tusUploads": "Chunked Uploads",
|
||||||
|
"tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.",
|
||||||
|
"tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting byte size input or a string like 10MB, 1GB etc.",
|
||||||
|
"tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.",
|
||||||
"userHomeBasePath": "Base path for user home directories",
|
"userHomeBasePath": "Base path for user home directories",
|
||||||
"userScopeGenerationPlaceholder": "The scope will be auto generated",
|
"userScopeGenerationPlaceholder": "The scope will be auto generated",
|
||||||
"createUserHomeDirectory": "Create user home directory",
|
"createUserHomeDirectory": "Create user home directory",
|
||||||
"customStylesheet": "Custom Stylesheet",
|
"customStylesheet": "Custom Stylesheet",
|
||||||
"defaultUserDescription": "This are the default settings for new users.",
|
"defaultUserDescription": "These are the default settings for new users.",
|
||||||
"disableExternalLinks": "Disable external links (except documentation)",
|
"disableExternalLinks": "Disable external links (except documentation)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "documentation",
|
"documentation": "documentation",
|
||||||
"examples": "Examples",
|
"examples": "Examples",
|
||||||
"executeOnShell": "Execute on shell",
|
"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.",
|
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you wish 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 applies 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.",
|
"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 these ones.",
|
||||||
"globalSettings": "Global Settings",
|
"globalSettings": "Global Settings",
|
||||||
"hideDotfiles": "Hide dotfiles",
|
"hideDotfiles": "Hide dotfiles",
|
||||||
"insertPath": "Insert the path",
|
"insertPath": "Insert the path",
|
||||||
@@ -218,7 +234,7 @@
|
|||||||
"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",
|
||||||
"ruleExample1": "prevents the access to any dot file (such as .git, .gitignore) in every folder.\n",
|
"ruleExample1": "prevents the access to any dotfile (such as .git, .gitignore) in every folder.\n",
|
||||||
"ruleExample2": "blocks the access to the file named Caddyfile on the root of the scope.",
|
"ruleExample2": "blocks the access to the file named Caddyfile on the root of the scope.",
|
||||||
"rules": "Rules",
|
"rules": "Rules",
|
||||||
"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",
|
||||||
|
|||||||
@@ -8,7 +8,9 @@
|
|||||||
"create": "Crear",
|
"create": "Crear",
|
||||||
"delete": "Borrar",
|
"delete": "Borrar",
|
||||||
"download": "Descargar",
|
"download": "Descargar",
|
||||||
"hideDotfiles": "",
|
"file": "Archivo",
|
||||||
|
"folder": "Carpeta",
|
||||||
|
"hideDotfiles": "Ocultar archivos empezados por punto",
|
||||||
"info": "Info",
|
"info": "Info",
|
||||||
"more": "Más",
|
"more": "Más",
|
||||||
"move": "Mover",
|
"move": "Mover",
|
||||||
@@ -29,20 +31,23 @@
|
|||||||
"selectMultiple": "Selección múltiple",
|
"selectMultiple": "Selección múltiple",
|
||||||
"share": "Compartir",
|
"share": "Compartir",
|
||||||
"shell": "Presiona Enter para buscar...",
|
"shell": "Presiona Enter para buscar...",
|
||||||
|
"submit": "Enviar",
|
||||||
"switchView": "Cambiar vista",
|
"switchView": "Cambiar vista",
|
||||||
"toggleSidebar": "Mostrar/Ocultar menú",
|
"toggleSidebar": "Mostrar/Ocultar menú",
|
||||||
"update": "Actualizar",
|
"update": "Actualizar",
|
||||||
"upload": "Subir"
|
"upload": "Subir",
|
||||||
|
"openFile": "Abrir archivo"
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"downloadFile": "Descargar fichero",
|
"downloadFile": "Descargar fichero",
|
||||||
"downloadFolder": "Descargar directorio",
|
"downloadFolder": "Descargar directorio",
|
||||||
"downloadSelected": ""
|
"downloadSelected": "Descargar seleccionados"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"forbidden": "No tienes los permisos necesarios para acceder.",
|
"forbidden": "No tienes los permisos necesarios para acceder.",
|
||||||
"internal": "La verdad es que algo ha ido mal.",
|
"internal": "La verdad es que algo ha ido mal.",
|
||||||
"notFound": "No se puede acceder a este lugar."
|
"notFound": "No se puede acceder a este lugar.",
|
||||||
|
"connection": "No se puede acceder al servidor."
|
||||||
},
|
},
|
||||||
"files": {
|
"files": {
|
||||||
"body": "Cuerpo",
|
"body": "Cuerpo",
|
||||||
@@ -60,7 +65,8 @@
|
|||||||
"size": "Tamaño",
|
"size": "Tamaño",
|
||||||
"sortByLastModified": "Ordenar por última modificación",
|
"sortByLastModified": "Ordenar por última modificación",
|
||||||
"sortByName": "Ordenar por nombre",
|
"sortByName": "Ordenar por nombre",
|
||||||
"sortBySize": "Ordenar por tamaño"
|
"sortBySize": "Ordenar por tamaño",
|
||||||
|
"noPreview": "La vista previa no está disponible para este archivo."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"click": "seleccionar archivo o carpeta",
|
"click": "seleccionar archivo o carpeta",
|
||||||
@@ -77,23 +83,25 @@
|
|||||||
"help": "Ayuda"
|
"help": "Ayuda"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
"es": "Español",
|
"es": "Español",
|
||||||
"fr": "Français",
|
"fr": "Français",
|
||||||
"is": "",
|
"is": "Icelandic",
|
||||||
"it": "Italiano",
|
"it": "Italiano",
|
||||||
"ja": "日本語",
|
"ja": "日本語",
|
||||||
"ko": "한국어",
|
"ko": "한국어",
|
||||||
"nlBE": "",
|
"nlBE": "Niederländisch (Belgien)",
|
||||||
"pl": "Polski",
|
"pl": "Polski",
|
||||||
"pt": "Português",
|
"pt": "Português",
|
||||||
"ptBR": "Português (Brasil)",
|
"ptBR": "Português (Brasil)",
|
||||||
"ro": "",
|
"ro": "Românesc",
|
||||||
"ru": "Русский",
|
"ru": "Русский",
|
||||||
"sk": "Slovenčina",
|
"sk": "Slovenčina",
|
||||||
"svSE": "",
|
"svSE": "Swedish (Sweden)",
|
||||||
"tr" : "Türkçe",
|
"tr" : "Türkçe",
|
||||||
"ua": "Українська",
|
"ua": "Українська",
|
||||||
"zhCN": "中文 (简体)",
|
"zhCN": "中文 (简体)",
|
||||||
@@ -118,6 +126,7 @@
|
|||||||
"currentlyNavigating": "Actualmente estás en:",
|
"currentlyNavigating": "Actualmente estás en:",
|
||||||
"deleteMessageMultiple": "¿Estás seguro que quieres eliminar {count} archivo(s)?",
|
"deleteMessageMultiple": "¿Estás seguro que quieres eliminar {count} archivo(s)?",
|
||||||
"deleteMessageSingle": "¿Estás seguro que quieres eliminar este archivo/carpeta?",
|
"deleteMessageSingle": "¿Estás seguro que quieres eliminar este archivo/carpeta?",
|
||||||
|
"deleteMessageShare": "¿Está seguro de que quiere eliminar este recurso compartido({path})?",
|
||||||
"deleteTitle": "Borrar archivos",
|
"deleteTitle": "Borrar archivos",
|
||||||
"displayName": "Nombre:",
|
"displayName": "Nombre:",
|
||||||
"download": "Descargar archivos",
|
"download": "Descargar archivos",
|
||||||
@@ -143,11 +152,13 @@
|
|||||||
"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.",
|
||||||
"show": "Mostrar",
|
"show": "Mostrar",
|
||||||
"size": "Tamaño",
|
"size": "Tamaño",
|
||||||
"upload": "",
|
"upload": "Subir",
|
||||||
"uploadMessage": ""
|
"uploadFiles": "Subiendo {files} archivos...",
|
||||||
|
"uploadMessage": "Seleccione una opción para subir.",
|
||||||
|
"optionalPassword": "Contraseña opcional"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"images": "Images",
|
"images": "Imágenes",
|
||||||
"music": "Música",
|
"music": "Música",
|
||||||
"pdf": "PDF",
|
"pdf": "PDF",
|
||||||
"pressToSearch": "Presiona enter para buscar...",
|
"pressToSearch": "Presiona enter para buscar...",
|
||||||
@@ -170,17 +181,21 @@
|
|||||||
"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}.",
|
"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": "Aquí puede establecer los comandos que se ejecutan en los eventos nombrados. Debe escribir uno por línea. Las variables de entorno {0} y {1} estarán disponibles, siendo {0} relativa a {1}. Para más información sobre esta característica y las variables de entorno disponibles, por favor lea el {2}.",
|
||||||
"commandsUpdated": "¡Comandos actualizados!",
|
"commandsUpdated": "¡Comandos actualizados!",
|
||||||
"createUserDir": "Crea automaticamente una carpeta de inicio cuando se agrega un usuario",
|
"createUserDir": "Crea automaticamente una carpeta de inicio cuando se agrega un usuario",
|
||||||
|
"userHomeBasePath": "Ruta base para los directorios personales de los usuarios",
|
||||||
|
"userScopeGenerationPlaceholder": "El ámbito se generará automáticamente",
|
||||||
|
"createUserHomeDirectory": "Crear el directorio principal del usuario",
|
||||||
"customStylesheet": "Modificar hoja de estilos",
|
"customStylesheet": "Modificar hoja de estilos",
|
||||||
"defaultUserDescription": "Estas son las configuraciones por defecto para nuevos usuarios.",
|
"defaultUserDescription": "Estas son las configuraciones por defecto para nuevos usuarios.",
|
||||||
"disableExternalLinks": "Deshabilitar enlaces externos (excepto documentación)",
|
"disableExternalLinks": "Deshabilitar enlaces externos (excepto documentación)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "documentación",
|
"documentation": "documentación",
|
||||||
"examples": "Ejemplos",
|
"examples": "Ejemplos",
|
||||||
"executeOnShell": "Ejecutar en la shell",
|
"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.",
|
"executeOnShellDescription": "Por defecto, FileBrowser ejecuta los comandos llamando directamente a sus binarios. Si quieres ejecutarlos en un shell en su lugar (como Bash o PowerShell), puedes definirlo aquí con los argumentos y banderas (flags) necesarios. Si se define, el comando que se ejecuta se añadirá como argumento. Esto se aplica tanto a los comandos de usuario como a los ganchos de eventos.",
|
||||||
"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.",
|
"globalRules": "Se trata de un conjunto global de reglas de permiso y rechazo. Se aplican a todos los usuarios. Puedes definir reglas específicas en la configuración de cada usuario para anular estas.",
|
||||||
"globalSettings": "Ajustes globales",
|
"globalSettings": "Ajustes globales",
|
||||||
"hideDotfiles": "",
|
"hideDotfiles": "",
|
||||||
"insertPath": "Introduce la ruta",
|
"insertPath": "Introduce la ruta",
|
||||||
@@ -193,7 +208,7 @@
|
|||||||
"newUser": "Nuevo usuario",
|
"newUser": "Nuevo usuario",
|
||||||
"password": "Contraseña",
|
"password": "Contraseña",
|
||||||
"passwordUpdated": "¡Contraseña actualizada!",
|
"passwordUpdated": "¡Contraseña actualizada!",
|
||||||
"path": "",
|
"path": "Ruta",
|
||||||
"perm": {
|
"perm": {
|
||||||
"create": "Crear ficheros y directorios",
|
"create": "Crear ficheros y directorios",
|
||||||
"delete": "Eliminar ficheros y directorios",
|
"delete": "Eliminar ficheros y directorios",
|
||||||
@@ -211,14 +226,16 @@
|
|||||||
"rules": "Reglas",
|
"rules": "Reglas",
|
||||||
"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",
|
||||||
|
"setDateFormat": "Establecer el formato exacto de la fecha",
|
||||||
"settingsUpdated": "¡Ajustes actualizados!",
|
"settingsUpdated": "¡Ajustes actualizados!",
|
||||||
"shareDuration": "",
|
"shareDuration": "Compartir Duración",
|
||||||
"shareManagement": "",
|
"shareManagement": "Gestión Compartida",
|
||||||
"singleClick": "",
|
"shareDeleted": "¡Recurso compartido eliminado!",
|
||||||
|
"singleClick": "Utilice un solo clic para abrir archivos y directorios",
|
||||||
"themes": {
|
"themes": {
|
||||||
"dark": "",
|
"dark": "Oscuro",
|
||||||
"light": "",
|
"light": "Claro",
|
||||||
"title": ""
|
"title": "Tema"
|
||||||
},
|
},
|
||||||
"user": "Usuario",
|
"user": "Usuario",
|
||||||
"userCommands": "Comandos",
|
"userCommands": "Comandos",
|
||||||
|
|||||||
@@ -83,6 +83,8 @@
|
|||||||
"help": "Aide"
|
"help": "Aide"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -185,6 +187,7 @@
|
|||||||
"customStylesheet": "Feuille de style personnalisée",
|
"customStylesheet": "Feuille de style personnalisée",
|
||||||
"defaultUserDescription": "Paramètres par défaut pour les nouveaux utilisateurs.",
|
"defaultUserDescription": "Paramètres par défaut pour les nouveaux utilisateurs.",
|
||||||
"disableExternalLinks": "Désactiver les liens externes (sauf la documentation)",
|
"disableExternalLinks": "Désactiver les liens externes (sauf la documentation)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "documentation",
|
"documentation": "documentation",
|
||||||
"examples": "Exemples",
|
"examples": "Exemples",
|
||||||
"executeOnShell": "Exécuter dans le shell",
|
"executeOnShell": "Exécuter dans le shell",
|
||||||
|
|||||||
281
frontend/src/i18n/he.json
Normal file
281
frontend/src/i18n/he.json
Normal file
@@ -0,0 +1,281 @@
|
|||||||
|
{
|
||||||
|
"buttons": {
|
||||||
|
"cancel": "ביטול",
|
||||||
|
"close": "סגירה",
|
||||||
|
"copy": "העתקה",
|
||||||
|
"copyFile": "העתק קובץ",
|
||||||
|
"copyToClipboard": "העתק ללוח",
|
||||||
|
"copyDownloadLinkToClipboard": "העתק קישור הורדה ללוח",
|
||||||
|
"create": "צור",
|
||||||
|
"delete": "מחק",
|
||||||
|
"download": "הורדה",
|
||||||
|
"file": "קובץ",
|
||||||
|
"folder": "תיקייה",
|
||||||
|
"hideDotfiles": "הסתר קבצים/תיקיות ששמם מתחיל בנקודה",
|
||||||
|
"info": "מידע",
|
||||||
|
"more": "עוד",
|
||||||
|
"move": "העברה",
|
||||||
|
"moveFile": "העבר קובץ",
|
||||||
|
"new": "חדש",
|
||||||
|
"next": "הבא",
|
||||||
|
"ok": "אישור",
|
||||||
|
"permalink": "יצירת קישור קבוע",
|
||||||
|
"previous": "הקודם",
|
||||||
|
"publish": "פרסום",
|
||||||
|
"rename": "שינוי שם",
|
||||||
|
"replace": "החלפה",
|
||||||
|
"reportIssue": "דווח על תקלה",
|
||||||
|
"save": "שמירה",
|
||||||
|
"schedule": "תזמון",
|
||||||
|
"search": "חיפוש",
|
||||||
|
"select": "בחירה",
|
||||||
|
"selectMultiple": "בחירה מרובה",
|
||||||
|
"share": "שיתוף",
|
||||||
|
"shell": "פתיחת מסוף",
|
||||||
|
"submit": "אישור",
|
||||||
|
"switchView": "שינוי תצוגה",
|
||||||
|
"toggleSidebar": "פתיחת/סגירת סרגל צד",
|
||||||
|
"update": "עדכון",
|
||||||
|
"upload": "העלאה",
|
||||||
|
"openFile": "פתח קובץ",
|
||||||
|
"continue": "המשך",
|
||||||
|
"discardChanges": "זריקת השינויים"
|
||||||
|
},
|
||||||
|
"download": {
|
||||||
|
"downloadFile": "הורד קובץ",
|
||||||
|
"downloadFolder": "הורד תיקייה",
|
||||||
|
"downloadSelected": "הורד קבצים שנבחרו"
|
||||||
|
},
|
||||||
|
"upload": {
|
||||||
|
"abortUpload": "האם אתה בטוח שברצונך להפסיק את ההעלאה?"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"forbidden": "אין לך הרשאות גישה",
|
||||||
|
"internal": "משהו השתבש",
|
||||||
|
"notFound": "לא ניתן להגיע למיקום זה",
|
||||||
|
"connection": "לא ניתן להגיע לשרת"
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"body": "גוף",
|
||||||
|
"clear": "ניקוי",
|
||||||
|
"closePreview": "סגירת תצוגה מקדימה",
|
||||||
|
"files": "קבצים",
|
||||||
|
"folders": "תיקיות",
|
||||||
|
"home": "ראשי",
|
||||||
|
"lastModified": "שונה לאחרונה",
|
||||||
|
"loading": "טוען...",
|
||||||
|
"lonely": "בודד כאן",
|
||||||
|
"metadata": "נתונים",
|
||||||
|
"multipleSelectionEnabled": "בחירה מרובה מופעלת",
|
||||||
|
"name": "שם",
|
||||||
|
"size": "גודל",
|
||||||
|
"sortByLastModified": "מיין לפי השינוי האחרון",
|
||||||
|
"sortByName": "מיין לפי שם",
|
||||||
|
"sortBySize": "מיין לפי גודל",
|
||||||
|
"noPreview": "לא זמינה תצוגה מקדימה לקובץ זה"
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"click": "בחר קובץ או תיקייה",
|
||||||
|
"ctrl": {
|
||||||
|
"click": "בחר מספר קבצים או תיקיות",
|
||||||
|
"f": "פותח את החיפוש",
|
||||||
|
"s": "לשמור קובץ או להוריד את התיקייה שבה אתה נמצא"
|
||||||
|
},
|
||||||
|
"del": "מחק את הבחירה",
|
||||||
|
"doubleClick": "פתח קובץ או תיקייה",
|
||||||
|
"esc": "נקה את הבחירה ו/או סגור את השדה",
|
||||||
|
"f1": "המידע הזה",
|
||||||
|
"f2": "שינוי שם קובץ",
|
||||||
|
"help": "עזרה"
|
||||||
|
},
|
||||||
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
|
"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": "Русский",
|
||||||
|
"sk": "Slovenčina",
|
||||||
|
"svSE": "Swedish (Sweden)",
|
||||||
|
"tr": "Türkçe",
|
||||||
|
"ua": "Українська",
|
||||||
|
"zhCN": "中文 (简体)",
|
||||||
|
"zhTW": "中文 (繁體)"
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"createAnAccount": "צור חשבון",
|
||||||
|
"loginInstead": "כבר יש לי חשבון",
|
||||||
|
"password": "סיסמא",
|
||||||
|
"passwordConfirm": "אימות סיסמא",
|
||||||
|
"passwordsDontMatch": "הסיסמאות אינן תואמות",
|
||||||
|
"signup": "הרשמה",
|
||||||
|
"submit": "התחברות",
|
||||||
|
"username": "שם משתמש",
|
||||||
|
"usernameTaken": "שם המשתמש כבר קיים",
|
||||||
|
"wrongCredentials": "פרטי התחברות שגויים"
|
||||||
|
},
|
||||||
|
"permanent": "קבוע",
|
||||||
|
"prompts": {
|
||||||
|
"copy": "העתקה",
|
||||||
|
"copyMessage": "בחר לאן להעתיק את הקבצים:",
|
||||||
|
"currentlyNavigating": "כרגע מנווט ב:",
|
||||||
|
"deleteMessageMultiple": "האם אתה בטוח שברצונך למחוק {count} קבצים?",
|
||||||
|
"deleteMessageSingle": "האם אתה בטוח שברצונך למחוק את הקובץ/התיקייה?",
|
||||||
|
"deleteMessageShare": "האם אתה בטוח שברצונך למחוק את השיתוף הזה ({path})?",
|
||||||
|
"deleteTitle": "מחיקת קבצים",
|
||||||
|
"displayName": "שם:",
|
||||||
|
"download": "הורדת קבצים",
|
||||||
|
"downloadMessage": "בחר את הפורמט שברצונך להוריד",
|
||||||
|
"error": "משהו השתבש",
|
||||||
|
"fileInfo": "מידע על הקובץ",
|
||||||
|
"filesSelected": "{count} קבצים נבחרו.",
|
||||||
|
"lastModified": "שונה לאחרונה",
|
||||||
|
"move": "העברה",
|
||||||
|
"moveMessage": "בחר מיקום חדש לקובץ/תיקייה:",
|
||||||
|
"newArchetype": "Create a new post based on an archetype. Your file will be created on content folder",
|
||||||
|
"newDir": "תיקייה חדשה",
|
||||||
|
"newDirMessage": "כתוב את שם התיקייה החדשה",
|
||||||
|
"newFile": "קובץ חדש",
|
||||||
|
"newFileMessage": "כתוב את שם הקובץ החדש",
|
||||||
|
"numberDirs": "כמות התיקיות",
|
||||||
|
"numberFiles": "כמות הקבצים",
|
||||||
|
"rename": "שינוי שם",
|
||||||
|
"renameMessage": "הכנס שם חדש עבור",
|
||||||
|
"replace": "החלפה",
|
||||||
|
"replaceMessage": "אחד הקבצים בעל שם זהה לקובץ קיים, האם ברצונך להחליף את הקובץ הקיים בחדש? זהירות - הקובץ הישן ימחק\n",
|
||||||
|
"schedule": "תזמון",
|
||||||
|
"scheduleMessage": "בחר תאריך ושעה לתזמון הפרסום של פוסט זה.",
|
||||||
|
"show": "הצג",
|
||||||
|
"size": "גודל",
|
||||||
|
"upload": "העלאה",
|
||||||
|
"uploadFiles": "מעלה {files} קבצים...",
|
||||||
|
"uploadMessage": "בחר אפשרות העלאה.",
|
||||||
|
"optionalPassword": "סיסמא אופציונלית",
|
||||||
|
"discardEditorChanges": "האם אתה בטוח שברצונך לבטל את השינויים שביצעת?"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"images": "תמונות",
|
||||||
|
"music": "מוזיקה",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"pressToSearch": "הקש אנטר כדי לחפש...",
|
||||||
|
"search": "חיפוש...",
|
||||||
|
"typeToSearch": "הקלד כדי לחפש...",
|
||||||
|
"types": "סוגים",
|
||||||
|
"video": "וידאו"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"admin": "מנהל",
|
||||||
|
"administrator": "מנהל ראשי",
|
||||||
|
"allowCommands": "הפעלת פקודות",
|
||||||
|
"allowEdit": "עריכת, שינוי שם ומחיקת קבצים/תיקיות",
|
||||||
|
"allowNew": "יצירת קבצים ותיקיות חדשות",
|
||||||
|
"allowPublish": "פרסום פוסטים ודפים חדשים",
|
||||||
|
"allowSignup": "אפשר למשתמשים חדשים להירשם",
|
||||||
|
"avoidChanges": "(השאר ריק כדי למנוע שינויים)",
|
||||||
|
"branding": "מיתוג",
|
||||||
|
"brandingDirectoryPath": "נתיב תיקיית מיתוג",
|
||||||
|
"brandingHelp": "אתה יכול להגדיר את האופן שבו האפליקציה תראה על ידי שינוי שם האפליקציה, החלפת הלוגו, הוספת עיצוב מותאם אישית ואפילו השבתת קישורים חיצוניים לGithub.\nלמידע נוסף עיין ב-{0}.",
|
||||||
|
"changePassword": "שינוי סיסמא",
|
||||||
|
"commandRunner": "הרצת פקודות",
|
||||||
|
"commandRunnerHelp": "אתה יכול להגדיר פקודות שיבוצעו באירועים שונים. עליך לכתוב אחד בכל שורה. משתני הסביבה {0} ו-{1} יהיו זמינים, בהיותם {0} ביחס ל-{1}. למידע נוסף על תכונה זו ועל משתני הסביבה הזמינים, עיין ב {2}.",
|
||||||
|
"commandsUpdated": "הפקודות עודכנו!",
|
||||||
|
"createUserDir": "צור אוטומטית תיקיית בית בעת הוספת משתמש חדש",
|
||||||
|
"userHomeBasePath": "נתיב ראשי לתיקיות הבית של משתמשים",
|
||||||
|
"userScopeGenerationPlaceholder": "ההיקף יווצר אוטומטית",
|
||||||
|
"createUserHomeDirectory": "צור תיקיית בית למשתמש",
|
||||||
|
"customStylesheet": "עיצוב מותאם אישית (Stylesheet)",
|
||||||
|
"defaultUserDescription": "הגדרות ברירת המחדל למשתמשים חדשים",
|
||||||
|
"disableExternalLinks": "השבת קישורים חיצוניים (למעט תיעוד)",
|
||||||
|
"disableUsedDiskPercentage": "אל תציג גרף שימוש בדיסק",
|
||||||
|
"documentation": "תיעוד",
|
||||||
|
"examples": "דוגמאות",
|
||||||
|
"executeOnShell": "בצע במסוף",
|
||||||
|
"executeOnShellDescription": "כברירת מחדל, האפליקציה מבצעת את הפקודות על ידי הפעלה ישירה לקבצים (הבינארים). אם אתה רוצה להפעיל אותם מתוך מעטפת כלשהי, (לדוגמא מתוך Bash או PowerShell) אתה יכול להגדיר אותם כאן עם הפרמטרים הנדרשים. שים לב שזה יבוצע גם על פקודות משתמש וגם על הוקים (Hooks) לאירועים.",
|
||||||
|
"globalRules": "זוהי קבוצה גלובלית של חוקים והרשאות (מה מותר ומה אסור), הם חלים על כל משתמש. אתה יכול להגדיר כללים ספציפיים בהגדרות של כל משתמש, כדי לעקוף את החוקים הגלובלים.",
|
||||||
|
"globalSettings": "הגדרות גלובליות",
|
||||||
|
"hideDotfiles": "הסתר קבצים/תיקיות ששמם מתחיל בנקודה",
|
||||||
|
"insertPath": "הכנס את הנתיב",
|
||||||
|
"insertRegex": "הוסף ביטוי רגולרי",
|
||||||
|
"instanceName": "שם מופע",
|
||||||
|
"language": "שפה",
|
||||||
|
"lockPassword": "מנע מהמשתמש להחליף סיסמא",
|
||||||
|
"newPassword": "הסיסמא החדשה שלך",
|
||||||
|
"newPasswordConfirm": "אשר את הסיסמה החדשה שלך",
|
||||||
|
"newUser": "משתמש חדש",
|
||||||
|
"password": "סיסמא",
|
||||||
|
"passwordUpdated": "הסיסמא עודכנה!",
|
||||||
|
"path": "נתיב",
|
||||||
|
"perm": {
|
||||||
|
"create": "יצירת קבצים ותיקיות",
|
||||||
|
"delete": "מחיקת קבצים ותיקיות",
|
||||||
|
"download": "הורדת קבצים ותיקיות",
|
||||||
|
"execute": "ביצוע פקודות",
|
||||||
|
"modify": "עריכת קבצים קבצים",
|
||||||
|
"rename": "שינוי שם/העברת קבצים ותיקיות",
|
||||||
|
"share": "שיתוף קבצים"
|
||||||
|
},
|
||||||
|
"permissions": "הרשאות",
|
||||||
|
"permissionsHelp": "אתה יכול להגדיר את המשתמש להיות מנהל מערכת או לבחור את ההרשאות בנפרד. אם תבחר \"מנהל מערכת\", כל ההרשאות יינתנו אוטומטית. ניהול המשתמשים נשאר הרשאה של מנהל מערכת.\n",
|
||||||
|
"profileSettings": "הגדרות פרופיל",
|
||||||
|
"ruleExample1": "מנע גישה לקבצים נסתרים (כל קובץ/תיקייה שמתחיל בנקודה, לדוגמא .git)",
|
||||||
|
"ruleExample2": "חסימת גישה לקובץ בשם Caddyfile בהיקף הראשי.",
|
||||||
|
"rules": "חוקים",
|
||||||
|
"rulesHelp": "כאן אתה יכול להגדיר רשימה של כללים למשתמש ספציפי, רשימה שחורה ולבנה. הקבצים החסומים לא יופיעו ברשימת הקבצים ולא יהיו נגישים למשתמש. יש תמיכה בנתיבים (ביחס לתיקייה הראשית של המשתמש), וגם בביטוי רגולרי.\n",
|
||||||
|
"scope": "היקף",
|
||||||
|
"setDateFormat": "הגדר פורמט תאריך",
|
||||||
|
"settingsUpdated": "ההגדרות עודכנו!",
|
||||||
|
"shareDuration": "משך השיתוף",
|
||||||
|
"shareManagement": "ניהול שיתוף",
|
||||||
|
"shareDeleted": "השיתוף נמחק!",
|
||||||
|
"singleClick": "השתמש בלחיצה בודדת כדי לפתוח קובץ/תיקייה",
|
||||||
|
"themes": {
|
||||||
|
"dark": "כהה",
|
||||||
|
"light": "בהיר",
|
||||||
|
"title": "ערכת נושא"
|
||||||
|
},
|
||||||
|
"user": "משתמש",
|
||||||
|
"userCommands": "פקודות",
|
||||||
|
"userCommandsHelp": "רשימה מופרדת ברווחים של הפקודות הזמינות עבור משתמש זה. דוגמא:\n",
|
||||||
|
"userCreated": "המשתמש נוצר!",
|
||||||
|
"userDefaults": "הגדרות ברירת מחדל למשתמש",
|
||||||
|
"userDeleted": "המשתמש נמחק!",
|
||||||
|
"userManagement": "ניהול משתמש",
|
||||||
|
"userUpdated": "המשתמש עודכן!",
|
||||||
|
"username": "שם משתמש",
|
||||||
|
"users": "משתמשים"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"help": "עזרה",
|
||||||
|
"hugoNew": "הוגו חדש",
|
||||||
|
"login": "התחבר",
|
||||||
|
"logout": "התנתק",
|
||||||
|
"myFiles": "הקבצים שלי",
|
||||||
|
"newFile": "קובץ חדש",
|
||||||
|
"newFolder": "תיקייה חדשה",
|
||||||
|
"preview": "תצוגה מקדימה",
|
||||||
|
"settings": "הגדרות",
|
||||||
|
"signup": "הרשמה",
|
||||||
|
"siteSettings": "הגדרות אתר"
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"linkCopied": "הקישור הועתק!"
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"days": "ימים",
|
||||||
|
"hours": "שעות",
|
||||||
|
"minutes": "דקות",
|
||||||
|
"seconds": "שניות",
|
||||||
|
"unit": "יחידת זמן"
|
||||||
|
}
|
||||||
|
}
|
||||||
273
frontend/src/i18n/hu.json
Normal file
273
frontend/src/i18n/hu.json
Normal file
@@ -0,0 +1,273 @@
|
|||||||
|
{
|
||||||
|
"buttons": {
|
||||||
|
"cancel": "Mégse",
|
||||||
|
"close": "Bezárás",
|
||||||
|
"copy": "Másolás",
|
||||||
|
"copyFile": "Fájl másolása",
|
||||||
|
"copyToClipboard": "Másolás vágólapra",
|
||||||
|
"create": "Létrehozás",
|
||||||
|
"delete": "Törlése",
|
||||||
|
"download": "Letöltés",
|
||||||
|
"file": "Fájl",
|
||||||
|
"folder": "Mappa",
|
||||||
|
"hideDotfiles": "Rejtett fájlok elrejtése",
|
||||||
|
"info": "Infó",
|
||||||
|
"more": "További",
|
||||||
|
"move": "Mozgatás",
|
||||||
|
"moveFile": "Fájl mozgatása",
|
||||||
|
"new": "Új",
|
||||||
|
"next": "Következő",
|
||||||
|
"ok": "OK",
|
||||||
|
"permalink": "Állandó link lekérése",
|
||||||
|
"previous": "Előző",
|
||||||
|
"publish": "Publikálása",
|
||||||
|
"rename": "Átnevezés",
|
||||||
|
"replace": "Csere",
|
||||||
|
"reportIssue": "Hiba jelentése",
|
||||||
|
"save": "Mentés",
|
||||||
|
"schedule": "Ütemezés",
|
||||||
|
"search": "Keresés",
|
||||||
|
"select": "Kijelölés",
|
||||||
|
"selectMultiple": "Többszörös kijelölés",
|
||||||
|
"share": "Megosztás",
|
||||||
|
"shell": "Parancsértelmező átváltása",
|
||||||
|
"submit": "Beküldés",
|
||||||
|
"switchView": "Nézet váltása",
|
||||||
|
"toggleSidebar": "Oldalsáv átváltása",
|
||||||
|
"update": "Frissítés",
|
||||||
|
"upload": "Feltöltés",
|
||||||
|
"openFile": "Fájl megnyitása"
|
||||||
|
},
|
||||||
|
"download": {
|
||||||
|
"downloadFile": "Fájl letöltése",
|
||||||
|
"downloadFolder": "Mappa letöltése",
|
||||||
|
"downloadSelected": "Kijelölés letöltése"
|
||||||
|
},
|
||||||
|
"errors": {
|
||||||
|
"forbidden": "Nincs jogosultsága a hozzáféréshez.",
|
||||||
|
"internal": "Valami nagyon elromlott.",
|
||||||
|
"notFound": "Ez a hely nem érhető el.",
|
||||||
|
"connection": "A kiszolgáló nem érhető el."
|
||||||
|
},
|
||||||
|
"files": {
|
||||||
|
"body": "Törzs",
|
||||||
|
"clear": "Törlése",
|
||||||
|
"closePreview": "Előnézet bezárása",
|
||||||
|
"files": "Fájlok",
|
||||||
|
"folders": "Mappák",
|
||||||
|
"home": "Kezdőlap",
|
||||||
|
"lastModified": "Utoljára módosítva",
|
||||||
|
"loading": "Betöltés…",
|
||||||
|
"lonely": "Ez egy magányos érzés…",
|
||||||
|
"metadata": "Metaadat",
|
||||||
|
"multipleSelectionEnabled": "Többszörös kijelölés aktiválva",
|
||||||
|
"name": "Név",
|
||||||
|
"size": "Méret",
|
||||||
|
"sortByLastModified": "Rendezés utolsó módosítás szerint",
|
||||||
|
"sortByName": "Rendezés név szerint",
|
||||||
|
"sortBySize": "Rendezés méret szerint",
|
||||||
|
"noPreview": "Ehhez a fájlhoz nincs előnézet."
|
||||||
|
},
|
||||||
|
"help": {
|
||||||
|
"click": "mappa vagy fájl kijelölése",
|
||||||
|
"ctrl": {
|
||||||
|
"click": "több mappa vagy fájl kijelölése",
|
||||||
|
"f": "keresés megnyitása",
|
||||||
|
"s": "az aktuális fájl vagy mappa letöltése"
|
||||||
|
},
|
||||||
|
"del": "kijelölt elemek törlése",
|
||||||
|
"doubleClick": "fájl vagy mappa megnyitása",
|
||||||
|
"esc": "kijelölés törlése és/vagy parancssor bezárása",
|
||||||
|
"f1": "ezen információ megjelenítése",
|
||||||
|
"f2": "fájl átnevezése",
|
||||||
|
"help": "Súgó"
|
||||||
|
},
|
||||||
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
|
"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": "Русский",
|
||||||
|
"sk": "Slovenčina",
|
||||||
|
"svSE": "Swedish (Sweden)",
|
||||||
|
"tr": "Türkçe",
|
||||||
|
"ua": "Українська",
|
||||||
|
"zhCN": "中文 (简体)",
|
||||||
|
"zhTW": "中文 (繁體)"
|
||||||
|
},
|
||||||
|
"login": {
|
||||||
|
"createAnAccount": "Fiók létrehozása",
|
||||||
|
"loginInstead": "Már van fiókom",
|
||||||
|
"password": "Jelszó",
|
||||||
|
"passwordConfirm": "Jelszó megerősítése",
|
||||||
|
"passwordsDontMatch": "A jelszavak nem egyeznek",
|
||||||
|
"signup": "Regisztráció",
|
||||||
|
"submit": "Belépés",
|
||||||
|
"username": "Felhasználói név",
|
||||||
|
"usernameTaken": "A felhasználói név már foglalt",
|
||||||
|
"wrongCredentials": "Hibás hitelesítő adatok"
|
||||||
|
},
|
||||||
|
"permanent": "Állandó",
|
||||||
|
"prompts": {
|
||||||
|
"copy": "Másolása",
|
||||||
|
"copyMessage": "Válassza ki a másolás célját:",
|
||||||
|
"currentlyNavigating": "Jelenlegi helyzet:",
|
||||||
|
"deleteMessageMultiple": "Biztosan törölni szeretne {count} fájlt?",
|
||||||
|
"deleteMessageSingle": "Biztosan törölni szeretné ezt a fájl vagy mappát?",
|
||||||
|
"deleteMessageShare": "Biztosan törölni szeretné ezt a megosztást ({path})?",
|
||||||
|
"deleteTitle": "Fájlok törlése",
|
||||||
|
"displayName": "Megjelenített név:",
|
||||||
|
"download": "Fájlok letöltése",
|
||||||
|
"downloadMessage": "Válassza ki a letöltés formátumát.",
|
||||||
|
"error": "Valami rosszul sült el",
|
||||||
|
"fileInfo": "Fájlinformáció",
|
||||||
|
"filesSelected": "{count} fájl van kijelölve.",
|
||||||
|
"lastModified": "Utolsó módosítás",
|
||||||
|
"move": "Mozgatás",
|
||||||
|
"moveMessage": "Válasszon új helyet a fájl(ok)nak/mappá(k)nak:",
|
||||||
|
"newArchetype": "Új bejegyzést hoz létre egy archetípus alapján. A fájl a tartalom mappában jön létre.",
|
||||||
|
"newDir": "Új mappa",
|
||||||
|
"newDirMessage": "Adja meg az új mappa nevét.",
|
||||||
|
"newFile": "Új fájl",
|
||||||
|
"newFileMessage": "Adja meg az új fájl nevét.",
|
||||||
|
"numberDirs": "Mappák száma",
|
||||||
|
"numberFiles": "Fájlok száma",
|
||||||
|
"rename": "Átnevezés",
|
||||||
|
"renameMessage": "Adja meg az új nevét:",
|
||||||
|
"replace": "Csere",
|
||||||
|
"replaceMessage": "Az egyik feltölteni kívánt fájl a neve miatt ütközik. Szeretné lecserélni a meglévő fájlt?\n",
|
||||||
|
"schedule": "Ütemezés",
|
||||||
|
"scheduleMessage": "Válasszon egy dátumot és időpontot a bejegyzés közzétételének ütemezéséhez.",
|
||||||
|
"show": "Megjelenítés",
|
||||||
|
"size": "Méret",
|
||||||
|
"upload": "Feltöltés",
|
||||||
|
"uploadFiles": "{files} fájl feltöltése…",
|
||||||
|
"uploadMessage": "Válasszon egy feltöltési módot.",
|
||||||
|
"optionalPassword": "Választható jelszó"
|
||||||
|
},
|
||||||
|
"search": {
|
||||||
|
"images": "Képek",
|
||||||
|
"music": "Zene",
|
||||||
|
"pdf": "PDF",
|
||||||
|
"pressToSearch": "Keresés indítása Enterrel…",
|
||||||
|
"search": "Keresés…",
|
||||||
|
"typeToSearch": "Keresés indítása beírással…",
|
||||||
|
"types": "Típusok",
|
||||||
|
"video": "Videó"
|
||||||
|
},
|
||||||
|
"settings": {
|
||||||
|
"admin": "Admin",
|
||||||
|
"administrator": "Adminisztrátor",
|
||||||
|
"allowCommands": "Parancsok futtatása",
|
||||||
|
"allowEdit": "Fájlok és mappák szerkesztése, átnevezése és törlése",
|
||||||
|
"allowNew": "Új fájlok és mappák létrehozása",
|
||||||
|
"allowPublish": "Új bejegyzések és oldalak létrehozása",
|
||||||
|
"allowSignup": "Felhasználók regisztrációjának engedélyezése",
|
||||||
|
"avoidChanges": "(üresen hagyva nincs változás)",
|
||||||
|
"branding": "Márkázás",
|
||||||
|
"brandingDirectoryPath": "Márkázás mappaútvonala",
|
||||||
|
"brandingHelp": "Testre szabhatja a File Browser példányának megjelenését a név megváltoztatásával, a logó cseréjével, egyéni stílusok hozzáadásával és még a GitHubra mutató külső hivatkozások letiltásával is.\nAz egyéni márkázással kapcsolatos további információkért tekintse meg: {0}.",
|
||||||
|
"changePassword": "Jelszó módosítása",
|
||||||
|
"commandRunner": "Parancsfuttató",
|
||||||
|
"commandRunnerHelp": "Beállíthatja azokat a parancsokat, amelyek a megnevezett események során végrehajtásra kerülnek. Soronként egyet kell megadni. A {0} és a {1} környezeti változók lesznek elérhetőek, ahol a {0} relatív a {1}-hez. A funkcióról és a rendelkezésre álló környezeti változókról további információ: {2}.",
|
||||||
|
"commandsUpdated": "Parancsok frissítve!",
|
||||||
|
"createUserDir": "Felhasználók saját mappáinak automatikus létrehozása új felhasználók hozzáadásakor",
|
||||||
|
"userHomeBasePath": "Alap elérési útvonal a felhasználók saját mappáihoz",
|
||||||
|
"userScopeGenerationPlaceholder": "A környezet automatikus lesz létrehozva",
|
||||||
|
"createUserHomeDirectory": "Felhasználói saját mappák létrehozása",
|
||||||
|
"customStylesheet": "Egyéni stíluslap",
|
||||||
|
"defaultUserDescription": "Ezek az alapértelmezett beállítások az új felhasználók számára.",
|
||||||
|
"disableExternalLinks": "Külső linkek letiltása (kivéve a dokumentáció)",
|
||||||
|
"documentation": "dokumentáció",
|
||||||
|
"examples": "Példák",
|
||||||
|
"executeOnShell": "Futtatás parancsértelmezőben",
|
||||||
|
"executeOnShellDescription": "Alapértelmezés szerint a File Browser a parancsokat a binárisok közvetlen meghívásával hajtja végre. Ha ehelyett egy parancsértelmezőben (például Bash vagy PowerShell) szeretné futtatni őket, akkor itt definiálhatja azt a szükséges argumentumokkal és jelzőkkel. Ha be van állítva, akkor a végrehajtott parancs argumentumként hozzá lesz csatolva. Ez vonatkozik mind a felhasználói parancsokra, mind az eseményhorgokra.",
|
||||||
|
"globalRules": "Ez egy globális engedélyezési és tiltási szabálykészlet. Ezek minden felhasználóra vonatkoznak. Az egyes felhasználók beállításainál egyedi szabályokat határozhat meg, amelyek felülbírálják ezeket.",
|
||||||
|
"globalSettings": "Általános beállítások",
|
||||||
|
"hideDotfiles": "Rejtett fájlok elrejtése",
|
||||||
|
"insertPath": "Elérési útvonal beszúrása",
|
||||||
|
"insertRegex": "Reguláris kifejezés beszúrása",
|
||||||
|
"instanceName": "Példány neve",
|
||||||
|
"language": "Nyelv",
|
||||||
|
"lockPassword": "Felhasználói jelszó megváltoztatásának megakadályozása",
|
||||||
|
"newPassword": "Új jelszó",
|
||||||
|
"newPasswordConfirm": "Új jelszó ismét",
|
||||||
|
"newUser": "Új felhasználó",
|
||||||
|
"password": "Jelszó",
|
||||||
|
"passwordUpdated": "Jelszó frissítve!",
|
||||||
|
"path": "Elérési útvonal",
|
||||||
|
"perm": {
|
||||||
|
"create": "Fájlok és mappák létrehozása",
|
||||||
|
"delete": "Fájlok és mappák törlése",
|
||||||
|
"download": "Letöltése",
|
||||||
|
"execute": "Parancsok futtatása",
|
||||||
|
"modify": "Fájlok szerkesztése",
|
||||||
|
"rename": "Fájlok és mappák átnevezése vagy mozgatása",
|
||||||
|
"share": "Fájlok megosztása"
|
||||||
|
},
|
||||||
|
"permissions": "Jogosultságok",
|
||||||
|
"permissionsHelp": "A felhasználót beállíthatja rendszergazdának, vagy egyénileg is kiválaszthatja a jogosultságokat. Ha a \"Rendszergazda\" lehetőséget választja, az összes többi opció automatikusan be lesz jelölve. A felhasználók kezelése továbbra is a rendszergazda kiváltsága marad.\n",
|
||||||
|
"profileSettings": "Profilbeállítások",
|
||||||
|
"ruleExample1": "megakadályozza a hozzáférést bármely rejtett fájlhoz (pl. .git, .gitignore) bármely mappában.\n",
|
||||||
|
"ruleExample2": "blokkolja a hozzáférést a Caddyfile nevű fájlhoz a hatókör gyökerében.",
|
||||||
|
"rules": "Szabályok",
|
||||||
|
"rulesHelp": "Meghatározhat egy sor engedélyezési és tiltási szabályt az adott felhasználó számára. A letiltott fájlok nem jelennek meg a listákban, és nem lesznek elérhetőek a felhasználó számára. A reguláris kifejezések és a felhasználói hatókörhöz viszonyított elérési utak támogatottak.\n",
|
||||||
|
"scope": "Hatókör",
|
||||||
|
"setDateFormat": "Pontos dátumformátum beállítása",
|
||||||
|
"settingsUpdated": "Beállítások frissítve!",
|
||||||
|
"shareDuration": "Megosztás időtartama",
|
||||||
|
"shareManagement": "Megosztáskezelés",
|
||||||
|
"shareDeleted": "Megosztás törölve!",
|
||||||
|
"singleClick": "Fájlok és könyvtárak megnyitása egyetlen kattintással",
|
||||||
|
"themes": {
|
||||||
|
"dark": "Sötét",
|
||||||
|
"light": "Világos",
|
||||||
|
"title": "Téma"
|
||||||
|
},
|
||||||
|
"user": "Felhasználó",
|
||||||
|
"userCommands": "Parancsok",
|
||||||
|
"userCommandsHelp": "Egy szóközzel elválasztott lista az adott felhasználó számára elérhető parancsokkal. Példa:\n",
|
||||||
|
"userCreated": "Felhasználó létrehozva!",
|
||||||
|
"userDefaults": "Felhasználói alapértelmezett beállítások",
|
||||||
|
"userDeleted": "Felhasználó törölve!",
|
||||||
|
"userManagement": "Felhasználókezelés",
|
||||||
|
"userUpdated": "Felhasználó frissítve!",
|
||||||
|
"username": "Felhasználói név",
|
||||||
|
"users": "Felhasználók"
|
||||||
|
},
|
||||||
|
"sidebar": {
|
||||||
|
"help": "Súgó",
|
||||||
|
"hugoNew": "Új Hugo",
|
||||||
|
"login": "Belépés",
|
||||||
|
"logout": "Kilépés",
|
||||||
|
"myFiles": "Fájljaim",
|
||||||
|
"newFile": "Új fájl",
|
||||||
|
"newFolder": "Új mappa",
|
||||||
|
"preview": "Előnézet",
|
||||||
|
"settings": "Beállítások",
|
||||||
|
"signup": "Regisztráció",
|
||||||
|
"siteSettings": "Oldalbeállítások"
|
||||||
|
},
|
||||||
|
"success": {
|
||||||
|
"linkCopied": "Link másolva!"
|
||||||
|
},
|
||||||
|
"time": {
|
||||||
|
"days": "Nap",
|
||||||
|
"hours": "Óra",
|
||||||
|
"minutes": "Perc",
|
||||||
|
"seconds": "Másodperc",
|
||||||
|
"unit": "Időegység"
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,8 +1,11 @@
|
|||||||
import Vue from "vue";
|
import Vue from "vue";
|
||||||
import VueI18n from "vue-i18n";
|
import VueI18n from "vue-i18n";
|
||||||
|
|
||||||
|
import he from "./he.json";
|
||||||
|
import hu from "./hu.json";
|
||||||
import ar from "./ar.json";
|
import ar from "./ar.json";
|
||||||
import de from "./de.json";
|
import de from "./de.json";
|
||||||
|
import el from "./el.json";
|
||||||
import en from "./en.json";
|
import en from "./en.json";
|
||||||
import es from "./es.json";
|
import es from "./es.json";
|
||||||
import fr from "./fr.json";
|
import fr from "./fr.json";
|
||||||
@@ -27,9 +30,18 @@ Vue.use(VueI18n);
|
|||||||
export function detectLocale() {
|
export function detectLocale() {
|
||||||
let locale = (navigator.language || navigator.browserLangugae).toLowerCase();
|
let locale = (navigator.language || navigator.browserLangugae).toLowerCase();
|
||||||
switch (true) {
|
switch (true) {
|
||||||
|
case /^he.*/i.test(locale):
|
||||||
|
locale = "he";
|
||||||
|
break;
|
||||||
|
case /^hu.*/i.test(locale):
|
||||||
|
locale = "hu";
|
||||||
|
break;
|
||||||
case /^ar.*/i.test(locale):
|
case /^ar.*/i.test(locale):
|
||||||
locale = "ar";
|
locale = "ar";
|
||||||
break;
|
break;
|
||||||
|
case /^el.*/i.test(locale):
|
||||||
|
locale = "el";
|
||||||
|
break;
|
||||||
case /^es.*/i.test(locale):
|
case /^es.*/i.test(locale):
|
||||||
locale = "es";
|
locale = "es";
|
||||||
break;
|
break;
|
||||||
@@ -96,12 +108,17 @@ const removeEmpty = (obj) =>
|
|||||||
{}
|
{}
|
||||||
);
|
);
|
||||||
|
|
||||||
|
export const rtlLanguages = ["he", "ar"];
|
||||||
|
|
||||||
const i18n = new VueI18n({
|
const i18n = new VueI18n({
|
||||||
locale: detectLocale(),
|
locale: detectLocale(),
|
||||||
fallbackLocale: "en",
|
fallbackLocale: "en",
|
||||||
messages: {
|
messages: {
|
||||||
|
he: removeEmpty(he),
|
||||||
|
hu: removeEmpty(hu),
|
||||||
ar: removeEmpty(ar),
|
ar: removeEmpty(ar),
|
||||||
de: removeEmpty(de),
|
de: removeEmpty(de),
|
||||||
|
el: removeEmpty(el),
|
||||||
en: en,
|
en: en,
|
||||||
es: removeEmpty(es),
|
es: removeEmpty(es),
|
||||||
fr: removeEmpty(fr),
|
fr: removeEmpty(fr),
|
||||||
|
|||||||
@@ -77,6 +77,8 @@
|
|||||||
"help": "Hjálp"
|
"help": "Hjálp"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -176,6 +178,7 @@
|
|||||||
"customStylesheet": "Custom Stylesheet",
|
"customStylesheet": "Custom Stylesheet",
|
||||||
"defaultUserDescription": "Þetta eru sjálfgefnar stillingar fyrir nýja notendur.",
|
"defaultUserDescription": "Þetta eru sjálfgefnar stillingar fyrir nýja notendur.",
|
||||||
"disableExternalLinks": "Sýna ytri-hlekki (fyrir utan leiðbeiningar)",
|
"disableExternalLinks": "Sýna ytri-hlekki (fyrir utan leiðbeiningar)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "leiðbeiningar",
|
"documentation": "leiðbeiningar",
|
||||||
"examples": "Dæmi",
|
"examples": "Dæmi",
|
||||||
"executeOnShell": "Keyra í skel",
|
"executeOnShell": "Keyra í skel",
|
||||||
|
|||||||
@@ -8,7 +8,7 @@
|
|||||||
"create": "Crea",
|
"create": "Crea",
|
||||||
"delete": "Elimina",
|
"delete": "Elimina",
|
||||||
"download": "Scarica",
|
"download": "Scarica",
|
||||||
"hideDotfiles": "",
|
"hideDotfiles": "Nascondi dotfile",
|
||||||
"info": "Informazioni",
|
"info": "Informazioni",
|
||||||
"more": "Altro",
|
"more": "Altro",
|
||||||
"move": "Sposta",
|
"move": "Sposta",
|
||||||
@@ -28,19 +28,19 @@
|
|||||||
"select": "Seleziona",
|
"select": "Seleziona",
|
||||||
"selectMultiple": "Seleziona molteplici",
|
"selectMultiple": "Seleziona molteplici",
|
||||||
"share": "Condividi",
|
"share": "Condividi",
|
||||||
"shell": "Toggle shell",
|
"shell": "Mostra/nascondi 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"
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"downloadFile": "Download File",
|
"downloadFile": "Scarica file",
|
||||||
"downloadFolder": "Download Folder",
|
"downloadFolder": "Scarica cartella",
|
||||||
"downloadSelected": ""
|
"downloadSelected": "Scarica selezionati"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"forbidden": "You don't have permissions to access this.",
|
"forbidden": "Non hai i permessi per accedere a questo file.",
|
||||||
"internal": "Qualcosa è andato veramente male.",
|
"internal": "Qualcosa è andato veramente male.",
|
||||||
"notFound": "Questo percorso non può essere raggiunto."
|
"notFound": "Questo percorso non può essere raggiunto."
|
||||||
},
|
},
|
||||||
@@ -48,16 +48,16 @@
|
|||||||
"body": "Contenuto",
|
"body": "Contenuto",
|
||||||
"clear": "Cancella",
|
"clear": "Cancella",
|
||||||
"closePreview": "Chiudi anteprima",
|
"closePreview": "Chiudi anteprima",
|
||||||
"files": "Files",
|
"files": "File",
|
||||||
"folders": "Cartelle",
|
"folders": "Cartelle",
|
||||||
"home": "Home",
|
"home": "Home",
|
||||||
"lastModified": "Ultima modifica",
|
"lastModified": "Ultima modifica",
|
||||||
"loading": "Caricamento...",
|
"loading": "Caricamento...",
|
||||||
"lonely": "Ci si sente soli qui...",
|
"lonely": "Ci si sente soli qui...",
|
||||||
"metadata": "Metadata",
|
"metadata": "Metadati",
|
||||||
"multipleSelectionEnabled": "Selezione multipla attivata",
|
"multipleSelectionEnabled": "Selezione multipla attivata",
|
||||||
"name": "Nome",
|
"name": "Nome",
|
||||||
"size": "Grandezza",
|
"size": "Dimensione",
|
||||||
"sortByLastModified": "Ordina per ultima modifica",
|
"sortByLastModified": "Ordina per ultima modifica",
|
||||||
"sortByName": "Ordina per nome",
|
"sortByName": "Ordina per nome",
|
||||||
"sortBySize": "Ordina per dimensione"
|
"sortBySize": "Ordina per dimensione"
|
||||||
@@ -77,6 +77,8 @@
|
|||||||
"help": "Aiuto"
|
"help": "Aiuto"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -100,15 +102,15 @@
|
|||||||
"zhTW": "中文 (繁體)"
|
"zhTW": "中文 (繁體)"
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"createAnAccount": "Create an account",
|
"createAnAccount": "Crea un account",
|
||||||
"loginInstead": "Already have an account",
|
"loginInstead": "Hai già un account",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"passwordConfirm": "Password Confirmation",
|
"passwordConfirm": "Conferma password",
|
||||||
"passwordsDontMatch": "Passwords don't match",
|
"passwordsDontMatch": "Le password non corrispondono",
|
||||||
"signup": "Signup",
|
"signup": "Registrati",
|
||||||
"submit": "Entra",
|
"submit": "Entra",
|
||||||
"username": "Nome utente",
|
"username": "Nome utente",
|
||||||
"usernameTaken": "Username already taken",
|
"usernameTaken": "Username già usato",
|
||||||
"wrongCredentials": "Credenziali errate"
|
"wrongCredentials": "Credenziali errate"
|
||||||
},
|
},
|
||||||
"permanent": "Permanente",
|
"permanent": "Permanente",
|
||||||
@@ -116,10 +118,10 @@
|
|||||||
"copy": "Copia",
|
"copy": "Copia",
|
||||||
"copyMessage": "Seleziona la cartella in cui copiare i file:",
|
"copyMessage": "Seleziona la cartella in cui copiare i file:",
|
||||||
"currentlyNavigating": "Attualmente navigando su:",
|
"currentlyNavigating": "Attualmente navigando su:",
|
||||||
"deleteMessageMultiple": "Sei sicuro di voler eliminare {count} file(s)?",
|
"deleteMessageMultiple": "Sei sicuro di voler eliminare {count} file?",
|
||||||
"deleteMessageSingle": "Sei sicuro di voler eliminare questo file/cartella?",
|
"deleteMessageSingle": "Sei sicuro di voler eliminare questo file/cartella?",
|
||||||
"deleteTitle": "Elimina",
|
"deleteTitle": "Elimina",
|
||||||
"displayName": "Nome Mostrato:",
|
"displayName": "Nome visualizzato:",
|
||||||
"download": "Scarica files",
|
"download": "Scarica files",
|
||||||
"downloadMessage": "Seleziona il formato che vuoi scaricare.",
|
"downloadMessage": "Seleziona il formato che vuoi scaricare.",
|
||||||
"error": "Qualcosa è andato per il verso storto",
|
"error": "Qualcosa è andato per il verso storto",
|
||||||
@@ -134,7 +136,7 @@
|
|||||||
"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 file",
|
||||||
"rename": "Rinomina",
|
"rename": "Rinomina",
|
||||||
"renameMessage": "Inserisci un nuovo nome per",
|
"renameMessage": "Inserisci un nuovo nome per",
|
||||||
"replace": "Sostituisci",
|
"replace": "Sostituisci",
|
||||||
@@ -142,17 +144,17 @@
|
|||||||
"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",
|
||||||
"show": "Mostra",
|
"show": "Mostra",
|
||||||
"size": "Grandezza",
|
"size": "Dimensione",
|
||||||
"upload": "",
|
"upload": "Carica",
|
||||||
"uploadMessage": ""
|
"uploadMessage": "Seleziona un'opzione per il caricamento."
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"images": "Immagini",
|
"images": "Immagini",
|
||||||
"music": "Musica",
|
"music": "Musica",
|
||||||
"pdf": "PDF",
|
"pdf": "PDF",
|
||||||
"pressToSearch": "Press enter to search...",
|
"pressToSearch": "Premi Invio per cercare...",
|
||||||
"search": "Cerca...",
|
"search": "Cerca...",
|
||||||
"typeToSearch": "Type to search...",
|
"typeToSearch": "Scrivi per cercare...",
|
||||||
"types": "Tipi",
|
"types": "Tipi",
|
||||||
"video": "Video"
|
"video": "Video"
|
||||||
},
|
},
|
||||||
@@ -163,29 +165,30 @@
|
|||||||
"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",
|
"allowSignup": "Permetti agli utenti di registrarsi",
|
||||||
"avoidChanges": "(lascia vuoto per evitare cambiamenti)",
|
"avoidChanges": "(lascia vuoto per evitare cambiamenti)",
|
||||||
"branding": "Branding",
|
"branding": "Branding",
|
||||||
"brandingDirectoryPath": "Branding directory path",
|
"brandingDirectoryPath": "Directory del branding",
|
||||||
"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}.",
|
"brandingHelp": "Puoi personalizzare l'aspetto e il comportamento di File Browser cambiando il suo nome, logo, aggiungendo stili personalizzati e anche disabilitando link esterni verso GitHub.\nPer altre informazioni sul branding personalizzato, vai alla {0}.",
|
||||||
"changePassword": "Modifica password",
|
"changePassword": "Modifica password",
|
||||||
"commandRunner": "Command runner",
|
"commandRunner": "Esecutore di comandi",
|
||||||
"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": "Qui puoi impostare i comandi da eseguire negli eventi nominati. Ne devi scrivere uno per riga. Le variabili d'ambiente {0} e {1} sono disponibili, essendo {0} relativo a {1}. Per altre informazioni su questa funzionalità e sulle variabili d'ambiente utilizzabili, leggi la {2}.",
|
||||||
"commandsUpdated": "Comandi aggiornati!",
|
"commandsUpdated": "Comandi aggiornati!",
|
||||||
"createUserDir": "Auto create user home dir while adding new user",
|
"createUserDir": "Crea automaticamente la home directory dell'utente quando lo aggiungi",
|
||||||
"customStylesheet": "Folgio di stile personalizzato",
|
"customStylesheet": "Foglio di stile personalizzato",
|
||||||
"defaultUserDescription": "This are the default settings for new users.",
|
"defaultUserDescription": "Queste sono le impostazioni predefinite per i nuovi utenti.",
|
||||||
"disableExternalLinks": "Disable external links (except documentation)",
|
"disableExternalLinks": "Disabilita link esterni (tranne per la documentazione)",
|
||||||
"documentation": "documentation",
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
|
"documentation": "documentazione",
|
||||||
"examples": "Esempi",
|
"examples": "Esempi",
|
||||||
"executeOnShell": "Execute on shell",
|
"executeOnShell": "Esegui nella 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.",
|
"executeOnShellDescription": "Di default File Browser esegue i comandi chiamando direttamente i loro binari. Se invece vuoi eseguirli su una shell (come Bash o PowerShell), puoi definirli qui con gli argomenti e i flag richiesti. Se impostato, il comando che esegui sarà concatenato come argomento. Questo si applica sia ai comandi utente che agli hook di eventi.",
|
||||||
"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.",
|
"globalRules": "Questo è un insieme globale di regole permetti/nega, che si applicano ad ogni utente. Puoi definire regole specifiche per ogni utente, per sovrascrivere queste.",
|
||||||
"globalSettings": "Impostazioni Globali",
|
"globalSettings": "Impostazioni globali",
|
||||||
"hideDotfiles": "",
|
"hideDotfiles": "Nascondi dotfile",
|
||||||
"insertPath": "Insert the path",
|
"insertPath": "Inserisci il percorso",
|
||||||
"insertRegex": "Insert regex expression",
|
"insertRegex": "Inserisci la regex",
|
||||||
"instanceName": "Instance name",
|
"instanceName": "Nome dell'istanza",
|
||||||
"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",
|
||||||
@@ -193,38 +196,38 @@
|
|||||||
"newUser": "Nuovo utente",
|
"newUser": "Nuovo utente",
|
||||||
"password": "Password",
|
"password": "Password",
|
||||||
"passwordUpdated": "Password aggiornata!",
|
"passwordUpdated": "Password aggiornata!",
|
||||||
"path": "",
|
"path": "Percorso",
|
||||||
"perm": {
|
"perm": {
|
||||||
"create": "Create files and directories",
|
"create": "Creare file e cartelle",
|
||||||
"delete": "Delete files and directories",
|
"delete": "Eliminare file e cartelle",
|
||||||
"download": "Download",
|
"download": "Scaricare",
|
||||||
"execute": "Execute commands",
|
"execute": "Eseguire comandi",
|
||||||
"modify": "Edit files",
|
"modify": "Modificare file",
|
||||||
"rename": "Rename or move files and directories",
|
"rename": "Rinominare o spostare file e cartelle",
|
||||||
"share": "Share files"
|
"share": "Condividere file"
|
||||||
},
|
},
|
||||||
"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",
|
||||||
"ruleExample1": "Impedisci l'accesso a qualsiasi file avente come prefisso un punto\n (ad esempio .git, .gitignore) presente in ogni cartella.\n",
|
"ruleExample1": "impedisci l'accesso a qualsiasi file avente come prefisso un punto\n (ad esempio .git, .gitignore) presente in ogni cartella.\n",
|
||||||
"ruleExample2": "blocca l'accesso al file denominato Caddyfile nella radice del campo di applicazione.",
|
"ruleExample2": "blocca l'accesso al file denominato Caddyfile nella radice del campo di applicazione.",
|
||||||
"rules": "Regole",
|
"rules": "Regole",
|
||||||
"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": "Scope",
|
||||||
"settingsUpdated": "Impostazioni aggiornate!",
|
"settingsUpdated": "Impostazioni aggiornate!",
|
||||||
"shareDuration": "",
|
"shareDuration": "Durata della condivisione",
|
||||||
"shareManagement": "",
|
"shareManagement": "Gestione delle condivisioni",
|
||||||
"singleClick": "",
|
"singleClick": "Usa un singolo click per aprire file e cartelle",
|
||||||
"themes": {
|
"themes": {
|
||||||
"dark": "",
|
"dark": "Scuro",
|
||||||
"light": "",
|
"light": "Chiaro",
|
||||||
"title": ""
|
"title": "Tema"
|
||||||
},
|
},
|
||||||
"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",
|
"userDefaults": "Impostazioni predefinite utente",
|
||||||
"userDeleted": "Utente eliminato!",
|
"userDeleted": "Utente eliminato!",
|
||||||
"userManagement": "Gestione degli utenti",
|
"userManagement": "Gestione degli utenti",
|
||||||
"userUpdated": "Utente aggiornato!",
|
"userUpdated": "Utente aggiornato!",
|
||||||
@@ -241,8 +244,8 @@
|
|||||||
"newFolder": "Nuova cartella",
|
"newFolder": "Nuova cartella",
|
||||||
"preview": "Anteprima",
|
"preview": "Anteprima",
|
||||||
"settings": "Impostazioni",
|
"settings": "Impostazioni",
|
||||||
"signup": "Signup",
|
"signup": "Registrati",
|
||||||
"siteSettings": "Impostaizoni del sito"
|
"siteSettings": "Impostazioni del sito"
|
||||||
},
|
},
|
||||||
"success": {
|
"success": {
|
||||||
"linkCopied": "Link copiato!"
|
"linkCopied": "Link copiato!"
|
||||||
|
|||||||
@@ -3,255 +3,282 @@
|
|||||||
"cancel": "キャンセル",
|
"cancel": "キャンセル",
|
||||||
"close": "閉じる",
|
"close": "閉じる",
|
||||||
"copy": "コピー",
|
"copy": "コピー",
|
||||||
"copyFile": "ファイルをコピー",
|
"copyFile": "ファイルのコピー",
|
||||||
"copyToClipboard": "クリップボードにコピー",
|
"copyToClipboard": "共有リンクをコピー",
|
||||||
|
"copyDownloadLinkToClipboard": "ダウンロードリンクをコピー",
|
||||||
"create": "作成",
|
"create": "作成",
|
||||||
"delete": "削除",
|
"delete": "削除",
|
||||||
"download": "ダウンロード",
|
"download": "ダウンロード",
|
||||||
"hideDotfiles": "",
|
"file": "ファイル",
|
||||||
|
"folder": "フォルダー",
|
||||||
|
"hideDotfiles": "ドットで始まるファイルを表示しない",
|
||||||
"info": "情報",
|
"info": "情報",
|
||||||
"more": "More",
|
"more": "さらに",
|
||||||
"move": "移動",
|
"move": "移動",
|
||||||
"moveFile": "ファイルを移動",
|
"moveFile": "ファイルの移動",
|
||||||
"new": "新規",
|
"new": "新規",
|
||||||
"next": "次",
|
"next": "次へ",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"permalink": "固定リンク",
|
"permalink": "パーマリンクを取得",
|
||||||
"previous": "前",
|
"previous": "前へ",
|
||||||
"publish": "発表",
|
"publish": "公開",
|
||||||
"rename": "名前を変更",
|
"rename": "名前の変更",
|
||||||
"replace": "置き換える",
|
"replace": "置換する",
|
||||||
"reportIssue": "問題を報告",
|
"reportIssue": "問題を報告",
|
||||||
"save": "保存",
|
"save": "保存",
|
||||||
"schedule": "スケジュール",
|
"schedule": "スケジュール",
|
||||||
"search": "検索",
|
"search": "検索",
|
||||||
"select": "選択",
|
"select": "選択",
|
||||||
"selectMultiple": "複数選択",
|
"selectMultiple": "複数選択",
|
||||||
"share": "シェア",
|
"share": "共有",
|
||||||
"shell": "Toggle shell",
|
"shell": "シェルの切り替え",
|
||||||
"switchView": "表示を切り替わる",
|
"submit": "送信",
|
||||||
"toggleSidebar": "サイドバーを表示する",
|
"switchView": "表示の切り替え",
|
||||||
|
"toggleSidebar": "サイドバーの切り替え",
|
||||||
"update": "更新",
|
"update": "更新",
|
||||||
"upload": "アップロード"
|
"upload": "アップロード",
|
||||||
|
"openFile": "ファイルを開く",
|
||||||
|
"continue": "続行"
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"downloadFile": "Download File",
|
"downloadFile": "ファイルのダウンロード",
|
||||||
"downloadFolder": "Download Folder",
|
"downloadFolder": "フォルダーのダウンロード",
|
||||||
"downloadSelected": ""
|
"downloadSelected": "選択した項目のダウンロード"
|
||||||
|
},
|
||||||
|
"upload": {
|
||||||
|
"abortUpload": "アップロードをキャンセルしますか?"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"forbidden": "You don't have permissions to access this.",
|
"forbidden": "これにアクセスする権限がありません。",
|
||||||
"internal": "内部エラーが発生しました。",
|
"internal": "内部エラーが発生しました。",
|
||||||
"notFound": "リソースが見つからなりませんでした。"
|
"notFound": "リソースが見つかりませんでした。",
|
||||||
|
"connection": "サーバーに接続できませんでした。"
|
||||||
},
|
},
|
||||||
"files": {
|
"files": {
|
||||||
"body": "本文",
|
"body": "本文",
|
||||||
"clear": "クリアー",
|
"clear": "消去",
|
||||||
"closePreview": "プレビューを閉じる",
|
"closePreview": "プレビューを閉じる",
|
||||||
"files": "ファイル",
|
"files": "ファイル",
|
||||||
"folders": "フォルダ",
|
"folders": "フォルダー",
|
||||||
"home": "ホーム",
|
"home": "ホーム",
|
||||||
"lastModified": "最終変更",
|
"lastModified": "更新日時",
|
||||||
"loading": "ローディング...",
|
"loading": "読み込み中…",
|
||||||
"lonely": "ここには何もない...",
|
"lonely": "ここには何もないようです…",
|
||||||
"metadata": "メタデータ",
|
"metadata": "メタデータ",
|
||||||
"multipleSelectionEnabled": "複数選択有効",
|
"multipleSelectionEnabled": "複数選択が有効になっています",
|
||||||
"name": "名前",
|
"name": "名前",
|
||||||
"size": "サイズ",
|
"size": "サイズ",
|
||||||
"sortByLastModified": "最終変更日付によるソート",
|
"sortByLastModified": "更新日時で並べ替え",
|
||||||
"sortByName": "名前によるソート",
|
"sortByName": "名前で並べ替え",
|
||||||
"sortBySize": "サイズによるソート"
|
"sortBySize": "サイズで並べ替え",
|
||||||
|
"noPreview": "プレビューはこのファイルでは利用できません"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"click": "ファイルやディレクトリを選択",
|
"click": "ファイルやフォルダーを選択",
|
||||||
"ctrl": {
|
"ctrl": {
|
||||||
"click": "複数のファイルやディレクトリを選択",
|
"click": "複数のファイルやフォルダーを選択",
|
||||||
"f": "検索を有効にする",
|
"f": "検索画面を開く",
|
||||||
"s": "ファイルを保存またはカレントディレクトリをダウンロード"
|
"s": "現在のフォルダーにあるファイルを保存またはダウンロード"
|
||||||
},
|
},
|
||||||
"del": "選択した項目を削除",
|
"del": "選択した項目を削除",
|
||||||
"doubleClick": "ファイルやディレクトリをオープン",
|
"doubleClick": "ファイルやフォルダーを開く",
|
||||||
"esc": "選択をクリアーまたはプロンプトを閉じる",
|
"esc": "選択を解除/ダイアログを閉じる",
|
||||||
"f1": "このヘルプを表示",
|
"f1": "ヘルプを表示",
|
||||||
"f2": "ファイルの名前を変更",
|
"f2": "ファイルの名前を変更",
|
||||||
"help": "ヘルプ"
|
"help": "ヘルプ"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
|
"el": "Ελληνικά",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
"es": "Español",
|
"es": "Español",
|
||||||
"fr": "Français",
|
"fr": "Français",
|
||||||
"is": "",
|
"is": "Icelandic",
|
||||||
"it": "Italiano",
|
"it": "Italiano",
|
||||||
"ja": "日本語",
|
"ja": "日本語",
|
||||||
"ko": "한국어",
|
"ko": "한국어",
|
||||||
"nlBE": "",
|
"nlBE": "Dutch (Belgium)",
|
||||||
"pl": "Polski",
|
"pl": "Polski",
|
||||||
"pt": "Português",
|
"pt": "Português",
|
||||||
"ptBR": "Português (Brasil)",
|
"ptBR": "Português (Brasil)",
|
||||||
"ro": "",
|
"ro": "Romanian",
|
||||||
"ru": "Русский",
|
"ru": "Русский",
|
||||||
"sk": "Slovenčina",
|
"sk": "Slovenčina",
|
||||||
"svSE": "",
|
"svSE": "Swedish (Sweden)",
|
||||||
"tr" : "Türkçe",
|
"tr": "Türkçe",
|
||||||
"ua": "Українська",
|
"ua": "Українська",
|
||||||
"zhCN": "中文 (简体)",
|
"zhCN": "中文 (简体)",
|
||||||
"zhTW": "中文 (繁體)"
|
"zhTW": "中文 (繁體)"
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"createAnAccount": "Create an account",
|
"createAnAccount": "アカウントを作成",
|
||||||
"loginInstead": "Already have an account",
|
"loginInstead": "ログインする",
|
||||||
"password": "パスワード",
|
"password": "パスワード",
|
||||||
"passwordConfirm": "Password Confirmation",
|
"passwordConfirm": "パスワード(確認用)",
|
||||||
"passwordsDontMatch": "Passwords don't match",
|
"passwordsDontMatch": "パスワードが一致しません",
|
||||||
"signup": "Signup",
|
"signup": "アカウント作成",
|
||||||
"submit": "ログイン",
|
"submit": "ログイン",
|
||||||
"username": "ユーザ名",
|
"username": "ユーザー名",
|
||||||
"usernameTaken": "Username already taken",
|
"usernameTaken": "ユーザー名はすでに取得されています",
|
||||||
"wrongCredentials": "ユーザ名またはパスワードが間違っています。"
|
"wrongCredentials": "ユーザー名またはパスワードが間違っています"
|
||||||
},
|
},
|
||||||
"permanent": "永久",
|
"permanent": "永久",
|
||||||
"prompts": {
|
"prompts": {
|
||||||
"copy": "コピー",
|
"copy": "コピー",
|
||||||
"copyMessage": "コピーの目標ディレクトリを選択してください:",
|
"copyMessage": "ファイルをコピーする場所を選択してください:",
|
||||||
"currentlyNavigating": "現在閲覧しているディレクトリ:",
|
"currentlyNavigating": "現在閲覧しているディレクトリ:",
|
||||||
"deleteMessageMultiple": "{count} つのファイルを本当に削除してよろしいですか。",
|
"deleteMessageMultiple": "{count} 個のファイルを削除してもよろしいですか?",
|
||||||
"deleteMessageSingle": "このファイル/フォルダを本当に削除してよろしいですか。",
|
"deleteMessageSingle": "このファイル/フォルダーを削除してもよろしいですか?",
|
||||||
"deleteTitle": "ファイルを削除",
|
"deleteMessageShare": "共有中のファイル({path})を削除してもよろしいですか?",
|
||||||
"displayName": "名前:",
|
"deleteTitle": "ファイルの削除",
|
||||||
"download": "ファイルをダウンロード",
|
"displayName": "表示名:",
|
||||||
"downloadMessage": "圧縮形式を選択してください。",
|
"download": "ファイルのダウンロード",
|
||||||
"error": "あるエラーが発生しました。",
|
"downloadMessage": "ダウンロードする際の圧縮形式を選んでください:",
|
||||||
|
"error": "エラーが発生しました",
|
||||||
"fileInfo": "ファイル情報",
|
"fileInfo": "ファイル情報",
|
||||||
"filesSelected": "{count} つのファイルは選択されました。",
|
"filesSelected": "{count} 個のファイル/フォルダーが選択されています",
|
||||||
"lastModified": "最終変更",
|
"lastModified": "更新日時",
|
||||||
"move": "移動",
|
"move": "移動",
|
||||||
"moveMessage": "移動の目標ディレクトリを選択してください:",
|
"moveMessage": "ファイル/フォルダーの新しいハウスを選択してください:",
|
||||||
"newArchetype": "ある元型に基づいて新しいポストを作成します。ファイルは コンテンツフォルダに作成されます。",
|
"newArchetype": "archetype に基づいて新しい投稿を作成します。ファイルは content フォルダーに作成されます。",
|
||||||
"newDir": "新しいディレクトリを作成",
|
"newDir": "新規フォルダー",
|
||||||
"newDirMessage": "新しいディレクトリの名前を入力してください。",
|
"newDirMessage": "フォルダーの名前を入力してください:",
|
||||||
"newFile": "新しいファイルを作成",
|
"newFile": "新規ファイル",
|
||||||
"newFileMessage": "新しいファイルの名前を入力してください。",
|
"newFileMessage": "ファイルの名前を入力してください:",
|
||||||
"numberDirs": "ディレクトリ個数",
|
"numberDirs": "ディレクトリの数",
|
||||||
"numberFiles": "ファイル個数",
|
"numberFiles": "ファイルの数",
|
||||||
"rename": "名前を変更",
|
"rename": "名前変更",
|
||||||
"renameMessage": "名前を変更しようファイルは:",
|
"renameMessage": "変更後のファイルの名前を入力してください",
|
||||||
"replace": "置き換える",
|
"replace": "ファイルの置き換え",
|
||||||
"replaceMessage": "アップロードするファイルの中でかち合う名前が一つあります。 既存のファイルを置き換えりませんか。\n",
|
"replaceMessage": "アップロードしようとしているファイルと既存のファイルの名前が重複しています。既存のものを置き換えずにアップロードを続けるか、既存のものを置き換えますか?\n",
|
||||||
"schedule": "スケジュール",
|
"schedule": "スケジュール",
|
||||||
"scheduleMessage": "このポストの発表日付をスケジュールしてください。",
|
"scheduleMessage": "この投稿の公開予定日時を選んでください。",
|
||||||
"show": "表示",
|
"show": "表示",
|
||||||
"size": "サイズ",
|
"size": "サイズ",
|
||||||
"upload": "",
|
"upload": "アップロード",
|
||||||
"uploadMessage": ""
|
"uploadFiles": "{files} 個のファイルをアップロードしています…",
|
||||||
|
"uploadMessage": "アップロードするオプションを選択してください。",
|
||||||
|
"optionalPassword": "パスワード(オプション)"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"images": "画像",
|
"images": "画像",
|
||||||
"music": "音楽",
|
"music": "音楽",
|
||||||
"pdf": "PDF",
|
"pdf": "PDF",
|
||||||
"pressToSearch": "Press enter to search...",
|
"pressToSearch": "エンターを押して検索します",
|
||||||
"search": "検索...",
|
"search": "検索",
|
||||||
"typeToSearch": "Type to search...",
|
"typeToSearch": "検索の種類",
|
||||||
"types": "種類",
|
"types": "ファイルの種類",
|
||||||
"video": "ビデオ"
|
"video": "動画"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"admin": "管理者",
|
"admin": "管理者",
|
||||||
"administrator": "管理者",
|
"administrator": "管理者",
|
||||||
"allowCommands": "コマンドの実行",
|
"allowCommands": "コマンドの実行",
|
||||||
"allowEdit": "ファイルやディレクトリの編集、名前変更と削除",
|
"allowEdit": "ファイルやフォルダーの編集、名前の変更、削除",
|
||||||
"allowNew": "ファイルとディレクトリの作成",
|
"allowNew": "ファイルやフォルダーの新規作成",
|
||||||
"allowPublish": "ポストとぺーじの発表",
|
"allowPublish": "新しい投稿やページの公開",
|
||||||
"allowSignup": "Allow users to signup",
|
"allowSignup": "ユーザーの新規登録を許可",
|
||||||
"avoidChanges": "(変更を避けるために空白にしてください)",
|
"avoidChanges": "(変更しない場合は空白のままにしてください)",
|
||||||
"branding": "Branding",
|
"branding": "ブランディング",
|
||||||
"brandingDirectoryPath": "Branding directory path",
|
"brandingDirectoryPath": "ブランディングのディレクトリへのパス",
|
||||||
"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}.",
|
"brandingHelp": "インスタンスの名前の変更、ロゴの変更、カスタムスタイルの追加、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": "ここでは、指定したイベントの際に実行されるコマンドを設定することができます。1行に1つずつ書く必要があります。環境変数として {0} や {1} が使用可能で、{0} は {1} に関連した変数として扱われます。この機能と使用可能な環境変数の詳細については、{2}をお読みください。",
|
||||||
"commandsUpdated": "コマンドは更新されました!",
|
"commandsUpdated": "コマンドを更新しました!",
|
||||||
"createUserDir": "Auto create user home dir while adding new user",
|
"createUserDir": "新規ユーザー追加時にユーザーのホームディレクトリを自動生成する",
|
||||||
"customStylesheet": "カスタムスタイルシ ート",
|
"tusUploads": "チャンクされたファイルアップロード",
|
||||||
"defaultUserDescription": "This are the default settings for new users.",
|
"tusUploadsHelp": "File Browser はチャンクされたファイルアップロードをサポートしており、信頼性の低いネットワーク上でも、効率的で信頼性の高い、再開可能なチャンクされたファイルアップロードを作成することができます。",
|
||||||
"disableExternalLinks": "Disable external links (except documentation)",
|
"tusUploadsChunkSize": "1チャンクあたりのリクエストの最大サイズ。バイト数を示す整数か、10MB、1GBなどの文字列を入力できます。",
|
||||||
"documentation": "documentation",
|
"tusUploadsRetryCount": "チャンクのアップロードに失敗した場合の再試行回数。",
|
||||||
|
"userHomeBasePath": "ユーザーのホームディレクトリのベースパス",
|
||||||
|
"userScopeGenerationPlaceholder": "スコープは自動生成されます",
|
||||||
|
"createUserHomeDirectory": "ユーザーのホームディレクトリを作成する",
|
||||||
|
"customStylesheet": "カスタムスタイルシート",
|
||||||
|
"defaultUserDescription": "これらは新規ユーザーのデフォルト設定です。",
|
||||||
|
"disableExternalLinks": "外部リンクを無効にする(ドキュメントへのリンクを除く)",
|
||||||
|
"disableUsedDiskPercentage": "ディスク使用率のグラフを無効にする",
|
||||||
|
"documentation": "ドキュメント",
|
||||||
"examples": "例",
|
"examples": "例",
|
||||||
"executeOnShell": "Execute on shell",
|
"executeOnShell": "シェルで実行する",
|
||||||
"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.",
|
"executeOnShellDescription": "デフォルトでは、File Browser はバイナリを直接呼び出してコマンドを実行します。代わりにシェル(Bash や PowerShell など)で実行したい場合は、必要な引数やフラグをここで指定します。値が指定されている場合、実行するコマンドが引数として追加されます。これは、ユーザーコマンドとイベントフックの両方に適用されます。",
|
||||||
"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.",
|
"globalRules": "これはグローバルな許可と不許可のルールセットです。これはすべてのユーザーに適用されます。ユーザーごとに特定のルールを設定することで、これらのルールを上書きすることができます。",
|
||||||
"globalSettings": "グローバル設定",
|
"globalSettings": "グローバル設定",
|
||||||
"hideDotfiles": "",
|
"hideDotfiles": "ドットで始まるファイルを表示しない",
|
||||||
"insertPath": "Insert the path",
|
"insertPath": "パスを入力してください",
|
||||||
"insertRegex": "Insert regex expression",
|
"insertRegex": "正規表現を入力してください",
|
||||||
"instanceName": "Instance name",
|
"instanceName": "インスタンス名",
|
||||||
"language": "言語",
|
"language": "言語",
|
||||||
"lockPassword": "新しいパスワードを変更に禁止",
|
"lockPassword": "ユーザーがパスワードを変更できないようにする",
|
||||||
"newPassword": "新しいパスワード",
|
"newPassword": "新しいパスワード",
|
||||||
"newPasswordConfirm": "新しいパスワードを確認します",
|
"newPasswordConfirm": "新しいパスワード(再入力)",
|
||||||
"newUser": "新しいユーザー",
|
"newUser": "新規ユーザー作成",
|
||||||
"password": "パスワード",
|
"password": "パスワード",
|
||||||
"passwordUpdated": "パスワードは更新されました!",
|
"passwordUpdated": "パスワードを更新しました!",
|
||||||
"path": "",
|
"path": "パス",
|
||||||
"perm": {
|
"perm": {
|
||||||
"create": "Create files and directories",
|
"create": "ファイルやフォルダーの作成",
|
||||||
"delete": "Delete files and directories",
|
"delete": "ファイルやフォルダーの削除",
|
||||||
"download": "Download",
|
"download": "ダウンロード",
|
||||||
"execute": "Execute commands",
|
"execute": "コマンドの実行",
|
||||||
"modify": "Edit files",
|
"modify": "ファイルの編集",
|
||||||
"rename": "Rename or move files and directories",
|
"rename": "ファイルやフォルダーの編集・移動",
|
||||||
"share": "Share files"
|
"share": "ファイルの共有"
|
||||||
},
|
},
|
||||||
"permissions": "権限",
|
"permissions": "権限",
|
||||||
"permissionsHelp": "あなたはユーザーを管理者に設定し、または権限を個々に設定しできます。\"管理者\"を選択する場合、その他のすべての選択肢は自動的に設定されます。ユーザーの管理は管理者の権限として保留されました。",
|
"permissionsHelp": "ユーザーを管理者に設定するか、その他の権限を個別に選択することができます。「管理者」を選択すると、他のオプションはすべて自動的にチェックされます。ユーザーを管理するには管理者権限が必要です。\n",
|
||||||
"profileSettings": "プロファイル設定",
|
"profileSettings": "プロフィール設定",
|
||||||
"ruleExample1": "各フォルダに名前はドットで始まるファイル(例えば、.git、.gitignore)へのアクセスを制限します。",
|
"ruleExample1": ".git や .gitignore のようなドットから始まるファイルへのアクセスを禁止します。\n",
|
||||||
"ruleExample2": "範囲のルートパスに名前は Caddyfile のファイルへのアクセスを制限します。",
|
"ruleExample2": "スコープのルートにある Caddyfile という名前のファイルへのアクセスを禁止します。",
|
||||||
"rules": "規則",
|
"rules": "ルール",
|
||||||
"rulesHelp": "ここに、あなたはこのユーザーの許可または拒否規則を設定できます。ブロックされたファイルはリストに表示されません、それではアクセスも制限されます。正規表現(regex)のサポートと範囲に相対のパスが提供されています。",
|
"rulesHelp": "ここでは、特定のユーザーに対して許可と不許可のルールを設定することができます。ブロックされたファイルはリストに表示されず、ユーザはアクセスできなくなります。正規表現とユーザースコープからの相対パスをサポートしています。\n",
|
||||||
"scope": "範囲",
|
"scope": "スコープ",
|
||||||
"settingsUpdated": "設定は更新されました!",
|
"setDateFormat": "正確な日時表記を使用する",
|
||||||
"shareDuration": "",
|
"settingsUpdated": "設定を更新しました!",
|
||||||
"shareManagement": "",
|
"shareDuration": "共有期間",
|
||||||
"singleClick": "",
|
"shareManagement": "共有の管理",
|
||||||
|
"shareDeleted": "ファイルの共有を削除しました!",
|
||||||
|
"singleClick": "ダブルクリックの代わりにクリックでファイルやフォルダーを開く",
|
||||||
"themes": {
|
"themes": {
|
||||||
"dark": "",
|
"dark": "ダーク",
|
||||||
"light": "",
|
"light": "ライト",
|
||||||
"title": ""
|
"title": "テーマ"
|
||||||
},
|
},
|
||||||
"user": "ユーザー",
|
"user": "ユーザー",
|
||||||
"userCommands": "ユーザーのコマンド",
|
"userCommands": "コマンド",
|
||||||
"userCommandsHelp": "空白区切りの有効のコマンドのリストを指定してください。例:",
|
"userCommandsHelp": "このユーザーが使用可能なコマンドをスペースで区切ったリスト。例:\n",
|
||||||
"userCreated": "ユーザーは作成されました!",
|
"userCreated": "ユーザーを作成しました!",
|
||||||
"userDefaults": "User default settings",
|
"userDefaults": "ユーザーのデフォルト設定",
|
||||||
"userDeleted": "ユーザーは削除されました!",
|
"userDeleted": "ユーザーを削除しました!",
|
||||||
"userManagement": "ユーザー管理",
|
"userManagement": "ユーザー管理",
|
||||||
"userUpdated": "ユーザーは更新されました!",
|
"userUpdated": "ユーザーを更新しました!",
|
||||||
"username": "ユーザー名",
|
"username": "ユーザー名",
|
||||||
"users": "ユーザー"
|
"users": "ユーザー"
|
||||||
},
|
},
|
||||||
"sidebar": {
|
"sidebar": {
|
||||||
"help": "ヘルプ",
|
"help": "ヘルプ",
|
||||||
"hugoNew": "Hugo New",
|
"hugoNew": "Hugo New",
|
||||||
"login": "Login",
|
"login": "ログイン",
|
||||||
"logout": "ログアウト",
|
"logout": "ログアウト",
|
||||||
"myFiles": "私のファイル",
|
"myFiles": "マイファイル",
|
||||||
"newFile": "新しいファイルを作成",
|
"newFile": "新規ファイル",
|
||||||
"newFolder": "新しいフォルダを作成",
|
"newFolder": "新規フォルダー",
|
||||||
"preview": "プレビュー",
|
"preview": "プレビュー",
|
||||||
"settings": "設定",
|
"settings": "設定",
|
||||||
"signup": "Signup",
|
"signup": "サインアップ",
|
||||||
"siteSettings": "サイト設定"
|
"siteSettings": "サイト設定"
|
||||||
},
|
},
|
||||||
"success": {
|
"success": {
|
||||||
"linkCopied": "リンクがコピーされました!"
|
"linkCopied": "リンクをコピーしました!"
|
||||||
},
|
},
|
||||||
"time": {
|
"time": {
|
||||||
"days": "日",
|
"days": "日",
|
||||||
"hours": "時間",
|
"hours": "時間",
|
||||||
"minutes": "分",
|
"minutes": "分",
|
||||||
"seconds": "秒",
|
"seconds": "秒",
|
||||||
"unit": "時間単位"
|
"unit": "時間の単位"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -77,6 +77,8 @@
|
|||||||
"help": "도움말"
|
"help": "도움말"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -176,6 +178,7 @@
|
|||||||
"customStylesheet": "커스텀 스타일시트",
|
"customStylesheet": "커스텀 스타일시트",
|
||||||
"defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.",
|
"defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.",
|
||||||
"disableExternalLinks": "외부 링크 감추기",
|
"disableExternalLinks": "외부 링크 감추기",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "문서",
|
"documentation": "문서",
|
||||||
"examples": "예",
|
"examples": "예",
|
||||||
"executeOnShell": "쉘에서 실행",
|
"executeOnShell": "쉘에서 실행",
|
||||||
|
|||||||
@@ -77,6 +77,8 @@
|
|||||||
"help": "Help"
|
"help": "Help"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "Arabisch",
|
"ar": "Arabisch",
|
||||||
"de": "Duits",
|
"de": "Duits",
|
||||||
"en": "Engels",
|
"en": "Engels",
|
||||||
@@ -176,6 +178,7 @@
|
|||||||
"customStylesheet": "Aangepast Stylesheet",
|
"customStylesheet": "Aangepast Stylesheet",
|
||||||
"defaultUserDescription": "Dit zijn de standaardinstellingen voor nieuwe gebruikers.",
|
"defaultUserDescription": "Dit zijn de standaardinstellingen voor nieuwe gebruikers.",
|
||||||
"disableExternalLinks": "Schakel externe links uit (behalve documentatie)",
|
"disableExternalLinks": "Schakel externe links uit (behalve documentatie)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "Documentatie",
|
"documentation": "Documentatie",
|
||||||
"examples": "Voorbeelden",
|
"examples": "Voorbeelden",
|
||||||
"executeOnShell": "Uitvoeren in de shell",
|
"executeOnShell": "Uitvoeren in de shell",
|
||||||
|
|||||||
@@ -16,31 +16,31 @@
|
|||||||
"new": "Nowy",
|
"new": "Nowy",
|
||||||
"next": "Następny",
|
"next": "Następny",
|
||||||
"ok": "OK",
|
"ok": "OK",
|
||||||
"permalink": "Get Permanent Link",
|
"permalink": "Uzyskaj link bezpośredni (permalink)",
|
||||||
"previous": "Poprzedni",
|
"previous": "Poprzedni",
|
||||||
"publish": "Opublikuj",
|
"publish": "Opublikuj",
|
||||||
"rename": "Zmień Nazwę",
|
"rename": "Zmień nazwę",
|
||||||
"replace": "Zamień",
|
"replace": "Zamień",
|
||||||
"reportIssue": "Zgłoś Problem",
|
"reportIssue": "Zgłoś problem",
|
||||||
"save": "Zapisz",
|
"save": "Zapisz",
|
||||||
"schedule": "Grafik",
|
"schedule": "Grafik",
|
||||||
"search": "Szukaj",
|
"search": "Szukaj",
|
||||||
"select": "Wybierz",
|
"select": "Wybierz",
|
||||||
"selectMultiple": "Zaznacz wiele",
|
"selectMultiple": "Zaznacz wiele",
|
||||||
"share": "Udostępnij",
|
"share": "Udostępnij",
|
||||||
"shell": "Toggle shell",
|
"shell": "Pokaż/ukryj powłokę",
|
||||||
"switchView": "Zmień widok",
|
"switchView": "Zmień widok",
|
||||||
"toggleSidebar": "Toggle sidebar",
|
"toggleSidebar": "Pokaż/ukryj panel boczny",
|
||||||
"update": "Aktualizuj",
|
"update": "Aktualizuj",
|
||||||
"upload": "Upload"
|
"upload": "Wgraj"
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"downloadFile": "Download File",
|
"downloadFile": "Pobierz plik",
|
||||||
"downloadFolder": "Download Folder",
|
"downloadFolder": "Pobierz folder",
|
||||||
"downloadSelected": ""
|
"downloadSelected": "Pobierz zaznaczone"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"forbidden": "You don't have permissions to access this.",
|
"forbidden": "Nie posiadasz uprawnień potrzebnych, by uzyskać do tego dostęp.",
|
||||||
"internal": "Pojawił się poważny problem.",
|
"internal": "Pojawił się poważny problem.",
|
||||||
"notFound": "Ten adres nie jest poprawny."
|
"notFound": "Ten adres nie jest poprawny."
|
||||||
},
|
},
|
||||||
@@ -50,17 +50,17 @@
|
|||||||
"closePreview": "Zamknij poprzednie",
|
"closePreview": "Zamknij poprzednie",
|
||||||
"files": "Pliki",
|
"files": "Pliki",
|
||||||
"folders": "Foldery",
|
"folders": "Foldery",
|
||||||
"home": "Home",
|
"home": "Katalog domowy",
|
||||||
"lastModified": "Ostatnio modyfikowane",
|
"lastModified": "Ostatnio modyfikowane",
|
||||||
"loading": "Ładowanie...",
|
"loading": "Ładowanie...",
|
||||||
"lonely": "Smutno gdy tak pusto...",
|
"lonely": "Smutno gdy tak pusto...",
|
||||||
"metadata": "Metadata",
|
"metadata": "Metadane",
|
||||||
"multipleSelectionEnabled": "Multiple selection enabled",
|
"multipleSelectionEnabled": "Zaznaczenie wielu włączone",
|
||||||
"name": "Nazwa",
|
"name": "Nazwa",
|
||||||
"size": "Rozmiar",
|
"size": "Rozmiar",
|
||||||
"sortByLastModified": "Sortuj po dacie modyfikacji",
|
"sortByLastModified": "Sortuj wg. daty modyfikacji",
|
||||||
"sortByName": "Sortuj po nazwie",
|
"sortByName": "Sortuj wg. nazwy",
|
||||||
"sortBySize": "Sortuj po rozmiarze"
|
"sortBySize": "Sortuj wg. rozmiaru"
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"click": "wybierz plik lub foler",
|
"click": "wybierz plik lub foler",
|
||||||
@@ -77,52 +77,54 @@
|
|||||||
"help": "Pomoc"
|
"help": "Pomoc"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
"es": "Español",
|
"es": "Español",
|
||||||
"fr": "Français",
|
"fr": "Français",
|
||||||
"is": "",
|
"is": "Íslenska",
|
||||||
"it": "Italiano",
|
"it": "Italiano",
|
||||||
"ja": "日本語",
|
"ja": "日本語",
|
||||||
"ko": "한국어",
|
"ko": "한국어",
|
||||||
"nlBE": "",
|
"nlBE": "Nederlands (België)",
|
||||||
"pl": "Polski",
|
"pl": "Polski",
|
||||||
"pt": "Português",
|
"pt": "Português",
|
||||||
"ptBR": "Português (Brasil)",
|
"ptBR": "Português (Brasil)",
|
||||||
"ro": "",
|
"ro": "Română",
|
||||||
"ru": "Русский",
|
"ru": "Русский",
|
||||||
"sk": "Slovenčina",
|
"sk": "Slovenčina",
|
||||||
"svSE": "",
|
"svSE": "Svenska (Sverige)",
|
||||||
"tr" : "Türkçe",
|
"tr" : "Türkçe",
|
||||||
"ua": "Українська",
|
"ua": "Українська",
|
||||||
"zhCN": "中文 (简体)",
|
"zhCN": "中文 (简体)",
|
||||||
"zhTW": "中文 (繁體)"
|
"zhTW": "中文 (繁體)"
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"createAnAccount": "Create an account",
|
"createAnAccount": "Utwórz konto",
|
||||||
"loginInstead": "Already have an account",
|
"loginInstead": "Takie konto już istnieje",
|
||||||
"password": "Hasło",
|
"password": "Hasło",
|
||||||
"passwordConfirm": "Password Confirmation",
|
"passwordConfirm": "Potwierdzenie hasła",
|
||||||
"passwordsDontMatch": "Passwords don't match",
|
"passwordsDontMatch": "Hasła różnią się",
|
||||||
"signup": "Signup",
|
"signup": "Rejestracja",
|
||||||
"submit": "Login",
|
"submit": "Logowanie",
|
||||||
"username": "Nazwa użytkownika",
|
"username": "Nazwa użytkownika",
|
||||||
"usernameTaken": "Username already taken",
|
"usernameTaken": "Nazwa użytkownika już zajęta",
|
||||||
"wrongCredentials": "Błędne dane logowania"
|
"wrongCredentials": "Błędne dane logowania"
|
||||||
},
|
},
|
||||||
"permanent": "Permanent",
|
"permanent": "Permanentny",
|
||||||
"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",
|
||||||
"currentlyNavigating": "Currently navigating on:",
|
"currentlyNavigating": "Obecnie przeglądasz:",
|
||||||
"deleteMessageMultiple": "Czy jesteś pewien że chcesz usunąć {count} plik(ów)?",
|
"deleteMessageMultiple": "Czy jesteś pewien że chcesz usunąć {count} plik(ów)?",
|
||||||
"deleteMessageSingle": "Czy jesteś pewien, że chcesz usunąć ten plik/folder?",
|
"deleteMessageSingle": "Czy jesteś pewien, że chcesz usunąć ten plik/folder?",
|
||||||
"deleteTitle": "Usuń pliki",
|
"deleteTitle": "Usuń pliki",
|
||||||
"displayName": "Wyświetlana Nazwa:",
|
"displayName": "Wyświetlana Nazwa:",
|
||||||
"download": "Pobierz pliki",
|
"download": "Pobierz pliki",
|
||||||
"downloadMessage": "Wybierz format, jaki chesz pobrać.",
|
"downloadMessage": "Wybierz format, jaki chesz pobrać.",
|
||||||
"error": "Pojawił się jakiś błąd",
|
"error": "Pojawił się nieznany błąd",
|
||||||
"fileInfo": "Informacje o pliku",
|
"fileInfo": "Informacje o pliku",
|
||||||
"filesSelected": "{count} plików zostało zaznaczonych.",
|
"filesSelected": "{count} plików zostało zaznaczonych.",
|
||||||
"lastModified": "Osatnio Zmodyfikowane",
|
"lastModified": "Osatnio Zmodyfikowane",
|
||||||
@@ -143,18 +145,19 @@
|
|||||||
"scheduleMessage": "Wybierz datę i czas dla publikacji tego wpisu.",
|
"scheduleMessage": "Wybierz datę i czas dla publikacji tego wpisu.",
|
||||||
"show": "Pokaż",
|
"show": "Pokaż",
|
||||||
"size": "Rozmiar",
|
"size": "Rozmiar",
|
||||||
"upload": "",
|
"upload": "Prześlij",
|
||||||
"uploadMessage": ""
|
"uploadMessage": "Proszę wybrać metodę przesyłania"
|
||||||
|
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"images": "Zdjęcia",
|
"images": "Zdjęcia",
|
||||||
"music": "Muzyka",
|
"music": "Muzyka",
|
||||||
"pdf": "PDF",
|
"pdf": "PDF",
|
||||||
"pressToSearch": "Press enter to search...",
|
"pressToSearch": "Wciśnij enter, aby wyszukać...",
|
||||||
"search": "Szukaj...",
|
"search": "Szukaj...",
|
||||||
"typeToSearch": "Type to search...",
|
"typeToSearch": "Zacznij pisać, aby wyszukać...",
|
||||||
"types": "Typy",
|
"types": "Typy",
|
||||||
"video": "Video"
|
"video": "Wideo"
|
||||||
},
|
},
|
||||||
"settings": {
|
"settings": {
|
||||||
"admin": "Admin",
|
"admin": "Admin",
|
||||||
@@ -163,29 +166,30 @@
|
|||||||
"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",
|
"allowSignup": "Zezwól na rejestrację użytkowników",
|
||||||
"avoidChanges": "(pozostaw puste aby nie zosatało zmienione)",
|
"avoidChanges": "(pozostaw puste aby nie zosatało zmienione)",
|
||||||
"branding": "Branding",
|
"branding": "Branding",
|
||||||
"brandingDirectoryPath": "Branding directory path",
|
"brandingDirectoryPath": "Folder brandingowy",
|
||||||
"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}.",
|
"brandingHelp": "Możesz dostosować wygląd i doznania użytkownika swojej instancji File Browser poprzez zmianę jej nazwy, zmianę logo, dodanie własnych stylów, a nawet wyłączyć linki zewnętrzne do GitHuba.\nW celu pozyskania większej ilości informacji nt. osobistego brandingu, zapoznaj się z {0}.",
|
||||||
"changePassword": "Zmień Hasło",
|
"changePassword": "Zmień Hasło",
|
||||||
"commandRunner": "Command runner",
|
"commandRunner": "Narzędzie do wykonywania poleceń",
|
||||||
"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": "Tu możesz ustawić komendy, które będą wykonywane przy danych zdarzeniach. Musisz wpisywać po jednej na linjkę. Zmienne środowiskowe {0} i {1} będą dostępne, gdzie {0} jest względne wobec {1}. Więcej informacji o tej funkcji i dostępnych zmiennych środowiskowych znajdziesz tutaj: {2}.",
|
||||||
"commandsUpdated": "Polecenie zaktualizowane!",
|
"commandsUpdated": "Polecenie zaktualizowane!",
|
||||||
"createUserDir": "Auto create user home dir while adding new user",
|
"createUserDir": "Automatycznie utwórz katalog domowy użytkownika podczas dodania nowego użytkownika",
|
||||||
"customStylesheet": "Własny Stylesheet",
|
"customStylesheet": "Własny arkusz stylów",
|
||||||
"defaultUserDescription": "This are the default settings for new users.",
|
"defaultUserDescription": "Oto domyślne ustawienia dla nowych użytkowników.",
|
||||||
"disableExternalLinks": "Disable external links (except documentation)",
|
"disableExternalLinks": "Wyłącz linki zewnętrzne (z wyjątkiem dokumentacji)",
|
||||||
"documentation": "documentation",
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
|
"documentation": "dokumentacja",
|
||||||
"examples": "Przykłady",
|
"examples": "Przykłady",
|
||||||
"executeOnShell": "Execute on shell",
|
"executeOnShell": "Wykonaj w powłoce",
|
||||||
"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.",
|
"executeOnShellDescription": "Domyślnie File Browser wykonuje polecenia wywołując ich pliki binarne bezpośrednio. Jesli preferujesz wykonywanie ich w powłoce (jak np. Bash czy PowerShell), możesz zdefiniować to tutaj wraz z wymaganymi flagami i argumentami. Jeśli to ustawienie jest aktywne, polecenie które wykonarz zostanie dodane jako argument. Stosuje się to zarówno do poleceń użytkownika jak i zaczepów zdarzeń.",
|
||||||
"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.",
|
"globalRules": "To jest globalne zestawienie reguł zezwalających i zabraniających. Stosują się one do każdego użytkownika. Możesz zdefiniować indywidualne zasady w ustawieniach każdego użytkownika, by zignorować te reguły.",
|
||||||
"globalSettings": "Ustawienia Globalne",
|
"globalSettings": "Ustawienia Globalne",
|
||||||
"hideDotfiles": "",
|
"hideDotfiles": "Ukryj ukryte pliki",
|
||||||
"insertPath": "Insert the path",
|
"insertPath": "Wstaw ścieżkę",
|
||||||
"insertRegex": "Insert regex expression",
|
"insertRegex": "Wstaw wyrażenie regularne",
|
||||||
"instanceName": "Instance name",
|
"instanceName": "Nazwa instancji",
|
||||||
"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",
|
||||||
@@ -193,38 +197,38 @@
|
|||||||
"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": "",
|
"path": "Ścieżka",
|
||||||
"perm": {
|
"perm": {
|
||||||
"create": "Create files and directories",
|
"create": "Tworzenie plików i katalogów",
|
||||||
"delete": "Delete files and directories",
|
"delete": "Usuwanie plików i katalogów",
|
||||||
"download": "Download",
|
"download": "Pobieranie",
|
||||||
"execute": "Execute commands",
|
"execute": "Wykonywanie poleceń",
|
||||||
"modify": "Edit files",
|
"modify": "Edycja plików",
|
||||||
"rename": "Rename or move files and directories",
|
"rename": "Zmiana nazw lub przenoszenie plików i katalogów",
|
||||||
"share": "Share files"
|
"share": "Udostępnianie plików"
|
||||||
},
|
},
|
||||||
"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": "Możesz uczynić użytkownika administratorem, lub wybrać uprawnienia indywidualnie. Jeśli zaznaczysz opcję \"Administrator\", wszystkie pozostałe opcje zostaną automatycznie zaznaczone. Zarządzanie użytkownikami pozostaje przywilejem administratora.\n",
|
||||||
"profileSettings": "Twój profil",
|
"profileSettings": "Twój profil",
|
||||||
"ruleExample1": "prevents the access to any dot file (such as .git, .gitignore) in every folder.\n",
|
"ruleExample1": "uniemożliwia dostęp do któregokolwiek z ukrytych plików (takich jak .git, .gitignore) w każdym folderze.\n",
|
||||||
"ruleExample2": "blocks the access to the file named Caddyfile on the root of the scope.",
|
"ruleExample2": "blokuje dostęp do pliku Caddyfile w głównym katalogu zakresu.",
|
||||||
"rules": "Uprawnienia",
|
"rules": "Uprawnienia",
|
||||||
"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": "Tu możesz zdefiniować zestawienie reguł zezwalających i zabraniających dla tego konkretnego użytkownika. Zablokowane pliki nie będą widoczne na listach i nie będą dostępne dla użytkownika. Wspierane są wyrażenia regularne i ścieżki względne wobec zakresu użytkownika.\n",
|
||||||
"scope": "Scope",
|
"scope": "Zakres",
|
||||||
"settingsUpdated": "Uprawnienia Zapisane!",
|
"settingsUpdated": "Uprawnienia Zapisane!",
|
||||||
"shareDuration": "",
|
"shareDuration": "Okres udostępniania",
|
||||||
"shareManagement": "",
|
"shareManagement": "Zarządzanie udostępnianiem",
|
||||||
"singleClick": "",
|
"singleClick": "Pojedyncze kliknięcie",
|
||||||
"themes": {
|
"themes": {
|
||||||
"dark": "",
|
"dark": "ciemny",
|
||||||
"light": "",
|
"light": "jasny",
|
||||||
"title": ""
|
"title": "Motywy"
|
||||||
},
|
},
|
||||||
"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": "Lista oddzielonych spacjami poleceń dostępnych dla tego użytkownika. Przykład:\n",
|
||||||
"userCreated": "Użytkownik zapisany!",
|
"userCreated": "Użytkownik zapisany!",
|
||||||
"userDefaults": "User default settings",
|
"userDefaults": "Domyślne ustawienia użytkownika",
|
||||||
"userDeleted": "Użytkownik usunięty!",
|
"userDeleted": "Użytkownik usunięty!",
|
||||||
"userManagement": "Zarządzanie użytkownikami",
|
"userManagement": "Zarządzanie użytkownikami",
|
||||||
"userUpdated": "Użytkownik zapisany!",
|
"userUpdated": "Użytkownik zapisany!",
|
||||||
@@ -241,7 +245,7 @@
|
|||||||
"newFolder": "Nowy folder",
|
"newFolder": "Nowy folder",
|
||||||
"preview": "Podgląd",
|
"preview": "Podgląd",
|
||||||
"settings": "Ustawienia",
|
"settings": "Ustawienia",
|
||||||
"signup": "Signup",
|
"signup": "Rejestracja",
|
||||||
"siteSettings": "Ustawienia Strony"
|
"siteSettings": "Ustawienia Strony"
|
||||||
},
|
},
|
||||||
"success": {
|
"success": {
|
||||||
|
|||||||
@@ -6,43 +6,48 @@
|
|||||||
"copyFile": "Copiar arquivo",
|
"copyFile": "Copiar arquivo",
|
||||||
"copyToClipboard": "Copiar",
|
"copyToClipboard": "Copiar",
|
||||||
"create": "Criar",
|
"create": "Criar",
|
||||||
"delete": "Deletar",
|
"delete": "Apagar",
|
||||||
"download": "Baixar",
|
"download": "Baixar",
|
||||||
"hideDotfiles": "",
|
"file": "Arquivo",
|
||||||
|
"folder": "Pasta",
|
||||||
|
"hideDotfiles": "Ocultar dotfiles",
|
||||||
"info": "Informações",
|
"info": "Informações",
|
||||||
"more": "Mais",
|
"more": "Mais",
|
||||||
"move": "Mover",
|
"move": "Mover",
|
||||||
"moveFile": "Mover arquivo",
|
"moveFile": "Mover arquivo",
|
||||||
"new": "Novo",
|
"new": "Novo",
|
||||||
"next": "Próximo",
|
"next": "Próximo",
|
||||||
"ok": "Ok",
|
"ok": "OK",
|
||||||
"permalink": "Obter link permanente",
|
"permalink": "Obter link permanente",
|
||||||
"previous": "Anterior",
|
"previous": "Anterior",
|
||||||
"publish": "Publicar",
|
"publish": "Publicar",
|
||||||
"rename": "Renomear",
|
"rename": "Renomear",
|
||||||
"replace": "Substituir",
|
"replace": "Substituir",
|
||||||
"reportIssue": "Reportar erro",
|
"reportIssue": "Relatar erro",
|
||||||
"save": "Salvar",
|
"save": "Salvar",
|
||||||
"schedule": "Agendar",
|
"schedule": "Agendar",
|
||||||
"search": "Pesquisar",
|
"search": "Pesquisar",
|
||||||
"select": "Selecionar",
|
"select": "Selecionar",
|
||||||
"selectMultiple": "Selecionar múltiplos",
|
"selectMultiple": "Selecionar múltiplos",
|
||||||
"share": "Compartilhar",
|
"share": "Compartilhar",
|
||||||
"shell": "Toggle shell",
|
"shell": "Alternar console",
|
||||||
|
"submit": "Enviar",
|
||||||
"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",
|
||||||
|
"openFile": "Abrir"
|
||||||
},
|
},
|
||||||
"download": {
|
"download": {
|
||||||
"downloadFile": "Baixar arquivo",
|
"downloadFile": "Baixar arquivo",
|
||||||
"downloadFolder": "Baixar pasta",
|
"downloadFolder": "Baixar pasta",
|
||||||
"downloadSelected": ""
|
"downloadSelected": "Baixar selecionado"
|
||||||
},
|
},
|
||||||
"errors": {
|
"errors": {
|
||||||
"forbidden": "You don't have permissions to access this.",
|
"forbidden": "Você não tem permissões para acessar isto.",
|
||||||
"internal": "Ops! Algum erro ocorreu.",
|
"internal": "Ops! Algum erro ocorreu.",
|
||||||
"notFound": "Ops! Nada foi encontrado."
|
"notFound": "Ops! Nada foi encontrado.",
|
||||||
|
"connection": "O servidor não pode ser alcançado."
|
||||||
},
|
},
|
||||||
"files": {
|
"files": {
|
||||||
"body": "Corpo",
|
"body": "Corpo",
|
||||||
@@ -60,7 +65,8 @@
|
|||||||
"size": "Tamanho",
|
"size": "Tamanho",
|
||||||
"sortByLastModified": "Ordenar pela última modificação",
|
"sortByLastModified": "Ordenar pela última modificação",
|
||||||
"sortByName": "Ordenar pelo nome",
|
"sortByName": "Ordenar pelo nome",
|
||||||
"sortBySize": "Ordenar pelo tamanho"
|
"sortBySize": "Ordenar pelo tamanho",
|
||||||
|
"noPreview": "Pré-visualização não disponível para este arquivo."
|
||||||
},
|
},
|
||||||
"help": {
|
"help": {
|
||||||
"click": "selecionar pasta ou arquivo",
|
"click": "selecionar pasta ou arquivo",
|
||||||
@@ -69,14 +75,16 @@
|
|||||||
"f": "pesquisar",
|
"f": "pesquisar",
|
||||||
"s": "salvar um arquivo ou baixar a pasta que você está"
|
"s": "salvar um arquivo ou baixar a pasta que você está"
|
||||||
},
|
},
|
||||||
"del": "deletar os arquivos selecionados",
|
"del": "apagar os arquivos selecionados",
|
||||||
"doubleClick": "abrir pasta ou arquivo",
|
"doubleClick": "abrir pasta ou arquivo",
|
||||||
"esc": "limpar seleção e/ou fechar menu",
|
"esc": "limpar seleção e/ou fechar menu",
|
||||||
"f1": "está informação",
|
"f1": "esta informação",
|
||||||
"f2": "renomear arquivo",
|
"f2": "renomear arquivo",
|
||||||
"help": "Ajuda"
|
"help": "Ajuda"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -100,15 +108,15 @@
|
|||||||
"zhTW": "中文 (繁體)"
|
"zhTW": "中文 (繁體)"
|
||||||
},
|
},
|
||||||
"login": {
|
"login": {
|
||||||
"createAnAccount": "Create an account",
|
"createAnAccount": "Criar uma conta",
|
||||||
"loginInstead": "Already have an account",
|
"loginInstead": "Já possui uma conta",
|
||||||
"password": "Senha",
|
"password": "Senha",
|
||||||
"passwordConfirm": "Password Confirmation",
|
"passwordConfirm": "Confirmação de senha",
|
||||||
"passwordsDontMatch": "Passwords don't match",
|
"passwordsDontMatch": "As senhas não coincidem",
|
||||||
"signup": "Signup",
|
"signup": "Cadastrar",
|
||||||
"submit": "Login",
|
"submit": "Login",
|
||||||
"username": "Nome do usuário",
|
"username": "Nome do usuário",
|
||||||
"usernameTaken": "Username already taken",
|
"usernameTaken": "Nome de usuário já existe",
|
||||||
"wrongCredentials": "Ops! Dados incorretos."
|
"wrongCredentials": "Ops! Dados incorretos."
|
||||||
},
|
},
|
||||||
"permanent": "Permanente",
|
"permanent": "Permanente",
|
||||||
@@ -116,13 +124,14 @@
|
|||||||
"copy": "Copiar",
|
"copy": "Copiar",
|
||||||
"copyMessage": "Escolha um lugar para copiar os arquivos:",
|
"copyMessage": "Escolha um lugar para copiar os arquivos:",
|
||||||
"currentlyNavigating": "Navegando em:",
|
"currentlyNavigating": "Navegando em:",
|
||||||
"deleteMessageMultiple": "Deseja deletar {count} arquivo(s)?",
|
"deleteMessageMultiple": "Deseja apagar {count} arquivo(s)?",
|
||||||
"deleteMessageSingle": "Deseja deletar está pasta/arquivo?",
|
"deleteMessageSingle": "Deseja apagar esta pasta/arquivo?",
|
||||||
"deleteTitle": "Deletar arquivos",
|
"deleteMessageShare": "Deseja apagar este compartilhamento ({path})?",
|
||||||
|
"deleteTitle": "Apagar arquivos",
|
||||||
"displayName": "Nome:",
|
"displayName": "Nome:",
|
||||||
"download": "Baixar arquivos",
|
"download": "Baixar arquivos",
|
||||||
"downloadMessage": "Escolha o formato do arquivo.",
|
"downloadMessage": "Escolha o formato do arquivo.",
|
||||||
"error": "Algo de ruim ocorreu",
|
"error": "Algo de errado ocorreu",
|
||||||
"fileInfo": "Informação do arquivo",
|
"fileInfo": "Informação do arquivo",
|
||||||
"filesSelected": "{count} arquivos selecionados.",
|
"filesSelected": "{count} arquivos selecionados.",
|
||||||
"lastModified": "Última modificação",
|
"lastModified": "Última modificação",
|
||||||
@@ -140,19 +149,21 @@
|
|||||||
"replace": "Substituir",
|
"replace": "Substituir",
|
||||||
"replaceMessage": "Já existe um arquivo com nome igual a um dos que está tentando enviar. Deseja substituir?\n",
|
"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 agendar a publicação deste post.",
|
||||||
"show": "Mostrar",
|
"show": "Mostrar",
|
||||||
"size": "Tamanho",
|
"size": "Tamanho",
|
||||||
"upload": "",
|
"upload": "Enviar",
|
||||||
"uploadMessage": ""
|
"uploadFiles": "Enviando {files} arquivos...",
|
||||||
|
"uploadMessage": "Selecione uma opção para enviar.",
|
||||||
|
"optionalPassword": "Senha opcional"
|
||||||
},
|
},
|
||||||
"search": {
|
"search": {
|
||||||
"images": "Imagens",
|
"images": "Imagens",
|
||||||
"music": "Música",
|
"music": "Músicas",
|
||||||
"pdf": "PDF",
|
"pdf": "PDF",
|
||||||
"pressToSearch": "Press enter to search...",
|
"pressToSearch": "Pressione Enter para pesquisar...",
|
||||||
"search": "Pesquise...",
|
"search": "Pesquise...",
|
||||||
"typeToSearch": "Type to search...",
|
"typeToSearch": "Digite para pesquisar...",
|
||||||
"types": "Tipos",
|
"types": "Tipos",
|
||||||
"video": "Vídeos"
|
"video": "Vídeos"
|
||||||
},
|
},
|
||||||
@@ -160,33 +171,37 @@
|
|||||||
"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 apagar 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",
|
"allowSignup": "Permitir cadastro de usuários",
|
||||||
"avoidChanges": "(deixe em branco para manter)",
|
"avoidChanges": "(deixe em branco para manter)",
|
||||||
"branding": "Branding",
|
"branding": "Customização",
|
||||||
"brandingDirectoryPath": "Branding directory path",
|
"brandingDirectoryPath": "Diretório de customização",
|
||||||
"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}.",
|
"brandingHelp": "Você pode mudar a aparência e experiência de sua instância do File Browser alterando seu nome, logotipo, adicionando estilos customizados e até desabilitando links externos para o GitHub.\nPara mais informações sobre customizações, confira {0}.",
|
||||||
"changePassword": "Alterar senha",
|
"changePassword": "Alterar senha",
|
||||||
"commandRunner": "Command runner",
|
"commandRunner": "Execução 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": "Aqui você pode definir comandos que serão executados nos eventos descritos. Escreva um por linha. As variáveis de ambiente {0} e {1} estão disponíveis, sendo {0} relativo a {1}. Para mais informações sobre esta função e as variáveis de ambiente disponíveis, leia a {2}.",
|
||||||
"commandsUpdated": "Comandos atualizados!",
|
"commandsUpdated": "Comandos atualizados!",
|
||||||
"createUserDir": "Auto create user home dir while adding new user",
|
"createUserDir": "Criar diretório Home para novos usuários",
|
||||||
|
"userHomeBasePath": "Caminho base para diretórios de usuários",
|
||||||
|
"userScopeGenerationPlaceholder": "O escopo será gerado automaticamente",
|
||||||
|
"createUserHomeDirectory": "Criar diretório Home de usuário",
|
||||||
"customStylesheet": "Estilos personalizados",
|
"customStylesheet": "Estilos personalizados",
|
||||||
"defaultUserDescription": "This are the default settings for new users.",
|
"defaultUserDescription": "Estas são as configurações padrão para novos usuários.",
|
||||||
"disableExternalLinks": "Disable external links (except documentation)",
|
"disableExternalLinks": "Desabilitar links externos (exceto documentação)",
|
||||||
|
"disableUsedDiskPercentage": "Desabilitar gráfico de porcentagem de disco usado",
|
||||||
"documentation": "documentação",
|
"documentation": "documentação",
|
||||||
"examples": "Exemplos",
|
"examples": "Exemplos",
|
||||||
"executeOnShell": "Execute on shell",
|
"executeOnShell": "Executar no console",
|
||||||
"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.",
|
"executeOnShellDescription": "Por padrão, o File Browser executa os comandos chamando os binários diretamente. Se ao invés disso desejar executá-los em um console (como Bash ou PowerShell), você pode defini-los aqui com os argumentos e flags necessários. Se definido, o comando que executar será acrescentado como um argumento. Isto se aplica a comandos de usuário e eventos hook.",
|
||||||
"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.",
|
"globalRules": "Este é um conjunto global de regras de permissão e restrição que se aplicam a todos os usuários. Você pode definir regras específicas em cada usuário para sobrepor estas.",
|
||||||
"globalSettings": "Configurações globais",
|
"globalSettings": "Configurações globais",
|
||||||
"hideDotfiles": "",
|
"hideDotfiles": "Ocultar dotfiles",
|
||||||
"insertPath": "Insert the path",
|
"insertPath": "Inserir o caminho",
|
||||||
"insertRegex": "Inserir expressão regular",
|
"insertRegex": "Inserir expressão regular",
|
||||||
"instanceName": "Instance name",
|
"instanceName": "Nome da instância",
|
||||||
"language": "Linguagem",
|
"language": "Idioma",
|
||||||
"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",
|
||||||
"newPasswordConfirm": "Confirme a nova senha",
|
"newPasswordConfirm": "Confirme a nova senha",
|
||||||
@@ -195,12 +210,12 @@
|
|||||||
"passwordUpdated": "Senha atualizada!",
|
"passwordUpdated": "Senha atualizada!",
|
||||||
"path": "",
|
"path": "",
|
||||||
"perm": {
|
"perm": {
|
||||||
"create": "Create files and directories",
|
"create": "Criar arquivos e diretórios",
|
||||||
"delete": "Delete files and directories",
|
"delete": "Apagar arquivos e diretórios",
|
||||||
"download": "Baixar",
|
"download": "Baixar",
|
||||||
"execute": "Execute commands",
|
"execute": "Executar comandos",
|
||||||
"modify": "Editar arquivos",
|
"modify": "Editar arquivos",
|
||||||
"rename": "Rename or move files and directories",
|
"rename": "Renomear ou mover arquivos e diretórios",
|
||||||
"share": "Compartilhar arquivos"
|
"share": "Compartilhar arquivos"
|
||||||
},
|
},
|
||||||
"permissions": "Permissões",
|
"permissions": "Permissões",
|
||||||
@@ -209,24 +224,26 @@
|
|||||||
"ruleExample1": "previne o acesso a qualquer \"dotfile\" (como .git, .gitignore) em qualquer pasta\n",
|
"ruleExample1": "previne o acesso a qualquer \"dotfile\" (como .git, .gitignore) em qualquer pasta\n",
|
||||||
"ruleExample2": "bloqueia o acesso ao arquivo chamado Caddyfile.",
|
"ruleExample2": "bloqueia o acesso ao arquivo chamado Caddyfile.",
|
||||||
"rules": "Regras",
|
"rules": "Regras",
|
||||||
"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 você pode definir um conjunto de regras para permitir ou bloquear o acesso do usuário 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": "Escopo",
|
||||||
|
"setDateFormat": "Definir formato exato de data",
|
||||||
"settingsUpdated": "Configurações atualizadas!",
|
"settingsUpdated": "Configurações atualizadas!",
|
||||||
"shareDuration": "",
|
"shareDuration": "Duração do compartilhamento",
|
||||||
"shareManagement": "",
|
"shareManagement": "Gerenciamento do compartilhamento",
|
||||||
"singleClick": "",
|
"shareDeleted": "Compartilhamento apagado!",
|
||||||
|
"singleClick": "Usar clique único para abrir arquivos e diretórios",
|
||||||
"themes": {
|
"themes": {
|
||||||
"dark": "",
|
"dark": "Escuro",
|
||||||
"light": "",
|
"light": "Claro",
|
||||||
"title": ""
|
"title": "Tema"
|
||||||
},
|
},
|
||||||
"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",
|
"userDefaults": "Configurações padrão de usuário",
|
||||||
"userDeleted": "Usuário eliminado!",
|
"userDeleted": "Usuário apagado!",
|
||||||
"userManagement": "Gestão de usuários",
|
"userManagement": "Gerenciamento de usuários",
|
||||||
"userUpdated": "Usuário atualizado!",
|
"userUpdated": "Usuário atualizado!",
|
||||||
"username": "Nome do usuário",
|
"username": "Nome do usuário",
|
||||||
"users": "Usuários"
|
"users": "Usuários"
|
||||||
@@ -241,7 +258,7 @@
|
|||||||
"newFolder": "Nova pasta",
|
"newFolder": "Nova pasta",
|
||||||
"preview": "Pré-visualizar",
|
"preview": "Pré-visualizar",
|
||||||
"settings": "Configurações",
|
"settings": "Configurações",
|
||||||
"signup": "Signup",
|
"signup": "Cadastrar",
|
||||||
"siteSettings": "Configurações do site"
|
"siteSettings": "Configurações do site"
|
||||||
},
|
},
|
||||||
"success": {
|
"success": {
|
||||||
|
|||||||
@@ -77,6 +77,8 @@
|
|||||||
"help": "Ajuda"
|
"help": "Ajuda"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "Árabe",
|
"ar": "Árabe",
|
||||||
"de": "Alemão",
|
"de": "Alemão",
|
||||||
"en": "Inglês",
|
"en": "Inglês",
|
||||||
@@ -176,6 +178,7 @@
|
|||||||
"customStylesheet": "Folha de estilos personalizada",
|
"customStylesheet": "Folha de estilos personalizada",
|
||||||
"defaultUserDescription": "Estas são as configurações padrão para novos utilizadores.",
|
"defaultUserDescription": "Estas são as configurações padrão para novos utilizadores.",
|
||||||
"disableExternalLinks": "Desativar links externos (exceto documentação)",
|
"disableExternalLinks": "Desativar links externos (exceto documentação)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "documentação",
|
"documentation": "documentação",
|
||||||
"examples": "Exemplos",
|
"examples": "Exemplos",
|
||||||
"executeOnShell": "Executar na shell",
|
"executeOnShell": "Executar na shell",
|
||||||
|
|||||||
@@ -77,6 +77,8 @@
|
|||||||
"help": "Ajutor"
|
"help": "Ajutor"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -176,6 +178,7 @@
|
|||||||
"customStylesheet": "CSS personalizat",
|
"customStylesheet": "CSS personalizat",
|
||||||
"defaultUserDescription": "Acestea sunt setările implicite pentru noii utilizatori.",
|
"defaultUserDescription": "Acestea sunt setările implicite pentru noii utilizatori.",
|
||||||
"disableExternalLinks": "Dezactivează linkurile externe (exceptând documentația)",
|
"disableExternalLinks": "Dezactivează linkurile externe (exceptând documentația)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "documentație",
|
"documentation": "documentație",
|
||||||
"examples": "Exemple",
|
"examples": "Exemple",
|
||||||
"executeOnShell": "Execută in linia de comandă",
|
"executeOnShell": "Execută in linia de comandă",
|
||||||
|
|||||||
@@ -83,6 +83,8 @@
|
|||||||
"help": "Помощь"
|
"help": "Помощь"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -184,6 +186,7 @@
|
|||||||
"customStylesheet": "Свой стиль",
|
"customStylesheet": "Свой стиль",
|
||||||
"defaultUserDescription": "Это настройки по умолчанию для новых пользователей.",
|
"defaultUserDescription": "Это настройки по умолчанию для новых пользователей.",
|
||||||
"disableExternalLinks": "Отключить внешние ссылки (кроме документации)",
|
"disableExternalLinks": "Отключить внешние ссылки (кроме документации)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "документация",
|
"documentation": "документация",
|
||||||
"examples": "Примеры",
|
"examples": "Примеры",
|
||||||
"executeOnShell": "Выполнить в командной строке",
|
"executeOnShell": "Выполнить в командной строке",
|
||||||
|
|||||||
@@ -83,6 +83,8 @@
|
|||||||
"help": "Pomoc"
|
"help": "Pomoc"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -184,6 +186,7 @@
|
|||||||
"customStylesheet": "Vlastný Stylesheet",
|
"customStylesheet": "Vlastný Stylesheet",
|
||||||
"defaultUserDescription": "Toto sú predvolané nastavenia nového používateľa.",
|
"defaultUserDescription": "Toto sú predvolané nastavenia nového používateľa.",
|
||||||
"disableExternalLinks": "Vypnúť externé odkazy (okrem dokumentácie)",
|
"disableExternalLinks": "Vypnúť externé odkazy (okrem dokumentácie)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "dokumentácia",
|
"documentation": "dokumentácia",
|
||||||
"examples": "Príklady",
|
"examples": "Príklady",
|
||||||
"executeOnShell": "Vykonať cez shell",
|
"executeOnShell": "Vykonať cez shell",
|
||||||
|
|||||||
@@ -77,6 +77,8 @@
|
|||||||
"help": "Hjälp"
|
"help": "Hjälp"
|
||||||
},
|
},
|
||||||
"languages": {
|
"languages": {
|
||||||
|
"he": "עברית",
|
||||||
|
"hu": "Magyar",
|
||||||
"ar": "العربية",
|
"ar": "العربية",
|
||||||
"de": "Deutsch",
|
"de": "Deutsch",
|
||||||
"en": "English",
|
"en": "English",
|
||||||
@@ -176,6 +178,7 @@
|
|||||||
"customStylesheet": "Anpassad formatmall",
|
"customStylesheet": "Anpassad formatmall",
|
||||||
"defaultUserDescription": "Detta är standard inställningar för användare.",
|
"defaultUserDescription": "Detta är standard inställningar för användare.",
|
||||||
"disableExternalLinks": "Inaktivera externa länkar (förutom dokumentation)",
|
"disableExternalLinks": "Inaktivera externa länkar (förutom dokumentation)",
|
||||||
|
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||||
"documentation": "dokumentation",
|
"documentation": "dokumentation",
|
||||||
"examples": "Exempel",
|
"examples": "Exempel",
|
||||||
"executeOnShell": "Exekvera på skal",
|
"executeOnShell": "Exekvera på skal",
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user