Compare commits
114 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
dbdbbab4d7 | ||
|
|
7c0c7820ef | ||
|
|
2741616473 | ||
|
|
ffb858e4ef | ||
|
|
0ca8059d8d | ||
|
|
8ca080422f | ||
|
|
cbb712484d | ||
|
|
8a14018861 | ||
|
|
a493ec90ff | ||
|
|
33113036cd | ||
|
|
a02b2972eb | ||
|
|
e9bb3dc243 | ||
|
|
2e26393a02 | ||
|
|
04a13f086f | ||
|
|
1cc539eb8a | ||
|
|
6ebfdcceaa | ||
|
|
db671c227b | ||
|
|
4aee14de44 | ||
|
|
0cca7d8dc0 | ||
|
|
c34c0afecf | ||
|
|
56a0f9244b | ||
|
|
56b80b6d9b | ||
|
|
d9ebd65ffc | ||
|
|
a882fb6c85 | ||
|
|
5daae69a6d | ||
|
|
54a1ae0fa0 | ||
|
|
b6b4fb5da7 | ||
|
|
6d82a27f9a | ||
|
|
31a326606d | ||
|
|
abbf203bdd | ||
|
|
e82e2392a4 | ||
|
|
f4a8420bf3 | ||
|
|
71a8f5662c | ||
|
|
48f894740f | ||
|
|
b883e287a0 | ||
|
|
5d9f0977d6 | ||
|
|
c606a01a2d | ||
|
|
54b91b8ff0 | ||
|
|
a46acba5f9 | ||
|
|
1d14798653 | ||
|
|
6d55cc59f7 | ||
|
|
495e731ee7 | ||
|
|
ff1579b950 | ||
|
|
7a48fd0c3e | ||
|
|
cfea84fd5e | ||
|
|
0ba9505a19 | ||
|
|
5355629fd1 | ||
|
|
f8a16a6aca | ||
|
|
35d1c09243 | ||
|
|
99c64c12ed | ||
|
|
3d6c5152fe | ||
|
|
ba797cda31 | ||
|
|
5300d00d2e | ||
|
|
bbdd313705 | ||
|
|
045064f8b8 | ||
|
|
252f0a7533 | ||
|
|
1194cfe009 | ||
|
|
0201f9c5c4 | ||
|
|
cc331383fb | ||
|
|
d1c84a8412 | ||
|
|
e92dbb4bb8 | ||
|
|
209acf2429 | ||
|
|
25372edb5c | ||
|
|
d51a343820 | ||
|
|
065959451d | ||
|
|
2fdea73430 | ||
|
|
129a4fd39d | ||
|
|
64400ffda8 | ||
|
|
03d74ee758 | ||
|
|
2b37e696c9 | ||
|
|
21d5ee1b97 | ||
|
|
ec7b643e8e | ||
|
|
d729701bd4 | ||
|
|
406d4f7884 | ||
|
|
1e7c41505f | ||
|
|
bb5d192095 | ||
|
|
121d9abecd | ||
|
|
7de6bc4a91 | ||
|
|
2369e5c0ed | ||
|
|
056cfa8fac | ||
|
|
e7d77106ab | ||
|
|
a6347c8858 | ||
|
|
b596567c61 | ||
|
|
364fdaaf0c | ||
|
|
8b75aefb1c | ||
|
|
b0f4604f44 | ||
|
|
f6f7e5fea3 | ||
|
|
043cdbf402 | ||
|
|
8e67a12f26 | ||
|
|
83898d616f | ||
|
|
090272e3b7 | ||
|
|
10bf3cffbf | ||
|
|
99a6382b32 | ||
|
|
a53aac1c30 | ||
|
|
21783ed91a | ||
|
|
7be5644952 | ||
|
|
30a8ddf113 | ||
|
|
c3465f9913 | ||
|
|
e8589be640 | ||
|
|
eb3978ea55 | ||
|
|
d6cdf0e435 | ||
|
|
1fccc5d649 | ||
|
|
a8388689f3 | ||
|
|
2a90cdfdaf | ||
|
|
6ca3d5a573 | ||
|
|
3b48f75301 | ||
|
|
4c5b612cb2 | ||
|
|
e336a25ad2 | ||
|
|
c9e05f98c4 | ||
|
|
be62f56782 | ||
|
|
2e47a038d6 | ||
|
|
a9c327cc06 | ||
|
|
782375b1cb | ||
|
|
5d5e8ed422 |
@@ -1,5 +1,3 @@
|
||||
*
|
||||
!docker/*
|
||||
!healthcheck.sh
|
||||
!docker_config.json
|
||||
!filebrowser
|
||||
!filebrowser
|
||||
|
||||
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -2,4 +2,4 @@
|
||||
# Unless a later match takes precedence, @o1egl will be requested for
|
||||
# review when someone opens a pull request.
|
||||
|
||||
* @o1egl
|
||||
* @o1egl @hacdias
|
||||
|
||||
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,22 +0,0 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
---
|
||||
|
||||
**Description**
|
||||
<!-- A clear and concise description of what the issue is about. What are you trying to do? -->
|
||||
|
||||
**Expected behaviour**
|
||||
<!-- What did you expect to happen? -->
|
||||
|
||||
**What is happening instead?**
|
||||
<!-- Please, give full error messages and/or log. -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context about the problem here. If applicable, add screenshots to help explain your problem. -->
|
||||
|
||||
**How to reproduce?**
|
||||
<!-- Tell us how to reproduce this issue. How can someone who is starting from scratch reproduce this behaviour as minimally as possible? -->
|
||||
|
||||
**Files**
|
||||
<!-- A list of relevant files for this issue. Large files can be uploaded one-by-one or in a tarball/zipfile. -->
|
||||
43
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
43
.github/ISSUE_TEMPLATE/bug_report.yml
vendored
Normal file
@@ -0,0 +1,43 @@
|
||||
name: Bug Report
|
||||
description: Report a bug in FileBrowser.
|
||||
labels: [bug, triage]
|
||||
body:
|
||||
- type: checkboxes
|
||||
attributes:
|
||||
label: Checklist
|
||||
description: Please verify that you've followed these steps
|
||||
options:
|
||||
- label: This is a bug report, not a question.
|
||||
required: true
|
||||
- label: I have searched on the [issue tracker](https://github.com/filebrowser/filebrowser/issues?q=is%3Aissue) for my bug.
|
||||
required: true
|
||||
- label: I am running the latest [FileBrowser version](https://github.com/filebrowser/filebrowser/releases) or have an issue updating.
|
||||
required: true
|
||||
- type: textarea
|
||||
id: version
|
||||
attributes:
|
||||
label: Version
|
||||
render: Text
|
||||
description: |
|
||||
Enter the version of FileBrowser you are using.
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Description
|
||||
description: |
|
||||
A clear and concise description of what the issue is about. What are you trying to do?
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What did you expect to happen?
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: What actually happened?
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Reproduction Steps
|
||||
description: |
|
||||
Tell us how to reproduce this issue. How can someone who is starting from scratch reproduce this behavior as minimally as possible?
|
||||
- type: textarea
|
||||
attributes:
|
||||
label: Files
|
||||
description: |
|
||||
A list of relevant files for this issue. Large files can be uploaded one-by-one or in a tarball/zipfile.
|
||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: GitHub Discussions
|
||||
url: https://github.com/filebrowser/filebrowser/discussions
|
||||
about: Please ask questions and discuss features here.
|
||||
16
.github/ISSUE_TEMPLATE/feature_request.md
vendored
16
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,16 +0,0 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
<!-- Add a clear and concise description of what the problem is. E.g. *I'm always frustrated when [...]* -->
|
||||
|
||||
**Describe the solution you'd like**
|
||||
<!-- Add a clear and concise description of what you want to happen. -->
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
<!-- Add a clear and concise description of any alternative solutions or features you've considered. -->
|
||||
|
||||
**Additional context**
|
||||
<!-- Add any other context or screenshots about the feature request here. -->
|
||||
27
.github/PULL_REQUEST_TEMPLATE.md
vendored
27
.github/PULL_REQUEST_TEMPLATE.md
vendored
@@ -1,19 +1,16 @@
|
||||
**Description**
|
||||
<!--
|
||||
Please explain the changes you made here.
|
||||
If the feature changes current behaviour, explain why your solution is better.
|
||||
-->
|
||||
## Description
|
||||
|
||||
: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/).
|
||||
<!-- Please explain the changes you made here. -->
|
||||
|
||||
- [ ] 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 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).
|
||||
- [ ] AVOID breaking the continuous integration build.
|
||||
## Additional Information
|
||||
|
||||
**Further comments**
|
||||
<!--
|
||||
If this is a relatively large or complex change, kick off the discussion by explaining why you chose the solution you did, what alternatives you considered, etc.
|
||||
<!-- If it is a relatively large or complex change, please add more information to explain what you did, how you did it, if you considered any alternatives, etc. -->
|
||||
|
||||
:heart: Thank you!
|
||||
-->
|
||||
## Checklist
|
||||
|
||||
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/).
|
||||
|
||||
- [ ] I am aware the project is currently in maintenance-only mode. See [README](https://github.com/filebrowser/community/blob/master/README.md)
|
||||
- [ ] I am aware that translations MUST be made through [Transifex](https://app.transifex.com/file-browser/file-browser/) and that this PR is NOT a translation update
|
||||
- [ ] I am making a PR against the `master` branch.
|
||||
- [ ] I am sure 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).
|
||||
|
||||
37
.github/workflows/main.yaml
vendored
37
.github/workflows/main.yaml
vendored
@@ -3,20 +3,25 @@ name: main
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- 'master'
|
||||
- "master"
|
||||
tags:
|
||||
- 'v*'
|
||||
- "v*"
|
||||
pull_request:
|
||||
|
||||
jobs:
|
||||
# linters
|
||||
# linters
|
||||
lint-frontend:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
package_json_file: "frontend/package.json"
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
node-version: "22.x"
|
||||
cache: "pnpm"
|
||||
cache-dependency-path: "frontend/pnpm-lock.yaml"
|
||||
- run: make lint-frontend
|
||||
lint-backend:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -24,7 +29,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.22.2
|
||||
go-version: 1.23.0
|
||||
- run: make lint-backend
|
||||
lint:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -32,14 +37,19 @@ jobs:
|
||||
steps:
|
||||
- run: echo "done"
|
||||
|
||||
# tests
|
||||
# tests
|
||||
test-frontend:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
package_json_file: "frontend/package.json"
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
node-version: "22.x"
|
||||
cache: "pnpm"
|
||||
cache-dependency-path: "frontend/pnpm-lock.yaml"
|
||||
- run: make test-frontend
|
||||
test-backend:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -47,7 +57,7 @@ jobs:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.22.2
|
||||
go-version: 1.23.0
|
||||
- run: make test-backend
|
||||
test:
|
||||
runs-on: ubuntu-latest
|
||||
@@ -55,7 +65,7 @@ jobs:
|
||||
steps:
|
||||
- run: echo "done"
|
||||
|
||||
# release
|
||||
# release
|
||||
release:
|
||||
runs-on: ubuntu-latest
|
||||
needs: [lint, test]
|
||||
@@ -66,10 +76,15 @@ jobs:
|
||||
fetch-depth: 0
|
||||
- uses: actions/setup-go@v5
|
||||
with:
|
||||
go-version: 1.22.2
|
||||
go-version: 1.23.0
|
||||
- uses: pnpm/action-setup@v4
|
||||
with:
|
||||
package_json_file: "frontend/package.json"
|
||||
- uses: actions/setup-node@v4
|
||||
with:
|
||||
node-version: '18'
|
||||
node-version: "22.x"
|
||||
cache: "pnpm"
|
||||
cache-dependency-path: "frontend/pnpm-lock.yaml"
|
||||
- name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
- name: Set up Docker Buildx
|
||||
|
||||
24
.github/workflows/stale.yml
vendored
24
.github/workflows/stale.yml
vendored
@@ -1,24 +0,0 @@
|
||||
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
|
||||
@@ -1,3 +1,5 @@
|
||||
version: 2
|
||||
|
||||
project_name: filebrowser
|
||||
|
||||
env:
|
||||
@@ -17,31 +19,30 @@ builds:
|
||||
- freebsd
|
||||
goarch:
|
||||
- amd64
|
||||
- 386
|
||||
- "386"
|
||||
- arm
|
||||
- arm64
|
||||
- riscv64
|
||||
goarm:
|
||||
- 5
|
||||
- 6
|
||||
- 7
|
||||
- "5"
|
||||
- "6"
|
||||
- "7"
|
||||
ignore:
|
||||
- goos: darwin
|
||||
goarch: 386
|
||||
goarch: "386"
|
||||
- goos: freebsd
|
||||
goarch: arm
|
||||
|
||||
archives:
|
||||
-
|
||||
name_template: "{{.Os}}-{{.Arch}}{{if .Arm}}v{{.Arm}}{{end}}-{{ .ProjectName }}"
|
||||
format: tar.gz
|
||||
- name_template: "{{.Os}}-{{.Arch}}{{if .Arm}}v{{.Arm}}{{end}}-{{ .ProjectName }}"
|
||||
formats: ["tar.gz"]
|
||||
format_overrides:
|
||||
- goos: windows
|
||||
format: zip
|
||||
formats: ["zip"]
|
||||
|
||||
dockers:
|
||||
-
|
||||
dockerfile: Dockerfile
|
||||
# Alpine docker images
|
||||
- dockerfile: Dockerfile
|
||||
use: buildx
|
||||
build_flag_templates:
|
||||
- "--pull"
|
||||
@@ -57,10 +58,8 @@ dockers:
|
||||
- "filebrowser/filebrowser:{{ .Tag }}-amd64"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-amd64"
|
||||
extra_files:
|
||||
- docker_config.json
|
||||
- healthcheck.sh
|
||||
-
|
||||
dockerfile: Dockerfile
|
||||
- docker
|
||||
- dockerfile: Dockerfile
|
||||
use: buildx
|
||||
build_flag_templates:
|
||||
- "--pull"
|
||||
@@ -76,10 +75,8 @@ dockers:
|
||||
- "filebrowser/filebrowser:{{ .Tag }}-arm64"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-arm64"
|
||||
extra_files:
|
||||
- docker_config.json
|
||||
- healthcheck.sh
|
||||
-
|
||||
dockerfile: Dockerfile
|
||||
- docker
|
||||
- dockerfile: Dockerfile
|
||||
use: buildx
|
||||
build_flag_templates:
|
||||
- "--pull"
|
||||
@@ -91,15 +88,13 @@ dockers:
|
||||
- "--platform=linux/arm/v6"
|
||||
goos: linux
|
||||
goarch: arm
|
||||
goarm: '6'
|
||||
goarm: "6"
|
||||
image_templates:
|
||||
- "filebrowser/filebrowser:{{ .Tag }}-armv6"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-armv6"
|
||||
extra_files:
|
||||
- docker_config.json
|
||||
- healthcheck.sh
|
||||
-
|
||||
dockerfile: Dockerfile
|
||||
- docker
|
||||
- dockerfile: Dockerfile
|
||||
use: buildx
|
||||
build_flag_templates:
|
||||
- "--pull"
|
||||
@@ -111,16 +106,15 @@ dockers:
|
||||
- "--platform=linux/arm/v7"
|
||||
goos: linux
|
||||
goarch: arm
|
||||
goarm: '7'
|
||||
goarm: "7"
|
||||
image_templates:
|
||||
- "filebrowser/filebrowser:{{ .Tag }}-armv7"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-armv7"
|
||||
extra_files:
|
||||
- docker_config.json
|
||||
- healthcheck.sh
|
||||
## s6 based docker images
|
||||
-
|
||||
dockerfile: Dockerfile.s6
|
||||
- docker
|
||||
|
||||
## s6-overlay docker images
|
||||
- dockerfile: Dockerfile.s6
|
||||
use: buildx
|
||||
build_flag_templates:
|
||||
- "--pull"
|
||||
@@ -136,9 +130,8 @@ dockers:
|
||||
- "filebrowser/filebrowser:{{ .Tag }}-amd64-s6"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-amd64-s6"
|
||||
extra_files:
|
||||
- docker/root
|
||||
-
|
||||
dockerfile: Dockerfile.s6.aarch64
|
||||
- docker
|
||||
- dockerfile: Dockerfile.s6.aarch64
|
||||
use: buildx
|
||||
build_flag_templates:
|
||||
- "--pull"
|
||||
@@ -154,7 +147,8 @@ dockers:
|
||||
- "filebrowser/filebrowser:{{ .Tag }}-arm64-s6"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-arm64-s6"
|
||||
extra_files:
|
||||
- docker/root
|
||||
- docker
|
||||
|
||||
docker_manifests:
|
||||
- name_template: "filebrowser/filebrowser:latest"
|
||||
image_templates:
|
||||
@@ -171,7 +165,7 @@ docker_manifests:
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-amd64"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-arm64"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-armv7"
|
||||
## s6 image manifests
|
||||
## s6 image manifests
|
||||
- name_template: "filebrowser/filebrowser:s6"
|
||||
image_templates:
|
||||
- "filebrowser/filebrowser:{{ .Tag }}-amd64-s6"
|
||||
@@ -184,15 +178,20 @@ docker_manifests:
|
||||
image_templates:
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-amd64-s6"
|
||||
- "filebrowser/filebrowser:v{{ .Major }}-arm64-s6"
|
||||
brews:
|
||||
|
||||
homebrew_casks:
|
||||
- name: filebrowser
|
||||
repository:
|
||||
owner: filebrowser
|
||||
name: homebrew-tap
|
||||
folder: Formula
|
||||
homepage: https://filebrowser.org
|
||||
commit_author:
|
||||
name: FileBrowser Robot
|
||||
email: robot@filebrowser.org
|
||||
homepage: https://github.com/filebrowser/filebrowser
|
||||
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"
|
||||
hooks:
|
||||
post:
|
||||
install: |
|
||||
if system_command("/usr/bin/xattr", args: ["-h"]).exit_status == 0
|
||||
system_command "/usr/bin/xattr", args: ["-dr", "com.apple.quarantine", "#{staged_path}/filebrowser"]
|
||||
end
|
||||
|
||||
10
.tx/config
10
.tx/config
@@ -1,10 +0,0 @@
|
||||
[main]
|
||||
host = https://www.transifex.com
|
||||
lang_map = pt_BR: pt-br, zh_CN: zh-cn, zh_HK: zh-hk, zh_TW: zh-tw, nl_BE: nl-be, sv_SE: sv-se
|
||||
|
||||
[file-browser.file-browser]
|
||||
file_filter = frontend/src/i18n/<lang>.json
|
||||
minimum_perc = 50
|
||||
source_file = frontend/src/i18n/en.json
|
||||
source_lang = en
|
||||
type = KEYVALUEJSON
|
||||
175
CHANGELOG.md
175
CHANGELOG.md
@@ -2,6 +2,179 @@
|
||||
|
||||
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.33.3](https://github.com/filebrowser/filebrowser/compare/v2.33.2...v2.33.3) (2025-06-22)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* keep command behavior in Dockerfile ([7c0c782](https://github.com/filebrowser/filebrowser/commit/7c0c7820efbbed2f0499353cc76ecb85d00ff7c3))
|
||||
* update search hotkey in help prompt ([#5178](https://github.com/filebrowser/filebrowser/issues/5178)) ([2741616](https://github.com/filebrowser/filebrowser/commit/2741616473636d40b7e9f14c9906ada08d328c3c))
|
||||
|
||||
### [2.33.2](https://github.com/filebrowser/filebrowser/compare/v2.33.1...v2.33.2) (2025-06-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* create user dir on signup ([0ca8059](https://github.com/filebrowser/filebrowser/commit/0ca8059d8dea4fe079146471ce4f24acc96021f2))
|
||||
|
||||
### [2.33.1](https://github.com/filebrowser/filebrowser/compare/v2.33.0...v2.33.1) (2025-06-21)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* downloadUrl of file preview ([#3728](https://github.com/filebrowser/filebrowser/issues/3728)) ([8a14018](https://github.com/filebrowser/filebrowser/commit/8a14018861fe581672bbd27cdc3ae5691f70a108))
|
||||
* remove auth query parameter from download and preview links ([cbb7124](https://github.com/filebrowser/filebrowser/commit/cbb712484d3bdabc033acaf3b696ef4f5865813d))
|
||||
* search uses ctrl+shift+f instead of hijacking browser's ctrl+f ([#4638](https://github.com/filebrowser/filebrowser/issues/4638)) ([a02b297](https://github.com/filebrowser/filebrowser/commit/a02b2972ebde2a58806ad1377bad46e748b63166))
|
||||
|
||||
## [2.33.0](https://github.com/filebrowser/filebrowser/compare/v2.32.3...v2.33.0) (2025-06-18)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* improved docker image volumes and permissions ([#5160](https://github.com/filebrowser/filebrowser/issues/5160)) ([2e26393](https://github.com/filebrowser/filebrowser/commit/2e26393a022df0eaa9e08727407aba8b997aa728))
|
||||
|
||||
### [2.32.3](https://github.com/filebrowser/filebrowser/compare/v2.32.2...v2.32.3) (2025-06-17)
|
||||
|
||||
### [2.32.2](https://github.com/filebrowser/filebrowser/compare/v2.32.1...v2.32.2) (2025-06-17)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* updated for project File Browser ([#5159](https://github.com/filebrowser/filebrowser/issues/5159)) ([c34c0af](https://github.com/filebrowser/filebrowser/commit/c34c0afecf3242b16ad5d5584cd90a6ad323361c))
|
||||
|
||||
### [2.32.1](https://github.com/filebrowser/filebrowser/compare/v2.32.0...v2.32.1) (2025-06-16)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add Vietnamese translation ([#3840](https://github.com/filebrowser/filebrowser/issues/3840)) ([56b80b6](https://github.com/filebrowser/filebrowser/commit/56b80b6d9b4710538765ba7df5da1f03898f6b81))
|
||||
* improve pt-br translations with new keys and refinements ([#4903](https://github.com/filebrowser/filebrowser/issues/4903)) ([a882fb6](https://github.com/filebrowser/filebrowser/commit/a882fb6c85ab6ccc845ed0bf3908d8e5e60ce346))
|
||||
* update translation ko.json ([#3852](https://github.com/filebrowser/filebrowser/issues/3852)) ([d9ebd65](https://github.com/filebrowser/filebrowser/commit/d9ebd65ffcf9b2166fec708d51849796d12b16e0))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* err shadowing lint ([c606a01](https://github.com/filebrowser/filebrowser/commit/c606a01a2d20932fb32ee896234d57631f8c47e4))
|
||||
* generate random admin password on quick setup ([a46acba](https://github.com/filebrowser/filebrowser/commit/a46acba5f92ee044661880d6ae349e289d984328)), closes [#3646](https://github.com/filebrowser/filebrowser/issues/3646)
|
||||
* imports lint ([54b91b8](https://github.com/filebrowser/filebrowser/commit/54b91b8ff0b8ee1f02f72425ab97d27a5d942fc3))
|
||||
* set videojs locale ([#3742](https://github.com/filebrowser/filebrowser/issues/3742)) ([71a8f56](https://github.com/filebrowser/filebrowser/commit/71a8f5662c207e3cd4ee714a5b5a961121f510cd))
|
||||
|
||||
|
||||
### Build
|
||||
|
||||
* **deps-dev:** bump vite from 6.0.11 to 6.1.6 in /frontend ([#3886](https://github.com/filebrowser/filebrowser/issues/3886)) ([5355629](https://github.com/filebrowser/filebrowser/commit/5355629fd1e7bd85ee3222fca22da899ba23ea95))
|
||||
* **deps:** bump golang.org/x/crypto from 0.31.0 to 0.35.0 ([#3865](https://github.com/filebrowser/filebrowser/issues/3865)) ([0ba9505](https://github.com/filebrowser/filebrowser/commit/0ba9505a19cb369653fc9f8260dc02fcc6587629))
|
||||
* **deps:** bump golang.org/x/net from 0.33.0 to 0.38.0 ([#3869](https://github.com/filebrowser/filebrowser/issues/3869)) ([cfea84f](https://github.com/filebrowser/filebrowser/commit/cfea84fd5e7ec9c1d2366293e5db12baaa4e3a81))
|
||||
* **deps:** bump vue-i18n from 11.0.1 to 11.1.2 in /frontend ([#3786](https://github.com/filebrowser/filebrowser/issues/3786)) ([35d1c09](https://github.com/filebrowser/filebrowser/commit/35d1c092434b80b22c89a614a02122e9f5965b39))
|
||||
|
||||
## [2.32.0](https://github.com/filebrowser/filebrowser/compare/v2.31.2...v2.32.0) (2025-01-31)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* create user on proxy authentication if user does not exist ([#3569](https://github.com/filebrowser/filebrowser/issues/3569)) ([209acf2](https://github.com/filebrowser/filebrowser/commit/209acf2429b06e2e8d78218937c59fd7e7edd1be))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* add proper healthcheck for S6 containers ([#3691](https://github.com/filebrowser/filebrowser/issues/3691)) ([045064f](https://github.com/filebrowser/filebrowser/commit/045064f8b8bf9f86058e877448085e38da8b3f2e))
|
||||
* disk usage refreshing ([#3692](https://github.com/filebrowser/filebrowser/issues/3692)) ([bbdd313](https://github.com/filebrowser/filebrowser/commit/bbdd313705b8d253f0c47ad717a6e47b2f46e719))
|
||||
* Fix user creation on proxy auth ([#3666](https://github.com/filebrowser/filebrowser/issues/3666)) ([5300d00](https://github.com/filebrowser/filebrowser/commit/5300d00d2e7dbb80a252aff57e100113f02506c3))
|
||||
* prompts disappearing on copy / move / upload ([#3537](https://github.com/filebrowser/filebrowser/issues/3537)) ([d1c84a8](https://github.com/filebrowser/filebrowser/commit/d1c84a84123c77dede05c023b3697a432b56122c))
|
||||
|
||||
|
||||
### Refactorings
|
||||
|
||||
* Fix eslint warnings ([#3698](https://github.com/filebrowser/filebrowser/issues/3698)) ([0201f9c](https://github.com/filebrowser/filebrowser/commit/0201f9c5c4dd2a4d5a3503e59cdb8045e8d3a91f)), closes [#3407](https://github.com/filebrowser/filebrowser/issues/3407)
|
||||
|
||||
|
||||
### Build
|
||||
|
||||
* **deps:** bump cross-spawn from 7.0.3 to 7.0.6 in /tools ([#3601](https://github.com/filebrowser/filebrowser/issues/3601)) ([25372ed](https://github.com/filebrowser/filebrowser/commit/25372edb5c0e616e82b76b5f523633af57d347e0))
|
||||
* **deps:** bump github.com/golang-jwt/jwt/v4 from 4.5.0 to 4.5.1 ([#3574](https://github.com/filebrowser/filebrowser/issues/3574)) ([2fdea73](https://github.com/filebrowser/filebrowser/commit/2fdea73430011846276a1cda52458f1d670f5ea7))
|
||||
* **deps:** bump golang.org/x/crypto from 0.26.0 to 0.31.0 ([#3634](https://github.com/filebrowser/filebrowser/issues/3634)) ([e92dbb4](https://github.com/filebrowser/filebrowser/commit/e92dbb4bb8b7894264fbf0a48a641712c3b68766))
|
||||
* **deps:** bump golang.org/x/net from 0.23.0 to 0.33.0 ([#3712](https://github.com/filebrowser/filebrowser/issues/3712)) ([1194cfe](https://github.com/filebrowser/filebrowser/commit/1194cfe0097a70399c1f06cf0f514b9d70fa463c))
|
||||
* **deps:** bump vue-i18n from 9.10.2 to 9.14.2 in /frontend ([#3618](https://github.com/filebrowser/filebrowser/issues/3618)) ([0659594](https://github.com/filebrowser/filebrowser/commit/065959451d3ba12019c6151274aa4e6904cdca99))
|
||||
* fix go releaser ([ba797cd](https://github.com/filebrowser/filebrowser/commit/ba797cda3135eddb9b7165dc5ceb932399cb54df))
|
||||
* update to node 22 and pnpm ([#3616](https://github.com/filebrowser/filebrowser/issues/3616)) ([d51a343](https://github.com/filebrowser/filebrowser/commit/d51a3438201274a1b826be1b775ca1035ade20c5))
|
||||
|
||||
### [2.31.2](https://github.com/filebrowser/filebrowser/compare/v2.31.1...v2.31.2) (2024-10-03)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* added whitespace before version ([#3510](https://github.com/filebrowser/filebrowser/issues/3510)) ([2b37e69](https://github.com/filebrowser/filebrowser/commit/2b37e696c9bde4d0c453de236a3555d982346bbb))
|
||||
* change location of custom init scripts ([#3493](https://github.com/filebrowser/filebrowser/issues/3493)) ([406d4f7](https://github.com/filebrowser/filebrowser/commit/406d4f78845a1684df7c9c457b208f4dd9b2a930))
|
||||
* files list alignment ([#3494](https://github.com/filebrowser/filebrowser/issues/3494)) ([64400ff](https://github.com/filebrowser/filebrowser/commit/64400ffda8b09f66b8662a3c9400235139800a4d))
|
||||
* german translation spelling typos ([#3469](https://github.com/filebrowser/filebrowser/issues/3469)) ([1e7c415](https://github.com/filebrowser/filebrowser/commit/1e7c41505fb6a3b9baa1534787492a186e09bcfb))
|
||||
|
||||
|
||||
### Build
|
||||
|
||||
* **deps-dev:** bump vite from 5.2.7 to 5.4.6 in /frontend ([#3496](https://github.com/filebrowser/filebrowser/issues/3496)) ([ec7b643](https://github.com/filebrowser/filebrowser/commit/ec7b643e8e9499f7ff226ec7f8e63a9df9890352))
|
||||
* **deps:** bump rollup from 4.21.3 to 4.22.4 in /frontend ([#3504](https://github.com/filebrowser/filebrowser/issues/3504)) ([03d74ee](https://github.com/filebrowser/filebrowser/commit/03d74ee7582196c09720f8d488056339f06c446c))
|
||||
|
||||
### [2.31.1](https://github.com/filebrowser/filebrowser/compare/v2.31.0...v2.31.1) (2024-08-30)
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* command not found in shell ([#3438](https://github.com/filebrowser/filebrowser/issues/3438)) ([121d9ab](https://github.com/filebrowser/filebrowser/commit/121d9abecdc7d4e923cfc5023519995938a6ccae))
|
||||
|
||||
|
||||
### Build
|
||||
|
||||
* update to alpine 3.20 ([#3447](https://github.com/filebrowser/filebrowser/issues/3447)) ([7de6bc4](https://github.com/filebrowser/filebrowser/commit/7de6bc4a912b5734dd0df02ed8391e78619e2615))
|
||||
|
||||
## [2.31.0](https://github.com/filebrowser/filebrowser/compare/v2.30.0...v2.31.0) (2024-08-29)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* add Czech translation ([#3416](https://github.com/filebrowser/filebrowser/issues/3416)) ([8e67a12](https://github.com/filebrowser/filebrowser/commit/8e67a12f260caefcbe419c2281025b9b15f02bf3))
|
||||
* Added epub preview. Resolves [#3375](https://github.com/filebrowser/filebrowser/issues/3375) ([#3376](https://github.com/filebrowser/filebrowser/issues/3376)) ([99a6382](https://github.com/filebrowser/filebrowser/commit/99a6382b320874e94f9bd74708f46dd9a7485d3c))
|
||||
* implement markdown file preview in Ace editor ([#3431](https://github.com/filebrowser/filebrowser/issues/3431)) ([b0f4604](https://github.com/filebrowser/filebrowser/commit/b0f4604f44e6a35e07df3000f106f523cd942cfc))
|
||||
* support mime type for epub extension ([#3425](https://github.com/filebrowser/filebrowser/issues/3425)) ([f6f7e5f](https://github.com/filebrowser/filebrowser/commit/f6f7e5fea3ff7073ee652008a51cb5445a6f3d5d))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* clipboard copy in safari ([#3261](https://github.com/filebrowser/filebrowser/issues/3261)) ([1fccc5d](https://github.com/filebrowser/filebrowser/commit/1fccc5d649add2a56c55e75cf9dec4851e6d7cbf))
|
||||
* CSS selectors for listing icons ([#3277](https://github.com/filebrowser/filebrowser/issues/3277)) ([2a90cdf](https://github.com/filebrowser/filebrowser/commit/2a90cdfdaff8655c7cb1167c01994a0978dece8f))
|
||||
* fix catalan i18n file ([090272e](https://github.com/filebrowser/filebrowser/commit/090272e3b7c56a940c4aa2d28f860c574aa17d53))
|
||||
* fixing an issue where the upload indicator would "jump" around in the UI ([#3354](https://github.com/filebrowser/filebrowser/issues/3354)) ([7be5644](https://github.com/filebrowser/filebrowser/commit/7be564495226bc6846289a56edb8893511036c6e))
|
||||
* **frontend:** N files selected hint use i18n ([#3390](https://github.com/filebrowser/filebrowser/issues/3390)) ([10bf3cf](https://github.com/filebrowser/filebrowser/commit/10bf3cffbf8eb7d95fe4e1cc6acf1012329744b9))
|
||||
* pdf preview header ([#3274](https://github.com/filebrowser/filebrowser/issues/3274)) ([a838868](https://github.com/filebrowser/filebrowser/commit/a8388689f3019083f263845900f683ddc13884dc))
|
||||
* pull down to refresh within editor ([#3378](https://github.com/filebrowser/filebrowser/issues/3378)) ([21783ed](https://github.com/filebrowser/filebrowser/commit/21783ed91a13ad52afdb411e43faf14fb6ef6e42))
|
||||
|
||||
|
||||
### Build
|
||||
|
||||
* bump go libs ([b596567](https://github.com/filebrowser/filebrowser/commit/b596567c6163d57eaefbf3e30d84cfca65c24cdf))
|
||||
* bump go version to 1.23.0 ([364fdaa](https://github.com/filebrowser/filebrowser/commit/364fdaaf0c1eace82ff8637d337cc1b32e5e9972))
|
||||
* bump golangci-lint to 1.60.3 ([a6347c8](https://github.com/filebrowser/filebrowser/commit/a6347c88586e584b4565277b0010fa9ff2576b1f))
|
||||
* **deps-dev:** bump braces from 3.0.2 to 3.0.3 in /frontend ([#3316](https://github.com/filebrowser/filebrowser/issues/3316)) ([e8589be](https://github.com/filebrowser/filebrowser/commit/e8589be6409a2b29edd44ee2edd3fbf6b2d72724))
|
||||
* **deps-dev:** bump ws from 8.16.0 to 8.17.1 in /frontend ([#3321](https://github.com/filebrowser/filebrowser/issues/3321)) ([c3465f9](https://github.com/filebrowser/filebrowser/commit/c3465f99136506d51b813be4f31b289e708da0ce))
|
||||
* **deps:** bump golang.org/x/image from 0.15.0 to 0.18.0 ([#3335](https://github.com/filebrowser/filebrowser/issues/3335)) ([30a8ddf](https://github.com/filebrowser/filebrowser/commit/30a8ddf113862e3de2c09547662b7f2af8a30dfe))
|
||||
* fix goreleaser file ([056cfa8](https://github.com/filebrowser/filebrowser/commit/056cfa8facdca4c397a6b245028d4c9d3f0ca518))
|
||||
|
||||
## [2.30.0](https://github.com/filebrowser/filebrowser/compare/v2.29.0...v2.30.0) (2024-05-19)
|
||||
|
||||
|
||||
### Features
|
||||
|
||||
* allow multi-select with SHIFT key in singleClick mode ([#3185](https://github.com/filebrowser/filebrowser/issues/3185)) ([2e47a03](https://github.com/filebrowser/filebrowser/commit/2e47a038d63de8f848b070578c1d71f765438a24))
|
||||
* Enhance MIME Type Detection for Additional File Extensions ([#3183](https://github.com/filebrowser/filebrowser/issues/3183)) ([be62f56](https://github.com/filebrowser/filebrowser/commit/be62f56782551e17d6d5dc23bc29cc56ef961a66))
|
||||
|
||||
|
||||
### Bug Fixes
|
||||
|
||||
* add overlay for sidebar on mobile ([#3197](https://github.com/filebrowser/filebrowser/issues/3197)) ([3b48f75](https://github.com/filebrowser/filebrowser/commit/3b48f75301287fe94cbbacff184b4db03f37f7ea))
|
||||
* current folder name in page title ([#3200](https://github.com/filebrowser/filebrowser/issues/3200)) ([e336a25](https://github.com/filebrowser/filebrowser/commit/e336a25ad29ed8b956169d426992860a877ee551))
|
||||
* Fixing the inability to play MKV video files online and enhancing the auxiliary features of the VideoPlayer. ([#3181](https://github.com/filebrowser/filebrowser/issues/3181)) ([782375b](https://github.com/filebrowser/filebrowser/commit/782375b1cb4c4f954468c30ec277ce021c82b40d))
|
||||
* shell window size ([#3198](https://github.com/filebrowser/filebrowser/issues/3198)) ([4c5b612](https://github.com/filebrowser/filebrowser/commit/4c5b612cb2563817f9da50413c7cf9e89b4c4d4a))
|
||||
* The file type icon in the file list is sensitive to the case of the suffix name ([#3187](https://github.com/filebrowser/filebrowser/issues/3187)) ([a9c327c](https://github.com/filebrowser/filebrowser/commit/a9c327cc0687796a3c7bfafd4ddabf4342859e31))
|
||||
|
||||
## [2.29.0](https://github.com/filebrowser/filebrowser/compare/v2.28.0...v2.29.0) (2024-04-30)
|
||||
|
||||
|
||||
@@ -38,7 +211,7 @@ All notable changes to this project will be documented in this file. See [standa
|
||||
* 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))
|
||||
* freezing the list in the background 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))
|
||||
|
||||
|
||||
41
Dockerfile
41
Dockerfile
@@ -1,19 +1,32 @@
|
||||
FROM alpine:latest
|
||||
RUN apk --update add ca-certificates \
|
||||
mailcap \
|
||||
curl \
|
||||
jq
|
||||
FROM alpine:3.22
|
||||
|
||||
COPY healthcheck.sh /healthcheck.sh
|
||||
RUN chmod +x /healthcheck.sh # Make the script executable
|
||||
RUN apk update && \
|
||||
apk --no-cache add ca-certificates mailcap curl jq tini
|
||||
|
||||
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \
|
||||
CMD /healthcheck.sh || exit 1
|
||||
# Make user and create necessary directories
|
||||
ENV UID=1000
|
||||
ENV GID=1000
|
||||
|
||||
RUN addgroup -g $GID user && \
|
||||
adduser -D -u $UID -G user user && \
|
||||
mkdir -p /config /database /srv && \
|
||||
chown -R user:user /config /database /srv
|
||||
|
||||
# Copy files and set permissions
|
||||
COPY filebrowser /bin/filebrowser
|
||||
COPY docker/common/ /
|
||||
COPY docker/alpine/ /
|
||||
|
||||
RUN chown -R user:user /bin/filebrowser /defaults healthcheck.sh init.sh
|
||||
|
||||
# Define healthcheck script
|
||||
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s CMD /healthcheck.sh
|
||||
|
||||
# Set the user, volumes and exposed ports
|
||||
USER user
|
||||
|
||||
VOLUME /srv /config /database
|
||||
|
||||
VOLUME /srv
|
||||
EXPOSE 80
|
||||
|
||||
COPY docker_config.json /.filebrowser.json
|
||||
COPY filebrowser /filebrowser
|
||||
|
||||
ENTRYPOINT [ "/filebrowser" ]
|
||||
ENTRYPOINT [ "tini", "--", "/init.sh", "filebrowser", "--config", "/config/settings.json" ]
|
||||
|
||||
@@ -1,16 +1,23 @@
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine:3.17
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine:3.22
|
||||
|
||||
RUN apk --update add ca-certificates \
|
||||
mailcap \
|
||||
curl
|
||||
RUN apk update && \
|
||||
apk --no-cache add ca-certificates mailcap curl jq
|
||||
|
||||
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \
|
||||
CMD curl -f http://localhost/health || exit 1
|
||||
# Make user and create necessary directories
|
||||
RUN mkdir -p /config /database /srv && \
|
||||
chown -R abc:abc /config /database /srv
|
||||
|
||||
# copy local files
|
||||
COPY docker/root/ /
|
||||
COPY filebrowser /usr/bin/filebrowser
|
||||
# Copy files and set permissions
|
||||
COPY filebrowser /bin/filebrowser
|
||||
COPY docker/common/ /
|
||||
COPY docker/s6/ /
|
||||
|
||||
# ports and volumes
|
||||
RUN chown -R abc:abc /bin/filebrowser /defaults healthcheck.sh
|
||||
|
||||
# Define healthcheck script
|
||||
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s CMD /healthcheck.sh
|
||||
|
||||
# Set the volumes and exposed ports
|
||||
VOLUME /srv /config /database
|
||||
EXPOSE 80
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
@@ -1,16 +1,23 @@
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.17
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine:arm64v8-3.22
|
||||
|
||||
RUN apk --update add ca-certificates \
|
||||
mailcap \
|
||||
curl
|
||||
RUN apk update && \
|
||||
apk --no-cache add ca-certificates mailcap curl jq
|
||||
|
||||
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \
|
||||
CMD curl -f http://localhost/health || exit 1
|
||||
# Make user and create necessary directories
|
||||
RUN mkdir -p /config /database /srv && \
|
||||
chown -R abc:abc /config /database /srv
|
||||
|
||||
# copy local files
|
||||
COPY docker/root/ /
|
||||
COPY filebrowser /usr/bin/filebrowser
|
||||
# Copy files and set permissions
|
||||
COPY filebrowser /bin/filebrowser
|
||||
COPY docker/common/ /
|
||||
COPY docker/s6/ /
|
||||
|
||||
# ports and volumes
|
||||
RUN chown -R abc:abc /bin/filebrowser /defaults healthcheck.sh
|
||||
|
||||
# Define healthcheck script
|
||||
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s CMD /healthcheck.sh
|
||||
|
||||
# Set the volumes and exposed ports
|
||||
VOLUME /srv /config /database
|
||||
EXPOSE 80
|
||||
|
||||
EXPOSE 80
|
||||
|
||||
@@ -1,16 +0,0 @@
|
||||
FROM ghcr.io/linuxserver/baseimage-alpine:arm32v7-3.17
|
||||
|
||||
RUN apk --update add ca-certificates \
|
||||
mailcap \
|
||||
curl
|
||||
|
||||
HEALTHCHECK --start-period=2s --interval=5s --timeout=3s \
|
||||
CMD curl -f http://localhost/health || exit 1
|
||||
|
||||
# copy local files
|
||||
COPY docker/root/ /
|
||||
COPY filebrowser /usr/bin/filebrowser
|
||||
|
||||
# ports and volumes
|
||||
VOLUME /srv /config /database
|
||||
EXPOSE 80
|
||||
7
Makefile
7
Makefile
@@ -10,7 +10,7 @@ build: | build-frontend build-backend ## Build binary
|
||||
|
||||
.PHONY: build-frontend
|
||||
build-frontend: ## Build frontend
|
||||
$Q cd frontend && npm ci && npm run build
|
||||
$Q cd frontend && pnpm install --frozen-lockfile && pnpm run build
|
||||
|
||||
.PHONY: build-backend
|
||||
build-backend: ## Build backend
|
||||
@@ -21,6 +21,7 @@ test: | test-frontend test-backend ## Run all tests
|
||||
|
||||
.PHONY: test-frontend
|
||||
test-frontend: ## Run frontend tests
|
||||
$Q cd frontend && pnpm install --frozen-lockfile && pnpm run typecheck
|
||||
|
||||
.PHONY: test-backend
|
||||
test-backend: ## Run backend tests
|
||||
@@ -31,7 +32,7 @@ lint: lint-frontend lint-backend ## Run all linters
|
||||
|
||||
.PHONY: lint-frontend
|
||||
lint-frontend: ## Run frontend linters
|
||||
$Q cd frontend && npm ci && npm run lint
|
||||
$Q cd frontend && pnpm install --frozen-lockfile && pnpm run lint
|
||||
|
||||
.PHONY: lint-backend
|
||||
lint-backend: | $(golangci-lint) ## Run backend linters
|
||||
@@ -65,4 +66,4 @@ help: ## Show this help
|
||||
@awk 'BEGIN {FS = ":.*?## "} { \
|
||||
if (/^[a-zA-Z_-]+:.*?##.*$$/) {printf " ${YELLOW}%-20s${GREEN}%s${RESET}\n", $$1, $$2} \
|
||||
else if (/^## .*$$/) {printf " ${CYAN}%s${RESET}\n", substr($$1,4)} \
|
||||
}' $(MAKEFILE_LIST)
|
||||
}' $(MAKEFILE_LIST)
|
||||
|
||||
37
README.md
37
README.md
@@ -12,28 +12,41 @@
|
||||
|
||||
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
|
||||
> [!WARNING]
|
||||
>
|
||||
> This project is currently on **maintenance-only** mode, and is looking for new maintainers. For more information, please read the [discussion #4906](https://github.com/filebrowser/filebrowser/discussions/4906). Therefore, please note the following:
|
||||
>
|
||||
> - It can take a while until someone gets back to you. Please be patient.
|
||||
> - [Issues][issues] are only being used to track bugs. Any unrelated issues will be converted into a [discussion][discussions].
|
||||
> - No new features will be implemented until further notice. The priority is on triaging issues and merge bug fixes.
|
||||
>
|
||||
> If you're interested in maintaining this project, please reach out via the discussion above.
|
||||
|
||||
url: https://demo.filebrowser.org/
|
||||
|
||||
credentials: `demo`/`demo`
|
||||
[issues]: https://github.com/filebrowser/filebrowser/issues
|
||||
[discussions]: https://github.com/filebrowser/filebrowser/discussions
|
||||
|
||||
## Features
|
||||
|
||||
Please refer to our docs at [https://filebrowser.org/features](https://filebrowser.org/features)
|
||||
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. You have many available features!
|
||||
|
||||
| Easy Login System | Sleek Interface | User Management |
|
||||
| :----------------------: | :----------------------: | :----------------------: |
|
||||
|  |  |  |
|
||||
|
||||
|
||||
| File Editing | Custom Commands | Customization |
|
||||
| :----------------------: | :----------------------: | :----------------------: |
|
||||
|  |  |  |
|
||||
|
||||
|
||||
## Install
|
||||
|
||||
For installation instructions please refer to our docs at [https://filebrowser.org/installation](https://filebrowser.org/installation).
|
||||
For information on how to install File Browser, please check [docs/installation.md](./docs/installation.md).
|
||||
|
||||
## Configuration
|
||||
|
||||
[Authentication Method](https://filebrowser.org/configuration/authentication-method) - You can change the way the user authenticates with the filebrowser server
|
||||
|
||||
[Command Runner](https://filebrowser.org/configuration/command-runner) - The command runner is a feature that enables you to execute any shell command you want before or after a certain event.
|
||||
|
||||
[Custom Branding](https://filebrowser.org/configuration/custom-branding) - You can customize your File Browser installation by change its name to any other you want, by adding a global custom style sheet and by using your own logotype if you want.
|
||||
For information on how to configure File Browser, please check [docs/configuration.md](./docs/configuration.md).
|
||||
|
||||
## Contributing
|
||||
|
||||
If you're interested in contributing to this project, our docs are best places to start [https://filebrowser.org/contributing](https://filebrowser.org/contributing).
|
||||
For information on how to contribute to the project, including how translations are managed, please check [docs/contributing.md](./docs/contributing.md).
|
||||
|
||||
26
SECURITY.md
26
SECURITY.md
@@ -1,26 +0,0 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Use this section to tell people about which versions of your project are
|
||||
currently being supported with security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 2.x | :white_check_mark: |
|
||||
| < 2.0 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Vulnerabilities should be reported to filebrowser@googlegroups.com - which is a private, maintainer-only group. Maintainers will attempt to respond to/confirm reports within 2-3 days, but if you believe your report to be "critical" to user safety and security, please note as such in the subject. We have tens of thousands of users using our software, and take security vulnerabilities seriously.
|
||||
|
||||
When reporting an issue, where possible, please provide at least:
|
||||
|
||||
* The commit version the issue was identified at
|
||||
* A proof of concept (plaintext; no binaries)
|
||||
* Steps to reproduce
|
||||
* Your recommended remediation(s), if any.
|
||||
|
||||
The FileBrowser team is a volunteer-only effort, and may reach back out for clarification.
|
||||
|
||||
> Note: Please do not open public issues for security issues, as GitHub does not provide facility for private issues, and deleting the issue makes it hard to triage/respond back to the reporter.
|
||||
@@ -1,9 +1,9 @@
|
||||
package auth
|
||||
|
||||
import (
|
||||
"crypto/rand"
|
||||
"errors"
|
||||
"net/http"
|
||||
"os"
|
||||
|
||||
fbErrors "github.com/filebrowser/filebrowser/v2/errors"
|
||||
"github.com/filebrowser/filebrowser/v2/settings"
|
||||
@@ -19,14 +19,49 @@ type ProxyAuth struct {
|
||||
}
|
||||
|
||||
// Auth authenticates the user via an HTTP header.
|
||||
func (a ProxyAuth) Auth(r *http.Request, usr users.Store, _ *settings.Settings, srv *settings.Server) (*users.User, error) {
|
||||
func (a ProxyAuth) Auth(r *http.Request, usr users.Store, setting *settings.Settings, srv *settings.Server) (*users.User, error) {
|
||||
username := r.Header.Get(a.Header)
|
||||
user, err := usr.Get(srv.Root, username)
|
||||
if errors.Is(err, fbErrors.ErrNotExist) {
|
||||
return nil, os.ErrPermission
|
||||
return a.createUser(usr, setting, srv, username)
|
||||
}
|
||||
return user, err
|
||||
}
|
||||
|
||||
func (a ProxyAuth) createUser(usr users.Store, setting *settings.Settings, srv *settings.Server, username string) (*users.User, error) {
|
||||
const passwordSize = 32
|
||||
randomPasswordBytes := make([]byte, passwordSize)
|
||||
_, err := rand.Read(randomPasswordBytes)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return user, err
|
||||
var hashedRandomPassword string
|
||||
hashedRandomPassword, err = users.HashPwd(string(randomPasswordBytes))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
user := &users.User{
|
||||
Username: username,
|
||||
Password: hashedRandomPassword,
|
||||
LockPassword: true,
|
||||
}
|
||||
setting.Defaults.Apply(user)
|
||||
|
||||
var userHome string
|
||||
userHome, err = setting.MakeUserDir(user.Username, user.Scope, srv.Root)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
user.Scope = userHome
|
||||
|
||||
err = usr.Save(user)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
||||
|
||||
// LoginPage tells that proxy auth doesn't require a login page.
|
||||
|
||||
12
cmd/root.go
12
cmd/root.go
@@ -76,7 +76,7 @@ var rootCmd = &cobra.Command{
|
||||
Use: "filebrowser",
|
||||
Short: "A stylish web-based file browser",
|
||||
Long: `File Browser CLI lets you create the database to use with File Browser,
|
||||
manage your users and all the configurations without acessing the
|
||||
manage your users and all the configurations without accessing the
|
||||
web interface.
|
||||
|
||||
If you've never run File Browser, you'll need to have a database for
|
||||
@@ -108,7 +108,7 @@ name in caps. So to set "database" via an env variable, you should
|
||||
set FB_DATABASE.
|
||||
|
||||
Also, if the database path doesn't exist, File Browser will enter into
|
||||
the quick setup mode and a new database will be bootstraped and a new
|
||||
the quick setup mode and a new database will be bootstrapped and a new
|
||||
user created with the credentials from options "username" and "password".`,
|
||||
Run: python(func(cmd *cobra.Command, _ []string, d pythonData) {
|
||||
log.Println(cfgFile)
|
||||
@@ -378,7 +378,13 @@ func quickSetup(flags *pflag.FlagSet, d pythonData) {
|
||||
password := getParam(flags, "password")
|
||||
|
||||
if password == "" {
|
||||
password, err = users.HashPwd("admin")
|
||||
var pwd string
|
||||
pwd, err = users.RandomPwd()
|
||||
checkErr(err)
|
||||
|
||||
log.Println("Generated random admin password for quick setup:", pwd)
|
||||
|
||||
password, err = users.HashPwd(pwd)
|
||||
checkErr(err)
|
||||
}
|
||||
|
||||
|
||||
@@ -188,7 +188,7 @@ func cleanUpMapValue(v interface{}) interface{} {
|
||||
}
|
||||
|
||||
// convertCmdStrToCmdArray checks if cmd string is blank (whitespace included)
|
||||
// then returns empty string array, else returns the splitted word array of cmd.
|
||||
// then returns empty string array, else returns the split word array of cmd.
|
||||
// This is to ensure the result will never be []string{""}
|
||||
func convertCmdStrToCmdArray(cmd string) []string {
|
||||
var cmdArray []string
|
||||
|
||||
41
docker/alpine/init.sh
Executable file
41
docker/alpine/init.sh
Executable file
@@ -0,0 +1,41 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
# Backwards compatibility for old Docker image
|
||||
if [ -f "/.filebrowser.json" ]; then
|
||||
ln -s /.filebrowser.json /config/settings.json
|
||||
|
||||
echo ""
|
||||
echo "!!!!!!!!!!!!!!!!!!!!! IMPORTANT INFORMATION !!!!!!!!!!!!!!!!!!!!!"
|
||||
echo "Symlinking /.filebrowser.json to /config/settings.json for backwards compatibility."
|
||||
echo ""
|
||||
echo "The volume mount configuration has changed in the latest release."
|
||||
echo "Please rename .filebrowser.json to settings.json and mount the parent directory to /config".
|
||||
echo "Read more on https://github.com/filebrowser/filebrowser/blob/master/docs/installation.md#docker"
|
||||
echo ""
|
||||
echo "This workaround will be removed in a future release."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Backwards compatibility for old Docker image
|
||||
if [ -f "/database.db" ]; then
|
||||
ln -s /database.db /database/filebrowser.db
|
||||
|
||||
echo ""
|
||||
echo "!!!!!!!!!!!!!!!!!!!!! IMPORTANT INFORMATION !!!!!!!!!!!!!!!!!!!!!"
|
||||
echo ""
|
||||
echo "The volume mount configuration has changed in the latest release."
|
||||
echo "Please rename database.db to filebrowser.db and mount the parent directory to /database".
|
||||
echo "Read more on https://github.com/filebrowser/filebrowser/blob/master/docs/installation.md#docker"
|
||||
echo ""
|
||||
echo "This workaround will be removed in a future release."
|
||||
echo ""
|
||||
fi
|
||||
|
||||
# Ensure configuration exists
|
||||
if [ ! -f "/config/settings.json" ]; then
|
||||
cp -a /defaults/settings.json /config/settings.json
|
||||
fi
|
||||
|
||||
exec "$@"
|
||||
9
docker/common/healthcheck.sh
Executable file
9
docker/common/healthcheck.sh
Executable file
@@ -0,0 +1,9 @@
|
||||
#!/bin/sh
|
||||
|
||||
set -e
|
||||
|
||||
PORT=${FB_PORT:-$(jq -r .port /config/settings.json)}
|
||||
ADDRESS=${FB_ADDRESS:-$(jq -r .address /config/settings.json)}
|
||||
ADDRESS=${ADDRESS:-localhost}
|
||||
|
||||
curl -f http://$ADDRESS:$PORT/health || exit 1
|
||||
@@ -1,3 +0,0 @@
|
||||
#!/usr/bin/with-contenv bash
|
||||
|
||||
exec s6-setuidgid abc filebrowser -c /config/settings.json -d /database/filebrowser.db;
|
||||
7
docker/root/etc/cont-init.d/20-config → docker/s6/custom-cont-init.d/20-config
Normal file → Executable file
7
docker/root/etc/cont-init.d/20-config → docker/s6/custom-cont-init.d/20-config
Normal file → Executable file
@@ -1,9 +1,6 @@
|
||||
#!/usr/bin/with-contenv bash
|
||||
|
||||
# make folders
|
||||
mkdir -p /database
|
||||
|
||||
# copy config
|
||||
# Ensure configuration exists
|
||||
if [ ! -f "/config/settings.json" ]; then
|
||||
cp -a /defaults/settings.json /config/settings.json
|
||||
fi
|
||||
@@ -12,4 +9,4 @@ fi
|
||||
chown abc:abc \
|
||||
/config/settings.json \
|
||||
/database \
|
||||
/srv
|
||||
/srv
|
||||
3
docker/s6/etc/services.d/filebrowser/run
Executable file
3
docker/s6/etc/services.d/filebrowser/run
Executable file
@@ -0,0 +1,3 @@
|
||||
#!/usr/bin/with-contenv bash
|
||||
|
||||
exec s6-setuidgid abc filebrowser -c /config/settings.json;
|
||||
BIN
docs/assets/1.jpg
Normal file
BIN
docs/assets/1.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 65 KiB |
BIN
docs/assets/2.jpg
Normal file
BIN
docs/assets/2.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 116 KiB |
BIN
docs/assets/3.jpg
Normal file
BIN
docs/assets/3.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 151 KiB |
BIN
docs/assets/4.jpg
Normal file
BIN
docs/assets/4.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 212 KiB |
BIN
docs/assets/5.jpg
Normal file
BIN
docs/assets/5.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 130 KiB |
BIN
docs/assets/6.jpg
Normal file
BIN
docs/assets/6.jpg
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 60 KiB |
46
docs/code-of-conduct.md
Normal file
46
docs/code-of-conduct.md
Normal file
@@ -0,0 +1,46 @@
|
||||
# Code of Conduct
|
||||
|
||||
## Contributor Covenant Code of Conduct
|
||||
|
||||
### Our Pledge
|
||||
|
||||
In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation.
|
||||
|
||||
### Our Standards
|
||||
|
||||
Examples of behavior that contributes to creating a positive environment include:
|
||||
|
||||
* Using welcoming and inclusive language
|
||||
* Being respectful of differing viewpoints and experiences
|
||||
* Gracefully accepting constructive criticism
|
||||
* Focusing on what is best for the community
|
||||
* Showing empathy towards other community members
|
||||
|
||||
Examples of unacceptable behavior by participants include:
|
||||
|
||||
* The use of sexualized language or imagery and unwelcome sexual attention or advances
|
||||
* Trolling, insulting/derogatory comments, and personal or political attacks
|
||||
* Public or private harassment
|
||||
* Publishing others' private information, such as a physical or electronic address, without explicit permission
|
||||
* Other conduct which could reasonably be considered inappropriate in a professional setting
|
||||
|
||||
### Our Responsibilities
|
||||
|
||||
Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior.
|
||||
|
||||
Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful.
|
||||
|
||||
### Scope
|
||||
|
||||
This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers.
|
||||
|
||||
### Enforcement
|
||||
|
||||
Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at hacdias@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately.
|
||||
|
||||
Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership.
|
||||
|
||||
### Attribution
|
||||
|
||||
This Code of Conduct is adapted from the [Contributor Covenant](http://contributor-covenant.org), version 1.4, available at [https://contributor-covenant.org/version/1/4](https://contributor-covenant.org/version/1/4).
|
||||
|
||||
148
docs/configuration.md
Normal file
148
docs/configuration.md
Normal file
@@ -0,0 +1,148 @@
|
||||
# Configuration
|
||||
|
||||
Most of the configuration can be understood through our Command Line Interface documentation. Although there are some specific topics that we want to cover on this section.
|
||||
|
||||
## Custom Branding
|
||||
|
||||
You are able to customize your File Browser installation by changing its name to any other you want, by adding a global custom style sheet and by using your own logotype if you want. To address this, there are three configuration options that can be changed:
|
||||
|
||||
* **Name:** which is the instance name that will show up on login and signup pages. This won't replace the version message in the sidebar.
|
||||
* **Disable external links:** this will disable any external links (except the ones to this documentation).
|
||||
* **Folder:** is the path to a directory that can contain two items:
|
||||
* **custom.css**, containing the styles you want to apply to your installation.
|
||||
* **img** a directory whose files can replace the [default logotypes](../frontend/public/img) in the application.
|
||||
|
||||
These options can be either set via the CLI interface using the following command:
|
||||
|
||||
```sh
|
||||
filebrowser config set --branding.name "My Name" \
|
||||
--branding.files "/abs/path/to/my/dir" \
|
||||
--branding.disableExternal
|
||||
```
|
||||
Or can be set under 'Branding directory path' in **Settings → Global Settings**.
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> If using Docker then remember to bind this directory, for example as `/home/username/containers/filebrowser/branding:/branding`
|
||||
|
||||
For custom icons to be recognized you need to create `img` and `img/icons` directories and place the svg in the `branding/img` directory:
|
||||
|
||||
```
|
||||
- filebrowser
|
||||
- branding
|
||||
- img
|
||||
- icons
|
||||
- logo.svg
|
||||
- filebrowser.db
|
||||
```
|
||||
|
||||
To replace the favicon you need to place this in the `img/icons` directory but also note that some of the other PNG icon types will be required too (see the default logotypes link above) as the browser will normally use the highest resolution option available (at a minimum the 16x16 and 32x32 options). You can use the [Real Favicon Generator](https://realfavicongenerator.net/) to generate these for you from your base image.
|
||||
|
||||
The icons are cached, to make the new ones appear more quickly open developer tools in your browser, then click on the Application tab, then Storage and then 'Clear Site Data'.
|
||||
|
||||
## Authentication Method
|
||||
|
||||
Right now, there are three possible authentication methods. Each one of them has its own capabilities and specification. If you are interested in contributing with one more authentication method, please [check the guidelines](./contributing.md).
|
||||
|
||||
### JSON Auth (default)
|
||||
|
||||
We call it JSON Authentication but it is just the default authentication method and the one that is provided by default if you don't make any changes. It is set by default, but if you've made changes before you can revert to using JSON auth:
|
||||
|
||||
```sh
|
||||
filebrowser config set --auth.method=json
|
||||
```
|
||||
|
||||
This method can also be extended with **reCAPTCHA** verification during login:
|
||||
|
||||
```sh
|
||||
filebrowser config set --auth.method=json \
|
||||
--recaptcha.key site-key \
|
||||
--recaptcha.secret private-key
|
||||
```
|
||||
|
||||
By default, we use [Google's reCAPTCHA](https://developers.google.com/recaptcha/docs/display) service. If you live in China, or want to use other provider, you can change the host with the following command:
|
||||
|
||||
```sh
|
||||
filebrowser config set --recaptcha.host https://recaptcha.net
|
||||
```
|
||||
|
||||
Where `https://recaptcha.net` is any provider you want.
|
||||
|
||||
|
||||
> [!CAUTION]
|
||||
>
|
||||
> Note that you **always** need to set the `--auth.method` flag when changing authentication configurations and that it will completely overwrite your current settings. [This is a known issue.](https://github.com/filebrowser/filebrowser/issues/715)
|
||||
|
||||
### Proxy Header
|
||||
|
||||
If you have a reverse proxy you want to use to login your users, you do it via our `proxy` authentication method. To configure this method, your proxy must send an HTTP header containing the username of the logged in user:
|
||||
|
||||
```sh
|
||||
filebrowser config set --auth.method=proxy --auth.header=X-My-Header
|
||||
```
|
||||
|
||||
Where `X-My-Header` is the HTTP header provided by your proxy with the username.
|
||||
|
||||
> [!WARNING]
|
||||
>
|
||||
> File Browser will blindly trust the provided header. If the proxy can be bypassed, an attacker could simply attach the header and get admin access.
|
||||
|
||||
### No Authentication
|
||||
|
||||
We also provide a no authentication mechanism for users that want to use File Browser privately such in a home network. By setting this authentication method, the user with **id 1** will be used as the default users. Creating more users won't have any effect.
|
||||
|
||||
```sh
|
||||
filebrowser config set --auth.method=noauth
|
||||
```
|
||||
|
||||
## Command Runner
|
||||
|
||||
The command runner is a feature that enables you to execute any shell command you want before or after a certain event. Right now, these are the events:
|
||||
|
||||
* Copy
|
||||
* Rename
|
||||
* Upload
|
||||
* Delete
|
||||
* Save
|
||||
|
||||
Also, during the execution of the commands set for those hooks, there will be some environment variables available to help you perform your commands:
|
||||
|
||||
* `FILE` with the full absolute path to the changed file.
|
||||
* `SCOPE` with the path to user's scope.
|
||||
* `TRIGGER` with the name of the event.
|
||||
* `USERNAME` with the user's username.
|
||||
* `DESTINATION` with the absolute path to the destination. Only used for **copy** and **rename.**
|
||||
|
||||
At this moment, you can edit the commands via the command line interface, using the following commands \(please check the flag `--help` to know more about them\):
|
||||
|
||||
```bash
|
||||
filebrowser cmds add before_copy "echo $FILE"
|
||||
filebrowser cmds rm before_copy 0
|
||||
filebrowser cmds ls
|
||||
```
|
||||
|
||||
Or you can use the web interface to manage them via **Settings** → **Global Settings**.
|
||||
|
||||
|
||||
## Shell commands
|
||||
|
||||
Within Filebrowser you can toggle the shell (`< >` icon at the top right) and this will open a shell command window at the bottom of the screen.
|
||||
|
||||
**By default no commands are available as the command list is empty**
|
||||
|
||||
To enable commands these need to either be done on a per-user basis (including for the Admin user).
|
||||
|
||||
You can do this by adding them in Settings > User Management > (edit user) > Commands or to *apply to all new users created from that point forward* they can be set in Settings > Global Settings
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> If using a proxy manager then remember to enable websockets support for the Filebrowser proxy
|
||||
|
||||
> [!NOTE]
|
||||
>
|
||||
> If using Docker and you want to add a new command that is not in the base image then you will need to build a custom Docker image using `filebrowser/filebrowser` as a base image. For example to add 7z:
|
||||
>
|
||||
> ```docker
|
||||
> FROM filebrowser/filebrowser
|
||||
> RUN sudo apt install p7zip-full
|
||||
> ```
|
||||
91
docs/contributing.md
Normal file
91
docs/contributing.md
Normal file
@@ -0,0 +1,91 @@
|
||||
# Contributing
|
||||
|
||||
If you're interested in contributing to this project, this is the best place to start. Before contributing to this project, please take a bit of time to read our [Code of Conduct](./code-of-conduct.md). Also, note that this project is open-source and licensed under [Apache License 2.0](../LICENSE).
|
||||
|
||||
## Project Structure
|
||||
|
||||
The backend side of the application is written in [Go](https://golang.org/), while the frontend (located on a subdirectory of the same name) is written in [Vue.js](https://vuejs.org/). Due to the tight coupling required by some features, basic knowledge of both Go and Vue.js is recommended.
|
||||
|
||||
* Learn Go: [https://github.com/golang/go/wiki/Learn](https://github.com/golang/go/wiki/Learn)
|
||||
* Learn Vue.js: [https://vuejs.org/guide/introduction.html](https://vuejs.org/guide/introduction.html)
|
||||
|
||||
We encourage you to use git to manage your fork. To clone the main repository, just run:
|
||||
|
||||
```bash
|
||||
git clone https://github.com/filebrowser/filebrowser
|
||||
```
|
||||
|
||||
## Build
|
||||
|
||||
### Frontend
|
||||
|
||||
We are using [Node.js](https://nodejs.org/en/) on the frontend to manage the build process. The steps to build it are:
|
||||
|
||||
```bash
|
||||
# From the root of the repo, go to frontend/
|
||||
cd frontend
|
||||
|
||||
# Install the dependencies
|
||||
pnpm install
|
||||
|
||||
# Build the frontend
|
||||
pnpm run build
|
||||
```
|
||||
|
||||
This will install the dependencies and build the frontend so you can then embed it into the Go app. Although, if you want to play with it, you'll get bored of building it after every change you do. So, you can run the command below to watch for changes:
|
||||
|
||||
```bash
|
||||
pnpm run dev
|
||||
```
|
||||
|
||||
### Backend
|
||||
|
||||
First of all, you need to download the required dependencies. We are using the built-in `go mod` tool for dependency management. To get the modules, run:
|
||||
|
||||
```bash
|
||||
go mod download
|
||||
```
|
||||
|
||||
The magic of File Browser is that the static assets are bundled into the final binary. For that, we use [Go embed.FS](https://golang.org/pkg/embed/). The files from `frontend/dist` will be embedded during the build process.
|
||||
|
||||
To build File Browser is just like any other Go program:
|
||||
|
||||
```bash
|
||||
go build
|
||||
```
|
||||
|
||||
To create a development build use the "dev" tag, this way the content inside the frontend folder will not be embedded in the binary but will be reloaded at every change:
|
||||
|
||||
```bash
|
||||
go build -tags dev
|
||||
```
|
||||
|
||||
## Translations
|
||||
|
||||
Translations are managed on Transifex, which is an online website where everyone can contribute and translate strings for our project. It automatically syncs with the main language file \(in English\) and,, for you to contribute, you just need to:
|
||||
|
||||
1. Go to our Transifex web page: [app.transifex.com/file-browser/file-browser](https://app.transifex.com/file-browser/file-browser/)
|
||||
2. Click on **Join the project** and pick your language. We'll accept you as soon as possible. If you're language is not on the list, please request it via the interface.
|
||||
|
||||
Translations are automatically pushed to GitHub via an integration.
|
||||
|
||||
## Authentication Provider
|
||||
|
||||
To build a new authentication provider, you need to implement the [Auther interface](https://github.com/filebrowser/filebrowser/blob/master/auth/auth.go), whose method will be called on the login page after the user has submitted their login data.
|
||||
|
||||
```go
|
||||
// Auther is the authentication interface.
|
||||
type Auther interface {
|
||||
// Auth is called to authenticate a request.
|
||||
Auth(r *http.Request, s *users.Storage, root string) (*users.User, error)
|
||||
}
|
||||
```
|
||||
|
||||
After implementing the interface you should:
|
||||
|
||||
1. Add it to [`auth` directory](https://github.com/filebrowser/filebrowser/blob/master/auth).
|
||||
2. Add it to the [configuration parser](https://github.com/filebrowser/filebrowser/blob/master/cmd/config.go) for the CLI.
|
||||
3. Add it to the [`authBackend.Get`](https://github.com/filebrowser/filebrowser/blob/master/storage/bolt/auth.go).
|
||||
|
||||
If you need to add more flags, please update the function `addConfigFlags`.
|
||||
|
||||
80
docs/installation.md
Normal file
80
docs/installation.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# Installation
|
||||
|
||||
File Browser is a single binary and can be used as a standalone executable. Although, some might prefer to use it with [Docker](https://www.docker.com) or [Caddy](https://caddyserver.com), which is a fantastic web server that enables HTTPS by default. Its installation is quite straightforward independently on which system you want to use.
|
||||
|
||||
## Quick Setup
|
||||
|
||||
The quickest way for beginners to start using File Browser is by opening your terminal and executing the following commands:
|
||||
|
||||
### Brew
|
||||
|
||||
```sh
|
||||
brew tap filebrowser/tap
|
||||
brew install filebrowser
|
||||
filebrowser -r /path/to/your/files
|
||||
```
|
||||
|
||||
### Unix
|
||||
|
||||
```sh
|
||||
curl -fsSL https://raw.githubusercontent.com/filebrowser/get/master/get.sh | bash
|
||||
filebrowser -r /path/to/your/files
|
||||
```
|
||||
|
||||
### Windows
|
||||
|
||||
```sh
|
||||
iwr -useb https://raw.githubusercontent.com/filebrowser/get/master/get.ps1 | iex
|
||||
filebrowser -r /path/to/your/files
|
||||
```
|
||||
|
||||
### Configuring
|
||||
|
||||
Done! It will bootstrap a database in which all the configurations and users are stored. Now, you can see on your command line the address in which your instance is running. You just need to go to that URL and use the following credentials:
|
||||
|
||||
* Username: `admin`
|
||||
* Password: (printed in your console)
|
||||
|
||||
Although this is the fastest way to bootstrap an instance, we recommend you to take a look at other possible options, by checking `config init --help` and `config set --help`, to make the installation as safe and customized as it can be.
|
||||
|
||||
## Docker
|
||||
|
||||
File Browser is available as two different Docker images, which can be found on [Docker Hub](https://hub.docker.com/r/filebrowser/filebrowser).
|
||||
|
||||
### Alpine
|
||||
|
||||
```sh
|
||||
docker run \
|
||||
-v /path/to/srv:/srv \
|
||||
-v /path/to/database:/database \
|
||||
-v /path/to/config:/config \
|
||||
-p 8080:80 \
|
||||
filebrowser/filebrowser
|
||||
```
|
||||
|
||||
The default user has PID 1000 and GID 1000. Please make sure that this user has access to the different mounted volumes. To change the user running inside the Docker image, you need to use the [`--user` flag](https://docs.docker.com/engine/containers/run/#user).
|
||||
|
||||
### s6 overlay
|
||||
|
||||
The `s6` image is based on LinuxServer and leverages the [s6-overlay](https://github.com/just-containers/s6-overlay) system for a standard, highly customizable image. It should be used as follows:
|
||||
|
||||
```shell
|
||||
docker run \
|
||||
-v /path/to/srv:/srv \
|
||||
-v /path/to/database:/database \
|
||||
-v /path/to/config:/config \
|
||||
-e PUID=$(id -u) \
|
||||
-e PGID=$(id -g) \
|
||||
-p 8080:80 \
|
||||
filebrowser/filebrowser:s6
|
||||
```
|
||||
|
||||
### Notes
|
||||
|
||||
Where:
|
||||
|
||||
- `/path/to/srv` contains the files root directory for File Browser
|
||||
- `/path/to/config` contains a `settings.json` file
|
||||
- `/path/to/database` contains a `filebrowser.db` file
|
||||
|
||||
Both `settings.json` and `filebrowser.db` will automatically be initialized if they don't exist.
|
||||
26
docs/security.md
Normal file
26
docs/security.md
Normal file
@@ -0,0 +1,26 @@
|
||||
# Security Policy
|
||||
|
||||
## Supported Versions
|
||||
|
||||
Use this section to tell people about which versions of your project are
|
||||
currently being supported with security updates.
|
||||
|
||||
| Version | Supported |
|
||||
| ------- | ------------------ |
|
||||
| 2.x | :white_check_mark: |
|
||||
| < 2.0 | :x: |
|
||||
|
||||
## Reporting a Vulnerability
|
||||
|
||||
Vulnerabilities with critical impact should be reported on the [Security](https://github.com/filebrowser/filebrowser/security) page of this repository, which is a private way of communicating vulnerabilities to maintainers. This project is in maintenance-only mode and it can take a while until someone gets back to you.
|
||||
|
||||
If it is not a critical vulnerability, please open an issue and we will categorize it as a security issue. By giving visibility, we can get more help from the community at fixing such issues.
|
||||
|
||||
When reporting an issue, where possible, please provide at least:
|
||||
|
||||
* The commit version the issue was identified at
|
||||
* A proof of concept (plaintext; no binaries)
|
||||
* Steps to reproduce
|
||||
* Your recommended remediation(s), if any.
|
||||
|
||||
The File Browser team is a volunteer-only effort, and may reach back out for clarification.
|
||||
609
files/mime.go
Normal file
609
files/mime.go
Normal file
@@ -0,0 +1,609 @@
|
||||
package files
|
||||
|
||||
// This file contains code primarily sourced from::
|
||||
// github.com/kataras/iris
|
||||
|
||||
import (
|
||||
"mime"
|
||||
)
|
||||
|
||||
const (
|
||||
// ContentBinaryHeaderValue header value for binary data.
|
||||
ContentBinaryHeaderValue = "application/octet-stream"
|
||||
// ContentWebassemblyHeaderValue header value for web assembly files.
|
||||
ContentWebassemblyHeaderValue = "application/wasm"
|
||||
// ContentHTMLHeaderValue is the string of text/html response header's content type value.
|
||||
ContentHTMLHeaderValue = "text/html"
|
||||
// ContentJSONHeaderValue header value for JSON data.
|
||||
ContentJSONHeaderValue = "application/json"
|
||||
// ContentJSONProblemHeaderValue header value for JSON API problem error.
|
||||
// Read more at: https://tools.ietf.org/html/rfc7807
|
||||
ContentJSONProblemHeaderValue = "application/problem+json"
|
||||
// ContentXMLProblemHeaderValue header value for XML API problem error.
|
||||
// Read more at: https://tools.ietf.org/html/rfc7807
|
||||
ContentXMLProblemHeaderValue = "application/problem+xml"
|
||||
// ContentJavascriptHeaderValue header value for JSONP & Javascript data.
|
||||
ContentJavascriptHeaderValue = "text/javascript"
|
||||
// ContentTextHeaderValue header value for Text data.
|
||||
ContentTextHeaderValue = "text/plain"
|
||||
// ContentXMLHeaderValue header value for XML data.
|
||||
ContentXMLHeaderValue = "text/xml"
|
||||
// ContentXMLUnreadableHeaderValue obsolete header value for XML.
|
||||
ContentXMLUnreadableHeaderValue = "application/xml"
|
||||
// ContentMarkdownHeaderValue custom key/content type, the real is the text/html.
|
||||
ContentMarkdownHeaderValue = "text/markdown"
|
||||
// ContentYAMLHeaderValue header value for YAML data.
|
||||
ContentYAMLHeaderValue = "application/x-yaml"
|
||||
// ContentYAMLTextHeaderValue header value for YAML plain text.
|
||||
ContentYAMLTextHeaderValue = "text/yaml"
|
||||
// ContentProtobufHeaderValue header value for Protobuf messages data.
|
||||
ContentProtobufHeaderValue = "application/x-protobuf"
|
||||
// ContentMsgPackHeaderValue header value for MsgPack data.
|
||||
ContentMsgPackHeaderValue = "application/msgpack"
|
||||
// ContentMsgPack2HeaderValue alternative header value for MsgPack data.
|
||||
ContentMsgPack2HeaderValue = "application/x-msgpack"
|
||||
// ContentFormHeaderValue header value for post form data.
|
||||
ContentFormHeaderValue = "application/x-www-form-urlencoded"
|
||||
// ContentFormMultipartHeaderValue header value for post multipart form data.
|
||||
ContentFormMultipartHeaderValue = "multipart/form-data"
|
||||
// ContentMultipartRelatedHeaderValue header value for multipart related data.
|
||||
ContentMultipartRelatedHeaderValue = "multipart/related"
|
||||
// ContentGRPCHeaderValue Content-Type header value for gRPC.
|
||||
ContentGRPCHeaderValue = "application/grpc"
|
||||
)
|
||||
|
||||
var types = map[string]string{
|
||||
".3dm": "x-world/x-3dmf",
|
||||
".3dmf": "x-world/x-3dmf",
|
||||
".7z": "application/x-7z-compressed",
|
||||
".a": "application/octet-stream",
|
||||
".aab": "application/x-authorware-bin",
|
||||
".aam": "application/x-authorware-map",
|
||||
".aas": "application/x-authorware-seg",
|
||||
".abc": "text/vndabc",
|
||||
".ace": "application/x-ace-compressed",
|
||||
".acgi": "text/html",
|
||||
".afl": "video/animaflex",
|
||||
".ai": "application/postscript",
|
||||
".aif": "audio/aiff",
|
||||
".aifc": "audio/aiff",
|
||||
".aiff": "audio/aiff",
|
||||
".aim": "application/x-aim",
|
||||
".aip": "text/x-audiosoft-intra",
|
||||
".alz": "application/x-alz-compressed",
|
||||
".ani": "application/x-navi-animation",
|
||||
".aos": "application/x-nokia-9000-communicator-add-on-software",
|
||||
".aps": "application/mime",
|
||||
".apk": "application/vnd.android.package-archive",
|
||||
".arc": "application/x-arc-compressed",
|
||||
".arj": "application/arj",
|
||||
".art": "image/x-jg",
|
||||
".asf": "video/x-ms-asf",
|
||||
".asm": "text/x-asm",
|
||||
".asp": "text/asp",
|
||||
".asx": "application/x-mplayer2",
|
||||
".au": "audio/basic",
|
||||
".avi": "video/x-msvideo",
|
||||
".avs": "video/avs-video",
|
||||
".bcpio": "application/x-bcpio",
|
||||
".bin": "application/mac-binary",
|
||||
".bmp": "image/bmp",
|
||||
".boo": "application/book",
|
||||
".book": "application/book",
|
||||
".boz": "application/x-bzip2",
|
||||
".bsh": "application/x-bsh",
|
||||
".bz2": "application/x-bzip2",
|
||||
".bz": "application/x-bzip",
|
||||
".c++": ContentTextHeaderValue,
|
||||
".c": "text/x-c",
|
||||
".cab": "application/vnd.ms-cab-compressed",
|
||||
".cat": "application/vndms-pkiseccat",
|
||||
".cc": "text/x-c",
|
||||
".ccad": "application/clariscad",
|
||||
".cco": "application/x-cocoa",
|
||||
".cdf": "application/cdf",
|
||||
".cer": "application/pkix-cert",
|
||||
".cha": "application/x-chat",
|
||||
".chat": "application/x-chat",
|
||||
".chrt": "application/vnd.kde.kchart",
|
||||
".class": "application/java",
|
||||
".com": ContentTextHeaderValue,
|
||||
".conf": ContentTextHeaderValue,
|
||||
".cpio": "application/x-cpio",
|
||||
".cpp": "text/x-c",
|
||||
".cpt": "application/mac-compactpro",
|
||||
".crl": "application/pkcs-crl",
|
||||
".crt": "application/pkix-cert",
|
||||
".crx": "application/x-chrome-extension",
|
||||
".csh": "text/x-scriptcsh",
|
||||
".css": "text/css",
|
||||
".csv": "text/csv",
|
||||
".cxx": ContentTextHeaderValue,
|
||||
".dar": "application/x-dar",
|
||||
".dcr": "application/x-director",
|
||||
".deb": "application/x-debian-package",
|
||||
".deepv": "application/x-deepv",
|
||||
".def": ContentTextHeaderValue,
|
||||
".der": "application/x-x509-ca-cert",
|
||||
".dif": "video/x-dv",
|
||||
".dir": "application/x-director",
|
||||
".divx": "video/divx",
|
||||
".dl": "video/dl",
|
||||
".dmg": "application/x-apple-diskimage",
|
||||
".doc": "application/msword",
|
||||
".dot": "application/msword",
|
||||
".dp": "application/commonground",
|
||||
".drw": "application/drafting",
|
||||
".dump": "application/octet-stream",
|
||||
".dv": "video/x-dv",
|
||||
".dvi": "application/x-dvi",
|
||||
".dwf": "drawing/x-dwf=(old)",
|
||||
".dwg": "application/acad",
|
||||
".dxf": "application/dxf",
|
||||
".dxr": "application/x-director",
|
||||
".el": "text/x-scriptelisp",
|
||||
".elc": "application/x-bytecodeelisp=(compiled=elisp)",
|
||||
".eml": "message/rfc822",
|
||||
".env": "application/x-envoy",
|
||||
".eps": "application/postscript",
|
||||
".es": "application/x-esrehber",
|
||||
".etx": "text/x-setext",
|
||||
".evy": "application/envoy",
|
||||
".exe": "application/octet-stream",
|
||||
".f77": "text/x-fortran",
|
||||
".f90": "text/x-fortran",
|
||||
".f": "text/x-fortran",
|
||||
".fdf": "application/vndfdf",
|
||||
".fif": "application/fractals",
|
||||
".fli": "video/fli",
|
||||
".flo": "image/florian",
|
||||
".flv": "video/x-flv",
|
||||
".flx": "text/vndfmiflexstor",
|
||||
".fmf": "video/x-atomic3d-feature",
|
||||
".for": "text/x-fortran",
|
||||
".fpx": "image/vndfpx",
|
||||
".frl": "application/freeloader",
|
||||
".funk": "audio/make",
|
||||
".g3": "image/g3fax",
|
||||
".g": ContentTextHeaderValue,
|
||||
".gif": "image/gif",
|
||||
".gl": "video/gl",
|
||||
".gsd": "audio/x-gsm",
|
||||
".gsm": "audio/x-gsm",
|
||||
".gsp": "application/x-gsp",
|
||||
".gss": "application/x-gss",
|
||||
".gtar": "application/x-gtar",
|
||||
".gz": "application/x-compressed",
|
||||
".gzip": "application/x-gzip",
|
||||
".h": "text/x-h",
|
||||
".hdf": "application/x-hdf",
|
||||
".help": "application/x-helpfile",
|
||||
".hgl": "application/vndhp-hpgl",
|
||||
".hh": "text/x-h",
|
||||
".hlb": "text/x-script",
|
||||
".hlp": "application/hlp",
|
||||
".hpg": "application/vndhp-hpgl",
|
||||
".hpgl": "application/vndhp-hpgl",
|
||||
".hqx": "application/binhex",
|
||||
".hta": "application/hta",
|
||||
".htc": "text/x-component",
|
||||
".htm": "text/html",
|
||||
".html": "text/html",
|
||||
".htmls": "text/html",
|
||||
".htt": "text/webviewhtml",
|
||||
".htx": "text/html",
|
||||
".ice": "x-conference/x-cooltalk",
|
||||
".ico": "image/x-icon",
|
||||
".ics": "text/calendar",
|
||||
".icz": "text/calendar",
|
||||
".idc": ContentTextHeaderValue,
|
||||
".ief": "image/ief",
|
||||
".iefs": "image/ief",
|
||||
".iges": "application/iges",
|
||||
".igs": "application/iges",
|
||||
".ima": "application/x-ima",
|
||||
".imap": "application/x-httpd-imap",
|
||||
".inf": "application/inf",
|
||||
".ins": "application/x-internett-signup",
|
||||
".ip": "application/x-ip2",
|
||||
".isu": "video/x-isvideo",
|
||||
".it": "audio/it",
|
||||
".iv": "application/x-inventor",
|
||||
".ivr": "i-world/i-vrml",
|
||||
".ivy": "application/x-livescreen",
|
||||
".jam": "audio/x-jam",
|
||||
".jav": "text/x-java-source",
|
||||
".java": "text/x-java-source",
|
||||
".jcm": "application/x-java-commerce",
|
||||
".jfif-tbnl": "image/jpeg",
|
||||
".jfif": "image/jpeg",
|
||||
".jnlp": "application/x-java-jnlp-file",
|
||||
".jpe": "image/jpeg",
|
||||
".jpeg": "image/jpeg",
|
||||
".jpg": "image/jpeg",
|
||||
".jps": "image/x-jps",
|
||||
".js": ContentJavascriptHeaderValue,
|
||||
".mjs": ContentJavascriptHeaderValue,
|
||||
".json": ContentJSONHeaderValue,
|
||||
".vue": ContentJavascriptHeaderValue,
|
||||
".jut": "image/jutvision",
|
||||
".kar": "audio/midi",
|
||||
".karbon": "application/vnd.kde.karbon",
|
||||
".kfo": "application/vnd.kde.kformula",
|
||||
".flw": "application/vnd.kde.kivio",
|
||||
".kml": "application/vnd.google-earth.kml+xml",
|
||||
".kmz": "application/vnd.google-earth.kmz",
|
||||
".kon": "application/vnd.kde.kontour",
|
||||
".kpr": "application/vnd.kde.kpresenter",
|
||||
".kpt": "application/vnd.kde.kpresenter",
|
||||
".ksp": "application/vnd.kde.kspread",
|
||||
".kwd": "application/vnd.kde.kword",
|
||||
".kwt": "application/vnd.kde.kword",
|
||||
".ksh": "text/x-scriptksh",
|
||||
".la": "audio/nspaudio",
|
||||
".lam": "audio/x-liveaudio",
|
||||
".latex": "application/x-latex",
|
||||
".lha": "application/lha",
|
||||
".lhx": "application/octet-stream",
|
||||
".list": ContentTextHeaderValue,
|
||||
".lma": "audio/nspaudio",
|
||||
".log": ContentTextHeaderValue,
|
||||
".lsp": "text/x-scriptlisp",
|
||||
".lst": ContentTextHeaderValue,
|
||||
".lsx": "text/x-la-asf",
|
||||
".ltx": "application/x-latex",
|
||||
".lzh": "application/octet-stream",
|
||||
".lzx": "application/lzx",
|
||||
".m1v": "video/mpeg",
|
||||
".m2a": "audio/mpeg",
|
||||
".m2v": "video/mpeg",
|
||||
".m3u": "audio/x-mpegurl",
|
||||
".m": "text/x-m",
|
||||
".man": "application/x-troff-man",
|
||||
".manifest": "text/cache-manifest",
|
||||
".map": "application/x-navimap",
|
||||
".mar": ContentTextHeaderValue,
|
||||
".mbd": "application/mbedlet",
|
||||
".mc$": "application/x-magic-cap-package-10",
|
||||
".mcd": "application/mcad",
|
||||
".mcf": "text/mcf",
|
||||
".mcp": "application/netmc",
|
||||
".me": "application/x-troff-me",
|
||||
".mht": "message/rfc822",
|
||||
".mhtml": "message/rfc822",
|
||||
".mid": "application/x-midi",
|
||||
".midi": "application/x-midi",
|
||||
".mif": "application/x-frame",
|
||||
".mime": "message/rfc822",
|
||||
".mjf": "audio/x-vndaudioexplosionmjuicemediafile",
|
||||
".mjpg": "video/x-motion-jpeg",
|
||||
".mm": "application/base64",
|
||||
".mme": "application/base64",
|
||||
".mod": "audio/mod",
|
||||
".moov": "video/quicktime",
|
||||
".mov": "video/quicktime",
|
||||
".movie": "video/x-sgi-movie",
|
||||
".mp2": "audio/mpeg",
|
||||
".mp3": "audio/mpeg",
|
||||
".mp4": "video/mp4",
|
||||
".mpa": "audio/mpeg",
|
||||
".mpc": "application/x-project",
|
||||
".mpe": "video/mpeg",
|
||||
".mpeg": "video/mpeg",
|
||||
".mpg": "video/mpeg",
|
||||
".mpga": "audio/mpeg",
|
||||
".mpp": "application/vndms-project",
|
||||
".mpt": "application/x-project",
|
||||
".mpv": "application/x-project",
|
||||
".mpx": "application/x-project",
|
||||
".mrc": "application/marc",
|
||||
".ms": "application/x-troff-ms",
|
||||
".mv": "video/x-sgi-movie",
|
||||
".my": "audio/make",
|
||||
".mzz": "application/x-vndaudioexplosionmzz",
|
||||
".nap": "image/naplps",
|
||||
".naplps": "image/naplps",
|
||||
".nc": "application/x-netcdf",
|
||||
".ncm": "application/vndnokiaconfiguration-message",
|
||||
".nif": "image/x-niff",
|
||||
".niff": "image/x-niff",
|
||||
".nix": "application/x-mix-transfer",
|
||||
".nsc": "application/x-conference",
|
||||
".nvd": "application/x-navidoc",
|
||||
".o": "application/octet-stream",
|
||||
".oda": "application/oda",
|
||||
".odb": "application/vnd.oasis.opendocument.database",
|
||||
".odc": "application/vnd.oasis.opendocument.chart",
|
||||
".odf": "application/vnd.oasis.opendocument.formula",
|
||||
".odg": "application/vnd.oasis.opendocument.graphics",
|
||||
".odi": "application/vnd.oasis.opendocument.image",
|
||||
".odm": "application/vnd.oasis.opendocument.text-master",
|
||||
".odp": "application/vnd.oasis.opendocument.presentation",
|
||||
".ods": "application/vnd.oasis.opendocument.spreadsheet",
|
||||
".odt": "application/vnd.oasis.opendocument.text",
|
||||
".oga": "audio/ogg",
|
||||
".ogg": "audio/ogg",
|
||||
".ogv": "video/ogg",
|
||||
".omc": "application/x-omc",
|
||||
".omcd": "application/x-omcdatamaker",
|
||||
".omcr": "application/x-omcregerator",
|
||||
".otc": "application/vnd.oasis.opendocument.chart-template",
|
||||
".otf": "application/vnd.oasis.opendocument.formula-template",
|
||||
".otg": "application/vnd.oasis.opendocument.graphics-template",
|
||||
".oth": "application/vnd.oasis.opendocument.text-web",
|
||||
".oti": "application/vnd.oasis.opendocument.image-template",
|
||||
".otm": "application/vnd.oasis.opendocument.text-master",
|
||||
".otp": "application/vnd.oasis.opendocument.presentation-template",
|
||||
".ots": "application/vnd.oasis.opendocument.spreadsheet-template",
|
||||
".ott": "application/vnd.oasis.opendocument.text-template",
|
||||
".p10": "application/pkcs10",
|
||||
".p12": "application/pkcs-12",
|
||||
".p7a": "application/x-pkcs7-signature",
|
||||
".p7c": "application/pkcs7-mime",
|
||||
".p7m": "application/pkcs7-mime",
|
||||
".p7r": "application/x-pkcs7-certreqresp",
|
||||
".p7s": "application/pkcs7-signature",
|
||||
".p": "text/x-pascal",
|
||||
".part": "application/pro_eng",
|
||||
".pas": "text/pascal",
|
||||
".pbm": "image/x-portable-bitmap",
|
||||
".pcl": "application/vndhp-pcl",
|
||||
".pct": "image/x-pict",
|
||||
".pcx": "image/x-pcx",
|
||||
".pdb": "chemical/x-pdb",
|
||||
".pdf": "application/pdf",
|
||||
".pfunk": "audio/make",
|
||||
".pgm": "image/x-portable-graymap",
|
||||
".pic": "image/pict",
|
||||
".pict": "image/pict",
|
||||
".pkg": "application/x-newton-compatible-pkg",
|
||||
".pko": "application/vndms-pkipko",
|
||||
".pl": "text/x-scriptperl",
|
||||
".plx": "application/x-pixclscript",
|
||||
".pm4": "application/x-pagemaker",
|
||||
".pm5": "application/x-pagemaker",
|
||||
".pm": "text/x-scriptperl-module",
|
||||
".png": "image/png",
|
||||
".pnm": "application/x-portable-anymap",
|
||||
".pot": "application/mspowerpoint",
|
||||
".pov": "model/x-pov",
|
||||
".ppa": "application/vndms-powerpoint",
|
||||
".ppm": "image/x-portable-pixmap",
|
||||
".pps": "application/mspowerpoint",
|
||||
".ppt": "application/mspowerpoint",
|
||||
".ppz": "application/mspowerpoint",
|
||||
".pre": "application/x-freelance",
|
||||
".prt": "application/pro_eng",
|
||||
".ps": "application/postscript",
|
||||
".psd": "application/octet-stream",
|
||||
".pvu": "paleovu/x-pv",
|
||||
".pwz": "application/vndms-powerpoint",
|
||||
".py": "text/x-scriptphyton",
|
||||
".pyc": "application/x-bytecodepython",
|
||||
".qcp": "audio/vndqcelp",
|
||||
".qd3": "x-world/x-3dmf",
|
||||
".qd3d": "x-world/x-3dmf",
|
||||
".qif": "image/x-quicktime",
|
||||
".qt": "video/quicktime",
|
||||
".qtc": "video/x-qtc",
|
||||
".qti": "image/x-quicktime",
|
||||
".qtif": "image/x-quicktime",
|
||||
".ra": "audio/x-pn-realaudio",
|
||||
".ram": "audio/x-pn-realaudio",
|
||||
".rar": "application/x-rar-compressed",
|
||||
".ras": "application/x-cmu-raster",
|
||||
".rast": "image/cmu-raster",
|
||||
".rexx": "text/x-scriptrexx",
|
||||
".rf": "image/vndrn-realflash",
|
||||
".rgb": "image/x-rgb",
|
||||
".rm": "application/vndrn-realmedia",
|
||||
".rmi": "audio/mid",
|
||||
".rmm": "audio/x-pn-realaudio",
|
||||
".rmp": "audio/x-pn-realaudio",
|
||||
".rng": "application/ringing-tones",
|
||||
".rnx": "application/vndrn-realplayer",
|
||||
".roff": "application/x-troff",
|
||||
".rp": "image/vndrn-realpix",
|
||||
".rpm": "audio/x-pn-realaudio-plugin",
|
||||
".rt": "text/vndrn-realtext",
|
||||
".rtf": "text/richtext",
|
||||
".rtx": "text/richtext",
|
||||
".rv": "video/vndrn-realvideo",
|
||||
".s": "text/x-asm",
|
||||
".s3m": "audio/s3m",
|
||||
".s7z": "application/x-7z-compressed",
|
||||
".saveme": "application/octet-stream",
|
||||
".sbk": "application/x-tbook",
|
||||
".scm": "text/x-scriptscheme",
|
||||
".sdml": ContentTextHeaderValue,
|
||||
".sdp": "application/sdp",
|
||||
".sdr": "application/sounder",
|
||||
".sea": "application/sea",
|
||||
".set": "application/set",
|
||||
".sgm": "text/x-sgml",
|
||||
".sgml": "text/x-sgml",
|
||||
".sh": "text/x-scriptsh",
|
||||
".shar": "application/x-bsh",
|
||||
".shtml": "text/x-server-parsed-html",
|
||||
".sid": "audio/x-psid",
|
||||
".skd": "application/x-koan",
|
||||
".skm": "application/x-koan",
|
||||
".skp": "application/x-koan",
|
||||
".skt": "application/x-koan",
|
||||
".sit": "application/x-stuffit",
|
||||
".sitx": "application/x-stuffitx",
|
||||
".sl": "application/x-seelogo",
|
||||
".smi": "application/smil",
|
||||
".smil": "application/smil",
|
||||
".snd": "audio/basic",
|
||||
".sol": "application/solids",
|
||||
".spc": "text/x-speech",
|
||||
".spl": "application/futuresplash",
|
||||
".spr": "application/x-sprite",
|
||||
".sprite": "application/x-sprite",
|
||||
".spx": "audio/ogg",
|
||||
".src": "application/x-wais-source",
|
||||
".ssi": "text/x-server-parsed-html",
|
||||
".ssm": "application/streamingmedia",
|
||||
".sst": "application/vndms-pkicertstore",
|
||||
".step": "application/step",
|
||||
".stl": "application/sla",
|
||||
".stp": "application/step",
|
||||
".sv4cpio": "application/x-sv4cpio",
|
||||
".sv4crc": "application/x-sv4crc",
|
||||
".svf": "image/vnddwg",
|
||||
".svg": "image/svg+xml",
|
||||
".svr": "application/x-world",
|
||||
".swf": "application/x-shockwave-flash",
|
||||
".t": "application/x-troff",
|
||||
".talk": "text/x-speech",
|
||||
".tar": "application/x-tar",
|
||||
".tbk": "application/toolbook",
|
||||
".tcl": "text/x-scripttcl",
|
||||
".tcsh": "text/x-scripttcsh",
|
||||
".tex": "application/x-tex",
|
||||
".texi": "application/x-texinfo",
|
||||
".texinfo": "application/x-texinfo",
|
||||
".text": ContentTextHeaderValue,
|
||||
".tgz": "application/gnutar",
|
||||
".tif": "image/tiff",
|
||||
".tiff": "image/tiff",
|
||||
".tr": "application/x-troff",
|
||||
".tsi": "audio/tsp-audio",
|
||||
".tsp": "application/dsptype",
|
||||
".tsv": "text/tab-separated-values",
|
||||
".turbot": "image/florian",
|
||||
".txt": ContentTextHeaderValue,
|
||||
".uil": "text/x-uil",
|
||||
".uni": "text/uri-list",
|
||||
".unis": "text/uri-list",
|
||||
".unv": "application/i-deas",
|
||||
".uri": "text/uri-list",
|
||||
".uris": "text/uri-list",
|
||||
".ustar": "application/x-ustar",
|
||||
".uu": "text/x-uuencode",
|
||||
".uue": "text/x-uuencode",
|
||||
".vcd": "application/x-cdlink",
|
||||
".vcf": "text/x-vcard",
|
||||
".vcard": "text/x-vcard",
|
||||
".vcs": "text/x-vcalendar",
|
||||
".vda": "application/vda",
|
||||
".vdo": "video/vdo",
|
||||
".vew": "application/groupwise",
|
||||
".viv": "video/vivo",
|
||||
".vivo": "video/vivo",
|
||||
".vmd": "application/vocaltec-media-desc",
|
||||
".vmf": "application/vocaltec-media-file",
|
||||
".voc": "audio/voc",
|
||||
".vos": "video/vosaic",
|
||||
".vox": "audio/voxware",
|
||||
".vqe": "audio/x-twinvq-plugin",
|
||||
".vqf": "audio/x-twinvq",
|
||||
".vql": "audio/x-twinvq-plugin",
|
||||
".vrml": "application/x-vrml",
|
||||
".vrt": "x-world/x-vrt",
|
||||
".vsd": "application/x-visio",
|
||||
".vst": "application/x-visio",
|
||||
".vsw": "application/x-visio",
|
||||
".w60": "application/wordperfect60",
|
||||
".w61": "application/wordperfect61",
|
||||
".w6w": "application/msword",
|
||||
".wav": "audio/wav",
|
||||
".wb1": "application/x-qpro",
|
||||
".wbmp": "image/vnd.wap.wbmp",
|
||||
".web": "application/vndxara",
|
||||
".wiz": "application/msword",
|
||||
".wk1": "application/x-123",
|
||||
".wmf": "windows/metafile",
|
||||
".wml": "text/vnd.wap.wml",
|
||||
".wmlc": "application/vnd.wap.wmlc",
|
||||
".wmls": "text/vnd.wap.wmlscript",
|
||||
".wmlsc": "application/vnd.wap.wmlscriptc",
|
||||
".word": "application/msword",
|
||||
".wp5": "application/wordperfect",
|
||||
".wp6": "application/wordperfect",
|
||||
".wp": "application/wordperfect",
|
||||
".wpd": "application/wordperfect",
|
||||
".wq1": "application/x-lotus",
|
||||
".wri": "application/mswrite",
|
||||
".wrl": "application/x-world",
|
||||
".wrz": "model/vrml",
|
||||
".wsc": "text/scriplet",
|
||||
".wsrc": "application/x-wais-source",
|
||||
".wtk": "application/x-wintalk",
|
||||
".x-png": "image/png",
|
||||
".xbm": "image/x-xbitmap",
|
||||
".xdr": "video/x-amt-demorun",
|
||||
".xgz": "xgl/drawing",
|
||||
".xif": "image/vndxiff",
|
||||
".xl": "application/excel",
|
||||
".xla": "application/excel",
|
||||
".xlb": "application/excel",
|
||||
".xlc": "application/excel",
|
||||
".xld": "application/excel",
|
||||
".xlk": "application/excel",
|
||||
".xll": "application/excel",
|
||||
".xlm": "application/excel",
|
||||
".xls": "application/excel",
|
||||
".xlt": "application/excel",
|
||||
".xlv": "application/excel",
|
||||
".xlw": "application/excel",
|
||||
".xm": "audio/xm",
|
||||
".xml": ContentXMLHeaderValue,
|
||||
".xmz": "xgl/movie",
|
||||
".xpix": "application/x-vndls-xpix",
|
||||
".xpm": "image/x-xpixmap",
|
||||
".xsr": "video/x-amt-showrun",
|
||||
".xwd": "image/x-xwd",
|
||||
".xyz": "chemical/x-pdb",
|
||||
".z": "application/x-compress",
|
||||
".zip": "application/zip",
|
||||
".zoo": "application/octet-stream",
|
||||
".zsh": "text/x-scriptzsh",
|
||||
".docx": "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
|
||||
".docm": "application/vnd.ms-word.document.macroEnabled.12",
|
||||
".dotx": "application/vnd.openxmlformats-officedocument.wordprocessingml.template",
|
||||
".dotm": "application/vnd.ms-word.template.macroEnabled.12",
|
||||
".xlsx": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
|
||||
".xlsm": "application/vnd.ms-excel.sheet.macroEnabled.12",
|
||||
".xltx": "application/vnd.openxmlformats-officedocument.spreadsheetml.template",
|
||||
".xltm": "application/vnd.ms-excel.template.macroEnabled.12",
|
||||
".xlsb": "application/vnd.ms-excel.sheet.binary.macroEnabled.12",
|
||||
".xlam": "application/vnd.ms-excel.addin.macroEnabled.12",
|
||||
".pptx": "application/vnd.openxmlformats-officedocument.presentationml.presentation",
|
||||
".pptm": "application/vnd.ms-powerpoint.presentation.macroEnabled.12",
|
||||
".ppsx": "application/vnd.openxmlformats-officedocument.presentationml.slideshow",
|
||||
".ppsm": "application/vnd.ms-powerpoint.slideshow.macroEnabled.12",
|
||||
".potx": "application/vnd.openxmlformats-officedocument.presentationml.template",
|
||||
".potm": "application/vnd.ms-powerpoint.template.macroEnabled.12",
|
||||
".ppam": "application/vnd.ms-powerpoint.addin.macroEnabled.12",
|
||||
".sldx": "application/vnd.openxmlformats-officedocument.presentationml.slide",
|
||||
".sldm": "application/vnd.ms-powerpoint.slide.macroEnabled.12",
|
||||
".thmx": "application/vnd.ms-officetheme",
|
||||
".onetoc": "application/onenote",
|
||||
".onetoc2": "application/onenote",
|
||||
".onetmp": "application/onenote",
|
||||
".onepkg": "application/onenote",
|
||||
".xpi": "application/x-xpinstall",
|
||||
".wasm": "application/wasm",
|
||||
".m4a": "audio/mp4",
|
||||
".flac": "audio/x-flac",
|
||||
".amr": "audio/amr",
|
||||
".aac": "audio/aac",
|
||||
".opus": "video/ogg",
|
||||
".m4v": "video/mp4",
|
||||
".mkv": "video/x-matroska",
|
||||
".caf": "audio/x-caf",
|
||||
".m3u8": "application/x-mpegURL",
|
||||
".mpd": "application/dash+xml",
|
||||
".webp": "image/webp",
|
||||
".epub": "application/epub+zip",
|
||||
}
|
||||
|
||||
//nolint:gochecknoinits
|
||||
func init() {
|
||||
for ext, typ := range types {
|
||||
// skip errors
|
||||
_ = mime.AddExtensionType(ext, typ)
|
||||
}
|
||||
}
|
||||
@@ -98,7 +98,7 @@ func CommonPrefix(sep byte, paths ...string) string {
|
||||
// (e.g. /home/user1, /home/user1/foo, /home/user1/bar).
|
||||
// path.Clean will have cleaned off trailing / separators with
|
||||
// the exception of the root directory, "/" (in which case we
|
||||
// make it "//", but this will get fixed up to "/" bellow).
|
||||
// make it "//", but this will get fixed up to "/" below).
|
||||
c = append(c, sep)
|
||||
|
||||
// Ignore the first path since it's already in c
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
{
|
||||
"root": true,
|
||||
"env": {
|
||||
"node": true
|
||||
},
|
||||
"extends": [
|
||||
"plugin:vue/vue3-essential",
|
||||
"eslint:recommended",
|
||||
"@vue/eslint-config-typescript",
|
||||
"@vue/eslint-config-prettier"
|
||||
],
|
||||
"rules": {
|
||||
"vue/multi-word-component-names": "off",
|
||||
"vue/no-mutating-props": [
|
||||
"error",
|
||||
{
|
||||
"shallowOnly": true
|
||||
}
|
||||
]
|
||||
// no-undef is already included in
|
||||
// @vue/eslint-config-typescript
|
||||
},
|
||||
"parserOptions": {
|
||||
"ecmaVersion": "latest",
|
||||
"sourceType": "module"
|
||||
}
|
||||
}
|
||||
@@ -1,2 +1,3 @@
|
||||
# Ignore artifacts:
|
||||
dist
|
||||
dist
|
||||
pnpm-lock.yaml
|
||||
38
frontend/eslint.config.js
Normal file
38
frontend/eslint.config.js
Normal file
@@ -0,0 +1,38 @@
|
||||
import pluginVue from "eslint-plugin-vue";
|
||||
import vueTsEslintConfig from "@vue/eslint-config-typescript";
|
||||
import prettierConfig from "@vue/eslint-config-prettier";
|
||||
|
||||
export default [
|
||||
{
|
||||
name: "app/files-to-lint",
|
||||
files: ["**/*.{ts,mts,tsx,vue}"],
|
||||
},
|
||||
|
||||
{
|
||||
name: "app/files-to-ignore",
|
||||
ignores: ["**/dist/**", "**/dist-ssr/**", "**/coverage/**"],
|
||||
},
|
||||
|
||||
...pluginVue.configs["flat/essential"],
|
||||
...vueTsEslintConfig(),
|
||||
prettierConfig,
|
||||
|
||||
{
|
||||
rules: {
|
||||
// Note: you must disable the base rule as it can report incorrect errors
|
||||
"no-unused-expressions": "off",
|
||||
"@typescript-eslint/no-unused-expressions": "off",
|
||||
// TODO: theres too many of these from before ts
|
||||
"@typescript-eslint/no-explicit-any": "off",
|
||||
// TODO: finish the ts conversion
|
||||
"vue/block-lang": "off",
|
||||
"vue/multi-word-component-names": "off",
|
||||
"vue/no-mutating-props": [
|
||||
"error",
|
||||
{
|
||||
shallowOnly: true,
|
||||
},
|
||||
],
|
||||
},
|
||||
},
|
||||
];
|
||||
@@ -1,10 +0,0 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"@/*": ["./src/*"]
|
||||
}
|
||||
},
|
||||
"include": ["src/**/*"],
|
||||
"exclude": ["node_modules", "dist"]
|
||||
}
|
||||
7705
frontend/package-lock.json
generated
7705
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -4,68 +4,74 @@
|
||||
"private": true,
|
||||
"type": "module",
|
||||
"engines": {
|
||||
"npm": ">=7.0.0",
|
||||
"node": ">=18.0.0"
|
||||
"node": ">=22.0.0",
|
||||
"pnpm": ">=9.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"dev": "vite dev",
|
||||
"build": "npm run typecheck && vite build",
|
||||
"build": "pnpm run typecheck && vite build",
|
||||
"clean": "find ./dist -maxdepth 1 -mindepth 1 ! -name '.gitkeep' -exec rm -r {} +",
|
||||
"typecheck": "vue-tsc -p ./tsconfig.json --noEmit",
|
||||
"lint": "npm run typecheck && eslint --ext .vue,.ts src/",
|
||||
"lint:fix": "eslint --ext .vue,.ts --fix src/",
|
||||
"typecheck": "vue-tsc -p ./tsconfig.tsc.json --noEmit",
|
||||
"lint": "eslint src/",
|
||||
"lint:fix": "eslint --fix src/",
|
||||
"format": "prettier --write .",
|
||||
"test": "playwright test"
|
||||
},
|
||||
"dependencies": {
|
||||
"@chenfengyuan/vue-number-input": "^2.0.1",
|
||||
"@vueuse/core": "^10.9.0",
|
||||
"@vueuse/integrations": "^10.9.0",
|
||||
"ace-builds": "^1.32.9",
|
||||
"core-js": "^3.36.1",
|
||||
"@vueuse/core": "^12.5.0",
|
||||
"@vueuse/integrations": "^12.5.0",
|
||||
"ace-builds": "^1.37.5",
|
||||
"core-js": "^3.40.0",
|
||||
"dayjs": "^1.11.10",
|
||||
"epubjs": "^0.3.93",
|
||||
"filesize": "^10.1.1",
|
||||
"js-base64": "^3.7.7",
|
||||
"jwt-decode": "^4.0.0",
|
||||
"lodash-es": "^4.17.21",
|
||||
"material-icons": "^1.13.12",
|
||||
"marked": "^15.0.6",
|
||||
"material-icons": "^1.13.13",
|
||||
"normalize.css": "^8.0.1",
|
||||
"pinia": "^2.1.7",
|
||||
"pinia": "^2.3.1",
|
||||
"pretty-bytes": "^6.1.1",
|
||||
"qrcode.vue": "^3.4.1",
|
||||
"tus-js-client": "^4.1.0",
|
||||
"tus-js-client": "^4.3.1",
|
||||
"utif": "^3.1.0",
|
||||
"video.js": "^8.10.0",
|
||||
"video.js": "^8.21.0",
|
||||
"videojs-hotkeys": "^0.2.28",
|
||||
"videojs-mobile-ui": "^1.1.1",
|
||||
"vue": "^3.4.21",
|
||||
"vue-final-modal": "^4.5.4",
|
||||
"vue-i18n": "^9.10.2",
|
||||
"vue-i18n": "^11.1.2",
|
||||
"vue-lazyload": "^3.0.0",
|
||||
"vue-reader": "^1.2.17",
|
||||
"vue-router": "^4.3.0",
|
||||
"vue-toastification": "^2.0.0-rc.5"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@intlify/unplugin-vue-i18n": "^4.0.0",
|
||||
"@playwright/test": "^1.42.1",
|
||||
"@intlify/unplugin-vue-i18n": "^6.0.3",
|
||||
"@playwright/test": "^1.50.0",
|
||||
"@tsconfig/node22": "^22.0.0",
|
||||
"@types/lodash-es": "^4.17.12",
|
||||
"@types/node": "^20.12.2",
|
||||
"@typescript-eslint/eslint-plugin": "^7.4.0",
|
||||
"@vitejs/plugin-legacy": "^5.3.2",
|
||||
"@types/node": "^22.10.10",
|
||||
"@typescript-eslint/eslint-plugin": "^8.21.0",
|
||||
"@vitejs/plugin-legacy": "^6.0.0",
|
||||
"@vitejs/plugin-vue": "^5.0.4",
|
||||
"@vue/eslint-config-prettier": "^9.0.0",
|
||||
"@vue/eslint-config-typescript": "^13.0.0",
|
||||
"@vue/eslint-config-prettier": "^10.2.0",
|
||||
"@vue/eslint-config-typescript": "^14.3.0",
|
||||
"@vue/tsconfig": "^0.7.0",
|
||||
"autoprefixer": "^10.4.19",
|
||||
"concurrently": "^8.2.2",
|
||||
"eslint": "^8.57.0",
|
||||
"eslint-plugin-prettier": "^5.1.3",
|
||||
"concurrently": "^9.1.2",
|
||||
"eslint": "^9.19.0",
|
||||
"eslint-plugin-prettier": "^5.2.3",
|
||||
"eslint-plugin-vue": "^9.24.0",
|
||||
"jsdom": "^24.0.0",
|
||||
"postcss": "^8.4.38",
|
||||
"prettier": "^3.2.5",
|
||||
"terser": "^5.30.0",
|
||||
"vite": "^5.2.7",
|
||||
"jsdom": "^26.0.0",
|
||||
"postcss": "^8.5.1",
|
||||
"prettier": "^3.4.2",
|
||||
"terser": "^5.37.0",
|
||||
"vite": "^6.1.6",
|
||||
"vite-plugin-compression2": "^1.0.0",
|
||||
"vue-tsc": "^2.0.7"
|
||||
}
|
||||
"vue-tsc": "^2.2.0"
|
||||
},
|
||||
"packageManager": "pnpm@9.15.4+sha512.b2dc20e2fc72b3e18848459b37359a32064663e5627a51e4c74b2c29dd8e8e0491483c3abb40789cfd578bf362fb6ba8261b05f0387d76792ed6e23ea3b1b6a0"
|
||||
}
|
||||
|
||||
5426
frontend/pnpm-lock.yaml
generated
Normal file
5426
frontend/pnpm-lock.yaml
generated
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,7 +1,8 @@
|
||||
import { createURL, fetchURL, removePrefix } from "./utils";
|
||||
import { baseURL } from "@/utils/constants";
|
||||
import { useAuthStore } from "@/stores/auth";
|
||||
import { useLayoutStore } from "@/stores/layout";
|
||||
import { baseURL } from "@/utils/constants";
|
||||
import { upload as postTus, useTus } from "./tus";
|
||||
import { createURL, fetchURL, removePrefix } from "./utils";
|
||||
|
||||
export async function fetch(url: string) {
|
||||
url = removePrefix(url);
|
||||
@@ -74,11 +75,6 @@ export function download(format: any, ...files: string[]) {
|
||||
url += `algo=${format}&`;
|
||||
}
|
||||
|
||||
const authStore = useAuthStore();
|
||||
if (authStore.jwt) {
|
||||
url += `auth=${authStore.jwt}&`;
|
||||
}
|
||||
|
||||
window.open(url);
|
||||
}
|
||||
|
||||
@@ -156,6 +152,7 @@ function moveCopy(
|
||||
overwrite = false,
|
||||
rename = false
|
||||
) {
|
||||
const layoutStore = useLayoutStore();
|
||||
const promises = [];
|
||||
|
||||
for (const item of items) {
|
||||
@@ -166,7 +163,7 @@ function moveCopy(
|
||||
}&destination=${to}&override=${overwrite}&rename=${rename}`;
|
||||
promises.push(resourceAction(url, "PATCH"));
|
||||
}
|
||||
|
||||
layoutStore.closeHovers();
|
||||
return Promise.all(promises);
|
||||
}
|
||||
|
||||
|
||||
@@ -71,5 +71,5 @@ export function getDownloadURL(res: Resource, inline = false) {
|
||||
...(res.token && { token: res.token }),
|
||||
};
|
||||
|
||||
return createURL("api/public/dl/" + res.hash + res.path, params, false);
|
||||
return createURL("api/public/dl/" + res.hash + res.path, params);
|
||||
}
|
||||
|
||||
@@ -41,5 +41,5 @@ export async function create(
|
||||
}
|
||||
|
||||
export function getShareURL(share: Share) {
|
||||
return createURL("share/" + share.hash, {}, false);
|
||||
return createURL("share/" + share.hash, {});
|
||||
}
|
||||
|
||||
@@ -61,7 +61,7 @@ export async function upload(
|
||||
fileData.hasStarted = true;
|
||||
fileData.lastProgressTimestamp = Date.now();
|
||||
|
||||
fileData.interval = setInterval(() => {
|
||||
fileData.interval = window.setInterval(() => {
|
||||
calcProgress(filePath);
|
||||
}, SPEED_UPDATE_INTERVAL);
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@ export async function create(user: IUser) {
|
||||
throw new StatusError(await res.text(), res.status);
|
||||
}
|
||||
|
||||
export async function update(user: IUser, which = ["all"]) {
|
||||
export async function update(user: Partial<IUser>, which = ["all"]) {
|
||||
await fetchURL(`/api/users/${user.id}`, {
|
||||
method: "PUT",
|
||||
body: JSON.stringify({
|
||||
|
||||
@@ -76,23 +76,13 @@ export function removePrefix(url: string): string {
|
||||
return url;
|
||||
}
|
||||
|
||||
export function createURL(endpoint: string, params = {}, auth = true): string {
|
||||
const authStore = useAuthStore();
|
||||
|
||||
export function createURL(endpoint: string, searchParams = {}): string {
|
||||
let prefix = baseURL;
|
||||
if (!prefix.endsWith("/")) {
|
||||
prefix = prefix + "/";
|
||||
}
|
||||
const url = new URL(prefix + encodePath(endpoint), origin);
|
||||
|
||||
const searchParams: SearchParams = {
|
||||
...(auth && { auth: authStore.jwt }),
|
||||
...params,
|
||||
};
|
||||
|
||||
for (const key in searchParams) {
|
||||
url.searchParams.set(key, searchParams[key]);
|
||||
}
|
||||
url.search = new URLSearchParams(searchParams).toString();
|
||||
|
||||
return url.toString();
|
||||
}
|
||||
|
||||
@@ -34,7 +34,7 @@ const props = defineProps<{
|
||||
|
||||
const items = computed(() => {
|
||||
const relativePath = route.path.replace(props.base, "");
|
||||
let parts = relativePath.split("/");
|
||||
const parts = relativePath.split("/");
|
||||
|
||||
if (parts[0] === "") {
|
||||
parts.shift();
|
||||
@@ -44,7 +44,7 @@ const items = computed(() => {
|
||||
parts.pop();
|
||||
}
|
||||
|
||||
let breadcrumbs: BreadCrumb[] = [];
|
||||
const breadcrumbs: BreadCrumb[] = [];
|
||||
|
||||
for (let i = 0; i < parts.length; i++) {
|
||||
if (i === 0) {
|
||||
|
||||
@@ -46,7 +46,7 @@ https://raw.githubusercontent.com/dzwillia/vue-simple-progress/master/src/compon
|
||||
|
||||
<script>
|
||||
// We're leaving this untouched as you can read in the beginning
|
||||
var isNumber = function (n) {
|
||||
const isNumber = function (n) {
|
||||
return !isNaN(parseFloat(n)) && isFinite(n);
|
||||
};
|
||||
|
||||
@@ -107,7 +107,7 @@ export default {
|
||||
},
|
||||
computed: {
|
||||
pct() {
|
||||
var pct = (this.val / this.max) * 100;
|
||||
let pct = (this.val / this.max) * 100;
|
||||
pct = pct.toFixed(2);
|
||||
return Math.min(pct, this.max);
|
||||
},
|
||||
@@ -160,7 +160,7 @@ export default {
|
||||
return isNumber(this.fontSize) ? this.fontSize : 13;
|
||||
},
|
||||
progress_style() {
|
||||
var style = {
|
||||
const style = {
|
||||
background: this.bgColor,
|
||||
};
|
||||
|
||||
@@ -177,7 +177,7 @@ export default {
|
||||
return style;
|
||||
},
|
||||
bar_style() {
|
||||
var style = {
|
||||
const style = {
|
||||
background: this.barColor,
|
||||
width: this.pct + "%",
|
||||
height: this.size_px + "px",
|
||||
@@ -198,7 +198,7 @@ export default {
|
||||
return style;
|
||||
},
|
||||
text_style() {
|
||||
var style = {
|
||||
const style = {
|
||||
color: this.textFgColor,
|
||||
"font-size": this.text_font_size + "px",
|
||||
"text-align": this.textAlign,
|
||||
|
||||
@@ -50,7 +50,7 @@ import { useFileStore } from "@/stores/file";
|
||||
import { useLayoutStore } from "@/stores/layout";
|
||||
|
||||
import { commands } from "@/api";
|
||||
import { throttle } from "lodash";
|
||||
import { throttle } from "lodash-es";
|
||||
import { theme } from "@/utils/constants";
|
||||
|
||||
export default {
|
||||
@@ -163,7 +163,7 @@ export default {
|
||||
this.canInput = false;
|
||||
event.target.innerHTML = "";
|
||||
|
||||
let results = {
|
||||
const results = {
|
||||
text: `${cmd}\n\n`,
|
||||
};
|
||||
|
||||
@@ -180,7 +180,7 @@ export default {
|
||||
},
|
||||
() => {
|
||||
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;
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
<template>
|
||||
<div v-show="active" @click="closeHovers" class="overlay"></div>
|
||||
<nav :class="{ active }">
|
||||
<template v-if="isLoggedIn">
|
||||
<button
|
||||
@@ -100,7 +101,7 @@
|
||||
href="https://github.com/filebrowser/filebrowser"
|
||||
>File Browser</a
|
||||
>
|
||||
<span> {{ version }}</span>
|
||||
<span> {{ " " }} {{ version }}</span>
|
||||
</span>
|
||||
<span>
|
||||
<a @click="help">{{ $t("sidebar.help") }}</a>
|
||||
@@ -157,7 +158,7 @@ export default {
|
||||
methods: {
|
||||
...mapActions(useLayoutStore, ["closeHovers", "showHover"]),
|
||||
async fetchUsage() {
|
||||
let path = this.$route.path.endsWith("/")
|
||||
const path = this.$route.path.endsWith("/")
|
||||
? this.$route.path
|
||||
: this.$route.path + "/";
|
||||
let usageStats = USAGE_DEFAULT;
|
||||
@@ -165,7 +166,7 @@ export default {
|
||||
return Object.assign(this.usage, usageStats);
|
||||
}
|
||||
try {
|
||||
let usage = await api.usage(path);
|
||||
const usage = await api.usage(path);
|
||||
usageStats = {
|
||||
used: prettyBytes(usage.used, { binary: true }),
|
||||
total: prettyBytes(usage.total, { binary: true }),
|
||||
@@ -190,8 +191,13 @@ export default {
|
||||
logout: auth.logout,
|
||||
},
|
||||
watch: {
|
||||
isFiles(newValue) {
|
||||
newValue && this.fetchUsage();
|
||||
$route: {
|
||||
handler(to) {
|
||||
if (to.path.includes("/files")) {
|
||||
this.fetchUsage();
|
||||
}
|
||||
},
|
||||
immediate: true,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
@@ -14,15 +14,15 @@
|
||||
</div>
|
||||
</template>
|
||||
<script setup lang="ts">
|
||||
import throttle from "lodash/throttle";
|
||||
import { throttle } from "lodash-es";
|
||||
import UTIF from "utif";
|
||||
import { onBeforeUnmount, onMounted, ref, watch } from "vue";
|
||||
|
||||
interface IProps {
|
||||
src: string;
|
||||
moveDisabledTime: number;
|
||||
classList: any[];
|
||||
zoomStep: number;
|
||||
moveDisabledTime?: number;
|
||||
classList?: any[];
|
||||
zoomStep?: number;
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<IProps>(), {
|
||||
@@ -102,10 +102,11 @@ const decodeUTIF = () => {
|
||||
if (document?.location?.pathname === undefined) {
|
||||
return;
|
||||
}
|
||||
let suff = document.location.pathname.split(".")?.pop()?.toLowerCase() ?? "";
|
||||
const suff =
|
||||
document.location.pathname.split(".")?.pop()?.toLowerCase() ?? "";
|
||||
|
||||
if (sufs.indexOf(suff) == -1) return false;
|
||||
let xhr = new XMLHttpRequest();
|
||||
const xhr = new XMLHttpRequest();
|
||||
UTIF._xhrs.push(xhr);
|
||||
UTIF._imgs.push(imgex.value);
|
||||
xhr.open("GET", props.src);
|
||||
@@ -230,7 +231,7 @@ const touchMove = (event: TouchEvent) => {
|
||||
if (imgex.value === null) {
|
||||
return;
|
||||
}
|
||||
let step = imgex.value.width / 5;
|
||||
const step = imgex.value.width / 5;
|
||||
if (event.targetTouches.length === 2) {
|
||||
moveDisabled.value = true;
|
||||
if (disabledTimer.value) clearTimeout(disabledTimer.value);
|
||||
@@ -239,9 +240,9 @@ const touchMove = (event: TouchEvent) => {
|
||||
props.moveDisabledTime
|
||||
);
|
||||
|
||||
let p1 = event.targetTouches[0];
|
||||
let p2 = event.targetTouches[1];
|
||||
let touchDistance = Math.sqrt(
|
||||
const p1 = event.targetTouches[0];
|
||||
const p2 = event.targetTouches[1];
|
||||
const touchDistance = Math.sqrt(
|
||||
Math.pow(p2.pageX - p1.pageX, 2) + Math.pow(p2.pageY - p1.pageY, 2)
|
||||
);
|
||||
if (!lastTouchDistance.value) {
|
||||
@@ -253,8 +254,8 @@ const touchMove = (event: TouchEvent) => {
|
||||
setZoom();
|
||||
} else if (event.targetTouches.length === 1) {
|
||||
if (moveDisabled.value) return;
|
||||
let x = event.targetTouches[0].pageX - (lastX.value ?? 0);
|
||||
let y = event.targetTouches[0].pageY - (lastY.value ?? 0);
|
||||
const x = event.targetTouches[0].pageX - (lastX.value ?? 0);
|
||||
const y = event.targetTouches[0].pageY - (lastY.value ?? 0);
|
||||
if (Math.abs(x) >= step && Math.abs(y) >= step) return;
|
||||
lastX.value = event.targetTouches[0].pageX;
|
||||
lastY.value = event.targetTouches[0].pageY;
|
||||
@@ -268,8 +269,8 @@ const doMove = (x: number, y: number) => {
|
||||
}
|
||||
const style = imgex.value.style;
|
||||
|
||||
let posX = pxStringToNumber(style.left) + x;
|
||||
let posY = pxStringToNumber(style.top) + y;
|
||||
const posX = pxStringToNumber(style.left) + x;
|
||||
const posY = pxStringToNumber(style.top) + y;
|
||||
|
||||
style.left = posX + "px";
|
||||
style.top = posY + "px";
|
||||
|
||||
@@ -12,6 +12,7 @@
|
||||
:data-type="type"
|
||||
:aria-label="name"
|
||||
:aria-selected="isSelected"
|
||||
:data-ext="getExtension(name).toLowerCase()"
|
||||
>
|
||||
<div>
|
||||
<img
|
||||
@@ -81,7 +82,7 @@ const isDraggable = computed(
|
||||
const canDrop = computed(() => {
|
||||
if (!props.isDir || props.readOnly) return false;
|
||||
|
||||
for (let i of fileStore.selected) {
|
||||
for (const i of fileStore.selected) {
|
||||
if (fileStore.req?.items[i].url === props.url) {
|
||||
return false;
|
||||
}
|
||||
@@ -155,9 +156,9 @@ const drop = async (event: Event) => {
|
||||
}
|
||||
}
|
||||
|
||||
let items: any[] = [];
|
||||
const items: any[] = [];
|
||||
|
||||
for (let i of fileStore.selected) {
|
||||
for (const i of fileStore.selected) {
|
||||
if (fileStore.req) {
|
||||
items.push({
|
||||
from: fileStore.req?.items[i].url,
|
||||
@@ -171,10 +172,10 @@ const drop = async (event: Event) => {
|
||||
if (el === null) {
|
||||
return;
|
||||
}
|
||||
let path = el.__vue__.url;
|
||||
let baseItems = (await api.fetch(path)).items;
|
||||
const path = el.__vue__.url;
|
||||
const baseItems = (await api.fetch(path)).items;
|
||||
|
||||
let action = (overwrite: boolean, rename: boolean) => {
|
||||
const action = (overwrite: boolean, rename: boolean) => {
|
||||
api
|
||||
.move(items, overwrite, rename)
|
||||
.then(() => {
|
||||
@@ -183,7 +184,7 @@ const drop = async (event: Event) => {
|
||||
.catch($showError);
|
||||
};
|
||||
|
||||
let conflict = upload.checkConflict(items, baseItems);
|
||||
const conflict = upload.checkConflict(items, baseItems);
|
||||
|
||||
let overwrite = false;
|
||||
let rename = false;
|
||||
@@ -209,8 +210,10 @@ const drop = async (event: Event) => {
|
||||
|
||||
const itemClick = (event: Event | KeyboardEvent) => {
|
||||
if (
|
||||
!((event as KeyboardEvent).ctrlKey || (event as KeyboardEvent).metaKey) &&
|
||||
singleClick.value &&
|
||||
!(event as KeyboardEvent).ctrlKey &&
|
||||
!(event as KeyboardEvent).metaKey &&
|
||||
!(event as KeyboardEvent).shiftKey &&
|
||||
!fileStore.multiple
|
||||
)
|
||||
open();
|
||||
@@ -270,4 +273,12 @@ const click = (event: Event | KeyboardEvent) => {
|
||||
const open = () => {
|
||||
router.push({ path: props.url });
|
||||
};
|
||||
|
||||
const getExtension = (fileName: string): string => {
|
||||
const lastDotIndex = fileName.lastIndexOf(".");
|
||||
if (lastDotIndex === -1) {
|
||||
return fileName;
|
||||
}
|
||||
return fileName.substring(lastDotIndex);
|
||||
};
|
||||
</script>
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
<template>
|
||||
<video ref="videoPlayer" class="video-max video-js" controls>
|
||||
<source :src="source" />
|
||||
<video ref="videoPlayer" class="video-max video-js" controls preload="auto">
|
||||
<source />
|
||||
<track
|
||||
kind="subtitles"
|
||||
v-for="(sub, index) in subtitles"
|
||||
@@ -18,12 +18,11 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, onMounted, onBeforeUnmount } from "vue";
|
||||
import { ref, onMounted, onBeforeUnmount, nextTick } from "vue";
|
||||
import videojs from "video.js";
|
||||
import type Player from "video.js/dist/types/player";
|
||||
import "videojs-mobile-ui";
|
||||
import "videojs-hotkeys";
|
||||
|
||||
import "video.js/dist/video-js.min.css";
|
||||
import "videojs-mobile-ui/dist/videojs-mobile-ui.css";
|
||||
|
||||
@@ -41,34 +40,15 @@ const props = withDefaults(
|
||||
}
|
||||
);
|
||||
|
||||
onMounted(() => {
|
||||
player.value = videojs(
|
||||
videoPlayer.value!,
|
||||
{
|
||||
html5: {
|
||||
// needed for customizable subtitles
|
||||
// TODO: add to user settings
|
||||
nativeTextTracks: false,
|
||||
},
|
||||
plugins: {
|
||||
hotkeys: {
|
||||
volumeStep: 0.1,
|
||||
seekStep: 10,
|
||||
enableModifiersForNumbers: false,
|
||||
},
|
||||
},
|
||||
...props.options,
|
||||
},
|
||||
// onReady callback
|
||||
async () => {
|
||||
// player.value!.log("onPlayerReady", this);
|
||||
}
|
||||
);
|
||||
// TODO: need to test on mobile
|
||||
// @ts-ignore
|
||||
player.value!.mobileUi();
|
||||
const source = ref(props.source);
|
||||
const sourceType = ref("");
|
||||
|
||||
nextTick(() => {
|
||||
initVideoPlayer();
|
||||
});
|
||||
|
||||
onMounted(() => {});
|
||||
|
||||
onBeforeUnmount(() => {
|
||||
if (player.value) {
|
||||
player.value.dispose();
|
||||
@@ -76,11 +56,77 @@ onBeforeUnmount(() => {
|
||||
}
|
||||
});
|
||||
|
||||
const initVideoPlayer = async () => {
|
||||
try {
|
||||
const lang = document.documentElement.lang;
|
||||
const languagePack = await (
|
||||
languageImports[lang] || languageImports.en
|
||||
)?.();
|
||||
const code = languageImports[lang] ? lang : "en";
|
||||
videojs.addLanguage(code, languagePack.default);
|
||||
sourceType.value = "";
|
||||
|
||||
//
|
||||
sourceType.value = getSourceType(source.value);
|
||||
|
||||
const srcOpt = { sources: { src: props.source, type: sourceType.value } };
|
||||
//Supporting localized language display.
|
||||
const langOpt = { language: code };
|
||||
// support for playback at different speeds.
|
||||
const playbackRatesOpt = { playbackRates: [0.5, 1, 1.5, 2, 2.5, 3] };
|
||||
const options = getOptions(
|
||||
props.options,
|
||||
langOpt,
|
||||
srcOpt,
|
||||
playbackRatesOpt
|
||||
);
|
||||
player.value = videojs(videoPlayer.value!, options, () => {});
|
||||
|
||||
// TODO: need to test on mobile
|
||||
// @ts-expect-error no ts definition for mobileUi
|
||||
player.value!.mobileUi();
|
||||
} catch (error) {
|
||||
console.error("Error initializing video player:", error);
|
||||
}
|
||||
};
|
||||
|
||||
const getOptions = (...srcOpt: any[]) => {
|
||||
const options = {
|
||||
controlBar: {
|
||||
skipButtons: {
|
||||
forward: 5,
|
||||
backward: 5,
|
||||
},
|
||||
},
|
||||
html5: {
|
||||
nativeTextTracks: false,
|
||||
},
|
||||
plugins: {
|
||||
hotkeys: {
|
||||
volumeStep: 0.1,
|
||||
seekStep: 10,
|
||||
enableModifiersForNumbers: false,
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
return videojs.obj.merge(options, ...srcOpt);
|
||||
};
|
||||
|
||||
// Attempting to fix the issue of being unable to play .MKV format video files
|
||||
const getSourceType = (source: string) => {
|
||||
const fileExtension = source ? source.split("?")[0].split(".").pop() : "";
|
||||
if (fileExtension?.toLowerCase() === "mkv") {
|
||||
return "video/mp4";
|
||||
}
|
||||
return "";
|
||||
};
|
||||
|
||||
const subLabel = (subUrl: string) => {
|
||||
let url: URL;
|
||||
try {
|
||||
url = new URL(subUrl);
|
||||
} catch (_) {
|
||||
} catch {
|
||||
// treat it as a relative url
|
||||
// we only need this for filename
|
||||
url = new URL(subUrl, window.location.origin);
|
||||
@@ -95,6 +141,35 @@ const subLabel = (subUrl: string) => {
|
||||
|
||||
return label;
|
||||
};
|
||||
|
||||
interface LanguageImports {
|
||||
[key: string]: () => Promise<any>;
|
||||
}
|
||||
|
||||
const languageImports: LanguageImports = {
|
||||
he: () => import("video.js/dist/lang/he.json"),
|
||||
hu: () => import("video.js/dist/lang/hu.json"),
|
||||
ar: () => import("video.js/dist/lang/ar.json"),
|
||||
de: () => import("video.js/dist/lang/de.json"),
|
||||
el: () => import("video.js/dist/lang/el.json"),
|
||||
en: () => import("video.js/dist/lang/en.json"),
|
||||
es: () => import("video.js/dist/lang/es.json"),
|
||||
fr: () => import("video.js/dist/lang/fr.json"),
|
||||
it: () => import("video.js/dist/lang/it.json"),
|
||||
ja: () => import("video.js/dist/lang/ja.json"),
|
||||
ko: () => import("video.js/dist/lang/ko.json"),
|
||||
"nl-be": () => import("video.js/dist/lang/nl.json"),
|
||||
pl: () => import("video.js/dist/lang/pl.json"),
|
||||
"pt-br": () => import("video.js/dist/lang/pt-BR.json"),
|
||||
pt: () => import("video.js/dist/lang/pt-PT.json"),
|
||||
ro: () => import("video.js/dist/lang/ro.json"),
|
||||
ru: () => import("video.js/dist/lang/ru.json"),
|
||||
sk: () => import("video.js/dist/lang/sk.json"),
|
||||
tr: () => import("video.js/dist/lang/tr.json"),
|
||||
uk: () => import("video.js/dist/lang/uk.json"),
|
||||
"zh-cn": () => import("video.js/dist/lang/zh-CN.json"),
|
||||
"zh-tw": () => import("video.js/dist/lang/zh-TW.json"),
|
||||
};
|
||||
</script>
|
||||
<style scoped>
|
||||
.video-max {
|
||||
|
||||
@@ -82,10 +82,10 @@ export default {
|
||||
...mapActions(useLayoutStore, ["showHover", "closeHovers"]),
|
||||
copy: async function (event) {
|
||||
event.preventDefault();
|
||||
let items = [];
|
||||
const items = [];
|
||||
|
||||
// Create a new promise for each file.
|
||||
for (let item of this.selected) {
|
||||
for (const item of this.selected) {
|
||||
items.push({
|
||||
from: this.req.items[item].url,
|
||||
to: this.dest + encodeURIComponent(this.req.items[item].name),
|
||||
@@ -93,7 +93,7 @@ export default {
|
||||
});
|
||||
}
|
||||
|
||||
let action = async (overwrite, rename) => {
|
||||
const action = async (overwrite, rename) => {
|
||||
buttons.loading("copy");
|
||||
|
||||
await api
|
||||
@@ -122,8 +122,8 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
let dstItems = (await api.fetch(this.dest)).items;
|
||||
let conflict = upload.checkConflict(items, dstItems);
|
||||
const dstItems = (await api.fetch(this.dest)).items;
|
||||
const conflict = upload.checkConflict(items, dstItems);
|
||||
|
||||
let overwrite = false;
|
||||
let rename = false;
|
||||
|
||||
@@ -74,8 +74,8 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
let promises = [];
|
||||
for (let index of this.selected) {
|
||||
const promises = [];
|
||||
for (const index of this.selected) {
|
||||
promises.push(api.remove(this.req.items[index].url));
|
||||
}
|
||||
|
||||
|
||||
@@ -43,7 +43,7 @@ export default {
|
||||
submit: async function () {
|
||||
this.updateRequest(null);
|
||||
|
||||
let uri = url.removeLastDir(this.$route.path) + "/";
|
||||
const uri = url.removeLastDir(this.$route.path) + "/";
|
||||
this.$router.push({ path: uri });
|
||||
},
|
||||
},
|
||||
|
||||
@@ -80,7 +80,7 @@ export default {
|
||||
|
||||
// Otherwise we add every directory to the
|
||||
// move options.
|
||||
for (let item of req.items) {
|
||||
for (const item of req.items) {
|
||||
if (!item.isDir) continue;
|
||||
|
||||
this.items.push({
|
||||
@@ -93,12 +93,12 @@ export default {
|
||||
// Retrieves the URL of the directory the user
|
||||
// just clicked in and fill the options with its
|
||||
// content.
|
||||
let uri = event.currentTarget.dataset.url;
|
||||
const uri = event.currentTarget.dataset.url;
|
||||
|
||||
files.fetch(uri).then(this.fillOptions).catch(this.$showError);
|
||||
},
|
||||
touchstart(event) {
|
||||
let url = event.currentTarget.dataset.url;
|
||||
const url = event.currentTarget.dataset.url;
|
||||
|
||||
// In 300 milliseconds, we shall reset the count.
|
||||
setTimeout(() => {
|
||||
|
||||
@@ -11,7 +11,7 @@
|
||||
<li><strong>DEL</strong> - {{ $t("help.del") }}</li>
|
||||
<li><strong>ESC</strong> - {{ $t("help.esc") }}</li>
|
||||
<li><strong>CTRL + S</strong> - {{ $t("help.ctrl.s") }}</li>
|
||||
<li><strong>CTRL + F</strong> - {{ $t("help.ctrl.f") }}</li>
|
||||
<li><strong>CTRL + SHIFT + F</strong> - {{ $t("help.ctrl.f") }}</li>
|
||||
<li><strong>CTRL + Click</strong> - {{ $t("help.ctrl.click") }}</li>
|
||||
<li><strong>Click</strong> - {{ $t("help.click") }}</li>
|
||||
<li><strong>Double click</strong> - {{ $t("help.doubleClick") }}</li>
|
||||
|
||||
@@ -124,7 +124,7 @@ export default {
|
||||
|
||||
let sum = 0;
|
||||
|
||||
for (let selected of this.selected) {
|
||||
for (const selected of this.selected) {
|
||||
sum += this.req.items[selected].size;
|
||||
}
|
||||
|
||||
|
||||
@@ -81,9 +81,9 @@ export default {
|
||||
...mapActions(useLayoutStore, ["showHover", "closeHovers"]),
|
||||
move: async function (event) {
|
||||
event.preventDefault();
|
||||
let items = [];
|
||||
const items = [];
|
||||
|
||||
for (let item of this.selected) {
|
||||
for (const item of this.selected) {
|
||||
items.push({
|
||||
from: this.req.items[item].url,
|
||||
to: this.dest + encodeURIComponent(this.req.items[item].name),
|
||||
@@ -91,7 +91,7 @@ export default {
|
||||
});
|
||||
}
|
||||
|
||||
let action = async (overwrite, rename) => {
|
||||
const action = async (overwrite, rename) => {
|
||||
buttons.loading("move");
|
||||
|
||||
await api
|
||||
@@ -106,8 +106,8 @@ export default {
|
||||
});
|
||||
};
|
||||
|
||||
let dstItems = (await api.fetch(this.dest)).items;
|
||||
let conflict = upload.checkConflict(items, dstItems);
|
||||
const dstItems = (await api.fetch(this.dest)).items;
|
||||
const conflict = upload.checkConflict(items, dstItems);
|
||||
|
||||
let overwrite = false;
|
||||
let rename = false;
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, watch } from "vue";
|
||||
import { watch } from "vue";
|
||||
import { ModalsContainer, useModal } from "vue-final-modal";
|
||||
import { storeToRefs } from "pinia";
|
||||
import { useLayoutStore } from "@/stores/layout";
|
||||
@@ -30,8 +30,6 @@ const layoutStore = useLayoutStore();
|
||||
|
||||
const { currentPromptName } = storeToRefs(layoutStore);
|
||||
|
||||
const closeModal = ref<() => Promise<string>>();
|
||||
|
||||
const components = new Map<string, any>([
|
||||
["info", Info],
|
||||
["help", Help],
|
||||
@@ -52,11 +50,6 @@ const components = new Map<string, any>([
|
||||
]);
|
||||
|
||||
watch(currentPromptName, (newValue) => {
|
||||
if (closeModal.value) {
|
||||
closeModal.value();
|
||||
closeModal.value = undefined;
|
||||
}
|
||||
|
||||
const modal = components.get(newValue!);
|
||||
if (!modal) return;
|
||||
|
||||
@@ -67,7 +60,7 @@ watch(currentPromptName, (newValue) => {
|
||||
},
|
||||
});
|
||||
|
||||
closeModal.value = close;
|
||||
layoutStore.setCloseOnPrompt(close, newValue!);
|
||||
open();
|
||||
});
|
||||
|
||||
|
||||
@@ -196,13 +196,23 @@ export default {
|
||||
methods: {
|
||||
...mapActions(useLayoutStore, ["closeHovers"]),
|
||||
copyToClipboard: function (text) {
|
||||
copy(text).then(
|
||||
copy({ text }).then(
|
||||
() => {
|
||||
// clipboard successfully set
|
||||
this.$showSuccess(this.$t("success.linkCopied"));
|
||||
},
|
||||
() => {
|
||||
// clipboard write failed
|
||||
copy({ text }, { permission: true }).then(
|
||||
() => {
|
||||
// clipboard successfully set
|
||||
this.$showSuccess(this.$t("success.linkCopied"));
|
||||
},
|
||||
(e) => {
|
||||
// clipboard write failed
|
||||
this.$showError(e);
|
||||
}
|
||||
);
|
||||
}
|
||||
);
|
||||
},
|
||||
|
||||
@@ -48,12 +48,10 @@ const layoutStore = useLayoutStore();
|
||||
|
||||
// TODO: this is a copy of the same function in FileListing.vue
|
||||
const uploadInput = (event: Event) => {
|
||||
layoutStore.closeHovers();
|
||||
|
||||
let files = (event.currentTarget as HTMLInputElement)?.files;
|
||||
const files = (event.currentTarget as HTMLInputElement)?.files;
|
||||
if (files === null) return;
|
||||
|
||||
let folder_upload = !!files[0].webkitRelativePath;
|
||||
const folder_upload = !!files[0].webkitRelativePath;
|
||||
|
||||
const uploadFiles: UploadList = [];
|
||||
for (let i = 0; i < files.length; i++) {
|
||||
@@ -68,8 +66,8 @@ const uploadInput = (event: Event) => {
|
||||
});
|
||||
}
|
||||
|
||||
let path = route.path.endsWith("/") ? route.path : route.path + "/";
|
||||
let conflict = upload.checkConflict(uploadFiles, fileStore.req!.items);
|
||||
const path = route.path.endsWith("/") ? route.path : route.path + "/";
|
||||
const conflict = upload.checkConflict(uploadFiles, fileStore.req!.items);
|
||||
|
||||
if (conflict) {
|
||||
layoutStore.showHover({
|
||||
|
||||
@@ -117,3 +117,11 @@ export default {
|
||||
},
|
||||
};
|
||||
</script>
|
||||
|
||||
<style scoped>
|
||||
.upload-info {
|
||||
min-width: 19ch;
|
||||
width: auto;
|
||||
text-align: left;
|
||||
}
|
||||
</style>
|
||||
|
||||
@@ -13,11 +13,12 @@ export default {
|
||||
name: "languages",
|
||||
props: ["locale"],
|
||||
data() {
|
||||
let dataObj = {};
|
||||
const dataObj = {};
|
||||
const locales = {
|
||||
he: "עברית",
|
||||
hu: "Magyar",
|
||||
ar: "العربية",
|
||||
ca: "Català",
|
||||
de: "Deutsch",
|
||||
el: "Ελληνικά",
|
||||
en: "English",
|
||||
@@ -37,6 +38,7 @@ export default {
|
||||
"sv-se": "Swedish (Sweden)",
|
||||
tr: "Türkçe",
|
||||
uk: "Українська",
|
||||
vi: "Tiếng Việt",
|
||||
"zh-cn": "中文 (简体)",
|
||||
"zh-tw": "中文 (繁體)",
|
||||
};
|
||||
|
||||
@@ -39,7 +39,7 @@ export default {
|
||||
methods: {
|
||||
remove(event, index) {
|
||||
event.preventDefault();
|
||||
let rules = [...this.rules];
|
||||
const rules = [...this.rules];
|
||||
rules.splice(index, 1);
|
||||
this.$emit("update:rules", [...rules]);
|
||||
},
|
||||
|
||||
@@ -7,7 +7,7 @@
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { SelectHTMLAttributes } from "vue";
|
||||
import type { SelectHTMLAttributes } from "vue";
|
||||
import { useI18n } from "vue-i18n";
|
||||
|
||||
const { t } = useI18n();
|
||||
@@ -17,7 +17,6 @@ defineProps<{
|
||||
}>();
|
||||
|
||||
const emit = defineEmits<{
|
||||
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
||||
(e: "update:theme", val: string | null): void;
|
||||
}>();
|
||||
|
||||
|
||||
@@ -116,7 +116,7 @@ watch(createUserDirData, () => {
|
||||
if (props.user?.scope) {
|
||||
props.user.scope = createUserDirData.value
|
||||
? ""
|
||||
: originalUserScope.value ?? "";
|
||||
: (originalUserScope.value ?? "");
|
||||
}
|
||||
});
|
||||
</script>
|
||||
|
||||
@@ -6,15 +6,22 @@
|
||||
background: var(--surfacePrimary);
|
||||
color: var(--textPrimary);
|
||||
z-index: 9999;
|
||||
background: rgba(127, 127, 127, 0.1);
|
||||
background: var(--dividerSecondary);
|
||||
transition: 0.2s ease background;
|
||||
cursor: ns-resize;
|
||||
touch-action: none;
|
||||
user-select: none;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.shell__divider {
|
||||
background: rgba(127, 127, 127, 0.3);
|
||||
width: 100%;
|
||||
height: 8px;
|
||||
}
|
||||
|
||||
.shell__divider:hover {
|
||||
background: rgba(127, 127, 127, 0.4);
|
||||
background: rgba(127, 127, 127, 0.9);
|
||||
}
|
||||
|
||||
.shell__content {
|
||||
@@ -34,7 +41,7 @@
|
||||
top: 0px;
|
||||
left: 0px;
|
||||
z-index: 9998;
|
||||
background-color: rgba(0, 0, 0, 0.05);
|
||||
background-color: var(--dividerPrimary);
|
||||
}
|
||||
|
||||
body.rtl .shell-content {
|
||||
@@ -75,4 +82,5 @@ body.rtl .shell-content {
|
||||
font-family: inherit;
|
||||
white-space: pre-wrap;
|
||||
width: 100%;
|
||||
color: var(--textSecondary);
|
||||
}
|
||||
|
||||
@@ -31,6 +31,8 @@
|
||||
--hover: rgba(0, 0, 0, 0.1);
|
||||
--borderPrimary: rgba(0, 0, 0, 0.1);
|
||||
--borderSecondary: rgba(0, 0, 0, 0.2);
|
||||
--dividerPrimary: rgba(255, 255, 255, 0.4);
|
||||
--dividerSecondary: rgba(255, 255, 255, 0.9);
|
||||
}
|
||||
|
||||
:root.dark {
|
||||
@@ -51,4 +53,6 @@
|
||||
--hover: rgba(255, 255, 255, 0.1);
|
||||
--borderPrimary: rgba(255, 255, 255, 0.05);
|
||||
--borderSecondary: rgba(255, 255, 255, 0.15);
|
||||
--dividerPrimary: rgba(30, 30, 30, 0.4);
|
||||
--dividerSecondary: rgba(30, 30, 30, 0.6);
|
||||
}
|
||||
|
||||
78
frontend/src/css/epubReader.css
Normal file
78
frontend/src/css/epubReader.css
Normal file
@@ -0,0 +1,78 @@
|
||||
.epub-reader {
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
height: 100%;
|
||||
}
|
||||
|
||||
.epub-reader .container {
|
||||
width: 100%;
|
||||
max-width: 100%;
|
||||
height: calc(100% - 64px);
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.epub-reader .arrow.pre {
|
||||
left: 0;
|
||||
}
|
||||
|
||||
.epub-reader .readerArea {
|
||||
background-color: var(--background) !important;
|
||||
}
|
||||
|
||||
.epub-reader .titleArea {
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.epub-reader .tocButtonBar {
|
||||
background: var(--divider);
|
||||
}
|
||||
|
||||
.epub-reader .tocButton {
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.epub-reader .tocButton.tocButtonExpanded {
|
||||
background-color: var(--background);
|
||||
}
|
||||
|
||||
.epub-reader .tocAreaButton.active {
|
||||
color: var(--blue);
|
||||
border-color: var(--dark-blue);
|
||||
}
|
||||
|
||||
.epub-reader .tocArea {
|
||||
background-color: var(--background);
|
||||
}
|
||||
|
||||
.epub-reader .readerArea .arrow {
|
||||
color: var(--text);
|
||||
}
|
||||
|
||||
.epub-reader .readerArea .arrow:hover {
|
||||
color: var(--hover);
|
||||
}
|
||||
|
||||
.epub-reader .size {
|
||||
display: flex;
|
||||
gap: 5px;
|
||||
align-items: center;
|
||||
z-index: 111;
|
||||
right: 25px;
|
||||
outline: none;
|
||||
position: absolute;
|
||||
top: 78px;
|
||||
}
|
||||
|
||||
.epub-reader .size span {
|
||||
color: var(--textSecondary);
|
||||
}
|
||||
|
||||
.epub-reader .size button {
|
||||
background: none;
|
||||
outline: none;
|
||||
border: none;
|
||||
width: 25px;
|
||||
height: 25px;
|
||||
color: var(--textPrimary);
|
||||
padding: 0;
|
||||
}
|
||||
@@ -63,8 +63,8 @@
|
||||
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;
|
||||
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF,
|
||||
U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@@ -142,8 +142,8 @@
|
||||
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;
|
||||
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF,
|
||||
U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
@@ -221,8 +221,8 @@
|
||||
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;
|
||||
unicode-range: U+0100-024F, U+1E00-1EFF, U+20A0-20AB, U+20AD-20CF,
|
||||
U+2C60-2C7F, U+A720-A7FF;
|
||||
}
|
||||
|
||||
@font-face {
|
||||
|
||||
@@ -5,7 +5,7 @@
|
||||
.file-icons [aria-label^="."] {
|
||||
opacity: 0.33;
|
||||
}
|
||||
.file-icons [aria-label$=".bak"] {
|
||||
.file-icons [data-ext=".bak"] {
|
||||
opacity: 0.33;
|
||||
}
|
||||
|
||||
@@ -33,117 +33,117 @@
|
||||
|
||||
/* #f90 - Image */
|
||||
|
||||
.file-icons [aria-label$=".ai"] i::before,
|
||||
.file-icons [aria-label$=".odg"] i::before,
|
||||
.file-icons [aria-label$=".xcf"] i::before {
|
||||
.file-icons [data-ext=".ai"] i::before,
|
||||
.file-icons [data-ext=".odg"] i::before,
|
||||
.file-icons [data-ext=".xcf"] i::before {
|
||||
content: "image";
|
||||
}
|
||||
|
||||
/* #f90 - Presentation */
|
||||
|
||||
.file-icons [aria-label$=".odp"] i::before,
|
||||
.file-icons [aria-label$=".ppt"] i::before,
|
||||
.file-icons [aria-label$=".pptx"] i::before {
|
||||
.file-icons [data-ext=".odp"] i::before,
|
||||
.file-icons [data-ext=".ppt"] i::before,
|
||||
.file-icons [data-ext=".pptx"] i::before {
|
||||
content: "slideshow";
|
||||
}
|
||||
|
||||
/* #0f0 - Spreadsheet/Database */
|
||||
|
||||
.file-icons [aria-label$=".csv"] i::before,
|
||||
.file-icons [aria-label$=".db"] i::before,
|
||||
.file-icons [aria-label$=".odb"] i::before,
|
||||
.file-icons [aria-label$=".ods"] i::before,
|
||||
.file-icons [aria-label$=".xls"] i::before,
|
||||
.file-icons [aria-label$=".xlsx"] i::before {
|
||||
.file-icons [data-ext=".csv"] i::before,
|
||||
.file-icons [data-ext=".db"] i::before,
|
||||
.file-icons [data-ext=".odb"] i::before,
|
||||
.file-icons [data-ext=".ods"] i::before,
|
||||
.file-icons [data-ext=".xls"] i::before,
|
||||
.file-icons [data-ext=".xlsx"] i::before {
|
||||
content: "border_all";
|
||||
}
|
||||
|
||||
/* #00f - Document */
|
||||
|
||||
.file-icons [aria-label$=".doc"] i::before,
|
||||
.file-icons [aria-label$=".docx"] i::before,
|
||||
.file-icons [aria-label$=".log"] i::before,
|
||||
.file-icons [aria-label$=".odt"] i::before,
|
||||
.file-icons [aria-label$=".rtf"] i::before {
|
||||
.file-icons [data-ext=".doc"] i::before,
|
||||
.file-icons [data-ext=".docx"] i::before,
|
||||
.file-icons [data-ext=".log"] i::before,
|
||||
.file-icons [data-ext=".odt"] i::before,
|
||||
.file-icons [data-ext=".rtf"] i::before {
|
||||
content: "description";
|
||||
}
|
||||
|
||||
/* #999 - Code */
|
||||
|
||||
.file-icons [aria-label$=".c"] i::before,
|
||||
.file-icons [aria-label$=".cpp"] i::before,
|
||||
.file-icons [aria-label$=".cs"] i::before,
|
||||
.file-icons [aria-label$=".css"] i::before,
|
||||
.file-icons [aria-label$=".go"] i::before,
|
||||
.file-icons [aria-label$=".h"] i::before,
|
||||
.file-icons [aria-label$=".html"] i::before,
|
||||
.file-icons [aria-label$=".java"] i::before,
|
||||
.file-icons [aria-label$=".js"] i::before,
|
||||
.file-icons [aria-label$=".json"] i::before,
|
||||
.file-icons [aria-label$=".kt"] i::before,
|
||||
.file-icons [aria-label$=".php"] i::before,
|
||||
.file-icons [aria-label$=".py"] i::before,
|
||||
.file-icons [aria-label$=".rb"] i::before,
|
||||
.file-icons [aria-label$=".rs"] i::before,
|
||||
.file-icons [aria-label$=".vue"] i::before,
|
||||
.file-icons [aria-label$=".xml"] i::before,
|
||||
.file-icons [aria-label$=".yml"] i::before {
|
||||
.file-icons [data-ext=".c"] i::before,
|
||||
.file-icons [data-ext=".cpp"] i::before,
|
||||
.file-icons [data-ext=".cs"] i::before,
|
||||
.file-icons [data-ext=".css"] i::before,
|
||||
.file-icons [data-ext=".go"] i::before,
|
||||
.file-icons [data-ext=".h"] i::before,
|
||||
.file-icons [data-ext=".html"] i::before,
|
||||
.file-icons [data-ext=".java"] i::before,
|
||||
.file-icons [data-ext=".js"] i::before,
|
||||
.file-icons [data-ext=".json"] i::before,
|
||||
.file-icons [data-ext=".kt"] i::before,
|
||||
.file-icons [data-ext=".php"] i::before,
|
||||
.file-icons [data-ext=".py"] i::before,
|
||||
.file-icons [data-ext=".rb"] i::before,
|
||||
.file-icons [data-ext=".rs"] i::before,
|
||||
.file-icons [data-ext=".vue"] i::before,
|
||||
.file-icons [data-ext=".xml"] i::before,
|
||||
.file-icons [data-ext=".yml"] i::before {
|
||||
content: "code";
|
||||
}
|
||||
|
||||
/* #999 - Executable */
|
||||
|
||||
.file-icons [aria-label$=".apk"] i::before,
|
||||
.file-icons [aria-label$=".bat"] i::before,
|
||||
.file-icons [aria-label$=".exe"] i::before,
|
||||
.file-icons [aria-label$=".jar"] i::before,
|
||||
.file-icons [aria-label$=".ps1"] i::before,
|
||||
.file-icons [aria-label$=".sh"] i::before {
|
||||
.file-icons [data-ext=".apk"] i::before,
|
||||
.file-icons [data-ext=".bat"] i::before,
|
||||
.file-icons [data-ext=".exe"] i::before,
|
||||
.file-icons [data-ext=".jar"] i::before,
|
||||
.file-icons [data-ext=".ps1"] i::before,
|
||||
.file-icons [data-ext=".sh"] i::before {
|
||||
content: "web_asset";
|
||||
}
|
||||
|
||||
/* #999 - Installer */
|
||||
|
||||
.file-icons [aria-label$=".deb"] i::before,
|
||||
.file-icons [aria-label$=".msi"] i::before,
|
||||
.file-icons [aria-label$=".pkg"] i::before,
|
||||
.file-icons [aria-label$=".rpm"] i::before {
|
||||
.file-icons [data-ext=".deb"] i::before,
|
||||
.file-icons [data-ext=".msi"] i::before,
|
||||
.file-icons [data-ext=".pkg"] i::before,
|
||||
.file-icons [data-ext=".rpm"] i::before {
|
||||
content: "archive";
|
||||
}
|
||||
|
||||
/* #999 - Compressed */
|
||||
|
||||
.file-icons [aria-label$=".7z"] i::before,
|
||||
.file-icons [aria-label$=".bz2"] i::before,
|
||||
.file-icons [aria-label$=".cab"] i::before,
|
||||
.file-icons [aria-label$=".gz"] i::before,
|
||||
.file-icons [aria-label$=".rar"] i::before,
|
||||
.file-icons [aria-label$=".tar"] i::before,
|
||||
.file-icons [aria-label$=".xz"] i::before,
|
||||
.file-icons [aria-label$=".zip"] i::before,
|
||||
.file-icons [aria-label$=".zst"] i::before {
|
||||
.file-icons [data-ext=".7z"] i::before,
|
||||
.file-icons [data-ext=".bz2"] i::before,
|
||||
.file-icons [data-ext=".cab"] i::before,
|
||||
.file-icons [data-ext=".gz"] i::before,
|
||||
.file-icons [data-ext=".rar"] i::before,
|
||||
.file-icons [data-ext=".tar"] i::before,
|
||||
.file-icons [data-ext=".xz"] i::before,
|
||||
.file-icons [data-ext=".zip"] i::before,
|
||||
.file-icons [data-ext=".zst"] i::before {
|
||||
content: "folder_zip";
|
||||
}
|
||||
|
||||
/* #999 - Disk */
|
||||
|
||||
.file-icons [aria-label$=".ccd"] i::before,
|
||||
.file-icons [aria-label$=".dmg"] i::before,
|
||||
.file-icons [aria-label$=".iso"] i::before,
|
||||
.file-icons [aria-label$=".mdf"] i::before,
|
||||
.file-icons [aria-label$=".vdi"] i::before,
|
||||
.file-icons [aria-label$=".vhd"] i::before,
|
||||
.file-icons [aria-label$=".vmdk"] i::before,
|
||||
.file-icons [aria-label$=".wim"] i::before {
|
||||
.file-icons [data-ext=".ccd"] i::before,
|
||||
.file-icons [data-ext=".dmg"] i::before,
|
||||
.file-icons [data-ext=".iso"] i::before,
|
||||
.file-icons [data-ext=".mdf"] i::before,
|
||||
.file-icons [data-ext=".vdi"] i::before,
|
||||
.file-icons [data-ext=".vhd"] i::before,
|
||||
.file-icons [data-ext=".vmdk"] i::before,
|
||||
.file-icons [data-ext=".wim"] i::before {
|
||||
content: "album";
|
||||
}
|
||||
|
||||
/* #999 - Font */
|
||||
|
||||
.file-icons [aria-label$=".otf"] i::before,
|
||||
.file-icons [aria-label$=".ttf"] i::before,
|
||||
.file-icons [aria-label$=".woff"] i::before,
|
||||
.file-icons [aria-label$=".woff2"] i::before {
|
||||
.file-icons [data-ext=".otf"] i::before,
|
||||
.file-icons [data-ext=".ttf"] i::before,
|
||||
.file-icons [data-ext=".woff"] i::before,
|
||||
.file-icons [data-ext=".woff2"] i::before {
|
||||
content: "font_download";
|
||||
}
|
||||
|
||||
@@ -166,77 +166,77 @@
|
||||
|
||||
/* #f00 - Adobe/Oracle */
|
||||
|
||||
.file-icons [aria-label$=".ai"] i,
|
||||
.file-icons [aria-label$=".java"] i,
|
||||
.file-icons [aria-label$=".jar"] i,
|
||||
.file-icons [aria-label$=".psd"] i,
|
||||
.file-icons [aria-label$=".rb"] i,
|
||||
.file-icons [data-type="pdf"] i {
|
||||
.file-icons [data-ext=".ai"] i,
|
||||
.file-icons [data-ext=".java"] i,
|
||||
.file-icons [data-ext=".jar"] i,
|
||||
.file-icons [data-ext=".psd"] i,
|
||||
.file-icons [data-ext=".rb"] i,
|
||||
.file-icons [data-ext=".pdf"] i {
|
||||
color: var(--icon-red);
|
||||
}
|
||||
|
||||
/* #f90 - Image/Presentation */
|
||||
|
||||
.file-icons [aria-label$=".html"] i,
|
||||
.file-icons [aria-label$=".odg"] i,
|
||||
.file-icons [aria-label$=".odp"] i,
|
||||
.file-icons [aria-label$=".ppt"] i,
|
||||
.file-icons [aria-label$=".pptx"] i,
|
||||
.file-icons [aria-label$=".vue"] i,
|
||||
.file-icons [aria-label$=".xcf"] i {
|
||||
.file-icons [data-ext=".html"] i,
|
||||
.file-icons [data-ext=".odg"] i,
|
||||
.file-icons [data-ext=".odp"] i,
|
||||
.file-icons [data-ext=".ppt"] i,
|
||||
.file-icons [data-ext=".pptx"] i,
|
||||
.file-icons [data-ext=".vue"] i,
|
||||
.file-icons [data-ext=".xcf"] i {
|
||||
color: var(--icon-orange);
|
||||
}
|
||||
|
||||
/* #ff0 - Various */
|
||||
|
||||
.file-icons [aria-label$=".css"] i,
|
||||
.file-icons [aria-label$=".js"] i,
|
||||
.file-icons [aria-label$=".json"] i,
|
||||
.file-icons [aria-label$=".zip"] i {
|
||||
.file-icons [data-ext=".css"] i,
|
||||
.file-icons [data-ext=".js"] i,
|
||||
.file-icons [data-ext=".json"] i,
|
||||
.file-icons [data-ext=".zip"] i {
|
||||
color: var(--icon-yellow);
|
||||
}
|
||||
|
||||
/* #0f0 - Spreadsheet/Google */
|
||||
|
||||
.file-icons [aria-label$=".apk"] i,
|
||||
.file-icons [aria-label$=".dex"] i,
|
||||
.file-icons [aria-label$=".go"] i,
|
||||
.file-icons [aria-label$=".ods"] i,
|
||||
.file-icons [aria-label$=".xls"] i,
|
||||
.file-icons [aria-label$=".xlsx"] i {
|
||||
.file-icons [data-ext=".apk"] i,
|
||||
.file-icons [data-ext=".dex"] i,
|
||||
.file-icons [data-ext=".go"] i,
|
||||
.file-icons [data-ext=".ods"] i,
|
||||
.file-icons [data-ext=".xls"] i,
|
||||
.file-icons [data-ext=".xlsx"] i {
|
||||
color: var(--icon-green);
|
||||
}
|
||||
|
||||
/* #00f - Document/Microsoft/Apple/Closed */
|
||||
|
||||
.file-icons [aria-label$=".aac"] i,
|
||||
.file-icons [aria-label$=".bat"] i,
|
||||
.file-icons [aria-label$=".cab"] i,
|
||||
.file-icons [aria-label$=".cs"] i,
|
||||
.file-icons [aria-label$=".dmg"] i,
|
||||
.file-icons [aria-label$=".doc"] i,
|
||||
.file-icons [aria-label$=".docx"] i,
|
||||
.file-icons [aria-label$=".emf"] i,
|
||||
.file-icons [aria-label$=".exe"] i,
|
||||
.file-icons [aria-label$=".ico"] i,
|
||||
.file-icons [aria-label$=".mp2"] i,
|
||||
.file-icons [aria-label$=".mp3"] i,
|
||||
.file-icons [aria-label$=".mp4"] i,
|
||||
.file-icons [aria-label$=".mpg"] i,
|
||||
.file-icons [aria-label$=".msi"] i,
|
||||
.file-icons [aria-label$=".odt"] i,
|
||||
.file-icons [aria-label$=".ps1"] i,
|
||||
.file-icons [aria-label$=".rtf"] i,
|
||||
.file-icons [aria-label$=".vob"] i,
|
||||
.file-icons [aria-label$=".wim"] i {
|
||||
.file-icons [data-ext=".aac"] i,
|
||||
.file-icons [data-ext=".bat"] i,
|
||||
.file-icons [data-ext=".cab"] i,
|
||||
.file-icons [data-ext=".cs"] i,
|
||||
.file-icons [data-ext=".dmg"] i,
|
||||
.file-icons [data-ext=".doc"] i,
|
||||
.file-icons [data-ext=".docx"] i,
|
||||
.file-icons [data-ext=".emf"] i,
|
||||
.file-icons [data-ext=".exe"] i,
|
||||
.file-icons [data-ext=".ico"] i,
|
||||
.file-icons [data-ext=".mp2"] i,
|
||||
.file-icons [data-ext=".mp3"] i,
|
||||
.file-icons [data-ext=".mp4"] i,
|
||||
.file-icons [data-ext=".mpg"] i,
|
||||
.file-icons [data-ext=".msi"] i,
|
||||
.file-icons [data-ext=".odt"] i,
|
||||
.file-icons [data-ext=".ps1"] i,
|
||||
.file-icons [data-ext=".rtf"] i,
|
||||
.file-icons [data-ext=".vob"] i,
|
||||
.file-icons [data-ext=".wim"] i {
|
||||
color: var(--icon-blue);
|
||||
}
|
||||
|
||||
/* #60f - Various */
|
||||
|
||||
.file-icons [aria-label$=".iso"] i,
|
||||
.file-icons [aria-label$=".php"] i,
|
||||
.file-icons [aria-label$=".rar"] i {
|
||||
.file-icons [data-ext=".iso"] i,
|
||||
.file-icons [data-ext=".php"] i,
|
||||
.file-icons [data-ext=".rar"] i {
|
||||
color: var(--icon-violet);
|
||||
}
|
||||
|
||||
|
||||
@@ -195,6 +195,10 @@ html[dir="rtl"] #listing {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
#listing.list .item p.name:not(#listing.list .item.header .name) {
|
||||
margin-right: -3em;
|
||||
}
|
||||
|
||||
#listing.list .item .name {
|
||||
width: 50%;
|
||||
}
|
||||
@@ -227,10 +231,6 @@ html[dir="rtl"] #listing {
|
||||
width: 0;
|
||||
}
|
||||
|
||||
#listing.list .item.header .name {
|
||||
margin-right: 3em;
|
||||
}
|
||||
|
||||
#listing.list .header a {
|
||||
color: inherit;
|
||||
}
|
||||
@@ -241,10 +241,9 @@ html[dir="rtl"] #listing {
|
||||
|
||||
#listing.list .name {
|
||||
font-weight: normal;
|
||||
}
|
||||
|
||||
#listing.list .item.header .name {
|
||||
margin-right: 3em;
|
||||
word-wrap: break-word;
|
||||
word-break: break-all;
|
||||
white-space: pre-wrap;
|
||||
}
|
||||
|
||||
#listing.list .header span {
|
||||
|
||||
13
frontend/src/css/mdPreview.css
Normal file
13
frontend/src/css/mdPreview.css
Normal file
@@ -0,0 +1,13 @@
|
||||
.md_preview {
|
||||
overflow-y: auto;
|
||||
max-height: 80vh;
|
||||
padding: 1rem;
|
||||
border: 1px solid #000;
|
||||
font-size: 20px;
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
#preview-container {
|
||||
overflow: auto;
|
||||
max-height: 80vh; /* Match the max-height of md_preview for scrolling */
|
||||
}
|
||||
@@ -15,6 +15,8 @@
|
||||
@import "./dashboard.css";
|
||||
@import "./login.css";
|
||||
@import "./mobile.css";
|
||||
@import "./epubReader.css";
|
||||
@import "./mdPreview.css";
|
||||
|
||||
/* For testing only
|
||||
:focus {
|
||||
@@ -269,7 +271,7 @@ main .spinner .bounce2 {
|
||||
#previewer .pdf {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin-top: 4em;
|
||||
padding-top: 4em;
|
||||
}
|
||||
|
||||
#previewer h2.message {
|
||||
|
||||
264
frontend/src/i18n/ca.json
Normal file
264
frontend/src/i18n/ca.json
Normal file
@@ -0,0 +1,264 @@
|
||||
{
|
||||
"buttons": {
|
||||
"cancel": "Cancel·lar",
|
||||
"clear": "Netejar",
|
||||
"close": "Tancar",
|
||||
"continue": "Continuar",
|
||||
"copy": "Copiar",
|
||||
"copyFile": "Copiar fitxer",
|
||||
"copyToClipboard": "Copiar al porta-retalls",
|
||||
"copyDownloadLinkToClipboard": "Copiar l'enllaç de descàrrega al portapapers",
|
||||
"create": "Crear",
|
||||
"delete": "Esborrar",
|
||||
"download": "Descarregar",
|
||||
"file": "Fitxer",
|
||||
"folder": "Carpeta",
|
||||
"fullScreen": "Canviar a pantalla completa",
|
||||
"hideDotfiles": "Ocultar fitxers que comencen per punt",
|
||||
"info": "Info",
|
||||
"more": "Més",
|
||||
"move": "Moure",
|
||||
"moveFile": "Moure fitxer",
|
||||
"new": "Nou",
|
||||
"next": "Següent",
|
||||
"ok": "D'acord",
|
||||
"permalink": "Enllaç permanent",
|
||||
"previous": "Anterior",
|
||||
"publish": "Publicar",
|
||||
"rename": "Reanomenar",
|
||||
"replace": "Substituir",
|
||||
"reportIssue": "Reportar problema",
|
||||
"save": "Desar",
|
||||
"schedule": "Programar",
|
||||
"search": "Cercar",
|
||||
"select": "Seleccionar",
|
||||
"selectMultiple": "Selecció múltiple",
|
||||
"share": "Compartir",
|
||||
"shell": "Prem Enter per cercar...",
|
||||
"submit": "Enviar",
|
||||
"switchView": "Canviar vista",
|
||||
"toggleSidebar": "Mostrar/ocultar menú",
|
||||
"update": "Actualitzar",
|
||||
"upload": "Pujar",
|
||||
"openFile": "Obrir fitxer",
|
||||
"discardChanges": "Descartar"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "Descarregar fitxer",
|
||||
"downloadFolder": "Descarregar directori",
|
||||
"downloadSelected": "Descarregar seleccionats"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "Are you sure you wish to abort?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "No tens els permisos necessaris per accedir.",
|
||||
"internal": "La veritat és que alguna cosa ha anat malament.",
|
||||
"notFound": "No es pot accedir a aquest lloc.",
|
||||
"connection": "No es pot accedir al servidor."
|
||||
},
|
||||
"files": {
|
||||
"body": "Cos",
|
||||
"closePreview": "Tancar vista prèvia",
|
||||
"files": "Fitxers",
|
||||
"folders": "Carpetes",
|
||||
"home": "Inici",
|
||||
"lastModified": "Última modificació",
|
||||
"loading": "Carregant...",
|
||||
"lonely": "Un se sent molt sol aquí...",
|
||||
"metadata": "Metadades",
|
||||
"multipleSelectionEnabled": "Selecció múltiple activada",
|
||||
"name": "Nom",
|
||||
"size": "Mida",
|
||||
"sortByLastModified": "Ordenar per última modificació",
|
||||
"sortByName": "Ordenar per nom",
|
||||
"sortBySize": "Ordenar per mida",
|
||||
"noPreview": "La vista prèvia no està disponible per a aquest fitxer."
|
||||
},
|
||||
"help": {
|
||||
"click": "seleccionar fitxer o carpeta",
|
||||
"ctrl": {
|
||||
"click": "seleccionar múltiples fitxers o carpetes",
|
||||
"f": "obre la cerca",
|
||||
"s": "desa un fitxer o el descarrega a la carpeta en què estàs"
|
||||
},
|
||||
"del": "elimina els ítems seleccionats",
|
||||
"doubleClick": "obre un fitxer o carpeta",
|
||||
"esc": "neteja la selecció i/o tanca la finestra",
|
||||
"f1": "aquesta informació",
|
||||
"f2": "reanomenar fitxer",
|
||||
"help": "Ajuda"
|
||||
},
|
||||
"login": {
|
||||
"createAnAccount": "Crear un compte",
|
||||
"loginInstead": "Usuari ja existent",
|
||||
"password": "Contrasenya",
|
||||
"passwordConfirm": "Confirmació de contrasenya",
|
||||
"passwordsDontMatch": "Les contrasenyes no coincideixen",
|
||||
"signup": "Registra't",
|
||||
"submit": "Iniciar sessió",
|
||||
"username": "Usuari",
|
||||
"usernameTaken": "Nom d'usuari no disponible",
|
||||
"wrongCredentials": "Usuari i/o contrasenya incorrectes"
|
||||
},
|
||||
"permanent": "Permanent",
|
||||
"prompts": {
|
||||
"copy": "Copiar",
|
||||
"copyMessage": "Tria el lloc on vols copiar els teus fitxers:",
|
||||
"currentlyNavigating": "Actualment estàs a:",
|
||||
"deleteMessageMultiple": "Estàs segur que vols eliminar {count} fitxer(s)?",
|
||||
"deleteMessageSingle": "Estàs segur que vols eliminar aquest fitxer/carpeta?",
|
||||
"deleteMessageShare": "Estàs segur que vols eliminar aquest recurs compartit ({path})?",
|
||||
"deleteUser": "Esteu segur que voleu eliminar aquest usuari?",
|
||||
"deleteTitle": "Esborrar fitxers",
|
||||
"displayName": "Nom:",
|
||||
"download": "Descarregar fitxers",
|
||||
"downloadMessage": "Tria el format de descàrrega.",
|
||||
"error": "Alguna cosa ha fallat",
|
||||
"fileInfo": "Informació del fitxer",
|
||||
"filesSelected": "{count} fitxers seleccionats.",
|
||||
"lastModified": "Última modificació",
|
||||
"move": "Moure",
|
||||
"moveMessage": "Tria una nova casa per als teus fitxers/carpeta(s):",
|
||||
"newArchetype": "Crea un nou post basat en un arquetip. El teu fitxer serà creat a la carpeta de contingut.",
|
||||
"newDir": "Nova carpeta",
|
||||
"newDirMessage": "Escriu el nom de la nova carpeta.",
|
||||
"newFile": "Nou fitxer",
|
||||
"newFileMessage": "Escriu el nom del nou fitxer.",
|
||||
"numberDirs": "Nombre de carpetes",
|
||||
"numberFiles": "Nombre de fitxers",
|
||||
"rename": "Reanomenar",
|
||||
"renameMessage": "Escriu el nou nom per a",
|
||||
"replace": "Substituir",
|
||||
"replaceMessage": "Un dels fitxers que intentes pujar està creant conflicte pel seu nom. Vols canviar el nom del ja existent?\n",
|
||||
"schedule": "Programar",
|
||||
"scheduleMessage": "Tria una hora i data per programar la publicació d'aquest post.",
|
||||
"show": "Mostrar",
|
||||
"size": "Mida",
|
||||
"upload": "Pujar",
|
||||
"uploadFiles": "Pujant {files} fitxers...",
|
||||
"uploadMessage": "Seleccioneu una opció per pujar.",
|
||||
"optionalPassword": "Contrasenya opcional",
|
||||
"resolution": "Resolució",
|
||||
"discardEditorChanges": "Esteu segur que voleu descartar els canvis que heu fet?"
|
||||
},
|
||||
"search": {
|
||||
"images": "Imatges",
|
||||
"music": "Música",
|
||||
"pdf": "PDF",
|
||||
"pressToSearch": "Prem Enter per cercar...",
|
||||
"search": "Cercar...",
|
||||
"typeToSearch": "Escriu per fer una cerca...",
|
||||
"types": "Tipus",
|
||||
"video": "Vídeo"
|
||||
},
|
||||
"settings": {
|
||||
"admin": "Admin",
|
||||
"administrator": "Administrador",
|
||||
"allowCommands": "Executar comandes",
|
||||
"allowEdit": "Editar, reanomenar i esborrar fitxers o carpetes",
|
||||
"allowNew": "Crear nous fitxers i carpetes",
|
||||
"allowPublish": "Publicar nous posts i pàgines",
|
||||
"allowSignup": "Permetre registre d'usuaris",
|
||||
"avoidChanges": "(deixar en blanc per evitar canvis)",
|
||||
"branding": "Marca",
|
||||
"brandingDirectoryPath": "Ruta de la carpeta de personalització de marca",
|
||||
"brandingHelp": "Pots personalitzar com es veu la teva instància de FileBrowser canviant-li el nom, reemplaçant el logotip, afegint estils personalitzats i fins i tot deshabilitant els enllaços externs que apunten cap a GitHub. \nPer a més informació sobre personalització de marca, si us plau revisa el {0}.",
|
||||
"changePassword": "Canviar contrasenya",
|
||||
"commandRunner": "Executor de comandes",
|
||||
"commandRunnerHelp": "Aquí pots establir les comandes que s'executen en els esdeveniments anomenats. Has d'escriure'n una per línia. Les variables d'entorn {0} i {1} estaran disponibles, sent {0} relativa a {1}. Per a més informació sobre aquesta característica i les variables d'entorn disponibles, si us plau llegeix el {2}.",
|
||||
"commandsUpdated": "Comandes actualitzades!",
|
||||
"createUserDir": "Crea automàticament una carpeta d'inici quan s'afegeix un usuari",
|
||||
"tusUploads": "Càrregues a trossos",
|
||||
"tusUploadsHelp": "El File Browser suporta càrregues de fitxers a trossos, permetent la creació de càrregues de fitxers eficients, fiables, reanudables i a trossos fins i tot en xarxes poc fiables.",
|
||||
"tusUploadsChunkSize": "Indica la mida màxima d'una sol·licitud (s'utilitzaran càrregues directes per a càrregues més petites). Podeu introduir un enter pla que indiqui la mida en bytes o una cadena com 10MB, 1GB, etc.",
|
||||
"tusUploadsRetryCount": "Nombre de reintents a realitzar si una part falla en carregar-se.",
|
||||
"userHomeBasePath": "Ruta base per als directoris personals dels usuaris",
|
||||
"userScopeGenerationPlaceholder": "L'àmbit es generarà automàticament",
|
||||
"createUserHomeDirectory": "Crear el directori principal de l'usuari",
|
||||
"customStylesheet": "Modificar full d'estils",
|
||||
"defaultUserDescription": "Aquestes són les configuracions per defecte per a nous usuaris.",
|
||||
"disableExternalLinks": "Deshabilitar enllaços externs (excepte documentació)",
|
||||
"disableUsedDiskPercentage": "Desactivar el gràfic de percentatge de disc utilitzat",
|
||||
"documentation": "documentació",
|
||||
"examples": "Exemples",
|
||||
"executeOnShell": "Executar a la shell",
|
||||
"executeOnShellDescription": "Per defecte, FileBrowser executa les comandes cridant directament els seus binaris. Si vols executar-los en una shell en lloc (com Bash o PowerShell), pots definir-ho aquí amb els arguments i flags necessaris. Si es defineix, la comanda que s'executa s'afegirà com a argument. Això s'aplica tant a les comandes d'usuari com als ganxos d'esdeveniments.",
|
||||
"globalRules": "Es tracta d'un conjunt global de regles de permís i rebuig. S'apliquen a tots els usuaris. Pots definir regles específiques en la configuració de cada usuari per anul·lar aquestes.",
|
||||
"globalSettings": "Ajustos globals",
|
||||
"hideDotfiles": "Ocultar fitxers que comencen per punt",
|
||||
"insertPath": "Introdueix la ruta",
|
||||
"insertRegex": "Introduir expressió regular",
|
||||
"instanceName": "Nom de la instància",
|
||||
"language": "Idioma",
|
||||
"lockPassword": "Evitar que l'usuari canviï la contrasenya",
|
||||
"newPassword": "La teva nova contrasenya",
|
||||
"newPasswordConfirm": "Confirma la teva contrasenya",
|
||||
"newUser": "Nou usuari",
|
||||
"password": "Contrasenya",
|
||||
"passwordUpdated": "Contrasenya actualitzada!",
|
||||
"path": "Ruta",
|
||||
"perm": {
|
||||
"create": "Crear fitxers i directoris",
|
||||
"delete": "Eliminar fitxers i directoris",
|
||||
"download": "Descarregar",
|
||||
"execute": "Executar comandes",
|
||||
"modify": "Editar fitxers",
|
||||
"rename": "Reanomenar o moure fitxers i directoris",
|
||||
"share": "Compartir fitxers"
|
||||
},
|
||||
"permissions": "Permisos",
|
||||
"permissionsHelp": "Pots nomenar l'usuari com a administrador o triar els permisos individualment. Si selecciones \"Administrador\", totes les altres opcions s'activaran automàticament. L'administració d'usuaris és un privilegi d'administrador.\n",
|
||||
"profileSettings": "Ajustos del perfil",
|
||||
"ruleExample1": "prevé l'accés a una extensió de fitxer (Com .git) en cada carpeta.\n",
|
||||
"ruleExample2": "bloqueja l'accés al fitxer anomenat Caddyfile a la carpeta arrel.",
|
||||
"rules": "Regles",
|
||||
"rulesHelp": "Aquí pots definir un conjunt de regles de permisos per a aquest usuari específic. Els fitxers bloquejats no es mostraran en les llistes i no seran accessibles per l'usuari. Pots utilitzar regex i rutes relatives a l'arrel de l'usuari.\n",
|
||||
"scope": "Arrel",
|
||||
"setDateFormat": "Establir el format exacte de la data",
|
||||
"settingsUpdated": "Ajustos actualitzats!",
|
||||
"shareDuration": "Compartir Duració",
|
||||
"shareManagement": "Gestió Compartida",
|
||||
"shareDeleted": "Recurs compartit eliminat!",
|
||||
"singleClick": "Utilitza un sol clic per obrir fitxers i directoris",
|
||||
"themes": {
|
||||
"default": "Valor per defecte del sistema",
|
||||
"dark": "Fosc",
|
||||
"light": "Clar",
|
||||
"title": "Tema"
|
||||
},
|
||||
"user": "Usuari",
|
||||
"userCommands": "Comandes",
|
||||
"userCommandsHelp": "Una llista separada per espais amb les comandes permeses per a aquest usuari. Exemple:\n",
|
||||
"userCreated": "Usuari creat!",
|
||||
"userDefaults": "Configuració d'usuari per defecte",
|
||||
"userDeleted": "Usuari eliminat!",
|
||||
"userManagement": "Administració d'usuaris",
|
||||
"userUpdated": "Usuari actualitzat!",
|
||||
"username": "Usuari",
|
||||
"users": "Usuaris"
|
||||
},
|
||||
"sidebar": {
|
||||
"help": "Ajuda",
|
||||
"hugoNew": "Nou Hugo",
|
||||
"login": "Iniciar sessió",
|
||||
"logout": "Tancar sessió",
|
||||
"myFiles": "Els meus fitxers",
|
||||
"newFile": "Nou fitxer",
|
||||
"newFolder": "Nova carpeta",
|
||||
"preview": "Vista prèvia",
|
||||
"settings": "Ajustos",
|
||||
"signup": "Registra't",
|
||||
"siteSettings": "Ajustos del lloc"
|
||||
},
|
||||
"success": {
|
||||
"linkCopied": "Enllaç copiat!"
|
||||
},
|
||||
"time": {
|
||||
"days": "Dies",
|
||||
"hours": "Hores",
|
||||
"minutes": "Minuts",
|
||||
"seconds": "Segons",
|
||||
"unit": "Unitat"
|
||||
}
|
||||
}
|
||||
264
frontend/src/i18n/cz_cs.json
Normal file
264
frontend/src/i18n/cz_cs.json
Normal file
@@ -0,0 +1,264 @@
|
||||
{
|
||||
"buttons": {
|
||||
"cancel": "Zrušit",
|
||||
"clear": "Vymazat",
|
||||
"close": "Zavřít",
|
||||
"continue": "Pokračovat",
|
||||
"copy": "Kopírovat",
|
||||
"copyFile": "Kopírovat soubor",
|
||||
"copyToClipboard": "Kopírovat do schránky",
|
||||
"copyDownloadLinkToClipboard": "Kopírovat odkaz na stažení do schránky",
|
||||
"create": "Vytvořit",
|
||||
"delete": "Smazat",
|
||||
"download": "Stáhnout",
|
||||
"file": "Soubor",
|
||||
"folder": "Složka",
|
||||
"fullScreen": "Přepnout na celou obrazovku",
|
||||
"hideDotfiles": "Skrýt skryté soubory",
|
||||
"info": "Informace",
|
||||
"more": "Více",
|
||||
"move": "Přesunout",
|
||||
"moveFile": "Přesunout soubor",
|
||||
"new": "Nový",
|
||||
"next": "Další",
|
||||
"ok": "OK",
|
||||
"permalink": "Získat trvalý odkaz",
|
||||
"previous": "Předchozí",
|
||||
"publish": "Publikovat",
|
||||
"rename": "Přejmenovat",
|
||||
"replace": "Nahradit",
|
||||
"reportIssue": "Nahlásit problém",
|
||||
"save": "Uložit",
|
||||
"schedule": "Naplánovat",
|
||||
"search": "Hledat",
|
||||
"select": "Vybrat",
|
||||
"selectMultiple": "Vybrat více",
|
||||
"share": "Sdílet",
|
||||
"shell": "Přepnout shell",
|
||||
"submit": "Odeslat",
|
||||
"switchView": "Přepnout zobrazení",
|
||||
"toggleSidebar": "Přepnout postranní panel",
|
||||
"update": "Aktualizovat",
|
||||
"upload": "Nahrát",
|
||||
"openFile": "Otevřít soubor",
|
||||
"discardChanges": "Zrušit změny"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "Stáhnout soubor",
|
||||
"downloadFolder": "Stáhnout složku",
|
||||
"downloadSelected": "Stáhnout vybrané"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "Opravdu chcete přerušit nahrávání?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "Nemáte oprávnění k přístupu.",
|
||||
"internal": "Nastala vážná chyba.",
|
||||
"notFound": "Tuto lokaci nelze najít.",
|
||||
"connection": "Server nelze dosáhnout."
|
||||
},
|
||||
"files": {
|
||||
"body": "Tělo",
|
||||
"closePreview": "Zavřít náhled",
|
||||
"files": "Soubory",
|
||||
"folders": "Složky",
|
||||
"home": "Domů",
|
||||
"lastModified": "Naposledy změněno",
|
||||
"loading": "Načítání...",
|
||||
"lonely": "Je tu osaměle...",
|
||||
"metadata": "Metadata",
|
||||
"multipleSelectionEnabled": "Vícenásobný výběr povolen",
|
||||
"name": "Název",
|
||||
"size": "Velikost",
|
||||
"sortByLastModified": "Seřadit podle poslední změny",
|
||||
"sortByName": "Seřadit podle názvu",
|
||||
"sortBySize": "Seřadit podle velikosti",
|
||||
"noPreview": "Náhled pro tento soubor není k dispozici."
|
||||
},
|
||||
"help": {
|
||||
"click": "vyberte soubor nebo adresář",
|
||||
"ctrl": {
|
||||
"click": "vybrat více souborů nebo adresářů",
|
||||
"f": "otevřít vyhledávání",
|
||||
"s": "uložit soubor nebo stáhnout adresář, kde se nacházíte"
|
||||
},
|
||||
"del": "smazat vybrané položky",
|
||||
"doubleClick": "otevřít soubor nebo adresář",
|
||||
"esc": "zrušit výběr a/nebo zavřít výzvu",
|
||||
"f1": "tato informace",
|
||||
"f2": "přejmenovat soubor",
|
||||
"help": "Nápověda"
|
||||
},
|
||||
"login": {
|
||||
"createAnAccount": "Vytvořit účet",
|
||||
"loginInstead": "Již máte účet",
|
||||
"password": "Heslo",
|
||||
"passwordConfirm": "Potvrzení hesla",
|
||||
"passwordsDontMatch": "Hesla se neshodují",
|
||||
"signup": "Registrace",
|
||||
"submit": "Přihlásit se",
|
||||
"username": "Uživatelské jméno",
|
||||
"usernameTaken": "Uživatelské jméno již existuje",
|
||||
"wrongCredentials": "Nesprávné přihlašovací údaje"
|
||||
},
|
||||
"permanent": "Trvalý",
|
||||
"prompts": {
|
||||
"copy": "Kopírovat",
|
||||
"copyMessage": "Vyberte místo, kam chcete soubory kopírovat:",
|
||||
"currentlyNavigating": "Aktuálně navigujete v:",
|
||||
"deleteMessageMultiple": "Opravdu chcete smazat {count} soubor(ů)?",
|
||||
"deleteMessageSingle": "Opravdu chcete smazat tento soubor/složku?",
|
||||
"deleteMessageShare": "Opravdu chcete smazat toto sdílení({path})?",
|
||||
"deleteUser": "Opravdu chcete smazat tohoto uživatele?",
|
||||
"deleteTitle": "Smazat soubory",
|
||||
"displayName": "Zobrazované jméno:",
|
||||
"download": "Stáhnout soubory",
|
||||
"downloadMessage": "Vyberte formát, který chcete stáhnout.",
|
||||
"error": "Něco se pokazilo",
|
||||
"fileInfo": "Informace o souboru",
|
||||
"filesSelected": "{count} souborů vybráno.",
|
||||
"lastModified": "Naposledy změněno",
|
||||
"move": "Přesunout",
|
||||
"moveMessage": "Vyberte nové umístění pro váš soubor(y)/složku(y):",
|
||||
"newArchetype": "Vytvořit nový příspěvek na základě archetypu. Váš soubor bude vytvořen ve složce content.",
|
||||
"newDir": "Nový adresář",
|
||||
"newDirMessage": "Pojmenujte svůj nový adresář.",
|
||||
"newFile": "Nový soubor",
|
||||
"newFileMessage": "Pojmenujte svůj nový soubor.",
|
||||
"numberDirs": "Počet adresářů",
|
||||
"numberFiles": "Počet souborů",
|
||||
"rename": "Přejmenovat",
|
||||
"renameMessage": "Vložte nový název pro",
|
||||
"replace": "Nahradit",
|
||||
"replaceMessage": "Jeden ze souborů, které se snažíte nahrát, má konfliktní název. Chcete tento soubor přeskočit a pokračovat v nahrávání, nebo nahradit stávající?",
|
||||
"schedule": "Naplánovat",
|
||||
"scheduleMessage": "Vyberte datum a čas pro naplánování publikace tohoto příspěvku.",
|
||||
"show": "Zobrazit",
|
||||
"size": "Velikost",
|
||||
"upload": "Nahrát",
|
||||
"uploadFiles": "Nahrávání {files} souborů...",
|
||||
"uploadMessage": "Vyberte možnost pro nahrání.",
|
||||
"optionalPassword": "Volitelné heslo",
|
||||
"resolution": "Rozlišení",
|
||||
"discardEditorChanges": "Opravdu chcete zrušit provedené změny?"
|
||||
},
|
||||
"search": {
|
||||
"images": "Obrázky",
|
||||
"music": "Hudba",
|
||||
"pdf": "PDF",
|
||||
"pressToSearch": "Stiskněte enter pro hledání...",
|
||||
"search": "Hledat...",
|
||||
"typeToSearch": "Zadejte pro hledání...",
|
||||
"types": "Typy",
|
||||
"video": "Video"
|
||||
},
|
||||
"settings": {
|
||||
"admin": "Admin",
|
||||
"administrator": "Administrátor",
|
||||
"allowCommands": "Povolit příkazy",
|
||||
"allowEdit": "Upravit, přejmenovat a mazat soubory nebo adresáře",
|
||||
"allowNew": "Vytvářet nové soubory a adresáře",
|
||||
"allowPublish": "Publikovat nové příspěvky a stránky",
|
||||
"allowSignup": "Povolit uživatelům registraci",
|
||||
"avoidChanges": "(ponechte prázdné pro zabránění změnám)",
|
||||
"branding": "Branding",
|
||||
"brandingDirectoryPath": "Cesta ke složce s brandingem",
|
||||
"brandingHelp": "Můžete přizpůsobit vzhled a dojem z vaší instance File Browseru změnou názvu, nahrazením loga, přidáním vlastních stylů a dokonce zakázat externí odkazy na GitHub.\nPro více informací o přizpůsobení brandingu se podívejte na {0}.",
|
||||
"changePassword": "Změnit heslo",
|
||||
"commandRunner": "Spouštění příkazů",
|
||||
"commandRunnerHelp": "Zde můžete nastavit příkazy, které se spustí při určených událostech. Každý příkaz musí být na samostatném řádku. Budou k dispozici proměnné prostředí {0} a {1}, přičemž {0} se vztahuje na {1}. Pro více informací o této funkci a dostupných proměnných prostředí si přečtěte {2}.",
|
||||
"commandsUpdated": "Příkazy aktualizovány!",
|
||||
"createUserDir": "Automaticky vytvořit domovskou složku uživatele při přidání nového uživatele",
|
||||
"tusUploads": "Nahrávání po částech",
|
||||
"tusUploadsHelp": "File Browser podporuje nahrávání souborů po částech, což umožňuje vytváření efektivních, spolehlivých, obnovitelných a rozdělených nahrávek souborů i na nespolehlivých sítích.",
|
||||
"tusUploadsChunkSize": "Maximální velikost požadavku (přímé nahrávání bude použito pro menší nahrávky). Můžete zadat prosté číslo označující velikost v bajtech nebo řetězec jako 10MB, 1GB atd.",
|
||||
"tusUploadsRetryCount": "Počet pokusů o opakování, pokud se nahrání části nezdaří.",
|
||||
"userHomeBasePath": "Základní cesta pro domovské adresáře uživatelů",
|
||||
"userScopeGenerationPlaceholder": "Rozsah bude automaticky vygenerován",
|
||||
"createUserHomeDirectory": "Vytvořit domovský adresář uživatele",
|
||||
"customStylesheet": "Vlastní stylový soubor",
|
||||
"defaultUserDescription": "Toto jsou výchozí nastavení pro nové uživatele.",
|
||||
"disableExternalLinks": "Zakázat externí odkazy (kromě dokumentace)",
|
||||
"disableUsedDiskPercentage": "Zakázat graf s procentem využitého disku",
|
||||
"documentation": "dokumentace",
|
||||
"examples": "Příklady",
|
||||
"executeOnShell": "Spustit na shellu",
|
||||
"executeOnShellDescription": "Ve výchozím nastavení File Browser spouští příkazy přímo voláním jejich binárek. Pokud je chcete spouštět na shellu (např. Bash nebo PowerShell), můžete to zde definovat s požadovanými argumenty a příznaky. Pokud je nastaveno, příkaz, který spustíte, bude přidán jako argument. To platí jak pro uživatelské příkazy, tak pro háky událostí.",
|
||||
"globalRules": "Jedná se o globální sadu povolení a zakázání pravidel. Platí pro každého uživatele. Specifická pravidla můžete definovat v nastaveních každého uživatele, aby přepsala tato pravidla.",
|
||||
"globalSettings": "Globální nastavení",
|
||||
"hideDotfiles": "Skrýt skryté soubory",
|
||||
"insertPath": "Vložte cestu",
|
||||
"insertRegex": "Vložte regex výraz",
|
||||
"instanceName": "Název instance",
|
||||
"language": "Jazyk",
|
||||
"lockPassword": "Zabránit uživateli ve změně hesla",
|
||||
"newPassword": "Vaše nové heslo",
|
||||
"newPasswordConfirm": "Potvrďte své nové heslo",
|
||||
"newUser": "Nový uživatel",
|
||||
"password": "Heslo",
|
||||
"passwordUpdated": "Heslo bylo aktualizováno!",
|
||||
"path": "Cesta",
|
||||
"perm": {
|
||||
"create": "Vytvářet soubory a adresáře",
|
||||
"delete": "Mazat soubory a adresáře",
|
||||
"download": "Stahovat",
|
||||
"execute": "Spouštět příkazy",
|
||||
"modify": "Upravit soubory",
|
||||
"rename": "Přejmenovat nebo přesunout soubory a adresáře",
|
||||
"share": "Sdílet soubory"
|
||||
},
|
||||
"permissions": "Oprávnění",
|
||||
"permissionsHelp": "Můžete nastavit uživatele jako administrátora nebo zvolit jednotlivá oprávnění. Pokud vyberete \"Administrátor\", všechny ostatní možnosti budou automaticky zaškrtnuty. Správa uživatelů zůstává výsadou administrátora.\n",
|
||||
"profileSettings": "Nastavení profilu",
|
||||
"ruleExample1": "zabraňuje přístupu k jakémukoli skrytému souboru (např. .git, .gitignore) v každé složce.\n",
|
||||
"ruleExample2": "blokuje přístup k souboru s názvem Caddyfile v kořenovém adresáři.",
|
||||
"rules": "Pravidla",
|
||||
"rulesHelp": "Zde můžete definovat sadu povolení a zakázání pravidel pro tohoto konkrétního uživatele. Blokované soubory se nebudou zobrazovat v seznamech a uživatel k nim nebude mít přístup. Podporujeme regex a cesty relativní k rozsahu uživatele.\n",
|
||||
"scope": "Rozsah",
|
||||
"setDateFormat": "Nastavit přesný formát data",
|
||||
"settingsUpdated": "Nastavení aktualizována!",
|
||||
"shareDuration": "Doba sdílení",
|
||||
"shareManagement": "Správa sdílení",
|
||||
"shareDeleted": "Sdílení bylo smazáno!",
|
||||
"singleClick": "Použít jediné kliknutí pro otevření souborů a adresářů",
|
||||
"themes": {
|
||||
"default": "Systémové výchozí",
|
||||
"dark": "Tmavý",
|
||||
"light": "Světlý",
|
||||
"title": "Motiv"
|
||||
},
|
||||
"user": "Uživatel",
|
||||
"userCommands": "Příkazy",
|
||||
"userCommandsHelp": "Seznam dostupných příkazů pro tohoto uživatele oddělený mezerami. Příklad:\n",
|
||||
"userCreated": "Uživatel vytvořen!",
|
||||
"userDefaults": "Výchozí nastavení uživatele",
|
||||
"userDeleted": "Uživatel smazán!",
|
||||
"userManagement": "Správa uživatelů",
|
||||
"userUpdated": "Uživatel aktualizován!",
|
||||
"username": "Uživatelské jméno",
|
||||
"users": "Uživatelé"
|
||||
},
|
||||
"sidebar": {
|
||||
"help": "Nápověda",
|
||||
"hugoNew": "Hugo Nový",
|
||||
"login": "Přihlásit se",
|
||||
"logout": "Odhlásit se",
|
||||
"myFiles": "Moje soubory",
|
||||
"newFile": "Nový soubor",
|
||||
"newFolder": "Nová složka",
|
||||
"preview": "Náhled",
|
||||
"settings": "Nastavení",
|
||||
"signup": "Registrace",
|
||||
"siteSettings": "Nastavení webu"
|
||||
},
|
||||
"success": {
|
||||
"linkCopied": "Odkaz zkopírován!"
|
||||
},
|
||||
"time": {
|
||||
"days": "Dny",
|
||||
"hours": "Hodiny",
|
||||
"minutes": "Minuty",
|
||||
"seconds": "Sekundy",
|
||||
"unit": "Časová jednotka"
|
||||
}
|
||||
}
|
||||
@@ -46,7 +46,7 @@
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "Sie haben keine Berechtigung dies abzurufen.",
|
||||
"internal": "Etwas ist schief gelaufen.",
|
||||
"internal": "Etwas ist schiefgelaufen.",
|
||||
"notFound": "Dieser Ort kann nicht angezeigt werden.",
|
||||
"connection": "Der Server ist nicht erreichbar."
|
||||
},
|
||||
@@ -73,7 +73,7 @@
|
||||
"ctrl": {
|
||||
"click": "Markiere mehrere Dateien oder Ordner",
|
||||
"f": "Öffnet eine neue Suche",
|
||||
"s": "Speichert eine Datei oder einen Ordner am akutellen Ort"
|
||||
"s": "Speichert eine Datei oder einen Ordner am aktuellen Ort"
|
||||
},
|
||||
"del": "Löscht die ausgewählten Elemente",
|
||||
"doubleClick": "Öffnet eine Datei oder einen Ordner",
|
||||
@@ -106,7 +106,7 @@
|
||||
"displayName": "Anzeigename:",
|
||||
"download": "Lade Dateien",
|
||||
"downloadMessage": "Wählen Sie ein Format zum Herunterladen aus.",
|
||||
"error": "Etwas ist schief gelaufen",
|
||||
"error": "Etwas ist schiefgelaufen",
|
||||
"fileInfo": "Dateiinformation",
|
||||
"filesSelected": "{count} Dateien ausgewählt.",
|
||||
"lastModified": "Zuletzt geändert",
|
||||
@@ -150,13 +150,13 @@
|
||||
"allowNew": "Erstellen neuer Dateien und Ordner",
|
||||
"allowPublish": "Veröffentlichen von neuen Beiträgen und Seiten",
|
||||
"allowSignup": "Erlaube Benutzern sich zu registrieren",
|
||||
"avoidChanges": "(leer lassen um Änderungen zu vermeiden)",
|
||||
"avoidChanges": "(leer lassen, um Änderungen zu vermeiden)",
|
||||
"branding": "Design",
|
||||
"brandingDirectoryPath": "Designverzeichnispfad",
|
||||
"brandingHelp": "Sie können das Erscheinungsbild Ihres File Browser anpassen, in dem Sie den Namen ändern, das Logo austauchsen oder eigene Stile definieren und sogar externe Links zu GitHub deaktivieren.\nUm mehr Informationen zum Anpassen des Designs zu bekommen, gehen Sie bitte zu {0}.",
|
||||
"brandingHelp": "Sie können das Erscheinungsbild Ihres File Browser anpassen, in dem Sie den Namen ändern, das Logo austauschen oder eigene Stile definieren und sogar externe Links zu GitHub deaktivieren.\nUm mehr Informationen zum Anpassen des Designs zu bekommen, gehen Sie bitte zu {0}.",
|
||||
"changePassword": "Passwort ändern",
|
||||
"commandRunner": "Befehlseingabe",
|
||||
"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!",
|
||||
"createUserDir": "Automatisches Erstellen des Home-Verzeichnisses beim Anlegen neuer Benutzer",
|
||||
"tusUploads": "Gestückelter Upload",
|
||||
@@ -170,7 +170,7 @@
|
||||
"documentation": "Dokumentation",
|
||||
"examples": "Beispiele",
|
||||
"executeOnShell": "In Shell ausführen",
|
||||
"executeOnShellDescription": "Es ist voreingestellt das der File Brower Befehle ausführt in dem er die Befehlsdateien direkt aufruft. Wenn Sie wollen, dass sie über einer Kommandozeile (wie Bash oder PowerShell) laufen, könne Sie diese hier definieren mit allen bennötigten Argumenten und Optionen. Wenn gesetzt, wird das Kommando das ausgeführt werden soll als Parameter angehängt. Das gilt für Benuzerkommandos sowie auch für Ereignisse.",
|
||||
"executeOnShellDescription": "Es ist voreingestellt, dass der File Brower Befehle ausführt, indem er die Befehlsdateien direkt aufruft. Wenn Sie wollen, dass sie über einer Kommandozeile (wie Bash oder PowerShell) laufen, könne Sie diese hier definieren mit allen benötigten Argumenten und Optionen. Wenn gesetzt, wird das Kommando das ausgeführt werden soll als Parameter angehängt. Das gilt für Benutzerkommandos sowie auch für Ereignisse.",
|
||||
"globalRules": "Das ist ein globales Set von Regeln die erlauben oder nicht erlauben. Die sind für alle Benutzer zutreffend. Es können spezielle Regeln in den Einstellungen der Benutzer definiert werden, die diese überschreiben.",
|
||||
"globalSettings": "Globale Einstellungen",
|
||||
"hideDotfiles": "Versteckte Dateien ausblenden",
|
||||
@@ -195,7 +195,7 @@
|
||||
"share": "Datei teilen"
|
||||
},
|
||||
"permissions": "Berechtigungen",
|
||||
"permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigunen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n",
|
||||
"permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigungen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n",
|
||||
"profileSettings": "Profileinstellungen",
|
||||
"ruleExample1": "Verhindert den Zugang zu versteckten Dateien (dot-Files, wie .git, .gitignore) in allen Ordnern\n",
|
||||
"ruleExample2": "blockiert den Zugang auf Dateien mit dem Namen Caddyfile in der Wurzel/Basis des Scopes.",
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
"ok": "OK",
|
||||
"permalink": "Get Permanent Link",
|
||||
"previous": "Previous",
|
||||
"preview": "Preview",
|
||||
"publish": "Publish",
|
||||
"rename": "Rename",
|
||||
"replace": "Replace",
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
"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": "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",
|
||||
"hideDotfiles": "",
|
||||
"hideDotfiles": "Ocultar archivos empezados por punto",
|
||||
"insertPath": "Introduce la ruta",
|
||||
"insertRegex": "Introducir expresión regular",
|
||||
"instanceName": "Nombre de la instancia",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
"file": "Fichier",
|
||||
"folder": "Dossier",
|
||||
"fullScreen": "Plein écran",
|
||||
"hideDotfiles": "Masquer les dotfiles",
|
||||
"hideDotfiles": "Masquer les fichiers cachés",
|
||||
"info": "Info",
|
||||
"more": "Plus",
|
||||
"move": "Déplacer",
|
||||
@@ -22,15 +22,16 @@
|
||||
"new": "Nouveau",
|
||||
"next": "Suivant",
|
||||
"ok": "OK",
|
||||
"permalink": "Obtenir un lien permanent",
|
||||
"permalink": "Obtenir le lien permanent",
|
||||
"previous": "Précédent",
|
||||
"preview": "Prévisualiser",
|
||||
"publish": "Publier",
|
||||
"rename": "Renommer",
|
||||
"replace": "Remplacer",
|
||||
"reportIssue": "Rapport d'erreur",
|
||||
"reportIssue": "Signaler un problème",
|
||||
"save": "Enregistrer",
|
||||
"schedule": "Fixer la date",
|
||||
"search": "Chercher",
|
||||
"schedule": "Planifier",
|
||||
"search": "Rechercher",
|
||||
"select": "Sélectionner",
|
||||
"selectMultiple": "Sélection multiple",
|
||||
"share": "Partager",
|
||||
@@ -40,18 +41,22 @@
|
||||
"toggleSidebar": "Afficher/Masquer la barre latérale",
|
||||
"update": "Mettre à jour",
|
||||
"upload": "Importer",
|
||||
"openFile": "Ouvrir le fichier"
|
||||
"openFile": "Ouvrir le fichier",
|
||||
"discardChanges": "Annuler"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "Télécharger le fichier",
|
||||
"downloadFolder": "Télécharger le dossier",
|
||||
"downloadSelected": "Télécharger la selection"
|
||||
"downloadSelected": "Télécharger la sélection"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "Êtes-vous sûr de vouloir annuler ?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "Vous n'avez pas la permission d'accéder à cela.",
|
||||
"internal": "Aïe ! Quelque chose s'est mal passé.",
|
||||
"notFound": "Impossible d'accéder à cet emplacement.",
|
||||
"connection": "Le serveur n'est pas accessible."
|
||||
"connection": "Le serveur est injoignable."
|
||||
},
|
||||
"files": {
|
||||
"body": "Corps",
|
||||
@@ -61,15 +66,15 @@
|
||||
"home": "Accueil",
|
||||
"lastModified": "Dernière modification",
|
||||
"loading": "Chargement...",
|
||||
"lonely": "Il semble qu'il n'y ait rien par ici...",
|
||||
"metadata": "Metadonnées",
|
||||
"lonely": "C'est un peu désert ici...",
|
||||
"metadata": "Métadonnées",
|
||||
"multipleSelectionEnabled": "Sélection multiple activée",
|
||||
"name": "Nom",
|
||||
"size": "Taille",
|
||||
"sortByLastModified": "Trier par date de dernière modification",
|
||||
"sortByLastModified": "Trier par date de modification",
|
||||
"sortByName": "Trier par nom",
|
||||
"sortBySize": "Trier par taille",
|
||||
"noPreview": "Il n'y a pas de prévisualisation pour ce fichier."
|
||||
"noPreview": "L'aperçu n'est pas disponible pour ce fichier."
|
||||
},
|
||||
"help": {
|
||||
"click": "Sélectionner un élément",
|
||||
@@ -105,6 +110,7 @@
|
||||
"deleteMessageMultiple": "Êtes-vous sûr de vouloir supprimer ces {count} élément(s) ?",
|
||||
"deleteMessageSingle": "Êtes-vous sûr de vouloir supprimer cet élément ?",
|
||||
"deleteMessageShare": "Êtes-vous sûr de vouloir supprimer ce partage ({path}) ?",
|
||||
"deleteUser": "Êtes-vous sûr de vouloir supprimer cet utilisateur ?",
|
||||
"deleteTitle": "Supprimer",
|
||||
"displayName": "Nom :",
|
||||
"download": "Télécharger",
|
||||
@@ -125,31 +131,33 @@
|
||||
"rename": "Renommer",
|
||||
"renameMessage": "Nouveau nom pour",
|
||||
"replace": "Remplacer",
|
||||
"replaceMessage": "Un des fichiers que vous êtes en train d'importer a le même nom qu'un autre déjà présent. Voulez-vous remplacer le fichier actuel par le nouveau ?\n",
|
||||
"schedule": "Fixer la date",
|
||||
"replaceMessage": "L'un des fichiers que vous êtes en train d'importer a le même nom qu'un autre déjà présent. Voulez-vous remplacer le fichier actuel par le nouveau ?\n",
|
||||
"schedule": "Planifier",
|
||||
"scheduleMessage": "Choisissez une date pour planifier la publication de ce post",
|
||||
"show": "Montrer",
|
||||
"size": "Taille",
|
||||
"upload": "Importer",
|
||||
"uploadFiles": "Importation de {files} fichiers...",
|
||||
"uploadMessage": "Séléctionnez une option d'import.",
|
||||
"optionalPassword": "Mot de passe optionnel"
|
||||
"uploadMessage": "Sélectionnez une option d'import.",
|
||||
"optionalPassword": "Mot de passe optionnel",
|
||||
"resolution": "Résolution",
|
||||
"discardEditorChanges": "Êtes-vous sûr de vouloir annuler les modifications apportées ?"
|
||||
},
|
||||
"search": {
|
||||
"images": "Images",
|
||||
"music": "Musique",
|
||||
"pdf": "PDF",
|
||||
"pressToSearch": "Appuyez du entrée pour chercher...",
|
||||
"pressToSearch": "Appuyez sur Entrée pour rechercher...",
|
||||
"search": "Recherche en cours...",
|
||||
"typeToSearch": "Écrivez pour chercher...",
|
||||
"typeToSearch": "Écrivez pour rechercher...",
|
||||
"types": "Types",
|
||||
"video": "Video"
|
||||
"video": "Vidéo"
|
||||
},
|
||||
"settings": {
|
||||
"admin": "Admin",
|
||||
"administrator": "Administrateur",
|
||||
"allowCommands": "Exécuter des commandes",
|
||||
"allowEdit": "Editer, renommer et supprimer des fichiers ou des dossiers",
|
||||
"allowEdit": "Éditer, renommer et supprimer des fichiers ou des dossiers",
|
||||
"allowNew": "Créer de nouveaux fichiers et dossiers",
|
||||
"allowPublish": "Publier de nouveaux posts et pages",
|
||||
"allowSignup": "Autoriser les utilisateurs à s'inscrire",
|
||||
@@ -158,32 +166,39 @@
|
||||
"brandingDirectoryPath": "Chemin du dossier d'image de marque",
|
||||
"brandingHelp": "Vous pouvez personnaliser l'apparence de votre instance de File Browser en changeant son nom, en remplaçant le logo, en ajoutant des styles personnalisés et même en désactivant les liens externes vers GitHub.\nPour plus d'informations sur la personnalisation de l'image de marque, veuillez consulter la {0}.",
|
||||
"changePassword": "Modifier le mot de passe",
|
||||
"commandRunner": "Command runner",
|
||||
"commandRunnerHelp": "Ici, vous pouvez définir les commandes qui sont exécutées pour les événements nommés précédemments. Vous devez en écrire une par ligne. Les variables d'environnement {0} et {1} seront disponibles, {0} étant relatif à {1}. Pour plus d'informations sur cette fonctionnalité et les variables d'environnement disponibles, veuillez lire la {2}.",
|
||||
"commandRunner": "Exécuteur de commandes",
|
||||
"commandRunnerHelp": "Ici, vous pouvez définir les commandes qui seront exécutées lors des événements nommés précédemments. Vous devez en écrire une par ligne. Les variables d'environnement {0} et {1} seront disponibles, {0} étant relatif à {1}. Pour plus d'informations sur cette fonctionnalité et les variables d'environnement disponibles, veuillez lire la {2}.",
|
||||
"commandsUpdated": "Commandes mises à jour !",
|
||||
"createUserDir": "Créer automatiquement un dossier pour l'utilisateur",
|
||||
"tusUploads": "Uploads segmentés",
|
||||
"tusUploadsHelp": "File Browser prend en charge les uploads segmentés afin de permettre une gestion efficace, fiable et reprenable sur des réseaux instables.",
|
||||
"tusUploadsChunkSize": "Taille maximale autorisée par segment (les uploads directs seront utilisés pour les fichiers plus petits). Vous pouvez entrer un entier en octets ou une chaîne telle que 10MB, 1GB, etc.",
|
||||
"tusUploadsRetryCount": "Nombre de tentatives en cas d'échec d'un segment.",
|
||||
"userHomeBasePath": "Chemin de base pour les répertoires personnels des utilisateurs",
|
||||
"userScopeGenerationPlaceholder": "Le périmètre sera généré automatiquement",
|
||||
"createUserHomeDirectory": "Créer le répertoire personnel de l'utilisateur",
|
||||
"customStylesheet": "Feuille de style personnalisée",
|
||||
"defaultUserDescription": "Paramètres par défaut pour les nouveaux utilisateurs.",
|
||||
"disableExternalLinks": "Désactiver les liens externes (sauf la documentation)",
|
||||
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||
"disableUsedDiskPercentage": "Désactiver le graphique de pourcentage d'utilisation du disque",
|
||||
"documentation": "documentation",
|
||||
"examples": "Exemples",
|
||||
"executeOnShell": "Exécuter dans le shell",
|
||||
"executeOnShellDescription": "Par défaut, File Browser exécute les commandes en appelant directement leurs binaires. Si vous voulez les exécuter sur un shell à la place (comme Bash ou PowerShell), vous pouvez le définir ici avec les arguments et les drapeaux requis. S'il est défini, la commande que vous exécutez sera ajoutée en tant qu'argument. Cela s'applique à la fois aux commandes utilisateur et aux crochets d'événements.",
|
||||
"globalRules": "Il s'agit d'un ensemble global de règles d'autorisation et d'interdiction. Elles s'appliquent à tous les utilisateurs. Vous pouvez définir des règles spécifiques sur les paramètres de chaque utilisateur pour remplacer celles-ci.",
|
||||
"globalSettings": "Paramètres généraux",
|
||||
"globalSettings": "Paramètres globaux",
|
||||
"hideDotfiles": "Cacher les fichiers de configuration utilisateur (dotfiles)",
|
||||
"insertPath": "Insérez le chemin",
|
||||
"insertRegex": "Insérez l'expression régulière",
|
||||
"insertPath": "Insérer le chemin",
|
||||
"insertRegex": "Insérer une expression régulière",
|
||||
"instanceName": "Nom de l'instance",
|
||||
"language": "Langue",
|
||||
"lockPassword": "Empêcher l'utilisateur de changer son mot de passe",
|
||||
"newPassword": "Votre nouveau mot de passe",
|
||||
"newPasswordConfirm": "Confirmation du nouveau mot de passe",
|
||||
"newUser": "Nouvel Utilisateur",
|
||||
"newUser": "Nouvel utilisateur",
|
||||
"password": "Mot de passe",
|
||||
"passwordUpdated": "Mot de passe mis à jour !",
|
||||
"path": "",
|
||||
"path": "Chemin",
|
||||
"perm": {
|
||||
"create": "Créer des fichiers et des dossiers",
|
||||
"delete": "Supprimer des fichiers et des dossiers",
|
||||
@@ -209,14 +224,14 @@
|
||||
"singleClick": "Utiliser un simple clic pour ouvrir les fichiers et les dossiers",
|
||||
"themes": {
|
||||
"dark": "Sombre",
|
||||
"light": "Lumineux",
|
||||
"light": "Clair",
|
||||
"title": "Thème"
|
||||
},
|
||||
"user": "Utilisateur",
|
||||
"userCommands": "Commandes",
|
||||
"userCommandsHelp": "Une liste séparée par des espaces des commandes permises pour l'utilisateur. Exemple :",
|
||||
"userCommandsHelp": "Une liste séparée par des espaces des commandes permises pour l'utilisateur. Exemple :\n",
|
||||
"userCreated": "Utilisateur créé !",
|
||||
"userDefaults": "User default settings",
|
||||
"userDefaults": "Paramètres par défaut de l'utilisateur",
|
||||
"userDeleted": "Utilisateur supprimé !",
|
||||
"userManagement": "Gestion des utilisateurs",
|
||||
"userUpdated": "Utilisateur mis à jour !",
|
||||
@@ -237,7 +252,7 @@
|
||||
"siteSettings": "Paramètres du site"
|
||||
},
|
||||
"success": {
|
||||
"linkCopied": "Lien copié!"
|
||||
"linkCopied": "Lien copié !"
|
||||
},
|
||||
"time": {
|
||||
"days": "Jours",
|
||||
|
||||
@@ -23,6 +23,7 @@ import("dayjs/locale/sk");
|
||||
import("dayjs/locale/sv");
|
||||
import("dayjs/locale/tr");
|
||||
import("dayjs/locale/uk");
|
||||
import("dayjs/locale/vi");
|
||||
import("dayjs/locale/zh-cn");
|
||||
import("dayjs/locale/zh-tw");
|
||||
|
||||
@@ -103,6 +104,9 @@ export function detectLocale() {
|
||||
case /^uk\b/.test(locale):
|
||||
locale = "uk";
|
||||
break;
|
||||
case /^vi\b/.test(locale):
|
||||
locale = "vi";
|
||||
break;
|
||||
case /^sv-se\b/.test(locale):
|
||||
case /^sv\b/.test(locale):
|
||||
locale = "sv";
|
||||
@@ -142,7 +146,7 @@ export const i18n = createI18n({
|
||||
|
||||
export const isRtl = (locale?: string) => {
|
||||
// see below
|
||||
// @ts-ignore
|
||||
// @ts-expect-error incorrect type when legacy
|
||||
return rtlLanguages.includes(locale || i18n.global.locale.value);
|
||||
};
|
||||
|
||||
@@ -150,7 +154,7 @@ export function setLocale(locale: string) {
|
||||
dayjs.locale(locale);
|
||||
// according to doc u only need .value if legacy: false but they lied
|
||||
// https://vue-i18n.intlify.dev/guide/essentials/scope.html#local-scope-1
|
||||
//@ts-ignore
|
||||
// @ts-expect-error incorrect type when legacy
|
||||
i18n.global.locale.value = locale;
|
||||
}
|
||||
|
||||
|
||||
@@ -3,47 +3,60 @@
|
||||
"cancel": "취소",
|
||||
"clear": "지우기",
|
||||
"close": "닫기",
|
||||
"continue": "계속",
|
||||
"copy": "복사",
|
||||
"copyFile": "파일 복사",
|
||||
"copyToClipboard": "클립보드 복사",
|
||||
"copyToClipboard": "클립보드에 복사",
|
||||
"copyDownloadLinkToClipboard": "다운로드 링크 클립보드에 복사",
|
||||
"create": "생성",
|
||||
"delete": "삭제",
|
||||
"download": "다운로드",
|
||||
"hideDotfiles": "",
|
||||
"file": "파일",
|
||||
"folder": "폴더",
|
||||
"fullScreen": "전체 화면 전환",
|
||||
"hideDotfiles": "숨김 파일 숨기기",
|
||||
"info": "정보",
|
||||
"more": "더보기",
|
||||
"more": "더 보기",
|
||||
"move": "이동",
|
||||
"moveFile": "파일 이동",
|
||||
"new": "신규",
|
||||
"new": "새로 만들기",
|
||||
"next": "다음",
|
||||
"ok": "확인",
|
||||
"permalink": "링크 얻기",
|
||||
"permalink": "영구 링크 받기",
|
||||
"previous": "이전",
|
||||
"preview": "미리보기",
|
||||
"publish": "게시",
|
||||
"rename": "이름 바꾸기",
|
||||
"replace": "대체",
|
||||
"reportIssue": "이슈 보내기",
|
||||
"replace": "바꾸기",
|
||||
"reportIssue": "문제 보고",
|
||||
"save": "저장",
|
||||
"schedule": "일정",
|
||||
"schedule": "예약",
|
||||
"search": "검색",
|
||||
"select": "선택",
|
||||
"selectMultiple": "다중 선택",
|
||||
"share": "공유",
|
||||
"shell": "쉘 전환",
|
||||
"shell": "셸 전환",
|
||||
"submit": "제출",
|
||||
"switchView": "보기 전환",
|
||||
"toggleSidebar": "사이드바 전환",
|
||||
"update": "업데이트",
|
||||
"upload": "업로드"
|
||||
"upload": "업로드",
|
||||
"openFile": "파일 열기",
|
||||
"discardChanges": "변경 사항 취소"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "파일 다운로드",
|
||||
"downloadFolder": "폴더 다운로드",
|
||||
"downloadSelected": ""
|
||||
"downloadSelected": "선택 항목 다운로드"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "업로드를 중단하시겠습니까?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "접근 권한이 없습니다.",
|
||||
"internal": "오류가 발생하였습니다.",
|
||||
"notFound": "해당 경로를 찾을 수 없습니다."
|
||||
"forbidden": "이곳에 접근할 권한이 없습니다.",
|
||||
"internal": "문제가 발생했습니다.",
|
||||
"notFound": "이 위치에 접근할 수 없습니다.",
|
||||
"connection": "서버에 연결할 수 없습니다."
|
||||
},
|
||||
"files": {
|
||||
"body": "본문",
|
||||
@@ -51,175 +64,192 @@
|
||||
"files": "파일",
|
||||
"folders": "폴더",
|
||||
"home": "홈",
|
||||
"lastModified": "최종 수정",
|
||||
"loading": "로딩중...",
|
||||
"lonely": "폴더가 비어 있습니다...",
|
||||
"lastModified": "마지막 수정일",
|
||||
"loading": "로딩 중...",
|
||||
"lonely": "여기에 아무것도 없네요...",
|
||||
"metadata": "메타데이터",
|
||||
"multipleSelectionEnabled": "다중 선택 켜짐",
|
||||
"multipleSelectionEnabled": "다중 선택 활성화됨",
|
||||
"name": "이름",
|
||||
"size": "크기",
|
||||
"sortByLastModified": "수정시간순 정렬",
|
||||
"sortByName": "이름순",
|
||||
"sortBySize": "크기순"
|
||||
"sortByLastModified": "마지막 수정일 순 정렬",
|
||||
"sortByName": "이름 순 정렬",
|
||||
"sortBySize": "크기 순 정렬",
|
||||
"noPreview": "이 파일은 미리보기를 사용할 수 없습니다."
|
||||
},
|
||||
"help": {
|
||||
"click": "파일이나 디렉토리를 선택해주세요.",
|
||||
"click": "파일 또는 디렉터리 선택",
|
||||
"ctrl": {
|
||||
"click": "여러 개의 파일이나 디렉토리를 선택해주세요.",
|
||||
"f": "검색창 열기",
|
||||
"s": "파일 또는 디렉토리 다운로드"
|
||||
"click": "여러 파일 또는 디렉터리 선택",
|
||||
"f": "검색 열기",
|
||||
"s": "파일 저장 또는 현재 디렉터리 다운로드"
|
||||
},
|
||||
"del": "선택된 파일 삭제",
|
||||
"doubleClick": "파일 또는 디렉토리 열기",
|
||||
"esc": "선택 취소/프롬프트 닫기",
|
||||
"f1": "정보",
|
||||
"f2": "파일 이름 변경",
|
||||
"del": "선택한 항목 삭제",
|
||||
"doubleClick": "파일 또는 디렉터리 열기",
|
||||
"esc": "선택 취소 및/또는 프롬프트 닫기",
|
||||
"f1": "이 정보",
|
||||
"f2": "파일 이름 바꾸기",
|
||||
"help": "도움말"
|
||||
},
|
||||
"login": {
|
||||
"createAnAccount": "계정 생성",
|
||||
"createAnAccount": "계정 만들기",
|
||||
"loginInstead": "이미 계정이 있습니다",
|
||||
"password": "비밀번호",
|
||||
"passwordConfirm": "비밀번호 확인",
|
||||
"passwordsDontMatch": "비밀번호가 일치하지 않습니다",
|
||||
"signup": "가입하기",
|
||||
"signup": "가입",
|
||||
"submit": "로그인",
|
||||
"username": "사용자 이름",
|
||||
"usernameTaken": "사용자 이름이 존재합니다",
|
||||
"wrongCredentials": "사용자 이름 또는 비밀번호를 확인하십시오"
|
||||
"usernameTaken": "이미 사용 중인 사용자 이름입니다",
|
||||
"wrongCredentials": "잘못된 자격 증명"
|
||||
},
|
||||
"permanent": "영구",
|
||||
"prompts": {
|
||||
"copy": "복사",
|
||||
"copyMessage": "복사할 디렉토리:",
|
||||
"currentlyNavigating": "현재 위치:",
|
||||
"deleteMessageMultiple": "{count} 개의 파일을 삭제하시겠습니까?",
|
||||
"deleteMessageSingle": "파일 혹은 디렉토리를 삭제하시겠습니까?",
|
||||
"copyMessage": "파일을 복사할 위치를 선택하세요:",
|
||||
"currentlyNavigating": "현재 탐색 중:",
|
||||
"deleteMessageMultiple": "{count}개의 파일을 삭제하시겠습니까?",
|
||||
"deleteMessageSingle": "이 파일/폴더를 삭제하시겠습니까?",
|
||||
"deleteMessageShare": "이 공유({path})를 삭제하시겠습니까?",
|
||||
"deleteUser": "이 사용자를 삭제하시겠습니까?",
|
||||
"deleteTitle": "파일 삭제",
|
||||
"displayName": "게시 이름:",
|
||||
"displayName": "표시 이름:",
|
||||
"download": "파일 다운로드",
|
||||
"downloadMessage": "다운로드 포맷 설정.",
|
||||
"error": "에러 발생!",
|
||||
"downloadMessage": "다운로드할 형식을 선택하세요.",
|
||||
"error": "문제가 발생했습니다",
|
||||
"fileInfo": "파일 정보",
|
||||
"filesSelected": "{count} 개의 파일이 선택되었습니다.",
|
||||
"lastModified": "최종 수정",
|
||||
"filesSelected": "{count}개의 파일 선택됨.",
|
||||
"lastModified": "마지막 수정일",
|
||||
"move": "이동",
|
||||
"moveMessage": "이동할 화일 또는 디렉토리를 선택하세요:",
|
||||
"newArchetype": "원형을 유지하는 포스트를 생성합니다. 파일은 컨텐트 폴더에 생성됩니다.",
|
||||
"newDir": "새 디렉토리",
|
||||
"newDirMessage": "새 디렉토리 이름을 입력해주세요.",
|
||||
"moveMessage": "파일/폴더의 새 위치를 선택하세요:",
|
||||
"newArchetype": "아키타입을 기반으로 새 게시물을 만듭니다. 파일은 content 폴더에 생성됩니다.",
|
||||
"newDir": "새 디렉터리",
|
||||
"newDirMessage": "새 디렉터리 이름을 지정하세요.",
|
||||
"newFile": "새 파일",
|
||||
"newFileMessage": "새 파일 이름을 입력해주세요.",
|
||||
"numberDirs": "디렉토리 수",
|
||||
"newFileMessage": "새 파일 이름을 지정하세요.",
|
||||
"numberDirs": "디렉터리 수",
|
||||
"numberFiles": "파일 수",
|
||||
"rename": "이름 변경",
|
||||
"renameMessage": "새로운 이름을 입력하세요.",
|
||||
"replace": "대체하기",
|
||||
"replaceMessage": "동일한 파일 이름이 존재합니다. 현재 파일을 덮어쓸까요?\n",
|
||||
"schedule": "일정",
|
||||
"scheduleMessage": "이 글을 공개할 시간을 알려주세요.",
|
||||
"show": "보기",
|
||||
"rename": "이름 바꾸기",
|
||||
"renameMessage": "새 이름을 입력하세요:",
|
||||
"replace": "바꾸기",
|
||||
"replaceMessage": "업로드하려는 파일 중 이름이 충돌하는 파일이 있습니다. 이 파일을 건너뛰고 업로드를 계속하거나 기존 파일을 바꾸시겠습니까?\n",
|
||||
"schedule": "예약",
|
||||
"scheduleMessage": "이 게시물의 게시를 예약할 날짜와 시간을 선택하세요.",
|
||||
"show": "표시",
|
||||
"size": "크기",
|
||||
"upload": "",
|
||||
"uploadMessage": ""
|
||||
"upload": "업로드",
|
||||
"uploadFiles": "{files}개의 파일 업로드 중...",
|
||||
"uploadMessage": "업로드할 옵션을 선택하세요.",
|
||||
"optionalPassword": "선택적 비밀번호",
|
||||
"resolution": "해상도",
|
||||
"discardEditorChanges": "변경 사항을 취소하시겠습니까?"
|
||||
},
|
||||
"search": {
|
||||
"images": "이미지",
|
||||
"music": "음악",
|
||||
"pdf": "PDF",
|
||||
"pressToSearch": "검색하려면 엔터를 입력하세요",
|
||||
"pressToSearch": "Enter 키를 눌러 검색...",
|
||||
"search": "검색...",
|
||||
"typeToSearch": "검색어 입력...",
|
||||
"types": "Types",
|
||||
"types": "유형",
|
||||
"video": "비디오"
|
||||
},
|
||||
"settings": {
|
||||
"admin": "관리자",
|
||||
"administrator": "관리자",
|
||||
"allowCommands": "명령 실행",
|
||||
"allowEdit": "파일/디렉토리의 수정/변경/삭제 허용",
|
||||
"allowNew": "파일/디렉토리 생성 허용",
|
||||
"allowPublish": "새 포스트/페이지 생성 허용",
|
||||
"allowCommands": "명령 실행 허용",
|
||||
"allowEdit": "파일 또는 디렉터리 편집, 이름 바꾸기, 삭제 허용",
|
||||
"allowNew": "새 파일 및 디렉터리 생성 허용",
|
||||
"allowPublish": "새 게시물 및 페이지 게시 허용",
|
||||
"allowSignup": "사용자 가입 허용",
|
||||
"avoidChanges": "(수정하지 않으면 비워두세요)",
|
||||
"avoidChanges": "(변경하지 않으려면 비워두세요)",
|
||||
"branding": "브랜딩",
|
||||
"brandingDirectoryPath": "브랜드 디렉토리 경로",
|
||||
"brandingHelp": "File Browser 인스턴스는 이름, 로고, 스타일 등을 변경할 수 있습니다. 자세한 사항은 여기{0}에서 확인하세요.",
|
||||
"brandingDirectoryPath": "브랜딩 디렉터리 경로",
|
||||
"brandingHelp": "File Browser 인스턴스의 이름 변경, 로고 교체, 사용자 정의 스타일 추가, GitHub 외부 링크 비활성화를 통해 모양과 느낌을 사용자 지정할 수 있습니다.\n사용자 정의 브랜딩에 대한 자세한 내용은 {0}을(를) 확인하세요.",
|
||||
"changePassword": "비밀번호 변경",
|
||||
"commandRunner": "명령 실행기",
|
||||
"commandRunnerHelp": "이벤트에 해당하는 명령을 설정하세요. 줄당 1개의 명령을 적으세요. 환경 변수{0} 와 {1}이 사용가능하며, {0} 은 {1}에 상대 경로 입니다. 자세한 사항은 {2} 를 참조하세요.",
|
||||
"commandsUpdated": "명령 수정됨!",
|
||||
"createUserDir": "Auto create user home dir while adding new user",
|
||||
"customStylesheet": "커스텀 스타일시트",
|
||||
"defaultUserDescription": "아래 사항은 신규 사용자들에 대한 기본 설정입니다.",
|
||||
"disableExternalLinks": "외부 링크 감추기",
|
||||
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||
"commandRunner": "명령어 실행기",
|
||||
"commandRunnerHelp": "여기서 지정된 이벤트에서 실행될 명령어를 설정할 수 있습니다. 한 줄에 하나씩 작성해야 합니다. 환경 변수 {0} 및 {1}을(를) 사용할 수 있으며, {0}은(는) {1}에 상대적입니다. 이 기능과 사용 가능한 환경 변수에 대한 자세한 내용은 {2}을(를) 읽어보세요.",
|
||||
"commandsUpdated": "명령어가 업데이트되었습니다!",
|
||||
"createUserDir": "새 사용자 추가 시 사용자 홈 디렉터리 자동 생성",
|
||||
"tusUploads": "청크 업로드",
|
||||
"tusUploadsHelp": "File Browser는 청크 파일 업로드를 지원하여 불안정한 네트워크에서도 효율적이고 안정적이며 재개 가능하고 분할된 파일 업로드를 가능하게 합니다.",
|
||||
"tusUploadsChunkSize": "요청의 최대 크기를 나타냅니다 (더 작은 업로드에는 직접 업로드가 사용됩니다). 바이트 크기를 나타내는 일반 정수 또는 10MB, 1GB 등과 같은 문자열을 입력할 수 있습니다.",
|
||||
"tusUploadsRetryCount": "청크 업로드 실패 시 재시도 횟수.",
|
||||
"userHomeBasePath": "사용자 홈 디렉터리의 기본 경로",
|
||||
"userScopeGenerationPlaceholder": "범위가 자동으로 생성됩니다",
|
||||
"createUserHomeDirectory": "사용자 홈 디렉터리 생성",
|
||||
"customStylesheet": "사용자 정의 스타일시트",
|
||||
"defaultUserDescription": "새 사용자의 기본 설정입니다.",
|
||||
"disableExternalLinks": "외부 링크 비활성화 (문서 제외)",
|
||||
"disableUsedDiskPercentage": "사용된 디스크 비율 그래프 비활성화",
|
||||
"documentation": "문서",
|
||||
"examples": "예",
|
||||
"executeOnShell": "쉘에서 실행",
|
||||
"executeOnShellDescription": "기본적으로 File Browser 는 바이너리를 명령어로 호출하여 실행합니다. 쉘을 통해 실행하기를 원한다면, Bash 또는 PowerShell 에 필요한 인수와 플래그를 설정하세요. 사용자 명령어와 이벤트 훅에 모두 적용됩니다.",
|
||||
"globalRules": "규칙에 대한 전역설정으로 모든 사용자에게 적용됩니다. 지정된 규칙은 사용자 설정을 덮어쓰기 합니다.",
|
||||
"examples": "예시",
|
||||
"executeOnShell": "셸에서 실행",
|
||||
"executeOnShellDescription": "기본적으로 File Browser는 바이너리를 직접 호출하여 명령을 실행합니다. 대신 셸(예: Bash 또는 PowerShell)에서 실행하려면 필요한 인수 및 플래그와 함께 여기에 정의할 수 있습니다. 설정된 경우 실행하는 명령이 인수로 추가됩니다. 이는 사용자 명령과 이벤트 후크 모두에 적용됩니다.",
|
||||
"globalRules": "이것은 전역 허용 및 차단 규칙 세트입니다. 모든 사용자에게 적용됩니다. 각 사용자 설정에서 특정 규칙을 정의하여 이 규칙을 재정의할 수 있습니다.",
|
||||
"globalSettings": "전역 설정",
|
||||
"hideDotfiles": "",
|
||||
"insertPath": "경로 입력",
|
||||
"insertRegex": "정규식 입력",
|
||||
"hideDotfiles": "숨김 파일 숨기기",
|
||||
"insertPath": "경로 삽입",
|
||||
"insertRegex": "정규식 표현 삽입",
|
||||
"instanceName": "인스턴스 이름",
|
||||
"language": "언어",
|
||||
"lockPassword": "사용자에 의한 비밀번호 변경을 허용하지 않음",
|
||||
"newPassword": "새로운 비밀번호",
|
||||
"newPasswordConfirm": "새로운 비밀번호 확인",
|
||||
"newUser": "새로운 사용자",
|
||||
"lockPassword": "사용자가 비밀번호를 변경하지 못하도록 잠금",
|
||||
"newPassword": "새 비밀번호",
|
||||
"newPasswordConfirm": "새 비밀번호 확인",
|
||||
"newUser": "새 사용자",
|
||||
"password": "비밀번호",
|
||||
"passwordUpdated": "비밀번호 수정 완료!",
|
||||
"path": "",
|
||||
"passwordUpdated": "비밀번호가 업데이트되었습니다!",
|
||||
"path": "경로",
|
||||
"perm": {
|
||||
"create": "파일이나 디렉토리 생성하기",
|
||||
"delete": "화일이나 디렉토리 삭제하기",
|
||||
"create": "파일 및 디렉터리 생성",
|
||||
"delete": "파일 및 디렉터리 삭제",
|
||||
"download": "다운로드",
|
||||
"execute": "명령 실행",
|
||||
"modify": "파일 편집",
|
||||
"rename": "파일 이름 변경 또는 디렉토리 이동",
|
||||
"share": "파일 공유하기"
|
||||
"rename": "파일 및 디렉터리 이름 바꾸기 또는 이동",
|
||||
"share": "파일 공유"
|
||||
},
|
||||
"permissions": "권한",
|
||||
"permissionsHelp": "사용자를 관리자로 만들거나 권한을 부여할 수 있습니다. 관리자를 선택하면, 모든 옵션이 자동으로 선택됩니다. 사용자 관리는 현재 관리자만 할 수 있습니다.\n",
|
||||
"permissionsHelp": "사용자를 관리자로 설정하거나 개별적으로 권한을 선택할 수 있습니다. \"관리자\"를 선택하면 다른 모든 옵션이 자동으로 선택됩니다. 사용자 관리는 관리자의 권한으로 유지됩니다.\n",
|
||||
"profileSettings": "프로필 설정",
|
||||
"ruleExample1": "점(.)으로 시작하는 모든 파일의 접근을 방지합니다.(예 .git, .gitignore)\n",
|
||||
"ruleExample2": "Caddyfile파일의 접근을 방지합니다.",
|
||||
"rules": "룰",
|
||||
"rulesHelp": "사용자별로 규칙을 허용/방지를 지정할 수 있습니다. 방지된 파일은 보이지 않고 사용자들은 접근할 수 없습니다. 사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.\n",
|
||||
"ruleExample1": "모든 폴더에서 모든 숨김 파일(예: .git, .gitignore)에 대한 액세스를 방지합니다.\n",
|
||||
"ruleExample2": "범위의 루트에 있는 Caddyfile이라는 파일에 대한 액세스를 차단합니다.",
|
||||
"rules": "규칙",
|
||||
"rulesHelp": "여기서 이 특정 사용자에 대한 허용 및 차단 규칙 세트를 정의할 수 있습니다. 차단된 파일은 목록에 표시되지 않으며 사용자가 액세스할 수 없습니다. 사용자의 범위에 상대적인 정규식 및 경로를 지원합니다.\n",
|
||||
"scope": "범위",
|
||||
"settingsUpdated": "설정 수정됨!",
|
||||
"shareDuration": "",
|
||||
"shareManagement": "",
|
||||
"singleClick": "",
|
||||
"setDateFormat": "정확한 날짜 형식 설정",
|
||||
"settingsUpdated": "설정이 업데이트되었습니다!",
|
||||
"shareDuration": "공유 기간",
|
||||
"shareManagement": "공유 관리",
|
||||
"shareDeleted": "공유가 삭제되었습니다!",
|
||||
"singleClick": "파일 및 디렉터리를 열 때 한 번 클릭 사용",
|
||||
"themes": {
|
||||
"dark": "",
|
||||
"light": "",
|
||||
"title": ""
|
||||
"default": "시스템 기본값",
|
||||
"dark": "어둡게",
|
||||
"light": "밝게",
|
||||
"title": "테마"
|
||||
},
|
||||
"user": "사용자",
|
||||
"userCommands": "명령어",
|
||||
"userCommandsHelp": "사용에게 허용할 명령어를 공백으로 구분하여 입력하세요. 예:\n",
|
||||
"userCreated": "사용자 생성됨!",
|
||||
"userCommandsHelp": "이 사용자가 사용할 수 있는 명령어 목록 (공백으로 구분). 예:\n",
|
||||
"userCreated": "사용자가 생성되었습니다!",
|
||||
"userDefaults": "사용자 기본 설정",
|
||||
"userDeleted": "사용자 삭제됨!",
|
||||
"userDeleted": "사용자가 삭제되었습니다!",
|
||||
"userManagement": "사용자 관리",
|
||||
"userUpdated": "사용자 수정됨!",
|
||||
"userUpdated": "사용자가 업데이트되었습니다!",
|
||||
"username": "사용자 이름",
|
||||
"users": "사용자"
|
||||
},
|
||||
"sidebar": {
|
||||
"help": "도움말",
|
||||
"hugoNew": "Hugo New",
|
||||
"hugoNew": "Hugo 새로 만들기",
|
||||
"login": "로그인",
|
||||
"logout": "로그아웃",
|
||||
"myFiles": "내 파일",
|
||||
"newFile": "새로운 파일",
|
||||
"newFolder": "새로운 폴더",
|
||||
"newFile": "새 파일",
|
||||
"newFolder": "새 폴더",
|
||||
"preview": "미리보기",
|
||||
"settings": "설정",
|
||||
"signup": "가입하기",
|
||||
"signup": "가입",
|
||||
"siteSettings": "사이트 설정"
|
||||
},
|
||||
"success": {
|
||||
@@ -227,9 +257,9 @@
|
||||
},
|
||||
"time": {
|
||||
"days": "일",
|
||||
"hours": "시",
|
||||
"hours": "시간",
|
||||
"minutes": "분",
|
||||
"seconds": "초",
|
||||
"unit": "Time Unit"
|
||||
"unit": "시간 단위"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,133 +3,153 @@
|
||||
"cancel": "Anuluj",
|
||||
"clear": "Wyczyść",
|
||||
"close": "Zamknij",
|
||||
"continue": "Kontynuuj",
|
||||
"copy": "Kopiuj",
|
||||
"copyFile": "Kopiuj plik",
|
||||
"copyToClipboard": "kopiuj do schowka",
|
||||
"copyToClipboard": "Kopiuj do schowka",
|
||||
"copyDownloadLinkToClipboard": "Kopiuj link pobierania do schowka",
|
||||
"create": "Utwórz",
|
||||
"delete": "Usuń",
|
||||
"download": "Pobierz",
|
||||
"hideDotfiles": "",
|
||||
"info": "Informacja",
|
||||
"more": "Więce",
|
||||
"file": "Plik",
|
||||
"folder": "Folder",
|
||||
"fullScreen": "Przełącz tryb pełnoekranowy",
|
||||
"hideDotfiles": "Ukryj pliki poprzedzone kropką",
|
||||
"info": "Informacje",
|
||||
"more": "Więcej",
|
||||
"move": "Przenieś",
|
||||
"moveFile": "Przenieś plik",
|
||||
"new": "Nowy",
|
||||
"next": "Następny",
|
||||
"ok": "OK",
|
||||
"permalink": "Uzyskaj link bezpośredni (permalink)",
|
||||
"permalink": "Uzyskaj stały link",
|
||||
"previous": "Poprzedni",
|
||||
"preview": "Podgląd",
|
||||
"publish": "Opublikuj",
|
||||
"rename": "Zmień nazwę",
|
||||
"replace": "Zamień",
|
||||
"reportIssue": "Zgłoś problem",
|
||||
"save": "Zapisz",
|
||||
"schedule": "Grafik",
|
||||
"schedule": "Harmonogram",
|
||||
"search": "Szukaj",
|
||||
"select": "Wybierz",
|
||||
"select": "Zaznacz",
|
||||
"selectMultiple": "Zaznacz wiele",
|
||||
"share": "Udostępnij",
|
||||
"shell": "Pokaż/ukryj powłokę",
|
||||
"shell": "Przełącz powłokę",
|
||||
"submit": "Prześlij",
|
||||
"switchView": "Zmień widok",
|
||||
"toggleSidebar": "Pokaż/ukryj panel boczny",
|
||||
"toggleSidebar": "Przełącz pasek boczny",
|
||||
"update": "Aktualizuj",
|
||||
"upload": "Wgraj"
|
||||
"upload": "Wyślij",
|
||||
"openFile": "Otwórz plik",
|
||||
"discardChanges": "Odrzuć"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "Pobierz plik",
|
||||
"downloadFolder": "Pobierz folder",
|
||||
"downloadSelected": "Pobierz zaznaczone"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "Czy na pewno chcesz przerwać?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "Nie posiadasz uprawnień potrzebnych, by uzyskać do tego dostęp.",
|
||||
"forbidden": "Nie masz zezwolenia na dostęp do tego.",
|
||||
"internal": "Pojawił się poważny problem.",
|
||||
"notFound": "Ten adres nie jest poprawny."
|
||||
"notFound": "Ta lokalizacja jest nieosiągalna.",
|
||||
"connection": "Serwer jest nieosiągalny."
|
||||
},
|
||||
"files": {
|
||||
"body": "Body",
|
||||
"closePreview": "Zamknij poprzednie",
|
||||
"body": "Zawartość",
|
||||
"closePreview": "Zamknij podgląd",
|
||||
"files": "Pliki",
|
||||
"folders": "Foldery",
|
||||
"home": "Katalog domowy",
|
||||
"lastModified": "Ostatnio modyfikowane",
|
||||
"home": "Główny",
|
||||
"lastModified": "Ostatnio zmodyfikowano",
|
||||
"loading": "Ładowanie...",
|
||||
"lonely": "Smutno gdy tak pusto...",
|
||||
"lonely": "Smutno, gdy tak pusto...",
|
||||
"metadata": "Metadane",
|
||||
"multipleSelectionEnabled": "Zaznaczenie wielu włączone",
|
||||
"multipleSelectionEnabled": "Włączono zaznaczenie wielokrotne",
|
||||
"name": "Nazwa",
|
||||
"size": "Rozmiar",
|
||||
"sortByLastModified": "Sortuj wg. daty modyfikacji",
|
||||
"sortByName": "Sortuj wg. nazwy",
|
||||
"sortBySize": "Sortuj wg. rozmiaru"
|
||||
"sortByLastModified": "Sortuj wg ostatniej modyfikacji",
|
||||
"sortByName": "Sortuj wg nazwy",
|
||||
"sortBySize": "Sortuj wg rozmiaru",
|
||||
"noPreview": "Podgląd tego pliku jest niedostępny."
|
||||
},
|
||||
"help": {
|
||||
"click": "wybierz plik lub foler",
|
||||
"click": "zaznacz plik lub folder",
|
||||
"ctrl": {
|
||||
"click": "wybierz wiele plików lub folderów",
|
||||
"click": "zaznacz wiele plików lub folderów",
|
||||
"f": "otwórz wyszukiwarkę",
|
||||
"s": "pobierz aktywny plik lub folder"
|
||||
},
|
||||
"del": "usuń zaznaczone",
|
||||
"del": "usuń zaznaczone elementy",
|
||||
"doubleClick": "otwórz plik lub folder",
|
||||
"esc": "wyczyść zaznaczenie i/lub zamknij okno z powiadomieniem",
|
||||
"f1": "ta informacja",
|
||||
"esc": "wyczyść zaznaczenie i/lub zamknij monit",
|
||||
"f1": "te informacje",
|
||||
"f2": "zmień nazwę pliku",
|
||||
"help": "Pomoc"
|
||||
},
|
||||
"login": {
|
||||
"createAnAccount": "Utwórz konto",
|
||||
"loginInstead": "Takie konto już istnieje",
|
||||
"loginInstead": "Mam już konto",
|
||||
"password": "Hasło",
|
||||
"passwordConfirm": "Potwierdzenie hasła",
|
||||
"passwordsDontMatch": "Hasła różnią się",
|
||||
"passwordsDontMatch": "Hasła nie pasują do siebie",
|
||||
"signup": "Rejestracja",
|
||||
"submit": "Logowanie",
|
||||
"submit": "Zaloguj",
|
||||
"username": "Nazwa użytkownika",
|
||||
"usernameTaken": "Nazwa użytkownika już zajęta",
|
||||
"usernameTaken": "Ta nazwa użytkownika jest zajęta",
|
||||
"wrongCredentials": "Błędne dane logowania"
|
||||
},
|
||||
"permanent": "Permanentny",
|
||||
"prompts": {
|
||||
"copy": "Kopiuj",
|
||||
"copyMessage": "Wybierz lokalizację do której mają być skopiowane wybrane pliki",
|
||||
"currentlyNavigating": "Obecnie przeglądasz:",
|
||||
"deleteMessageMultiple": "Czy jesteś pewien że chcesz usunąć {count} plik(ów)?",
|
||||
"deleteMessageSingle": "Czy jesteś pewien, że chcesz usunąć ten plik/folder?",
|
||||
"copyMessage": "Wybierz lokalizację docelową:",
|
||||
"currentlyNavigating": "Aktualnie poruszasz się po:",
|
||||
"deleteMessageMultiple": "Czy na pewno chcesz usunąć pliki: {count}?",
|
||||
"deleteMessageSingle": "Czy na pewno chcesz usunąć ten plik/folder?",
|
||||
"deleteMessageShare": "Czy na pewno chcesz usunąć ten udział ({path})?",
|
||||
"deleteUser": "Czy na pewno chcesz usunąć tego użytkownika?",
|
||||
"deleteTitle": "Usuń pliki",
|
||||
"displayName": "Wyświetlana Nazwa:",
|
||||
"displayName": "Wyświetlana nazwa:",
|
||||
"download": "Pobierz pliki",
|
||||
"downloadMessage": "Wybierz format, jaki chesz pobrać.",
|
||||
"error": "Pojawił się nieznany błąd",
|
||||
"fileInfo": "Informacje o pliku",
|
||||
"filesSelected": "{count} plików zostało zaznaczonych.",
|
||||
"lastModified": "Osatnio Zmodyfikowane",
|
||||
"downloadMessage": "Wybierz format, w którym chcesz pobrać.",
|
||||
"error": "Pojawił się jakiś błąd",
|
||||
"fileInfo": "Informacje o pliku",
|
||||
"filesSelected": "Zaznaczone pliki: {count}",
|
||||
"lastModified": "Ostatnio zmodyfikowano",
|
||||
"move": "Przenieś",
|
||||
"moveMessage": "Wybierz nową lokalizację dla swoich plik(ów)/folder(ów):",
|
||||
"newArchetype": "Utwórz nowy wpis na bazie wybranego wzorca. Twój plik będzie utworzony w wybranym folderze.",
|
||||
"moveMessage": "Wybierz nową lokalizację dla swoich plików/folderów:",
|
||||
"newArchetype": "Utwórz nowy wpis na bazie wybranego wzorca. Twój plik będzie utworzony w wybranym folderze.",
|
||||
"newDir": "Nowy folder",
|
||||
"newDirMessage": "Podaj nazwę tworzonego folderu.",
|
||||
"newDirMessage": "Nazwij nowy folder.",
|
||||
"newFile": "Nowy plik",
|
||||
"newFileMessage": "Podaj nazwętworzonego pliku.",
|
||||
"numberDirs": "Ilość katalogów",
|
||||
"numberFiles": "Ilość plików",
|
||||
"newFileMessage": "Nazwij nowy plik.",
|
||||
"numberDirs": "Liczba folderów",
|
||||
"numberFiles": "Liczba plików",
|
||||
"rename": "Zmień nazwę",
|
||||
"renameMessage": "Podaj nową nazwę dla",
|
||||
"replace": "Zamień",
|
||||
"replaceMessage": "Jednen z plików który próbujesz wrzucić próbje nadpisać plik o tej samej nazwie. Czy chcesz nadpisać poprzedni plik?\n",
|
||||
"schedule": "Grafi",
|
||||
"scheduleMessage": "Wybierz datę i czas dla publikacji tego wpisu.",
|
||||
"replaceMessage": "Jeden z przesyłanych plików chce nadpisać istniejący plik o tej samej nazwie. Chcesz pominąć ten plik i kontynuować przesyłanie reszty plików, czy nadpisać istniejący plik?\n",
|
||||
"schedule": "Grafik",
|
||||
"scheduleMessage": "Wybierz datę i czas dla publikacji tego wpisu.",
|
||||
"show": "Pokaż",
|
||||
"size": "Rozmiar",
|
||||
"upload": "Prześlij",
|
||||
"uploadMessage": "Proszę wybrać metodę przesyłania"
|
||||
"upload": "Wyślij",
|
||||
"uploadFiles": "Wysyłam pliki: {files}...",
|
||||
"uploadMessage": "Wybierz opcję przesyłania.",
|
||||
"optionalPassword": "Opcjonalne hasło",
|
||||
"resolution": "Rozdzielczość",
|
||||
"discardEditorChanges": "Czy na pewno chcesz odrzucić wprowadzone zmiany?"
|
||||
},
|
||||
"search": {
|
||||
"images": "Zdjęcia",
|
||||
"images": "Obrazy",
|
||||
"music": "Muzyka",
|
||||
"pdf": "PDF",
|
||||
"pressToSearch": "Wciśnij enter, aby wyszukać...",
|
||||
"pressToSearch": "Naciśnij Enter, aby wyszukać...",
|
||||
"search": "Szukaj...",
|
||||
"typeToSearch": "Zacznij pisać, aby wyszukać...",
|
||||
"typeToSearch": "Typ plików do wyszukania...",
|
||||
"types": "Typy",
|
||||
"video": "Wideo"
|
||||
},
|
||||
@@ -137,70 +157,80 @@
|
||||
"admin": "Admin",
|
||||
"administrator": "Administrator",
|
||||
"allowCommands": "Wykonaj polecenie",
|
||||
"allowEdit": "Edycja, zmiana nazwy i usuniecie plików lub folderów",
|
||||
"allowEdit": "Edycja, zmiana nazwy i usuniecie plików lub folderów",
|
||||
"allowNew": "Tworzenie nowych plików lub folderów",
|
||||
"allowPublish": "Tworzenie nowych wpisów i stron",
|
||||
"allowSignup": "Zezwól na rejestrację użytkowników",
|
||||
"avoidChanges": "(pozostaw puste aby nie zosatało zmienione)",
|
||||
"branding": "Branding",
|
||||
"brandingDirectoryPath": "Folder brandingowy",
|
||||
"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",
|
||||
"allowPublish": "Tworzenie nowych wpisów i stron",
|
||||
"allowSignup": "Pozwól użytkownikom na rejestrację",
|
||||
"avoidChanges": "(pozostaw puste, aby uniknąć zmian)",
|
||||
"branding": "Personalizacja",
|
||||
"brandingDirectoryPath": "Ścieżka do folderu personalizacji",
|
||||
"brandingHelp": "Możesz zmodyfikować wygląd instancji File Browser poprzez zmianę nazwy, logo, dodanie własnych stylów graficznych, a nawet usunięcia linków do serwisu GitHub. Więcej informacji o modyfikacji wyglądu znajdziesz w {0}.",
|
||||
"changePassword": "Zmień hasło",
|
||||
"commandRunner": "Narzędzie do wykonywania poleceń",
|
||||
"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}.",
|
||||
"commandRunnerHelp": "Tu możesz ustawić polecenia, które będą wykonywane przy danych zdarzeniach. Musisz wpisywać po jednym na wiersz. 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 w {2}.",
|
||||
"commandsUpdated": "Polecenie zaktualizowane!",
|
||||
"createUserDir": "Automatycznie utwórz katalog domowy użytkownika podczas dodania nowego użytkownika",
|
||||
"customStylesheet": "Własny arkusz stylów",
|
||||
"defaultUserDescription": "Oto domyślne ustawienia dla nowych użytkowników.",
|
||||
"disableExternalLinks": "Wyłącz linki zewnętrzne (z wyjątkiem dokumentacji)",
|
||||
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||
"documentation": "dokumentacja",
|
||||
"createUserDir": "Automatycznie twórz katalog domowy podczas dodawania użytkownika",
|
||||
"tusUploads": "Przesyłanie we fragmentach",
|
||||
"tusUploadsHelp": "File Browser wspiera przesyłanie plików we fragmentach, co pozwala na proces przesyłania, który jest wydajny, pewny i możliwy do wznowienia nawet w sieciach o wątpliwej stabilności przesyłu danych.",
|
||||
"tusUploadsChunkSize": "Oznacza maksymalny rozmiar przesyłanych plików (dla mniejszych plików użyte zostanie przesyłanie bezpośrednie). Możesz ustawić tę wartość zarówno zapisaną samymi cyframi w bajtach, jak i podać ją w formie skróconej, np. poprzez 10MB, 1GB itp.",
|
||||
"tusUploadsRetryCount": "Liczba prób ponowienia transferu w przypadku wystapienia problemu z przesyłem.",
|
||||
"userHomeBasePath": "Ścieżka podstawowa dla katalogów domowych użytkowników",
|
||||
"userScopeGenerationPlaceholder": "Zakres zostanie wygenerowany automatycznie",
|
||||
"createUserHomeDirectory": "Utwórz katalog domowy użytkownika",
|
||||
"customStylesheet": "Własny arkusz stylu",
|
||||
"defaultUserDescription": "To są domyślne ustawienia dla nowych użytkowników.",
|
||||
"disableExternalLinks": "Wyłącz linki zewnętrzne (z wyjątkiem dokumentacji)",
|
||||
"disableUsedDiskPercentage": "Wyłącz wykres procentowy używanego dysku",
|
||||
"documentation": "dokumentacji",
|
||||
"examples": "Przykłady",
|
||||
"executeOnShell": "Wykonaj w powłoce",
|
||||
"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": "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",
|
||||
"hideDotfiles": "Ukryj ukryte pliki",
|
||||
"executeOnShell": "Wykonaj w powłoce",
|
||||
"executeOnShellDescription": "Domyślnie File Browser wykonuje polecenia poprzez bezpośrednie uruchomienie odpowiednich plików binarnych. Jeśli chcesz uruchamiać polecenia z poziomu powłoki (np. Bash lub PowerShell), możesz zdefiniować je tutaj, z wykorzystaniem odpowiednich argumentów i flag. Gdy się na to zdecydujesz, wykonywane polecenie będzie załączone jako argument. Tyczy się to tak poleceń użytkownika, jak i zaczepów zdarzeń.",
|
||||
"globalRules": "Globalny zestaw reguł zezwalających i zakazujących. Dotyczą każdego użytkownika. Aby zastąpić ustawienia globalne, możesz zdefiniować określone reguły indywidualnie dla każdego użytkownika.",
|
||||
"globalSettings": "Ustawienia globalne",
|
||||
"hideDotfiles": "Ukryj pliki poprzedzone kropką",
|
||||
"insertPath": "Wstaw ścieżkę",
|
||||
"insertRegex": "Wstaw wyrażenie regularne",
|
||||
"instanceName": "Nazwa instancji",
|
||||
"language": "Język",
|
||||
"lockPassword": "Zablokuj użytkownikowi możliwość zmiany hasła",
|
||||
"newPassword": "Twoje nowe hasło",
|
||||
"newPasswordConfirm": "Potwierdź swoje hasło",
|
||||
"newUser": "Nowy Użytkownik",
|
||||
"newPassword": "Nowe hasło",
|
||||
"newPasswordConfirm": "Potwierdź nowe hasło",
|
||||
"newUser": "Nowy użytkownik",
|
||||
"password": "Hasło",
|
||||
"passwordUpdated": "Hasło zostało zapisane!",
|
||||
"passwordUpdated": "Hasło zostało zaktualizowane!",
|
||||
"path": "Ścieżka",
|
||||
"perm": {
|
||||
"create": "Tworzenie plików i katalogów",
|
||||
"delete": "Usuwanie plików i katalogów",
|
||||
"create": "Tworzenie plików i folderów",
|
||||
"delete": "Usuwanie plików i folderów",
|
||||
"download": "Pobieranie",
|
||||
"execute": "Wykonywanie poleceń",
|
||||
"modify": "Edycja plików",
|
||||
"rename": "Zmiana nazw lub przenoszenie plików i katalogów",
|
||||
"modify": "Edytowanie plików",
|
||||
"rename": "Zmienianie nazwy lub przenoszenie plików i katalogów",
|
||||
"share": "Udostępnianie plików"
|
||||
},
|
||||
"permissions": "Uprawnienia",
|
||||
"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",
|
||||
"permissionsHelp": "Możesz ustawić użytkownika jako administratora lub wybrać uprawnienia indywidualnie. Jeśli wybierzesz „Administrator”, wszystkie pozostałe opcje zostaną automatycznie zaznaczone. Zarządzanie użytkownikami pozostaje przywilejem administratora.\n",
|
||||
"profileSettings": "Twój profil",
|
||||
"ruleExample1": "uniemożliwia dostęp do któregokolwiek z ukrytych plików (takich jak .git, .gitignore) w każdym folderze.\n",
|
||||
"ruleExample2": "blokuje dostęp do pliku Caddyfile w głównym katalogu zakresu.",
|
||||
"ruleExample1": "uniemożliwia dostęp do plików poprzedzonych kropką (takich jak .git, .gitignore) we wszystkich folderach.\n",
|
||||
"ruleExample2": "blokuje dostęp do pliku o nazwie Caddyfile w katalogu głównym zakresu.",
|
||||
"rules": "Uprawnienia",
|
||||
"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",
|
||||
"rulesHelp": "Tutaj możesz zdefiniować zestaw reguł zezwalających i zakazujących dla tego użytkownika. Zablokowane pliki nie pojawią się na listach i nie będą dostępne dla użytkownika. Obsługujemy wyrażenia regularne i ścieżki względne w stosunku do zakresu użytkownika.\n",
|
||||
"scope": "Zakres",
|
||||
"settingsUpdated": "Uprawnienia Zapisane!",
|
||||
"setDateFormat": "Ustaw dokładny format daty",
|
||||
"settingsUpdated": "Ustawienia zaktualizowane!",
|
||||
"shareDuration": "Okres udostępniania",
|
||||
"shareManagement": "Zarządzanie udostępnianiem",
|
||||
"singleClick": "Pojedyncze kliknięcie",
|
||||
"shareDeleted": "Udostępnienie usunięte!",
|
||||
"singleClick": "Używaj pojedynczych kliknięć, aby otwierać pliki i foldery",
|
||||
"themes": {
|
||||
"dark": "ciemny",
|
||||
"light": "jasny",
|
||||
"title": "Motywy"
|
||||
"default": "Domyślny systemowy",
|
||||
"dark": "Ciemny",
|
||||
"light": "Jasny",
|
||||
"title": "Motyw"
|
||||
},
|
||||
"user": "Użytkownik",
|
||||
"userCommands": "Polecenia",
|
||||
"userCommandsHelp": "Lista oddzielonych spacjami poleceń dostępnych dla tego użytkownika. Przykład:\n",
|
||||
"userCommandsHelp": "Oddzielona spacjami lista z dostępnymi poleceniami dla tego użytkownika. Przykład:\n",
|
||||
"userCreated": "Użytkownik zapisany!",
|
||||
"userDefaults": "Domyślne ustawienia użytkownika",
|
||||
"userDeleted": "Użytkownik usunięty!",
|
||||
@@ -211,8 +241,8 @@
|
||||
},
|
||||
"sidebar": {
|
||||
"help": "Pomoc",
|
||||
"hugoNew": "Hugo New",
|
||||
"login": "Login",
|
||||
"hugoNew": "Nowy Hugo",
|
||||
"login": "Zaloguj",
|
||||
"logout": "Wyloguj",
|
||||
"myFiles": "Moje pliki",
|
||||
"newFile": "Nowy plik",
|
||||
@@ -220,10 +250,10 @@
|
||||
"preview": "Podgląd",
|
||||
"settings": "Ustawienia",
|
||||
"signup": "Rejestracja",
|
||||
"siteSettings": "Ustawienia Strony"
|
||||
"siteSettings": "Ustawienia strony"
|
||||
},
|
||||
"success": {
|
||||
"linkCopied": "Link Skopiowany!"
|
||||
"linkCopied": "Link skopiowany!"
|
||||
},
|
||||
"time": {
|
||||
"days": "Dni",
|
||||
|
||||
@@ -38,13 +38,20 @@
|
||||
"toggleSidebar": "Alternar barra lateral",
|
||||
"update": "Atualizar",
|
||||
"upload": "Enviar",
|
||||
"openFile": "Abrir"
|
||||
"openFile": "Abrir",
|
||||
"copyDownloadLinkToClipboard": "Copiar link de download para a área de transferência",
|
||||
"fullScreen": "Alternar tela cheia",
|
||||
"preview": "Pré-visualizar",
|
||||
"discardChanges": "Descartar"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "Baixar arquivo",
|
||||
"downloadFolder": "Baixar pasta",
|
||||
"downloadSelected": "Baixar selecionado"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "Tem certeza de que deseja abortar o upload?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "Você não tem permissões para acessar isto.",
|
||||
"internal": "Ops! Algum erro ocorreu.",
|
||||
@@ -58,8 +65,8 @@
|
||||
"folders": "Pastas",
|
||||
"home": "Início",
|
||||
"lastModified": "Última modificação",
|
||||
"loading": "Carregando. Aguarde, por favor.",
|
||||
"lonely": "Não existe nada aqui.",
|
||||
"loading": "Carregando...",
|
||||
"lonely": "Não há nada aqui...",
|
||||
"metadata": "Metadados",
|
||||
"multipleSelectionEnabled": "Seleção múltipla ativada",
|
||||
"name": "Nome",
|
||||
@@ -73,12 +80,12 @@
|
||||
"click": "selecionar pasta ou arquivo",
|
||||
"ctrl": {
|
||||
"click": "selecionar várias pastas e arquivos",
|
||||
"f": "pesquisar",
|
||||
"f": "abrir pesquisa",
|
||||
"s": "salvar um arquivo ou baixar a pasta que você está"
|
||||
},
|
||||
"del": "apagar os arquivos selecionados",
|
||||
"doubleClick": "abrir pasta ou arquivo",
|
||||
"esc": "limpar seleção e/ou fechar menu",
|
||||
"esc": "limpar seleção e/ou fechar prompt",
|
||||
"f1": "esta informação",
|
||||
"f2": "renomear arquivo",
|
||||
"help": "Ajuda"
|
||||
@@ -123,7 +130,7 @@
|
||||
"rename": "Renomear",
|
||||
"renameMessage": "Insira um novo nome para",
|
||||
"replace": "Substituir",
|
||||
"replaceMessage": "Já existe um arquivo com nome igual a um dos que está tentando enviar. Deseja substituir?\n",
|
||||
"replaceMessage": "Um dos arquivos que você está tentando enviar possui um nome conflitante. Deseja pular este arquivo e continuar o envio ou substituir o existente?\n",
|
||||
"schedule": "Agendar",
|
||||
"scheduleMessage": "Escolha uma data para agendar a publicação deste post.",
|
||||
"show": "Mostrar",
|
||||
@@ -131,7 +138,10 @@
|
||||
"upload": "Enviar",
|
||||
"uploadFiles": "Enviando {files} arquivos...",
|
||||
"uploadMessage": "Selecione uma opção para enviar.",
|
||||
"optionalPassword": "Senha opcional"
|
||||
"optionalPassword": "Senha opcional",
|
||||
"deleteUser": "Tem certeza de que deseja apagar este usuário?",
|
||||
"resolution": "Resolução",
|
||||
"discardEditorChanges": "Tem certeza de que deseja descartar as alterações feitas?"
|
||||
},
|
||||
"search": {
|
||||
"images": "Imagens",
|
||||
@@ -159,7 +169,7 @@
|
||||
"commandRunner": "Execução de comandos",
|
||||
"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!",
|
||||
"createUserDir": "Criar diretório Home para novos usuários",
|
||||
"createUserDir": "Criar diretório Home do usuário automaticamente ao adicionar novo usuário",
|
||||
"userHomeBasePath": "Caminho base para diretórios de usuários",
|
||||
"userScopeGenerationPlaceholder": "O escopo será gerado automaticamente",
|
||||
"createUserHomeDirectory": "Criar diretório Home de usuário",
|
||||
@@ -184,7 +194,7 @@
|
||||
"newUser": "Novo usuário",
|
||||
"password": "Senha",
|
||||
"passwordUpdated": "Senha atualizada!",
|
||||
"path": "",
|
||||
"path": "Caminho",
|
||||
"perm": {
|
||||
"create": "Criar arquivos e diretórios",
|
||||
"delete": "Apagar arquivos e diretórios",
|
||||
@@ -209,6 +219,7 @@
|
||||
"shareDeleted": "Compartilhamento apagado!",
|
||||
"singleClick": "Usar clique único para abrir arquivos e diretórios",
|
||||
"themes": {
|
||||
"default": "Padrão do sistema",
|
||||
"dark": "Escuro",
|
||||
"light": "Claro",
|
||||
"title": "Tema"
|
||||
@@ -229,7 +240,7 @@
|
||||
"hugoNew": "Hugo New",
|
||||
"login": "Login",
|
||||
"logout": "Sair",
|
||||
"myFiles": "Arquivos",
|
||||
"myFiles": "Meus arquivos",
|
||||
"newFile": "Novo arquivo",
|
||||
"newFolder": "Nova pasta",
|
||||
"preview": "Pré-visualizar",
|
||||
@@ -245,6 +256,6 @@
|
||||
"hours": "Horas",
|
||||
"minutes": "Minutos",
|
||||
"seconds": "Segundos",
|
||||
"unit": "Unidades de Tempo"
|
||||
"unit": "Unidade de tempo"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,14 +3,17 @@
|
||||
"cancel": "Отмена",
|
||||
"clear": "Очистить",
|
||||
"close": "Закрыть",
|
||||
"continue": "Продолжить",
|
||||
"copy": "Копировать",
|
||||
"copyFile": "Скопировать файл",
|
||||
"copyToClipboard": "Скопировать в буфер",
|
||||
"copyDownloadLinkToClipboard": "Скопировать ссылку в буфер",
|
||||
"create": "Создать",
|
||||
"delete": "Удалить",
|
||||
"download": "Скачать",
|
||||
"file": "Файл",
|
||||
"folder": "Папка",
|
||||
"fullScreen": " Развернуть на весь экран",
|
||||
"hideDotfiles": "Скрыть точечные файлы",
|
||||
"info": "Инфо",
|
||||
"more": "Еще",
|
||||
@@ -21,6 +24,7 @@
|
||||
"ok": "OK",
|
||||
"permalink": "Получить постоянную ссылку",
|
||||
"previous": "Назад",
|
||||
"preview": "Предпросмотр",
|
||||
"publish": "Опубликовать",
|
||||
"rename": "Переименовать",
|
||||
"replace": "Перезаписать",
|
||||
@@ -37,13 +41,17 @@
|
||||
"toggleSidebar": "Боковая панель",
|
||||
"update": "Обновить",
|
||||
"upload": "Загрузить",
|
||||
"openFile": "Открыть файл"
|
||||
"openFile": "Открыть файл",
|
||||
"discardChanges": "Отказаться"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "Скачать файл",
|
||||
"downloadFolder": "Загрузить папку",
|
||||
"downloadSelected": "Скачать выбранное"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "Вы действительно, что хотите прервать операцию?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "У вас нет прав доступа к этому.",
|
||||
"internal": "Что-то пошло не так.",
|
||||
@@ -72,7 +80,7 @@
|
||||
"click": "выбрать файл или каталог",
|
||||
"ctrl": {
|
||||
"click": "выбрать несколько файлов или каталогов",
|
||||
"f": "открыть поиск",
|
||||
"f": "открытые поиски",
|
||||
"s": "скачать файл или текущий каталог"
|
||||
},
|
||||
"del": "удалить выбранные элементы",
|
||||
@@ -102,6 +110,7 @@
|
||||
"deleteMessageMultiple": "Удалить эти файлы ({count})?",
|
||||
"deleteMessageSingle": "Удалить этот файл/каталог?",
|
||||
"deleteMessageShare": "Удалить этот общий файл/каталог ({path})?",
|
||||
"deleteUser": "Вы действительно, хотите удалить пользователя?",
|
||||
"deleteTitle": "Удалить файлы",
|
||||
"displayName": "Отображаемое имя:",
|
||||
"download": "Скачать файлы",
|
||||
@@ -111,7 +120,7 @@
|
||||
"filesSelected": "Файлов выбрано: {count}.",
|
||||
"lastModified": "Последнее изменение",
|
||||
"move": "Переместить",
|
||||
"moveMessage": "Переместить в:",
|
||||
"moveMessage": "Выберите новый домашний каталог для ваших файлов/папок:",
|
||||
"newArchetype": "Создайте новую запись на основе архетипа. Файл будет создан в каталоге.",
|
||||
"newDir": "Новый каталог",
|
||||
"newDirMessage": "Имя нового каталога.",
|
||||
@@ -128,8 +137,11 @@
|
||||
"show": "Показать",
|
||||
"size": "Размер",
|
||||
"upload": "Загрузить",
|
||||
"uploadFiles": "Загружаю {files} файлы...",
|
||||
"uploadMessage": "Выберите вариант для загрузки.",
|
||||
"optionalPassword": "Необязательный пароль"
|
||||
"optionalPassword": "Необязательный пароль",
|
||||
"resolution": "Разрешение",
|
||||
"discardEditorChanges": "Вы действительно желаете отменить ваши правки?"
|
||||
},
|
||||
"search": {
|
||||
"images": "Изображения",
|
||||
@@ -158,6 +170,13 @@
|
||||
"commandRunnerHelp": "Здесь вы можете установить команды, которые будут выполняться в указанных событиях. Вы должны указать по одной команде в каждой строке. Переменные среды {0} и {1} будут доступны, будучи {0} относительно {1}. Дополнительные сведения об этой функции и доступных переменных среды см. В {2}.",
|
||||
"commandsUpdated": "Команды обновлены!",
|
||||
"createUserDir": "Автоматическое создание домашнего каталога пользователя при добавлении нового пользователя",
|
||||
"tusUploads": "Загруженные файлы",
|
||||
"tusUploadsHelp": " File Browser поддерживает загрузку файлов по частям, что позволяет работать в сетях низкого качества.",
|
||||
"tusUploadsChunkSize": "Указывает максимальный размер запроса (мелкие загрузки пойдут напрямую). Вы можете ввести простое целое число, обозначающее размер ввода в байтах, или строку, например 10MB, 1GB и т. д.",
|
||||
"tusUploadsRetryCount": "Количество повторных попыток, которые необходимо выполнить, если фрагмент не удалось загрузить.",
|
||||
"userHomeBasePath": "Путь к домашнему каталогу пользователя",
|
||||
"userScopeGenerationPlaceholder": "Область действия будет сгенерирована автоматически",
|
||||
"createUserHomeDirectory": "Создать домашний каталог пользователя",
|
||||
"customStylesheet": "Свой стиль",
|
||||
"defaultUserDescription": "Это настройки по умолчанию для новых пользователей.",
|
||||
"disableExternalLinks": "Отключить внешние ссылки (кроме документации)",
|
||||
@@ -196,7 +215,7 @@
|
||||
"ruleExample2": "блокирует доступ к файлу с именем Caddyfile в корневой области.",
|
||||
"rules": "Права",
|
||||
"rulesHelp": "Здесь вы можете определить набор разрешающих и запрещающих правил для этого конкретного пользователь. Блокированные файлы не будут отображаться в списках, и не будут доступны для пользователя. Есть поддержка регулярных выражений и относительных путей.\n",
|
||||
"scope": "Корень",
|
||||
"scope": "Область",
|
||||
"setDateFormat": "Установить точный формат даты",
|
||||
"settingsUpdated": "Настройки применены!",
|
||||
"shareDuration": "Время расшаренной ссылки",
|
||||
@@ -204,6 +223,7 @@
|
||||
"shareDeleted": "Расшаренная ссылка удалена!",
|
||||
"singleClick": "Открытие файлов и каталогов одним кликом",
|
||||
"themes": {
|
||||
"default": " Системные настройки по умолчанию",
|
||||
"dark": "Темная",
|
||||
"light": "Светлая",
|
||||
"title": "Тема"
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"switchView": "Вид",
|
||||
"toggleSidebar": "Бічна панель",
|
||||
"update": "Оновити",
|
||||
"upload": "Завантажити",
|
||||
"upload": "Вивантажити",
|
||||
"openFile": "Відкрити файл"
|
||||
},
|
||||
"download": {
|
||||
@@ -102,9 +102,9 @@
|
||||
"deleteMessageMultiple": "Видалити ці файли ({count})?",
|
||||
"deleteMessageSingle": "Видалити цей файл/каталог?",
|
||||
"deleteMessageShare": "Видалити цей спільний файл/каталог ({path})?",
|
||||
"deleteTitle": "Видалити файлы",
|
||||
"deleteTitle": "Видалити файли",
|
||||
"displayName": "Відображене ім'я:",
|
||||
"download": "Завантажити файлы",
|
||||
"download": "Завантажити файли",
|
||||
"downloadMessage": "Виберіть формат, в якому хочете завантажити.",
|
||||
"error": "Помилка",
|
||||
"fileInfo": "Інформація про файл",
|
||||
@@ -127,8 +127,8 @@
|
||||
"scheduleMessage": "Запланувати дату та час публікації.",
|
||||
"show": "Показати",
|
||||
"size": "Розмір",
|
||||
"upload": "Завантажити",
|
||||
"uploadMessage": "Виберіть варіант для завантаження.",
|
||||
"upload": "Вивантажити",
|
||||
"uploadMessage": "Виберіть варіант для вивантаження.",
|
||||
"optionalPassword": "Необов'язковий пароль"
|
||||
},
|
||||
"search": {
|
||||
|
||||
265
frontend/src/i18n/vi.json
Normal file
265
frontend/src/i18n/vi.json
Normal file
@@ -0,0 +1,265 @@
|
||||
{
|
||||
"buttons": {
|
||||
"cancel": "Hủy",
|
||||
"clear": "Xóa",
|
||||
"close": "Đóng",
|
||||
"continue": "Tiếp tục",
|
||||
"copy": "Sao chép",
|
||||
"copyFile": "Sao chép tập tin",
|
||||
"copyToClipboard": "Sao chép vào clipboard",
|
||||
"copyDownloadLinkToClipboard": "Sao chép liên kết tải xuống vào clipboard",
|
||||
"create": "Tạo",
|
||||
"delete": "Xóa",
|
||||
"download": "Tải xuống",
|
||||
"file": "Tập tin",
|
||||
"folder": "Thư mục",
|
||||
"fullScreen": "Toàn màn hình",
|
||||
"hideDotfiles": "Ẩn tập tin ẩn",
|
||||
"info": "Thông tin",
|
||||
"more": "Thêm",
|
||||
"move": "Di chuyển",
|
||||
"moveFile": "Di chuyển tập tin",
|
||||
"new": "Mới",
|
||||
"next": "Tiếp theo",
|
||||
"ok": "OK",
|
||||
"permalink": "Lấy liên kết vĩnh viễn",
|
||||
"previous": "Trước",
|
||||
"preview": "Xem trước",
|
||||
"publish": "Xuất bản",
|
||||
"rename": "Đổi tên",
|
||||
"replace": "Thay thế",
|
||||
"reportIssue": "Báo cáo sự cố",
|
||||
"save": "Lưu",
|
||||
"schedule": "Lên lịch",
|
||||
"search": "Tìm kiếm",
|
||||
"select": "Chọn",
|
||||
"selectMultiple": "Chọn nhiều",
|
||||
"share": "Chia sẻ",
|
||||
"shell": "Chuyển đổi shell",
|
||||
"submit": "Gửi",
|
||||
"switchView": "Chuyển chế độ xem",
|
||||
"toggleSidebar": "Thanh bên",
|
||||
"update": "Cập nhật",
|
||||
"upload": "Tải lên",
|
||||
"openFile": "Mở tệp",
|
||||
"discardChanges": "Hủy bỏ thay đổi"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "Tải xuống tệp tin",
|
||||
"downloadFolder": "Tải xuống thư mục",
|
||||
"downloadSelected": "Tải xuống đã chọn"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "Bạn có chắc chắn muốn hủy tải lên không?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "Bạn không có quyền truy cập vào nội dung này.",
|
||||
"internal": "Đã xảy ra lỗi nghiêm trọng.",
|
||||
"notFound": "Không thể truy cập vị trí này.",
|
||||
"connection": "Không thể kết nối đến máy chủ."
|
||||
},
|
||||
"files": {
|
||||
"body": "Nội dung",
|
||||
"closePreview": "Đóng xem trước",
|
||||
"files": "Tập tin",
|
||||
"folders": "Thư mục",
|
||||
"home": "Trang chủ",
|
||||
"lastModified": "Sửa đổi lần cuối",
|
||||
"loading": "Đang tải...",
|
||||
"lonely": "Không có gì ở đây...",
|
||||
"metadata": "Siêu dữ liệu",
|
||||
"multipleSelectionEnabled": "Đã bật chọn nhiều",
|
||||
"name": "Tên",
|
||||
"size": "Kích thước",
|
||||
"sortByLastModified": "Sắp xếp theo ngày sửa đổi",
|
||||
"sortByName": "Sắp xếp theo tên",
|
||||
"sortBySize": "Sắp xếp theo kích thước",
|
||||
"noPreview": "Không có bản xem trước cho tập tin này."
|
||||
},
|
||||
"help": {
|
||||
"click": "chọn tập tin hoặc thư mục",
|
||||
"ctrl": {
|
||||
"click": "chọn nhiều tập tin hoặc thư mục",
|
||||
"f": "mở tìm kiếm",
|
||||
"s": "lưu tập tin hoặc tải thư mục hiện tại"
|
||||
},
|
||||
"del": "xóa các mục đã chọn",
|
||||
"doubleClick": "mở tập tin hoặc thư mục",
|
||||
"esc": "hủy chọn và/hoặc đóng hộp thoại",
|
||||
"f1": "mở trợ giúp này",
|
||||
"f2": "đổi tên tập tin",
|
||||
"help": "Trợ giúp"
|
||||
},
|
||||
"login": {
|
||||
"createAnAccount": "Tạo tài khoản",
|
||||
"loginInstead": "Đã có tài khoản",
|
||||
"password": "Mật khẩu",
|
||||
"passwordConfirm": "Xác nhận mật khẩu",
|
||||
"passwordsDontMatch": "Mật khẩu không khớp",
|
||||
"signup": "Đăng ký",
|
||||
"submit": "Đăng nhập",
|
||||
"username": "Tên người dùng",
|
||||
"usernameTaken": "Tên người dùng đã tồn tại",
|
||||
"wrongCredentials": "Thông tin đăng nhập không đúng"
|
||||
},
|
||||
"permanent": "Vĩnh viễn",
|
||||
"prompts": {
|
||||
"copy": "Sao chép",
|
||||
"copyMessage": "Chọn vị trí để sao chép tệp của bạn:",
|
||||
"currentlyNavigating": "Đang điều hướng tại:",
|
||||
"deleteMessageMultiple": "Bạn có chắc chắn muốn xóa {count} tệp không?",
|
||||
"deleteMessageSingle": "Bạn có chắc chắn muốn xóa tệp/thư mục này không?",
|
||||
"deleteMessageShare": "Bạn có chắc chắn muốn xóa chia sẻ này ({path}) không?",
|
||||
"deleteUser": "Bạn có chắc chắn muốn xóa người dùng này không?",
|
||||
"deleteTitle": "Xóa tệp",
|
||||
"displayName": "Tên hiển thị:",
|
||||
"download": "Tải xuống tệp",
|
||||
"downloadMessage": "Chọn định dạng bạn muốn tải xuống.",
|
||||
"error": "Đã xảy ra lỗi",
|
||||
"fileInfo": "Thông tin tệp",
|
||||
"filesSelected": "{count} tệp đã được chọn.",
|
||||
"lastModified": "Chỉnh sửa lần cuối",
|
||||
"move": "Di chuyển",
|
||||
"moveMessage": "Chọn vị trí mới cho tệp/thư mục của bạn:",
|
||||
"newArchetype": "Tạo một bài viết mới dựa trên nguyên mẫu. Tệp của bạn sẽ được tạo trong thư mục nội dung.",
|
||||
"newDir": "Thư mục mới",
|
||||
"newDirMessage": "Đặt tên cho thư mục mới của bạn.",
|
||||
"newFile": "Tệp mới",
|
||||
"newFileMessage": "Đặt tên cho tệp mới của bạn.",
|
||||
"numberDirs": "Số lượng thư mục",
|
||||
"numberFiles": "Số lượng tệp",
|
||||
"rename": "Đổi tên",
|
||||
"renameMessage": "Nhập tên mới cho",
|
||||
"replace": "Thay thế",
|
||||
"replaceMessage": "Một trong những tệp bạn đang cố tải lên có tên trùng lặp. Bạn có muốn bỏ qua tệp này và tiếp tục tải lên hay thay thế tệp hiện có?\n",
|
||||
"schedule": "Lên lịch",
|
||||
"scheduleMessage": "Chọn ngày và giờ để lên lịch xuất bản bài viết này.",
|
||||
"show": "Hiển thị",
|
||||
"size": "Kích thước",
|
||||
"upload": "Tải lên",
|
||||
"uploadFiles": "Đang tải lên {files} tệp...",
|
||||
"uploadMessage": "Chọn một tùy chọn để tải lên.",
|
||||
"optionalPassword": "Mật khẩu tùy chọn",
|
||||
"resolution": "Độ phân giải",
|
||||
"discardEditorChanges": "Bạn có chắc chắn muốn hủy bỏ các thay đổi đã thực hiện không?"
|
||||
},
|
||||
"search": {
|
||||
"images": "Hình ảnh",
|
||||
"music": "Nhạc",
|
||||
"pdf": "PDF",
|
||||
"pressToSearch": "Nhấn Enter để tìm kiếm...",
|
||||
"search": "Tìm kiếm...",
|
||||
"typeToSearch": "Nhập để tìm kiếm...",
|
||||
"types": "Loại",
|
||||
"video": "Video"
|
||||
},
|
||||
"settings": {
|
||||
"admin": "Quản trị viên",
|
||||
"administrator": "Người quản trị",
|
||||
"allowCommands": "Thực thi lệnh",
|
||||
"allowEdit": "Chỉnh sửa, đổi tên và xóa tệp hoặc thư mục",
|
||||
"allowNew": "Tạo tệp và thư mục mới",
|
||||
"allowPublish": "Xuất bản bài viết và trang mới",
|
||||
"allowSignup": "Cho phép người dùng đăng ký",
|
||||
"avoidChanges": "(để trống để tránh thay đổi)",
|
||||
"branding": "Thương hiệu",
|
||||
"brandingDirectoryPath": "Đường dẫn thư mục thương hiệu",
|
||||
"brandingHelp": "Bạn có thể tùy chỉnh giao diện và trải nghiệm của File Browser bằng cách thay đổi tên, thay thế logo, thêm kiểu tùy chỉnh và thậm chí vô hiệu hóa các liên kết bên ngoài đến GitHub.\nĐể biết thêm thông tin về tùy chỉnh thương hiệu, vui lòng xem {0}.",
|
||||
"changePassword": "Đổi mật khẩu",
|
||||
"commandRunner": "Trình chạy lệnh",
|
||||
"commandRunnerHelp": "Tại đây, bạn có thể thiết lập các lệnh được thực thi trong các sự kiện đã định. Bạn phải viết một lệnh trên mỗi dòng. Các biến môi trường {0} và {1} sẽ có sẵn, trong đó {0} tương đối với {1}. Để biết thêm thông tin về tính năng này và các biến môi trường có sẵn, vui lòng đọc {2}.",
|
||||
"commandsUpdated": "Lệnh đã được cập nhật!",
|
||||
"createUserDir": "Tự động tạo thư mục chính của người dùng khi thêm người dùng mới",
|
||||
"tusUploads": "Tải lên theo phân đoạn",
|
||||
"tusUploadsHelp": "File Browser hỗ trợ tải lên tệp theo phân đoạn, giúp việc tải lên trở nên hiệu quả, đáng tin cậy, có thể tiếp tục và phù hợp với mạng không ổn định.",
|
||||
"tusUploadsChunkSize": "Kích thước tối đa của một yêu cầu (tải lên trực tiếp sẽ được sử dụng cho các tệp nhỏ hơn). Bạn có thể nhập một số nguyên biểu thị kích thước theo byte hoặc một chuỗi như 10MB, 1GB, v.v.",
|
||||
"tusUploadsRetryCount": "Số lần thử lại nếu một phân đoạn tải lên thất bại.",
|
||||
"userHomeBasePath": "Đường dẫn cơ bản của thư mục chính người dùng",
|
||||
"userScopeGenerationPlaceholder": "Phạm vi sẽ được tạo tự động",
|
||||
"createUserHomeDirectory": "Tạo thư mục chính của người dùng",
|
||||
"customStylesheet": "Bảng định dạng tùy chỉnh",
|
||||
"defaultUserDescription": "Đây là cài đặt mặc định cho người dùng mới.",
|
||||
"disableExternalLinks": "Vô hiệu hóa các liên kết bên ngoài (trừ tài liệu)",
|
||||
"disableUsedDiskPercentage": "Vô hiệu hóa biểu đồ phần trăm dung lượng đã sử dụng",
|
||||
"documentation": "tài liệu",
|
||||
"examples": "Ví dụ",
|
||||
"executeOnShell": "Thực thi trên shell",
|
||||
"executeOnShellDescription": "Theo mặc định, File Browser thực thi lệnh bằng cách gọi trực tiếp các tệp nhị phân của chúng. Nếu bạn muốn chạy chúng trên shell (chẳng hạn như Bash hoặc PowerShell), bạn có thể định nghĩa tại đây cùng với các tham số và cờ cần thiết. Nếu được đặt, lệnh bạn thực thi sẽ được thêm làm đối số. Điều này áp dụng cho cả lệnh người dùng và hook sự kiện.",
|
||||
"globalRules": "Đây là tập hợp quy tắc chung về quyền cho phép và từ chối. Chúng áp dụng cho mọi người dùng. Bạn có thể đặt quy tắc riêng cho từng người dùng để ghi đè các quy tắc chung này.",
|
||||
"globalSettings": "Cài đặt chung",
|
||||
"hideDotfiles": "Ẩn tệp ẩn (dotfiles)",
|
||||
"insertPath": "Nhập đường dẫn",
|
||||
"insertRegex": "Nhập biểu thức regex",
|
||||
"instanceName": "Tên phiên bản",
|
||||
"language": "Ngôn ngữ",
|
||||
"lockPassword": "Ngăn người dùng thay đổi mật khẩu",
|
||||
"newPassword": "Mật khẩu mới của bạn",
|
||||
"newPasswordConfirm": "Xác nhận mật khẩu mới",
|
||||
"newUser": "Người dùng mới",
|
||||
"password": "Mật khẩu",
|
||||
"passwordUpdated": "Mật khẩu đã được cập nhật!",
|
||||
"path": "Đường dẫn",
|
||||
"perm": {
|
||||
"create": "Tạo tệp và thư mục",
|
||||
"delete": "Xóa tệp và thư mục",
|
||||
"download": "Tải xuống",
|
||||
"execute": "Thực thi lệnh",
|
||||
"modify": "Chỉnh sửa tệp",
|
||||
"rename": "Đổi tên hoặc di chuyển tệp và thư mục",
|
||||
"share": "Chia sẻ tệp"
|
||||
},
|
||||
"permissions": "Quyền",
|
||||
"permissionsHelp": "Bạn có thể đặt người dùng làm quản trị viên hoặc chọn quyền riêng lẻ. Nếu chọn \"Người quản trị\", tất cả các tùy chọn khác sẽ tự động được chọn. Việc quản lý người dùng vẫn là đặc quyền của quản trị viên.\n",
|
||||
"profileSettings": "Cài đặt hồ sơ",
|
||||
"ruleExample1": "ngăn truy cập vào bất kỳ tệp ẩn nào (chẳng hạn như .git, .gitignore) trong mọi thư mục.\n",
|
||||
"ruleExample2": "chặn truy cập vào tệp có tên Caddyfile trong thư mục gốc của phạm vi.",
|
||||
"rules": "Quy tắc",
|
||||
"rulesHelp": "Tại đây, bạn có thể xác định một tập hợp quy tắc cho phép hoặc từ chối cho người dùng cụ thể này. Các tệp bị chặn sẽ không hiển thị trong danh sách và người dùng không thể truy cập chúng. Chúng tôi hỗ trợ regex và đường dẫn tương đối với phạm vi của người dùng.\n",
|
||||
"scope": "Phạm vi",
|
||||
"setDateFormat": "Đặt định dạng ngày chính xác",
|
||||
"settingsUpdated": "Cài đặt đã được cập nhật!",
|
||||
"shareDuration": "Thời gian chia sẻ",
|
||||
"shareManagement": "Quản lý chia sẻ",
|
||||
"shareDeleted": "Chia sẻ đã bị xóa!",
|
||||
"singleClick": "Dùng một lần nhấp để mở tệp và thư mục",
|
||||
"themes": {
|
||||
"default": "Mặc định hệ thống",
|
||||
"dark": "Tối",
|
||||
"light": "Sáng",
|
||||
"title": "Chủ đề"
|
||||
},
|
||||
"user": "Người dùng",
|
||||
"userCommands": "Lệnh",
|
||||
"userCommandsHelp": "Danh sách lệnh được phân tách bằng khoảng trắng dành cho người dùng này. Ví dụ:\n",
|
||||
"userCreated": "Người dùng đã được tạo!",
|
||||
"userDefaults": "Cài đặt mặc định của người dùng",
|
||||
"userDeleted": "Người dùng đã bị xóa!",
|
||||
"userManagement": "Quản lý người dùng",
|
||||
"userUpdated": "Người dùng đã được cập nhật!",
|
||||
"username": "Tên người dùng",
|
||||
"users": "Người dùng"
|
||||
},
|
||||
"sidebar": {
|
||||
"help": "Trợ giúp",
|
||||
"hugoNew": "Hugo New",
|
||||
"login": "Đăng nhập",
|
||||
"logout": "Đăng xuất",
|
||||
"myFiles": "Tập tin của tôi",
|
||||
"newFile": "Tập tin mới",
|
||||
"newFolder": "Thư mục mới",
|
||||
"preview": "Xem trước",
|
||||
"settings": "Cài đặt",
|
||||
"signup": "Đăng ký",
|
||||
"siteSettings": "Cài đặt trang"
|
||||
},
|
||||
"success": {
|
||||
"linkCopied": "Liên kết đã được sao chép!"
|
||||
},
|
||||
"time": {
|
||||
"days": "Ngày",
|
||||
"hours": "Giờ",
|
||||
"minutes": "Phút",
|
||||
"seconds": "Giây",
|
||||
"unit": "Đơn vị"
|
||||
}
|
||||
}
|
||||
@@ -22,6 +22,7 @@
|
||||
"ok": "确定",
|
||||
"permalink": "获取永久链接",
|
||||
"previous": "上一个",
|
||||
"preview": "预览",
|
||||
"publish": "发布",
|
||||
"rename": "重命名",
|
||||
"replace": "替换",
|
||||
@@ -39,7 +40,9 @@
|
||||
"update": "更新",
|
||||
"upload": "上传",
|
||||
"openFile": "打开文件",
|
||||
"continue": "继续"
|
||||
"continue": "继续",
|
||||
"fullScreen": "切换全屏",
|
||||
"discardChanges": "放弃更改"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "下载文件",
|
||||
@@ -136,7 +139,9 @@
|
||||
"uploadFiles": "正在上传 {files} ...",
|
||||
"uploadMessage": "选择上传选项。",
|
||||
"optionalPassword": "密码(选填,不填即无密码)",
|
||||
"resolution": "分辨率"
|
||||
"resolution": "分辨率",
|
||||
"deleteUser": "你确定要删除这个用户吗?",
|
||||
"discardEditorChanges": "你确定要放弃所做的更改吗?"
|
||||
},
|
||||
"search": {
|
||||
"images": "图像",
|
||||
@@ -218,6 +223,7 @@
|
||||
"shareDeleted": "分享已删除!",
|
||||
"singleClick": "使用单击来打开文件和文件夹",
|
||||
"themes": {
|
||||
"default": "系统默认",
|
||||
"dark": "深色",
|
||||
"light": "浅色",
|
||||
"title": "主题"
|
||||
|
||||
@@ -6,10 +6,13 @@
|
||||
"copy": "複製",
|
||||
"copyFile": "複製檔案",
|
||||
"copyToClipboard": "複製到剪貼簿",
|
||||
"copyDownloadLinkToClipboard": "複製到剪貼簿",
|
||||
"create": "建立",
|
||||
"delete": "刪除",
|
||||
"download": "下載",
|
||||
"hideDotfiles": "",
|
||||
"file": "檔案",
|
||||
"folder": "資料夾",
|
||||
"hideDotfiles": "隱藏隱藏檔案",
|
||||
"info": "資訊",
|
||||
"more": "更多",
|
||||
"move": "移動",
|
||||
@@ -30,20 +33,29 @@
|
||||
"selectMultiple": "選擇多個",
|
||||
"share": "分享",
|
||||
"shell": "切換 shell",
|
||||
"submit": "提交",
|
||||
"switchView": "切換顯示方式",
|
||||
"toggleSidebar": "切換側邊欄",
|
||||
"update": "更新",
|
||||
"upload": "上傳"
|
||||
"upload": "上傳",
|
||||
"openFile": "開啟檔案",
|
||||
"continue": "繼續",
|
||||
"fullScreen": "切換全螢幕",
|
||||
"discardChanges": "放棄變更"
|
||||
},
|
||||
"download": {
|
||||
"downloadFile": "下載檔案",
|
||||
"downloadFolder": "下載資料夾",
|
||||
"downloadSelected": ""
|
||||
"downloadSelected": "下載已選擇"
|
||||
},
|
||||
"upload": {
|
||||
"abortUpload": "你確定要中止嗎?"
|
||||
},
|
||||
"errors": {
|
||||
"forbidden": "您無權訪問。",
|
||||
"internal": "伺服器出了點問題。",
|
||||
"notFound": "找不到檔案。"
|
||||
"notFound": "找不到檔案。",
|
||||
"connection": "無法連接到伺服器。"
|
||||
},
|
||||
"files": {
|
||||
"body": "内容",
|
||||
@@ -60,7 +72,8 @@
|
||||
"size": "大小",
|
||||
"sortByLastModified": "按最後修改時間排序",
|
||||
"sortByName": "按名稱排序",
|
||||
"sortBySize": "按大小排序"
|
||||
"sortBySize": "按大小排序",
|
||||
"noPreview": "此檔案無法預覽。"
|
||||
},
|
||||
"help": {
|
||||
"click": "選擇檔案或目錄",
|
||||
@@ -95,6 +108,7 @@
|
||||
"currentlyNavigating": "目前目錄:",
|
||||
"deleteMessageMultiple": "你確定要刪除這 {count} 個檔案嗎?",
|
||||
"deleteMessageSingle": "你確定要刪除這個檔案/資料夾嗎?",
|
||||
"deleteMessageShare": "你確定要刪除這個分享({path})嗎?",
|
||||
"deleteTitle": "刪除檔案",
|
||||
"displayName": "名稱:",
|
||||
"download": "下載檔案",
|
||||
@@ -117,11 +131,16 @@
|
||||
"replace": "替換",
|
||||
"replaceMessage": "您嘗試上傳的檔案中有一個與現有檔案的名稱存在衝突。是否取代現有的同名檔案?",
|
||||
"schedule": "計畫",
|
||||
"scheduleMessage": "請選擇發佈這篇貼文的日期。",
|
||||
"scheduleMessage": "請選擇發佈這篇貼文的日期與時間。",
|
||||
"show": "顯示",
|
||||
"size": "大小",
|
||||
"upload": "上傳",
|
||||
"uploadMessage": "選擇上傳項。"
|
||||
"uploadFiles": "正在上傳 {files} ...",
|
||||
"uploadMessage": "選擇上傳項。",
|
||||
"optionalPassword": "密碼(選填,不填即無密碼)",
|
||||
"resolution": "解析度",
|
||||
"deleteUser": "你確定要刪除這個使用者嗎?",
|
||||
"discardEditorChanges": "你確定要放棄所做的變更嗎?"
|
||||
},
|
||||
"search": {
|
||||
"images": "影像",
|
||||
@@ -138,10 +157,10 @@
|
||||
"administrator": "管理員",
|
||||
"allowCommands": "執行命令",
|
||||
"allowEdit": "編輯、重命名或刪除檔案/目錄",
|
||||
"allowNew": "創建新檔案和目錄",
|
||||
"allowNew": "建立新檔案和目錄",
|
||||
"allowPublish": "發佈新的貼文與頁面",
|
||||
"allowSignup": "允許使用者註冊",
|
||||
"avoidChanges": "(留空以避免更改)",
|
||||
"avoidChanges": "(留空以避免更改)",
|
||||
"branding": "品牌",
|
||||
"brandingDirectoryPath": "品牌資訊資料夾路徑",
|
||||
"brandingHelp": "您可以通過改變例項名稱,更換Logo,加入自定義樣式,甚至禁用到Github的外部連結來自定義File Browser的外觀和給人的感覺。\n想獲得更多資訊,請檢視 {0} 。",
|
||||
@@ -150,17 +169,24 @@
|
||||
"commandRunnerHelp": "在這裡你可以設定在下面的事件中執行的命令。每行必須寫一條命令。可以在命令中使用環境變數 {0} 和 {1}。關於此功能和可用環境變數的更多資訊,請閱讀{2}.",
|
||||
"commandsUpdated": "命令已更新!",
|
||||
"createUserDir": "在新增新使用者的同時自動建立使用者的個人目錄",
|
||||
"customStylesheet": "自定義樣式表",
|
||||
"tusUploads": "分塊上傳",
|
||||
"tusUploadsHelp": "File Browser 支援分塊上傳,在不佳的網絡環境下也可進行高效、可靠、可續的檔案上傳",
|
||||
"tusUploadsChunkSize": "分塊上傳大小,例如 10MB 或 1GB",
|
||||
"tusUploadsRetryCount": "分塊上傳失敗時的重試次數",
|
||||
"userHomeBasePath": "使用者主目錄的路徑",
|
||||
"userScopeGenerationPlaceholder": "自動生成目錄範圍",
|
||||
"createUserHomeDirectory": "建立使用者主目錄",
|
||||
"customStylesheet": "自定義樣式表(CSS)",
|
||||
"defaultUserDescription": "這些是新使用者的預設設定。",
|
||||
"disableExternalLinks": "禁止外部連結(幫助文件除外)",
|
||||
"disableUsedDiskPercentage": "Disable used disk percentage graph",
|
||||
"disableUsedDiskPercentage": "停用已使用磁碟空間百分比圖",
|
||||
"documentation": "幫助文件",
|
||||
"examples": "範例",
|
||||
"executeOnShell": "在Shell中執行",
|
||||
"executeOnShellDescription": "預設情況下,File Browser通過直接呼叫命令的二進位制包來執行命令,如果想在shell中執行(如Bash、PowerShell),你可以在這裡定義所使用的shell和參數。如果設定了這個選項,所執行的命令會作為參數追加在後面。本選項對使用者命令和事件鉤子都生效。",
|
||||
"globalRules": "這是全局允許與禁止規則。它們作用於所有使用者。您可以給每個使用者定義單獨的特殊規則來覆蓋全局規則。",
|
||||
"globalSettings": "全域設定",
|
||||
"hideDotfiles": "",
|
||||
"hideDotfiles": "隱藏隱藏檔案",
|
||||
"insertPath": "插入路徑",
|
||||
"insertRegex": "插入正規表示式",
|
||||
"instanceName": "例項名稱",
|
||||
@@ -171,7 +197,7 @@
|
||||
"newUser": "建立使用者",
|
||||
"password": "密碼",
|
||||
"passwordUpdated": "密碼已更新!",
|
||||
"path": "",
|
||||
"path": "路徑",
|
||||
"perm": {
|
||||
"create": "建立檔案和資料夾",
|
||||
"delete": "刪除檔案和資料夾",
|
||||
@@ -189,18 +215,21 @@
|
||||
"rules": "規則",
|
||||
"rulesHelp": "您可以為該使用者製定一組黑名單或白名單式的規則,被屏蔽的檔案將不會顯示在清單中,使用者也無權限存取,支持相對於目錄範圍的路徑。",
|
||||
"scope": "目錄範圍",
|
||||
"setDateFormat": "顯示精確的日期格式",
|
||||
"settingsUpdated": "設定已更新!",
|
||||
"shareDuration": "",
|
||||
"shareManagement": "",
|
||||
"singleClick": "",
|
||||
"shareDuration": "分享期限",
|
||||
"shareManagement": "分享管理",
|
||||
"shareDeleted": "分享已刪除!",
|
||||
"singleClick": "使用單擊開啟檔案和目錄",
|
||||
"themes": {
|
||||
"default": "系統預設",
|
||||
"dark": "深色",
|
||||
"light": "淺色",
|
||||
"title": "主題"
|
||||
},
|
||||
"user": "使用者",
|
||||
"userCommands": "使用者命令",
|
||||
"userCommandsHelp": "指定該使用者可以執行的命令,用空格分隔。例如:",
|
||||
"userCommands": "使用者命令(Shell 命令)",
|
||||
"userCommandsHelp": "指定該使用者可以執行的命令(Shell 命令),用空格分隔。例如:",
|
||||
"userCreated": "使用者已建立!",
|
||||
"userDefaults": "使用者預設選項",
|
||||
"userDeleted": "使用者已刪除!",
|
||||
@@ -211,7 +240,7 @@
|
||||
},
|
||||
"sidebar": {
|
||||
"help": "幫助",
|
||||
"hugoNew": "Hugo New",
|
||||
"hugoNew": "Hugo 新建",
|
||||
"login": "登入",
|
||||
"logout": "登出",
|
||||
"myFiles": "我的檔案",
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user