feat: code cleanup, new features and v2.0

We're merging this to continue https://github.com/filebrowser/filebrowser/pull/575 and setup translations auto-updating.
This commit is contained in:
Henrique Dias
2019-01-05 16:12:09 +00:00
committed by GitHub
parent 2642333928
commit 39be89780e
155 changed files with 16499 additions and 6583 deletions

View File

@@ -1,74 +1,19 @@
<template>
<router-view :dependencies="loaded" @update:css="updateCSS" @clean:css="cleanCSS"></router-view>
<div>
<router-view></router-view>
</div>
</template>
<script>
import { mapState } from 'vuex'
export default {
name: 'app',
computed: mapState(['recaptcha']),
data () {
return {
loaded: false
}
},
mounted () {
if (this.recaptcha.length === 0) {
this.unload()
return
}
const loading = document.getElementById('loading')
loading.classList.add('done')
let check = () => {
if (typeof window.grecaptcha === 'undefined') {
setTimeout(check, 100)
return
}
this.unload()
}
check()
},
methods: {
unload () {
this.loaded = true
// Remove loading animation.
let loading = document.getElementById('loading')
loading.classList.add('done')
setTimeout(function () {
loading.parentNode.removeChild(loading)
}, 200)
this.updateCSS()
},
updateCSS (global = false) {
let css = this.$store.state.css
if (typeof this.$store.state.user.css === 'string' && !global) {
css += '\n' + this.$store.state.user.css
}
this.removeCSS()
let style = document.createElement('style')
style.title = 'custom-css'
style.type = 'text/css'
style.appendChild(document.createTextNode(css))
document.head.appendChild(style)
},
removeCSS () {
let style = document.querySelector('style[title="custom-css"]')
if (style === undefined || style === null) {
return
}
style.parentElement.removeChild(style)
},
cleanCSS () {
this.updateCSS(true)
}
setTimeout(function () {
loading.parentNode.removeChild(loading)
}, 200)
}
}
</script>

16
src/api/commands.js Normal file
View File

@@ -0,0 +1,16 @@
import { removePrefix } from './utils'
import { baseURL } from '@/utils/constants'
import store from '@/store'
const ssl = (window.location.protocol === 'https:')
const protocol = (ssl ? 'wss:' : 'ws:')
export default function command(url, command, onmessage, onclose) {
url = removePrefix(url)
url = `${protocol}//${window.location.host}${baseURL}/api/command${url}?auth=${store.state.jwt}`
let conn = new window.WebSocket(url)
conn.onopen = () => conn.send(command)
conn.onmessage = onmessage
conn.onclose = onclose
}

139
src/api/files.js Normal file
View File

@@ -0,0 +1,139 @@
import { fetchURL, removePrefix } from './utils'
import { baseURL } from '@/utils/constants'
import store from '@/store'
export async function fetch (url) {
url = removePrefix(url)
const res = await fetchURL(`/api/resources${url}`, {})
if (res.status === 200) {
let data = await res.json()
data.url = `/files${data.path}`
if (data.isDir) {
if (!data.url.endsWith('/')) data.url += '/'
data.items = data.items.map((item, index) => {
item.index = index
item.url = `${data.url}${encodeURIComponent(item.name)}`
if (item.isDir) {
item.url += '/'
}
return item
})
}
return data
} else {
throw new Error(res.status)
}
}
async function resourceAction (url, method, content) {
url = removePrefix(url)
let opts = { method }
if (content) {
opts.body = content
}
const res = await fetchURL(`/api/resources${url}`, opts)
if (res.status !== 200) {
throw new Error(res.responseText)
} else {
return res
}
}
export async function remove (url) {
return resourceAction(url, 'DELETE')
}
export async function put (url, content = '') {
return resourceAction(url, 'PUT', content)
}
export function download (format, ...files) {
let url = `${baseURL}/api/raw`
if (files.length === 1) {
url += removePrefix(files[0]) + '?'
} else {
let arg = ''
for (let file of files) {
arg += removePrefix(file) + ','
}
arg = arg.substring(0, arg.length - 1)
arg = encodeURIComponent(arg)
url += `/?files=${arg}&`
}
if (format !== null) {
url += `algo=${format}&`
}
url += `auth=${store.state.jwt}`
window.open(url)
}
export async function post (url, content = '', overwrite = false, onupload) {
url = removePrefix(url)
return new Promise((resolve, reject) => {
let request = new XMLHttpRequest()
request.open('POST', `${baseURL}/api/resources${url}?override=${overwrite}`, true)
request.setRequestHeader('Authorization', `Bearer ${store.state.jwt}`)
if (typeof onupload === 'function') {
request.upload.onprogress = onupload
}
request.onload = () => {
if (request.status === 200) {
resolve(request.responseText)
} else if (request.status === 409) {
reject(request.status)
} else {
reject(request.responseText)
}
}
request.onerror = (error) => {
reject(error)
}
request.send(content)
})
}
function moveCopy (items, copy = false) {
let promises = []
for (let item of items) {
let from = removePrefix(item.from)
let to = encodeURIComponent(removePrefix(item.to))
let url = `${from}?action=${copy ? 'copy' : 'rename'}&destination=${to}`
promises.push(resourceAction(url, 'PATCH'))
}
return Promise.all(promises)
}
export function move (items) {
return moveCopy(items)
}
export function copy (items) {
return moveCopy(items, true)
}
export async function checksum (url, algo) {
const data = await resourceAction(`${url}?checksum=${algo}`, 'GET')
return (await data.json()).checksums[algo]
}

15
src/api/index.js Normal file
View File

@@ -0,0 +1,15 @@
import * as files from './files'
import * as share from './share'
import * as users from './users'
import * as settings from './settings'
import search from './search'
import commands from './commands'
export {
files,
share,
users,
settings,
commands,
search
}

8
src/api/search.js Normal file
View File

@@ -0,0 +1,8 @@
import { fetchJSON, removePrefix } from './utils'
export default async function search (url, query) {
url = removePrefix(url)
query = encodeURIComponent(query)
return fetchJSON(`/api/search${url}?query=${query}`, {})
}

16
src/api/settings.js Normal file
View File

@@ -0,0 +1,16 @@
import { fetchURL, fetchJSON } from './utils'
export function get () {
return fetchJSON(`/api/settings`, {})
}
export async function update (settings) {
const res = await fetchURL(`/api/settings`, {
method: 'PUT',
body: JSON.stringify(settings)
})
if (res.status !== 200) {
throw new Error(res.status)
}
}

32
src/api/share.js Normal file
View File

@@ -0,0 +1,32 @@
import { fetchURL, fetchJSON, removePrefix } from './utils'
export async function getHash(hash) {
return fetchJSON(`/api/public/share/${hash}`)
}
export async function get(url) {
url = removePrefix(url)
return fetchJSON(`/api/share${url}`)
}
export async function remove(hash) {
const res = await fetchURL(`/api/share/${hash}`, {
method: 'DELETE'
})
if (res.status !== 200) {
throw new Error(res.status)
}
}
export async function create(url, expires = '', unit = 'hours') {
url = removePrefix(url)
url = `/api/share${url}`
if (expires !== '') {
url += `?expires=${expires}&unit=${unit}`
}
return fetchJSON(url, {
method: 'POST'
})
}

52
src/api/users.js Normal file
View File

@@ -0,0 +1,52 @@
import { fetchURL, fetchJSON } from './utils'
export async function getAll () {
return fetchJSON(`/api/users`, {})
}
export async function get (id) {
return fetchJSON(`/api/users/${id}`, {})
}
export async function create (user) {
const res = await fetchURL(`/api/users`, {
method: 'POST',
body: JSON.stringify({
what: 'user',
which: [],
data: user
})
})
if (res.status === 201) {
return res.headers.get('Location')
} else {
throw new Error(res.status)
}
}
export async function update (user, which = ['all']) {
const res = await fetchURL(`/api/users/${user.id}`, {
method: 'PUT',
body: JSON.stringify({
what: 'user',
which: which,
data: user
})
})
if (res.status !== 200) {
throw new Error(res.status)
}
}
export async function remove (id) {
const res = await fetchURL(`/api/users/${id}`, {
method: 'DELETE'
})
if (res.status !== 200) {
throw new Error(res.status)
}
}

45
src/api/utils.js Normal file
View File

@@ -0,0 +1,45 @@
import store from '@/store'
import { renew } from '@/utils/auth'
import { baseURL } from '@/utils/constants'
export async function fetchURL (url, opts) {
opts = opts || {}
opts.headers = opts.headers || {}
let { headers, ...rest } = opts
const res = await fetch(`${baseURL}${url}`, {
headers: {
'Authorization': `Bearer ${store.state.jwt}`,
...headers
},
...rest
})
if (res.headers.get('X-Renew-Token') === 'true') {
await renew(store.state.jwt)
}
return res
}
export async function fetchJSON (url, opts) {
const res = await fetchURL(url, opts)
if (res.status === 200) {
return res.json()
} else {
throw new Error(res.status)
}
}
export function removePrefix (url) {
if (url.startsWith('/files')) {
url = url.slice(6)
}
if (url === '') url = '/'
if (url[0] !== '/') url = '/' + url
return url
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1,147 +0,0 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xml:space="preserve"
width="560"
height="560"
version="1.1"
style="clip-rule:evenodd;fill-rule:evenodd;image-rendering:optimizeQuality;shape-rendering:geometricPrecision;text-rendering:geometricPrecision"
viewBox="0 0 560 560"
id="svg44"
sodipodi:docname="icon_raw.svg"
inkscape:version="0.92.3 (2405546, 2018-03-11)"
inkscape:export-filename="/home/umarcor/filebrowser/logo/icon_raw.svg.png"
inkscape:export-xdpi="96"
inkscape:export-ydpi="96"><metadata
id="metadata48"><rdf:RDF><cc:Work
rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title /></cc:Work></rdf:RDF></metadata><sodipodi:namedview
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1"
objecttolerance="10"
gridtolerance="10"
guidetolerance="10"
inkscape:pageopacity="0"
inkscape:pageshadow="2"
inkscape:window-width="1366"
inkscape:window-height="711"
id="namedview46"
showgrid="false"
inkscape:zoom="0.33714286"
inkscape:cx="-172.33051"
inkscape:cy="280"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:current-layer="svg44" />
<defs
id="defs4">
<style
type="text/css"
id="style2">
<![CDATA[
.fil1 {fill:#FEFEFE}
.fil6 {fill:#006498}
.fil7 {fill:#0EA5EB}
.fil8 {fill:#2979FF}
.fil3 {fill:#2BBCFF}
.fil0 {fill:#455A64}
.fil4 {fill:#53C6FC}
.fil5 {fill:#BDEAFF}
.fil2 {fill:#332C2B;fill-opacity:0.149020}
]]>
</style>
</defs>
<g
id="g85"
transform="translate(-70,-70)"><path
class="fil1"
d="M 350,71 C 504,71 629,196 629,350 629,504 504,629 350,629 196,629 71,504 71,350 71,196 196,71 350,71 Z"
id="path9"
inkscape:connector-curvature="0"
style="fill:#fefefe" /><path
class="fil2"
d="M 475,236 593,387 C 596,503 444,639 301,585 L 225,486 339,330 c 0,0 138,-95 136,-94 z"
id="path11"
inkscape:connector-curvature="0"
style="fill:#332c2b;fill-opacity:0.14902003" /><path
class="fil3"
d="m 231,211 h 208 l 38,24 v 246 c 0,5 -3,8 -8,8 H 231 c -5,0 -8,-3 -8,-8 V 219 c 0,-5 3,-8 8,-8 z"
id="path13"
inkscape:connector-curvature="0"
style="fill:#2bbcff" /><path
class="fil4"
d="m 231,211 h 208 l 38,24 v 2 L 440,214 H 231 c -4,0 -7,3 -7,7 v 263 c -1,-1 -1,-2 -1,-3 V 219 c 0,-5 3,-8 8,-8 z"
id="path15"
inkscape:connector-curvature="0"
style="fill:#53c6fc" /><polygon
class="fil5"
points="305,212 418,212 418,310 305,310 "
id="polygon17"
style="fill:#bdeaff" /><path
class="fil5"
d="m 255,363 h 189 c 3,0 5,2 5,4 V 483 H 250 V 367 c 0,-2 2,-4 5,-4 z"
id="path19"
inkscape:connector-curvature="0"
style="fill:#bdeaff" /><polygon
class="fil6"
points="250,470 449,470 449,483 250,483 "
id="polygon21"
style="fill:#006498" /><path
class="fil6"
d="m 380,226 h 10 c 3,0 6,2 6,5 v 40 c 0,3 -3,6 -6,6 h -10 c -3,0 -6,-3 -6,-6 v -40 c 0,-3 3,-5 6,-5 z"
id="path23"
inkscape:connector-curvature="0"
style="fill:#006498" /><path
class="fil1"
d="m 254,226 c 10,0 17,7 17,17 0,9 -7,16 -17,16 -9,0 -17,-7 -17,-16 0,-10 8,-17 17,-17 z"
id="path25"
inkscape:connector-curvature="0"
style="fill:#fefefe" /><path
class="fil6"
d="m 267,448 h 165 c 2,0 3,1 3,3 v 0 c 0,1 -1,3 -3,3 H 267 c -2,0 -3,-2 -3,-3 v 0 c 0,-2 1,-3 3,-3 z"
id="path27"
inkscape:connector-curvature="0"
style="fill:#006498" /><path
class="fil6"
d="m 267,415 h 165 c 2,0 3,1 3,3 v 0 c 0,1 -1,2 -3,2 H 267 c -2,0 -3,-1 -3,-2 v 0 c 0,-2 1,-3 3,-3 z"
id="path29"
inkscape:connector-curvature="0"
style="fill:#006498" /><path
class="fil6"
d="m 267,381 h 165 c 2,0 3,2 3,3 v 0 c 0,2 -1,3 -3,3 H 267 c -2,0 -3,-1 -3,-3 v 0 c 0,-1 1,-3 3,-3 z"
id="path31"
inkscape:connector-curvature="0"
style="fill:#006498" /><path
class="fil1"
d="m 236,472 c 3,0 5,2 5,5 0,2 -2,4 -5,4 -3,0 -5,-2 -5,-4 0,-3 2,-5 5,-5 z"
id="path33"
inkscape:connector-curvature="0"
style="fill:#fefefe" /><path
class="fil1"
d="m 463,472 c 3,0 5,2 5,5 0,2 -2,4 -5,4 -3,0 -5,-2 -5,-4 0,-3 2,-5 5,-5 z"
id="path35"
inkscape:connector-curvature="0"
style="fill:#fefefe" /><polygon
class="fil6"
points="305,212 284,212 284,310 305,310 "
id="polygon37"
style="fill:#006498" /><path
class="fil7"
d="m 477,479 v 2 c 0,5 -3,8 -8,8 H 231 c -5,0 -8,-3 -8,-8 v -2 c 0,4 3,8 8,8 h 238 c 5,0 8,-4 8,-8 z"
id="path39"
inkscape:connector-curvature="0"
style="fill:#0ea5eb" /><path
class="fil8"
d="M 350,70 C 505,70 630,195 630,350 630,505 505,630 350,630 195,630 70,505 70,350 70,195 195,70 350,70 Z m 0,46 C 479,116 584,221 584,350 584,479 479,584 350,584 221,584 116,479 116,350 116,221 221,116 350,116 Z"
id="path41"
inkscape:connector-curvature="0"
style="fill:#2979ff" /></g>
</svg>

Before

Width:  |  Height:  |  Size: 5.4 KiB

View File

@@ -4,62 +4,56 @@
<button @click="openSidebar" :aria-label="$t('buttons.toggleSidebar')" :title="$t('buttons.toggleSidebar')" class="action">
<i class="material-icons">menu</i>
</button>
<img src="../assets/logo.svg" alt="File Browser">
<search></search>
<img :src="logoURL" alt="File Browser">
<search v-if="isLogged"></search>
</div>
<div>
<button @click="openSearch" :aria-label="$t('buttons.search')" :title="$t('buttons.search')" class="search-button action">
<i class="material-icons">search</i>
</button>
<button v-show="showSaveButton" :aria-label="$t('buttons.save')" :title="$t('buttons.save')" class="action" id="save-button">
<i class="material-icons">save</i>
</button>
<template v-if="staticGen.length > 0">
<button v-show="showPublishButton" :aria-label="$t('buttons.publish')" :title="$t('buttons.publish')" class="action" id="publish-button">
<i class="material-icons">send</i>
<template v-if="isLogged">
<button @click="openSearch" :aria-label="$t('buttons.search')" :title="$t('buttons.search')" class="search-button action">
<i class="material-icons">search</i>
</button>
</template>
<button @click="openMore" id="more" :aria-label="$t('buttons.more')" :title="$t('buttons.more')" class="action">
<i class="material-icons">more_vert</i>
</button>
<button v-show="showSaveButton" :aria-label="$t('buttons.save')" :title="$t('buttons.save')" class="action" id="save-button">
<i class="material-icons">save</i>
</button>
<!-- Menu that shows on listing AND mobile when there are files selected -->
<div id="file-selection" v-if="isMobile && req.kind === 'listing'">
<span v-if="selectedCount > 0">{{ selectedCount }} selected</span>
<share-button v-show="showRenameButton"></share-button>
<rename-button v-show="showRenameButton"></rename-button>
<copy-button v-show="showMoveButton"></copy-button>
<move-button v-show="showMoveButton"></move-button>
<delete-button v-show="showDeleteButton"></delete-button>
</div>
<button @click="openMore" id="more" :aria-label="$t('buttons.more')" :title="$t('buttons.more')" class="action">
<i class="material-icons">more_vert</i>
</button>
<!-- This buttons are shown on a dropdown on mobile phones -->
<div id="dropdown" :class="{ active: showMore }">
<div v-if="!isListing || !isMobile">
<share-button v-show="showRenameButton"></share-button>
<!-- Menu that shows on listing AND mobile when there are files selected -->
<div id="file-selection" v-if="isMobile && isListing">
<span v-if="selectedCount > 0">{{ selectedCount }} selected</span>
<share-button v-show="showShareButton"></share-button>
<rename-button v-show="showRenameButton"></rename-button>
<copy-button v-show="showMoveButton"></copy-button>
<copy-button v-show="showCopyButton"></copy-button>
<move-button v-show="showMoveButton"></move-button>
<delete-button v-show="showDeleteButton"></delete-button>
</div>
<template v-if="staticGen.length > 0">
<schedule-button v-show="showPublishButton"></schedule-button>
</template>
<!-- This buttons are shown on a dropdown on mobile phones -->
<div id="dropdown" :class="{ active: showMore }">
<div v-if="!isListing || !isMobile">
<share-button v-show="showShareButton"></share-button>
<rename-button v-show="showRenameButton"></rename-button>
<copy-button v-show="showCopyButton"></copy-button>
<move-button v-show="showMoveButton"></move-button>
<delete-button v-show="showDeleteButton"></delete-button>
</div>
<switch-button v-show="showSwitchButton"></switch-button>
<download-button v-show="showCommonButton"></download-button>
<upload-button v-show="showUpload"></upload-button>
<info-button v-show="showCommonButton"></info-button>
<shell-button v-show="user.perm.execute" />
<switch-button v-show="isListing"></switch-button>
<download-button v-show="showDownloadButton"></download-button>
<upload-button v-show="showUpload"></upload-button>
<info-button v-show="isFiles"></info-button>
<button v-show="isListing" @click="openSelect" :aria-label="$t('buttons.selectMultiple')" :title="$t('buttons.selectMultiple')" class="action">
<i class="material-icons">check_circle</i>
<span>{{ $t('buttons.select') }}</span>
</button>
</div>
</template>
<button v-show="showSelectButton" @click="openSelect" :aria-label="$t('buttons.selectMultiple')" :title="$t('buttons.selectMultiple')" class="action">
<i class="material-icons">check_circle</i>
<span>{{ $t('buttons.select') }}</span>
</button>
</div>
<div v-show="showOverlay" @click="resetPrompts" class="overlay"></div>
</div>
</header>
@@ -75,14 +69,15 @@ import DownloadButton from './buttons/Download'
import SwitchButton from './buttons/SwitchView'
import MoveButton from './buttons/Move'
import CopyButton from './buttons/Copy'
import ScheduleButton from './buttons/Schedule'
import ShareButton from './buttons/Share'
import ShellButton from './buttons/Shell'
import {mapGetters, mapState} from 'vuex'
import * as api from '@/utils/api'
import { logoURL } from '@/utils/constants'
import * as api from '@/api'
import buttons from '@/utils/buttons'
export default {
name: 'main',
name: 'header-layout',
components: {
Search,
InfoButton,
@@ -94,7 +89,7 @@ export default {
UploadButton,
SwitchButton,
MoveButton,
ScheduleButton
ShellButton
},
data: function () {
return {
@@ -114,88 +109,62 @@ export default {
},
computed: {
...mapGetters([
'selectedCount'
'selectedCount',
'isFiles',
'isEditor',
'isListing',
'isLogged'
]),
...mapState([
'req',
'user',
'loading',
'reload',
'multiple',
'staticGen'
'multiple'
]),
logoURL: () => logoURL,
isMobile () {
return this.width <= 736
},
isListing () {
return this.req.kind === 'listing'
},
showSelectButton () {
return this.req.kind === 'listing' && !this.loading && this.$route.name === 'Files'
showUpload () {
return this.isListing && this.user.perm.create
},
showSaveButton () {
return (this.req.kind === 'editor' && !this.loading)
return this.isEditor && this.user.perm.modify
},
showPublishButton () {
return (this.req.kind === 'editor' && !this.loading && this.user.allowPublish)
},
showSwitchButton () {
return this.req.kind === 'listing' && this.$route.name === 'Files' && !this.loading
},
showCommonButton () {
return !(this.$route.name !== 'Files' || this.loading)
},
showUpload () {
if (this.$route.name !== 'Files' || this.loading) return false
if (this.req.kind === 'editor') return false
return this.user.allowNew
showDownloadButton () {
return this.isFiles && this.user.perm.download
},
showDeleteButton () {
if (this.$route.name !== 'Files' || this.loading) return false
if (this.req.kind === 'listing') {
if (this.selectedCount === 0) {
return false
}
return this.user.allowEdit
}
return this.user.allowEdit
return this.isFiles && (this.isListing
? (this.selectedCount !== 0 && this.user.perm.delete)
: this.user.perm.delete)
},
showRenameButton () {
if (this.$route.name !== 'Files' || this.loading) return false
if (this.req.kind === 'listing') {
if (this.selectedCount === 1) {
return this.user.allowEdit
}
return false
}
return this.user.allowEdit
return this.isFiles && (this.isListing
? (this.selectedCount === 1 && this.user.perm.rename)
: this.user.perm.rename)
},
showShareButton () {
return this.isFiles && (this.isListing
? (this.selectedCount === 1 && this.user.perm.share)
: this.user.perm.share)
},
showMoveButton () {
if (this.$route.name !== 'Files' || this.loading) return false
if (this.req.kind !== 'listing') {
return false
}
if (this.selectedCount > 0) {
return this.user.allowEdit
}
return false
return this.isFiles && (this.isListing
? (this.selectedCount > 0 && this.user.perm.rename)
: this.user.perm.rename)
},
showCopyButton () {
return this.isFiles && (this.isListing
? (this.selectedCount > 0 && this.user.perm.create)
: this.user.perm.create)
},
showMore () {
if (this.$route.name !== 'Files' || this.loading) return false
return (this.$store.state.show === 'more')
return this.isFiles && this.$store.state.show === 'more'
},
showOverlay () {
return (this.$store.state.show === 'more')
return this.showMore
}
},
methods: {

View File

@@ -1,44 +1,53 @@
<template>
<div id="search" @click="open" v-bind:class="{ active , ongoing }">
<div id="input">
<button v-if="active" class="action" @click="close" :aria-label="$t('buttons.close')" :title="$t('buttons.close')">
<button
v-if="active"
class="action"
@click="close"
:aria-label="$t('buttons.close')"
:title="$t('buttons.close')"
>
<i class="material-icons">arrow_back</i>
</button>
<i v-else class="material-icons">search</i>
<input type="text"
@keyup="keyup"
<input
type="text"
@keyup.exact="keyup"
@keyup.enter="submit"
ref="input"
:autofocus="active"
v-model.trim="value"
:aria-label="$t('search.writeToSearch')"
:placeholder="placeholder">
:aria-label="$t('search.search')"
:placeholder="$t('search.search')"
>
</div>
<div id="result">
<div>
<template v-if="search.length === 0 && commands.length === 0">
<template v-if="isEmpty">
<p>{{ text }}</p>
<template v-if="value.length === 0">
<div class="boxes">
<h3>{{ $t('search.types') }}</h3>
<div>
<div tabindex="0"
<div
tabindex="0"
v-for="(v,k) in boxes"
:key="k"
role="button"
@click="init('type:'+k)"
:aria-label="$t('search.'+v.label)">
:aria-label="$t('search.'+v.label)"
>
<i class="material-icons">{{v.icon}}</i>
<p>{{ $t('search.'+v.label) }}</p>
</div>
</div>
</div>
</template>
</template>
<ul v-else-if="search.length > 0">
<ul v-else-if="results.length > 0">
<li v-for="(s,k) in results" :key="k">
<router-link @click.native="close" :to="'./' + s.path">
<i v-if="s.dir" class="material-icons">folder</i>
@@ -47,228 +56,129 @@
</router-link>
</li>
</ul>
<pre v-else-if="commands.length > 0"><template v-for="c in commands">{{ c }}</template></pre>
</div>
<p id="renew"><i class="material-icons spin">autorenew</i></p>
<p id="renew">
<i class="material-icons spin">autorenew</i>
</p>
</div>
</div>
</template>
<script>
import { mapState } from 'vuex'
import url from '@/utils/url'
import * as api from '@/utils/api'
import { mapState, mapGetters, mapMutations } from "vuex"
import url from "@/utils/url"
import { search } from "@/api"
// TODO: show fifty at the tie
var boxes = {
image: { label: 'images', icon: 'insert_photo' },
audio: { label: 'music', icon: 'volume_up' },
video: { label: 'video', icon: 'movie' },
pdf: { label: 'pdf', icon: 'picture_as_pdf' }
image: { label: "images", icon: "insert_photo" },
audio: { label: "music", icon: "volume_up" },
video: { label: "video", icon: "movie" },
pdf: { label: "pdf", icon: "picture_as_pdf" }
}
export default {
name: 'search',
data: function () {
name: "search",
data: function() {
return {
value: '',
value: "",
active: false,
ongoing: false,
scrollable: null,
search: [],
commands: [],
results: [],
reload: false,
resultsCount: 50,
boxes: boxes
scrollable: null
}
},
watch: {
show (val, old) {
this.active = (val === 'search')
show(val, old) {
this.active = val === "search"
// If the hover was search and now it's something else
// we should blur the input.
if (old === 'search' && val !== 'search') {
if (old === "search" && !this.active) {
if (this.reload) {
this.$store.commit('setReload', true)
this.setReload(true)
}
document.body.style.overflow = 'auto'
document.body.style.overflow = "auto"
this.reset()
this.$refs.input.blur()
}
// If we are starting to show the search box, we should
// focus the input.
if (val === 'search') {
} else if (this.active) {
this.reload = false
this.$refs.input.focus()
document.body.style.overflow = 'hidden'
document.body.style.overflow = "hidden"
}
}
},
computed: {
...mapState(['user', 'show']),
// Placeholder value.
placeholder () {
if (this.user.allowCommands && this.user.commands.length > 0) {
return this.$t('search.searchOrCommand')
}
return this.$t('search.search')
...mapState(["user", "show"]),
...mapGetters(["isListing"]),
boxes() {
return boxes
},
// The text that is shown on the results' box while
// there is no search result or command output to show.
text () {
isEmpty() {
return this.results.length === 0
},
text() {
if (this.ongoing) {
return ''
return ""
}
if (this.value.length === 0) {
if (this.user.allowCommands && this.user.commands.length > 0) {
return `${this.$t('search.searchOrSupportedCommand')} ${this.user.commands.join(', ')}.`
}
this.$t('search.typeSearch')
}
if (!(this.value[0] === '$') || !this.user.allowCommands) {
return this.$t('search.pressToSearch')
} else {
if (this.command.length === 0) {
return this.$t('search.typeCommand')
}
if (!this.supported()) {
return this.$t('search.notSupportedCommand')
}
return this.$t('search.pressToExecute')
}
},
// The command, without the leading symbol ('$') with or without a following space (' ')
command () {
return this.value[1] === ' ' ? this.value.slice(2) : this.value.slice(1)
},
results () {
return this.search.slice(0, this.resultsCount)
return this.value === '' ? this.$t("search.typeToSearch") : this.$t("search.pressToSearch")
}
},
mounted () {
// Gets the result div which will be scrollable.
this.scrollable = document.querySelector('#search #result')
// Adds the keydown event on window for the ESC key, so
// when it's pressed, it closes the search window.
window.addEventListener('keydown', (event) => {
mounted() {
window.addEventListener("keydown", event => {
if (event.keyCode === 27) {
this.$store.commit('closeHovers')
}
})
this.scrollable.addEventListener('scroll', (event) => {
if (this.scrollable.scrollTop === (this.scrollable.scrollHeight - this.scrollable.offsetHeight)) {
this.resultsCount += 50
this.closeHovers()
}
})
},
methods: {
// Sets the search to active.
open (event) {
this.$store.commit('showHover', 'search')
...mapMutations(["showHover", "closeHovers", "setReload"]),
open() {
this.showHover("search")
},
// Closes the search and prevents the event
// of propagating so it doesn't trigger the
// click event on #search.
close (event) {
close(event) {
event.stopPropagation()
event.preventDefault()
this.$store.commit('closeHovers')
this.closeHovers()
},
// Checks if the current input is a supported command.
supported () {
let cmd = this.command.split(' ')[0]
let cl = this.user.commands.length
if (cl !== 0) {
for (let i = 0; i < cl; i++) {
if (cmd.match(this.user.commands[i])) {
return true
}
}
}
return false
},
// Initializes the search with a default value.
init (string) {
this.value = string + ' '
this.$refs.input.focus()
},
// Resets the search box value.
reset () {
this.value = ''
this.active = false
this.ongoing = false
this.resultsCount = 50
this.search = []
this.commands = []
},
// When the user presses a key, if it is ESC
// then it will close the search box. Otherwise,
// it will set the search box to active and clean
// the search results, as well as commands'.
keyup (event) {
keyup(event) {
if (event.keyCode === 27) {
this.close(event)
return
}
this.search.length = 0
this.commands.length = 0
this.results.length = 0
},
// Submits the input to the server and sets ongoing to true.
submit (event) {
this.ongoing = true
init (string) {
this.value = `${string} `
this.$refs.input.focus()
},
reset () {
this.value = ''
this.active = false
this.ongoing = false
this.resultsCount = 50
this.results = []
},
async submit(event) {
event.preventDefault()
let path = this.$route.path
if (this.$store.state.req.kind !== 'listing') {
path = url.removeLastDir(path) + '/'
}
// In case of being a command.
if (this.value[0] === '$') {
if (this.supported() && this.user.allowCommands) {
api.command(path, this.command,
(event) => {
this.commands.push(event.data)
this.scrollable.scrollTop = this.scrollable.scrollHeight
},
(event) => {
this.reload = true
this.ongoing = false
this.scrollable.scrollTop = this.scrollable.scrollHeight
}
)
return
}
this.ongoing = false
if (this.value === '') {
return
}
let results = []
let path = this.$route.path
if (!this.isListing) {
path = url.removeLastDir(path) + "/"
}
// In case of being a search.
api.search(path, this.value,
(event) => {
let response = JSON.parse(event.data)
if (response.path[0] === '/') {
response.path = response.path.substring(1)
}
this.ongoing = true
results.push(response)
},
(event) => {
this.ongoing = false
this.search = results
}
)
this.results = await search(path, this.value)
this.ongoing = false
}
}
}

115
src/components/Shell.vue Normal file
View File

@@ -0,0 +1,115 @@
<template>
<div @click="focus" class="shell" ref="scrollable" :class="{ ['shell--hidden']: !showShell}">
<div v-for="(c, index) in content" :key="index" class="shell__result" >
<div class="shell__prompt"><i class="material-icons">chevron_right</i></div>
<pre class="shell__text">{{ c.text }}</pre>
</div>
<div class="shell__result" :class="{ 'shell__result--hidden': !canInput }" >
<div class="shell__prompt"><i class="material-icons">chevron_right</i></div>
<pre
tabindex="0"
ref="input"
class="shell__text"
contenteditable="true"
@keydown.prevent.38="historyUp"
@keydown.prevent.40="historyDown"
@keypress.prevent.enter="submit" />
</div>
</div>
</template>
<script>
import { mapMutations, mapState, mapGetters } from 'vuex'
import { commands } from '@/api'
export default {
name: 'shell',
computed: {
...mapState([ 'user', 'showShell' ]),
...mapGetters([ 'isFiles', 'isLogged' ]),
path: function () {
if (this.isFiles) {
return this.$route.path
}
return ''
}
},
data: () => ({
content: [],
history: [],
historyPos: 0,
canInput: true
}),
methods: {
...mapMutations([ 'toggleShell' ]),
scroll: function () {
this.$refs.scrollable.scrollTop = this.$refs.scrollable.scrollHeight
},
focus: function () {
this.$refs.input.focus()
},
historyUp () {
if (this.historyPos > 0) {
this.$refs.input.innerText = this.history[--this.historyPos]
this.focus()
}
},
historyDown () {
if (this.historyPos >= 0 && this.historyPos < this.history.length - 1) {
this.$refs.input.innerText = this.history[++this.historyPos]
this.focus()
} else {
this.historyPos = this.history.length
this.$refs.input.innerText = ''
}
},
submit: function (event) {
const cmd = event.target.innerText.trim()
if (cmd === '') {
return
}
if (cmd === 'clear') {
this.content = []
event.target.innerHTML = ''
return
}
if (cmd === 'exit') {
event.target.innerHTML = ''
this.toggleShell()
return
}
this.canInput = false
event.target.innerHTML = ''
let results = {
text: `${cmd}\n\n`
}
this.history.push(cmd)
this.historyPos = this.history.length
this.content.push(results)
commands(
this.path,
cmd,
event => {
results.text += `${event.data}\n`
this.scroll()
},
() => {
results.text = results.text.trimEnd()
this.canInput = true
this.$refs.input.focus()
this.scroll()
}
)
}
}
}
</script>

View File

@@ -1,89 +1,80 @@
<template>
<nav :class="{active}">
<router-link class="action" to="/files/" :aria-label="$t('sidebar.myFiles')" :title="$t('sidebar.myFiles')">
<i class="material-icons">folder</i>
<span>{{ $t('sidebar.myFiles') }}</span>
</router-link>
<div v-if="user.allowNew">
<button @click="$store.commit('showHover', 'newDir')" class="action" :aria-label="$t('sidebar.newFolder')" :title="$t('sidebar.newFolder')">
<i class="material-icons">create_new_folder</i>
<span>{{ $t('sidebar.newFolder') }}</span>
</button>
<button @click="$store.commit('showHover', 'newFile')" class="action" :aria-label="$t('sidebar.newFile')" :title="$t('sidebar.newFile')">
<i class="material-icons">note_add</i>
<span>{{ $t('sidebar.newFile') }}</span>
</button>
</div>
<div v-if="staticGen.length > 0">
<router-link to="/files/settings"
:aria-label="$t('sidebar.siteSettings')"
:title="$t('sidebar.siteSettings')"
class="action">
<i class="material-icons">settings</i>
<span>{{ $t('sidebar.siteSettings') }}</span>
<template v-if="isLogged">
<router-link class="action" to="/files/" :aria-label="$t('sidebar.myFiles')" :title="$t('sidebar.myFiles')">
<i class="material-icons">folder</i>
<span>{{ $t('sidebar.myFiles') }}</span>
</router-link>
<template v-if="staticGen === 'hugo'">
<button class="action"
:aria-label="$t('sidebar.hugoNew')"
:title="$t('sidebar.hugoNew')"
v-if="user.allowNew"
@click="$store.commit('showHover', 'new-archetype')">
<i class="material-icons">merge_type</i>
<span>{{ $t('sidebar.hugoNew') }}</span>
<div v-if="user.perm.create">
<button @click="$store.commit('showHover', 'newDir')" class="action" :aria-label="$t('sidebar.newFolder')" :title="$t('sidebar.newFolder')">
<i class="material-icons">create_new_folder</i>
<span>{{ $t('sidebar.newFolder') }}</span>
</button>
</template>
<button class="action"
:aria-label="$t('sidebar.preview')"
:title="$t('sidebar.preview')"
@click="preview">
<i class="material-icons">remove_red_eye</i>
<span>{{ $t('sidebar.preview') }}</span>
</button>
</div>
<button @click="$store.commit('showHover', 'newFile')" class="action" :aria-label="$t('sidebar.newFile')" :title="$t('sidebar.newFile')">
<i class="material-icons">note_add</i>
<span>{{ $t('sidebar.newFile') }}</span>
</button>
</div>
<div v-if="!$store.state.noAuth">
<router-link class="action" to="/settings" :aria-label="$t('sidebar.settings')" :title="$t('sidebar.settings')">
<i class="material-icons">settings_applications</i>
<span>{{ $t('sidebar.settings') }}</span>
<div>
<router-link class="action" to="/settings" :aria-label="$t('sidebar.settings')" :title="$t('sidebar.settings')">
<i class="material-icons">settings_applications</i>
<span>{{ $t('sidebar.settings') }}</span>
</router-link>
<button v-if="!noAuth" @click="logout" class="action" id="logout" :aria-label="$t('sidebar.logout')" :title="$t('sidebar.logout')">
<i class="material-icons">exit_to_app</i>
<span>{{ $t('sidebar.logout') }}</span>
</button>
</div>
</template>
<template v-else>
<router-link class="action" to="/login" :aria-label="$t('sidebar.login')" :title="$t('sidebar.login')">
<i class="material-icons">exit_to_app</i>
<span>{{ $t('sidebar.login') }}</span>
</router-link>
<button @click="logout" class="action" id="logout" :aria-label="$t('sidebar.logout')" :title="$t('sidebar.logout')">
<i class="material-icons">exit_to_app</i>
<span>{{ $t('sidebar.logout') }}</span>
</button>
</div>
<router-link v-if="signup" class="action" to="/login" :aria-label="$t('sidebar.signup')" :title="$t('sidebar.signup')">
<i class="material-icons">person_add</i>
<span>{{ $t('sidebar.signup') }}</span>
</router-link>
</template>
<p class="credits">
<span><a rel="noopener noreferrer" href="https://github.com/filebrowser/filebrowser">File Browser</a> v{{ version }}</span>
<span>
<span v-if="disableExternal">File Browser</span>
<a v-else rel="noopener noreferrer" target="_blank" href="https://github.com/filebrowser/filebrowser">File Browser</a>
<span> v{{ version }}</span>
</span>
<span><a @click="help">{{ $t('sidebar.help') }}</a></span>
</p>
</nav>
</template>
<script>
import {mapState} from 'vuex'
import auth from '@/utils/auth'
import { mapState, mapGetters } from 'vuex'
import * as auth from '@/utils/auth'
import { version, signup, disableExternal, noAuth } from '@/utils/constants'
export default {
name: 'sidebar',
computed: {
...mapState(['user', 'staticGen', 'version']),
...mapState([ 'user' ]),
...mapGetters([ 'isLogged' ]),
active () {
return this.$store.state.show === 'sidebar'
}
},
signup: () => signup,
version: () => version,
disableExternal: () => disableExternal,
noAuth: () => noAuth
},
methods: {
help () {
this.$store.commit('showHover', 'help')
},
preview () {
window.open(this.$store.state.baseURL + '/preview/')
},
logout: auth.logout
}
}

View File

@@ -9,7 +9,7 @@
export default {
name: 'copy-button',
methods: {
show: function (event) {
show: function () {
this.$store.commit('showHover', 'copy')
}
}

View File

@@ -9,7 +9,7 @@
export default {
name: 'delete-button',
methods: {
show: function (event) {
show: function () {
this.$store.commit('showHover', 'delete')
}
}

View File

@@ -8,30 +8,26 @@
<script>
import {mapGetters, mapState} from 'vuex'
import * as api from '@/utils/api'
import { files as api } from '@/api'
export default {
name: 'download-button',
computed: {
...mapState(['req', 'selected']),
...mapGetters(['selectedCount'])
...mapGetters(['isListing', 'selectedCount'])
},
methods: {
download: function (event) {
// If we are not on a listing, download the current file.
if (this.req.kind !== 'listing') {
download: function () {
if (!this.isListing) {
api.download(null, this.$route.path)
return
}
// If we are on a listing and there is one element selected,
// download it.
if (this.selectedCount === 1 && !this.req.items[this.selected[0]].isDir) {
api.download(null, this.req.items[this.selected[0]].url)
return
}
// Otherwise show the prompt to choose the formt of the download.
this.$store.commit('showHover', 'download')
}
}

View File

@@ -9,7 +9,7 @@
export default {
name: 'info-button',
methods: {
show: function (event) {
show: function () {
this.$store.commit('showHover', 'info')
}
}

View File

@@ -9,7 +9,7 @@
export default {
name: 'move-button',
methods: {
show: function (event) {
show: function () {
this.$store.commit('showHover', 'move')
}
}

View File

@@ -9,7 +9,7 @@
export default {
name: 'rename-button',
methods: {
show: function (event) {
show: function () {
this.$store.commit('showHover', 'rename')
}
}

View File

@@ -1,21 +0,0 @@
<template>
<button @click="show"
:aria-label="$t('buttons.schedule')"
:title="$t('buttons.schedule')"
id="schedule-button"
class="action">
<i class="material-icons">alarm</i>
<span>{{ $t('buttons.schedule') }}</span>
</button>
</template>
<script>
export default {
name: 'schedule-button',
methods: {
show: function (event) {
this.$store.commit('showHover', 'schedule')
}
}
}
</script>

View File

@@ -9,7 +9,7 @@
export default {
name: 'share-button',
methods: {
show (event) {
show () {
this.$store.commit('showHover', 'share')
}
}

View File

@@ -0,0 +1,17 @@
<template>
<button @click="show" :aria-label="$t('buttons.shell')" :title="$t('buttons.shell')" class="action">
<i class="material-icons">code</i>
<span>{{ $t('buttons.shell') }}</span>
</button>
</template>
<script>
export default {
name: 'shell-button',
methods: {
show: function () {
this.$store.commit('toggleShell')
}
}
}
</script>

View File

@@ -7,7 +7,7 @@
<script>
import { mapState, mapMutations } from 'vuex'
import { updateUser } from '@/utils/api'
import { users as api } from '@/api'
export default {
name: 'switch-button',
@@ -19,17 +19,21 @@ export default {
}
},
methods: {
...mapMutations(['updateUser']),
change: function (event) {
// If we are on mobile we should close the dropdown.
this.$store.commit('closeHovers')
...mapMutations([ 'updateUser', 'closeHovers' ]),
change: async function () {
this.closeHovers()
let user = {...this.user}
user.viewMode = (this.icon === 'view_list') ? 'list' : 'mosaic'
const data = {
id: this.user.id,
viewMode: (this.icon === 'view_list') ? 'list' : 'mosaic'
}
updateUser(user, 'partial').then(() => {
this.updateUser({ viewMode: user.viewMode })
}).catch(this.$showError)
try {
await api.update(data, ['viewMode'])
this.updateUser(data)
} catch (e) {
this.$showError(e)
}
}
}
}

View File

@@ -9,7 +9,7 @@
export default {
name: 'upload-button',
methods: {
upload: function (event) {
upload: function () {
document.getElementById('upload-input').click()
}
}

View File

@@ -1,90 +1,51 @@
<template>
<form id="editor" :class="req.language">
<div v-if="hasMetadata" id="metadata">
<h2>{{ $t('files.metadata') }}</h2>
</div>
<h2 v-if="hasMetadata">{{ $t('files.body') }}</h2>
</form>
<form id="editor"></form>
</template>
<script>
import { mapState } from 'vuex'
import CodeMirror from '@/utils/codemirror'
import * as api from '@/utils/api'
import { files as api } from '@/api'
import buttons from '@/utils/buttons'
import ace from 'ace-builds/src-min-noconflict/ace.js'
import modelist from 'ace-builds/src-min-noconflict/ext-modelist.js'
import 'ace-builds/webpack-resolver'
export default {
name: 'editor',
computed: {
...mapState(['req', 'schedule']),
hasMetadata: function () {
return (this.req.metadata !== undefined && this.req.metadata !== null)
}
...mapState(['req'])
},
data: function () {
return {
metadata: null,
metalang: null,
content: null
content: null,
editor: null
}
},
created () {
window.addEventListener('keydown', this.keyEvent)
document.getElementById('save-button').addEventListener('click', this.save)
let publish = document.getElementById('publish-button')
if (publish !== null) {
publish.addEventListener('click', this.publish)
}
},
beforeDestroy () {
window.removeEventListener('keydown', this.keyEvent)
document.getElementById('save-button').removeEventListener('click', this.save)
let publish = document.getElementById('publish-button')
if (publish !== null) {
publish.removeEventListener('click', this.publish)
}
},
mounted: function () {
if (this.req.content === undefined || this.req.content === null) {
this.req.content = ''
}
// Set up the main content editor.
this.content = CodeMirror(document.getElementById('editor'), {
this.editor = ace.edit('editor', {
maxLines: Infinity,
minLines: 20,
value: this.req.content,
lineNumbers: (this.req.language !== 'markdown'),
viewportMargin: 500,
autofocus: true,
mode: this.req.language,
theme: (this.req.language === 'markdown') ? 'markdown' : 'ttcn',
lineWrapping: (this.req.language === 'markdown')
showPrintMargin: false,
readOnly: this.req.type === 'textImmutable',
theme: 'ace/theme/chrome',
mode: modelist.getModeForPath(this.req.name).mode
})
CodeMirror.autoLoadMode(this.content, this.req.language)
// Prevent of going on if there is no metadata.
if (!this.hasMetadata) {
return
}
this.parseMetadata()
// Set up metadata editor.
this.metadata = CodeMirror(document.getElementById('metadata'), {
value: this.req.metadata,
viewportMargin: Infinity,
lineWrapping: true,
theme: 'markdown',
mode: this.metalang
})
CodeMirror.autoLoadMode(this.metadata, this.metalang)
},
methods: {
// Saves the content when the user presses CTRL-S.
keyEvent (event) {
if (!event.ctrlKey && !event.metaKey) {
return
@@ -97,46 +58,17 @@ export default {
event.preventDefault()
this.save()
},
// Parses the metadata and gets the language in which
// it is written.
parseMetadata () {
if (this.req.metadata.startsWith('{')) {
this.metalang = 'json'
}
async save () {
const button = 'save'
buttons.loading('save')
if (this.req.metadata.startsWith('---')) {
this.metalang = 'yaml'
try {
await api.put(this.$route.path, this.editor.getValue())
buttons.success(button)
} catch (e) {
buttons.done(button)
this.$showError(e)
}
if (this.req.metadata.startsWith('+++')) {
this.metalang = 'toml'
}
},
// Publishes the file.
publish (event) {
this.save(event, true)
},
// Saves the file.
save (event, regenerate = false) {
let button = regenerate ? 'publish' : 'save'
if (this.schedule !== '') button = 'schedule'
let content = this.content.getValue()
buttons.loading(button)
if (this.hasMetadata) {
content = this.metadata.getValue() + '\n\n' + content
}
api.put(this.$route.path, content, regenerate, this.schedule)
.then(() => {
buttons.success(button)
this.$store.commit('setSchedule', '')
})
.catch(error => {
buttons.done(button)
this.$showError(error)
this.$store.commit('setSchedule', '')
})
}
}
}

View File

@@ -49,7 +49,6 @@
<h2 v-if="req.numDirs > 0">{{ $t('files.folders') }}</h2>
<div v-if="req.numDirs > 0">
<item v-for="(item) in dirs"
v-if="item.isDir"
:key="base64(item.name)"
v-bind:index="item.index"
v-bind:name="item.name"
@@ -64,7 +63,6 @@
<h2 v-if="req.numFiles > 0">{{ $t('files.files') }}</h2>
<div v-if="req.numFiles > 0">
<item v-for="(item) in files"
v-if="!item.isDir"
:key="base64(item.name)"
v-bind:index="item.index"
v-bind:name="item.name"
@@ -88,10 +86,10 @@
</template>
<script>
import {mapState} from 'vuex'
import { mapState, mapMutations } from 'vuex'
import Item from './ListingItem'
import css from '@/utils/css'
import * as api from '@/utils/api'
import { users, files as api } from '@/api'
import buttons from '@/utils/buttons'
export default {
@@ -105,24 +103,22 @@ export default {
computed: {
...mapState(['req', 'selected', 'user']),
nameSorted () {
return (this.req.sort === 'name')
return (this.req.sorting.by === 'name')
},
sizeSorted () {
return (this.req.sort === 'size')
return (this.req.sorting.by === 'size')
},
modifiedSorted () {
return (this.req.sort === 'modified')
return (this.req.sorting.by === 'modified')
},
ascOrdered () {
return (this.req.order === 'asc')
return this.req.sorting.asc
},
items () {
const dirs = []
const files = []
this.req.items.forEach((item, index) => {
item.index = index
this.req.items.forEach((item) => {
if (item.isDir) {
dirs.push(item)
} else {
@@ -184,6 +180,7 @@ export default {
document.removeEventListener('drop', this.drop)
},
methods: {
...mapMutations([ 'updateUser' ]),
base64: function (name) {
return window.btoa(unescape(encodeURIComponent(name)))
},
@@ -213,7 +210,10 @@ export default {
event.preventDefault()
},
copyCut (event, key) {
event.preventDefault()
if (event.target.tagName.toLowerCase() === 'input') {
return
}
let items = []
for (let i of this.selected) {
@@ -223,6 +223,10 @@ export default {
})
}
if (items.length == 0) {
return
}
this.$store.commit('updateClipboard', {
key: key,
items: items
@@ -233,15 +237,21 @@ export default {
return
}
event.preventDefault()
let items = []
for (let item of this.$store.state.clipboard.items) {
items.push({
from: item.from,
to: this.$route.path + item.name
})
const from = item.from.endsWith('/') ? item.from.slice(0, -1) : item.from
const to = this.$route.path + item.name
if (from === to) {
return
}
items.push({ from, to })
}
if (items.length === 0) {
return
}
if (this.$store.state.clipboard.key === 'x') {
@@ -267,7 +277,7 @@ export default {
this.show += 50
}
},
dragEnter (event) {
dragEnter () {
// When the user starts dragging an item, put every
// file on the listing with 50% opacity.
let items = document.getElementsByClassName('item')
@@ -276,7 +286,7 @@ export default {
file.style.opacity = 0.5
})
},
dragEnd (event) {
dragEnd () {
this.resetOpacity()
},
drop: function (event) {
@@ -391,27 +401,29 @@ export default {
return false
},
sort (sort) {
let order = 'desc'
async sort (by) {
let asc = false
if (sort === 'name') {
if (by === 'name') {
if (this.nameIcon === 'arrow_upward') {
order = 'asc'
asc = true
}
} else if (sort === 'size') {
} else if (by === 'size') {
if (this.sizeIcon === 'arrow_upward') {
order = 'asc'
asc = true
}
} else if (sort === 'modified') {
} else if (by === 'modified') {
if (this.modifiedIcon === 'arrow_upward') {
order = 'asc'
asc = true
}
}
let path = this.$store.state.baseURL
if (path === '') path = '/'
document.cookie = `sort=${sort}; max-age=31536000; path=${path}`
document.cookie = `order=${order}; max-age=31536000; path=${path}`
try {
await users.update({ id: this.user.id, sorting: { by, asc } }, ['sorting'])
} catch (e) {
this.$showError(e)
}
this.$store.commit('setReload', true)
}
}

View File

@@ -33,7 +33,7 @@
import { mapMutations, mapGetters, mapState } from 'vuex'
import filesize from 'filesize'
import moment from 'moment'
import * as api from '@/utils/api'
import { files as api } from '@/api'
export default {
name: 'item',
@@ -65,7 +65,7 @@ export default {
humanTime: function () {
return moment(this.modified).fromNow()
},
dragStart: function (event) {
dragStart: function () {
if (this.selectedCount === 0) {
this.addSelected(this.index)
return
@@ -140,7 +140,7 @@ export default {
if (!event.ctrlKey && !this.$store.state.multiple) this.resetSelected()
this.addSelected(this.index)
},
touchstart (event) {
touchstart () {
setTimeout(() => {
this.touches = 0
}, 300)
@@ -150,7 +150,7 @@ export default {
this.open()
}
},
open: function (event) {
open: function () {
this.$router.push({path: this.url})
}
}

View File

@@ -5,9 +5,9 @@
<i class="material-icons">close</i>
</button>
<rename-button v-if="allowEdit()"></rename-button>
<delete-button v-if="allowEdit()"></delete-button>
<download-button></download-button>
<rename-button v-if="user.perm.rename"></rename-button>
<delete-button v-if="user.perm.delete"></delete-button>
<download-button v-if="user.perm.download"></download-button>
<info-button></info-button>
</div>
@@ -19,19 +19,23 @@
</button>
<div class="preview">
<img v-if="req.type == 'image'" :src="raw()">
<audio v-else-if="req.type == 'audio'" :src="raw()" autoplay controls></audio>
<video v-else-if="req.type == 'video'" :src="raw()" autoplay controls>
<track v-for="(sub, index) in subtitles" :kind="sub.kind" :src="'/api/subtitle/' + sub.src" :label="sub.label" :default="index === 0">
<img v-if="req.type == 'image'" :src="raw">
<audio v-else-if="req.type == 'audio'" :src="raw" autoplay controls></audio>
<video v-else-if="req.type == 'video'" :src="raw" autoplay controls>
<track
kind="captions"
v-for="(sub, index) in subtitles"
:key="index"
:src="sub"
:label="'Subtitle ' + index" :default="index === 0">
Sorry, your browser doesn't support embedded videos,
but don't worry, you can <a :href="download()">download it</a>
but don't worry, you can <a :href="download">download it</a>
and watch it with your favorite video player!
</video>
<object v-else-if="req.extension == '.pdf'" class="pdf" :data="raw()"></object>
<a v-else-if="req.type == 'blob'" :href="download()">
<object v-else-if="req.extension == '.pdf'" class="pdf" :data="raw"></object>
<a v-else-if="req.type == 'blob'" :href="download">
<h2 class="message">{{ $t('buttons.download') }} <i class="material-icons">file_download</i></h2>
</a>
<pre v-else >{{ req.content }}</pre>
</div>
</div>
</template>
@@ -39,12 +43,20 @@
<script>
import { mapState } from 'vuex'
import url from '@/utils/url'
import * as api from '@/utils/api'
import { baseURL } from '@/utils/constants'
import { files as api } from '@/api'
import InfoButton from '@/components/buttons/Info'
import DeleteButton from '@/components/buttons/Delete'
import RenameButton from '@/components/buttons/Rename'
import DownloadButton from '@/components/buttons/Download'
const mediaTypes = [
"image",
"video",
"audio",
"blob"
]
export default {
name: 'preview',
components: {
@@ -62,44 +74,44 @@ export default {
}
},
computed: {
...mapState(['req', 'oldReq']),
...mapState(['req', 'user', 'oldReq', 'jwt']),
hasPrevious () {
return (this.previousLink !== '')
},
hasNext () {
return (this.nextLink !== '')
},
download () {
return `${baseURL}/api/raw${this.req.path}?auth=${this.jwt}`
},
raw () {
return `${this.download}&inline=true`
}
},
mounted () {
async mounted () {
window.addEventListener('keyup', this.key)
api.fetch(url.removeLastDir(this.$route.path))
.then(req => {
this.listing = req
this.updateLinks()
})
.catch(this.$showError)
if (this.req.type === 'audio' || this.req.type === 'video') {
api.subtitles(this.req.url.slice(6))
.then(req => {
this.subtitles = req
})
.catch(this.$showError)
if (this.req.subtitles) {
this.subtitles = this.req.subtitles.map(sub => `${baseURL}/api/raw${sub}?auth=${this.jwt}&inline=true`)
}
try {
if (this.oldReq.items) {
this.updateLinks(this.oldReq.items)
} else {
const path = url.removeLastDir(this.$route.path)
const res = await api.fetch(path)
this.updateLinks(res.items)
}
} catch (e) {
this.$showError(e)
}
},
beforeDestroy () {
window.removeEventListener('keyup', this.key)
},
methods: {
download () {
let url = `${this.$store.state.baseURL}/api/download`
url += this.req.url.slice(6)
return url
},
raw () {
return `${this.download()}?&inline=true`
},
back (event) {
back () {
let uri = url.removeLastDir(this.$route.path) + '/'
this.$router.push({ path: uri })
},
@@ -118,30 +130,28 @@ export default {
if (this.hasPrevious) this.prev()
}
},
updateLinks () {
let pos = null
for (let i = 0; i < this.listing.items.length; i++) {
if (this.listing.items[i].name === this.req.name) {
pos = i
break
updateLinks (items) {
for (let i = 0; i < items.length; i++) {
if (items[i].name !== this.req.name) {
continue
}
for (let j = i - 1; j >= 0; j--) {
if (mediaTypes.includes(items[j].type)) {
this.previousLink = items[j].url
break
}
}
for (let j = i + 1; j < items.length; j++) {
if (mediaTypes.includes(items[j].type)) {
this.nextLink = items[j].url
break
}
}
}
if (pos === null) {
return
}
if (pos !== 0) {
this.previousLink = this.listing.items[pos - 1].url
}
if (pos !== this.listing.items.length - 1) {
this.nextLink = this.listing.items[pos + 1].url
}
},
allowEdit (event) {
return this.$store.state.user.allowEdit
}
}
}

View File

@@ -10,11 +10,11 @@
</div>
<div class="card-action">
<button class="cancel flat"
<button class="button button--flat button--grey"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="flat"
<button class="button button--flat"
@click="copy"
:disabled="$route.path === dest"
:aria-label="$t('buttons.copy')"
@@ -26,7 +26,7 @@
<script>
import { mapState } from 'vuex'
import FileList from './FileList'
import * as api from '@/utils/api'
import { files as api } from '@/api'
import buttons from '@/utils/buttons'
export default {
@@ -40,7 +40,7 @@ export default {
},
computed: mapState(['req', 'selected']),
methods: {
copy: function (event) {
copy: async function (event) {
event.preventDefault()
buttons.loading('copy')
let items = []
@@ -53,16 +53,14 @@ export default {
})
}
// Execute the promises.
api.copy(items)
.then(() => {
buttons.success('copy')
this.$router.push({ path: this.dest })
})
.catch(error => {
buttons.done('copy')
this.$showError(error)
})
try {
await api.copy(items)
buttons.success('copy')
this.$router.push({ path: this.dest })
} catch (e) {
buttons.done('copy')
this.$showError(e)
}
}
}
}

View File

@@ -6,11 +6,11 @@
</div>
<div class="card-action">
<button @click="$store.commit('closeHovers')"
class="flat cancel"
class="button button--flat button--grey"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button @click="submit"
class="flat"
class="button button--flat button--red"
:aria-label="$t('buttons.delete')"
:title="$t('buttons.delete')">{{ $t('buttons.delete') }}</button>
</div>
@@ -19,61 +19,47 @@
<script>
import {mapGetters, mapMutations, mapState} from 'vuex'
import { remove } from '@/utils/api'
import { files as api } from '@/api'
import url from '@/utils/url'
import buttons from '@/utils/buttons'
export default {
name: 'delete',
computed: {
...mapGetters(['selectedCount']),
...mapGetters(['isListing', 'selectedCount']),
...mapState(['req', 'selected'])
},
methods: {
...mapMutations(['closeHovers']),
submit: function (event) {
submit: async function () {
this.closeHovers()
buttons.loading('delete')
// If we are not on a listing, delete the current
// opened file.
if (this.req.kind !== 'listing') {
remove(this.$route.path)
.then(() => {
buttons.success('delete')
this.$router.push({ path: url.removeLastDir(this.$route.path) + '/' })
})
.catch(error => {
buttons.done('delete')
this.$showError(error)
})
return
}
if (this.selectedCount === 0) {
// This shouldn't happen...
return
}
// Create the promises array and fill it with
// the delete request for every selected file.
let promises = []
for (let index of this.selected) {
promises.push(remove(this.req.items[index].url))
}
Promise.all(promises)
.then(() => {
try {
if (!this.isListing) {
await api.remove(this.$route.path)
buttons.success('delete')
this.$store.commit('setReload', true)
})
.catch(error => {
buttons.done('delete')
this.$store.commit('setReload', true)
this.$showError(error)
})
this.$router.push({ path: url.removeLastDir(this.$route.path) + '/' })
return
}
if (this.selectedCount === 0) {
return
}
let promises = []
for (let index of this.selected) {
promises.push(api.remove(this.req.items[index].url))
}
await Promise.all(promises)
buttons.success('delete')
this.$store.commit('setReload', true)
} catch (e) {
buttons.done('delete')
this.$showError(e)
if (this.isListing) this.$store.commit('setReload', true)
}
}
}
}

View File

@@ -7,18 +7,20 @@
<div class="card-content">
<p>{{ $t('prompts.downloadMessage') }}</p>
<button class="block cancel" @click="download('zip')" v-focus>zip</button>
<button class="block cancel" @click="download('tar')" v-focus>tar</button>
<button class="block cancel" @click="download('targz')" v-focus>tar.gz</button>
<button class="block cancel" @click="download('tarbz2')" v-focus>tar.bz2</button>
<button class="block cancel" @click="download('tarxz')" v-focus>tar.xz</button>
<button class="button button--block" @click="download('zip')" v-focus>zip</button>
<button class="button button--block" @click="download('tar')" v-focus>tar</button>
<button class="button button--block" @click="download('targz')" v-focus>tar.gz</button>
<button class="button button--block" @click="download('tarbz2')" v-focus>tar.bz2</button>
<button class="button button--block" @click="download('tarxz')" v-focus>tar.xz</button>
<button class="button button--block" @click="download('tarlz4')" v-focus>tar.lz4</button>
<button class="button button--block" @click="download('tarsz')" v-focus>tar.sz</button>
</div>
</div>
</template>
<script>
import {mapGetters, mapState} from 'vuex'
import * as api from '@/utils/api'
import { files as api } from '@/api'
export default {
name: 'download',

View File

@@ -19,7 +19,7 @@
<script>
import { mapState } from 'vuex'
import url from '@/utils/url'
import * as api from '@/utils/api'
import { files } from '@/api'
export default {
name: 'file-list',
@@ -35,7 +35,7 @@ export default {
}
},
computed: {
...mapState(['req']),
...mapState([ 'req' ]),
nav () {
return decodeURIComponent(this.current)
}
@@ -51,7 +51,7 @@ export default {
// Otherwise, we must be on a preview or editor
// so we fetch the data from the previous directory.
api.fetch(url.removeLastDir(this.$route.path))
files.fetch(url.removeLastDir(this.$route.path))
.then(this.fillOptions)
.catch(this.$showError)
},
@@ -94,7 +94,7 @@ export default {
// content.
let uri = event.currentTarget.dataset.url
api.fetch(uri)
files.fetch(uri)
.then(this.fillOptions)
.catch(this.$showError)
},

View File

@@ -21,7 +21,7 @@
<div class="card-action">
<button type="submit"
@click="$store.commit('closeHovers')"
class="flat"
class="button button--flat"
:aria-label="$t('buttons.ok')"
:title="$t('buttons.ok')">{{ $t('buttons.ok') }}</button>
</div>
@@ -29,6 +29,6 @@
</template>
<script>
export default {name: 'help'}
export default { name: 'help' }
</script>

View File

@@ -7,27 +7,27 @@
<div class="card-content">
<p v-if="selected.length > 1">{{ $t('prompts.filesSelected', { count: selected.length }) }}</p>
<p v-if="selected.length < 2"><strong>{{ $t('prompts.displayName') }}</strong> {{ name() }}</p>
<p><strong>{{ $t('prompts.size') }}:</strong> <span id="content_length"></span>{{ humanSize() }}</p>
<p v-if="selected.length < 2"><strong>{{ $t('prompts.lastModified') }}:</strong> {{ humanTime() }}</p>
<p v-if="selected.length < 2"><strong>{{ $t('prompts.displayName') }}</strong> {{ name }}</p>
<p><strong>{{ $t('prompts.size') }}:</strong> <span id="content_length"></span> {{ humanSize }}</p>
<p v-if="selected.length < 2"><strong>{{ $t('prompts.lastModified') }}:</strong> {{ humanTime }}</p>
<template v-if="dir() && selected.length === 0">
<template v-if="dir && selected.length === 0">
<p><strong>{{ $t('prompts.numberFiles') }}:</strong> {{ req.numFiles }}</p>
<p><strong>{{ $t('prompts.numberDirs') }}:</strong> {{ req.numDirs }}</p>
</template>
<template v-if="!dir()">
<p><strong>MD5:</strong> <code><a @click="checksum($event, 'md5')">{{ $t('prompts.show') }}</a></code></p>
<p><strong>SHA1:</strong> <code><a @click="checksum($event, 'sha1')">{{ $t('prompts.show') }}</a></code></p>
<p><strong>SHA256:</strong> <code><a @click="checksum($event, 'sha256')">{{ $t('prompts.show') }}</a></code></p>
<p><strong>SHA512:</strong> <code><a @click="checksum($event, 'sha512')">{{ $t('prompts.show') }}</a></code></p>
<template v-if="!dir">
<p><strong>MD5: </strong><code><a @click="checksum($event, 'md5')">{{ $t('prompts.show') }}</a></code></p>
<p><strong>SHA1: </strong><code><a @click="checksum($event, 'sha1')">{{ $t('prompts.show') }}</a></code></p>
<p><strong>SHA256: </strong><code><a @click="checksum($event, 'sha256')">{{ $t('prompts.show') }}</a></code></p>
<p><strong>SHA512: </strong><code><a @click="checksum($event, 'sha512')">{{ $t('prompts.show') }}</a></code></p>
</template>
</div>
<div class="card-action">
<button type="submit"
@click="$store.commit('closeHovers')"
class="flat"
class="button button--flat"
:aria-label="$t('buttons.ok')"
:title="$t('buttons.ok')">{{ $t('buttons.ok') }}</button>
</div>
@@ -38,71 +38,44 @@
import {mapState, mapGetters} from 'vuex'
import filesize from 'filesize'
import moment from 'moment'
import * as api from '@/utils/api'
import { files as api } from '@/api'
export default {
name: 'info',
computed: {
...mapState(['req', 'selected']),
...mapGetters(['selectedCount'])
},
methods: {
...mapGetters(['selectedCount', 'isListing']),
humanSize: function () {
// If there are no files selected or this is not a listing
// show the human file size of the current request.
if (this.selectedCount === 0 || this.req.kind !== 'listing') {
if (this.selectedCount === 0 || !this.isListing) {
return filesize(this.req.size)
}
// Otherwise, sum the sizes of each selected file and returns
// its human form.
var sum = 0
let sum = 0
for (let i = 0; i < this.selectedCount; i++) {
sum += this.req.items[this.selected[i]].size
for (let selected of this.selected) {
sum += this.req.items[selected].size
}
return filesize(sum)
},
humanTime: function () {
// If there are no selected files, return the current request
// modified time.
if (this.selectedCount === 0) {
return moment(this.req.modified).fromNow()
}
// Otherwise return the modified time of the first item
// that is selected since this should not appear when
// there is more than one file selected.
return moment(this.req.items[this.selected[0]]).fromNow()
},
name: function () {
// Return the name of the current opened file if there
// are no selected files.
if (this.selectedCount === 0) {
return this.req.name
}
// Otherwise, just return the name of the selected file.
// This field won't show when there is more than one
// file selected.
return this.req.items[this.selected[0]].name
return this.selectedCount === 0 ? this.req.name : this.req.items[this.selected[0]].name
},
dir: function () {
if (this.selectedCount > 1) {
// Don't show when multiple selected.
return true
}
if (this.selectedCount === 0) {
return this.req.isDir
}
return this.req.items[this.selected[0]].isDir
},
checksum: function (event, hash) {
// Gets the checksum of the current selected or
// opened file. Doesn't work for directories.
return this.selectedCount > 1 || (this.selectedCount === 0
? this.req.isDir
: this.req.items[this.selected[0]].isDir)
}
},
methods: {
checksum: async function (event, algo) {
event.preventDefault()
let link
@@ -113,9 +86,12 @@ export default {
link = this.$route.path
}
api.checksum(link, hash)
.then((hash) => { event.target.innerHTML = hash })
.catch(this.$showError)
try {
const hash = await api.checksum(link, algo)
event.target.innerHTML = hash
} catch (e) {
this.$showError(e)
}
}
}
}

View File

@@ -9,11 +9,11 @@
</div>
<div class="card-action">
<button class="flat cancel"
<button class="button button--flat button--grey"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="flat"
<button class="button button--flat"
@click="move"
:disabled="$route.path === dest"
:aria-label="$t('buttons.move')"
@@ -25,7 +25,7 @@
<script>
import { mapState } from 'vuex'
import FileList from './FileList'
import * as api from '@/utils/api'
import { files as api } from '@/api'
import buttons from '@/utils/buttons'
export default {
@@ -39,12 +39,11 @@ export default {
},
computed: mapState(['req', 'selected']),
methods: {
move: function (event) {
move: async function (event) {
event.preventDefault()
buttons.loading('move')
let items = []
// Create a new promise for each file.
for (let item of this.selected) {
items.push({
from: this.req.items[item].url,
@@ -52,16 +51,14 @@ export default {
})
}
// Execute the promises.
api.move(items)
.then(() => {
buttons.success('move')
this.$router.push({ path: this.dest })
})
.catch(error => {
buttons.done('move')
this.$showError(error)
})
try {
api.move(items)
buttons.success('move')
this.$router.push({ path: this.dest })
} catch (e) {
buttons.done('move')
this.$showError(e)
}
event.preventDefault()
}

View File

@@ -1,76 +0,0 @@
<template>
<div class="card floating">
<div class="card-title">
<h2>{{ $t('prompts.newFile') }}</h2>
</div>
<div class="card-content">
<p>{{ $t('prompts.newArchetype') }}</p>
<input v-focus type="text" @keyup.enter="submit" v-model.trim="name">
<input type="text" @keyup.enter="submit" v-model.trim="archetype">
</div>
<div class="card-action">
<button class="flat cancel"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="flat"
@click="submit"
:aria-label="$t('buttons.create')"
:title="$t('buttons.create')">{{ $t('buttons.create') }}</button>
</div>
</div>
</template>
<script>
import { removePrefix } from '@/utils/api'
export default {
name: 'new-archetype',
data: function () {
return {
name: '',
archetype: 'default'
}
},
methods: {
submit: function (event) {
event.preventDefault()
this.$store.commit('closeHovers')
this.new('/' + this.name, this.archetype)
.then((url) => {
this.$router.push({ path: url })
})
.catch(this.$showError)
},
new (url, type) {
url = removePrefix(url)
if (!url.endsWith('.md') && !url.endsWith('.markdown')) {
url += '.markdown'
}
return new Promise((resolve, reject) => {
let request = new window.XMLHttpRequest()
request.open('POST', `${this.$store.state.baseURL}/api/resource${url}`, true)
if (!this.$store.state.noAuth) request.setRequestHeader('Authorization', `Bearer ${this.$store.state.jwt}`)
request.setRequestHeader('Archetype', encodeURIComponent(type))
request.onload = () => {
if (request.status === 200) {
resolve(request.getResponseHeader('Location'))
} else {
reject(request.responseText)
}
}
request.onerror = (error) => reject(error)
request.send()
})
}
}
}
</script>

View File

@@ -6,55 +6,66 @@
<div class="card-content">
<p>{{ $t('prompts.newDirMessage') }}</p>
<input type="text" @keyup.enter="submit" v-model.trim="name" v-focus >
<input class="input input--block" type="text" @keyup.enter="submit" v-model.trim="name" v-focus>
</div>
<div class="card-action">
<button class="cancel flat"
<button
class="button button--flat button--grey"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="flat"
:title="$t('buttons.cancel')"
>{{ $t('buttons.cancel') }}</button>
<button
class="button button--flat"
:aria-label="$t('buttons.create')"
:title="$t('buttons.create')"
@click="submit">{{ $t('buttons.create') }}</button>
@click="submit"
>{{ $t('buttons.create') }}</button>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { files as api } from '@/api'
import url from '@/utils/url'
import * as api from '@/utils/api'
export default {
name: 'new-dir',
data: function () {
data: function() {
return {
name: ''
}
};
},
computed: {
...mapGetters([ 'isFiles', 'isListing' ])
},
methods: {
submit: function (event) {
submit: async function(event) {
event.preventDefault()
if (this.new === '') return
// Build the path of the new directory.
let uri = this.$route.path
if (this.$store.state.req.kind !== 'listing') {
let uri = this.isFiles ? this.$route.path + '/' : '/'
if (!this.isListing) {
uri = url.removeLastDir(uri) + '/'
}
uri += this.name + '/'
uri = uri.replace('//', '/')
api.post(uri)
.then(() => { this.$router.push({ path: uri }) })
.catch(this.$showError)
try {
await api.post(uri)
this.$router.push({ path: uri })
} catch (e) {
this.$showError(e)
}
// Close the prompt
this.$store.commit('closeHovers')
}
}
}
};
</script>

View File

@@ -6,56 +6,66 @@
<div class="card-content">
<p>{{ $t('prompts.newFileMessage') }}</p>
<input v-focus type="text" @keyup.enter="submit" v-model.trim="name">
<input class="input input--block" v-focus type="text" @keyup.enter="submit" v-model.trim="name">
</div>
<div class="card-action">
<button class="cancel flat"
<button
class="button button--flat button--grey"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="flat"
:title="$t('buttons.cancel')"
>{{ $t('buttons.cancel') }}</button>
<button
class="button button--flat"
@click="submit"
:aria-label="$t('buttons.create')"
:title="$t('buttons.create')">{{ $t('buttons.create') }}</button>
:title="$t('buttons.create')"
>{{ $t('buttons.create') }}</button>
</div>
</div>
</template>
<script>
import { mapGetters } from 'vuex'
import { files as api } from '@/api'
import url from '@/utils/url'
import * as api from '@/utils/api'
export default {
name: 'new-file',
data: function () {
data: function() {
return {
name: ''
}
};
},
computed: {
...mapGetters([ 'isFiles', 'isListing' ])
},
methods: {
submit: function (event) {
submit: async function(event) {
event.preventDefault()
if (this.new === '') return
// Build the path of the new file.
let uri = this.$route.path
if (this.$store.state.req.kind !== 'listing') {
// Build the path of the new directory.
let uri = this.isFiles ? this.$route.path + '/' : '/'
if (!this.isListing) {
uri = url.removeLastDir(uri) + '/'
}
uri += this.name
uri = uri.replace('//', '/')
// Create the new file.
api.post(uri)
.then(() => { this.$router.push({ path: uri }) })
.catch(this.$showError)
try {
await api.post(uri)
this.$router.push({ path: uri })
} catch (e) {
this.$showError(e)
}
// Close the prompt.
this.$store.commit('closeHovers')
}
}
}
};
</script>

View File

@@ -10,8 +10,6 @@
<move v-else-if="showMove"></move>
<copy v-else-if="showCopy"></copy>
<replace v-else-if="showReplace"></replace>
<schedule v-else-if="show === 'schedule'"></schedule>
<new-archetype v-else-if="show === 'new-archetype'"></new-archetype>
<share v-else-if="show === 'share'"></share>
<div v-show="showOverlay" @click="resetPrompts" class="overlay"></div>
</div>
@@ -27,21 +25,16 @@ import Move from './Move'
import Copy from './Copy'
import NewFile from './NewFile'
import NewDir from './NewDir'
import NewArchetype from './NewArchetype'
import Replace from './Replace'
import Schedule from './Schedule'
import Share from './Share'
import { mapState } from 'vuex'
import buttons from '@/utils/buttons'
import * as api from '@/utils/api'
export default {
name: 'prompts',
components: {
Info,
Delete,
NewArchetype,
Schedule,
Rename,
Download,
Move,
@@ -55,7 +48,6 @@ export default {
data: function () {
return {
pluginData: {
api,
buttons,
'store': this.$store,
'router': this.$router

View File

@@ -6,16 +6,16 @@
<div class="card-content">
<p>{{ $t('prompts.renameMessage') }} <code>{{ oldName() }}</code>:</p>
<input v-focus type="text" @keyup.enter="submit" v-model.trim="name">
<input class="input input--block" v-focus type="text" @keyup.enter="submit" v-model.trim="name">
</div>
<div class="card-action">
<button class="cancel flat"
<button class="button button--flat button--grey"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button @click="submit"
class="flat"
class="button button--flat"
type="submit"
:aria-label="$t('buttons.rename')"
:title="$t('buttons.rename')">{{ $t('buttons.rename') }}</button>
@@ -24,9 +24,9 @@
</template>
<script>
import { mapState } from 'vuex'
import { mapState, mapGetters } from 'vuex'
import url from '@/utils/url'
import * as api from '@/utils/api'
import { files as api } from '@/api'
export default {
name: 'rename',
@@ -38,14 +38,16 @@ export default {
created () {
this.name = this.oldName()
},
computed: mapState(['req', 'selected', 'selectedCount']),
computed: {
...mapState(['req', 'selected', 'selectedCount']),
...mapGetters(['isListing'])
},
methods: {
cancel: function (event) {
cancel: function () {
this.$store.commit('closeHovers')
},
oldName: function () {
// Get the current name of the file we are editing.
if (this.req.kind !== 'listing') {
if (!this.isListing) {
return this.req.name
}
@@ -56,11 +58,11 @@ export default {
return this.req.items[this.selected[0]].name
},
submit: function (event) {
submit: async function () {
let oldLink = ''
let newLink = ''
if (this.req.kind !== 'listing') {
if (!this.isListing) {
oldLink = this.req.url
} else {
oldLink = this.req.items[this.selected[0]].url
@@ -69,16 +71,17 @@ export default {
this.name = encodeURIComponent(this.name)
newLink = url.removeLastDir(oldLink) + '/' + this.name
api.move([{ from: oldLink, to: newLink }])
.then(() => {
if (this.req.kind !== 'listing') {
this.$router.push({ path: newLink })
return
}
this.$store.commit('setReload', true)
}).catch(error => {
this.$showError(error)
})
try {
await api.move([{ from: oldLink, to: newLink }])
if (!this.isListing) {
this.$router.push({ path: newLink })
return
}
this.$store.commit('setReload', true)
} catch (e) {
this.$showError(e)
}
this.$store.commit('closeHovers')
}

View File

@@ -9,11 +9,11 @@
</div>
<div class="card-action">
<button class="flat cancel"
<button class="button button--flat button--grey"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="flat"
<button class="button button--flat button--red"
@click="showConfirm"
:aria-label="$t('buttons.replace')"
:title="$t('buttons.replace')">{{ $t('buttons.replace') }}</button>

View File

@@ -1,47 +0,0 @@
<template>
<div class="card floating">
<div class="card-title">
<h2>{{ $t('prompts.schedule') }}</h2>
</div>
<div class="card-content">
<p>{{ $t('prompts.scheduleMessage') }}</p>
<input v-focus type="datetime-local" v-model="date">
</div>
<div class="card-action">
<button class="cancel flat"
@click="close"
:aria-label="$t('buttons.cancel')"
:title="$t('buttons.cancel')">{{ $t('buttons.cancel') }}</button>
<button class="falt"
@click="submit"
:aria-label="$t('buttons.schedule')"
:title="$t('buttons.schedule')">{{ $t('buttons.schedule') }}</button>
</div>
</div>
</template>
<script>
export default {
name: 'schedule',
data: function () {
return {
date: ''
}
},
methods: {
close () {
this.$store.commit('closeHovers')
},
submit: function (event) {
event.preventDefault()
if (this.date === '') return
this.close()
this.$store.commit('setSchedule', this.date)
document.getElementById('save-button').click()
}
}
}
</script>

View File

@@ -12,7 +12,7 @@
<li v-for="link in links" :key="link.hash">
<a :href="buildLink(link.hash)" target="_blank">
<template v-if="link.expires">{{ humanTime(link.expireDate) }}</template>
<template v-if="link.expire !== 0">{{ humanTime(link.expire) }}</template>
<template v-else>{{ $t('permanent') }}</template>
</a>
@@ -49,7 +49,7 @@
</div>
<div class="card-action">
<button class="flat"
<button class="button button--flat"
@click="$store.commit('closeHovers')"
:aria-label="$t('buttons.close')"
:title="$t('buttons.close')">{{ $t('buttons.close') }}</button>
@@ -58,8 +58,9 @@
</template>
<script>
import { mapState } from 'vuex'
import { getShare, deleteShare, share } from '@/utils/api'
import { mapState, mapGetters } from 'vuex'
import { share as api } from '@/api'
import { baseURL } from '@/utils/constants'
import moment from 'moment'
import Clipboard from 'clipboard'
@@ -75,10 +76,10 @@ export default {
}
},
computed: {
...mapState([ 'baseURL', 'req', 'selected', 'selectedCount' ]),
...mapState([ 'req', 'selected', 'selectedCount' ]),
...mapGetters([ 'isListing' ]),
url () {
// Get the current name of the file we are editing.
if (this.req.kind !== 'listing') {
if (!this.isListing) {
return this.$route.path
}
@@ -90,27 +91,25 @@ export default {
return this.req.items[this.selected[0]].url
}
},
beforeMount () {
getShare(this.url)
.then(links => {
this.links = links
this.sort()
async beforeMount () {
try {
const links = await api.get(this.url)
this.links = links
this.sort()
for (let link of this.links) {
if (!link.expires) {
this.hasPermanent = true
break
}
for (let link of this.links) {
if (link.expire === 0) {
this.hasPermanent = true
break
}
})
.catch(error => {
if (error === 404) return
this.$showError(error)
})
}
} catch (e) {
this.$showError(e)
}
},
mounted () {
this.clip = new Clipboard('.copy-clipboard')
this.clip.on('success', (e) => {
this.clip.on('success', () => {
this.$showSuccess(this.$t('success.linkCopied'))
})
},
@@ -118,42 +117,48 @@ export default {
this.clip.destroy()
},
methods: {
submit: function (event) {
submit: async function () {
if (!this.time) return
share(this.url, this.time, this.unit)
.then(result => { this.links.push(result); this.sort() })
.catch(this.$showError)
try {
const res = await api.create(this.url, this.time, this.unit)
this.links.push(res)
this.sort()
} catch (e) {
this.$showError(e)
}
},
getPermalink (event) {
share(this.url)
.then(result => {
this.links.push(result)
this.sort()
this.hasPermanent = true
})
.catch(this.$showError)
getPermalink: async function () {
try {
const res = await api.create(this.url)
this.links.push(res)
this.sort()
this.hasPermanent = true
} catch (e) {
this.$showError(e)
}
},
deleteLink (event, link) {
deleteLink: async function (event, link) {
event.preventDefault()
deleteShare(link.hash)
.then(() => {
if (!link.expires) this.hasPermanent = false
this.links = this.links.filter(item => item.hash !== link.hash)
})
.catch(this.$showError)
try {
await api.remove(link.hash)
if (link.expire === 0) this.hasPermanent = false
this.links = this.links.filter(item => item.hash !== link.hash)
} catch (e) {
this.$showError(e)
}
},
humanTime (time) {
return moment(time).fromNow()
return moment(time * 1000).fromNow()
},
buildLink (hash) {
return `${window.location.origin}${this.baseURL}/share/${hash}`
return `${window.location.origin}${baseURL}/share/${hash}`
},
sort () {
this.links = this.links.sort((a, b) => {
if (!a.expires) return -1
if (!b.expires) return 1
return new Date(a.expireDate) - new Date(b.expireDate)
if (a.expire === 0) return -1
if (b.expire === 0) return 1
return new Date(a.expire) - new Date(b.expire)
})
}
}

View File

@@ -0,0 +1,24 @@
<template>
<div>
<h3>{{ $t('settings.userCommands') }}</h3>
<p class="small">{{ $t('settings.userCommandsHelp') }} <i>git svn hg</i>.</p>
<input class="input input--block" type="text" v-model.trim="raw">
</div>
</template>
<script>
export default {
name: 'permissions',
props: ['commands'],
computed: {
raw: {
get () {
return this.commands.join(' ')
},
set (value) {
this.$emit('update:commands', value.split(' '))
}
}
}
}
</script>

View File

@@ -1,28 +1,29 @@
<template>
<select v-on:change="change" :value="selected">
<select v-on:change="change" :value="locale">
<option value="ar">{{ $t('languages.ar') }}</option>
<option value="de">{{ $t('languages.de') }}</option>
<option value="en">{{ $t('languages.en') }}</option>
<option value="it">{{ $t('languages.it') }}</option>
<option value="es">{{ $t('languages.es') }}</option>
<option value="fr">{{ $t('languages.fr') }}</option>
<option value="pt">{{ $t('languages.pt') }}</option>
<option value="pt-br">{{ $t('languages.ptBR') }}</option>
<option value="it">{{ $t('languages.it') }}</option>
<option value="ja">{{ $t('languages.ja') }}</option>
<option value="ko">{{ $t('languages.ko') }}</option>
<option value="pl">{{ $t('languages.pl') }}</option>
<option value="pt-br">{{ $t('languages.ptBR') }}</option>
<option value="pt">{{ $t('languages.pt') }}</option>
<option value="ru">{{ $t('languages.ru') }}</option>
<option value="zh-cn">{{ $t('languages.zhCN') }}</option>
<option value="zh-tw">{{ $t('languages.zhTW') }}</option>
<option value="es">{{ $t('languages.es') }}</option>
<option value="de">{{ $t('languages.de') }}</option>
<option value="ru">{{ $t('languages.ru') }}</option>
<option value="pl">{{ $t('languages.pl') }}</option>
<option value="ko">{{ $t('languages.ko') }}</option>
</select>
</template>
<script>
export default {
name: 'languages',
props: [ 'selected' ],
props: [ 'locale' ],
methods: {
change (event) {
this.$emit('update:selected', event.target.value)
this.$emit('update:locale', event.target.value)
}
}
}

View File

@@ -0,0 +1,39 @@
<template>
<div>
<h3>{{ $t('settings.permissions') }}</h3>
<p class="small">{{ $t('settings.permissionsHelp') }}</p>
<p><input type="checkbox" v-model="admin"> {{ $t('settings.administrator') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.create"> {{ $t('settings.perm.create') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.delete"> {{ $t('settings.perm.delete') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.download"> {{ $t('settings.perm.download') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.modify"> {{ $t('settings.perm.modify') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.execute"> {{ $t('settings.perm.execute') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.rename"> {{ $t('settings.perm.rename') }}</p>
<p><input type="checkbox" :disabled="admin" v-model="perm.share"> {{ $t('settings.perm.share') }}</p>
</div>
</template>
<script>
export default {
name: 'permissions',
props: ['perm'],
computed: {
admin: {
get () {
return this.perm.admin
},
set (value) {
if (value) {
for (const key in this.perm) {
this.perm[key] = true
}
}
this.perm.admin = value
}
}
}
}
</script>

View File

@@ -0,0 +1,57 @@
<template>
<form class="rules small">
<div v-for="(rule, index) in rules" :key="index">
<input type="checkbox" v-model="rule.regex"><label>Regex</label>
<input type="checkbox" v-model="rule.allow"><label>Allow</label>
<input
@keypress.enter.prevent
type="text"
v-if="rule.regex"
v-model="rule.regexp.raw"
:placeholder="$t('settings.insertRegex')" />
<input
@keypress.enter.prevent
type="text"
v-else
v-model="rule.path"
:placeholder="$t('settings.insertPath')" />
<button class="button button--red" @click="remove($event, index)">-</button>
</div>
<div>
<button class="button" @click="create" default="false">{{ $t('buttons.new') }}</button>
</div>
</form>
</template>
<script>
export default {
name: 'rules-textarea',
props: ['rules'],
methods: {
remove (event, index) {
event.preventDefault()
let rules = [ ...this.rules ]
rules.splice(index, 1)
this.$emit('update:rules', [ ...rules ])
},
create (event) {
event.preventDefault()
this.$emit('update:rules', [
...this.rules,
{
allow: true,
path: '',
regex: false,
regexp: {
raw: ''
}
}
])
}
}
}
</script>

View File

@@ -0,0 +1,65 @@
<template>
<div>
<p v-if="!isDefault">
<label for="username">{{ $t('settings.username') }}</label>
<input class="input input--block" type="text" v-model="user.username" id="username">
</p>
<p v-if="!isDefault">
<label for="password">{{ $t('settings.password') }}</label>
<input class="input input--block" type="password" :placeholder="passwordPlaceholder" v-model="user.password" id="password">
</p>
<p>
<label for="scope">{{ $t('settings.scope') }}</label>
<input class="input input--block" type="text" v-model="user.scope" id="scope">
</p>
<p>
<label for="locale">{{ $t('settings.language') }}</label>
<languages class="input input--block" id="locale" :locale.sync="user.locale"></languages>
</p>
<p v-if="!isDefault">
<input type="checkbox" :disabled="user.perm.admin" v-model="user.lockPassword"> {{ $t('settings.lockPassword') }}
</p>
<permissions :perm.sync="user.perm" />
<commands :commands.sync="user.commands" />
<div v-if="!isDefault">
<h3>{{ $t('settings.rules') }}</h3>
<p class="small">{{ $t('settings.rulesHelp') }}</p>
<rules :rules.sync="user.rules" />
</div>
</div>
</template>
<script>
import Languages from './Languages'
import Rules from './Rules'
import Permissions from './Permissions'
import Commands from './Commands'
export default {
name: 'user',
components: {
Permissions,
Languages,
Rules,
Commands
},
props: [ 'user', 'isNew', 'isDefault' ],
computed: {
passwordPlaceholder () {
return this.isNew ? '' : this.$t('settings.avoidChanges')
}
},
watch: {
'user.perm.admin': function () {
if (!this.user.perm.admin) return
this.user.lockPassword = false
}
}
}
</script>

55
src/css/_buttons.css Normal file
View File

@@ -0,0 +1,55 @@
.button {
outline: 0;
border: 0;
padding: .5em 1em;
border-radius: .1em;
cursor: pointer;
background: var(--blue);
color: white;
border: 1px solid rgba(0, 0, 0, 0.05);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.05);
transition: .1s ease all;
}
.button:hover {
background-color: var(--dark-blue);
}
.button--block {
margin: 0 0 0.5em;
display: block;
width: 100%;
}
.button--red {
background: var(--red);
}
.button--red:hover {
background: var(--dark-red);
}
.button--flat {
color: var(--dark-blue);
background: transparent;
box-shadow: 0 0 0;
border: 0;
text-transform: uppercase;
}
.button--flat:hover {
background: var(--moon-grey);
}
.button--flat.button--red {
color: var(--dark-red);
}
.button--flat.button--grey {
color: #6f6f6f;
}
.button[disabled] {
opacity: .5;
cursor: not-allowed;
}

35
src/css/_inputs.css Normal file
View File

@@ -0,0 +1,35 @@
.input {
border-radius: .1em;
padding: .5em 1em;
background: white;
border: 1px solid rgba(0, 0, 0, 0.1);
transition: .2s ease all;
color: #333;
margin: 0;
}
.input:hover,
.input:focus {
border-color: rgba(0, 0, 0, 0.2);
}
.input--block {
margin-bottom: .5em;
display: block;
width: 100%;
}
.input--textarea {
line-height: 1.15;
font-family: monospace;
min-height: 10em;
resize: vertical;
}
.input--red {
background: #fcd0cd;
}
.input--green {
background: #c9f2da;
}

29
src/css/_share.css Normal file
View File

@@ -0,0 +1,29 @@
.share__box {
text-align: center;
box-shadow: rgba(0, 0, 0, 0.06) 0px 1px 3px, rgba(0, 0, 0, 0.12) 0px 1px 2px;
background: #fff;
display: block;
border-radius: 0.2em;
width: 90%;
max-width: 25em;
margin: 6em auto;
}
.share__box__download {
width: 100%;
padding: 1em;
cursor: pointer;
background: #ffffff;
color: rgba(0, 0, 0, 0.5);
border-bottom: 1px solid rgba(0, 0, 0, 0.05);
}
.share__box__info {
padding: 2em 3em;
}
.share__box__title {
margin-top: .2em;
overflow: hidden;
text-overflow: ellipsis;
}

53
src/css/_shell.css Normal file
View File

@@ -0,0 +1,53 @@
.shell {
position: fixed;
bottom: 0;
left: 0;
height: 25em;
max-height: calc(100% - 4em);
background: white;
color: #212121;
z-index: 9999;
width: 100%;
font-family: monospace;
overflow: auto;
font-size: 1rem;
cursor: text;
box-shadow: 0 0 5px rgba(0, 0, 0, 0.1);
transition: .2s ease transform;
}
.shell__result {
display: flex;
padding: 0.5em;
align-items: flex-start;
border-top: 1px solid rgba(0, 0, 0, 0.05);
}
.shell--hidden {
transform: translateY(105%);
}
.shell__result--hidden {
opacity: 0;
}
.shell__text,
.shell__prompt,
.shell__prompt i {
font-size: inherit;
}
.shell__prompt {
width: 1.2rem;
}
.shell__prompt i {
color: var(--blue);
}
.shell__text {
margin: 0;
font-family: inherit;
white-space: pre-wrap;
width: 100%;
}

7
src/css/_variables.css Normal file
View File

@@ -0,0 +1,7 @@
:root {
--blue: #2196f3;
--dark-blue: #1E88E5;
--red: #F44336;
--dark-red: #D32F2F;
--moon-grey: #f2f2f2;
}

View File

@@ -29,94 +29,6 @@ video {
width: 100%;
}
pre {
padding: 1em;
border: 1px solid #e6e6e6;
border-radius: 0.5em;
background-color: #f5f5f5;
white-space: pre-wrap;
white-space: -moz-pre-wrap;
white-space: -pre-wrap;
white-space: -o-pre-wrap;
word-wrap: break-word;
}
input,
button {
outline: 0 !important;
}
input[type="submit"],
button {
border: 0;
padding: .5em 1em;
margin-left: .5em;
border-radius: .1em;
cursor: pointer;
background: #2196f3;
color: #fff;
border: 1px solid rgba(0, 0, 0, 0.05);
box-shadow: 0 0 5px rgba(0, 0, 0, 0.05);
transition: .1s ease all;
}
input[type="submit"]:hover,
button:hover {
background-color: #1E88E5;
}
input[type="submit"].block,
button.block {
display: block;
width: 100%;
margin: 0 0 1em;
}
button.delete {
background: #F44336;
}
button.delete:hover {
background: #D32F2F;
}
button.cancel {
background-color: #ECEFF1;
color: #37474F;
}
button.cancel:hover {
background-color: #e9eaeb;
}
button.flat,
input[type="submit"].flat {
color: #1E88E5;
background: transparent;
box-shadow: 0 0 0;
border: 0;
margin-left: 0;
text-transform: uppercase;
}
button.flat:hover,
input[type="submit"].flat:hover {
background: rgba(0,0,0,0.05)
}
button.flat.delete {
color: #F44336;
}
button.flat.cancel {
color: #ccc;
}
button.flat[disabled] {
color: #ccc;
cursor: not-allowed;
}
.mobile-only {
display: none !important;
}

View File

@@ -7,58 +7,6 @@ a {
color: inherit
}
select,
textarea,
input[type="text"],
input[type="password"] {
padding: 0.5em 0;
line-height: 1;
display: block;
border: 0;
border-bottom: 1px solid #dddddd;
transition: .2s ease border;
width: 100%;
background: transparent;
}
textarea {
line-height: 1.15;
padding: .5em;
border: 1px solid #ddd;
font-family: monospace;
min-height: 10em;
resize: none;
border-radius: 2px;
}
.dashboard #locale,
.dashboard #username,
.dashboard #password,
.dashboard #scope {
max-width: 18em;
}
.dashboard #locale {
margin-top: .5em;
}
textarea:focus,
textarea:hover,
input[type="text"]:focus,
input[type="password"]:focus,
input[type="text"]:hover,
input[type="password"]:hover {
border-color: #2979ff;
}
input.red {
border-color: red;
}
input.green {
border-color: green;
}
.dashboard p label {
margin-bottom: .2em;
display: block;
@@ -98,7 +46,7 @@ p code {
}
.dashboard #nav li.active {
border-color: #2196f3
border-color: var(--blue)
}
.dashboard #nav i {
@@ -241,7 +189,7 @@ table tr>*:last-child {
}
.card#share ul li a {
color: #2196F3;
color: var(--blue);
cursor: pointer;
margin-right: auto;
}
@@ -310,7 +258,7 @@ table tr>*:last-child {
}
.file-list li[aria-selected=true] {
background: #2196f3 !important;
background: var(--blue) !important;
color: #fff !important;
transition: .1s ease all;
}

View File

@@ -1,184 +0,0 @@
@import "~codemirror/lib/codemirror.css";
@import "~codemirror/theme/ttcn.css";
#editor {
max-width: 800px;
margin: 0 auto;
}
#editor .CodeMirror {
box-shadow: rgba(0, 0, 0, 0.06) 0px 1px 3px, rgba(0, 0, 0, 0.12) 0px 1px 2px;
margin: 2em 0;
border-radius: .5em;
}
#editor h2 {
color: rgba(0, 0, 0, 0.3);
font-weight: 500;
}
.CodeMirror {
height: auto;
}
.markdown .CodeMirror {
padding: .75em;
}
.cm-s-markdown .CodeMirror-gutter {
border-right: 1px solid #eff3f5;
padding-right: 5px;
margin-right: 15px;
min-width: 2.5em;
padding-bottom: 30px;
}
.cm-s-markdown .CodeMirror-cursor {
border-right: 2px solid #667880;
}
.cm-s-markdown .CodeMirror-lines {
margin: 0;
}
.cm-s-markdown {
color: #3D494E;
}
.cm-s-markdown span.cm-header {
color: #3D494E;
font-weight: bold;
}
.cm-s-markdown span.cm-variable-2 {
color: #3D494E;
}
.cm-s-markdown span.cm-meta {
color: #516066;
}
.cm-s-markdown span.cm-hr {
color: #516066;
}
.cm-s-markdown span.cm-comment {
color: #868f93;
}
.cm-s-markdown span.cm-qualifier {
color: #868f93;
}
.cm-s-markdown span.cm-number {
color: #197987;
}
.cm-s-markdown span.cm-variable {
color: #197987;
}
.cm-s-markdown span.cm-builtin {
color: #197987;
}
.cm-s-markdown span.cm-link {
color: #197987;
text-decoration: underline;
}
.cm-s-markdown span.cm-tag {
color: #197987;
}
.cm-s-markdown span.cm-string {
color: #48abb9;
}
.cm-s-markdown span.cm-string-2 {
color: #48abb9;
}
.cm-s-markdown span.cm-quote {
color: #48abb9;
}
.cm-s-markdown span.cm-atom {
color: #48abb9;
}
.cm-s-markdown span.cm-property {
color: #82a367;
}
.cm-s-markdown span.cm-operator {
color: #82a367;
}
.cm-s-markdown span.cm-variable-3 {
color: #82a367;
}
.cm-s-markdown span.cm-attribute {
color: #90bb74;
}
.cm-s-markdown span.cm-def {
color: #90bb74;
}
.cm-s-markdown span.cm-keyword {
color: #ec6c45;
}
.cm-s-markdown span.cm-bracket {
color: #ec6c45;
}
.cm-s-markdown span.cm-error {
color: #e45346;
}
.cm-s-markdown span.cm-em {
font-style: italic;
}
.cm-s-markdown span.cm-strong {
font-weight: bold;
}
.cm-s-markdown .cm-header-1 {
font-size: 200%;
line-height: 200%;
}
.cm-s-markdown .cm-header-2 {
font-size: 160%;
line-height: 160%;
}
.cm-s-markdown .cm-header-3 {
font-size: 125%;
line-height: 125%;
}
.cm-s-markdown .cm-header-4 {
font-size: 110%;
line-height: 110%;
}
.cm-s-markdown .cm-comment {
background: rgba(0, 0, 0, .05);
border-radius: 2px;
}
.cm-s-markdown .cm-link {
color: #7f8c8d;
}
.cm-s-markdown .cm-url {
color: #aab2b3;
}
.cm-s-markdown .cm-strikethrough {
text-decoration: line-through;
}

View File

@@ -110,32 +110,4 @@
unicode-range: U+0000-00FF, U+0131, U+0152-0153, U+02C6, U+02DA, U+02DC, U+2000-206F, U+2074, U+20AC, U+2212, U+2215, U+E0FF, U+EFFD, U+F000;
}
@font-face {
font-family: 'Material Icons';
font-style: normal;
font-weight: 400;
src: url(../assets/fonts/material/icons.eot);
src: local('Material Icons'),
local('MaterialIcons-Regular'),
url(../assets/fonts/material/icons.woff2) format('woff2'),
url(../assets/fonts/material/icons.ttf) format('truetype');
}
.prompt .file-list ul li:before,
.material-icons {
font-family: 'Material Icons';
font-weight: normal;
font-style: normal;
font-size: 24px;
line-height: 1;
letter-spacing: normal;
text-transform: none;
display: inline-block;
white-space: nowrap;
word-wrap: normal;
direction: ltr;
-webkit-font-smoothing: antialiased;
text-rendering: optimizeLegibility;
-moz-osx-font-smoothing: grayscale;
font-feature-settings: 'liga';
}
@import "~material-design-icons/iconfont/material-icons.css";

View File

@@ -238,7 +238,7 @@ header .search-button {
}
#search .boxes>div>div {
background: #2196F3;
background: var(--blue);
color: #fff;
text-align: center;
width: 10em;

View File

@@ -120,7 +120,7 @@
}
#listing .item[aria-selected=true] {
background: #2196f3 !important;
background: var(--blue) !important;
color: #fff !important;
}
@@ -228,7 +228,7 @@
left: 0;
z-index: 99999;
width: 100%;
background-color: #2196f3;
background-color: var(--blue);
height: 4em;
display: none;
padding: 0.5em 0.5em 0.5em 1em;

View File

@@ -37,14 +37,8 @@
margin: .5em 0 0;
}
#login input {
width: 100%;
width: 100%;
margin: .5em 0 0;
}
#login .wrong {
background: #F44336;
background: var(--red);
color: #fff;
padding: .5em;
text-align: center;
@@ -60,17 +54,12 @@
}
}
#login input[type="text"],
#login input[type="password"] {
padding: .5em 1em;
border: 1px solid #e9e9e9;
transition: .2s ease border;
color: #333;
}
#login input[type="text"]:focus,
#login input[type="password"]:focus,
#login input[type="text"]:hover,
#login input[type="password"]:hover {
border-color: #9f9f9f;
#login p {
cursor: pointer;
text-align: right;
color: var(--blue);
text-transform: lowercase;
font-weight: 500;
font-size: 0.9rem;
margin: .5rem 0;
}

View File

@@ -15,6 +15,12 @@
body {
padding-bottom: 5em;
}
#listing.list .item .size {
display: none;
}
#listing.list .item .name {
width: 60%;
}
#more {
display: inherit
}
@@ -114,3 +120,12 @@
display: block;
}
}
@media (max-width: 450px) {
#listing.list .item .modified {
display: none;
}
#listing.list .item .name {
width: 100%;
}
}

View File

@@ -1,14 +1,22 @@
@import "~normalize.css/normalize.css";
@import "~noty/lib/noty.css";
@import "~noty/lib/themes/mint.css";
@import "./_variables.css";
@import "./_buttons.css";
@import "./_inputs.css";
@import "./_shell.css";
@import "./_share.css";
@import "./fonts.css";
@import "./base.css";
@import "./header.css";
@import "./listing.css";
@import "./editor.css";
@import "./dashboard.css";
@import "./login.css";
.link {
color: var(--blue);
}
/* * * * * * * * * * * * * * * *
* ACTION *
* * * * * * * * * * * * * * * */
@@ -84,7 +92,7 @@
position: absolute;
bottom: 0;
right: 0;
background: #2196f3;
background: var(--blue);
color: #fff;
border-radius: 50%;
font-size: .75em;
@@ -203,7 +211,7 @@
color: #a5a5a5;
}
.credits span {
.credits > span {
display: block;
margin: .3em 0;
}
@@ -226,4 +234,36 @@
}
}
/* * * * * * * * * * * * * * * *
* SETTINGS RULES *
* * * * * * * * * * * * * * * */
.rules > div {
display: flex;
align-items: center;
margin: .5rem 0;
}
.rules input[type="checkbox"] {
margin-right: .2rem;
}
.rules input[type="text"] {
border: 1px solid#ddd;
padding: .2rem;
}
.rules label {
margin-right: .5rem;
}
.rules button {
margin-left: auto;
}
.rules button.delete {
padding: .2rem .5rem;
margin-left: .5rem;
}
@import './mobile.css';

233
src/i18n/ar.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "دائم",
"buttons": {
"cancel": "إلغاء",
"close": "إغلاق",
"copy": "نسخ",
"copyFile": "نسخ الملف",
"copyToClipboard": "نسخ الى الحافظة",
"create": "إنشاء",
"delete": "حذف",
"download": "تحميل",
"info": "معلومات",
"more": "المزيد",
"move": "نقل",
"moveFile": "نقل الملف",
"new": "جديد",
"next": "التالي",
"ok": "موافق",
"replace": "استبدال",
"previous": "السابق",
"rename": "إعادة تسمية",
"reportIssue": "إبلاغ عن مشكلة",
"save": "حفظ",
"search": "بحث",
"select": "تحديد",
"share": "مشاركة",
"publish": "نشر",
"selectMultiple": "تحديد متعدد",
"schedule": "جدولة",
"switchView": "تغيير العرض",
"toggleSidebar": "تبديل الشريط الجانبي",
"update": "تحديث",
"upload": "رفع",
"permalink": "الحصول على لنك دائم"
},
"success": {
"linkCopied": "تم نسخ الملف"
},
"errors": {
"forbidden": "أنت غير مرحب بك هنا!.",
"internal": "لقد حدث خطأ ما.",
"notFound": "لا يمكن الوصول لهذا المحتوى."
},
"files": {
"folders": "المجلدات",
"files": "الملفات",
"body": "الصفحة",
"clear": "مسح",
"closePreview": "إغلاق العرض",
"home": "الصفحة الاولى",
"lastModified": "آخر تعديل",
"loading": "جاري التحميل...",
"lonely": "تبدو وحيدا هنا...",
"metadata": "بيانات تعريفية",
"multipleSelectionEnabled": "التحديد المتعدد مفعل",
"name": "الإسم",
"size": "الحجم",
"sortByName": "الترتيب بالإسم",
"sortBySize": "الترتيب بالحجم",
"sortByLastModified": "الترتيب بآخر تعديل"
},
"help": {
"click": "حدد الملف أو المجلد",
"ctrl": {
"click": "حدد أكثر من ملف او مجلد",
"f": "إبدأ البحث",
"s": "حمل الملف او المجلد في هذا المكان"
},
"del": "حذف البيانات المحددة",
"doubleClick": "فتح المجلد او الملف",
"esc": "مسح التحديد وإغلاق النافذة المنبثقة",
"f1": "هذه المعلومات",
"f2": "إعادة تسمية الملف",
"help": "مساعدة"
},
"login": {
"password": "كلمة المرور",
"passwordConfirm": "Password Confirmation",
"submit": "تسجيل دخول",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "إسم المستخدم",
"wrongCredentials": "بيانات دخول خاطئة"
},
"prompts": {
"copy": "نسخ",
"copyMessage": "رجاء حدد المكان لنسخ ملفاتك فيه:",
"currentlyNavigating": "يتم الإنتقال حاليا إلى:",
"deleteMessageMultiple": "هل تريد بالتأكيد حذف {count} ملف؟",
"deleteMessageSingle": "هل تريد بالتأكيد حذف هذا الملف/المجلد؟",
"deleteTitle": "حذف الملفات",
"displayName": "الإسم:",
"download": "تحميل الملفات",
"downloadMessage": "حدد إمتداد الملف المراد تحميله.",
"error": "لقد حدث خطأ ما",
"fileInfo": "معلومات الملف",
"filesSelected": "تم تحديد {count} ملفات.",
"lastModified": "آخر تعديل",
"move": "نقل",
"moveMessage": "إختر مكان جديد للملفات أو المجلدات المراد نقلها:",
"newDir": "مجلد جديد",
"newDirMessage": "رجاء أدخل اسم المجلد الجديد.",
"newFile": "ملف جديد",
"newFileMessage": "رجاء ادخل اسم الملف الجديد.",
"numberDirs": "عدد المجلدات",
"numberFiles": "عدد الملفات",
"replace": "إستبدال",
"replaceMessage": "أحد الملفات التي تحاول رفعها يتعارض مع ملف موجود بنفس الإسم. هل تريد إستبدال الملف الموجود؟\n",
"rename": "إعادة تسمية",
"renameMessage": "إدراج اسم جديد لـ",
"show": "عرض",
"size": "الحجم",
"schedule": "جدولة",
"scheduleMessage": "أختر الوقت والتاريخ لجدولة نشر هذا المقال.",
"newArchetype": "إنشاء منشور من المنشور الأصلي. الملف سيتم انشاءه في مجلد المحتويات."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "تنفيذ الأوامر",
"allowEdit": "تعديل، إعادة تسمية وحذف الملفات والمجلدات",
"allowNew": "إنشاء ملفات ومجلدات جديدة",
"allowPublish": "نشر مقالات وصفحات جديدة",
"avoidChanges": "(أتركه فارغاً إن لم ترد تغييره)",
"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": "تم تحديث الأوامر",
"customStylesheet": "ستايل مخصص",
"examples": "أمثلة",
"globalSettings": "إعدادات عامة",
"language": "اللغة",
"lockPassword": "منع المستخدم من تغيير كلمة المرور",
"newPassword": "كلمة المرور الجديدة",
"newPasswordConfirm": "تأكيد كلمة المرور",
"newUser": "مستخدم جديد",
"password": "كلمة المرور",
"passwordUpdated": "تم تغيير كلمة المرور",
"permissions": "الصلاحيات",
"permissionsHelp": "يمكنك تعيين المستخدم كـ \"مدير\" أو تحديد الصلاحيات بشكل منفرد.\n إذا قمت بتحديد المستخدم كـ \"مدير\"، باقي الخيارات سيتم تحديدها تلقائياً.\n إدارة المستخدمين تبقى صلاحية فريدة للـ \"مدير\" فقط.\n",
"profileSettings": "إعدادات الحساب",
"ruleExample1": "منع الوصول إلى الملفات التي تبدأ بنقطة مثل (.git، و .gitignore) في كل مجلد.\n",
"ruleExample2": "منع الوصول إلى الملف المسمى Caddyfile في نطاق الجذر.",
"rules": "المجموعات",
"rulesHelp": "يمكنك هنا تحديد مجموعة من شروط السماح والمنع لهذا المستخدم. الملفات الممنوعة لن تظهر ضمن القائمة لهذا المستخدم ولن يستطيع الوصول لها. هنا ندعم الـ regex والـ relative path لنطاق المستخدمين.\n",
"scope": "نطاق",
"settingsUpdated": "تم تعديل الإعدادات",
"user": "المستخدم",
"userCommands": "الأوامر",
"userCommandsHelp": "الأوامر المتاحة لهذا المستخدم مفصولة فيما بينها بمسافة. مثال:\n",
"userCreated": "تم إنشاء المستخدم",
"userDeleted": "تم حذف المستخدم",
"userManagement": "إدارة المستخدمين",
"username": "إسم المستخدم",
"users": "المستخدمين",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "تم تعديل المستخدم",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "مساعدة",
"logout": "تسجيل خروج",
"myFiles": "ملفاتي",
"newFile": "ملف جديد",
"newFolder": "مجلد جديد",
"settings": "الإعدادات",
"siteSettings": "إعدادات الموقع",
"hugoNew": "هيوجو جديد",
"preview": "معاينة"
},
"search": {
"images": "الصور",
"music": "الموسيقى",
"notSupportedCommand": "هذا الأمر غير متاح.",
"pdf": "PDF",
"pressToExecute": "إغضط زر Enter للتنفيذ.",
"pressToSearch": "إضغط زر Enter للبحث.",
"search": "البحث...",
"searchOrCommand": "إبحث او قم بتنفيذ أمر...",
"searchOrSupportedCommand": "إبحث او قم باضافة بادئة '$' واستخدم واحد من الاوامر الخاصة بك:",
"typeCommand": "أكتب واضغط Enter للتنفيذ.",
"typeSearch": "أكتب واضغط Enter للبحث.",
"types": "الأنواع",
"video": "فيديوهات",
"writeToSearch": "أكتب هنا للبحث"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "وحدة الوقت",
"seconds": "ثواني",
"minutes": "دقائق",
"hours": "ساعات",
"days": "أيام"
}
}

View File

@@ -1,208 +0,0 @@
permanent: دائم
buttons:
cancel: إلغاء
close: إغلاق
copy: نسخ
copyFile: نسخ الملف
copyToClipboard: نسخ الى الحافظة
create: إنشاء
delete: حذف
download: تحميل
info: معلومات
more: المزيد
move: نقل
moveFile: نقل الملف
new: جديد
next: التالي
ok: موافق
replace: استبدال
previous: السابق
rename: إعادة تسمية
reportIssue: إبلاغ عن مشكلة
save: حفظ
search: بحث
select: تحديد
share: مشاركة
publish: نشر
selectMultiple: تحديد متعدد
schedule: جدولة
switchView: تغيير العرض
toggleSidebar: تبديل الشريط الجانبي
update: تحديث
upload: رفع
permalink: الحصول على لنك دائم
success:
linkCopied: تم نسخ الملف
errors:
forbidden: أنت غير مرحب بك هنا!.
internal: لقد حدث خطأ ما.
notFound: لا يمكن الوصول لهذا المحتوى.
files:
folders: المجلدات
files: الملفات
body: الصفحة
clear: مسح
closePreview: إغلاق العرض
home: الصفحة الاولى
lastModified: آخر تعديل
loading: جاري التحميل...
lonely: تبدو وحيدا هنا...
metadata: بيانات تعريفية
multipleSelectionEnabled: التحديد المتعدد مفعل
name: الإسم
size: الحجم
sortByName: الترتيب بالإسم
sortBySize: الترتيب بالحجم
sortByLastModified: الترتيب بآخر تعديل
help:
click: حدد الملف أو المجلد
ctrl:
click: حدد أكثر من ملف او مجلد
f: إبدأ البحث
s: حمل الملف او المجلد في هذا المكان
del: حذف البيانات المحددة
doubleClick: فتح المجلد او الملف
esc: مسح التحديد وإغلاق النافذة المنبثقة
f1: هذه المعلومات
f2: إعادة تسمية الملف
help: مساعدة
login:
password: كلمة المرور
submit: تسجيل دخول
username: إسم المستخدم
wrongCredentials: بيانات دخول خاطئة
prompts:
copy: نسخ
copyMessage: 'رجاء حدد المكان لنسخ ملفاتك فيه:'
currentlyNavigating: 'يتم الإنتقال حاليا إلى:'
deleteMessageMultiple: هل تريد بالتأكيد حذف {count} ملف؟
deleteMessageSingle: هل تريد بالتأكيد حذف هذا الملف/المجلد؟
deleteTitle: حذف الملفات
displayName: 'الإسم:'
download: تحميل الملفات
downloadMessage: حدد إمتداد الملف المراد تحميله.
error: لقد حدث خطأ ما
fileInfo: معلومات الملف
filesSelected: "تم تحديد {count} ملفات."
lastModified: آخر تعديل
move: نقل
moveMessage: 'إختر مكان جديد للملفات أو المجلدات المراد نقلها:'
newDir: مجلد جديد
newDirMessage: رجاء أدخل اسم المجلد الجديد.
newFile: ملف جديد
newFileMessage: رجاء ادخل اسم الملف الجديد.
numberDirs: عدد المجلدات
numberFiles: عدد الملفات
replace: إستبدال
replaceMessage: >
أحد الملفات التي تحاول رفعها يتعارض مع ملف موجود بنفس الإسم.
هل تريد إستبدال الملف الموجود؟
rename: إعادة تسمية
renameMessage: إدراج اسم جديد لـ
show: عرض
size: الحجم
schedule: جدولة
scheduleMessage: أختر الوقت والتاريخ لجدولة نشر هذا المقال.
newArchetype: إنشاء منشور من المنشور الأصلي. الملف سيتم انشاءه في مجلد المحتويات.
settings:
admin: Admin
administrator: Administrator
allowCommands: تنفيذ الأوامر
allowEdit: تعديل، إعادة تسمية وحذف الملفات والمجلدات
allowNew: إنشاء ملفات ومجلدات جديدة
allowPublish: نشر مقالات وصفحات جديدة
avoidChanges: "(أتركه فارغاً إن لم ترد تغييره)"
changePassword: تغيير كلمة المرور
commands: الأوامر
commandsHelp: >
هنا يمكنك تحديد أوامر يمكن تنفيذها عند أحداث معينة.
قم بكتابة أمر واحد في كل سطر. أذا كان الحدث متعلق بمجلد، مثل ما قبل أو بعد الحفظ،
المتغير "FILE" سيكون متاح مع مسار الملف
commandsUpdated: تم تحديث الأوامر
customStylesheet: ستايل مخصص
examples: أمثلة
globalSettings: إعدادات عامة
language: اللغة
lockPassword: منع المستخدم من تغيير كلمة المرور
newPassword: كلمة المرور الجديدة
newPasswordConfirm: تأكيد كلمة المرور
newUser: مستخدم جديد
password: كلمة المرور
passwordUpdated: تم تغيير كلمة المرور
permissions: الصلاحيات
permissionsHelp: >
يمكنك تعيين المستخدم كـ "مدير" أو تحديد الصلاحيات بشكل منفرد.
إذا قمت بتحديد المستخدم كـ "مدير"، باقي الخيارات سيتم تحديدها تلقائياً.
إدارة المستخدمين تبقى صلاحية فريدة للـ "مدير" فقط.
profileSettings: إعدادات الحساب
ruleExample1: >
منع الوصول إلى الملفات التي تبدأ بنقطة مثل (.git، و .gitignore) في كل مجلد.
ruleExample2: منع الوصول إلى الملف المسمى Caddyfile في نطاق الجذر.
rules: المجموعات
rulesHelp1: >
يمكنك هنا تحديد مجموعة من شروط السماح والمنع لهذا المستخدم.
الملفات الممنوعة لن تظهر ضمن القائمة لهذا المستخدم ولن يستطيع الوصول لها.
هنا ندعم الـ regex والـ relative path لنطاق المستخدمين.
rulesHelp2: >
كل مجموعة يجب ان تكون في سطر منفرد وتبدأ بالكلمة المفتاحية {0} أو {1}.
ثم تقوم بكتابة {2} إذا كنت تستخدم regex وبعدها التعبير او المسار.
scope: نطاق
settingsUpdated: تم تعديل الإعدادات
user: المستخدم
userCommands: الأوامر
userCommandsHelp: >
الأوامر المتاحة لهذا المستخدم مفصولة فيما بينها بمسافة.
مثال:
userCreated: تم إنشاء المستخدم
userDeleted: تم حذف المستخدم
userManagement: إدارة المستخدمين
username: إسم المستخدم
users: المستخدمين
userUpdated: تم تعديل المستخدم
sidebar:
help: مساعدة
logout: تسجيل خروج
myFiles: ملفاتي
newFile: ملف جديد
newFolder: مجلد جديد
settings: الإعدادات
siteSettings: إعدادات الموقع
hugoNew: هيوجو جديد
preview: معاينة
search:
images: الصور
music: الموسيقى
notSupportedCommand: هذا الأمر غير متاح.
pdf: PDF
pressToExecute: إغضط زر Enter للتنفيذ.
pressToSearch: إضغط زر Enter للبحث.
search: البحث...
searchOrCommand: إبحث او قم بتنفيذ أمر...
searchOrSupportedCommand: 'إبحث او قم باضافة بادئة ''$'' واستخدم واحد من الاوامر الخاصة بك:'
typeCommand: أكتب واضغط Enter للتنفيذ.
typeSearch: أكتب واضغط Enter للبحث.
types: الأنواع
video: فيديوهات
writeToSearch: أكتب هنا للبحث
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: وحدة الوقت
seconds: ثواني
minutes: دقائق
hours: ساعات
days: أيام

233
src/i18n/de.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "Permanent",
"buttons": {
"cancel": "Abbrechen",
"close": "Schließen",
"copy": "Kopieren",
"copyFile": "Kopiere Datei",
"copyToClipboard": "In Zwischenablage kopieren",
"create": "Neu",
"delete": "Löschen",
"download": "Downloaden",
"info": "Info",
"more": "mehr",
"move": "Verschieben",
"moveFile": "Verschiebe Datei",
"new": "Neu",
"next": "nächste",
"ok": "OK",
"replace": "Ersetzen",
"previous": "vorherige",
"rename": "umbenennen",
"reportIssue": "Fehler melden",
"save": "Speichern",
"search": "Suchen",
"select": "Auswählen",
"share": "Teilen",
"publish": "Veröffentlichen",
"selectMultiple": "Mehrfachauswahl",
"schedule": "Planung",
"switchView": "Ansicht wechseln",
"toggleSidebar": "Seitenleiste anzeigen",
"update": "Update",
"upload": "Upload",
"permalink": "permanenten Verweis anzeigen"
},
"success": {
"linkCopied": "Verweis wurde kopiert !"
},
"errors": {
"forbidden": "Sie verfügen nicht über die nötigen Rechte!",
"internal": "Etwas ist schief gelaufen.",
"notFound": "Dieser Ort kann nicht angezeigt werden."
},
"files": {
"folders": "Ordner",
"files": "Dateien",
"body": "Body",
"clear": "Clear",
"closePreview": "Vorschau schließen",
"home": "Home",
"lastModified": "zuletzt verändert",
"loading": "Lade...",
"lonely": "Hier scheint nichts zu sein...",
"metadata": "Metadaten",
"multipleSelectionEnabled": "Mehrfachauswahl ausgewählt",
"name": "Name",
"size": "Größe",
"sortByName": "Nach Namen sortieren",
"sortBySize": "Nach Größe sortieren",
"sortByLastModified": "Nach Änderungsdatum sortieren"
},
"help": {
"click": "wähle Datei oder Ordner",
"ctrl": {
"click": "markiere mehrere Dateien oder Ordner",
"f": "öffnet eine neue Suche",
"s": "speichert eine Datei oder einen Ordner am akutellen Ort"
},
"del": "löscht die ausgewählten Elemente",
"doubleClick": "öffnet eine Datei oder einen Ordner",
"esc": "Auswahl zurücksetzen und/oder Dialog schließen",
"f1": "diese Informationsseite",
"f2": "Datei umbenennen",
"help": "Hilfe"
},
"login": {
"password": "Passwort",
"passwordConfirm": "Password Confirmation",
"submit": "Login",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Benutzername",
"wrongCredentials": "Falsche Zugangsdaten"
},
"prompts": {
"copy": "Kopieren",
"copyMessage": "Wählen Sie einen Zielort zum Kopieren:",
"currentlyNavigating": "Aktueller Ort:",
"deleteMessageMultiple": "Sind Sie sicher, dass Sie {count} Datei(en) löschen möchten?",
"deleteMessageSingle": "Sind Sie sicher, dass Sie diesen Ordner/diese Datei löschen möchten?",
"deleteTitle": "Lösche Dateien",
"displayName": "Display Name:",
"download": "Lade Dateien",
"downloadMessage": "Wählen Sie ein Format zum downloaden aus.",
"error": "Etwas ist schief gelaufen",
"fileInfo": "Dateiinformation",
"filesSelected": "{count} Dateien ausgewählt.",
"lastModified": "Zuletzt geändert",
"move": "Verschieben",
"moveMessage": "Choose new house for your file(s)/folder(s):",
"newDir": "Neuer Ordner",
"newDirMessage": "Geben Sie den Namen des neuen Ordners an.",
"newFile": "Neue Datei",
"newFileMessage": "Geben Sie den Namen der neuen Datei an.",
"numberDirs": "Anzahl der Ordner",
"numberFiles": "Anzahl der Dateien",
"replace": "Ersetzen",
"replaceMessage": "Eine der Datei mit dem gleichen Namen, wie die Sie hochladen wollen, existiert bereits. Soll die vorhandene Datei ersetzt werden ?\n",
"rename": "Umbenennen",
"renameMessage": "Fügen Sie einen Namen ein für",
"show": "Anzeigen",
"size": "Größe",
"schedule": "Plan",
"scheduleMessage": "Wählen Sie ein Datum und eine Zeit für die Veröffentlichung dieses Beitrags.",
"newArchetype": "Erstelle neuen Beitrag auf dem Archetyp. Ihre Datei wird im Inhalteordner erstellt."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Befehle ausführen",
"allowEdit": "Bearbeiten, Umbenennen und Löschen von Dateien oder Ordnern",
"allowNew": "Erstellen neuer Dateien und Ordner",
"allowPublish": "Veröffentlichen von neuen Beiträgen und Seiten",
"avoidChanges": "(leer lassen um Änderungen zu vermeiden)",
"changePassword": "Ändere das Passwort",
"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": "Befehle aktualisiert!",
"customStylesheet": "Individuelles Stylesheet",
"examples": "Beispiele",
"globalSettings": "Globale Einstellungen",
"language": "Sprache",
"lockPassword": "Verhindere, dass der Benutzer sein Passwort ändert",
"newPassword": "Ihr neues Passwort.",
"newPasswordConfirm": "Bestätigen Sie Ihr neues Passwort",
"newUser": "Neuer Benutzer",
"password": "Passwort",
"passwordUpdated": "Passwort aktualisiert!",
"permissions": "Berechtigungen",
"permissionsHelp": "Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigunen individuell festlegen. Wenn Sie \"Administrator\" auswählen, werden alle anderen Rechte automatisch vergeben. Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.\n",
"profileSettings": "Profileinstellungen",
"ruleExample1": "Verhindert den Zugang zu dot Dateien (dot Files, wie .git, .gitignore) in allen Ordnern\n",
"ruleExample2": "blockiert den Zugang auf Dateien mit dem Namen Caddyfile in der Wurzel/Basis des scopes.",
"rules": "Regeln",
"rulesHelp": "Hier können Sie erlaubte und verbotene Aktionen für einen einzelnen Benutzer festlegen. Bockierte Dateien werden nicht im Listing angezeigt und sind nicht erreichbar für den Nutzer. Wir unterstützen reguläre Ausdrücke (Regex) und Pfade die relativ zum Benutzerordner sind. \n",
"scope": "Scope",
"settingsUpdated": "Einstellungen aktualisiert!",
"user": "Benutzer",
"userCommands": "Befehle",
"userCommandsHelp": "Eine Liste, mit einem Leerzeichen als Trennung, mit den für diesen Nutzer verfügbaren Befehlen. Example:\n",
"userCreated": "Benutzer angelegt!",
"userDeleted": "Benutzer gelöscht!",
"userManagement": "Benutzerverwaltung",
"username": "Nutzername",
"users": "Nutzer",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Benutzer aktualisiert!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Hilfe",
"logout": "Logout",
"myFiles": "Meine Dateien",
"newFile": "Neue Datei",
"newFolder": "Neuer Ordner",
"settings": "Einstellungen",
"siteSettings": "Seiteneinstellungen",
"hugoNew": "Hugo Neu",
"preview": "Vorschau"
},
"search": {
"images": "Bilder",
"music": "Musik",
"notSupportedCommand": "This is a not supported command.",
"pdf": "PDF",
"pressToExecute": "Drücken Sie Enter zum Ausführen.",
"pressToSearch": "Drücken Sie Enter zum Suchen.",
"search": "Suche...",
"searchOrCommand": "Suche oder führe Befehl aus...",
"searchOrSupportedCommand": "Suche oder nutze eines Ihrer verfügbaren Befehle:",
"typeCommand": "Type and press enter to execute.",
"typeSearch": "Type and press enter to search.",
"types": "Typen",
"video": "Video",
"writeToSearch": "Hier schreiben zum Suchen"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Zeiteinheit",
"seconds": "Sekunden",
"minutes": "Minuten",
"hours": "Stunden",
"days": "Tage"
}
}

View File

@@ -1,205 +0,0 @@
permanent: Permanent
buttons:
cancel: Abbrechen
close: Schließen
copy: Kopieren
copyFile: Kopiere Datei
copyToClipboard: In Zwischenablage kopieren
create: Neu
delete: Löschen
download: Downloaden
info: Info
more: mehr
move: Verschieben
moveFile: Verschiebe Datei
new: Neu
next: nächste
ok: OK
replace: Ersetzen
previous: vorherige
rename: umbenennen
reportIssue: Fehler melden
save: Speichern
search: Suchen
select: Auswählen
share: Teilen
publish: Veröffentlichen
selectMultiple: Mehrfachauswahl
schedule: Planung
switchView: Ansicht wechseln
toggleSidebar: Seitenleiste anzeigen
update: Update
upload: Upload
permalink: permanenten Verweis anzeigen
success:
linkCopied: Verweis wurde kopiert !
errors:
forbidden: Sie verfügen nicht über die nötigen Rechte!
internal: Etwas ist schief gelaufen.
notFound: Dieser Ort kann nicht angezeigt werden.
files:
folders: Ordner
files: Dateien
body: Body
clear: Clear
closePreview: Vorschau schließen
home: Home
lastModified: zuletzt verändert
loading: Lade...
lonely: Hier scheint nichts zu sein...
metadata: Metadaten
multipleSelectionEnabled: Mehrfachauswahl ausgewählt
name: Name
size: Größe
sortByName: Nach Namen sortieren
sortBySize: Nach Größe sortieren
sortByLastModified: Nach Änderungsdatum sortieren
help:
click: wähle Datei oder Ordner
ctrl:
click: markiere mehrere Dateien oder Ordner
f: öffnet eine neue Suche
s: speichert eine Datei oder einen Ordner am akutellen Ort
del: löscht die ausgewählten Elemente
doubleClick: öffnet eine Datei oder einen Ordner
esc: Auswahl zurücksetzen und/oder Dialog schließen
f1: diese Informationsseite
f2: Datei umbenennen
help: Hilfe
login:
password: Passwort
submit: Login
username: Benutzername
wrongCredentials: Falsche Zugangsdaten
prompts:
copy: Kopieren
copyMessage: 'Wählen Sie einen Zielort zum Kopieren:'
currentlyNavigating: 'Aktueller Ort:'
deleteMessageMultiple: Sind Sie sicher, dass Sie {count} Datei(en) löschen möchten?
deleteMessageSingle: Sind Sie sicher, dass Sie diesen Ordner/diese Datei löschen möchten?
deleteTitle: Lösche Dateien
displayName: 'Display Name:'
download: Lade Dateien
downloadMessage: Wählen Sie ein Format zum downloaden aus.
error: Etwas ist schief gelaufen
fileInfo: Dateiinformation
filesSelected: "{count} Dateien ausgewählt."
lastModified: Zuletzt geändert
move: Verschieben
moveMessage: 'Choose new house for your file(s)/folder(s):'
newDir: Neuer Ordner
newDirMessage: Geben Sie den Namen des neuen Ordners an.
newFile: Neue Datei
newFileMessage: Geben Sie den Namen der neuen Datei an.
numberDirs: Anzahl der Ordner
numberFiles: Anzahl der Dateien
replace: Ersetzen
replaceMessage: >
Eine der Datei mit dem gleichen Namen, wie die Sie hochladen wollen,
existiert bereits. Soll die vorhandene Datei ersetzt werden ?
rename: Umbenennen
renameMessage: Fügen Sie einen Namen ein für
show: Anzeigen
size: Größe
schedule: Plan
scheduleMessage: Wählen Sie ein Datum und eine Zeit für die Veröffentlichung dieses Beitrags.
newArchetype: Erstelle neuen Beitrag auf dem Archetyp. Ihre Datei wird im Inhalteordner erstellt.
settings:
admin: Admin
administrator: Administrator
allowCommands: Befehle ausführen
allowEdit: Bearbeiten, Umbenennen und Löschen von Dateien oder Ordnern
allowNew: Erstellen neuer Dateien und Ordner
allowPublish: Veröffentlichen von neuen Beiträgen und Seiten
avoidChanges: "(leer lassen um Änderungen zu vermeiden)"
changePassword: Ändere das Passwort
commands: Befehle
commandsHelp: >
Hier können Befehle benannt werden, die bei Ereignissen ausgeführt werden.
Man schreibt einen Befehl pro Zeile. Wenn ein Befehl einen Dateinamen benötigt, wie vor oder
nach dem Speichern, ist die Umgebungsvariable "FILE" mit dem Pfad der Datei verfügbar.
commandsUpdated: Befehle aktualisiert!
customStylesheet: Individuelles Stylesheet
examples: Beispiele
globalSettings: Globale Einstellungen
language: Sprache
lockPassword: Verhindere, dass der Benutzer sein Passwort ändert
newPassword: Ihr neues Passwort.
newPasswordConfirm: Bestätigen Sie Ihr neues Passwort
newUser: Neuer Benutzer
password: Passwort
passwordUpdated: Passwort aktualisiert!
permissions: Berechtigungen
permissionsHelp: >
Sie können einem Benutzer Administratorrechte einräumen oder die Berechtigunen individuell festlegen.
Wenn Sie "Administrator" auswählen, werden alle anderen Rechte automatisch vergeben.
Die Nutzerverwaltung kann nur durch einen Administrator erfolgen.
profileSettings: Profileinstellungen
ruleExample1: >
Verhindert den Zugang zu dot Dateien (dot Files, wie .git, .gitignore) in allen Ordnern
ruleExample2: blockiert den Zugang auf Dateien mit dem Namen Caddyfile in der Wurzel/Basis des scopes.
rules: Regeln
rulesHelp1: >
Hier können Sie erlaubte und verbotene Aktionen für einen einzelnen Benutzer festlegen.
Bockierte Dateien werden nicht im Listing angezeigt und sind nicht erreichbar für den Nutzer.
Wir unterstützen reguläre Ausdrücke (Regex) und Pfade die relativ zum Benutzerordner sind.
rulesHelp2: >
Jede Regel hat seine eigene Zeile und beginnt mit dem Schlüsselwort {0} oder {1}.
Wenn ein regulärer Ausdruck verwendet wird folgt {2} mit dem Ausdruck oder dem Pfad.
scope: Scope
settingsUpdated: Einstellungen aktualisiert!
user: Benutzer
userCommands: Befehle
userCommandsHelp: >
Eine Liste, mit einem Leerzeichen als Trennung, mit den für diesen Nutzer verfügbaren Befehlen.
Example:
userCreated: Benutzer angelegt!
userDeleted: Benutzer gelöscht!
userManagement: Benutzerverwaltung
username: Nutzername
users: Nutzer
userUpdated: Benutzer aktualisiert!
sidebar:
help: Hilfe
logout: Logout
myFiles: Meine Dateien
newFile: Neue Datei
newFolder: Neuer Ordner
settings: Einstellungen
siteSettings: Seiteneinstellungen
hugoNew: Hugo Neu
preview: Vorschau
search:
images: Bilder
music: Musik
pdf: PDF
pressToExecute: Drücken Sie Enter zum Ausführen.
pressToSearch: Drücken Sie Enter zum Suchen.
search: Suche...
searchOrCommand: Suche oder führe Befehl aus...
searchOrSupportedCommand: 'Suche oder nutze eines Ihrer verfügbaren Befehle:'
type: Tippen und mit Enter bestätigen zum Suchen.
types: Typen
video: Video
writeToSearch: Hier schreiben zum Suchen
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: Zeiteinheit
seconds: Sekunden
minutes: Minuten
hours: Stunden
days: Tage

235
src/i18n/en.json Normal file
View File

@@ -0,0 +1,235 @@
{
"permanent": "Permanent",
"buttons": {
"shell": "Toggle shell",
"cancel": "Cancel",
"close": "Close",
"copy": "Copy",
"copyFile": "Copy file",
"copyToClipboard": "Copy to clipboard",
"create": "Create",
"delete": "Delete",
"download": "Download",
"info": "Info",
"more": "More",
"move": "Move",
"moveFile": "Move file",
"new": "New",
"next": "Next",
"ok": "OK",
"replace": "Replace",
"previous": "Previous",
"rename": "Rename",
"reportIssue": "Report Issue",
"save": "Save",
"search": "Search",
"select": "Select",
"share": "Share",
"publish": "Publish",
"selectMultiple": "Select multiple",
"schedule": "Schedule",
"switchView": "Switch view",
"toggleSidebar": "Toggle sidebar",
"update": "Update",
"upload": "Upload",
"permalink": "Get Permanent Link"
},
"success": {
"linkCopied": "Link copied!"
},
"errors": {
"forbidden": "You don't have permissions to access this.",
"internal": "Something really went wrong.",
"notFound": "This location can't be reached."
},
"files": {
"folders": "Folders",
"files": "Files",
"body": "Body",
"clear": "Clear",
"closePreview": "Close preview",
"home": "Home",
"lastModified": "Last modified",
"loading": "Loading...",
"lonely": "It feels lonely here...",
"metadata": "Metadata",
"multipleSelectionEnabled": "Multiple selection enabled",
"name": "Name",
"size": "Size",
"sortByName": "Sort by name",
"sortBySize": "Sort by size",
"sortByLastModified": "Sort by last modified"
},
"help": {
"click": "select file or directory",
"ctrl": {
"click": "select multiple files or directories",
"f": "opens search",
"s": "save a file or download the directory where you are"
},
"del": "delete selected items",
"doubleClick": "open a file or directory",
"esc": "clear selection and/or close the prompt",
"f1": "this information",
"f2": "rename file",
"help": "Help"
},
"login": {
"password": "Password",
"passwordConfirm": "Password Confirmation",
"submit": "Login",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Username",
"wrongCredentials": "Wrong credentials"
},
"prompts": {
"copy": "Copy",
"copyMessage": "Choose the place to copy your files:",
"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?",
"deleteTitle": "Delete files",
"displayName": "Display Name:",
"download": "Download files",
"downloadMessage": "Choose the format you want 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):",
"newDir": "New directory",
"newDirMessage": "Write the name of the new directory.",
"newFile": "New file",
"newFileMessage": "Write the name of the new file.",
"numberDirs": "Number of directories",
"numberFiles": "Number of files",
"replace": "Replace",
"replaceMessage": "One of the files you're trying to upload is conflicting because of its name. Do you wish to replace the existing one?\n",
"rename": "Rename",
"renameMessage": "Insert a new name for",
"show": "Show",
"size": "Size",
"schedule": "Schedule",
"scheduleMessage": "Pick a date and time to schedule the publication of this post.",
"newArchetype": "Create a new post based on an archetype. Your file will be created on content folder."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Execute commands",
"allowEdit": "Edit, rename and delete files or directories",
"allowNew": "Create new files and directories",
"allowPublish": "Publish new posts and pages",
"avoidChanges": "(leave blank to avoid changes)",
"changePassword": "Change Password",
"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": "Commands updated!",
"customStylesheet": "Custom Stylesheet",
"examples": "Examples",
"globalSettings": "Global Settings",
"language": "Language",
"lockPassword": "Prevent the user from changing the password",
"newPassword": "Your new password",
"newPasswordConfirm": "Confirm your new password",
"newUser": "New User",
"password": "Password",
"passwordUpdated": "Password updated!",
"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",
"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",
"scope": "Scope",
"settingsUpdated": "Settings updated!",
"user": "User",
"userCommands": "Commands",
"userCommandsHelp": "A space separated list with the available commands for this user. Example:\n",
"userCreated": "User created!",
"userDeleted": "User deleted!",
"userManagement": "User Management",
"username": "Username",
"users": "Users",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "User updated!",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"executeOnShell": "Execute on shell",
"executeOnShellDescription": "By default, File Browser executes the commands by calling their binaries directly. If you want to run them on a shell instead (such as Bash or PowerShell), you can define it here with the required arguments and flags. If set, the command you execute will be appended as an argument. This apply to both user commands and event hooks.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"modify": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Help",
"login": "Login",
"signup": "Signup",
"logout": "Logout",
"myFiles": "My files",
"newFile": "New file",
"newFolder": "New folder",
"settings": "Settings",
"siteSettings": "Site Settings",
"hugoNew": "Hugo New",
"preview": "Preview"
},
"search": {
"images": "Images",
"music": "Music",
"pdf": "PDF",
"types": "Types",
"video": "Video",
"search": "Search...",
"typeToSearch": "Type to search...",
"pressToSearch": "Press enter to search..."
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Time Unit",
"seconds": "Seconds",
"minutes": "Minutes",
"hours": "Hours",
"days": "Days"
},
"download": {
"downloadFile": "Download File",
"downloadFolder": "Download Folder"
}
}

View File

@@ -1,210 +0,0 @@
permanent: Permanent
buttons:
cancel: Cancel
close: Close
copy: Copy
copyFile: Copy file
copyToClipboard: Copy to clipboard
create: Create
delete: Delete
download: Download
info: Info
more: More
move: Move
moveFile: Move file
new: New
next: Next
ok: OK
replace: Replace
previous: Previous
rename: Rename
reportIssue: Report Issue
save: Save
search: Search
select: Select
share: Share
publish: Publish
selectMultiple: Select multiple
schedule: Schedule
switchView: Switch view
toggleSidebar: Toggle sidebar
update: Update
upload: Upload
permalink: Get Permanent Link
success:
linkCopied: Link copied!
errors:
forbidden: You're not welcome here.
internal: Something really went wrong.
notFound: This location can't be reached.
files:
folders: Folders
files: Files
body: Body
clear: Clear
closePreview: Close preview
home: Home
lastModified: Last modified
loading: Loading...
lonely: It feels lonely here...
metadata: Metadata
multipleSelectionEnabled: Multiple selection enabled
name: Name
size: Size
sortByName: Sort by name
sortBySize: Sort by size
sortByLastModified: Sort by last modified
help:
click: select file or directory
ctrl:
click: select multiple files or directories
f: opens search
s: save a file or download the directory where you are
del: delete selected items
doubleClick: open a file or directory
esc: clear selection and/or close the prompt
f1: this information
f2: rename file
help: Help
login:
password: Password
submit: Login
username: Username
wrongCredentials: Wrong credentials
prompts:
copy: Copy
copyMessage: 'Choose the place to copy your files:'
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?
deleteTitle: Delete files
displayName: 'Display Name:'
download: Download files
downloadMessage: Choose the format you want 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):'
newDir: New directory
newDirMessage: Write the name of the new directory.
newFile: New file
newFileMessage: Write the name of the new file.
numberDirs: Number of directories
numberFiles: Number of files
replace: Replace
replaceMessage: >
One of the files you're trying to upload is conflicting because of its name.
Do you wish to replace the existing one?
rename: Rename
renameMessage: Insert a new name for
show: Show
size: Size
schedule: Schedule
scheduleMessage: Pick a date and time to schedule the publication of this post.
newArchetype: Create a new post based on an archetype. Your file will be created on content folder.
settings:
admin: Admin
administrator: Administrator
allowCommands: Execute commands
allowEdit: Edit, rename and delete files or directories
allowNew: Create new files and directories
allowPublish: Publish new posts and pages
avoidChanges: "(leave blank to avoid changes)"
changePassword: Change Password
commands: Commands
commandsHelp: >
Here you can set commands that are executed in the named events. You
write one command per line. If the event is related to files, such as before and
after saving, the environment variable "FILE" will be available with the path
of the file.
commandsUpdated: Commands updated!
customStylesheet: Custom Stylesheet
examples: Examples
globalSettings: Global Settings
language: Language
lockPassword: Prevent the user from changing the password
newPassword: Your new password
newPasswordConfirm: Confirm your new password
newUser: New User
password: Password
passwordUpdated: Password updated!
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.
profileSettings: Profile Settings
ruleExample1: >
prevents the access to any dot file (such as .git, .gitignore) in
every folder.
ruleExample2: blocks the access to the file named Caddyfile on the root of the scope.
rules: Rules
rulesHelp1: >
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.
rulesHelp2: >
Each rule goes in one different line and must start with the keyword
{0} or {1}. Then you should write {2} if you are using a regular expression and
then the expression or the path.
scope: Scope
settingsUpdated: Settings updated!
user: User
userCommands: Commands
userCommandsHelp: >
A space separated list with the available commands for this user.
Example:
userCreated: User created!
userDeleted: User deleted!
userManagement: User Management
username: Username
users: Users
userUpdated: User updated!
sidebar:
help: Help
logout: Logout
myFiles: My files
newFile: New file
newFolder: New folder
settings: Settings
siteSettings: Site Settings
hugoNew: Hugo New
preview: Preview
search:
images: Images
music: Music
notSupportedCommand: This is a not supported command.
pdf: PDF
pressToExecute: Press enter to execute.
pressToSearch: Press enter to search.
search: Search...
searchOrCommand: Search or execute a command...
searchOrSupportedCommand: 'Search or prepend ''$'' and use one of your supported commands:'
typeCommand: Type and press enter to execute.
typeSearch: Type and press enter to search.
types: Types
video: Video
writeToSearch: Write here to search
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: Time Unit
seconds: Seconds
minutes: Minutes
hours: Hours
days: Days

233
src/i18n/es.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "Permanente",
"buttons": {
"cancel": "Cancelar",
"close": "Cerrar",
"copy": "Copiar",
"copyFile": "Copiar archivo",
"copyToClipboard": "Copiar al portapapeles",
"create": "Crear",
"delete": "Borrar",
"download": "Descargar",
"info": "Info",
"more": "Más",
"move": "Mover",
"moveFile": "Mover archivo",
"new": "Nuevo",
"next": "Siguiente",
"ok": "OK",
"replace": "Reemplazar",
"previous": "Anterior",
"rename": "Renombrar",
"reportIssue": "Reportar problema",
"save": "Guardar",
"search": "Buscar",
"select": "Seleccionar",
"share": "Compartir",
"publish": "Publicar",
"selectMultiple": "Selección múltiple",
"schedule": "Programar",
"switchView": "Cambiar vista",
"toggleSidebar": "Mostrar/Ocultar menú",
"update": "Actualizar",
"upload": "Subir",
"permalink": "Link permanente"
},
"success": {
"linkCopied": "¡Link copiado!"
},
"errors": {
"forbidden": "No eres bienvenido aquí.",
"internal": "La verdad es que algo ha ido mal.",
"notFound": "No se puede acceder a este lugar."
},
"files": {
"folders": "Carpetas",
"files": "Archivos",
"body": "Cuerpo",
"clear": "Limpiar",
"closePreview": "Cerrar vista previa",
"home": "Inicio",
"lastModified": "Última modificación",
"loading": "Cargando...",
"lonely": "Uno se siente muy sólo aquí...",
"metadata": "Metadatos",
"multipleSelectionEnabled": "Selección múltiple activada",
"name": "Nombre",
"size": "Tamaño",
"sortByName": "Ordenar por nombre",
"sortBySize": "Ordenar por tamaño",
"sortByLastModified": "Ordenar por última modificación"
},
"help": {
"click": "seleccionar archivo o carpeta",
"ctrl": {
"click": "seleccionar múltiples archivos o carpetas",
"f": "abre la búsqueda",
"s": "guarda un archivo o lo descarga a la carpeta en la que estás"
},
"del": "elimina los items seleccionados",
"doubleClick": "abre un archivo o carpeta",
"esc": "limpia la selección y/o cierra la ventana",
"f1": "esta información",
"f2": "renombrar archivo",
"help": "Ayuda"
},
"login": {
"password": "Contraseña",
"passwordConfirm": "Password Confirmation",
"submit": "Iniciar sesión",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Usuario",
"wrongCredentials": "Usuario y/o contraseña incorrectos"
},
"prompts": {
"copy": "Copiar",
"copyMessage": "Elige el lugar donde quieres copiar tus archivos:",
"currentlyNavigating": "Actualmente estás en:",
"deleteMessageMultiple": "¿Estás seguro que quieres eliminar {count} archivo(s)?",
"deleteMessageSingle": "¿Estás seguro que quieres eliminar este archivo/carpeta?",
"deleteTitle": "Borrar archivos",
"displayName": "Nombre:",
"download": "Descargar archivos",
"downloadMessage": "Elige el formato de descarga.",
"error": "Algo ha fallado",
"fileInfo": "Información del archivo",
"filesSelected": "{count} archivos seleccionados.",
"lastModified": "Última modificación",
"move": "Mover",
"moveMessage": "Elige una nueva casa para tus archivo(s)/carpeta(s):",
"newDir": "Nueva carpeta",
"newDirMessage": "Escribe el nombre de la nueva carpeta.",
"newFile": "Nuevo archivo",
"newFileMessage": "Escribe el nombre del nuevo archivo.",
"numberDirs": "Número de carpetas",
"numberFiles": "Número de archivos",
"replace": "Reemplazar",
"replaceMessage": "Uno de los archivos ue intentas subir está creando conflicto por su nombre. ¿Quieres cambiar el nombre del ya existente?\n",
"rename": "Renombrar",
"renameMessage": "Escribe el nuevo nombre para",
"show": "Mostrar",
"size": "Tamaño",
"schedule": "Programar",
"scheduleMessage": "Elige una hora y fecha para programar la publicación de este post.",
"newArchetype": "Crea un nuevo post basado en un arquetipo. Tu archivo será creado en la carpeta de contenido."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Ejecutar comandos",
"allowEdit": "Editar, renombrar y borrar archivos o carpetas",
"allowNew": "Crear nuevos archivos y carpetas",
"allowPublish": "Publicar nuevos posts y páginas",
"avoidChanges": "(dejar en blanco para evitar cambios)",
"changePassword": "Cambiar contraseña",
"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": "¡Comandos actualizados!",
"customStylesheet": "Modificar hoja de estilos",
"examples": "Ejemplos",
"globalSettings": "Ajustes globales",
"language": "Idioma",
"lockPassword": "Evitar que el usuario cambie la contraseña",
"newPassword": "Tu nueva contraseña",
"newPasswordConfirm": "Confirma tu contraseña",
"newUser": "Nuevo usuario",
"password": "Contraseña",
"passwordUpdated": "¡Contraseña actualizada!",
"permissions": "Permisos",
"permissionsHelp": "Puedes nombrar al usuario como administrador o elegir los permisos individualmente. Si seleccionas \"Administrador\", todas las otras opciones serán activadas automáticamente. La administración de usuarios es un privilegio de administrador.\n",
"profileSettings": "Ajustes del perfil",
"ruleExample1": "previene el acceso a una extensión de archivo (Como .git) en cada carpeta.\n",
"ruleExample2": "bloquea el acceso al archivo llamado Caddyfile en la carpeta raíz.",
"rules": "Reglas",
"rulesHelp": "Aquí puedes definir un conjunto de reglas de permisos para este usuario específico. Los archivos bloqueados no se mostrarán en las listas y no serán accesibles por el usuario. Puedes utilizar regex y rutas relativas a la raíz del usuario.\n",
"scope": "Raíz",
"settingsUpdated": "¡Ajustes actualizados!",
"user": "Usuario",
"userCommands": "Comandos",
"userCommandsHelp": "Una lista separada por espacios con los comandos permitidos para este usuario. Ejemplo:\n",
"userCreated": "¡Usuario creado!",
"userDeleted": "¡Usuario eliminado!",
"userManagement": "Administración de usuarios",
"username": "Usuario",
"users": "Usuarios",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "¡Usuario actualizado!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Ayuda",
"logout": "Cerrar sesión",
"myFiles": "Mis archivos",
"newFile": "Nuevo archivo",
"newFolder": "Nueva carpeta",
"settings": "Ajustes",
"siteSettings": "Ajustes del sitio",
"hugoNew": "Nuevo Hugo",
"preview": "Vista previa"
},
"search": {
"images": "Images",
"music": "Música",
"notSupportedCommand": "This is a not supported command.",
"pdf": "PDF",
"pressToExecute": "Presiona enter para ejecutar.",
"pressToSearch": "Presiona enter para buscar.",
"search": "Buscar...",
"searchOrCommand": "Buscar o ejecutar un comando...",
"searchOrSupportedCommand": "Buscar o ejecutar uno de los comandos soportados:",
"typeCommand": "Type and press enter to execute.",
"typeSearch": "Type and press enter to search.",
"types": "Tipos",
"video": "Vídeo",
"writeToSearch": "Escribe aquí para buscar"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Unidad",
"seconds": "Segundos",
"minutes": "Minutos",
"hours": "Horas",
"days": "Días"
}
}

View File

@@ -1,208 +0,0 @@
permanent: Permanente
buttons:
cancel: Cancelar
close: Cerrar
copy: Copiar
copyFile: Copiar archivo
copyToClipboard: Copiar al portapapeles
create: Crear
delete: Borrar
download: Descargar
info: Info
more: Más
move: Mover
moveFile: Mover archivo
new: Nuevo
next: Siguiente
ok: OK
replace: Reemplazar
previous: Anterior
rename: Renombrar
reportIssue: Reportar problema
save: Guardar
search: Buscar
select: Seleccionar
share: Compartir
publish: Publicar
selectMultiple: Selección múltiple
schedule: Programar
switchView: Cambiar vista
toggleSidebar: Mostrar/Ocultar menú
update: Actualizar
upload: Subir
permalink: Link permanente
success:
linkCopied: ¡Link copiado!
errors:
forbidden: No eres bienvenido aquí.
internal: La verdad es que algo ha ido mal.
notFound: No se puede acceder a este lugar.
files:
folders: Carpetas
files: Archivos
body: Cuerpo
clear: Limpiar
closePreview: Cerrar vista previa
home: Inicio
lastModified: Última modificación
loading: Cargando...
lonely: Uno se siente muy sólo aquí...
metadata: Metadatos
multipleSelectionEnabled: Selección múltiple activada
name: Nombre
size: Tamaño
sortByName: Ordenar por nombre
sortBySize: Ordenar por tamaño
sortByLastModified: Ordenar por última modificación
help:
click: seleccionar archivo o carpeta
ctrl:
click: seleccionar múltiples archivos o carpetas
f: abre la búsqueda
s: guarda un archivo o lo descarga a la carpeta en la que estás
del: elimina los items seleccionados
doubleClick: abre un archivo o carpeta
esc: limpia la selección y/o cierra la ventana
f1: esta información
f2: renombrar archivo
help: Ayuda
login:
password: Contraseña
submit: Iniciar sesión
username: Usuario
wrongCredentials: Usuario y/o contraseña incorrectos
prompts:
copy: Copiar
copyMessage: 'Elige el lugar donde quieres copiar tus archivos:'
currentlyNavigating: 'Actualmente estás en:'
deleteMessageMultiple: ¿Estás seguro que quieres eliminar {count} archivo(s)?
deleteMessageSingle: ¿Estás seguro que quieres eliminar este archivo/carpeta?
deleteTitle: Borrar archivos
displayName: 'Nombre:'
download: Descargar archivos
downloadMessage: Elige el formato de descarga.
error: Algo ha fallado
fileInfo: Información del archivo
filesSelected: "{count} archivos seleccionados."
lastModified: Última modificación
move: Mover
moveMessage: 'Elige una nueva casa para tus archivo(s)/carpeta(s):'
newDir: Nueva carpeta
newDirMessage: Escribe el nombre de la nueva carpeta.
newFile: Nuevo archivo
newFileMessage: Escribe el nombre del nuevo archivo.
numberDirs: Número de carpetas
numberFiles: Número de archivos
replace: Reemplazar
replaceMessage: >
Uno de los archivos ue intentas subir está creando conflicto por su nombre.
¿Quieres cambiar el nombre del ya existente?
rename: Renombrar
renameMessage: Escribe el nuevo nombre para
show: Mostrar
size: Tamaño
schedule: Programar
scheduleMessage: Elige una hora y fecha para programar la publicación de este post.
newArchetype: Crea un nuevo post basado en un arquetipo. Tu archivo será creado en la carpeta de contenido.
settings:
admin: Admin
administrator: Administrador
allowCommands: Ejecutar comandos
allowEdit: Editar, renombrar y borrar archivos o carpetas
allowNew: Crear nuevos archivos y carpetas
allowPublish: Publicar nuevos posts y páginas
avoidChanges: "(dejar en blanco para evitar cambios)"
changePassword: Cambiar contraseña
commands: Comandos
commandsHelp: >
Aquí puedes crear comandos que serán ejecutados en los eventos. Debes
escribir un comando por linea. Si el evento está relacionado con archivos, como
por ejemplo, antes y después de guardar, la variable de entorno "FILE" estará
disponible en la ruta del archivo.
commandsUpdated: ¡Comandos actualizados!
customStylesheet: Modificar hoja de estilos
examples: Ejemplos
globalSettings: Ajustes globales
language: Idioma
lockPassword: Evitar que el usuario cambie la contraseña
newPassword: Tu nueva contraseña
newPasswordConfirm: Confirma tu contraseña
newUser: Nuevo usuario
password: Contraseña
passwordUpdated: ¡Contraseña actualizada!
permissions: Permisos
permissionsHelp: >
Puedes nombrar al usuario como administrador o elegir los permisos
individualmente. Si seleccionas "Administrador", todas las otras opciones
serán activadas automáticamente. La administración de usuarios es un privilegio de administrador.
profileSettings: Ajustes del perfil
ruleExample1: >
previene el acceso a una extensión de archivo (Como .git) en
cada carpeta.
ruleExample2: bloquea el acceso al archivo llamado Caddyfile en la carpeta raíz.
rules: Reglas
rulesHelp1: >
Aquí puedes definir un conjunto de reglas de permisos para este usuario
específico. Los archivos bloqueados no se mostrarán en las listas y no serán accesibles
por el usuario. Puedes utilizar regex y rutas relativas a la raíz del usuario.
rulesHelp2: >
Cada regla va en una línea diferente, y debe comenzar con la palabra clave
{0} or {1}. Entonces, debes escribir {2} si estás usando una expresión regular (REGEX) y
luego la expresión o la ruta.
scope: Raíz
settingsUpdated: ¡Ajustes actualizados!
user: Usuario
userCommands: Comandos
userCommandsHelp: >
Una lista separada por espacios con los comandos permitidos para este usuario.
Ejemplo:
userCreated: ¡Usuario creado!
userDeleted: ¡Usuario eliminado!
userManagement: Administración de usuarios
username: Usuario
users: Usuarios
userUpdated: ¡Usuario actualizado!
sidebar:
help: Ayuda
logout: Cerrar sesión
myFiles: Mis archivos
newFile: Nuevo archivo
newFolder: Nueva carpeta
settings: Ajustes
siteSettings: Ajustes del sitio
hugoNew: Nuevo Hugo
preview: Vista previa
search:
images: Images
music: Música
pdf: PDF
pressToExecute: Presiona enter para ejecutar.
pressToSearch: Presiona enter para buscar.
search: Buscar...
searchOrCommand: Buscar o ejecutar un comando...
searchOrSupportedCommand: 'Buscar o ejecutar uno de los comandos soportados:'
type: Escribe y presiona enter para buscar.
types: Tipos
video: Vídeo
writeToSearch: Escribe aquí para buscar
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
es: Español
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: Unidad
seconds: Segundos
minutes: Minutos
hours: Horas
days: Días

233
src/i18n/fr.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "Permanent",
"buttons": {
"cancel": "Annuler",
"close": "Fermer",
"copy": "Copier",
"copyFile": "Copier le fichier",
"copyToClipboard": "Copier dans le presse-papier",
"create": "Créer",
"delete": "Supprimer",
"download": "Télécharger",
"info": "Info",
"more": "Plus",
"move": "Déplacer",
"moveFile": "Déplacer le fichier",
"new": "Nouveau",
"next": "Suivant",
"ok": "OK",
"replace": "Remplacer",
"previous": "Précédent",
"rename": "Renommer",
"reportIssue": "Rapport d'erreur",
"save": "Enregistrer",
"search": "Chercher",
"select": "Sélectionner",
"share": "Partager",
"publish": "Publier",
"selectMultiple": "Sélection multiple",
"schedule": "Fixer la date",
"switchView": "Changer le mode d'affichage",
"toggleSidebar": "Afficher/Masquer la barre latérale",
"update": "Mettre à jour",
"upload": "Importer",
"permalink": "Obtenir un lien permanent"
},
"success": {
"linkCopied": "Link copied!"
},
"errors": {
"forbidden": "Vous n'êtes pas autorisé à être ici.",
"internal": "Aïe ! Quelque chose s'est mal passé.",
"notFound": "Impossible d'accéder à cet emplacement."
},
"files": {
"folders": "Dossiers",
"files": "Fichiers",
"body": "Corps",
"clear": "Fermer",
"closePreview": "Fermer la prévisualisation",
"home": "Accueil",
"lastModified": "Dernière modification",
"loading": "Chargement...",
"lonely": "Il semble qu'il n'y ai rien par ici...",
"metadata": "Metadonnées",
"multipleSelectionEnabled": "Sélection multiple activée",
"name": "Nom",
"size": "Taille",
"sortByName": "Trier par nom",
"sortBySize": "Trier par taille",
"sortByLastModified": "Trier par date de dernière modification"
},
"help": {
"click": "Sélectionner un élément",
"ctrl": {
"click": "Sélectionner plusieurs éléments",
"f": "Ouvrir l'invité de recherche",
"s": "Télécharger l'élément actuel"
},
"del": "Supprimer les éléments sélectionnés",
"doubleClick": "Ouvrir un élément",
"esc": "Désélectionner et/ou fermer la boîte de dialogue",
"f1": "Ouvrir l'aide",
"f2": "Renommer le fichier",
"help": "Aide"
},
"login": {
"password": "Mot de passe",
"passwordConfirm": "Password Confirmation",
"submit": "Se connecter",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Utilisateur",
"wrongCredentials": "Identifiants incorrects !"
},
"prompts": {
"copy": "Copier",
"copyMessage": "Choisissez l'emplacement où copier la sélection :",
"currentlyNavigating": "Dossier courant :",
"deleteMessageMultiple": "Etes-vous sûr de vouloir supprimer ces {count} élément(s) ?",
"deleteMessageSingle": "Etes-vous sûr de vouloir supprimer cet élément ?",
"deleteTitle": "Supprimer",
"displayName": "Nom :",
"download": "Télécharger",
"downloadMessage": "Choisissez le format de téléchargement :",
"error": "Quelque chose s'est mal passé",
"fileInfo": "Informations",
"filesSelected": "{count} éléments sélectionnés",
"lastModified": "Dernière modification",
"move": "Déplacer",
"moveMessage": "Choisissez l'emplacement où déplacer la sélection :",
"newDir": "Nouveau dossier",
"newDirMessage": "Nom du nouveau dossier :",
"newFile": "Nouveau fichier",
"newFileMessage": "Nom du nouveau fichier :",
"numberDirs": "Nombre de dossiers",
"numberFiles": "Nombre de fichiers",
"replace": "Remplacer",
"replaceMessage": "Un des fichiers que vous êtes en train d'importer a le même nom qu'un autre déjà présent. Voulez-vous remplacer le fichier actuel par le nouveau ?\n",
"rename": "Renommer",
"renameMessage": "Nouveau nom pour",
"show": "Montrer",
"size": "Taille",
"schedule": "Fixer la date",
"scheduleMessage": "Choisissez une date pour planifier la publication de ce post",
"newArchetype": "Créer un nouveau post basé sur un archétype. Votre fichier sera créé dans le dossier de contenu."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Administrateur",
"allowCommands": "Exécuter des commandes",
"allowEdit": "Editer, renommer et supprimer des fichiers ou des dossiers",
"allowNew": "Créer de nouveaux fichiers et dossiers",
"allowPublish": "Publier de nouveaux posts et pages",
"avoidChanges": "(Laisser vide pour conserver l'actuel)",
"changePassword": "Modifier le mot de passe",
"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": "Commandes mises à jour !",
"customStylesheet": "Feuille de style personnalisée",
"examples": "Exemples",
"globalSettings": "Paramètres généraux",
"language": "Langue",
"lockPassword": "Prevent the user from changing the password",
"newPassword": "Votre nouveau mot de passe",
"newPasswordConfirm": "Confirmation du nouveau mot de passe",
"newUser": "Nouvel Utilisateur",
"password": "Mot de passe",
"passwordUpdated": "Mot de passe mis à jour !",
"permissions": "Permissions",
"permissionsHelp": "Vous pouvez définir l'utilisateur comme étant un administrateur ou encore choisir les permissions individuellement. Si vous sélectionnez \"Administrateur\", toutes les autres options seront automatiquement activées. La gestion des utilisateurs est un privilège que seul l'administrateur possède.\n",
"profileSettings": "Paramètres du profil",
"ruleExample1": "Bloque l'accès à tous les fichiers commençant par un point (comme par exemple .git, .gitignore) dans tous les dossiers",
"ruleExample2": "Bloque l'accès au fichier nommé \"Caddyfile\" à la racine du dossier utilisateur",
"rules": "Règles",
"rulesHelp": "Vous pouvez définir ici un ensemble de règles pour cet utilisateur. Les fichiers bloqués ne seront pas affichés et ne seront pas accessibles par l'utilisateur. Les expressions régulières sont supportées et les chemins d'accès sont relatifs par rapport au dossier de l'utilisateur.\n",
"scope": "Portée du dossier utilisateur",
"settingsUpdated": "Les paramètres ont été mis à jour !",
"user": "Utilisateur",
"userCommands": "Commandes",
"userCommandsHelp": "Une liste séparée par des espaces des commandes permises pour l'utilisateur. Exemple :",
"userCreated": "Utilisateur créé !",
"userDeleted": "Utilisateur supprimé !",
"userManagement": "Gestion des utilisateurs",
"username": "Nom d'utilisateur",
"users": "Utilisateurs",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Utilisateur mis à jour !",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Aide",
"logout": "Se déconnecter",
"myFiles": "Mes fichiers",
"newFile": "Nouveau fichier",
"newFolder": "Nouveau dossier",
"settings": "Paramètres",
"siteSettings": "Paramètres du site",
"hugoNew": "Nouveau Hugo",
"preview": "Prévisualiser"
},
"search": {
"images": "Images",
"music": "Musique",
"notSupportedCommand": "This is a not supported command.",
"pdf": "PDF",
"pressToExecute": "Appuyez sur Entrée pour exécuter",
"pressToSearch": "Appuyez sur Entrée pour lancer la recherche",
"search": "Recherche en cours...",
"searchOrCommand": "Rechercher ou exécuter une commande...",
"searchOrSupportedCommand": "Lancez une recherche ou exécutez une commande parmis les suivantes :",
"typeCommand": "Type and press enter to execute.",
"typeSearch": "Type and press enter to search.",
"types": "Types",
"video": "Video",
"writeToSearch": "Ecrivez ici pour lancer une recherche"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Unité de temps",
"seconds": "Secondes",
"minutes": "Minutes",
"hours": "Heures",
"days": "Jours"
}
}

View File

@@ -1,201 +0,0 @@
permanent: Permanent
buttons:
cancel: Annuler
close: Fermer
copy: Copier
copyFile: Copier le fichier
copyToClipboard: Copier dans le presse-papier
create: Créer
delete: Supprimer
download: Télécharger
info: Info
more: Plus
move: Déplacer
moveFile: Déplacer le fichier
new: Nouveau
next: Suivant
ok: OK
replace: Remplacer
previous: Précédent
rename: Renommer
reportIssue: Rapport d'erreur
save: Enregistrer
search: Chercher
select: Sélectionner
share: Partager
publish: Publier
selectMultiple: Sélection multiple
schedule: Fixer la date
switchView: Changer le mode d'affichage
toggleSidebar: Afficher/Masquer la barre latérale
update: Mettre à jour
upload: Importer
permalink: Obtenir un lien permanent
errors:
forbidden: Vous n'êtes pas autorisé à être ici.
internal: Aïe ! Quelque chose s'est mal passé.
notFound: Impossible d'accéder à cet emplacement.
files:
folders: Dossiers
files: Fichiers
body: Corps
clear: Fermer
closePreview: Fermer la prévisualisation
home: Accueil
lastModified: Dernière modification
loading: Chargement...
lonely: Il semble qu'il n'y ai rien par ici...
metadata: Metadonnées
multipleSelectionEnabled: Sélection multiple activée
name: Nom
size: Taille
sortByName: Trier par nom
sortBySize: Trier par taille
sortByLastModified: Trier par date de dernière modification
help:
click: Sélectionner un élément
ctrl:
click: Sélectionner plusieurs éléments
f: Ouvrir l'invité de recherche
s: Télécharger l'élément actuel
del: Supprimer les éléments sélectionnés
doubleClick: Ouvrir un élément
esc: Désélectionner et/ou fermer la boîte de dialogue
f1: Ouvrir l'aide
f2: Renommer le fichier
help: Aide
login:
password: Mot de passe
submit: Se connecter
username: Utilisateur
wrongCredentials: Identifiants incorrects !
prompts:
copy: Copier
copyMessage: 'Choisissez l''emplacement où copier la sélection :'
currentlyNavigating: 'Dossier courant :'
deleteMessageMultiple: Etes-vous sûr de vouloir supprimer ces {count} élément(s) ?
deleteMessageSingle: Etes-vous sûr de vouloir supprimer cet élément ?
deleteTitle: Supprimer
displayName: 'Nom :'
download: Télécharger
downloadMessage: 'Choisissez le format de téléchargement :'
error: Quelque chose s'est mal passé
fileInfo: Informations
filesSelected: "{count} éléments sélectionnés"
lastModified: Dernière modification
move: Déplacer
moveMessage: 'Choisissez l''emplacement où déplacer la sélection :'
newDir: Nouveau dossier
newDirMessage: 'Nom du nouveau dossier :'
newFile: Nouveau fichier
newFileMessage: 'Nom du nouveau fichier :'
numberDirs: Nombre de dossiers
numberFiles: Nombre de fichiers
replace: Remplacer
replaceMessage: >
Un des fichiers que vous êtes en train d'importer a le même nom qu'un autre déjà présent.
Voulez-vous remplacer le fichier actuel par le nouveau ?
rename: Renommer
renameMessage: Nouveau nom pour
show: Montrer
size: Taille
schedule: Fixer la date
scheduleMessage: Choisissez une date pour planifier la publication de ce post
newArchetype: Créer un nouveau post basé sur un archétype. Votre fichier sera créé dans le dossier de contenu.
settings:
admin: Admin
administrator: Administrateur
allowCommands: Exécuter des commandes
allowEdit: Editer, renommer et supprimer des fichiers ou des dossiers
allowNew: Créer de nouveaux fichiers et dossiers
allowPublish: Publier de nouveaux posts et pages
avoidChanges: "(Laisser vide pour conserver l'actuel)"
changePassword: Modifier le mot de passe
commands: Commandes
commandsHelp: >
Ici vous pouvez définir des commandes qui seront exécutées lors de l'évènement correspondant.
Vous devez indiquer une commande par ligne. Si l'évènement est en rapport avec des fichiers,
par exemple avant et après enregistrement, la variable d'environement "FILE" sera disponible
et contiendra le chemin d'accès vers le fichier.
commandsUpdated: Commandes mises à jour !
customStylesheet: Feuille de style personnalisée
examples: Exemples
globalSettings: Paramètres généraux
language: Langue
newPassword: Votre nouveau mot de passe
newPasswordConfirm: Confirmation du nouveau mot de passe
newUser: Nouvel Utilisateur
password: Mot de passe
passwordUpdated: Mot de passe mis à jour !
permissions: Permissions
permissionsHelp: >
Vous pouvez définir l'utilisateur comme étant un administrateur ou encore choisir les
permissions individuellement. Si vous sélectionnez "Administrateur", toutes les autres
options seront automatiquement activées. La gestion des utilisateurs est un privilège que
seul l'administrateur possède.
profileSettings: Paramètres du profil
ruleExample1: Bloque l'accès à tous les fichiers commençant par un point (comme par exemple .git, .gitignore) dans tous les dossiers
ruleExample2: Bloque l'accès au fichier nommé "Caddyfile" à la racine du dossier utilisateur
rules: Règles
rulesHelp1: >
Vous pouvez définir ici un ensemble de règles pour cet utilisateur.
Les fichiers bloqués ne seront pas affichés et ne seront pas accessibles par l'utilisateur.
Les expressions régulières sont supportées et les chemins d'accès sont relatifs par rapport au dossier de l'utilisateur.
rulesHelp2: >
Chaque règle est définie sur une ligne différente et doit commencer par le mot clé {0} ou {1}.
Vous devez ensuite ajouter {2} si vous utilisez une expression régulière puis l'expression en question ou bien seulement le chemin d'accès.
scope: Portée du dossier utilisateur
settingsUpdated: Les paramètres ont été mis à jour !
user: Utilisateur
userCommands: Commandes
userCommandsHelp: 'Une liste séparée par des espaces des commandes permises pour l''utilisateur. Exemple :'
userCreated: Utilisateur créé !
userDeleted: Utilisateur supprimé !
userManagement: Gestion des utilisateurs
username: Nom d'utilisateur
users: Utilisateurs
userUpdated: Utilisateur mis à jour !
sidebar:
help: Aide
logout: Se déconnecter
myFiles: Mes fichiers
newFile: Nouveau fichier
newFolder: Nouveau dossier
settings: Paramètres
siteSettings: Paramètres du site
hugoNew: Nouveau Hugo
preview: Prévisualiser
search:
images: Images
music: Musique
pdf: PDF
pressToExecute: Appuyez sur Entrée pour exécuter
pressToSearch: Appuyez sur Entrée pour lancer la recherche
search: Recherche en cours...
searchOrCommand: Rechercher ou exécuter une commande...
searchOrSupportedCommand: 'Lancez une recherche ou exécutez une commande parmis les suivantes :'
type: Tapez votre recherche et appuyez sur Entrée
types: Types
video: Video
writeToSearch: Ecrivez ici pour lancer une recherche
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: Unité de temps
seconds: Secondes
minutes: Minutes
hours: Heures
days: Jours

View File

@@ -1,18 +1,20 @@
import Vue from 'vue'
import VueI18n from 'vue-i18n'
import en from './en.yaml'
import it from './it.yaml'
import fr from './fr.yaml'
import pt from './pt.yaml'
import ptBR from './pt-br.yaml'
import ja from './ja.yaml'
import zhCN from './zh-cn.yaml'
import zhTW from './zh-tw.yaml'
import es from './es.yaml'
import de from './de.yaml'
import ru from './ru.yaml'
import pl from './pl.yaml'
import ko from './ko.yaml'
import ar from './ar.json'
import de from './de.json'
import en from './en.json'
import es from './es.json'
import fr from './fr.json'
import it from './it.json'
import ja from './ja.json'
import pl from './pl.json'
import ko from './ko.json'
import pt from './pt.json'
import ptBR from './pt-br.json'
import ru from './ru.json'
import zhCN from './zh-cn.json'
import zhTW from './zh-tw.json'
Vue.use(VueI18n)
@@ -72,19 +74,20 @@ const i18n = new VueI18n({
locale: detectLocale(),
fallbackLocale: 'en',
messages: {
'en': en,
'it': it,
'fr': fr,
'pt': pt,
'pt-br': ptBR,
'ja': ja,
'zh-cn': zhCN,
'zh-tw': zhTW,
'es': es,
'ar': ar,
'de': de,
'ru': ru,
'en': en,
'es': es,
'fr': fr,
'it': it,
'ja': ja,
'ko': ko,
'pl': pl,
'ko': ko
'pt-br': ptBR,
'pt': pt,
'ru': ru,
'zh-cn': zhCN,
'zh-tw': zhTW
}
})

233
src/i18n/it.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "Permanente",
"buttons": {
"cancel": "Annulla",
"close": "Chiudi",
"copy": "Copia",
"copyFile": "Copia file",
"copyToClipboard": "Copia negli appunti",
"create": "Crea",
"delete": "Elimina",
"download": "Scarica",
"info": "Informazioni",
"more": "Altro",
"move": "Sposta",
"moveFile": "Sposta file",
"new": "Nuovo",
"next": "Successivo",
"ok": "OK",
"replace": "Sostituisci",
"previous": "Precedente",
"rename": "Rinomina",
"reportIssue": "Segnala un problema",
"save": "Salva",
"search": "Cerca",
"select": "Seleziona",
"share": "Condividi",
"publish": "Publica",
"selectMultiple": "Seleziona molteplici",
"schedule": "Programma",
"switchView": "Cambia vista",
"toggleSidebar": "Mostra/nascondi la barra laterale",
"update": "Aggiorna",
"upload": "Carica",
"permalink": "Ottieni link permanente"
},
"success": {
"linkCopied": "Link copiato!"
},
"errors": {
"forbidden": "Spiecente, sembra che tu non abbia i permessi per accedere a questa pagina.",
"internal": "Qualcosa è andato veramente male.",
"notFound": "Questo percorso non può essere raggiunto."
},
"files": {
"folders": "Cartelle",
"files": "Files",
"body": "Contenuto",
"clear": "Cancella",
"closePreview": "Chiudi anteprima",
"home": "Home",
"lastModified": "Ultima modifica",
"loading": "Caricamento...",
"lonely": "Ci si sente soli qui...",
"metadata": "Metadata",
"multipleSelectionEnabled": "Selezione multipla attivata",
"name": "Nome",
"size": "Grandezza",
"sortByName": "Ordina per nome",
"sortBySize": "Ordina per dimensione",
"sortByLastModified": "Ordina per ultima modifica"
},
"help": {
"click": "seleziona un file o una cartella",
"ctrl": {
"click": "seleziona più file o cartelle",
"f": "apre la barra di ricerca",
"s": "salva un file o scarica la cartella in cui ci si trova"
},
"del": "elimina gli elementi selezionati",
"doubleClick": "apre un file o una cartella",
"esc": "annulla la selezione e/o chiude la finestra aperta",
"f1": "questo pannello",
"f2": "rinomina un file",
"help": "Aiuto"
},
"login": {
"password": "Password",
"passwordConfirm": "Password Confirmation",
"submit": "Entra",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Nome utente",
"wrongCredentials": "Credenziali errate"
},
"prompts": {
"copy": "Copia",
"copyMessage": "Seleziona la cartella in cui copiare i file:",
"currentlyNavigating": "Attualmente navigando su:",
"deleteMessageMultiple": "Sei sicuro di voler eliminare {count} file(s)?",
"deleteMessageSingle": "Sei sicuro di voler eliminare questo file/cartella?",
"deleteTitle": "Elimina",
"displayName": "Nome Mostrato:",
"download": "Scarica files",
"downloadMessage": "Seleziona il formato che vuoi scaricare.",
"error": "Qualcosa è andato per il verso storto",
"fileInfo": "Informazioni sul file",
"filesSelected": "{count} file selezionati.",
"lastModified": "Ultima modifica",
"move": "Sposta",
"moveMessage": "Seleziona la nuova posizione per i tuoi file e/o cartella/e:",
"newDir": "Nuova cartella",
"newDirMessage": "Scrivi il nome della nuova cartella.",
"newFile": "Nuovo file",
"newFileMessage": "Scrivi il nome del nuovo file.",
"numberDirs": "Numero di cartelle",
"numberFiles": "Numero di files",
"replace": "Sostituisci",
"replaceMessage": "Uno dei file che stai cercando di caricare sta generando un conflitto per via del suo nome. Desideri sostituire il file già esistente?\n",
"rename": "Rinomina",
"renameMessage": "Inserisci un nuovo nome per",
"show": "Mostra",
"size": "Grandezza",
"schedule": "Pianifica",
"scheduleMessage": "Seleziona data e ora per programmare la pubbilicazione di questo post",
"newArchetype": "Crea un nuovo post basato su un modello. Il tuo file verrà creato nella cartella."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Amministratore",
"allowCommands": "Esegui comandi",
"allowEdit": "Modifica, rinomina ed elimina file o cartelle",
"allowNew": "Crea nuovi files o cartelle",
"allowPublish": "Pubblica nuovi post e pagine",
"avoidChanges": "(lascia vuoto per evitare cambiamenti)",
"changePassword": "Modifica password",
"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": "Comandi aggiornati!",
"customStylesheet": "Folgio di stile personalizzato",
"examples": "Esempi",
"globalSettings": "Impostazioni Globali",
"language": "Lingua",
"lockPassword": "Impedisci all'utente di modificare la password",
"newPassword": "La tua nuova password",
"newPasswordConfirm": "Conferma la password",
"newUser": "Nuovo utente",
"password": "Password",
"passwordUpdated": "Password aggiornata!",
"permissions": "Permessi",
"permissionsHelp": "È possibile impostare l'utente come amministratore o scegliere i permessi singolarmente. Se si seleziona \"Amministratore\", tutte le altre opzioni saranno automaticamente assegnate. La gestione degli utenti rimane un privilegio di un amministratore.\n",
"profileSettings": "Impostazioni del profilo",
"ruleExample1": "Impedisci l'accesso a qualsiasi file avente come prefisso un punto\n (ad esempio .git, .gitignore) presente in ogni cartella.\n",
"ruleExample2": "blocca l'accesso al file denominato Caddyfile nella radice del campo di applicazione.",
"rules": "Regole",
"rulesHelp": "Qui è possibile definire una serie di regole e permessi per questo specifico utente. I file bloccati non appariranno negli elenchi e non saranno accessibili dagli utenti. all'utente. Sia regex che i percorsi relativi all'ambito di applicazione degli utenti sono supportati.\n",
"scope": "Scopo",
"settingsUpdated": "Impostazioni aggiornate!",
"user": "Utente",
"userCommands": "Comandi",
"userCommandsHelp": "Una lista separata dal spazi con i comandi disponibili per questo utente. Example:\n",
"userCreated": "Utente creato!",
"userDeleted": "Utente eliminato!",
"userManagement": "Gestione degli utenti",
"username": "Nome utente",
"users": "Utenti",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Utente aggiornato!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Aiuto",
"logout": "Esci",
"myFiles": "I miei file",
"newFile": "Nuovo file",
"newFolder": "Nuova cartella",
"settings": "Impostazioni",
"siteSettings": "Impostaizoni del sito",
"hugoNew": "Hugo New",
"preview": "Anteprima"
},
"search": {
"images": "Immagini",
"music": "Musica",
"notSupportedCommand": "Questo no nè un comando supportato.",
"pdf": "PDF",
"pressToExecute": "Premi invio per eseguire.",
"pressToSearch": "Permi invio per cercare.",
"search": "Cerca...",
"searchOrCommand": "Cerca o esegui un comando...",
"searchOrSupportedCommand": "Cerca o anteponi '$' e usa uno dei comandi supportati:",
"typeCommand": "Scrivi e premi invio per eseguire.",
"typeSearch": "Scrivi e premi invio per cercare.",
"types": "Tipi",
"video": "Video",
"writeToSearch": "Scrivi qui per cercare"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Unità di tempo",
"seconds": "Secondi",
"minutes": "Minuti",
"hours": "Ore",
"days": "Giorni"
}
}

View File

@@ -1,211 +0,0 @@
permanent: Permanente
buttons:
cancel: Annulla
close: Chiudi
copy: Copia
copyFile: Copia file
copyToClipboard: Copia negli appunti
create: Crea
delete: Elimina
download: Scarica
info: Informazioni
more: Altro
move: Sposta
moveFile: Sposta file
new: Nuovo
next: Successivo
ok: OK
replace: Sostituisci
previous: Precedente
rename: Rinomina
reportIssue: Segnala un problema
save: Salva
search: Cerca
select: Seleziona
share: Condividi
publish: Publica
selectMultiple: Seleziona molteplici
schedule: Programma
switchView: Cambia vista
toggleSidebar: Mostra/nascondi la barra laterale
update: Aggiorna
upload: Carica
permalink: Ottieni link permanente
success:
linkCopied: Link copiato!
errors:
forbidden: Spiecente, sembra che tu non abbia i permessi per accedere a questa pagina.
internal: Qualcosa è andato veramente male.
notFound: Questo percorso non può essere raggiunto.
files:
folders: Cartelle
files: Files
body: Contenuto
clear: Cancella
closePreview: Chiudi anteprima
home: Home
lastModified: Ultima modifica
loading: Caricamento...
lonely: Ci si sente soli qui...
metadata: Metadata
multipleSelectionEnabled: Selezione multipla attivata
name: Nome
size: Grandezza
sortByName: Ordina per nome
sortBySize: Ordina per dimensione
sortByLastModified: Ordina per ultima modifica
help:
click: seleziona un file o una cartella
ctrl:
click: seleziona più file o cartelle
f: apre la barra di ricerca
s: salva un file o scarica la cartella in cui ci si trova
del: elimina gli elementi selezionati
doubleClick: apre un file o una cartella
esc: annulla la selezione e/o chiude la finestra aperta
f1: questo pannello
f2: rinomina un file
help: Aiuto
login:
password: Password
submit: Entra
username: Nome utente
wrongCredentials: Credenziali errate
prompts:
copy: Copia
copyMessage: 'Seleziona la cartella in cui copiare i file:'
currentlyNavigating: 'Attualmente navigando su:'
deleteMessageMultiple: Sei sicuro di voler eliminare {count} file(s)?
deleteMessageSingle: Sei sicuro di voler eliminare questo file/cartella?
deleteTitle: Elimina
displayName: 'Nome Mostrato:'
download: Scarica files
downloadMessage: Seleziona il formato che vuoi scaricare.
error: Qualcosa è andato per il verso storto
fileInfo: Informazioni sul file
filesSelected: "{count} file selezionati."
lastModified: Ultima modifica
move: Sposta
moveMessage: 'Seleziona la nuova posizione per i tuoi file e/o cartella/e:'
newDir: Nuova cartella
newDirMessage: Scrivi il nome della nuova cartella.
newFile: Nuovo file
newFileMessage: Scrivi il nome del nuovo file.
numberDirs: Numero di cartelle
numberFiles: Numero di files
replace: Sostituisci
replaceMessage: >
Uno dei file che stai cercando di caricare sta generando un conflitto per via del suo nome.
Desideri sostituire il file già esistente?
rename: Rinomina
renameMessage: Inserisci un nuovo nome per
show: Mostra
size: Grandezza
schedule: Pianifica
scheduleMessage: Seleziona data e ora per programmare la pubbilicazione di questo post
newArchetype: Crea un nuovo post basato su un modello. Il tuo file verrà creato nella cartella.
settings:
admin: Admin
administrator: Amministratore
allowCommands: Esegui comandi
allowEdit: Modifica, rinomina ed elimina file o cartelle
allowNew: Crea nuovi files o cartelle
allowPublish: Pubblica nuovi post e pagine
avoidChanges: "(lascia vuoto per evitare cambiamenti)"
changePassword: Modifica password
commands: Comandi
commandsHelp: >
Qui è possibile impostare i comandi che vengono eseguiti negli eventi denominati. È possibile
scrovere un comando per riga. Se l'evento è corretato ad un file, come ad esempio prima e dopo
un salvataggio, la variabile d'ambiente "FILE" sarà disponibile per l'uso e conterrà il percorso
al file.
commandsUpdated: Comandi aggiornati!
customStylesheet: Folgio di stile personalizzato
examples: Esempi
globalSettings: Impostazioni Globali
language: Lingua
lockPassword: Impedisci all'utente di modificare la password
newPassword: La tua nuova password
newPasswordConfirm: Conferma la password
newUser: Nuovo utente
password: Password
passwordUpdated: Password aggiornata!
permissions: Permessi
permissionsHelp: >
È possibile impostare l'utente come amministratore o scegliere i permessi
singolarmente. Se si seleziona "Amministratore", tutte le altre opzioni saranno
automaticamente assegnate. La gestione degli utenti rimane un privilegio di un amministratore.
profileSettings: Impostazioni del profilo
ruleExample1: >
Impedisci l'accesso a qualsiasi file avente come prefisso un punto
(ad esempio .git, .gitignore) presente in ogni cartella.
ruleExample2: blocca l'accesso al file denominato Caddyfile nella radice del campo di applicazione.
rules: Regole
rulesHelp1: >
Qui è possibile definire una serie di regole e permessi per questo specifico utente.
I file bloccati non appariranno negli elenchi e non saranno accessibili dagli utenti.
all'utente. Sia regex che i percorsi relativi all'ambito di applicazione degli utenti sono supportati.
rulesHelp2: >
Ogni regola deve essere inserita in una riga diversa e deve iniziare
con la parola chiave {0} or {1}.
Quindi si deve scrivere {2} se si utilizza un'espressione regolare e quindi
l'espressione o il percorso.
scope: Scopo
settingsUpdated: Impostazioni aggiornate!
user: Utente
userCommands: Comandi
userCommandsHelp: >
Una lista separata dal spazi con i comandi disponibili per questo utente.
Example:
userCreated: Utente creato!
userDeleted: Utente eliminato!
userManagement: Gestione degli utenti
username: Nome utente
users: Utenti
userUpdated: Utente aggiornato!
sidebar:
help: Aiuto
logout: Esci
myFiles: I miei file
newFile: Nuovo file
newFolder: Nuova cartella
settings: Impostazioni
siteSettings: Impostaizoni del sito
hugoNew: Hugo New
preview: Anteprima
search:
images: Immagini
music: Musica
notSupportedCommand: Questo no nè un comando supportato.
pdf: PDF
pressToExecute: Premi invio per eseguire.
pressToSearch: Permi invio per cercare.
search: Cerca...
searchOrCommand: Cerca o esegui un comando...
searchOrSupportedCommand: 'Cerca o anteponi ''$'' e usa uno dei comandi supportati:'
typeCommand: Scrivi e premi invio per eseguire.
typeSearch: Scrivi e premi invio per cercare.
types: Tipi
video: Video
writeToSearch: Scrivi qui per cercare
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: Unità di tempo
seconds: Secondi
minutes: Minuti
hours: Ore
days: Giorni

233
src/i18n/ja.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "永久",
"buttons": {
"cancel": "キャンセル",
"close": "閉じる",
"copy": "コピー",
"copyFile": "ファイルをコピー",
"copyToClipboard": "クリップボードにコピー",
"create": "作成",
"delete": "削除",
"download": "ダウンロード",
"info": "情報",
"more": "More",
"move": "移動",
"moveFile": "ファイルを移動",
"new": "新規",
"next": "次",
"ok": "OK",
"replace": "置き換える",
"previous": "前",
"rename": "名前を変更",
"reportIssue": "問題を報告",
"save": "保存",
"search": "検索",
"select": "選択",
"share": "シェア",
"publish": "発表",
"selectMultiple": "複数選択",
"schedule": "スケジュール",
"switchView": "表示を切り替わる",
"toggleSidebar": "サイドバーを表示する",
"update": "更新",
"upload": "アップロード",
"permalink": "固定リンク"
},
"success": {
"linkCopied": "リンクがコピーされました!"
},
"errors": {
"forbidden": "アクセスが拒否されました。",
"internal": "内部エラーが発生しました。",
"notFound": "リソースが見つからなりませんでした。"
},
"files": {
"folders": "フォルダ",
"files": "ファイル",
"body": "本文",
"clear": "クリアー",
"closePreview": "プレビューを閉じる",
"home": "ホーム",
"lastModified": "最終変更",
"loading": "ローディング...",
"lonely": "ここには何もない...",
"metadata": "メタデータ",
"multipleSelectionEnabled": "複数選択有効",
"name": "名前",
"size": "サイズ",
"sortByName": "名前によるソート",
"sortBySize": "サイズによるソート",
"sortByLastModified": "最終変更日付によるソート"
},
"help": {
"click": "ファイルやディレクトリを選択",
"ctrl": {
"click": "複数のファイルやディレクトリを選択",
"f": "検索を有効にする",
"s": "ファイルを保存またはカレントディレクトリをダウンロード"
},
"del": "選択した項目を削除",
"doubleClick": "ファイルやディレクトリをオープン",
"esc": "選択をクリアーまたはプロンプトを閉じる",
"f1": "このヘルプを表示",
"f2": "ファイルの名前を変更",
"help": "ヘルプ"
},
"login": {
"password": "パスワード",
"passwordConfirm": "Password Confirmation",
"submit": "ログイン",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "ユーザ名",
"wrongCredentials": "ユーザ名またはパスワードが間違っています。"
},
"prompts": {
"copy": "コピー",
"copyMessage": "コピーの目標ディレクトリを選択してください:",
"currentlyNavigating": "現在閲覧しているディレクトリ:",
"deleteMessageMultiple": "{count} つのファイルを本当に削除してよろしいですか。",
"deleteMessageSingle": "このファイル/フォルダを本当に削除してよろしいですか。",
"deleteTitle": "ファイルを削除",
"displayName": "名前:",
"download": "ファイルをダウンロード",
"downloadMessage": "圧縮形式を選択してください。",
"error": "あるエラーが発生しました。",
"fileInfo": "ファイル情報",
"filesSelected": "{count} つのファイルは選択されました。",
"lastModified": "最終変更",
"move": "移動",
"moveMessage": "移動の目標ディレクトリを選択してください:",
"newDir": "新しいディレクトリを作成",
"newDirMessage": "新しいディレクトリの名前を入力してください。",
"newFile": "新しいファイルを作成",
"newFileMessage": "新しいファイルの名前を入力してください。",
"numberDirs": "ディレクトリ個数",
"numberFiles": "ファイル個数",
"replace": "置き換える",
"replaceMessage": "アップロードするファイルの中でかち合う名前が一つあります。 既存のファイルを置き換えりませんか。\n",
"rename": "名前を変更",
"renameMessage": "名前を変更しようファイルは:",
"show": "表示",
"size": "サイズ",
"schedule": "スケジュール",
"scheduleMessage": "このポストの発表日付をスケジュールしてください。",
"newArchetype": "ある元型に基づいて新しいポストを作成します。ファイルは コンテンツフォルダに作成されます。"
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "管理者",
"administrator": "管理者",
"allowCommands": "コマンドの実行",
"allowEdit": "ファイルやディレクトリの編集、名前変更と削除",
"allowNew": "ファイルとディレクトリの作成",
"allowPublish": "ポストとぺーじの発表",
"avoidChanges": "(変更を避けるために空白にしてください)",
"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": "コマンドは更新されました!",
"customStylesheet": "カスタムスタイルシ ート",
"examples": "例",
"globalSettings": "グローバル設定",
"language": "言語",
"lockPassword": "新しいパスワードを変更に禁止",
"newPassword": "新しいパスワード",
"newPasswordConfirm": "新しいパスワードを確認します",
"newUser": "新しいユーザー",
"password": "パスワード",
"passwordUpdated": "パスワードは更新されました!",
"permissions": "権限",
"permissionsHelp": "あなたはユーザーを管理者に設定し、または権限を個々に設定しできます。\"管理者\"を選択する場合、その他のすべての選択肢は自動的に設定されます。ユーザーの管理は管理者の権限として保留されました。",
"profileSettings": "プロファイル設定",
"ruleExample1": "各フォルダに名前はドットで始まるファイル(例えば、.git、.gitignoreへのアクセスを制限します。",
"ruleExample2": "範囲のルートパスに名前は Caddyfile のファイルへのアクセスを制限します。",
"rules": "規則",
"rulesHelp": "ここに、あなたはこのユーザーの許可または拒否規則を設定できます。ブロックされたファイルはリストに表示されません、それではアクセスも制限されます。正規表現(regex)のサポートと範囲に相対のパスが提供されています。",
"scope": "範囲",
"settingsUpdated": "設定は更新されました!",
"user": "ユーザー",
"userCommands": "ユーザーのコマンド",
"userCommandsHelp": "空白区切りの有効のコマンドのリストを指定してください。例:",
"userCreated": "ユーザーは作成されました!",
"userDeleted": "ユーザーは削除されました!",
"userManagement": "ユーザー管理",
"username": "ユーザー名",
"users": "ユーザー",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "ユーザーは更新されました!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "ヘルプ",
"logout": "ログアウト",
"myFiles": "私のファイル",
"newFile": "新しいファイルを作成",
"newFolder": "新しいフォルダを作成",
"settings": "設定",
"siteSettings": "サイト設定",
"hugoNew": "Hugo New",
"preview": "プレビュー"
},
"search": {
"images": "画像",
"music": "音楽",
"notSupportedCommand": "This is a not supported command.",
"pdf": "PDF",
"pressToExecute": "Enter を押して実行します。",
"pressToSearch": "Enter を押して検索します。",
"search": "検索...",
"searchOrCommand": "コマンドを検索または実行します。",
"searchOrSupportedCommand": "サポートしているコマンドを検索または実行します:",
"typeCommand": "Type and press enter to execute.",
"typeSearch": "Type and press enter to search.",
"types": "種類",
"video": "ビデオ",
"writeToSearch": "ここにキーワードを入力してください"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "時間単位",
"seconds": "秒",
"minutes": "分",
"hours": "時間",
"days": "日"
}
}

View File

@@ -1,208 +0,0 @@
permanent: 永久
buttons:
cancel: キャンセル
close: 閉じる
copy: コピー
copyFile: ファイルをコピー
copyToClipboard: クリップボードにコピー
create: 作成
delete: 削除
download: ダウンロード
info: 情報
more: More
move: 移動
moveFile: ファイルを移動
new: 新規
next:
ok: OK
replace: 置き換える
previous:
rename: 名前を変更
reportIssue: 問題を報告
save: 保存
search: 検索
select: 選択
share: シェア
publish: 発表
selectMultiple: 複数選択
schedule: スケジュール
switchView: 表示を切り替わる
toggleSidebar: サイドバーを表示する
update: 更新
upload: アップロード
permalink: 固定リンク
success:
linkCopied: リンクがコピーされました!
errors:
forbidden: アクセスが拒否されました。
internal: 内部エラーが発生しました。
notFound: リソースが見つからなりませんでした。
files:
folders: フォルダ
files: ファイル
body: 本文
clear: クリアー
closePreview: プレビューを閉じる
home: ホーム
lastModified: 最終変更
loading: ローディング...
lonely: ここには何もない...
metadata: メタデータ
multipleSelectionEnabled: 複数選択有効
name: 名前
size: サイズ
sortByName: 名前によるソート
sortBySize: サイズによるソート
sortByLastModified: 最終変更日付によるソート
help:
click: ファイルやディレクトリを選択
ctrl:
click: 複数のファイルやディレクトリを選択
f: 検索を有効にする
s: ファイルを保存またはカレントディレクトリをダウンロード
del: 選択した項目を削除
doubleClick: ファイルやディレクトリをオープン
esc: 選択をクリアーまたはプロンプトを閉じる
f1: このヘルプを表示
f2: ファイルの名前を変更
help: ヘルプ
login:
password: パスワード
submit: ログイン
username: ユーザ名
wrongCredentials: ユーザ名またはパスワードが間違っています。
prompts:
copy: コピー
copyMessage: コピーの目標ディレクトリを選択してください:
currentlyNavigating: 現在閲覧しているディレクトリ:
deleteMessageMultiple: '{count} つのファイルを本当に削除してよろしいですか。'
deleteMessageSingle: このファイル/フォルダを本当に削除してよろしいですか。
deleteTitle: ファイルを削除
displayName: 名前:
download: ファイルをダウンロード
downloadMessage: 圧縮形式を選択してください。
error: あるエラーが発生しました。
fileInfo: ファイル情報
filesSelected: '{count} つのファイルは選択されました。'
lastModified: 最終変更
move: 移動
moveMessage: 移動の目標ディレクトリを選択してください:
newDir: 新しいディレクトリを作成
newDirMessage: 新しいディレクトリの名前を入力してください。
newFile: 新しいファイルを作成
newFileMessage: 新しいファイルの名前を入力してください。
numberDirs: ディレクトリ個数
numberFiles: ファイル個数
replace: 置き換える
replaceMessage: >
アップロードするファイルの中でかち合う名前が一つあります。
既存のファイルを置き換えりませんか。
rename: 名前を変更
renameMessage: 名前を変更しようファイルは:
show: 表示
size: サイズ
schedule: スケジュール
scheduleMessage: このポストの発表日付をスケジュールしてください。
newArchetype: ある元型に基づいて新しいポストを作成します。ファイルは コンテンツフォルダに作成されます。
settings:
admin: 管理者
administrator: 管理者
allowCommands: コマンドの実行
allowEdit: ファイルやディレクトリの編集、名前変更と削除
allowNew: ファイルとディレクトリの作成
allowPublish: ポストとぺーじの発表
avoidChanges: "(変更を避けるために空白にしてください)"
changePassword: パスワードを変更
commands: コマンド
commandsHelp: "\
ここで、名前付きイベントに実行するコマンドを設定することができます。\
一行にコマンド一つを入力してください。\
イベントはファイルに関連する場合、例えばファイル保存の前にまたは後で、\
環境変数 FILE はファイルのパスに割り当てられます。"
commandsUpdated: コマンドは更新されました!
customStylesheet: カスタムスタイルシ ート
examples:
globalSettings: グローバル設定
language: 言語
lockPassword: 新しいパスワードを変更に禁止
newPassword: 新しいパスワード
newPasswordConfirm: 新しいパスワードを確認します
newUser: 新しいユーザー
password: パスワード
passwordUpdated: パスワードは更新されました!
permissions: 権限
permissionsHelp: "\
あなたはユーザーを管理者に設定し、または権限を個々に設定しできます。\
\"管理者\"を選択する場合、その他のすべての選択肢は自動的に設定されます。\
ユーザーの管理は管理者の権限として保留されました。"
profileSettings: プロファイル設定
ruleExample1: "\
各フォルダに名前はドットで始まるファイル(例えば、.git、.gitignore\
へのアクセスを制限します。"
ruleExample2: 範囲のルートパスに名前は Caddyfile のファイルへのアクセスを制限します。
rules: 規則
rulesHelp1: "\
ここに、あなたはこのユーザーの許可または拒否規則を設定できます。\
ブロックされたファイルはリストに表示されません、それではアクセスも制限されます。\
正規表現(regex)のサポートと範囲に相対のパスが提供されています。"
rulesHelp2: "\
一行に規則一つを入力してください、\
その間に規則はキーワード {0} や {1} で始める必要があります。\
そして正規表現を使う場合、{2} と入力し、表現やパスを入力してください。"
scope: 範囲
settingsUpdated: 設定は更新されました!
user: ユーザー
userCommands: ユーザーのコマンド
userCommandsHelp: "\
空白区切りの有効のコマンドのリストを指定してください。\
例:"
userCreated: ユーザーは作成されました!
userDeleted: ユーザーは削除されました!
userManagement: ユーザー管理
username: ユーザー名
users: ユーザー
userUpdated: ユーザーは更新されました!
sidebar:
help: ヘルプ
logout: ログアウト
myFiles: 私のファイル
newFile: 新しいファイルを作成
newFolder: 新しいフォルダを作成
settings: 設定
siteSettings: サイト設定
hugoNew: Hugo New
preview: プレビュー
search:
images: 画像
music: 音楽
pdf: PDF
pressToExecute: Enter を押して実行します。
pressToSearch: Enter を押して検索します。
search: 検索...
searchOrCommand: コマンドを検索または実行します。
searchOrSupportedCommand: サポートしているコマンドを検索または実行します:
type: キーワードを入力し、Enter を押して検索します。
types: 種類
video: ビデオ
writeToSearch: ここにキーワードを入力してください
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: 時間単位
seconds:
minutes:
hours: 時間
days:

233
src/i18n/ko.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "영구적인",
"buttons": {
"cancel": "취소",
"close": "닫기",
"copy": "복사",
"copyFile": "파일 복사",
"copyToClipboard": "클립보드로 복사",
"create": "생성",
"delete": "삭제",
"download": "다운로드",
"info": "정보",
"more": "더보기",
"move": "이동",
"moveFile": "파일 이동",
"new": "새로운 파일",
"next": "다음",
"ok": "확인",
"replace": "대체",
"previous": "이전",
"rename": "이름 바꾸기",
"reportIssue": "이슈 보내기",
"save": "저장",
"search": "검색",
"select": "선택",
"share": "공유",
"publish": "퍼블리쉬",
"selectMultiple": "다수 선택하기",
"schedule": "스케쥴",
"switchView": "뷰 전환",
"toggleSidebar": "사이드바 토글",
"update": "업데이트",
"upload": "업로드",
"permalink": "영구적인 링크 얻기"
},
"success": {
"linkCopied": "링크가 복사되었습니다!"
},
"errors": {
"forbidden": "허가되지 않은 접속입니다!",
"internal": "먼가 오류가 있네요?!",
"notFound": "해당 경로를 찾을 수 없습니다."
},
"files": {
"folders": "폴더",
"files": "파일",
"body": "본문",
"clear": "클리어",
"closePreview": "프리뷰 닫기",
"home": "홈",
"lastModified": "최종 수정 시간",
"loading": "로딩중..",
"lonely": "이곳은 쓸쓸하네요..",
"metadata": "메타데이터",
"multipleSelectionEnabled": "다수 선택하기 켜짐",
"name": "이름",
"size": "크기",
"sortByName": "이름으로 정렬하기",
"sortBySize": "크기로 정렬하기",
"sortByLastModified": "최종 수정 시간으로 정렬하기"
},
"help": {
"click": "파일이나 디렉토리를 선택해주세요.",
"ctrl": {
"click": "다수의 파일이나 디렉토리를 선택해주세요.",
"f": "검색창 열기",
"s": "현재 있는 곳의 파일이나 디렉토리를 다운로드 하기"
},
"del": "선택한 파일들 삭제하기",
"doubleClick": "파일이나 디렉토리 열기",
"esc": "선택 취소/프롬프트 닫기",
"f1": "정보",
"f2": "파일 이름 변경",
"help": "도움(Help)"
},
"login": {
"password": "비밀번호",
"passwordConfirm": "Password Confirmation",
"submit": "로그인",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "유저네임",
"wrongCredentials": "유저네임 혹은 비밀번호가 올바르지 않습니다."
},
"prompts": {
"copy": "복사",
"copyMessage": "파일을 복사할 곳 정하기:",
"currentlyNavigating": "현재 위치:",
"deleteMessageMultiple": "{count} 개의 파일을 삭제하시겠습니까?",
"deleteMessageSingle": "이 파일 혹은 디렉토리를 삭제하시겠습니까?",
"deleteTitle": "파일 삭제",
"displayName": "디스플레이 네임:",
"download": "파일 다운로드",
"downloadMessage": "다운로드 받고 싶은 포맷 설정.",
"error": "에러 발생!",
"fileInfo": "파일 정보",
"filesSelected": "{count} 개의 파일이 선택되었습니다.",
"lastModified": "최종 수정 시간",
"move": "이동",
"moveMessage": "이동시킬 곳을 알려주세요:",
"newDir": "새 디렉토리",
"newDirMessage": "새 디렉토리의 이름을 입력해주세요.",
"newFile": "새 파일",
"newFileMessage": "새 파일의 이름을 입력해주세요.",
"numberDirs": "디렉토리 수",
"numberFiles": "파일 수",
"replace": "덮어쓰기(replace)",
"replaceMessage": "동일 한 파일을 업로드하려고 합니다. 존재하는 파일을 덮어 씌울까요?\n",
"rename": "이름 변경",
"renameMessage": "새로운 이름을 알려주세요.",
"show": "보기",
"size": "크기",
"schedule": "스케쥴",
"scheduleMessage": "이 포스트를 공개할 시간을 알려주세요.",
"newArchetype": "archetype에 기반한 포스트를 생성합니다. 파일은 컨텐트 폴더(content folder)에 생성됩니다."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "관리자",
"administrator": "관리자",
"allowCommands": "명령어 실행",
"allowEdit": "파일/디렉토리의 수정, 변경 또는 삭제를 허용합니다.",
"allowNew": "파일/디렉토리의 생성을 허용합니다.",
"allowPublish": "페이지(새글)를 생성하는 것을 허용합니다.",
"avoidChanges": "(수정하기 싫으시면 그냥 놔두시면 됩니다)",
"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": "커맨드 업데이트 완료!",
"customStylesheet": "사용자 설정 스타일시트",
"examples": "예시",
"globalSettings": "글로벌 설정",
"language": "언어",
"lockPassword": "유저가 패스워드를 변경하는 것을 방지합니다",
"newPassword": "새로운 비밀번호",
"newPasswordConfirm": "새로운 비밀번호 확인",
"newUser": "새로운 유저",
"password": "비밀번호",
"passwordUpdated": "비밀번호 업데이트 완료!",
"permissions": "권한",
"permissionsHelp": "유저를 관리자로 만들거나 각 퍼미션을 선택해 줄 수 있습니다. 관리자를 선택하시면 다른 모든 옵션들이 자동으로 선택됩니다. 사용자 관리는 여전히 현재 관리자만 할 수 있습니다.\n",
"profileSettings": "프로필 설정",
"ruleExample1": "모든 폴더의 .으로 시작하는 파일의 접근을 방지합니다.(예 .git, .gitignore) (숨김파일 보기 방지)\n",
"ruleExample2": "Caddyfile파일의 접근을 방지합니다.",
"rules": "룰",
"rulesHelp": "각 유저별 룰을 허용/비허용 할지 정할 수 있습니다. 블락된 파일은 리스팅 되지 않고 유저들은 접근할 수 없습니다. 사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.\n",
"scope": "범위",
"settingsUpdated": "설정 업데이트 완료!",
"user": "유저",
"userCommands": "명령어들",
"userCommandsHelp": "이 유저에게 허용시킬 커맨드를 스페이스로 구분해 입력해주세요. 예시:\n",
"userCreated": "유저 생성됨!",
"userDeleted": "유저 삭제됨!",
"userManagement": "유저 관리",
"username": "유저네임",
"users": "유저",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "유저 정보 업데이트 완료!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "도움(Help)",
"logout": "로그아웃",
"myFiles": "내 파일들",
"newFile": "새로운 파일",
"newFolder": "새로운 폴더",
"settings": "설정",
"siteSettings": "사이트 설정",
"hugoNew": "Hugo New",
"preview": "미리보기"
},
"search": {
"images": "이미지",
"music": "음악",
"notSupportedCommand": "지원 되지 않은 커맨드입니다.",
"pdf": "PDF",
"pressToExecute": "엔터를 누르시면 실행합니다.",
"pressToSearch": "엔터를 누르시면 검색됩니다.",
"search": "검색...",
"searchOrCommand": "커맨드를 검색하거나 실행합니다...",
"searchOrSupportedCommand": "검색하거나 '$'를 앞에 붙여 지원되는 커맨드들을 사용해보세요:",
"typeCommand": "엔터를 누르시면 실행합니다.",
"typeSearch": "엔터를 누르시면 검색됩니다.",
"types": "Types",
"video": "비디오",
"writeToSearch": "검색하고 싶은것을 적어주세요"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Time Unit",
"seconds": "초",
"minutes": "분",
"hours": "시",
"days": "일"
}
}

View File

@@ -1,207 +0,0 @@
permanent: 영구적인
buttons:
cancel: 취소
close: 닫기
copy: 복사
copyFile: 파일 복사
copyToClipboard: 클립보드로 복사
create: 생성
delete: 삭제
download: 다운로드
info: 정보
more: 더보기
move: 이동
moveFile: 파일 이동
new: 새로운 파일
next: 다음
ok: 확인
replace: 대체
previous: 이전
rename: 이름 바꾸기
reportIssue: 이슈 보내기
save: 저장
search: 검색
select: 선택
share: 공유
publish: 퍼블리쉬
selectMultiple: 다수 선택하기
schedule: 스케쥴
switchView: 뷰 전환
toggleSidebar: 사이드바 토글
update: 업데이트
upload: 업로드
permalink: 영구적인 링크 얻기
success:
linkCopied: 링크가 복사되었습니다!
errors:
forbidden: 허가되지 않은 접속입니다!
internal: 먼가 오류가 있네요?!
notFound: 해당 경로를 찾을 수 없습니다.
files:
folders: 폴더
files: 파일
body: 본문
clear: 클리어
closePreview: 프리뷰 닫기
home:
lastModified: 최종 수정 시간
loading: 로딩중..
lonely: 이곳은 쓸쓸하네요..
metadata: 메타데이터
multipleSelectionEnabled: 다수 선택하기 켜짐
name: 이름
size: 크기
sortByName: 이름으로 정렬하기
sortBySize: 크기로 정렬하기
sortByLastModified: 최종 수정 시간으로 정렬하기
help:
click: 파일이나 디렉토리를 선택해주세요.
ctrl:
click: 다수의 파일이나 디렉토리를 선택해주세요.
f: 검색창 열기
s: 현재 있는 곳의 파일이나 디렉토리를 다운로드 하기
del: 선택한 파일들 삭제하기
doubleClick: 파일이나 디렉토리 열기
esc: 선택 취소/프롬프트 닫기
f1: 정보
f2: 파일 이름 변경
help: 도움(Help)
login:
password: 비밀번호
submit: 로그인
username: 유저네임
wrongCredentials: 유저네임 혹은 비밀번호가 올바르지 않습니다.
prompts:
copy: 복사
copyMessage: '파일을 복사할 곳 정하기:'
currentlyNavigating: '현재 위치:'
deleteMessageMultiple: "{count} 개의 파일을 삭제하시겠습니까?"
deleteMessageSingle: 이 파일 혹은 디렉토리를 삭제하시겠습니까?
deleteTitle: 파일 삭제
displayName: '디스플레이 네임:'
download: 파일 다운로드
downloadMessage: 다운로드 받고 싶은 포맷 설정.
error: 에러 발생!
fileInfo: 파일 정보
filesSelected: "{count} 개의 파일이 선택되었습니다."
lastModified: 최종 수정 시간
move: 이동
moveMessage: '이동시킬 곳을 알려주세요:'
newDir: 새 디렉토리
newDirMessage: 새 디렉토리의 이름을 입력해주세요.
newFile: 새 파일
newFileMessage: 새 파일의 이름을 입력해주세요.
numberDirs: 디렉토리 수
numberFiles: 파일 수
replace: 덮어쓰기(replace)
replaceMessage: >
동일 한 파일을 업로드하려고 합니다.
존재하는 파일을 덮어 씌울까요?
rename: 이름 변경
renameMessage: 새로운 이름을 알려주세요.
show: 보기
size: 크기
schedule: 스케쥴
scheduleMessage: 이 포스트를 공개할 시간을 알려주세요.
newArchetype: archetype에 기반한 포스트를 생성합니다. 파일은 컨텐트 폴더(content folder)에 생성됩니다.
settings:
admin: 관리자
administrator: 관리자
allowCommands: 명령어 실행
allowEdit: 파일/디렉토리의 수정, 변경 또는 삭제를 허용합니다.
allowNew: 파일/디렉토리의 생성을 허용합니다.
allowPublish: 페이지(새글)를 생성하는 것을 허용합니다.
avoidChanges: "(수정하기 싫으시면 그냥 놔두시면 됩니다)"
changePassword: 비밀번호 변경
commands: 명령들
commandsHelp: >
named events안에서 실행될 커맨드를 설정할 수 있습니다.
한줄에 하나의 커맨드를 작성하실 수 있습니다. 이벤트가 저장 전 혹은 후를 핸들링 하는 것과 같이 파일과 관련있다면,
"FILE" 환경 변수는 파일의 경로와 함께 사용하실 수 있습니다.
commandsUpdated: 커맨드 업데이트 완료!
customStylesheet: 사용자 설정 스타일시트
examples: 예시
globalSettings: 글로벌 설정
language: 언어
lockPassword: 유저가 패스워드를 변경하는 것을 방지합니다
newPassword: 새로운 비밀번호
newPasswordConfirm: 새로운 비밀번호 확인
newUser: 새로운 유저
password: 비밀번호
passwordUpdated: 비밀번호 업데이트 완료!
permissions: 권한
permissionsHelp: >
유저를 관리자로 만들거나 각 퍼미션을 선택해 줄 수 있습니다.
관리자를 선택하시면 다른 모든 옵션들이 자동으로 선택됩니다.
사용자 관리는 여전히 현재 관리자만 할 수 있습니다.
profileSettings: 프로필 설정
ruleExample1: >
모든 폴더의 .으로 시작하는 파일의 접근을 방지합니다.(예 .git, .gitignore) (숨김파일 보기 방지)
ruleExample2: Caddyfile파일의 접근을 방지합니다.
rules:
rulesHelp1: >
각 유저별 룰을 허용/비허용 할지 정할 수 있습니다.
블락된 파일은 리스팅 되지 않고 유저들은 접근할 수 없습니다.
사용자의 접근 허용 범위와 관련해 정규표현식(regex)과 경로를 지원합니다.
rulesHelp2: >
각 룰은 한줄에 하나씩 작성되어야 하며 {0} 또는 {1}로 시작되어야 합니다.
만약 정규 표현식을 사용한 식이나 경로를 사용할 경우 {2}를 꼭 사용해야 합니다.
scope: 범위
settingsUpdated: 설정 업데이트 완료!
user: 유저
userCommands: 명령어들
userCommandsHelp: >
이 유저에게 허용시킬 커맨드를 스페이스로 구분해 입력해주세요.
예시:
userCreated: 유저 생성됨!
userDeleted: 유저 삭제됨!
userManagement: 유저 관리
username: 유저네임
users: 유저
userUpdated: 유저 정보 업데이트 완료!
sidebar:
help: 도움(Help)
logout: 로그아웃
myFiles: 내 파일들
newFile: 새로운 파일
newFolder: 새로운 폴더
settings: 설정
siteSettings: 사이트 설정
hugoNew: Hugo New
preview: 미리보기
search:
images: 이미지
music: 음악
notSupportedCommand: 지원 되지 않은 커맨드입니다.
pdf: PDF
pressToExecute: 엔터를 누르시면 실행합니다.
pressToSearch: 엔터를 누르시면 검색됩니다.
search: 검색...
searchOrCommand: 커맨드를 검색하거나 실행합니다...
searchOrSupportedCommand: '검색하거나 ''$''를 앞에 붙여 지원되는 커맨드들을 사용해보세요:'
typeCommand: 엔터를 누르시면 실행합니다.
typeSearch: 엔터를 누르시면 검색됩니다.
types: Types
video: 비디오
writeToSearch: 검색하고 싶은것을 적어주세요
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: Time Unit
seconds:
minutes:
hours:
days:

233
src/i18n/pl.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "Permanent",
"buttons": {
"cancel": "Anuluj",
"close": "Zamknij",
"copy": "Kopiuj",
"copyFile": "Kopiuj plik",
"copyToClipboard": "kopiuj do schowka",
"create": "Utwórz",
"delete": "Usuń",
"download": "Pobierz",
"info": "Informacja",
"more": "Więce",
"move": "Przenieś",
"moveFile": "Przenieś plik",
"new": "Nowy",
"next": "Następny",
"ok": "OK",
"replace": "Zamień",
"previous": "Poprzedni",
"rename": "Zmień Nazwę",
"reportIssue": "Zgłoś Problem",
"save": "Zapisz",
"search": "Szukaj",
"select": "Wybierz",
"share": "Udostępnij",
"publish": "Opublikuj",
"selectMultiple": "Zaznacz wiele",
"schedule": "Grafik",
"switchView": "Zmień widok",
"toggleSidebar": "Toggle sidebar",
"update": "Aktualizuj",
"upload": "Upload",
"permalink": "Get Permanent Link"
},
"success": {
"linkCopied": "Link Skopiowany!"
},
"errors": {
"forbidden": "Nie jesteś tu mile widziany.",
"internal": "Pojawił się poważny problem.",
"notFound": "Ten adres nie jest poprawny."
},
"files": {
"folders": "Foldery",
"files": "Pliki",
"body": "Body",
"clear": "Wyczyść",
"closePreview": "Zamknij poprzednie",
"home": "Home",
"lastModified": "Ostatnio modyfikowane",
"loading": "Ładowanie...",
"lonely": "Smutno gdy tak pusto...",
"metadata": "Metadata",
"multipleSelectionEnabled": "Multiple selection enabled",
"name": "Nazwa",
"size": "Rozmiar",
"sortByName": "Sortuj po nazwie",
"sortBySize": "Sortuj po rozmiarze",
"sortByLastModified": "Sortuj po dacie modyfikacji"
},
"help": {
"click": "wybierz plik lub foler",
"ctrl": {
"click": "wybierz wiele plików lub folderów",
"f": "otwórz wyszukiwarkę",
"s": "pobierz aktywny plik lub folder"
},
"del": "usuń zaznaczone",
"doubleClick": "otwórz plik lub folder",
"esc": "wyczyść zaznaczenie i/lub zamknij okno z powiadomieniem",
"f1": "ta informacja",
"f2": "zmień nazwę pliku",
"help": "Pomoc"
},
"login": {
"password": "Hasło",
"passwordConfirm": "Password Confirmation",
"submit": "Login",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Nazwa użytkownika",
"wrongCredentials": "Błędne dane logowania"
},
"prompts": {
"copy": "Kopiuj",
"copyMessage": "Wybierz lokalizację do której mają być skopiowane wybrane pliki",
"currentlyNavigating": "Currently navigating on:",
"deleteMessageMultiple": "Czy jesteś pewien że chcesz usunąć {count} plik(ów)?",
"deleteMessageSingle": "Czy jesteś pewien, że chcesz usunąć ten plik/folder?",
"deleteTitle": "Usuń pliki",
"displayName": "Wyświetlana Nazwa:",
"download": "Pobierz pliki",
"downloadMessage": "Wybierz format, jaki chesz pobrać.",
"error": "Pojawił się jakiś błąd",
"fileInfo": "Informacje o pliku",
"filesSelected": "{count} plików zostało zaznaczonych.",
"lastModified": "Osatnio Zmodyfikowane",
"move": "Przenieś",
"moveMessage": "Wybierz nową lokalizację dla swoich plik(ów)/folder(ów):",
"newDir": "Nowy folder",
"newDirMessage": "Podaj nazwę tworzonego folderu.",
"newFile": "Nowy plik",
"newFileMessage": "Podaj nazwętworzonego pliku.",
"numberDirs": "Ilość katalogów",
"numberFiles": "Ilość plików",
"replace": "Zamień",
"replaceMessage": "Jednen z plików który próbujesz wrzucić próbje nadpisać plik o tej samej nazwie. Czy chcesz nadpisać poprzedni plik?\n",
"rename": "Zmień nazwę",
"renameMessage": "Podaj nową nazwę dla",
"show": "Pokaż",
"size": "Rozmiar",
"schedule": "Grafi",
"scheduleMessage": "Wybierz datę i czas dla publikacji tego wpisu.",
"newArchetype": "Utwórz nowy wpis na bazie wybranego wzorca. Twój plik będzie utworzony w wybranym folderze."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Administrator",
"allowCommands": "Wykonaj polecenie",
"allowEdit": "Edycja, zmiana nazwy i usuniecie plików lub folderów",
"allowNew": "Tworzenie nowych plików lub folderów",
"allowPublish": "Tworzenie nowych wpisów i stron",
"avoidChanges": "(pozostaw puste aby nie zosatało zmienione)",
"changePassword": "Zmień Hasło",
"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": "Polecenie zaktualizowane!",
"customStylesheet": "Własny Stylesheet",
"examples": "Przykłady",
"globalSettings": "Ustawienia Globalne",
"language": "Język",
"lockPassword": "Zablokuj użytkownikowi możliwość zmiany hasła",
"newPassword": "Twoje nowe hasło",
"newPasswordConfirm": "Potwierdź swoje hasło",
"newUser": "Nowy Użytkownik",
"password": "Hasło",
"passwordUpdated": "Hasło zostało zapisane!",
"permissions": "Uprawnienia",
"permissionsHelp": "You can set the user to be an administrator or choose the permissions individually. If you select \"Administrator\", all of the other options will be automatically checked. The management of users remains a privilege of an administrator.\n",
"profileSettings": "Twój profil",
"ruleExample1": "prevents the access to any dot file (such as .git, .gitignore) in every folder.\n",
"ruleExample2": "blocks the access to the file named Caddyfile on the root of the scope.",
"rules": "Uprawnienia",
"rulesHelp": "Here you can define a set of allow and disallow rules for this specific user. The blocked files won't show up in the listings and they wont be accessible to the user. We support regex and paths relative to the users scope.\n",
"scope": "Scope",
"settingsUpdated": "Uprawnienia Zapisane!",
"user": "Użytkownik",
"userCommands": "Polecenia",
"userCommandsHelp": "A space separated list with the available commands for this user. Example:\n",
"userCreated": "Użytkownik zapisany!",
"userDeleted": "Użytkownik usunięty!",
"userManagement": "Zarządzanie użytkownikami",
"username": "Nazwa użytkownika",
"users": "Użytkownicy",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Użytkownik zapisany!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Pomoc",
"logout": "Wyloguj",
"myFiles": "Moje pliki",
"newFile": "Nowy plik",
"newFolder": "Nowy folder",
"settings": "Ustawienia",
"siteSettings": "Ustawienia Strony",
"hugoNew": "Hugo New",
"preview": "Podgląd"
},
"search": {
"images": "Zdjęcia",
"music": "Muzyka",
"notSupportedCommand": "Polecenie niedozwolone.",
"pdf": "PDF",
"pressToExecute": "Naciśniej Enter aby wykonać.",
"pressToSearch": "Naciśnij Enter aby wyszukać.",
"search": "Szukaj...",
"searchOrCommand": "Szukaj lub wykonaj polecenie...",
"searchOrSupportedCommand": "Szukaj lub wpisz '$' i wybierz jedno z dostęnych poleceń:",
"typeCommand": "Wpisz i naciśnij Enter aby wykonać.",
"typeSearch": "Wpisz i naciśni Enter aby wyszukać.",
"types": "Typy",
"video": "Video",
"writeToSearch": "Wpisz tu aby wyszukać"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Jednostka czasu",
"seconds": "Sekundy",
"minutes": "Minuty",
"hours": "Godziny",
"days": "Dni"
}
}

View File

@@ -1,210 +0,0 @@
permanent: Permanent
buttons:
cancel: Anuluj
close: Zamknij
copy: Kopiuj
copyFile: Kopiuj plik
copyToClipboard: kopiuj do schowka
create: Utwórz
delete: Usuń
download: Pobierz
info: Informacja
more: Więce
move: Przenieś
moveFile: Przenieś plik
new: Nowy
next: Następny
ok: OK
replace: Zamień
previous: Poprzedni
rename: Zmień Nazwę
reportIssue: Zgłoś Problem
save: Zapisz
search: Szukaj
select: Wybierz
share: Udostępnij
publish: Opublikuj
selectMultiple: Zaznacz wiele
schedule: Grafik
switchView: Zmień widok
toggleSidebar: Toggle sidebar
update: Aktualizuj
upload: Upload
permalink: Get Permanent Link
success:
linkCopied: Link Skopiowany!
errors:
forbidden: Nie jesteś tu mile widziany.
internal: Pojawił się poważny problem.
notFound: Ten adres nie jest poprawny.
files:
folders: Foldery
files: Pliki
body: Body
clear: Wyczyść
closePreview: Zamknij poprzednie
home: Home
lastModified: Ostatnio modyfikowane
loading: Ładowanie...
lonely: Smutno gdy tak pusto...
metadata: Metadata
multipleSelectionEnabled: Multiple selection enabled
name: Nazwa
size: Rozmiar
sortByName: Sortuj po nazwie
sortBySize: Sortuj po rozmiarze
sortByLastModified: Sortuj po dacie modyfikacji
help:
click: wybierz plik lub foler
ctrl:
click: wybierz wiele plików lub folderów
f: otwórz wyszukiwarkę
s: pobierz aktywny plik lub folder
del: usuń zaznaczone
doubleClick: otwórz plik lub folder
esc: wyczyść zaznaczenie i/lub zamknij okno z powiadomieniem
f1: ta informacja
f2: zmień nazwę pliku
help: Pomoc
login:
password: Hasło
submit: Login
username: Nazwa użytkownika
wrongCredentials: Błędne dane logowania
prompts:
copy: Kopiuj
copyMessage: 'Wybierz lokalizację do której mają być skopiowane wybrane pliki'
currentlyNavigating: 'Currently navigating on:'
deleteMessageMultiple: Czy jesteś pewien że chcesz usunąć {count} plik(ów)?
deleteMessageSingle: Czy jesteś pewien, że chcesz usunąć ten plik/folder?
deleteTitle: Usuń pliki
displayName: 'Wyświetlana Nazwa:'
download: Pobierz pliki
downloadMessage: Wybierz format, jaki chesz pobrać.
error: Pojawił się jakiś błąd
fileInfo: Informacje o pliku
filesSelected: "{count} plików zostało zaznaczonych."
lastModified: Osatnio Zmodyfikowane
move: Przenieś
moveMessage: 'Wybierz nową lokalizację dla swoich plik(ów)/folder(ów):'
newDir: Nowy folder
newDirMessage: Podaj nazwę tworzonego folderu.
newFile: Nowy plik
newFileMessage: Podaj nazwętworzonego pliku.
numberDirs: Ilość katalogów
numberFiles: Ilość plików
replace: Zamień
replaceMessage: >
Jednen z plików który próbujesz wrzucić próbje nadpisać plik o tej samej nazwie.
Czy chcesz nadpisać poprzedni plik?
rename: Zmień nazwę
renameMessage: Podaj nową nazwę dla
show: Pokaż
size: Rozmiar
schedule: Grafi
scheduleMessage: Wybierz datę i czas dla publikacji tego wpisu.
newArchetype: Utwórz nowy wpis na bazie wybranego wzorca. Twój plik będzie utworzony w wybranym folderze.
settings:
admin: Admin
administrator: Administrator
allowCommands: Wykonaj polecenie
allowEdit: Edycja, zmiana nazwy i usuniecie plików lub folderów
allowNew: Tworzenie nowych plików lub folderów
allowPublish: Tworzenie nowych wpisów i stron
avoidChanges: "(pozostaw puste aby nie zosatało zmienione)"
changePassword: Zmień Hasło
commands: Polecenia
commandsHelp: >
Here you can set commands that are executed in the named events. You
write one command per line. If the event is related to files, such as before and
after saving, the environment variable "FILE" will be available with the path
of the file.
commandsUpdated: Polecenie zaktualizowane!
customStylesheet: Własny Stylesheet
examples: Przykłady
globalSettings: Ustawienia Globalne
language: Język
lockPassword: Zablokuj użytkownikowi możliwość zmiany hasła
newPassword: Twoje nowe hasło
newPasswordConfirm: Potwierdź swoje hasło
newUser: Nowy Użytkownik
password: Hasło
passwordUpdated: Hasło zostało zapisane!
permissions: Uprawnienia
permissionsHelp: >
You can set the user to be an administrator or choose the permissions
individually. If you select "Administrator", all of the other options will be
automatically checked. The management of users remains a privilege of an administrator.
profileSettings: Twój profil
ruleExample1: >
prevents the access to any dot file (such as .git, .gitignore) in
every folder.
ruleExample2: blocks the access to the file named Caddyfile on the root of the scope.
rules: Uprawnienia
rulesHelp1: >
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.
rulesHelp2: >
Each rule goes in one different line and must start with the keyword
{0} or {1}. Then you should write {2} if you are using a regular expression and
then the expression or the path.
scope: Scope
settingsUpdated: Uprawnienia Zapisane!
user: Użytkownik
userCommands: Polecenia
userCommandsHelp: >
A space separated list with the available commands for this user.
Example:
userCreated: Użytkownik zapisany!
userDeleted: Użytkownik usunięty!
userManagement: Zarządzanie użytkownikami
username: Nazwa użytkownika
users: Użytkownicy
userUpdated: Użytkownik zapisany!
sidebar:
help: Pomoc
logout: Wyloguj
myFiles: Moje pliki
newFile: Nowy plik
newFolder: Nowy folder
settings: Ustawienia
siteSettings: Ustawienia Strony
hugoNew: Hugo New
preview: Podgląd
search:
images: Zdjęcia
music: Muzyka
notSupportedCommand: Polecenie niedozwolone.
pdf: PDF
pressToExecute: Naciśniej Enter aby wykonać.
pressToSearch: Naciśnij Enter aby wyszukać.
search: Szukaj...
searchOrCommand: Szukaj lub wykonaj polecenie...
searchOrSupportedCommand: 'Szukaj lub wpisz ''$'' i wybierz jedno z dostęnych poleceń:'
typeCommand: Wpisz i naciśnij Enter aby wykonać.
typeSearch: Wpisz i naciśni Enter aby wyszukać.
types: Typy
video: Video
writeToSearch: Wpisz tu aby wyszukać
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: Jednostka czasu
seconds: Sekundy
minutes: Minuty
hours: Godziny
days: Dni

233
src/i18n/pt-br.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "Permanente",
"buttons": {
"cancel": "Cancelar",
"close": "Fechar",
"copy": "Copiar",
"copyFile": "Copiar arquivo",
"copyToClipboard": "Copiar",
"create": "Criar",
"delete": "Deletar",
"download": "Baixar",
"info": "Informações",
"more": "Mais",
"move": "Mover",
"moveFile": "Mover arquivo",
"new": "Novo",
"next": "Próximo",
"ok": "Ok",
"replace": "Substituir",
"previous": "Anterior",
"rename": "Renomear",
"reportIssue": "Reportar erro",
"save": "Salvar",
"search": "Pesquisar",
"select": "Selecionar",
"share": "Compartilhar",
"publish": "Publicar",
"selectMultiple": "Selecionar múltiplos",
"schedule": "Agendar",
"switchView": "Alterar modo de visão",
"toggleSidebar": "Alternar barra lateral",
"update": "Atualizar",
"upload": "Enviar",
"permalink": "Obter link permanente"
},
"success": {
"linkCopied": "Link copiado!"
},
"errors": {
"forbidden": "Ops! Você não pode acessar aqui.",
"internal": "Ops! Algum erro ocorreu.",
"notFound": "Ops! Nada foi encontrado."
},
"files": {
"folders": "Pastas",
"files": "Arquivos",
"body": "Corpo",
"clear": "Limpar",
"closePreview": "Fechar pré-visualização",
"home": "Início",
"lastModified": "Última modificação",
"loading": "Carregando. Aguarde, por favor.",
"lonely": "Não existe nada aqui.",
"metadata": "Metadados",
"multipleSelectionEnabled": "Seleção múltipla ativada",
"name": "Nome",
"size": "Tamanho",
"sortByName": "Ordenar pelo nome",
"sortBySize": "Ordenar pelo tamanho",
"sortByLastModified": "Ordenar pela última modificação"
},
"help": {
"click": "selecionar pasta ou arquivo",
"ctrl": {
"click": "selecionar várias pastas e arquivos",
"f": "pesquisar",
"s": "salvar um arquivo ou baixar a pasta que você está"
},
"del": "deletar os arquivos selecionados",
"doubleClick": "abrir pasta ou arquivo",
"esc": "limpar seleção e/ou fechar menu",
"f1": "está informação",
"f2": "renomear arquivo",
"help": "Ajuda"
},
"login": {
"password": "Senha",
"passwordConfirm": "Password Confirmation",
"submit": "Login",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Nome do usuário",
"wrongCredentials": "Ops! Dados incorretos."
},
"prompts": {
"copy": "Copiar",
"copyMessage": "Escolha um lugar para copiar os arquivos:",
"currentlyNavigating": "Navegando em:",
"deleteMessageMultiple": "Deseja deletar {count} arquivo(s)?",
"deleteMessageSingle": "Deseja deletar está pasta/arquivo?",
"deleteTitle": "Deletar arquivos",
"displayName": "Nome:",
"download": "Baixar arquivos",
"downloadMessage": "Escolha o formato do arquivo.",
"error": "Algo de ruim ocorreu",
"fileInfo": "Informação do arquivo",
"filesSelected": "{count} arquivos selecionados.",
"lastModified": "Última modificação",
"move": "Mover",
"moveMessage": "Escolha uma nova pasta para os seus arquivos:",
"newDir": "Nova pasta",
"newDirMessage": "Escreva o nome da nova pasta.",
"newFile": "Novo arquivo",
"newFileMessage": "Escreva o nome do novo arquivo.",
"numberDirs": "Número de pastas",
"numberFiles": "Número de arquivos",
"replace": "Substituir",
"replaceMessage": "Já existe um arquivo com nome igual a um dos que está tentando enviar. Deseja substituir?\n",
"rename": "Renomear",
"renameMessage": "Insira um novo nome para",
"show": "Mostrar",
"size": "Tamanho",
"schedule": "Agendar",
"scheduleMessage": "Escolha uma data para publicar este post.",
"newArchetype": "Criar um novo post baseado num \"archetype\". O seu arquivo será criado na pasta \"content\"."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Executar comandos",
"allowEdit": "Editar, renomear e deletar arquivos ou pastas",
"allowNew": "Criar novos arquivos e pastas",
"allowPublish": "Publicar novas páginas e conteúdos",
"avoidChanges": "(deixe em branco para manter)",
"changePassword": "Alterar senha",
"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": "Comandos atualizados!",
"customStylesheet": "Estilos personalizados",
"examples": "Exemplos",
"globalSettings": "Configurações globais",
"language": "Linguagem",
"lockPassword": "Não permitir que o usuário altere a senha",
"newPassword": "Nova senha",
"newPasswordConfirm": "Confirme a nova senha",
"newUser": "Novo usuário",
"password": "Senha",
"passwordUpdated": "Senha atualizada!",
"permissions": "Permissões",
"permissionsHelp": "Pode definir o usuário como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos usuários é um privilégio restringido aos administradores.\n",
"profileSettings": "Configurações do usuário",
"ruleExample1": "previne o acesso a qualquer \"dotfile\" (como .git, .gitignore) em qualquer pasta\n",
"ruleExample2": "bloqueia o acesso ao arquivo chamado Caddyfile.",
"rules": "Regras",
"rulesHelp": "Aqui pode definir um conjunto de regras para permitir ou bloquear o acesso do utilizador a determinados arquivos ou pastas. Os arquivos bloqueados não irão aparecer durante a navegação. Suportamos expressões regulares e os caminhos dos arquivos devem ser relativos à base do usuário.\n",
"scope": "Base",
"settingsUpdated": "Configurações atualizadas!",
"user": "Usuário",
"userCommands": "Comandos",
"userCommandsHelp": "Uma lista, separada com espaços, de comandos disponíveis para este usuário. Exemplo:",
"userCreated": "Usuário criado!",
"userDeleted": "Usuário eliminado!",
"userManagement": "Gestão de usuários",
"username": "Nome do usuário",
"users": "Usuários",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Usuário atualizado!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Ajuda",
"logout": "Sair",
"myFiles": "Arquivos",
"newFile": "Novo arquivo",
"newFolder": "Nova pasta",
"settings": "Configurações",
"siteSettings": "Configurações do site",
"hugoNew": "Hugo New",
"preview": "Pré-visualizar"
},
"search": {
"images": "Imagens",
"music": "Música",
"notSupportedCommand": "This is a not supported command.",
"pdf": "PDF",
"pressToExecute": "Pressione enter para executar.",
"pressToSearch": "Pressione enter para pesquisar.",
"search": "Pesquise...",
"searchOrCommand": "Pesquise ou execute um comando...",
"searchOrSupportedCommand": "Pesquise ou utilize um dos seus comandos:",
"typeCommand": "Type and press enter to execute.",
"typeSearch": "Type and press enter to search.",
"types": "Tipos",
"video": "Vídeos",
"writeToSearch": "Escreva aqui para pesquisar"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Unidades de Tempo",
"seconds": "Segundos",
"minutes": "Minutos",
"hours": "Horas",
"days": "Dias"
}
}

View File

@@ -1,209 +0,0 @@
permanent: Permanente
buttons:
cancel: Cancelar
close: Fechar
copy: Copiar
copyFile: Copiar arquivo
copyToClipboard: Copiar
create: Criar
delete: Deletar
download: Baixar
info: Informações
more: Mais
move: Mover
moveFile: Mover arquivo
new: Novo
next: Próximo
ok: Ok
previous: Anterior
publish: Publicar
rename: Renomear
replace: Substituir
reportIssue: Reportar erro
save: Salvar
share: Compartilhar
schedule: Agendar
search: Pesquisar
select: Selecionar
selectMultiple: Selecionar múltiplos
switchView: Alterar modo de visão
toggleSidebar: Alternar barra lateral
update: Atualizar
upload: Enviar
permalink: Obter link permanente
success:
linkCopied: Link copiado!
errors:
forbidden: Ops! Você não pode acessar aqui.
internal: Ops! Algum erro ocorreu.
notFound: Ops! Nada foi encontrado.
files:
body: Corpo
clear: Limpar
closePreview: Fechar pré-visualização
files: Arquivos
folders: Pastas
home: Início
lastModified: Última modificação
loading: Carregando. Aguarde, por favor.
lonely: Não existe nada aqui.
metadata: Metadados
multipleSelectionEnabled: Seleção múltipla ativada
name: Nome
size: Tamanho
sortByLastModified: Ordenar pela última modificação
sortByName: Ordenar pelo nome
sortBySize: Ordenar pelo tamanho
help:
click: selecionar pasta ou arquivo
ctrl:
click: selecionar várias pastas e arquivos
f: pesquisar
s: salvar um arquivo ou baixar a pasta que você está
del: deletar os arquivos selecionados
doubleClick: abrir pasta ou arquivo
esc: limpar seleção e/ou fechar menu
f1: está informação
f2: renomear arquivo
help: Ajuda
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
ru: Русский
pl: Polski
login:
password: Senha
submit: Login
username: Nome do usuário
wrongCredentials: Ops! Dados incorretos.
prompts:
copy: Copiar
copyMessage: 'Escolha um lugar para copiar os arquivos:'
currentlyNavigating: 'Navegando em:'
deleteMessageMultiple: Deseja deletar {count} arquivo(s)?
deleteMessageSingle: Deseja deletar está pasta/arquivo?
deleteTitle: Deletar arquivos
displayName: 'Nome:'
download: Baixar arquivos
downloadMessage: Escolha o formato do arquivo.
error: Algo de ruim ocorreu
fileInfo: Informação do arquivo
filesSelected: "{count} arquivos selecionados."
lastModified: Última modificação
move: Mover
moveMessage: 'Escolha uma nova pasta para os seus arquivos:'
newArchetype: Criar um novo post baseado num "archetype". O seu arquivo será criado
na pasta "content".
newDir: Nova pasta
newDirMessage: Escreva o nome da nova pasta.
newFile: Novo arquivo
newFileMessage: Escreva o nome do novo arquivo.
numberDirs: Número de pastas
numberFiles: Número de arquivos
rename: Renomear
renameMessage: Insira um novo nome para
replace: Substituir
replaceMessage: >
Já existe um arquivo com nome igual a um dos que está tentando
enviar. Deseja substituir?
schedule: Agendar
scheduleMessage: Escolha uma data para publicar este post.
show: Mostrar
size: Tamanho
search:
images: Imagens
music: Música
pdf: PDF
pressToExecute: Pressione enter para executar.
pressToSearch: Pressione enter para pesquisar.
search: Pesquise...
searchOrCommand: Pesquise ou execute um comando...
searchOrSupportedCommand: 'Pesquise ou utilize um dos seus comandos:'
type: Escreva e pressione enter para pesquisar.
types: Tipos
video: Vídeos
writeToSearch: Escreva aqui para pesquisar
settings:
admin: Admin
administrator: Administrador
allowCommands: Executar comandos
allowEdit: Editar, renomear e deletar arquivos ou pastas
allowNew: Criar novos arquivos e pastas
allowPublish: Publicar novas páginas e conteúdos
avoidChanges: "(deixe em branco para manter)"
changePassword: Alterar senha
commands: Comandos
commandsHelp: >
Pode definir um conjunto de comandos a executar em determiandos eventos.
Deve escrever um comando por linha. Se o evento estiver relacionado com arquivos,
como antes e depois de salvar, irá existir uma variável de ambiente denominada
"FILE" com o caminho do arquivo.
commandsUpdated: Comandos atualizados!
customStylesheet: Estilos personalizados
examples: Exemplos
globalSettings: Configurações globais
language: Linguagem
lockPassword: Não permitir que o usuário altere a senha
newPassword: Nova senha
newPasswordConfirm: Confirme a nova senha
newUser: Novo usuário
password: Senha
passwordUpdated: Senha atualizada!
permissions: Permissões
permissionsHelp: >
Pode definir o usuário como administrador ou escolher as permissões
manualmente. Se selecionar a opção "Administrador", todas as outras opções serão
automaticamente selecionadas. A gestão dos usuários é um privilégio restringido
aos administradores.
profileSettings: Configurações do usuário
ruleExample1: >
previne o acesso a qualquer "dotfile" (como .git, .gitignore) em
qualquer pasta
ruleExample2: bloqueia o acesso ao arquivo chamado Caddyfile.
rules: Regras
rulesHelp1: >
Aqui pode definir um conjunto de regras para permitir ou bloquear o
acesso do utilizador a determinados arquivos ou pastas. Os arquivos bloqueados
não irão aparecer durante a navegação. Suportamos expressões regulares e os caminhos
dos arquivos devem ser relativos à base do usuário.
rulesHelp2: >
Cada regra deve ser colocada numa linha diferente e deve começar com
as palavras {0} (permite) ou {1} (bloqueia). Deve escrever, logo de seguida, {2},
caso queira utilizar uma expressão regular. Depois, escreva o caminho do arquivo/pasta
ou a expressão regular.
scope: Base
settingsUpdated: Configurações atualizadas!
user: Usuário
userCommands: Comandos
userCommandsHelp: 'Uma lista, separada com espaços, de comandos disponíveis para
este usuário. Exemplo:'
userCreated: Usuário criado!
userDeleted: Usuário eliminado!
userManagement: Gestão de usuários
username: Nome do usuário
users: Usuários
userUpdated: Usuário atualizado!
sidebar:
help: Ajuda
hugoNew: Hugo New
logout: Sair
myFiles: Arquivos
newFile: Novo arquivo
newFolder: Nova pasta
preview: Pré-visualizar
settings: Configurações
siteSettings: Configurações do site
time:
unit: Unidades de Tempo
seconds: Segundos
minutes: Minutos
hours: Horas
days: Dias

233
src/i18n/pt.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "Permanente",
"buttons": {
"cancel": "Cancelar",
"close": "Fechar",
"copy": "Copiar",
"copyFile": "Copiar ficheiro",
"copyToClipboard": "Copiar",
"create": "Criar",
"delete": "Eliminar",
"download": "Descarregar",
"info": "Info",
"more": "Mais",
"move": "Mover",
"moveFile": "Mover ficheiro",
"new": "Novo",
"next": "Próximo",
"ok": "OK",
"replace": "Substituir",
"previous": "Anterior",
"rename": "Renomear",
"reportIssue": "Reportar Erro",
"save": "Guardar",
"search": "Pesquisar",
"select": "Selecionar",
"share": "Partilhar",
"publish": "Publicar",
"selectMultiple": "Selecionar múltiplos",
"schedule": "Agendar",
"switchView": "Alterar modo de visão",
"toggleSidebar": "Alternar barra lateral",
"update": "Atualizar",
"upload": "Enviar",
"permalink": "Obter link permanente"
},
"success": {
"linkCopied": "Link copiado!"
},
"errors": {
"forbidden": "Tu não és bem-vindo aqui.",
"internal": "Algo correu bastante mal.",
"notFound": "Não conseguimos chegar a esta localização."
},
"files": {
"folders": "Pastas",
"files": "Ficheiros",
"body": "Corpo",
"clear": "Limpar",
"closePreview": "Fechar pré-visualização",
"home": "Início",
"lastModified": "Última modificação",
"loading": "A carregar...",
"lonely": "Sinto-me sozinho...",
"metadata": "Metadados",
"multipleSelectionEnabled": "Seleção múltipla ativada",
"name": "Nome",
"size": "Tamanho",
"sortByName": "Ordenar pelo nome",
"sortBySize": "Ordenar pelo tamanho",
"sortByLastModified": "Ordenar pela última modificação"
},
"help": {
"click": "selecionar pasta ou ficheiro",
"ctrl": {
"click": "selecionar várias pastas e ficheiros",
"f": "pesquisar",
"s": "guardar um ficheiro ou descarregar a pasta em que estás a navegar"
},
"del": "eliminar os ficheiros selecionados",
"doubleClick": "abrir pasta ou ficheiro",
"esc": "limpar seleção e/ou fechar menu",
"f1": "esta informação",
"f2": "renomear ficheiro",
"help": "Ajuda"
},
"login": {
"password": "Palavra-passe",
"passwordConfirm": "Password Confirmation",
"submit": "Login",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Nome de utilizador",
"wrongCredentials": "Dados errados"
},
"prompts": {
"copy": "Copiar",
"copyMessage": "Escolhe um lugar para copiar os ficheiros:",
"currentlyNavigating": "A navegar em:",
"deleteMessageMultiple": "Deseja eliminar {count} ficheiro(s)?",
"deleteMessageSingle": "Deseja eliminar esta pasta/ficheiro?",
"deleteTitle": "Eliminar ficheiros",
"displayName": "Nome:",
"download": "Descarregar ficheiros",
"downloadMessage": "Escolha o formato do ficheiro.",
"error": "Algo correu mal",
"fileInfo": "Informação do ficheiro",
"filesSelected": "{count} ficheiros selecionados.",
"lastModified": "Última Modificação",
"move": "Mover",
"moveMessage": "Escolha uma nova casa para os seus ficheiros:",
"newDir": "Nova pasta",
"newDirMessage": "Escreva o nome da nova pasta.",
"newFile": "Novo ficheiro",
"newFileMessage": "Escreva o nome do novo ficheiro.",
"numberDirs": "Número de pastas",
"numberFiles": "Número de ficheiros",
"replace": "Substituir",
"replaceMessage": "Já existe um ficheiro com nome igual a um dos que está a tentar enviar. Deseja substituir?\n",
"rename": "Renomear",
"renameMessage": "Insira um novo nome para",
"show": "Mostrar",
"size": "Tamanho",
"schedule": "Agendar",
"scheduleMessage": "Escolha uma data para publicar este post.",
"newArchetype": "Criar um novo post baseado num \"archetype\". O seu ficheiro será criado na pasta \"content\"."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Admin",
"administrator": "Administrador",
"allowCommands": "Executar comandos",
"allowEdit": "Editar, renomear e eliminar ficheiros ou pastas",
"allowNew": "Criar novos ficheiros e pastas",
"allowPublish": "Publicar novas páginas e conteúdos",
"avoidChanges": "(deixe em branco para manter)",
"changePassword": "Alterar Password",
"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": "Comandos atualizados!",
"customStylesheet": "Estilos Personalizados",
"examples": "Exemplos",
"globalSettings": "Configurações Globais",
"language": "Linguagem",
"lockPassword": "Não permitir que o utilizador altere a palavra-passe",
"newPassword": "Nova palavra-passe",
"newPasswordConfirm": "Confirme a nova palavra-passe",
"newUser": "Novo Utilizador",
"password": "Palavra-passe",
"passwordUpdated": "Palavra-passe atualizada!",
"permissions": "Permissões",
"permissionsHelp": "Pode definir o utilizador como administrador ou escolher as permissões manualmente. Se selecionar a opção \"Administrador\", todas as outras opções serão automaticamente selecionadas. A gestão dos utilizadores é um privilégio restringido aos administradores.\n",
"profileSettings": "Configurações do Utilizador",
"ruleExample1": "previne o acesso a qualquer \"dotfile\" (como .git, .gitignore) em qualquer pasta\n",
"ruleExample2": "bloqueia o acesso ao ficheiro chamado Caddyfile.",
"rules": "Regras",
"rulesHelp": "Aqui pode definir um conjunto de regras para permitir ou bloquear o acesso do utilizador a determinados ficheiros ou pastas. Os ficheiros bloqueados não irão aparecer durante a navegação. Suportamos expressões regulares e os caminhos dos ficheiros devem ser relativos à base do utilizador.\n",
"scope": "Base",
"settingsUpdated": "Configurações atualizadas!",
"user": "Utilizador",
"userCommands": "Comandos",
"userCommandsHelp": "Uma lista, separada com espaços, de comandos disponíveis para este utilizados. Exemplo:",
"userCreated": "Utilizador criado!",
"userDeleted": "Utilizador eliminado!",
"userManagement": "Gestão de Utilizadores",
"username": "Nome de utilizador",
"users": "Utilizadores",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Utilizador atualizado!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Ajuda",
"logout": "Sair",
"myFiles": "Ficheiros",
"newFile": "Novo ficheiro",
"newFolder": "Nova pasta",
"settings": "Configurações",
"siteSettings": "Configurações do Site",
"hugoNew": "Hugo New",
"preview": "Pré-visualizar"
},
"search": {
"images": "Imagens",
"music": "Música",
"notSupportedCommand": "This is a not supported command.",
"pdf": "PDF",
"pressToExecute": "Prima enter para executar.",
"pressToSearch": "Prima enter para pesquisar.",
"search": "Pesquise...",
"searchOrCommand": "Pesquise ou execute um comando...",
"searchOrSupportedCommand": "Pesquise ou utilize um dos seus comandos:",
"typeCommand": "Type and press enter to execute.",
"typeSearch": "Type and press enter to search.",
"types": "Tipos",
"video": "Vídeos",
"writeToSearch": "Escreva aqui para pesquisar"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Unidades de Tempo",
"seconds": "Segundos",
"minutes": "Minutos",
"hours": "Horas",
"days": "Dias"
}
}

View File

@@ -1,209 +0,0 @@
permanent: Permanente
buttons:
cancel: Cancelar
close: Fechar
copy: Copiar
copyFile: Copiar ficheiro
copyToClipboard: Copiar
create: Criar
delete: Eliminar
download: Descarregar
info: Info
more: Mais
move: Mover
moveFile: Mover ficheiro
new: Novo
next: Próximo
ok: OK
previous: Anterior
publish: Publicar
rename: Renomear
replace: Substituir
reportIssue: Reportar Erro
save: Guardar
share: Partilhar
schedule: Agendar
search: Pesquisar
select: Selecionar
selectMultiple: Selecionar múltiplos
switchView: Alterar modo de visão
toggleSidebar: Alternar barra lateral
update: Atualizar
upload: Enviar
permalink: Obter link permanente
success:
linkCopied: Link copiado!
errors:
forbidden: Tu não és bem-vindo aqui.
internal: Algo correu bastante mal.
notFound: Não conseguimos chegar a esta localização.
files:
body: Corpo
clear: Limpar
closePreview: Fechar pré-visualização
files: Ficheiros
folders: Pastas
home: Início
lastModified: Última modificação
loading: A carregar...
lonely: Sinto-me sozinho...
metadata: Metadados
multipleSelectionEnabled: Seleção múltipla ativada
name: Nome
size: Tamanho
sortByLastModified: Ordenar pela última modificação
sortByName: Ordenar pelo nome
sortBySize: Ordenar pelo tamanho
help:
click: selecionar pasta ou ficheiro
ctrl:
click: selecionar várias pastas e ficheiros
f: pesquisar
s: guardar um ficheiro ou descarregar a pasta em que estás a navegar
del: eliminar os ficheiros selecionados
doubleClick: abrir pasta ou ficheiro
esc: limpar seleção e/ou fechar menu
f1: esta informação
f2: renomear ficheiro
help: Ajuda
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
ru: Русский
pl: Polski
login:
password: Palavra-passe
submit: Login
username: Nome de utilizador
wrongCredentials: Dados errados
prompts:
copy: Copiar
copyMessage: 'Escolhe um lugar para copiar os ficheiros:'
currentlyNavigating: 'A navegar em:'
deleteMessageMultiple: Deseja eliminar {count} ficheiro(s)?
deleteMessageSingle: Deseja eliminar esta pasta/ficheiro?
deleteTitle: Eliminar ficheiros
displayName: 'Nome:'
download: Descarregar ficheiros
downloadMessage: Escolha o formato do ficheiro.
error: Algo correu mal
fileInfo: Informação do ficheiro
filesSelected: "{count} ficheiros selecionados."
lastModified: Última Modificação
move: Mover
moveMessage: 'Escolha uma nova casa para os seus ficheiros:'
newArchetype: Criar um novo post baseado num "archetype". O seu ficheiro será criado
na pasta "content".
newDir: Nova pasta
newDirMessage: Escreva o nome da nova pasta.
newFile: Novo ficheiro
newFileMessage: Escreva o nome do novo ficheiro.
numberDirs: Número de pastas
numberFiles: Número de ficheiros
rename: Renomear
renameMessage: Insira um novo nome para
replace: Substituir
replaceMessage: >
Já existe um ficheiro com nome igual a um dos que está a tentar
enviar. Deseja substituir?
schedule: Agendar
scheduleMessage: Escolha uma data para publicar este post.
show: Mostrar
size: Tamanho
search:
images: Imagens
music: Música
pdf: PDF
pressToExecute: Prima enter para executar.
pressToSearch: Prima enter para pesquisar.
search: Pesquise...
searchOrCommand: Pesquise ou execute um comando...
searchOrSupportedCommand: 'Pesquise ou utilize um dos seus comandos:'
type: Escreva e prima enter para pesquisar.
types: Tipos
video: Vídeos
writeToSearch: Escreva aqui para pesquisar
settings:
admin: Admin
administrator: Administrador
allowCommands: Executar comandos
allowEdit: Editar, renomear e eliminar ficheiros ou pastas
allowNew: Criar novos ficheiros e pastas
allowPublish: Publicar novas páginas e conteúdos
avoidChanges: "(deixe em branco para manter)"
changePassword: Alterar Password
commands: Comandos
commandsHelp: >
Pode definir um conjunto de comandos a executar em determiandos eventos.
Deve escrever um comando por linha. Se o evento estiver relacionado com ficheiros,
como antes e depois de guardar, irá existir uma variável de ambiente denominada
"FILE" com o caminho do ficheiro.
commandsUpdated: Comandos atualizados!
customStylesheet: Estilos Personalizados
examples: Exemplos
globalSettings: Configurações Globais
language: Linguagem
lockPassword: Não permitir que o utilizador altere a palavra-passe
newPassword: Nova palavra-passe
newPasswordConfirm: Confirme a nova palavra-passe
newUser: Novo Utilizador
password: Palavra-passe
passwordUpdated: Palavra-passe atualizada!
permissions: Permissões
permissionsHelp: >
Pode definir o utilizador como administrador ou escolher as permissões
manualmente. Se selecionar a opção "Administrador", todas as outras opções serão
automaticamente selecionadas. A gestão dos utilizadores é um privilégio restringido
aos administradores.
profileSettings: Configurações do Utilizador
ruleExample1: >
previne o acesso a qualquer "dotfile" (como .git, .gitignore) em
qualquer pasta
ruleExample2: bloqueia o acesso ao ficheiro chamado Caddyfile.
rules: Regras
rulesHelp1: >
Aqui pode definir um conjunto de regras para permitir ou bloquear o
acesso do utilizador a determinados ficheiros ou pastas. Os ficheiros bloqueados
não irão aparecer durante a navegação. Suportamos expressões regulares e os caminhos
dos ficheiros devem ser relativos à base do utilizador.
rulesHelp2: >
Cada regra deve ser colocada numa linha diferente e deve começar com
as palavras {0} (permite) ou {1} (bloqueia). Deve escrever, logo de seguida, {2},
caso queira utilizar uma expressão regular. Depois, escreva o caminho do ficheiro/pasta
ou a expressão regular.
scope: Base
settingsUpdated: Configurações atualizadas!
user: Utilizador
userCommands: Comandos
userCommandsHelp: 'Uma lista, separada com espaços, de comandos disponíveis para
este utilizados. Exemplo:'
userCreated: Utilizador criado!
userDeleted: Utilizador eliminado!
userManagement: Gestão de Utilizadores
username: Nome de utilizador
users: Utilizadores
userUpdated: Utilizador atualizado!
sidebar:
help: Ajuda
hugoNew: Hugo New
logout: Sair
myFiles: Ficheiros
newFile: Novo ficheiro
newFolder: Nova pasta
preview: Pré-visualizar
settings: Configurações
siteSettings: Configurações do Site
time:
unit: Unidades de Tempo
seconds: Segundos
minutes: Minutos
hours: Horas
days: Dias

233
src/i18n/ru.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "Постоянный",
"buttons": {
"cancel": "Отмена",
"close": "Закрыть",
"copy": "Копировать",
"copyFile": "Скопировать файл",
"copyToClipboard": "Скопировать в буфер",
"create": "Создать",
"delete": "Удалить",
"download": "Скачать",
"info": "Инфо",
"more": "Еще",
"move": "Переместить",
"moveFile": "Переместить файл",
"new": "Новый",
"next": "Вперед",
"ok": "OK",
"replace": "Перезаписать",
"previous": "Назад",
"rename": "Переименовать",
"reportIssue": "Сообщить о проблеме",
"save": "Сохранить",
"search": "Поиск",
"select": "Выбрать",
"share": "Поделиться",
"publish": "Опубликовать",
"selectMultiple": "Мультивыбор",
"schedule": "Планировка",
"switchView": "Вид",
"toggleSidebar": "Боковая панель",
"update": "Обновить",
"upload": "Загрузить",
"permalink": "Получить постоянную ссылку"
},
"success": {
"linkCopied": "Ссылка скопирована!"
},
"errors": {
"forbidden": "Доступ запрещен.",
"internal": "Что-то пошло не так.",
"notFound": "Неправильная ссылка."
},
"files": {
"folders": "Каталоги",
"files": "Файлы",
"body": "Тело",
"clear": "Очистить",
"closePreview": "Закрыть",
"home": "Дом",
"lastModified": "Последнее изменение",
"loading": "Загрузка...",
"lonely": "Здесь пусто...",
"metadata": "Метаданные",
"multipleSelectionEnabled": "Мультивыбор включен",
"name": "Имя",
"size": "Размер",
"sortByName": "Сортировка по имени",
"sortBySize": "Сортировка по размеру",
"sortByLastModified": "Сортировка по изменению"
},
"help": {
"click": "выбрать файл или каталог",
"ctrl": {
"click": "выбрать несколько файлов или каталогов",
"f": "открыть поиск",
"s": "скачать файл или текущий каталог"
},
"del": "удалить выбранные элементы",
"doubleClick": "открыть файл или каталог",
"esc": "очистить выделение и/или закрыть окно",
"f1": "помощь",
"f2": "переименовать файл",
"help": "Помощь"
},
"login": {
"password": "Пароль",
"passwordConfirm": "Password Confirmation",
"submit": "Войти",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "Имя пользователя",
"wrongCredentials": "Неверные данные"
},
"prompts": {
"copy": "Копировать",
"copyMessage": "Копировать в:",
"currentlyNavigating": "Текущий каталог:",
"deleteMessageMultiple": "Удалить эти файлы ({count})?",
"deleteMessageSingle": "Удалить этот файл/каталог?",
"deleteTitle": "Удалить файлы",
"displayName": "Отображаемое имя:",
"download": "Скачать файлы",
"downloadMessage": "Скачать каталог в следующем формате.",
"error": "Ошибка",
"fileInfo": "Информация о файле",
"filesSelected": "Файлов выбрано: {count}.",
"lastModified": "Последнее изменение",
"move": "Переместить",
"moveMessage": "Переместить в:",
"newDir": "Новый каталог",
"newDirMessage": "Имя нового каталога.",
"newFile": "Новый файл",
"newFileMessage": "Имя нового файла.",
"numberDirs": "Количество каталогов",
"numberFiles": "Количество файлов",
"replace": "Заменить",
"replaceMessage": "Имя одного из загружаемых файлов совпадает с уже существующим файлом. Вы хотите заменить существующий?\n",
"rename": "Переименовать",
"renameMessage": "Новое имя",
"show": "Показать",
"size": "Размер",
"schedule": "Планировка",
"scheduleMessage": "Запланировать дату и время публикации.",
"newArchetype": "Создайте новую запись на основе архетипа. Файл будет создан в каталоге."
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "Админ",
"administrator": "Администратор",
"allowCommands": "Запуск команд",
"allowEdit": "Редактирование, переименование и удаление файлов или каталогов",
"allowNew": "Создание новых файлов или каталогов",
"allowPublish": "Публикация новых записей и страниц",
"avoidChanges": "(пусто для пропуска)",
"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": "Команды обновлены!",
"customStylesheet": "Свой стиль",
"examples": "Примеры",
"globalSettings": "Глобальные настройки",
"language": "Язык",
"lockPassword": "Запретить пользователю менять пароль",
"newPassword": "Новый пароль",
"newPasswordConfirm": "Повтор нового пароля",
"newUser": "Новый пользователь",
"password": "Пароль",
"passwordUpdated": "Пароль обновлен!",
"permissions": "Права доступа",
"permissionsHelp": "Можно настроить пользователя как администратора или выбрать разрешения индивидуально. При выборе \"Администратор\", все остальные параметры будут автоматически выбраны. Управление пользователями - привилегия администратора.\n",
"profileSettings": "Настройки профиля",
"ruleExample1": "предотвратить доступ к любому скрытому файлу (например: .git, .gitignore) в каждой папке.\n",
"ruleExample2": "блокирует доступ к файлу с именем Caddyfile в корневой области.",
"rules": "Права",
"rulesHelp": "Здесь вы можете определить набор разрешающих и запрещающих правил для этого конкретного пользователь. Блокированные файлы не будут отображаться в списках, и не будут доступны для пользователя. Есть поддержка регулярных выражений и относительных путей.\n",
"scope": "Корень",
"settingsUpdated": "Настройки применены!",
"user": "Пользователь",
"userCommands": "Команды",
"userCommandsHelp": "Список команд доступных пользователю, разделенный пробелами. Пример:\n",
"userCreated": "Пользователь создан!",
"userDeleted": "Пользователь удален!",
"userManagement": "Управление пользователями",
"username": "Имя пользователя",
"users": "Пользователи",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "Пользователь изменен!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "Помощь",
"logout": "Выход",
"myFiles": "Файлы",
"newFile": "Новый файл",
"newFolder": "Новый каталог",
"settings": "Настройки",
"siteSettings": "Настройки сайта",
"hugoNew": "Hugo New",
"preview": "Предпросмотр"
},
"search": {
"images": "Изображения",
"music": "Музыка",
"notSupportedCommand": "Команда не поддерживается.",
"pdf": "PDF",
"pressToExecute": "Enter для запуска.",
"pressToSearch": "Enter для поиска.",
"search": "Поиск...",
"searchOrCommand": "Поиск или выполнение команды...",
"searchOrSupportedCommand": "Поиск или выполнение команды, начинающейся с '$':",
"typeCommand": "Введи текст и нажми Enter для запуска.",
"typeSearch": "Введи текст и нажми Enter для поиска.",
"types": "Типы",
"video": "Видео",
"writeToSearch": "Введи текст для поиска"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "Единица времени",
"seconds": "Секунды",
"minutes": "Минуты",
"hours": "Часы",
"days": "Дни"
}
}

View File

@@ -1,208 +0,0 @@
permanent: Постоянный
buttons:
cancel: Отмена
close: Закрыть
copy: Копировать
copyFile: Скопировать файл
copyToClipboard: Скопировать в буфер
create: Создать
delete: Удалить
download: Скачать
info: Инфо
more: Еще
move: Переместить
moveFile: Переместить файл
new: Новый
next: Вперед
ok: OK
replace: Перезаписать
previous: Назад
rename: Переименовать
reportIssue: Сообщить о проблеме
save: Сохранить
search: Поиск
select: Выбрать
share: Поделиться
publish: Опубликовать
selectMultiple: Мультивыбор
schedule: Планировка
switchView: Вид
toggleSidebar: Боковая панель
update: Обновить
upload: Загрузить
permalink: Получить постоянную ссылку
success:
linkCopied: Ссылка скопирована!
errors:
forbidden: Доступ запрещен.
internal: Что-то пошло не так.
notFound: Неправильная ссылка.
files:
folders: Каталоги
files: Файлы
body: Тело
clear: Очистить
closePreview: Закрыть
home: Дом
lastModified: Последнее изменение
loading: Загрузка...
lonely: Здесь пусто...
metadata: Метаданные
multipleSelectionEnabled: Мультивыбор включен
name: Имя
size: Размер
sortByName: Сортировка по имени
sortBySize: Сортировка по размеру
sortByLastModified: Сортировка по изменению
help:
click: выбрать файл или каталог
ctrl:
click: выбрать несколько файлов или каталогов
f: открыть поиск
s: скачать файл или текущий каталог
del: удалить выбранные элементы
doubleClick: открыть файл или каталог
esc: очистить выделение и/или закрыть окно
f1: помощь
f2: переименовать файл
help: Помощь
login:
password: Пароль
submit: Войти
username: Имя пользователя
wrongCredentials: Неверные данные
prompts:
copy: Копировать
copyMessage: 'Копировать в:'
currentlyNavigating: 'Текущий каталог:'
deleteMessageMultiple: Удалить эти файлы ({count})?
deleteMessageSingle: Удалить этот файл/каталог?
deleteTitle: Удалить файлы
displayName: 'Отображаемое имя:'
download: Скачать файлы
downloadMessage: Скачать каталог в следующем формате.
error: Ошибка
fileInfo: Информация о файле
filesSelected: "Файлов выбрано: {count}."
lastModified: Последнее изменение
move: Переместить
moveMessage: 'Переместить в:'
newDir: Новый каталог
newDirMessage: Имя нового каталога.
newFile: Новый файл
newFileMessage: Имя нового файла.
numberDirs: Количество каталогов
numberFiles: Количество файлов
replace: Заменить
replaceMessage: >
Имя одного из загружаемых файлов совпадает с уже существующим файлом.
Вы хотите заменить существующий?
rename: Переименовать
renameMessage: Новое имя
show: Показать
size: Размер
schedule: Планировка
scheduleMessage: Запланировать дату и время публикации.
newArchetype: Создайте новую запись на основе архетипа. Файл будет создан в каталоге.
settings:
admin: Админ
administrator: Администратор
allowCommands: Запуск команд
allowEdit: Редактирование, переименование и удаление файлов или каталогов
allowNew: Создание новых файлов или каталогов
allowPublish: Публикация новых записей и страниц
avoidChanges: "(пусто для пропуска)"
changePassword: Изменение пароля
commands: Команды
commandsHelp: >
Здесь устанавливаются команды, выполняемые в названных событиях.
Одна команда на строку. Если событие связано с файлами, например, после сохранения,
переменной среды "FILE" будет присвоен путь файла.
commandsUpdated: Команды обновлены!
customStylesheet: Свой стиль
examples: Примеры
globalSettings: Глобальные настройки
language: Язык
lockPassword: Запретить пользователю менять пароль
newPassword: Новый пароль
newPasswordConfirm: Повтор нового пароля
newUser: Новый пользователь
password: Пароль
passwordUpdated: Пароль обновлен!
permissions: Права доступа
permissionsHelp: >
Можно настроить пользователя как администратора или выбрать разрешения
индивидуально. При выборе "Администратор", все остальные параметры будут
автоматически выбраны. Управление пользователями - привилегия администратора.
profileSettings: Настройки профиля
ruleExample1: >
предотвратить доступ к любому скрытому файлу (например: .git, .gitignore) в
каждой папке.
ruleExample2: блокирует доступ к файлу с именем Caddyfile в корневой области.
rules: Права
rulesHelp1: >
Здесь вы можете определить набор разрешающих и запрещающих правил для этого конкретного
пользователь. Блокированные файлы не будут отображаться в списках, и не будут доступны
для пользователя. Есть поддержка регулярных выражений и относительных путей.
rulesHelp2: >
Каждое правило начинается с новой строки и должно начинаться с ключевого слова
{0} или {1}. Затем {2}, если используются регулярное выражение,
дальше выражение или путь.
scope: Корень
settingsUpdated: Настройки применены!
user: Пользователь
userCommands: Команды
userCommandsHelp: >
Список команд доступных пользователю, разделенный пробелами.
Пример:
userCreated: Пользователь создан!
userDeleted: Пользователь удален!
userManagement: Управление пользователями
username: Имя пользователя
users: Пользователи
userUpdated: Пользователь изменен!
sidebar:
help: Помощь
logout: Выход
myFiles: Файлы
newFile: Новый файл
newFolder: Новый каталог
settings: Настройки
siteSettings: Настройки сайта
hugoNew: Hugo New
preview: Предпросмотр
search:
images: Изображения
music: Музыка
notSupportedCommand: Команда не поддерживается.
pdf: PDF
pressToExecute: Enter для запуска.
pressToSearch: Enter для поиска.
search: Поиск...
searchOrCommand: Поиск или выполнение команды...
searchOrSupportedCommand: 'Поиск или выполнение команды, начинающейся с ''$'':'
typeCommand: Введи текст и нажми Enter для запуска.
typeSearch: Введи текст и нажми Enter для поиска.
types: Типы
video: Видео
writeToSearch: Введи текст для поиска
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: Единица времени
seconds: Секунды
minutes: Минуты
hours: Часы
days: Дни

233
src/i18n/zh-cn.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "永久",
"buttons": {
"cancel": "取消",
"close": "关闭",
"copy": "复制",
"copyFile": "复制文件",
"copyToClipboard": "复制到剪贴板",
"create": "创建",
"delete": "删除",
"download": "下载",
"info": "信息",
"more": "更多",
"move": "移动",
"moveFile": "移动文件",
"new": "新",
"next": "下一个",
"ok": "确定",
"replace": "替换",
"previous": "上一个",
"rename": "重命名",
"reportIssue": "报告问题",
"save": "保存",
"search": "搜索",
"select": "选择",
"share": "分享",
"publish": "发布",
"selectMultiple": "选择多个",
"schedule": "计划",
"switchView": "切换显示方式",
"toggleSidebar": "切换侧边栏",
"update": "更新",
"upload": "上传",
"permalink": "获取永久链接"
},
"success": {
"linkCopied": "链接已复制!"
},
"errors": {
"forbidden": "你被禁止访问。",
"internal": "服务器出了点问题。",
"notFound": "找不到文件。"
},
"files": {
"folders": "文件夹",
"files": "文件",
"body": "Body",
"clear": "清空",
"closePreview": "关闭预览",
"home": "主页",
"lastModified": "最后修改",
"loading": "加载中...",
"lonely": "这里没有任何文件...",
"metadata": "元数据",
"multipleSelectionEnabled": "多选模式已开启",
"name": "名称",
"size": "大小",
"sortByName": "按名称排序",
"sortBySize": "按大小排序",
"sortByLastModified": "按最后修改时间排序"
},
"help": {
"click": "选择文件或目录",
"ctrl": {
"click": "选择多个文件或目录",
"f": "打开搜索框",
"s": "保存文件或下载当前文件夹"
},
"del": "删除所选的文件/文件夹",
"doubleClick": "打开文件/文件夹",
"esc": "清除已选项或关闭提示信息",
"f1": "显示该帮助信息",
"f2": "重命名文件/文件夹",
"help": "帮助"
},
"login": {
"password": "密码",
"passwordConfirm": "Password Confirmation",
"submit": "登录",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "用户名",
"wrongCredentials": "用户名或密码错误"
},
"prompts": {
"copy": "复制",
"copyMessage": "请选择欲复制至的目录:",
"currentlyNavigating": "当前目录:",
"deleteMessageMultiple": "你确定要删除这 {count} 个文件吗?",
"deleteMessageSingle": "你确定要删除这个文件/文件夹吗?",
"deleteTitle": "删除文件",
"displayName": "名称:",
"download": "下载文件",
"downloadMessage": "请选择要下载的压缩格式。",
"error": "出了一点问题...",
"fileInfo": "文件信息",
"filesSelected": "已选择 {count} 个文件。",
"lastModified": "最后修改",
"move": "移动",
"moveMessage": "请选择欲移动至的目录:",
"newDir": "新建目录",
"newDirMessage": "请输入新目录的名称。",
"newFile": "新建文件",
"newFileMessage": "请输入新文件的名称。",
"numberDirs": "目录数",
"numberFiles": "文件数",
"replace": "替换",
"replaceMessage": "您尝试上传的文件中有一个与现有文件的名称存在冲突。是否替换现有的同名文件?",
"rename": "重命名",
"renameMessage": "请输入新名称,旧名称为:",
"show": "揭示",
"size": "大小",
"schedule": "计划",
"scheduleMessage": "请选择发布这篇帖子的日期。",
"newArchetype": "创建一个基于原型的新帖子。您的文件将会创建在内容文件夹中。"
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "管理员",
"administrator": "管理员",
"allowCommands": "执行命令(Linux 代码)",
"allowEdit": "编辑、重命名或删除文件/目录",
"allowNew": "创建新文件和目录",
"allowPublish": "发布新的帖子与页面",
"avoidChanges": "(留空以避免更改)",
"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": "命令已更新!",
"customStylesheet": "自定义样式表",
"examples": "例子",
"globalSettings": "全局设置",
"language": "语言",
"lockPassword": "禁止用户修改密码",
"newPassword": "您的新密码",
"newPasswordConfirm": "重输一遍新密码",
"newUser": "新建用户",
"password": "密码",
"passwordUpdated": "密码已更新!",
"permissions": "权限",
"permissionsHelp": "您可以将该用户设置为管理员,也可以单独选择各项权限。如果选择了“管理员”,则其他的选项会被自动勾上,同时该用户可以管理其他用户。",
"profileSettings": "个人设置",
"ruleExample1": "阻止用户访问所有文件夹下任何以 . 开头的文件(隐藏文件, 例如: .git, .gitignore)。",
"ruleExample2": "阻止用户访问其目录范围的根目录下名为 Caddyfile 的文件。",
"rules": "规则",
"rulesHelp": "您可以为该用户制定一组黑名单或白名单式的规则,被屏蔽的文件将不会显示在列表中,用户也无权限访问,支持相对于目录范围的路径。",
"scope": "目录范围",
"settingsUpdated": "设置已更新!",
"user": "用户",
"userCommands": "用户命令(Linux 代码)",
"userCommandsHelp": "指定该用户可以执行的命令(Linux 代码),用空格分隔。例如:",
"userCreated": "用户已创建!",
"userDeleted": "用户已删除!",
"userManagement": "用户管理",
"username": "用户名",
"users": "用户",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "用户已更新!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "帮助",
"logout": "登出",
"myFiles": "我的文件",
"newFile": "新建文件",
"newFolder": "新建文件夹",
"settings": "设置",
"siteSettings": "网站设置",
"hugoNew": "Hugo New",
"preview": "预览"
},
"search": {
"images": "图像",
"music": "音乐",
"notSupportedCommand": "This is a not supported command.",
"pdf": "PDF",
"pressToExecute": "按回车键执行。",
"pressToSearch": "按回车键搜索。",
"search": "搜索...",
"searchOrCommand": "搜索或者执行命令(Linux 代码)...",
"searchOrSupportedCommand": "搜索或加入\"$\"前缀以使用其中一个您可以使用的命令:",
"typeCommand": "Type and press enter to execute.",
"typeSearch": "Type and press enter to search.",
"types": "类型",
"video": "视频",
"writeToSearch": "请输入要搜索的内容"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "时间单位",
"seconds": "秒",
"minutes": "分钟",
"hours": "小时",
"days": "天"
}
}

View File

@@ -1,206 +0,0 @@
permanent: 永久
buttons:
cancel: 取消
close: 关闭
copy: 复制
copyFile: 复制文件
copyToClipboard: 复制到剪贴板
create: 创建
delete: 删除
download: 下载
info: 信息
more: 更多
move: 移动
moveFile: 移动文件
new:
next: 下一个
ok: 确定
replace: 替换
previous: 上一个
rename: 重命名
reportIssue: 报告问题
save: 保存
search: 搜索
select: 选择
share: 分享
publish: 发布
selectMultiple: 选择多个
schedule: 计划
switchView: 切换显示方式
toggleSidebar: 切换侧边栏
update: 更新
upload: 上传
permalink: 获取永久链接
success:
linkCopied: 链接已复制!
errors:
forbidden: 你被禁止访问。
internal: 服务器出了点问题。
notFound: 找不到文件。
files:
folders: 文件夹
files: 文件
body: Body
clear: 清空
closePreview: 关闭预览
home: 主页
lastModified: 最后修改
loading: 加载中...
lonely: 这里没有任何文件...
metadata: 元数据
multipleSelectionEnabled: 多选模式已开启
name: 名称
size: 大小
sortByName: 按名称排序
sortBySize: 按大小排序
sortByLastModified: 按最后修改时间排序
help:
click: 选择文件或目录
ctrl:
click: 选择多个文件或目录
f: 打开搜索框
s: 保存文件或下载当前文件夹
del: 删除所选的文件/文件夹
doubleClick: 打开文件/文件夹
esc: 清除已选项或关闭提示信息
f1: 显示该帮助信息
f2: 重命名文件/文件夹
help: 帮助
login:
password: 密码
submit: 登录
username: 用户名
wrongCredentials: 用户名或密码错误
prompts:
copy: 复制
copyMessage: 请选择欲复制至的目录:
currentlyNavigating: 当前目录:
deleteMessageMultiple: 你确定要删除这 {count} 个文件吗?
deleteMessageSingle: 你确定要删除这个文件/文件夹吗?
deleteTitle: 删除文件
displayName: 名称:
download: 下载文件
downloadMessage: 请选择要下载的压缩格式。
error: 出了一点问题...
fileInfo: 文件信息
filesSelected: 已选择 {count} 个文件。
lastModified: 最后修改
move: 移动
moveMessage: 请选择欲移动至的目录:
newDir: 新建目录
newDirMessage: 请输入新目录的名称。
newFile: 新建文件
newFileMessage: 请输入新文件的名称。
numberDirs: 目录数
numberFiles: 文件数
replace: 替换
replaceMessage: "\
您尝试上传的文件中有一个与现有文件的名称存在冲突。\
是否替换现有的同名文件?"
rename: 重命名
renameMessage: 请输入新名称,旧名称为:
show: 揭示
size: 大小
schedule: 计划
scheduleMessage: 请选择发布这篇帖子的日期。
newArchetype: 创建一个基于原型的新帖子。您的文件将会创建在内容文件夹中。
settings:
admin: 管理员
administrator: 管理员
allowCommands: 执行命令(Linux 代码)
allowEdit: 编辑、重命名或删除文件/目录
allowNew: 创建新文件和目录
allowPublish: 发布新的帖子与页面
avoidChanges: '(留空以避免更改)'
changePassword: 更改密码
commands: 命令(linux 代码)
commandsHelp: "\
在这里,您可以设置在指定事件下执行的命令,一行一条。\
若事件与文件相关,如“在保存文件前”,\
则文件的路径会被赋值给环境变量 \"FILE\"。"
commandsUpdated: 命令已更新!
customStylesheet: 自定义样式表
examples: 例子
globalSettings: 全局设置
language: 语言
lockPassword: 禁止用户修改密码
newPassword: 您的新密码
newPasswordConfirm: 重输一遍新密码
newUser: 新建用户
password: 密码
passwordUpdated: 密码已更新!
permissions: 权限
permissionsHelp: "\
您可以将该用户设置为管理员,也可以单独选择各项权限。\
如果选择了“管理员”,则其他的选项会被自动勾上,\
同时该用户可以管理其他用户。"
profileSettings: 个人设置
ruleExample1: "\
阻止用户访问所有文件夹下任何以 . 开头的文件\
(隐藏文件, 例如: .git, .gitignore)。"
ruleExample2: 阻止用户访问其目录范围的根目录下名为 Caddyfile 的文件。
rules: 规则
rulesHelp1: "\
您可以为该用户制定一组黑名单或白名单式的规则,\
被屏蔽的文件将不会显示在列表中,用户也无权限访问,\
支持相对于目录范围的路径。"
rulesHelp2: "\
每行一条规则,且必须以关键词 {0} 或 {1} 开头。\
如要使用正则表达式,请在加上 {2} 之后再附上表达式或路径。"
scope: 目录范围
settingsUpdated: 设置已更新!
user: 用户
userCommands: 用户命令(Linux 代码)
userCommandsHelp: "\
指定该用户可以执行的命令(Linux 代码),用空格分隔。\
例如:"
userCreated: 用户已创建!
userDeleted: 用户已删除!
userManagement: 用户管理
username: 用户名
users: 用户
userUpdated: 用户已更新!
sidebar:
help: 帮助
logout: 登出
myFiles: 我的文件
newFile: 新建文件
newFolder: 新建文件夹
settings: 设置
siteSettings: 网站设置
hugoNew: Hugo New
preview: 预览
search:
images: 图像
music: 音乐
pdf: PDF
pressToExecute: 按回车键执行。
pressToSearch: 按回车键搜索。
search: 搜索...
searchOrCommand: 搜索或者执行命令(Linux 代码)...
searchOrSupportedCommand: 搜索或加入"$"前缀以使用其中一个您可以使用的命令:
type: 键入并按回车键进行搜索。
types: 类型
video: 视频
writeToSearch: 请输入要搜索的内容
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: 时间单位
seconds:
minutes: 分钟
hours: 小时
days:

233
src/i18n/zh-tw.json Normal file
View File

@@ -0,0 +1,233 @@
{
"permanent": "永久",
"buttons": {
"cancel": "取消",
"close": "關閉",
"copy": "複製",
"copyFile": "複製檔案",
"copyToClipboard": "複製到剪貼簿",
"create": "建立",
"delete": "刪除",
"download": "下載",
"info": "資訊",
"more": "更多",
"move": "移動",
"moveFile": "移動檔案",
"new": "新",
"next": "下一個",
"ok": "確認",
"replace": "更換",
"previous": "上一個",
"rename": "重新命名",
"reportIssue": "報告問題",
"save": "儲存",
"search": "搜尋",
"select": "選擇",
"share": "分享",
"publish": "發佈",
"selectMultiple": "選擇多個",
"schedule": "計畫",
"switchView": "切換顯示方式",
"toggleSidebar": "切換側邊欄",
"update": "更新",
"upload": "上傳",
"permalink": "獲取永久連結"
},
"success": {
"linkCopied": "連結已複製!"
},
"errors": {
"forbidden": "你被禁止存取。",
"internal": "伺服器出了點問題。",
"notFound": "找不到檔案。"
},
"files": {
"folders": "資料夾",
"files": "檔案",
"body": "Body",
"clear": "清空",
"closePreview": "關閉預覽",
"home": "主頁",
"lastModified": "最後修改",
"loading": "讀取中...",
"lonely": "這裡沒有任何檔案...",
"metadata": "詮釋資料",
"multipleSelectionEnabled": "多選模式已開啟",
"name": "名稱",
"size": "大小",
"sortByName": "按名稱排序",
"sortBySize": "按大小排序",
"sortByLastModified": "按最後修改時間排序"
},
"help": {
"click": "選擇檔案或目錄",
"ctrl": {
"click": "選擇多個檔案或目錄",
"f": "打開搜尋列",
"s": "儲存檔案或下載目前資料夾"
},
"del": "刪除所選的檔案/資料夾",
"doubleClick": "打開檔案/資料夾",
"esc": "清除已選項或關閉提示資訊",
"f1": "顯示該幫助資訊",
"f2": "重新命名檔案/資料夾",
"help": "幫助"
},
"login": {
"password": "密碼",
"passwordConfirm": "Password Confirmation",
"submit": "登入",
"createAnAccount": "Create an account",
"loginInstead": "Already have an account",
"passwordsDontMatch": "Passwords don't match",
"usernameTaken": "Username already taken",
"signup": "Signup",
"username": "帳號",
"wrongCredentials": "帳號或密碼錯誤"
},
"prompts": {
"copy": "複製",
"copyMessage": "請選擇欲複製至的目錄:",
"currentlyNavigating": "目前目錄:",
"deleteMessageMultiple": "你確定要刪除這 {count} 個檔案嗎?",
"deleteMessageSingle": "你確定要刪除這個檔案/資料夾嗎?",
"deleteTitle": "刪除檔案",
"displayName": "名稱:",
"download": "下載檔案",
"downloadMessage": "請選擇要下載的壓縮格式。",
"error": "發出了一點錯誤...",
"fileInfo": "檔案資訊",
"filesSelected": "已選擇 {count} 個檔案。",
"lastModified": "最後修改",
"move": "移動",
"moveMessage": "請選擇欲移動至的目錄:",
"newDir": "建立目錄",
"newDirMessage": "請輸入新目錄的名稱。",
"newFile": "建立檔案",
"newFileMessage": "請輸入新檔案的名稱。",
"numberDirs": "目錄數",
"numberFiles": "檔案數",
"replace": "替換",
"replaceMessage": "您嘗試上傳的檔案中有一個與現有檔案的名稱存在衝突。是否取代現有的同名檔案?",
"rename": "重新命名",
"renameMessage": "請輸入新名稱,舊名稱為:",
"show": "顯示",
"size": "大小",
"schedule": "計畫",
"scheduleMessage": "請選擇發佈這篇貼文的日期。",
"newArchetype": "建立一個基於原型的新貼文。您的檔案將會建立在內容資料夾中。"
},
"settings": {
"instanceName": "Instance name",
"brandingDirectoryPath": "Branding directory path",
"documentation": "documentation",
"branding": "Branding",
"disableExternalLinks": "Disable external links (except documentation)",
"brandingHelp": "You can costumize how your File Browser instance looks and feels by changing its name, replacing the logo, adding custom styles and even disable external links to GitHub.\nFor more information about custom branding, please check out the {0}.",
"admin": "管理員",
"administrator": "管理員",
"allowCommands": "執行命令",
"allowEdit": "編輯、重命名或刪除檔案/目錄",
"allowNew": "創建新檔案和目錄",
"allowPublish": "發佈新的貼文與頁面",
"avoidChanges": "(留空以避免更改)",
"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": "命令已更新!",
"customStylesheet": "自定義樣式表",
"examples": "範例",
"globalSettings": "全域設定",
"language": "語言",
"lockPassword": "禁止使用者修改密碼",
"newPassword": "您的新密碼",
"newPasswordConfirm": "重輸一遍新密碼",
"newUser": "建立使用者",
"password": "密碼",
"passwordUpdated": "密碼已更新!",
"permissions": "權限",
"permissionsHelp": "您可以將該使用者設置為管理員,也可以單獨選擇各項權限。如果選擇了“管理員”,則其他的選項會被自動勾上,同時該使用者可以管理其他使用者。",
"profileSettings": "個人設定",
"ruleExample1": "封鎖使用者存取所有資料夾下任何以 . 開頭的檔案(隱藏文件, 例如: .git, .gitignore)。",
"ruleExample2": "封鎖使用者存取其目錄範圍的根目錄下名為 Caddyfile 的檔案。",
"rules": "規則",
"rulesHelp": "您可以為該使用者製定一組黑名單或白名單式的規則,被屏蔽的檔案將不會顯示在清單中,使用者也無權限存取,支持相對於目錄範圍的路徑。",
"scope": "目錄範圍",
"settingsUpdated": "設定已更新!",
"user": "使用者",
"userCommands": "使用者命令",
"userCommandsHelp": "指定該使用者可以執行的命令,用空格分隔。例如:",
"userCreated": "使用者已建立!",
"userDeleted": "使用者已刪除!",
"userManagement": "使用者管理",
"username": "使用者名稱",
"users": "使用者",
"globalRules": "This is a global set of allow and disallow rules. They apply to every user. You can define specific rules on each user's settings to override this ones.",
"allowSignup": "Allow users to signup",
"insertRegex": "Insert regex expression",
"insertPath": "Insert the path",
"userUpdated": "使用者已更新!",
"generalSettings": "General settings",
"userDefaults": "User default settings",
"defaultUserDescription": "This are the default settings for new users.",
"perm": {
"create": "Create files and directories",
"delete": "Delete files and directories",
"download": "Download",
"edit": "Edit files",
"execute": "Execute commands",
"rename": "Rename or move files and directories",
"share": "Share files"
}
},
"sidebar": {
"help": "幫助",
"logout": "登出",
"myFiles": "我的檔案",
"newFile": "建立檔案",
"newFolder": "建立資料夾",
"settings": "設定",
"siteSettings": "網站設定",
"hugoNew": "Hugo New",
"preview": "預覽"
},
"search": {
"images": "影像",
"music": "音樂",
"notSupportedCommand": "This is a not supported command.",
"pdf": "PDF",
"pressToExecute": "按確定鍵執行。",
"pressToSearch": "按確定鍵搜尋。",
"search": "搜尋...",
"searchOrCommand": "搜尋或者執行命令...",
"searchOrSupportedCommand": "搜尋或使用您可以使用的命令(一次只能執行一個命令)",
"typeCommand": "Type and press enter to execute.",
"typeSearch": "Type and press enter to search.",
"types": "類型",
"video": "影片",
"writeToSearch": "請輸入要搜尋的內容"
},
"languages": {
"ar": "العربية",
"en": "English",
"it": "Italiano",
"fr": "Français",
"pt": "Português",
"ptBR": "Português (Brasil)",
"ja": "日本語",
"zhCN": "中文 (简体)",
"zhTW": "中文 (繁體)",
"es": "Español",
"de": "Deutsch",
"ru": "Русский",
"pl": "Polski",
"ko": "한국어"
},
"time": {
"unit": "時間單位",
"seconds": "秒",
"minutes": "分鐘",
"hours": "小時",
"days": "天"
}
}

View File

@@ -1,206 +0,0 @@
permanent: 永久
buttons:
cancel: 取消
close: 關閉
copy: 複製
copyFile: 複製檔案
copyToClipboard: 複製到剪貼簿
create: 建立
delete: 刪除
download: 下載
info: 資訊
more: 更多
move: 移動
moveFile: 移動檔案
new:
next: 下一個
ok: 確認
replace: 更換
previous: 上一個
rename: 重新命名
reportIssue: 報告問題
save: 儲存
search: 搜尋
select: 選擇
share: 分享
publish: 發佈
selectMultiple: 選擇多個
schedule: 計畫
switchView: 切換顯示方式
toggleSidebar: 切換側邊欄
update: 更新
upload: 上傳
permalink: 獲取永久連結
success:
linkCopied: 連結已複製!
errors:
forbidden: 你被禁止存取。
internal: 伺服器出了點問題。
notFound: 找不到檔案。
files:
folders: 資料夾
files: 檔案
body: Body
clear: 清空
closePreview: 關閉預覽
home: 主頁
lastModified: 最後修改
loading: 讀取中...
lonely: 這裡沒有任何檔案...
metadata: 詮釋資料
multipleSelectionEnabled: 多選模式已開啟
name: 名稱
size: 大小
sortByName: 按名稱排序
sortBySize: 按大小排序
sortByLastModified: 按最後修改時間排序
help:
click: 選擇檔案或目錄
ctrl:
click: 選擇多個檔案或目錄
f: 打開搜尋列
s: 儲存檔案或下載目前資料夾
del: 刪除所選的檔案/資料夾
doubleClick: 打開檔案/資料夾
esc: 清除已選項或關閉提示資訊
f1: 顯示該幫助資訊
f2: 重新命名檔案/資料夾
help: 幫助
login:
password: 密碼
submit: 登入
username: 帳號
wrongCredentials: 帳號或密碼錯誤
prompts:
copy: 複製
copyMessage: 請選擇欲複製至的目錄:
currentlyNavigating: 目前目錄:
deleteMessageMultiple: 你確定要刪除這 {count} 個檔案嗎?
deleteMessageSingle: 你確定要刪除這個檔案/資料夾嗎?
deleteTitle: 刪除檔案
displayName: 名稱:
download: 下載檔案
downloadMessage: 請選擇要下載的壓縮格式。
error: 發出了一點錯誤...
fileInfo: 檔案資訊
filesSelected: 已選擇 {count} 個檔案。
lastModified: 最後修改
move: 移動
moveMessage: 請選擇欲移動至的目錄:
newDir: 建立目錄
newDirMessage: 請輸入新目錄的名稱。
newFile: 建立檔案
newFileMessage: 請輸入新檔案的名稱。
numberDirs: 目錄數
numberFiles: 檔案數
replace: 替換
replaceMessage: "\
您嘗試上傳的檔案中有一個與現有檔案的名稱存在衝突。\
是否取代現有的同名檔案?"
rename: 重新命名
renameMessage: 請輸入新名稱,舊名稱為:
show: 顯示
size: 大小
schedule: 計畫
scheduleMessage: 請選擇發佈這篇貼文的日期。
newArchetype: 建立一個基於原型的新貼文。您的檔案將會建立在內容資料夾中。
settings:
admin: 管理員
administrator: 管理員
allowCommands: 執行命令
allowEdit: 編輯、重命名或刪除檔案/目錄
allowNew: 創建新檔案和目錄
allowPublish: 發佈新的貼文與頁面
avoidChanges: '(留空以避免更改)'
changePassword: 更改密碼
commands: 命令
commandsHelp: "\
在這裡,您可以設定在指定事件下執行的命令,一行一條。\
若事件與檔案相關,如“在保存檔案前”,\
則檔案的路徑會被賦值給環境變數 \"FILE\"。"
commandsUpdated: 命令已更新!
customStylesheet: 自定義樣式表
examples: 範例
globalSettings: 全域設定
language: 語言
lockPassword: 禁止使用者修改密碼
newPassword: 您的新密碼
newPasswordConfirm: 重輸一遍新密碼
newUser: 建立使用者
password: 密碼
passwordUpdated: 密碼已更新!
permissions: 權限
permissionsHelp: "\
您可以將該使用者設置為管理員,也可以單獨選擇各項權限。\
如果選擇了“管理員”,則其他的選項會被自動勾上,\
同時該使用者可以管理其他使用者。"
profileSettings: 個人設定
ruleExample1: "\
封鎖使用者存取所有資料夾下任何以 . 開頭的檔案\
(隱藏文件, 例如: .git, .gitignore)。"
ruleExample2: 封鎖使用者存取其目錄範圍的根目錄下名為 Caddyfile 的檔案。
rules: 規則
rulesHelp1: "\
您可以為該使用者製定一組黑名單或白名單式的規則,\
被屏蔽的檔案將不會顯示在清單中,使用者也無權限存取,\
支持相對於目錄範圍的路徑。"
rulesHelp2: "\
每行一條規則,且必須以關鍵字 {0} 或 {1} 開頭。\
如要使用規則運算式,請在加上 {2} 之後再附上運算式或路徑。"
scope: 目錄範圍
settingsUpdated: 設定已更新!
user: 使用者
userCommands: 使用者命令
userCommandsHelp: "\
指定該使用者可以執行的命令,用空格分隔。\
例如:"
userCreated: 使用者已建立!
userDeleted: 使用者已刪除!
userManagement: 使用者管理
username: 使用者名稱
users: 使用者
userUpdated: 使用者已更新!
sidebar:
help: 幫助
logout: 登出
myFiles: 我的檔案
newFile: 建立檔案
newFolder: 建立資料夾
settings: 設定
siteSettings: 網站設定
hugoNew: Hugo New
preview: 預覽
search:
images: 影像
music: 音樂
pdf: PDF
pressToExecute: 按確定鍵執行。
pressToSearch: 按確定鍵搜尋。
search: 搜尋...
searchOrCommand: 搜尋或者執行命令...
searchOrSupportedCommand: 搜尋或使用您可以使用的命令(一次只能執行一個命令)
type: 輸入並按確定鍵進行搜尋。
types: 類型
video: 影片
writeToSearch: 請輸入要搜尋的內容
languages:
ar: العربية
en: English
it: Italiano
fr: Français
pt: Português
ptBR: Português (Brasil)
ja: 日本語
zhCN: 中文 (简体)
zhTW: 中文 (繁體)
es: Español
de: Deutsch
ru: Русский
pl: Polski
ko: 한국어
time:
unit: 時間單位
seconds:
minutes: 分鐘
hours: 小時
days:

View File

@@ -1,60 +1,43 @@
import Vue from 'vue'
import App from './App'
import store from './store'
import router from './router'
import i18n from './i18n'
import Noty from 'noty'
import { sync } from 'vuex-router-sync'
import store from '@/store'
import router from '@/router'
import i18n from '@/i18n'
import Vue from '@/utils/vue'
import { recaptcha, noAuth } from '@/utils/constants'
import { login, validateLogin } from '@/utils/auth'
import App from '@/App'
Vue.config.productionTip = true
sync(store, router)
const notyDefault = {
type: 'info',
layout: 'bottomRight',
timeout: 1000,
progressBar: true
}
Vue.prototype.$noty = function (opts) {
new Noty(Object.assign({}, notyDefault, opts)).show()
}
Vue.prototype.$showSuccess = function (message) {
new Noty(Object.assign({}, notyDefault, {
text: message,
type: 'success'
})).show()
}
Vue.prototype.$showError = function (error) {
let n = new Noty(Object.assign({}, notyDefault, {
text: error,
type: 'error',
timeout: null,
buttons: [
Noty.button(i18n.t('buttons.reportIssue'), '', function () {
window.open('https://github.com/filebrowser/filebrowser/issues/new/choose')
}),
Noty.button(i18n.t('buttons.close'), '', function () {
n.close()
})
]
}))
n.show()
}
Vue.directive('focus', {
inserted: function (el) {
el.focus()
async function start () {
if (noAuth) {
await login('', '', '')
} else {
await validateLogin()
}
})
/* eslint-disable no-new */
new Vue({
el: '#app',
store,
router,
i18n,
template: '<App/>',
components: { App }
})
if (recaptcha) {
await new Promise (resolve => {
const check = () => {
if (typeof window.grecaptcha === 'undefined') {
setTimeout(check, 100)
} else {
resolve()
}
}
check()
})
}
new Vue({
el: '#app',
store,
router,
i18n,
template: '<App/>',
components: { App }
})
}
start()

View File

@@ -3,6 +3,7 @@ import Router from 'vue-router'
import Login from '@/views/Login'
import Layout from '@/views/Layout'
import Files from '@/views/Files'
import Share from '@/views/Share'
import Users from '@/views/settings/Users'
import User from '@/views/settings/User'
import Settings from '@/views/Settings'
@@ -11,41 +12,44 @@ import ProfileSettings from '@/views/settings/Profile'
import Error403 from '@/views/errors/403'
import Error404 from '@/views/errors/404'
import Error500 from '@/views/errors/500'
import auth from '@/utils/auth'
import store from '@/store'
import { baseURL } from '@/utils/constants'
Vue.use(Router)
const router = new Router({
base: document.querySelector('meta[name="base"]').getAttribute('content'),
base: baseURL,
mode: 'history',
routes: [
{
path: '/login',
name: 'Login',
component: Login,
beforeEnter: function (to, from, next) {
auth.loggedIn()
.then(() => {
next({ path: '/files' })
})
.catch(() => {
document.title = 'Login'
next()
})
beforeEnter: (to, from, next) => {
if (store.getters.isLogged) {
return next({ path: '/files' })
}
document.title = 'Login'
next()
}
},
{
path: '/*',
component: Layout,
meta: {
requiresAuth: true
},
children: [
{
path: '/share/*',
name: 'Share',
component: Share
},
{
path: '/files/*',
name: 'Files',
component: Files
component: Files,
meta: {
requiresAuth: true
}
},
{
path: '/settings',
@@ -55,7 +59,7 @@ const router = new Router({
path: '/settings/profile'
},
meta: {
disableOnNoAuth: true
requiresAuth: true
},
children: [
{
@@ -112,9 +116,7 @@ const router = new Router({
},
{
path: '/*',
redirect: {
name: 'Files'
}
redirect: to => `/files${to.path}`
}
]
}
@@ -125,34 +127,21 @@ router.beforeEach((to, from, next) => {
document.title = to.name
if (to.matched.some(record => record.meta.requiresAuth)) {
// this route requires auth, check if logged in
// if not, redirect to login page.
auth.loggedIn()
.then(() => {
if (to.matched.some(record => record.meta.requiresAdmin)) {
if (!store.state.user.admin) {
next({ path: '/403' })
return
}
}
if (to.matched.some(record => record.meta.disableOnNoAuth)) {
if (store.state.noAuth) {
next({ path: '/403' })
return
}
}
next()
})
.catch(e => {
next({
path: '/login',
query: { redirect: to.fullPath }
})
if (!store.getters.isLogged) {
next({
path: '/login',
query: { redirect: to.fullPath }
})
return
return
}
if (to.matched.some(record => record.meta.requiresAdmin)) {
if (!store.state.user.perm.admin) {
next({ path: '/403' })
return
}
}
}
next()

View File

@@ -1,4 +1,8 @@
const getters = {
isLogged: state => state.user !== null,
isFiles: state => !state.loading && state.route.name === 'Files',
isListing: (state, getters) => getters.isFiles && state.req.isDir,
isEditor: (state, getters) => getters.isFiles && (state.req.type === 'text' || state.req.type === 'textImmutable'),
selectedCount: state => state.selected.length
}

View File

@@ -6,36 +6,27 @@ import getters from './getters'
Vue.use(Vuex)
const state = {
user: {},
user: null,
req: {},
oldReq: {},
clipboard: {
key: '',
items: []
},
css: (() => {
let css = window.CSS
window.CSS = null
return css
})(),
recaptcha: document.querySelector('meta[name="recaptcha"]').getAttribute('content'),
staticGen: document.querySelector('meta[name="staticgen"]').getAttribute('content'),
baseURL: document.querySelector('meta[name="base"]').getAttribute('content'),
noAuth: (document.querySelector('meta[name="noauth"]').getAttribute('content') === 'true'),
version: document.querySelector('meta[name="version"]').getAttribute('content'),
jwt: '',
progress: 0,
schedule: '',
loading: false,
reload: false,
selected: [],
multiple: false,
show: null,
showShell: false,
showMessage: null,
showConfirm: null
}
export default new Vuex.Store({
strict: process.env.NODE_ENV !== 'production',
strict: true,
state,
getters,
mutations

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