Compare commits

...

40 Commits

Author SHA1 Message Date
Oleg Lobanov
0e3b35b30e chore(release): 2.28.0 2024-04-01 16:22:00 +02:00
dependabot[bot]
05bfae264a build(deps): bump google.golang.org/protobuf from 1.31.0 to 1.33.0 (#3045)
Bumps google.golang.org/protobuf from 1.31.0 to 1.33.0.

---
updated-dependencies:
- dependency-name: google.golang.org/protobuf
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-17 21:58:00 +01:00
niubility000
4c233c3db3 feat: enable preview in shared folder (#3055) 2024-03-17 21:53:33 +01:00
dependabot[bot]
7797a4ef18 build(deps): bump google.golang.org/protobuf in /tools (#3044)
Bumps google.golang.org/protobuf from 1.28.0 to 1.33.0.

---
updated-dependencies:
- dependency-name: google.golang.org/protobuf
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-03-14 11:36:17 +01:00
niubility000
d70650689c feat: auto hiding header bar in preview to enlarge the preview window (#3024) 2024-03-07 11:25:01 +01:00
niubility000
8dddc8a450 chore: show the current used filebrowser.db in cmd window (#3028) 2024-03-07 11:16:41 +01:00
niubility000
cdf8def330 fix: stay in the same position after renaming or deleting (#3039) 2024-03-07 11:14:40 +01:00
niubility000
e167c3e1ef feat: freezing the list in the backgroud while previewing a file (#3004) 2024-02-22 19:42:36 +01:00
ねらひかだ
fe5ca74aa1 fix: fix lint warnings (#2976) 2024-02-09 11:05:35 +01:00
ねらひかだ
dfad87386f chore: update github action versions (#2977) 2024-02-09 11:05:09 +01:00
Shlomo
6d7ba65faf fix: shell direction (#2980) 2024-02-09 11:04:02 +01:00
Feriman
d5487ba6fa chore: add noindex (#2981) 2024-02-09 11:03:06 +01:00
zoui
34a08170c8 fix: editor discard prompt (#2990) 2024-02-09 11:01:41 +01:00
Shlomo
d49c3dfacf feat: select multiple files with ctrl even with singleClick option (#2953) 2024-01-30 10:49:35 +01:00
Shlomo
2cfee2183c fix: dashboard buttons position in rtl layout (#2949) 2024-01-30 10:48:32 +01:00
Shlomo
fb1a09c7c1 feat: prompt to confirm discard editor changes (#2948)
* chore: update he.json

* feat: prompt to confirm discard editor changes

---------

Co-authored-by: Oleg Lobanov <oleg@lobanov.me>
2024-01-30 10:48:03 +01:00
Shlomo
b19710efca feat: focus editor when opened (#2946) 2024-01-30 10:44:20 +01:00
Shlomo
ff9502ff34 fix: keyboard shortcut to confirm prompts (#2932) 2024-01-30 10:44:00 +01:00
Shlomo
62f0dfb302 chore: update he.json (#2933) 2024-01-30 10:37:47 +01:00
Quentin McGaw
81cd8fc6d3 fix(healthcheck): use address configured if not empty (#2938) 2024-01-30 10:37:17 +01:00
Shlomo
70c826133b feat: close editor when click escape key (#2947) 2024-01-30 10:29:37 +01:00
Shlomo
2f6c473977 chore: update pull request template (#2950) 2024-01-30 10:23:41 +01:00
dependabot[bot]
bf36cc00f1 build(deps-dev): bump vite from 4.4.12 to 4.5.2 in /frontend (#2951)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.4.12 to 4.5.2.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.5.2/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.5.2/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2024-01-30 10:22:48 +01:00
Shlomo
883383a571 fix: moment locale (#2952) 2024-01-30 10:16:32 +01:00
ねらひかだ
0a05f8c01f chore(i18n): improvement of Japanese translation (#2962) 2024-01-30 10:15:27 +01:00
ねらひかだ
a4b089a6db feat: allow to configure if home directory is automatically created from cli (#2963) 2024-01-30 10:14:50 +01:00
ねらひかだ
5c5ab6b875 fix: files and directories are created with the correct permissions (#2966) 2024-01-30 10:12:38 +01:00
Oleg Lobanov
04e03a83b4 chore(release): 2.27.0 2024-01-02 18:29:29 +04:00
Yogesh
c4e955acf4 fix: typo in build error #2903 (#2904) 2023-12-31 14:32:54 +01:00
People-11
fc04578e28 Update zh-cn.json (#2875) 2023-12-28 10:30:52 +01:00
Shlomo
3264cea830 fix: delete message when delete file from preview 2023-12-28 10:11:53 +01:00
Yarden Shoham
748af7172c feat: allow setting theme via cli (#2881) 2023-12-28 09:52:40 +01:00
Shlomo
da595326ee chore: update he.json (#2877) 2023-12-28 09:44:58 +01:00
dependabot[bot]
821fba41a2 build(deps): bump golang.org/x/crypto from 0.14.0 to 0.17.0 (#2890)
Bumps [golang.org/x/crypto](https://github.com/golang/crypto) from 0.14.0 to 0.17.0.
- [Commits](https://github.com/golang/crypto/compare/v0.14.0...v0.17.0)

---
updated-dependencies:
- dependency-name: golang.org/x/crypto
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-28 09:44:24 +01:00
Omar Hussein
cfafefa35a chore: update Arabic and English translations (#2823) 2023-12-06 11:21:04 +01:00
Fritz Lin
391a078cd4 feat: make user session timeout configurable by flags (#2845) 2023-12-06 11:19:30 +01:00
dependabot[bot]
fc2ee37353 build(deps-dev): bump vite from 4.4.9 to 4.4.12 in /frontend (#2862)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 4.4.9 to 4.4.12.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/v4.4.12/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v4.4.12/packages/vite)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2023-12-06 11:09:33 +01:00
M A E R Y O
a09dfa8d9f feat: display image resolutions in file details (#2830)
---------

Co-authored-by: MAERYO <maeryo@hanwha.com>
2023-11-25 13:35:00 +01:00
ねらひかだ
4dbc802972 fix: fix typo (#2843) 2023-11-25 13:29:43 +01:00
Emmanuel Frecon
d59ad594b8 fix: set correct port in docker healthcheck (#2812)
When the `FB_PORT` environment variable is set, respect its value. Otherwise, pick the port from the configuration.
2023-11-08 17:59:46 +01:00
45 changed files with 885 additions and 465 deletions

View File

@@ -4,12 +4,11 @@ Please explain the changes you made here.
If the feature changes current behaviour, explain why your solution is better.
-->
:rotating_light: Before submitting your PR, please read [community](https://github.com/filebrowser/community), and indicate which issues (in any of the repos) are either fixed or closed by this PR. See [GitHub Help: Closing issues using keywords](https://help.github.com/articles/closing-issues-via-commit-messages/).
:rotating_light: Before submitting your PR, please indicate which issues are either fixed or closed by this PR. See [GitHub Help: Closing issues using keywords](https://help.github.com/articles/closing-issues-via-commit-messages/).
- [ ] DO make sure you are requesting to **pull a topic/feature/bugfix branch** (right side). Don't request your master!
- [ ] DO make sure you are making a pull request against the **master branch** (left side). Also you should start *your branch* off *our master*.
- [ ] DO make sure that File Browser can be successfully built. See [builds](https://github.com/filebrowser/community/blob/master/builds.md) and [development](https://github.com/filebrowser/community/blob/master/development.md).
- [ ] DO make sure that related issues are opened in other repositories. I.e., the frontend, caddy plugins or the web page need to be updated accordingly.
- [ ] AVOID breaking the continuous integration build.
**Further comments**

View File

@@ -13,26 +13,26 @@ jobs:
lint-frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: make lint-frontend
lint-backend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: 1.21.0
- run: make lint-backend
lint-commits:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: make lint-commits
@@ -46,16 +46,16 @@ jobs:
test-frontend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-node@v2
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: '18'
- run: make test-frontend
test-backend:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- uses: actions/setup-go@v2
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
with:
go-version: 1.21.0
- run: make test-backend
@@ -71,13 +71,13 @@ jobs:
needs: [lint, test]
if: startsWith(github.event.ref, 'refs/tags/v')
steps:
- uses: actions/checkout@v2
- uses: actions/checkout@v4
with:
fetch-depth: 0
- uses: actions/setup-go@v2
- uses: actions/setup-go@v5
with:
go-version: 1.21.0
- uses: actions/setup-node@v2
- uses: actions/setup-node@v4
with:
node-version: '18'
- name: Set up QEMU

View File

@@ -2,6 +2,63 @@
All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines.
## [2.28.0](https://github.com/filebrowser/filebrowser/compare/v2.27.0...v2.28.0) (2024-04-01)
### Features
* allow to configure if home directory is automatically created from cli ([#2963](https://github.com/filebrowser/filebrowser/issues/2963)) ([a4b089a](https://github.com/filebrowser/filebrowser/commit/a4b089a6dbf9821ecede428cd7d13e69c8b85231))
* auto hiding header bar in preview to enlarge the preview window ([#3024](https://github.com/filebrowser/filebrowser/issues/3024)) ([d706506](https://github.com/filebrowser/filebrowser/commit/d70650689c34ce9f631fda6a453fd521faef22fa))
* close editor when click escape key ([#2947](https://github.com/filebrowser/filebrowser/issues/2947)) ([70c8261](https://github.com/filebrowser/filebrowser/commit/70c826133b8578b8712e6db8f762a15a076cd9a9))
* enable preview in shared folder ([#3055](https://github.com/filebrowser/filebrowser/issues/3055)) ([4c233c3](https://github.com/filebrowser/filebrowser/commit/4c233c3db39ea5a00d6e602ec0ecbddecb590877))
* focus editor when opened ([#2946](https://github.com/filebrowser/filebrowser/issues/2946)) ([b19710e](https://github.com/filebrowser/filebrowser/commit/b19710efca6daa7af56dc211d0051d500d2eea22))
* freezing the list in the backgroud while previewing a file ([#3004](https://github.com/filebrowser/filebrowser/issues/3004)) ([e167c3e](https://github.com/filebrowser/filebrowser/commit/e167c3e1efed8b16be45d994a8d443fda1d8cf49))
* prompt to confirm discard editor changes ([#2948](https://github.com/filebrowser/filebrowser/issues/2948)) ([fb1a09c](https://github.com/filebrowser/filebrowser/commit/fb1a09c7c172b913c12b30975ca545e505df0c05))
* select multiple files with ctrl even with singleClick option ([#2953](https://github.com/filebrowser/filebrowser/issues/2953)) ([d49c3df](https://github.com/filebrowser/filebrowser/commit/d49c3dfacfc0ff07e620b3ad2700e64927b06235))
### Bug Fixes
* dashboard buttons position in rtl layout ([#2949](https://github.com/filebrowser/filebrowser/issues/2949)) ([2cfee21](https://github.com/filebrowser/filebrowser/commit/2cfee2183c98d0cb67fc4e9788644ed4278e25bc))
* editor discard prompt ([#2990](https://github.com/filebrowser/filebrowser/issues/2990)) ([34a0817](https://github.com/filebrowser/filebrowser/commit/34a08170c894321d49bb843e259a0e59e2245998))
* files and directories are created with the correct permissions ([#2966](https://github.com/filebrowser/filebrowser/issues/2966)) ([5c5ab6b](https://github.com/filebrowser/filebrowser/commit/5c5ab6b8750a5168f0ae2a26bd5de41e0b6d9637))
* fix lint warnings ([#2976](https://github.com/filebrowser/filebrowser/issues/2976)) ([fe5ca74](https://github.com/filebrowser/filebrowser/commit/fe5ca74aa1e4257e5cb36f1de58daa0c3548319f))
* **healthcheck:** use address configured if not empty ([#2938](https://github.com/filebrowser/filebrowser/issues/2938)) ([81cd8fc](https://github.com/filebrowser/filebrowser/commit/81cd8fc6d307b00af278beefcdbad4158a128fea))
* keyboard shortcut to confirm prompts ([#2932](https://github.com/filebrowser/filebrowser/issues/2932)) ([ff9502f](https://github.com/filebrowser/filebrowser/commit/ff9502ff34790c46f31d175911cd51c9b62804fb))
* moment locale ([#2952](https://github.com/filebrowser/filebrowser/issues/2952)) ([883383a](https://github.com/filebrowser/filebrowser/commit/883383a5715d82883c51138dfb547805dfad2a3c))
* shell direction ([#2980](https://github.com/filebrowser/filebrowser/issues/2980)) ([6d7ba65](https://github.com/filebrowser/filebrowser/commit/6d7ba65faf576ee4ed095f3d0c41775b21e498de))
* stay in the same position after renaming or deleting ([#3039](https://github.com/filebrowser/filebrowser/issues/3039)) ([cdf8def](https://github.com/filebrowser/filebrowser/commit/cdf8def3304315bef261da7f52f8599d90b1f0f0))
### Build
* **deps-dev:** bump vite from 4.4.12 to 4.5.2 in /frontend ([#2951](https://github.com/filebrowser/filebrowser/issues/2951)) ([bf36cc0](https://github.com/filebrowser/filebrowser/commit/bf36cc00f1369dd10a422f230ccabcbeefae1517))
* **deps:** bump google.golang.org/protobuf from 1.31.0 to 1.33.0 ([#3045](https://github.com/filebrowser/filebrowser/issues/3045)) ([05bfae2](https://github.com/filebrowser/filebrowser/commit/05bfae264a7a477d1b7db582f06f4efb24d26ec9))
* **deps:** bump google.golang.org/protobuf in /tools ([#3044](https://github.com/filebrowser/filebrowser/issues/3044)) ([7797a4e](https://github.com/filebrowser/filebrowser/commit/7797a4ef18038a877df31bd34f2ebf70d18823f8))
## [2.27.0](https://github.com/filebrowser/filebrowser/compare/v2.26.0...v2.27.0) (2024-01-02)
### Features
* allow setting theme via cli ([#2881](https://github.com/filebrowser/filebrowser/issues/2881)) ([748af71](https://github.com/filebrowser/filebrowser/commit/748af7172ce96f0b66c394e88839bd57c194ffc7))
* display image resolutions in file details ([#2830](https://github.com/filebrowser/filebrowser/issues/2830)) ([a09dfa8](https://github.com/filebrowser/filebrowser/commit/a09dfa8d9f190243d811a841de44c4abb4403d87))
* make user session timeout configurable by flags ([#2845](https://github.com/filebrowser/filebrowser/issues/2845)) ([391a078](https://github.com/filebrowser/filebrowser/commit/391a078cd486e618c95a0c5850326076cbc025b6))
### Bug Fixes
* delete message when delete file from preview ([3264cea](https://github.com/filebrowser/filebrowser/commit/3264cea8307dca9ab5463dc81f2a10a817eb3d54))
* fix typo ([#2843](https://github.com/filebrowser/filebrowser/issues/2843)) ([4dbc802](https://github.com/filebrowser/filebrowser/commit/4dbc802972c930f5f42fc27507fac35c28c42afd))
* set correct port in docker healthcheck ([#2812](https://github.com/filebrowser/filebrowser/issues/2812)) ([d59ad59](https://github.com/filebrowser/filebrowser/commit/d59ad594b8649f57f61453b0dfbc350c57b690a2))
* typo in build error [#2903](https://github.com/filebrowser/filebrowser/issues/2903) ([#2904](https://github.com/filebrowser/filebrowser/issues/2904)) ([c4e955a](https://github.com/filebrowser/filebrowser/commit/c4e955acf4a1a8f8e8e94f697ffc838515e69a60))
### Build
* **deps-dev:** bump vite from 4.4.9 to 4.4.12 in /frontend ([#2862](https://github.com/filebrowser/filebrowser/issues/2862)) ([fc2ee37](https://github.com/filebrowser/filebrowser/commit/fc2ee373536584d024f7def62f350bdbb712d927))
* **deps:** bump golang.org/x/crypto from 0.14.0 to 0.17.0 ([#2890](https://github.com/filebrowser/filebrowser/issues/2890)) ([821fba4](https://github.com/filebrowser/filebrowser/commit/821fba41a25ba99d47641f01b10ac51960157888))
## [2.26.0](https://github.com/filebrowser/filebrowser/compare/v2.25.0...v2.26.0) (2023-11-02)

View File

@@ -31,6 +31,7 @@ func addConfigFlags(flags *pflag.FlagSet) {
addServerFlags(flags)
addUserFlags(flags)
flags.BoolP("signup", "s", false, "allow users to signup")
flags.Bool("create-user-dir", false, "generate user's home directory automatically")
flags.String("shell", "", "shell command to which other commands should be appended")
flags.String("auth.method", string(auth.MethodJSONAuth), "authentication type")
@@ -42,6 +43,7 @@ func addConfigFlags(flags *pflag.FlagSet) {
flags.String("recaptcha.secret", "", "ReCaptcha secret")
flags.String("branding.name", "", "replace 'File Browser' by this name")
flags.String("branding.theme", "", "set the theme")
flags.String("branding.color", "", "set the theme color")
flags.String("branding.files", "", "path to directory with images and custom styles")
flags.Bool("branding.disableExternal", false, "disable external links such as GitHub links")
@@ -150,6 +152,7 @@ func printSettings(ser *settings.Server, set *settings.Settings, auther auth.Aut
fmt.Fprintf(w, "\tDisable external links:\t%t\n", set.Branding.DisableExternal)
fmt.Fprintf(w, "\tDisable used disk percentage graph:\t%t\n", set.Branding.DisableUsedPercentage)
fmt.Fprintf(w, "\tColor:\t%s\n", set.Branding.Color)
fmt.Fprintf(w, "\tTheme:\t%s\n", set.Branding.Theme)
fmt.Fprintln(w, "\nServer:")
fmt.Fprintf(w, "\tLog:\t%s\n", ser.Log)
fmt.Fprintf(w, "\tPort:\t%s\n", ser.Port)

View File

@@ -29,15 +29,17 @@ override the options.`,
authMethod, auther := getAuthentication(flags)
s := &settings.Settings{
Key: generateKey(),
Signup: mustGetBool(flags, "signup"),
Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")),
AuthMethod: authMethod,
Defaults: defaults,
Key: generateKey(),
Signup: mustGetBool(flags, "signup"),
CreateUserDir: mustGetBool(flags, "create-user-dir"),
Shell: convertCmdStrToCmdArray(mustGetString(flags, "shell")),
AuthMethod: authMethod,
Defaults: defaults,
Branding: settings.Branding{
Name: mustGetString(flags, "branding.name"),
DisableExternal: mustGetBool(flags, "branding.disableExternal"),
DisableUsedPercentage: mustGetBool(flags, "branding.disableUsedPercentage"),
Theme: mustGetString(flags, "branding.theme"),
Files: mustGetString(flags, "branding.files"),
},
}

View File

@@ -49,10 +49,14 @@ you want to change. Other options will remain unchanged.`,
hasAuth = true
case "shell":
set.Shell = convertCmdStrToCmdArray(mustGetString(flags, flag.Name))
case "create-user-dir":
set.CreateUserDir = mustGetBool(flags, flag.Name)
case "branding.name":
set.Branding.Name = mustGetString(flags, flag.Name)
case "branding.color":
set.Branding.Color = mustGetString(flags, flag.Name)
case "branding.theme":
set.Branding.Theme = mustGetString(flags, flag.Name)
case "branding.disableExternal":
set.Branding.DisableExternal = mustGetBool(flags, flag.Name)
case "branding.disableUsedPercentage":

View File

@@ -64,6 +64,7 @@ func addServerFlags(flags *pflag.FlagSet) {
flags.Uint32("socket-perm", 0666, "unix socket file permissions") //nolint:gomnd
flags.StringP("baseurl", "b", "", "base url")
flags.String("cache-dir", "", "file cache directory (disabled if empty)")
flags.String("token-expiration-time", "2h", "user session timeout")
flags.Int("img-processors", 4, "image processors count") //nolint:gomnd
flags.Bool("disable-thumbnails", false, "disable image thumbnails")
flags.Bool("disable-preview-resize", false, "disable resize of image previews")
@@ -261,6 +262,10 @@ func getRunParams(flags *pflag.FlagSet, st *storage.Storage) *settings.Server {
_, disableExec := getParamB(flags, "disable-exec")
server.EnableExec = !disableExec
if val, set := getParamB(flags, "token-expiration-time"); set {
server.TokenExpirationTime = val
}
return server
}

View File

@@ -87,16 +87,23 @@ func python(fn pythonFunc, cfg pythonConfig) cobraFunc {
data := pythonData{hadDB: true}
path := getParam(cmd.Flags(), "database")
absPath, err := filepath.Abs(path)
if err != nil {
panic(err)
}
exists, err := dbExists(path)
if err != nil {
panic(err)
} else if exists && cfg.noDB {
log.Fatal(path + " already exists")
log.Fatal(absPath + " already exists")
} else if !exists && !cfg.noDB && !cfg.allowNoDB {
log.Fatal(path + " does not exist. Please run 'filebrowser config init' first.")
log.Fatal(absPath + " does not exist. Please run 'filebrowser config init' first.")
} else if !exists && !cfg.noDB {
log.Println("Warning: filebrowser.db can't be found. Initialing in " + strings.TrimSuffix(absPath, "filebrowser.db"))
}
log.Println("Using database: " + absPath)
data.hadDB = exists
db, err := storm.Open(path)
checkErr(err)

View File

@@ -7,6 +7,7 @@ import (
"crypto/sha512"
"encoding/hex"
"hash"
"image"
"io"
"log"
"mime"
@@ -23,7 +24,7 @@ import (
"github.com/filebrowser/filebrowser/v2/rules"
)
const PermFile = 0664
const PermFile = 0644
const PermDir = 0755
// FileInfo describes a file.
@@ -44,6 +45,7 @@ type FileInfo struct {
Checksums map[string]string `json:"checksums,omitempty"`
Token string `json:"token,omitempty"`
currentDir []os.FileInfo `json:"-"`
Resolution *ImageResolution `json:"resolution,omitempty"`
}
// FileOptions are the options when getting a file info.
@@ -58,6 +60,11 @@ type FileOptions struct {
Content bool
}
type ImageResolution struct {
Width int `json:"width"`
Height int `json:"height"`
}
// NewFileInfo creates a File object from a path and a given user. This File
// object will be automatically filled depending on if it is a directory
// or a file. If it's a video file, it will also detect any subtitles.
@@ -236,6 +243,12 @@ func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error {
return nil
case strings.HasPrefix(mimetype, "image"):
i.Type = "image"
resolution, err := calculateImageResolution(i.Fs, i.Path)
if err != nil {
log.Printf("Error calculating image resolution: %v", err)
} else {
i.Resolution = resolution
}
return nil
case strings.HasSuffix(mimetype, "pdf"):
i.Type = "pdf"
@@ -264,6 +277,28 @@ func (i *FileInfo) detectType(modify, saveContent, readHeader bool) error {
return nil
}
func calculateImageResolution(fs afero.Fs, filePath string) (*ImageResolution, error) {
file, err := fs.Open(filePath)
if err != nil {
return nil, err
}
defer func() {
if cErr := file.Close(); cErr != nil {
log.Printf("Failed to close file: %v", cErr)
}
}()
config, _, err := image.DecodeConfig(file)
if err != nil {
return nil, err
}
return &ImageResolution{
Width: config.Width,
Height: config.Height,
}, nil
}
func (i *FileInfo) readFirstBytes() []byte {
reader, err := i.Fs.Open(i.Path)
if err != nil {
@@ -361,6 +396,15 @@ func (i *FileInfo) readListing(checker rules.Checker, readHeader bool) error {
currentDir: dir,
}
if !file.IsDir && strings.HasPrefix(mime.TypeByExtension(file.Extension), "image/") {
resolution, err := calculateImageResolution(file.Fs, file.Path)
if err != nil {
log.Printf("Error calculating resolution for image %s: %v", file.Path, err)
} else {
file.Resolution = resolution
}
}
if file.IsDir {
listing.NumDirs++
} else {

View File

@@ -7,6 +7,8 @@ import (
"path/filepath"
"github.com/spf13/afero"
"github.com/filebrowser/filebrowser/v2/files"
)
// MoveFile moves file from src to dst.
@@ -40,13 +42,13 @@ func CopyFile(fs afero.Fs, source, dest string) error {
// Makes the directory needed to create the dst
// file.
err = fs.MkdirAll(filepath.Dir(dest), 0666) //nolint:gomnd
err = fs.MkdirAll(filepath.Dir(dest), files.PermDir)
if err != nil {
return err
}
// Create the destination file.
dst, err := fs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) //nolint:gomnd
dst, err := fs.OpenFile(dest, os.O_RDWR|os.O_CREATE|os.O_TRUNC, files.PermFile)
if err != nil {
return err
}

View File

@@ -46,7 +46,7 @@
"postcss": "^8.4.31",
"prettier": "^3.0.1",
"terser": "^5.19.2",
"vite": "^4.4.9",
"vite": "^4.5.2",
"vite-plugin-compression2": "^0.10.3",
"vite-plugin-rewrite-all": "^1.0.1"
}
@@ -5663,9 +5663,9 @@
"dev": true
},
"node_modules/vite": {
"version": "4.4.9",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.4.9.tgz",
"integrity": "sha512-2mbUn2LlUmNASWwSCNSJ/EG2HuSRTnVNaydp6vMCm5VIqJsjMfbIWtbH2kDuwUVW5mMUKKZvGPX/rqeqVvv1XA==",
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/vite/-/vite-4.5.2.tgz",
"integrity": "sha512-tBCZBNSBbHQkaGyhGCDUGqeo2ph8Fstyp6FMSvTtsXeZSPpSMGlviAOav2hxVTqFcx8Hj/twtWKsMJXNY0xI8w==",
"dev": true,
"dependencies": {
"esbuild": "^0.18.10",

View File

@@ -52,7 +52,7 @@
"postcss": "^8.4.31",
"prettier": "^3.0.1",
"terser": "^5.19.2",
"vite": "^4.4.9",
"vite": "^4.5.2",
"vite-plugin-compression2": "^0.10.3",
"vite-plugin-rewrite-all": "^1.0.1"
},

View File

@@ -16,6 +16,8 @@
[{[ if .Name -]}][{[ .Name ]}][{[ else ]}]File Browser[{[ end ]}]
</title>
<meta name="robots" content="noindex,nofollow">
<link
rel="icon"
type="image/png"

View File

@@ -2,7 +2,7 @@
<div
class="shell"
:class="{ ['shell--hidden']: !showShell }"
:style="{ height: `${this.shellHeight}em` }"
:style="{ height: `${this.shellHeight}em`, direction: 'ltr' }"
>
<div
@pointerdown="startDrag()"

View File

@@ -38,7 +38,7 @@
import { enableThumbs } from "@/utils/constants";
import { mapMutations, mapGetters, mapState } from "vuex";
import { filesize } from "@/utils";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import { files as api } from "@/api";
import * as upload from "@/utils/upload";
@@ -191,7 +191,12 @@ export default {
action(overwrite, rename);
},
itemClick: function (event) {
if (this.singleClick && !this.$store.state.multiple) this.open();
if (
!(event.ctrlKey || event.metaKey) &&
this.singleClick &&
!this.$store.state.multiple
)
this.open();
else this.click(event);
},
click: function (event) {

View File

@@ -12,7 +12,7 @@
<div
class="card-action"
style="display: flex; align-items: center; justify-content: space-between;"
style="display: flex; align-items: center; justify-content: space-between"
>
<template v-if="user.perm.create">
<button
@@ -20,7 +20,7 @@
@click="$refs.fileList.createDir()"
:aria-label="$t('sidebar.newFolder')"
:title="$t('sidebar.newFolder')"
style="justify-self: left;"
style="justify-self: left"
>
<span>{{ $t("sidebar.newFolder") }}</span>
</button>

View File

@@ -1,7 +1,7 @@
<template>
<div class="card floating">
<div class="card-content">
<p v-if="selectedCount === 1">
<p v-if="!this.isListing || selectedCount === 1">
{{ $t("prompts.deleteMessageSingle") }}
</p>
<p v-else>
@@ -45,6 +45,7 @@ export default {
submit: async function () {
buttons.loading("delete");
window.sessionStorage.setItem("modified", "true");
try {
if (!this.isListing) {
await api.remove(this.$route.path);

View File

@@ -0,0 +1,45 @@
<template>
<div class="card floating">
<div class="card-content">
<p>
{{ $t("prompts.discardEditorChanges") }}
</p>
</div>
<div class="card-action">
<button
@click="$store.commit('closeHovers')"
class="button button--flat button--grey"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')"
>
{{ $t("buttons.cancel") }}
</button>
<button
@click="submit"
class="button button--flat button--red"
:aria-label="$t('buttons.discardChanges')"
:title="$t('buttons.discardChanges')"
>
{{ $t("buttons.discardChanges") }}
</button>
</div>
</div>
</template>
<script>
import { mapMutations } from "vuex";
import url from "@/utils/url";
export default {
name: "discardEditorChanges",
methods: {
...mapMutations(["closeHovers"]),
submit: async function () {
this.$store.commit("updateRequest", {});
let uri = url.removeLastDir(this.$route.path) + "/";
this.$router.push({ path: uri });
},
},
};
</script>

View File

@@ -12,10 +12,17 @@
<p class="break-word" v-if="selected.length < 2">
<strong>{{ $t("prompts.displayName") }}</strong> {{ name }}
</p>
<p v-if="!dir || selected.length > 1">
<strong>{{ $t("prompts.size") }}:</strong>
<span id="content_length"></span> {{ humanSize }}
</p>
<div v-if="resolution">
<strong>{{ $t("prompts.resolution") }}:</strong>
{{ resolution.width }} x {{ resolution.height }}
</div>
<p v-if="selected.length < 2" :title="modTime">
<strong>{{ $t("prompts.lastModified") }}:</strong> {{ humanTime }}
</p>
@@ -82,7 +89,7 @@
<script>
import { mapState, mapGetters } from "vuex";
import { filesize } from "@/utils";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import { files as api } from "@/api";
export default {
@@ -126,6 +133,17 @@ export default {
: this.req.items[this.selected[0]].isDir)
);
},
resolution: function () {
if (this.selectedCount === 1) {
const selectedItem = this.req.items[this.selected[0]];
if (selectedItem && selectedItem.type === "image") {
return selectedItem.resolution;
}
} else if (this.req && this.req.type === "image") {
return this.req.resolution;
}
return null;
},
},
methods: {
checksum: async function (event, algo) {

View File

@@ -11,7 +11,7 @@
<div
class="card-action"
style="display: flex; align-items: center; justify-content: space-between;"
style="display: flex; align-items: center; justify-content: space-between"
>
<template v-if="user.perm.create">
<button
@@ -19,7 +19,7 @@
@click="$refs.fileList.createDir()"
:aria-label="$t('sidebar.newFolder')"
:title="$t('sidebar.newFolder')"
style="justify-self: left;"
style="justify-self: left"
>
<span>{{ $t("sidebar.newFolder") }}</span>
</button>

View File

@@ -27,6 +27,7 @@ import Share from "./Share.vue";
import Upload from "./Upload.vue";
import ShareDelete from "./ShareDelete.vue";
import Sidebar from "../Sidebar.vue";
import DiscardEditorChanges from "./DiscardEditorChanges.vue";
import { mapGetters, mapState } from "vuex";
import buttons from "@/utils/buttons";
@@ -47,7 +48,8 @@ export default {
ReplaceRename,
Upload,
ShareDelete,
Sidebar
Sidebar,
DiscardEditorChanges,
},
data: function () {
return {
@@ -62,17 +64,16 @@ export default {
window.addEventListener("keydown", (event) => {
if (this.currentPrompt == null) return;
let prompt = this.$refs.currentComponent;
const promptName = this.currentPrompt.prompt;
const prompt = this.$refs[promptName];
// Esc!
if (event.keyCode === 27) {
if (event.code === "Escape") {
event.stopImmediatePropagation();
this.$store.commit("closeHovers");
}
// Enter
if (event.keyCode == 13) {
switch (this.currentPrompt.prompt) {
if (event.code === "Enter") {
switch (promptName) {
case "delete":
prompt.submit();
break;

View File

@@ -88,6 +88,7 @@ export default {
newLink =
url.removeLastDir(oldLink) + "/" + encodeURIComponent(this.name);
window.sessionStorage.setItem("modified", "true");
try {
await api.move([{ from: oldLink, to: newLink }]);
if (!this.isListing) {

View File

@@ -128,7 +128,7 @@
<script>
import { mapState, mapGetters } from "vuex";
import { share as api, pub as pub_api } from "@/api";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import Clipboard from "clipboard";
export default {

View File

@@ -220,6 +220,10 @@ body.rtl .card .card-title>*:first-child {
text-align: right;
}
body.rtl .card .card-action {
text-align: left;
}
.card .card-content.full {
padding-bottom: 0;
overflow: auto;

View File

@@ -2,10 +2,6 @@
nav {
width: 10em
}
/* Mobile Only fix div hidden by bottom navigation bar of mobile browser when using height: 100vh */
#previewer .preview {
height: calc(100% - 4em) !important;
}
}
@media (max-width: 1024px) {

View File

@@ -152,8 +152,7 @@ main .spinner .bounce2 {
/* PREVIEWER */
#previewer {
background-color: rgba(0, 0, 0, 0.9);
padding-top: 4em;
background-color: rgba(0, 0, 0, 0.99);
position: fixed;
top: 0;
left: 0;
@@ -166,15 +165,25 @@ main .spinner .bounce2 {
#previewer header {
background: none;
color: #fff;
border-bottom: 0px;
box-shadow: 0px 0px 0px;
z-index: 19999;
}
#previewer header > .action i {
color: #fff;
text-shadow: 1px 1px 1px #000000;
}
#previewer header > title {
white-space: nowrap;
text-shadow: 1px 1px 1px #000000;
}
@media (min-width: 738px) {
#previewer header #dropdown .action i {
color: #fff;
text-shadow: 1px 1px 1px #000000;
}
}
@@ -188,7 +197,7 @@ main .spinner .bounce2 {
#previewer .preview {
text-align: center;
height: calc(100vh - 4em);
height: 100%;
}
#previewer .preview pre {
@@ -203,6 +212,12 @@ main .spinner .bounce2 {
margin: 0;
}
#previewer .preview audio {
width: 95%;
height: 88%;
}
#previewer .preview video {
height: 100%;
}
@@ -247,7 +262,7 @@ main .spinner .bounce2 {
#previewer > button {
margin: 0;
position: fixed;
top: calc(50% + 1.85em);
top: 50%;
transform: translateY(-50%);
background-color: rgba(80, 80, 80, 0.5);
color: white;

View File

@@ -5,10 +5,13 @@
"copy": "نسخ",
"copyFile": "نسخ الملف",
"copyToClipboard": "نسخ الى الحافظة",
"copyDownloadLinkToClipboard": "نسخ رابط التحميل الى الحافظة",
"create": "إنشاء",
"delete": "حذف",
"download": "تحميل",
"hideDotfiles": "",
"file": "ملف",
"folder": "مجلد",
"hideDotfiles": "إخفاء ملفات النقطة",
"info": "معلومات",
"more": "المزيد",
"move": "نقل",
@@ -16,7 +19,7 @@
"new": "جديد",
"next": "التالي",
"ok": "موافق",
"permalink": "الحصول على لنك دائم",
"permalink": "الحصول على رابط دائم",
"previous": "السابق",
"publish": "نشر",
"rename": "إعادة تسمية",
@@ -28,21 +31,28 @@
"select": "تحديد",
"selectMultiple": "تحديد متعدد",
"share": "مشاركة",
"shell": "Toggle shell",
"shell": "تفعيل/إغلاق واجهة اﻷوامر (shell)",
"submit": "تسليم",
"switchView": "تغيير العرض",
"toggleSidebar": "تبديل الشريط الجانبي",
"update": "تحديث",
"upload": "رفع"
"upload": "رفع",
"openFile": "فتح الملف",
"continue": "متابعة"
},
"download": {
"downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": ""
"downloadFile": "تحميل الملف",
"downloadFolder": "تحميل المجلد",
"downloadSelected": "تحميل الملفات المحددة"
},
"upload": {
"abortUpload": "هل تريد بالتاكيد إلغاء الرفع؟"
},
"errors": {
"forbidden": "You don't have permissions to access this.",
"forbidden": "ليست لديك الصلاحيات للوصول لهذا المحتوى.",
"internal": "لقد حدث خطأ ما.",
"notFound": "لا يمكن الوصول لهذا المحتوى."
"notFound": "لا يمكن الوصول لهذا المحتوى.",
"connection": "لا يمكن اﻹتصال بالخادم."
},
"files": {
"body": "الصفحة",
@@ -50,17 +60,18 @@
"closePreview": "إغلاق العرض",
"files": "الملفات",
"folders": "المجلدات",
"home": "الصفحة الاولى",
"home": "الصفحة الرئيسية",
"lastModified": "آخر تعديل",
"loading": "جاري التحميل...",
"lonely": "تبدو وحيدا هنا...",
"metadata": "بيانات تعريفية",
"metadata": "بيانات وصفية",
"multipleSelectionEnabled": "التحديد المتعدد مفعل",
"name": "الإسم",
"name": "اسم",
"size": "الحجم",
"sortByLastModified": "الترتيب بآخر تعديل",
"sortByName": "الترتيب بالإسم",
"sortBySize": "الترتيب بالحجم"
"sortByName": "الترتيب باسم",
"sortBySize": "الترتيب بالحجم",
"noPreview": "لا يوجد عرض مسبق لهذا الملف."
},
"help": {
"click": "حدد الملف أو المجلد",
@@ -71,7 +82,7 @@
},
"del": "حذف البيانات المحددة",
"doubleClick": "فتح المجلد او الملف",
"esc": "مسح التحديد وإغلاق النافذة المنبثقة",
"esc": "مسح التحديد و إغلاق النافذة المنبثقة",
"f1": "هذه المعلومات",
"f2": "إعادة تسمية الملف",
"help": "مساعدة"
@@ -81,47 +92,49 @@
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "",
"tr" : "Türkçe",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"ua": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"createAnAccount": "إنشاء حساب جديد",
"loginInstead": "هل لديك حساب",
"password": "كلمة المرور",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match",
"signup": "Signup",
"passwordConfirm": "تأكيد كلمة المرور",
"passwordsDontMatch": "كلمة المرور غير متطابقة",
"signup": "إشترك",
"submit": "تسجيل دخول",
"username": "إسم المستخدم",
"usernameTaken": "Username already taken",
"usernameTaken": "إسم المستخدم غير متاح",
"wrongCredentials": "بيانات دخول خاطئة"
},
"permanent": "دائم",
"prompts": {
"copy": "نسخ",
"copyMessage": "رجاء حدد المكان لنسخ ملفاتك فيه:",
"currentlyNavigating": "يتم الإنتقال حاليا إلى:",
"copyMessage": "حدد المكان لنسخ ملفاتك فيه:",
"currentlyNavigating": "يتم انتقال حاليا إلى:",
"deleteMessageMultiple": "هل تريد بالتأكيد حذف {count} ملف؟",
"deleteMessageSingle": "هل تريد بالتأكيد حذف هذا الملف/المجلد؟",
"deleteMessageShare": "هل تريد بالتأكيد إلغاء مشاركة هذا الملف/المجلد ({path})؟",
"deleteTitle": "حذف الملفات",
"displayName": "الإسم:",
"displayName": "عرض اﻹسم:",
"download": "تحميل الملفات",
"downloadMessage": "حدد إمتداد الملف المراد تحميله.",
"error": "لقد حدث خطأ ما",
@@ -130,81 +143,90 @@
"lastModified": "آخر تعديل",
"move": "نقل",
"moveMessage": "إختر مكان جديد للملفات أو المجلدات المراد نقلها:",
"newArchetype": "إنشاء منشور من المنشور الأصلي. الملف سيتم انشاءه في مجلد المحتويات.",
"newArchetype": "إنشاء منشور من المنشور اصلي. الملف سيتم انشاءه في مجلد المحتويات.",
"newDir": "مجلد جديد",
"newDirMessage": "رجاء أدخل اسم المجلد الجديد.",
"newDirMessage": "أدخل اسم المجلد الجديد.",
"newFile": "ملف جديد",
"newFileMessage": "رجاء ادخل اسم الملف الجديد.",
"newFileMessage": "ادخل اسم الملف الجديد.",
"numberDirs": "عدد المجلدات",
"numberFiles": "عدد الملفات",
"rename": "إعادة تسمية",
"renameMessage": "إدراج اسم جديد لـ",
"replace": "إستبدال",
"replaceMessage": "أحد الملفات التي تحاول رفعها يتعارض مع ملف موجود بنفس الإسم. هل تريد إستبدال الملف الموجود؟\n",
"replaceMessage": "أحد الملفات التي تحاول رفعها يتعارض مع ملف موجود بنفس اسم. هل المتابعة مع تخطي هذا الملف ام تريد إستبدال الملف الموجود؟\n",
"schedule": "جدولة",
"scheduleMessage": "أختر الوقت والتاريخ لجدولة نشر هذا المقال.",
"scheduleMessage": "أختر الوقت و التاريخ لجدولة نشر هذا المقال.",
"show": "عرض",
"size": "الحجم",
"upload": "",
"uploadMessage": ""
"upload": "رفع",
"uploadFiles": "يتم رفع {files} ملفات.",
"uploadMessage": "إختر الملفات التي تريد رفعها.",
"optionalPassword": "كلمة مرور إختيارية"
},
"search": {
"images": "الصور",
"music": "الموسيقى",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"pressToSearch": "أضغط زر اﻹدخال للبحث...",
"search": "البحث...",
"typeToSearch": "Type to search...",
"types": "الأنواع",
"typeToSearch": "اكتب للبحث...",
"types": "انواع",
"video": "فيديوهات"
},
"settings": {
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "تنفيذ الأوامر",
"allowEdit": "تعديل، إعادة تسمية وحذف الملفات والمجلدات",
"allowNew": "إنشاء ملفات ومجلدات جديدة",
"allowPublish": "نشر مقالات وصفحات جديدة",
"allowSignup": "Allow users to signup",
"admin": "إدارة",
"administrator": "مدير",
"allowCommands": "تنفيذ اوامر",
"allowEdit": "تعديل، إعادة تسمية و حذف الملفات و المجلدات",
"allowNew": "إنشاء ملفات و مجلدات جديدة",
"allowPublish": "نشر مقالات و صفحات جديدة",
"allowSignup": "اسمح للمستخدمين بالاشتراك",
"avoidChanges": "(أتركه فارغاً إن لم ترد تغييره)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"branding": "الشعار",
"brandingDirectoryPath": "مسار مجلد الشعار",
"brandingHelp": "بإمكانك ان تخصص شكل و مظهر متصفح الملفات الخاص بك عن طريق تغيير اسمه، او تغيير الشعار، او اضافة ستايل مخصص، او حتى تعطيل الروابط الخارجية لـ GitHub.\nلمزيد من المعلومات حول التخصيص، يرجى الاطلاع على {0}.",
"changePassword": "تغيير كلمة المرور",
"commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "تم تحديث الأوامر",
"createUserDir": "Auto create user home dir while adding new user",
"commandRunner": "منفذ اﻷوامر",
"commandRunnerHelp": "هنا بإمكانك تعيين اﻷوامر التي سيتم تنفيذها في اﻷحداث المسماة. يجب كتابة أمر واحد في كل سطر. ستكون المتغيرات البيئية (env) {0} و {1} متاحة، حيث {0} نسبي لـ {1}. لمزيد من المعلومات حول هذه الميزة و المتغيرات البيئية المتاحة، يرجى قراءة {2}.",
"commandsUpdated": "تم تحديث اوامر",
"createUserDir": "إنشاء مجلد المستخدم (home) تلقائياً عند إنشاء مستخدم جديد",
"tusUploads": "التحميلات المتقطعة",
"tusUploadsHelp": "يدعم متصفح الملفات تحميل الملفات المتقطعة، مما يسمح بتحميلات الملفات بشكل فعال و موثوق و قابلة للمتابغة و متقطعة حتى على الشبكات غير الموثوقة.",
"tusUploadsChunkSize": "يشير إلى الحد اﻷقصى لحجم الطلب (سيتم استخدام التحميل المباشر للتحميلات صغيرة الخحم). يمكنك إدخال عدد صحيح عادي يدل على الحجم بوحدة البايت أو نمظ مثل10MB, 1GB, إلخ.",
"tusUploadsRetryCount": "عدد مرات إعادة المحاولة إذا فشلت عملية تحميل القطعة.",
"userHomeBasePath": "المسار الرئيسي لمجلد المستخدم (home)",
"userScopeGenerationPlaceholder": "سيتم تعيين نطاق المستخدم تلقائياً",
"createUserHomeDirectory": "إنشاء مجلد المستخدم (home)",
"customStylesheet": "ستايل مخصص",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"disableUsedDiskPercentage": "Disable used disk percentage graph",
"documentation": "documentation",
"defaultUserDescription": "هذه اﻹعدادات اﻹفتراضية للمستخدمين الجدد.",
"disableExternalLinks": "تعطيل الروابط الخارجية (بإسثناء الوثائق)",
"disableUsedDiskPercentage": "تعطيل الرسم البياني لنسبة القرص المستخدم",
"documentation": "التوثيق",
"examples": "أمثلة",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"executeOnShell": "نفيذ اﻷمر على الواجهة (shell)",
"executeOnShellDescription": "يقوم متصفح الملفات بتنفيذ اﻷوامر عن طريق استدعاء البرامج المنفذة مباشرة. إذا كنت تريد تشغيلها عن ظريق واجهة اﻷوامر (shell) مثل Bash أو PowerShell، يمكنك تعريفها هنا مع الوسائظ (arguments) المطلوبة. إذا تم تعيينها، سيتم إضافة اﻷمر الذي تقوم بتنفيذه كوسيط. ينطبق هذا على كل من أوامر المستخدم روابظ الحدث (hooks).",
"globalRules": "هذه مجموعة من القواعد العامة للسماح و المنع. تطبق على كل المستخدمين. يمكنك تحديد قواعد محددة لكل مستخدم لتجاوز القواعد الغامة.",
"globalSettings": "إعدادات عامة",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"hideDotfiles": "إخفاء ملفات النقطة",
"insertPath": "ادخل المسار",
"insertRegex": "ادخل تعبيراً منطقياً (regex)",
"instanceName": "اسم النسخة",
"language": "اللغة",
"lockPassword": "منع المستخدم من تغيير كلمة المرور",
"newPassword": "كلمة المرور الجديدة",
"newPasswordConfirm": "تأكيد كلمة المرور",
"newUser": "مستخدم جديد",
"password": "كلمة المرور",
"passwordUpdated": "تم تغيير كلمة المرور",
"path": "",
"passwordUpdated": "تم تغيير كلمة المرور!",
"path": "المسار",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
"create": "إنشاء ملفات و مجلدات جديدة",
"delete": "حذف ملفات و مجلدات",
"download": "تحميل",
"execute": "تنفيذ اﻷوامر",
"modify": "تعديل محتويات الملفات",
"rename": "إعادة تسمية او نقل ملفات و مجلدات",
"share": "مشاركة ملفات"
},
"permissions": "الصلاحيات",
"permissionsHelp": "يمكنك تعيين المستخدم كـ \"مدير\" أو تحديد الصلاحيات بشكل منفرد.\n إذا قمت بتحديد المستخدم كـ \"مدير\"، باقي الخيارات سيتم تحديدها تلقائياً.\n إدارة المستخدمين تبقى صلاحية فريدة للـ \"مدير\" فقط.\n",
@@ -212,22 +234,24 @@
"ruleExample1": "منع الوصول إلى الملفات التي تبدأ بنقطة مثل (.git، و .gitignore) في كل مجلد.\n",
"ruleExample2": "منع الوصول إلى الملف المسمى Caddyfile في نطاق الجذر.",
"rules": "المجموعات",
"rulesHelp": "يمكنك هنا تحديد مجموعة من شروط السماح والمنع لهذا المستخدم. الملفات الممنوعة لن تظهر ضمن القائمة لهذا المستخدم ولن يستطيع الوصول لها. هنا ندعم الـ regex والـ relative path لنطاق المستخدمين.\n",
"rulesHelp": "يمكنك هنا تحديد مجموعة من شروط السماح و المنع لهذا المستخدم. الملفات الممنوعة لن تظهر ضمن القائمة لهذا المستخدم و لن يستطيع الوصول لها. هنا ندعم الـ regex و الـ relative path لنطاق المستخدمين.\n",
"scope": "نطاق",
"settingsUpdated": "تم تعديل الإعدادات",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"setDateFormat": "حدد تنسيق التاريخ",
"settingsUpdated": "تم تعديل اﻹعدادات",
"shareDuration": "مدة المشاركة",
"shareManagement": "إدارة المشاركات",
"shareDeleted": "تم حذف المشاركة!",
"singleClick": "استخدم النقرة الواحدة لفتح الملفات",
"themes": {
"dark": "",
"light": "",
"title": ""
"dark": "غامق",
"light": "فاتح",
"title": "موضوع"
},
"user": "المستخدم",
"userCommands": "الأوامر",
"userCommandsHelp": "الأوامر المتاحة لهذا المستخدم مفصولة فيما بينها بمسافة. مثال:\n",
"userCommands": "اوامر",
"userCommandsHelp": "اوامر المتاحة لهذا المستخدم مفصولة فيما بينها بمسافة. مثال:\n",
"userCreated": "تم إنشاء المستخدم",
"userDefaults": "User default settings",
"userDefaults": "إعدادات المستخدم اﻹفتراضية",
"userDeleted": "تم حذف المستخدم",
"userManagement": "إدارة المستخدمين",
"userUpdated": "تم تعديل المستخدم",
@@ -237,14 +261,14 @@
"sidebar": {
"help": "مساعدة",
"hugoNew": "هيوجو جديد",
"login": "Login",
"login": "تسجيل دخول",
"logout": "تسجيل خروج",
"myFiles": "ملفاتي",
"newFile": "ملف جديد",
"newFolder": "مجلد جديد",
"preview": "معاينة",
"settings": "الإعدادات",
"signup": "Signup",
"preview": "عرض مسبق",
"settings": "اعدادات",
"signup": "إشتراك",
"siteSettings": "إعدادات الموقع"
},
"success": {
@@ -258,3 +282,4 @@
"unit": "وحدة الوقت"
}
}

View File

@@ -38,7 +38,8 @@
"update": "Update",
"upload": "Upload",
"openFile": "Open file",
"continue": "Continue"
"continue": "Continue",
"discardChanges": "Discard"
},
"download": {
"downloadFile": "Download File",
@@ -46,7 +47,7 @@
"downloadSelected": "Download Selected"
},
"upload": {
"abortUpload": "Are you sure you want to abort?"
"abortUpload": "Are you sure you wish to abort?"
},
"errors": {
"forbidden": "You don't have permissions to access this.",
@@ -128,32 +129,32 @@
"permanent": "Permanent",
"prompts": {
"copy": "Copy",
"copyMessage": "Choose the place to copy your files:",
"copyMessage": "Choose the location to copy your files to:",
"currentlyNavigating": "Currently navigating on:",
"deleteMessageMultiple": "Are you sure you want to delete {count} file(s)?",
"deleteMessageSingle": "Are you sure you want to delete this file/folder?",
"deleteMessageShare": "Are you sure you want to delete this share({path})?",
"deleteMessageMultiple": "Are you sure you wish to delete {count} file(s)?",
"deleteMessageSingle": "Are you sure you wish to delete this file/folder?",
"deleteMessageShare": "Are you sure you wish to delete this share({path})?",
"deleteTitle": "Delete files",
"displayName": "Display Name:",
"download": "Download files",
"downloadMessage": "Choose the format you want to download.",
"downloadMessage": "Choose the format you wish to download.",
"error": "Something went wrong",
"fileInfo": "File information",
"filesSelected": "{count} files selected.",
"lastModified": "Last Modified",
"move": "Move",
"moveMessage": "Choose new house for your file(s)/folder(s):",
"moveMessage": "Choose new home for your file(s)/folder(s):",
"newArchetype": "Create a new post based on an archetype. Your file will be created on content folder.",
"newDir": "New directory",
"newDirMessage": "Write the name of the new directory.",
"newDirMessage": "Name your new directory.",
"newFile": "New file",
"newFileMessage": "Write the name of the new file.",
"newFileMessage": "Name your new file.",
"numberDirs": "Number of directories",
"numberFiles": "Number of files",
"rename": "Rename",
"renameMessage": "Insert a new name for",
"replace": "Replace",
"replaceMessage": "One of the files you're trying to upload is conflicting because of its name. Do you wish to continue to upload or replace the existing one?\n",
"replaceMessage": "One of the files you're trying to upload has a conflicting name. Do you wish to skip this file and continue to upload or replace the existing one?\n",
"schedule": "Schedule",
"scheduleMessage": "Pick a date and time to schedule the publication of this post.",
"show": "Show",
@@ -161,7 +162,9 @@
"upload": "Upload",
"uploadFiles": "Uploading {files} files...",
"uploadMessage": "Select an option to upload.",
"optionalPassword": "Optional password"
"optionalPassword": "Optional password",
"resolution": "Resolution",
"discardEditorChanges": "Are you sure you wish to discard the changes you've made?"
},
"search": {
"images": "Images",
@@ -192,7 +195,7 @@
"createUserDir": "Auto create user home dir while adding new user",
"tusUploads": "Chunked Uploads",
"tusUploadsHelp": "File Browser supports chunked file uploads, allowing for the creation of efficient, reliable, resumable and chunked file uploads even on unreliable networks.",
"tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting a bytes input or a string like 10MB, 1GB etc.",
"tusUploadsChunkSize": "Indicates to maximum size of a request (direct uploads will be used for smaller uploads). You may input a plain integer denoting byte size input or a string like 10MB, 1GB etc.",
"tusUploadsRetryCount": "Number of retries to perform if a chunk fails to upload.",
"userHomeBasePath": "Base path for user home directories",
"userScopeGenerationPlaceholder": "The scope will be auto generated",
@@ -204,7 +207,7 @@
"documentation": "documentation",
"examples": "Examples",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you wish to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This applies to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override these ones.",
"globalSettings": "Global Settings",
"hideDotfiles": "Hide dotfiles",
@@ -231,7 +234,7 @@
"permissions": "Permissions",
"permissionsHelp": "You can set the user to be an administrator or choose the permissions individually. If you select \"Administrator\", all of the other options will be automatically checked. The management of users remains a privilege of an administrator.\n",
"profileSettings": "Profile Settings",
"ruleExample1": "prevents the access to any dot file (such as .git, .gitignore) in every folder.\n",
"ruleExample1": "prevents the access to any dotfile (such as .git, .gitignore) in every folder.\n",
"ruleExample2": "blocks the access to the file named Caddyfile on the root of the scope.",
"rules": "Rules",
"rulesHelp": "Here you can define a set of allow and disallow rules for this specific user. The blocked files won't show up in the listings and they wont be accessible to the user. We support regex and paths relative to the users scope.\n",

View File

@@ -2,47 +2,53 @@
"buttons": {
"cancel": "ביטול",
"close": "סגירה",
"copy": "העתק",
"copy": "העתקה",
"copyFile": "העתק קובץ",
"copyToClipboard": "העתק ללוח",
"copyDownloadLinkToClipboard": "העתק קישור הורדה ללוח",
"create": "צור",
"delete": "מחק",
"download": "הורד",
"download": "הורדה",
"file": "קובץ",
"folder": "תקייה",
"hideDotfiles": "הסתר קבצים נסתרים",
"folder": יקייה",
"hideDotfiles": "הסתר קבצים/תיקיות ששמם מתחיל בנקודה",
"info": "מידע",
"more": "עוד",
"move": "העבר",
"move": "העברה",
"moveFile": "העבר קובץ",
"new": "חדש",
"next": "הבא",
"ok": "אישור",
"permalink": "צור קישור קבוע",
"permalink": "יצירת קישור קבוע",
"previous": "הקודם",
"publish": "יצירה",
"rename": נה שם",
"replace": "החלף",
"publish": "פרסום",
"rename": ינוי שם",
"replace": "החלפה",
"reportIssue": "דווח על תקלה",
"save": "שמור",
"save": "שמירה",
"schedule": "תזמון",
"search": "חיפוש",
"select": "בחר",
"select": "בחירה",
"selectMultiple": "בחירה מרובה",
"share": תף",
"share": יתוף",
"shell": "פתיחת מסוף",
"submit": "אישור",
"switchView": נה תצוגה",
"toggleSidebar": "פתיחת / סגירת סרגל צד",
"switchView": ינוי תצוגה",
"toggleSidebar": "פתיחת/סגירת סרגל צד",
"update": "עדכון",
"upload": "העלאה",
"openFile": "פתח קובץ"
"openFile": "פתח קובץ",
"continue": "המשך",
"discardChanges": "זריקת השינויים"
},
"download": {
"downloadFile": "הורד קובץ",
"downloadFolder": "הורד תקייה",
"downloadFolder": "הורד תיקייה",
"downloadSelected": "הורד קבצים שנבחרו"
},
"upload": {
"abortUpload": "האם אתה בטוח שברצונך להפסיק את ההעלאה?"
},
"errors": {
"forbidden": "אין לך הרשאות גישה",
"internal": "משהו השתבש",
@@ -51,10 +57,10 @@
},
"files": {
"body": "גוף",
"clear": קה",
"clear": יקוי",
"closePreview": "סגירת תצוגה מקדימה",
"files": "קבצים",
"folders": "תקיות",
"folders": יקיות",
"home": "ראשי",
"lastModified": "שונה לאחרונה",
"loading": "טוען...",
@@ -66,20 +72,20 @@
"sortByLastModified": "מיין לפי השינוי האחרון",
"sortByName": "מיין לפי שם",
"sortBySize": "מיין לפי גודל",
"noPreview": "תצוגה מקדימה לא זמינה לקובץ זה"
"noPreview": "לא זמינה תצוגה מקדימה לקובץ זה"
},
"help": {
"click": "בחר קובץ או תקייה",
"click": "בחר קובץ או תיקייה",
"ctrl": {
"click": "בחר מספר קבצים או תקיות",
"click": "בחר מספר קבצים או תיקיות",
"f": "פותח את החיפוש",
"s": "לשמור קובץ או להוריד את התקייה שבה אתה נמצא"
"s": "לשמור קובץ או להוריד את התיקייה שבה אתה נמצא"
},
"del": "מחק את מה שנבחר",
"doubleClick": "פתח קובץ או תקייה",
"del": "מחק את הבחירה",
"doubleClick": "פתח קובץ או תיקייה",
"esc": "נקה את הבחירה ו/או סגור את השדה",
"f1": "המידע הזה",
"f2": נה שם קובץ",
"f2": ינוי שם קובץ",
"help": "עזרה"
},
"languages": {
@@ -109,44 +115,44 @@
},
"login": {
"createAnAccount": "צור חשבון",
"loginInstead": "חשבון קיים",
"loginInstead": "כבר יש לי חשבון",
"password": "סיסמא",
"passwordConfirm": "אימות סיסמא",
"passwordsDontMatch": "סיסמאות אינן תואמות",
"passwordsDontMatch": "הסיסמאות אינן תואמות",
"signup": "הרשמה",
"submit": "התחברות",
"username": "שם משתמש",
"usernameTaken": "שם משתמש כבר קיים",
"usernameTaken": "שם המשתמש כבר קיים",
"wrongCredentials": "פרטי התחברות שגויים"
},
"permanent": "קבוע",
"prompts": {
"copy": "העתק",
"copy": "העתקה",
"copyMessage": "בחר לאן להעתיק את הקבצים:",
"currentlyNavigating": "כרגע מנווט ב:",
"deleteMessageMultiple": "האם אתה בטוח שברצונך למחוק {count} קבצים?",
"deleteMessageSingle": "האם אתה בטוח שברצונך למחוק את הקובץ או התקייה?",
"deleteMessageShare": "האם אתה בטוח שברצונך למחוק את השיתוף הזה?({path})?",
"deleteTitle": "מחק קבצים",
"deleteMessageSingle": "האם אתה בטוח שברצונך למחוק את הקובץ/התיקייה?",
"deleteMessageShare": "האם אתה בטוח שברצונך למחוק את השיתוף הזה ({path})?",
"deleteTitle": "מחיקת קבצים",
"displayName": "שם:",
"download": "הורד קבצים",
"download": "הורדת קבצים",
"downloadMessage": "בחר את הפורמט שברצונך להוריד",
"error": "משהו השתבש",
"fileInfo": "מידע על הקובץ",
"filesSelected": "{count} קבצים נבחרו.",
"lastModified": "שונה לאחרונה",
"move": "העבר",
"moveMessage": "בחר מיקום חדש לקובץ / תקייה:",
"newArchetype": "צור פוסט חדש. הקובץ יווצר בתקיית התוכן",
"newDir": "תקייה חדשה",
"newDirMessage": "כתוב את שם התקייה החדשה",
"move": "העברה",
"moveMessage": "בחר מיקום חדש לקובץ/תיקייה:",
"newArchetype": "Create a new post based on an archetype. Your file will be created on content folder",
"newDir": יקייה חדשה",
"newDirMessage": "כתוב את שם התיקייה החדשה",
"newFile": "קובץ חדש",
"newFileMessage": "כתוב את שם הקובץ החדש",
"numberDirs": "מספר התקיות",
"numberFiles": "מספר הקבצים",
"rename": נה שם",
"numberDirs": "כמות התיקיות",
"numberFiles": "כמות הקבצים",
"rename": ינוי שם",
"renameMessage": "הכנס שם חדש עבור",
"replace": "החלף",
"replace": "החלפה",
"replaceMessage": "אחד הקבצים בעל שם זהה לקובץ קיים, האם ברצונך להחליף את הקובץ הקיים בחדש? זהירות - הקובץ הישן ימחק\n",
"schedule": "תזמון",
"scheduleMessage": "בחר תאריך ושעה לתזמון הפרסום של פוסט זה.",
@@ -155,53 +161,55 @@
"upload": "העלאה",
"uploadFiles": "מעלה {files} קבצים...",
"uploadMessage": "בחר אפשרות העלאה.",
"optionalPassword": "סיסמא אופציונלית"
"optionalPassword": "סיסמא אופציונלית",
"discardEditorChanges": "האם אתה בטוח שברצונך לבטל את השינויים שביצעת?"
},
"search": {
"images": "תמונות",
"music": "מוזיקה",
"pdf": "PDF",
"pressToSearch": "הקש אנטר לחיפוש...",
"search": פש...",
"typeToSearch": "הקלד לחיפוש...",
"types": "סוג",
"pressToSearch": "הקש אנטר כדי לחפש...",
"search": יפוש...",
"typeToSearch": "הקלד כדי לחפש...",
"types": "סוגים",
"video": "וידאו"
},
"settings": {
"admin": "מנהל",
"administrator": "מנהל ראשי",
"allowCommands": "הפעל פקודות",
"allowEdit": "ערוך, שנה שם ומחק קבצים או תקיות",
"allowNew": "צור קבצים ותקיות חדשות",
"allowPublish": "פרסם פוסטים ודפים חדשים",
"allowSignup": "אפשר למשתמשים להירשם",
"allowCommands": "הפעלת פקודות",
"allowEdit": "עריכת, שינוי שם ומחיקת קבצים/תיקיות",
"allowNew": "יצירת קבצים ותיקיות חדשות",
"allowPublish": "פרסום פוסטים ודפים חדשים",
"allowSignup": "אפשר למשתמשים חדשים להירשם",
"avoidChanges": "(השאר ריק כדי למנוע שינויים)",
"branding": "מיתוג",
"brandingDirectoryPath": "נתיב תקיית מיתוג",
"brandingDirectoryPath": "נתיב תיקיית מיתוג",
"brandingHelp": "אתה יכול להגדיר את האופן שבו האפליקציה תראה על ידי שינוי שם האפליקציה, החלפת הלוגו, הוספת עיצוב מותאם אישית ואפילו השבתת קישורים חיצוניים לGithub.\nלמידע נוסף עיין ב-{0}.",
"changePassword": נה סיסמא",
"changePassword": ינוי סיסמא",
"commandRunner": "הרצת פקודות",
"commandRunnerHelp": "אתה יכול להגדיר פקודות שיבוצעו באירועים שונים. עליך לכתוב אחד בכל שורה. משתני הסביבה {0} ו-{1} יהיו זמינים, בהיותם {0} ביחס ל-{1}. למידע נוסף על תכונה זו ועל משתני הסביבה הזמינים, עיין ב {2}.",
"commandsUpdated": "הפקודות עודכנו.",
"createUserDir": "צור תקיית בית במהלך הוספת משתמש חדש",
"userHomeBasePath": "נתיב ראשי לתקיות הבית של משתמשים",
"userScopeGenerationPlaceholder": תחום יווצר אוטומטית",
"createUserHomeDirectory": "צור תקיית בית למשתמש",
"commandsUpdated": "הפקודות עודכנו!",
"createUserDir": "צור אוטומטית תיקיית בית בעת הוספת משתמש חדש",
"userHomeBasePath": "נתיב ראשי לתיקיות הבית של משתמשים",
"userScopeGenerationPlaceholder": היקף יווצר אוטומטית",
"createUserHomeDirectory": "צור תיקיית בית למשתמש",
"customStylesheet": "עיצוב מותאם אישית (Stylesheet)",
"defaultUserDescription": "אלה הגדרות ברירת המחדל למשתמשים חדשים",
"defaultUserDescription": "הגדרות ברירת המחדל למשתמשים חדשים",
"disableExternalLinks": "השבת קישורים חיצוניים (למעט תיעוד)",
"disableUsedDiskPercentage": "אל תציג גרף שימוש בדיסק",
"documentation": "תיעוד",
"examples": "דוגמאות",
"executeOnShell": "בצע במסוף",
"executeOnShellDescription": "כברירת מחדל, האפליקציה מבצעת את הפקודות על ידי הפעלה ישירה לקבצים (הבינארים). אם אתה רוצה להפעיל אותם מתוך מעטפת כלשהי, (לדוגמא מתוך Bash או PowerShell) אתה יכול להגדיר אותם כאן עם הפרמטרים הנדרשים. שים לב שזה יבוצע גם על פקודות משתמש וגם על הוקים (Hooks) לאירועים.",
"globalRules": "זוהי קבוצה גלובלית של חוקים והרשאות (מה מותר ומה אסור), הם חלים על כל משתמש. אתה יכול להגדיר כללים ספציפיים בהגדרות של כל משתמש, כדי לעקוף את החוקים הגלובלים.",
"globalSettings": "הגדרות גלובליות",
"hideDotfiles": "הסתר קבצים נסתרים",
"hideDotfiles": "הסתר קבצים/תיקיות ששמם מתחיל בנקודה",
"insertPath": "הכנס את הנתיב",
"insertRegex": "הוסף ביטוי רגולרי",
"instanceName": "שם",
"instanceName": "שם מופע",
"language": "שפה",
"lockPassword": "מנע ממשתמש להחליף סיסמא",
"lockPassword": "מנע מהמשתמש להחליף סיסמא",
"newPassword": "הסיסמא החדשה שלך",
"newPasswordConfirm": "אשר את הסיסמה החדשה שלך",
"newUser": "משתמש חדש",
@@ -209,28 +217,28 @@
"passwordUpdated": "הסיסמא עודכנה!",
"path": "נתיב",
"perm": {
"create": "יצירת קבצים ותקיות",
"delete": "מחיקת קבצים ותקיות",
"download": "הורדת קבצים ותקיות",
"create": "יצירת קבצים ותיקיות",
"delete": "מחיקת קבצים ותיקיות",
"download": "הורדת קבצים ותיקיות",
"execute": "ביצוע פקודות",
"modify": "עריכת קבצים קבצים",
"rename": "שינוי שם או העברת קבצים ותקיות",
"rename": "שינוי שם/העברת קבצים ותיקיות",
"share": "שיתוף קבצים"
},
"permissions": "הרשאות",
"permissionsHelp": "אתה יכול להגדיר את המשתמש להיות מנהל מערכת או לבחור את ההרשאות בנפרד. אם תבחר \"מנהל מערכת\", כל ההרשאות ייבחרו אוטומטית. ניהול המשתמשים נשאר הרשאה של מנהל מערכת.\n",
"permissionsHelp": "אתה יכול להגדיר את המשתמש להיות מנהל מערכת או לבחור את ההרשאות בנפרד. אם תבחר \"מנהל מערכת\", כל ההרשאות יינתנו אוטומטית. ניהול המשתמשים נשאר הרשאה של מנהל מערכת.\n",
"profileSettings": "הגדרות פרופיל",
"ruleExample1": "מנע גישה לקבצים נסתרים (כל קובץ שמתחיל בנקודה, לדוגמא .git)",
"ruleExample2": "חסימת גישה לקובץ בשם Caddyfile בתחום הראשי.",
"ruleExample1": "מנע גישה לקבצים נסתרים (כל קובץ/תיקייה שמתחיל בנקודה, לדוגמא .git)",
"ruleExample2": "חסימת גישה לקובץ בשם Caddyfile בהיקף הראשי.",
"rules": "חוקים",
"rulesHelp": "כאן אתה יכול להגדיר רשימה של כללים למשתמש ספציפי, רשימה שחורה ולבנה. הקבצים החסומים לא יופיעו ברשימת הקבצים ולא יהיו נגישים למשתמש. יש תמיכה בנתיבים (ביחס לתקייה הראשית של המשתמש), וגם בביטוי רגולרי.\n",
"scope": "תחום",
"rulesHelp": "כאן אתה יכול להגדיר רשימה של כללים למשתמש ספציפי, רשימה שחורה ולבנה. הקבצים החסומים לא יופיעו ברשימת הקבצים ולא יהיו נגישים למשתמש. יש תמיכה בנתיבים (ביחס לתיקייה הראשית של המשתמש), וגם בביטוי רגולרי.\n",
"scope": "היקף",
"setDateFormat": "הגדר פורמט תאריך",
"settingsUpdated": "ההגדרות עודכנו!",
"shareDuration": "משך השיתוף",
"shareManagement": "ניהול שיתוף",
"shareDeleted": "שיתוף נמחק!",
"singleClick": "השתמש בלחיצות בודדות כדי לפתוח קבצים ותקיות",
"shareDeleted": "השיתוף נמחק!",
"singleClick": "השתמש בלחיצה בודדת כדי לפתוח קובץ/תיקייה",
"themes": {
"dark": "כהה",
"light": "בהיר",
@@ -238,10 +246,10 @@
},
"user": "משתמש",
"userCommands": "פקודות",
"userCommandsHelp": "רשימה מופרדת עם רווחים עם הפקודות הזמינות עבור משתמש זה. דוגמא:\n",
"userCreated": "משתמש נוצר!",
"userCommandsHelp": "רשימה מופרדת ברווחים של הפקודות הזמינות עבור משתמש זה. דוגמא:\n",
"userCreated": "המשתמש נוצר!",
"userDefaults": "הגדרות ברירת מחדל למשתמש",
"userDeleted": "משתמש נמחק!",
"userDeleted": "המשתמש נמחק!",
"userManagement": "ניהול משתמש",
"userUpdated": "המשתמש עודכן!",
"username": "שם משתמש",
@@ -254,11 +262,11 @@
"logout": "התנתק",
"myFiles": "הקבצים שלי",
"newFile": "קובץ חדש",
"newFolder": "תקייה חדשה",
"newFolder": יקייה חדשה",
"preview": "תצוגה מקדימה",
"settings": "הגדרות",
"signup": "הרשמה",
"siteSettings": "הגדרות"
"siteSettings": "הגדרות אתר"
},
"success": {
"linkCopied": "הקישור הועתק!"

View File

@@ -3,76 +3,87 @@
"cancel": "キャンセル",
"close": "閉じる",
"copy": "コピー",
"copyFile": "ファイルコピー",
"copyToClipboard": "クリップボードにコピー",
"copyFile": "ファイルコピー",
"copyToClipboard": "共有リンクをコピー",
"copyDownloadLinkToClipboard": "ダウンロードリンクをコピー",
"create": "作成",
"delete": "削除",
"download": "ダウンロード",
"hideDotfiles": "",
"file": "ファイル",
"folder": "フォルダー",
"hideDotfiles": "ドットで始まるファイルを表示しない",
"info": "情報",
"more": "More",
"more": "さらに",
"move": "移動",
"moveFile": "ファイル移動",
"moveFile": "ファイル移動",
"new": "新規",
"next": "次",
"next": "次",
"ok": "OK",
"permalink": "固定リンク",
"previous": "前",
"publish": "発表",
"rename": "名前変更",
"replace": "置き換える",
"permalink": "パーマリンクを取得",
"previous": "前",
"publish": "公開",
"rename": "名前変更",
"replace": "置換する",
"reportIssue": "問題を報告",
"save": "保存",
"schedule": "スケジュール",
"search": "検索",
"select": "選択",
"selectMultiple": "複数選択",
"share": "シェア",
"shell": "Toggle shell",
"switchView": "表示を切り替わる",
"toggleSidebar": "サイドバーを表示する",
"share": "共有",
"shell": "シェルの切り替え",
"submit": "送信",
"switchView": "表示の切り替え",
"toggleSidebar": "サイドバーの切り替え",
"update": "更新",
"upload": "アップロード"
"upload": "アップロード",
"openFile": "ファイルを開く",
"continue": "続行"
},
"download": {
"downloadFile": "Download File",
"downloadFolder": "Download Folder",
"downloadSelected": ""
"downloadFile": "ファイルのダウンロード",
"downloadFolder": "フォルダーのダウンロード",
"downloadSelected": "選択した項目のダウンロード"
},
"upload": {
"abortUpload": "アップロードをキャンセルしますか?"
},
"errors": {
"forbidden": "You don't have permissions to access this.",
"forbidden": "これにアクセスする権限がありません。",
"internal": "内部エラーが発生しました。",
"notFound": "リソースが見つからなりませんでした。"
"notFound": "リソースが見つかりませんでした。",
"connection": "サーバーに接続できませんでした。"
},
"files": {
"body": "本文",
"clear": "クリアー",
"clear": "消去",
"closePreview": "プレビューを閉じる",
"files": "ファイル",
"folders": "フォルダ",
"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": "このヘルプを表示",
"doubleClick": "ファイルやフォルダーを開く",
"esc": "選択を解除/ダイアログを閉じる",
"f1": "ヘルプを表示",
"f2": "ファイルの名前を変更",
"help": "ヘルプ"
},
@@ -81,180 +92,193 @@
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
"is": "",
"is": "Icelandic",
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ro": "",
"ro": "Romanian",
"ru": "Русский",
"sk": "Slovenčina",
"svSE": "",
"tr" : "Türkçe",
"svSE": "Swedish (Sweden)",
"tr": "Türkçe",
"ua": "Українська",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)"
},
"login": {
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"createAnAccount": "アカウントを作成",
"loginInstead": "ログインする",
"password": "パスワード",
"passwordConfirm": "Password Confirmation",
"passwordsDontMatch": "Passwords don't match",
"signup": "Signup",
"passwordConfirm": "パスワード(確認用)",
"passwordsDontMatch": "パスワードが一致しません",
"signup": "アカウント作成",
"submit": "ログイン",
"username": "ユーザ名",
"usernameTaken": "Username already taken",
"wrongCredentials": "ユーザ名またはパスワードが間違っています"
"username": "ユーザ名",
"usernameTaken": "ユーザー名はすでに取得されています",
"wrongCredentials": "ユーザ名またはパスワードが間違っています"
},
"permanent": "永久",
"prompts": {
"copy": "コピー",
"copyMessage": "コピーの目標ディレクトリを選択してください:",
"copyMessage": "ファイルをコピーする場所を選択してください:",
"currentlyNavigating": "現在閲覧しているディレクトリ:",
"deleteMessageMultiple": "{count} のファイルを本当に削除してよろしいですか",
"deleteMessageSingle": "このファイル/フォルダを本当に削除してよろしいですか",
"deleteTitle": "ファイルを削除",
"displayName": "名前:",
"download": "ファイルをダウンロード",
"downloadMessage": "圧縮形式を選択してください。",
"error": "あるエラーが発生しました。",
"deleteMessageMultiple": "{count} のファイルを削除してよろしいですか",
"deleteMessageSingle": "このファイルフォルダを削除してよろしいですか",
"deleteMessageShare": "共有中のファイル({path})を削除してもよろしいですか?",
"deleteTitle": "ファイルの削除",
"displayName": "表示名:",
"download": "ファイルのダウンロード",
"downloadMessage": "ダウンロードする際の圧縮形式を選んでください:",
"error": "エラーが発生しました",
"fileInfo": "ファイル情報",
"filesSelected": "{count} のファイルは選択されました。",
"lastModified": "最終変更",
"filesSelected": "{count} のファイル/フォルダーが選択されています",
"lastModified": "更新日時",
"move": "移動",
"moveMessage": "移動の目標ディレクトリを選択してください:",
"newArchetype": "ある元型に基づいて新しいポストを作成します。ファイルは コンテンツフォルダに作成されます。",
"newDir": "新しいディレクトリを作成",
"newDirMessage": "新しいディレクトリの名前を入力してください",
"newFile": "新しいファイルを作成",
"newFileMessage": "新しいファイルの名前を入力してください",
"numberDirs": "ディレクトリ数",
"numberFiles": "ファイル数",
"rename": "名前変更",
"renameMessage": "名前を変更しようファイルは:",
"replace": "置き換え",
"replaceMessage": "アップロードするファイルの中でかち合う名前が一つあります。 既存のファイルを置き換えりませんか。\n",
"moveMessage": "ファイル/フォルダーの新しいハウスを選択してください:",
"newArchetype": "archetype に基づいて新しい投稿を作成します。ファイルは content フォルダに作成されます。",
"newDir": "新規フォルダー",
"newDirMessage": "フォルダーの名前を入力してください",
"newFile": "新ファイル",
"newFileMessage": "ファイルの名前を入力してください",
"numberDirs": "ディレクトリ数",
"numberFiles": "ファイル数",
"rename": "名前変更",
"renameMessage": "変更後のファイルの名前を入力してください",
"replace": "ファイルの置き換え",
"replaceMessage": "アップロードしようとしているファイルと既存のファイルの名前が重複しています。既存のものを置き換えずにアップロードを続けるか、既存のものを置き換えますか?\n",
"schedule": "スケジュール",
"scheduleMessage": "このポストの発表日付をスケジュールしてください。",
"scheduleMessage": "この投稿の公開予定日時を選んでください。",
"show": "表示",
"size": "サイズ",
"upload": "",
"uploadMessage": ""
"upload": "アップロード",
"uploadFiles": "{files} 個のファイルをアップロードしています…",
"uploadMessage": "アップロードするオプションを選択してください。",
"optionalPassword": "パスワード(オプション)"
},
"search": {
"images": "画像",
"music": "音楽",
"pdf": "PDF",
"pressToSearch": "Press enter to search...",
"search": "検索...",
"typeToSearch": "Type to search...",
"types": "種類",
"video": "ビデオ"
"pressToSearch": "エンターを押して検索します",
"search": "検索",
"typeToSearch": "検索の種類",
"types": "ファイルの種類",
"video": "動画"
},
"settings": {
"admin": "管理者",
"administrator": "管理者",
"allowCommands": "コマンドの実行",
"allowEdit": "ファイルやディレクトリの編集、名前変更削除",
"allowNew": "ファイルとディレクトリの作成",
"allowPublish": "ポストとぺーじの発表",
"allowSignup": "Allow users to signup",
"avoidChanges": "(変更を避けるために空白にしてください)",
"branding": "Branding",
"brandingDirectoryPath": "Branding directory path",
"brandingHelp": "You can customize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"changePassword": "パスワード変更",
"commandRunner": "Command runner",
"commandRunnerHelp": "Here you can set commands that are executed in the named events. You must write one per line. The environment variables {0} and {1} will be available, being {0} relative to {1}. For more information about this feature and the available environment variables, please read the {2}.",
"commandsUpdated": "コマンド更新されました!",
"createUserDir": "Auto create user home dir while adding new user",
"customStylesheet": "カスタムスタイルシ ート",
"defaultUserDescription": "This are the default settings for new users.",
"disableExternalLinks": "Disable external links (except documentation)",
"disableUsedDiskPercentage": "Disable used disk percentage graph",
"documentation": "documentation",
"allowEdit": "ファイルやフォルダーの編集、名前変更削除",
"allowNew": "ファイルやフォルダーの新規作成",
"allowPublish": "新しい投稿やページの公開",
"allowSignup": "ユーザーの新規登録を許可",
"avoidChanges": "変更しない場合は空白のままにしてください",
"branding": "ブランディング",
"brandingDirectoryPath": "ブランディングのディレクトリへのパス",
"brandingHelp": "インスタンスの名前の変更、ロゴの変更、カスタムスタイルの追加、GitHub への外部リンクの無効化など、File Browser の見た目や使い勝手をカスタマイズすることができます。\nカスタムブランディングの詳細については、{0}をご覧ください。",
"changePassword": "パスワード変更",
"commandRunner": "コマンドランナー",
"commandRunnerHelp": "ここでは、指定したイベントの際に実行されるコマンドを設定することができます。1行に1つずつ書く必要があります。環境変数として {0} {1} が使用可能で、{0} は {1} に関連した変数として扱われます。この機能と使用可能な環境変数の詳細については、{2}をお読みください。",
"commandsUpdated": "コマンド更新ました!",
"createUserDir": "新規ユーザー追加時にユーザーのホームディレクトリを自動生成する",
"tusUploads": "チャンクされたファイルアップロード",
"tusUploadsHelp": "File Browser はチャンクされたファイルアップロードをサポートしており、信頼性の低いネットワーク上でも、効率的で信頼性の高い、再開可能なチャンクされたファイルアップロードを作成することができます。",
"tusUploadsChunkSize": "1チャンクあたりのリクエストの最大サイズ。バイト数を示す整数か、10MB、1GBなどの文字列を入力できます。",
"tusUploadsRetryCount": "チャンクのアップロードに失敗した場合の再試行回数。",
"userHomeBasePath": "ユーザーのホームディレクトリのベースパス",
"userScopeGenerationPlaceholder": "スコープは自動生成されます",
"createUserHomeDirectory": "ユーザーのホームディレクトリを作成する",
"customStylesheet": "カスタムスタイルシート",
"defaultUserDescription": "これらは新規ユーザーのデフォルト設定です。",
"disableExternalLinks": "外部リンクを無効にする(ドキュメントへのリンクを除く)",
"disableUsedDiskPercentage": "ディスク使用率のグラフを無効にする",
"documentation": "ドキュメント",
"examples": "例",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"executeOnShell": "シェルで実行する",
"executeOnShellDescription": "デフォルトでは、File Browser はバイナリを直接呼び出してコマンドを実行します。代わりにシェル(Bash PowerShell など)で実行したい場合は、必要な引数やフラグをここで指定します。値が指定されている場合、実行するコマンドが引数として追加されます。これは、ユーザーコマンドとイベントフックの両方に適用されます。",
"globalRules": "これはグローバルな許可と不許可のルールセットです。これはすべてのユーザーに適用されます。ユーザーごとに特定のルールを設定することで、これらのルールを上書きすることができます。",
"globalSettings": "グローバル設定",
"hideDotfiles": "",
"insertPath": "Insert the path",
"insertRegex": "Insert regex expression",
"instanceName": "Instance name",
"hideDotfiles": "ドットで始まるファイルを表示しない",
"insertPath": "パスを入力してください",
"insertRegex": "正規表現を入力してください",
"instanceName": "インスタンス名",
"language": "言語",
"lockPassword": "新しいパスワードを変更に禁止",
"lockPassword": "ユーザーがパスワードを変更できないようにする",
"newPassword": "新しいパスワード",
"newPasswordConfirm": "新しいパスワードを確認します",
"newUser": "新しいユーザー",
"newPasswordConfirm": "新しいパスワード(再入力)",
"newUser": "新ユーザー作成",
"password": "パスワード",
"passwordUpdated": "パスワード更新されました!",
"path": "",
"passwordUpdated": "パスワード更新ました!",
"path": "パス",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"execute": "Execute commands",
"modify": "Edit files",
"rename": "Rename or move files and directories",
"share": "Share files"
"create": "ファイルやフォルダーの作成",
"delete": "ファイルやフォルダーの削除",
"download": "ダウンロード",
"execute": "コマンドの実行",
"modify": "ファイルの編集",
"rename": "ファイルやフォルダーの編集・移動",
"share": "ファイルの共有"
},
"permissions": "権限",
"permissionsHelp": "あなたはユーザーを管理者に設定し、または権限を個々に設定しできます。\"管理者\"を選択する場合、その他のすべての選択肢は自動的に設定されます。ユーザー管理は管理者権限として保留されました。",
"profileSettings": "プロファイル設定",
"ruleExample1": "各フォルダに名前はドットで始まるファイル(例えば、.git.gitignoreへのアクセスを制限します。",
"ruleExample2": "範囲のルートパスに名前は Caddyfile のファイルへのアクセスを制限します。",
"rules": "規則",
"rulesHelp": "ここに、あなたはこのユーザーの許可または拒否規則を設定できます。ブロックされたファイルはリストに表示されません、それではアクセスも制限されます。正規表現(regex)のサポートと範囲に相対パスが提供されています。",
"scope": "範囲",
"settingsUpdated": "設定は更新されました!",
"shareDuration": "",
"shareManagement": "",
"singleClick": "",
"permissionsHelp": "ユーザーを管理者に設定するか、その他の権限を個別に選択することができます。管理者を選択すると、他のオプションはすべて自動的にチェックされます。ユーザー管理するには管理者権限が必要です。\n",
"profileSettings": "プロフィール設定",
"ruleExample1": ".git.gitignore のようなドットから始まるファイルへのアクセスを禁止します。\n",
"ruleExample2": "スコープのルートにある Caddyfile という名前のファイルへのアクセスを禁止します。",
"rules": "ルール",
"rulesHelp": "ここでは、特定のユーザーに対して許可と不許可のルールを設定することができます。ブロックされたファイルはリストに表示されず、ユーザはアクセスできなくなります。正規表現とユーザースコープからの相対パスをサポートしています。\n",
"scope": "スコープ",
"setDateFormat": "正確な日時表記を使用する",
"settingsUpdated": "設定を更新しました!",
"shareDuration": "共有期間",
"shareManagement": "共有の管理",
"shareDeleted": "ファイルの共有を削除しました!",
"singleClick": "ダブルクリックの代わりにクリックでファイルやフォルダーを開く",
"themes": {
"dark": "",
"light": "",
"title": ""
"dark": "ダーク",
"light": "ライト",
"title": "テーマ"
},
"user": "ユーザー",
"userCommands": "ユーザーのコマンド",
"userCommandsHelp": "空白区切りの有効のコマンドのリストを指定してください。例:",
"userCreated": "ユーザー作成されました!",
"userDefaults": "User default settings",
"userDeleted": "ユーザー削除されました!",
"userCommands": "コマンド",
"userCommandsHelp": "このユーザーが使用可能なコマンドをスペースで区切ったリスト。例:\n",
"userCreated": "ユーザー作成ました!",
"userDefaults": "ユーザーのデフォルト設定",
"userDeleted": "ユーザー削除ました!",
"userManagement": "ユーザー管理",
"userUpdated": "ユーザー更新されました!",
"userUpdated": "ユーザー更新ました!",
"username": "ユーザー名",
"users": "ユーザー"
},
"sidebar": {
"help": "ヘルプ",
"hugoNew": "Hugo New",
"login": "Login",
"login": "ログイン",
"logout": "ログアウト",
"myFiles": "私のファイル",
"newFile": "新しいファイルを作成",
"newFolder": "新しいフォルダを作成",
"myFiles": "マイファイル",
"newFile": "新ファイル",
"newFolder": "新フォルダ",
"preview": "プレビュー",
"settings": "設定",
"signup": "Signup",
"signup": "サインアップ",
"siteSettings": "サイト設定"
},
"success": {
"linkCopied": "リンクコピーされました!"
"linkCopied": "リンクコピーました!"
},
"time": {
"days": "日",
"hours": "時間",
"minutes": "分",
"seconds": "秒",
"unit": "時間単位"
"unit": "時間単位"
}
}

View File

@@ -5,6 +5,7 @@
"copy": "复制",
"copyFile": "复制文件",
"copyToClipboard": "复制到剪贴板",
"copyDownloadLinkToClipboard": "复制下载链接到剪贴板",
"create": "创建",
"delete": "删除",
"download": "下载",
@@ -36,13 +37,17 @@
"toggleSidebar": "切换侧边栏",
"update": "更新",
"upload": "上传",
"openFile": "打开文件"
"openFile": "打开文件",
"continue": "继续"
},
"download": {
"downloadFile": "下载文件",
"downloadFolder": "下载文件夹",
"downloadSelected": "下载已选"
},
"upload": {
"abortUpload": "你确定要中止吗?"
},
"errors": {
"forbidden": "你无权限访问",
"internal": "服务器出了点问题。",
@@ -69,9 +74,9 @@
"noPreview": "此文件无法预览。"
},
"help": {
"click": "选择文件或目录",
"click": "选择文件或文件夹",
"ctrl": {
"click": "选择多个文件或目录",
"click": "选择多个文件或文件夹",
"f": "打开搜索框",
"s": "保存文件或下载当前文件夹"
},
@@ -87,6 +92,7 @@
"hu": "Magyar",
"ar": "العربية",
"de": "Deutsch",
"el": "Ελληνικά",
"en": "English",
"es": "Español",
"fr": "Français",
@@ -94,7 +100,7 @@
"it": "Italiano",
"ja": "日本語",
"ko": "한국어",
"nlBE": "DutchBelgium",
"nlBE": "Dutch (Belgium)",
"pl": "Polski",
"pt": "Português",
"ptBR": "PortuguêsBrasil",
@@ -122,7 +128,7 @@
"permanent": "永久",
"prompts": {
"copy": "复制",
"copyMessage": "请选择欲复制至的目录:",
"copyMessage": "请选择目标目录:",
"currentlyNavigating": "当前目录:",
"deleteMessageMultiple": "你确定要删除这 {count} 个文件吗?",
"deleteMessageSingle": "你确定要删除这个文件/文件夹吗?",
@@ -136,31 +142,33 @@
"filesSelected": "已选择 {count} 个文件。",
"lastModified": "最后修改",
"move": "移动",
"moveMessage": "请选择欲移动至的目录:",
"newArchetype": "创建一个基于原型的新帖子。的文件将会创建在内容文件夹中。",
"newDir": "新建目录",
"newDirMessage": "请输入新目录的名称。",
"moveMessage": "请选择目标目录:",
"newArchetype": "创建一个基于原型的新帖子。的文件将会创建在内容文件夹中。",
"newDir": "新建文件夹",
"newDirMessage": "请输入新文件夹的名称。",
"newFile": "新建文件",
"newFileMessage": "请输入新文件的名称。",
"numberDirs": "目录数",
"numberDirs": "文件夹数",
"numberFiles": "文件数",
"rename": "重命名",
"renameMessage": "请输入新名称,旧名称为:",
"replace": "替换",
"replaceMessage": "尝试上传的文件中有一个与现有文件的名称存在冲突。是否替换现有的同名文件?\n",
"replaceMessage": "尝试上传的文件中有一个与现有文件的名称存在冲突。是否替换现有的同名文件?\n",
"schedule": "计划",
"scheduleMessage": "请选择发布这篇帖子的日期与时间。",
"show": "点击以显示",
"size": "大小",
"upload": "上传",
"uploadFiles": "正在上传 {files} ...",
"uploadMessage": "选择上传选项。",
"optionalPassword": "密码(选填,不填即无密码)"
"optionalPassword": "密码(选填,不填即无密码)",
"resolution": "分辨率"
},
"search": {
"images": "图像",
"music": "音乐",
"pdf": "PDF",
"pressToSearch": "输入回车以搜索...",
"pressToSearch": "回车以搜索...",
"search": "搜索...",
"typeToSearch": "输入以搜索...",
"types": "类型",
@@ -170,28 +178,35 @@
"admin": "管理员",
"administrator": "管理员",
"allowCommands": "执行命令Shell 命令)",
"allowEdit": "编辑、重命名或删除文件/目录",
"allowNew": "创建新文件和目录",
"allowEdit": "编辑、重命名或删除文件/文件夹",
"allowNew": "创建新文件和文件夹",
"allowPublish": "发布新的帖子与页面",
"allowSignup": "允许用户注册",
"avoidChanges": "(留空以避免更改)",
"branding": "品牌",
"brandingDirectoryPath": "品牌信息文件夹路径",
"brandingHelp": "可以通过改变实例名称,更换 Logo加入自定义样式甚至禁用到 Github 的外部链接来自定义 File Browser 的外观和感觉。\n想获得更多信息请查看 {0}。",
"brandingHelp": "可以通过改变实例名称,更换 Logo加入自定义样式甚至禁用到 Github 的外部链接来自定义 File Browser 的外观和感觉。\n想获得更多信息请查看 {0}。",
"changePassword": "更改密码",
"commandRunner": "命令执行器",
"commandRunnerHelp": "你可以在此设置在下列事件中执行的命令。每行必须写一条命令。可以在命令中使用环境变量 {0} 和 {1},使 {0} 与 {1} 相关联。关于此功能和可用环境变量的更多信息,请阅读 {2}。",
"commandsUpdated": "命令已更新!",
"createUserDir": "在添加新用户的同时自动创建用户的个人目录",
"createUserDir": "在添加新用户的同时自动创建用户的目录",
"tusUploads": "分块上传",
"tusUploadsHelp": "File Browser 支持分块上传,在不佳的网络下也可进行高效、可靠、可续的文件上传",
"tusUploadsChunkSize": "分块上传大小,例如 10MB 或 1GB",
"tusUploadsRetryCount": "分块上传失败时的重试次数",
"userHomeBasePath": "用户主目录的路径",
"userScopeGenerationPlaceholder": "自动生成目录范围",
"createUserHomeDirectory": "创建用户主目录",
"customStylesheet": "自定义样式表CSS",
"defaultUserDescription": "这些是新用户的默认设置。",
"disableExternalLinks": "禁止外部链接(帮助文档除外)",
"disableUsedDiskPercentage": "Disable used disk percentage graph",
"disableUsedDiskPercentage": "禁用磁盘已用空间展示",
"documentation": "帮助文档",
"examples": "例",
"examples": "例",
"executeOnShell": "在 Shell 中执行",
"executeOnShellDescription": "默认情况下File Browser 通过直接调用命令的二进制包来执行命令,如果想在 Shell中 执行(如 Bash 或 PowerShell你可以在这里定义所使用的 Shell 和参数。设置后,所执行的命令会作为参数追加。本设置对用户命令和事件钩子都生效。",
"globalRules": "这是全局允许与禁止规则。它们作用于所有用户。可以给每个用户定义单独的特殊规则来覆盖全局规则。",
"executeOnShellDescription": "默认情况下File Browser 通过直接调用命令的二进制包来执行命令,如果想在 Shell中 执行(如 Bash 或 PowerShell你可以在这里定义所使用的 Shell 和参数。设置后,所执行的命令会作为参数追加。本设置对用户命令和事件钩子都生效。",
"globalRules": "这是全局允许与禁止规则。它们作用于所有用户。可以给每个用户定义单独的特殊规则来覆盖全局规则。",
"globalSettings": "全局设置",
"hideDotfiles": "不显示隐藏文件",
"insertPath": "插入路径",
@@ -199,8 +214,8 @@
"instanceName": "实例名称",
"language": "语言",
"lockPassword": "禁止用户修改密码",
"newPassword": "的新密码",
"newPasswordConfirm": "再次输入以确认的新密码",
"newPassword": "的新密码",
"newPasswordConfirm": "再次输入以确认的新密码",
"newUser": "新建用户",
"password": "密码",
"passwordUpdated": "密码已更新!",
@@ -215,19 +230,19 @@
"share": "分享文件"
},
"permissions": "权限",
"permissionsHelp": "可以将该用户设置为管理员或单独选择各项权限。如果选择了“管理员”,则其他的选项会被自动选中,同时该用户可以管理其他用户。\n",
"permissionsHelp": "可以将该用户设置为管理员或单独选择各项权限。如果选择了“管理员”,则其他的选项会被自动选中,同时该用户可以管理其他用户。\n",
"profileSettings": "个人设置",
"ruleExample1": "阻止用户访问所有文件夹下任何以 . 开头的文件(隐藏文件, 例如: .git, .gitignore。\n",
"ruleExample2": "阻止用户访问其目录范围的根目录下名为 Caddyfile 的文件。",
"rules": "规则",
"rulesHelp": "可以为该用户制定一组黑名单或白名单式的规则,被屏蔽的文件将不会显示在列表中,用户也无权限访问,支持正则表达式和相对于用户范围的路径。\n",
"rulesHelp": "可以为该用户制定一组黑名单或白名单式的规则,被屏蔽的文件将不会显示在列表中,用户也无权限访问,支持正则表达式和相对于用户范围的路径。\n",
"scope": "目录范围",
"setDateFormat": "显示精确的日期格式",
"settingsUpdated": "设置已更新!",
"shareDuration": "分享期限",
"shareManagement": "分享管理",
"shareDeleted": "分享已删除!",
"singleClick": "使用单击来打开文件和目录",
"singleClick": "使用单击来打开文件和文件夹",
"themes": {
"dark": "深色",
"light": "浅色",

View File

@@ -1,5 +1,5 @@
import * as i18n from "@/i18n";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
const mutations = {
closeHovers: (state) => {

View File

@@ -3,10 +3,10 @@
<header-bar v-if="error || req.type == null" showMenu showLogo />
<breadcrumbs base="/files" />
<listing />
<errors v-if="error" :errorCode="error.status" />
<component v-else-if="currentView" :is="currentView"></component>
<div v-else>
<div v-else-if="currentView !== null">
<h2 class="message delayed">
<div class="spinner">
<div class="bounce1"></div>
@@ -52,12 +52,8 @@ export default {
computed: {
...mapState(["req", "reload", "loading"]),
currentView() {
if (this.req.type == undefined) {
if (this.req.type == undefined || this.req.isDir) {
return null;
}
if (this.req.isDir) {
return "listing";
} else if (
this.req.type === "text" ||
this.req.type === "textImmutable"
@@ -72,7 +68,26 @@ export default {
this.fetchData();
},
watch: {
$route: "fetchData",
$route: function (to, from) {
if (from.path.endsWith("/")) {
if (to.path.endsWith("/")) {
window.sessionStorage.setItem("listFrozen", "false");
this.fetchData();
return;
} else {
window.sessionStorage.setItem("listFrozen", "true");
this.fetchData();
return;
}
} else if (to.path.endsWith("/")) {
this.$store.commit("updateRequest", {});
this.fetchData();
return;
} else {
this.fetchData();
return;
}
},
reload: function (value) {
if (value === true) {
this.fetchData();
@@ -101,7 +116,9 @@ export default {
this.$store.commit("closeHovers");
// Set loading to true and reset the error.
this.setLoading(true);
if (window.sessionStorage.getItem("listFrozen") !=="true" && window.sessionStorage.getItem("modified") !=="true"){
this.setLoading(true);
}
this.error = null;
let url = this.$route.path;

View File

@@ -29,7 +29,7 @@
<breadcrumbs :base="'/share/' + hash" />
<div v-if="loading">
<h2 class="message delayed">
<h2 class="message delayed" style="padding-top: 3em !important;">
<div class="spinner">
<div class="bounce1"></div>
<div class="bounce2"></div>
@@ -73,28 +73,34 @@
</div>
<div v-else>
<div class="share">
<div class="share__box share__box__info">
<div class="share__box__header">
<div class="share__box share__box__info"
style="
position: -webkit-sticky;
position: sticky;
top:-20.6em;
z-index:999;"
>
<div class="share__box__header" style="height:3em">
{{
req.isDir
? $t("download.downloadFolder")
: $t("download.downloadFile")
}}
</div>
<div class="share__box__element share__box__center share__box__icon">
<div v-if="!this.req.isDir" class="share__box__element share__box__center share__box__icon">
<i class="material-icons">{{ icon }}</i>
</div>
<div class="share__box__element">
<div class="share__box__element" style="height:3em">
<strong>{{ $t("prompts.displayName") }}</strong> {{ req.name }}
</div>
<div class="share__box__element" :title="modTime">
<div v-if="!this.req.isDir" class="share__box__element" :title="modTime">
<strong>{{ $t("prompts.lastModified") }}:</strong> {{ humanTime }}
</div>
<div class="share__box__element">
<div class="share__box__element" style="height:3em">
<strong>{{ $t("prompts.size") }}:</strong> {{ humanSize }}
</div>
<div class="share__box__element share__box__center">
<a target="_blank" :href="link" class="button button--flat">
<a target="_blank" :href="link" class="button button--flat" style="height:4em">
<div>
<i class="material-icons">file_download</i
>{{ $t("buttons.download") }}
@@ -111,12 +117,73 @@
>{{ $t("buttons.openFile") }}
</div>
</a>
<qrcode-vue v-if="this.req.isDir" :value="fullLink" size="100" level="M"></qrcode-vue>
</div>
<div class="share__box__element share__box__center">
<div v-if="!this.req.isDir" class="share__box__element share__box__center">
<qrcode-vue :value="link" size="200" level="M"></qrcode-vue>
</div>
<div v-if="this.req.isDir" class="share__box__element share__box__header" style="height:3em">
{{ $t("sidebar.preview") }}
</div>
<div
v-if="this.req.isDir"
class="share__box__element share__box__center share__box__icon"
style="padding:0em !important;height:12em !important;"
>
<a
target="_blank"
:href="raw"
class="button button--flat"
v-if= "!this.$store.state.multiple &&
selectedCount === 1 &&
req.items[this.selected[0]].type === 'image'"
style="height: 12em; padding:0; margin:0;"
>
<img
style="height: 12em;"
:src="raw"
>
</a>
<div
v-else-if= "
!this.$store.state.multiple &&
selectedCount === 1 &&
req.items[this.selected[0]].type === 'audio'"
style="height: 12em; paddingTop:1em; margin:0;"
>
<button @click="play" v-if="!this.tag" style="fontSize:6em !important; border:0px;outline:none; background: white;" class="material-icons">play_circle_filled</button>
<button @click="play" v-if="this.tag" style="fontSize:6em !important; border:0px;outline:none; background: white;" class="material-icons">pause_circle_filled</button>
<audio id="myaudio"
:src="raw"
controls="controls"
:autoplay="tag"
>
</audio>
</div>
<video
v-else-if= "
!this.$store.state.multiple &&
selectedCount === 1 &&
req.items[this.selected[0]].type === 'video'"
style="height: 12em; padding:0; margin:0;"
:src="raw"
controls="controls"
>
Sorry, your browser doesn't support embedded videos, but don't worry,
you can <a :href="raw">download it</a>
and watch it with your favorite video player!
</video>
<i
v-else-if= "
!this.$store.state.multiple &&
selectedCount === 1 &&
req.items[this.selected[0]].isDir"
class="material-icons">folder
</i>
<i v-else class="material-icons">call_to_action</i>
</div>
</div>
<div
<div id="shareList"
v-if="req.isDir && req.items.length > 0"
class="share__box share__box__items"
>
@@ -183,7 +250,7 @@
import { mapState, mapMutations, mapGetters } from "vuex";
import { pub as api } from "@/api";
import { filesize } from "@/utils";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import HeaderBar from "@/components/header/HeaderBar.vue";
import Action from "@/components/header/Action.vue";
@@ -211,6 +278,7 @@ export default {
hash: null,
token: null,
clip: null,
tag: false,
}),
watch: {
$route: function () {
@@ -248,6 +316,9 @@ export default {
link: function () {
return api.getDownloadURL(this.req);
},
raw: function () {
return this.req.items[this.selected[0]].url.replace(/share/, 'api/public/dl')+'?token='+this.token;
},
inlineLink: function () {
return api.getDownloadURL(this.req, true);
},
@@ -270,6 +341,16 @@ export default {
base64: function (name) {
return window.btoa(unescape(encodeURIComponent(name)));
},
play() {
var audio = document.getElementById('myaudio');
if(this.tag){
audio.pause();
this.tag = false;
} else {
audio.play();
this.tag = true;
}
},
fetchData: async function () {
// Reset view information.
this.$store.commit("setReload", false);
@@ -358,3 +439,17 @@ export default {
},
};
</script>
<style scoped>
#listing.list{
height: auto;
}
#shareList{
overflow-y: scroll;
}
@media (min-width: 930px) {
#shareList{
height: calc(100vh - 9.8em);
overflow-y: auto;
}
}
</style>

View File

@@ -1,5 +1,9 @@
<template>
<div id="editor-container">
<div
id="editor-container"
@touchmove.prevent.stop
@wheel.prevent.stop
>
<header-bar>
<action icon="close" :label="$t('buttons.close')" @action="close()" />
<title>{{ req.name }}</title>
@@ -103,13 +107,15 @@ export default {
if (theme == "dark") {
this.editor.setTheme("ace/theme/twilight");
}
this.editor.focus();
},
methods: {
back() {
let uri = url.removeLastDir(this.$route.path) + "/";
this.$router.push({ path: uri });
},
keyEvent(event) {
if (event.code === "Escape") {
this.close();
}
if (!event.ctrlKey && !event.metaKey) {
return;
}
@@ -127,6 +133,7 @@ export default {
try {
await api.put(this.$route.path, this.editor.getValue());
this.editor.session.getUndoManager().markClean();
buttons.success(button);
} catch (e) {
buttons.done(button);
@@ -134,6 +141,11 @@ export default {
}
},
close() {
if (!this.editor.session.getUndoManager().isClean()) {
this.$store.commit("showHover", "discardEditorChanges");
return;
}
this.$store.commit("updateRequest", {});
let uri = url.removeLastDir(this.$route.path) + "/";

View File

@@ -383,17 +383,23 @@ export default {
},
watch: {
req: function () {
// Reset the show value
this.showLimit = 50;
if (window.sessionStorage.getItem("listFrozen") !=="true" && window.sessionStorage.getItem("modified") !=="true"){
// Reset the show value
this.showLimit = 50;
// Ensures that the listing is displayed
Vue.nextTick(() => {
// How much every listing item affects the window height
this.setItemWeight();
// Ensures that the listing is displayed
Vue.nextTick(() => {
// How much every listing item affects the window height
this.setItemWeight();
// Fill and fit the window with listing items
this.fillWindow(true);
});
// Fill and fit the window with listing items
this.fillWindow(true);
});
}
if (this.req.isDir) {
window.sessionStorage.setItem("listFrozen", "false");
window.sessionStorage.setItem("modified", "false");
}
},
},
mounted: function () {

View File

@@ -1,10 +1,12 @@
<template>
<div
id="previewer"
@touchmove.prevent.stop
@wheel.prevent.stop
@mousemove="toggleNavigation"
@touchstart="toggleNavigation"
>
<header-bar>
<header-bar v-if="showNav">
<action icon="close" :label="$t('buttons.close')" @action="close()" />
<title>{{ name }}</title>
<action

View File

@@ -63,7 +63,7 @@
<script>
import { share as api, users } from "@/api";
import { mapState, mapMutations } from "vuex";
import moment from "moment";
import moment from "moment/min/moment-with-locales";
import Clipboard from "clipboard";
import Errors from "@/views/Errors.vue";

View File

@@ -110,7 +110,7 @@ export default {
this.user = {
...defaults,
username: "",
passsword: "",
password: "",
rules: [],
lockPassword: false,
id: 0,

8
go.mod
View File

@@ -23,9 +23,9 @@ require (
github.com/stretchr/testify v1.8.4
github.com/tomasen/realip v0.0.0-20180522021738-f0c99a92ddce
go.etcd.io/bbolt v1.3.7
golang.org/x/crypto v0.14.0
golang.org/x/crypto v0.17.0
golang.org/x/image v0.10.0
golang.org/x/text v0.13.0
golang.org/x/text v0.14.0
gopkg.in/natefinch/lumberjack.v2 v2.2.1
gopkg.in/yaml.v2 v2.4.0
)
@@ -60,8 +60,8 @@ require (
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
github.com/yusufpapurcu/wmi v1.2.2 // indirect
golang.org/x/net v0.17.0 // indirect
golang.org/x/sys v0.13.0 // indirect
google.golang.org/protobuf v1.31.0 // indirect
golang.org/x/sys v0.15.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

16
go.sum
View File

@@ -292,8 +292,8 @@ golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPh
golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4=
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.0.0-20211108221036-ceb1ce70b4fa/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
golang.org/x/crypto v0.17.0 h1:r8bRNjWL3GshPW3gkd+RpvzWrZAwPS49OmTGZ/uhM4k=
golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4=
golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -432,8 +432,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.4.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.15.0 h1:h48lPFYpsTvQJZF4EKyI4aLHaev3CxivZmv7yZig9pc=
golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
@@ -446,8 +446,8 @@ golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ=
golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU=
golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
@@ -595,8 +595,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.31.0 h1:g0LDEJHgrBl9N9r17Ru3sqWhkIx2NB67okBHPwC7hs8=
google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

View File

@@ -1,3 +1,5 @@
#!/bin/sh
PORT=$(jq .port /.filebrowser.json)
curl -f http://localhost:$PORT/health || exit 1
PORT=${FB_PORT:-$(jq .port /.filebrowser.json)}
ADDRESS=${FB_ADDRESS:-$(jq .address /.filebrowser.json)}
ADDRESS=${ADDRESS:-localhost}
curl -f http://$ADDRESS:$PORT/health || exit 1

View File

@@ -98,7 +98,7 @@ func resourcePostHandler(fileCache FileCache) handleFunc {
// Directories creation on POST.
if strings.HasSuffix(r.URL.Path, "/") {
err := d.user.Fs.MkdirAll(r.URL.Path, 0775) //nolint:gomnd
err := d.user.Fs.MkdirAll(r.URL.Path, files.PermDir)
return errToStatus(err), err
}
@@ -256,12 +256,12 @@ func addVersionSuffix(source string, fs afero.Fs) string {
func writeFile(fs afero.Fs, dst string, in io.Reader) (os.FileInfo, error) {
dir, _ := path.Split(dst)
err := fs.MkdirAll(dir, 0775) //nolint:gomnd
err := fs.MkdirAll(dir, files.PermDir)
if err != nil {
return nil, err
}
file, err := fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, 0775) //nolint:gomnd
file, err := fs.OpenFile(dst, os.O_RDWR|os.O_CREATE|os.O_TRUNC, files.PermFile)
if err != nil {
return nil, err
}

View File

@@ -173,7 +173,7 @@ require (
golang.org/x/sync v0.3.0 // indirect
golang.org/x/sys v0.10.0 // indirect
golang.org/x/text v0.9.0 // indirect
google.golang.org/protobuf v1.28.0 // indirect
google.golang.org/protobuf v1.33.0 // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v2 v2.4.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

View File

@@ -934,8 +934,8 @@ google.golang.org/protobuf v1.24.0/go.mod h1:r/3tXBNzIEhYS9I1OUVjXDlt8tc493IdKGj
google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.28.0 h1:w43yiav+6bVFTBQFZX0r7ipe9JQ1QsbMgHwbBziscLw=
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI=
google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos=
gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=