Compare commits
48
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b014a9ebc2 | ||
|
|
53123c0b01 | ||
|
|
07ad2db503 | ||
|
|
9666e9701b | ||
|
|
86e1c5ff18 | ||
|
|
16ae1fbe5e | ||
|
|
11f508d9be | ||
|
|
9ce6a73f42 | ||
|
|
c5a991cf0a | ||
|
|
14569f12d3 | ||
|
|
a405c21ebb | ||
|
|
dc6a10dff4 | ||
|
|
d4c2acf6f6 | ||
|
|
483ecada80 | ||
|
|
9553365d31 | ||
|
|
5eb20580b1 | ||
|
|
ea1ea366d2 | ||
|
|
6e4574a9f7 | ||
|
|
3d0da5ac60 | ||
|
|
9f8e6966d8 | ||
|
|
a64ae36bcc | ||
|
|
690b55360f | ||
|
|
2f6187dc0e | ||
|
|
8294870ffc | ||
|
|
ac2e444a97 | ||
|
|
4f6b86a1c0 | ||
|
|
516c057d43 | ||
|
|
d644dce4e7 | ||
|
|
7c579880eb | ||
|
|
296db314f5 | ||
|
|
a8486b0468 | ||
|
|
f8a7a034a7 | ||
|
|
ceae56a860 | ||
|
|
dcafd6ec72 | ||
|
|
8619a03f01 | ||
|
|
b91d7711aa | ||
|
|
9940c91ebf | ||
|
|
80a577b025 | ||
|
|
d672175ce4 | ||
|
|
a44b31d173 | ||
|
|
70065e6b13 | ||
|
|
adbb3ed2e9 | ||
|
|
6ed9c0c34c | ||
|
|
19bbf4f6bf | ||
|
|
cf46bf0297 | ||
|
|
051cbdc713 | ||
|
|
58d1f3a471 | ||
|
|
c9dfd75d8e |
@@ -29,7 +29,7 @@ jobs:
|
||||
fetch-depth: 0
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
@@ -42,10 +42,10 @@ jobs:
|
||||
done
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Build and push
|
||||
uses: docker/build-push-action@v4
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ./Dockerfile.${{ matrix.pkg }}
|
||||
|
||||
@@ -49,6 +49,19 @@ jobs:
|
||||
# The oldest version in this list should match what we have in our go.mod.
|
||||
# Variables don't seem to be supported here, or we could have done something nice.
|
||||
go: ["1.20", "1.21"]
|
||||
|
||||
# Don't run the Windows tests with Go 1.21.4 or 1.20.11; this can be
|
||||
# removed when 1.21.5 and 1.20.12 is released.
|
||||
exclude:
|
||||
- runner: windows-latest
|
||||
go: "1.20"
|
||||
- runner: windows-latest
|
||||
go: "1.21"
|
||||
include:
|
||||
- runner: windows-latest
|
||||
go: "~1.20.12 || ~1.20.0 <1.20.11"
|
||||
- runner: windows-latest
|
||||
go: "~1.21.5 || ~1.21.1 <1.21.4"
|
||||
runs-on: ${{ matrix.runner }}
|
||||
steps:
|
||||
- name: Set git to use LF
|
||||
@@ -79,11 +92,12 @@ jobs:
|
||||
|
||||
- name: Test
|
||||
run: |
|
||||
go version
|
||||
go run build.go test | go-test-json-to-loki
|
||||
env:
|
||||
GOFLAGS: "-json"
|
||||
LOKI_URL: ${{ secrets.LOKI_URL }}
|
||||
LOKI_USER: ${{ secrets.LOKI_USER }}
|
||||
LOKI_URL: ${{ vars.LOKI_URL }}
|
||||
LOKI_USER: ${{ vars.LOKI_USER }}
|
||||
LOKI_PASSWORD: ${{ secrets.LOKI_PASSWORD }}
|
||||
LOKI_LABELS: "go=${{ matrix.go }},runner=${{ matrix.runner }},repo=${{ github.repository }},ref=${{ github.ref }}"
|
||||
|
||||
@@ -136,7 +150,7 @@ jobs:
|
||||
|
||||
package-windows:
|
||||
name: Package for Windows
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: signing
|
||||
runs-on: windows-latest
|
||||
steps:
|
||||
@@ -155,7 +169,9 @@ jobs:
|
||||
|
||||
- uses: actions/setup-go@v4
|
||||
with:
|
||||
go-version: ${{ env.GO_VERSION }}
|
||||
# Temporary version constraint to avoid 1.21.4 which has a bug in
|
||||
# path handling. This can be removed when 1.21.5 is released.
|
||||
go-version: "~1.21.5 || ~1.21.1 <1.21.4"
|
||||
cache: false
|
||||
check-latest: true
|
||||
|
||||
@@ -235,7 +251,7 @@ jobs:
|
||||
|
||||
package-macos:
|
||||
name: Package for macOS
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: signing
|
||||
runs-on: macos-latest
|
||||
steps:
|
||||
@@ -325,7 +341,7 @@ jobs:
|
||||
|
||||
notarize-macos:
|
||||
name: Notarize for macOS
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: signing
|
||||
needs:
|
||||
- package-macos
|
||||
@@ -461,7 +477,7 @@ jobs:
|
||||
|
||||
sign-for-upgrade:
|
||||
name: Sign for upgrade
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: signing
|
||||
needs:
|
||||
- basics
|
||||
@@ -580,7 +596,7 @@ jobs:
|
||||
|
||||
publish-nightly:
|
||||
name: Publish nightly build
|
||||
if: github.event_name == 'push' && startsWith(github.ref, 'refs/heads/release-nightly')
|
||||
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && startsWith(github.ref, 'refs/heads/release-nightly')
|
||||
environment: signing
|
||||
needs:
|
||||
- sign-for-upgrade
|
||||
@@ -624,7 +640,7 @@ jobs:
|
||||
|
||||
publish-release-files:
|
||||
name: Publish release files
|
||||
if: github.event_name == 'push' && github.ref == 'refs/heads/release'
|
||||
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && github.ref == 'refs/heads/release'
|
||||
environment: signing
|
||||
needs:
|
||||
- sign-for-upgrade
|
||||
@@ -683,7 +699,7 @@ jobs:
|
||||
docker-syncthing:
|
||||
name: Build and push Docker images
|
||||
runs-on: ubuntu-latest
|
||||
if: github.event_name == 'push' && (github.ref == 'refs/heads/release' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
if: (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release' || github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/heads/release-'))
|
||||
environment: docker
|
||||
strategy:
|
||||
matrix:
|
||||
@@ -736,14 +752,14 @@ jobs:
|
||||
fi
|
||||
|
||||
- name: Login to Docker Hub
|
||||
uses: docker/login-action@v2
|
||||
uses: docker/login-action@v3
|
||||
if: env.DOCKER_PUSH == 'true'
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v2
|
||||
uses: docker/setup-buildx-action@v3
|
||||
|
||||
- name: Set version tags
|
||||
run: |
|
||||
@@ -764,7 +780,7 @@ jobs:
|
||||
echo "DOCKER_TAGS=$tags" >> $GITHUB_ENV
|
||||
|
||||
- name: Build and push Docker image
|
||||
uses: docker/build-push-action@v4
|
||||
uses: docker/build-push-action@v5
|
||||
with:
|
||||
context: .
|
||||
file: ${{ matrix.dockerfile }}
|
||||
|
||||
+1
-3
@@ -1,11 +1,10 @@
|
||||
/syncthing
|
||||
/stdiscosrv
|
||||
syncthing.exe
|
||||
stdiscosrv.exe
|
||||
*.tar.gz
|
||||
*.zip
|
||||
*.asc
|
||||
*.deb
|
||||
*.exe
|
||||
.jshintrc
|
||||
coverage.out
|
||||
files/pidx
|
||||
@@ -19,4 +18,3 @@ deb
|
||||
/repos
|
||||
/proto/scripts/protoc-gen-gosyncthing
|
||||
/gui/next-gen-gui
|
||||
.idea
|
||||
|
||||
@@ -83,6 +83,7 @@ Colin Kennedy (moshen) <moshen.colin@gmail.com>
|
||||
Cromefire_ <tim.l@nghorst.net> <26320625+cromefire@users.noreply.github.com>
|
||||
cui fliter <imcusg@gmail.com>
|
||||
Cyprien Devillez <cypx@users.noreply.github.com>
|
||||
d-volution <49024624+d-volution@users.noreply.github.com>
|
||||
Dale Visser <dale.visser@live.com>
|
||||
Dan <benda.daniel@gmail.com>
|
||||
Daniel Barczyk <46358936+DanielBarczyk@users.noreply.github.com>
|
||||
@@ -92,6 +93,7 @@ Daniel Martí (mvdan) <mvdan@mvdan.cc>
|
||||
Darshil Chanpura (dtchanpura) <dtchanpura@gmail.com> <dcprime314@gmail.com>
|
||||
David Rimmer (dinosore) <dinosore@dbrsoftware.co.uk>
|
||||
deepsource-autofix[bot] <62050782+deepsource-autofix[bot]@users.noreply.github.com>
|
||||
DeflateAwning <11021263+DeflateAwning@users.noreply.github.com>
|
||||
Denis A. (dva) <denisva@gmail.com>
|
||||
Dennis Wilson (snnd) <dw@risu.io>
|
||||
dependabot-preview[bot] <dependabot-preview[bot]@users.noreply.github.com> <27856297+dependabot-preview[bot]@users.noreply.github.com>
|
||||
@@ -99,6 +101,7 @@ dependabot[bot] <dependabot[bot]@users.noreply.github.com> <49699333+dependabot[
|
||||
derekriemer <derek.riemer@colorado.edu>
|
||||
desbma <desbma@users.noreply.github.com>
|
||||
Devon G. Redekopp <devon@redekopp.com>
|
||||
digital <didev@dinid.net>
|
||||
Dimitri Papadopoulos Orfanos <3234522+DimitriPapadopoulos@users.noreply.github.com>
|
||||
Dmitry Saveliev (dsaveliev) <d.e.saveliev@gmail.com>
|
||||
Domenic Horner <domenic@tgxn.net>
|
||||
@@ -206,6 +209,7 @@ Marcus Legendre <marcus.legendre@gmail.com>
|
||||
Mario Majila <mariustshipichik@gmail.com>
|
||||
Mark Pulford (mpx) <mark@kyne.com.au>
|
||||
Martchus <martchus@gmx.net>
|
||||
Martin Polehla <p0l0us@users.noreply.github.com>
|
||||
Mateusz Naściszewski (mateon1) <matin1111@wp.pl>
|
||||
Mateusz Ż <thedead4fun@live.com>
|
||||
Matic Potočnik <hairyfotr@gmail.com>
|
||||
@@ -243,6 +247,7 @@ NinoM4ster <ninom4ster@gmail.com>
|
||||
Nitroretro <43112364+Nitroretro@users.noreply.github.com>
|
||||
NoLooseEnds <jon.koslung@gmail.com>
|
||||
Oliver Freyermuth <o.freyermuth@googlemail.com>
|
||||
orangekame3 <miya.org.0309@gmail.com>
|
||||
otbutz <tbutz@optitool.de>
|
||||
Otiel <Otiel@users.noreply.github.com>
|
||||
overkill <22098433+0verk1ll@users.noreply.github.com>
|
||||
|
||||
@@ -24,17 +24,17 @@ to avoid corrupting the user's files.
|
||||
### 2. Secure Against Attackers
|
||||
|
||||
Again, protecting the user's data is paramount. Regardless of our other
|
||||
goals we must never allow the user's data to be susceptible to eavesdropping
|
||||
goals, we must never allow the user's data to be susceptible to eavesdropping
|
||||
or modification by unauthorized parties.
|
||||
|
||||
> This should be understood in context. It is not necessarily reasonable to
|
||||
> expect Syncthing to be resistant against well equipped state level
|
||||
> attackers. We will however do our best. Note also that this is different
|
||||
> attackers. We will, however, do our best. Note also that this is different
|
||||
> from anonymity which is not, currently, a goal.
|
||||
|
||||
### 3. Easy to Use
|
||||
|
||||
Syncthing should be approachable, understandable and inclusive.
|
||||
Syncthing should be approachable, understandable, and inclusive.
|
||||
|
||||
> Complex concepts and maths form the base of Syncthing's functionality.
|
||||
> This should nonetheless be abstracted or hidden to a degree where
|
||||
@@ -52,18 +52,18 @@ User interaction should be required only when absolutely necessary.
|
||||
### 5. Universally Available
|
||||
|
||||
Syncthing should run on every common computer. We are mindful that the
|
||||
latest technology is not always available to any given individual.
|
||||
latest technology is not always available to every individual.
|
||||
|
||||
> Computers include desktops, laptops, servers, virtual machines, small
|
||||
> general purpose computers such as Raspberry Pis and, *where possible*,
|
||||
> tablets and phones. NAS appliances, toasters, cars, firearms, thermostats
|
||||
> tablets and phones. NAS appliances, toasters, cars, firearms, thermostats,
|
||||
> and so on may include computing capabilities but it is not our goal for
|
||||
> Syncthing to run smoothly on these devices.
|
||||
|
||||
### 6. For Individuals
|
||||
|
||||
Syncthing is primarily about empowering the individual user with safe,
|
||||
secure and easy to use file synchronization.
|
||||
secure, and easy to use file synchronization.
|
||||
|
||||
> We acknowledge that it's also useful in an enterprise setting and include
|
||||
> functionality to support that. If this is in conflict with the
|
||||
|
||||
@@ -10,8 +10,8 @@
|
||||
|
||||
Syncthing is a **continuous file synchronization program**. It synchronizes
|
||||
files between two or more computers. We strive to fulfill the goals below.
|
||||
The goals are listed in order of importance, the most important one being
|
||||
the first. This is the summary version of the goal list - for more
|
||||
The goals are listed in order of importance, the most important ones first.
|
||||
This is the summary version of the goal list - for more
|
||||
commentary, see the full [Goals document][13].
|
||||
|
||||
Syncthing should be:
|
||||
@@ -24,12 +24,12 @@ Syncthing should be:
|
||||
2. **Secure Against Attackers**
|
||||
|
||||
Again, protecting the user's data is paramount. Regardless of our other
|
||||
goals we must never allow the user's data to be susceptible to
|
||||
goals, we must never allow the user's data to be susceptible to
|
||||
eavesdropping or modification by unauthorized parties.
|
||||
|
||||
3. **Easy to Use**
|
||||
|
||||
Syncthing should be approachable, understandable and inclusive.
|
||||
Syncthing should be approachable, understandable, and inclusive.
|
||||
|
||||
4. **Automatic**
|
||||
|
||||
@@ -38,12 +38,12 @@ Syncthing should be:
|
||||
5. **Universally Available**
|
||||
|
||||
Syncthing should run on every common computer. We are mindful that the
|
||||
latest technology is not always available to any given individual.
|
||||
latest technology is not always available to every individual.
|
||||
|
||||
6. **For Individuals**
|
||||
|
||||
Syncthing is primarily about empowering the individual user with safe,
|
||||
secure and easy to use file synchronization.
|
||||
secure, and easy to use file synchronization.
|
||||
|
||||
7. **Everything Else**
|
||||
|
||||
@@ -57,7 +57,7 @@ Take a look at the [getting started guide][2].
|
||||
|
||||
There are a few examples for keeping Syncthing running in the background
|
||||
on your system in [the etc directory][3]. There are also several [GUI
|
||||
implementations][11] for Windows, Mac and Linux.
|
||||
implementations][11] for Windows, Mac, and Linux.
|
||||
|
||||
## Docker
|
||||
|
||||
@@ -66,7 +66,8 @@ To run Syncthing in Docker, see [the Docker README][16].
|
||||
## Vote on features/bugs
|
||||
|
||||
We'd like to encourage you to [vote][12] on issues that matter to you.
|
||||
This helps the team understand what are the biggest pain points for our users, and could potentially influence what is being worked on next.
|
||||
This helps the team understand what are the biggest pain points for our
|
||||
users, and could potentially influence what is being worked on next.
|
||||
|
||||
## Getting in Touch
|
||||
|
||||
@@ -74,6 +75,10 @@ The first and best point of contact is the [Forum][8].
|
||||
If you've found something that is clearly a
|
||||
bug, feel free to report it in the [GitHub issue tracker][10].
|
||||
|
||||
If you believe that you’ve found a Syncthing-related security vulnerability,
|
||||
please report it by emailing security@syncthing.net. Do not report it in the
|
||||
Forum or issue tracker.
|
||||
|
||||
## Building
|
||||
|
||||
Building Syncthing from source is easy. After extracting the source bundle from
|
||||
@@ -83,11 +88,11 @@ build process.
|
||||
|
||||
## Signed Releases
|
||||
|
||||
As of v0.10.15 and onwards release binaries are GPG signed with the key
|
||||
As of v0.10.15 and onwards, release binaries are GPG signed with the key
|
||||
D26E6ED000654A3E, available from https://syncthing.net/security.html and
|
||||
most key servers.
|
||||
|
||||
There is also a built in automatic upgrade mechanism (disabled in some
|
||||
There is also a built-in automatic upgrade mechanism (disabled in some
|
||||
distribution channels) which uses a compiled in ECDSA signature. macOS
|
||||
binaries are also properly code signed.
|
||||
|
||||
|
||||
@@ -40,6 +40,7 @@ type sentryService struct {
|
||||
|
||||
type sentryRequest struct {
|
||||
reportID string
|
||||
userID string
|
||||
data []byte
|
||||
}
|
||||
|
||||
@@ -52,7 +53,7 @@ func (s *sentryService) Serve(ctx context.Context) {
|
||||
log.Println("Failed to parse crash report:", err)
|
||||
continue
|
||||
}
|
||||
if err := sendReport(s.dsn, pkt, req.reportID); err != nil {
|
||||
if err := sendReport(s.dsn, pkt, req.userID); err != nil {
|
||||
log.Println("Failed to send crash report:", err)
|
||||
}
|
||||
|
||||
@@ -62,9 +63,9 @@ func (s *sentryService) Serve(ctx context.Context) {
|
||||
}
|
||||
}
|
||||
|
||||
func (s *sentryService) Send(reportID string, data []byte) bool {
|
||||
func (s *sentryService) Send(reportID, userID string, data []byte) bool {
|
||||
select {
|
||||
case s.inbox <- sentryRequest{reportID, data}:
|
||||
case s.inbox <- sentryRequest{reportID, userID, data}:
|
||||
return true
|
||||
default:
|
||||
return false
|
||||
|
||||
@@ -87,7 +87,7 @@ func (r *crashReceiver) servePut(reportID string, w http.ResponseWriter, req *ht
|
||||
}
|
||||
|
||||
// Send the report to Sentry
|
||||
if !r.sentry.Send(reportID, bs) {
|
||||
if !r.sentry.Send(reportID, userIDFor(req), bs) {
|
||||
log.Println("Failed to send report to sentry (queue full):", reportID)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -354,13 +354,16 @@ func certificateBytes(req *http.Request) ([]byte, error) {
|
||||
bs = pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: hdr})
|
||||
} else if hdr := req.Header.Get("X-Forwarded-Tls-Client-Cert"); hdr != "" {
|
||||
// Traefik 2 passtlsclientcert
|
||||
// The certificate is in PEM format with url encoding but without newlines
|
||||
// and start/end statements. We need to decode, reinstate the newlines every 64
|
||||
//
|
||||
// The certificate is in PEM format, maybe with URL encoding
|
||||
// (depends on Traefik version) but without newlines and start/end
|
||||
// statements. We need to decode, reinstate the newlines every 64
|
||||
// character and add statements for the PEM decoder
|
||||
hdr, err := url.QueryUnescape(hdr)
|
||||
if err != nil {
|
||||
// Decoding failed
|
||||
return nil, err
|
||||
|
||||
if strings.Contains(hdr, "%") {
|
||||
if unesc, err := url.QueryUnescape(hdr); err == nil {
|
||||
hdr = unesc
|
||||
}
|
||||
}
|
||||
|
||||
for i := 64; i < len(hdr); i += 65 {
|
||||
@@ -368,7 +371,7 @@ func certificateBytes(req *http.Request) ([]byte, error) {
|
||||
}
|
||||
|
||||
hdr = "-----BEGIN CERTIFICATE-----\n" + hdr
|
||||
hdr = hdr + "\n-----END CERTIFICATE-----\n"
|
||||
hdr += "\n-----END CERTIFICATE-----\n"
|
||||
bs = []byte(hdr)
|
||||
}
|
||||
|
||||
|
||||
@@ -19,8 +19,11 @@ import (
|
||||
"github.com/syncthing/syncthing/lib/protocol"
|
||||
)
|
||||
|
||||
const replicationReadTimeout = time.Minute
|
||||
const replicationHeartbeatInterval = time.Second * 30
|
||||
const (
|
||||
replicationReadTimeout = time.Minute
|
||||
replicationWriteTimeout = 30 * time.Second
|
||||
replicationHeartbeatInterval = time.Second * 30
|
||||
)
|
||||
|
||||
type replicator interface {
|
||||
send(key string, addrs []DatabaseAddress, seen int64)
|
||||
@@ -68,6 +71,12 @@ func (s *replicationSender) Serve(ctx context.Context) error {
|
||||
conn.Close()
|
||||
}()
|
||||
|
||||
// The replication stream is not especially latency sensitive, but it is
|
||||
// quite a lot of data in small writes. Make it more efficient.
|
||||
if tcpc, ok := conn.NetConn().(*net.TCPConn); ok {
|
||||
_ = tcpc.SetNoDelay(false)
|
||||
}
|
||||
|
||||
// Get the other side device ID.
|
||||
remoteID, err := deviceID(conn)
|
||||
if err != nil {
|
||||
@@ -116,7 +125,7 @@ func (s *replicationSender) Serve(ctx context.Context) error {
|
||||
binary.BigEndian.PutUint32(buf, uint32(n))
|
||||
|
||||
// Send
|
||||
conn.SetWriteDeadline(time.Now().Add(5 * time.Second))
|
||||
conn.SetWriteDeadline(time.Now().Add(replicationWriteTimeout))
|
||||
if _, err := conn.Write(buf[:4+n]); err != nil {
|
||||
replicationSendsTotal.WithLabelValues("error").Inc()
|
||||
log.Println("Replication write:", err)
|
||||
|
||||
@@ -69,7 +69,7 @@ func Generate(l logger.Logger, confDir, guiUser, guiPassword string, noDefaultFo
|
||||
return err
|
||||
}
|
||||
|
||||
if err := syncthing.EnsureDir(dir, 0700); err != nil {
|
||||
if err := syncthing.EnsureDir(dir, 0o700); err != nil {
|
||||
return err
|
||||
}
|
||||
locations.SetBaseDir(locations.ConfigBaseDir, dir)
|
||||
@@ -127,7 +127,7 @@ func updateGUIAuthentication(l logger.Logger, guiCfg *config.GUIConfiguration, g
|
||||
}
|
||||
|
||||
if guiPassword != "" && guiCfg.Password != guiPassword {
|
||||
if err := guiCfg.HashAndSetPassword(guiPassword); err != nil {
|
||||
if err := guiCfg.SetPassword(guiPassword); err != nil {
|
||||
return fmt.Errorf("failed to set GUI authentication password: %w", err)
|
||||
}
|
||||
l.Infoln("Updated GUI authentication password.")
|
||||
|
||||
@@ -64,12 +64,15 @@ var (
|
||||
{regexp.MustCompile(`docker@build.syncthing\.net`), "Docker Hub"},
|
||||
{regexp.MustCompile(`docker@github.syncthing\.net`), "Docker Hub"},
|
||||
|
||||
{regexp.MustCompile(`android-builder@github\.syncthing\.net`), "Google Play"},
|
||||
{regexp.MustCompile(`android-.*teamcity@build\.syncthing\.net`), "Google Play"},
|
||||
{regexp.MustCompile(`android-.*vagrant@basebox-stretch64`), "F-Droid"},
|
||||
{regexp.MustCompile(`vagrant@bullseye`), "F-Droid"},
|
||||
{regexp.MustCompile(`builduser@(archlinux|svetlemodry)`), "Arch (3rd party)"},
|
||||
{regexp.MustCompile(`@debian`), "Debian (3rd party)"},
|
||||
{regexp.MustCompile(`@fedora`), "Fedora (3rd party)"},
|
||||
{regexp.MustCompile(`\bbrew@`), "Homebrew (3rd party)"},
|
||||
{regexp.MustCompile(`root@buildkitsandbox`), "LinuxServer.io (3rd party)"},
|
||||
{regexp.MustCompile(`.`), "Others"},
|
||||
}
|
||||
)
|
||||
@@ -1011,7 +1014,7 @@ func getSummary(db *sql.DB, min int) (summary, error) {
|
||||
ver = ver[:3] + "0" + ver[3:] // now v0.0x
|
||||
}
|
||||
|
||||
s.setCount(day.Format("2006-01-02"), ver, num)
|
||||
s.setCount(day.Format(time.DateOnly), ver, num)
|
||||
}
|
||||
|
||||
s.filter(min)
|
||||
@@ -1038,7 +1041,7 @@ func getPerformance(db *sql.DB) ([][]interface{}, error) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
row := []interface{}{day.Format("2006-01-02"), totFiles, totMiB, float64(int(sha256Perf*10)) / 10, memorySize, memoryUsage}
|
||||
row := []interface{}{day.Format(time.DateOnly), totFiles, totMiB, float64(int(sha256Perf*10)) / 10, memorySize, memoryUsage}
|
||||
res = append(res, row)
|
||||
}
|
||||
|
||||
@@ -1068,7 +1071,7 @@ func getBlockStats(db *sql.DB) ([][]interface{}, error) {
|
||||
continue
|
||||
}
|
||||
row := []interface{}{
|
||||
day.Format("2006-01-02"),
|
||||
day.Format(time.DateOnly),
|
||||
reports,
|
||||
pulled / blocksToGb,
|
||||
renamed / blocksToGb,
|
||||
|
||||
@@ -4,24 +4,24 @@ go 1.20
|
||||
|
||||
require (
|
||||
github.com/AudriusButkevicius/recli v0.0.7-0.20220911121932-d000ce8fbf0f
|
||||
github.com/alecthomas/kong v0.8.0
|
||||
github.com/alecthomas/kong v0.8.1
|
||||
github.com/calmh/incontainer v0.0.0-20221224152218-b3e71b103d7a
|
||||
github.com/calmh/xdr v1.1.0
|
||||
github.com/ccding/go-stun v0.1.4
|
||||
github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d // indirect
|
||||
github.com/cespare/xxhash/v2 v2.2.0 // indirect
|
||||
github.com/chmduquesne/rollinghash v4.0.0+incompatible
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 // indirect
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect
|
||||
github.com/d4l3k/messagediff v1.2.1
|
||||
github.com/flynn-archive/go-shlex v0.0.0-20150515145356-3f9db97f8568
|
||||
github.com/getsentry/raven-go v0.2.0
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.4 // indirect
|
||||
github.com/go-ldap/ldap/v3 v3.4.5
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.5 // indirect
|
||||
github.com/go-ldap/ldap/v3 v3.4.6
|
||||
github.com/gobwas/glob v0.2.3
|
||||
github.com/gogo/protobuf v1.3.2
|
||||
github.com/golang/snappy v0.0.4 // indirect
|
||||
github.com/greatroar/blobloom v0.7.2
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.6
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7
|
||||
github.com/jackpal/gateway v1.0.10
|
||||
github.com/jackpal/go-nat-pmp v1.0.2
|
||||
github.com/julienschmidt/httprouter v1.3.0
|
||||
@@ -35,26 +35,26 @@ require (
|
||||
github.com/oschwald/geoip2-golang v1.9.0
|
||||
github.com/pierrec/lz4/v4 v4.1.18
|
||||
github.com/pkg/errors v0.9.1 // indirect
|
||||
github.com/prometheus/client_golang v1.16.0
|
||||
github.com/prometheus/client_golang v1.17.0
|
||||
github.com/prometheus/common v0.44.0 // indirect
|
||||
github.com/prometheus/procfs v0.11.1 // indirect
|
||||
github.com/quic-go/quic-go v0.38.1
|
||||
github.com/prometheus/procfs v0.12.0 // indirect
|
||||
github.com/quic-go/quic-go v0.39.1
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475
|
||||
github.com/sasha-s/go-deadlock v0.3.1
|
||||
github.com/shirou/gopsutil/v3 v3.23.8
|
||||
github.com/shirou/gopsutil/v3 v3.23.9
|
||||
github.com/syncthing/notify v0.0.0-20210616190510-c6b7342338d2
|
||||
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
|
||||
github.com/thejerf/suture/v4 v4.0.2
|
||||
github.com/urfave/cli v1.22.14
|
||||
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0
|
||||
golang.org/x/crypto v0.13.0
|
||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9
|
||||
golang.org/x/mod v0.12.0 // indirect
|
||||
golang.org/x/net v0.15.0
|
||||
golang.org/x/sys v0.12.0
|
||||
golang.org/x/crypto v0.14.0
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d
|
||||
golang.org/x/mod v0.13.0 // indirect
|
||||
golang.org/x/net v0.17.0
|
||||
golang.org/x/sys v0.13.0
|
||||
golang.org/x/text v0.13.0
|
||||
golang.org/x/time v0.3.0
|
||||
golang.org/x/tools v0.13.0
|
||||
golang.org/x/tools v0.14.0
|
||||
google.golang.org/protobuf v1.31.0
|
||||
)
|
||||
|
||||
@@ -63,18 +63,19 @@ require (
|
||||
github.com/beorn7/perks v1.0.1 // indirect
|
||||
github.com/go-ole/go-ole v1.3.0 // indirect
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 // indirect
|
||||
github.com/golang/mock v1.6.0 // indirect
|
||||
github.com/golang/protobuf v1.5.3 // indirect
|
||||
github.com/google/pprof v0.0.0-20230907193218-d3ddc7976beb // indirect
|
||||
github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 // indirect
|
||||
github.com/google/uuid v1.3.1 // indirect
|
||||
github.com/matttproud/golang_protobuf_extensions v1.0.4 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.12.0 // indirect
|
||||
github.com/onsi/ginkgo/v2 v2.13.0 // indirect
|
||||
github.com/oschwald/maxminddb-golang v1.12.0 // indirect
|
||||
github.com/petermattis/goid v0.0.0-20230904192822-1876fd5063bc // indirect
|
||||
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b // indirect
|
||||
github.com/prometheus/client_model v0.4.0 // indirect
|
||||
github.com/prometheus/client_model v0.5.0 // indirect
|
||||
github.com/quic-go/qtls-go1-20 v0.3.4 // indirect
|
||||
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
||||
github.com/yusufpapurcu/wmi v1.2.3 // indirect
|
||||
go.uber.org/mock v0.3.0 // indirect
|
||||
)
|
||||
|
||||
// https://github.com/gobwas/glob/pull/55
|
||||
|
||||
@@ -4,8 +4,8 @@ github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+
|
||||
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
|
||||
github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ=
|
||||
github.com/alecthomas/assert/v2 v2.1.0 h1:tbredtNcQnoSd3QBhQWI7QZ3XHOVkw1Moklp2ojoH/0=
|
||||
github.com/alecthomas/kong v0.8.0 h1:ryDCzutfIqJPnNn0omnrgHLbAggDQM2VWHikE1xqK7s=
|
||||
github.com/alecthomas/kong v0.8.0/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U=
|
||||
github.com/alecthomas/kong v0.8.1 h1:acZdn3m4lLRobeh3Zi2S2EpnXTd1mOL6U7xVml+vfkY=
|
||||
github.com/alecthomas/kong v0.8.1/go.mod h1:n1iCIO2xS46oE8ZfYCNDqdR0b0wZNrXAIAqro/2132U=
|
||||
github.com/alecthomas/repr v0.1.0 h1:ENn2e1+J3k09gyj2shc0dHr/yjaWSHRlrJ4DPMevDqE=
|
||||
github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74 h1:Kk6a4nehpJ3UuJRqlA3JxYxBZEqCeOmATOvrbT4p9RA=
|
||||
github.com/alexbrainman/sspi v0.0.0-20210105120005-909beea2cc74/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
|
||||
@@ -28,8 +28,9 @@ github.com/chmduquesne/rollinghash v4.0.0+incompatible/go.mod h1:Uc2I36RRfTAf7Dg
|
||||
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
|
||||
github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI=
|
||||
github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2 h1:p1EgwI/C7NhT0JmVkwCD2ZBK8j4aeHQX2pMHHBfMQ6w=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM=
|
||||
github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o=
|
||||
github.com/d4l3k/messagediff v1.2.1 h1:ZcAIMYsUg0EAp9X+tt8/enBE/Q8Yd5kzPynLyKptt9U=
|
||||
github.com/d4l3k/messagediff v1.2.1/go.mod h1:Oozbb1TVXFac9FtSIxHBMnBCq2qeH/2KkEQxENCrlLo=
|
||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||
@@ -43,10 +44,10 @@ github.com/fsnotify/fsnotify v1.5.4 h1:jRbGcIw6P2Meqdwuo0H1p6JVLbL5DHKAKlYndzMwV
|
||||
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
|
||||
github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JYMGs=
|
||||
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.4 h1:vXT6d/FNDiELJnLb6hGNa309LMsrCoYFvpwHDF0+Y1A=
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.4/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
|
||||
github.com/go-ldap/ldap/v3 v3.4.5 h1:ekEKmaDrpvR2yf5Nc/DClsGG9lAmdDixe44mLzlW5r8=
|
||||
github.com/go-ldap/ldap/v3 v3.4.5/go.mod h1:bMGIq3AGbytbaMwf8wdv5Phdxz0FWHTIYMSzyrYgnQs=
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.5 h1:MNHlNMBDgEKD4TcKr36vQN68BA00aDfjIt3/bD50WnA=
|
||||
github.com/go-asn1-ber/asn1-ber v1.5.5/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
|
||||
github.com/go-ldap/ldap/v3 v3.4.6 h1:ert95MdbiG7aWo/oPYp9btL3KJlMPKnP58r09rI8T+A=
|
||||
github.com/go-ldap/ldap/v3 v3.4.6/go.mod h1:IGMQANNtxpsOzj7uUAMjpGBaOVTC4DYyIy8VsTdxmtc=
|
||||
github.com/go-logr/logr v1.2.4 h1:g01GSCwiDw2xSZfjJ2/T9M+S6pFdcNtFYsp+Y43HYDQ=
|
||||
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
|
||||
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
|
||||
@@ -56,8 +57,6 @@ github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572 h1:tfuBGBXKqDEe
|
||||
github.com/go-task/slim-sprig v0.0.0-20230315185526-52ccab3ef572/go.mod h1:9Pwr4B2jHnOSGXyyzV8ROjYa2ojvAY6HCGYYfMoC3Ls=
|
||||
github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q=
|
||||
github.com/gogo/protobuf v1.3.2/go.mod h1:P1XiOD3dCwIKUDQYPy72D8LYyHL2YPYrpS2s69NZV8Q=
|
||||
github.com/golang/mock v1.6.0 h1:ErTB+efbowRARo13NNdxyJji2egdxLGQhRaY+DUumQc=
|
||||
github.com/golang/mock v1.6.0/go.mod h1:p6yTPP+5HYm5mzsMV8JkE6ZKdX+/wYM6Hr+LicevLPs=
|
||||
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
|
||||
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
|
||||
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
|
||||
@@ -80,12 +79,14 @@ github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8
|
||||
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
|
||||
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
|
||||
github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE=
|
||||
github.com/google/pprof v0.0.0-20230907193218-d3ddc7976beb h1:LCMfzVg3sflxTs4UvuP4D8CkoZnfHLe2qzqgDn/4OHs=
|
||||
github.com/google/pprof v0.0.0-20230907193218-d3ddc7976beb/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98 h1:pUa4ghanp6q4IJHwE9RwLgmVFfReJN+KbQ8ExNEUUoQ=
|
||||
github.com/google/pprof v0.0.0-20230926050212-f7f687d19a98/go.mod h1:czg5+yv1E0ZGTi6S6vVK1mke0fV+FaUhNGcd6VRS9Ik=
|
||||
github.com/google/uuid v1.3.1 h1:KjJaJ9iWZ3jOFZIf1Lqf4laDRCasjl0BCmnEGxkdLb4=
|
||||
github.com/google/uuid v1.3.1/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
|
||||
github.com/greatroar/blobloom v0.7.2 h1:F30MGLHOcb4zr0pwCPTcKdlTM70rEgkf+LzdUPc5ss8=
|
||||
github.com/greatroar/blobloom v0.7.2/go.mod h1:mjMJ1hh1wjGVfr93QIHJ6FfDNVrA0IELv8OvMHJxHKs=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.6 h1:3xi/Cafd1NaoEnS/yDssIiuVeDVywU0QdFGl3aQaQHM=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.6/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7 h1:a+bsQ5rvGLjzHuww6tVxozPZFVghXaHOwFs4luLUK2k=
|
||||
github.com/hashicorp/golang-lru/v2 v2.0.7/go.mod h1:QeFd9opnmA6QUJc5vARoKUSoFhyfM2/ZepoAG6RGpeM=
|
||||
github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM=
|
||||
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
|
||||
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
|
||||
@@ -126,8 +127,8 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
|
||||
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
|
||||
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
|
||||
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
|
||||
github.com/onsi/ginkgo/v2 v2.12.0 h1:UIVDowFPwpg6yMUpPjGkYvf06K3RAiJXUhCxEwQVHRI=
|
||||
github.com/onsi/ginkgo/v2 v2.12.0/go.mod h1:ZNEzXISYlqpb8S36iN71ifqLi3vVD1rVJGvWRCJOUpQ=
|
||||
github.com/onsi/ginkgo/v2 v2.13.0 h1:0jY9lJquiL8fcf3M4LAXN5aMlS/b2BV86HFFPCPMgE4=
|
||||
github.com/onsi/ginkgo/v2 v2.13.0/go.mod h1:TE309ZR8s5FsKKpuB1YAQYBzCaAfUgatB/xlT/ETL/o=
|
||||
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
|
||||
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
|
||||
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
|
||||
@@ -150,18 +151,18 @@ github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZN
|
||||
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b h1:0LFwY6Q3gMACTjAbMZBjXAqTOzOwFaj2Ld6cjeQ7Rig=
|
||||
github.com/power-devops/perfstat v0.0.0-20221212215047-62379fc7944b/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
|
||||
github.com/prometheus/client_golang v1.16.0 h1:yk/hx9hDbrGHovbci4BY+pRMfSuuat626eFsHb7tmT8=
|
||||
github.com/prometheus/client_golang v1.16.0/go.mod h1:Zsulrv/L9oM40tJ7T815tM89lFEugiJ9HzIqaAx4LKc=
|
||||
github.com/prometheus/client_model v0.4.0 h1:5lQXD3cAg1OXBf4Wq03gTrXHeaV0TQvGfUooCfx1yqY=
|
||||
github.com/prometheus/client_model v0.4.0/go.mod h1:oMQmHW1/JoDwqLtg57MGgP/Fb1CJEYF2imWWhWtMkYU=
|
||||
github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q=
|
||||
github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY=
|
||||
github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw=
|
||||
github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI=
|
||||
github.com/prometheus/common v0.44.0 h1:+5BrQJwiBB9xsMygAB3TNvpQKOwlkc25LbISbrdOOfY=
|
||||
github.com/prometheus/common v0.44.0/go.mod h1:ofAIvZbQ1e/nugmZGz4/qCb9Ap1VoSTIO7x0VV9VvuY=
|
||||
github.com/prometheus/procfs v0.11.1 h1:xRC8Iq1yyca5ypa9n1EZnWZkt7dwcoRPQwX/5gwaUuI=
|
||||
github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY=
|
||||
github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo=
|
||||
github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.4 h1:MfFAPULvst4yoMgY9QmtpYmfij/em7O8UUi+bNVm7Cg=
|
||||
github.com/quic-go/qtls-go1-20 v0.3.4/go.mod h1:X9Nh97ZL80Z+bX/gUXMbipO6OxdiDi58b/fMC9mAL+k=
|
||||
github.com/quic-go/quic-go v0.38.1 h1:M36YWA5dEhEeT+slOu/SwMEucbYd0YFidxG3KlGPZaE=
|
||||
github.com/quic-go/quic-go v0.38.1/go.mod h1:ijnZM7JsFIkp4cRyjxJNIzdSfCLmUMg9wdyhGmg+SN4=
|
||||
github.com/quic-go/quic-go v0.39.1 h1:d/m3oaN/SD2c+f7/yEjZxe2zEVotXprnrCCJ2y/ZZFE=
|
||||
github.com/quic-go/quic-go v0.39.1/go.mod h1:T09QsDQWjLiQ74ZmacDfqZmhY/NLnw5BC40MANNNZ1Q=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM=
|
||||
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
|
||||
github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk=
|
||||
@@ -169,8 +170,8 @@ github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQD
|
||||
github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0=
|
||||
github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM=
|
||||
github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8=
|
||||
github.com/shirou/gopsutil/v3 v3.23.8 h1:xnATPiybo6GgdRoC4YoGnxXZFRc3dqQTGi73oLvvBrE=
|
||||
github.com/shirou/gopsutil/v3 v3.23.8/go.mod h1:7hmCaBn+2ZwaZOr6jmPBZDfawwMGuo1id3C6aM8EDqQ=
|
||||
github.com/shirou/gopsutil/v3 v3.23.9 h1:ZI5bWVeu2ep4/DIxB4U9okeYJ7zp/QLTO4auRb/ty/E=
|
||||
github.com/shirou/gopsutil/v3 v3.23.9/go.mod h1:x/NWSb71eMcjFIO0vhyGW5nZ7oSIgVjrCnADckb85GA=
|
||||
github.com/shoenig/go-m1cpu v0.1.6/go.mod h1:1JJMcUBvfNwpq05QDQVAnx3gUHr9IYF7GNg9SUEw2VQ=
|
||||
github.com/shoenig/test v0.6.4/go.mod h1:byHiCGXqrVaflBLAMq/srcZIHynQPQgeyvkvXnjqq0k=
|
||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||
@@ -198,26 +199,26 @@ github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0 h1:okhMind4q9H1OxF44gN
|
||||
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0/go.mod h1:TTbGUfE+cXXceWtbTHq6lqcTvYPBKLNejBEbnUsQJtU=
|
||||
github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
|
||||
github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k=
|
||||
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
|
||||
github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw=
|
||||
github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
|
||||
go.uber.org/mock v0.3.0 h1:3mUxI1No2/60yUYax92Pt8eNOEecx2D3lcXZh2NEZJo=
|
||||
go.uber.org/mock v0.3.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
|
||||
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
|
||||
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
|
||||
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
|
||||
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
|
||||
golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU=
|
||||
golang.org/x/crypto v0.13.0 h1:mvySKfSWJ+UKUii46M40LOvyWfN0s2U+46/jDd0e6Ck=
|
||||
golang.org/x/crypto v0.13.0/go.mod h1:y6Z2r+Rw4iayiXXAIxJIDAJ1zMW4yaTpebo8fPOliYc=
|
||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g=
|
||||
golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k=
|
||||
golang.org/x/crypto v0.14.0 h1:wBqGXzWJW6m1XrIKlAH0Hs1JJ7+9KBwnIO8v66Q9cHc=
|
||||
golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4=
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d h1:jtJma62tbqLibJ5sFQz8bKtEM8rJBtfilJ2qTU199MI=
|
||||
golang.org/x/exp v0.0.0-20231006140011-7918f672742d/go.mod h1:ldy0pHrwJyGW56pPQzzkH36rKxoZW1tw7ZJpeKx+hdo=
|
||||
golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
|
||||
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
|
||||
golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.12.0 h1:rmsUpXtvNzj340zd98LZ4KntptpfRHwpFOHG188oHXc=
|
||||
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
|
||||
golang.org/x/mod v0.13.0 h1:I/DsJXRlw/8l/0c24sM9yb0T4z9liZTduXvdAWYiysY=
|
||||
golang.org/x/mod v0.13.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
|
||||
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
|
||||
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
|
||||
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
|
||||
@@ -225,24 +226,22 @@ golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLL
|
||||
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
|
||||
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
|
||||
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
|
||||
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
|
||||
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
|
||||
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
|
||||
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
|
||||
golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs=
|
||||
golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc=
|
||||
golang.org/x/net v0.15.0 h1:ugBLEUaxABaB5AJqW9enI0ACdci2RUd4eP51NTBvuJ8=
|
||||
golang.org/x/net v0.15.0/go.mod h1:idbUs1IY1+zTqbi8yxTbhexhEEk5ur9LInksu6HrEpk=
|
||||
golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg=
|
||||
golang.org/x/net v0.17.0 h1:pVaXccu2ozPjCXewfr1S7xza/zcXTity9cCdXQYSjIM=
|
||||
golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE=
|
||||
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20190911185100-cd5d95a43a6e/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
|
||||
golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
|
||||
golang.org/x/sync v0.4.0 h1:zxkM55ReGkDlKSM+Fu41A+zmbZuaPVbGMzvvdUPznYQ=
|
||||
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
|
||||
@@ -257,9 +256,7 @@ golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7w
|
||||
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20201204225414-ed752295db88/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
|
||||
golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.0.0-20210927094055-39ccf1dd6fa6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
@@ -270,21 +267,22 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
|
||||
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.5.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.12.0 h1:CM0HF96J0hcLAwsHPJZjfdNzs0gftsLfgKt57wWHJ0o=
|
||||
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/sys v0.13.0 h1:Af8nKPmuFypiUBjVoU9V20FiaFXOcuZI21p0ycVYYGE=
|
||||
golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
|
||||
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
|
||||
golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k=
|
||||
golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U=
|
||||
golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo=
|
||||
golang.org/x/term v0.12.0/go.mod h1:owVbMEjm3cBLCHdkQu9b1opXd4ETQWc3BhuQGKgXgvU=
|
||||
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
|
||||
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
|
||||
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
|
||||
golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8=
|
||||
golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8=
|
||||
golang.org/x/text v0.13.0 h1:ablQoSUd0tRdKxZewP80B+BaqeKJuVhuRxj/dkrun3k=
|
||||
golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE=
|
||||
golang.org/x/time v0.3.0 h1:rg5rLMjNzMS1RkNLzCG38eapWhnYLFYXDXj2gOlr8j4=
|
||||
@@ -294,11 +292,10 @@ golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtn
|
||||
golang.org/x/tools v0.0.0-20200619180055-7c47624df98f/go.mod h1:EkVYQZoAsY45+roYkvgYkIh4xh/qjgUK9TdY2XT94GE=
|
||||
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
|
||||
golang.org/x/tools v0.1.1/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk=
|
||||
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
|
||||
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
|
||||
golang.org/x/tools v0.13.0 h1:Iey4qkscZuv0VvIt8E0neZjtPVQFSc870HQ448QgEmQ=
|
||||
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
|
||||
golang.org/x/tools v0.14.0 h1:jvNa2pY0M4r62jkRQ6RwEZZyPcymeL9XZMLBbV7U2nc=
|
||||
golang.org/x/tools v0.14.0/go.mod h1:uYBEerGOWcJyEORxN+Ek8+TT266gXkNlHdJBwexUsBg=
|
||||
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
|
||||
|
||||
@@ -1,20 +1,78 @@
|
||||
{
|
||||
"A device with that ID is already added.": "Прылада з гэтым ID ужо існуе.",
|
||||
"A negative number of days doesn't make sense.": "Адмоўная лічба дзён не мае сэнсу.",
|
||||
"A new major version may not be compatible with previous versions.": "Апошняе вялікае абнаўленне можа быць не сумяшчальным з старэйшымі версіямі.",
|
||||
"API Key": "Ключ API",
|
||||
"About": "Аб праграме",
|
||||
"Action": "Дзеянне",
|
||||
"Actions": "Дзеянні",
|
||||
"Active filter rules": "Прымяніць фільтры",
|
||||
"Add": "Дадаць",
|
||||
"Add Device": "Дадаць прыладу",
|
||||
"Add Folder": "Дадаць каталёг",
|
||||
"Add Remote Device": "Дадаць Выдаленную Прыладу",
|
||||
"Add devices from the introducer to our device list, for mutually shared folders.": "Дадаваць прылады з давераннага спісу прылад, для узаемнага абмену дырэкторыямі.",
|
||||
"Add filter entry": "Дадаць пункт для фільтраў",
|
||||
"Add ignore patterns": "Дадаць ігнаруемыя патэрны",
|
||||
"Add new folder?": "Дадаць новы каталёг ?",
|
||||
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Дадаткова інтэрвал паўторнага сканавання будзе павялічаны (60 разоў, тады 1ч новае значэнне па змаўчанні). Вы можаце наладзіць гэта ўласнаручна для кожнай дырэкторыі пасля выбара Не.",
|
||||
"Address": "Адрас",
|
||||
"Addresses": "Адрасы",
|
||||
"Allow Anonymous Usage Reporting?": "Allow Anonymous Usage Reporting?",
|
||||
"Anonymous Usage Reporting": "Anonymous Usage Reporting",
|
||||
"Advanced": "Дадатковыя",
|
||||
"Advanced Configuration": "Дадатковая Канфігурацыя",
|
||||
"All Data": "Усе Дадзеныя",
|
||||
"All Time": "Увесь Час",
|
||||
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Усе дырэкторыі якія аб'яднаныя з гэтай прыладай павінны быць абаронены паролем, каб усе аб'ядноўваемыя дадзеныя былі недасягальны бяз дадзенага паролю.",
|
||||
"Allow Anonymous Usage Reporting?": "Дазволіць Ананімную Спрадвыздачу Аб Выкарыстанні?",
|
||||
"Allowed Networks": "Дазволеныя Сеткі",
|
||||
"Alphabetic": "Па Алфавіту",
|
||||
"Altered by ignoring deletes.": "Зменена з-за ігнаравання выдаленняў.",
|
||||
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Знешняя каманда утрымлівае версіянаванне. Яно патрабуе выдалення файла з агульнай дырэкторыі. Калі шлях да прыкладання ўтрымлівае прабелы, трэба іх выдаліць.",
|
||||
"Anonymous Usage Reporting": "Ананімная Спрадвыздача Аб Выкарыстанні",
|
||||
"Anonymous usage report format has changed. Would you like to move to the new format?": "Фармат ананімнай спрадвыздачы аб выкарыстанні быў зменены. Ці жадаеце вы выкарыстоўваць новы фармат?",
|
||||
"Applied to LAN": "Прыменена да LAN",
|
||||
"Apply": "Прымяніць",
|
||||
"Are you sure you want to override all remote changes?": "Вы ўпэўнены, што жадаеце перавызначыць усе не лакальныя змены?",
|
||||
"Are you sure you want to permanently delete all these files?": "Вы сапраўды жадаеце выдаліць усе гэтыя файлы беззваротна?",
|
||||
"Are you sure you want to remove device {%name%}?": "Вы сапраўды жадаеце выдаліць прыладу {{name}}?",
|
||||
"Are you sure you want to remove folder {%label%}?": "Вы сапраўды жадаеце выдаліць дырэкторыю {{label}}?",
|
||||
"Are you sure you want to restore {%count%} files?": "Вы сапраўды жадаеце аднавіць {{count}} файл(ы)?",
|
||||
"Are you sure you want to revert all local changes?": "Вы сапраўды жадаеце адмяніць усе лакальныя змены?",
|
||||
"Are you sure you want to upgrade?": "Вы сапраўды жадаеце абнавіць?",
|
||||
"Authors": "Аўтары",
|
||||
"Auto Accept": "Прынімаць Аўтаматычна",
|
||||
"Automatic Crash Reporting": "Аўтаматычныя Спрадвыздачы Пра Памылкі",
|
||||
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Аўтаматычнае абнаўленне цяпер прапаноўвае выбар паміж стабільнымі зборкамі і сборкамі якія ўвайдуць у стабільныя с цягам часу.",
|
||||
"Automatic upgrades": "Аўтаматычныя абнаўленні",
|
||||
"Automatic upgrades are always enabled for candidate releases.": "Аўтаматычныя абнаўленні заўсёды ўключаны для версій якія плануюцца да дабаўлення ў стабільныя зборкі.",
|
||||
"Automatically create or share folders that this device advertises at the default path.": "Аўтаматычна ствараць або абагульняць дырэкторыі якія гэта прылада прапаноўвае ў стандартным шляху.",
|
||||
"Available debug logging facilities:": "Даступныя адладкавыя лагіруемыя аб'екты:",
|
||||
"Be careful!": "Будзьце ўважлівымі!",
|
||||
"Body:": "Цела:",
|
||||
"Bugs": "Памылкі",
|
||||
"Cancel": "Адмяніць",
|
||||
"Changelog": "Сьпіс зьменаў",
|
||||
"Clean out after": "Ачысціць пасля",
|
||||
"Cleaning Versions": "Ачышчаныя Версіі",
|
||||
"Cleanup Interval": "Ачысціць Інтэрвал",
|
||||
"Click to see full identification string and QR code.": "Нажміце каб убачыць індэнтыфікатар карыстальніка і QR код.",
|
||||
"Close": "Зачыніць",
|
||||
"Comment, when used at the start of a line": "Comment, when used at the start of a line",
|
||||
"Connection Error": "Connection Error",
|
||||
"Command": "Каманда",
|
||||
"Comment, when used at the start of a line": "Закаментаваць, калі выкарыстоўваецца ў пачатку стракі",
|
||||
"Compression": "Якасць Сціскання",
|
||||
"Configuration Directory": "Дырэкторыя Канфігурацыі",
|
||||
"Configuration File": "Канфігурацыйны Файл",
|
||||
"Configured": "Сканфігураваны",
|
||||
"Connected (Unused)": "Падлучана (Не выкарыстоўваецца)",
|
||||
"Connection Error": "Памылка Падлучэння",
|
||||
"Connection Management": "Кіраванне Падлучэннямі",
|
||||
"Connection Type": "Тып Падлучэння",
|
||||
"Connections": "Падлучэнні",
|
||||
"Connections via relays might be rate limited by the relay": "Падлучэнні праз рэтранслятар могуць быць абмежаванымі самім рэтранслятарам",
|
||||
"Copied from original": "Скапіявана з арыгіналу",
|
||||
"Copied!": "Скапіявана!",
|
||||
"Copy": "Скапіяваць",
|
||||
"Copy failed! Try to select and copy manually.": "Капіяванне не адбылося! Паспрабуйце вылучыць і скапіяваць уласнаручна.",
|
||||
"Danger!": "Небязпечна!",
|
||||
"Delete": "Выдаліць",
|
||||
"Device ID": "ID прылады",
|
||||
@@ -27,22 +85,22 @@
|
||||
"Edit": "Зьмяніць",
|
||||
"Edit Device": "Зьмяніць прыладу",
|
||||
"Edit Folder": "Зьмяніць каталёг",
|
||||
"Enter ignore patterns, one per line.": "Enter ignore patterns, one per line.",
|
||||
"Enter ignore patterns, one per line.": "Увесці ігнаруемыя ключы, адзін на адну страку.",
|
||||
"Error": "Памылка",
|
||||
"File Versioning": "Вэрсіі файлаў",
|
||||
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.",
|
||||
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Файлы ахаваныя ад змен з боку другіх прылад, але змены на гэтай прыладзе будуць адпраўлены ўсім астатнім.",
|
||||
"Folder ID": "ID каталёгу",
|
||||
"Folder Path": "Шлях каталёгу",
|
||||
"Folders": "Каталёгі",
|
||||
"GUI Authentication Password": "GUI Authentication Password",
|
||||
"GUI Authentication User": "GUI Authentication User",
|
||||
"GUI Authentication Password": "Аутэнтыфікацыйны Пароль Для GUI",
|
||||
"GUI Authentication User": "Аутэнтыфікацыйны Карыстальнік Для GUI",
|
||||
"Generate": "Сгенераваць",
|
||||
"Global Discovery": "Глябальнае вызначэньне",
|
||||
"Global State": "Глябальны стан",
|
||||
"Ignore Patterns": "Ігнараваць шаблёны",
|
||||
"Ignore Permissions": "Ігнараваць правы",
|
||||
"Incoming Rate Limit (KiB/s)": "Incoming Rate Limit (KiB/s)",
|
||||
"Introducer": "Introducer",
|
||||
"Incoming Rate Limit (KiB/s)": "Абмежаванне Хуткасці Заладоўкі (КіБ/с)",
|
||||
"Introducer": "Давяраць",
|
||||
"Inversion of the given condition (i.e. do not exclude)": "Inversion of the given condition (i.e. do not exclude)",
|
||||
"Keep Versions": "Трымаць вэрсій",
|
||||
"LDAP": "LDAP",
|
||||
@@ -95,7 +153,7 @@
|
||||
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…",
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.",
|
||||
"The device ID cannot be blank.": "The device ID cannot be blank.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.",
|
||||
"The folder ID cannot be blank.": "The folder ID cannot be blank.",
|
||||
"The folder ID must be unique.": "The folder ID must be unique.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Сигурни ли сте, че желаете {{count}} файла да бъдат възстановени?",
|
||||
"Are you sure you want to revert all local changes?": "Сигурни ли сте, че желаете всички местни промени да бъдат отменени?",
|
||||
"Are you sure you want to upgrade?": "Желаете ли приложението да бъде обновено?",
|
||||
"Authentication Required": "Необходимо е удостоверяване",
|
||||
"Authors": "Автори",
|
||||
"Auto Accept": "Автоматично приемане",
|
||||
"Automatic Crash Reporting": "Автоматично изпращане на доклад за срив",
|
||||
@@ -60,11 +61,12 @@
|
||||
"Command": "Команда",
|
||||
"Comment, when used at the start of a line": "Коментар, когато се използва в началото на реда",
|
||||
"Compression": "Компресиране",
|
||||
"Configuration Directory": "Папка с настройките",
|
||||
"Configuration Directory": "Папка с настройки",
|
||||
"Configuration File": "Файл с настройки",
|
||||
"Configured": "Настроен",
|
||||
"Connected (Unused)": "Свързано (неизползвано)",
|
||||
"Connection Error": "Грешка при осъществяване на връзка",
|
||||
"Connection Management": "Управление на връзките",
|
||||
"Connection Type": "Вид на връзката",
|
||||
"Connections": "Връзки",
|
||||
"Connections via relays might be rate limited by the relay": "Препращаните връзки могат да бъдат обект на ограничения от препращащото устройство",
|
||||
@@ -77,7 +79,7 @@
|
||||
"Currently Shared With Devices": "Устройства, с които е споделена",
|
||||
"Custom Range": "В периода",
|
||||
"Danger!": "Опасност!",
|
||||
"Database Location": "Местоположение на банката от данни",
|
||||
"Database Location": "Местоположение на хранилището",
|
||||
"Debugging Facilities": "Отстраняване на дефекти",
|
||||
"Default": "По подразбиране",
|
||||
"Default Configuration": "Настройки по подразбиране",
|
||||
@@ -173,13 +175,13 @@
|
||||
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Грешка при започване на наблюдението за промени на следните папки. Всяка минута ще бъде извършван нов опит, така че грешката скоро може да изчезне. Ако все пак не изчезне, отстранете нейната първопричина или потърсете помощ ако не съумявате.",
|
||||
"Forever": "Завинаги",
|
||||
"Full Rescan Interval (s)": "Интервал на пълно обхождане (секунди)",
|
||||
"GUI": "Графичен интерфейс",
|
||||
"GUI": "Интерфейс",
|
||||
"GUI / API HTTPS Certificate": "Сертификат на интерфейса / ППИ през HTTPS",
|
||||
"GUI Authentication Password": "Парола за интерфейса",
|
||||
"GUI Authentication User": "Потребител за интерфейса",
|
||||
"GUI Authentication: Set User and Password": "Удостоверяване на графичния интерфейс: потребител и парола",
|
||||
"GUI Listen Address": "Адрес на слушане",
|
||||
"GUI Override Directory": "Папка за заменяне на интерфейса",
|
||||
"GUI Override Directory": "Папка за промяна на интерфейса",
|
||||
"GUI Theme": "Тема на графичния интерфейс",
|
||||
"General": "Общи",
|
||||
"Generate": "Подновяване",
|
||||
@@ -200,9 +202,10 @@
|
||||
"Ignored Devices": "Пренебрегнати устройства",
|
||||
"Ignored Folders": "Пренебрегнати папки",
|
||||
"Ignored at": "Пренебрегнато на",
|
||||
"Included Software": "Включен софтуер",
|
||||
"Included Software": "Използван софтуер",
|
||||
"Incoming Rate Limit (KiB/s)": "Ограничение при изтегляне (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Неправилни настройки могат да повредят файлове и да попречат на синхронизирането.",
|
||||
"Incorrect user name or password.": "Грешно потребителско име или парола.",
|
||||
"Internally used paths:": "Вътрешно използвани пътища:",
|
||||
"Introduced By": "Предложено от",
|
||||
"Introducer": "Поръчител",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Местно променени",
|
||||
"Log": "Дневник",
|
||||
"Log File": "Дневник",
|
||||
"Log In": "Вход",
|
||||
"Log Out": "Изход",
|
||||
"Log in to see paths information.": "Влезте, за да видите пътищата.",
|
||||
"Log in to see version information.": "Влезте, за да видите изданията.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Добавяне на редове към дневника е спряно. Плъзнете най-долу за да продължи.",
|
||||
"Login failed, see Syncthing logs for details.": "Грешка при вход, за подробности проверете в дневника на Syncthing.",
|
||||
"Logs": "Дневници",
|
||||
"Major Upgrade": "Обновяване на значимо издание",
|
||||
"Mass actions": "Мащабни действия",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Без обновяване",
|
||||
"Not shared": "Не споделена",
|
||||
"Notice": "Известие",
|
||||
"Number of Connections": "Брой на връзките",
|
||||
"OK": "Добре",
|
||||
"Off": "Изключено",
|
||||
"Oldest First": "Първо най-стари",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Налагане",
|
||||
"Override Changes": "Налагане на местни промени",
|
||||
"Ownership": "Собственост",
|
||||
"Password": "Парола",
|
||||
"Path": "Път",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Път до папката на това устройство. Ако не съществува ще бъде създадена. Символът тилда (~) може да бъде използван вместо",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Папка, в която да бъдат запазвани версиите (оставете празно за подразбираната директория .stversions в споделената папка).",
|
||||
@@ -307,7 +317,7 @@
|
||||
"Release Notes": "Бележки по изданието",
|
||||
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "Предварителните издания съдържат най-новите възможности и поправки. Те са близки до традиционните, два пъти в седмицата, издания на Synchthing.",
|
||||
"Remote Devices": "Отдалечени устройства",
|
||||
"Remote GUI": "Отдалечен графичен интерфейс",
|
||||
"Remote GUI": "Отдалечен интерфейс",
|
||||
"Remove": "Премахване",
|
||||
"Remove Device": "Премахване на устройство",
|
||||
"Remove Folder": "Премахване на папка",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Настройките са запазени, но не са приложени. За да влязат в сила Syncthing трябва да се рестартира.",
|
||||
"The device ID cannot be blank.": "Полето идентификатор на устройство не може да бъде празно.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Идентификаторът на устройството, който да въведете се намира в „Действия > Идентификатор“. Интервалите и дефисите са незадължителни.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Шифрованият отчет за употреба се изпраща ежедневно. Използва се за отчитане на най-често срещаните платформи, размери на папки и издания на приложението. При промяна в събираните данни отново ще бъде поискано вашето съгласие.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Шифрованият отчет за употреба се изпраща ежедневно. Използва се за отчитане на най-често срещаните платформи, размери на папки и издания на приложението. При промяна в събираните данни отново ще бъде поискано вашето съгласие.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Въведеният идентификатор на устройство не е валиден. Трябва да бъде 52 или 56 символа и да се състои от букви и цифри, като интервалите и дефисите са незадължителни.",
|
||||
"The folder ID cannot be blank.": "Полето идентификатор на папка не може да бъде празно.",
|
||||
"The folder ID must be unique.": "Идентификаторът на папката трябва да бъде уникален.",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Интервал, в секунди, на почистване на папката с версии. Нула изключва периодичното почистване.",
|
||||
"The maximum age must be a number and cannot be blank.": "Максималната възраст трябва да е число, полето не може да бъде празно.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Максимална продължителност за пазене на версия (в дни, за да не бъдат изтривани версии задайте 0).",
|
||||
"The number of connections must be a non-negative number.": "Броят на връзките трябва да бъде положително число.",
|
||||
"The number of days must be a number and cannot be blank.": "Броят дни трябва да бъде число и не може да бъде празно.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Брой дни за пазене на файловете в кошчето. Нула значи завинаги.",
|
||||
"The number of old versions to keep, per file.": "Брой стари версии, които да бъдат пазени за всеки файл.",
|
||||
"The number of versions must be a number and cannot be blank.": "Броят версии трябва да бъде число и не може да бъде празно.",
|
||||
"The path cannot be blank.": "Пътят не може да бъде празен.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Ограничението се прилага към общия трафик от всички връзки към това устройство.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Ограничението на скоростта трябва да бъде положително число (0: неограничено)",
|
||||
"The remote device has not accepted sharing this folder.": "Отдалеченото устройство не е приело да споделя папката.",
|
||||
"The remote device has paused this folder.": "Отдалеченото устройство е оставило на пауза папката.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Отчитането на употребата винаги е включено за предварителни издания.",
|
||||
"Use HTTPS for GUI": "Графичният интерфейс работи под HTTPS",
|
||||
"Use notifications from the filesystem to detect changed items.": "Използва съобщения от файловата система, за да открива променени елементи.",
|
||||
"User": "Потребител",
|
||||
"User Home": "Папка на потребителя",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Потребителският интерфейс не е защитен с потребителско име и парола. Настройте защита.",
|
||||
"Using a QUIC connection over LAN": "Използване на връзка чрез QUIC в LAN",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Наблюдението за промени открива повечето изменения без периодични обхождания.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Когато добавяте ново устройство имайте предвид, че то също трябва да бъде добавено от другата страна.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Като добавяте папката имайте предвид, че той се използва за еднозначно указване на папката между устройствата. Има разлика в регистъра на знаците и трябва изцяло да съвпада между всички устройства.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Когато стойността е повече от едно на две устройства, Syncthing ще установи няколко едновременни връзки. Ако стойностите се различават, ще използва по-голямата. Задайте нула, за да оставите Syncthing да прецени.",
|
||||
"Yes": "Да",
|
||||
"Yesterday": "Вчера",
|
||||
"You can also copy and paste the text into a new message manually.": "Също така можете ръчно да копирате и поставите текста в ново съобщение.",
|
||||
|
||||
@@ -405,7 +405,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configuració s'ha guardar però no s'ha activat. S'ha de reiniciar el synthing per activar la nova configuració.",
|
||||
"The device ID cannot be blank.": "El ID del dispositiu no pot estar en blanc.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "L'identificador del dispositiu que cal introduir aquí es pot trobar al diàleg \"Accions > Mostra l'ID\" de l'altre dispositiu. Els espais i els guions són opcionals (ignorats).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "L'informe d'ús encriptat s'envia diàriament. Es fa servir per rastrejar plataformes habituals, mides de carpetes i versions de l'aplicació. Si es canvia el conjunt de dades reportades es demanarà amb aquest diàleg de nou.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "L'informe d'ús encriptat s'envia diàriament. Es fa servir per rastrejar plataformes habituals, mides de carpetes i versions de l'aplicació. Si es canvia el conjunt de dades reportades es demanarà amb aquest diàleg de nou.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "El ID del dispositiu introduït no sembla vàlid. Hauria de tenir 52 o 56 caràcters amb lletres i números, els espais i les barres son opcionals.",
|
||||
"The folder ID cannot be blank.": "El ID del dispositiu no pot estar en blanc.",
|
||||
"The folder ID must be unique.": "El ID de la carpeta ha de ser únic.",
|
||||
|
||||
@@ -405,7 +405,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configuració ha sigut gravada però no activada. Syncthing deu reiniciar per tal d'activar la nova configuració.",
|
||||
"The device ID cannot be blank.": "L'ID del dispositiu no pot estar buida.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "L'ID del dispositiu que hi ha que introduïr ací es pot trobar en el menú \"Accions > Mostrar ID\" en l'altre dispositiu. Els espais i les barres son opcionals (ignorats).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "L'informe d'ús xifrat s'envia diàriament. S'utilitza per fer un seguiment de plataformes habituals, mides de carpetes i versions d'aplicacions. Si es canvia el conjunt de dades informat, se us demanarà de nou aquest diàleg.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "L'informe d'ús xifrat s'envia diàriament. S'utilitza per fer un seguiment de plataformes habituals, mides de carpetes i versions d'aplicacions. Si es canvia el conjunt de dades informat, se us demanarà de nou aquest diàleg.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "L'ID del dispositiu introduïda no pareix vàlida. Deuria ser una cadena de 52 o 56 caracters consistents en lletres i nombre, amb espais i barres opcionals.",
|
||||
"The folder ID cannot be blank.": "L'ID de la carpeta no pot estar buit.",
|
||||
"The folder ID must be unique.": "L'ID de la carpeta deu ser única.",
|
||||
|
||||
@@ -375,7 +375,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Nastavení byla uložena, ale nejsou aktivována. Pro aktivaci nového nastavení je třeba Syncthing restartovat.",
|
||||
"The device ID cannot be blank.": "Identifikátor zařízení nemůže zůstat nevyplněný.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Identifikátor zařízení, který je třeba vložit, lze nalézt v dialogu „Akce > Zobrazit identifikátor“ na druhém zařízení. Mezery a pomlčky nejsou nutné (budou ignorovány).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Šifrovaná data o využití jsou zasílána denně. Jsou používána pro zjištění nejobvyklejších platforem, velikosti složek a verzí aplikace. Pokud se rozsah hlášených dat změní, budete opět upozorněni tímto dialogem.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Šifrovaná data o využití jsou zasílána denně. Jsou používána pro zjištění nejobvyklejších platforem, velikosti složek a verzí aplikace. Pokud se rozsah hlášených dat změní, budete opět upozorněni tímto dialogem.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Zadaný identifikátor zařízení není platný. Měl by mít 52 nebo 56 znaků a měl by obsahovat písmena a číslice. Mezery a pomlčky jsou nepovinné.",
|
||||
"The folder ID cannot be blank.": "Identifikátor složky nemůže zůstat nevyplněný.",
|
||||
"The folder ID must be unique.": "Je třeba, aby se identifikátor složky neopakoval.",
|
||||
|
||||
@@ -30,6 +30,7 @@
|
||||
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "En ekstern kommando styrer versioneringen. Den skal fjerne filen fra den delte mappe. Hvis stien til programmet indeholder mellemrum, bør den sættes i anførselstegn.",
|
||||
"Anonymous Usage Reporting": "Anonym brugerstatistik",
|
||||
"Anonymous usage report format has changed. Would you like to move to the new format?": "Formatet for anonym brugerstatistik er ændret. Vil du flytte til det nye format?",
|
||||
"Applied to LAN": "Anvendt til LAN",
|
||||
"Apply": "Anvend",
|
||||
"Are you sure you want to override all remote changes?": "Tilsidesæt alle eksterne ændringer?",
|
||||
"Are you sure you want to permanently delete all these files?": "Slette valgte filer permanent?",
|
||||
@@ -38,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Er du sikker på, at du vil genskabe {{count}} filer?",
|
||||
"Are you sure you want to revert all local changes?": "Er du sikker på, at du vil tilbagerulle alle lokale ændringer?",
|
||||
"Are you sure you want to upgrade?": "Er du sikker på, at du vil opgradere?",
|
||||
"Authentication Required": "Godkendelse nødvendig",
|
||||
"Authors": "Forfattere",
|
||||
"Auto Accept": "Autoacceptér",
|
||||
"Automatic Crash Reporting": "Automatisk nedbrudsrapportering",
|
||||
@@ -64,6 +66,7 @@
|
||||
"Configured": "Konfigureret",
|
||||
"Connected (Unused)": "Tilsluttet (ubrugt)",
|
||||
"Connection Error": "Tilslutnings fejl",
|
||||
"Connection Management": "Tilslutningsadministration",
|
||||
"Connection Type": "Tilslutningstype",
|
||||
"Connections": "Forbindelser",
|
||||
"Connections via relays might be rate limited by the relay": "Forbindelser via relæer kan være hastighedsbegrænsede af relæet",
|
||||
@@ -202,9 +205,11 @@
|
||||
"Included Software": "Inkluderet software",
|
||||
"Incoming Rate Limit (KiB/s)": "Indgående hastighedsbegrænsning (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Ukorrekt opsætning kan skade dine data og gøre Syncthing ude af stand til at fungere.",
|
||||
"Incorrect user name or password.": "Forkert brugernavn eller adgangskode.",
|
||||
"Internally used paths:": "Intern brugte stier:",
|
||||
"Introduced By": "Introduceret af",
|
||||
"Introducer": "Introducerende enhed",
|
||||
"Introduction": "Introduktion",
|
||||
"Inversion of the given condition (i.e. do not exclude)": "Det omvendte (dvs. undlad ikke)",
|
||||
"Keep Versions": "Behold versioner",
|
||||
"LDAP": "LDAP",
|
||||
@@ -230,7 +235,12 @@
|
||||
"Locally Changed Items": "Lokalt ændrede filer",
|
||||
"Log": "Logbog",
|
||||
"Log File": "Log fil",
|
||||
"Log In": "Log ind",
|
||||
"Log Out": "Log ud",
|
||||
"Log in to see paths information.": "Log ind for at se stier-oplysninger.",
|
||||
"Log in to see version information.": "Log ind for at se versionsoplysninger.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Log sammenkædning er i pause. Rul til bunden for at fortsætte.",
|
||||
"Login failed, see Syncthing logs for details.": "Log ind mislykkedes, se Syncthing-logs for detaljer.",
|
||||
"Logs": "Logbog",
|
||||
"Major Upgrade": "Opgradering til ny hovedversion",
|
||||
"Mass actions": "Massehandlinger",
|
||||
@@ -257,6 +267,7 @@
|
||||
"No upgrades": "Ingen opgraderinger",
|
||||
"Not shared": "Ikke delte",
|
||||
"Notice": "Bemærk",
|
||||
"Number of Connections": "Antal forbindelser",
|
||||
"OK": "OK",
|
||||
"Off": "Deaktiveret",
|
||||
"Oldest First": "Ældste først",
|
||||
@@ -268,6 +279,7 @@
|
||||
"Override": "Tilsidesæt",
|
||||
"Override Changes": "Overskriv ændringer",
|
||||
"Ownership": "Ejerskab",
|
||||
"Password": "Adgangskode",
|
||||
"Path": "Sti",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Sti til den lokale mappe. Vil blive oprettet hvis den ikke findes. Tildetegnet (~) kan bruges som en forkortelse for",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Sti hvor versioner skal gemmes (lad være tomt for at bruge .stversions-mappen i den delte mappe).",
|
||||
@@ -324,6 +336,7 @@
|
||||
"Revert": "Fortryd",
|
||||
"Revert Local Changes": "Opgiv lokale ændringer",
|
||||
"Save": "Gem",
|
||||
"Saving changes": "Gemmer ændringer",
|
||||
"Scan Time Remaining": "Tid tilbage af skanningen",
|
||||
"Scanning": "Skanner",
|
||||
"See external versioning help for supported templated command line parameters.": "Se hjælp til ekstern versionering for understøttede kommandolinjeparametre.",
|
||||
@@ -390,6 +403,7 @@
|
||||
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing lytter på følgende netværksadresser for forbindelsesforsøg fra andre enheder:",
|
||||
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing lytter ikke efter forbindelsesforsøg fra andre enheder på nogen adresse. Kun udgående forbindelser fra denne enhed kan fungere.",
|
||||
"Syncthing is restarting.": "Syncthing genstarter.",
|
||||
"Syncthing is saving changes.": "Syncthing gemmer ændringer.",
|
||||
"Syncthing is upgrading.": "Syncthing opgraderer.",
|
||||
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing understøtter nu automatisk rapportering af nedbrud til udviklere. Denne funktion er aktiveret som standard.",
|
||||
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing ser ud til at være stoppet eller oplever problemer med din internetforbindelse. Prøver igen…",
|
||||
@@ -405,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Konfigurationen er gemt, men ikke aktiveret. Syncthing skal genstarte for at aktivere den nye konfiguration.",
|
||||
"The device ID cannot be blank.": "Enhedens ID må ikke være tom.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Det enheds-ID, som skal indtastes her, kan findes under menuen “Handlinger > Vis ID” på den anden enhed. Mellemrum og bindestreger er valgfri (ignoreres).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Den krypterede forbrugsrapport sendes dagligt. Den benyttes til at spore anvendte platforme, mappestørrelser og programversioner. Hvis den opsamlede data ændres på et senere tidspunkt, vil du blive spurgt om tilladelse igen.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Den krypterede forbrugsrapport sendes dagligt. Den benyttes til at spore anvendte platforme, mappestørrelser og programversioner. Hvis den opsamlede data ændres på et senere tidspunkt, vil du blive spurgt om tilladelse igen.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Det indtastede enheds-ID ser ikke gyldigt ud. Det skal være en streng på 52 eller 56 tegn, der består af tal og bogstaver, eventuelt med mellemrum og bindestreger.",
|
||||
"The folder ID cannot be blank.": "Mappe-ID må ikke være tom.",
|
||||
"The folder ID must be unique.": "Mappe-ID skal være unik.",
|
||||
@@ -422,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Interval i sekunder for kørsel af oprydning i versionskatalog. Nul vil deaktivere periodisk rengøring.",
|
||||
"The maximum age must be a number and cannot be blank.": "Maksimal alder skal være et tal og feltet må ikke være tomt.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Den maksimale tid, en version skal gemmes (i dage; sæt lig med 0 for at beholde gamle versioner for altid).",
|
||||
"The number of connections must be a non-negative number.": "Antallet af forbindelser skal være et ikke-negativt tal.",
|
||||
"The number of days must be a number and cannot be blank.": "Antallet af dage skal være et tal og feltet må ikke være tomt.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Antal dage, filer gemmes i papirkurven. Nul betyder for evigt.",
|
||||
"The number of old versions to keep, per file.": "Antallet af gamle versioner som gemmes per fil.",
|
||||
"The number of versions must be a number and cannot be blank.": "Antallet af versioner skal være et tal og feltet må ikke være tomt.",
|
||||
"The path cannot be blank.": "Stien må ikke være tom.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Hastighedsbegrænsningen anvendes på den akkumulerede trafik for alle forbindelser til denne enhed.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Hastighedsbegrænsningen skal være et ikke-negativt tal (0: ingen begrænsning)",
|
||||
"The remote device has not accepted sharing this folder.": "Fjernenheden har ikke accepteret deling af denne mappe.",
|
||||
"The remote device has paused this folder.": "Fjernenheden har sat denne mappe på pause.",
|
||||
@@ -471,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Forbrugsraportering er altid aktiveret for udgivelseskandidater.",
|
||||
"Use HTTPS for GUI": "Anvend HTTPS til GUI-adgang",
|
||||
"Use notifications from the filesystem to detect changed items.": "Benyt notifikationer fra filsystemet til at finde filændringer.",
|
||||
"User": "Bruger",
|
||||
"User Home": "Brugerhjem",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Brugernavn/adgangskode er ikke indstillet til GUI-godkendelse. Overvej at konfigurere det.",
|
||||
"Using a QUIC connection over LAN": "Brug af en QUIC-forbindelse over LAN",
|
||||
@@ -495,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Overvågning af ændringer finder ændringer uden at skanne fra tid til anden.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Når der tilføjes en ny enhed, vær da opmærksom på, at denne enhed også skal tilføjes i den anden ende.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Når der tilføjes en ny enhed, vær da opmærksom på at samme mappe-ID bruges til at forbinde mapper på de forskellige enheder. Der er forskel på store og små bogstaver, og ID skal være fuldstændig identisk på alle enheder.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Når den er sat til mere end én på begge enheder, vil Syncthing forsøge at etablere flere samtidige forbindelser. Hvis værdierne er forskellige, vil den højeste blive brugt. Sæt til nul for at lade Syncthing bestemme.",
|
||||
"Yes": "Ja",
|
||||
"Yesterday": "I går",
|
||||
"You can also copy and paste the text into a new message manually.": "Du kan også kopiere teksten og indsætte den manuelt i en ny besked.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Sollen {{count}} Dateien wirklich wiederhergestellt werden?",
|
||||
"Are you sure you want to revert all local changes?": "Sollen wirklich alle lokalen Änderungen zurückgesetzt werden?",
|
||||
"Are you sure you want to upgrade?": "Sind Sie sicher, dass Sie ein Upgrade durchführen möchten?",
|
||||
"Authentication Required": "Authentifizierung erforderlich",
|
||||
"Authors": "Autoren",
|
||||
"Auto Accept": "Automatische Annahme",
|
||||
"Automatic Crash Reporting": "Automatische Absturzmeldung",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "Konfiguriert",
|
||||
"Connected (Unused)": "Verbunden (Nicht genutzt)",
|
||||
"Connection Error": "Verbindungsfehler",
|
||||
"Connection Management": "Verbindungsverwaltung",
|
||||
"Connection Type": "Verbindungstyp",
|
||||
"Connections": "Verbindungen",
|
||||
"Connections via relays might be rate limited by the relay": "Verbindungen über Weiterleitungsserver können von diesen in der Geschwindigkeit begrenzt werden",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "Beinhaltete Software",
|
||||
"Incoming Rate Limit (KiB/s)": "Eingehendes Datenratelimit (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Eine falsche Konfiguration kann den Ordnerinhalt beschädigen und Syncthing in einen unausführbaren Zustand versetzen.",
|
||||
"Incorrect user name or password.": "Falscher Benutzername oder Passwort.",
|
||||
"Internally used paths:": "Intern verwendete Pfade:",
|
||||
"Introduced By": "Verteilt von",
|
||||
"Introducer": "Verteilergerät",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Lokal geänderte Elemente",
|
||||
"Log": "Protokoll",
|
||||
"Log File": "Protokolldatei",
|
||||
"Log In": "Anmeldung",
|
||||
"Log Out": "Abmelden",
|
||||
"Log in to see paths information.": "Anmelden, um Pfadinformationen einzusehen.",
|
||||
"Log in to see version information.": "Anmelden, um Versionsinformationen einzusehen.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Protokolländerungsverfolgung angehalten. Zum Ende blättern, um fortzufahren.",
|
||||
"Login failed, see Syncthing logs for details.": "Anmeldung fehlgeschlagen, siehe Syncthing-Protokolle für Details.",
|
||||
"Logs": "Protokolle",
|
||||
"Major Upgrade": "Hauptversionsaktualisierung",
|
||||
"Mass actions": "Massenaktionen",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Keine Aktualisierungen",
|
||||
"Not shared": "Nicht geteilt",
|
||||
"Notice": "Hinweis",
|
||||
"Number of Connections": "Anzahl Verbindungen",
|
||||
"OK": "OK",
|
||||
"Off": "Aus",
|
||||
"Oldest First": "Älteste zuerst",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Überschreiben",
|
||||
"Override Changes": "Änderungen überschreiben",
|
||||
"Ownership": "Besitzinformation",
|
||||
"Password": "Passwort",
|
||||
"Path": "Pfad",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Pfad zum Ordner auf dem lokalen Gerät. Ordner wird erzeugt, wenn er nicht existiert. Das Tilden-Zeichen (~) kann als Abkürzung benutzt werden für",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Pfad in dem Versionen gespeichert werden sollen (leer lassen, wenn der Standard .stversions Ordner für den geteilten Ordner verwendet werden soll).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Die Konfiguration wurde gespeichert, aber noch nicht aktiviert. Syncthing muss neugestartet werden, um die neue Konfiguration zu übernehmen.",
|
||||
"The device ID cannot be blank.": "Die Gerätekennung darf nicht leer sein.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Die hier einzutragende Gerätekennung kann im Dialog „Aktionen > Kennung anzeigen“ auf dem anderen Gerät gefunden werden. Leerzeichen und Bindestriche sind optional (werden ignoriert).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Der verschlüsselte Nutzungsbericht wird täglich gesendet. Er wird verwendet, um Statistiken über verwendete Betriebssysteme, Ordnergrößen und Programmversionen zu erstellen. Sollte der Bericht in Zukunft weitere Daten erfassen, wird dieses Fenster erneut angezeigt.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Der verschlüsselte Nutzungsbericht wird täglich gesendet. Er wird verwendet, um Statistiken über verwendete Betriebssysteme, Ordnergrößen und Programmversionen zu erstellen. Sollte der Bericht in Zukunft weitere Daten erfassen, wird dieses Fenster erneut angezeigt.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Die eingegebene Gerätekennung scheint nicht gültig zu sein. Es sollte eine 52 oder 56 stellige Zeichenkette aus Buchstaben und Nummern sein. Leerzeichen und Bindestriche sind optional.",
|
||||
"The folder ID cannot be blank.": "Die Ordnerkennung darf nicht leer sein.",
|
||||
"The folder ID must be unique.": "Die Ordnerkennung muss eindeutig sein.",
|
||||
@@ -426,12 +436,14 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Das Intervall, in Sekunden, zwischen den Bereinigungen im Versionsverzeichnis. Null um das regelmäßige Bereinigen zu deaktivieren.",
|
||||
"The maximum age must be a number and cannot be blank.": "Das Höchstalter muss angegeben werden und eine Zahl sein.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Die längste Zeit, die alte Versionen vorgehalten werden (in Tagen) (0 um alte Versionen für immer zu behalten).",
|
||||
"The number of connections must be a non-negative number.": "Die Anzahl der Verbindungen muss eine nicht-negative Zahl sein.",
|
||||
"The number of days must be a number and cannot be blank.": "Die Anzahl der Tage muss eine Ganzzahl sein und darf nicht leer sein.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Dauer in Tagen für welche die Dateien aufgehoben werden sollen. 0 bedeutet für immer.",
|
||||
"The number of old versions to keep, per file.": "Anzahl der alten Versionen, die von jeder Datei behalten werden sollen.",
|
||||
"The number of versions must be a number and cannot be blank.": "Die Anzahl von Versionen muss eine Ganzzahl und darf nicht leer sein.",
|
||||
"The path cannot be blank.": "Der Pfad darf nicht leer sein.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Das Datenratelimit muss eine nicht negative Zahl sein (0 = kein Limit).",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Die Datenratenbegrenzung wird auf den gesamten Datenverkehr aller Verbindungen zu diesem Gerät angewendet.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Die Datenratenbegrenzung muss eine nicht-negative Zahl sein (0 = keine Begrenzung).",
|
||||
"The remote device has not accepted sharing this folder.": "Dieser geteilte Ordner wurde vom Gerät nicht angenommen.",
|
||||
"The remote device has paused this folder.": "Dieser geteilte Ordner ist auf dem Gerät pausiert.",
|
||||
"The rescan interval must be a non-negative number of seconds.": "Das Scanintervall muss eine nicht negative Anzahl (in Sekunden) sein.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Nutzungsbericht ist für Veröffentlichungskandidaten immer aktiviert.",
|
||||
"Use HTTPS for GUI": "HTTPS für Benutzeroberfläche verwenden",
|
||||
"Use notifications from the filesystem to detect changed items.": "Benachrichtigungen des Dateisystems nutzen, um Änderungen zu erkennen.",
|
||||
"User": "Benutzer",
|
||||
"User Home": "Benutzer-Stammverzeichnis",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Benutzername / Passwort wurde für die Benutzeroberfläche nicht gesetzt. Bitte erwägen Sie dies einzurichten.",
|
||||
"Using a QUIC connection over LAN": "Verwendet eine QUIC-Verbindung über LAN",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Das Überwachen von Änderungen entdeckt die meisten Änderungen ohne regelmäßiges Scannen.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Beachte beim Hinzufügen eines neuen Gerätes, dass dieses Gerät auch auf den anderen Geräten hinzugefügt werden muss.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Beachte bitte beim Hinzufügen eines neuen Ordners, dass die Ordnerkennung dazu verwendet wird, Ordner zwischen Geräten zu verbinden. Die Kennung muss also auf allen Geräten gleich sein, die Groß- und Kleinschreibung muss dabei beachtet werden.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Wenn auf beiden Geräten der Wert höher als eins eingestellt ist, versucht Syncthing, mehrere gleichzeitige Verbindungen herzustellen. Wenn die Werte unterschiedlich sind, wird der höchste Wert verwendet. Den Wert auf Null setzen, um Syncthing entscheiden zu lassen.",
|
||||
"Yes": "Ja",
|
||||
"Yesterday": "Gestern",
|
||||
"You can also copy and paste the text into a new message manually.": "Sie können den Text auch kopieren und manuell in eine neue Nachricht einfügen.",
|
||||
|
||||
@@ -288,7 +288,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Οι ρυθμίσεις έχουν αποθηκευτεί αλλά δεν έχουν ενεργοποιηθεί. Πρέπει να επανεκκινήσεις το Syncthing για να ισχύσουν οι νέες ρυθμίσεις.",
|
||||
"The device ID cannot be blank.": "Η ταυτότητα της συσκευής δεν μπορεί να είναι κενή",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Η ταυτότητα της συσκευής που θα μπει εδώ βρίσκεται στο μενού «Ενέργειες > Εμφάνιση ταυτότητας» στην άλλη συσκευή. Κενοί χαρακτήρες και παύλες είναι προαιρετικοί (θα αγνοηθούν).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Η κρυπτογραφημένη αναφορά χρήσης στέλνεται καθημερινά. Χρησιμοποιείται για να παραχθούν στατιστικές για τα λειτουργικά συστήματα που χρησιμοποιούνται, τα μεγέθη των φακέλων και τις εκδόσεις των προγραμμάτων. Αν στο μέλλον συμπεριληφθούν και άλλα δεδομένα στην αναφορά χρήσης, τότε αυτό το παράθυρο θα εμφανιστεί ξανά.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Η κρυπτογραφημένη αναφορά χρήσης στέλνεται καθημερινά. Χρησιμοποιείται για να παραχθούν στατιστικές για τα λειτουργικά συστήματα που χρησιμοποιούνται, τα μεγέθη των φακέλων και τις εκδόσεις των προγραμμάτων. Αν στο μέλλον συμπεριληφθούν και άλλα δεδομένα στην αναφορά χρήσης, τότε αυτό το παράθυρο θα εμφανιστεί ξανά.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Η ταυτότητα συσκευής που έδωσες δε φαίνεται έγκυρη. Θα πρέπει να είναι μια σειρά από 52 ή 56 χαρακτήρες (γράμματα και αριθμοί). Τα κενά και οι παύλες είναι προαιρετικά (αδιάφορα).",
|
||||
"The folder ID cannot be blank.": "Η ταυτότητα του φακέλου δεν μπορεί να είναι κενή.",
|
||||
"The folder ID must be unique.": "Η ταυτότητα του φακέλου πρέπει να είναι μοναδική.",
|
||||
|
||||
@@ -405,7 +405,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.",
|
||||
"The device ID cannot be blank.": "The device ID cannot be blank.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.",
|
||||
"The folder ID cannot be blank.": "The folder ID cannot be blank.",
|
||||
"The folder ID must be unique.": "The folder ID must be unique.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Are you sure you want to restore {{count}} files?",
|
||||
"Are you sure you want to revert all local changes?": "Are you sure you want to revert all local changes?",
|
||||
"Are you sure you want to upgrade?": "Are you sure you want to upgrade?",
|
||||
"Authentication Required": "Authentication Required",
|
||||
"Authors": "Authors",
|
||||
"Auto Accept": "Auto Accept",
|
||||
"Automatic Crash Reporting": "Automatic Crash Reporting",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "Configured",
|
||||
"Connected (Unused)": "Connected (Unused)",
|
||||
"Connection Error": "Connection Error",
|
||||
"Connection Management": "Connection Management",
|
||||
"Connection Type": "Connection Type",
|
||||
"Connections": "Connections",
|
||||
"Connections via relays might be rate limited by the relay": "Connections via relays might be rate limited by the relay",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "Included Software",
|
||||
"Incoming Rate Limit (KiB/s)": "Incoming Rate Limit (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Incorrect configuration may damage your folder contents and render Syncthing inoperable.",
|
||||
"Incorrect user name or password.": "Incorrect username or password.",
|
||||
"Internally used paths:": "Internally used paths:",
|
||||
"Introduced By": "Introduced By",
|
||||
"Introducer": "Introducer",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Locally Changed Items",
|
||||
"Log": "Log",
|
||||
"Log File": "Log File",
|
||||
"Log In": "Log In",
|
||||
"Log Out": "Log Out",
|
||||
"Log in to see paths information.": "Log in to see paths information.",
|
||||
"Log in to see version information.": "Log in to see version information.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Log tailing paused. Scroll to the bottom to continue.",
|
||||
"Login failed, see Syncthing logs for details.": "Login failed, see Syncthing logs for details.",
|
||||
"Logs": "Logs",
|
||||
"Major Upgrade": "Major Upgrade",
|
||||
"Mass actions": "Mass actions",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "No upgrades",
|
||||
"Not shared": "Not shared",
|
||||
"Notice": "Notice",
|
||||
"Number of Connections": "Number of Connections",
|
||||
"OK": "OK",
|
||||
"Off": "Off",
|
||||
"Oldest First": "Oldest First",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Override",
|
||||
"Override Changes": "Override Changes",
|
||||
"Ownership": "Ownership",
|
||||
"Password": "Password",
|
||||
"Path": "Path",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.",
|
||||
"The device ID cannot be blank.": "The device ID cannot be blank.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.",
|
||||
"The folder ID cannot be blank.": "The folder ID cannot be blank.",
|
||||
"The folder ID must be unique.": "The folder ID must be unique.",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.",
|
||||
"The maximum age must be a number and cannot be blank.": "The maximum age must be a number and cannot be blank.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "The maximum time to keep a version (in days, set to 0 to keep versions forever).",
|
||||
"The number of connections must be a non-negative number.": "The number of connections must be a non-negative number.",
|
||||
"The number of days must be a number and cannot be blank.": "The number of days must be a number and cannot be blank.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "The number of days to keep files in the trash can. Zero means forever.",
|
||||
"The number of old versions to keep, per file.": "The number of old versions to keep, per file.",
|
||||
"The number of versions must be a number and cannot be blank.": "The number of versions must be a number and cannot be blank.",
|
||||
"The path cannot be blank.": "The path cannot be blank.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "The rate limit is applied to the accumulated traffic of all connections to this device.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "The rate limit must be a non-negative number (0: no limit)",
|
||||
"The remote device has not accepted sharing this folder.": "The remote device has not accepted sharing this folder.",
|
||||
"The remote device has paused this folder.": "The remote device has paused this folder.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Usage reporting is always enabled for candidate releases.",
|
||||
"Use HTTPS for GUI": "Use HTTPS for GUI",
|
||||
"Use notifications from the filesystem to detect changed items.": "Use notifications from the filesystem to detect changed items.",
|
||||
"User": "User",
|
||||
"User Home": "User Home",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Username/Password has not been set for the GUI authentication. Please consider setting it up.",
|
||||
"Using a QUIC connection over LAN": "Using a QUIC connection over LAN",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Watching for changes discovers most changes without periodic scanning.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "When adding a new device, keep in mind that this device must be added on the other side too.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.",
|
||||
"Yes": "Yes",
|
||||
"Yesterday": "Yesterday",
|
||||
"You can also copy and paste the text into a new message manually.": "You can also copy and paste the text into a new message manually.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Are you sure you want to restore {{count}} files?",
|
||||
"Are you sure you want to revert all local changes?": "Are you sure you want to revert all local changes?",
|
||||
"Are you sure you want to upgrade?": "Are you sure you want to upgrade?",
|
||||
"Authentication Required": "Authentication Required",
|
||||
"Authors": "Authors",
|
||||
"Auto Accept": "Auto Accept",
|
||||
"Automatic Crash Reporting": "Automatic Crash Reporting",
|
||||
@@ -204,6 +205,7 @@
|
||||
"Included Software": "Included Software",
|
||||
"Incoming Rate Limit (KiB/s)": "Incoming Rate Limit (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Incorrect configuration may damage your folder contents and render Syncthing inoperable.",
|
||||
"Incorrect user name or password.": "Incorrect user name or password.",
|
||||
"Internally used paths:": "Internally used paths:",
|
||||
"Introduced By": "Introduced By",
|
||||
"Introducer": "Introducer",
|
||||
@@ -233,7 +235,12 @@
|
||||
"Locally Changed Items": "Locally Changed Items",
|
||||
"Log": "Log",
|
||||
"Log File": "Log File",
|
||||
"Log In": "Log In",
|
||||
"Log Out": "Log Out",
|
||||
"Log in to see paths information.": "Log in to see paths information.",
|
||||
"Log in to see version information.": "Log in to see version information.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Log tailing paused. Scroll to the bottom to continue.",
|
||||
"Login failed, see Syncthing logs for details.": "Login failed, see Syncthing logs for details.",
|
||||
"Logs": "Logs",
|
||||
"Major Upgrade": "Major Upgrade",
|
||||
"Mass actions": "Mass actions",
|
||||
@@ -272,6 +279,7 @@
|
||||
"Override": "Override",
|
||||
"Override Changes": "Override Changes",
|
||||
"Ownership": "Ownership",
|
||||
"Password": "Password",
|
||||
"Path": "Path",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).",
|
||||
@@ -411,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.",
|
||||
"The device ID cannot be blank.": "The device ID cannot be blank.",
|
||||
"The device ID to enter here can be found in the \"Actions \u003e Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "The device ID to enter here can be found in the \"Actions \u003e Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.",
|
||||
"The folder ID cannot be blank.": "The folder ID cannot be blank.",
|
||||
"The folder ID must be unique.": "The folder ID must be unique.",
|
||||
@@ -479,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Usage reporting is always enabled for candidate releases.",
|
||||
"Use HTTPS for GUI": "Use HTTPS for GUI",
|
||||
"Use notifications from the filesystem to detect changed items.": "Use notifications from the filesystem to detect changed items.",
|
||||
"User": "User",
|
||||
"User Home": "User Home",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Username/Password has not been set for the GUI authentication. Please consider setting it up.",
|
||||
"Using a QUIC connection over LAN": "Using a QUIC connection over LAN",
|
||||
|
||||
@@ -291,7 +291,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La agordo estis registrita sed ne aktivigita. Syncthing devas restarti por aktivigi la novan agordon.",
|
||||
"The device ID cannot be blank.": "La aparato ID ne povas esti malplena.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "La aparato ID por eniri ĉi tie estas trovebla per \"Agoj > Montru ID\" dialogo en la alia aparato. Interspacoj kaj streketoj estas opcio (ignorigita).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "La ĉifrita raporto de uzado estas sendata ĉiutage. Ĝi estas uzata por sekvi komunajn platformojn, dosierujajn grandojn kaj aplikaĵajn versiojn. Se la raporto datumaro ŝanĝis, vi estos avertata per ĉi tiu dialogo denove.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "La ĉifrita raporto de uzado estas sendata ĉiutage. Ĝi estas uzata por sekvi komunajn platformojn, dosierujajn grandojn kaj aplikaĵajn versiojn. Se la raporto datumaro ŝanĝis, vi estos avertata per ĉi tiu dialogo denove.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "La enigita aparato ID ne ŝajnas valida. Ĝi devas esti signoĉeno el 52 aŭ 56 karaktroj longa enhavanta leterojn kaj nombrojn, kun interspacoj kaj streketoj opciaj.",
|
||||
"The folder ID cannot be blank.": "La dosierujo ID ne povas esti malplena.",
|
||||
"The folder ID must be unique.": "La dosierujo ID devas esti unika.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "¿Está seguro que desea restaurar {{count}} archivos?",
|
||||
"Are you sure you want to revert all local changes?": "¿Está seguro(a) de que desea revertir todos los cambios locales?",
|
||||
"Are you sure you want to upgrade?": "¿Está seguro(a) de que desea actualizar?",
|
||||
"Authentication Required": "Autenticación requerida",
|
||||
"Authors": "Autores",
|
||||
"Auto Accept": "Aceptar automáticamente",
|
||||
"Automatic Crash Reporting": "Informe Automático de Fallos",
|
||||
@@ -57,7 +58,7 @@
|
||||
"Cleanup Interval": "Intervalo de Limpieza",
|
||||
"Click to see full identification string and QR code.": "Haga clic para ver la cadena de identificación completa y su código QR.",
|
||||
"Close": "Cerrar",
|
||||
"Command": "Acción",
|
||||
"Command": "Dominio",
|
||||
"Comment, when used at the start of a line": "Comentar, cuando se usa al comienzo de una línea",
|
||||
"Compression": "Compresión",
|
||||
"Configuration Directory": "Carpeta de la configuración",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "Configurado",
|
||||
"Connected (Unused)": "Conectado (Sin Uso)",
|
||||
"Connection Error": "Error de conexión",
|
||||
"Connection Management": "Gestión de las conexiones",
|
||||
"Connection Type": "Tipo de conexión",
|
||||
"Connections": "Conexiones",
|
||||
"Connections via relays might be rate limited by the relay": "Las conexiones a través de relés pueden estar limitadas por la velocidad del relé",
|
||||
@@ -85,7 +87,7 @@
|
||||
"Default Folder": "Carpeta Predeterminada",
|
||||
"Default Ignore Patterns": "Ignorar patrones por defecto",
|
||||
"Defaults": "Valores Predeterminados",
|
||||
"Delete": "Eliminar",
|
||||
"Delete": "Borrar",
|
||||
"Delete Unexpected Items": "Borrar Elementos Inesperados",
|
||||
"Deleted {%file%}": "Eliminado {{file}}",
|
||||
"Deselect All": "Deseleccionar Todo",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "Programas incluidos",
|
||||
"Incoming Rate Limit (KiB/s)": "Límite de descarga (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Una configuración incorrecta puede corromper el contenido de la carpeta y poner a Syncthing en un estado inoperante.",
|
||||
"Incorrect user name or password.": "Nombre de usuario o contraseña incorrectos.",
|
||||
"Internally used paths:": "Rutas de uso interno:",
|
||||
"Introduced By": "Introducido por",
|
||||
"Introducer": "Presentador",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Elementos Cambiados Localmente",
|
||||
"Log": "Registro",
|
||||
"Log File": "Archivo de registro",
|
||||
"Log In": "Iniciar sesión",
|
||||
"Log Out": "Cerrar sesión",
|
||||
"Log in to see paths information.": "Inicia sesión para ver la información sobre las rutas.",
|
||||
"Log in to see version information.": "Inicia sesión para ver la información sobre la versión.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Seguimiento del registro pausado. Desplácese hasta el final para continuar.",
|
||||
"Login failed, see Syncthing logs for details.": "El inicio de sesión falló, mira los registros de Syncthing para más detalles.",
|
||||
"Logs": "Registros",
|
||||
"Major Upgrade": "Actualización importante",
|
||||
"Mass actions": "Acción masiva",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Sin actualizaciones",
|
||||
"Not shared": "No Compartido(a)",
|
||||
"Notice": "Aviso",
|
||||
"Number of Connections": "Número de las conexiones",
|
||||
"OK": "De acuerdo",
|
||||
"Off": "Desconectar",
|
||||
"Oldest First": "El más antiguo primero",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Sobreescribir",
|
||||
"Override Changes": "Anular cambios",
|
||||
"Ownership": "Propiedad",
|
||||
"Password": "Contraseña",
|
||||
"Path": "Ruta",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Ruta a la carpeta en el dispositivo local. Se creará la carpeta si no existe. El carácter de la tilde (~) se puede utilizar como abreviatura de",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "La ruta donde las versiones deben ser almacenadas (dejar vacío para el directorio .stversions por defecto en la carpeta compartida).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configuración ha sido grabada pero no activada. Syncthing debe reiniciarse para activar la nueva configuración.",
|
||||
"The device ID cannot be blank.": "La ID del dispositivo no puede estar vacía.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "El ID del dispositivo que hay que introducir aquí se puede encontrar en el diálogo \"Acciones > Mostrar ID\" en el otro dispositivo. Los espacios y las barras son opcionales (ignorados).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "El informe encriptado de uso se envía diariamente. Se usa para rastrear plataformas comunes, tamaños de carpetas y versiones de la aplicación. Si el conjunto de datos enviados en el informes se cambia, se le pedirá a usted autorización de nuevo.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "El informe encriptado de uso se envía diariamente. Se usa para rastrear plataformas comunes, tamaños de carpetas y versiones de la aplicación. Si el conjunto de datos enviados en el informes se cambia, se le pedirá a usted autorización de nuevo.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "La ID del dispositivo introducida no parece válida. Debe ser una cadena de 52 ó 56 caracteres formada por letras y números, con espacios y guiones opcionales.",
|
||||
"The folder ID cannot be blank.": "La ID de la carpeta no puede estar vacía.",
|
||||
"The folder ID must be unique.": "La ID de la carpeta debe ser única.",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "El intervalo, en segundos, para ejecutar la limpieza del directorio de versiones. Cero para desactivar la limpieza periódica.",
|
||||
"The maximum age must be a number and cannot be blank.": "La edad máxima debe ser un número y no puede estar vacía.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "El tiempo máximo para mantener una versión en días (introducir 0 para mantener las versiones indefinidamente).",
|
||||
"The number of connections must be a non-negative number.": "El número de las conexiones debe ser un número que no sea negativo.",
|
||||
"The number of days must be a number and cannot be blank.": "El número de días debe ser un número y no puede estar en blanco.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "El número de días para mantener los archivos en la papelera. Cero significa \"para siempre\".",
|
||||
"The number of old versions to keep, per file.": "El número de versiones a antiguas a mantener para cada fichero.",
|
||||
"The number of versions must be a number and cannot be blank.": "El número de versiones debe ser un número y no puede estar vacío.",
|
||||
"The path cannot be blank.": "La ruta no puede estar vacía.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "El límite de velocidad se aplica al tráfico acumulado de todas las conexiones a este dispositivo.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "El límite de velocidad debe ser un número no negativo (0: sin límite)",
|
||||
"The remote device has not accepted sharing this folder.": "El dispositivo remoto no ha aceptado compartir esta carpeta.",
|
||||
"The remote device has paused this folder.": "El dispositivo remoto ha puesto en pausa esta carpeta.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "El informe de uso está siempre habilitado en las versiones candidatas.",
|
||||
"Use HTTPS for GUI": "Usar HTTPS para la Interfaz Gráfica de Usuario (GUI)",
|
||||
"Use notifications from the filesystem to detect changed items.": "Usar notificaciones del sistema de archivos para detectar elementos cambiados.",
|
||||
"User": "Usuario",
|
||||
"User Home": "Carpeta de inicio del usuario",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "No se ha configurado el nombre de usuario/la contraseña para la autenticación de la GUI. Por favor, considere configurarlos.",
|
||||
"Using a QUIC connection over LAN": "Usando una conexión QUIC a través de una LAN",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "El control de cambios descubre la mayoría de cambios sin el escaneo periódico.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Cuando añada un nuevo dispositivo, tenga en cuenta que este debe añadirse también en el otro lado.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Cuando añada una nueva carpeta, tenga en cuenta que su ID se usa para unir carpetas entre dispositivos. Son sensibles a las mayúsculas y deben coincidir exactamente entre todos los dispositivos.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Cuando se configura en más de uno o en ambos dispositivos, Syncthing intentará establecer múltiples conexiones simultáneamente. Si los valores difieren, se utilizará el más alto. Pon cero para que Syncthing decida por ti.",
|
||||
"Yes": "Si",
|
||||
"Yesterday": "Ayer",
|
||||
"You can also copy and paste the text into a new message manually.": "También puedes copiar y pegar manualmente el texto en un nuevo mensaje.",
|
||||
|
||||
@@ -350,7 +350,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Konfigurazioa grabatua izan da bainan ez aktibatua. Syncthing berriz piztu behar da konfigurazio berria berriz aktibatzeko.",
|
||||
"The device ID cannot be blank.": "Tresnaren ID-a ez da hutsa izaiten ahal.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Sartu behar den tresnaren ID-a atxemaiten ahal da menuan \"Ekintzak > ID-a erakuts\" (tresna urrunduarena). Espazio eta gioiak ez dira beharrezkoak.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Erabileraren zifratu txostena egun guziz igorria da. Erabili diren plataformak, partekatzeen neurriak eta aplikazioaren bertsioen zerendatzeko balio du. Datu orokorrak aldatzen balin badira, mezu honen bidez ontzat emaitea eskatua izanen zaizu.\nErabiltzearen zifratu txostena egun guziz igorria da. Balio du erabiliak izan diren plataformak, partekatzeen izaria eta aplikazioaren bertsioak zerrendatzeko. Datu orokorrek aldatuak izan behar balute, mezu honen bidez ontzat emaitea eskatua izanen zaizu. Zure erabakia aldatzen ahal duzu Ekintzak/Konfigurazioa-ren bidez, baita igortzeen maiztasuna Ekintzak/ aitzinatua/Opzioak -en bidez.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Erabileraren zifratu txostena egun guziz igorria da. Erabili diren plataformak, partekatzeen neurriak eta aplikazioaren bertsioen zerendatzeko balio du. Datu orokorrak aldatzen balin badira, mezu honen bidez ontzat emaitea eskatua izanen zaizu.\nErabiltzearen zifratu txostena egun guziz igorria da. Balio du erabiliak izan diren plataformak, partekatzeen izaria eta aplikazioaren bertsioak zerrendatzeko. Datu orokorrek aldatuak izan behar balute, mezu honen bidez ontzat emaitea eskatua izanen zaizu. Zure erabakia aldatzen ahal duzu Ekintzak/Konfigurazioa-ren bidez, baita igortzeen maiztasuna Ekintzak/ aitzinatua/Opzioak -en bidez.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Sartu den tresnaren ID-ak iduri du ez duela balio. 52 edo 56-ko ezaugarriko kadena baten itxura behar luke, hizkiak, zifrak eta baita ere tarte edo gioiez egina.",
|
||||
"The folder ID cannot be blank.": "Partekatzearen ID-a ez da hutsa izaiten ahal",
|
||||
"The folder ID must be unique.": "Partekatzearen ID-a bakarra izan behar da",
|
||||
|
||||
@@ -6,6 +6,7 @@
|
||||
"About": "Tietoja",
|
||||
"Action": "Toiminto",
|
||||
"Actions": "Muokkaa",
|
||||
"Active filter rules": "Aktiiviset suodatussäännöt",
|
||||
"Add": "Lisää",
|
||||
"Add Device": "Lisää laite",
|
||||
"Add Folder": "Lisää kansio",
|
||||
@@ -25,9 +26,11 @@
|
||||
"Anonymous Usage Reporting": "Anonyymi käyttöraportointi",
|
||||
"Anonymous usage report format has changed. Would you like to move to the new format?": "Anonyymi käyttöraportti on muuttunut. Haluatko vaihtaa uuteen muotoon?",
|
||||
"Apply": "Käytä",
|
||||
"Are you sure you want to permanently delete all these files?": "Oletko varma että haluat poistaa lopullisesti kaikki nämä tiedostot?",
|
||||
"Are you sure you want to remove device {%name%}?": "Oletko varma, että haluat postaa laitteen {{name}}?",
|
||||
"Are you sure you want to remove folder {%label%}?": "Oletko varma, että haluat poistaa kansion {{label}}?",
|
||||
"Are you sure you want to restore {%count%} files?": "Haluatko varmasti palauttaa {{count}} tiedostoa?",
|
||||
"Are you sure you want to upgrade?": "Oletko varma että haluat päivittää?",
|
||||
"Auto Accept": "Hyväksy automaattisesti",
|
||||
"Automatic Crash Reporting": "Kaatumisen automaattinen raportointi",
|
||||
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Automaattinen päivitys sallii valita vakaiden- ja kehitysversioiden välillä.",
|
||||
@@ -39,21 +42,32 @@
|
||||
"Cancel": "Peruuta",
|
||||
"Changelog": "Muutoshistoria",
|
||||
"Clean out after": "Puhdista seuraavan ajan kuluttua",
|
||||
"Cleaning Versions": "Puhdistetaan Versioita",
|
||||
"Close": "Sulje",
|
||||
"Command": "Komento",
|
||||
"Comment, when used at the start of a line": "Kommentti, käytettäessä rivin alussa",
|
||||
"Compression": "Pakkaus",
|
||||
"Configured": "Konfiguroitu",
|
||||
"Connected (Unused)": "Yhdistetty (Käyttämätön)",
|
||||
"Connection Error": "Yhteysvirhe",
|
||||
"Connection Type": "Yhteyden tyyppi",
|
||||
"Connections": "Yhteydet",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Tiedostojärjestelmän jatkuva valvonta on nyt sisäänrakennettuna. Syncthing huomaa muutokset levyllä ja skannaa vain muokatut kansiot. Tästä on etuna muuttuneiden tiedostojen nopeampi lähetys ja täyden skannauksen vähentynyt tarve.",
|
||||
"Copied from elsewhere": "Kopioitu muualta",
|
||||
"Copied from original": "Kopioitu alkuperäisestä lähteestä",
|
||||
"Copied!": "Kopioitu!",
|
||||
"Copy": "Kopioi",
|
||||
"Copy failed! Try to select and copy manually.": "Kopiointi epäonnistui! Kokeile valita ja kopioida manuaalisesti.",
|
||||
"Danger!": "Vaara!",
|
||||
"Database Location": "Tietokannan sijainti",
|
||||
"Debugging Facilities": "Debug -luokat",
|
||||
"Default": "Oletus",
|
||||
"Default Configuration": "Oletusasetukset",
|
||||
"Default Device": "Oletus laite",
|
||||
"Default Folder": "Oletus kansio",
|
||||
"Defaults": "Oletukset",
|
||||
"Delete": "Poista",
|
||||
"Deleted {%file%}": "Poistettu {{file}}",
|
||||
"Deselect All": "Poista valinnat",
|
||||
"Deselect devices to stop sharing this folder with.": "Poista laitteiden valinnat, joiden kanssa haluat lopettaa tämän kansion jakamisen.",
|
||||
"Deselect folders to stop sharing with this device.": "Poista kansioiden valinta lopettaaksesi jakamisen tämän laitteen kanssa.",
|
||||
@@ -72,6 +86,8 @@
|
||||
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Ajoitettu skannaus pois päältä. Muutosten seurannan käyttöönotto epäonnistui, yritetään uudelleen minuutin välein:",
|
||||
"Discard": "Hylkää",
|
||||
"Disconnected": "Yhteys katkaistu",
|
||||
"Disconnected (Inactive)": "Yhteys katkaistu (ei aktiivinen)",
|
||||
"Disconnected (Unused)": "Yhteys katkaistu (Käyttämätön)",
|
||||
"Discovered": "Löydetty",
|
||||
"Discovery": "Etsintä",
|
||||
"Discovery Failures": "Etsinnässä tapahtuneet virheet",
|
||||
@@ -85,7 +101,9 @@
|
||||
"Downloading": "Ladataan",
|
||||
"Edit": "Muokkaa",
|
||||
"Edit Device": "Muokkaa laitetta",
|
||||
"Edit Device Defaults": "Muokkaa laitteen Oletuksia",
|
||||
"Edit Folder": "Muokkaa kansiota",
|
||||
"Edit Folder Defaults": "Muokkaa kansion oletuksia",
|
||||
"Editing {%path%}.": "Muokkaa {{path}}.",
|
||||
"Enable Crash Reporting": "Ota kaatumisraportointi käyttöön",
|
||||
"Enable NAT traversal": "Aktivoi osoitteenmuunnoksen kierto",
|
||||
@@ -95,13 +113,14 @@
|
||||
"Enter a non-privileged port number (1024 - 65535).": "Valitse porttinumero vapaalta alueelta (1024-65535)",
|
||||
"Enter ignore patterns, one per line.": "Syötä ohituslausekkeet, yksi riviä kohden.",
|
||||
"Error": "Virhe",
|
||||
"External": "Ulkoinen",
|
||||
"External File Versioning": "Ulkoinen tiedostoversionti",
|
||||
"Failed Items": "Epäonnistuneet kohteet",
|
||||
"Failed to setup, retrying": "Käyttöönotto epäonnistui. Yritetään uudelleen.",
|
||||
"Failed to setup, retrying": "Käyttöönotto epäonnistui, Yritetään uudelleen",
|
||||
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "Yhteys IPv6-palvelimiin todennäköisesti epäonnistuu, koska IPv6-yhteyksiä ei ole.",
|
||||
"File Pull Order": "Tiedostojen noutojärjestys",
|
||||
"File Versioning": "Tiedostoversiointi",
|
||||
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Syncthing siirtää muokatut tai poistetut tiedostot .stversions -kansioon ",
|
||||
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Syncthing siirtää muokatut tai poistetut tiedostot .stversions -kansioon.",
|
||||
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Syncthing siirtää muokatut tai poistetut tiedostot .stversions -kansioon ja merkitsee ne päivämäärällä.",
|
||||
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Tiedostot on suojattu muilla laitteilla tehdyiltä muutoksilta, mutta tällä laitteella tehdyt muutokset lähetetään muuhun ryhmään.",
|
||||
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Tiedostot otetaan vastaan muilta laitteilta, mutta paikallisia muutoksia ei lähetetä muille.",
|
||||
@@ -115,6 +134,7 @@
|
||||
"Folder Type": "Kansion tyyppi",
|
||||
"Folders": "Kansiot",
|
||||
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Seuraavien kansioiden valvonnan aloitus epäonnistui. Yritetään uudelleen minuutin välein, joten virhe saattaa poistua pian. Mikäli virheet jäävät pysyviksi, yritä korjata taustaongelma tai kysy apua foorumilta, mikäli et onnistu.",
|
||||
"Forever": "Loputtomasti",
|
||||
"Full Rescan Interval (s)": "Täydellisen uudelleenskannauksen aikaväli (s)",
|
||||
"GUI": "GUI",
|
||||
"GUI Authentication Password": "GUI:n salasana",
|
||||
@@ -286,7 +306,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Asetukset on tallennettu, mutta niitä ei ole otettu käyttöön. Syncthingin täytyy käynnistyä uudelleen, jotta uudet asetukset saadaan käyttöön.",
|
||||
"The device ID cannot be blank.": "Laitteen ID ei voi olla tyhjä.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Tähän kohtaan syötettävän ID:n löytää \"Muokkaa > Näytä ID\" -valikosta toiselta laitteelta. Välit ja viivat ovat valinnaisia (jätetään huomiotta).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Salattu käyttöraportti lähetetään päivittäin. Sitä käytetään yleisimpien alustojen, kansioiden kokojen ja sovellusversioiden seuraamiseen. Jos raportitavan datan luonne muuttuu, sinua tullaan huomauttamaan tällä dialogilla uudelleen.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Salattu käyttöraportti lähetetään päivittäin. Sitä käytetään yleisimpien alustojen, kansioiden kokojen ja sovellusversioiden seuraamiseen. Jos raportitavan datan luonne muuttuu, sinua tullaan huomauttamaan tällä dialogilla uudelleen.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Syötetty laite-ID ei näytä kelpaavalta. Sen tulisi olla 52 tai 56 merkkiä pitkä, joka koostuu kirjaimista ja numeroista, jossa välit ja viivat ovat valinnaisia.",
|
||||
"The folder ID cannot be blank.": "Kansion ID ei voi olla tyhjä.",
|
||||
"The folder ID must be unique.": "Kansion ID:n tulee olla uniikki.",
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configuration a été enregistrée mais pas activée. Syncthing doit redémarrer afin d'activer la nouvelle configuration.",
|
||||
"The device ID cannot be blank.": "L'ID de l'appareil ne peut être vide.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "L'ID d'appareil à saisir ici se trouve dans le menu \"Actions > Afficher mon ID\" sur l'appareil distant. Les tirets et espaces sont optionnels (et ignorés).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Le rapport d'utilisation chiffré est envoyé quotidiennement. Il sert à répertorier les plates-formes utilisées, la taille des partages et les versions de l'application. Si le jeu de données rapportées devait être changé, il vous serait demandé de valider de nouveau son envoi via ce message. Vous pouvez revenir sur votre décision via Actions/Configuration, et agir sur la fréquence d'envoi via Actions/Avancé/Options (urInitialDelayS).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Le rapport d'utilisation chiffré est envoyé quotidiennement. Il sert à répertorier les plates-formes utilisées, la taille des partages et les versions de l'application. Si le jeu de données rapportées devait être changé, il vous serait demandé de valider de nouveau son envoi via ce message. Vous pouvez revenir sur votre décision via Actions/Configuration, et agir sur la fréquence d'envoi via Actions/Avancé/Options (urInitialDelayS).",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "L'ID de l'appareil inséré ne semble pas valide. Il devrait ressembler à une chaîne de 52 ou 56 caractères comprenant des lettres, des chiffres et potentiellement des espaces et des traits d'union.",
|
||||
"The folder ID cannot be blank.": "L'identifiant du partage ne peut être vide.",
|
||||
"The folder ID must be unique.": "L'ID du partage doit être unique.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Êtes-vous sûr de vouloir restaurer {{count}} fichiers ?",
|
||||
"Are you sure you want to revert all local changes?": "Voulez-vous vraiment écraser tous les changements locaux ?",
|
||||
"Are you sure you want to upgrade?": "Voulez-vous vraiment mettre à jour ?",
|
||||
"Authentication Required": "Authentification nécessaire",
|
||||
"Authors": "Auteurs",
|
||||
"Auto Accept": "Accepter automatiquement",
|
||||
"Automatic Crash Reporting": "Rapports de plantage automatiques",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "Configurée",
|
||||
"Connected (Unused)": "Connecté (Non utilisé)",
|
||||
"Connection Error": "Erreur de connexion",
|
||||
"Connection Management": "Gestion de la connectivité",
|
||||
"Connection Type": "Type de connexion",
|
||||
"Connections": "Connexions",
|
||||
"Connections via relays might be rate limited by the relay": "Les connexions via un relais sont généralement limitées en débit par les capacités du relais",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "Logiciels inclus",
|
||||
"Incoming Rate Limit (KiB/s)": "Limite du débit de réception (Kio/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Une configuration incorrecte peut créer des dommages dans vos répertoires et mettre Syncthing hors-service.",
|
||||
"Incorrect user name or password.": "Nom d'utilisateur ou mot de passe incorrect.",
|
||||
"Internally used paths:": "Chemins utilisés en interne :",
|
||||
"Introduced By": "Introduit par",
|
||||
"Introducer": "Appareil introducteur",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Élément(s) modifié(s) localement",
|
||||
"Log": "Journal",
|
||||
"Log File": "Fichier journal",
|
||||
"Log In": "Se connecter",
|
||||
"Log Out": "Se déconnecter",
|
||||
"Log in to see paths information.": "Connectez-vous pour voir les informations de chemins.",
|
||||
"Log in to see version information.": "Connectez-vous pour voir la version.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Le défilement du journal est en pause. Faites défiler jusqu'en bas pour continuer.",
|
||||
"Login failed, see Syncthing logs for details.": "Échec de connexion, consultez les journaux de Syncthing pour les détails.",
|
||||
"Logs": "Journaux",
|
||||
"Major Upgrade": "Mise à jour majeure",
|
||||
"Mass actions": "Actions multiples",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Pas de mises à jour",
|
||||
"Not shared": "Non partagé",
|
||||
"Notice": "Notification",
|
||||
"Number of Connections": "Nombre de connexions",
|
||||
"OK": "OK",
|
||||
"Off": "Désactivée",
|
||||
"Oldest First": "Les plus anciens en premier",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Écraser",
|
||||
"Override Changes": "Écraser les changements",
|
||||
"Ownership": "Propriétaire",
|
||||
"Password": "Mot de passe",
|
||||
"Path": "Chemin",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Chemin local du partage. Est créé s'il n'existe pas. Le caractère tilde (~) peut être utilisé comme un raccourci pour",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Chemin où les versions seront conservées (laisser vide pour utiliser le dossier par défaut .stversions dans le partage).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configuration a été enregistrée mais pas activée. Syncthing doit redémarrer afin d'activer la nouvelle configuration.",
|
||||
"The device ID cannot be blank.": "L'ID de l'appareil ne peut être vide.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "L'ID d'appareil à saisir ici se trouve dans le menu \"Actions > Afficher mon ID\" de l'appareil distant. Espaces et tirets sont optionnels (ignorés, comme la casse).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Le rapport d'utilisation chiffré est envoyé quotidiennement. Il sert à répertorier les plates-formes utilisées, la taille des partages et les versions de l'application. Si le jeu de données rapportées devait être changé, il vous serait demandé de valider de nouveau son envoi via ce message. Vous pouvez revenir sur votre décision via Actions/Configuration, et agir sur la fréquence d'envoi via Actions/Avancé/Options (Ur Initial Delay (seconds)).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Le rapport d'utilisation chiffré est envoyé quotidiennement. Il sert à répertorier les plates-formes utilisées, la taille des partages et les versions de l'application. Si le jeu de données rapportées devait être changé, il vous serait demandé de valider de nouveau son envoi via ce message. Vous pouvez revenir sur votre décision via Actions/Configuration, et agir sur la fréquence d'envoi via Actions/Avancé/Options (Ur Initial Delay (seconds)).",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "L'ID de l'appareil inséré ne semble pas valide. Il devrait ressembler à une chaîne de 52 ou 56 caractères comprenant des lettres (casse ignorée), des chiffres et potentiellement des espaces et des traits d'union.",
|
||||
"The folder ID cannot be blank.": "L'ID du partage ne peut être vide.",
|
||||
"The folder ID must be unique.": "L'ID du partage doit être unique.",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "L'intervalle, en secondes, de l'exécution du nettoyage du répertoire des versions. Définir à 0 pour désactiver la purge périodique (Dans ce cas, elle n'est effectuée qu'au démarrage).",
|
||||
"The maximum age must be a number and cannot be blank.": "L'âge maximum doit être un nombre et ne peut être vide.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "La durée maximale de conservation d'une version (en jours, 0 pour garder les versions pour toujours).",
|
||||
"The number of connections must be a non-negative number.": "Le nombre de connexions ne peut pas être négatif.",
|
||||
"The number of days must be a number and cannot be blank.": "Le nombre de jours doit être numérique et ne peut pas être vide.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Nombre de jours de conservation des fichiers dans la poubelle. 0 signifie \"indéfiniment\".",
|
||||
"The number of old versions to keep, per file.": "Nombre maximal d'anciennes versions à conserver indéfiniment, par fichier.",
|
||||
"The number of versions must be a number and cannot be blank.": "Le nombre de versions doit être numérique, et ne peut pas être vide.",
|
||||
"The path cannot be blank.": "Le chemin ne peut pas être vide.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "La limite de taux s'applique au trafic cumulé des connexions à notre appareil.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "La limite de débit ne doit pas être négative (0 = pas de limite)",
|
||||
"The remote device has not accepted sharing this folder.": "L'appareil distant n'a pas (encore ?) accepté de partager ce répertoire.",
|
||||
"The remote device has paused this folder.": "L'appareil distant a mis ce partage en pause.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "L'envoi des statistiques d'utilisation est obligatoirement actif pour les versions préliminaires.",
|
||||
"Use HTTPS for GUI": "Utiliser l'HTTPS pour le GUI",
|
||||
"Use notifications from the filesystem to detect changed items.": "Utiliser les notifications du système de fichiers pour détecter les éléments modifiés.",
|
||||
"User": "Utilisateur",
|
||||
"User Home": "Répertoire de base de l'utilisateur",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Utilisateur/Mot de passe n'ont pas été définis pour l'accès à l'interface graphique. Envisagez de le faire.",
|
||||
"Using a QUIC connection over LAN": "Connexion QUIC sur LAN",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "La surveillance des changements découvre la plupart des changements sans réanalyses périodiques.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Lorsque vous ajoutez un appareil, gardez à l'esprit que le votre doit aussi être ajouté de l'autre coté.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Lorsqu'un nouveau partage est ajouté, gardez à l'esprit que c'est cet ID qui est utilisée pour lier les répertoires à travers les appareils. L'ID est sensible à la casse et sera forcément la même sur tous les appareils participant à ce partage.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Au-delà de un sur chaque appareil, Syncthing tentera d'établir autant de connexions simultanées. Si les valeurs diffèrent, la plus grande sera utilisée. Laissez à zéro pour laisser Syncthing décider.",
|
||||
"Yes": "Oui",
|
||||
"Yesterday": "Hier",
|
||||
"You can also copy and paste the text into a new message manually.": "Vous pouvez aussi copier/coller ce texte dans un nouveau message manuellement.",
|
||||
|
||||
@@ -336,7 +336,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "De konfiguraasje is bewarre mar noch net aktivearre. Syncthing moat werstarte om de nije konfiguraasje te aktivearren.",
|
||||
"The device ID cannot be blank.": "It apparaat-ID kin net leech wêze.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "It apparaat-ID dat hjir ynfierd wurde kin, kin fûn wurde yn in it \"Askjes > ID sjen litte\" dialooch op de oare apparaten. Spaasjes en streepkes binne mooglik (wurde negeard).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "It ferkaaide brûkensrapport wurd eltse dei ferstjoerd. It wurd brûkt om algemiene platfoarmen, mapgruttens en app-ferzjes by te hâlden. As de rapportearre dataset feroaret, krije jo dit dialooch wer te sjen.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "It ferkaaide brûkensrapport wurd eltse dei ferstjoerd. It wurd brûkt om algemiene platfoarmen, mapgruttens en app-ferzjes by te hâlden. As de rapportearre dataset feroaret, krije jo dit dialooch wer te sjen.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Dit ynfierde apparaat-ID liket ûnjildich. It moat in tekenrige (string) wêze mei in lingte fan 52 of 56 karakters besteande út letters en nûmers, mei spaasjes en streepkes mooglik.",
|
||||
"The folder ID cannot be blank.": "It map-ID mei net leech wêze.",
|
||||
"The folder ID must be unique.": "It map-ID moat unyk wêze.",
|
||||
|
||||
@@ -397,7 +397,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "A beállítások elmentésre kerültek, de nem lettek aktiválva. Újra kell indítani a Syncthing-et az aktiválásukhoz.",
|
||||
"The device ID cannot be blank.": "Az eszközazonosító nem lehet üres.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Az itt megadandó eszközazonosító a másik eszköz Műveletek > Azonosító mutatása című ablakában látható. Szóközök és kötőjelek használhatók (nem számítanak).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "A titkosított felhasználási adatok naponta kerülnek küldésre. Arra használjuk őket, hogy kövessük a különböző platformokat, mappaméreteket és programverziókat. Az elküldött adatcsomag változása esetén ismételt engedélyezési kérés fog megjelenni.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "A titkosított felhasználási adatok naponta kerülnek küldésre. Arra használjuk őket, hogy kövessük a különböző platformokat, mappaméreteket és programverziókat. Az elküldött adatcsomag változása esetén ismételt engedélyezési kérés fog megjelenni.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "A megadott eszközazonosító nem tűnik érvényesnek. Az azonosító 52 vagy 56 karakterből kell álljon, betűket és számokat tartalmazhat., opcionálisan szóközöket és kötőjeleket is.",
|
||||
"The folder ID cannot be blank.": "A mappaazonosító nem lehet üres.",
|
||||
"The folder ID must be unique.": "A mappaazonosító egyedi kell legyen.",
|
||||
|
||||
@@ -358,7 +358,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Konfigurasi telah disimpan namun tidak diaktifkan. Syncthing harus memulai ulang untuk mengaktifkan konfigurasi baru.",
|
||||
"The device ID cannot be blank.": "ID perangkat tidak dapat kosong.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ID perangkat yang dimasukkan disini dapat ditemukan di dialog \"Aksi > Tunjukkan ID\" di perangkat lain. Spasi dan tanda hubung adalah opsional (diabaikan).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Laporan penggunaan terenkripsi dikirim setiap hari. Itu digunakan untuk mencatat platform umum, ukuran folder, dan versi aplikasi. Jika kumpulan data yang dilaporkan diubah maka anda akan dinotifikasi dengan dialog ini kembali.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Laporan penggunaan terenkripsi dikirim setiap hari. Itu digunakan untuk mencatat platform umum, ukuran folder, dan versi aplikasi. Jika kumpulan data yang dilaporkan diubah maka anda akan dinotifikasi dengan dialog ini kembali.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "ID perangkat yang dimasukkan tidak terlihat valid. Seharusnya string sepanjang 52 atau 56 karakter yang terdiri dari huruf dan angka, dengan spasi dan tanda hubung opsional.",
|
||||
"The folder ID cannot be blank.": "ID folder tidak dapat kosong.",
|
||||
"The folder ID must be unique.": "ID folder harus unik.",
|
||||
|
||||
@@ -65,6 +65,7 @@
|
||||
"Configured": "Configurato",
|
||||
"Connected (Unused)": "Connesso (non utilizzato)",
|
||||
"Connection Error": "Errore di Connessione",
|
||||
"Connection Management": "Gestione della Connessione",
|
||||
"Connection Type": "Tipo di Connessione",
|
||||
"Connections": "Connessioni",
|
||||
"Connections via relays might be rate limited by the relay": "Le connessioni tramite relè potrebbero essere limitate dalla velocità del relè",
|
||||
@@ -259,6 +260,7 @@
|
||||
"No upgrades": "Nessun aggiornamento",
|
||||
"Not shared": "Non condiviso",
|
||||
"Notice": "Avviso",
|
||||
"Number of Connections": "Numero di Connessioni",
|
||||
"OK": "OK",
|
||||
"Off": "Disattiva",
|
||||
"Oldest First": "Prima il Meno Recente",
|
||||
@@ -409,7 +411,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configurazione è stata salvata ma non attivata. Syncthing deve essere riavviato per attivare la nuova configurazione.",
|
||||
"The device ID cannot be blank.": "L'ID del dispositivo non può essere vuoto.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "L'ID del dispositivo da inserire qui può essere trovato nella finestra \"Azioni> Mostra ID\" sull'altro dispositivo. Gli spazi e i trattini sono opzionali (ignorati).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Quotidianamente il software invia le statistiche di utilizzo in forma criptata. Questi dati riguardano i sistemi operativi utilizzati, le dimensioni delle cartelle e le versioni del software. Se i set di dati riportati vengono modificati, verrà mostrata nuovamente questa finestra di dialogo.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Quotidianamente il software invia le statistiche di utilizzo in forma criptata. Questi dati riguardano i sistemi operativi utilizzati, le dimensioni delle cartelle e le versioni del software. Se i set di dati riportati vengono modificati, verrà mostrata nuovamente questa finestra di dialogo.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "L'ID del dispositivo inserito non sembra valido. Dovrebbe essere una stringa di 52 o 56 caratteri costituita da lettere e numeri, con spazi e trattini opzionali.",
|
||||
"The folder ID cannot be blank.": "L'ID della cartella non può essere vuoto.",
|
||||
"The folder ID must be unique.": "L'ID della cartella dev'essere unico.",
|
||||
@@ -426,11 +428,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "L'intervallo, in secondi, per l'esecuzione della pulizia nella directory delle versioni. Zero per disabilitare la pulizia periodica.",
|
||||
"The maximum age must be a number and cannot be blank.": "La durata massima dev'essere un numero e non può essere vuoto.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "La durata massima di una versione (in giorni, imposta a 0 per mantenere le versioni per sempre).",
|
||||
"The number of connections must be a non-negative number.": "Il numero di connessioni deve essere un numero non negativo.",
|
||||
"The number of days must be a number and cannot be blank.": "Il numero di giorni deve essere un numero e non può essere vuoto.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Il numero di giorni per conservare i file nel cestino. Zero significa per sempre.",
|
||||
"The number of old versions to keep, per file.": "Il numero di vecchie versioni da mantenere, per file.",
|
||||
"The number of versions must be a number and cannot be blank.": "Il numero di versioni dev'essere un numero e non può essere vuoto.",
|
||||
"The path cannot be blank.": "Il percorso non può essere vuoto.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Il limite di velocità viene applicato al traffico accumulato di tutte le connessioni a questo dispositivo.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Il limite di banda deve essere un numero non negativo (0: nessun limite)",
|
||||
"The remote device has not accepted sharing this folder.": "Il dispositivo remoto non ha accettato di condividere questa cartella.",
|
||||
"The remote device has paused this folder.": "Il dispositivo remoto ha messo in pausa questa cartella.",
|
||||
@@ -499,6 +503,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Guardando le modifiche si scopre la maggior parte delle modifiche senza scansione periodica.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Quando si aggiunge un nuovo dispositivo, tenere presente che il dispositivo deve essere aggiunto anche dall'altra parte.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Quando aggiungi una nuova cartella, ricordati che gli ID vengono utilizzati per collegare le cartelle nei dispositivi. Distinguono maiuscole e minuscole e devono corrispondere esattamente su tutti i dispositivi.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Se impostato su più di uno su entrambi i dispositivi, Syncthing tenterà di stabilire più connessioni simultanee. Se i valori differiscono, verrà utilizzato quello più alto. Impostare a zero per lasciare che sia Syncthing a decidere.",
|
||||
"Yes": "Sì",
|
||||
"Yesterday": "Ieri",
|
||||
"You can also copy and paste the text into a new message manually.": "Puoi anche copiare e incollare manualmente il testo in un nuovo messaggio.",
|
||||
|
||||
@@ -347,7 +347,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "設定が保存されましたが、まだ有効になっていません。新しい設定を有効にするにはSyncthingを再起動してください。",
|
||||
"The device ID cannot be blank.": "デバイスIDを入力してください。",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ここに入力するデバイスIDは、接続したい相手側デバイスの [メニュー]→[IDを表示] で確認できます。スペースとハイフンは入力しなくてもかまいません。",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "使用状況レポートは暗号化されて毎日送信されます。この情報はプラットフォーム、フォルダーのサイズ、アプリケーションのバージョンを調査するために使われます。送信するデータセットが変更された場合、このダイアログで再度確認が求められます。",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "使用状況レポートは暗号化されて毎日送信されます。この情報はプラットフォーム、フォルダーのサイズ、アプリケーションのバージョンを調査するために使われます。送信するデータセットが変更された場合、このダイアログで再度確認が求められます。",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "入力されたデバイスIDが正しくありません。デバイスIDは52文字または56文字で、アルファベットと数字からなります。スペースとハイフンは入力してもしなくてもかまいません。",
|
||||
"The folder ID cannot be blank.": "フォルダーIDは空欄にできません。",
|
||||
"The folder ID must be unique.": "フォルダーIDが重複しています。",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "{{count}}개의 파일을 정말로 복구하시겠습니까?",
|
||||
"Are you sure you want to revert all local changes?": "현재 기기의 변경 항목 모두를 정말로 되돌리시겠습니까?",
|
||||
"Are you sure you want to upgrade?": "정말로 업데이트하시겠습니까?",
|
||||
"Authentication Required": "인증 필요",
|
||||
"Authors": "저작자",
|
||||
"Auto Accept": "자동 수락",
|
||||
"Automatic Crash Reporting": "자동 충돌 보고",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "설정됨",
|
||||
"Connected (Unused)": "연결됨(미사용)",
|
||||
"Connection Error": "연결 오류",
|
||||
"Connection Management": "연결 관리",
|
||||
"Connection Type": "연결 유형",
|
||||
"Connections": "연결",
|
||||
"Connections via relays might be rate limited by the relay": "중계자를 통한 연결은 중계자로부터 속도가 제한될 수 있습니다.",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "포함된 소프트웨어",
|
||||
"Incoming Rate Limit (KiB/s)": "수신 속도 제한(KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "잘못된 설정은 폴더의 내용을 훼손하거나 Syncthing을 작동하지 못하게 할 수 있습니다.",
|
||||
"Incorrect user name or password.": "사용자 또는 비밀번호가 올바르지 않습니다.",
|
||||
"Internally used paths:": "내부적으로 사용되는 경로:",
|
||||
"Introduced By": "소개한 기기",
|
||||
"Introducer": "소개자",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "현재 기기 변경 항목",
|
||||
"Log": "기록",
|
||||
"Log File": "기록 파일",
|
||||
"Log In": "로그인",
|
||||
"Log Out": "로그아웃",
|
||||
"Log in to see paths information.": "경로를 확인하려면 로그인하십시오.",
|
||||
"Log in to see version information.": "버전 정보를 확인하려면 로그인하십시오.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "기록의 자동 새로고침이 일시 중지되었습니다. 재개하려면 창 밑으로 내려가십시오.",
|
||||
"Login failed, see Syncthing logs for details.": "로그인에 실패했습니다. 자세한 정보는 기록을 확인하십시오.",
|
||||
"Logs": "기록",
|
||||
"Major Upgrade": "주요 업데이트",
|
||||
"Mass actions": "다중 동작",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "업데이트하지 않음",
|
||||
"Not shared": "공유되지 않음",
|
||||
"Notice": "공지",
|
||||
"Number of Connections": "연결 수",
|
||||
"OK": "확인",
|
||||
"Off": "하지 않음",
|
||||
"Oldest First": "오랜 파일 순",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "덮어쓰기",
|
||||
"Override Changes": "변경 항목 덮어쓰기",
|
||||
"Ownership": "소유권",
|
||||
"Password": "비밀번호",
|
||||
"Path": "경로",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "현재 기기에 있는 폴더의 경로입니다. 존재하지 않을 경우에는 자동으로 생성됩니다. 물결표(~)는 다음 폴더를 나타냅니다.",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "버전을 보관할 경로입니다(공유 폴더 안의 기본값 .stversions 폴더를 사용하려면 비워 두십시오).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "설정이 저장되었으나 아직 활성화되지 않았습니다. 새 설정을 활성화하려면 Syncthing을 재시작하십시오.",
|
||||
"The device ID cannot be blank.": "기기 식별자는 비워 둘 수 없습니다.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "이 자리에 입력할 기기 식별자는 다른 기기의 \"동작 > 기기 식별자 보기\"에서 찾을 수 있습니다. 공백과 하이픈은 선택적입니다(무시됩니다).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "암호화된 사용 보고서는 매일 전송됩니다. 사용 중인 운영체제, 폴더 크기와 응용 프로그램의 버전을 추적하기 위해서입니다. 만일 보고되는 정보가 변경되면 이 알림창이 다시 표시될 예정입니다.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "암호화된 사용 보고서는 매일 전송됩니다. 사용 중인 운영체제, 폴더 크기와 응용 프로그램의 버전을 추적하기 위해서입니다. 만일 보고되는 정보가 변경되면 이 알림창이 다시 표시될 예정입니다.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "입력한 기기 식별자가 올바르지 않습니다. 52 또는 56자의 알파벳과 숫자로 구성되어야 하며, 공백과 하이픈은 선택적입니다.",
|
||||
"The folder ID cannot be blank.": "폴더 식별자는 비워 둘 수 없습니다.",
|
||||
"The folder ID must be unique.": "폴더 식별자는 유일무이해야 합니다.",
|
||||
@@ -426,15 +436,17 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "버전 폴더를 정리하는 초 단위의 간격입니다. 주기적 정리를 비활성화하려면 0을 입력하십시오.",
|
||||
"The maximum age must be a number and cannot be blank.": "최대 보관 기간은 숫자여야 하며 비워 둘 수 없습니다.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "버전을 보관할 최대 시간입니다(일 단위이며 버전을 영구 보관하려면 0을 입력하십시오).",
|
||||
"The number of connections must be a non-negative number.": "연결 수는 음이 아닌 정수여야 합니다.",
|
||||
"The number of days must be a number and cannot be blank.": "일수는 숫자여야 하며 비워 둘 수 없습니다.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "휴지통에서 파일을 보관할 일수입니다. 0은 무제한을 의미합니다.",
|
||||
"The number of old versions to keep, per file.": "파일별로 유지할 이전 버전의 개수입니다.",
|
||||
"The number of versions must be a number and cannot be blank.": "버전 개수는 숫자여야 하며 비워 둘 수 없습니다.",
|
||||
"The path cannot be blank.": "경로는 비워 둘 수 없습니다.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "속도 제한은 양수여야 합니다(0: 무제한)",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "속도 제한은 이 기기에 대한 모든 연결의 누적 트래픽에 적용됩니다.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "속도 제한은 음이 아닌 정수여야 합니다(0: 무제한)",
|
||||
"The remote device has not accepted sharing this folder.": "다른 기기가 이 폴더의 공유를 승인하지 않았습니다.",
|
||||
"The remote device has paused this folder.": "다른 기기가 이 폴더를 일시 중지했습니다.",
|
||||
"The rescan interval must be a non-negative number of seconds.": "재탐색 간격은 초 단위의 양수여야 합니다.",
|
||||
"The rescan interval must be a non-negative number of seconds.": "재탐색 간격은 초 단위의 음이 아닌 정수여야 합니다.",
|
||||
"There are no devices to share this folder with.": "이 폴더를 공유할 기기가 없습니다.",
|
||||
"There are no file versions to restore.": "복구할 파일 버전이 없습니다.",
|
||||
"There are no folders to share with this device.": "이 기기와 공유할 폴더가 없습니다.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "출시 후보 버전에서는 사용 보고가 항상 활성화되어 있습니다.",
|
||||
"Use HTTPS for GUI": "GUI에서 HTTPS 규약 사용",
|
||||
"Use notifications from the filesystem to detect changed items.": "파일 시스템 알림을 사용하여 변경 항목을 감시합니다.",
|
||||
"User": "사용자",
|
||||
"User Home": "사용자 홈 폴더",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "GUI 인증을 위한 사용자 이름과 비밀번호가 설정되지 않았습니다. 이들을 설정하는 것을 고려해 주십시오.",
|
||||
"Using a QUIC connection over LAN": "QUIC 프로토콜을 이용한 근거리 통신망(LAN)을 통해 연결되어 있습니다.",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "변경 항목 감시는 주기적으로 탐색하지 않아도 대부분의 변경 항목을 탐지합니다.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "새 기기를 추가할 때는 추가한 기기에서도 현재 기기를 추가해야 합니다.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "새 폴더를 추가할 때 폴더 식별자는 기기 간에 폴더를 묶어줍니다. 대소문자가 구분되며 모든 기기에서 동일해야 합니다.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "양쪽 기기에서 둘 이상으로 설정하면 Syncthing은 여러 개의 동시 연결을 설정하려고 시도합니다. 값이 서로 다르면 가장 높은 수가 적용됩니다. Syncthing이 결정하도록 하려면 0으로 설정하십시오.",
|
||||
"Yes": "예",
|
||||
"Yesterday": "어제",
|
||||
"You can also copy and paste the text into a new message manually.": "또한 내용을 복사해서 새 메시지에 직접 붙여 넣으셔도 됩니다.",
|
||||
|
||||
@@ -340,7 +340,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Nauji nustatymai išsaugoti, bet neaktyvuoti. Perleiskite Syncthing programą iš naujo norėdami įgalinti naujus nustatymus.",
|
||||
"The device ID cannot be blank.": "Įrenginio ID negali būti tuščias.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Įrenginio ID, kurį čia reikia įvesti, galite rasti „Veiksmai > Rodyti ID“ dialoge kitame įrenginyje. Tarpai ir brūkšneliai nebūtini (ignoruojami).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Kas dieną siunčiama šifruota naudojimo ataskaita. Ji naudojama sekti, kokios platformos naudojamos, aplankų dydžius ir programų versijas. Jei siunčiamų duomenų turinys pasikeis, šis dialogas bus parodytas iš naujo.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Kas dieną siunčiama šifruota naudojimo ataskaita. Ji naudojama sekti, kokios platformos naudojamos, aplankų dydžius ir programų versijas. Jei siunčiamų duomenų turinys pasikeis, šis dialogas bus parodytas iš naujo.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Įvestas neteisingas įrenginio ID. Turi būti 52 ar 56 simbolių eilutė su raidėmis ir skaičiais kuriuos galima atskirti tarpu arba brūkšneliu.",
|
||||
"The folder ID cannot be blank.": "Aplanko ID negali būti tuščias.",
|
||||
"The folder ID must be unique.": "Aplanko ID turi būti unikalus.",
|
||||
|
||||
@@ -269,7 +269,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Innstillingene har blitt lagret men ikke aktivert. Syncthing må starte på ny for å aktivere de nye innstillingene.",
|
||||
"The device ID cannot be blank.": "Enhets-ID kan ikke være tom.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Enhets-ID som skal skrives her kan du finne i menyen \"Handlinger\" > \"Vis ID\" på den andre enheten. Mellomrom og strek er valgfritt (ignoreres)",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Kryptert informasjon om bruken av programmet blir gjort daglig. Dette blir brukt til å følge med på vanlig brukte systemoppsett, størrelser på mapper, og versjoner av programmet. Om datasettet endrer seg vil denne dialogboksen dukke opp og du vil bli bedt om å godkjenne dette.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Kryptert informasjon om bruken av programmet blir gjort daglig. Dette blir brukt til å følge med på vanlig brukte systemoppsett, størrelser på mapper, og versjoner av programmet. Om datasettet endrer seg vil denne dialogboksen dukke opp og du vil bli bedt om å godkjenne dette.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "ID-en for denne enheten er ikke godkjent. Det bør være 52 eller 56 tegn bestående av bokstaver og tall, valgfritt med mellomrom og bindestrek.",
|
||||
"The folder ID cannot be blank.": "Mappe-ID kan ikke være tom.",
|
||||
"The folder ID must be unique.": "Mappe-ID må være unik.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Weet u zeker dat u {{count}} bestanden wilt herstellen?",
|
||||
"Are you sure you want to revert all local changes?": "Weet u zeker dat u alle lokale wijzigingen wilt terugdraaien?",
|
||||
"Are you sure you want to upgrade?": "Weet u zeker dat u wilt bijwerken?",
|
||||
"Authentication Required": "Authenticatie vereist",
|
||||
"Authors": "Auteurs",
|
||||
"Auto Accept": "Automatisch aanvaarden",
|
||||
"Automatic Crash Reporting": "Automatische crashrapportage",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "Geconfigureerd",
|
||||
"Connected (Unused)": "Verbonden (niet gebruikt)",
|
||||
"Connection Error": "Verbindingsfout",
|
||||
"Connection Management": "Verbindingsbeheer",
|
||||
"Connection Type": "Soort verbinding",
|
||||
"Connections": "Verbindingen",
|
||||
"Connections via relays might be rate limited by the relay": "Verbindingen via relays kunnen worden beperkt door de relay",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "Bijgevoegde software",
|
||||
"Incoming Rate Limit (KiB/s)": "Begrenzing downloadsnelheid (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Verkeerde configuratie kan de inhoud van uw map beschadigen en Syncthing onbruikbaar maken.",
|
||||
"Incorrect user name or password.": "Onjuiste gebruikersnaam of wachtwoord.",
|
||||
"Internally used paths:": "Intern gebruikte paden:",
|
||||
"Introduced By": "Geïntroduceerd door",
|
||||
"Introducer": "Introductie-apparaat",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Lokaal gewijzigde items",
|
||||
"Log": "Logboek",
|
||||
"Log File": "Logbestand",
|
||||
"Log In": "Aanmelden",
|
||||
"Log Out": "Afmelden",
|
||||
"Log in to see paths information.": "Aanmelden om pad-informatie te zien.",
|
||||
"Log in to see version information.": "Aanmelden om versie-informatie te zien.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Log-tailing gepauzeerd. Naar de onderkant scrollen om door te gaan.",
|
||||
"Login failed, see Syncthing logs for details.": "Aanmelden mislukt. Zie Syncthing-logs voor details.",
|
||||
"Logs": "Logboeken",
|
||||
"Major Upgrade": "Grote upgrade",
|
||||
"Mass actions": "Groepsacties",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Geen upgrades",
|
||||
"Not shared": "Niet gedeeld",
|
||||
"Notice": "Mededeling",
|
||||
"Number of Connections": "Aantal verbindingen",
|
||||
"OK": "Ok",
|
||||
"Off": "Uit",
|
||||
"Oldest First": "Oudste eerst",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Overschrijven",
|
||||
"Override Changes": "Wijzigingen overschrijven",
|
||||
"Ownership": "Eigendom",
|
||||
"Password": "Wachtwoord",
|
||||
"Path": "Pad",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Pad naar de map op de lokale computer. Zal aangemaakt worden als het niet bestaat. De tilde (~) kan gebruikt worden als snelkoppeling voor",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Pad waar versies opgeslagen moeten worden (leeg laten voor de standaard .stversion-map in de gedeelde map).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "De configuratie is opslagen maar nog niet ingeschakeld. Syncthing moet opnieuw gestart worden om de nieuwe configuratie in te schakelen.",
|
||||
"The device ID cannot be blank.": "De apparaat-ID mag niet leeg zijn.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "De hier in te vullen apparaat-ID kan gevonden worden in het venster \"Acties > ID weergeven\" op het andere apparaat. Spaties en streepjes zijn optioneel (en worden genegeerd).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Het versleutelde gebruiksrapport wordt dagelijks verzonden. Het wordt gebruikt om veelgebruikte platformen, mapgroottes en app-versies te volgen. Als de gerapporteerde dataset gewijzigd wordt, zal dit dialoogvenster opnieuw weergegeven worden.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Het versleutelde gebruiksrapport wordt dagelijks verzonden. Het wordt gebruikt om veelgebruikte platformen, mapgroottes en app-versies te volgen. Als de gerapporteerde dataset gewijzigd wordt, zal dit dialoogvenster opnieuw weergegeven worden.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "De opgegeven apparaat-ID ziet er niet goed uit. Het moet een reeks van 52 of 56 tekens zijn, bestaande uit letters en cijfers, waarbij spaties en streepjes optioneel zijn.",
|
||||
"The folder ID cannot be blank.": "De map-ID mag niet leeg zijn.",
|
||||
"The folder ID must be unique.": "De map-ID moet uniek zijn.",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Het interval, in seconden, voor het uitvoeren van opruiming in de versie-map. Nul om de regelmatige schoonmaak uit te schakelen.",
|
||||
"The maximum age must be a number and cannot be blank.": "De maximumleeftijd moet een getal zijn en mag niet leeg zijn.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "De maximale tijd om een versie te bewaren (in dagen, instellen op 0 om versies voor altijd te bewaren).",
|
||||
"The number of connections must be a non-negative number.": "Het aantal verbindingen moet een niet-negatief getal zijn.",
|
||||
"The number of days must be a number and cannot be blank.": "Het aantal dagen moet een getal zijn en mag niet leeg zijn.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Het aantal dagen om bestanden in de prullenbak te bewaren. Nul betekent voor altijd.",
|
||||
"The number of old versions to keep, per file.": "Het aantal te bewaren oude versies, per bestand.",
|
||||
"The number of versions must be a number and cannot be blank.": "Het aantal versies moet een getal zijn en mag niet leeg ziijn.",
|
||||
"The path cannot be blank.": "Het pad mag niet leeg zijn.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "De snelheidsbegrenzing wordt toegepast op het totale verkeer van alle verbindingen naar dit apparaat.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "De snelheidsbegrenzing moet een positief getal zijn (0: geen begrenzing)",
|
||||
"The remote device has not accepted sharing this folder.": "Het externe apparaat heeft het delen van deze map niet geaccepteerd.",
|
||||
"The remote device has paused this folder.": "Het externe apparaat heeft deze map gepauzeerd.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Gebruiksrapportering is altijd ingeschakeld voor de kandidaat-releases.",
|
||||
"Use HTTPS for GUI": "HTTPS gebruiken voor GUI",
|
||||
"Use notifications from the filesystem to detect changed items.": "Meldingen van het bestandssysteem gebruiken om gewijzigde items te detecteren.",
|
||||
"User": "Gebruiker",
|
||||
"User Home": "Thuismap gebruiker",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Gebruikersnaam/wachtwoord is niet ingesteld voor de GUI-authenticatie. Overweeg om het in te stellen.",
|
||||
"Using a QUIC connection over LAN": "Een QUIC-verbinding via LAN gebruiken",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Opvolgen van wijzigingen ontdekt de meeste wijzigingen zonder regelmatig scannen.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Houd er bij het toevoegen van een nieuw apparaat rekening mee dat dit apparaat ook aan de andere kant moet toegevoegd worden.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Houd er bij het toevoegen van een nieuwe map rekening mee dat de map-ID gebruikt wordt om mappen aan elkaar te koppelen tussen apparaten. Ze zijn hoofdlettergevoelig en moeten exact overeenkomen op alle apparaten.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Indien ingesteld op meer dan één op beide apparaten, probeert Syncthing meerdere gelijktijdige verbindingen tot stand te brengen. Als de waarden verschillen, wordt de hoogste gebruikt. Op nul zetten om Syncthing te laten beslissen.",
|
||||
"Yes": "Ja",
|
||||
"Yesterday": "Gisteren",
|
||||
"You can also copy and paste the text into a new message manually.": "U kunt de tekst ook handmatig kopiëren en in een nieuw bericht plakken.",
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Instillingane har blitt lagra men ikkje aktivert. Syncthing må starta på ny for å aktivera dei nye instillingane.",
|
||||
"The device ID cannot be blank.": "Eining ID kan ikkje vera tom.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Einings-ID-en som skal oppgjevast her kan hentast fram via menyvalet «Handlingar > Vis ID» på den andre eininga. Mellomrom og bindestrek er valfritt (blir ignorert).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Den krypterte bruksrapporten vert send dagleg. Han vert nytta til å spora vanlege plattformer, mappestorleikar og programutgåvene. Om datasettet endrar seg, vil dette meldingsvindauget dukka opp att, og du vil verta beden om å godkjenna det.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Den krypterte bruksrapporten vert send dagleg. Han vert nytta til å spora vanlege plattformer, mappestorleikar og programutgåvene. Om datasettet endrar seg, vil dette meldingsvindauget dukka opp att, og du vil verta beden om å godkjenna det.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Einings-ID-en er ikkje gyldig. Han må vera på 52 eller 56 teikn og vera samansett av bokstavar og tal med valfrie mellomrom og bindestrekar.",
|
||||
"The folder ID cannot be blank.": "Mappe ID kan ikkje vera tom.",
|
||||
"The folder ID must be unique.": "Mappe ID må vera unik.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Czy na pewno chcesz przywrócić {{count}} plików?",
|
||||
"Are you sure you want to revert all local changes?": "Czy na pewno chcesz odrzucić wszystkie zmiany lokalne?",
|
||||
"Are you sure you want to upgrade?": "Czy na pewno chcesz zezwolić na aktualizację?",
|
||||
"Authentication Required": "Wymagane uwierzytelnienie",
|
||||
"Authors": "Twórcy",
|
||||
"Auto Accept": "Autoakceptacja",
|
||||
"Automatic Crash Reporting": "Automatyczne zgłaszanie awarii",
|
||||
@@ -65,9 +66,10 @@
|
||||
"Configured": "Ustawiony",
|
||||
"Connected (Unused)": "Połączony (nieużywany)",
|
||||
"Connection Error": "Błąd połączenia",
|
||||
"Connection Management": "Zarządzanie połączeniami",
|
||||
"Connection Type": "Rodzaj połączenia",
|
||||
"Connections": "Połączenia",
|
||||
"Connections via relays might be rate limited by the relay": "Prędkość połączeń za pośrednictwem przekazywaczy może być ograniczona przez danego przekazywacza",
|
||||
"Connections via relays might be rate limited by the relay": "Prędkość połączeń za pośrednictwem przekaźników może być ograniczona przez dany przekaźnik",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Ciągłe obserwowanie zmian jest już dostępne w programie Syncthing. Będzie ono wykrywać zmiany na dysku i uruchamiać skanowanie tylko w zmodyfikowanych ścieżkach. Zalety tego rozwiązania są takie, że zmiany rozsyłane są szybciej oraz że wymagane jest mniej pełnych skanowań.",
|
||||
"Copied from elsewhere": "Skopiowane z innego miejsca",
|
||||
"Copied from original": "Skopiowane z pierwotnego pliku",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "Zawarte oprogramowanie",
|
||||
"Incoming Rate Limit (KiB/s)": "Ograniczenie prędkości pobierania (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Niepoprawne ustawienia mogą uszkodzić zawartość folderów oraz uczynić Syncthing niesprawnym.",
|
||||
"Incorrect user name or password.": "Nieprawidłowa nazwa użytkownika lub hasło.",
|
||||
"Internally used paths:": "Ścieżki używane wewnętrznie:",
|
||||
"Introduced By": "Wprowadzony przez",
|
||||
"Introducer": "Wprowadzający",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Elementy zmodyfikowane lokalnie",
|
||||
"Log": "Zdarzenia",
|
||||
"Log File": "Plik dziennika zdarzeń",
|
||||
"Log In": "Zaloguj się",
|
||||
"Log Out": "Wyloguj się",
|
||||
"Log in to see paths information.": "Zaloguj się, aby zobaczyć informacje o ścieżkach.",
|
||||
"Log in to see version information.": "Zaloguj się, aby zobaczyć informacje o wersji.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Zatrzymano wypisywanie logów. Przewiń w dół, aby je wznowić.",
|
||||
"Login failed, see Syncthing logs for details.": "Logowanie nie powiodło się. Aby uzyskać szczegółowe informacje, zobacz dziennik zdarzeń programu Syncthing.",
|
||||
"Logs": "Dziennik zdarzeń",
|
||||
"Major Upgrade": "Duża aktualizacja",
|
||||
"Mass actions": "Działania masowe",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Brak aktualizacji",
|
||||
"Not shared": "Niewspółdzielony",
|
||||
"Notice": "Powiadomienie",
|
||||
"Number of Connections": "Liczba połączeń",
|
||||
"OK": "OK",
|
||||
"Off": "Wyłączona",
|
||||
"Oldest First": "Od najstarszych",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Nadpisz",
|
||||
"Override Changes": "Nadpisz zmiany",
|
||||
"Ownership": "Prawa własności",
|
||||
"Password": "Hasło",
|
||||
"Path": "Ścieżka",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Ścieżka do folderu na komputerze lokalnym. Zostanie utworzona, jeżeli jeszcze nie istnieje. Znak tyldy (~) może zostać użyty jako skrót do",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Ścieżka przechowywania wersji (pozostaw pustą dla domyślnego katalogu .stversions we współdzielonym folderze).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Ustawienia zostały zapisane, ale nie są jeszcze aktywne. Syncthing musi zostać uruchomiony ponownie, aby aktywować nowe ustawienia.",
|
||||
"The device ID cannot be blank.": "Identyfikator urządzenia nie może być pusty.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Identyfikator urządzenia do wpisania tutaj można znaleźć w oknie \"Działania > Pokaż identyfikator\" na innym urządzeniu. Spacje i myślniki są opcjonalne (ignorowane).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Zaszyfrowane statystyki użycia są wysyłane codziennie. Używane są one do śledzenia popularności systemów, rozmiarów folderów oraz wersji programu. Jeżeli wysyłane statystyki ulegną zmianie, zostaniesz poproszony o ponowne udzielenie zgody w tym oknie.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Zaszyfrowane statystyki użycia są wysyłane codziennie. Używane są one do śledzenia popularności systemów, rozmiarów folderów oraz wersji programu. Jeżeli wysyłane statystyki ulegną zmianie, zostaniesz poproszony o ponowne udzielenie zgody w tym oknie.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Wprowadzony identyfikator urządzenia wygląda na niepoprawny. Musi on zawierać 52 lub 56 znaków składających się z liter i cyfr. Spacje i myślniki są opcjonalne.",
|
||||
"The folder ID cannot be blank.": "Identyfikator folderu nie może być pusty.",
|
||||
"The folder ID must be unique.": "Identyfikator folderu musi być niepowtarzalny.",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Przedział czasowy, w sekundach, w którym nastąpi czyszczenie katalogu wersjonowania. Ustaw na zero, aby wyłączyć czyszczenie okresowe.",
|
||||
"The maximum age must be a number and cannot be blank.": "Maksymalny wiek musi być wartością liczbową oraz nie może być pusty.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Maksymalny czas zachowania wersji (w dniach; ustaw na 0, aby zachować na zawsze).",
|
||||
"The number of connections must be a non-negative number.": "Liczba połączeń musi być nieujemną wartością liczbową.",
|
||||
"The number of days must be a number and cannot be blank.": "Liczba dni musi być wartością liczbową oraz nie może być pusta.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Liczba dni, przez które pliki trzymane będą w koszu. Zero oznacza nieskończoność.",
|
||||
"The number of old versions to keep, per file.": "Liczba starszych wersji do zachowania, dla pojedynczego pliku.",
|
||||
"The number of versions must be a number and cannot be blank.": "Liczba wersji musi być wartością liczbową oraz nie może być pusta.",
|
||||
"The path cannot be blank.": "Ścieżka nie może być pusta.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Ograniczenie prędkości dotyczy skumulowanego ruchu na wszystkich połączeniach z tym urządzeniem.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Ograniczenie prędkości musi być nieujemną wartością liczbową (0: brak ograniczeń)",
|
||||
"The remote device has not accepted sharing this folder.": "Urządzenie zdalne nie wyraziło zgody na udostępnienie tego folderu.",
|
||||
"The remote device has paused this folder.": "Urządzenie zdalnie zatrzymało ten folder.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Statystyki użycia są zawsze włączone dla wydań kandydujących.",
|
||||
"Use HTTPS for GUI": "Użyj HTTPS dla GUI",
|
||||
"Use notifications from the filesystem to detect changed items.": "Używaj powiadomień systemu plików do wykrywania zmienionych elementów.",
|
||||
"User": "Użytkownik",
|
||||
"User Home": "Katalog domowy użytkownika",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Nazwa użytkownika i hasło do uwierzytelniania GUI nie zostały skonfigurowane. Zastanów się nad ich ustawieniem.",
|
||||
"Using a QUIC connection over LAN": "Używane jest połączenie przez protokół QUIC w sieci lokalnej LAN",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Obserwowanie wykrywa większość zmian bez potrzeby okresowego skanowania.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Dodając nowe urządzenie pamiętaj, że musi ono zostać dodane także po drugiej stronie.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Dodając nowy folder pamiętaj, że identyfikator używany jest do parowania folderów pomiędzy urządzeniami. Wielkość liter ma znaczenie i musi być on identyczny na wszystkich urządzeniach.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Jeśli na obu urządzeniach ustawiono wartość większą niż jeden, Syncthing podejmie próbę ustanowienia wielu jednoczesnych połączeń. Jeżeli wartości się różnią, zostanie użyta najwyższa. Ustaw na zero, aby to Syncthing zdecydował.",
|
||||
"Yes": "Tak",
|
||||
"Yesterday": "Wczoraj",
|
||||
"You can also copy and paste the text into a new message manually.": "Możesz również skopiować i wkleić ten tekst do nowej wiadomości ręcznie.",
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
"Automatic Crash Reporting": "Relatório automático de falhas",
|
||||
"Automatic upgrade now offers the choice between stable releases and release candidates.": "A atualização automática agora oferece a escolha entre versões estáveis e candidatas ao lançamento.",
|
||||
"Automatic upgrades": "Atualizações automáticas",
|
||||
"Automatic upgrades are always enabled for candidate releases.": "Upgrades automáticos estão sempre habilitados em versões candidatas ao lançamento",
|
||||
"Automatic upgrades are always enabled for candidate releases.": "Upgrades automáticos estão sempre habilitados em versões candidatas ao lançamento.",
|
||||
"Automatically create or share folders that this device advertises at the default path.": "Criar ou compartilhar automaticamente pastas que este dispositivo anuncia no caminho padrão.",
|
||||
"Available debug logging facilities:": "Facilidades de depuração disponíveis:",
|
||||
"Be careful!": "Tenha cuidado!",
|
||||
@@ -65,9 +65,10 @@
|
||||
"Configured": "Configurado",
|
||||
"Connected (Unused)": "Conectado (Não usado)",
|
||||
"Connection Error": "Erro de conexão",
|
||||
"Connection Management": "Gerenciamento de Conexões",
|
||||
"Connection Type": "Tipo da conexão",
|
||||
"Connections": "Conexões",
|
||||
"Connections via relays might be rate limited by the relay": "Conexões via relés podem podem ter velocidade limitada pelo relé",
|
||||
"Connections via relays might be rate limited by the relay": "Conexões que usam retransmissão podem podem ter velocidade limitada pelo retransmissor",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Observar continuamente as alterações agora está disponível no Syncthing. Isso detectará mudanças no disco e fará uma varredura apenas nos caminhos modificados. Os benefícios são que as alterações são propagadas mais rapidamente e menos verificações completas são necessárias.",
|
||||
"Copied from elsewhere": "Copiado de outro lugar",
|
||||
"Copied from original": "Copiado do original",
|
||||
@@ -98,13 +99,13 @@
|
||||
"Device Identification": "Identificação do dispositivo",
|
||||
"Device Name": "Nome do dispositivo",
|
||||
"Device is untrusted, enter encryption password": "O dispositivo não é confiável, digite a senha de criptografia",
|
||||
"Device rate limits": "Limites de taxa do dispositivo",
|
||||
"Device rate limits": "Limites de velocidade do dispositivo",
|
||||
"Device that last modified the item": "Dispositivo que modificou o item pela última vez",
|
||||
"Devices": "Dispositivos",
|
||||
"Disable Crash Reporting": "Desabilitar relatório de falhas",
|
||||
"Disabled": "Desabilitado",
|
||||
"Disabled periodic scanning and disabled watching for changes": "Verificação periódica e verificação automática de mudanças desabilitadas",
|
||||
"Disabled periodic scanning and enabled watching for changes": "Verificação periódica desabilitada. Verificação automática de mudanças habilitada.",
|
||||
"Disabled periodic scanning and enabled watching for changes": "Verificação periódica desabilitada. Verificação automática de mudanças habilitada",
|
||||
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Verificação periódica desabilitada. Não foi possível configurar a verificação automática de mudanças, tentando novamente a cada 1 minuto:",
|
||||
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Desativa a comparação e sincronização de permissões de arquivo. Útil em sistemas com permissões inexistentes ou personalizadas (por exemplo, FAT, exFAT, Synology, Android).",
|
||||
"Discard": "Descartar",
|
||||
@@ -140,7 +141,7 @@
|
||||
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Habilita o envio de informações de propriedade para outros dispositivos, mas não aplica as informações de propriedade recebida. Isto pode ter um impacto significativo no desempenho. Sempre habilitado quando \"Sincronizar informações de propriedade\" está habilitado.",
|
||||
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Insira um número não negativo (por exemplo, 2.35) e escolha uma unidade. Porcentagens são como parte do tamanho total do disco.",
|
||||
"Enter a non-privileged port number (1024 - 65535).": "Insira um número de porta não privilegiada (1024-65535).",
|
||||
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Digite os endereços separados por vírgula (\"tcp://ip:porta\", \"tcp://host:porta\") ou \"dinâmico\" para realizar a descoberta automática do endereço.",
|
||||
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Digite os endereços separados por vírgula (\"tcp://ip:porta\", \"tcp://host:porta\") ou \"dynamic\" para realizar a descoberta automática do endereço.",
|
||||
"Enter ignore patterns, one per line.": "Insira os filtros, um por linha.",
|
||||
"Enter up to three octal digits.": "Insira até três dígitos octais.",
|
||||
"Error": "Erro",
|
||||
@@ -206,6 +207,7 @@
|
||||
"Internally used paths:": "Caminhos usados internamente:",
|
||||
"Introduced By": "Introduzido por",
|
||||
"Introducer": "Apresentador",
|
||||
"Introduction": "Introdução",
|
||||
"Inversion of the given condition (i.e. do not exclude)": "Inversão de uma condição (ou seja, não excluir)",
|
||||
"Keep Versions": "Manter versões",
|
||||
"LDAP": "LDAP",
|
||||
@@ -223,7 +225,7 @@
|
||||
"Listener Status": "Status da Escuta",
|
||||
"Listeners": "Escutadores",
|
||||
"Loading data...": "Carregando dados...",
|
||||
"Loading...": "Carregando",
|
||||
"Loading...": "Carregando...",
|
||||
"Local Additions": "Acréscimos locais",
|
||||
"Local Discovery": "Descoberta local",
|
||||
"Local State": "Estado local",
|
||||
@@ -253,11 +255,12 @@
|
||||
"Newest First": "Mais novo primeiro",
|
||||
"No": "Não",
|
||||
"No File Versioning": "Desligado",
|
||||
"No files will be deleted as a result of this operation.": "Nenhum arquivo será apagado como resultado desta operação",
|
||||
"No files will be deleted as a result of this operation.": "Nenhum arquivo será apagado como resultado desta operação.",
|
||||
"No rules set": "Nenhuma regra definida",
|
||||
"No upgrades": "Sem atualizações",
|
||||
"Not shared": "Não compartilhado",
|
||||
"Notice": "Aviso",
|
||||
"Number of Connections": "Número de Conexões",
|
||||
"OK": "OK",
|
||||
"Off": "Desligada",
|
||||
"Oldest First": "Mais antigo primeiro",
|
||||
@@ -271,7 +274,7 @@
|
||||
"Ownership": "Informação de propriedade",
|
||||
"Path": "Caminho",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Caminho para a pasta na máquina local. Será criado caso não exista. O caractere til (~) pode ser usado como um atalho para",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Caminho do diretório onde as versões são salvas (deixe em branco para que seja o diretório padrão .stversions dentro da pasta compartilhada). ",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Caminho do diretório onde as versões são salvas (deixe em branco para que seja o diretório padrão .stversions dentro da pasta compartilhada).",
|
||||
"Paths": "Caminhos",
|
||||
"Pause": "Pausar",
|
||||
"Pause All": "Pausar todas",
|
||||
@@ -293,7 +296,7 @@
|
||||
"QR code": "Código QR",
|
||||
"QUIC LAN": "QUIC LAN",
|
||||
"QUIC WAN": "QUIC WAN",
|
||||
"QUIC connections are in most cases considered suboptimal": "Conexões QUIC são, na maioria dos casos, consideradas abaixo do ideal.",
|
||||
"QUIC connections are in most cases considered suboptimal": "Conexões QUIC são, na maioria dos casos, consideradas abaixo do ideal",
|
||||
"Quick guide to supported patterns": "Guia rápido dos padrões suportados",
|
||||
"Random": "Aleatória",
|
||||
"Receive Encrypted": "Receber Criptografado",
|
||||
@@ -395,7 +398,7 @@
|
||||
"Syncthing is saving changes.": "O Syncthing está salvando as alterações.",
|
||||
"Syncthing is upgrading.": "O Syncthing está sendo atualizado.",
|
||||
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "O Syncthing agora oferece suporte a relatórios automáticos de falhas para os desenvolvedores. Este recurso é habilitado por padrão.",
|
||||
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Parece que o Syncthing está desligado ou há um problema com a sua conexão de internet. Tentando novamente...",
|
||||
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Parece que o Syncthing está desligado ou há um problema com a sua conexão de internet. Tentando novamente…",
|
||||
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Parece que o Syncthing está tendo problemas no processamento da requisição. Por favor, atualize a página ou reinicie o Syncthing caso o problema persista.",
|
||||
"TCP LAN": "TCP LAN",
|
||||
"TCP WAN": "TCP WAN",
|
||||
@@ -408,7 +411,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "A configuração foi salva mas ainda não foi ativada. O Syncthing precisa ser reiniciado para a ativação da nova configuração.",
|
||||
"The device ID cannot be blank.": "O ID de dispositivo não pode ficar vazio.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "O ID do dispositivo a ser inserido aqui pode ser obtido no menu \"Ações > Mostrar ID\" do outro dispositivo. Espaços e hífens são opcionais (ignorados).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "O relatório de uso é criptografado e enviado diariamente. É utilizado para rastrear plataformas, tamanhos de pastas e versões da aplicação. Caso o formato dos dados seja alterado, esta janela te avisará.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "O relatório de uso é criptografado e enviado diariamente. É utilizado para rastrear plataformas, tamanhos de pastas e versões da aplicação. Caso o formato dos dados seja alterado, esta janela te avisará.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "O ID de dispositivo inserido não parece ser válido. Ele deve ter entre 52 e 56 caracteres e ser composto de letras e números, com espaços e hífens opcionais.",
|
||||
"The folder ID cannot be blank.": "O ID da pasta não pode ficar vazio.",
|
||||
"The folder ID must be unique.": "O ID da pasta deve ser único.",
|
||||
@@ -425,11 +428,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "O intervalo, em segundos, para executar a limpeza na pasta de versões. Zero para desativar a limpeza periódica.",
|
||||
"The maximum age must be a number and cannot be blank.": "A idade máxima deve ser um valor numérico. O campo não pode ficar vazio.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "O número máximo de dias em que uma versão é guardada. (Use 0 para manter para sempre).",
|
||||
"The number of connections must be a non-negative number.": "O número de conexões deve ser positivo.",
|
||||
"The number of days must be a number and cannot be blank.": "O número de dias deve ser um número válido e não pode ficar em branco.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "O número de dias em que são mantidos os arquivos da lixeira. Zero significa para sempre.",
|
||||
"The number of old versions to keep, per file.": "O número de versões antigas a serem mantidas, por arquivo.",
|
||||
"The number of versions must be a number and cannot be blank.": "O número de versões deve ser um valor numérico. O campo não pode ficar vazio.",
|
||||
"The path cannot be blank.": "O caminho não pode ficar vazio.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "O limite de velocidade é aplicado à soma das velocidades de todas as conexões deste dispositivo.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "O limite de velocidade deve ser um número positivo (0: sem limite)",
|
||||
"The remote device has not accepted sharing this folder.": "O dispositivo remoto não aceitou compartilhar esta pasta.",
|
||||
"The remote device has paused this folder.": "O dispositivo remoto pausou esta pasta.",
|
||||
@@ -471,7 +476,7 @@
|
||||
"Upgrading": "Atualizando",
|
||||
"Upload Rate": "Velocidade de envio",
|
||||
"Uptime": "Tempo ligado",
|
||||
"Usage reporting is always enabled for candidate releases.": "O relatório de uso está sempre habilitado em versões candidatas ao lançamento",
|
||||
"Usage reporting is always enabled for candidate releases.": "O relatório de uso está sempre habilitado em versões candidatas ao lançamento.",
|
||||
"Use HTTPS for GUI": "Usar HTTPS para a interface web",
|
||||
"Use notifications from the filesystem to detect changed items.": "Usar notificações do sistema de ficheiros para detectar itens alterados.",
|
||||
"User Home": "Pasta do usuário",
|
||||
@@ -491,13 +496,14 @@
|
||||
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "Aviso: este caminho é o diretório pai da pasta \"{{otherFolder}}\".",
|
||||
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Aviso: este caminho é o diretório pai da pasta \"{{otherFolderLabel}}\" ({{otherFolder}}).",
|
||||
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Atenção, este caminho é um subdiretório de uma pasta já existente: \"{{otherFolder}}\".",
|
||||
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Aviso: este caminho é um subdiretório da pasta \"{{otherFolderLabel}}\" ({{otherFolder}})",
|
||||
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Aviso: este caminho é um subdiretório da pasta \"{{otherFolderLabel}}\" ({{otherFolder}}).",
|
||||
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "Aviso: caso você esteja usando um observador externo como o {{syncthingInotify}}, tenha certeza de que ele está desativado.",
|
||||
"Watch for Changes": "Observar alterações",
|
||||
"Watching for Changes": "Observando alterações",
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Observar as mudanças descobre a maioria das mudanças sem uma verificação periódica.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Quando estiver adicionando um dispositivo, lembre-se de que este dispositivo deve ser adicionado do outro lado também.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Quando adicionar uma nova pasta, lembre-se que o ID da pasta é utilizado para ligar pastas entre dispositivos. Ele é sensível às diferenças entre maiúsculas e minúsculas e deve ser o mesmo em todos os dispositivos.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Quando definido para mais de 1 em ambos os dispositivos, o Syncthing vai tentar estabelecer múltiplas conexões. Caso os valores sejam diferentes, o maior será usado. Defina como 0 para deixar o Syncthing decidir.",
|
||||
"Yes": "Sim",
|
||||
"Yesterday": "Ontem",
|
||||
"You can also copy and paste the text into a new message manually.": "Você também pode copiar e colar o texto numa nova mensagem manualmente.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Tem a certeza que quer restaurar {{count}} ficheiros?",
|
||||
"Are you sure you want to revert all local changes?": "Tem a certeza que quer reverter todas as alterações locais?",
|
||||
"Are you sure you want to upgrade?": "Tem a certeza que quer actualizar?",
|
||||
"Authentication Required": "É necessária autenticação",
|
||||
"Authors": "Autores",
|
||||
"Auto Accept": "Aceitar automaticamente",
|
||||
"Automatic Crash Reporting": "Relatório Automático de Estouro",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "Configurado",
|
||||
"Connected (Unused)": "Conectado (não usado)",
|
||||
"Connection Error": "Erro de ligação",
|
||||
"Connection Management": "Gestão de ligações",
|
||||
"Connection Type": "Tipo de ligação",
|
||||
"Connections": "Ligações",
|
||||
"Connections via relays might be rate limited by the relay": "Ligações via retransmissores podem ter a velocidade limitada pelo retransmissor",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "Software incluído",
|
||||
"Incoming Rate Limit (KiB/s)": "Limite de velocidade de recepção (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Uma configuração incorrecta pode danificar o conteúdo da pasta e tornar o Syncthing inoperacional.",
|
||||
"Incorrect user name or password.": "Nome de utilizador ou senha errados.",
|
||||
"Internally used paths:": "Caminhos usados internamente:",
|
||||
"Introduced By": "Introduzido por",
|
||||
"Introducer": "Apresentador",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Itens alterados localmente",
|
||||
"Log": "Registo",
|
||||
"Log File": "Ficheiro de registo",
|
||||
"Log In": "Iniciar sessão",
|
||||
"Log Out": "Terminar sessão",
|
||||
"Log in to see paths information.": "Inicie sessão para ver informação dos caminhos.",
|
||||
"Log in to see version information.": "Inicie sessão para ver informação da versão.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "O acompanhamento do final do registo está em pausa. Desloque para o final para continuar.",
|
||||
"Login failed, see Syncthing logs for details.": "O início da sessão falhou. Veja os registos do Syncthing para mais detalhes.",
|
||||
"Logs": "Registos",
|
||||
"Major Upgrade": "Actualização importante",
|
||||
"Mass actions": "Operações em massa",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Sem actualizações",
|
||||
"Not shared": "Não partilhada",
|
||||
"Notice": "Avisos",
|
||||
"Number of Connections": "Número de ligações",
|
||||
"OK": "OK",
|
||||
"Off": "Desligada",
|
||||
"Oldest First": "Primeiro os mais antigos",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Sobrepor",
|
||||
"Override Changes": "Sobrepor alterações",
|
||||
"Ownership": "Informação de propriedade",
|
||||
"Password": "Senha",
|
||||
"Path": "Caminho",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Caminho para a pasta no computador local. Será criada, caso não exista. O til (~) pode ser utilizado como atalho para",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Caminho da pasta onde as versões deverão ser guardadas (deixe vazio para ficar a pasta predefinida .stversions dentro da pasta partilhada).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "A configuração foi gravada mas não activada. O Syncthing tem que reiniciar para activar a nova configuração.",
|
||||
"The device ID cannot be blank.": "O ID do dispositivo não pode estar vazio.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "O ID do dispositivo a colocar aqui pode ser obtido no menu \"Operações > Mostrar ID\" do outro dispositivo. Espaços e hífenes são opcionais (ignorados).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "O relatório de utilização cifrado é enviado diariamente. É utilizado para rastrear plataformas comuns, tamanhos de pastas e versões da aplicação. Se o tipo de dados do relatório for alterado, será notificado novamente através desta janela.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "O relatório de utilização cifrado é enviado diariamente. É utilizado para rastrear plataformas comuns, tamanhos de pastas e versões da aplicação. Se o tipo de dados do relatório for alterado, será notificado novamente através desta janela.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "O ID do dispositivo fornecido não parece ser válido. Deveria ter 52 ou 56 caracteres constituídos por letras e números, com espaços e hífenes opcionais.",
|
||||
"The folder ID cannot be blank.": "O ID da pasta não pode estar vazio.",
|
||||
"The folder ID must be unique.": "O ID da pasta tem que ser único.",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "O intervalo, em segundos, para executar limpezas na pasta das versões. Coloque zero para desactivar a limpeza periódica.",
|
||||
"The maximum age must be a number and cannot be blank.": "A idade máxima tem que ser um número e não pode estar vazia.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Tempo máximo, em dias, para manter uma versão (use 0 para manter a versão para sempre).",
|
||||
"The number of connections must be a non-negative number.": "O número de ligações tem que ser um número não negativo.",
|
||||
"The number of days must be a number and cannot be blank.": "O número de dias tem que ser um número e não pode estar em branco.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "O número de dias a manter os ficheiros no caixote do lixo. Zero significa para sempre.",
|
||||
"The number of old versions to keep, per file.": "O número de versões antigas a manter, por ficheiro.",
|
||||
"The number of versions must be a number and cannot be blank.": "O número de versões tem que ser um número e não pode estar vazio.",
|
||||
"The path cannot be blank.": "O caminho não pode estar vazio.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "O limite de velocidade é aplicado ao tráfego acumulado de todas as ligações a este dispositivo.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "O limite de velocidade tem que ser um número que não seja negativo (0: sem limite)",
|
||||
"The remote device has not accepted sharing this folder.": "O dispositivo remoto não aceitou a partilha desta pasta.",
|
||||
"The remote device has paused this folder.": "O dispositivo remoto colocou esta pasta em pausa.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "O relatório de utilização está sempre activado nas versões candidatas a lançamento.",
|
||||
"Use HTTPS for GUI": "Utilizar HTTPS na interface gráfica",
|
||||
"Use notifications from the filesystem to detect changed items.": "Usar notificações do sistema de ficheiros para detectar itens alterados.",
|
||||
"User": "Utilizador",
|
||||
"User Home": "Pasta do utilizador",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "O nome de utilizador e a respectiva senha para a autenticação na interface gráfica não foram definidos. Considere efectuar essa configuração.",
|
||||
"Using a QUIC connection over LAN": "Usando uma ligação QUIC sobre LAN",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "A vigilância de alterações descobre a maior parte das alterações sem a necessidade de fazer uma verificação periódica.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Quando adicionar um novo dispositivo, lembre-se que este dispositivo tem que ser adicionado do outro lado também.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Quando adicionar uma nova pasta, lembre-se que o ID da pasta é utilizado para ligar as pastas entre dispositivos. É sensível às diferenças entre maiúsculas e minúsculas e tem que ter uma correspondência perfeita entre todos os dispositivos.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Quando definido para mais do que um em ambos os dispositivos, Syncthing irá tentar estabelecer múltiplas ligações concorrentes. Se os valores diferirem, será usado o maior. Defina como zero para deixar o Syncthing decidir.",
|
||||
"Yes": "Sim",
|
||||
"Yesterday": "Ontem",
|
||||
"You can also copy and paste the text into a new message manually.": "Também pode copiar e colar o texto numa nova mensagem manualmente.",
|
||||
|
||||
@@ -326,7 +326,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Configuraţia a fost salvată dar nu şi activată. Syncthing trebuie să repornească pentru a activa noua configuraţie.",
|
||||
"The device ID cannot be blank.": "ID-ul dispozitivului nu poate fi gol.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Raportul codat de utilizare este trimit zilnic. Este folosit pentru studierea platformelor comune, dimensiunilor fişierelor şi versiunea aplicaţiilor. În cazul în care setul de date trimis este modificat, acest dialog va aparea din nou. ",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Raportul codat de utilizare este trimit zilnic. Este folosit pentru studierea platformelor comune, dimensiunilor fişierelor şi versiunea aplicaţiilor. În cazul în care setul de date trimis este modificat, acest dialog va aparea din nou. ",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "ID-ul dispozitivului nu pare a fi valid.El trebuie sa fie format dintrun șir din 52 ori 56 de caractere formate din litere și cifre, cu spatii și linii opțional.",
|
||||
"The folder ID cannot be blank.": "ID-ul mapei nu poate fi gol.",
|
||||
"The folder ID must be unique.": "ID-ul mapei trebuie să fie unic.",
|
||||
|
||||
@@ -390,7 +390,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Конфигурация была сохранена, но не активирована. Syncthing должен быть перезапущен для применения новой конфигурации.",
|
||||
"The device ID cannot be blank.": "ID устройства не может быть пустым.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Идентификатор устройства можно найти в диалоге «Действия → Показать ID» на другом устройстве. Пробелы и дефисы вводить не обязательно (игнорируются).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Зашифрованный отчет об использовании отправляется ежедневно. Это используется для отслеживания общих платформ, размеров папок и версий приложения. Если отчетные данные изменятся, вам будет снова показано это диалоговое окно.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Зашифрованный отчет об использовании отправляется ежедневно. Это используется для отслеживания общих платформ, размеров папок и версий приложения. Если отчетные данные изменятся, вам будет снова показано это диалоговое окно.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Введён недопустимый ID устройства. Он должен состоять из букв и цифр, может включать пробелы и дефисы, длина должна быть 52 или 56 символов.",
|
||||
"The folder ID cannot be blank.": "ID папки не может быть пустым.",
|
||||
"The folder ID must be unique.": "ID папки должен быть уникальным.",
|
||||
|
||||
@@ -389,7 +389,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "වින්යාසය සුරකින ලද නමුත් සක්රිය කර නැත. නව වින්යාසය සක්රිය කිරීමට සමමුහුර්ත කිරීම නැවත ආරම්භ කළ යුතුය.",
|
||||
"The device ID cannot be blank.": "උපාංගයේ හැඳු. හිස් නොවිය යුතුය.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "මෙහි ඇතුළු කිරීමට උපාංග හැඳුනුම්පත අනෙක් උපාංගයේ \"ක්රියා > පෙන්වන්න ID\" සංවාදයෙන් සොයා ගත හැක. අවකාශ සහ ඉරි විකල්ප වේ (නොසලකා හැර ඇත).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "සංකේතාත්මක භාවිත වාර්තාව දිනපතා යවනු ලැබේ. එය පොදු වේදිකා, ෆෝල්ඩර ප්රමාණ සහ යෙදුම් අනුවාද නිරීක්ෂණය කිරීමට භාවිතා කරයි. වාර්තා කළ දත්ත කට්ටලය වෙනස් කළහොත් මෙම සංවාදය සමඟ නැවත ඔබෙන් විමසනු ඇත.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "සංකේතාත්මක භාවිත වාර්තාව දිනපතා යවනු ලැබේ. එය පොදු වේදිකා, ෆෝල්ඩර ප්රමාණ සහ යෙදුම් අනුවාද නිරීක්ෂණය කිරීමට භාවිතා කරයි. වාර්තා කළ දත්ත කට්ටලය වෙනස් කළහොත් මෙම සංවාදය සමඟ නැවත ඔබෙන් විමසනු ඇත.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "ඇතුළු කළ උපාංග හැඳුනුම්පත වලංගු නොවන බව පෙනේ. එය අකුරු සහ ඉලක්කම් වලින් සමන්විත අක්ෂර 52 හෝ 56 තන්තුවක් විය යුතුය, හිස්තැන් සහ ඉර විකල්ප විය යුතුය.",
|
||||
"The folder ID cannot be blank.": "බහාලුමේ හැඳු. හිස් නොවිය යුතුය.",
|
||||
"The folder ID must be unique.": "බහාලුමේ හැඳු. අනන්ය විය යුතුය.",
|
||||
|
||||
@@ -23,13 +23,14 @@
|
||||
"All Data": "Všetky dáta",
|
||||
"All Time": "Celé obdobie",
|
||||
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Všetky adresáre zdieľané s týmto zariadením musia byť chránené heslom, aby všetky odoslané dáta boli bez daného hesla nečitateľné.",
|
||||
"Allow Anonymous Usage Reporting?": "Povoliť anoynmné hlásenia o použivaní?",
|
||||
"Allow Anonymous Usage Reporting?": "Povoliť anonymné hlásenia o používaní?",
|
||||
"Allowed Networks": "Povolené siete",
|
||||
"Alphabetic": "Abecedne",
|
||||
"Altered by ignoring deletes.": "Zmenené ignorovaním zmazaných.",
|
||||
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Externý príkaz sa stará o vytváranie verzií. Musí odstrániť súbor zo zdieľaného priečinka. Ak cesta k aplikácii obsahuje medzery, mala by byť v úvodzovkách.",
|
||||
"Anonymous Usage Reporting": "Anonymné hlásenie o používaní",
|
||||
"Anonymous usage report format has changed. Would you like to move to the new format?": "Formát anonymného hlásenia o používaní sa zmenil. Chcete prejsť na nový formát?",
|
||||
"Applied to LAN": "Použité pre LAN",
|
||||
"Apply": "Použiť",
|
||||
"Are you sure you want to override all remote changes?": "Ste si istý, že chcete prepísať všetky vzdialené zmeny?",
|
||||
"Are you sure you want to permanently delete all these files?": "Určite chcete vymazať všetky tieto súbory?",
|
||||
@@ -38,9 +39,10 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Určite chcete obnoviť {{count}} súborov?",
|
||||
"Are you sure you want to revert all local changes?": "Naozaj chcete vrátiť všetky lokálne zmeny?",
|
||||
"Are you sure you want to upgrade?": "Určite chcete aktualizovať?",
|
||||
"Authentication Required": "Potrebné potvrdenie",
|
||||
"Authors": "Autori",
|
||||
"Auto Accept": "Automatické prijatie",
|
||||
"Automatic Crash Reporting": "Automatické hlásenie chýb",
|
||||
"Auto Accept": "Automaticky prijať",
|
||||
"Automatic Crash Reporting": "Automatické hlásenie zlyhania",
|
||||
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Automatická aktualizácia teraz ponúka voľbu medzi stabilnými vydaniami a kandidátmi na vydanie.",
|
||||
"Automatic upgrades": "Automatické aktualizácie",
|
||||
"Automatic upgrades are always enabled for candidate releases.": "Automatické aktualizácie sú vždy povolené pre kandidátske vydania.",
|
||||
@@ -50,7 +52,7 @@
|
||||
"Body:": "Obsah:",
|
||||
"Bugs": "Chyby",
|
||||
"Cancel": "Zrušiť",
|
||||
"Changelog": "Záznam zmien",
|
||||
"Changelog": "Zoznam zmien",
|
||||
"Clean out after": "Vyčistiť po",
|
||||
"Cleaning Versions": "Čistenie verzií",
|
||||
"Cleanup Interval": "Interval čistenia",
|
||||
@@ -64,10 +66,11 @@
|
||||
"Configured": "Nakonfigurované",
|
||||
"Connected (Unused)": "Pripojené (Nepoužité)",
|
||||
"Connection Error": "Chyba pripojenia",
|
||||
"Connection Management": "Správa pripojení",
|
||||
"Connection Type": "Typ pripojenia",
|
||||
"Connections": "Pripojenia",
|
||||
"Connections via relays might be rate limited by the relay": "Pripojenia cez relé môžu byť obmedzené rýchlosťou relé",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Nepretržité sledovanie zmien je už dostupné. Tým sa skenovanie spustí iba pre zmenené súbory. Výhoda je, že týmto spôsobom sa rýchlejšie šíria zmeny a nie je potrebných toľko veľa úplných skenov.",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Syncthing odteraz umožňuje nepretržité sledovanie zmien. To zistí zmeny na disku a spustí skenovanie iba v pozmenených adresároch. Výhoda je, že týmto spôsobom sa rýchlejšie šíria zmeny a nie je potrebných toľko kompletných skenovaní.",
|
||||
"Copied from elsewhere": "Skoprírované odinakiaľ",
|
||||
"Copied from original": "Skopírované z originálu",
|
||||
"Copied!": "Skopírované!",
|
||||
@@ -78,7 +81,7 @@
|
||||
"Danger!": "Pozor!",
|
||||
"Database Location": "Umiestnenie databázy",
|
||||
"Debugging Facilities": "Ladenie",
|
||||
"Default": "Predvolené",
|
||||
"Default": "Predvolená",
|
||||
"Default Configuration": "Predvolená konfigurácia",
|
||||
"Default Device": "Predvolené zariadenie",
|
||||
"Default Folder": "Predvolený priečinok",
|
||||
@@ -101,7 +104,7 @@
|
||||
"Device that last modified the item": "Zariadenie, ktoré naposledy pozmenilo položku",
|
||||
"Devices": "Zariadenia",
|
||||
"Disable Crash Reporting": "Zakázať hlásenia o zlyhaní",
|
||||
"Disabled": "Odpojené",
|
||||
"Disabled": "Blokované",
|
||||
"Disabled periodic scanning and disabled watching for changes": "Zakázané pravidelné skenovanie a vypnuté sledovanie zmien",
|
||||
"Disabled periodic scanning and enabled watching for changes": "Zakázané pravidelné skenovanie a povolené sledovanie zmien",
|
||||
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Zakázané pravidelné skenovanie a zlyhalo nastavenie sledovania zmien, opakovanie každú 1 m:",
|
||||
@@ -202,9 +205,11 @@
|
||||
"Included Software": "Zahrnutý softvér",
|
||||
"Incoming Rate Limit (KiB/s)": "Limit pre sťahovanie (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Nesprávna konfigurácia môže poškodiť váš adresár a spôsobiť nefunkčnosť aplikácie Súbory.",
|
||||
"Incorrect user name or password.": "Nesprávne meno používateľa alebo heslo.",
|
||||
"Internally used paths:": "Interne používané cesty:",
|
||||
"Introduced By": "Uvedené",
|
||||
"Introducer": "Uvádzač",
|
||||
"Introduction": "Uvedenie",
|
||||
"Inversion of the given condition (i.e. do not exclude)": "Inverzia danej podmienky (napr. nevynechať)",
|
||||
"Keep Versions": "Ponechanie verzií",
|
||||
"LDAP": "LDAP",
|
||||
@@ -230,7 +235,12 @@
|
||||
"Locally Changed Items": "Lokálne zmenené položky",
|
||||
"Log": "Záznam",
|
||||
"Log File": "Súbor denníka",
|
||||
"Log In": "Prihlásiť",
|
||||
"Log Out": "Prihlásiť sa",
|
||||
"Log in to see paths information.": "Prihláste sa a uvidíte informácie o cestách.",
|
||||
"Log in to see version information.": "Prihláste sa a uvidíte informácie o verzii.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Pozastavený záznam do denníka . Ak chcete pokračovať, prejdite nadol.",
|
||||
"Login failed, see Syncthing logs for details.": "Prihlásenie zlyhalo, pozri Syncthing protokoly pre podrobnosti.",
|
||||
"Logs": "Záznamy",
|
||||
"Major Upgrade": "Hlavná aktualizácia",
|
||||
"Mass actions": "Hromadná akcia",
|
||||
@@ -257,6 +267,7 @@
|
||||
"No upgrades": "Bez aktualizácií",
|
||||
"Not shared": "Nezdieľané",
|
||||
"Notice": "Oznámenie",
|
||||
"Number of Connections": "Počet pripojení",
|
||||
"OK": "OK",
|
||||
"Off": "Vypnúť",
|
||||
"Oldest First": "Najstarší najprv",
|
||||
@@ -268,6 +279,7 @@
|
||||
"Override": "Prepísať",
|
||||
"Override Changes": "Prepísať zmeny",
|
||||
"Ownership": "Vlastníctvo",
|
||||
"Password": "Heslo",
|
||||
"Path": "Cesta",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Cesta k adresáru na lokálnom počítači. Ak neexistuje, bude vytvorená. Znak vlnovky (~) môže byť použitý ako skratka pre",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Cesta, kde budú uložené verzie (ponechajte prázdne pre predvolený adresár .stversions v zdieľanom priečinku).",
|
||||
@@ -324,6 +336,7 @@
|
||||
"Revert": "Vrátiť späť",
|
||||
"Revert Local Changes": "Vrátiť lokálne zmeny",
|
||||
"Save": "Uložiť",
|
||||
"Saving changes": "Ukladanie zmien",
|
||||
"Scan Time Remaining": "Zostávajúci čas skenovania",
|
||||
"Scanning": "Skenovanie",
|
||||
"See external versioning help for supported templated command line parameters.": "Podporované šablónové parametre príkazového riadka nájdete v pomocníkovi pre externú správu verzií.",
|
||||
@@ -390,6 +403,7 @@
|
||||
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing načúva pre pokusy o pripojenie z iných zariadení na týchto sieťových adresách:",
|
||||
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing nenačúva pre pokusy o pripojenie z iných zariadení na žiadnej adrese. Môžu fungovať iba odchádzajúce spojenia z tohto zariadenia.",
|
||||
"Syncthing is restarting.": "Syncthing sa reštartuje.",
|
||||
"Syncthing is saving changes.": "Syncthing ukladá zmeny.",
|
||||
"Syncthing is upgrading.": "Syncthing sa aktualizuje.",
|
||||
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing teraz podporuje automatické hlásenie pádov vývojárom. Táto funkcia je predvolene povolená.",
|
||||
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing se zdá byť nefunkčný, alebo je problém s internetovým pripojením. Opakujem…",
|
||||
@@ -405,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Konfigurácia bola uložená, ale nebola aktivovaná. Aby sa aktivovala nová konfigurácia, musíte reštartovať Syncthing.",
|
||||
"The device ID cannot be blank.": "ID zariadenia nemôže byť prázdne.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ID zariadenie pre vloženie môžete nájsť na druhom zariadení v dialógu \"Akcia > Zobraziť ID\". Medzery a pomlčky sú voliteľné (ignorované).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Zašifrovaná správa o používaní sa odosiela denne. Používa sa na sledovanie bežných platforiem, veľkostí priečinkov a verzií aplikácie. Ak sa nahlásený súbor údajov zmení, zobrazí sa vám toto dialógové okno znova.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Zašifrovaná správa o používaní sa odosiela denne. Používa sa na sledovanie bežných platforiem, veľkostí priečinkov a verzií aplikácie. Ak sa nahlásený súbor údajov zmení, zobrazí sa vám toto dialógové okno znova.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Zdá sa, že zadané ID zariadenia nie je platné. Mal by to byť reťazec s 52 alebo 56 znakmi pozostávajúci z písmen a číslic, pričom medzery a pomlčky sú voliteľné.",
|
||||
"The folder ID cannot be blank.": "ID priečinka nemôže byť prázdne.",
|
||||
"The folder ID must be unique.": "ID adresára musí byť jedinečné.",
|
||||
@@ -422,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Interval v sekundách pre spustenie čistenia v adresári s verziami. Nula čistenie vypína.",
|
||||
"The maximum age must be a number and cannot be blank.": "Maximálny vek musí byť číslo a nemôže byť prázdne.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Maximálny čas na uchovanie verzie (v dňoch, nastavte na 0, ak chcete verzie zachovať navždy).",
|
||||
"The number of connections must be a non-negative number.": "Počet pripojení musí byť kladné číslo.",
|
||||
"The number of days must be a number and cannot be blank.": "Počet dní musí byť číslo a nemôže byť prázdny.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Počet dní pre uchovanie súborov v koši. Nula znamená navždy.",
|
||||
"The number of old versions to keep, per file.": "Počet uchovávaných starších verzií pre každý súbor.",
|
||||
"The number of versions must be a number and cannot be blank.": "Počet verzií musí byť číslo a nemôže byť prázdny.",
|
||||
"The path cannot be blank.": "Cesta nemôže byť prázdna.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Obmedzenie rýchlosti sa uplatňuje na celkovú prevádzku všetkých pripojení k tomuto zariadeniu.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Limit rýchlosti musí byť kladné číslo (0: bez limitu)",
|
||||
"The remote device has not accepted sharing this folder.": "Vzdialené zariadenie neprijalo zdieľanie tohto priečinka.",
|
||||
"The remote device has paused this folder.": "Vzdialené zariadenie pozastavilo tento priečinok.",
|
||||
@@ -457,7 +473,7 @@
|
||||
"Unexpected items have been found in this folder.": "V tomto priečinku sa našli neočakávané položky.",
|
||||
"Unignore": "Prestať ignorovať",
|
||||
"Unknown": "Neznáme",
|
||||
"Unshared": "Nezdieľané",
|
||||
"Unshared": "Ukončené zdieľanie",
|
||||
"Unshared Devices": "Nezdieľané zariadenia",
|
||||
"Unshared Folders": "Nezdieľané priečinky",
|
||||
"Untrusted": "Nedôveryhodný",
|
||||
@@ -471,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Hlásenia o používaní sú pri kandidátoch na vydanie vždy povolené.",
|
||||
"Use HTTPS for GUI": "Použiť HTTPS pre grafické rozhranie",
|
||||
"Use notifications from the filesystem to detect changed items.": "Na zistenie zmenených položiek použite upozornenia zo súborového systému.",
|
||||
"User": "Používateľ",
|
||||
"User Home": "Domovský adresár",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Používateľské meno/heslo nebolo nastavené pre overenie GUI. Zvážte jeho nastavenie.",
|
||||
"Using a QUIC connection over LAN": "Používam pripojenie QUIC over LAN",
|
||||
@@ -495,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Sledovanie zmien odhalí väčšinu zmien bez pravidelného skenovania.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Pri pridávaní nového zariadenia majte na pamäti, že toto zariadenie musíte pridať aj na druhej strane.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Pri pridávaní nového priečinka majte na pamäti, že ID priečinka sa používa na prepojenie priečinkov medzi zariadeniami. Rozlišujú veľké a malé písmená a musia sa presne zhodovať medzi všetkými zariadeniami.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Pri nastavení na viac ako jedno na oboch zariadeniach sa Syncthing pokúsi vytvoriť viacero súbežných pripojení. Ak sa hodnoty líšia, použije sa najvyššia. Pri nastavení na nulu rozhoduje Syncthing.",
|
||||
"Yes": "Áno",
|
||||
"Yesterday": "Včera",
|
||||
"You can also copy and paste the text into a new message manually.": "Text môžete do novej správy skopírovať a vložiť aj ručne.",
|
||||
@@ -520,10 +538,10 @@
|
||||
"modified": "zmenené",
|
||||
"permit": "povolenie",
|
||||
"seconds": "sekúnd",
|
||||
"theme-name-black": "Čierny",
|
||||
"theme-name-dark": "Tmavý",
|
||||
"theme-name-black": "Čierna",
|
||||
"theme-name-dark": "Tmavé",
|
||||
"theme-name-default": "Predvolené",
|
||||
"theme-name-light": "Svetlý",
|
||||
"theme-name-light": "Svetlá",
|
||||
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} chce zdieľať adresár \"{{folder}}\".",
|
||||
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} chce zdieľať adresár \"{{folderlabel}}\" ({{folder}}).",
|
||||
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} môže znova uviesť toto zariadenie."
|
||||
|
||||
@@ -357,7 +357,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Konfiguracija je bila shranjena, vendar ni aktivirana. Sinhronizacija se mora znova zagnati, da aktivirate novo konfiguracijo.",
|
||||
"The device ID cannot be blank.": "ID naprave ne more biti prazno.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ID naprave, ki ga vnesete tukaj, najdete v pozivnem oknu »Dejanja > Pokaži ID« na drugi napravi. Presledki in pomišljaji so neobvezni (prezrti).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Poročilo o šifrirani uporabi se pošilja vsak dan. Uporablja se za sledenje običajnih platform, velikosti map in različic aplikacij. Če se sporočeni nabor podatkov spremeni, boste znova pozvani k temu pozivnem oknu.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Poročilo o šifrirani uporabi se pošilja vsak dan. Uporablja se za sledenje običajnih platform, velikosti map in različic aplikacij. Če se sporočeni nabor podatkov spremeni, boste znova pozvani k temu pozivnem oknu.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Vneseni ID naprave ni videti veljaven. To mora biti niz z 52 ali 56 znaki, sestavljen iz črk in številk, pri čemer so presledki in pomišljaji neobvezni.",
|
||||
"The folder ID cannot be blank.": "ID mape ne more biti prazno.",
|
||||
"The folder ID must be unique.": "ID mape more biti edinstveno.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "Är du säker på att du vill återställa {{count}} filer?",
|
||||
"Are you sure you want to revert all local changes?": "Är du säker på att du vill återställa alla lokala ändringar?",
|
||||
"Are you sure you want to upgrade?": "Är du säker på att du vill uppgradera?",
|
||||
"Authentication Required": "Autentisering krävs",
|
||||
"Authors": "Upphovsmän",
|
||||
"Auto Accept": "Acceptera automatiskt",
|
||||
"Automatic Crash Reporting": "Automatisk kraschrapportering",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "Konfigurerad",
|
||||
"Connected (Unused)": "Ansluten (oanvänd)",
|
||||
"Connection Error": "Anslutningsproblem",
|
||||
"Connection Management": "Anslutningshantering",
|
||||
"Connection Type": "Anslutningstyp",
|
||||
"Connections": "Anslutningar",
|
||||
"Connections via relays might be rate limited by the relay": "Anslutningar via reläer kan begränsas av reläen",
|
||||
@@ -189,20 +191,21 @@
|
||||
"Help": "Hjälp",
|
||||
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Tips: endast neka-regler upptäcktes medan standard är neka. Överväg att lägga till \"tillåt alla\" som sista regel.",
|
||||
"Home page": "Webbplats",
|
||||
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Dina aktuella inställningar visar dock att du kanske inte vill att den ska aktiveras. Vi har inaktiverat automatisk krasch rapportering för dig.",
|
||||
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Dina aktuella inställningar indikerar dock att du kanske inte vill att ha det aktiverat. Vi har inaktiverat automatisk kraschrapportering för dig.",
|
||||
"Identification": "Identifiering",
|
||||
"If untrusted, enter encryption password": "Om opålitlig, ange krypteringslösenord",
|
||||
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Om du vill förhindra att andra användare på denna dator får åtkomst till Syncthing och genom det dina filer, överväg att ställa in autentisering.",
|
||||
"Ignore": "Ignorera",
|
||||
"Ignore Patterns": "Ignoreringsmönster",
|
||||
"Ignore Permissions": "Ignorera rättigheter",
|
||||
"Ignore patterns can only be added after the folder is created. If checked, an input field to enter ignore patterns will be presented after saving.": "Ignoreringsmönster kan bara läggas till efter att mappen har skapats. Om markerad kommer ett inmatningsfält för att ställa in ignoreringsmönster att visas efter att du har sparat.",
|
||||
"Ignore patterns can only be added after the folder is created. If checked, an input field to enter ignore patterns will be presented after saving.": "Ignoreringsmönster kan bara läggas till efter att mappen har skapats. Om markerad kommer ett inmatningsfält för att ange ignoreringsmönster att visas efter att du har sparat.",
|
||||
"Ignored Devices": "Ignorerade enheter",
|
||||
"Ignored Folders": "Ignorerade mappar",
|
||||
"Ignored at": "Ignorerad vid",
|
||||
"Included Software": "Inkluderad programvara",
|
||||
"Incoming Rate Limit (KiB/s)": "Ingående hastighetsgräns (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Inkorrekt konfiguration kan skada innehållet i mappen och få Syncthing att sluta fungera.",
|
||||
"Incorrect user name or password.": "Felaktigt användarnamn eller lösenord.",
|
||||
"Internally used paths:": "Internt använda sökvägar:",
|
||||
"Introduced By": "Introducerad av",
|
||||
"Introducer": "Introduktör",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Lokalt ändrade objekt",
|
||||
"Log": "Logg",
|
||||
"Log File": "Loggfil",
|
||||
"Log In": "Logga in",
|
||||
"Log Out": "Logga ut",
|
||||
"Log in to see paths information.": "Logga in för att se sökvägsinformation.",
|
||||
"Log in to see version information.": "Logga in för att se versionsinformation.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Loggning pausad. Bläddra till botten för att fortsätta.",
|
||||
"Login failed, see Syncthing logs for details.": "Inloggningen misslyckades, se Syncthing-loggarna för detaljer.",
|
||||
"Logs": "Loggar",
|
||||
"Major Upgrade": "Större uppgradering",
|
||||
"Mass actions": "Massåtgärder",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Inga uppgraderingar",
|
||||
"Not shared": "Inte delad",
|
||||
"Notice": "Observera",
|
||||
"Number of Connections": "Antal anslutningar",
|
||||
"OK": "OK",
|
||||
"Off": "Av",
|
||||
"Oldest First": "Äldsta först",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Åsidosätt",
|
||||
"Override Changes": "Åsidosätt förändringar",
|
||||
"Ownership": "Ägarskap",
|
||||
"Password": "Lösenord",
|
||||
"Path": "Sökväg",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Sökväg till mappen på din dator. Kommer att skapas om det inte finns. Tecknet tilde (~) kan användas som en genväg för",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Sökväg där versioner ska lagras (lämna tomt för standardmappen .stversions i den delade mappen).",
|
||||
@@ -284,7 +294,7 @@
|
||||
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "Periodisk skanning vid givet intervall och misslyckades med att ställa in bevakning av ändringar, försöker igen var 1:e minut:",
|
||||
"Permanently add it to the ignore list, suppressing further notifications.": "Lägg till det permanent i ignoreringslistan och undertryck ytterligare aviseringar.",
|
||||
"Please consult the release notes before performing a major upgrade.": "Läs igenom versionsnyheterna innan du utför en större uppgradering.",
|
||||
"Please set a GUI Authentication User and Password in the Settings dialog.": "Ställ in en autentiseringsanvändare och ett lösenord för det grafiska användargränssnittet i dialogrutan Inställningar.",
|
||||
"Please set a GUI Authentication User and Password in the Settings dialog.": "Ställ in en autentiseringsanvändare och ett lösenord för det grafiska användargränssnittet i inställningsdialogrutan.",
|
||||
"Please wait": "Vänta",
|
||||
"Prefix indicating that the file can be deleted if preventing directory removal": "Prefix som indikerar att filen kan tas bort om den förhindrar mappborttagning",
|
||||
"Prefix indicating that the pattern should be matched without case sensitivity": "Prefix som indikerar att mönstret ska matchas utan skiftlägeskänslighet",
|
||||
@@ -356,7 +366,7 @@
|
||||
"Show detailed listener status": "Visa detaljerad lyssnarstatus",
|
||||
"Show diff with previous version": "Visa skillnad med tidigare version",
|
||||
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Visas istället för enhets-ID i klusterstatus. Kommer att annonseras på andra enheter som ett valfritt standardnamn.",
|
||||
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Visas istället för enhets-ID i klusterstatusen. Kommer att uppdateras till det namn som enheten annonserar som om det lämnas tomt.",
|
||||
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Visas istället för enhets-ID i klusterstatusen. Kommer att uppdateras till det namn som enheten annonserar om det lämnas tomt.",
|
||||
"Shutdown": "Stäng av",
|
||||
"Shutdown Complete": "Avstängning klar",
|
||||
"Simple": "Enkel",
|
||||
@@ -376,7 +386,7 @@
|
||||
"Start Browser": "Starta webbläsaren",
|
||||
"Statistics": "Statistik",
|
||||
"Stopped": "Stoppad",
|
||||
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Lagrar och synkroniserar endast krypterade data. Mappar på alla anslutna enheter måste ställas in med samma lösenord eller vara av typen \"{{receiveEncrypted}}\".",
|
||||
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Lagrar och synkroniserar endast krypterade data. Mappar på alla anslutna enheter måste ställas in med samma lösenord eller också vara av typen \"{{receiveEncrypted}}\".",
|
||||
"Subject:": "Ämne:",
|
||||
"Support": "Support",
|
||||
"Support Bundle": "Support Bundle",
|
||||
@@ -408,8 +418,8 @@
|
||||
"The cleanup interval cannot be blank.": "Rensningsintervallet kan inte vara tomt.",
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Konfigurationen har sparats men inte aktiverats. Syncthing måste startas om för att aktivera den nya konfigurationen.",
|
||||
"The device ID cannot be blank.": "Enhets-ID kan inte vara tomt.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Enhets-ID som du anger här finns i dialogrutan \"Åtgärder > Visa ID\" på den andra enheten. Mellanslag och bindestreck är valfria (ignoreras).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Den krypterade användningsrapporten skickas dagligen. Det används för att spåra vanliga plattformar, mappstorlekar och appversioner. Om den rapporterade datauppsättningen ändras kommer du att uppmanas med denna dialogruta igen.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Enhets-ID som du anger här finns i dialogrutan \"Åtgärder > Visa ID\" på denna enhet. Mellanslag och bindestreck är valfria (ignoreras).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Den krypterade användningsrapporten skickas dagligen. Det används för att spåra vanliga plattformar, mappstorlekar och appversioner. Om den rapporterade datauppsättningen ändras kommer du att uppmanas med denna dialogruta igen.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Det inmatade enhets-ID:t verkar inte vara korrekt. Det ska vara en 52 eller 56 teckensträng bestående av siffror och bokstäver, eventuellt med mellanrum och bindestreck.",
|
||||
"The folder ID cannot be blank.": "Mapp-ID får inte vara tomt.",
|
||||
"The folder ID must be unique.": "Mapp-ID måste vara unik.",
|
||||
@@ -426,21 +436,23 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Intervallet, i sekunder, för att rensa i versionsmappen. Noll för att inaktivera periodisk rensning.",
|
||||
"The maximum age must be a number and cannot be blank.": "Åldersgränsen måste vara ett tal och kan inte lämnas tomt.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Den längsta tiden att behålla en version (i dagar, ställ in på 0 för att behålla versioner för alltid).",
|
||||
"The number of connections must be a non-negative number.": "Antalet anslutningar måste vara ett icke-negativt tal.",
|
||||
"The number of days must be a number and cannot be blank.": "Antalet dagar måste vara en siffra och får inte vara tomt.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Antalet dagar som filer ligger kvar i papperskorgen. Noll betyder för alltid.",
|
||||
"The number of old versions to keep, per file.": "Antalet gamla versioner som ska behållas, per fil.",
|
||||
"The number of versions must be a number and cannot be blank.": "Antalet versioner måste vara ett nummer och kan inte lämnas tomt.",
|
||||
"The path cannot be blank.": "Sökvägen kan inte vara tom.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Hastighetsgränsen tillämpas på den ackumulerade trafiken för alla anslutningar till denna enhet.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Frekvensgränsen måste vara ett icke-negativt tal (0: ingen gräns)",
|
||||
"The remote device has not accepted sharing this folder.": "Fjärrenheten har inte accepterat delning av den här mappen.",
|
||||
"The remote device has paused this folder.": "Fjärrenheten har pausat den här mappen.",
|
||||
"The remote device has not accepted sharing this folder.": "Fjärrenheten har inte accepterat delning av denna mapp.",
|
||||
"The remote device has paused this folder.": "Fjärrenheten har pausat denna mapp.",
|
||||
"The rescan interval must be a non-negative number of seconds.": "Förnyelseintervallet måste vara ett positivt antal sekunder.",
|
||||
"There are no devices to share this folder with.": "Det finns inga enheter att dela denna mapp med.",
|
||||
"There are no file versions to restore.": "Det finns inga filversioner att återställa.",
|
||||
"There are no folders to share with this device.": "Det finns inga mappar att dela med denna enhet.",
|
||||
"They are retried automatically and will be synced when the error is resolved.": "De omprövas automatiskt och kommer att synkroniseras när felet är löst.",
|
||||
"This Device": "Denna enhet",
|
||||
"This Month": "Den här månaden",
|
||||
"This Month": "Denna månad",
|
||||
"This can easily give hackers access to read and change any files on your computer.": "Detta kan lätt ge hackare tillgång till att läsa och ändra några filer på datorn.",
|
||||
"This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "Denna enhet kan inte automatiskt upptäcka andra enheter eller meddela sin egen adress som andra kan hitta. Endast enheter med statiskt konfigurerade adresser kan ansluta.",
|
||||
"This is a major version upgrade.": "Det här är en stor uppgradering.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Användningsrapportering är alltid aktiverad för kandidatutgåvor.",
|
||||
"Use HTTPS for GUI": "Använd HTTPS för gränssnitt",
|
||||
"Use notifications from the filesystem to detect changed items.": "Använd aviseringar från filsystemet för att upptäcka ändrade objekt.",
|
||||
"User": "Användare",
|
||||
"User Home": "Användarhem",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Användarnamn/lösenord har inte ställts in för autentisering av det grafiska gränssnittet. Överväg att ställa in det.",
|
||||
"Using a QUIC connection over LAN": "Använder en QUIC-anslutning över LAN",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Bevakning av ändringar upptäcker de flesta ändringar utan periodisk skanning.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "När du lägger till en ny enhet, kom ihåg att denna enhet måste läggas till på den andra enheten också.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "När du lägger till ny mapp, tänk på att mapp-ID knyter ihop mappar mellan olika enheter. De skiftlägeskänsliga och måste matcha precis mellan alla enheter.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "När den är inställd på mer än en på båda enheterna kommer Syncthing att försöka upprätta flera samtidiga anslutningar. Om värdena skiljer sig kommer det högsta att användas. Ställ in på noll för att låta Syncthing bestämma.",
|
||||
"Yes": "Ja",
|
||||
"Yesterday": "Igår",
|
||||
"You can also copy and paste the text into a new message manually.": "Du kan också kopiera och klistra in texten i ett nytt meddelande manuellt.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "{{count}} dosyayı geri yüklemek istediğinize emin misiniz?",
|
||||
"Are you sure you want to revert all local changes?": "Tüm yerel değişiklikleri geri almak istediğinize emin misiniz?",
|
||||
"Are you sure you want to upgrade?": "Yükseltmek istediğinize emin misiniz?",
|
||||
"Authentication Required": "Kimlik Doğrulaması Gerekli",
|
||||
"Authors": "Hazırlayan",
|
||||
"Auto Accept": "Otomatik kabul et",
|
||||
"Automatic Crash Reporting": "Otomatik Çökme Bildirme",
|
||||
@@ -65,9 +66,10 @@
|
||||
"Configured": "Yapılandırıldı",
|
||||
"Connected (Unused)": "Bağlandı (Kullanımda Değil)",
|
||||
"Connection Error": "Bağlantı Hatası",
|
||||
"Connection Management": "Bağlantı Yönetimi",
|
||||
"Connection Type": "Bağlantı Türü",
|
||||
"Connections": "Bağlantılar",
|
||||
"Connections via relays might be rate limited by the relay": "Geçişler aracılığıyla yapılan bağlantılar, geçiş tarafından oranı sınırlandırılmış olabilir",
|
||||
"Connections via relays might be rate limited by the relay": "Geçişler aracılığıyla yapılan bağlantılar, geçiş tarafından hızı sınırlandırılmış olabilir",
|
||||
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Sürekli olarak değişiklikleri izlemek artık Syncthing içinde mevcut. Bu, diskteki değişiklikleri algılayacak ve yalnızca değiştirilen yollarda bir tarama gerçekleştirecek. Yararları, değişikliklerin daha hızlı yayılması ve daha az tam tarama gerekmesidir.",
|
||||
"Copied from elsewhere": "Başka bir yerden kopyalandı",
|
||||
"Copied from original": "Orijinalinden kopyalandı",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "Dahil Olan Yazılımlar",
|
||||
"Incoming Rate Limit (KiB/s)": "Gelen Hız Sınırı (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Yanlış yapılandırma klasör içeriklerinize zarar verebilir ve Syncthing'i çalışamaz hale getirebilir.",
|
||||
"Incorrect user name or password.": "Yanlış kullanıcı adı ya da parola.",
|
||||
"Internally used paths:": "Dahili olarak kullanılan yollar:",
|
||||
"Introduced By": "Tanıtan",
|
||||
"Introducer": "Tanıtıcı",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "Yerel Olarak Değiştirilen Öğeler",
|
||||
"Log": "Günlük",
|
||||
"Log File": "Günlük Dosyası",
|
||||
"Log In": "Oturum Aç",
|
||||
"Log Out": "Oturumu Kapat",
|
||||
"Log in to see paths information.": "Yol bilgilerini görmek için oturum açın.",
|
||||
"Log in to see version information.": "Sürüm bilgilerini görmek için oturum açın.",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "Günlük kuyruğu duraklatıldı. Devam etmek için aşağı kaydırın.",
|
||||
"Login failed, see Syncthing logs for details.": "Oturum açma başarısız oldu, ayrıntılar için Syncthing günlüklerine bakın.",
|
||||
"Logs": "Günlükler",
|
||||
"Major Upgrade": "Büyük Yükseltme",
|
||||
"Mass actions": "Toplu eylemler",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "Yükseltmeler yok",
|
||||
"Not shared": "Paylaşılmamış",
|
||||
"Notice": "Bildirim",
|
||||
"Number of Connections": "Bağlantı Sayısı",
|
||||
"OK": "TAMAM",
|
||||
"Off": "Kapalı",
|
||||
"Oldest First": "Önce En Eski Olan",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "Geçersiz kıl",
|
||||
"Override Changes": "Değişiklikleri geçersiz kıl",
|
||||
"Ownership": "Sahiplik",
|
||||
"Password": "Parola",
|
||||
"Path": "Yol",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Yerel bilgisayardaki klasör yolu. Klasör yoksa oluşturulacaktır. Tilde karakterinin (~) kısayol olarak kullanılabileceği yol",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Sürümlerin depolanması gereken yol (paylaşılan klasördeki varsayılan .stversions dizini için boş bırakın).",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Yapılandırma kaydedildi ancak etkinleştirilmedi. Yeni yapılandırmayı etkinleştirmek için Syncthing yeniden başlatılmak zorunda.",
|
||||
"The device ID cannot be blank.": "Cihaz kimliği boş olamaz.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Buraya girilecek cihaz kimliği, diğer cihazlardaki \"Eylemler > Kimliği Göster\" ileti öğesinde bulunabilir. Boşluklar ve tireler isteğe bağlıdır (yoksayılır).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Şifreli kullanım raporu günlük olarak yollanır. Yaygın platformları, klasör boyutlarını ve uygulama sürümlerini izlemek için kullanılır. Eğer bildirilen veri kümesi değişirse, bu ileti öğesi aracılığıyla tekrar sorulacaktır.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Şifreli kullanım raporu günlük olarak yollanır. Yaygın platformları, klasör boyutlarını ve uygulama sürümlerini izlemek için kullanılır. Eğer bildirilen veri kümesi değişirse, bu ileti öğesi aracılığıyla tekrar sorulacaktır.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Girilen cihaz kimliği geçerli görünmüyor. Harf ve rakamlardan oluşan 52 veya 56 karakterlik bir dizgi olmalıdır, boşluklar ve tireler isteğe bağlıdır.",
|
||||
"The folder ID cannot be blank.": "Klasör kimliği boş olamaz.",
|
||||
"The folder ID must be unique.": "Klasör kimliği benzersiz olmak zorundadır.",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Sürüm dizininde temizlemeyi çalıştırmak için saniye olarak aralık değeri. Düzenli temizliği etkisizleştirmek için sıfır.",
|
||||
"The maximum age must be a number and cannot be blank.": "En fazla yaş bir sayı olmak zorundadır ve boş bırakılamaz.",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Bir sürümü tutmak için en fazla süre (gün olarak, sürümleri süresiz tutmak için 0'a ayarlayın).",
|
||||
"The number of connections must be a non-negative number.": "Bağlantı sayısı negatif olmayan bir sayı olmak zorundadır.",
|
||||
"The number of days must be a number and cannot be blank.": "Gün sayısı bir sayı olmak zorundadır ve boş olamaz.",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "Dosyaları çöp kutusunda tutmak için gün sayısı. Sıfır süresiz demektir.",
|
||||
"The number of old versions to keep, per file.": "Dosya başına tutulacak eski sürüm sayısı.",
|
||||
"The number of versions must be a number and cannot be blank.": "Sürüm sayısı bir sayı olmak zorundadır ve boş bırakılamaz.",
|
||||
"The path cannot be blank.": "Yol boş olamaz.",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Hız sınırı, bu cihaza yapılan tüm bağlantıların toplam trafiğine uygulanır.",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "Hız sınırı negatif olmayan bir sayı olmak zorundadır (0: sınır yok)",
|
||||
"The remote device has not accepted sharing this folder.": "Uzak cihaz bu klasörü paylaşmayı kabul etmedi.",
|
||||
"The remote device has paused this folder.": "Uzak cihaz bu klasörü duraklattı.",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "Kullanım bildirme aday yayımlar için her zaman etkinleştirilmiştir.",
|
||||
"Use HTTPS for GUI": "GKA için HTTPS kullan",
|
||||
"Use notifications from the filesystem to detect changed items.": "Değişen öğeleri tespit etmek için dosya sistemi bildirimleri kullanın.",
|
||||
"User": "Kullanıcı",
|
||||
"User Home": "Kullanıcı Girişi",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Kullanıcı adı/Parola, GKA kimlik doğrulaması için ayarlanmadı. Lütfen ayarlamayı düşünün.",
|
||||
"Using a QUIC connection over LAN": "LAN üzerinden QUIC bağlantısı kullanma",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "Değişiklikleri izleme, düzenli tarama yapmadan çoğu değişikliği keşfeder.",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "Yeni bir cihaz eklerken, bu cihazın karşı tarafa da eklenmek zorunda olduğunu unutmayın.",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Yeni bir klasör eklerken, Klasör Kimliği'nin klasörleri cihazlar arasında bağlamak için kullanıldığını unutmayın. Büyük/küçük harf duyarlıdırlar ve tüm cihazlarda tam olarak eşleşmek zorundadırlar.",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Her iki cihazda da birden fazlaya ayarlandığında, Syncthing birden çok eşzamanlı bağlantı kurmaya çalışacaktır. Eğer değerler farklıysa, en yüksek olanı kullanılacaktır. Syncthing'in karar vermesine izin vermek için sıfıra ayarlayın.",
|
||||
"Yes": "Evet",
|
||||
"Yesterday": "Dün",
|
||||
"You can also copy and paste the text into a new message manually.": "Ayrıca metni el ile kopyalayabilir ve yeni bir iletiye yapıştırabilirsiniz.",
|
||||
|
||||
@@ -397,7 +397,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Конфігурацію збережено, але не активовано. Необхідно перезапустити Syncthing для того, щоби активувати нову конфігурацію.",
|
||||
"The device ID cannot be blank.": "ID пристрою не може бути порожнім.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ID пристрою, який необхідно додати. Може бути знайдений у вікні \"Дії > Показати ID\" в меню іншого пристрою. Пробіли та тире необов'язкові (будуть проігноровні).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Зашифрована статистика використання відсилається щоденно. Вона використовується для того, щоб розробники відслідковували платформи, на яких працює програма, розміри папок та версії програми. Якщо набір даних, що збирається зазнає змін, ви обов’язково будете повідомлені через це діалогове вікно.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Зашифрована статистика використання відсилається щоденно. Вона використовується для того, щоб розробники відслідковували платформи, на яких працює програма, розміри папок та версії програми. Якщо набір даних, що збирається зазнає змін, ви обов’язково будете повідомлені через це діалогове вікно.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Введений ID пристрою невалідний. Ідентифікатор має вигляд строки довжиною 52 або 56 символів, що містить цифри та літери, із опціональними пробілами та тире.",
|
||||
"The folder ID cannot be blank.": "ID папки не може бути порожнім.",
|
||||
"The folder ID must be unique.": "ID папки повинен бути унікальним.",
|
||||
|
||||
@@ -184,7 +184,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Cấu hình đã được lưu nhưng chưa được kích hoạt. Syncthing phải khởi động lại để kích hoạt cấu hình mới. ",
|
||||
"The device ID cannot be blank.": "Không được để trống ID thiết bị.",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ID thiết bị cần nhập có thể được tìm thấy trong hộp thoại \"Thao tác > Hiển thị ID\" trên thiết bị kia. Khoảng trắng và gạch ngang là tuỳ chọn (bỏ qua).",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Báo cáo s.dụng đã mã hoá sẽ được gửi đi hằng ngày. Nó được dùng để t.thập s.liệu về các HĐH phổ biến, kích cỡ th.mục và ph.bản ứng dụng. Nếu bộ d.liệu báo cáo có th.đổi, bạn sẽ được nhắc thông qua h.thoại này.",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Báo cáo s.dụng đã mã hoá sẽ được gửi đi hằng ngày. Nó được dùng để t.thập s.liệu về các HĐH phổ biến, kích cỡ th.mục và ph.bản ứng dụng. Nếu bộ d.liệu báo cáo có th.đổi, bạn sẽ được nhắc thông qua h.thoại này.",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "ID thiết bị đã nhập không hợp lệ. Nó phải là một chuỗi từ 52 đến 56 ký tự, bao gồm chữ cái và các con số, với khoảng trắng và gạch ngang là tuỳ chọn.",
|
||||
"The folder ID cannot be blank.": "Không được để trống ID thư mục.",
|
||||
"The folder ID must be unique.": "ID thư mục phải là duy nhất.",
|
||||
|
||||
@@ -39,6 +39,7 @@
|
||||
"Are you sure you want to restore {%count%} files?": "您确定要恢复这 {{count}} 个文件吗?",
|
||||
"Are you sure you want to revert all local changes?": "您确定要撤销所有本地更改吗?",
|
||||
"Are you sure you want to upgrade?": "你确定要升级吗?",
|
||||
"Authentication Required": "需要身份验证",
|
||||
"Authors": "作者",
|
||||
"Auto Accept": "自动接受",
|
||||
"Automatic Crash Reporting": "自动发送崩溃报告",
|
||||
@@ -65,6 +66,7 @@
|
||||
"Configured": "已配置",
|
||||
"Connected (Unused)": "已连接(未使用)",
|
||||
"Connection Error": "连接出错",
|
||||
"Connection Management": "连接管理",
|
||||
"Connection Type": "连接类型",
|
||||
"Connections": "连接",
|
||||
"Connections via relays might be rate limited by the relay": "经由中继的连接可能会被中继限制速率",
|
||||
@@ -203,6 +205,7 @@
|
||||
"Included Software": "包含软件",
|
||||
"Incoming Rate Limit (KiB/s)": "下载速率限制 (KiB/s)",
|
||||
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "错误的配置可能损坏您文件夹内的内容,使得 Syncthing 无法工作。",
|
||||
"Incorrect user name or password.": "用户名或密码不正确。",
|
||||
"Internally used paths:": "内部使用的路径:",
|
||||
"Introduced By": "介绍自",
|
||||
"Introducer": "作为中介",
|
||||
@@ -232,7 +235,12 @@
|
||||
"Locally Changed Items": "本地更改的项目",
|
||||
"Log": "日志",
|
||||
"Log File": "日志文件",
|
||||
"Log In": "登录",
|
||||
"Log Out": "注销",
|
||||
"Log in to see paths information.": "登录查看路径信息。",
|
||||
"Log in to see version information.": "登陆查看版本信息。",
|
||||
"Log tailing paused. Scroll to the bottom to continue.": "已暂停日志跟踪。滚动到底部以继续。",
|
||||
"Login failed, see Syncthing logs for details.": "登录失败,详情见 Syncthing 日志。",
|
||||
"Logs": "日志",
|
||||
"Major Upgrade": "重大更新",
|
||||
"Mass actions": "批量操作",
|
||||
@@ -259,6 +267,7 @@
|
||||
"No upgrades": "无更新",
|
||||
"Not shared": "不共享",
|
||||
"Notice": "提示",
|
||||
"Number of Connections": "连接数",
|
||||
"OK": "确定",
|
||||
"Off": "关闭",
|
||||
"Oldest First": "旧文件优先",
|
||||
@@ -270,6 +279,7 @@
|
||||
"Override": "覆盖",
|
||||
"Override Changes": "撤销改变",
|
||||
"Ownership": "所有权",
|
||||
"Password": "密码",
|
||||
"Path": "路径",
|
||||
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "本地计算机上文件夹的路径。如果不存在,会创建它。波浪线符号(~)可用作下列项目的缩略符",
|
||||
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "历史版本储存路径(留空则会默认存储在共享文件夹中的 .stversions 目录)。",
|
||||
@@ -409,7 +419,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "设置已经保存,但是还未生效。Syncthing 需要重启以启用新的设置。",
|
||||
"The device ID cannot be blank.": "设备 ID 不能为空。",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "在这里所需要输入的设备 ID,可以在目标设备的“操作->显示 ID”中看到。空格和横线可选(将会被忽略)。",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "经过加密的使用报告会每天发送。它用来跟踪统计使用本软件的平台,文件夹大小,以及本软件的版本。如果报告的内容有任何变化,本对话框会再次弹出提示您。",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "经过加密的使用报告会每天发送。它用来跟踪统计使用本软件的平台,文件夹大小,以及本软件的版本。如果报告的内容有任何变化,本对话框会再次弹出提示您。",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "输入的设备 ID 似乎无效。设备 ID 包含字母和数字,长度为 52 或 56,空格和横线不计在内。",
|
||||
"The folder ID cannot be blank.": "文件夹 ID 不能为空。",
|
||||
"The folder ID must be unique.": "文件夹 ID 不得重复。",
|
||||
@@ -426,11 +436,13 @@
|
||||
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "在版本目录中运行清理的间隔(秒)。0表示禁用定期清除。",
|
||||
"The maximum age must be a number and cannot be blank.": "最长保留时间必须为数字,且不能为空。",
|
||||
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "历史版本保留的最长天数,0 为永久保存。",
|
||||
"The number of connections must be a non-negative number.": "连接数必须是非负数。",
|
||||
"The number of days must be a number and cannot be blank.": "天数必须为数字,且不能为空。",
|
||||
"The number of days to keep files in the trash can. Zero means forever.": "文件保存在回收站的天数。零表示永久。",
|
||||
"The number of old versions to keep, per file.": "每个文件保留的版本数量上限。",
|
||||
"The number of versions must be a number and cannot be blank.": "保留版本数量必须为数字,且不能为空。",
|
||||
"The path cannot be blank.": "路径不能为空。",
|
||||
"The rate limit is applied to the accumulated traffic of all connections to this device.": "到这台设备所有连接的累计流量被实施了速率限制。",
|
||||
"The rate limit must be a non-negative number (0: no limit)": "传输速度限制为非负整数(0 表示不限制)",
|
||||
"The remote device has not accepted sharing this folder.": "远程设备尚未允许分享此文件夹。",
|
||||
"The remote device has paused this folder.": "远程设备已停用此文件夹。",
|
||||
@@ -475,6 +487,7 @@
|
||||
"Usage reporting is always enabled for candidate releases.": "发布候选版总是会启用使用报告。",
|
||||
"Use HTTPS for GUI": "使用加密连接到图形管理页面",
|
||||
"Use notifications from the filesystem to detect changed items.": "使用文件系统的通知来检测更改的项目。",
|
||||
"User": "用户名",
|
||||
"User Home": "用户主目录",
|
||||
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "尚未为GUI身份验证设置用户名/密码。 请考虑进行设置。",
|
||||
"Using a QUIC connection over LAN": "正使用局域网 QUIC 连接",
|
||||
@@ -499,6 +512,7 @@
|
||||
"Watching for changes discovers most changes without periodic scanning.": "对更改的监视无需定期扫描就可以发现大多数更改。",
|
||||
"When adding a new device, keep in mind that this device must be added on the other side too.": "若您在本机添加新设备,记住您也必须在这个新设备上添加本机。",
|
||||
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "若你添加了新文件夹,记住文件夹 ID 是用以在不同设备间建立联系的。在不同设备间拥有相同 ID 的文件夹将会被同步。且文件夹 ID 区分大小写。",
|
||||
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "当两台设备上的连接数均被设为大于 1 时,Syncthing 会尝试建立多个并行连接。如果两台设备上的设置的连接数不同,则会使用最大的连接数。设为 0 表示让 Syncthing 自行决定。",
|
||||
"Yes": "是",
|
||||
"Yesterday": "昨天",
|
||||
"You can also copy and paste the text into a new message manually.": "你也可以手动将文本复制并粘贴到新消息中。",
|
||||
|
||||
@@ -392,7 +392,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "設置已經保存,但是還未生效。Syncthing 需要重啟以啟用新的設置。",
|
||||
"The device ID cannot be blank.": "設備 ID 不能為空。",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "在這裡所需要輸入的設備 ID,可以在目標設備的「操作->顯示 ID」中看到。空格和橫線可選(將會被忽略)。",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "經過加密的使用報告會每天發送。它用來跟蹤統計使用本軟件的平台,文件夾大小,以及本軟件的版本。如果報告的內容有任何變化,本對話框會再次彈出提示您。",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "經過加密的使用報告會每天發送。它用來跟蹤統計使用本軟件的平台,文件夾大小,以及本軟件的版本。如果報告的內容有任何變化,本對話框會再次彈出提示您。",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "輸入的設備 ID 似乎無效。設備 ID 包含字母和數字,長度為 52 或 56,空格和橫線不計在內。",
|
||||
"The folder ID cannot be blank.": "文件夾 ID 不能為空。",
|
||||
"The folder ID must be unique.": "文件夾 ID 不得重複。",
|
||||
|
||||
@@ -68,6 +68,7 @@
|
||||
"Default Configuration": "預設配置",
|
||||
"Default Device": "預設裝置",
|
||||
"Default Folder": "預設資料夾",
|
||||
"Default Ignore Patterns": "預設忽略樣式",
|
||||
"Defaults": "預設",
|
||||
"Delete": "刪除",
|
||||
"Delete Unexpected Items": "刪除不預期的項目",
|
||||
@@ -223,6 +224,7 @@
|
||||
"No upgrades": "不更新",
|
||||
"Not shared": "未共享",
|
||||
"Notice": "注意",
|
||||
"Number of Connections": "連線數量",
|
||||
"OK": "確定",
|
||||
"Off": "關閉",
|
||||
"Oldest First": "最舊的優先",
|
||||
@@ -360,7 +362,7 @@
|
||||
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "組態已經儲存但尚未啟用。Syncthing 必須重新啟動以便啟用新的組態。",
|
||||
"The device ID cannot be blank.": "裝置識別碼不能為空白。",
|
||||
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "其它裝置的裝置識別碼可在它們的 \"操作 > 顯示識別碼\" 對話框找到。空白及連接符號可省略。",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "經過加密的數據報告將每日傳送。報告是用來追蹤常用的平台、資料夾大小以及應用程式版本。若傳送的資料集有異動,您將再次看到此對話框。",
|
||||
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "經過加密的數據報告將每日傳送。報告是用來追蹤常用的平台、資料夾大小以及應用程式版本。若傳送的資料集有異動,您將再次看到此對話框。",
|
||||
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "輸入的裝置識別碼似乎無效。它應該為一串長度為 52 或 56 個字元長的半形英文字母及數字,並可能會含有額外的空白或連接符號。",
|
||||
"The folder ID cannot be blank.": "資料夾識別碼不能為空白。",
|
||||
"The folder ID must be unique.": "資料夾識別碼必須為獨一無二的。",
|
||||
|
||||
+56
-12
@@ -72,7 +72,7 @@
|
||||
<img class="logo hidden-xs" src="assets/img/logo-horizontal.svg" height="32" width="117" alt=""/>
|
||||
<img class="logo hidden visible-xs" src="assets/img/favicon-default.png" height="32" alt=""/>
|
||||
</span>
|
||||
<p class="navbar-text hidden-xs" ng-class="{'hidden-sm':upgradeInfo && upgradeInfo.newer}">{{thisDeviceName()}}</p>
|
||||
<p ng-if="authenticated" class="navbar-text hidden-xs" ng-class="{'hidden-sm':upgradeInfo && upgradeInfo.newer}">{{thisDeviceName()}}</p>
|
||||
<ul class="nav navbar-nav navbar-right">
|
||||
<li ng-if="upgradeInfo && upgradeInfo.newer" class="upgrade-newer">
|
||||
<button type="button" class="btn navbar-btn btn-primary btn-sm" data-toggle="modal" data-target="#upgrade">
|
||||
@@ -109,23 +109,29 @@
|
||||
<li><a href="" ng-click="about.show()"><span class="fa fa-fw fa-heart"></span> <span translate>About</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
<li class="dropdown action-menu">
|
||||
<li ng-if="authenticated || config.gui.debugging" class="dropdown action-menu">
|
||||
<a href="#" class="dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
|
||||
<span class="fa fa-cog"></span>
|
||||
<span class="hidden-xs" translate>Actions</span>
|
||||
<span class="caret"></span>
|
||||
</a>
|
||||
<ul class="dropdown-menu">
|
||||
<li><a href="" ng-click="showSettings()"><span class="fa fa-fw fa-cog"></span> <span translate>Settings</span></a></li>
|
||||
<li><a href="" ng-click="showDeviceIdentification(thisDevice())"><span class="fa fa-fw fa-qrcode"></span> <span translate>Show ID</span></a></li>
|
||||
<li class="divider" aria-hidden="true"></li>
|
||||
<li><a href="" ng-click="shutdown()"><span class="fa fa-fw fa-power-off"></span> <span translate>Shutdown</span></a></li>
|
||||
<li><a href="" ng-click="restart()"><span class="fa fa-fw fa-refresh"></span> <span translate>Restart</span></a></li>
|
||||
<li class="divider" aria-hidden="true"></li>
|
||||
<li><a href="" ng-click="advanced()"><span class="fa fa-fw fa-cogs"></span> <span translate>Advanced</span></a></li>
|
||||
<li><a href="" ng-click="logging.show()"><span class="fa fa-fw fa-wrench"></span> <span translate>Logs</span></a></li>
|
||||
<li ng-if="authenticated"><a href="" ng-click="showSettings()"><span class="fa fa-fw fa-cog"></span> <span translate>Settings</span></a></li>
|
||||
<li ng-if="authenticated"><a href="" ng-click="showDeviceIdentification(thisDevice())"><span class="fa fa-fw fa-qrcode"></span> <span translate>Show ID</span></a></li>
|
||||
|
||||
<li ng-if="authenticated" class="divider" aria-hidden="true"></li>
|
||||
<li ng-if="authenticated"><a href="" ng-click="shutdown()"><span class="fa fa-fw fa-power-off"></span> <span translate>Shutdown</span></a></li>
|
||||
<li ng-if="authenticated"><a href="" ng-click="restart()"><span class="fa fa-fw fa-refresh"></span> <span translate>Restart</span></a></li>
|
||||
|
||||
<li ng-if="authenticated" class="divider" aria-hidden="true"></li>
|
||||
<li ng-if="authenticated"><a href="" ng-click="advanced()"><span class="fa fa-fw fa-cogs"></span> <span translate>Advanced</span></a></li>
|
||||
<li ng-if="authenticated"><a href="" ng-click="logging.show()"><span class="fa fa-fw fa-wrench"></span> <span translate>Logs</span></a></li>
|
||||
|
||||
<li class="divider" aria-hidden="true" ng-if="config.gui.debugging"></li>
|
||||
<li><a href="/rest/debug/support" target="_blank" ng-if="config.gui.debugging"><span class="fa fa-fw fa-user-md"></span> <span translate>Support Bundle</span></a></li>
|
||||
|
||||
<li ng-if="authenticated && isAuthEnabled()" class="divider" aria-hidden="true"></li>
|
||||
<li ng-if="authenticated && isAuthEnabled()"><a href="" ng-click="logout()"><span class="far fa-fw fa-sign-out"></span> <span translate>Log Out</span></a></li>
|
||||
</ul>
|
||||
</li>
|
||||
</ul>
|
||||
@@ -338,9 +344,39 @@
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- First regular row -->
|
||||
<!-- Login form -->
|
||||
<div ng-if="!authenticated" class="center-block">
|
||||
<h3 translate>Authentication Required</h3>
|
||||
|
||||
<div class="row">
|
||||
<form ng-submit="authenticatePassword()">
|
||||
<div class="form-group">
|
||||
<label for="user" translate>User</label>
|
||||
<input id="user" class="form-control" type="text" name="user" ng-model="login.username" autofocus required autocomplete="username" />
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label for="password" translate>Password</label>
|
||||
<input id="password" class="form-control" type="password" name="password" ng-model="login.password" ng-trim="false" autocomplete="current-password" />
|
||||
</div>
|
||||
|
||||
<div class="row">
|
||||
<div class="col-md-9 login-form-messages">
|
||||
<p ng-if="login.errors.badLogin" class="text-danger" translate>
|
||||
Incorrect user name or password.
|
||||
</p>
|
||||
<p ng-if="login.errors.failed" class="text-danger" translate>
|
||||
Login failed, see Syncthing logs for details.
|
||||
</p>
|
||||
</div>
|
||||
<div class="col-md-3 text-right">
|
||||
<button type="submit" class="btn btn-default" ng-disabled="login.inProgress" translate>Log In</button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
</div>
|
||||
|
||||
<!-- First regular row -->
|
||||
<div ng-if="authenticated" class="row">
|
||||
|
||||
<!-- Folder list (top left) -->
|
||||
|
||||
@@ -900,6 +936,10 @@
|
||||
<th><span class="far fa-fw fa-handshake-o"></span> <span translate>Introduced By</span></th>
|
||||
<td class="text-right">{{ deviceName(devices[deviceCfg.introducedBy]) || deviceCfg.introducedBy.substring(0, 5) }}</td>
|
||||
</tr>
|
||||
<tr ng-if="deviceCfg.autoAcceptFolders">
|
||||
<th><span class="fa fa-fw fa-level-down"></span> <span translate>Auto Accept</span></th>
|
||||
<td translate class="text-right">Yes</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<th><span class="fas fa-fw fa-qrcode"></span> <span translate>Identification</span></th>
|
||||
<td class="text-right">
|
||||
@@ -908,6 +948,10 @@
|
||||
</span>
|
||||
</td>
|
||||
</tr>
|
||||
<tr ng-if="deviceCfg.untrusted">
|
||||
<th><span class="fa fa-fw fa-user-secret"></span> <span translate>Untrusted</span></th>
|
||||
<td translate class="text-right">Yes</td>
|
||||
</tr>
|
||||
<tr ng-if="connections[deviceCfg.deviceID].clientVersion">
|
||||
<th><span class="fas fa-fw fa-tag"></span> <span translate>Version</span></th>
|
||||
<td class="text-right">{{connections[deviceCfg.deviceID].clientVersion}}</td>
|
||||
|
||||
@@ -16,13 +16,9 @@ var syncthing = angular.module('syncthing', [
|
||||
]);
|
||||
|
||||
var urlbase = 'rest';
|
||||
var authUrlbase = urlbase + '/noauth/auth';
|
||||
|
||||
syncthing.config(function ($httpProvider, $translateProvider, LocaleServiceProvider) {
|
||||
var deviceIDShort = metadata.deviceID.substr(0, 5);
|
||||
$httpProvider.defaults.xsrfHeaderName = 'X-CSRF-Token-' + deviceIDShort;
|
||||
$httpProvider.defaults.xsrfCookieName = 'CSRF-Token-' + deviceIDShort;
|
||||
$httpProvider.useApplyAsync(true);
|
||||
|
||||
// language and localisation
|
||||
|
||||
$translateProvider.useSanitizeValueStrategy('escape');
|
||||
@@ -33,6 +29,17 @@ syncthing.config(function ($httpProvider, $translateProvider, LocaleServiceProvi
|
||||
|
||||
LocaleServiceProvider.setAvailableLocales(validLangs);
|
||||
LocaleServiceProvider.setDefaultLocale('en');
|
||||
|
||||
$httpProvider.useApplyAsync(true);
|
||||
|
||||
if (!window.metadata) {
|
||||
// Most likely we're not authenticated yet, in which case we can't proceed with the rest of the setup.
|
||||
// Do nothing and wait for the page reload on successful login.
|
||||
return;
|
||||
}
|
||||
|
||||
$httpProvider.defaults.xsrfHeaderName = 'X-CSRF-Token-' + metadata.deviceIDShort;
|
||||
$httpProvider.defaults.xsrfCookieName = 'CSRF-Token-' + metadata.deviceIDShort;
|
||||
});
|
||||
|
||||
// @TODO: extract global level functions into separate service(s)
|
||||
|
||||
@@ -2,17 +2,21 @@
|
||||
<div class="modal-body">
|
||||
<h1 class="text-center">
|
||||
<img alt="Syncthing" src="assets/img/logo-horizontal.svg" style="max-width: 366px; vertical-align: -16px" />
|
||||
<br />
|
||||
</h1>
|
||||
<h1 ng-if="version.version" class="text-center">
|
||||
<small>{{versionString()}}</small>
|
||||
<br />
|
||||
<small><i>"{{version.codename}}"</i></small>
|
||||
</h1>
|
||||
<p class="text-center">
|
||||
<p ng-if="version.version" class="text-center">
|
||||
Build {{version.date | date:"yyyy-MM-dd"}}
|
||||
<span ng-if="version.tags.length">({{version.tags.join(", ")}})</span>
|
||||
<br />
|
||||
Copyright © 2014-{{version.date | date:"yyyy"}} the Syncthing Authors.
|
||||
</p>
|
||||
<p ng-if="!version.version" class="text-center" translate>
|
||||
Log in to see version information.
|
||||
</p>
|
||||
<p class="text-center" translate>Syncthing is Free and Open Source Software licensed as MPL v2.0.</p>
|
||||
|
||||
<ul class="nav nav-tabs">
|
||||
@@ -26,7 +30,7 @@
|
||||
<h4 class="text-center" translate>The Syncthing Authors</h4>
|
||||
<div class="row">
|
||||
<div class="col-md-12" id="contributor-list">
|
||||
Jakob Borg, Audrius Butkevicius, Jesse Lucas, Simon Frei, Alexander Graf, Alexandre Viau, Anderson Mesquita, André Colomb, Antony Male, Ben Schulz, Caleb Callaway, Daniel Harte, Evgeny Kuznetsov, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Nate Morrison, Philippe Schommers, Ryan Sullivan, Sergey Mishin, Stefan Tatschner, Tomasz Wilczyński, Wulf Weich, bt90, greatroar, Aaron Bieber, Adam Piggott, Adel Qalieh, Alan Pope, Alberto Donato, Aleksey Vasenev, Alessandro G., Alex Lindeman, Alex Xu, Alexander Seiler, Alexandre Alves, Aman Gupta, Andreas Sommer, Andrew Dunham, Andrew Meyer, Andrew Rabert, Andrey D, Anjan Momi, Anthony Goeckner, Antoine Lamielle, Anur, Aranjedeath, Arkadiusz Tymiński, Aroun, Arthur Axel fREW Schmidt, Artur Zubilewicz, Aurélien Rainone, BAHADIR YILMAZ, Bart De Vries, Ben Curthoys, Ben Shepherd, Ben Sidhom, Benedikt Heine, Benedikt Morbach, Benjamin Nater, Benno Fünfstück, Benny Ng, Boqin Qin, Boris Rybalkin, Brandon Philips, Brendan Long, Brian R. Becker, Carsten Hagemann, Cathryne Linenweaver, Cedric Staniewski, Chih-Hsuan Yen, Choongkyu, Chris Howie, Chris Joel, Chris Tonkinson, Christian Kujau, Christian Prescott, Colin Kennedy, Cromefire_, Cyprien Devillez, Dale Visser, Dan, Daniel Barczyk, Daniel Bergmann, Daniel Martí, Darshil Chanpura, David Rimmer, Denis A., Dennis Wilson, Devon G. Redekopp, Dimitri Papadopoulos Orfanos, Dmitry Saveliev, Domenic Horner, Dominik Heidler, Elias Jarlebring, Elliot Huffman, Emil Hessman, Emil Lundberg, Eng Zer Jun, Eric Lesiuta, Eric P, Erik Meitner, Evan Spensley, Federico Castagnini, Felix, Felix Ableitner, Felix Lampe, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gahl Saraf, Gilli Sigurdsson, Gleb Sinyavskiy, Graham Miln, Greg, Han Boetes, HansK-p, Harrison Jones, Heiko Zuerker, Hugo Locurcio, Iain Barnett, Ian Johnson, Ikko Ashimine, Ilya Brin, Iskander Sharipov, Jaakko Hannikainen, Jacek Szafarkiewicz, Jack Croft, Jacob, Jake Peterson, James O'Beirne, James Patterson, Jaroslav Lichtblau, Jaroslav Malec, Jauder Ho, Jaya Chithra, Jaya Kumar, Jeffery To, Jens Diemer, Jerry Jacobs, Jochen Voss, Johan Andersson, Johan Vromans, John Rinehart, Jonas Thelemann, Jonathan, Jonathan Cross, Jonta, Jose Manuel Delicado, Jörg Thalheim, Jędrzej Kula, K.B.Dharun Krishna, Kalle Laine, Karol Różycki, Kebin Liu, Keith Harrison, Keith Turner, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Kevin Bushiri, Kevin White, Jr., Kurt Fitzner, LSmithx2, Lars Lehtonen, Laurent Arnoud, Laurent Etiemble, Leo Arias, Liu Siyuan, Lord Landon Agahnim, Lukas Lihotzki, Majed Abdulaziz, Marc Laporte, Marc Pujol, Marcin Dziadus, Marcus Legendre, Mario Majila, Mark Pulford, Martchus, Mateusz Naściszewski, Mateusz Ż, Matic Potočnik, Matt Burke, Matt Robenolt, Matteo Ruina, Maurizio Tomasi, Max, Max Schulze, MaximAL, Maxime Thirouin, Maximilian, MichaIng, Michael Jephcote, Michael Rienstra, Michael Tilli, Migelo, Mike Boone, MikeLund, MikolajTwarog, Mingxuan Lin, Naveen, Nicholas Rishel, Nick Busey, Nico Stapelbroek, Nicolas Braud-Santoni, Nicolas Perraut, Niels Peter Roest, Nils Jakobi, NinoM4ster, Nitroretro, NoLooseEnds, Oliver Freyermuth, Otiel, Oyebanji Jacob Mayowa, Pablo, Pascal Jungblut, Paul Brit, Pawel Palenica, Paweł Rozlach, Peter Badida, Peter Dave Hello, Peter Hoeg, Peter Marquardt, Phani Rithvij, Phil Davis, Phill Luby, Pier Paolo Ramon, Piotr Bejda, Pramodh KP, Quentin Hibon, Rahmi Pruitt, Richard Hartmann, Robert Carosi, Roberto Santalla, Robin Schoonover, Roman Zaynetdinov, Ross Smith II, Ruslan Yevdokymov, Ryan Qian, Sacheendra Talluri, Scott Klupfel, Shaarad Dalvi, Simon Mwepu, Sly_tom_cat, Stefan Kuntz, Steven Eckhoff, Suhas Gundimeda, Taylor Khan, Thomas Hipp, Tim Abell, Tim Howes, Tobias Klauser, Tobias Nygren, Tobias Tom, Tom Jakubowski, Tommy Thorn, Tully Robinson, Tyler Brazier, Tyler Kropp, Unrud, Veeti Paananen, Victor Buinsky, Vik, Vil Brekin, Vladimir Rusinov, Will Rouesnel, William A. Kennington III, Xavier O., Yannic A., andresvia, andyleap, boomsquared, chenrui, chucic, cui fliter, derekriemer, desbma, entity0xfe, georgespatton, ghjklw, guangwu, ignacy123, janost, jaseg, jelle van der Waa, jtagcat, klemens, luzpaz, marco-m, mclang, mv1005, otbutz, overkill, perewa, red_led, rubenbe, sec65, villekalliomaki, wangguoliang, wouter bolsterlee, xarx00, xjtdy888, 佛跳墙, 落心
|
||||
Jakob Borg, Audrius Butkevicius, Jesse Lucas, Simon Frei, Tomasz Wilczyński, Alexander Graf, Alexandre Viau, Anderson Mesquita, André Colomb, Antony Male, Ben Schulz, Caleb Callaway, Daniel Harte, Evgeny Kuznetsov, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Nate Morrison, Philippe Schommers, Ryan Sullivan, Sergey Mishin, Stefan Tatschner, Wulf Weich, bt90, greatroar, Aaron Bieber, Adam Piggott, Adel Qalieh, Alan Pope, Alberto Donato, Aleksey Vasenev, Alessandro G., Alex Lindeman, Alex Xu, Alexander Seiler, Alexandre Alves, Aman Gupta, Andreas Sommer, Andrew Dunham, Andrew Meyer, Andrew Rabert, Andrey D, Anjan Momi, Anthony Goeckner, Antoine Lamielle, Anur, Aranjedeath, Arkadiusz Tymiński, Aroun, Arthur Axel fREW Schmidt, Artur Zubilewicz, Aurélien Rainone, BAHADIR YILMAZ, Bart De Vries, Ben Curthoys, Ben Shepherd, Ben Sidhom, Benedikt Heine, Benedikt Morbach, Benjamin Nater, Benno Fünfstück, Benny Ng, Boqin Qin, Boris Rybalkin, Brandon Philips, Brendan Long, Brian R. Becker, Carsten Hagemann, Cathryne Linenweaver, Cedric Staniewski, Chih-Hsuan Yen, Choongkyu, Chris Howie, Chris Joel, Chris Tonkinson, Christian Kujau, Christian Prescott, Colin Kennedy, Cromefire_, Cyprien Devillez, Dale Visser, Dan, Daniel Barczyk, Daniel Bergmann, Daniel Martí, Darshil Chanpura, David Rimmer, DeflateAwning, Denis A., Dennis Wilson, Devon G. Redekopp, Dimitri Papadopoulos Orfanos, Dmitry Saveliev, Domenic Horner, Dominik Heidler, Elias Jarlebring, Elliot Huffman, Emil Hessman, Emil Lundberg, Eng Zer Jun, Eric Lesiuta, Eric P, Erik Meitner, Evan Spensley, Federico Castagnini, Felix, Felix Ableitner, Felix Lampe, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gahl Saraf, Gilli Sigurdsson, Gleb Sinyavskiy, Graham Miln, Greg, Han Boetes, HansK-p, Harrison Jones, Heiko Zuerker, Hugo Locurcio, Iain Barnett, Ian Johnson, Ikko Ashimine, Ilya Brin, Iskander Sharipov, Jaakko Hannikainen, Jacek Szafarkiewicz, Jack Croft, Jacob, Jake Peterson, James O'Beirne, James Patterson, Jaroslav Lichtblau, Jaroslav Malec, Jauder Ho, Jaya Chithra, Jaya Kumar, Jeffery To, Jens Diemer, Jerry Jacobs, Jochen Voss, Johan Andersson, Johan Vromans, John Rinehart, Jonas Thelemann, Jonathan, Jonathan Cross, Jonta, Jose Manuel Delicado, Jörg Thalheim, Jędrzej Kula, K.B.Dharun Krishna, Kalle Laine, Karol Różycki, Kebin Liu, Keith Harrison, Keith Turner, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Kevin Bushiri, Kevin White, Jr., Kurt Fitzner, LSmithx2, Lars Lehtonen, Laurent Arnoud, Laurent Etiemble, Leo Arias, Liu Siyuan, Lord Landon Agahnim, Lukas Lihotzki, Majed Abdulaziz, Marc Laporte, Marc Pujol, Marcin Dziadus, Marcus Legendre, Mario Majila, Mark Pulford, Martchus, Martin Polehla, Mateusz Naściszewski, Mateusz Ż, Matic Potočnik, Matt Burke, Matt Robenolt, Matteo Ruina, Maurizio Tomasi, Max, Max Schulze, MaximAL, Maxime Thirouin, Maximilian, MichaIng, Michael Jephcote, Michael Rienstra, Michael Tilli, Migelo, Mike Boone, MikeLund, MikolajTwarog, Mingxuan Lin, Naveen, Nicholas Rishel, Nick Busey, Nico Stapelbroek, Nicolas Braud-Santoni, Nicolas Perraut, Niels Peter Roest, Nils Jakobi, NinoM4ster, Nitroretro, NoLooseEnds, Oliver Freyermuth, Otiel, Oyebanji Jacob Mayowa, Pablo, Pascal Jungblut, Paul Brit, Pawel Palenica, Paweł Rozlach, Peter Badida, Peter Dave Hello, Peter Hoeg, Peter Marquardt, Phani Rithvij, Phil Davis, Phill Luby, Pier Paolo Ramon, Piotr Bejda, Pramodh KP, Quentin Hibon, Rahmi Pruitt, Richard Hartmann, Robert Carosi, Roberto Santalla, Robin Schoonover, Roman Zaynetdinov, Ross Smith II, Ruslan Yevdokymov, Ryan Qian, Sacheendra Talluri, Scott Klupfel, Shaarad Dalvi, Simon Mwepu, Sly_tom_cat, Stefan Kuntz, Steven Eckhoff, Suhas Gundimeda, Taylor Khan, Thomas Hipp, Tim Abell, Tim Howes, Tobias Klauser, Tobias Nygren, Tobias Tom, Tom Jakubowski, Tommy Thorn, Tully Robinson, Tyler Brazier, Tyler Kropp, Unrud, Veeti Paananen, Victor Buinsky, Vik, Vil Brekin, Vladimir Rusinov, Will Rouesnel, William A. Kennington III, Xavier O., Yannic A., andresvia, andyleap, boomsquared, chenrui, chucic, cui fliter, d-volution, derekriemer, desbma, digital, entity0xfe, georgespatton, ghjklw, guangwu, ignacy123, janost, jaseg, jelle van der Waa, jtagcat, klemens, luzpaz, marco-m, mclang, mv1005, orangekame3, otbutz, overkill, perewa, red_led, rubenbe, sec65, villekalliomaki, wangguoliang, wouter bolsterlee, xarx00, xjtdy888, 佛跳墙, 落心
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
@@ -81,7 +85,10 @@ Jakob Borg, Audrius Butkevicius, Jesse Lucas, Simon Frei, Alexander Graf, Alexan
|
||||
</div>
|
||||
|
||||
<div id="about-paths" class="tab-pane">
|
||||
<table class="table table-striped table-auto">
|
||||
<p ng-if="!authenticated" translate>
|
||||
Log in to see paths information.
|
||||
</p>
|
||||
<table ng-if="authenticated" class="table table-striped table-auto">
|
||||
<caption><label translate>Internally used paths:</label></caption>
|
||||
<tbody>
|
||||
<tr>
|
||||
|
||||
@@ -38,7 +38,13 @@ angular.module('syncthing.core')
|
||||
.error(errorFn);
|
||||
}
|
||||
|
||||
function errorFn(dummy) {
|
||||
function errorFn(statusString, status) {
|
||||
if (status === 403) {
|
||||
// Auth error - reload login page
|
||||
location.reload();
|
||||
return;
|
||||
}
|
||||
|
||||
$rootScope.$broadcast(self.OFFLINE);
|
||||
|
||||
$timeout(function () {
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
<div id="log-viewer-log" class="tab-pane in active">
|
||||
<label translate ng-if="logging.logEntries.length == 0">Loading...</label>
|
||||
<textarea id="logViewerText" class="form-control" rows="20" ng-if="logging.logEntries.length != 0" readonly style="font-family: Consolas, monospace; font-size: 11px; overflow: auto;">{{ logging.content() }}</textarea>
|
||||
<p translate class="help-block" ng-style="{'visibility': logging.paused ? 'visible' : 'hidden'}">Log tailing paused. Scroll to the bottom to continue.</p>
|
||||
<a href="" translate class="help-block" ng-style="{'visibility': logging.paused ? 'visible' : 'hidden'}" ng-click="logging.scrollToBottom()" style="text-decoration: none">Log tailing paused. Scroll to the bottom to continue.</a>
|
||||
</div>
|
||||
|
||||
<div id="log-viewer-facilities" class="tab-pane">
|
||||
|
||||
@@ -14,12 +14,26 @@ angular.module('syncthing.core')
|
||||
|
||||
function initController() {
|
||||
LocaleService.autoConfigLocale();
|
||||
|
||||
if (!$scope.authenticated) {
|
||||
// Can't proceed yet - wait for the page reload after successful login.
|
||||
return;
|
||||
}
|
||||
|
||||
setInterval($scope.refresh, 10000);
|
||||
Events.start();
|
||||
}
|
||||
|
||||
// public/scope definitions
|
||||
|
||||
// window.metadata is set in /meta.js which requires authentication
|
||||
$scope.authenticated = window.metadata && window.metadata.authenticated;
|
||||
|
||||
$scope.login = {
|
||||
username: '',
|
||||
password: '',
|
||||
errors: {},
|
||||
};
|
||||
$scope.completion = {};
|
||||
$scope.config = {};
|
||||
$scope.configInSync = true;
|
||||
@@ -83,6 +97,35 @@ angular.module('syncthing.core')
|
||||
files: 0
|
||||
};
|
||||
|
||||
$scope.authenticatePassword = function () {
|
||||
$scope.login.inProgress = true;
|
||||
$scope.login.errors = {};
|
||||
$http.post(authUrlbase + '/password', {
|
||||
username: $scope.login.username,
|
||||
password: $scope.login.password,
|
||||
}).then(function () {
|
||||
location.reload();
|
||||
}).catch(function (response) {
|
||||
if (response.status === 403) {
|
||||
$scope.login.errors.badLogin = true;
|
||||
} else {
|
||||
$scope.login.errors.failed = true;
|
||||
console.log('Password authentication failed:', response);
|
||||
}
|
||||
}).finally(function () {
|
||||
$scope.login.inProgress = false;
|
||||
});
|
||||
};
|
||||
|
||||
$scope.logout = function() {
|
||||
$http.post(authUrlbase + '/logout', {})
|
||||
.then(function () {
|
||||
location.reload();
|
||||
}).catch(function (response) {
|
||||
console.log('Failed to log out:', response);
|
||||
});
|
||||
};
|
||||
|
||||
$(window).bind('beforeunload', function () {
|
||||
navigatingAway = true;
|
||||
});
|
||||
@@ -138,7 +181,7 @@ angular.module('syncthing.core')
|
||||
$scope.reportData = data;
|
||||
if ($scope.system && $scope.config.options.urAccepted > -1 && $scope.config.options.urSeen < $scope.system.urVersionMax && $scope.config.options.urAccepted < $scope.system.urVersionMax) {
|
||||
// Usage reporting format has changed, prompt the user to re-accept.
|
||||
$('#ur').modal();
|
||||
showModal('#ur');
|
||||
}
|
||||
}).error($scope.emitHTTPError);
|
||||
|
||||
@@ -150,9 +193,9 @@ angular.module('syncthing.core')
|
||||
|
||||
online = true;
|
||||
restarting = false;
|
||||
$('#networkError').modal('hide');
|
||||
$('#restarting').modal('hide');
|
||||
$('#shutdown').modal('hide');
|
||||
hideModal('#networkError');
|
||||
hideModal('#restarting');
|
||||
hideModal('#shutdown');
|
||||
}).catch($scope.emitHTTPError);
|
||||
});
|
||||
|
||||
@@ -164,7 +207,7 @@ angular.module('syncthing.core')
|
||||
console.log('UIOffline');
|
||||
online = false;
|
||||
if (!restarting) {
|
||||
$('#networkError').modal();
|
||||
showModal('#networkError');
|
||||
}
|
||||
});
|
||||
|
||||
@@ -183,13 +226,16 @@ angular.module('syncthing.core')
|
||||
if (arg.status === 0) {
|
||||
// A network error, not an HTTP error
|
||||
$scope.$emit(Events.OFFLINE);
|
||||
} else if (arg.status === 403) {
|
||||
// Auth error - reload login page
|
||||
location.reload();
|
||||
} else if (arg.status >= 400 && arg.status <= 599 && arg.status != 501) {
|
||||
// A genuine HTTP error. 501/NotImplemented is considered intentional
|
||||
// and not an error which we need to act upon.
|
||||
$('#networkError').modal('hide');
|
||||
$('#restarting').modal('hide');
|
||||
$('#shutdown').modal('hide');
|
||||
$('#httpError').modal();
|
||||
hideModal('#networkError');
|
||||
hideModal('#restarting');
|
||||
hideModal('#shutdown');
|
||||
showModal('#httpError');
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -325,7 +371,7 @@ angular.module('syncthing.core')
|
||||
document.cookie = "firstVisit=" + Date.now() + ";max-age=" + 30 * 24 * 3600;
|
||||
} else {
|
||||
if (+firstVisit < Date.now() - 4 * 3600 * 1000) {
|
||||
$('#ur').modal();
|
||||
showModal('#ur');
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -519,6 +565,15 @@ angular.module('syncthing.core')
|
||||
}).error($scope.emitHTTPError);
|
||||
}
|
||||
|
||||
$scope.isAuthEnabled = function () {
|
||||
// This function should match IsAuthEnabled() in guiconfiguration.go
|
||||
var guiCfg = $scope.config && $scope.config.gui;
|
||||
if (guiCfg) {
|
||||
return guiCfg.authMode === 'ldap' || (guiCfg.user && guiCfg.password);
|
||||
}
|
||||
return false;
|
||||
};
|
||||
|
||||
function refreshNoAuthWarning() {
|
||||
if (!$scope.system || !$scope.config || !$scope.config.gui) {
|
||||
// We need all to be able to determine the state.
|
||||
@@ -533,8 +588,7 @@ angular.module('syncthing.core')
|
||||
$scope.openNoAuth = addr.substr(0, 4) !== "127."
|
||||
&& addr.substr(0, 6) !== "[::1]:"
|
||||
&& addr.substr(0, 1) !== "/"
|
||||
&& (!guiCfg.user || !guiCfg.password)
|
||||
&& guiCfg.authMode !== 'ldap'
|
||||
&& !$scope.isAuthEnabled()
|
||||
&& !guiCfg.insecureAdminAccess;
|
||||
|
||||
if ((guiCfg.user && guiCfg.password) || guiCfg.authMode === 'ldap') {
|
||||
@@ -1144,6 +1198,9 @@ angular.module('syncthing.core')
|
||||
// loop through all devices
|
||||
var deviceCount = 0;
|
||||
for (var id in $scope.devices) {
|
||||
if (id === $scope.myID) {
|
||||
continue
|
||||
}
|
||||
var status = $scope.deviceStatus({
|
||||
deviceID: id
|
||||
});
|
||||
@@ -1176,8 +1233,8 @@ angular.module('syncthing.core')
|
||||
return 'notify';
|
||||
}
|
||||
|
||||
// all used devices are paused except (this) one
|
||||
if (pauseCount === deviceCount - 1) {
|
||||
// all used devices are paused
|
||||
if (pauseCount === deviceCount && deviceCount > 0) {
|
||||
return 'pause';
|
||||
}
|
||||
|
||||
@@ -1331,7 +1388,7 @@ angular.module('syncthing.core')
|
||||
|
||||
$scope.showDeviceIdentification = function (deviceCfg) {
|
||||
$scope.currentDevice = deviceCfg;
|
||||
$('#idqr').modal();
|
||||
showModal('#idqr');
|
||||
};
|
||||
|
||||
$scope.setDevicePause = function (device, pause) {
|
||||
@@ -1362,7 +1419,7 @@ angular.module('syncthing.core')
|
||||
params.heading = $translate.instant("Listener Status");
|
||||
}
|
||||
$scope.connectivityStatusParams = params;
|
||||
$('#connectivity-status').modal();
|
||||
showModal('#connectivity-status');
|
||||
};
|
||||
|
||||
$scope.showDiscoveryStatus = function () {
|
||||
@@ -1377,7 +1434,7 @@ angular.module('syncthing.core')
|
||||
params.heading = $translate.instant("Discovery Status");
|
||||
}
|
||||
$scope.connectivityStatusParams = params;
|
||||
$('#connectivity-status').modal();
|
||||
showModal('#connectivity-status');
|
||||
};
|
||||
|
||||
$scope.logging = {
|
||||
@@ -1401,7 +1458,7 @@ angular.module('syncthing.core')
|
||||
$scope.logging.timer = $timeout($scope.logging.fetch);
|
||||
var textArea = $('#logViewerText');
|
||||
textArea.on("scroll", $scope.logging.onScroll);
|
||||
$('#logViewer').modal().one('shown.bs.modal', function () {
|
||||
$('#logViewer').one('shown.bs.modal', function () {
|
||||
// Scroll to bottom.
|
||||
textArea.scrollTop(textArea[0].scrollHeight);
|
||||
}).one('hidden.bs.modal', function () {
|
||||
@@ -1410,6 +1467,7 @@ angular.module('syncthing.core')
|
||||
$scope.logging.timer = null;
|
||||
$scope.logging.entries = [];
|
||||
});
|
||||
showModal('#logViewer');
|
||||
},
|
||||
onFacilityChange: function (facility) {
|
||||
var enabled = $scope.logging.facilities[facility].enabled;
|
||||
@@ -1429,6 +1487,11 @@ angular.module('syncthing.core')
|
||||
// Browser events do not cause redraw, trigger manually.
|
||||
$scope.$apply();
|
||||
},
|
||||
scrollToBottom: function () {
|
||||
var textArea = $('#logViewerText');
|
||||
var scrollHeight = textArea.prop('scrollHeight');
|
||||
textArea.prop('scrollTop', scrollHeight);
|
||||
},
|
||||
timer: null,
|
||||
entries: [],
|
||||
paused: false,
|
||||
@@ -1477,13 +1540,14 @@ angular.module('syncthing.core')
|
||||
},
|
||||
show: function () {
|
||||
$scope.about.refreshPaths();
|
||||
$('#about').modal("show");
|
||||
showModal('#about');
|
||||
},
|
||||
};
|
||||
|
||||
$scope.discardChangedSettings = function () {
|
||||
$("#discard-changes-confirmation").modal("hide");
|
||||
$("#settings").off("hide.bs.modal").modal("hide");
|
||||
hideModal('#discard-changes-confirmation');
|
||||
$('#settings').off('hide.bs.modal')
|
||||
hideModal('#settings');
|
||||
};
|
||||
|
||||
$scope.showSettings = function () {
|
||||
@@ -1500,9 +1564,9 @@ angular.module('syncthing.core')
|
||||
$scope.tmpGUI = angular.copy($scope.config.gui);
|
||||
$scope.tmpRemoteIgnoredDevices = angular.copy($scope.config.remoteIgnoredDevices);
|
||||
$scope.tmpDevices = angular.copy($scope.config.devices);
|
||||
$('#settings').modal("show");
|
||||
$("#settings a[href='#settings-general']").tab("show");
|
||||
$("#settings").on('hide.bs.modal', function (event) {
|
||||
$('#settings').one('shown.bs.modal', function () {
|
||||
$("#settings a[href='#settings-general']").tab("show");
|
||||
}).on('hide.bs.modal', function (event) {
|
||||
if ($scope.settingsModified()) {
|
||||
event.preventDefault();
|
||||
$("#discard-changes-confirmation").modal("show");
|
||||
@@ -1510,10 +1574,18 @@ angular.module('syncthing.core')
|
||||
$("#settings").off("hide.bs.modal");
|
||||
}
|
||||
});
|
||||
showModal('#settings');
|
||||
};
|
||||
|
||||
$scope.saveConfig = function () {
|
||||
$('#savingChanges').modal();
|
||||
// Use "$scope.saveConfig().then" when hiding modals after saving
|
||||
// changes, or otherwise the background modal will be hidden before
|
||||
// the #savingChanges modal, causing the right body margin increase
|
||||
// bug (see https://github.com/syncthing/syncthing/pull/9078).
|
||||
var timeout = setTimeout(function () {
|
||||
// Only block the UI when there is a significant delay.
|
||||
showModal('#savingChanges');
|
||||
}, 200);
|
||||
var cfg = JSON.stringify($scope.config);
|
||||
var opts = {
|
||||
headers: {
|
||||
@@ -1521,8 +1593,10 @@ angular.module('syncthing.core')
|
||||
}
|
||||
};
|
||||
return $http.put(urlbase + '/config', cfg, opts).finally(function () {
|
||||
console.log('saveConfig', $scope.config);
|
||||
refreshConfig();
|
||||
$('#savingChanges').modal("hide");
|
||||
clearTimeout(timeout);
|
||||
hideModal('#savingChanges');
|
||||
}).catch($scope.emitHTTPError);
|
||||
};
|
||||
|
||||
@@ -1606,22 +1680,27 @@ angular.module('syncthing.core')
|
||||
$scope.saveConfig().then(function () {
|
||||
if (themeChanged) {
|
||||
document.location.reload(true);
|
||||
} else {
|
||||
$('#settings').off('hide.bs.modal')
|
||||
hideModal('#settings');
|
||||
}
|
||||
});
|
||||
} else {
|
||||
$('#settings').off('hide.bs.modal')
|
||||
hideModal('#settings');
|
||||
}
|
||||
|
||||
$("#settings").off("hide.bs.modal").modal("hide");
|
||||
};
|
||||
|
||||
$scope.saveAdvanced = function () {
|
||||
$scope.config = $scope.advancedConfig;
|
||||
$scope.saveConfig();
|
||||
$('#advanced').modal("hide");
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#advanced');
|
||||
});
|
||||
};
|
||||
|
||||
$scope.restart = function () {
|
||||
restarting = true;
|
||||
$('#restarting').modal();
|
||||
showModal('#restarting');
|
||||
$http.post(urlbase + '/system/restart');
|
||||
$scope.configInSync = true;
|
||||
|
||||
@@ -1643,21 +1722,21 @@ angular.module('syncthing.core')
|
||||
|
||||
$scope.upgrade = function () {
|
||||
restarting = true;
|
||||
$('#upgrade').modal('hide');
|
||||
$('#majorUpgrade').modal('hide');
|
||||
$('#upgrading').modal();
|
||||
hideModal('#upgrade');
|
||||
hideModal('#majorUpgrade');
|
||||
showModal('#upgrading');
|
||||
$http.post(urlbase + '/system/upgrade').success(function () {
|
||||
$('#restarting').modal();
|
||||
$('#upgrading').modal('hide');
|
||||
hideModal('#upgrading');
|
||||
showModal('#restarting');
|
||||
}).error(function () {
|
||||
$('#upgrading').modal('hide');
|
||||
hideModal('#upgrading');
|
||||
});
|
||||
};
|
||||
|
||||
$scope.shutdown = function () {
|
||||
restarting = true;
|
||||
$http.post(urlbase + '/system/shutdown').success(function () {
|
||||
$('#shutdown').modal();
|
||||
showModal('#shutdown');
|
||||
}).error($scope.emitHTTPError);
|
||||
$scope.configInSync = true;
|
||||
};
|
||||
@@ -1665,7 +1744,7 @@ angular.module('syncthing.core')
|
||||
function editDeviceModal() {
|
||||
$scope.currentDevice._addressesStr = $scope.currentDevice.addresses.join(', ');
|
||||
$scope.deviceEditor.$setPristine();
|
||||
$('#editDevice').modal();
|
||||
showModal('#editDevice');
|
||||
}
|
||||
|
||||
$scope.editDeviceModalTitle = function() {
|
||||
@@ -1706,9 +1785,9 @@ angular.module('syncthing.core')
|
||||
}
|
||||
|
||||
$scope.editDeviceUntrustedChanged = function () {
|
||||
if (currentDevice.untrusted) {
|
||||
currentDevice.introducer = false;
|
||||
currentDevice.autoAcceptFolders = false;
|
||||
if ($scope.currentDevice.untrusted) {
|
||||
$scope.currentDevice.introducer = false;
|
||||
$scope.currentDevice.autoAcceptFolders = false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1789,7 +1868,6 @@ angular.module('syncthing.core')
|
||||
};
|
||||
|
||||
$scope.deleteDevice = function () {
|
||||
$('#editDevice').modal('hide');
|
||||
if ($scope.currentDevice._editing != "existing") {
|
||||
return;
|
||||
}
|
||||
@@ -1804,11 +1882,12 @@ angular.module('syncthing.core')
|
||||
});
|
||||
}
|
||||
|
||||
$scope.saveConfig();
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#editDevice');
|
||||
});
|
||||
};
|
||||
|
||||
$scope.saveDevice = function () {
|
||||
$('#editDevice').modal('hide');
|
||||
$scope.currentDevice.addresses = $scope.currentDevice._addressesStr.split(',').map(function (x) {
|
||||
return x.trim();
|
||||
});
|
||||
@@ -1820,7 +1899,9 @@ angular.module('syncthing.core')
|
||||
}
|
||||
delete $scope.currentSharing;
|
||||
$scope.currentDevice = {};
|
||||
$scope.saveConfig();
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#editDevice');
|
||||
});
|
||||
};
|
||||
|
||||
function setDeviceConfig() {
|
||||
@@ -2049,7 +2130,7 @@ angular.module('syncthing.core')
|
||||
};
|
||||
|
||||
$scope.globalChanges = function () {
|
||||
$('#globalChanges').modal();
|
||||
showModal('#globalChanges');
|
||||
};
|
||||
|
||||
function editFolderModal(initialTab) {
|
||||
@@ -2061,7 +2142,7 @@ angular.module('syncthing.core')
|
||||
initialTab = "#folder-general";
|
||||
}
|
||||
$('.nav-tabs a[href="' + initialTab + '"]').tab('show');
|
||||
$('#editFolder').modal().one('shown.bs.tab', function (e) {
|
||||
$('#editFolder').one('shown.bs.tab', function (e) {
|
||||
if (e.target.attributes.href.value === "#folder-ignores") {
|
||||
$('#folder-ignores textarea').focus();
|
||||
}
|
||||
@@ -2077,6 +2158,7 @@ angular.module('syncthing.core')
|
||||
$scope.ignores = {};
|
||||
});
|
||||
});
|
||||
showModal('#editFolder');
|
||||
};
|
||||
|
||||
$scope.editFolderModalTitle = function() {
|
||||
@@ -2304,7 +2386,7 @@ angular.module('syncthing.core')
|
||||
// On modal being hidden without clicking save, the defaults will be saved.
|
||||
$scope.ignores.saved = true;
|
||||
saveFolderAddIgnores($scope.currentFolder.id);
|
||||
hideFolderModal();
|
||||
hideModal('#editFolder');
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2357,10 +2439,11 @@ angular.module('syncthing.core')
|
||||
delete folderCfg._guiVersioning;
|
||||
|
||||
if ($scope.currentFolder._editing == "defaults") {
|
||||
hideFolderModal();
|
||||
$scope.config.defaults.ignores.lines = ignoresArray();
|
||||
$scope.config.defaults.folder = folderCfg;
|
||||
$scope.saveConfig();
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#editFolder');
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2372,16 +2455,18 @@ angular.module('syncthing.core')
|
||||
$scope.config.folders = folderList($scope.folders);
|
||||
|
||||
if ($scope.currentFolder._editing == "existing") {
|
||||
hideFolderModal();
|
||||
saveFolderIgnoresExisting();
|
||||
$scope.saveConfig();
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#editFolder');
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
// No ignores to be set on the new folder, save directly.
|
||||
if (!$scope.currentFolder._addIgnores) {
|
||||
hideFolderModal();
|
||||
$scope.saveConfig();
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#editFolder');
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2528,7 +2613,6 @@ angular.module('syncthing.core')
|
||||
};
|
||||
|
||||
$scope.deleteFolder = function (id) {
|
||||
hideFolderModal();
|
||||
if ($scope.currentFolder._editing != "existing") {
|
||||
return;
|
||||
}
|
||||
@@ -2538,13 +2622,11 @@ angular.module('syncthing.core')
|
||||
$scope.config.folders = folderList($scope.folders);
|
||||
recalcLocalStateTotal();
|
||||
|
||||
$scope.saveConfig();
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#editFolder');
|
||||
});
|
||||
};
|
||||
|
||||
function hideFolderModal() {
|
||||
$('#editFolder').modal('hide');
|
||||
}
|
||||
|
||||
function resetRestoreVersions() {
|
||||
$scope.restoreVersions = {
|
||||
folder: null,
|
||||
@@ -2610,7 +2692,7 @@ angular.module('syncthing.core')
|
||||
|
||||
$http.post(urlbase + '/folder/versions?folder=' + encodeURIComponent($scope.restoreVersions.folder), selections).success(function (data) {
|
||||
if (Object.keys(data).length == 0) {
|
||||
$('#restoreVersions').modal('hide');
|
||||
hideModal('#restoreVersions');
|
||||
} else {
|
||||
$scope.restoreVersions.errors = data;
|
||||
}
|
||||
@@ -2621,12 +2703,13 @@ angular.module('syncthing.core')
|
||||
|
||||
var closed = false;
|
||||
var modalShown = $q.defer();
|
||||
$('#restoreVersions').modal().one('hidden.bs.modal', function () {
|
||||
$('#restoreVersions').one('hidden.bs.modal', function () {
|
||||
closed = true;
|
||||
resetRestoreVersions();
|
||||
}).one('shown.bs.modal', function () {
|
||||
modalShown.resolve();
|
||||
});
|
||||
showModal('#restoreVersions');
|
||||
|
||||
var dataReceived = $http.get(urlbase + '/folder/versions?folder=' + encodeURIComponent($scope.restoreVersions.folder))
|
||||
.success(function (data) {
|
||||
@@ -2809,8 +2892,9 @@ angular.module('syncthing.core')
|
||||
$scope.acceptUR = function () {
|
||||
$scope.config.options.urAccepted = $scope.system.urVersionMax;
|
||||
$scope.config.options.urSeen = $scope.system.urVersionMax;
|
||||
$scope.saveConfig();
|
||||
$('#ur').modal('hide');
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#ur');
|
||||
});
|
||||
};
|
||||
|
||||
$scope.declineUR = function () {
|
||||
@@ -2818,17 +2902,19 @@ angular.module('syncthing.core')
|
||||
$scope.config.options.urAccepted = -1;
|
||||
}
|
||||
$scope.config.options.urSeen = $scope.system.urVersionMax;
|
||||
$scope.saveConfig();
|
||||
$('#ur').modal('hide');
|
||||
$scope.saveConfig().then(function () {
|
||||
hideModal('#ur');
|
||||
});
|
||||
};
|
||||
|
||||
$scope.showNeed = function (folder) {
|
||||
$scope.neededFolder = folder;
|
||||
$scope.refreshNeed(1, 10);
|
||||
$('#needed').modal().one('hidden.bs.modal', function () {
|
||||
$('#needed').one('hidden.bs.modal', function () {
|
||||
$scope.needed = undefined;
|
||||
$scope.neededFolder = '';
|
||||
});
|
||||
showModal('#needed');
|
||||
};
|
||||
|
||||
$scope.showRemoteNeed = function (device) {
|
||||
@@ -2842,9 +2928,10 @@ angular.module('syncthing.core')
|
||||
$scope.remoteNeedFolders.push(folder);
|
||||
$scope.refreshRemoteNeed(folder, 1, 10);
|
||||
});
|
||||
$('#remoteNeed').modal().one('hidden.bs.modal', function () {
|
||||
$('#remoteNeed').one('hidden.bs.modal', function () {
|
||||
resetRemoteNeed();
|
||||
});
|
||||
showModal('#remoteNeed');
|
||||
};
|
||||
|
||||
$scope.downloadProgressEnabled = function() {
|
||||
@@ -2857,9 +2944,10 @@ angular.module('syncthing.core')
|
||||
$scope.showFailed = function (folder) {
|
||||
$scope.failed.folder = folder;
|
||||
$scope.failed = $scope.refreshFailed(1, 10);
|
||||
$('#failed').modal().one('hidden.bs.modal', function () {
|
||||
$('#failed').one('hidden.bs.modal', function () {
|
||||
$scope.failed = {};
|
||||
});
|
||||
showModal('#failed');
|
||||
};
|
||||
|
||||
$scope.hasFailedFiles = function (folder) {
|
||||
@@ -2873,11 +2961,12 @@ angular.module('syncthing.core')
|
||||
$scope.localChangedFolder = folder;
|
||||
$scope.localChangedType = folderType;
|
||||
$scope.localChanged = $scope.refreshLocalChanged(1, 10);
|
||||
$('#localChanged').modal().one('hidden.bs.modal', function () {
|
||||
$('#localChanged').one('hidden.bs.modal', function () {
|
||||
$scope.localChanged = {};
|
||||
$scope.localChangedFolder = undefined;
|
||||
$scope.localChangedType = undefined;
|
||||
});
|
||||
showModal('#localChanged');
|
||||
};
|
||||
|
||||
$scope.hasReceiveOnlyChanged = function (folderCfg) {
|
||||
@@ -2917,7 +3006,7 @@ angular.module('syncthing.core')
|
||||
break;
|
||||
}
|
||||
$scope.revertOverrideParams = params;
|
||||
$('#revert-override-confirmation').modal('show');
|
||||
showModal('#revert-override-confirmation');
|
||||
};
|
||||
|
||||
$scope.advanced = function () {
|
||||
@@ -2930,7 +3019,7 @@ angular.module('syncthing.core')
|
||||
}
|
||||
return $scope.advancedConfig.defaults.ignores.lines.join('\n');
|
||||
};
|
||||
$('#advanced').modal('show');
|
||||
showModal('#advanced');
|
||||
};
|
||||
|
||||
$scope.showReportPreview = function () {
|
||||
@@ -3084,6 +3173,9 @@ angular.module('syncthing.core')
|
||||
|
||||
$scope.docsURL = function (path) {
|
||||
var url = 'https://docs.syncthing.net';
|
||||
if (!$scope.versionBase()) {
|
||||
return url;
|
||||
}
|
||||
if (!path) {
|
||||
// Undefined or null should become a valid string.
|
||||
path = '';
|
||||
@@ -3234,7 +3326,7 @@ angular.module('syncthing.core')
|
||||
}
|
||||
|
||||
$scope.shareDeviceIdParams = params;
|
||||
$('#share-device-id-dialog').modal('show');
|
||||
showModal('#share-device-id-dialog');
|
||||
};
|
||||
|
||||
$scope.shareDeviceId = function () {
|
||||
@@ -3392,6 +3484,69 @@ angular.module('syncthing.core')
|
||||
return n.match !== "";
|
||||
});
|
||||
};
|
||||
|
||||
// The showModal and hideModal functions are a bandaid for a Bootstrap
|
||||
// bug (see https://github.com/twbs/bootstrap/issues/3902) that causes
|
||||
// multiple consecutively shown or hidden modals to overlap which leads
|
||||
// to the right body margin in HTML increasing in size infinitely. These
|
||||
// custom functions make sure that the previous modal has either been
|
||||
// fully shown or hidden before showing or hiding a new one. Note that
|
||||
// modals still need to be manipulated in the order of their appearance,
|
||||
// i.e. the foreground first, the background later, or the body margin
|
||||
// addition bug will occur.
|
||||
|
||||
var previousModalState = '';
|
||||
var previousModalID = '';
|
||||
|
||||
function showModal(modalID) {
|
||||
if (($(modalID).data('bs.modal') || {}).isShown) {
|
||||
return;
|
||||
}
|
||||
showHideModal(modalID, 'show');
|
||||
};
|
||||
|
||||
function hideModal(modalID) {
|
||||
if (!($(modalID).data('bs.modal') || {}).isShown) {
|
||||
return;
|
||||
}
|
||||
showHideModal(modalID, 'hide');
|
||||
};
|
||||
|
||||
function showHideModal(modalID, modalState) {
|
||||
var modalAction = '';
|
||||
var modalEvent = '';
|
||||
|
||||
switch (modalState) {
|
||||
case 'show':
|
||||
modalAction = showModal;
|
||||
modalEvent = 'shown.bs.modal';
|
||||
break;
|
||||
case 'hide':
|
||||
modalAction = hideModal;
|
||||
modalEvent = 'hidden.bs.modal';
|
||||
break;
|
||||
}
|
||||
|
||||
switch (previousModalState) {
|
||||
case 'show':
|
||||
$(previousModalID).one('shown.bs.modal', function () {
|
||||
modalAction(modalID);
|
||||
});
|
||||
break;
|
||||
case 'hide':
|
||||
$(previousModalID).one('hidden.bs.modal', function () {
|
||||
modalAction(modalID);
|
||||
});
|
||||
break;
|
||||
default:
|
||||
previousModalState = modalState;
|
||||
previousModalID = modalID;
|
||||
$(modalID).one(modalEvent, function () {
|
||||
previousModalState = '';
|
||||
previousModalID = '';
|
||||
}).modal(modalState);
|
||||
}
|
||||
};
|
||||
})
|
||||
.directive('shareTemplate', function () {
|
||||
return {
|
||||
|
||||
@@ -128,14 +128,14 @@
|
||||
<div class="row">
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label translate for="User">GUI Authentication User</label>
|
||||
<input id="User" class="form-control" type="text" ng-model="tmpGUI.user" autocomplete="off" />
|
||||
<label translate for="user">GUI Authentication User</label>
|
||||
<input id="user" class="form-control" type="text" name="user" ng-model="tmpGUI.user" autocomplete="username" />
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-md-6">
|
||||
<div class="form-group">
|
||||
<label translate for="Password">GUI Authentication Password</label>
|
||||
<input id="Password" class="form-control" type="password" ng-model="tmpGUI.password" ng-trim="false" autocomplete="new-password" />
|
||||
<label translate for="password">GUI Authentication Password</label>
|
||||
<input id="password" class="form-control" type="password" name="password" ng-model="tmpGUI.password" ng-trim="false" autocomplete="new-password" />
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
<p translate>Anonymous usage report format has changed. Would you like to move to the new format?</p>
|
||||
</div>
|
||||
<div ng-if="!(config.options.urAccepted > 0 && config.options.urAccepted < system.urVersionMax)">
|
||||
<p translate>The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.</p>
|
||||
<p translate>The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.</p>
|
||||
<p translate>The aggregated statistics are publicly available at the URL below.</p>
|
||||
<p><a href="https://data.syncthing.net/" target="_blank">https://data.syncthing.net/</a></p>
|
||||
</div>
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
<modal id="urPreview" status="success" icon="fas fa-chart-bar" heading="{{'Anonymous Usage Reporting' | translate}}" large="yes" closeable="yes">
|
||||
<div class="modal-body">
|
||||
<p translate>
|
||||
The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.
|
||||
The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.
|
||||
</p>
|
||||
<p translate>The aggregated statistics are publicly available at the URL below.</p>
|
||||
<p><a href="https://data.syncthing.net/" target="_blank">https://data.syncthing.net/</a></p>
|
||||
|
||||
+13
-5
@@ -350,7 +350,7 @@ func (s *service) Serve(ctx context.Context) error {
|
||||
mux.Handle("/", s.statics)
|
||||
|
||||
// Handle the special meta.js path
|
||||
mux.HandleFunc("/meta.js", s.getJSMetadata)
|
||||
mux.Handle("/meta.js", noCacheMiddleware(http.HandlerFunc(s.getJSMetadata)))
|
||||
|
||||
// Handle Prometheus metrics
|
||||
promHttpHandler := promhttp.Handler()
|
||||
@@ -365,14 +365,20 @@ func (s *service) Serve(ctx context.Context) error {
|
||||
|
||||
// Wrap everything in CSRF protection. The /rest prefix should be
|
||||
// protected, other requests will grant cookies.
|
||||
var handler http.Handler = newCsrfManager(s.id.String()[:5], "/rest", guiCfg, mux, locations.Get(locations.CsrfTokens))
|
||||
var handler http.Handler = newCsrfManager(s.id.Short().String(), "/rest", guiCfg, mux, locations.Get(locations.CsrfTokens))
|
||||
|
||||
// Add our version and ID as a header to responses
|
||||
handler = withDetailsMiddleware(s.id, handler)
|
||||
|
||||
// Wrap everything in basic auth, if user/password is set.
|
||||
if guiCfg.IsAuthEnabled() {
|
||||
handler = basicAuthAndSessionMiddleware("sessionid-"+s.id.String()[:5], guiCfg, s.cfg.LDAP(), handler, s.evLogger)
|
||||
sessionCookieName := "sessionid-" + s.id.Short().String()
|
||||
handler = basicAuthAndSessionMiddleware(sessionCookieName, s.id.Short().String(), guiCfg, s.cfg.LDAP(), handler, s.evLogger)
|
||||
handlePasswordAuth := passwordAuthHandler(sessionCookieName, guiCfg, s.cfg.LDAP(), s.evLogger)
|
||||
restMux.Handler(http.MethodPost, "/rest/noauth/auth/password", handlePasswordAuth)
|
||||
|
||||
// Logout is a no-op without a valid session cookie, so /noauth/ is fine here
|
||||
restMux.Handler(http.MethodPost, "/rest/noauth/auth/logout", handleLogout(sessionCookieName))
|
||||
}
|
||||
|
||||
// Redirect to HTTPS if we are supposed to
|
||||
@@ -711,8 +717,10 @@ func (*service) getSystemPaths(w http.ResponseWriter, _ *http.Request) {
|
||||
}
|
||||
|
||||
func (s *service) getJSMetadata(w http.ResponseWriter, _ *http.Request) {
|
||||
meta, _ := json.Marshal(map[string]string{
|
||||
"deviceID": s.id.String(),
|
||||
meta, _ := json.Marshal(map[string]interface{}{
|
||||
"deviceID": s.id.String(),
|
||||
"deviceIDShort": s.id.Short().String(),
|
||||
"authenticated": true,
|
||||
})
|
||||
w.Header().Set("Content-Type", "application/javascript")
|
||||
fmt.Fprintf(w, "var metadata = %s;\n", meta)
|
||||
|
||||
+201
-67
@@ -19,6 +19,7 @@ import (
|
||||
"github.com/syncthing/syncthing/lib/events"
|
||||
"github.com/syncthing/syncthing/lib/rand"
|
||||
"github.com/syncthing/syncthing/lib/sync"
|
||||
"golang.org/x/exp/slices"
|
||||
)
|
||||
|
||||
var (
|
||||
@@ -37,84 +38,192 @@ func emitLoginAttempt(success bool, username, address string, evLogger events.Lo
|
||||
}
|
||||
}
|
||||
|
||||
func basicAuthAndSessionMiddleware(cookieName string, guiCfg config.GUIConfiguration, ldapCfg config.LDAPConfiguration, next http.Handler, evLogger events.Logger) http.Handler {
|
||||
func antiBruteForceSleep() {
|
||||
time.Sleep(time.Duration(rand.Intn(100)+100) * time.Millisecond)
|
||||
}
|
||||
|
||||
func unauthorized(w http.ResponseWriter, shortID string) {
|
||||
w.Header().Set("WWW-Authenticate", fmt.Sprintf(`Basic realm="Authorization Required (%s)"`, shortID))
|
||||
http.Error(w, "Not Authorized", http.StatusUnauthorized)
|
||||
}
|
||||
|
||||
func forbidden(w http.ResponseWriter) {
|
||||
http.Error(w, "Forbidden", http.StatusForbidden)
|
||||
}
|
||||
|
||||
func isNoAuthPath(path string) bool {
|
||||
// Local variable instead of module var to prevent accidental mutation
|
||||
noAuthPaths := []string{
|
||||
"/",
|
||||
"/index.html",
|
||||
"/modal.html",
|
||||
"/rest/svc/lang", // Required to load language settings on login page
|
||||
}
|
||||
|
||||
// Local variable instead of module var to prevent accidental mutation
|
||||
noAuthPrefixes := []string{
|
||||
// Static assets
|
||||
"/assets/",
|
||||
"/syncthing/",
|
||||
"/vendor/",
|
||||
"/theme-assets/", // This leaks information from config, but probably not sensitive
|
||||
|
||||
// No-auth API endpoints
|
||||
"/rest/noauth",
|
||||
}
|
||||
|
||||
return slices.Contains(noAuthPaths, path) ||
|
||||
slices.ContainsFunc(noAuthPrefixes, func(prefix string) bool {
|
||||
return strings.HasPrefix(path, prefix)
|
||||
})
|
||||
}
|
||||
|
||||
func basicAuthAndSessionMiddleware(cookieName, shortID string, guiCfg config.GUIConfiguration, ldapCfg config.LDAPConfiguration, next http.Handler, evLogger events.Logger) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
if hasValidAPIKeyHeader(r, guiCfg) {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// Exception for REST calls that don't require authentication.
|
||||
if strings.HasPrefix(r.URL.Path, "/rest/noauth") {
|
||||
for _, cookie := range r.Cookies() {
|
||||
// We iterate here since there may, historically, be multiple
|
||||
// cookies with the same name but different path. Any "old" ones
|
||||
// won't match an existing session and will be ignored, then
|
||||
// later removed on logout or when timing out.
|
||||
if cookie.Name == cookieName {
|
||||
sessionsMut.Lock()
|
||||
_, ok := sessions[cookie.Value]
|
||||
sessionsMut.Unlock()
|
||||
if ok {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Fall back to Basic auth if provided
|
||||
if username, ok := attemptBasicAuth(r, guiCfg, ldapCfg, evLogger); ok {
|
||||
createSession(cookieName, username, guiCfg, evLogger, w, r)
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
cookie, err := r.Cookie(cookieName)
|
||||
if err == nil && cookie != nil {
|
||||
sessionsMut.Lock()
|
||||
_, ok := sessions[cookie.Value]
|
||||
sessionsMut.Unlock()
|
||||
if ok {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
l.Debugln("Sessionless HTTP request with authentication; this is expensive.")
|
||||
|
||||
error := func() {
|
||||
time.Sleep(time.Duration(rand.Intn(100)+100) * time.Millisecond)
|
||||
w.Header().Set("WWW-Authenticate", "Basic realm=\"Authorization Required\"")
|
||||
http.Error(w, "Not Authorized", http.StatusUnauthorized)
|
||||
}
|
||||
|
||||
username, password, ok := r.BasicAuth()
|
||||
if !ok {
|
||||
error()
|
||||
// Exception for static assets and REST calls that don't require authentication.
|
||||
if isNoAuthPath(r.URL.Path) {
|
||||
next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
authOk := auth(username, password, guiCfg, ldapCfg)
|
||||
if !authOk {
|
||||
usernameIso := string(iso88591ToUTF8([]byte(username)))
|
||||
passwordIso := string(iso88591ToUTF8([]byte(password)))
|
||||
authOk = auth(usernameIso, passwordIso, guiCfg, ldapCfg)
|
||||
if authOk {
|
||||
username = usernameIso
|
||||
}
|
||||
}
|
||||
|
||||
if !authOk {
|
||||
emitLoginAttempt(false, username, r.RemoteAddr, evLogger)
|
||||
error()
|
||||
// Some browsers don't send the Authorization request header unless prompted by a 401 response.
|
||||
// This enables https://user:pass@localhost style URLs to keep working.
|
||||
if guiCfg.SendBasicAuthPrompt {
|
||||
unauthorized(w, shortID)
|
||||
return
|
||||
}
|
||||
|
||||
sessionid := rand.String(32)
|
||||
sessionsMut.Lock()
|
||||
sessions[sessionid] = true
|
||||
sessionsMut.Unlock()
|
||||
forbidden(w)
|
||||
})
|
||||
}
|
||||
|
||||
// Best effort detection of whether the connection is HTTPS --
|
||||
// either directly to us, or as used by the client towards a reverse
|
||||
// proxy who sends us headers.
|
||||
connectionIsHTTPS := r.TLS != nil ||
|
||||
strings.ToLower(r.Header.Get("x-forwarded-proto")) == "https" ||
|
||||
strings.Contains(strings.ToLower(r.Header.Get("forwarded")), "proto=https")
|
||||
// If the connection is HTTPS, or *should* be HTTPS, set the Secure
|
||||
// bit in cookies.
|
||||
useSecureCookie := connectionIsHTTPS || guiCfg.UseTLS()
|
||||
func passwordAuthHandler(cookieName string, guiCfg config.GUIConfiguration, ldapCfg config.LDAPConfiguration, evLogger events.Logger) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
var req struct {
|
||||
Username string
|
||||
Password string
|
||||
}
|
||||
if err := unmarshalTo(r.Body, &req); err != nil {
|
||||
l.Debugln("Failed to parse username and password:", err)
|
||||
http.Error(w, "Failed to parse username and password.", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
http.SetCookie(w, &http.Cookie{
|
||||
Name: cookieName,
|
||||
Value: sessionid,
|
||||
MaxAge: 0,
|
||||
Secure: useSecureCookie,
|
||||
})
|
||||
if auth(req.Username, req.Password, guiCfg, ldapCfg) {
|
||||
createSession(cookieName, req.Username, guiCfg, evLogger, w, r)
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
return
|
||||
}
|
||||
|
||||
emitLoginAttempt(true, username, r.RemoteAddr, evLogger)
|
||||
next.ServeHTTP(w, r)
|
||||
emitLoginAttempt(false, req.Username, r.RemoteAddr, evLogger)
|
||||
antiBruteForceSleep()
|
||||
forbidden(w)
|
||||
})
|
||||
}
|
||||
|
||||
func attemptBasicAuth(r *http.Request, guiCfg config.GUIConfiguration, ldapCfg config.LDAPConfiguration, evLogger events.Logger) (string, bool) {
|
||||
username, password, ok := r.BasicAuth()
|
||||
if !ok {
|
||||
return "", false
|
||||
}
|
||||
|
||||
l.Debugln("Sessionless HTTP request with authentication; this is expensive.")
|
||||
|
||||
if auth(username, password, guiCfg, ldapCfg) {
|
||||
return username, true
|
||||
}
|
||||
|
||||
usernameFromIso := string(iso88591ToUTF8([]byte(username)))
|
||||
passwordFromIso := string(iso88591ToUTF8([]byte(password)))
|
||||
if auth(usernameFromIso, passwordFromIso, guiCfg, ldapCfg) {
|
||||
return usernameFromIso, true
|
||||
}
|
||||
|
||||
emitLoginAttempt(false, username, r.RemoteAddr, evLogger)
|
||||
antiBruteForceSleep()
|
||||
return "", false
|
||||
}
|
||||
|
||||
func createSession(cookieName string, username string, guiCfg config.GUIConfiguration, evLogger events.Logger, w http.ResponseWriter, r *http.Request) {
|
||||
sessionid := rand.String(32)
|
||||
sessionsMut.Lock()
|
||||
sessions[sessionid] = true
|
||||
sessionsMut.Unlock()
|
||||
|
||||
// Best effort detection of whether the connection is HTTPS --
|
||||
// either directly to us, or as used by the client towards a reverse
|
||||
// proxy who sends us headers.
|
||||
connectionIsHTTPS := r.TLS != nil ||
|
||||
strings.ToLower(r.Header.Get("x-forwarded-proto")) == "https" ||
|
||||
strings.Contains(strings.ToLower(r.Header.Get("forwarded")), "proto=https")
|
||||
// If the connection is HTTPS, or *should* be HTTPS, set the Secure
|
||||
// bit in cookies.
|
||||
useSecureCookie := connectionIsHTTPS || guiCfg.UseTLS()
|
||||
|
||||
http.SetCookie(w, &http.Cookie{
|
||||
Name: cookieName,
|
||||
Value: sessionid,
|
||||
// In HTTP spec Max-Age <= 0 means delete immediately,
|
||||
// but in http.Cookie MaxAge = 0 means unspecified (session) and MaxAge < 0 means delete immediately
|
||||
MaxAge: 0,
|
||||
Secure: useSecureCookie,
|
||||
Path: "/",
|
||||
})
|
||||
|
||||
emitLoginAttempt(true, username, r.RemoteAddr, evLogger)
|
||||
}
|
||||
|
||||
func handleLogout(cookieName string) http.Handler {
|
||||
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||||
for _, cookie := range r.Cookies() {
|
||||
// We iterate here since there may, historically, be multiple
|
||||
// cookies with the same name but different path. We drop them
|
||||
// all.
|
||||
if cookie.Name == cookieName {
|
||||
sessionsMut.Lock()
|
||||
delete(sessions, cookie.Value)
|
||||
sessionsMut.Unlock()
|
||||
|
||||
// Delete the cookie
|
||||
http.SetCookie(w, &http.Cookie{
|
||||
Name: cookieName,
|
||||
Value: "",
|
||||
MaxAge: -1,
|
||||
Secure: cookie.Secure,
|
||||
Path: cookie.Path,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusNoContent)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -161,7 +270,8 @@ func authLDAP(username string, password string, cfg config.LDAPConfiguration) bo
|
||||
|
||||
defer connection.Close()
|
||||
|
||||
err = connection.Bind(ldapTemplateBindDN(cfg.BindDN, username), password)
|
||||
bindDN := formatOptionalPercentS(cfg.BindDN, escapeForLDAPDN(username))
|
||||
err = connection.Bind(bindDN, password)
|
||||
if err != nil {
|
||||
l.Warnln("LDAP Bind:", err)
|
||||
return false
|
||||
@@ -181,7 +291,7 @@ func authLDAP(username string, password string, cfg config.LDAPConfiguration) bo
|
||||
// the user. If this matches precisely one user then we are good to go.
|
||||
// The search filter uses the same %s interpolation as the bind DN.
|
||||
|
||||
searchString := fmt.Sprintf(cfg.SearchFilter, username)
|
||||
searchString := formatOptionalPercentS(cfg.SearchFilter, escapeForLDAPFilter(username))
|
||||
const sizeLimit = 2 // we search for up to two users -- we only want to match one, so getting any number >1 is a failure.
|
||||
const timeLimit = 60 // Search for up to a minute...
|
||||
searchReq := ldap.NewSearchRequest(cfg.SearchBaseDN, ldap.ScopeWholeSubtree, ldap.DerefFindingBaseObj, sizeLimit, timeLimit, false, searchString, nil, nil)
|
||||
@@ -199,13 +309,37 @@ func authLDAP(username string, password string, cfg config.LDAPConfiguration) bo
|
||||
return true
|
||||
}
|
||||
|
||||
func ldapTemplateBindDN(bindDN string, username string) string {
|
||||
// Check if formatting directives are included in the ldapTemplateBindDN - if so add username.
|
||||
// (%%s is a literal %s - unlikely for LDAP, but easy to handle here).
|
||||
if strings.Count(bindDN, "%s") != strings.Count(bindDN, "%%s") {
|
||||
bindDN = fmt.Sprintf(bindDN, username)
|
||||
// escapeForLDAPFilter escapes a value that will be used in a filter clause
|
||||
func escapeForLDAPFilter(value string) string {
|
||||
// https://social.technet.microsoft.com/wiki/contents/articles/5392.active-directory-ldap-syntax-filters.aspx#Special_Characters
|
||||
// Backslash must always be first in the list so we don't double escape them.
|
||||
return escapeRunes(value, []rune{'\\', '*', '(', ')', 0})
|
||||
}
|
||||
|
||||
// escapeForLDAPDN escapes a value that will be used in a bind DN
|
||||
func escapeForLDAPDN(value string) string {
|
||||
// https://social.technet.microsoft.com/wiki/contents/articles/5312.active-directory-characters-to-escape.aspx
|
||||
// Backslash must always be first in the list so we don't double escape them.
|
||||
return escapeRunes(value, []rune{'\\', ',', '#', '+', '<', '>', ';', '"', '=', ' ', 0})
|
||||
}
|
||||
|
||||
func escapeRunes(value string, runes []rune) string {
|
||||
for _, e := range runes {
|
||||
value = strings.ReplaceAll(value, string(e), fmt.Sprintf("\\%X", e))
|
||||
}
|
||||
return bindDN
|
||||
return value
|
||||
}
|
||||
|
||||
func formatOptionalPercentS(template string, username string) string {
|
||||
var replacements []any
|
||||
nReps := strings.Count(template, "%s") - strings.Count(template, "%%s")
|
||||
if nReps < 0 {
|
||||
nReps = 0
|
||||
}
|
||||
for i := 0; i < nReps; i++ {
|
||||
replacements = append(replacements, username)
|
||||
}
|
||||
return fmt.Sprintf(template, replacements...)
|
||||
}
|
||||
|
||||
// Convert an ISO-8859-1 encoded byte string to UTF-8. Works by the
|
||||
|
||||
+56
-11
@@ -16,7 +16,7 @@ var guiCfg config.GUIConfiguration
|
||||
|
||||
func init() {
|
||||
guiCfg.User = "user"
|
||||
guiCfg.HashAndSetPassword("pass")
|
||||
guiCfg.SetPassword("pass")
|
||||
}
|
||||
|
||||
func TestStaticAuthOK(t *testing.T) {
|
||||
@@ -46,22 +46,67 @@ func TestStaticAuthPasswordFail(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestAuthLDAPSendsCorrectBindDNWithTemplate(t *testing.T) {
|
||||
func TestFormatOptionalPercentS(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
templatedDn := ldapTemplateBindDN("cn=%s,dc=some,dc=example,dc=com", "username")
|
||||
expectedDn := "cn=username,dc=some,dc=example,dc=com"
|
||||
if expectedDn != templatedDn {
|
||||
t.Fatalf("ldapTemplateBindDN should be %s != %s", expectedDn, templatedDn)
|
||||
cases := []struct {
|
||||
template string
|
||||
username string
|
||||
expected string
|
||||
}{
|
||||
{"cn=%s,dc=some,dc=example,dc=com", "username", "cn=username,dc=some,dc=example,dc=com"},
|
||||
{"cn=fixedusername,dc=some,dc=example,dc=com", "username", "cn=fixedusername,dc=some,dc=example,dc=com"},
|
||||
{"cn=%%s,dc=%s,dc=example,dc=com", "username", "cn=%s,dc=username,dc=example,dc=com"},
|
||||
{"cn=%%s,dc=%%s,dc=example,dc=com", "username", "cn=%s,dc=%s,dc=example,dc=com"},
|
||||
{"cn=%s,dc=%s,dc=example,dc=com", "username", "cn=username,dc=username,dc=example,dc=com"},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
templatedDn := formatOptionalPercentS(c.template, c.username)
|
||||
if c.expected != templatedDn {
|
||||
t.Fatalf("result should be %s != %s", c.expected, templatedDn)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestAuthLDAPSendsCorrectBindDNWithNoTemplate(t *testing.T) {
|
||||
func TestEscapeForLDAPFilter(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
templatedDn := ldapTemplateBindDN("cn=fixedusername,dc=some,dc=example,dc=com", "username")
|
||||
expectedDn := "cn=fixedusername,dc=some,dc=example,dc=com"
|
||||
if expectedDn != templatedDn {
|
||||
t.Fatalf("ldapTemplateBindDN should be %s != %s", expectedDn, templatedDn)
|
||||
cases := []struct {
|
||||
in string
|
||||
out string
|
||||
}{
|
||||
{"username", `username`},
|
||||
{"user(name", `user\28name`},
|
||||
{"user)name", `user\29name`},
|
||||
{"user\\name", `user\5Cname`},
|
||||
{"user*name", `user\2Aname`},
|
||||
{"*,CN=asdf", `\2A,CN=asdf`},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
res := escapeForLDAPFilter(c.in)
|
||||
if c.out != res {
|
||||
t.Fatalf("result should be %s != %s", c.out, res)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestEscapeForLDAPDN(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cases := []struct {
|
||||
in string
|
||||
out string
|
||||
}{
|
||||
{"username", `username`},
|
||||
{"* ,CN=asdf", `*\20\2CCN\3Dasdf`},
|
||||
}
|
||||
|
||||
for _, c := range cases {
|
||||
res := escapeForLDAPDN(c.in)
|
||||
if c.out != res {
|
||||
t.Fatalf("result should be %s != %s", c.out, res)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
+7
-7
@@ -74,13 +74,6 @@ func (m *csrfManager) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
if strings.HasPrefix(r.URL.Path, "/rest/noauth") {
|
||||
// REST calls that don't require authentication also do not
|
||||
// need a CSRF token.
|
||||
m.next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// Allow requests for anything not under the protected path prefix,
|
||||
// and set a CSRF cookie if there isn't already a valid one.
|
||||
if !strings.HasPrefix(r.URL.Path, m.prefix) {
|
||||
@@ -97,6 +90,13 @@ func (m *csrfManager) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
if isNoAuthPath(r.URL.Path) {
|
||||
// REST calls that don't require authentication also do not
|
||||
// need a CSRF token.
|
||||
m.next.ServeHTTP(w, r)
|
||||
return
|
||||
}
|
||||
|
||||
// Verify the CSRF token
|
||||
token := r.Header.Get("X-CSRF-Token-" + m.unique)
|
||||
if !m.validToken(token) {
|
||||
|
||||
+330
-110
@@ -554,13 +554,323 @@ func testHTTPRequest(t *testing.T, baseURL string, tc httpTestCase, apikey strin
|
||||
}
|
||||
}
|
||||
|
||||
func hasSessionCookie(cookies []*http.Cookie) bool {
|
||||
for _, cookie := range cookies {
|
||||
if cookie.MaxAge >= 0 && strings.HasPrefix(cookie.Name, "sessionid") {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func httpGet(url string, basicAuthUsername string, basicAuthPassword string, xapikeyHeader string, authorizationBearer string, cookies []*http.Cookie, t *testing.T) *http.Response {
|
||||
req, err := http.NewRequest("GET", url, nil)
|
||||
for _, cookie := range cookies {
|
||||
req.AddCookie(cookie)
|
||||
}
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
if basicAuthUsername != "" || basicAuthPassword != "" {
|
||||
req.SetBasicAuth(basicAuthUsername, basicAuthPassword)
|
||||
}
|
||||
|
||||
if xapikeyHeader != "" {
|
||||
req.Header.Set("X-API-Key", xapikeyHeader)
|
||||
}
|
||||
|
||||
if authorizationBearer != "" {
|
||||
req.Header.Set("Authorization", "Bearer "+authorizationBearer)
|
||||
}
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
return resp
|
||||
}
|
||||
|
||||
func httpPost(url string, body map[string]string, t *testing.T) *http.Response {
|
||||
bodyBytes, err := json.Marshal(body)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
req, err := http.NewRequest("POST", url, bytes.NewReader(bodyBytes))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
return resp
|
||||
}
|
||||
|
||||
func TestHTTPLogin(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
httpGetBasicAuth := func(url string, username string, password string) *http.Response {
|
||||
return httpGet(url, username, password, "", "", nil, t)
|
||||
}
|
||||
|
||||
httpGetXapikey := func(url string, xapikeyHeader string) *http.Response {
|
||||
return httpGet(url, "", "", xapikeyHeader, "", nil, t)
|
||||
}
|
||||
|
||||
httpGetAuthorizationBearer := func(url string, bearer string) *http.Response {
|
||||
return httpGet(url, "", "", "", bearer, nil, t)
|
||||
}
|
||||
|
||||
testWith := func(sendBasicAuthPrompt bool, expectedOkStatus int, expectedFailStatus int, path string) {
|
||||
cfg := newMockedConfig()
|
||||
cfg.GUIReturns(config.GUIConfiguration{
|
||||
User: "üser",
|
||||
Password: "$2a$10$IdIZTxTg/dCNuNEGlmLynOjqg4B1FvDKuIV5e0BB3pnWVHNb8.GSq", // bcrypt of "räksmörgås" in UTF-8
|
||||
RawAddress: "127.0.0.1:0",
|
||||
APIKey: testAPIKey,
|
||||
SendBasicAuthPrompt: sendBasicAuthPrompt,
|
||||
})
|
||||
baseURL, cancel, err := startHTTP(cfg)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(cancel)
|
||||
url := baseURL + path
|
||||
|
||||
t.Run(fmt.Sprintf("%d path", expectedOkStatus), func(t *testing.T) {
|
||||
t.Run("no auth is rejected", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetBasicAuth(url, "", "")
|
||||
if resp.StatusCode != expectedFailStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for unauthed request", expectedFailStatus, resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for unauthed request")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("incorrect password is rejected", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetBasicAuth(url, "üser", "rksmrgs")
|
||||
if resp.StatusCode != expectedFailStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for incorrect password", expectedFailStatus, resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for incorrect password")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("incorrect username is rejected", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetBasicAuth(url, "user", "räksmörgås") // string literals in Go source code are in UTF-8
|
||||
if resp.StatusCode != expectedFailStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for incorrect username", expectedFailStatus, resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for incorrect username")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UTF-8 auth works", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetBasicAuth(url, "üser", "räksmörgås") // string literals in Go source code are in UTF-8
|
||||
if resp.StatusCode != expectedOkStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for authed request (UTF-8)", expectedOkStatus, resp.StatusCode)
|
||||
}
|
||||
if !hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Expected session cookie for authed request (UTF-8)")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ISO-8859-1 auth works", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetBasicAuth(url, "\xfcser", "r\xe4ksm\xf6rg\xe5s") // escaped ISO-8859-1
|
||||
if resp.StatusCode != expectedOkStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for authed request (ISO-8859-1)", expectedOkStatus, resp.StatusCode)
|
||||
}
|
||||
if !hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Expected session cookie for authed request (ISO-8859-1)")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("bad X-API-Key is rejected", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetXapikey(url, testAPIKey+"X")
|
||||
if resp.StatusCode != expectedFailStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for bad API key", expectedFailStatus, resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for bad API key")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("good X-API-Key is accepted", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetXapikey(url, testAPIKey)
|
||||
if resp.StatusCode != expectedOkStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for API key", expectedOkStatus, resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for API key")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("bad Bearer is rejected", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetAuthorizationBearer(url, testAPIKey+"X")
|
||||
if resp.StatusCode != expectedFailStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for bad Authorization: Bearer", expectedFailStatus, resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for bad Authorization: Bearer")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("good Bearer is accepted", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGetAuthorizationBearer(url, testAPIKey)
|
||||
if resp.StatusCode != expectedOkStatus {
|
||||
t.Errorf("Unexpected non-%d return code %d for Authorization: Bearer", expectedOkStatus, resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for bad Authorization: Bearer")
|
||||
}
|
||||
})
|
||||
})
|
||||
}
|
||||
|
||||
testWith(true, http.StatusOK, http.StatusOK, "/")
|
||||
testWith(true, http.StatusOK, http.StatusUnauthorized, "/meta.js")
|
||||
testWith(true, http.StatusNotFound, http.StatusUnauthorized, "/any-path/that/does/nooooooot/match-any/noauth-pattern")
|
||||
|
||||
testWith(false, http.StatusOK, http.StatusOK, "/")
|
||||
testWith(false, http.StatusOK, http.StatusForbidden, "/meta.js")
|
||||
testWith(false, http.StatusNotFound, http.StatusForbidden, "/any-path/that/does/nooooooot/match-any/noauth-pattern")
|
||||
}
|
||||
|
||||
func TestHtmlFormLogin(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cfg := newMockedConfig()
|
||||
cfg.GUIReturns(config.GUIConfiguration{
|
||||
User: "üser",
|
||||
Password: "$2a$10$IdIZTxTg/dCNuNEGlmLynOjqg4B1FvDKuIV5e0BB3pnWVHNb8.GSq", // bcrypt of "räksmörgås" in UTF-8
|
||||
SendBasicAuthPrompt: false,
|
||||
})
|
||||
baseURL, cancel, err := startHTTP(cfg)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Cleanup(cancel)
|
||||
|
||||
loginUrl := baseURL + "/rest/noauth/auth/password"
|
||||
resourceUrl := baseURL + "/meta.js"
|
||||
resourceUrl404 := baseURL + "/any-path/that/does/nooooooot/match-any/noauth-pattern"
|
||||
|
||||
performLogin := func(username string, password string) *http.Response {
|
||||
return httpPost(loginUrl, map[string]string{"username": username, "password": password}, t)
|
||||
}
|
||||
|
||||
performResourceRequest := func(url string, cookies []*http.Cookie) *http.Response {
|
||||
return httpGet(url, "", "", "", "", cookies, t)
|
||||
}
|
||||
|
||||
testNoAuthPath := func(noAuthPath string) {
|
||||
t.Run("auth is not needed for "+noAuthPath, func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpGet(baseURL+noAuthPath, "", "", "", "", nil, t)
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
t.Errorf("Unexpected non-200 return code %d at %s", resp.StatusCode, noAuthPath)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie at " + noAuthPath)
|
||||
}
|
||||
})
|
||||
}
|
||||
testNoAuthPath("/index.html")
|
||||
testNoAuthPath("/rest/svc/lang")
|
||||
|
||||
t.Run("incorrect password is rejected with 403", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := performLogin("üser", "rksmrgs") // string literals in Go source code are in UTF-8
|
||||
if resp.StatusCode != http.StatusForbidden {
|
||||
t.Errorf("Unexpected non-403 return code %d for incorrect password", resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for incorrect password")
|
||||
}
|
||||
resp = performResourceRequest(resourceUrl, resp.Cookies())
|
||||
if resp.StatusCode != http.StatusForbidden {
|
||||
t.Errorf("Unexpected non-403 return code %d for incorrect password", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("incorrect username is rejected with 403", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := performLogin("user", "räksmörgås") // string literals in Go source code are in UTF-8
|
||||
if resp.StatusCode != http.StatusForbidden {
|
||||
t.Errorf("Unexpected non-403 return code %d for incorrect username", resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for incorrect username")
|
||||
}
|
||||
resp = performResourceRequest(resourceUrl, resp.Cookies())
|
||||
if resp.StatusCode != http.StatusForbidden {
|
||||
t.Errorf("Unexpected non-403 return code %d for incorrect username", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UTF-8 auth works", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
// JSON is always UTF-8, so ISO-8859-1 case is not applicable
|
||||
resp := performLogin("üser", "räksmörgås") // string literals in Go source code are in UTF-8
|
||||
if resp.StatusCode != http.StatusNoContent {
|
||||
t.Errorf("Unexpected non-204 return code %d for authed request (UTF-8)", resp.StatusCode)
|
||||
}
|
||||
resp = performResourceRequest(resourceUrl, resp.Cookies())
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
t.Errorf("Unexpected non-200 return code %d for authed request (UTF-8)", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("form login is not applicable to other URLs", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := httpPost(baseURL+"/meta.js", map[string]string{"username": "üser", "password": "räksmörgås"}, t)
|
||||
if resp.StatusCode != http.StatusForbidden {
|
||||
t.Errorf("Unexpected non-403 return code %d for incorrect form login URL", resp.StatusCode)
|
||||
}
|
||||
if hasSessionCookie(resp.Cookies()) {
|
||||
t.Errorf("Unexpected session cookie for incorrect form login URL")
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("invalid URL returns 403 before auth and 404 after auth", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp := performResourceRequest(resourceUrl404, nil)
|
||||
if resp.StatusCode != http.StatusForbidden {
|
||||
t.Errorf("Unexpected non-403 return code %d for unauthed request", resp.StatusCode)
|
||||
}
|
||||
resp = performLogin("üser", "räksmörgås")
|
||||
if resp.StatusCode != http.StatusNoContent {
|
||||
t.Errorf("Unexpected non-204 return code %d for authed request", resp.StatusCode)
|
||||
}
|
||||
resp = performResourceRequest(resourceUrl404, resp.Cookies())
|
||||
if resp.StatusCode != http.StatusNotFound {
|
||||
t.Errorf("Unexpected non-404 return code %d for authed request", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
func TestApiCache(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
cfg := newMockedConfig()
|
||||
cfg.GUIReturns(config.GUIConfiguration{
|
||||
User: "üser",
|
||||
Password: "$2a$10$IdIZTxTg/dCNuNEGlmLynOjqg4B1FvDKuIV5e0BB3pnWVHNb8.GSq", // bcrypt of "räksmörgås" in UTF-8
|
||||
RawAddress: "127.0.0.1:0",
|
||||
APIKey: testAPIKey,
|
||||
})
|
||||
@@ -570,119 +880,25 @@ func TestHTTPLogin(t *testing.T) {
|
||||
}
|
||||
t.Cleanup(cancel)
|
||||
|
||||
t.Run("no auth is rejected", func(t *testing.T) {
|
||||
httpGet := func(url string, bearer string) *http.Response {
|
||||
return httpGet(url, "", "", "", bearer, nil, t)
|
||||
}
|
||||
|
||||
t.Run("meta.js has no-cache headers", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusUnauthorized {
|
||||
t.Errorf("Unexpected non-401 return code %d for unauthed request", resp.StatusCode)
|
||||
url := baseURL + "/meta.js"
|
||||
resp := httpGet(url, testAPIKey)
|
||||
if resp.Header.Get("Cache-Control") != "max-age=0, no-cache, no-store" {
|
||||
t.Errorf("Expected no-cache headers at %s", url)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("incorrect password is rejected", func(t *testing.T) {
|
||||
t.Run("/rest/ has no-cache headers", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
req.SetBasicAuth("üser", "rksmrgs")
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusUnauthorized {
|
||||
t.Errorf("Unexpected non-401 return code %d for incorrect password", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("incorrect username is rejected", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
req.SetBasicAuth("user", "räksmörgås") // string literals in Go source code are in UTF-8
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusUnauthorized {
|
||||
t.Errorf("Unexpected non-401 return code %d for incorrect username", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("UTF-8 auth works", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
req.SetBasicAuth("üser", "räksmörgås") // string literals in Go source code are in UTF-8
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
t.Errorf("Unexpected non-200 return code %d for authed request (UTF-8)", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("ISO-8859-1 auth work", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
req.SetBasicAuth("\xfcser", "r\xe4ksm\xf6rg\xe5s") // escaped ISO-8859-1
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
t.Errorf("Unexpected non-200 return code %d for authed request (ISO-8859-1)", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("bad X-API-Key is rejected", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
req.Header.Set("X-API-Key", testAPIKey+"X")
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusUnauthorized {
|
||||
t.Errorf("Unexpected non-401 return code %d for bad API key", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("good X-API-Key is accepted", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
req.Header.Set("X-API-Key", testAPIKey)
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
t.Errorf("Unexpected non-200 return code %d for API key", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("bad Bearer is rejected", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
req.Header.Set("Authorization", "Bearer "+testAPIKey+"X")
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusUnauthorized {
|
||||
t.Errorf("Unexpected non-401 return code %d for bad API key", resp.StatusCode)
|
||||
}
|
||||
})
|
||||
|
||||
t.Run("good Bearer is accepted", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
req, _ := http.NewRequest("GET", baseURL, nil)
|
||||
req.Header.Set("Authorization", "Bearer "+testAPIKey)
|
||||
resp, err := http.DefaultClient.Do(req)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if resp.StatusCode != http.StatusOK {
|
||||
t.Errorf("Unexpected non-200 return code %d for API key", resp.StatusCode)
|
||||
url := baseURL + "/rest/system/version"
|
||||
resp := httpGet(url, testAPIKey)
|
||||
if resp.Header.Get("Cache-Control") != "max-age=0, no-cache, no-store" {
|
||||
t.Errorf("Expected no-cache headers at %s", url)
|
||||
}
|
||||
})
|
||||
}
|
||||
@@ -774,6 +990,10 @@ func TestCSRFRequired(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
if csrfTokenValue == "" {
|
||||
t.Fatal("Failed to initialize CSRF test: no CSRF cookie returned from " + baseURL)
|
||||
}
|
||||
|
||||
t.Run("/rest without a token should fail", func(t *testing.T) {
|
||||
t.Parallel()
|
||||
resp, err := cli.Get(baseURL + "/rest/system/config")
|
||||
|
||||
@@ -319,7 +319,7 @@ func (c *configMuxBuilder) adjustConfig(w http.ResponseWriter, r *http.Request)
|
||||
var status int
|
||||
waiter, err := c.cfg.Modify(func(cfg *config.Configuration) {
|
||||
if to.GUI.Password != cfg.GUI.Password {
|
||||
if err := to.GUI.HashAndSetPassword(to.GUI.Password); err != nil {
|
||||
if err := to.GUI.SetPassword(to.GUI.Password); err != nil {
|
||||
l.Warnln("hashing password:", err)
|
||||
errMsg = err.Error()
|
||||
status = http.StatusInternalServerError
|
||||
@@ -401,7 +401,7 @@ func (c *configMuxBuilder) adjustGUI(w http.ResponseWriter, r *http.Request, gui
|
||||
var status int
|
||||
waiter, err := c.cfg.Modify(func(cfg *config.Configuration) {
|
||||
if gui.Password != oldPassword {
|
||||
if err := gui.HashAndSetPassword(gui.Password); err != nil {
|
||||
if err := gui.SetPassword(gui.Password); err != nil {
|
||||
l.Warnln("hashing password:", err)
|
||||
errMsg = err.Error()
|
||||
status = http.StatusInternalServerError
|
||||
|
||||
@@ -22,6 +22,7 @@ import (
|
||||
"testing"
|
||||
|
||||
"github.com/d4l3k/messagediff"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
|
||||
"github.com/syncthing/syncthing/lib/build"
|
||||
"github.com/syncthing/syncthing/lib/events"
|
||||
@@ -773,8 +774,9 @@ func TestGUIConfigURL(t *testing.T) {
|
||||
func TestGUIPasswordHash(t *testing.T) {
|
||||
var c GUIConfiguration
|
||||
|
||||
// Setting a plaintext password should work
|
||||
testPass := "pass"
|
||||
if err := c.HashAndSetPassword(testPass); err != nil {
|
||||
if err := c.SetPassword(testPass); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if c.Password == testPass {
|
||||
@@ -789,6 +791,16 @@ func TestGUIPasswordHash(t *testing.T) {
|
||||
if err := c.CompareHashedPassword(failPass); err == nil {
|
||||
t.Errorf("Match on different password: %v", err)
|
||||
}
|
||||
|
||||
// Setting a bcrypt hash directly should also work
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte("test"), bcrypt.MinCost)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
c.SetPassword(string(hash))
|
||||
if err := c.CompareHashedPassword("test"); err != nil {
|
||||
t.Errorf("No match on hashed password: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestDuplicateDevices(t *testing.T) {
|
||||
|
||||
@@ -9,6 +9,7 @@ package config
|
||||
import (
|
||||
"net/url"
|
||||
"os"
|
||||
"regexp"
|
||||
"strconv"
|
||||
"strings"
|
||||
|
||||
@@ -18,6 +19,7 @@ import (
|
||||
)
|
||||
|
||||
func (c GUIConfiguration) IsAuthEnabled() bool {
|
||||
// This function should match isAuthEnabled() in syncthingController.js
|
||||
return c.AuthMode == AuthModeLDAP || (len(c.User) > 0 && len(c.Password) > 0)
|
||||
}
|
||||
|
||||
@@ -59,14 +61,12 @@ func (c GUIConfiguration) UnixSocketPermissions() os.FileMode {
|
||||
}
|
||||
|
||||
func (c GUIConfiguration) Network() string {
|
||||
if override := os.Getenv("STGUIADDRESS"); strings.Contains(override, "/") {
|
||||
if override := os.Getenv("STGUIADDRESS"); override != "" {
|
||||
url, err := url.Parse(override)
|
||||
if err != nil {
|
||||
return "tcp"
|
||||
}
|
||||
if strings.HasPrefix(url.Scheme, "unix") {
|
||||
if err == nil && strings.HasPrefix(url.Scheme, "unix") {
|
||||
return "unix"
|
||||
}
|
||||
return "tcp"
|
||||
}
|
||||
if strings.HasPrefix(c.RawAddress, "/") {
|
||||
return "unix"
|
||||
@@ -76,19 +76,17 @@ func (c GUIConfiguration) Network() string {
|
||||
|
||||
func (c GUIConfiguration) UseTLS() bool {
|
||||
if override := os.Getenv("STGUIADDRESS"); override != "" {
|
||||
if strings.HasPrefix(override, "http") {
|
||||
return strings.HasPrefix(override, "https:")
|
||||
}
|
||||
if strings.HasPrefix(override, "unix") {
|
||||
return strings.HasPrefix(override, "unixs:")
|
||||
}
|
||||
return strings.HasPrefix(override, "https:") || strings.HasPrefix(override, "unixs:")
|
||||
}
|
||||
return c.RawUseTLS
|
||||
}
|
||||
|
||||
func (c GUIConfiguration) URL() string {
|
||||
if strings.HasPrefix(c.RawAddress, "/") {
|
||||
return "unix://" + c.RawAddress
|
||||
if c.Network() == "unix" {
|
||||
if c.UseTLS() {
|
||||
return "unixs://" + c.Address()
|
||||
}
|
||||
return "unix://" + c.Address()
|
||||
}
|
||||
|
||||
u := url.URL{
|
||||
@@ -115,9 +113,19 @@ func (c GUIConfiguration) URL() string {
|
||||
return u.String()
|
||||
}
|
||||
|
||||
// SetHashedPassword hashes the given plaintext password and stores the new hash.
|
||||
func (c *GUIConfiguration) HashAndSetPassword(password string) error {
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte(password), 0)
|
||||
// matches a bcrypt hash and not too much else
|
||||
var bcryptExpr = regexp.MustCompile(`^\$2[aby]\$\d+\$.{50,}`)
|
||||
|
||||
// SetPassword takes a bcrypt hash or a plaintext password and stores it.
|
||||
// Plaintext passwords are hashed. Returns an error if the password is not
|
||||
// valid.
|
||||
func (c *GUIConfiguration) SetPassword(password string) error {
|
||||
if bcryptExpr.MatchString(password) {
|
||||
// Already hashed
|
||||
c.Password = password
|
||||
return nil
|
||||
}
|
||||
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
@@ -37,6 +37,7 @@ type GUIConfiguration struct {
|
||||
Debugging bool `protobuf:"varint,11,opt,name=debugging,proto3" json:"debugging" xml:"debugging,attr"`
|
||||
InsecureSkipHostCheck bool `protobuf:"varint,12,opt,name=insecure_skip_host_check,json=insecureSkipHostCheck,proto3" json:"insecureSkipHostcheck" xml:"insecureSkipHostcheck,omitempty"`
|
||||
InsecureAllowFrameLoading bool `protobuf:"varint,13,opt,name=insecure_allow_frame_loading,json=insecureAllowFrameLoading,proto3" json:"insecureAllowFrameLoading" xml:"insecureAllowFrameLoading,omitempty"`
|
||||
SendBasicAuthPrompt bool `protobuf:"varint,14,opt,name=send_basic_auth_prompt,json=sendBasicAuthPrompt,proto3" json:"sendBasicAuthPrompt" xml:"sendBasicAuthPrompt,attr"`
|
||||
}
|
||||
|
||||
func (m *GUIConfiguration) Reset() { *m = GUIConfiguration{} }
|
||||
@@ -79,60 +80,63 @@ func init() {
|
||||
func init() { proto.RegisterFile("lib/config/guiconfiguration.proto", fileDescriptor_2a9586d611855d64) }
|
||||
|
||||
var fileDescriptor_2a9586d611855d64 = []byte{
|
||||
// 837 bytes of a gzipped FileDescriptorProto
|
||||
// 888 bytes of a gzipped FileDescriptorProto
|
||||
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x55, 0xcd, 0x6e, 0xdb, 0x46,
|
||||
0x10, 0x16, 0x5b, 0x47, 0xb2, 0xb6, 0xae, 0x60, 0xb0, 0x4d, 0xcb, 0x04, 0x0d, 0xd7, 0x51, 0xd8,
|
||||
0xc2, 0x01, 0x02, 0x39, 0x71, 0x5a, 0x24, 0xf0, 0xa1, 0x80, 0x1c, 0x20, 0x4d, 0x60, 0x17, 0x08,
|
||||
0xe8, 0xfa, 0x92, 0x0b, 0xb1, 0x22, 0xd7, 0xd2, 0x42, 0xfc, 0x2b, 0x77, 0x09, 0x4b, 0x87, 0xf6,
|
||||
0x19, 0x0a, 0xf5, 0x5c, 0xa0, 0xcf, 0xd0, 0x4b, 0x5f, 0x21, 0x37, 0xe9, 0x54, 0xe4, 0xb4, 0x40,
|
||||
0xa4, 0x1b, 0x8f, 0x3c, 0xe6, 0x54, 0xec, 0xf2, 0x47, 0xa2, 0xac, 0xd4, 0xbd, 0xed, 0x7c, 0xf3,
|
||||
0xcd, 0x7c, 0x33, 0xc3, 0x19, 0x10, 0xdc, 0x75, 0x49, 0xef, 0xc0, 0x0e, 0xfc, 0x0b, 0xd2, 0x3f,
|
||||
0xe8, 0xc7, 0x24, 0x7b, 0xc5, 0x11, 0x62, 0x24, 0xf0, 0x3b, 0x61, 0x14, 0xb0, 0x40, 0xad, 0x67,
|
||||
0xe0, 0xed, 0x5b, 0x2b, 0x54, 0x14, 0xb3, 0x81, 0x17, 0x38, 0x38, 0xa3, 0xdc, 0x6e, 0xe2, 0x11,
|
||||
0xcb, 0x9e, 0xed, 0xb7, 0x3b, 0x60, 0xf7, 0x87, 0xf3, 0x97, 0xcf, 0x56, 0x13, 0xa9, 0x3d, 0xd0,
|
||||
0xc0, 0x3e, 0xea, 0xb9, 0xd8, 0xd1, 0x94, 0x3d, 0x65, 0x7f, 0xfb, 0xf8, 0x45, 0xc2, 0x61, 0x01,
|
||||
0xa5, 0x1c, 0xde, 0x1d, 0x79, 0xee, 0x51, 0x3b, 0xb7, 0x1f, 0x20, 0xc6, 0xa2, 0xf6, 0x9e, 0x83,
|
||||
0x2f, 0x50, 0xec, 0xb2, 0xa3, 0x36, 0x8b, 0x62, 0xdc, 0x4e, 0xa6, 0xc6, 0xce, 0xaa, 0xff, 0xfd,
|
||||
0xd4, 0xd8, 0x12, 0x0e, 0xb3, 0xc8, 0xa2, 0xfe, 0x02, 0x1a, 0xc8, 0x71, 0x22, 0x4c, 0xa9, 0xf6,
|
||||
0xd1, 0x9e, 0xb2, 0xdf, 0x3c, 0xb6, 0xe7, 0x1c, 0x02, 0x13, 0x5d, 0x76, 0x33, 0x54, 0x28, 0xe6,
|
||||
0x84, 0x94, 0xc3, 0x6f, 0xa4, 0x62, 0x6e, 0xaf, 0x88, 0x3d, 0x3a, 0x7c, 0xd2, 0x79, 0xd8, 0x79,
|
||||
0xd8, 0x79, 0x74, 0xf4, 0xf4, 0xf1, 0xd3, 0x6f, 0xdb, 0xef, 0xa7, 0x46, 0xab, 0x0a, 0x4d, 0x66,
|
||||
0xc6, 0x4a, 0x52, 0xb3, 0x48, 0xa9, 0xfe, 0xa3, 0x80, 0x2f, 0x63, 0x9f, 0x8c, 0x2c, 0x1a, 0xd8,
|
||||
0x43, 0xcc, 0xac, 0x10, 0x47, 0x1e, 0xa1, 0x94, 0x04, 0x3e, 0xd5, 0x3e, 0x96, 0xf5, 0xfc, 0xa1,
|
||||
0xcc, 0x39, 0xd4, 0x4c, 0x74, 0x79, 0xee, 0x93, 0xd1, 0x99, 0x64, 0xbd, 0x5a, 0x92, 0x12, 0x0e,
|
||||
0x6f, 0xc6, 0x9b, 0x1c, 0x29, 0x87, 0x5f, 0xcb, 0x62, 0x37, 0x7a, 0x1f, 0x04, 0x1e, 0x61, 0xd8,
|
||||
0x0b, 0xd9, 0x58, 0x8c, 0x08, 0x5e, 0xc3, 0x99, 0xcc, 0x8c, 0x0f, 0x16, 0x60, 0x6e, 0x96, 0x57,
|
||||
0x9f, 0x83, 0xad, 0x98, 0xe2, 0x48, 0xdb, 0x92, 0x4d, 0x1c, 0x26, 0x1c, 0x4a, 0x3b, 0xe5, 0xf0,
|
||||
0xf3, 0xac, 0x2c, 0x8a, 0xa3, 0x6a, 0x15, 0xad, 0x2a, 0x64, 0x4a, 0xbe, 0xfa, 0x1a, 0x6c, 0x87,
|
||||
0x88, 0xd2, 0xcb, 0x20, 0x72, 0xb4, 0x1b, 0x32, 0xd7, 0xf7, 0x09, 0x87, 0x25, 0x96, 0x72, 0xa8,
|
||||
0xc9, 0x7c, 0x05, 0x50, 0xcd, 0xa9, 0x5e, 0x85, 0xcd, 0x32, 0x56, 0xf5, 0x40, 0x53, 0x6c, 0xa4,
|
||||
0x25, 0x56, 0x52, 0xab, 0xef, 0x29, 0xfb, 0xad, 0xc3, 0xdd, 0x4e, 0xb6, 0xaa, 0x9d, 0x6e, 0xcc,
|
||||
0x06, 0x3f, 0x06, 0x0e, 0xce, 0xe4, 0x50, 0x6e, 0x95, 0x72, 0x05, 0xb0, 0x26, 0x77, 0x15, 0x36,
|
||||
0xcb, 0x58, 0x15, 0x83, 0x46, 0x4c, 0xb1, 0xc5, 0x5c, 0xaa, 0x35, 0xe4, 0x3a, 0x9f, 0xce, 0x39,
|
||||
0x6c, 0x8a, 0xc1, 0x52, 0xfc, 0xd3, 0xe9, 0x59, 0xc2, 0x61, 0x3d, 0x96, 0xaf, 0x94, 0xc3, 0x96,
|
||||
0x54, 0x61, 0x2e, 0xcd, 0xd6, 0x3a, 0x99, 0x1a, 0xdb, 0x85, 0x91, 0x4e, 0x8d, 0x9c, 0x37, 0x99,
|
||||
0x19, 0xcb, 0x70, 0x53, 0x82, 0x2e, 0x15, 0x32, 0x28, 0x24, 0xd6, 0x10, 0x8f, 0xb5, 0x6d, 0x39,
|
||||
0x30, 0x21, 0x53, 0xef, 0xbe, 0x7a, 0x79, 0x82, 0xc7, 0x42, 0x03, 0x85, 0xe4, 0x04, 0x8f, 0x53,
|
||||
0x0e, 0xbf, 0xc8, 0x3a, 0x09, 0xc9, 0x10, 0x8f, 0xab, 0x7d, 0xec, 0xae, 0x83, 0x93, 0x99, 0x91,
|
||||
0x67, 0x30, 0xf3, 0x78, 0xf5, 0x77, 0x05, 0xdc, 0x24, 0x3e, 0xc5, 0x76, 0x1c, 0x61, 0x0b, 0x39,
|
||||
0x1e, 0xf1, 0x2d, 0x64, 0xdb, 0xe2, 0x8e, 0x9a, 0xb2, 0x39, 0x2b, 0xe1, 0xf0, 0xb3, 0x82, 0xd0,
|
||||
0x15, 0xfe, 0xae, 0x74, 0xa7, 0x1c, 0xde, 0x93, 0xc2, 0x1b, 0x7c, 0xd5, 0x2a, 0xee, 0xfc, 0x27,
|
||||
0xc3, 0xdc, 0x94, 0x5c, 0x3d, 0x01, 0x37, 0xd8, 0x00, 0x7b, 0x58, 0x03, 0xb2, 0xf5, 0xef, 0x12,
|
||||
0x0e, 0x33, 0x20, 0xe5, 0xf0, 0x4e, 0x36, 0x53, 0x61, 0xad, 0x9c, 0x6e, 0xfe, 0x10, 0x37, 0xdb,
|
||||
0xc8, 0xdf, 0x66, 0x16, 0xa2, 0x9e, 0x83, 0xa6, 0x83, 0x7b, 0x71, 0xbf, 0x4f, 0xfc, 0xbe, 0xf6,
|
||||
0x89, 0xec, 0xea, 0x49, 0xc2, 0xe1, 0x12, 0x2c, 0xb7, 0xb9, 0x44, 0xca, 0xcf, 0xd5, 0xaa, 0x42,
|
||||
0xe6, 0x32, 0x48, 0xfd, 0x5b, 0x01, 0x5a, 0x39, 0x39, 0x3a, 0x24, 0xa1, 0x35, 0x08, 0x28, 0xb3,
|
||||
0xec, 0x01, 0xb6, 0x87, 0xda, 0x8e, 0x94, 0xf9, 0x55, 0xdc, 0x75, 0xc1, 0x39, 0x1b, 0x92, 0xf0,
|
||||
0x45, 0x40, 0x99, 0x24, 0x94, 0x77, 0xbd, 0xd1, 0xbb, 0x76, 0xd7, 0xd7, 0x70, 0xd2, 0xa9, 0xb1,
|
||||
0x59, 0xc4, 0xbc, 0x02, 0x3f, 0x13, 0xb0, 0xfa, 0x97, 0x02, 0xbe, 0x5a, 0x7e, 0x73, 0xd7, 0x0d,
|
||||
0x2e, 0xad, 0x8b, 0x08, 0x79, 0xd8, 0x72, 0x03, 0xe4, 0x88, 0x21, 0x7d, 0x2a, 0xab, 0xff, 0x39,
|
||||
0xe1, 0xf0, 0x56, 0xf9, 0x75, 0x04, 0xed, 0xb9, 0x60, 0x9d, 0x66, 0xa4, 0x94, 0xc3, 0xfb, 0xd5,
|
||||
0x05, 0x58, 0x67, 0x54, 0xbb, 0xb8, 0xf7, 0x3f, 0x78, 0xe6, 0x87, 0xe5, 0x8e, 0x4f, 0xde, 0xbc,
|
||||
0xd3, 0x6b, 0xb3, 0x77, 0x7a, 0xed, 0xcd, 0x5c, 0x57, 0x66, 0x73, 0x5d, 0xf9, 0x6d, 0xa1, 0xd7,
|
||||
0xfe, 0x5c, 0xe8, 0xca, 0x6c, 0xa1, 0xd7, 0xde, 0x2e, 0xf4, 0xda, 0xeb, 0xfb, 0x7d, 0xc2, 0x06,
|
||||
0x71, 0xaf, 0x63, 0x07, 0xde, 0x01, 0x1d, 0xfb, 0x36, 0x1b, 0x10, 0xbf, 0xbf, 0xf2, 0x5a, 0xfe,
|
||||
0xc1, 0x7a, 0x75, 0xf9, 0xbb, 0x7a, 0xfc, 0x6f, 0x00, 0x00, 0x00, 0xff, 0xff, 0xd8, 0x8c, 0xef,
|
||||
0xc0, 0x01, 0x07, 0x00, 0x00,
|
||||
0x10, 0x16, 0x5b, 0x47, 0xb2, 0xb6, 0x89, 0x60, 0xb0, 0x4d, 0xca, 0x04, 0x0d, 0xd7, 0x51, 0xd8,
|
||||
0xc2, 0x01, 0x02, 0x39, 0x71, 0x5a, 0x24, 0xf0, 0xa1, 0x80, 0x1c, 0x20, 0x4d, 0x60, 0x17, 0x30,
|
||||
0xe8, 0xfa, 0x92, 0x0b, 0xb1, 0x22, 0xd7, 0xd2, 0x42, 0xfc, 0x2b, 0x77, 0x09, 0x5b, 0x87, 0xf6,
|
||||
0x01, 0x7a, 0x2a, 0xdc, 0x73, 0x81, 0x3e, 0x43, 0x2f, 0x7d, 0x85, 0xdc, 0xa4, 0x53, 0xd1, 0xd3,
|
||||
0x02, 0x91, 0xd1, 0x0b, 0x8f, 0x3c, 0xe6, 0x54, 0xec, 0xf2, 0x47, 0xa2, 0x4c, 0x37, 0xb9, 0xed,
|
||||
0x7c, 0xf3, 0xcd, 0x7c, 0x33, 0xc3, 0x19, 0x10, 0xdc, 0x73, 0xc9, 0x60, 0xdb, 0x0e, 0xfc, 0x13,
|
||||
0x32, 0xdc, 0x1e, 0xc6, 0x24, 0x7b, 0xc5, 0x11, 0x62, 0x24, 0xf0, 0x7b, 0x61, 0x14, 0xb0, 0x40,
|
||||
0x6d, 0x66, 0xe0, 0x9d, 0xdb, 0x4b, 0x54, 0x14, 0xb3, 0x91, 0x17, 0x38, 0x38, 0xa3, 0xdc, 0x69,
|
||||
0xe3, 0x33, 0x96, 0x3d, 0xbb, 0xff, 0xde, 0x00, 0x1b, 0xdf, 0x1d, 0xbf, 0x7a, 0xbe, 0x9c, 0x48,
|
||||
0x1d, 0x80, 0x16, 0xf6, 0xd1, 0xc0, 0xc5, 0x8e, 0xa6, 0x6c, 0x2a, 0x5b, 0xeb, 0x7b, 0x2f, 0x13,
|
||||
0x0e, 0x0b, 0x28, 0xe5, 0xf0, 0xde, 0x99, 0xe7, 0xee, 0x76, 0x73, 0xfb, 0x21, 0x62, 0x2c, 0xea,
|
||||
0x6e, 0x3a, 0xf8, 0x04, 0xc5, 0x2e, 0xdb, 0xed, 0xb2, 0x28, 0xc6, 0xdd, 0x64, 0x6a, 0x5c, 0x5f,
|
||||
0xf6, 0xbf, 0x9b, 0x1a, 0x6b, 0xc2, 0x61, 0x16, 0x59, 0xd4, 0x9f, 0x40, 0x0b, 0x39, 0x4e, 0x84,
|
||||
0x29, 0xd5, 0x3e, 0xda, 0x54, 0xb6, 0xda, 0x7b, 0xf6, 0x9c, 0x43, 0x60, 0xa2, 0xd3, 0x7e, 0x86,
|
||||
0x0a, 0xc5, 0x9c, 0x90, 0x72, 0xf8, 0x95, 0x54, 0xcc, 0xed, 0x25, 0xb1, 0xc7, 0x3b, 0x4f, 0x7b,
|
||||
0x8f, 0x7a, 0x8f, 0x7a, 0x8f, 0x77, 0x9f, 0x3d, 0x79, 0xf6, 0x75, 0xf7, 0xdd, 0xd4, 0xe8, 0x54,
|
||||
0xa1, 0xf3, 0x99, 0xb1, 0x94, 0xd4, 0x2c, 0x52, 0xaa, 0x7f, 0x2b, 0xe0, 0xf3, 0xd8, 0x27, 0x67,
|
||||
0x16, 0x0d, 0xec, 0x31, 0x66, 0x56, 0x88, 0x23, 0x8f, 0x50, 0x4a, 0x02, 0x9f, 0x6a, 0x1f, 0xcb,
|
||||
0x7a, 0x7e, 0x57, 0xe6, 0x1c, 0x6a, 0x26, 0x3a, 0x3d, 0xf6, 0xc9, 0xd9, 0x91, 0x64, 0x1d, 0x2e,
|
||||
0x48, 0x09, 0x87, 0x37, 0xe3, 0x3a, 0x47, 0xca, 0xe1, 0x97, 0xb2, 0xd8, 0x5a, 0xef, 0xc3, 0xc0,
|
||||
0x23, 0x0c, 0x7b, 0x21, 0x9b, 0x88, 0x11, 0xc1, 0xf7, 0x70, 0xce, 0x67, 0xc6, 0x95, 0x05, 0x98,
|
||||
0xf5, 0xf2, 0xea, 0x0b, 0xb0, 0x16, 0x53, 0x1c, 0x69, 0x6b, 0xb2, 0x89, 0x9d, 0x84, 0x43, 0x69,
|
||||
0xa7, 0x1c, 0x7e, 0x96, 0x95, 0x45, 0x71, 0x54, 0xad, 0xa2, 0x53, 0x85, 0x4c, 0xc9, 0x57, 0x5f,
|
||||
0x83, 0xf5, 0x10, 0x51, 0x7a, 0x1a, 0x44, 0x8e, 0x76, 0x4d, 0xe6, 0xfa, 0x36, 0xe1, 0xb0, 0xc4,
|
||||
0x52, 0x0e, 0x35, 0x99, 0xaf, 0x00, 0xaa, 0x39, 0xd5, 0xcb, 0xb0, 0x59, 0xc6, 0xaa, 0x1e, 0x68,
|
||||
0x8b, 0x8d, 0xb4, 0xc4, 0x4a, 0x6a, 0xcd, 0x4d, 0x65, 0xab, 0xb3, 0xb3, 0xd1, 0xcb, 0x56, 0xb5,
|
||||
0xd7, 0x8f, 0xd9, 0xe8, 0xfb, 0xc0, 0xc1, 0x99, 0x1c, 0xca, 0xad, 0x52, 0xae, 0x00, 0x56, 0xe4,
|
||||
0x2e, 0xc3, 0x66, 0x19, 0xab, 0x62, 0xd0, 0x8a, 0x29, 0xb6, 0x98, 0x4b, 0xb5, 0x96, 0x5c, 0xe7,
|
||||
0x83, 0x39, 0x87, 0x6d, 0x31, 0x58, 0x8a, 0x7f, 0x38, 0x38, 0x4a, 0x38, 0x6c, 0xc6, 0xf2, 0x95,
|
||||
0x72, 0xd8, 0x91, 0x2a, 0xcc, 0xa5, 0xd9, 0x5a, 0x27, 0x53, 0x63, 0xbd, 0x30, 0xd2, 0xa9, 0x91,
|
||||
0xf3, 0xce, 0x67, 0xc6, 0x22, 0xdc, 0x94, 0xa0, 0x4b, 0x85, 0x0c, 0x0a, 0x89, 0x35, 0xc6, 0x13,
|
||||
0x6d, 0x5d, 0x0e, 0x4c, 0xc8, 0x34, 0xfb, 0x87, 0xaf, 0xf6, 0xf1, 0x44, 0x68, 0xa0, 0x90, 0xec,
|
||||
0xe3, 0x49, 0xca, 0xe1, 0xad, 0xac, 0x93, 0x90, 0x8c, 0xf1, 0xa4, 0xda, 0xc7, 0xc6, 0x2a, 0x78,
|
||||
0x3e, 0x33, 0xf2, 0x0c, 0x66, 0x1e, 0xaf, 0xfe, 0xa6, 0x80, 0x9b, 0xc4, 0xa7, 0xd8, 0x8e, 0x23,
|
||||
0x6c, 0x21, 0xc7, 0x23, 0xbe, 0x85, 0x6c, 0x5b, 0xdc, 0x51, 0x5b, 0x36, 0x67, 0x25, 0x1c, 0x7e,
|
||||
0x5a, 0x10, 0xfa, 0xc2, 0xdf, 0x97, 0xee, 0x94, 0xc3, 0xfb, 0x52, 0xb8, 0xc6, 0x57, 0xad, 0xe2,
|
||||
0xee, 0xff, 0x32, 0xcc, 0xba, 0xe4, 0xea, 0x3e, 0xb8, 0xc6, 0x46, 0xd8, 0xc3, 0x1a, 0x90, 0xad,
|
||||
0x7f, 0x93, 0x70, 0x98, 0x01, 0x29, 0x87, 0x77, 0xb3, 0x99, 0x0a, 0x6b, 0xe9, 0x74, 0xf3, 0x87,
|
||||
0xb8, 0xd9, 0x56, 0xfe, 0x36, 0xb3, 0x10, 0xf5, 0x18, 0xb4, 0x1d, 0x3c, 0x88, 0x87, 0x43, 0xe2,
|
||||
0x0f, 0xb5, 0x4f, 0x64, 0x57, 0x4f, 0x13, 0x0e, 0x17, 0x60, 0xb9, 0xcd, 0x25, 0x52, 0x7e, 0xae,
|
||||
0x4e, 0x15, 0x32, 0x17, 0x41, 0xea, 0x5f, 0x0a, 0xd0, 0xca, 0xc9, 0xd1, 0x31, 0x09, 0xad, 0x51,
|
||||
0x40, 0x99, 0x65, 0x8f, 0xb0, 0x3d, 0xd6, 0xae, 0x4b, 0x99, 0x9f, 0xc5, 0x5d, 0x17, 0x9c, 0xa3,
|
||||
0x31, 0x09, 0x5f, 0x06, 0x94, 0x49, 0x42, 0x79, 0xd7, 0xb5, 0xde, 0x95, 0xbb, 0x7e, 0x0f, 0x27,
|
||||
0x9d, 0x1a, 0xf5, 0x22, 0xe6, 0x25, 0xf8, 0xb9, 0x80, 0xd5, 0x3f, 0x15, 0xf0, 0xc5, 0xe2, 0x9b,
|
||||
0xbb, 0x6e, 0x70, 0x6a, 0x9d, 0x44, 0xc8, 0xc3, 0x96, 0x1b, 0x20, 0x47, 0x0c, 0xe9, 0x86, 0xac,
|
||||
0xfe, 0xc7, 0x84, 0xc3, 0xdb, 0xe5, 0xd7, 0x11, 0xb4, 0x17, 0x82, 0x75, 0x90, 0x91, 0x52, 0x0e,
|
||||
0x1f, 0x54, 0x17, 0x60, 0x95, 0x51, 0xed, 0xe2, 0xfe, 0x07, 0xf0, 0xcc, 0xab, 0xe5, 0xd4, 0x5f,
|
||||
0x14, 0x70, 0x8b, 0x62, 0xdf, 0xb1, 0x06, 0x88, 0x12, 0xdb, 0x92, 0x17, 0x1f, 0x46, 0x81, 0x17,
|
||||
0x32, 0xad, 0x23, 0xcb, 0x3d, 0x16, 0x9b, 0x2a, 0x18, 0x7b, 0x82, 0x20, 0x0e, 0xff, 0x50, 0xba,
|
||||
0x53, 0x0e, 0x75, 0x59, 0x68, 0x8d, 0xaf, 0xfc, 0xce, 0xda, 0x55, 0x4e, 0xb3, 0x2e, 0xe5, 0xde,
|
||||
0xfe, 0x9b, 0xb7, 0x7a, 0x63, 0xf6, 0x56, 0x6f, 0xbc, 0x99, 0xeb, 0xca, 0x6c, 0xae, 0x2b, 0xbf,
|
||||
0x5e, 0xe8, 0x8d, 0x3f, 0x2e, 0x74, 0x65, 0x76, 0xa1, 0x37, 0xfe, 0xb9, 0xd0, 0x1b, 0xaf, 0x1f,
|
||||
0x0c, 0x09, 0x1b, 0xc5, 0x83, 0x9e, 0x1d, 0x78, 0xdb, 0x74, 0xe2, 0xdb, 0x6c, 0x44, 0xfc, 0xe1,
|
||||
0xd2, 0x6b, 0xf1, 0x3b, 0x1d, 0x34, 0xe5, 0xbf, 0xf3, 0xc9, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff,
|
||||
0xfe, 0x19, 0xb2, 0x3c, 0x8e, 0x07, 0x00, 0x00,
|
||||
}
|
||||
|
||||
func (m *GUIConfiguration) Marshal() (dAtA []byte, err error) {
|
||||
@@ -155,6 +159,16 @@ func (m *GUIConfiguration) MarshalToSizedBuffer(dAtA []byte) (int, error) {
|
||||
_ = i
|
||||
var l int
|
||||
_ = l
|
||||
if m.SendBasicAuthPrompt {
|
||||
i--
|
||||
if m.SendBasicAuthPrompt {
|
||||
dAtA[i] = 1
|
||||
} else {
|
||||
dAtA[i] = 0
|
||||
}
|
||||
i--
|
||||
dAtA[i] = 0x70
|
||||
}
|
||||
if m.InsecureAllowFrameLoading {
|
||||
i--
|
||||
if m.InsecureAllowFrameLoading {
|
||||
@@ -327,6 +341,9 @@ func (m *GUIConfiguration) ProtoSize() (n int) {
|
||||
if m.InsecureAllowFrameLoading {
|
||||
n += 2
|
||||
}
|
||||
if m.SendBasicAuthPrompt {
|
||||
n += 2
|
||||
}
|
||||
return n
|
||||
}
|
||||
|
||||
@@ -696,6 +713,26 @@ func (m *GUIConfiguration) Unmarshal(dAtA []byte) error {
|
||||
}
|
||||
}
|
||||
m.InsecureAllowFrameLoading = bool(v != 0)
|
||||
case 14:
|
||||
if wireType != 0 {
|
||||
return fmt.Errorf("proto: wrong wireType = %d for field SendBasicAuthPrompt", wireType)
|
||||
}
|
||||
var v int
|
||||
for shift := uint(0); ; shift += 7 {
|
||||
if shift >= 64 {
|
||||
return ErrIntOverflowGuiconfiguration
|
||||
}
|
||||
if iNdEx >= l {
|
||||
return io.ErrUnexpectedEOF
|
||||
}
|
||||
b := dAtA[iNdEx]
|
||||
iNdEx++
|
||||
v |= int(b&0x7F) << shift
|
||||
if b < 0x80 {
|
||||
break
|
||||
}
|
||||
}
|
||||
m.SendBasicAuthPrompt = bool(v != 0)
|
||||
default:
|
||||
iNdEx = preIndex
|
||||
skippy, err := skipGuiconfiguration(dAtA[iNdEx:])
|
||||
|
||||
@@ -100,7 +100,7 @@ func (t *quicListener) serve(ctx context.Context) error {
|
||||
tracer := &writeTrackingTracer{}
|
||||
quicTransport := &quic.Transport{
|
||||
Conn: udpConn,
|
||||
Tracer: tracer,
|
||||
Tracer: tracer.loggingTracer(),
|
||||
}
|
||||
defer quicTransport.Close()
|
||||
|
||||
|
||||
@@ -80,15 +80,15 @@ type writeTrackingTracer struct {
|
||||
lastWrite atomic.Int64 // unix nanos
|
||||
}
|
||||
|
||||
func (t *writeTrackingTracer) SentPacket(net.Addr, *logging.Header, logging.ByteCount, []logging.Frame) {
|
||||
t.lastWrite.Store(time.Now().UnixNano())
|
||||
}
|
||||
|
||||
func (t *writeTrackingTracer) SentVersionNegotiationPacket(_ net.Addr, dest, src logging.ArbitraryLenConnectionID, _ []quic.VersionNumber) {
|
||||
t.lastWrite.Store(time.Now().UnixNano())
|
||||
}
|
||||
|
||||
func (t *writeTrackingTracer) DroppedPacket(net.Addr, logging.PacketType, logging.ByteCount, logging.PacketDropReason) {
|
||||
func (t *writeTrackingTracer) loggingTracer() *logging.Tracer {
|
||||
return &logging.Tracer{
|
||||
SentPacket: func(net.Addr, *logging.Header, logging.ByteCount, []logging.Frame) {
|
||||
t.lastWrite.Store(time.Now().UnixNano())
|
||||
},
|
||||
SentVersionNegotiationPacket: func(net.Addr, logging.ArbitraryLenConnectionID, logging.ArbitraryLenConnectionID, []logging.VersionNumber) {
|
||||
t.lastWrite.Store(time.Now().UnixNano())
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
func (t *writeTrackingTracer) LastWrite() time.Time {
|
||||
@@ -115,7 +115,7 @@ func (t *transportPacketConn) WriteTo(p []byte, addr net.Addr) (n int, err error
|
||||
return t.tran.WriteTo(p, addr)
|
||||
}
|
||||
|
||||
func (t *transportPacketConn) Close() error {
|
||||
func (*transportPacketConn) Close() error {
|
||||
return errUnsupported
|
||||
}
|
||||
|
||||
@@ -132,6 +132,6 @@ func (t *transportPacketConn) SetReadDeadline(deadline time.Time) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (t *transportPacketConn) SetWriteDeadline(_ time.Time) error {
|
||||
func (*transportPacketConn) SetWriteDeadline(_ time.Time) error {
|
||||
return nil // yolo
|
||||
}
|
||||
|
||||
@@ -126,7 +126,7 @@ func (c internalConn) Crypto() string {
|
||||
|
||||
func (c internalConn) Transport() string {
|
||||
transport := c.connType.Transport()
|
||||
ip, err := osutil.IPFromAddr(c.LocalAddr())
|
||||
ip, err := osutil.IPFromAddr(c.RemoteAddr())
|
||||
if err != nil {
|
||||
return transport
|
||||
}
|
||||
|
||||
@@ -12,9 +12,17 @@ package fs
|
||||
import (
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/syncthing/syncthing/lib/build"
|
||||
)
|
||||
|
||||
func (fi basicFileInfo) InodeChangeTime() time.Time {
|
||||
// On Android, mtime and inode-change-time fluctuate, which can cause
|
||||
// conflicts even when nothing has been modified on the device itself.
|
||||
// Ref: https://forum.syncthing.net/t/keep-getting-conflicts-generated-on-android-device-for-files-modified-only-on-a-desktop-pc/19060
|
||||
if build.IsAndroid {
|
||||
return time.Time{}
|
||||
}
|
||||
if sys, ok := fi.FileInfo.Sys().(*syscall.Stat_t); ok {
|
||||
return time.Unix(0, sys.Ctim.Nano())
|
||||
}
|
||||
|
||||
@@ -18,15 +18,17 @@ import (
|
||||
"golang.org/x/sys/windows"
|
||||
)
|
||||
|
||||
func isDirectoryJunction(path string) (bool, error) {
|
||||
const IO_REPARSE_TAG_DEDUP = 0x80000013
|
||||
|
||||
func readReparseTag(path string) (uint32, error) {
|
||||
namep, err := syscall.UTF16PtrFromString(path)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("syscall.UTF16PtrFromString failed with: %s", err)
|
||||
return 0, fmt.Errorf("syscall.UTF16PtrFromString failed with: %s", err)
|
||||
}
|
||||
attrs := uint32(syscall.FILE_FLAG_BACKUP_SEMANTICS | syscall.FILE_FLAG_OPEN_REPARSE_POINT)
|
||||
h, err := syscall.CreateFile(namep, 0, 0, nil, syscall.OPEN_EXISTING, attrs, 0)
|
||||
if err != nil {
|
||||
return false, fmt.Errorf("syscall.CreateFile failed with: %s", err)
|
||||
return 0, fmt.Errorf("syscall.CreateFile failed with: %s", err)
|
||||
}
|
||||
defer syscall.CloseHandle(h)
|
||||
|
||||
@@ -47,10 +49,19 @@ func isDirectoryJunction(path string) (bool, error) {
|
||||
// instance to indicate no symlinks are possible.
|
||||
ti.ReparseTag = 0
|
||||
} else {
|
||||
return false, fmt.Errorf("windows.GetFileInformationByHandleEx failed with: %s", err)
|
||||
return 0, fmt.Errorf("windows.GetFileInformationByHandleEx failed with: %s", err)
|
||||
}
|
||||
}
|
||||
return ti.ReparseTag == windows.IO_REPARSE_TAG_MOUNT_POINT, nil
|
||||
|
||||
return ti.ReparseTag, nil
|
||||
}
|
||||
|
||||
func isDirectoryJunction(reparseTag uint32) bool {
|
||||
return reparseTag == windows.IO_REPARSE_TAG_MOUNT_POINT
|
||||
}
|
||||
|
||||
func isDeduplicatedFile(reparseTag uint32) bool {
|
||||
return reparseTag == IO_REPARSE_TAG_DEDUP
|
||||
}
|
||||
|
||||
type dirJunctFileInfo struct {
|
||||
@@ -67,17 +78,38 @@ func (fi *dirJunctFileInfo) IsDir() bool {
|
||||
return true
|
||||
}
|
||||
|
||||
type dedupFileInfo struct {
|
||||
os.FileInfo
|
||||
}
|
||||
|
||||
func (fi *dedupFileInfo) Mode() os.FileMode {
|
||||
// A deduplicated file should be treated as a regular file and not an
|
||||
// irregular file.
|
||||
return fi.FileInfo.Mode() &^ os.ModeIrregular
|
||||
}
|
||||
|
||||
func (f *BasicFilesystem) underlyingLstat(name string) (os.FileInfo, error) {
|
||||
var fi, err = os.Lstat(name)
|
||||
|
||||
// NTFS directory junctions can be treated as ordinary directories,
|
||||
// see https://forum.syncthing.net/t/option-to-follow-directory-junctions-symbolic-links/14750
|
||||
if err == nil && f.junctionsAsDirs && fi.Mode()&os.ModeSymlink != 0 {
|
||||
var isJunct bool
|
||||
isJunct, err = isDirectoryJunction(name)
|
||||
if err == nil && isJunct {
|
||||
return &dirJunctFileInfo{fi}, nil
|
||||
// There are cases where files are tagged as symlink, but they end up being
|
||||
// something else. Make sure we properly handle those types.
|
||||
if err == nil {
|
||||
// NTFS directory junctions can be treated as ordinary directories,
|
||||
// see https://forum.syncthing.net/t/option-to-follow-directory-junctions-symbolic-links/14750
|
||||
if fi.Mode()&os.ModeSymlink != 0 && f.junctionsAsDirs {
|
||||
if reparseTag, reparseErr := readReparseTag(name); reparseErr == nil && isDirectoryJunction(reparseTag) {
|
||||
return &dirJunctFileInfo{fi}, nil
|
||||
}
|
||||
}
|
||||
|
||||
// Workaround for #9120 till golang properly handles deduplicated files by
|
||||
// considering them regular files.
|
||||
if fi.Mode()&os.ModeIrregular != 0 {
|
||||
if reparseTag, reparseErr := readReparseTag(name); reparseErr == nil && isDeduplicatedFile(reparseTag) {
|
||||
return &dedupFileInfo{fi}, nil
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return fi, err
|
||||
}
|
||||
|
||||
+3
-1
@@ -92,7 +92,9 @@ func (m *metricsFS) account(op string) func(bytes int) {
|
||||
t0 := time.Now()
|
||||
root := m.next.URI()
|
||||
return func(bytes int) {
|
||||
metricTotalOperationSeconds.WithLabelValues(root, op).Add(time.Since(t0).Seconds())
|
||||
if dur := time.Since(t0).Seconds(); dur > 0 {
|
||||
metricTotalOperationSeconds.WithLabelValues(root, op).Add(dur)
|
||||
}
|
||||
metricTotalOperationsCount.WithLabelValues(root, op).Inc()
|
||||
if bytes >= 0 {
|
||||
metricTotalBytesCount.WithLabelValues(root, op).Add(float64(bytes))
|
||||
|
||||
@@ -2976,6 +2976,16 @@ func (*model) VerifyConfiguration(from, to config.Configuration) error {
|
||||
return errors.New("folder type must not be changed from/to receive-encrypted")
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that any requested versioning is possible to construct, or we
|
||||
// will panic later when starting the folder.
|
||||
for _, to := range to.Folders {
|
||||
if to.Versioning.Type != "" {
|
||||
if _, err := versioner.New(to); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
+6
-2
@@ -158,7 +158,9 @@ func inWritableDir(fn func(string) error, targetFs fs.Filesystem, path string, i
|
||||
func addTimeUntilCancelled(ctx context.Context, counter prometheus.Counter) {
|
||||
t0 := time.Now()
|
||||
defer func() {
|
||||
counter.Add(time.Since(t0).Seconds())
|
||||
if dur := time.Since(t0).Seconds(); dur > 0 {
|
||||
counter.Add(dur)
|
||||
}
|
||||
}()
|
||||
|
||||
ticker := time.NewTicker(time.Second)
|
||||
@@ -167,7 +169,9 @@ func addTimeUntilCancelled(ctx context.Context, counter prometheus.Counter) {
|
||||
for {
|
||||
select {
|
||||
case t := <-ticker.C:
|
||||
counter.Add(t.Sub(t0).Seconds())
|
||||
if dur := t.Sub(t0).Seconds(); dur > 0 {
|
||||
counter.Add(dur)
|
||||
}
|
||||
t0 = t
|
||||
case <-ctx.Done():
|
||||
return
|
||||
|
||||
@@ -13,10 +13,15 @@ import (
|
||||
"github.com/syncthing/syncthing/lib/sha256"
|
||||
)
|
||||
|
||||
const DeviceIDLength = 32
|
||||
const (
|
||||
DeviceIDLength = 32
|
||||
ShortIDStringLength = 7
|
||||
)
|
||||
|
||||
type DeviceID [DeviceIDLength]byte
|
||||
type ShortID uint64
|
||||
type (
|
||||
DeviceID [DeviceIDLength]byte
|
||||
ShortID uint64
|
||||
)
|
||||
|
||||
var (
|
||||
LocalDeviceID = repeatedDeviceID(0xff)
|
||||
@@ -94,7 +99,7 @@ func (s ShortID) String() string {
|
||||
}
|
||||
var bs [8]byte
|
||||
binary.BigEndian.PutUint64(bs[:], uint64(s))
|
||||
return base32.StdEncoding.EncodeToString(bs[:])[:7]
|
||||
return base32.StdEncoding.EncodeToString(bs[:])[:ShortIDStringLength]
|
||||
}
|
||||
|
||||
func (n *DeviceID) UnmarshalText(bs []byte) error {
|
||||
|
||||
+4
-4
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "STDISCOSRV" "1" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "STDISCOSRV" "1" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
stdiscosrv \- Syncthing Discovery Server
|
||||
.SH SYNOPSIS
|
||||
@@ -114,7 +114,7 @@ entry from the list.
|
||||
.SS Description
|
||||
.sp
|
||||
This guide assumes that you have already set up Syncthing. If you
|
||||
haven’t yet, head over to getting\-started first.
|
||||
haven’t yet, head over to \fI\%Getting Started\fP first.
|
||||
.SS Installing
|
||||
.sp
|
||||
Go to \fI\%releases\fP <\fBhttps://github.com/syncthing/discosrv/releases\fP> and
|
||||
@@ -398,7 +398,7 @@ server {
|
||||
ssl_dhparam /path/to/dhparam;
|
||||
|
||||
# HSTS (ngx_http_headers_module is required) (63072000 seconds)
|
||||
add_header Strict\-Transport\-Security "max\-age=63072000" always;
|
||||
add_header Strict\-Transport\-Security \(dqmax\-age=63072000\(dq always;
|
||||
|
||||
location / {
|
||||
proxy_pass http://discovery.example.com;
|
||||
@@ -421,7 +421,7 @@ The following lines must be added to the configuration:
|
||||
.ft C
|
||||
SSLProxyEngine On
|
||||
SSLVerifyClient optional_no_ca
|
||||
RequestHeader set X\-SSL\-Cert "%{SSL_CLIENT_CERT}s"
|
||||
RequestHeader set X\-SSL\-Cert \(dq%{SSL_CLIENT_CERT}s\(dq
|
||||
.ft P
|
||||
.fi
|
||||
.UNINDENT
|
||||
|
||||
+3
-3
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "STRELAYSRV" "1" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "STRELAYSRV" "1" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
strelaysrv \- Syncthing Relay Server
|
||||
.SH SYNOPSIS
|
||||
@@ -202,7 +202,7 @@ $ sudo \-u strelaysrv /usr/local/bin/strelaysrv \-keys /etc/strelaysrv
|
||||
.sp
|
||||
This creates a user \fBstrelaysrv\fP and a directory \fB/etc/strelaysrv\fP to store
|
||||
the keys. The keys are generated on first startup. The relay will join the
|
||||
global relay pool, unless a \fB\-pools=""\fP argument is given.
|
||||
global relay pool, unless a \fB\-pools=\(dq\(dq\fP argument is given.
|
||||
.sp
|
||||
To make the relay server start automatically at boot, use the recommended
|
||||
procedure for your operating system.
|
||||
@@ -272,7 +272,7 @@ COMMIT
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
You will need to start \fBstrelaysrv\fP with \fB\-ext\-address ":443"\fP\&. This tells
|
||||
You will need to start \fBstrelaysrv\fP with \fB\-ext\-address \(dq:443\(dq\fP\&. This tells
|
||||
\fBstrelaysrv\fP that it can be contacted on port 443, even though it is listening
|
||||
on port 22067. You will also need to let both port 443 and 22067 through your
|
||||
firewall.
|
||||
|
||||
+2
-2
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-BEP" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-BEP" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-bep \- Block Exchange Protocol v1
|
||||
.SH INTRODUCTION AND DEFINITIONS
|
||||
@@ -389,7 +389,7 @@ The \fBencryption_password_token\fP field contains a token derived from the pass
|
||||
used to encrypt data sent to this device. If the device is the same as the
|
||||
device sending the message, it signifies that the device itself has encrypted
|
||||
data that was encrypted with the given token. It is empty or missing if there is
|
||||
no encryption. See untrusted for details on the encryption scheme.
|
||||
no encryption. See \fI\%Untrusted Device Encryption\fP for details on the encryption scheme.
|
||||
.SS Index and Index Update
|
||||
.sp
|
||||
The Index and Index Update messages define the contents of the senders
|
||||
|
||||
+65
-65
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-CONFIG" "5" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-CONFIG" "5" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-config \- Syncthing Configuration
|
||||
.SH SYNOPSIS
|
||||
@@ -115,13 +115,13 @@ may no longer correspond to the defaults.
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<configuration version="37">
|
||||
<folder id="default" label="Default Folder" path="/Users/jb/Sync/" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="10" ignorePerms="false" autoNormalize="true">
|
||||
<configuration version=\(dq37\(dq>
|
||||
<folder id=\(dqdefault\(dq label=\(dqDefault Folder\(dq path=\(dq/Users/jb/Sync/\(dq type=\(dqsendreceive\(dq rescanIntervalS=\(dq3600\(dq fsWatcherEnabled=\(dqtrue\(dq fsWatcherDelayS=\(dq10\(dq ignorePerms=\(dqfalse\(dq autoNormalize=\(dqtrue\(dq>
|
||||
<filesystemType>basic</filesystemType>
|
||||
<device id="S7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW" introducedBy="">
|
||||
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq introducedBy=\(dq\(dq>
|
||||
<encryptionPassword></encryptionPassword>
|
||||
</device>
|
||||
<minDiskFree unit="%">1</minDiskFree>
|
||||
<minDiskFree unit=\(dq%\(dq>1</minDiskFree>
|
||||
<versioning>
|
||||
<cleanupIntervalS>3600</cleanupIntervalS>
|
||||
<fsPath></fsPath>
|
||||
@@ -153,18 +153,18 @@ may no longer correspond to the defaults.
|
||||
<syncXattrs>false</syncXattrs>
|
||||
<sendXattrs>false</sendXattrs>
|
||||
</folder>
|
||||
<device id="S7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW" name="syno" compression="metadata" introducer="false" skipIntroductionRemovals="false" introducedBy="">
|
||||
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq name=\(dqsyno\(dq compression=\(dqmetadata\(dq introducer=\(dqfalse\(dq skipIntroductionRemovals=\(dqfalse\(dq introducedBy=\(dq\(dq>
|
||||
<address>dynamic</address>
|
||||
<paused>false</paused>
|
||||
<autoAcceptFolders>false</autoAcceptFolders>
|
||||
<maxSendKbps>0</maxSendKbps>
|
||||
<maxRecvKbps>0</maxRecvKbps>
|
||||
<ignoredFolder time="2022\-01\-09T19:09:52Z" id="br63e\-wyhb7" label="Foo"></ignoredFolder>
|
||||
<ignoredFolder time=\(dq2022\-01\-09T19:09:52Z\(dq id=\(dqbr63e\-wyhb7\(dq label=\(dqFoo\(dq></ignoredFolder>
|
||||
<maxRequestKiB>0</maxRequestKiB>
|
||||
<untrusted>false</untrusted>
|
||||
<remoteGUIPort>0</remoteGUIPort>
|
||||
</device>
|
||||
<gui enabled="true" tls="false" debugging="false">
|
||||
<gui enabled=\(dqtrue\(dq tls=\(dqfalse\(dq debugging=\(dqfalse\(dq>
|
||||
<address>127.0.0.1:8384</address>
|
||||
<apikey>k1dnz1Dd0rzTBjjFFh7CXPnrF12C49B1</apikey>
|
||||
<theme>default</theme>
|
||||
@@ -199,7 +199,7 @@ may no longer correspond to the defaults.
|
||||
<cacheIgnoredFiles>false</cacheIgnoredFiles>
|
||||
<progressUpdateIntervalS>5</progressUpdateIntervalS>
|
||||
<limitBandwidthInLan>false</limitBandwidthInLan>
|
||||
<minHomeDiskFree unit="%">1</minHomeDiskFree>
|
||||
<minHomeDiskFree unit=\(dq%\(dq>1</minHomeDiskFree>
|
||||
<releasesURL>https://upgrades.syncthing.net/meta.json</releasesURL>
|
||||
<overwriteRemoteDeviceNamesOnConnect>false</overwriteRemoteDeviceNamesOnConnect>
|
||||
<tempIndexMinBlocks>10</tempIndexMinBlocks>
|
||||
@@ -220,14 +220,14 @@ may no longer correspond to the defaults.
|
||||
<connectionLimitMax>0</connectionLimitMax>
|
||||
<insecureAllowOldTLSVersions>false</insecureAllowOldTLSVersions>
|
||||
</options>
|
||||
<remoteIgnoredDevice time="2022\-01\-09T20:02:01Z" id="5SYI2FS\-LW6YAXI\-JJDYETS\-NDBBPIO\-256MWBO\-XDPXWVG\-24QPUM4\-PDW4UQU" name="bugger" address="192.168.0.20:22000"></remoteIgnoredDevice>
|
||||
<remoteIgnoredDevice time=\(dq2022\-01\-09T20:02:01Z\(dq id=\(dq5SYI2FS\-LW6YAXI\-JJDYETS\-NDBBPIO\-256MWBO\-XDPXWVG\-24QPUM4\-PDW4UQU\(dq name=\(dqbugger\(dq address=\(dq192.168.0.20:22000\(dq></remoteIgnoredDevice>
|
||||
<defaults>
|
||||
<folder id="" label="" path="~" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="10" ignorePerms="false" autoNormalize="true">
|
||||
<folder id=\(dq\(dq label=\(dq\(dq path=\(dq~\(dq type=\(dqsendreceive\(dq rescanIntervalS=\(dq3600\(dq fsWatcherEnabled=\(dqtrue\(dq fsWatcherDelayS=\(dq10\(dq ignorePerms=\(dqfalse\(dq autoNormalize=\(dqtrue\(dq>
|
||||
<filesystemType>basic</filesystemType>
|
||||
<device id="S7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW" introducedBy="">
|
||||
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq introducedBy=\(dq\(dq>
|
||||
<encryptionPassword></encryptionPassword>
|
||||
</device>
|
||||
<minDiskFree unit="%">1</minDiskFree>
|
||||
<minDiskFree unit=\(dq%\(dq>1</minDiskFree>
|
||||
<versioning>
|
||||
<cleanupIntervalS>3600</cleanupIntervalS>
|
||||
<fsPath></fsPath>
|
||||
@@ -259,7 +259,7 @@ may no longer correspond to the defaults.
|
||||
<syncXattrs>false</syncXattrs>
|
||||
<sendXattrs>false</sendXattrs>
|
||||
</folder>
|
||||
<device id="" compression="metadata" introducer="false" skipIntroductionRemovals="false" introducedBy="">
|
||||
<device id=\(dq\(dq compression=\(dqmetadata\(dq introducer=\(dqfalse\(dq skipIntroductionRemovals=\(dqfalse\(dq introducedBy=\(dq\(dq>
|
||||
<address>dynamic</address>
|
||||
<paused>false</paused>
|
||||
<autoAcceptFolders>false</autoAcceptFolders>
|
||||
@@ -281,7 +281,7 @@ may no longer correspond to the defaults.
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<configuration version="37">
|
||||
<configuration version=\(dq37\(dq>
|
||||
<folder></folder>
|
||||
<device></device>
|
||||
<gui></gui>
|
||||
@@ -318,12 +318,12 @@ GUI.
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<folder id="default" label="Default Folder" path="/Users/jb/Sync/" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="10" ignorePerms="false" autoNormalize="true">
|
||||
<folder id=\(dqdefault\(dq label=\(dqDefault Folder\(dq path=\(dq/Users/jb/Sync/\(dq type=\(dqsendreceive\(dq rescanIntervalS=\(dq3600\(dq fsWatcherEnabled=\(dqtrue\(dq fsWatcherDelayS=\(dq10\(dq ignorePerms=\(dqfalse\(dq autoNormalize=\(dqtrue\(dq>
|
||||
<filesystemType>basic</filesystemType>
|
||||
<device id="S7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW" introducedBy="">
|
||||
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq introducedBy=\(dq\(dq>
|
||||
<encryptionPassword></encryptionPassword>
|
||||
</device>
|
||||
<minDiskFree unit="%">1</minDiskFree>
|
||||
<minDiskFree unit=\(dq%\(dq>1</minDiskFree>
|
||||
<versioning>
|
||||
<cleanupIntervalS>3600</cleanupIntervalS>
|
||||
<fsPath></fsPath>
|
||||
@@ -379,7 +379,7 @@ labels. (optional)
|
||||
.TP
|
||||
.B filesystemType
|
||||
The internal file system implementation used to access this folder, detailed
|
||||
in a separate chapter\&.
|
||||
in a \fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -410,7 +410,7 @@ changes to other devices.
|
||||
.TP
|
||||
.B \fBreceiveencrypted\fP
|
||||
Must be used on untrusted devices, where the data cannot be decrypted
|
||||
because no folder password was entered. See untrusted\&.
|
||||
because no folder password was entered. See \fI\%Untrusted (Encrypted) Devices\fP\&.
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
@@ -443,7 +443,7 @@ as FAT, or environments where changing permissions is impossible.
|
||||
.TP
|
||||
.B autoNormalize
|
||||
Automatically correct UTF\-8 normalization errors found in file names. The
|
||||
mechanism and how to set it up is described in a separate chapter\&.
|
||||
mechanism and how to set it up is described in a \fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.sp
|
||||
The following child elements may exist:
|
||||
@@ -465,7 +465,7 @@ the configuration file.
|
||||
The \fBencryptionPassword\fP sub\-element contains the secret needed to decrypt
|
||||
this folder’s data on the remote device. If left empty, the data is plainly
|
||||
accessible (but still protected by the transport encryption). The mechanism
|
||||
and how to set it up is described in a separate chapter\&.
|
||||
and how to set it up is described in a \fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -484,7 +484,7 @@ Specifies a versioning configuration.
|
||||
\fBSEE ALSO:\fP
|
||||
.INDENT 7.0
|
||||
.INDENT 3.5
|
||||
versioning
|
||||
\fI\%File Versioning\fP
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
@@ -545,7 +545,7 @@ Enabling this is highly discouraged \- use at your own risk. You have been warne
|
||||
.sp
|
||||
When set to \fBtrue\fP, this device will pretend not to see instructions to
|
||||
delete files from other devices. The mechanism is described in a
|
||||
separate chapter\&.
|
||||
\fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -597,7 +597,7 @@ to \fB\-1\fP to always use weak hash. Default is \fB25\fP\&.
|
||||
.TP
|
||||
.B markerName
|
||||
Name of a directory or file in the folder root to be used as
|
||||
marker\-faq\&. Default is \fB\&.stfolder\fP\&.
|
||||
\fI\%How do I serve a folder from a read only filesystem?\fP\&. Default is \fB\&.stfolder\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -633,7 +633,7 @@ This is a known insecure option \- use at your own risk.
|
||||
.sp
|
||||
Disables committing file operations to disk before recording them in the
|
||||
database. Disabling fsync can lead to data corruption. The mechanism is
|
||||
described in a separate chapter\&.
|
||||
described in a \fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -664,15 +664,15 @@ no improvements to data distribution.
|
||||
Provides a choice of method for copying data between files. This can be
|
||||
used to optimise copies on network filesystems, improve speed of large
|
||||
copies or clone the data using copy\-on\-write functionality if the underlying
|
||||
filesystem supports it. The mechanism is described in a separate
|
||||
chapter\&.
|
||||
filesystem supports it. The mechanism is described in a \fI\%separate
|
||||
chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B caseSensitiveFS
|
||||
Affects performance by disabling the extra safety checks for case
|
||||
insensitive filesystems. The mechanism and how to set it up is described in
|
||||
a separate chapter\&.
|
||||
a \fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -684,26 +684,26 @@ to \fBtrue\fP\&.
|
||||
.TP
|
||||
.B syncOwnership
|
||||
File and directory ownership is synced when this is set to \fBtrue\fP\&. See
|
||||
/advanced/folder\-sync\-ownership for more information.
|
||||
\fI\%syncOwnership\fP for more information.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B sendOwnership
|
||||
File and directory ownership information is scanned when this is set to
|
||||
\fBtrue\fP\&. See /advanced/folder\-send\-ownership for more information.
|
||||
\fBtrue\fP\&. See \fI\%sendOwnership\fP for more information.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B syncXattrs
|
||||
File and directory extended attributes are synced when this is set to
|
||||
\fBtrue\fP\&. See /advanced/folder\-sync\-xattrs for more information.
|
||||
\fBtrue\fP\&. See \fI\%syncXattrs\fP for more information.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B sendXattrs
|
||||
File and directory extended attributes are scanned and sent to other
|
||||
devices when this is set to \fBtrue\fP\&. See
|
||||
/advanced/folder\-send\-xattrs for more information.
|
||||
\fI\%sendXattrs\fP for more information.
|
||||
.UNINDENT
|
||||
.SH DEVICE ELEMENT
|
||||
.INDENT 0.0
|
||||
@@ -711,19 +711,19 @@ devices when this is set to \fBtrue\fP\&. See
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<device id="S7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW" name="syno" compression="metadata" introducer="false" skipIntroductionRemovals="false" introducedBy="2CYF2WQ\-AKZO2QZ\-JAKWLYD\-AGHMQUM\-BGXUOIS\-GYILW34\-HJG3DUK\-LRRYQAR">
|
||||
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq name=\(dqsyno\(dq compression=\(dqmetadata\(dq introducer=\(dqfalse\(dq skipIntroductionRemovals=\(dqfalse\(dq introducedBy=\(dq2CYF2WQ\-AKZO2QZ\-JAKWLYD\-AGHMQUM\-BGXUOIS\-GYILW34\-HJG3DUK\-LRRYQAR\(dq>
|
||||
<address>dynamic</address>
|
||||
<paused>false</paused>
|
||||
<autoAcceptFolders>false</autoAcceptFolders>
|
||||
<maxSendKbps>0</maxSendKbps>
|
||||
<maxRecvKbps>0</maxRecvKbps>
|
||||
<ignoredFolder time="2022\-01\-09T19:09:52Z" id="br63e\-wyhb7" label="Foo"></ignoredFolder>
|
||||
<ignoredFolder time=\(dq2022\-01\-09T19:09:52Z\(dq id=\(dqbr63e\-wyhb7\(dq label=\(dqFoo\(dq></ignoredFolder>
|
||||
<maxRequestKiB>0</maxRequestKiB>
|
||||
<untrusted>false</untrusted>
|
||||
<remoteGUIPort>0</remoteGUIPort>
|
||||
<numConnections>0</numConnections>
|
||||
</device>
|
||||
<device id="2CYF2WQ\-AKZO2QZ\-JAKWLYD\-AGHMQUM\-BGXUOIS\-GYILW34\-HJG3DUK\-LRRYQAR" name="syno local" compression="metadata" introducer="true" skipIntroductionRemovals="false" introducedBy="">
|
||||
<device id=\(dq2CYF2WQ\-AKZO2QZ\-JAKWLYD\-AGHMQUM\-BGXUOIS\-GYILW34\-HJG3DUK\-LRRYQAR\(dq name=\(dqsyno local\(dq compression=\(dqmetadata\(dq introducer=\(dqtrue\(dq skipIntroductionRemovals=\(dqfalse\(dq introducedBy=\(dq\(dq>
|
||||
<address>tcp://192.0.2.1:22001</address>
|
||||
<paused>true</paused>
|
||||
<allowedNetwork>192.168.0.0/16</allowedNetwork>
|
||||
@@ -748,7 +748,7 @@ element:
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B id (mandatory)
|
||||
The device ID\&.
|
||||
The \fI\%device ID\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -784,7 +784,7 @@ should copy their list of devices per folder when connecting.
|
||||
\fBSEE ALSO:\fP
|
||||
.INDENT 7.0
|
||||
.INDENT 3.5
|
||||
introducer
|
||||
\fI\%Introducer Configuration\fP
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
@@ -851,7 +851,7 @@ for example:
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<device id="...">
|
||||
<device id=\(dq...\(dq>
|
||||
<address>tcp://192.0.2.1:22001</address>
|
||||
<address>quic://192.0.1.254:22000</address>
|
||||
<address>dynamic</address>
|
||||
@@ -870,7 +870,7 @@ True if synchronization with this devices is (temporarily) suspended.
|
||||
.TP
|
||||
.B allowedNetwork
|
||||
If given, this restricts connections to this device to only this network.
|
||||
The mechanism is described in detail in a separate chapter).
|
||||
The mechanism is described in detail in a \fI\%separate chapter\fP).
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -924,13 +924,13 @@ This boolean value marks a particular device as untrusted, which disallows
|
||||
ever sharing any unencrypted data with it. Every folder shared with that
|
||||
device then needs an encryption password set, or must already be of the
|
||||
“receive encrypted” type locally. Refer to the detailed explanation under
|
||||
untrusted\&.
|
||||
\fI\%Untrusted (Encrypted) Devices\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B numConnections
|
||||
The number of connections to this device. See
|
||||
/advanced/device\-numconnections for more information.
|
||||
\fI\%numConnections\fP for more information.
|
||||
.UNINDENT
|
||||
.SH GUI ELEMENT
|
||||
.INDENT 0.0
|
||||
@@ -938,7 +938,7 @@ The number of connections to this device. See
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<gui enabled="true" tls="false" debugging="false">
|
||||
<gui enabled=\(dqtrue\(dq tls=\(dqfalse\(dq debugging=\(dqfalse\(dq>
|
||||
<address>127.0.0.1:8384</address>
|
||||
<apikey>k1dnz1Dd0rzTBjjFFh7CXPnrF12C49B1</apikey>
|
||||
<theme>default</theme>
|
||||
@@ -949,7 +949,7 @@ The number of connections to this device. See
|
||||
.UNINDENT
|
||||
.sp
|
||||
There must be exactly one \fBgui\fP element. The GUI configuration is also used by
|
||||
the /dev/rest and the /dev/events\&. The following attributes may be
|
||||
the \fI\%REST API\fP and the \fI\%Event API\fP\&. The following attributes may be
|
||||
set on the \fBgui\fP element:
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -966,8 +966,8 @@ still possible but not required.
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B debugging
|
||||
This enables /users/profiling and additional endpoints in the REST
|
||||
API, see /rest/debug\&.
|
||||
This enables \fI\%Profiling\fP and additional endpoints in the REST
|
||||
API, see \fI\%Debug Endpoints\fP\&.
|
||||
.UNINDENT
|
||||
.sp
|
||||
The following child elements may be present:
|
||||
@@ -1069,7 +1069,7 @@ LDAP authentication. Requires ldap top level config section to be present.
|
||||
.UNINDENT
|
||||
.sp
|
||||
The \fBldap\fP element contains LDAP configuration options. The mechanism is
|
||||
described in detail under ldap\&.
|
||||
described in detail under \fI\%LDAP Authentication\fP\&.
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B address (mandatory)
|
||||
@@ -1154,7 +1154,7 @@ Search filter for user searches.
|
||||
<cacheIgnoredFiles>false</cacheIgnoredFiles>
|
||||
<progressUpdateIntervalS>5</progressUpdateIntervalS>
|
||||
<limitBandwidthInLan>false</limitBandwidthInLan>
|
||||
<minHomeDiskFree unit="%">1</minHomeDiskFree>
|
||||
<minHomeDiskFree unit=\(dq%\(dq>1</minHomeDiskFree>
|
||||
<releasesURL>https://upgrades.syncthing.net/meta.json</releasesURL>
|
||||
<overwriteRemoteDeviceNamesOnConnect>false</overwriteRemoteDeviceNamesOnConnect>
|
||||
<tempIndexMinBlocks>10</tempIndexMinBlocks>
|
||||
@@ -1318,7 +1318,7 @@ automatic upgrades.
|
||||
.TP
|
||||
.B upgradeToPreReleases
|
||||
If \fBtrue\fP, automatic upgrades include release candidates (see
|
||||
releases).
|
||||
\fI\%Versions & Releases\fP).
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -1432,18 +1432,18 @@ as part of launching Syncthing, set this option to \fBfalse\fP\&.
|
||||
.B maxFolderConcurrency
|
||||
This option controls how many folders may concurrently be in I/O\-intensive
|
||||
operations such as syncing or scanning. The mechanism is described in
|
||||
detail in a separate chapter\&.
|
||||
detail in a \fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B crashReportingURL
|
||||
Server URL where automatic crash reports will be sent if
|
||||
Server URL where \fI\%automatic crash reports\fP will be sent if
|
||||
enabled.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B crashReportingEnabled
|
||||
Switch to opt out from the automatic crash reporting
|
||||
Switch to opt out from the \fI\%automatic crash reporting\fP
|
||||
feature. Set \fBfalse\fP to keep Syncthing from sending panic logs on serious
|
||||
troubles. Defaults to \fBtrue\fP, to help the developers troubleshoot.
|
||||
.UNINDENT
|
||||
@@ -1452,7 +1452,7 @@ troubles. Defaults to \fBtrue\fP, to help the developers troubleshoot.
|
||||
.B databaseTuning
|
||||
Controls how Syncthing uses the backend key\-value database that stores the
|
||||
index data and other persistent data it needs. The available options and
|
||||
implications are explained in a separate chapter\&.
|
||||
implications are explained in a \fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -1470,7 +1470,7 @@ addresses to global discovery.
|
||||
.TP
|
||||
.B sendFullIndexOnUpgrade
|
||||
Controls whether all index data is resent when an upgrade has happened,
|
||||
equivalent to starting Syncthing with \fB\-\-reset\-deltas\fP\&. This used
|
||||
equivalent to starting Syncthing with \fI\%\-\-reset\-deltas\fP\&. This used
|
||||
to be the default behavior in older versions, but is mainly useful as a
|
||||
troubleshooting step and causes high database churn. The default is now
|
||||
\fBfalse\fP\&.
|
||||
@@ -1488,21 +1488,21 @@ so that regular users do not enable it by accident.
|
||||
.B connectionLimitEnough
|
||||
The number of connections at which we stop trying to connect to more
|
||||
devices, zero meaning no limit. Does not affect incoming connections. The
|
||||
mechanism is described in detail in a separate chapter\&.
|
||||
mechanism is described in detail in a \fI\%separate chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B connectionLimitMax
|
||||
The maximum number of connections which we will allow in total, zero meaning
|
||||
no limit. Affects incoming connections and prevents attempting outgoing
|
||||
connections. The mechanism is described in detail in a separate
|
||||
chapter\&.
|
||||
connections. The mechanism is described in detail in a \fI\%separate
|
||||
chapter\fP\&.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B insecureAllowOldTLSVersions
|
||||
Only for compatibility with old versions of Syncthing on remote devices, as
|
||||
detailed in /advanced/option\-insecure\-allow\-old\-tls\-versions\&.
|
||||
detailed in \fI\%insecureAllowOldTLSVersions\fP\&.
|
||||
.UNINDENT
|
||||
.SH DEFAULTS ELEMENT
|
||||
.INDENT 0.0
|
||||
@@ -1511,12 +1511,12 @@ detailed in /advanced/option\-insecure\-allow\-old\-tls\-versions\&.
|
||||
.nf
|
||||
.ft C
|
||||
<defaults>
|
||||
<folder id="" label="" path="~" type="sendreceive" rescanIntervalS="3600" fsWatcherEnabled="true" fsWatcherDelayS="10" ignorePerms="false" autoNormalize="true">
|
||||
<folder id=\(dq\(dq label=\(dq\(dq path=\(dq~\(dq type=\(dqsendreceive\(dq rescanIntervalS=\(dq3600\(dq fsWatcherEnabled=\(dqtrue\(dq fsWatcherDelayS=\(dq10\(dq ignorePerms=\(dqfalse\(dq autoNormalize=\(dqtrue\(dq>
|
||||
<filesystemType>basic</filesystemType>
|
||||
<device id="S7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW" introducedBy="">
|
||||
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq introducedBy=\(dq\(dq>
|
||||
<encryptionPassword></encryptionPassword>
|
||||
</device>
|
||||
<minDiskFree unit="%">1</minDiskFree>
|
||||
<minDiskFree unit=\(dq%\(dq>1</minDiskFree>
|
||||
<versioning>
|
||||
<cleanupIntervalS>3600</cleanupIntervalS>
|
||||
<fsPath></fsPath>
|
||||
@@ -1544,7 +1544,7 @@ detailed in /advanced/option\-insecure\-allow\-old\-tls\-versions\&.
|
||||
<caseSensitiveFS>false</caseSensitiveFS>
|
||||
<junctionsAsDirs>false</junctionsAsDirs>
|
||||
</folder>
|
||||
<device id="" compression="metadata" introducer="false" skipIntroductionRemovals="false" introducedBy="">
|
||||
<device id=\(dq\(dq compression=\(dqmetadata\(dq introducer=\(dqfalse\(dq skipIntroductionRemovals=\(dqfalse\(dq introducedBy=\(dq\(dq>
|
||||
<address>dynamic</address>
|
||||
<paused>false</paused>
|
||||
<autoAcceptFolders>false</autoAcceptFolders>
|
||||
@@ -1599,7 +1599,7 @@ including the appropriate \fI\%folder.device\fP element underneath.
|
||||
New in version 1.19.0.
|
||||
|
||||
.sp
|
||||
Template for the ignore patterns applied to new
|
||||
Template for the \fI\%ignore patterns\fP applied to new
|
||||
folders. These are copied to the \fB\&.stignore\fP file when a folder is
|
||||
automatically accepted from a remote device. The GUI uses them to pre\-fill
|
||||
the respective field when adding a new folder as well. In XML, each pattern
|
||||
@@ -1671,12 +1671,12 @@ accidentally if you sync your home folder between devices. A common symptom
|
||||
of syncing configuration files is two devices ending up with the same Device ID.
|
||||
.sp
|
||||
If you want to use Syncthing to backup your configuration files, it is recommended
|
||||
that the files you are backing up are in a folder\-sendonly to prevent other
|
||||
that the files you are backing up are in a \fI\%Send Only Folder\fP to prevent other
|
||||
devices from overwriting the per device configuration. The folder on the remote
|
||||
device(s) should not be used as configuration for the remote devices.
|
||||
.sp
|
||||
If you’d like to sync your home folder in non\-send only mode, you may add the
|
||||
folder that stores the configuration files to the ignore list\&.
|
||||
folder that stores the configuration files to the \fI\%ignore list\fP\&.
|
||||
If you’d also like to backup your configuration files, add another folder in
|
||||
send only mode for just the configuration folder.
|
||||
.SH AUTHOR
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-DEVICE-IDS" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-DEVICE-IDS" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-device-ids \- Understanding Device IDs
|
||||
.sp
|
||||
|
||||
+383
-383
File diff suppressed because it is too large
Load Diff
+36
-41
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-FAQ" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-FAQ" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-faq \- Frequently Asked Questions
|
||||
.INDENT 0.0
|
||||
@@ -164,7 +164,7 @@ Directory modification times (not preserved)
|
||||
Hard links (followed, not preserved)
|
||||
.IP \(bu 2
|
||||
Windows junctions (synced as ordinary directories; require enabling in
|
||||
\fBthe configuration\fP on a per\-folder
|
||||
\fI\%the configuration\fP on a per\-folder
|
||||
basis)
|
||||
.IP \(bu 2
|
||||
Resource forks (not preserved)
|
||||
@@ -176,7 +176,7 @@ Devices, FIFOs, and other specials (ignored)
|
||||
Sparse file sparseness (will become sparse, when supported by the OS & filesystem)
|
||||
.IP \(bu 2
|
||||
Syncthing internal files and folders (e.g. \fB\&.stfolder\fP, \fB\&.stignore\fP,
|
||||
\fB\&.stversions\fP, temporary files, etc.)
|
||||
\fB\&.stversions\fP, \fI\%temporary files\fP, etc.)
|
||||
.UNINDENT
|
||||
.SS Is synchronization fast?
|
||||
.sp
|
||||
@@ -191,7 +191,7 @@ manner. This means that renaming a file will not cause a retransmission of
|
||||
that file. Additionally, appending data to existing files should be handled
|
||||
efficiently as well.
|
||||
.sp
|
||||
Temporary files are used to store partial data
|
||||
\fI\%Temporary files\fP are used to store partial data
|
||||
downloaded from other devices. They are automatically removed whenever a file
|
||||
transfer has been completed or after the configured amount of time which is set
|
||||
in the configuration file (24 hours by default).
|
||||
@@ -236,7 +236,7 @@ oyster!)
|
||||
\fBSEE ALSO:\fP
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
device\-ids
|
||||
\fI\%Understanding Device IDs\fP
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.SH TROUBLESHOOTING
|
||||
@@ -262,7 +262,7 @@ Devices” list on the right side of the GUI, double check that you see
|
||||
.sp
|
||||
If you are connected via a relay, this is because a direct connection could
|
||||
not be established. Double check and follow the suggestions in
|
||||
firewall\-setup to enable direct connections.
|
||||
\fI\%Firewall Setup\fP to enable direct connections.
|
||||
.sp
|
||||
Second, if one of the devices is a very low powered machine (a Raspberry Pi,
|
||||
or a phone, or a NAS, or similar) you are likely constrained by the CPU on
|
||||
@@ -295,7 +295,7 @@ causes a certain amount of extra CPU usage to calculate the summary data it
|
||||
presents. Note however that once things are \fIin sync\fP CPU usage should be
|
||||
negligible.
|
||||
.sp
|
||||
To minimize the impact of this, Syncthing attempts to \fBlower the
|
||||
To minimize the impact of this, Syncthing attempts to \fI\%lower the
|
||||
process priority\fP when starting up.
|
||||
.sp
|
||||
To further limit the amount of CPU used when syncing and scanning, set the
|
||||
@@ -328,7 +328,7 @@ protect against unauthorized access. Either:
|
||||
.IP \(bu 2
|
||||
Make sure the proxy sets a \fBHost\fP header containing \fBlocalhost\fP, or
|
||||
.IP \(bu 2
|
||||
Set \fBgui.insecureSkipHostcheck\fP in the advanced settings, or
|
||||
Set \fI\%gui.insecureSkipHostcheck\fP in the advanced settings, or
|
||||
.IP \(bu 2
|
||||
Bind the GUI/API to a non\-localhost listen port.
|
||||
.UNINDENT
|
||||
@@ -338,8 +338,8 @@ In all cases, username/password authentication and HTTPS should be used.
|
||||
.sp
|
||||
This is almost always a result of bad RAM, storage device or other hardware.
|
||||
When the index database is found to be corrupt Syncthing cannot operate and will
|
||||
note this in the logs and exit. To overcome this delete the database
|
||||
folder inside Syncthing’s data directory and re\-start
|
||||
note this in the logs and exit. To overcome this delete the \fI\%database
|
||||
folder\fP inside Syncthing’s data directory and re\-start
|
||||
Syncthing. It will then need to perform a full re\-hashing of all shared
|
||||
folders. You should check your system in case the underlying cause is indeed
|
||||
faulty hardware which may put the system at risk of further data loss.
|
||||
@@ -374,7 +374,7 @@ up\-to\-date state with all the neighbours.
|
||||
.SS Why does Syncthing connect to this unknown/suspicious address?
|
||||
.sp
|
||||
If you see outgoing connections to odd and unexpected addresses these are
|
||||
most likely connections to relay servers\&. Relay servers
|
||||
most likely connections to \fI\%relay servers\fP\&. Relay servers
|
||||
are run by volunteers all over the world. They usually listen on ports 443 or
|
||||
22067, though this is controlled by the user running it. You can compare the
|
||||
address you are concerned about with \fI\%the current list of active relays\fP <\fBhttps://relays.syncthing.net\fP>\&. Relays do not and can not see the data
|
||||
@@ -420,7 +420,7 @@ Also see the \fI\%marker FAQ\fP for more information about the folder marker.
|
||||
\fBSEE ALSO:\fP
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
conflict\-handling
|
||||
\fI\%Conflicting Changes\fP
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.SS How do I serve a folder from a read only filesystem?
|
||||
@@ -459,11 +459,11 @@ locally may be overwritten by those on other devices.
|
||||
.sp
|
||||
An alternative way is to shut down Syncthing, move the folder on disk (including
|
||||
the \fB\&.stfolder\fP marker), edit the path directly in \fBconfig.xml\fP in the
|
||||
configuration folder (see /users/config) and then start Syncthing again.
|
||||
configuration folder (see \fI\%Syncthing Configuration\fP) and then start Syncthing again.
|
||||
.SS How do I configure multiple users on a single machine?
|
||||
.sp
|
||||
Each user should run their own Syncthing instance. Be aware that you might need
|
||||
to configure listening ports such that they do not overlap (see /users/config).
|
||||
to configure listening ports such that they do not overlap (see \fI\%Syncthing Configuration\fP).
|
||||
.SS Does Syncthing support syncing between folders on the same system?
|
||||
.sp
|
||||
No. Syncthing is not designed to sync locally and the overhead involved in
|
||||
@@ -519,17 +519,16 @@ On Windows, escaping special characters is not supported as the \fB\e\fP
|
||||
character is used as a path separator.
|
||||
.SS How do I access the web GUI from another computer?
|
||||
.sp
|
||||
The default listening address is 127.0.0.1:8384, so you can only access the
|
||||
GUI from the same machine. This is for security reasons. To access the web
|
||||
GUI from another computer, change the \fBGUI listen address\fP through the web
|
||||
UI from \fB127.0.0.1:8384\fP to
|
||||
\fB0.0.0.0:8384\fP or change the config.xml:
|
||||
The default listening address is 127.0.0.1:8384, so you can only access the GUI
|
||||
from the same machine. This is for security reasons. To access it from another
|
||||
computer, change the \fBGUI listen address\fP option in the web GUI from
|
||||
\fB127.0.0.1:8384\fP to \fB0.0.0.0:8384\fP, or change the \fBconfig.xml\fP:
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<gui enabled="true" tls="false">
|
||||
<gui enabled=\(dqtrue\(dq tls=\(dqfalse\(dq>
|
||||
<address>127.0.0.1:8384</address>
|
||||
.ft P
|
||||
.fi
|
||||
@@ -542,19 +541,19 @@ to
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<gui enabled="true" tls="false">
|
||||
<gui enabled=\(dqtrue\(dq tls=\(dqtrue\(dq>
|
||||
<address>0.0.0.0:8384</address>
|
||||
.ft P
|
||||
.fi
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
Then the GUI is accessible from everywhere. You should set a password and
|
||||
enable HTTPS with this configuration. You can do this from inside the GUI.
|
||||
Then the GUI is accessible from everywhere. There is no filtering based on
|
||||
e.g. source address (use a firewall for that). You should set a password and
|
||||
enable HTTPS with this configuration. You can do this from inside the GUI.
|
||||
.sp
|
||||
If both your computers are Unix\-like (Linux, Mac, etc.) you can also leave the
|
||||
GUI settings at default and use an ssh port forward to access it. For
|
||||
example,
|
||||
GUI settings at default and use an SSH port forward to access it. For example,
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
@@ -566,11 +565,11 @@ $ ssh \-L 9090:127.0.0.1:8384 user@othercomputer.example.com
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
will log you into othercomputer.example.com, and present the \fIremote\fP
|
||||
will log you into \fBothercomputer.example.com\fP, and present the \fIremote\fP
|
||||
Syncthing GUI on \fI\%http://localhost:9090\fP on your \fIlocal\fP computer.
|
||||
.sp
|
||||
If you only want to access the remote gui and don’t want the terminal
|
||||
session, use this example,
|
||||
If you only want to access the remote GUI and don’t want the terminal session,
|
||||
use this example:
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
@@ -582,13 +581,9 @@ $ ssh \-N \-L 9090:127.0.0.1:8384 user@othercomputer.example.com
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
If only your remote computer is Unix\-like,
|
||||
you can still access it with ssh from Windows.
|
||||
.sp
|
||||
Under Windows 10 or later (64\-bit only) you can use the same ssh command
|
||||
if you install the \fI\%Windows Subsystem for Linux\fP <\fBhttps://docs.microsoft.com/windows/wsl/install\fP>\&.
|
||||
.sp
|
||||
Another Windows way to run ssh is to install \fI\%gow (Gnu On Windows)\fP <\fBhttps://github.com/bmatzelle/gow\fP>\&. The easiest way to install gow is with the \fI\%chocolatey\fP <\fBhttps://chocolatey.org/\fP> package manager.
|
||||
If only your remote computer is Unix\-like, you can still access it with SSH from
|
||||
Windows. Under Windows 10 or later you can use the same \fBssh\fP command if you
|
||||
\fI\%install the OpenSSH Client\fP <\fBhttps://learn.microsoft.com/windows-server/administration/openssh/openssh_install_firstuse\fP>\&.
|
||||
.SS I don’t like the GUI or the theme. Can it be changed?
|
||||
.sp
|
||||
You can change the theme in the settings. Syncthing ships with other themes
|
||||
@@ -668,7 +663,7 @@ On many Linux distributions you can run the following to fix it:
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
echo "fs.inotify.max_user_watches=204800" | sudo tee \-a /etc/sysctl.conf
|
||||
echo \(dqfs.inotify.max_user_watches=204800\(dq | sudo tee \-a /etc/sysctl.conf
|
||||
.ft P
|
||||
.fi
|
||||
.UNINDENT
|
||||
@@ -681,7 +676,7 @@ separate file, i.e. you should run:
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
echo "fs.inotify.max_user_watches=204800" | sudo tee \-a /etc/sysctl.d/90\-override.conf
|
||||
echo \(dqfs.inotify.max_user_watches=204800\(dq | sudo tee \-a /etc/sysctl.d/90\-override.conf
|
||||
.ft P
|
||||
.fi
|
||||
.UNINDENT
|
||||
@@ -701,7 +696,7 @@ echo 204800 | sudo tee /proc/sys/fs/inotify/max_user_watches
|
||||
.SS How do I reset the GUI password?
|
||||
.sp
|
||||
If you’ve forgotten / lost the GUI password, you can reset it using the
|
||||
\fB\-\-gui\-password\fP (and possibly \fB\-\-gui\-user\fP) options to the
|
||||
\fI\%\-\-gui\-password\fP (and possibly \fI\%\-\-gui\-user\fP) options to the
|
||||
\fBsyncthing generate\fP subcommand. This should be done while Syncthing is not
|
||||
running.
|
||||
.INDENT 0.0
|
||||
@@ -713,9 +708,9 @@ Stop Syncthing: \fBsyncthing cli operations shutdown\fP
|
||||
Restart Syncthing as usual.
|
||||
.UNINDENT
|
||||
.sp
|
||||
\fIAlternatively, in step 2\fP, you can manually delete the \fB<user>\fP and \fB<password>\fP XML tags from the
|
||||
\fIAlternatively, in step 2\fP, you can manually delete the \fI\%<user>\fP and \fI\%<password>\fP XML tags from the
|
||||
\fB<gui>\fP block in file \fBconfig.xml\fP\&. The location of the file depends on the
|
||||
OS and is described in the configuration documentation\&.
|
||||
OS and is described in the \fI\%configuration documentation\fP\&.
|
||||
.sp
|
||||
For example, the two emphasized lines below would be removed from the file.
|
||||
.INDENT 0.0
|
||||
@@ -723,7 +718,7 @@ For example, the two emphasized lines below would be removed from the file.
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<gui enabled="true" tls="false" debugging="false">
|
||||
<gui enabled=\(dqtrue\(dq tls=\(dqfalse\(dq debugging=\(dqfalse\(dq>
|
||||
<address>127.0.0.1:8384</address>
|
||||
<user>syncguy</user>
|
||||
<password>$2a$10$s9wWHOQe...Cq7GPye69</password>
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-GLOBALDISCO" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-GLOBALDISCO" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-globaldisco \- Global Discovery Protocol v3
|
||||
.SH ANNOUNCEMENTS
|
||||
@@ -42,7 +42,7 @@ listing connection addresses (if any):
|
||||
.nf
|
||||
.ft C
|
||||
{
|
||||
addresses: ["tcp://192.0.2.45:22000", "tcp://:22202", "relay://192.0.2.99:22028"],
|
||||
addresses: [\(dqtcp://192.0.2.45:22000\(dq, \(dqtcp://:22202\(dq, \(dqrelay://192.0.2.99:22028\(dq],
|
||||
}
|
||||
.ft P
|
||||
.fi
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-LOCALDISCO" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-LOCALDISCO" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-localdisco \- Local Discovery Protocol v4
|
||||
.SH MODE OF OPERATION
|
||||
@@ -55,7 +55,7 @@ previously unknown device is discovered or a device has restarted (see the
|
||||
.SH DEVICE ID
|
||||
.sp
|
||||
The device ID is the SHA\-256 (32 bytes) of the device X.509 certificate. See
|
||||
device\-ids in the Syncthing documentation.
|
||||
\fI\%Understanding Device IDs\fP in the Syncthing documentation.
|
||||
.SH ANNOUNCEMENT PACKET
|
||||
.sp
|
||||
The Announcement packet has the following structure:
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-NETWORKING" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-NETWORKING" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-networking \- Firewall Setup
|
||||
.SH ROUTER SETUP
|
||||
@@ -57,7 +57,7 @@ Communication in Syncthing works both ways. Therefore if you set up port
|
||||
forwards for one device, other devices will be able to connect to it even when
|
||||
they are behind a NAT network or firewall.
|
||||
.sp
|
||||
In the absence of port forwarding, relaying may work well enough to get
|
||||
In the absence of port forwarding, \fI\%Relaying\fP may work well enough to get
|
||||
devices connected and synced, but will perform poorly in comparison to a
|
||||
direct connection.
|
||||
.SS Local Discovery
|
||||
@@ -171,7 +171,7 @@ port 8384 on the target machine. This still works even if Syncthing is bound to
|
||||
listen on localhost only.
|
||||
.SH VIA A PROXY
|
||||
.sp
|
||||
Syncthing can use a SOCKS5 proxy for outbound connections. Please see proxying\&.
|
||||
Syncthing can use a SOCKS5 proxy for outbound connections. Please see \fI\%Using Proxies\fP\&.
|
||||
.SH AUTHOR
|
||||
The Syncthing Authors
|
||||
.SH COPYRIGHT
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-RELAY" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-RELAY" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-relay \- Relay Protocol v1
|
||||
.SH WHAT IS A RELAY?
|
||||
|
||||
+692
-683
File diff suppressed because it is too large
Load Diff
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-SECURITY" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-SECURITY" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-security \- Security Principles
|
||||
.sp
|
||||
|
||||
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-STIGNORE" "5" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-STIGNORE" "5" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-stignore \- Prevent files from being synchronized to other nodes
|
||||
.SH SYNOPSIS
|
||||
@@ -114,6 +114,9 @@ included more than once. Note that while this can be used to include
|
||||
patterns from a file in a subdirectory, the patterns themselves are
|
||||
still relative to the synced folder \fIroot\fP\&. Example:
|
||||
\fB#include more\-patterns.txt\fP\&.
|
||||
.sp
|
||||
Any \fB#include\fP directives inside a file loaded by \fB#include\fP require paths specified relative
|
||||
to the directory containing the loaded file, rather than the synchronised root directory.
|
||||
.IP \(bu 2
|
||||
A pattern beginning with a \fB!\fP prefix negates the pattern: matching files
|
||||
are \fIincluded\fP (that is, \fInot\fP ignored). This can be used to override
|
||||
@@ -147,7 +150,7 @@ single pair of parentheses (not “(?di)”).
|
||||
.INDENT 3.5
|
||||
Include patterns (that begin with \fB!\fP) cause Syncthing to traverse
|
||||
the entire directory tree regardless of other ignore patterns.
|
||||
If the watcher is enabled, the entire directory
|
||||
If the \fI\%watcher\fP is enabled, the entire directory
|
||||
tree will be watched as well.
|
||||
.sp
|
||||
Top\-level include patterns are treated as special cases and will not force Syncthing to
|
||||
@@ -207,16 +210,16 @@ all files and directories called “foo”, ending in a “2” or starting with
|
||||
.nf
|
||||
.ft C
|
||||
\&.DS_Store # ignored, will be deleted if gets in the way of parent directory removal
|
||||
foo # ignored, matches "foo"
|
||||
foofoo # synced, does not match "foo" but would match "foo*" or "*foo"
|
||||
foo # ignored, matches \(dqfoo\(dq
|
||||
foofoo # synced, does not match \(dqfoo\(dq but would match \(dqfoo*\(dq or \(dq*foo\(dq
|
||||
bar/ # synced
|
||||
baz # synced
|
||||
quux # ignored, matches "qu*"
|
||||
quuz # synced, matches "qu*" but is excluded by the preceding "!quuz"
|
||||
bar2/ # synced, despite matching "*2" due to child frobble
|
||||
quux # ignored, matches \(dqqu*\(dq
|
||||
quuz # synced, matches \(dqqu*\(dq but is excluded by the preceding \(dq!quuz\(dq
|
||||
bar2/ # synced, despite matching \(dq*2\(dq due to child frobble
|
||||
baz # ignored, due to parent being ignored
|
||||
frobble # synced, due to "!frobble"
|
||||
My Pictures/ # ignored, matched case insensitive "(?i)my pictures" pattern
|
||||
frobble # synced, due to \(dq!frobble\(dq
|
||||
My Pictures/ # ignored, matched case insensitive \(dq(?i)my pictures\(dq pattern
|
||||
Img15.PNG # ignored, due to parent being ignored
|
||||
.ft P
|
||||
.fi
|
||||
|
||||
+26
-26
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING-VERSIONING" "7" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING-VERSIONING" "7" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing-versioning \- Keep automatic backups of deleted files by other nodes
|
||||
.sp
|
||||
@@ -156,14 +156,14 @@ set \-eu
|
||||
versionspath=~/.trashcan
|
||||
|
||||
# The parameters we get from Syncthing
|
||||
folderpath="$1"
|
||||
filepath="$2"
|
||||
folderpath=\(dq$1\(dq
|
||||
filepath=\(dq$2\(dq
|
||||
|
||||
# First ensure the dir where we need to store the file exists
|
||||
outpath=$(dirname "$versionspath/$filepath")
|
||||
mkdir \-p "$outpath"
|
||||
outpath=$(dirname \(dq$versionspath/$filepath\(dq)
|
||||
mkdir \-p \(dq$outpath\(dq
|
||||
# Then move the file there
|
||||
mv \-f "$folderpath/$filepath" "$versionspath/$filepath"
|
||||
mv \-f \(dq$folderpath/$filepath\(dq \(dq$versionspath/$filepath\(dq
|
||||
.ft P
|
||||
.fi
|
||||
.UNINDENT
|
||||
@@ -209,25 +209,25 @@ rem We need command extensions for md to create intermediate folders in one go
|
||||
setlocal enableextensions
|
||||
|
||||
rem Where I want my versions stored
|
||||
set "versions_path=%USERPROFILE%\e.trashcan"
|
||||
set \(dqversions_path=%USERPROFILE%\e.trashcan\(dq
|
||||
|
||||
rem The parameters we get from Syncthing, \(aq~\(aq removes quotes if any
|
||||
set "folder_path=%~1"
|
||||
set "file_path=%~2"
|
||||
set \(dqfolder_path=%~1\(dq
|
||||
set \(dqfile_path=%~2\(dq
|
||||
|
||||
rem First ensure the dir where we need to store the file exists
|
||||
for %%f in ("%versions_path%\e%file_path%") do set "output_path=%%~dpf"
|
||||
if not exist "%output_path%" md "%output_path%" || exit /b
|
||||
for %%f in (\(dq%versions_path%\e%file_path%\(dq) do set \(dqoutput_path=%%~dpf\(dq
|
||||
if not exist \(dq%output_path%\(dq md \(dq%output_path%\(dq || exit /b
|
||||
|
||||
rem Finally move the file, overwrite existing file if any
|
||||
move /y "%folder_path%\e%file_path%" "%versions_path%\e%file_path%"
|
||||
move /y \(dq%folder_path%\e%file_path%\(dq \(dq%versions_path%\e%file_path%\(dq
|
||||
.ft P
|
||||
.fi
|
||||
.UNINDENT
|
||||
.UNINDENT
|
||||
.sp
|
||||
Finally, I set \fB"C:\eUsers\emfrnd\eScripts\eonlylatest.bat" "%FOLDER_PATH%"
|
||||
"%FILE_PATH%"\fP as the command name in Syncthing.
|
||||
Finally, I set \fB\(dqC:\eUsers\emfrnd\eScripts\eonlylatest.bat\(dq \(dq%FOLDER_PATH%\(dq
|
||||
\(dq%FILE_PATH%\(dq\fP as the command name in Syncthing.
|
||||
.SS Move to the Recycle Bin using PowerShell
|
||||
.sp
|
||||
We can use PowerShell to send files directly to the Recycle Bin, which
|
||||
@@ -245,7 +245,7 @@ location, e.g. \fBC:\eUsers\eUser\eScripts\eSendToRecycleBin.ps1\fP\&.
|
||||
Add\-Type \-AssemblyName Microsoft.VisualBasic
|
||||
[Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($args,\(aqOnlyErrorDialogs\(aq,\(aqSendToRecycleBin\(aq)
|
||||
if ($?) {
|
||||
Write\-Output ("Recycled " + $args + ".")
|
||||
Write\-Output (\(dqRecycled \(dq + $args + \(dq.\(dq)
|
||||
}
|
||||
.ft P
|
||||
.fi
|
||||
@@ -268,15 +268,15 @@ Add\-Type \-AssemblyName Microsoft.VisualBasic
|
||||
# a modification and delete the existing file. If if does not, we assume
|
||||
# a deletion and recycle the current file. If succeeded, we also include
|
||||
# the deleted/recycled file in the Syncthing\(aqs DEBUG output.
|
||||
if (Test\-Path \-LiteralPath ((Split\-Path \-Path $args) + "\e~syncthing~" + (Split\-Path \-Path $args \-Leaf) + ".tmp")) {
|
||||
if (Test\-Path \-LiteralPath ((Split\-Path \-Path $args) + \(dq\e~syncthing~\(dq + (Split\-Path \-Path $args \-Leaf) + \(dq.tmp\(dq)) {
|
||||
[Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($args,\(aqOnlyErrorDialogs\(aq,\(aqDeletePermanently\(aq)
|
||||
if ($?) {
|
||||
Write\-Output ("Deleted " + $args + ".")
|
||||
Write\-Output (\(dqDeleted \(dq + $args + \(dq.\(dq)
|
||||
}
|
||||
} else {
|
||||
[Microsoft.VisualBasic.FileIO.FileSystem]::DeleteFile($args,\(aqOnlyErrorDialogs\(aq,\(aqSendToRecycleBin\(aq)
|
||||
if ($?) {
|
||||
Write\-Output ("Recycled " + $args + ".")
|
||||
Write\-Output (\(dqRecycled \(dq + $args + \(dq.\(dq)
|
||||
}
|
||||
}
|
||||
.ft P
|
||||
@@ -285,8 +285,8 @@ if (Test\-Path \-LiteralPath ((Split\-Path \-Path $args) + "\e~syncthing~" + (Sp
|
||||
.UNINDENT
|
||||
.sp
|
||||
Finally, we set the command name in Syncthing to \fBpowershell.exe
|
||||
\-ExecutionPolicy Bypass \-File "C:\eUsers\eUser\eScripts\eSendToRecycleBin.ps1"
|
||||
"%FOLDER_PATH%\e%FILE_PATH%"\fP\&.
|
||||
\-ExecutionPolicy Bypass \-File \(dqC:\eUsers\eUser\eScripts\eSendToRecycleBin.ps1\(dq
|
||||
\(dq%FOLDER_PATH%\e%FILE_PATH%\(dq\fP\&.
|
||||
.sp
|
||||
The only caveat that you should be aware of is that if your Syncthing
|
||||
folder is located on a portable storage, such as a USB stick, or if you
|
||||
@@ -295,20 +295,20 @@ files permanently.
|
||||
.SH CONFIGURATION PARAMETER REFERENCE
|
||||
.sp
|
||||
The versioning settings are grouped into their own section of each folder in the
|
||||
\fBconfiguration file\fP\&. The following shows an
|
||||
\fI\%configuration file\fP\&. The following shows an
|
||||
example of such a section in the XML:
|
||||
.INDENT 0.0
|
||||
.INDENT 3.5
|
||||
.sp
|
||||
.nf
|
||||
.ft C
|
||||
<folder id="...">
|
||||
<versioning type="simple">
|
||||
<folder id=\(dq...\(dq>
|
||||
<versioning type=\(dqsimple\(dq>
|
||||
<cleanupIntervalS>3600</cleanupIntervalS>
|
||||
<fsPath></fsPath>
|
||||
<fsType>basic</fsType>
|
||||
<param key="cleanoutDays" val="0"></param>
|
||||
<param key="keep" val="5"></param>
|
||||
<param key=\(dqcleanoutDays\(dq val=\(dq0\(dq></param>
|
||||
<param key=\(dqkeep\(dq val=\(dq5\(dq></param>
|
||||
</versioning>
|
||||
</folder>
|
||||
.ft P
|
||||
@@ -338,7 +338,7 @@ in the \fI\%params\fP element.
|
||||
.B versioning.fsType
|
||||
The internal file system implementation used to access this versions folder.
|
||||
Only applies if \fI\%fsPath\fP is also set non\-empty,
|
||||
otherwise the \fBfilesystemType\fP from the folder element is used
|
||||
otherwise the \fI\%filesystemType\fP from the folder element is used
|
||||
instead. Refer to that option description for possible values. Ignored for
|
||||
the \fBexternal\fP versioning strategy.
|
||||
.sp
|
||||
|
||||
+13
-8
@@ -27,7 +27,7 @@ level margin: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.\" new: \\n[rst2man-indent\\n[rst2man-indent-level]]
|
||||
.in \\n[rst2man-indent\\n[rst2man-indent-level]]u
|
||||
..
|
||||
.TH "SYNCTHING" "1" "Sep 07, 2023" "v1.24.0" "Syncthing"
|
||||
.TH "SYNCTHING" "1" "Oct 05, 2023" "v1.25.0" "Syncthing"
|
||||
.SH NAME
|
||||
syncthing \- Syncthing
|
||||
.SH SYNOPSIS
|
||||
@@ -99,7 +99,7 @@ Write events to timestamped file \fBaudit\-YYYYMMDD\-HHMMSS.log\fP\&.
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-auditfile=<file|\-|\-\->
|
||||
Use specified file or stream (\fB"\-"\fP for stdout, \fB"\-\-"\fP for stderr) for
|
||||
Use specified file or stream (\fB\(dq\-\(dq\fP for stdout, \fB\(dq\-\-\(dq\fP for stderr) for
|
||||
audit events, rather than the timestamped default file name.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
@@ -121,7 +121,11 @@ Generate key and config in specified dir, then exit.
|
||||
.TP
|
||||
.B \-\-gui\-address=<address>
|
||||
Override GUI listen address. Set this to an address (\fB0.0.0.0:8384\fP)
|
||||
or file path (\fB/var/run/st.sock\fP, for UNIX sockets).
|
||||
or a URL (\fBhttp://0.0.0.0:8384\fP). Supported schemes are \fBhttp\fP for
|
||||
plain HTTP, \fBhttps\fP for HTTP over TLS, \fBunix\fP for plain Unix sockets
|
||||
or \fBunixs\fP for TLS over Unix sockets. A Unix socket could look like this:
|
||||
\fBunix:///run/syncthing/syncthing.socket\fP (notice the three slashes: two
|
||||
as part of the URL structure, one to specify an absolute path).
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -132,9 +136,10 @@ Override the API key needed to access the GUI / REST API.
|
||||
.TP
|
||||
.B \-\-gui\-password=<password|\->
|
||||
Specify new GUI authentication password, to update the config file. Read
|
||||
from the standard input stream if only a single dash (\fB\-\fP) is given. The
|
||||
password is hashed before writing to the config file. As a special case,
|
||||
giving the existing password hash as password will leave it untouched.
|
||||
from the standard input stream if only a single dash (\fB\-\fP) is given. A
|
||||
plaintext password is hashed before writing to the config file, but an
|
||||
already bcrypt\-hashed input is stored verbatim. As a special case, giving
|
||||
the existing password hash as password will leave it untouched.
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
@@ -170,7 +175,7 @@ together with \fB\-\-config\fP\&.
|
||||
.INDENT 0.0
|
||||
.TP
|
||||
.B \-\-logfile=<filename>
|
||||
Set destination filename for logging (use \fB"\-"\fP for stdout, which is the
|
||||
Set destination filename for logging (use \fB\(dq\-\(dq\fP for stdout, which is the
|
||||
default option).
|
||||
.UNINDENT
|
||||
.INDENT 0.0
|
||||
@@ -363,7 +368,7 @@ it is validated and updated to the latest configuration schema, including adding
|
||||
default values for any new options.
|
||||
.sp
|
||||
The \fBdecrypt\fP subcommand is used in conjunction with untrusted (encrypted)
|
||||
devices, see the relevant section on decryption for
|
||||
devices, see the relevant section on \fI\%decryption\fP for
|
||||
details. It does not depend on Syncthing to be running, but works on offline
|
||||
data.
|
||||
.sp
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
import { environment } from '../environments/environment'
|
||||
|
||||
export const deviceID = (): String => {
|
||||
const dID: String = environment.production ? globalThis.metadata['deviceID'] : '12345';
|
||||
return dID.substring(0, 5)
|
||||
return environment.production ? globalThis.metadata['deviceIDShort'] : '1234567';
|
||||
}
|
||||
|
||||
export const apiURL: String = '/'
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user