Compare commits

...

22 Commits

Author SHA1 Message Date
Syncthing Release Automation
a28441a9bf gui, man, authors: Update docs, translations, and contributors 2024-07-22 03:45:28 +00:00
Simon Frei
2e313716e5 etc: Remove restart on suspend systemd service (ref #8448) (#9611)
The option to do the same in our own monitor process has been removed a
long time ago.
2024-07-17 09:29:49 +03:00
Syncthing Release Automation
0b5ff1f5f7 gui, man, authors: Update docs, translations, and contributors 2024-07-15 03:45:20 +00:00
Simon Frei
0fe6d97d3d lib/fs: Add missing locks to fakeFile methods (fixes #9499) (#9603)
fixes #9499
2024-07-09 10:33:30 +02:00
Simon Frei
0756e42a85 lib/api: Increase test request timeout (fixes #9455) (#9602)
Fixes #9455
2024-07-09 00:37:44 +02:00
Syncthing Release Automation
13ebe1c87f gui, man, authors: Update docs, translations, and contributors 2024-07-08 03:45:16 +00:00
Simon Frei
aea7fa5f22 lib/ignore: Remove unused patterns in cache (#9601)
Tiny cleanup I noticed while trying to fix/test another issue
(https://github.com/syncthing/syncthing/pull/9600). I shortly tried to
figure out what it was used for in the past, but gave up without
results.
2024-07-02 11:01:00 +00:00
Simon Frei
403ce7e597 lib/ignore: Fix caching of filenames with path separators on windows (#9600)
Previously we queried cache with backslashes, and stored entries with
slashes. As in no cache hits ever for non-toplevel files. I also
eventually remembered that cache is disabled by default, so this is a
bit pointless, but still right :P
2024-07-02 10:58:06 +00:00
Syncthing Release Automation
4704d3bc48 gui, man, authors: Update docs, translations, and contributors 2024-07-01 03:45:16 +00:00
André Colomb
2794b04243 gui: Add Filipino (fil) translation template (#9599) 2024-06-29 17:53:32 +02:00
Syncthing Release Automation
1ce64971fd gui, man, authors: Update docs, translations, and contributors 2024-06-24 03:45:42 +00:00
Syncthing Release Automation
eb6d80eac4 gui, man, authors: Update docs, translations, and contributors 2024-06-17 03:45:27 +00:00
Syncthing Release Automation
a8db3351ae gui, man, authors: Update docs, translations, and contributors 2024-06-10 03:45:25 +00:00
Ross Smith II
23a900e096 gui: Use localised time in duration (#9552)
https://github.com/syncthing/syncthing/pull/8291 inpired me to develop
this. I tested it with all the languages Syncthing currently supports,
and they all work.

The only issue is that when you change the language in the GUI, you have
to either refresh the page, or wait a few seconds for the page to
refresh by itself, before the duration is translated into the new
language.

### Screenshots


![2024-05-20_21-47-58](https://github.com/syncthing/syncthing/assets/220772/7e3b371e-3495-4e3e-853a-b5a41215e6c7)

### Documentation

The documentation for the translation widget is at
https://github.com/EvanHahn/HumanizeDuration.js/blob/main/README.md
2024-06-05 06:05:51 -04:00
Jakob Borg
5a304cf295 build: Skip autoprocs for build script 2024-06-04 08:55:37 -04:00
Jakob Borg
136b3742bf build: Update dependencies (#9565) 2024-06-04 13:58:49 +02:00
Jakob Borg
21e0f98fe2 Merge branch 'infrastructure'
* infrastructure:
  cmd/stupgrades: Basic process metrics
  cmd/stcrashreceiver: Ignore patterns, improve metrics
  cmd/strelaypoolsrv: More compact response, improved metrics
  cmd/stdiscosrv: Add AMQP replication
2024-06-04 07:18:35 -04:00
Jakob Borg
2bb5b2244b cmd/stupgrades: Basic process metrics 2024-06-03 19:50:28 +02:00
Jakob Borg
2f281799c1 cmd/stcrashreceiver: Ignore patterns, improve metrics 2024-06-03 19:50:28 +02:00
Jakob Borg
18a58a2ddc cmd/strelaypoolsrv: More compact response, improved metrics 2024-06-03 19:50:28 +02:00
Jakob Borg
f283215fce cmd/stdiscosrv: Add AMQP replication 2024-06-03 19:50:28 +02:00
Syncthing Release Automation
495809ac9e gui, man, authors: Update docs, translations, and contributors 2024-06-03 03:45:18 +00:00
56 changed files with 2550 additions and 523 deletions

View File

@@ -33,7 +33,6 @@ import (
"text/template"
"time"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
buildpkg "github.com/syncthing/syncthing/lib/build"
)
@@ -119,7 +118,6 @@ var targets = map[string]target{
{src: "man/syncthing-security.7", dst: "deb/usr/share/man/man7/syncthing-security.7", perm: 0644},
{src: "man/syncthing-versioning.7", dst: "deb/usr/share/man/man7/syncthing-versioning.7", perm: 0644},
{src: "etc/linux-systemd/system/syncthing@.service", dst: "deb/lib/systemd/system/syncthing@.service", perm: 0644},
{src: "etc/linux-systemd/system/syncthing-resume.service", dst: "deb/lib/systemd/system/syncthing-resume.service", perm: 0644},
{src: "etc/linux-systemd/user/syncthing.service", dst: "deb/usr/lib/systemd/user/syncthing.service", perm: 0644},
{src: "etc/linux-sysctl/30-syncthing.conf", dst: "deb/usr/lib/sysctl.d/30-syncthing.conf", perm: 0644},
{src: "etc/firewall-ufw/syncthing", dst: "deb/etc/ufw/applications.d/syncthing", perm: 0644},

View File

@@ -21,11 +21,14 @@ import (
"net/http"
"os"
"path/filepath"
"regexp"
"strings"
"github.com/alecthomas/kong"
raven "github.com/getsentry/raven-go"
"github.com/prometheus/client_golang/prometheus/promhttp"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/sha256"
"github.com/syncthing/syncthing/lib/ur"
)
@@ -33,13 +36,15 @@ import (
const maxRequestSize = 1 << 20 // 1 MiB
type cli struct {
Dir string `help:"Parent directory to store crash and failure reports in" env:"REPORTS_DIR" default:"."`
DSN string `help:"Sentry DSN" env:"SENTRY_DSN"`
Listen string `help:"HTTP listen address" default:":8080" env:"LISTEN_ADDRESS"`
MaxDiskFiles int `help:"Maximum number of reports on disk" default:"100000" env:"MAX_DISK_FILES"`
MaxDiskSizeMB int64 `help:"Maximum disk space to use for reports" default:"1024" env:"MAX_DISK_SIZE_MB"`
SentryQueue int `help:"Maximum number of reports to queue for sending to Sentry" default:"64" env:"SENTRY_QUEUE"`
DiskQueue int `help:"Maximum number of reports to queue for writing to disk" default:"64" env:"DISK_QUEUE"`
Dir string `help:"Parent directory to store crash and failure reports in" env:"REPORTS_DIR" default:"."`
DSN string `help:"Sentry DSN" env:"SENTRY_DSN"`
Listen string `help:"HTTP listen address" default:":8080" env:"LISTEN_ADDRESS"`
MaxDiskFiles int `help:"Maximum number of reports on disk" default:"100000" env:"MAX_DISK_FILES"`
MaxDiskSizeMB int64 `help:"Maximum disk space to use for reports" default:"1024" env:"MAX_DISK_SIZE_MB"`
SentryQueue int `help:"Maximum number of reports to queue for sending to Sentry" default:"64" env:"SENTRY_QUEUE"`
DiskQueue int `help:"Maximum number of reports to queue for writing to disk" default:"64" env:"DISK_QUEUE"`
MetricsListen string `help:"HTTP listen address for metrics" default:":8081" env:"METRICS_LISTEN_ADDRESS"`
IngorePatterns string `help:"File containing ignore patterns (regexp)" env:"IGNORE_PATTERNS" type:"existingfile"`
}
func main() {
@@ -62,19 +67,38 @@ func main() {
}
go ss.Serve(context.Background())
var ip *ignorePatterns
if params.IngorePatterns != "" {
var err error
ip, err = loadIgnorePatterns(params.IngorePatterns)
if err != nil {
log.Fatalf("Failed to load ignore patterns: %v", err)
}
}
cr := &crashReceiver{
store: ds,
sentry: ss,
ignore: ip,
}
mux.Handle("/", cr)
mux.HandleFunc("/ping", func(w http.ResponseWriter, req *http.Request) {
w.Write([]byte("OK"))
})
mux.Handle("/metrics", promhttp.Handler())
if params.MetricsListen != "" {
mmux := http.NewServeMux()
mmux.Handle("/metrics", promhttp.Handler())
go func() {
if err := http.ListenAndServe(params.MetricsListen, mmux); err != nil {
log.Fatalln("HTTP serve metrics:", err)
}
}()
}
if params.DSN != "" {
mux.HandleFunc("/newcrash/failure", handleFailureFn(params.DSN, filepath.Join(params.Dir, "failure_reports")))
mux.HandleFunc("/newcrash/failure", handleFailureFn(params.DSN, filepath.Join(params.Dir, "failure_reports"), ip))
}
log.SetOutput(os.Stdout)
@@ -83,7 +107,7 @@ func main() {
}
}
func handleFailureFn(dsn, failureDir string) func(w http.ResponseWriter, req *http.Request) {
func handleFailureFn(dsn, failureDir string, ignore *ignorePatterns) func(w http.ResponseWriter, req *http.Request) {
return func(w http.ResponseWriter, req *http.Request) {
result := "failure"
defer func() {
@@ -98,6 +122,11 @@ func handleFailureFn(dsn, failureDir string) func(w http.ResponseWriter, req *ht
return
}
if ignore.match(bs) {
result = "ignored"
return
}
var reports []ur.FailureReport
err = json.Unmarshal(bs, &reports)
if err != nil {
@@ -110,7 +139,7 @@ func handleFailureFn(dsn, failureDir string) func(w http.ResponseWriter, req *ht
return
}
version, err := parseVersion(reports[0].Version)
version, err := build.ParseVersion(reports[0].Version)
if err != nil {
http.Error(w, err.Error(), 400)
return
@@ -158,3 +187,42 @@ func saveFailureWithGoroutines(data ur.FailureData, failureDir string) (string,
}
return reportServer + path, nil
}
type ignorePatterns struct {
patterns []*regexp.Regexp
}
func loadIgnorePatterns(path string) (*ignorePatterns, error) {
bs, err := os.ReadFile(path)
if err != nil {
return nil, err
}
var patterns []*regexp.Regexp
for _, line := range strings.Split(string(bs), "\n") {
line = strings.TrimSpace(line)
if line == "" {
continue
}
re, err := regexp.Compile(line)
if err != nil {
return nil, err
}
patterns = append(patterns, re)
}
log.Printf("Loaded %d ignore patterns", len(patterns))
return &ignorePatterns{patterns: patterns}, nil
}
func (i *ignorePatterns) match(report []byte) bool {
if i == nil {
return false
}
for _, re := range i.patterns {
if re.Match(report) {
return true
}
}
return false
}

View File

@@ -18,6 +18,7 @@ import (
raven "github.com/getsentry/raven-go"
"github.com/maruel/panicparse/v2/stack"
"github.com/syncthing/syncthing/lib/build"
)
const reportServer = "https://crash.syncthing.net/report/"
@@ -105,7 +106,7 @@ func parseCrashReport(path string, report []byte) (*raven.Packet, error) {
return nil, errors.New("no first line")
}
version, err := parseVersion(string(parts[0]))
version, err := build.ParseVersion(string(parts[0]))
if err != nil {
return nil, err
}
@@ -143,12 +144,12 @@ func parseCrashReport(path string, report []byte) (*raven.Packet, error) {
}
// Lock the source code loader to the version we are processing here.
if version.commit != "" {
if version.Commit != "" {
// We have a commit hash, so we know exactly which source to use
loader.LockWithVersion(version.commit)
} else if strings.HasPrefix(version.tag, "v") {
loader.LockWithVersion(version.Commit)
} else if strings.HasPrefix(version.Tag, "v") {
// Lets hope the tag is close enough
loader.LockWithVersion(version.tag)
loader.LockWithVersion(version.Tag)
} else {
// Last resort
loader.LockWithVersion("main")
@@ -215,106 +216,26 @@ func crashReportFingerprint(message string) []string {
return []string{"{{ default }}", message}
}
// syncthing v1.1.4-rc.1+30-g6aaae618-dirty-crashrep "Erbium Earthworm" (go1.12.5 darwin-amd64) jb@kvin.kastelo.net 2019-05-23 16:08:14 UTC [foo, bar]
// or, somewhere along the way the "+" in the version tag disappeared:
// syncthing v1.23.7-dev.26.gdf7b56ae.dirty-stversionextra "Fermium Flea" (go1.20.5 darwin-arm64) jb@ok.kastelo.net 2023-07-12 06:55:26 UTC [Some Wrapper, purego, stnoupgrade]
var (
longVersionRE = regexp.MustCompile(`syncthing\s+(v[^\s]+)\s+"([^"]+)"\s\(([^\s]+)\s+([^-]+)-([^)]+)\)\s+([^\s]+)[^\[]*(?:\[(.+)\])?$`)
gitExtraRE = regexp.MustCompile(`\.\d+\.g[0-9a-f]+`) // ".1.g6aaae618"
gitExtraSepRE = regexp.MustCompile(`[.-]`) // dot or dash
)
type version struct {
version string // "v1.1.4-rc.1+30-g6aaae618-dirty-crashrep"
tag string // "v1.1.4-rc.1"
commit string // "6aaae618", blank when absent
codename string // "Erbium Earthworm"
runtime string // "go1.12.5"
goos string // "darwin"
goarch string // "amd64"
builder string // "jb@kvin.kastelo.net"
extra []string // "foo", "bar"
}
func (v version) environment() string {
if v.commit != "" {
return "Development"
}
if strings.Contains(v.tag, "-rc.") {
return "Candidate"
}
if strings.Contains(v.tag, "-") {
return "Beta"
}
return "Stable"
}
func parseVersion(line string) (version, error) {
m := longVersionRE.FindStringSubmatch(line)
if len(m) == 0 {
return version{}, errors.New("unintelligeble version string")
}
v := version{
version: m[1],
codename: m[2],
runtime: m[3],
goos: m[4],
goarch: m[5],
builder: m[6],
}
// Split the version tag into tag and commit. This is old style
// v1.2.3-something.4+11-g12345678 or newer with just dots
// v1.2.3-something.4.11.g12345678 or v1.2.3-dev.11.g12345678.
parts := []string{v.version}
if strings.Contains(v.version, "+") {
parts = strings.Split(v.version, "+")
} else {
idxs := gitExtraRE.FindStringIndex(v.version)
if len(idxs) > 0 {
parts = []string{v.version[:idxs[0]], v.version[idxs[0]+1:]}
}
}
v.tag = parts[0]
if len(parts) > 1 {
fields := gitExtraSepRE.Split(parts[1], -1)
if len(fields) >= 2 && strings.HasPrefix(fields[1], "g") {
v.commit = fields[1][1:]
}
}
if len(m) >= 8 && m[7] != "" {
tags := strings.Split(m[7], ",")
for i := range tags {
tags[i] = strings.TrimSpace(tags[i])
}
v.extra = tags
}
return v, nil
}
func packet(version version, reportType string) *raven.Packet {
func packet(version build.VersionParts, reportType string) *raven.Packet {
pkt := &raven.Packet{
Platform: "go",
Release: version.tag,
Environment: version.environment(),
Release: version.Tag,
Environment: version.Environment(),
Tags: raven.Tags{
raven.Tag{Key: "version", Value: version.version},
raven.Tag{Key: "tag", Value: version.tag},
raven.Tag{Key: "codename", Value: version.codename},
raven.Tag{Key: "runtime", Value: version.runtime},
raven.Tag{Key: "goos", Value: version.goos},
raven.Tag{Key: "goarch", Value: version.goarch},
raven.Tag{Key: "builder", Value: version.builder},
raven.Tag{Key: "version", Value: version.Version},
raven.Tag{Key: "tag", Value: version.Tag},
raven.Tag{Key: "codename", Value: version.Codename},
raven.Tag{Key: "runtime", Value: version.Runtime},
raven.Tag{Key: "goos", Value: version.GOOS},
raven.Tag{Key: "goarch", Value: version.GOARCH},
raven.Tag{Key: "builder", Value: version.Builder},
raven.Tag{Key: "report_type", Value: reportType},
},
}
if version.commit != "" {
pkt.Tags = append(pkt.Tags, raven.Tag{Key: "commit", Value: version.commit})
if version.Commit != "" {
pkt.Tags = append(pkt.Tags, raven.Tag{Key: "commit", Value: version.Commit})
}
for _, tag := range version.extra {
for _, tag := range version.Extra {
pkt.Tags = append(pkt.Tags, raven.Tag{Key: tag, Value: "1"})
}
return pkt

View File

@@ -12,66 +12,6 @@ import (
"testing"
)
func TestParseVersion(t *testing.T) {
cases := []struct {
longVersion string
parsed version
}{
{
longVersion: `syncthing v1.1.4-rc.1+30-g6aaae618-dirty-crashrep "Erbium Earthworm" (go1.12.5 darwin-amd64) jb@kvin.kastelo.net 2019-05-23 16:08:14 UTC`,
parsed: version{
version: "v1.1.4-rc.1+30-g6aaae618-dirty-crashrep",
tag: "v1.1.4-rc.1",
commit: "6aaae618",
codename: "Erbium Earthworm",
runtime: "go1.12.5",
goos: "darwin",
goarch: "amd64",
builder: "jb@kvin.kastelo.net",
},
},
{
longVersion: `syncthing v1.1.4-rc.1+30-g6aaae618-dirty-crashrep "Erbium Earthworm" (go1.12.5 darwin-amd64) jb@kvin.kastelo.net 2019-05-23 16:08:14 UTC [foo, bar]`,
parsed: version{
version: "v1.1.4-rc.1+30-g6aaae618-dirty-crashrep",
tag: "v1.1.4-rc.1",
commit: "6aaae618",
codename: "Erbium Earthworm",
runtime: "go1.12.5",
goos: "darwin",
goarch: "amd64",
builder: "jb@kvin.kastelo.net",
extra: []string{"foo", "bar"},
},
},
{
longVersion: `syncthing v1.23.7-dev.26.gdf7b56ae-stversionextra "Fermium Flea" (go1.20.5 darwin-arm64) jb@ok.kastelo.net 2023-07-12 06:55:26 UTC [Some Wrapper, purego, stnoupgrade]`,
parsed: version{
version: "v1.23.7-dev.26.gdf7b56ae-stversionextra",
tag: "v1.23.7-dev",
commit: "df7b56ae",
codename: "Fermium Flea",
runtime: "go1.20.5",
goos: "darwin",
goarch: "arm64",
builder: "jb@ok.kastelo.net",
extra: []string{"Some Wrapper", "purego", "stnoupgrade"},
},
},
}
for _, tc := range cases {
v, err := parseVersion(tc.longVersion)
if err != nil {
t.Errorf("%s\nerror: %v\n", tc.longVersion, err)
continue
}
if fmt.Sprint(v) != fmt.Sprint(tc.parsed) {
t.Errorf("%s\nA: %v\nE: %v\n", tc.longVersion, v, tc.parsed)
}
}
}
func TestParseReport(t *testing.T) {
bs, err := os.ReadFile("_testdata/panic.log")
if err != nil {

View File

@@ -12,11 +12,16 @@ import (
"net/http"
"path"
"strings"
"sync"
)
type crashReceiver struct {
store *diskStore
sentry *sentryService
ignore *ignorePatterns
ignoredMut sync.RWMutex
ignored map[string]struct{}
}
func (r *crashReceiver) ServeHTTP(w http.ResponseWriter, req *http.Request) {
@@ -64,6 +69,12 @@ func (r *crashReceiver) serveGet(reportID string, w http.ResponseWriter, _ *http
// serveHead responds to HEAD requests by checking if the named report
// already exists in the system.
func (r *crashReceiver) serveHead(reportID string, w http.ResponseWriter, _ *http.Request) {
r.ignoredMut.RLock()
_, ignored := r.ignored[reportID]
r.ignoredMut.RUnlock()
if ignored {
return // found
}
if !r.store.Exists(reportID) {
http.Error(w, "Not found", http.StatusNotFound)
}
@@ -76,6 +87,15 @@ func (r *crashReceiver) servePut(reportID string, w http.ResponseWriter, req *ht
metricCrashReportsTotal.WithLabelValues(result).Inc()
}()
r.ignoredMut.RLock()
_, ignored := r.ignored[reportID]
r.ignoredMut.RUnlock()
if ignored {
result = "ignored_cached"
io.Copy(io.Discard, req.Body)
return // found
}
// Read at most maxRequestSize of report data.
log.Println("Receiving report", reportID)
lr := io.LimitReader(req.Body, maxRequestSize)
@@ -86,6 +106,17 @@ func (r *crashReceiver) servePut(reportID string, w http.ResponseWriter, req *ht
return
}
if r.ignore.match(bs) {
r.ignoredMut.Lock()
if r.ignored == nil {
r.ignored = make(map[string]struct{})
}
r.ignored[reportID] = struct{}{}
r.ignoredMut.Unlock()
result = "ignored"
return
}
result = "success"
// Store the report

246
cmd/stdiscosrv/amqp.go Normal file
View File

@@ -0,0 +1,246 @@
// Copyright (C) 2024 The Syncthing Authors.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.
package main
import (
"context"
"fmt"
"io"
amqp "github.com/rabbitmq/amqp091-go"
"github.com/thejerf/suture/v4"
)
type amqpReplicator struct {
suture.Service
broker string
sender *amqpSender
receiver *amqpReceiver
outbox chan ReplicationRecord
}
func newAMQPReplicator(broker, clientID string, db database) *amqpReplicator {
svc := suture.New("amqpReplicator", suture.Spec{PassThroughPanics: true})
sender := &amqpSender{
broker: broker,
clientID: clientID,
outbox: make(chan ReplicationRecord, replicationOutboxSize),
}
svc.Add(sender)
receiver := &amqpReceiver{
broker: broker,
clientID: clientID,
db: db,
}
svc.Add(receiver)
return &amqpReplicator{
Service: svc,
broker: broker,
sender: sender,
receiver: receiver,
outbox: make(chan ReplicationRecord, replicationOutboxSize),
}
}
func (s *amqpReplicator) send(key string, ps []DatabaseAddress, seen int64) {
s.sender.send(key, ps, seen)
}
type amqpSender struct {
broker string
clientID string
outbox chan ReplicationRecord
}
func (s *amqpSender) Serve(ctx context.Context) error {
conn, ch, err := amqpChannel(s.broker)
if err != nil {
return err
}
defer ch.Close()
defer conn.Close()
buf := make([]byte, 1024)
for {
select {
case rec := <-s.outbox:
size := rec.Size()
if len(buf) < size {
buf = make([]byte, size)
}
n, err := rec.MarshalTo(buf)
if err != nil {
replicationSendsTotal.WithLabelValues("error").Inc()
return fmt.Errorf("replication marshal: %w", err)
}
err = ch.PublishWithContext(ctx,
"discovery", // exchange
"", // routing key
false, // mandatory
false, // immediate
amqp.Publishing{
ContentType: "application/protobuf",
Body: buf[:n],
AppId: s.clientID,
})
if err != nil {
replicationSendsTotal.WithLabelValues("error").Inc()
return fmt.Errorf("replication publish: %w", err)
}
replicationSendsTotal.WithLabelValues("success").Inc()
case <-ctx.Done():
return nil
}
}
}
func (s *amqpSender) String() string {
return fmt.Sprintf("amqpSender(%q)", s.broker)
}
func (s *amqpSender) send(key string, ps []DatabaseAddress, seen int64) {
item := ReplicationRecord{
Key: key,
Addresses: ps,
Seen: seen,
}
// The send should never block. The inbox is suitably buffered for at
// least a few seconds of stalls, which shouldn't happen in practice.
select {
case s.outbox <- item:
default:
replicationSendsTotal.WithLabelValues("drop").Inc()
}
}
type amqpReceiver struct {
broker string
clientID string
db database
}
func (s *amqpReceiver) Serve(ctx context.Context) error {
conn, ch, err := amqpChannel(s.broker)
if err != nil {
return err
}
defer ch.Close()
defer conn.Close()
msgs, err := amqpConsume(ch)
if err != nil {
return err
}
for {
select {
case msg, ok := <-msgs:
if !ok {
return fmt.Errorf("subscription closed: %w", io.EOF)
}
// ignore messages from ourself
if msg.AppId == s.clientID {
continue
}
var rec ReplicationRecord
if err := rec.Unmarshal(msg.Body); err != nil {
replicationRecvsTotal.WithLabelValues("error").Inc()
return fmt.Errorf("replication unmarshal: %w", err)
}
if err := s.db.merge(rec.Key, rec.Addresses, rec.Seen); err != nil {
return fmt.Errorf("replication database merge: %w", err)
}
replicationRecvsTotal.WithLabelValues("success").Inc()
case <-ctx.Done():
return nil
}
}
}
func (s *amqpReceiver) String() string {
return fmt.Sprintf("amqpReceiver(%q)", s.broker)
}
func amqpChannel(dst string) (*amqp.Connection, *amqp.Channel, error) {
conn, err := amqp.Dial(dst)
if err != nil {
return nil, nil, fmt.Errorf("AMQP dial: %w", err)
}
ch, err := conn.Channel()
if err != nil {
return nil, nil, fmt.Errorf("AMQP channel: %w", err)
}
err = ch.ExchangeDeclare(
"discovery", // name
"fanout", // type
false, // durable
false, // auto-deleted
false, // internal
false, // no-wait
nil, // arguments
)
if err != nil {
return nil, nil, fmt.Errorf("AMQP declare exchange: %w", err)
}
return conn, ch, nil
}
func amqpConsume(ch *amqp.Channel) (<-chan amqp.Delivery, error) {
q, err := ch.QueueDeclare(
"", // name
false, // durable
false, // delete when unused
true, // exclusive
false, // no-wait
nil, // arguments
)
if err != nil {
return nil, fmt.Errorf("AMQP declare queue: %w", err)
}
err = ch.QueueBind(
q.Name, // queue name
"", // routing key
"discovery", // exchange
false,
nil,
)
if err != nil {
return nil, fmt.Errorf("AMQP bind queue: %w", err)
}
msgs, err := ch.Consume(
q.Name, // queue
"", // consumer
true, // auto-ack
false, // exclusive
false, // no-local
false, // no-wait
nil, // args
)
if err != nil {
return nil, fmt.Errorf("AMQP consume: %w", err)
}
return msgs, nil
}

View File

@@ -39,12 +39,13 @@ type announcement struct {
}
type apiSrv struct {
addr string
cert tls.Certificate
db database
listener net.Listener
repl replicator // optional
useHTTP bool
addr string
cert tls.Certificate
db database
listener net.Listener
repl replicator // optional
useHTTP bool
missesIncrease int
mapsMut sync.Mutex
misses map[string]int32
@@ -60,14 +61,15 @@ type contextKey int
const idKey contextKey = iota
func newAPISrv(addr string, cert tls.Certificate, db database, repl replicator, useHTTP bool) *apiSrv {
func newAPISrv(addr string, cert tls.Certificate, db database, repl replicator, useHTTP bool, missesIncrease int) *apiSrv {
return &apiSrv{
addr: addr,
cert: cert,
db: db,
repl: repl,
useHTTP: useHTTP,
misses: make(map[string]int32),
addr: addr,
cert: cert,
db: db,
repl: repl,
useHTTP: useHTTP,
misses: make(map[string]int32),
missesIncrease: missesIncrease,
}
}
@@ -197,14 +199,13 @@ func (s *apiSrv) handleGET(w http.ResponseWriter, req *http.Request) {
s.mapsMut.Lock()
misses := s.misses[key]
if misses < rec.Misses {
misses = rec.Misses + 1
} else {
misses++
misses = rec.Misses
}
misses += int32(s.missesIncrease)
s.misses[key] = misses
s.mapsMut.Unlock()
if misses%notFoundMissesWriteInterval == 0 {
if misses >= notFoundMissesWriteInterval {
rec.Misses = misses
rec.Missed = time.Now().UnixNano()
rec.Addresses = nil
@@ -444,7 +445,6 @@ func fixupAddresses(remote *net.TCPAddr, addresses []string) []string {
// remote is nil, unable to determine host IP
continue
}
}
// If zero port was specified, use remote port.

View File

@@ -22,6 +22,7 @@ import (
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/rand"
"github.com/syncthing/syncthing/lib/tlsutil"
"github.com/syndtr/goleveldb/leveldb/opt"
"github.com/thejerf/suture/v4"
@@ -80,6 +81,8 @@ func main() {
var replKeyFile string
var useHTTP bool
var largeDB bool
var amqpAddress string
missesIncrease := 1
log.SetOutput(os.Stdout)
log.SetFlags(0)
@@ -96,6 +99,8 @@ func main() {
flag.StringVar(&replCertFile, "replication-cert", "", "Certificate file for replication")
flag.StringVar(&replKeyFile, "replication-key", "", "Key file for replication")
flag.BoolVar(&largeDB, "large-db", false, "Use larger database settings")
flag.StringVar(&amqpAddress, "amqp-address", "", "Address to AMQP broker")
flag.IntVar(&missesIncrease, "misses-increase", 1, "How many times to increase the misses counter on each miss")
showVersion := flag.Bool("version", false, "Show version")
flag.Parse()
@@ -203,8 +208,24 @@ func main() {
main.Add(rl)
}
// If we have an AMQP broker, start that
if amqpAddress != "" {
clientID := rand.String(10)
kr := newAMQPReplicator(amqpAddress, clientID, db)
repl = append(repl, kr)
main.Add(kr)
}
go func() {
for range time.NewTicker(time.Second).C {
for _, r := range repl {
r.send("<heartbeat>", nil, time.Now().UnixNano())
}
}
}()
// Start the main API server.
qs := newAPISrv(listen, cert, db, repl, useHTTP)
qs := newAPISrv(listen, cert, db, repl, useHTTP, missesIncrease)
main.Add(qs)
// If we have a metrics port configured, start a metrics handler.

View File

@@ -144,10 +144,11 @@ func (s *replicationSender) String() string {
return fmt.Sprintf("replicationSender(%q)", s.dst)
}
func (s *replicationSender) send(key string, ps []DatabaseAddress, _ int64) {
func (s *replicationSender) send(key string, ps []DatabaseAddress, seen int64) {
item := ReplicationRecord{
Key: key,
Addresses: ps,
Seen: seen,
}
// The send should never block. The inbox is suitably buffered for at

View File

@@ -7,10 +7,7 @@
package main
import (
"os"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/collectors"
)
var (
@@ -127,15 +124,4 @@ func init() {
databaseKeys, databaseStatisticsSeconds,
databaseOperations, databaseOperationSeconds,
retryAfterHistogram)
processCollectorOpts := collectors.ProcessCollectorOpts{
Namespace: "syncthing_discovery",
PidFn: func() (int, error) {
return os.Getpid(), nil
},
}
prometheus.MustRegister(
collectors.NewProcessCollector(processCollectorOpts),
)
}

View File

@@ -259,7 +259,7 @@
return a.value > b.value ? 1 : -1;
}
$http.get("/endpoint").then(function(response) {
$http.get("/endpoint/full").then(function(response) {
$scope.relays = response.data.relays;
angular.forEach($scope.relays, function(relay) {
@@ -338,7 +338,7 @@
relay.showMarker = function() {
relay.marker.openPopup();
}
relay.hideMarker = function() {
relay.marker.closePopup();
}
@@ -347,7 +347,7 @@
function addCircleToMap(relay) {
console.log(relay.location.latitude)
L.circle([relay.location.latitude, relay.location.longitude],
L.circle([relay.location.latitude, relay.location.longitude],
{
radius: ((relay.stats.bytesProxied * 100) / $scope.totals.bytesProxied) * 10000,
color: "FF0000",

View File

@@ -27,9 +27,7 @@ import (
"github.com/syncthing/syncthing/lib/assets"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/geoip"
"github.com/syncthing/syncthing/lib/httpcache"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/rand"
"github.com/syncthing/syncthing/lib/relay/client"
"github.com/syncthing/syncthing/lib/sync"
"github.com/syncthing/syncthing/lib/tlsutil"
@@ -51,6 +49,10 @@ type relay struct {
StatsRetrieved time.Time `json:"statsRetrieved"`
}
type relayShort struct {
URL string `json:"url"`
}
type stats struct {
StartTime time.Time `json:"startTime"`
UptimeSeconds int `json:"uptimeSeconds"`
@@ -95,6 +97,7 @@ var (
testCert tls.Certificate
knownRelaysFile = filepath.Join(os.TempDir(), "strelaypoolsrv_known_relays")
listen = ":80"
metricsListen = ":8081"
dir string
evictionTime = time.Hour
debug bool
@@ -125,6 +128,7 @@ func main() {
log.SetFlags(log.Lshortfile)
flag.StringVar(&listen, "listen", listen, "Listen address")
flag.StringVar(&metricsListen, "metrics-listen", metricsListen, "Metrics listen address")
flag.StringVar(&dir, "keys", dir, "Directory where http-cert.pem and http-key.pem is stored for TLS listening")
flag.BoolVar(&debug, "debug", debug, "Enable debug output")
flag.DurationVar(&evictionTime, "eviction", evictionTime, "After how long the relay is evicted")
@@ -218,15 +222,40 @@ func main() {
log.Fatalln("listen:", err)
}
handler := http.NewServeMux()
handler.HandleFunc("/", handleAssets)
handler.Handle("/endpoint", httpcache.SinglePath(http.HandlerFunc(handleRequest), 15*time.Second))
handler.HandleFunc("/metrics", handleMetrics)
if metricsListen != "" {
mmux := http.NewServeMux()
mmux.HandleFunc("/metrics", handleMetrics)
go func() {
if err := http.ListenAndServe(metricsListen, mmux); err != nil {
log.Fatalln("HTTP serve metrics:", err)
}
}()
}
getMux := http.NewServeMux()
getMux.HandleFunc("/", handleAssets)
getMux.HandleFunc("/endpoint", withAPIMetrics(handleEndpointShort))
getMux.HandleFunc("/endpoint/full", withAPIMetrics(handleEndpointFull))
postMux := http.NewServeMux()
postMux.HandleFunc("/endpoint", withAPIMetrics(handleRegister))
handler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet, http.MethodHead, http.MethodOptions:
getMux.ServeHTTP(w, r)
case http.MethodPost:
postMux.ServeHTTP(w, r)
default:
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
}
})
srv := http.Server{
Handler: handler,
ReadTimeout: 10 * time.Second,
}
srv.SetKeepAlivesEnabled(false)
err = srv.Serve(listener)
if err != nil {
@@ -260,39 +289,24 @@ func handleAssets(w http.ResponseWriter, r *http.Request) {
assets.Serve(w, r, as)
}
func handleRequest(w http.ResponseWriter, r *http.Request) {
timer := prometheus.NewTimer(apiRequestsSeconds.WithLabelValues(r.Method))
w = NewLoggingResponseWriter(w)
defer func() {
timer.ObserveDuration()
lw := w.(*loggingResponseWriter)
apiRequestsTotal.WithLabelValues(r.Method, strconv.Itoa(lw.statusCode)).Inc()
}()
if ipHeader != "" {
hdr := r.Header.Get(ipHeader)
fields := strings.Split(hdr, ",")
if len(fields) > 0 {
r.RemoteAddr = strings.TrimSpace(fields[len(fields)-1])
}
}
w.Header().Set("Access-Control-Allow-Origin", "*")
switch r.Method {
case "GET":
handleGetRequest(w, r)
case "POST":
handlePostRequest(w, r)
default:
if debug {
log.Println("Unhandled HTTP method", r.Method)
}
http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
func withAPIMetrics(next http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {
timer := prometheus.NewTimer(apiRequestsSeconds.WithLabelValues(r.Method))
w = NewLoggingResponseWriter(w)
defer func() {
timer.ObserveDuration()
lw := w.(*loggingResponseWriter)
apiRequestsTotal.WithLabelValues(r.Method, strconv.Itoa(lw.statusCode)).Inc()
}()
next(w, r)
}
}
func handleGetRequest(rw http.ResponseWriter, r *http.Request) {
// handleEndpointFull returns the relay list with full metadata and
// statistics. Large, and expensive.
func handleEndpointFull(rw http.ResponseWriter, r *http.Request) {
rw.Header().Set("Content-Type", "application/json; charset=utf-8")
rw.Header().Set("Access-Control-Allow-Origin", "*")
mut.RLock()
relays := make([]*relay, len(permanentRelays)+len(knownRelays))
@@ -300,17 +314,38 @@ func handleGetRequest(rw http.ResponseWriter, r *http.Request) {
copy(relays[n:], knownRelays)
mut.RUnlock()
// Shuffle
rand.Shuffle(relays)
_ = json.NewEncoder(rw).Encode(map[string][]*relay{
"relays": relays,
})
}
func handlePostRequest(w http.ResponseWriter, r *http.Request) {
// handleEndpointShort returns the relay list with only the URL.
func handleEndpointShort(rw http.ResponseWriter, r *http.Request) {
rw.Header().Set("Content-Type", "application/json; charset=utf-8")
rw.Header().Set("Access-Control-Allow-Origin", "*")
mut.RLock()
relays := make([]relayShort, 0, len(permanentRelays)+len(knownRelays))
for _, r := range append(permanentRelays, knownRelays...) {
relays = append(relays, relayShort{URL: slimURL(r.URL)})
}
mut.RUnlock()
_ = json.NewEncoder(rw).Encode(map[string][]relayShort{
"relays": relays,
})
}
func handleRegister(w http.ResponseWriter, r *http.Request) {
// Get the IP address of the client
rhost := r.RemoteAddr
if ipHeader != "" {
hdr := r.Header.Get(ipHeader)
fields := strings.Split(hdr, ",")
if len(fields) > 0 {
rhost = strings.TrimSpace(fields[len(fields)-1])
}
}
if host, _, err := net.SplitHostPort(rhost); err == nil {
rhost = host
}
@@ -660,3 +695,16 @@ func (b *errorTracker) IsBlocked(host string) bool {
}
return false
}
func slimURL(u string) string {
p, err := url.Parse(u)
if err != nil {
return u
}
newQuery := url.Values{}
if id := p.Query().Get("id"); id != "" {
newQuery.Set("id", id)
}
p.RawQuery = newQuery.Encode()
return p.String()
}

View File

@@ -42,7 +42,7 @@ func TestHandleGetRequest(t *testing.T) {
w := httptest.NewRecorder()
w.Body = new(bytes.Buffer)
handleGetRequest(w, httptest.NewRequest("GET", "/", nil))
handleEndpointFull(w, httptest.NewRequest("GET", "/", nil))
result := make(map[string][]*relay)
err := json.NewDecoder(w.Body).Decode(&result)
@@ -92,3 +92,18 @@ func TestCanonicalizeQueryValues(t *testing.T) {
t.Errorf("expected %q, got %q", exp, str)
}
}
func TestSlimURL(t *testing.T) {
cases := []struct {
in, out string
}{
{"http://example.com/", "http://example.com/"},
{"relay://192.0.2.42:22067/?globalLimitBps=0&id=EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M&networkTimeout=2m0s&pingInterval=1m0s&providedBy=Test&sessionLimitBps=0&statusAddr=%3A22070", "relay://192.0.2.42:22067/?id=EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M-EIC6B3M"},
}
for _, c := range cases {
if got := slimURL(c.in); got != c.out {
t.Errorf("expected %q, got %q", c.out, got)
}
}
}

View File

@@ -6,27 +6,12 @@ import (
"encoding/json"
"net"
"net/http"
"os"
"time"
"github.com/prometheus/client_golang/prometheus"
"github.com/prometheus/client_golang/prometheus/collectors"
"github.com/syncthing/syncthing/lib/sync"
)
func init() {
processCollectorOpts := collectors.ProcessCollectorOpts{
Namespace: "syncthing_relaypoolsrv",
PidFn: func() (int, error) {
return os.Getpid(), nil
},
}
prometheus.MustRegister(
collectors.NewProcessCollector(processCollectorOpts),
)
}
var (
statusClient = http.Client{
Timeout: 5 * time.Second,

View File

@@ -19,16 +19,18 @@ import (
"time"
"github.com/alecthomas/kong"
"github.com/prometheus/client_golang/prometheus/promhttp"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/httpcache"
"github.com/syncthing/syncthing/lib/upgrade"
)
type cli struct {
Listen string `default:":8080" help:"Listen address"`
URL string `short:"u" default:"https://api.github.com/repos/syncthing/syncthing/releases?per_page=25" help:"GitHub releases url"`
Forward []string `short:"f" help:"Forwarded pages, format: /path->https://example/com/url"`
CacheTime time.Duration `default:"15m" help:"Cache time"`
Listen string `default:":8080" help:"Listen address"`
MetricsListen string `default:":8081" help:"Listen address for metrics"`
URL string `short:"u" default:"https://api.github.com/repos/syncthing/syncthing/releases?per_page=25" help:"GitHub releases url"`
Forward []string `short:"f" help:"Forwarded pages, format: /path->https://example/com/url"`
CacheTime time.Duration `default:"15m" help:"Cache time"`
}
func main() {
@@ -41,17 +43,37 @@ func main() {
}
func server(params *cli) error {
http.Handle("/meta.json", httpcache.SinglePath(&githubReleases{url: params.URL}, params.CacheTime))
if params.MetricsListen != "" {
mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler())
go func() {
log.Println("Listening for metrics on", params.MetricsListen)
if err := http.ListenAndServe(params.MetricsListen, mux); err != nil {
log.Fatalf("Failed to start metrics server: %v", err)
}
}()
}
mux := http.NewServeMux()
mux.Handle("/meta.json", httpcache.SinglePath(&githubReleases{url: params.URL}, params.CacheTime))
for _, fwd := range params.Forward {
path, url, ok := strings.Cut(fwd, "->")
if !ok {
return fmt.Errorf("invalid forward: %q", fwd)
}
http.Handle(path, httpcache.SinglePath(&proxy{url: url}, params.CacheTime))
log.Println("Forwarding", path, "to", url)
mux.Handle(path, httpcache.SinglePath(&proxy{url: url}, params.CacheTime))
}
return http.ListenAndServe(params.Listen, nil)
srv := &http.Server{
Addr: params.Listen,
Handler: mux,
ReadTimeout: 5 * time.Second,
WriteTimeout: 10 * time.Second,
}
srv.SetKeepAlivesEnabled(false)
return srv.ListenAndServe()
}
type githubReleases struct {

View File

@@ -1,11 +0,0 @@
[Unit]
Description=Restart Syncthing after resume
Documentation=man:syncthing(1)
After=sleep.target
[Service]
Type=oneshot
ExecStart=-/usr/bin/pkill -HUP -x syncthing
[Install]
WantedBy=sleep.target

19
go.mod
View File

@@ -15,7 +15,7 @@ require (
github.com/go-ldap/ldap/v3 v3.4.8
github.com/gobwas/glob v0.2.3
github.com/gogo/protobuf v1.3.2
github.com/greatroar/blobloom v0.7.2
github.com/greatroar/blobloom v0.8.0
github.com/hashicorp/golang-lru/v2 v2.0.7
github.com/jackpal/gateway v1.0.15
github.com/jackpal/go-nat-pmp v1.0.2
@@ -27,12 +27,13 @@ require (
github.com/maxmind/geoipupdate/v6 v6.1.0
github.com/minio/sha256-simd v1.0.1
github.com/miscreant/miscreant.go v0.0.0-20200214223636-26d376326b75
github.com/oschwald/geoip2-golang v1.9.0
github.com/oschwald/geoip2-golang v1.11.0
github.com/pierrec/lz4/v4 v4.1.21
github.com/prometheus/client_golang v1.19.1
github.com/quic-go/quic-go v0.44.0
github.com/rabbitmq/amqp091-go v1.10.0
github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475
github.com/shirou/gopsutil/v3 v3.24.4
github.com/shirou/gopsutil/v3 v3.24.5
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.5
@@ -63,28 +64,28 @@ require (
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/gofrs/flock v0.8.1 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/pprof v0.0.0-20240521024322-9665fa269a30 // indirect
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/errwrap v1.1.0 // indirect
github.com/hashicorp/go-multierror v1.1.1 // indirect
github.com/klauspost/cpuid/v2 v2.2.7 // indirect
github.com/nxadm/tail v1.4.11 // indirect
github.com/onsi/ginkgo/v2 v2.17.3 // indirect
github.com/oschwald/maxminddb-golang v1.12.0 // indirect
github.com/onsi/ginkgo/v2 v2.19.0 // indirect
github.com/oschwald/maxminddb-golang v1.13.0 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/posener/complete v1.2.3 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/prometheus/client_model v0.6.1 // indirect
github.com/prometheus/common v0.53.0 // indirect
github.com/prometheus/procfs v0.15.0 // indirect
github.com/prometheus/common v0.54.0 // indirect
github.com/prometheus/procfs v0.15.1 // indirect
github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stretchr/testify v1.9.0 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.uber.org/mock v0.4.0 // indirect
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 // indirect
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc // indirect
golang.org/x/mod v0.17.0 // indirect
golang.org/x/sync v0.7.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect

54
go.sum
View File

@@ -81,20 +81,18 @@ github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMyw
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
github.com/google/go-cmp v0.6.0/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-20240521024322-9665fa269a30 h1:r6YdmbD41tGHeCWDyHF691LWtL7D1iSTyJaKejTWwVU=
github.com/google/pprof v0.0.0-20240521024322-9665fa269a30/go.mod h1:kf6iHlnVGwgKolg33glAes7Yg/8iWP8ukqeldJSO7jw=
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba h1:ql1qNgCyOB7iAEk8JTNM+zJrgIbnyCKX/wdlyPufP5g=
github.com/google/pprof v0.0.0-20240528025155-186aa0362fba/go.mod h1:K1liHPHnj73Fdn/EKuT8nrFqBihUSKXoLYU0BuatOYo=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4=
github.com/gorilla/sessions v1.2.1/go.mod h1:dk2InVEVJ0sfLlnXv9EAgkf6ecYs/i80K/zI+bUmuGM=
github.com/greatroar/blobloom v0.7.2 h1:F30MGLHOcb4zr0pwCPTcKdlTM70rEgkf+LzdUPc5ss8=
github.com/greatroar/blobloom v0.7.2/go.mod h1:mjMJ1hh1wjGVfr93QIHJ6FfDNVrA0IELv8OvMHJxHKs=
github.com/greatroar/blobloom v0.8.0 h1:I9RlEkfqK9/6f1v9mFmDYegDQ/x0mISCpiNpAm23Pt4=
github.com/greatroar/blobloom v0.8.0/go.mod h1:mjMJ1hh1wjGVfr93QIHJ6FfDNVrA0IELv8OvMHJxHKs=
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
@@ -140,7 +138,6 @@ github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY=
github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE=
github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lufia/plan9stats v0.0.0-20211012122336-39d0f177ccd0/go.mod h1:zJYVVT2jmtg6P3p1VtQj7WsuWi/y4VnjVBn7F8KPB3I=
github.com/maruel/panicparse/v2 v2.3.1 h1:NtJavmbMn0DyzmmSStE8yUsmPZrZmudPH7kplxBinOA=
github.com/maruel/panicparse/v2 v2.3.1/go.mod h1:s3UmQB9Fm/n7n/prcD2xBGDkwXD6y2LeZnhbEXvs9Dg=
github.com/mattn/go-colorable v0.1.12/go.mod h1:u5H1YNBxpqRaxsYJYSkiCWKzEfiAb1Gb520KVy5xxl4=
@@ -164,18 +161,18 @@ 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.17.3 h1:oJcvKpIb7/8uLpDDtnQuf18xVnwKp8DTD7DQ6gTd/MU=
github.com/onsi/ginkgo/v2 v2.17.3/go.mod h1:nP2DPOQoNsQmsVyv5rDA8JkXQoCs6goXIvr/PRJ1eCc=
github.com/onsi/ginkgo/v2 v2.19.0 h1:9Cnnf7UHo57Hy3k6/m5k3dRfGTMXGvxhHFvkDTCTpvA=
github.com/onsi/ginkgo/v2 v2.19.0/go.mod h1:rlwLi9PilAFJ8jCg9UE1QP6VBpd6/xj3SRC0d6TU0To=
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=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
github.com/onsi/gomega v1.33.0 h1:snPCflnZrpMsy94p4lXVEkHo12lmPnc3vY5XBbreexE=
github.com/onsi/gomega v1.33.0/go.mod h1:+925n5YtiFsLzzafLUHzVMBpvvRAzrydIBiSIxjX3wY=
github.com/oschwald/geoip2-golang v1.9.0 h1:uvD3O6fXAXs+usU+UGExshpdP13GAqp4GBrzN7IgKZc=
github.com/oschwald/geoip2-golang v1.9.0/go.mod h1:BHK6TvDyATVQhKNbQBdrj9eAvuwOMi2zSFXizL3K81Y=
github.com/oschwald/maxminddb-golang v1.12.0 h1:9FnTOD0YOhP7DGxGsq4glzpGy5+w7pq50AS6wALUMYs=
github.com/oschwald/maxminddb-golang v1.12.0/go.mod h1:q0Nob5lTCqyQ8WT6FYgS1L7PXKVVbgiymefNwIjPzgY=
github.com/onsi/gomega v1.33.1 h1:dsYjIxxSR755MDmKVsaFQTE22ChNBcuuTWgkUDSubOk=
github.com/onsi/gomega v1.33.1/go.mod h1:U4R44UsT+9eLIaYRB2a5qajjtQYn0hauxvRm16AVYg0=
github.com/oschwald/geoip2-golang v1.11.0 h1:hNENhCn1Uyzhf9PTmquXENiWS6AlxAEnBII6r8krA3w=
github.com/oschwald/geoip2-golang v1.11.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo=
github.com/oschwald/maxminddb-golang v1.13.0 h1:R8xBorY71s84yO06NgTmQvqvTvlS/bnYZrrWX1MElnU=
github.com/oschwald/maxminddb-golang v1.13.0/go.mod h1:BU0z8BfFVhi1LQaonTwwGQlsHUEu9pWNdMfmq4ztm0o=
github.com/pierrec/lz4/v4 v4.1.21 h1:yOVMLb6qSIDP67pl/5F7RepeKYu/VmTyEXvuMI5d9mQ=
github.com/pierrec/lz4/v4 v4.1.21/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -185,7 +182,6 @@ github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZb
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo=
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
github.com/power-devops/perfstat v0.0.0-20210106213030-5aafc221ea8c/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
@@ -194,12 +190,14 @@ github.com/prometheus/client_golang v1.19.1 h1:wZWJDwK+NameRJuPGDhlnFgx8e8HN3XHQ
github.com/prometheus/client_golang v1.19.1/go.mod h1:mP78NwGzrVks5S2H6ab8+ZZGJLZUq1hoULYBAYBw1Ho=
github.com/prometheus/client_model v0.6.1 h1:ZKSh/rekM+n3CeS952MLRAdFwIKqeY8b62p8ais2e9E=
github.com/prometheus/client_model v0.6.1/go.mod h1:OrxVMOVHjw3lKMa8+x6HeMGkHMQyHDk9E3jmP2AmGiY=
github.com/prometheus/common v0.53.0 h1:U2pL9w9nmJwJDa4qqLQ3ZaePJ6ZTwt7cMD3AG3+aLCE=
github.com/prometheus/common v0.53.0/go.mod h1:BrxBKv3FWBIGXw89Mg1AeBq7FSyRzXWI3l3e7W3RN5U=
github.com/prometheus/procfs v0.15.0 h1:A82kmvXJq2jTu5YUhSGNlYoxh85zLnKgPz4bMZgI5Ek=
github.com/prometheus/procfs v0.15.0/go.mod h1:Y0RJ/Y5g5wJpkTisOtqwDSo4HwhGmLB4VQSw2sQJLHk=
github.com/prometheus/common v0.54.0 h1:ZlZy0BgJhTwVZUn7dLOkwCZHUkrAqd3WYtcFCWnM1D8=
github.com/prometheus/common v0.54.0/go.mod h1:/TQgMJP5CuVYveyT7n/0Ix8yLNNXy9yRSkhnLTHPDIQ=
github.com/prometheus/procfs v0.15.1 h1:YagwOFzUgYfKKHX6Dr+sHT7km/hxC76UB0learggepc=
github.com/prometheus/procfs v0.15.1/go.mod h1:fB45yRUv8NstnjriLhBQLuOUt+WW4BsoGhij/e3PBqk=
github.com/quic-go/quic-go v0.44.0 h1:So5wOr7jyO4vzL2sd8/pD9Kesciv91zSk8BoFngItQ0=
github.com/quic-go/quic-go v0.44.0/go.mod h1:z4cx/9Ny9UtGITIPzmPTXh1ULfOyWh4qGQlpnPcWmek=
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
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/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab h1:ZjX6I48eZSFetPb41dHudEyVr5v953N15TsNZXlkcWY=
@@ -210,10 +208,8 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8=
github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM=
github.com/shirou/gopsutil/v3 v3.24.4 h1:dEHgzZXt4LMNm+oYELpzl9YCqV65Yr/6SfrvgRBtXeU=
github.com/shirou/gopsutil/v3 v3.24.4/go.mod h1:lTd2mdiOspcqLgAnr9/nGi71NkeMpWKdmhuxm9GusH8=
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/shirou/gopsutil/v3 v3.24.5 h1:i0t8kL+kQTvpAYToeuiVk3TgDeKOFioZO3Ztz/iZ9pI=
github.com/shirou/gopsutil/v3 v3.24.5/go.mod h1:bsoOS1aStSs9ErQ1WWfxllSeS1K5D+U30r2NfcubMVk=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -234,8 +230,6 @@ github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDd
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
github.com/thejerf/suture/v4 v4.0.5 h1:F1E/4FZwXWqvlWDKEUo6/ndLtxGAUzMmNqkrMknZbAA=
github.com/thejerf/suture/v4 v4.0.5/go.mod h1:gu9Y4dXNUWFrByqRt30Rm9/UZ0wzRSt9AJS6xu/ZGxU=
github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI=
github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.15 h1:nuqt+pdC/KqswQKhETJjo7pvn/k4xMUxgW6liI7XpnM=
github.com/urfave/cli v1.22.15/go.mod h1:wSan1hmo5zeyLGBjRJbzRTNk8gwoYa2B9n4q9dmRIc0=
@@ -250,6 +244,8 @@ github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.uber.org/automaxprocs v1.5.3 h1:kWazyxZUrS3Gs4qUpbwo5kEIMGe/DAvi5Z4tl2NW4j8=
go.uber.org/automaxprocs v1.5.3/go.mod h1:eRbA25aqJrxAbsLO0xy5jVwPt7FQnRgjW+efnwa1WM0=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.4.0 h1:VcM4ZOtdbR4f6VXfiOpwpVJDL6lCReaZ6mw31wqh7KU=
go.uber.org/mock v0.4.0/go.mod h1:a6FSlNadKUHUa9IP5Vyt1zh4fC7uAwxMutEAscFbkZc=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -261,8 +257,8 @@ golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDf
golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs=
golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI=
golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842 h1:vr/HnozRka3pE4EsMEg1lgkXJkTFJCVUX+S/ZT6wYzM=
golang.org/x/exp v0.0.0-20240506185415-9bf2ced13842/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc h1:O9NuF4s+E/PvMIy+9IUZB9znFwUIXEWSstNjek6VpVg=
golang.org/x/exp v0.0.0-20240531132922-fd00a4e0eefc/go.mod h1:XtvwrStGgqGPLc4cjQfWqZHG1YFdYs6swckp8vpsjnc=
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.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
@@ -323,10 +319,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc
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.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y=
golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=

View File

@@ -70,12 +70,28 @@
"Connection Type": "Тып Падлучэння",
"Connections": "Падлучэнні",
"Connections via relays might be rate limited by the relay": "Падлучэнні праз рэтранслятар могуць быць абмежаванымі самім рэтранслятарам",
"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. Ён выяўляе змены на дыску і скануе толькі мадыфікаваныя шляхі. Перавага метада ў тым, што змены распаўсюджваюцца хучэй і патарабуецца меньшая колькасць поўных сканаванняў.",
"Copied from elsewhere": "Скапіявана з іншага месца",
"Copied from original": "Скапіявана з арыгіналу",
"Copied!": "Скапіявана!",
"Copy": "Скапіяваць",
"Copy failed! Try to select and copy manually.": "Капіяванне не адбылося! Паспрабуйце вылучыць і скапіяваць уласнаручна.",
"Currently Shared With Devices": "Ужо Абагулена З Прыладамі",
"Custom Range": "Уласны Дыяпазон",
"Danger!": "Небязпечна!",
"Database Location": "Шлях Да Базы Даных",
"Debugging Facilities": "Сродкі Адладкі",
"Default": "Стандартныя",
"Default Configuration": "Стандартныя Налады",
"Default Device": "Стандартная Прылада",
"Default Folder": "Стандартная Тэчка",
"Default Ignore Patterns": "Шаблоны ігнаравання па змаўчанні",
"Defaults": "Па змаўчанні",
"Delete": "Выдаліць",
"Delete Unexpected Items": "Выдаліць Нечаканыя Элементы",
"Deleted {%file%}": "Выдалены {{file}}",
"Deselect All": "Зняць выбар з усіх",
"Device": "Прылада",
"Device ID": "ID прылады",
"Device Identification": "Ідэнтыфікацыя прылады",
"Device Name": "Назва прылады",

View File

@@ -14,7 +14,7 @@
"Add devices from the introducer to our device list, for mutually shared folders.": "Afegiu dispositius de l'introductor a la nostra llista de dispositius, per a carpetes compartides mútuament.",
"Add filter entry": "Afegeix una entrada de filtre",
"Add ignore patterns": "Afegiu patrons per ignorar",
"Add new folder?": "Vols afegir una carpeta nova?",
"Add new folder?": "Voleu afegir una carpeta nova?",
"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.": "A més, s'augmentarà l'interval de reexploració complet (vegades 60, és a dir, el nou predeterminat d'1 h). També podeu configurar-lo manualment per a cada carpeta més tard després de triar No.",
"Address": "Adreça",
"Addresses": "Adreces",
@@ -29,13 +29,13 @@
"Altered by ignoring deletes.": "S'ha alterat ignorant les supressions.",
"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.": "Una ordre externa gestiona la versió. Ha d'eliminar el fitxer de la carpeta compartida. Si el camí a l'aplicació conté espais, s'ha de citar.",
"Anonymous Usage Reporting": "Informe anònim d'ús",
"Anonymous usage report format has changed. Would you like to move to the new format?": "El format de l'informe d'ús anònim ha canviat. Vols canviar a aquest nou format?",
"Anonymous usage report format has changed. Would you like to move to the new format?": "El format de l'informe d'ús anònim ha canviat. Voleu canviar a aquest nou format?",
"Apply": "Aplica",
"Are you sure you want to override all remote changes?": "Esteu segur que voleu anul·lar tots els canvis remots?",
"Are you sure you want to permanently delete all these files?": "Estàs segur que vols esborrar tots aquests fitxers permanentment?",
"Are you sure you want to remove device {%name%}?": "Estàs segur que vols esborrar el dispositiu {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Estàs segur que vols esborrar la carpeta {{label}}?",
"Are you sure you want to restore {%count%} files?": "Estàs segur que vols restaurar {{count}} fitxers?",
"Are you sure you want to permanently delete all these files?": "Segur que voleu esborrar tots aquests fitxers permanentment?",
"Are you sure you want to remove device {%name%}?": "Segur que voleu eliminar el dispositiu {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Segur que voleu eliminar la carpeta {{label}}?",
"Are you sure you want to restore {%count%} files?": "Segur que voleu restaurar {{count}} fitxers?",
"Are you sure you want to revert all local changes?": "Esteu segur que voleu revertir tots els canvis locals?",
"Are you sure you want to upgrade?": "Esteu segur que voleu actualitzar?",
"Authors": "Autors",
@@ -55,7 +55,7 @@
"Cleaning Versions": "Netejant versions",
"Cleanup Interval": "Interval de neteja",
"Click to see full identification string and QR code.": "Feu clic per veure la cadena d'identificació completa i el codi QR.",
"Close": "Tancar",
"Close": "Tanca",
"Command": "Comando",
"Comment, when used at the start of a line": "Comentari quan és usat al principi d'una línia",
"Compression": "Compressió",
@@ -64,6 +64,7 @@
"Configured": "Configurat",
"Connected (Unused)": "Connectat (no utilitzat)",
"Connection Error": "Error de connexió",
"Connection Management": "Gestió de connexions",
"Connection Type": "Tipus de connexió",
"Connections": "Connexions",
"Connections via relays might be rate limited by the relay": "Les connexions mitjançant relés poden estar limitades pel relé",
@@ -91,11 +92,12 @@
"Deselect devices to stop sharing this folder with.": "Desseleccioneu els dispositius amb els quals deixar de compartir aquesta carpeta.",
"Deselect folders to stop sharing with this device.": "Desseleccioneu les carpetes per deixar de compartir-les amb aquest dispositiu.",
"Device": "Dispositiu",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "El dispositiu \"{{name}}\" ({{device}} a {{address}}) vol connectar-se. Vols afegir un dispositiu nou?",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "El dispositiu «{{name}}⁣» ({{device}} a {{address}}) vol connectar-se. Voleu afegir un dispositiu nou?",
"Device Certificate": "Certificat del dispositiu",
"Device ID": "ID del dispositiu",
"Device Identification": "Identificació del dispositiu",
"Device Name": "Nom del dispositiu",
"Device Status": "Estat del dispositiu",
"Device is untrusted, enter encryption password": "El dispositiu no és de confiança, introduïu la contrasenya d'encriptació",
"Device rate limits": "Límits de velocitat del dispositiu",
"Device that last modified the item": "Dispositiu que ha modificat el fitxer per última vegada",
@@ -118,13 +120,13 @@
"Do not add it to the ignore list, so this notification may recur.": "No l'afegiu a la llista d'ignorar, de manera que aquesta notificació pot repetir-se.",
"Do not restore": "No restaurar",
"Do not restore all": "No restaurar-ho tot",
"Do you want to enable watching for changes for all your folders?": "Vols activar la cerca de canvis a totes les teves carpetes?",
"Do you want to enable watching for changes for all your folders?": "Voleu activar el control de canvis a totes les carpetes?",
"Documentation": "Documentació",
"Download Rate": "Tasca de descarrega",
"Downloaded": "Descarregat",
"Downloading": "Descarregant",
"Edit": "Editar",
"Edit Device": "Editar dispositiu",
"Edit": "Edita",
"Edit Device": "Edita el dispositiu",
"Edit Device Defaults": "Edita els valors predeterminats del dispositiu",
"Edit Folder": "Modificar carpeta",
"Edit Folder Defaults": "Edita els valors per defecte de la carpeta",
@@ -165,8 +167,9 @@
"Folder ID": "ID de carpeta",
"Folder Label": "Etiqueta de la carpeta",
"Folder Path": "Camí de carpeta",
"Folder Status": "Estat de la carpeta",
"Folder Type": "Tipus de carpeta",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "El tipus de carpeta \"{{receiveEncrypted}}\" només es pot definir quan s'afegeix una carpeta nova.",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "El tipus de carpeta «⁣{{receiveEncrypted}}» només es pot definir quan s'afegeix una carpeta nova.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "El tipus de carpeta \"{{receiveEncrypted}}\" no es pot canviar després d'afegir la carpeta. Heu d'eliminar la carpeta, suprimir o desxifrar les dades del disc i tornar a afegir la carpeta.",
"Folders": "Carpetes",
"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.": "A les carpetes següents s'ha produït un error en començar a buscar canvis. Es tornarà a provar cada minut, de manera que els errors poden desaparèixer aviat. Si persisteixen, intenteu solucionar el problema subjacent i demaneu ajuda si no podeu.",
@@ -182,8 +185,8 @@
"GUI Theme": "Tema de la GUI",
"General": "General",
"Generate": "Generar",
"Global Discovery": "Descobriment Global",
"Global Discovery Servers": "Servidors de Descobriment Global",
"Global Discovery": "Descobriment global",
"Global Discovery Servers": "Servidors de descobriment global",
"Global State": "Estat global",
"Help": "Ajuda",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Suggeriment: només s'han detectat regles de denegació mentre el valor predeterminat és denegació. Penseu a afegir \"permet qualsevol\" com a darrera regla.",
@@ -205,6 +208,7 @@
"Internally used paths:": "Camins utilitzats internament:",
"Introduced By": "Introduït per",
"Introducer": "Introductor",
"Introduction": "Introducció",
"Inversion of the given condition (i.e. do not exclude)": "Inversió del patrò introduït",
"Keep Versions": "Mantenir Versions",
"LDAP": "LDAP",
@@ -224,12 +228,14 @@
"Loading data...": "Carregant dades...",
"Loading...": "Carregant...",
"Local Additions": "Addicions locals",
"Local Discovery": "Descobriment Local",
"Local Discovery": "Descobriment local",
"Local State": "Estat local",
"Local State (Total)": "Estat local (Total)",
"Locally Changed Items": "Elements canviats localment",
"Log": "Registre",
"Log File": "Fitxer de registre",
"Log In": "Inicia la sessió",
"Log Out": "Tanca la sessió",
"Log tailing paused. Scroll to the bottom to continue.": "S'ha posat en pausa el seguiment del registre. Desplaceu-vos cap a la part inferior per continuar.",
"Logs": "Registres",
"Major Upgrade": "Actualització major",
@@ -255,8 +261,9 @@
"No files will be deleted as a result of this operation.": "No se suprimirà cap fitxer com a resultat d'aquesta operació.",
"No rules set": "No hi ha regles establertes",
"No upgrades": "No hi ha actualitzacions",
"Not shared": "No compartit",
"Not shared": "Sense compartir",
"Notice": "Avís",
"Number of Connections": "Nombre de connexions",
"OK": "D'acord",
"Off": "Desactivar",
"Oldest First": "Més antic primer",
@@ -268,13 +275,14 @@
"Override": "Sobreescriu",
"Override Changes": "Sobreescriure Canvis",
"Ownership": "Propietat",
"Password": "Contrasenya",
"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 de la carpeta a l'equip local. Si no existeix serà creada. El caràcter (~) es pot fer servir com a drecera de",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Ruta on s'han d'emmagatzemar les versions (deixeu buit per al directori predeterminat .stversions a la carpeta compartida).",
"Paths": "Rutes",
"Pause": "Pausa",
"Pause": "Posa-ho en pausa",
"Pause All": "Posa-ho tot en pausa",
"Paused": "Pausat",
"Paused": "En pausa",
"Paused (Unused)": "En pausa (no utilitzat)",
"Pending changes": "Canvis pendents",
"Periodic scanning at given interval and disabled watching for changes": "Escaneig periòdic a un interval determinat i vigilància desactivada dels canvis",
@@ -294,8 +302,8 @@
"QUIC WAN": "Connexió QUIC WAN",
"Quick guide to supported patterns": "Guia ràpida per als possibles patrons",
"Random": "Aleatori",
"Receive Encrypted": "Rebre xifrat",
"Receive Only": "Només rebre",
"Receive Encrypted": "Rep xifrat",
"Receive Only": "Només rep",
"Received data is already encrypted": "Les dades rebudes ja estan xifrades",
"Recent Changes": "Canvis recents",
"Reduced by ignore patterns": "Reduït per ignorar patrons",
@@ -309,20 +317,21 @@
"Remove Device": "Elimina el dispositiu",
"Remove Folder": "Elimina la carpeta",
"Required identifier for the folder. Must be the same on all cluster devices.": "Identificador obligatori per a la carpeta. Ha de ser el mateix en tots els dispositius del clúster.",
"Rescan": "Re-escanejar",
"Rescan All": "Re-escanejar tot",
"Rescan": "Reescaneja",
"Rescan All": "Reescaneja-ho tot",
"Rescans": "Escaneja de nou",
"Restart": "Reiniciar",
"Restart Needed": "És Necessari Reiniciar",
"Restarting": "Reiniciant",
"Restart": "Reinicia",
"Restart Needed": "Cal un reinici",
"Restarting": "S'està reiniciant",
"Restore": "Restaura",
"Restore Versions": "Restaura versions",
"Resume": "Reprendre",
"Resume All": "Reprèn tot",
"Resume": "Reprèn-ho",
"Resume All": "Reprèn-ho tot",
"Reused": "Reutilitzat",
"Revert": "Reverteix",
"Revert Local Changes": "Reverteix els canvis locals",
"Save": "Guardar",
"Save": "Desa",
"Saving changes": "S'estan desant els canvis",
"Scan Time Remaining": "Temps d'escanejat restant",
"Scanning": "Escanejant",
"See external versioning help for supported templated command line parameters.": "Consulteu l'ajuda de versions externa per als paràmetres de línia d'ordres de plantilla compatibles.",
@@ -332,28 +341,28 @@
"Select additional folders to share with this device.": "Seleccioneu carpetes addicionals per compartir amb aquest dispositiu.",
"Select latest version": "Seleccioneu la darrera versió",
"Select oldest version": "Seleccioneu la versió més antiga",
"Send & Receive": "Enviar i rebre",
"Send & Receive": "Envia i rep",
"Send Extended Attributes": "Envia atributs ampliats",
"Send Only": "Només enviar",
"Send Only": "Només envia",
"Send Ownership": "Envia la propietat",
"Set Ignores on Added Folder": "Estableix filtres per ignorar a la carpeta afegida",
"Settings": "Preferències",
"Share": "Compartir",
"Share Folder": "Compartir carpeta",
"Share": "Comparteix",
"Share Folder": "Comparteix la carpeta",
"Share by Email": "Comparteix per correu electrònic",
"Share by SMS": "Comparteix per SMS",
"Share this folder?": "Compartir aquesta carpeta?",
"Share this folder?": "Voleu compartir la carpeta?",
"Shared Folders": "Carpetes compartides",
"Shared With": "Compartir Amb",
"Shared With": "Compartida amb",
"Sharing": "Compartint",
"Show ID": "Mostrar ID",
"Show ID": "Mostra l'ID",
"Show QR": "Mostra QR",
"Show detailed discovery status": "Mostra l'estat detallat del descobriment",
"Show detailed listener status": "Mostra l'estat detallat de l'oient",
"Show diff with previous version": "Mostra la diferència amb la versió anterior",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Mostrat en comptes del ID del Node en l'estat del cluster. Serà advertit als altres dispositius com un nom opcional per defecte.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Mostrat en comptes del ID del Node en l'estat del cluster. S'actualitzarà al nom del dispositiu si es deixa buit.",
"Shutdown": "Apagar",
"Shutdown": "Apaga",
"Shutdown Complete": "Apagat complet",
"Simple": "Simple",
"Simple File Versioning": "Versionat de Fitxers Senzill",
@@ -369,8 +378,9 @@
"Stable releases only": "Només versions estables",
"Staggered": "Esglaonat",
"Staggered File Versioning": "Versionat de Fitxers Esglaonat",
"Start Browser": "Arrancar Navegador",
"Start Browser": "Inicia el navegador",
"Statistics": "Estadístiques",
"Stay logged in": "Mantén la sessió iniciada",
"Stopped": "Aturat",
"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.": "Emmagatzema i sincronitza només dades encriptades. Les carpetes de tots els dispositius connectats s'han de configurar amb la mateixa contrasenya o també ser del tipus \"{{receiveEncrypted}}\".",
"Subject:": "Assumpte:",
@@ -382,17 +392,18 @@
"Sync Status": "Estat de sincronització",
"Syncing": "Synthing",
"Syncthing device ID for \"{%devicename%}\"": "ID del dispositiu Syncthing amb el nom \"{{devicename}}\"",
"Syncthing has been shut down.": "S'ha aturat el synthing.",
"Syncthing has been shut down.": "Synthing s'ha aturat.",
"Syncthing includes the following software or portions thereof:": "Syncthing inclou el següent programari o parts dels mateixos:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing és un programari lliure i de codi obert amb llicència MPL v2.0.",
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing és un programa de sincronització contínua de fitxers. Sincronitza fitxers entre dos o més ordinadors en temps real, protegit de manera segura de mirades indiscretes. Les vostres dades són només les vostres i mereixeu triar on s'emmagatzemen, si es comparteixen amb un tercer i com es transmeten per Internet.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "La sincronització està escoltant a les adreces de xarxa següents els intents de connexió des d'altres dispositius:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "La sincronització no és escoltar els intents de connexió d'altres dispositius a cap adreça. Només poden funcionar les connexions sortints d'aquest dispositiu.",
"Syncthing is restarting.": "Reiniciant syncthing.",
"Syncthing is restarting.": "Syncthing s'està reiniciant.",
"Syncthing is saving changes.": "Syncthing està desant els canvis.",
"Syncthing is upgrading.": "Actualitzant syncthing.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing ara admet la notificació automàtica d'errors als desenvolupadors. Aquesta funció està activada per defecte.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Sembla que Syncthing no està funcionant o hi ha un problema amb la connexió a Internet. S'està tornant a provar…",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Sembla ser que Syncthing està tinguent problemes per processar la teva petició. Si us plau, refresca la pàgina o reinicia Syncthing si el problema persisteix.",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Sembla que Syncthing està tenint problemes per a processar la petició. Recarregueu la pàgina o reinicieu Syncthing si el problema persisteix.",
"TCP LAN": "Connexió TCP LAN",
"TCP WAN": "Connexió TCP WAN",
"Take me back": "Porta'm enrere",
@@ -401,7 +412,7 @@
"The Syncthing admin interface is configured to allow remote access without a password.": "La interfície d'administració de Syncthing està configurada per permetre l'accés remot sense contrasenya.",
"The aggregated statistics are publicly available at the URL below.": "Les estadístiques agregades estan disponibles públicament a l'URL següent.",
"The cleanup interval cannot be blank.": "L'interval de neteja no pot estar en blanc.",
"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 configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configuració s'ha desat, però no s'ha activat. S'ha de reiniciar el Synthing per a activar la configuració nova.",
"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.",
@@ -456,7 +467,7 @@
"Unexpected items have been found in this folder.": "S'han trobat elements inesperats en aquesta carpeta.",
"Unignore": "No ignorar",
"Unknown": "Desconegut",
"Unshared": "No compartit",
"Unshared": "Sense compartir",
"Unshared Devices": "Dispositius no compartits",
"Unshared Folders": "Carpetes no compartides",
"Untrusted": "No fiable",
@@ -470,8 +481,9 @@
"Usage reporting is always enabled for candidate releases.": "Els informes d'ús sempre estan activats per a les versions candidates.",
"Use HTTPS for GUI": "Utilitzar HTTPS pel GUI",
"Use notifications from the filesystem to detect changed items.": "Utilitzeu les notificacions del sistema de fitxers per detectar elements canviats.",
"User": "Usuari",
"User Home": "Carpeta d'inici de l'usuari",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "El nom d'usuari/contrasenya no s'ha establert per a l'autenticació de la GUI. Penseu en configurar-lo.",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "El nom d'usuari/contrasenya no s'ha establert per a l'autenticació de la GUI. Penseu a configurar-lo.",
"Using a direct TCP connection over LAN": "Utilitzant una connexió TCP directa per LAN",
"Using a direct TCP connection over WAN": "Utilitzant una connexió TCP directa a través de WAN",
"Version": "Versió",
@@ -499,8 +511,8 @@
"You can change your choice at any time in the Settings dialog.": "Pots canviar la teva elecció en qualsevol moment al quadre de preferències.",
"You can read more about the two release channels at the link below.": "Podeu llegir més sobre els dos canals de llançament a l'enllaç següent.",
"You have no ignored devices.": "No teniu cap dispositiu ignorat.",
"You have no ignored folders.": "No tens carpetes compartides.",
"You have unsaved changes. Do you really want to discard them?": "Tens canvis no desats. Realment les voleu descartar?",
"You have no ignored folders.": "No teniu carpetes ignorades.",
"You have unsaved changes. Do you really want to discard them?": "Teniu canvis no desats. Realment els voleu descartar?",
"You must keep at least one version.": "Has de mantenir com a mínim una versió.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Mai no hauríeu d'afegir ni canviar res localment a una carpeta \"{{receiveEncrypted}}\".",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "La vostra aplicació SMS s'hauria d'obrir per permetre't triar el destinatari i enviar-lo des del teu propi número.",
@@ -525,6 +537,7 @@
"light": "Clar"
}
},
"unknown device": "dispositiu desconegut",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} vol compartir la carpeta \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} vol compartir la carpeta \"{{folderlabel}}\" ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} podria tornar a introduir aquest dispositiu."

View File

@@ -1,5 +1,5 @@
{
"A device with that ID is already added.": "Zařízení s takovým identifikátorem už je přidáno.",
"A device with that ID is already added.": "Zařízení s takovým identifikátorem už j přidáno.",
"A negative number of days doesn't make sense.": "Záporný počet dní nedává smysl.",
"A new major version may not be compatible with previous versions.": "Nová hlavní verze nemusí být kompatibilní s předchozími verzemi.",
"API Key": "Klíč k API",
@@ -11,93 +11,95 @@
"Add Device": "Přidat zařízení",
"Add Folder": "Přidat složku",
"Add Remote Device": "Přidat vzdálené zařízení",
"Add devices from the introducer to our device list, for mutually shared folders.": "Přidat zařízení z uvaděče do místního seznamu zařízení a získat tak vzájemně sdílené složky.",
"Add filter entry": "Přidej filtr",
"Add ignore patterns": "Přidat vzory ignorovaného",
"Add devices from the introducer to our device list, for mutually shared folders.": "Přidat zařízení od zavaděče do našeho seznamu zařízení pro vzájemné sdílení složek.",
"Add filter entry": "Přidat položku filtru",
"Add ignore patterns": "Přidat vzory ignorování",
"Add new folder?": "Přidat novou složku?",
"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.": "Dále bude prodloužen interval mezi plnými skeny (60krát, t.j. nová výchozí hodnota 1h). V případě, že nyní zvolíte Ne, stále ještě toto později můžete u každé složky jednotlivě ručně upravit.",
"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.": "Kromě toho se prodlouží interval úplného opětovného skenování (60krát, t.j. nová výchozí hodnota 1h). Také to můžete později nastavit ručně pro každou složku, pokud zvolíte Ne.",
"Address": "Adresa",
"Addresses": "Adresy",
"Advanced": "Pokročilé",
"Advanced Configuration": "Pokročilá nastavení",
"Advanced": "Rozšířené",
"Advanced Configuration": "Rozšířená nastavení",
"All Data": "Všechna data",
"All Time": "Celou dobu",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Všechny složky sdílené s tímto zařízením musí být chráněna heslem, aby byla odesílaná data bez hesla nečitelná.",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Všechny složky sdílené s tímto zařízením musí být chráněny heslem, aby všechna odesílaná data byla bez zadaného hesla nečitelná.",
"Allow Anonymous Usage Reporting?": "Povolit anonymní hlášení o používání?",
"Allowed Networks": "Sítě, ze kterých je umožněn přístup",
"Alphabetic": "Abecední",
"Altered by ignoring deletes.": "Změněno pomocí vzorů ignorovaného.",
"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.": "Správu verzí obstarává externí příkaz. U toho je třeba, aby neaktuální soubory jím byly odsouvány pryč ze sdílené složky. Pokud popis umístění tohoto příkazu obsahuje mezeru, je třeba popis umístění uzavřít do uvozovek.",
"Allowed Networks": "Povolené sítě",
"Alphabetic": "Abecedně",
"Altered by ignoring deletes.": "Změněno ignorováním odstraněný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.": "Verzování obstarává externí příkaz. Ten musí odebrat soubor ze sdílené složky. Pokud cesta k aplikaci obsahuje mezery, je potřeba ji uvést v uvozovkách.",
"Anonymous Usage Reporting": "Anonymní hlášení o používání",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Formát anonymního hlášení o používání byl změněn. Chcete přejít na nový formát?",
"Applied to LAN": "Použité pro místní síť",
"Apply": "Aplikovat",
"Are you sure you want to override all remote changes?": "Skutečně si přejete přet všechny vzdálené změny?",
"Are you sure you want to permanently delete all these files?": "Skutečně chcete smazat všechny tyto soubory?",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Formát anonymního hlášení o používání se změnil. Chcete přejít na nový formát?",
"Applied to LAN": "Použité pro LAN",
"Apply": "Použít",
"Are you sure you want to override all remote changes?": "Opravdu chcete přepsat všechny vzdálené změny?",
"Are you sure you want to permanently delete all these files?": "Opravdu chcete trvale odstranit všechny tyto soubory?",
"Are you sure you want to remove device {%name%}?": "Opravdu chcete odebrat zařízení {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Opravdu chcete odebrat složku {{label}}?",
"Are you sure you want to restore {%count%} files?": "Opravdu chcete obnovit {{count}} souborů?",
"Are you sure you want to revert all local changes?": "Skutečně si přejete vrátit všechny lokální změny?",
"Are you sure you want to upgrade?": "Skutečně chcete provést aktualizaci?",
"Authentication Required": "Autentizace vyžadována",
"Are you sure you want to revert all local changes?": "Opravdu chcete vrátit všechny místní změny?",
"Are you sure you want to upgrade?": "Opravdu chcete provést aktualizaci?",
"Authentication Required": "Požadováno ověření",
"Authors": "Autoři",
"Auto Accept": "Přijmout automaticky",
"Automatic Crash Reporting": "Automatické hlášení pádů",
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Automatická aktualizace nyní nabízí volbu mezi stabilními vydáními a kandidáty na .",
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Automatická aktualizace nyní nabízí výběr mezi stabilními vydáními a kandidáty na vydání.",
"Automatic upgrades": "Automatické aktualizace",
"Automatic upgrades are always enabled for candidate releases.": "Automatické aktualizace jsou vždy povolené u kandidátů na vydání.",
"Automatically create or share folders that this device advertises at the default path.": "Automaticky vytvářet nebo sdílet složky, které toto zařízení propaguje ve výchozím popisu umístě.",
"Available debug logging facilities:": "Dostupná logovací zařízení pro ladění:",
"Automatically create or share folders that this device advertises at the default path.": "Automaticky vytvářet nebo sdílet složky, které toto zařízení propaguje ve výchozí cestě.",
"Available debug logging facilities:": "Dostupné možnosti protokolování ladění:",
"Be careful!": "Buďte opatrní!",
"Body:": "Obsah:",
"Bugs": "Chyby",
"Cancel": "Zrušit",
"Changelog": "Seznam změn",
"Clean out after": "Vyčistit po",
"Cleaning Versions": "Mazání verzí",
"Cleanup Interval": "Interval mazání",
"Click to see full identification string and QR code.": "Kliknutím zobrazíte úplnou identifikaci a QR kód.",
"Cleaning Versions": "Čištění verzí",
"Cleanup Interval": "Interval čištění",
"Click to see full identification string and QR code.": "Kliknutím zobrazíte celý identifikační řetězec a QR kód.",
"Close": "Zavřít",
"Command": "Příkaz",
"Comment, when used at the start of a line": "Pokud použito na jeho začátku, je řádek považován za komentář",
"Comment, when used at the start of a line": "Považováno za komentář, pokud je použito na začátku řádku",
"Compression": "Komprese",
"Configuration Directory": "Konfigurační složka",
"Configuration Directory": "Konfigurační adresář",
"Configuration File": "Konfigurační soubor",
"Configured": "Nastaveno",
"Connected (Unused)": "Připojeno (nepoužité)",
"Connected (Unused)": "Připojeno (nepoužito)",
"Connection Error": "Chyba připojení",
"Connection Management": "Správa připojení",
"Connection Type": "Typ připojení",
"Connections": "Spojení",
"Connections via relays might be rate limited by the relay": "Připojení přes přenašeč může být přenašečem omezena rychlost",
"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 nyní umožňuje nepřetržité sledování změn. To zachytí změny na úložišti a spustí sken pouze pro umístění, ve kterých se něco změnilo. Výhodami jsou rychlejší propagace změn a méně plných skenů.",
"Connections": "Připojení",
"Connections via relays might be rate limited by the relay": "Připojení přes relé může být omezeno rychlostí 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.": "Syncthing nyní umožňuje průběžné sledování změn. To zachytí změny na disku a provede skenování pouze změněných cest. Výhodou je rychlejší šíření změn a menší počet úplných skenování.",
"Copied from elsewhere": "Zkopírováno odjinud",
"Copied from original": "Zkopírováno z originálu",
"Copied!": "Zkopírováno!",
"Copy": "Kopírovat",
"Copy failed! Try to select and copy manually.": "Kopírování selhalo! Zkuste vybrat a zkopírovat manuálně.",
"Copy failed! Try to select and copy manually.": "Kopírování selhalo! Zkuste vybrat a zkopírovat ručně.",
"Currently Shared With Devices": "Aktuálně sdíleno se zařízeními",
"Custom Range": "Přesný rozsah",
"Custom Range": "Vlastní rozsah",
"Danger!": "Nebezpečí!",
"Database Location": "Umístění databáze",
"Debugging Facilities": "Nástroje pro ladění",
"Default": "Výchozí",
"Default Configuration": "Výchozí nastavení",
"Default Configuration": "Výchozí konfigurace",
"Default Device": "Výchozí zařízení",
"Default Folder": "Výchozí složka",
"Default Ignore Patterns": "Výchozí vzory ignorovaného",
"Default Ignore Patterns": "Výchozí vzory ignorování",
"Defaults": "Výchozí hodnoty",
"Delete": "Smazat",
"Delete Unexpected Items": "Smazat neočekávané položky",
"Deleted {%file%}": "Smazáno {{file}}",
"Delete": "Odstranit",
"Delete Unexpected Items": "Odstranit neočekávané položky",
"Deleted {%file%}": "Odstraněn {{file}}",
"Deselect All": "Zrušit výběr všeho",
"Deselect devices to stop sharing this folder with.": "Zrušte výběr zařízení, se kterými již nemá být tato složka sdílena.",
"Deselect folders to stop sharing with this device.": "Zrušte výběr složek, které se mají přestat sdílet s tímto zařízením.",
"Deselect devices to stop sharing this folder with.": "Zrušením výběru zařízení s ním přestanete tuto složku sdílet.",
"Deselect folders to stop sharing with this device.": "Zrušením výběru složek zastavíte sdíle s tímto zařízením.",
"Device": "Zařízení",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Zařízení „{{name}}“ ({{device}} na {{address}}) se chce připojit. Přidat nové zařízení?",
"Device Certificate": "Certifikát zařízení",
"Device ID": "Identifikátor zařízení",
"Device Identification": "Identifikace zařízení",
"Device Name": "Název zařízení",
"Device Status": "Stav zařízení",
"Device is untrusted, enter encryption password": "Zařízení nemá důvěru, zadejte šifrovací heslo.",
"Device rate limits": "Omezení přenosové rychlosti pro zařízení",
"Device that last modified the item": "Zařízení, které položku změnilo naposledy",

View File

@@ -0,0 +1,555 @@
{
"A device with that ID is already added.": "Nadagdag na ang device na may ganitong ID.",
"A negative number of days doesn't make sense.": "Walang saysay ang negatibong numero ng araw.",
"A new major version may not be compatible with previous versions.": "Maaring hindi compatible ang isang bagong major na beryson sa mga kasalukuyang bersyon.",
"API Key": "API Key",
"About": "Tungkol sa",
"Action": "Aksyon",
"Actions": "Mga Aksyon",
"Active filter rules": "Mga aktibong tuntunin sa pag-filter",
"Add": "Magdagdag",
"Add Device": "Magdagdag ng Device",
"Add Folder": "Magdagdag ng Folder",
"Add Remote Device": "Magdagdag ng Remote Device",
"Add devices from the introducer to our device list, for mutually shared folders.": "Magdagdag ng mga device mula sa introducer sa aming listahan ng device, para sa mga folder na pinagsasaluhan.",
"Add filter entry": "Magdagdag ng filter entry",
"Add ignore patterns": "Magdagdag ng mga pattern na huwag pansinin",
"Add new folder?": "Magdagdag ng bagong 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.": "Dagdag pa rito, ang buong agwat ng muling pag-scan ay tataas (mga beses na 60, ibig sabihin, bagong default na 1h). Maaari mo ring i-configure ito nang manu-mano para sa bawat folder sa ibang pagkakataon pagkatapos piliin ang Hindi.",
"Address": "Address",
"Addresses": "Mga Address",
"Advanced": "Advanced",
"Advanced Configuration": "Advanced na Pagsasaayos",
"All Data": "Lahat ng Data",
"All Time": "Lahat ng Oras",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Dapat protektahan ang lahat ng mga folder sa device na ito sa pamamagitan ng password, upang hindi mabasa ang lahat ng mga data na ipinapadala nang wala ang ibinigay na password.",
"Allow Anonymous Usage Reporting?": "Payagan ang Anonymous na Pag-uulat ng Paggamit?",
"Allowed Networks": "Mga Pinapayagang Network",
"Alphabetic": "Alpabetiko",
"Altered by ignoring deletes.": "Binago sa pamamagitan ng hindi pagpansin sa mga pagtanggal.",
"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.": "Pinapamahala ng external na command ang file versioning. Kailangan nitong tanggalin ang file mula sa binabahaging folder. Kung may mga space ang path sa application, kailangan itong i-quote.",
"Anonymous Usage Reporting": "Anonymous na Pag-uulat ng Paggamit",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Nagbago ang pormat ng anonymous na ulat ng paggamit. Gusto mo bang lumipat sa bagong pormat?",
"Applied to LAN": "Naka-apply sa LAN",
"Apply": "I-apply",
"Are you sure you want to override all remote changes?": "Sigurado ka ba gusto mong i-override ang lahat ng mga remote na pagbabago?",
"Are you sure you want to permanently delete all these files?": "Sigurado ka bang gusto mong permanenteng burahin ang lahat ng mga file na ito?",
"Are you sure you want to remove device {%name%}?": "Sigurado ka bang gusto mong tanggalin ang device na {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Sigurado ka bang gusto mong tanggalin ang folder na {{label}}?",
"Are you sure you want to restore {%count%} files?": "Sigurado ka bang gusto mong ibalik ang {{count}} mga file?",
"Are you sure you want to revert all local changes?": "Sigurado ka bang gusto mong i-revert ang lahat ng mga lokal na pagbabago?",
"Are you sure you want to upgrade?": "Sigurado ka bang gusto mong mag-upgrade?",
"Authentication Required": "Nangangailangan ng Authentikasyon",
"Authors": "Mga Awtor",
"Auto Accept": "Awto na Pagtanggap",
"Automatic Crash Reporting": "Awtomatikong Pag-ulat ng Crash",
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Nag-aalok na ngayon ang awtomatikong pag-upgrade ng pagpipilian sa pagitan ng mga stable na release at release na mga kandidato.",
"Automatic upgrades": "Awtomatikong pag-upgrade",
"Automatic upgrades are always enabled for candidate releases.": "Palaging naka-enable ang awtomatikong pag-upgrade sa mga kandidato na release.",
"Automatically create or share folders that this device advertises at the default path.": "Awtomatikong gumawa o ibahagi ang mga folder na ang device na ito na inaaanunsyo sa default path.",
"Available debug logging facilities:": "Mga available na facility ng debug logging:",
"Be careful!": "Mag-ingat ka!",
"Body:": "Body:",
"Bugs": "Mga Bug",
"Cancel": "Kanselahin",
"Changelog": "Mga Pagbabago",
"Clean out after": "Linisin pagkatapos",
"Cleaning Versions": "Mga Bersyon ng Paglinis",
"Cleanup Interval": "Pagitan ng Paglinis",
"Click to see full identification string and QR code.": "I-click upang makita ang buong string ng pagkakakilanlan at QR code.",
"Close": "Isara",
"Command": "Command",
"Comment, when used at the start of a line": "Komento, kapag ginamit sa simula ng linya",
"Compression": "Compression",
"Configuration Directory": "Direktoryo ng Configuration",
"Configuration File": "File ng Configuration",
"Configured": "Naka-configure",
"Connected (Unused)": "Konektado (Hindi Ginamit)",
"Connection Error": "Error sa Pagkonekta",
"Connection Management": "Pamahalaan ng Koneksyon",
"Connection Type": "Uri ng Koneksyon",
"Connections": "Mga Koneksyon",
"Connections via relays might be rate limited by the relay": "Ang mga koneksyon sa pamamagitan ng mga relay ay maaaring ma-rate limit ng relay",
"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.": "Ang patuloy na panonood ng mga pagbabago ay available na ngayon sa loob ng Syncthing. Matutukoy nito ang mga pagbabago sa disk at maglalabas ng pag-scan sa mga binagong landas lamang. Ang mga benepisyo ay ang mga pagbabago ay pinalaganap nang mas mabilis at ang mas kaunting buong pag-scan ay kinakailangan.",
"Copied from elsewhere": "Kinopya mula sa ibang lugar",
"Copied from original": "Kinopya mula sa orihinal",
"Copied!": "Kinopya!",
"Copy": "Kopyahin",
"Copy failed! Try to select and copy manually.": "Nabigo ang pagkopya! Subukang manwal na piliin at kopyahin.",
"Currently Shared With Devices": "Kasalukuyang Binabahagi Sa Mga Device",
"Custom Range": "Custom na Saklaw",
"Danger!": "Panganib!",
"Database Location": "Lokasyon ng Database",
"Debugging Facilities": "Mga Facility ng Pag-debug",
"Default": "Default",
"Default Configuration": "Default na Configuration",
"Default Device": "Default na Device",
"Default Folder": "Default na Folder",
"Default Ignore Patterns": "Default na mga Ignore Pattern",
"Defaults": "Mga Default",
"Delete": "Burahin",
"Delete Unexpected Items": "Burahin ang mga Hindi Inaasahang Item",
"Deleted {%file%}": "Binura ang {{file}}",
"Deselect All": "I-deselect Lahat",
"Deselect devices to stop sharing this folder with.": "I-deselect ang mga device para itigil ang pagbahagi ng folder na ito sa.",
"Deselect folders to stop sharing with this device.": "I-deselect ang mga folder para itigil ang pagbahagi sa device na ito.",
"Device": "Device",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Gustong kumonekta ang device na \"{{name}}\" ({{device}} sa {{address}}). Idagdag ang bagong device?",
"Device Certificate": "Sertipiko ng Device",
"Device ID": "ID ng Device",
"Device Identification": "Pagkakilanlan ng Device",
"Device Name": "Pangalan ng Device",
"Device Status": "Status ng Device",
"Device is untrusted, enter encryption password": "Hindi pinagkakatiwalaan ang device, ilagay ang password ng pag-encrypt",
"Device rate limits": "Mga rate limit ng device",
"Device that last modified the item": "Device na huling binago ang item",
"Devices": "Mga Device",
"Disable Crash Reporting": "I-disable ang Pag-uulat ng Crash",
"Disabled": "Naka-disable",
"Disabled periodic scanning and disabled watching for changes": "Na-disable ang pana-panahon na pag-scan at na-disable ang panonood sa mga pagbabago",
"Disabled periodic scanning and enabled watching for changes": "Na-disable ang pana-panahon na pag-scan at na-enable ang panonood sa mga pagbabago",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Na-disable ang pana-panahon na pag-scan at nabigong i-set up ang panonood sa mga pagbabago, susubukang muli kada 1m:",
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Dini-disable ang pagkumpara at pag-sync ng mga pahintulot ng file. Kapaki-pakinabang sa mga sistema na walang custom na pahintulot (hal. FAT, exFAT, Synology, Android).",
"Discard": "I-discard",
"Disconnected": "Nadiskonekta",
"Disconnected (Inactive)": "Nadiskonekta (Hindi Aktibo)",
"Disconnected (Unused)": "Nadiskonekta (Hindi Ginamit)",
"Discovered": "Natuklasan",
"Discovery": "Pagtuklas",
"Discovery Failures": "Mga Pagkabigo sa Pagtuklas",
"Discovery Status": "Status ng Pagtuklas",
"Dismiss": "I-dismiss",
"Do not add it to the ignore list, so this notification may recur.": "Huwag ito i-add sa listahan ng hindi papansinin, kaya baka lumabas muli ang notification na ito.",
"Do not restore": "Huwag ibalik",
"Do not restore all": "Huwag ibalik lahat",
"Do you want to enable watching for changes for all your folders?": "Gusto mo bang i-enable ang panonood sa pagbabago para sa lahat ng iyong mga folder?",
"Documentation": "Dokumentasyon",
"Download Rate": "Rate ng Pag-download",
"Downloaded": "Na-download",
"Downloading": "Dina-download",
"Edit": "I-edit",
"Edit Device": "I-edit ang Device",
"Edit Device Defaults": "I-edit ang mga Device Default",
"Edit Folder": "I-edit ang Folder",
"Edit Folder Defaults": "I-edit ang mga Folder Default",
"Editing {%path%}.": "Ine-edit ang {{path}}.",
"Enable Crash Reporting": "I-enable ang Pag-uulat ng Crash",
"Enable NAT traversal": "I-enable ang NAT traversal",
"Enable Relaying": "I-enable ang pag-relay",
"Enabled": "Naka-enable",
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Ine-enable ang pagpadala ng napalawak na attribute sa mga ibang device, at pag-apply ng papasok na napalawak na attribute. Maaring nangangailangan ng pagtakbo na may naka-elevate na pribilehiyo.",
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Ine-enable ang pagpadala ng mga napalawak na attribute sa mga ibang device, pero hindi ang pag-apply ng papasok na napalawak na attribute. Maaari itong magkaroon ng makabuluhang epekto sa pagganap. Palaging naka-enable kapag naka-enable ang \"I-sync ang mga Napalawak na Attribute\".",
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Ine-enable ang pagpapadala ng impormasyon ng pagmamay-ari sa iba pang mga device, at paglalapat ng papasok na impormasyon ng pagmamay-ari. Karaniwang nangangailangan ng pagtakbo na may mataas na mga pribilehiyo.",
"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.": "Ine-enable ang pagpapadala ng impormasyon ng pagmamay-ari sa iba pang mga device, pero hindi ang paglapat ng papasok na impormasyon ng pagmamay-ari. Maari itong magkaroon ng makabuluhang epekto sa pagganap. Palaging naka-enable kapag naka-enable ang \"I-sync ang Pagmamay-ari\".",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Maglagay ng hindi negatibong numero (hal, \"2.35\") at pumili ng unit. Ang mga percentage ay bahagi ng kabuuan ng laki ng disk.",
"Enter a non-privileged port number (1024 - 65535).": "Maglagay ng hindi pribilehiyong port number (1024 - 65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Maglagay ng mga address na hinihiwalay ng kuwit (\"tcp://ip:port\", \"tcp://host:port\") o \"dinamiko\" upang gumawa ng awtomatikong pagtuklas ng address.",
"Enter ignore patterns, one per line.": "Maglagay ng mga ignore pattern, isa kada-linya.",
"Enter up to three octal digits.": "Maglagay ng hanggang tatlong octal digit.",
"Error": "Error",
"Extended Attributes": "Mga Napalawak na Attribute",
"Extended Attributes Filter": "Filter ng Mga Napalawak na Attribute",
"External": "Panlabas",
"External File Versioning": "Panlabas na File Versioning",
"Failed Items": "Mga Nabigong Item",
"Failed to load file versions.": "Nabigong i-load ang mga bersyon ng file.",
"Failed to load ignore patterns.": "Nabigong i-load ang mga ignore pattern.",
"Failed to setup, retrying": "Nabigong i-set up, sinusubukan muli",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "Inaasahan ang pagbigo sa pagkonekta sa mga IPv6 na server kapag walang konektibidad sa IPv6.",
"File Pull Order": "Order ng Pagkuha ng File",
"File Versioning": "File Versioning",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Nilipat ang mga file sa .stversions na direktoryo kapag pinalitan o binura ng Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Nililipat ang mga file sa mga naka-date stamp na bersyon sa .stversions na direktoryo kapag pinalitan o binura ng Syncthing.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Pinoprotektahan ang mga file mula sa mga pagbabago sa ibang device, pero ipapadala sa ibang cluster ang mga pagbabago na ginawa sa device na ito.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Sini-synchronize mula sa cluster ang mga file, pero hindi ipapadala sa mga ibang device ang mgaanumang pagbabago.",
"Filesystem Watcher Errors": "Mga Error sa Taganood ng Filesystem",
"Filter by date": "I-filter ayon sa petsa",
"Filter by name": "I-filter ayon sa pangalan",
"Folder": "Folder",
"Folder ID": "ID ng Folder",
"Folder Label": "Label ng Folder",
"Folder Path": "Path ng Folder",
"Folder Status": "Status ng Folder",
"Folder Type": "Uri ng Folder",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "Maari lang itakda ang uri ng folder na \"{{receiveEncrypted}}\" kapag nagdadagdag ng bagong folder.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "Hindi mababago ang uri ng folder na \"{{receiveEncrypted}}\" pagkatapos idagdag ang folder. Kailangan mong tanggalin ang folder, burahin o i-decrypt ang data sa disk, at idagdag muli ang folder.",
"Folders": "Mga Folder",
"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.": "Para sa mga sumusunod na folder, may naganap na error habang nagsisimulang manood ng mga pagbabago. Susubukan itong muli bawat minuto, kaya maaaring mawala ang mga error sa lalong madaling panahon. Kung magpapatuloy sila, subukang ayusin ang pinagbabatayan na isyu at humingi ng tulong kung hindi mo kaya.",
"Forever": "Magpakailanman",
"Full Rescan Interval (s)": "Pagitan ng Punong Rescan (s)",
"GUI": "GUI",
"GUI / API HTTPS Certificate": "Sertipiko ng HTTPS ng GUI / API",
"GUI Authentication Password": "Password ng Authentikasyon sa GUI",
"GUI Authentication User": "User ng Authentikasyon sa GUI",
"GUI Authentication: Set User and Password": "Authentikasyon sa GUI: Magtakda ng User at Password",
"GUI Listen Address": "Listen Address ng GUI",
"GUI Override Directory": "Override Directory ng GUI",
"GUI Theme": "Tema ng GUI",
"General": "General",
"Generate": "I-generate",
"Global Discovery": "Global na Pagtuklas",
"Global Discovery Servers": "Mga Server ng Global na Pagtuklas",
"Global State": "Global na Kalagayan",
"Help": "Tulong",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Hint: deny-rules lang ang nakita habang ang default ay deny. Isaalang-alang ang pagdaragdag ng \"pahintulutan ang alinman\" bilang huling panuntunan.",
"Home page": "Pahina ng panimula",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Gayunpaman, ang iyong kasalukuyang mga setting ay nagpapahiwatig na maaaring hindi mo ito gustong paganahin. Hindi namin pinagana ang awtomatikong pag-uulat ng pag-crash para sa iyo.",
"Identification": "Pagkakakilanlan",
"If untrusted, enter encryption password": "Kapag hindi pinagkakatiwalaan, ilagay ang password ng pag-encrypt",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Kung gusto mong iwasan ang ibang mga user sa computer na ito na i-access ang Syncthing at sa iyong mga file, isaalang-alang na mag-set up ng authentikasyon.",
"Ignore": "Huwag Pansinin",
"Ignore Patterns": "Mga Ignore Pattern",
"Ignore Permissions": "Huwag Pansinin ang mga Pahintulot",
"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.": "Madadagdag lang ang mga ignore pattern pagkatapos gawin ang folder. Kung nilagyan ng check, ang isang input field para ipasok ang mga ignore pattern ay ipapakita pagkatapos i-save.",
"Ignored Devices": "Mga Hindi Pinapansin na Device",
"Ignored Folders": "Mga Hindi Pinapansin na Folder",
"Ignored at": "Hindi pinansin noong",
"Included Software": "Mga Kasamang Software",
"Incoming Rate Limit (KiB/s)": "Rate Limit ng Papasok (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Maaring sirain ng maling pagsasaayos ang nilalaman ng iyong mga folder at gawing inoperable ang Syncthing.",
"Incorrect user name or password.": "Maling user name o password.",
"Internally used paths:": "Mga internal na ginamit na path:",
"Introduced By": "Ipinakilala Ni/Ng",
"Introducer": "Tagapagpakilala",
"Introduction": "Panimula",
"Inversion of the given condition (i.e. do not exclude)": "Pabaliktad ng ibinigay na kundisyon (hal. huwag ibukod)",
"Keep Versions": "Panatilihin ang mga Bersyon",
"LDAP": "LDAP",
"Largest First": "Pinakamalaki Muna",
"Last 30 Days": "Huling 30 Araw",
"Last 7 Days": "Huling 7 Araw",
"Last Month": "Huling Buwan",
"Last Scan": "Huling Scan",
"Last seen": "Huling nakita",
"Latest Change": "Pinakabagong Pagbabago",
"Learn more": "Matuto pa",
"Learn more at {%url%}": "Matuto pa sa {{url}}",
"Limit": "Limitasyon",
"Listener Failures": "Mga Pagbibigo ng Listener",
"Listener Status": "Status ng Listener",
"Listeners": "Mga Listener",
"Loading data...": "Nilo-load ang mga data...",
"Loading...": "Naglo-load...",
"Local Additions": "Mga Lokal na Pagdagdag",
"Local Discovery": "Lokal na Pagtuklas",
"Local State": "Lokal na Kalagayan",
"Local State (Total)": "Lokal na Kalagayan (Kabuuan)",
"Locally Changed Items": "Mga Lokal na Binago na Item",
"Log": "Tala",
"Log File": "File ng Tala",
"Log In": "Mag-Log In",
"Log Out": "Mag-Log Out",
"Log in to see paths information.": "Mag-log in upang makita ang impormasyon ng mga path.",
"Log in to see version information.": "Mag-log in upang makita ang impormasyon ng bersyon.",
"Log tailing paused. Scroll to the bottom to continue.": "Na-pause ang tailing ng tala. Mag-scroll pababa para magpatuloy.",
"Login failed, see Syncthing logs for details.": "Nabigo ang pag-login, tignan ang mga tala ng Syncthing para sa mga detalye.",
"Logs": "Mga Tala",
"Major Upgrade": "Major na Upgrade",
"Mass actions": "Mga maramihang aksyon",
"Maximum Age": "Pinakamataas na Edad",
"Maximum single entry size": "Pinakamataas na laki ng isang entry",
"Maximum total size": "Pinakamataas na kabuuang laki",
"Metadata Only": "Metadata Lamang",
"Minimum Free Disk Space": "Pinakamababang Bakanteng Espasyo ng Disk",
"Mod. Device": "Device na Binago",
"Mod. Time": "Oras na Binago",
"More than a month ago": "Mahigit isang buwan na ang nakalipas",
"More than a week ago": "Mahigit isang linggo na ang nakalipas",
"More than a year ago": "Mahigit isang taon na ang nakalipas",
"Move to top of queue": "Ilipat sa taas ng queue",
"Multi level wildcard (matches multiple directory levels)": "Multi level wildcard (tumutugma sa maraming level ng direktoryo)",
"Never": "Hindi Kailanman",
"New Device": "Bagong Device",
"New Folder": "Bagong Folder",
"Newest First": "Pinakabago Muna",
"No": "Hindi",
"No File Versioning": "Walang File Versioning",
"No files will be deleted as a result of this operation.": "Walang mga file na buburahin bilang resulta ng operasyong ito.",
"No rules set": "Walang mga tinakda na tuntunin",
"No upgrades": "Walang mga upgrade",
"Not shared": "Hindi binabahagi",
"Notice": "Paunawa",
"Number of Connections": "Numero ng Mga Koneksyon",
"OK": "OK",
"Off": "Nakapatay",
"Oldest First": "Pinakaluma Muna",
"Optional descriptive label for the folder. Can be different on each device.": "Opsyonal na mapaglarawang label para sa folder. Maaaring magkaiba sa bawat device.",
"Options": "Mga Opsyon",
"Out of Sync": "Wala sa Sync",
"Out of Sync Items": "Mga Item na Wala sa Sync",
"Outgoing Rate Limit (KiB/s)": "Rate Limit ng Palabas (KiB/s)",
"Override": "I-override",
"Override Changes": "I-override ang mga Pagbabago",
"Ownership": "Pagmamay-ari",
"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 papunta sa folder sa computer na ito. Gagawin kapag hindi umiiral. Maaring gamitin ang tilde na character (~) bilang shortcut sa",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Path kung saan ilalagay ang mga bersyon (iwanang walang laman para sa default .stversions na direktoryo sa binabahaging folder).",
"Paths": "Mga Path",
"Pause": "I-pause",
"Pause All": "I-pause Lahat",
"Paused": "Naka-pause",
"Paused (Unused)": "Naka-pause (Hindi Ginamit)",
"Pending changes": "Mga nakabinbin na pagbabago",
"Periodic scanning at given interval and disabled watching for changes": "Ang pana-panahon na pag-scan sa ibinigay na pagitan at naka-disable ang panonood sa mga pagbabago",
"Periodic scanning at given interval and enabled watching for changes": "Ang pana-panahon na pag-scan sa ibinigay na pagitan at naka-enable ang panonood sa mga pagbabago",
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "Ang pana-panahon na pag-scan sa ibinigay na pagitan at nabigo ang panonood sa mga pagbabago, susubukan muli bawat 1m:",
"Permanently add it to the ignore list, suppressing further notifications.": "Permanenteng idagdag ito sa listahan ng huwag pansinin, pinipigilan ang mga karagdagang notification.",
"Please consult the release notes before performing a major upgrade.": "Mangyaring kumonsulta sa mga tala sa release bago magsagawa ng malaking pag-upgrade.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Mangyaring magtakda ng Authentikasyon ng GUI na User at Password sa dialog ng Mga Setting.",
"Please wait": "Mangyaring maghintay",
"Prefix indicating that the file can be deleted if preventing directory removal": "Prefix na nagsasaad na ang file ay maaaring burahin kung pinipigilan ang pagbura ng direktoryo",
"Prefix indicating that the pattern should be matched without case sensitivity": "Prefix na nagsasaad na ang pattern ay tutugma nang walang case sensitivity",
"Preparing to Sync": "Naghahandang Mag-Sync",
"Preview": "Preview",
"Preview Usage Report": "I-preview ang Ulat ng Paggamit",
"QR code": "QR code",
"QUIC LAN": "QUIC LAN",
"QUIC WAN": "QUIC WAN",
"Quick guide to supported patterns": "Mabilisang gabay para sa mga sinusuportahang pattern",
"Random": "Random",
"Receive Encrypted": "Makatanggap Naka-Encrypt",
"Receive Only": "Makatanggap Lamang",
"Received data is already encrypted": "Naka-encrypt na ang natanggap na data",
"Recent Changes": "Mga Kamakilang Pagbabago",
"Reduced by ignore patterns": "Binabawasan ng mga ignore pattern",
"Relay LAN": "Relay na LAN",
"Relay WAN": "Relay na WAN",
"Release Notes": "Mga Talaan ng Release",
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "Naglalaman ng mga kandidatong release ng mga pinakabagong feature at kaayusan. Ang mga ito ay katulad ng tradisyonal na bi-weekly Syncthing release.",
"Remote Devices": "Mga Remote Device",
"Remote GUI": "Remote GUI",
"Remove": "Tanggalin",
"Remove Device": "Tanggalin ang Device",
"Remove Folder": "Tanggalin ang Folder",
"Required identifier for the folder. Must be the same on all cluster devices.": "Kinakailangang pagkakilanlan para sa folder. Kailangang magkatulad sa lahat ng mga cluster device.",
"Rescan": "I-rescan",
"Rescan All": "I-rescan Lahat",
"Rescans": "Mga Rescan",
"Restart": "I-restart",
"Restart Needed": "Kinakailangan ng Restart",
"Restarting": "Nagre-restart",
"Restore": "I-restore",
"Restore Versions": "I-restore ang Mga Bersyon",
"Resume": "I-resume",
"Resume All": "I-resume Lahat",
"Reused": "Ginamit muli",
"Revert": "Ibalik",
"Revert Local Changes": "Ibalik ang mga Lokal na Pagbabago",
"Save": "I-save",
"Saving changes": "Sine-save ang mga pagbabago",
"Scan Time Remaining": "Natitirang Oras sa Pag-scan",
"Scanning": "Sina-scan",
"See external versioning help for supported templated command line parameters.": "Tingnan ang tulong sa external na pag-bersyon para sa mga sinusuportahang naka-template na parameter ng command line.",
"Select All": "Piliin Lahat",
"Select a version": "Pumili ng bersyon",
"Select additional devices to share this folder with.": "Pumili ng mga karagdagang device para ibagagi ang folder na ito.",
"Select additional folders to share with this device.": "Pumili ng mga karagdagang folder para ibagagi sa device na ito.",
"Select latest version": "Piliin ang pinakabagong bersyon",
"Select oldest version": "Piliin ang pinakalumang bersyon",
"Send & Receive": "Magpadala at Makatanggap",
"Send Extended Attributes": "Magpadala ng mga Pinalawak na Attribute",
"Send Only": "Magpadala Lamang",
"Send Ownership": "Ipadala ang Pagmamay-ari",
"Set Ignores on Added Folder": "Itakda ang mga Ignore sa Dinagdag na Folder",
"Settings": "Mga Setting",
"Share": "Ibahagi",
"Share Folder": "Ibahagi ang Folder",
"Share by Email": "Ibahagi sa Pamamagitan ng Email",
"Share by SMS": "Ipadala sa Pamamagitan ng SMS",
"Share this folder?": "Ibahagi ang folder na ito?",
"Shared Folders": "Mga Ibinahaging Folder",
"Shared With": "Ibinabahagi Sa",
"Sharing": "Binabahagi",
"Show ID": "Ipakita ang ID",
"Show QR": "Ipakita ang QR",
"Show detailed discovery status": "Magpakita ng detalyadong status sa pagtuklas",
"Show detailed listener status": "Ipakita ang detalyadong status sa listener",
"Show diff with previous version": "Ipakita ang diff sa nakaraang bersyon",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Ipinapakita sa halip na Device ID sa status ng cluster. Ia-advertise sa iba pang mga device bilang opsyonal na default na pangalan.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Ipinapakita sa halip na Device ID sa status ng cluster. Ia-update sa pangalan na ina-advertise ng device kung iiwanang walang laman.",
"Shutdown": "I-shutdown",
"Shutdown Complete": "Tapos na ang Shutdown",
"Simple": "Simple",
"Simple File Versioning": "Simpleng File Versioning",
"Single level wildcard (matches within a directory only)": "Single level na wildcard (tumutugma sa loob lamang ng isang direktoryo)",
"Size": "Laki",
"Smallest First": "Pinakamaliit muna",
"Some discovery methods could not be established for finding other devices or announcing this device:": "Ang ilang paraan ng pagtuklas ay hindi maitatag para sa paghahanap ng iba pang mga device o pag-anunsyo ng device na ito:",
"Some items could not be restored:": "Hindi ma-restore ang ilang mga file:",
"Some listening addresses could not be enabled to accept connections:": "Hindi ma-enable ng ilang mga listening address para makatanggap ng koneksyon:",
"Source Code": "Source Code",
"Stable releases and release candidates": "Mga stable na release at kandidatong release",
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.": "Ang mga matatag na release ay naantala ng humigit-kumulang dalawang linggo. Sa panahong ito dumaan sila sa pagsubok bilang mga kandidatong release.",
"Stable releases only": "Mga stable na release lamang",
"Staggered": "Naka-stagger",
"Staggered File Versioning": "Naka-stagger na File Versioning",
"Start Browser": "Simulan ang Browser",
"Statistics": "Mga Istatistika",
"Stay logged in": "Manatiling naka-log in",
"Stopped": "Nakatigil",
"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.": "Iniimbak at sini-sync lamang ang naka-encrypt na data. Ang mga folder sa lahat ng mga nakakonektang device ay kailangangang i-set up gamit ang katulad na password o na sa uri na \"{{receiveEncrypted}}\" din.",
"Subject:": "Paksa:",
"Support": "Support",
"Support Bundle": "Bundle ng Suporta",
"Sync Extended Attributes": "I-sync ang Mga Pinalawak na Attribute",
"Sync Ownership": "I-sync ang Pagmamay-ari",
"Sync Protocol Listen Addresses": "Mga Listen Address ng Sync Protocol",
"Sync Status": "Status ng Sync",
"Syncing": "Nagsi-sync",
"Syncthing device ID for \"{%devicename%}\"": "Syncthing device ID para sa \"{{devicename}}\"",
"Syncthing has been shut down.": "Nag-shut down na ang Syncthing.",
"Syncthing includes the following software or portions thereof:": "Kasama sa Syncthing ang sumusunod na software o mga bahagi nito:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Ang Syncthing ay Libre at Open Source na Software na nakalisensya sa MPL v2.0.",
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Ang Syncthing ay isang continuous na file synchronization na program. Sini-synchronize nito ang mga file sa pagitan ng dalawa o higit pang mga computer sa totoong oras, ligtas na protektado mula sa prying na mata. Ang iyong data ay iyong data at nararapat kang pumili kung saan sila ilalagay, kung binabahagi ito sa third party, at kung paano ito pinapadala sa Internet.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Nakikinig ang Syncthing sa mga sumusunod na network address para sa mga tangka sa koneksyon mula sa ibang device:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Hindi nakikinig ang Syncthing sa mga tangka sa koneksyon mula sa ibang mga device sa anumang address. Ang mga palabas na koneksyon lamang ay maaring gumana.",
"Syncthing is restarting.": "Nagre-restart ang Syncthing.",
"Syncthing is saving changes.": "Nagse-save ng mga pagbabago ang Syncthing.",
"Syncthing is upgrading.": "Naga-upgrade ang Syncthing.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Sinusuportahan na ng Syncthing ang pag-ulat ng mga crash sa mga developer. Naka-enable ang feature na ito bilang default.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Mukhang down ang Syncthing, o may problema sa iyong koneksyon sa Internet. Sinusubukan muli…",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Mukhang nagkakaroon ng problema ang Syncthing sa pagproseso ng iyong hiling. Paki-refresh ang page o i-restart ang Syncthing kapag nagpapatuloy ang problema.",
"TCP LAN": "TCP LAN",
"TCP WAN": "TCP WAN",
"Take me back": "Ibalik mo ako",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "Ang GUI address ay na-override ng mga opsyon sa pagsisimula. Ang mga pagbabago dito ay hindi magkakabisa habang ang pag-override ay nasa lugar.",
"The Syncthing Authors": "Ang Mga Awtor ng Syncthing",
"The Syncthing admin interface is configured to allow remote access without a password.": "Naka-configure ang Syncthing admin interface na payagan ang remote access nang walang password.",
"The aggregated statistics are publicly available at the URL below.": "Available nang publiko ang pinagsama-samang istatistika sa URL sa ibaba.",
"The cleanup interval cannot be blank.": "Hindi maaring walang laman ang pagitan ng paglinis.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Na-save na ang configuration ngunit hindi naka-activate. Kailangang mag-restart ang Syncthing para i-activate ang bagong configuration.",
"The device ID cannot be blank.": "Hindi maaring walang laman ang Device 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).": "Mahahanap ang device ID na ilalagay dito sa \"Mga Aksyon > Ipakita ang ID\" na dialog sa isa pang device. Opsyonal ang mga puwang at gitling (hindi pinapansin).",
"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.": "Araw-araw na pinapadala ang naka-encrypt na ulat sa paggamit. Ginagamit ito sa pag-track ng mga karaniwang platform, laki ng folder, at bersyon ng app. Kapag nabago ang tinakdang data ng ulat ipo-prompt kang muli ng dialog na ito.",
"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.": "Mukhang hindi angkop ang inilagay na device ID. Dapat itong 52 o 56 na character na string na binubuo ng mga titik at numero, na may mga puwang at gitling bilang opsyonal.",
"The folder ID cannot be blank.": "Hindi maaring walang laman ang folder ID.",
"The folder ID must be unique.": "Kailangang kakaiba ang folder ID.",
"The folder content on other devices will be overwritten to become identical with this device. Files not present here will be deleted on other devices.": "Io-overwrite ang nilalaman ng folder sa mga ibang device para maging magkapareho sa device na ito. Ang mga file na hindi nandito ay buburahin sa mga ibang device.",
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.": "Io-overwrite ang nilalaman ng folder sa mga ibang device para maging magkapareho sa device na ito. Ang mga file na kamakilang dinagdag dito ay buburahin sa mga ibang device.",
"The folder path cannot be blank.": "Hindi maaring walang laman ang path ng folder.",
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.": "Ang mga sumusunod na pagitan ay ginagamit: sa unang oras ang isang bersyon ay pinapanatili bawat 30 segundo, sa unang araw ang isang bersyon ay pinapanatili bawat oras, sa unang 30 araw ang isang bersyon ay pinapanatili bawat araw, hanggang sa pinakamataas na edad ang isang bersyon ay pinapanatili bawat linggo.",
"The following items could not be synchronized.": "Hindi ma-synchronize ang mga sumusunod na item.",
"The following items were changed locally.": "Binago ng lokal ang mga sumusunod na item.",
"The following methods are used to discover other devices on the network and announce this device to be found by others:": "Ang mga sumusunod na paraan ay ginagamit upang tumuklas ng mga ibang device sa network at ipahayag ang device na ito na mahanap ng iba:",
"The following text will automatically be inserted into a new message.": "Awtomatikong ilalagay ang sumusunod na text sa bagong mensahe.",
"The following unexpected items were found.": "Nahanap ang mga sumusunod na hindi inaasahang item.",
"The interval must be a positive number of seconds.": "Dapat positibong numero ng segundo ang pagitan.",
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Ang pagitan, bilang segundo, para sa pagtakbo ng paglinis sa versions na direktoryo. Sero para i-disable ang periodical na paglinis.",
"The maximum age must be a number and cannot be blank.": "Dapat numero ang pinakamataas na edad at hindi maaring walang laman.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Ang pinakamataas na oras para panatilihin ang bersyon (bilang araw, itakda sa 0 para panatilihin ang mga bersyon magpakailanman).",
"The number of connections must be a non-negative number.": "Dapat hindi negatibong numero ang bilang ng mga koneksyon.",
"The number of days must be a number and cannot be blank.": "Dapat numero ang bilang ng araw at hindi maaring walang laman.",
"The number of days to keep files in the trash can. Zero means forever.": "Ang bilang ng araw para panatilihin ang mga file sa basurahan. Ang sero ay ibig sabihin ay magpakailanman.",
"The number of old versions to keep, per file.": "Ang bilang ng mga lumang bersyon na dapat panatilihin, bawat file.",
"The number of versions must be a number and cannot be blank.": "Dapat numero ang bilang ng mga bersyon at hindi maaring walang laman.",
"The path cannot be blank.": "Hindi maaring walang laman ang path.",
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Ina-apply ang rate limit sa naipon na traffic ng lahat ng mga koneksyon sa device na ito.",
"The rate limit must be a non-negative number (0: no limit)": "Dapat hindi negatibong numero ang rate limit (0: walang limitasyon)",
"The remote device has not accepted sharing this folder.": "Hindi tinanggap ng remote device ang pagbahagi ng folder na ito.",
"The remote device has paused this folder.": "Na-pause ng remote device ang folder na ito.",
"The rescan interval must be a non-negative number of seconds.": "Dapat hindi negatibong bilang ng segundo ang pagitan ng rescan.",
"There are no devices to share this folder with.": "Walang mga device para ibahagi ang folder na ito sa.",
"There are no file versions to restore.": "Walang mga file version na ibabalik.",
"There are no folders to share with this device.": "Walang mga folder na ibabahagi sa device na ito.",
"They are retried automatically and will be synced when the error is resolved.": "Awtomatikong sinusubok muli ang mga ito at isi-sync kapag nalutas ang error.",
"This Device": "Itong Device",
"This Month": "Itong Buwan",
"This can easily give hackers access to read and change any files on your computer.": "Madali nitong mabibigyan ang mga hacker ng access na basahin at baguhin ang anumang mga file sa iyong computer.",
"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.": "Hindi awtomatikong tutuklasin ng device na ito ng mga ibang device o i-annouce ang sarili nitong address para mahanap ng iba. Makakakonekta lamang ang mga device na may static na naka-configure na address.",
"This is a major version upgrade.": "Ito ay isang upgrade sa major na bersyon.",
"This setting controls the free space required on the home (i.e., index database) disk.": "Kinokontrol ng setting na ito ang kinakailangan na bakanteng espasyo sa home (hal., index database) disk.",
"Time": "Oras",
"Time the item was last modified": "Oras na huling binago ang file",
"To connect with the Syncthing device named \"{%devicename%}\", add a new remote device on your end with this ID:": "Para kumonekta sa Syncthing device na nakapangalan na \"{{devicename}}\", magdagdag ng bagong remote device sa iyong dulo gamit ang ID na ito:",
"To permit a rule, have the checkbox checked. To deny a rule, leave it unchecked.": "Upang payagan ang isang panuntunan, lagyan ng check ang checkbox. Upang tanggihan ang isang panuntunan, iwanan itong walang check.",
"Today": "Ngayon",
"Trash Can": "Basurahan",
"Trash Can File Versioning": "Basurahan na File Versioning",
"Type": "Uri",
"UNIX Permissions": "Mga Pahintulot na UNIX",
"Unavailable": "Hindi Available",
"Unavailable/Disabled by administrator or maintainer": "Hindi Available/Na-disable ng tagapangasiwa",
"Undecided (will prompt)": "Undecided (magbibigay ng prompt)",
"Unexpected Items": "Mga Hindi Inaasahang Item",
"Unexpected items have been found in this folder.": "Nakahanap ng mga hindi inaasahang item sa folder na ito.",
"Unignore": "I-unignore",
"Unknown": "Hindi Alam",
"Unshared": "Hindi Binahagi",
"Unshared Devices": "Mga Hindi Binahaging Device",
"Unshared Folders": "Mga Hindi Binahaging Folder",
"Untrusted": "Hindi Pinagkakatiwalaan",
"Up to Date": "Napapanahon",
"Updated {%file%}": "Binago ang {{file}}",
"Upgrade": "Mag-upgrade",
"Upgrade To {%version%}": "Mag-upgrade Sa {{version}}",
"Upgrading": "Naga-upgrade",
"Upload Rate": "Rate ng Pag-upload",
"Uptime": "Uptime",
"Usage reporting is always enabled for candidate releases.": "Palaging naka-enable ang pag-uulat ng paggamit sa mga kandidatong release.",
"Use HTTPS for GUI": "Gumamit ng HTTPS para sa GUI",
"Use notifications from the filesystem to detect changed items.": "Gumamit ng mga notification mula sa filesystem para mag-detect ng mga nabagong item.",
"User": "Gumagamit",
"User Home": "Home ng User",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Hindi nakatakda ang Username/Password para sa authentikasyon sa GUI. Isaalang-alang na i-set up.",
"Using a QUIC connection over LAN": "Gumagamit ng QUIC na koneksyon mula sa LAN",
"Using a QUIC connection over WAN": "Gumagamit ng QUIC na koneksyon mula sa WAN",
"Using a direct TCP connection over LAN": "Gumagamit ng direktang TCP na koneksyon mula sa LAN",
"Using a direct TCP connection over WAN": "Gumagamit ng direktang TCP na koneksyon mula sa WAN",
"Version": "Bersyon",
"Versions": "Mga Bersyon",
"Versions Path": "Path ng Mga Bersyon",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Awtomatikong buburahin ang mgs bersyon kapag mas matanda sila kaysa sa pinakamataas na edad o lumalagpas sa numero ng mga file na pinapayagan sa pagitan.",
"Waiting to Clean": "Naghihintay para Linisin",
"Waiting to Scan": "Naghihintay para Mag-scan",
"Waiting to Sync": "Naghihintay para Mag-sync",
"Warning": "Babala",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "Babala, ang path na ito ay parent directory ng umiiral na folder na \"{{otherFolder}}\".",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Babala, ang path na ito ay parent directory ng umiiral na folder na \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Babala, ang path na ito ay isang subdirectory ng umiiral na folder na \"{{otherFolder}}\".",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Babala, ang path na ito ay isang subdirectory ng umiiral na folder na \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "Babala: Kapag gumagamit ka ng panlabas na watcher tulad ng {{syncthingInotify}}, dapag siguraduhin mo na naka-deactivate iyan.",
"Watch for Changes": "Manood para sa Mga Pagbabago",
"Watching for Changes": "Nanonood para sa Mga Pagbabago",
"Watching for changes discovers most changes without periodic scanning.": "Ang panonood para sa mga pagbabago ay tumutuklas ng mga karamihang pagbabago nang walang periodic na pag-scan.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Kapag nagdaragdag ng bagong device, tandaan na dapat ding idagdag ang device na ito sa kabilang panig.",
"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.": "Kapag nagdaragdag ng bagong folder, tandaan na ang Folder ID ay ginagamit para iugnay ang mga folder sa pagitan ng mga device. Case senitive sila at dapat eksaktong tumugma sa pagitan ng mga device.",
"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.": "Kapag nakatakda sa higit sa isa sa parehong device, susubukan ng Syncthing na magtatag ng maraming magkakasabay na koneksyon. Kung magkaiba ang mga halaga, ang pinakamataas ang gagamitin. Itakda sa zero upang hayaan ang Syncthing na magpasya.",
"Yes": "Oo",
"Yesterday": "Kahapon",
"You can also copy and paste the text into a new message manually.": "Maari mo ring kopyahin at i-paste ang text sa isang bagong mensahe nang manwal.",
"You can also select one of these nearby devices:": "Maari mo ring piliin ang isa sa mga malapit na device:",
"You can change your choice at any time in the Settings dialog.": "Pwede mong palitan ang iyong kagustuhan sa anumang oras sa dialog ng Mga Setting.",
"You can read more about the two release channels at the link below.": "Maaari kang magbasa nang higit pa tungkol sa dalawang release channel sa link sa ibaba.",
"You have no ignored devices.": "Wala kang mga hindi pinapansin na device.",
"You have no ignored folders.": "Wala kang mga hindi pinapansin na folder.",
"You have unsaved changes. Do you really want to discard them?": "Mayroon kang mga hindi na-save na pagbabago. Gusto mo ba talagang i-discard ang mga ito?",
"You must keep at least one version.": "Kailangan mong magpanatili ng kahit isang bersyon.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Hindi ka dapat magdagdag o magpalit ng anumang lokal sa folder na \"{{receiveEncrypted}}\".",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "Magbubukas ang iyong SMS app para hayaan kang pumili ng tatanggap at ipadala ito mula sa sarili mong numero.",
"Your email app should open to let you choose the recipient and send it from your own address.": "Magbubukas ang iyong email app para hayaan kang pumili ng tatanggap at ipadala mula sa sarili mong address.",
"days": "araw",
"deleted": "binura",
"deny": "tanggihan",
"directories": "mga direktoryo",
"file": "file",
"files": "mga file",
"folder": "folder",
"full documentation": "punong dokumentasyon",
"items": "mga item",
"modified": "binago",
"permit": "payagan",
"seconds": "segundo",
"theme": {
"name": {
"black": "Itim",
"dark": "Madilim",
"default": "Default",
"light": "Maliwanag"
}
},
"unknown device": "hindi alam na device",
"{%device%} wants to share folder \"{%folder%}\".": "Gustong ibahagi ng {{device}} ang folder na \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "Gustong ibahagi ng {{device}} ang folder na \"{{folderlabel}}\" ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "Maaring ipakilala muli ng {{reintroducer}} ang device na ito."
}

View File

@@ -35,6 +35,7 @@
"Are you sure you want to remove device {%name%}?": "Está seguro de que desexa eliminar o dispositivo {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Está seguro de que desexa eliminar o cartafol {{label}}?",
"Are you sure you want to restore {%count%} files?": "Está seguro de que desexa restaurar {{count}} ficheiros?",
"Are you sure you want to revert all local changes?": "Está seguro de que quere reverter todos os cambios locais?",
"Are you sure you want to upgrade?": "Está seguro de que desexa actualizar?",
"Authors": "Autores",
"Auto Accept": "Aceptar automaticamente",
@@ -47,9 +48,11 @@
"Bugs": "Erros",
"Cancel": "Cancelar",
"Changelog": "Rexistro de cambios",
"Cleaning Versions": "Limpando Versións",
"Cleanup Interval": "Intervalo de Limpeza",
"Click to see full identification string and QR code.": "Faga clic para ver a cadea de identificación completa e o código QR.",
"Close": "Pechar",
"Comment, when used at the start of a line": "Comentar, cando se usa ao inicio dunha liña",
"Compression": "Compresión",
"Configuration Directory": "Directorio de Configuración",
"Configuration File": "Ficheiro de Configuración",
@@ -60,12 +63,19 @@
"Connection Type": "Tipo de Conexión",
"Connections": "Conexións",
"Connections via relays might be rate limited by the relay": "As conexións a través de relevos poden estar limitados polo relevo",
"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.": "Agora está dispoñible o control de cambios continuo en Syncthing. Esto detectará cambios no disco e fará un escaneo só nas rutas modificadas. Os beneficios son que os cambios propaganse máis rapido e fan falta menos escaneos completos.",
"Copied from elsewhere": "Copiado doutro sitio",
"Copied from original": "Copiado do orixinal",
"Copied!": "Copiado!",
"Copy": "Copiar",
"Copy failed! Try to select and copy manually.": "Fallou a copia! Probe a seleccionar e copiar manualmente.",
"Danger!": "Perigo!",
"Database Location": "Localización da Base de Datos",
"Default": "Predeterminado",
"Default Configuration": "Configuración Predeterminada",
"Default Device": "Dispositivo Predeterminado",
"Default Folder": "Cartafol Predeterminado",
"Default Ignore Patterns": "Patróns de Ignorado Predeterminados",
"Delete": "Eliminar",
"Delete Unexpected Items": "Eliminar os Ítems Inesperados",
"Deleted {%file%}": "Eliminado {{file}}",
@@ -74,11 +84,14 @@
"Deselect folders to stop sharing with this device.": "Deseleccionar os cartafois que deixar de compartir con este dispositivo.",
"Device": "Dispositivo",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "O dispositivo \"{{name}}\" ({{device}} en {{address}}) quere conectarse. Engadir o dispositivo?",
"Device Certificate": "Certificado do Dispositivo",
"Device ID": "ID do dispositivo",
"Device Identification": "Identificación do dispositivo",
"Device Name": "Nome do dispositivo",
"Device Status": "Estado do dispositivo",
"Device that last modified the item": "Dispositivo que modificou o elemento por última vez",
"Devices": "Dispositivos",
"Disable Crash Reporting": "Desactivar o Informe de Erros",
"Disabled": "Deshabilitado",
"Discard": "Descartar",
"Disconnected": "Desconectado",
@@ -90,6 +103,7 @@
"Discovery Status": "Estado do Descubrimento",
"Dismiss": "Descartar",
"Do not restore": "Non restaurar",
"Do you want to enable watching for changes for all your folders?": "Quere habilitar o control de cambios para todos os seus cartafois?",
"Documentation": "Documentación",
"Download Rate": "Velocidade de Descarga",
"Downloaded": "Descargado",

View File

@@ -6,11 +6,14 @@
"About": "Om",
"Action": "Handling",
"Actions": "Handlinger",
"Active filter rules": "Regler for aktive filtre",
"Add": "Legg til",
"Add Device": "Legg til enhet",
"Add Folder": "Legg til mappe",
"Add Remote Device": "Legg til ekstern enhet",
"Add devices from the introducer to our device list, for mutually shared folders.": "Legg til enheter fra introdusøren til vår enhetsliste, for innbyrdes delte mapper.",
"Add filter entry": "Legge til filteroppføring",
"Add ignore patterns": "Legg til ignorerte mønstre",
"Add new folder?": "Legg til ny mappe?",
"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.": "I tillegg vil omskanningsintervallen bli økt (ganger 60. altså nytt forvalg på 1t). Du kan også sette den opp manuelt for hver mappe senere etter å ha valgt \"Nei\".",
"Address": "Adresse",
@@ -18,15 +21,26 @@
"Advanced": "Avansert",
"Advanced Configuration": "Avanserte innstillinger",
"All Data": "Alle data",
"All Time": "All tid",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Alle mapper som deles med denne enheten må beskyttes av et passord, slik at alle sendte data er uleselige uten det oppgitte passordet.",
"Allow Anonymous Usage Reporting?": "Tillat anonym innsamling av brukerdata?",
"Allowed Networks": "Tillatte nettverk",
"Alphabetic": "Alfabetisk",
"Altered by ignoring deletes.": "Endret ved å ignorere slettinger.",
"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 tar hånd om versjoneringen. Den må fjerne filen fra den delte mappen. Hvis stien til programmet inneholder mellomrom, må den siteres.",
"Anonymous Usage Reporting": "Anonym innsamling av brukerdata",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Det anonyme bruksrapportformatet har endret seg. Ønsker du å gå over til det nye formatet?",
"Applied to LAN": "Gjelder LAN",
"Apply": "Bruk",
"Are you sure you want to override all remote changes?": "Er du sikker på at du vil overstyre alle eksterne endringer?",
"Are you sure you want to permanently delete all these files?": "Er du sikker på at du vil slette alle disse filene permanent?",
"Are you sure you want to remove device {%name%}?": "Er du sikker på at du ønsker å fjerne enheten {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Er du sikker på at du ønsker å fjerne mappen {{label}}?",
"Are you sure you want to restore {%count%} files?": "Er du sikker på at du ønsker å gjenopprette {{count}} filer?",
"Are you sure you want to revert all local changes?": "Er du sikker på at du vil tilbakestille alle lokale endringer?",
"Are you sure you want to upgrade?": "Er du sikker på at du vil oppgradere?",
"Authentication Required": "Autentisering kreves",
"Authors": "Forfattere",
"Auto Accept": "Godta automatisk",
"Automatic Crash Reporting": "Automatisk krasjrapportering",
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Automatisk oppgradering lar deg nå få valget mellom ferdige utgaver og utgivelseskandidater.",
@@ -35,29 +49,58 @@
"Automatically create or share folders that this device advertises at the default path.": "Opprett eller del mapper automatisk i mapper som denne enheten melder som forvalgt mappe.",
"Available debug logging facilities:": "Tilgjengelige funksjoner for logging i feilrettingsøyemed:",
"Be careful!": "Vær forsiktig!",
"Body:": "Kropp:",
"Bugs": "Programfeil",
"Cancel": "Avbryt",
"Changelog": "Endringslogg",
"Clean out after": "Tøm etter",
"Cleaning Versions": "Tømme versjoner",
"Cleanup Interval": "Tømme intervall",
"Click to see full identification string and QR code.": "Klikk for å se hele identifikasjonsstrengen og QR-koden.",
"Close": "Lukk",
"Command": "Kommando",
"Comment, when used at the start of a line": "Kommentar, når det blir brukt i starten av en linje.",
"Comment, when used at the start of a line": "Kommentar, når det blir brukt i starten av en linje",
"Compression": "Komprimering",
"Configuration Directory": "Konfigurasjonskatalog",
"Configuration File": "Konfigurasjonsfil",
"Configured": "Oppsatt",
"Connected (Unused)": "Tilkoblet (ubrukt)",
"Connection Error": "Tilkoblingsfeil",
"Connection Management": "Tilkoblingsadministrasjon",
"Connection Type": "Tilkoblingstype",
"Connections": "Tilkoblinger",
"Connections via relays might be rate limited by the relay": "Tilkoblinger via releer kan være hastighetsbegrenset av reléet",
"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.": "Kontinuerlig oppsyn med endringer er nå tilgjengelig i Syncthing. Dette vil oppdage endringer på disk, og utstede full skanning bare for endrede deler. Fordelen er at endringer sprer seg raskere, og at færre fulle skanninger kreves.",
"Copied from elsewhere": "Kopiert fra et annet sted",
"Copied from original": "Kopiert fra original",
"Copied!": "Kopiert!",
"Copy": "Kopier",
"Copy failed! Try to select and copy manually.": "Kopiering mislyktes! Prøv å merke og kopiere manuelt.",
"Currently Shared With Devices": "Deles for øyeblikket med enheter",
"Custom Range": "Tilpasset område",
"Danger!": "Fare!",
"Database Location": "Database plassering",
"Debugging Facilities": "Feilrettingsverktøy",
"Default": "Standard",
"Default Configuration": "Standard konfigurasjon",
"Default Device": "Standard enhet",
"Default Folder": "Standard mappe",
"Default Ignore Patterns": "Standard ignoreringsmønstre",
"Defaults": "Standarder",
"Delete": "Slett",
"Delete Unexpected Items": "Slett uventede elementer",
"Deleted {%file%}": "Slettet {{file}}",
"Deselect All": "Fjern alle markeringer",
"Deselect devices to stop sharing this folder with.": "Fjern merkingen av enheter for å slutte å dele denne mappen med dem.",
"Deselect folders to stop sharing with this device.": "Fjern merkingen av mapper for å slutte å dele med denne enheten.",
"Device": "Enhet",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Enhet \"{{name}}\" ({{device}} på {{address}}) ønsker å koble til. Legge til ny enhet?",
"Device Certificate": "Enhetssertifikat",
"Device ID": "Enhets-ID",
"Device Identification": "Enhetskjennemerke",
"Device Identification": "Enhetsidentifikasjon",
"Device Name": "Navn på enhet",
"Device Status": "Enhetsstatus",
"Device is untrusted, enter encryption password": "Enheten er ikke godkjent, angi krypteringspassord",
"Device rate limits": "enhetshastighetsgrense",
"Device that last modified the item": "Enheten som sist endret elementet",
"Devices": "Enheter",
@@ -66,30 +109,42 @@
"Disabled periodic scanning and disabled watching for changes": "Skrudde av både periodisk skanning og oppsyn med endringer",
"Disabled periodic scanning and enabled watching for changes": "Skrudde av periodisk skanning og skrudde på oppsyn med endringer",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Skrudde av periodisk skanning og mislyktes i oppsett av oppsyn med endringer, prøver igjen hvert minutt:",
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Deaktiverer sammenligning og synkronisering av filtillatelser. Nyttig på systemer med ikke-eksisterende eller tilpassede tillatelser (f.eks. FAT, exFAT, Synology, Android).",
"Discard": "Kasser",
"Disconnected": "Frakoblet",
"Disconnected (Inactive)": "Frakoblet (inaktiv)",
"Disconnected (Unused)": "Frakoblet (ubrukt)",
"Discovered": "Oppdaget",
"Discovery": "Oppslag",
"Discovery": "Oppdagelse",
"Discovery Failures": "Oppslagsfeil",
"Discovery Status": "Oppdagelses status",
"Dismiss": "Avvis",
"Do not add it to the ignore list, so this notification may recur.": "Ikke legg den til i ignoreringslisten, så dette varselet kan gjentas.",
"Do not restore": "Ikke gjenopprett",
"Do not restore all": "Ikke gjenopprett alle",
"Do you want to enable watching for changes for all your folders?": "Ønsker du å skru på oppsyn med endringer for alle dine mapper?",
"Documentation": "Dokumentasjon",
"Download Rate": "Nedlastingsrate",
"Download Rate": "Nedlastingshastighet",
"Downloaded": "Lastet ned",
"Downloading": "Laster ned",
"Edit": "Rediger",
"Edit Device": "Rediger enhet",
"Edit Device Defaults": "Endre enhetens standardverdier",
"Edit Folder": "Rediger mappe",
"Edit Folder Defaults": "Endre mappens standardverdier",
"Editing {%path%}.": "Redigerer {{path}}.",
"Enable Crash Reporting": "Skru på krasjrapportering",
"Enable NAT traversal": "Slå på NAT-traversering",
"Enable Relaying": "Aktiver reléforsendelse",
"Enabled": "Påskrudd",
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Gjør det mulig å sende utvidede attributter til andre enheter og bruke innkommende utvidede attributter. Kan kreve kjøring med utvidede rettigheter.",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Skriv inn et ikke-negativt nummer (f.eks. \"2.35\") og velg en enhet. Prosenter er deler av total diskstørrelse.",
"Enter a non-privileged port number (1024 - 65535).": "Skriv inn et ikke-priviligert portnummer (1024-65535).",
"Enter ignore patterns, one per line.": "Skriv inn mønster som skal utelates, ett per linje.",
"Error": "Feilmelding",
"Extended Attributes": "Utvidede attributter",
"Extended Attributes Filter": "Utvidede attributters filter",
"External": "Ekstern",
"External File Versioning": "Ekstern versjonskontroll",
"Failed Items": "Elementsynkronisering som har mislyktes",
"Failed to setup, retrying": "Klarte ikke å utføre oppsett, prøver igjen",
@@ -106,6 +161,7 @@
"Folder ID": "Mappe-ID",
"Folder Label": "Merkelapp for mappe",
"Folder Path": "Mappeplassering",
"Folder Status": "Mappe status",
"Folder Type": "Mappetype",
"Folders": "Mapper",
"Full Rescan Interval (s)": "Intervall for fullstendig omskanning (s)",
@@ -116,25 +172,32 @@
"GUI Theme": "GUI-tema",
"General": "Hovedinnstillinger",
"Generate": "Generer",
"Global Discovery": "Globalt oppslag",
"Global Discovery Servers": "Globale oppslagstjenere",
"Global Discovery": "Global oppdagelse",
"Global Discovery Servers": "Globale oppdagelses servere",
"Global State": "Global tilstand",
"Help": "Hjelp",
"Home page": "Hjemmeside",
"Identification": "Identifikasjon",
"Ignore": "Ignorer",
"Ignore Patterns": "Utelatelsesmønster",
"Ignore Permissions": "Ignorer rettigheter",
"Ignored Devices": "Ignorerte enheter",
"Ignored Folders": "Utelatte mapper",
"Ignored at": "Ignorert i",
"Included Software": "Inkludert programvare",
"Incoming Rate Limit (KiB/s)": "Innkommende hastighetsbegrensning (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Feilaktige innstillinger kan skade innholdet i dine delte mapper og hindre Syncthing i å fungere.",
"Incorrect user name or password.": "Feil brukernavn eller passord.",
"Introduced By": "Introdusert av",
"Introducer": "Introduktør",
"Introduction": "Introduksjon",
"Inversion of the given condition (i.e. do not exclude)": "Invers av den gitte tilstanden (dvs. ekskluder ikke)",
"Keep Versions": "Behold versjoner",
"LDAP": "LDAP",
"Largest First": "Største fil først",
"Last 30 Days": "Siste 30 dager",
"Last 7 Days": "Siste 7 dager",
"Last Month": "Sist måned",
"Last Scan": "Siste gjennomsøking",
"Last seen": "Sist sett",
"Latest Change": "Sist endret",
@@ -143,11 +206,14 @@
"Listeners": "Lyttere",
"Loading data...": "Laster inn data…",
"Loading...": "Laster…",
"Local Discovery": "Lokalt oppslag",
"Local Discovery": "Lokal oppdagelse",
"Local State": "Lokal tilstand",
"Local State (Total)": "Lokal tilstand (total)",
"Locally Changed Items": "Lokalt endrede elementer",
"Log": "Logg",
"Log File": "Loggfil",
"Log In": "Logg inn",
"Log Out": "Logg ut",
"Logs": "Logger",
"Major Upgrade": "Storoppgradering",
"Mass actions": "Massehandlinger",
@@ -156,6 +222,9 @@
"Minimum Free Disk Space": "Nødvendig ledig diskplass",
"Mod. Device": "Endringsenhet",
"Mod. Time": "Endringstid",
"More than a month ago": "Mer enn en måned siden",
"More than a week ago": "Mer enn en uke siden",
"More than a year ago": "Mer enn et år siden",
"Move to top of queue": "Flytt fremst i køen",
"Multi level wildcard (matches multiple directory levels)": "Multinivåsøk (søker på flere mappenivå)",
"Never": "Aldri",
@@ -166,15 +235,19 @@
"No File Versioning": "Ingen versjonskontroll",
"No files will be deleted as a result of this operation.": "Ingen filer vil bli slettet som følge av denne operasjonen.",
"No upgrades": "Ingen oppgraderinger",
"Not shared": "Ikke delt",
"Notice": "Merknader",
"OK": "OK",
"Off": "Av",
"Oldest First": "Den eldste først",
"Optional descriptive label for the folder. Can be different on each device.": "Valgfri merkelapp på mappa. Denne kan være ulik på forskjellige enheter",
"Optional descriptive label for the folder. Can be different on each device.": "Valgfri merkelapp på mappa. Denne kan være ulik på forskjellige enheter.",
"Options": "Valg",
"Out of Sync": "Ikke synkronisert",
"Out of Sync Items": "Usynkroniserte elementer",
"Outgoing Rate Limit (KiB/s)": "Utgående hastighetsbegrensning (KiB/s)",
"Override Changes": "Overstyr endringer",
"Ownership": "Eierskap",
"Password": "Passord",
"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": "Plasseringen av mappen på datamaskinen. Denne vil bli opprettet dersom den ikke finnes. Krøllstrektegnet (~) kan brukes som forkortelse for",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Plasseringen for lagrede versjoner (la denne være tom for å bruke den forvalgte .stversions-mappa i den delte mappa).",
@@ -192,20 +265,22 @@
"Prefix indicating that the pattern should be matched without case sensitivity": "Prefiks som indikerer at mønsteret skal samsvare uten versalsensitivitet",
"Preview": "Forhåndsvisning",
"Preview Usage Report": "Forhåndsvisning av datainnsamling",
"QR code": "QR kode",
"Quick guide to supported patterns": "Kjapp innføring i godkjente mønstre",
"Random": "Tilfeldig",
"Receive Encrypted": "Motta kryptert",
"Receive Only": "Bare motta",
"Recent Changes": "Nylige endringer",
"Reduced by ignore patterns": "Reduser med utelatelsesmønster",
"Release Notes": "Utgivelsesnotat",
"Release Notes": "Utgivelsesnotater",
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "Utgivelseskandidater inneholder de seneste problemfiksene og funksjonene. De ligner på de tradisjonelle Syncthing-utgivelsene som kom hver andre uke.",
"Remote Devices": "Andre enheter",
"Remove": "Fjern",
"Remove Device": "Fjern enhet",
"Remove Folder": "Fjern mappe",
"Required identifier for the folder. Must be the same on all cluster devices.": "Påkrevd identifikator for mappa. Denne må være lik på alle enheter i samme klynge.",
"Rescan": "Gjennomsøk på nytt",
"Rescan All": "Gjennomsøk alt på nytt",
"Rescan": "Gjennomsøk",
"Rescan All": "Gjennomsøk alt",
"Rescans": "Omskanninger",
"Restart": "Omstart",
"Restart Needed": "Omstart kreves",
@@ -217,6 +292,7 @@
"Reused": "Gjenbrukt",
"Revert Local Changes": "Tilbakestill lokale endringer",
"Save": "Lagre",
"Saving changes": "Lagrer endringer",
"Scan Time Remaining": "Gjenstående tid for gjennomsøking",
"Scanning": "Gjennomsøker",
"See external versioning help for supported templated command line parameters.": "Se ekstern versjoneringshjelp for støttede mal-baserte kommandolinjeparameter.",
@@ -226,10 +302,14 @@
"Select oldest version": "Velg eldste versjon",
"Send & Receive": "Sende og motta",
"Send Only": "Bare send",
"Send Ownership": "Send eierskap",
"Settings": "Innstillinger",
"Share": "Del",
"Share Folder": "Del mappe",
"Share by Email": "Del via epost",
"Share by SMS": "Del via SMS",
"Share this folder?": "Del denne mappa?",
"Shared Folders": "Delte mapper",
"Shared With": "Delt med",
"Sharing": "Deling",
"Show ID": "Vis ID",
@@ -239,6 +319,7 @@
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Vist i stedet for mappe-ID i gruppestatus. Vil bli oppdatert til navnet enheten kringkaster dersom tomt.",
"Shutdown": "Avslutt",
"Shutdown Complete": "Avslutning fullført",
"Simple": "Enkel",
"Simple File Versioning": "Enkel versjonskontroll",
"Single level wildcard (matches within a directory only)": "Enkeltnivåsøk (søker kun i en mappe)",
"Size": "Størrelse",
@@ -251,32 +332,39 @@
"Staggered File Versioning": "Forskjøvet versjonskontroll",
"Start Browser": "Start nettleser",
"Statistics": "Statistikk",
"Stay logged in": "Forbli innlogget",
"Stopped": "Stoppet",
"Support": "Brukerstøtte",
"Support Bundle": "Støttebunt",
"Sync Extended Attributes": "Synkroniser utvidede attributter",
"Sync Ownership": "Synkroniser eierskap",
"Sync Protocol Listen Addresses": "Lytteadresse for synkroniseringsprotokoll",
"Sync Status": "Synkroniser status",
"Syncing": "Synkroniserer",
"Syncthing has been shut down.": "Syncthing har blitt slått av.",
"Syncthing includes the following software or portions thereof:": "Syncthing inkluderer helt eller delvis følgende programvare:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing er fri programvare med MPL v2.0-lisens.",
"Syncthing is restarting.": "Syncthing starter på ny.",
"Syncthing is saving changes.": "Syncthing lagrer endringer.",
"Syncthing is upgrading.": "Syncthing oppgraderer.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing ser ut til å være nede, eller så er det et problem med nettforbindelsen din. Prøver på ny …",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing ser ut til å ha støtt på et problem under behandling av din forespørsel. Gjenoppfrisk nettleseren eller start Syncthing på nytt dersom problemet vedvarer.",
"Take me back": "Gå tilbake",
"The Syncthing Authors": "Syncthings forfattere",
"The Syncthing admin interface is configured to allow remote access without a password.": "Grensesnittet for administrering av Syncthing er satt til å tillate ekstern tilgang uten et passord.",
"The aggregated statistics are publicly available at the URL below.": "Innsamlet statistikk er åpent tilgjengelig via nettadressen angitt nedenfor.",
"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 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 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.",
"The folder path cannot be blank.": "Mappeplasseringen kan ikke være tom.",
"The folder path cannot be blank.": "Mappe-stien kan ikke være tom.",
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.": "Følgende intervall blir brukt: Den første timen blir en versjon lagret hvert 30. sekund, den første dagen blir en versjon lagret hver time, de første 30 dagene blir en versjon lagret hver dag, og inntil maksimal levetid blir en versjon lagret hver uke.",
"The following items could not be synchronized.": "Følgende filer kunne ikke synkroniseres.",
"The following items were changed locally.": "Følgende elementer ble endret lokalt.",
"The following text will automatically be inserted into a new message.": "Den følgende teksten vil automatisk bli lagt til i en ny melding.",
"The maximum age must be a number and cannot be blank.": "Maksimal levetid må være et tall og kan ikke være tomt.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Maksimal tid å beholde en versjon (i dager, sett til 0 for å beholde versjoner på ubegrenset tid).",
"The number of days must be a number and cannot be blank.": "Antall dager må være et tall og kan ikke være tomt.",
@@ -286,34 +374,46 @@
"The path cannot be blank.": "Plasseringen kan ikke være tom.",
"The rate limit must be a non-negative number (0: no limit)": "Hastighetsbegrensningen kan ikke være et negativt tall (0: ingen begrensing)",
"The rescan interval must be a non-negative number of seconds.": "Antall sekund for intervallet kan ikke være negativt.",
"There are no file versions to restore.": "Det er ingen filversjoner å gjenopprette.",
"There are no folders to share with this device.": "Det er ingen mapper å dele med denne enheten.",
"They are retried automatically and will be synced when the error is resolved.": "Disse hentes automatisk og vil synkroniseres når feilen er blitt utbedret.",
"This Device": "Denne enheten",
"This Month": "Denne måned",
"This can easily give hackers access to read and change any files on your computer.": "Dette kan lett gi hackere tilgang til å lese og endre alle filer på datamaskinen din.",
"This is a major version upgrade.": "Dette er en storoppgradering",
"This is a major version upgrade.": "Dette er en stor versjonsoppgradering.",
"This setting controls the free space required on the home (i.e., index database) disk.": "Denne innstillingen kontrollerer ledig diskplass krevd på hjemme- (f.eks. indekseringsdatabase-) disken.",
"Time": "Klokkeslett",
"Time the item was last modified": "Tidspunktet elementet sist ble endret",
"Today": "I dag",
"Trash Can File Versioning": "Papirkurv versjonskontroll",
"UNIX Permissions": "UNIX tillatelser",
"Unavailable": "Utilgjengelig",
"Unavailable/Disabled by administrator or maintainer": "Utilgjengelig/avskrudd av administrator eller vedlikeholder",
"Undecided (will prompt)": "Ikke bestemt (vil spørre)",
"Unignore": "Ikke ignorer",
"Unknown": "Ukjent",
"Unshared": "Ikke delt",
"Unshared Devices": "Udelte enheter",
"Unshared Folders": "Udelte mapper",
"Up to Date": "Oppdatert",
"Updated {%file%}": "Oppdatert {{file}}",
"Upgrade": "Oppgradere",
"Upgrade To {%version%}": "Oppgrader til {{version}}",
"Upgrading": "Oppgraderer",
"Upload Rate": "Opplastingsrate",
"Uptime": "Oppetid",
"Usage reporting is always enabled for candidate releases.": "Bruksrapportering er alltid påslått for utgivelseskandidater",
"Usage reporting is always enabled for candidate releases.": "Bruksrapportering er alltid påslått for utgivelseskandidater.",
"Use HTTPS for GUI": "Bruk HTTPS for GUI",
"Use notifications from the filesystem to detect changed items.": "Bruk varslinger fra filsystemet for å oppdage endrede elementer.",
"User": "Bruker",
"Version": "Versjon",
"Versions": "Versjoner",
"Versions Path": "Plassering av versjoner",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Versjoner blir automatisk slettet når maksimal levetid er nådd eller når antall filer er oversteget.",
"Waiting to Clean": "Venter på å rydde opp",
"Waiting to Scan": "Venter på å starte gjennomsøkning",
"Waiting to Sync": "Venter på å synkronisere",
"Warning": "Advarsel",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "Advarsel, denne stien er en foreldremappe for en eksisterende mappe \"{{otherFolder}}\".",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Advarsel, denne stien er en foreldremappe for en eksisterende mappe \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Advarsel, denne stien er en undermappe i en eksisterende mappe \"{{otherFolder}}\".",
@@ -324,18 +424,39 @@
"When adding a new device, keep in mind that this device must be added on the other side too.": "Når du legger til en ny enhet, husk at enheten må legges til på andre siden også.",
"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 en ny mappe blir lagt til, husk at Mappe-ID blir brukt til å binde sammen mapper mellom enheter. Det er forskjell på store og små bokstaver, så IDene må være identiske på alle enhetene.",
"Yes": "Ja",
"Yesterday": "I går",
"You can also copy and paste the text into a new message manually.": "Du kan også kopiere og lime inn teksten i en ny melding manuelt.",
"You can also select one of these nearby devices:": "Du kan også velge en av disse enhetene i nærheten:",
"You can change your choice at any time in the Settings dialog.": "Du kan endre ditt valg når som helst i innstillingene.",
"You can read more about the two release channels at the link below.": "Du kan lese mer om de to nye utgivelseskanalene i lenken nedenfor.",
"You have no ignored devices.": "Du har ingen ignorerte enheter.",
"You have no ignored folders.": "Du har ingen ignorerte mapper.",
"You must keep at least one version.": "Du må beholde minst én versjon",
"You have unsaved changes. Do you really want to discard them?": "Du har ulagrede endringer. Vil du virkelig forkaste dem?",
"You must keep at least one version.": "Du må beholde minst én versjon.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Du bør aldri legge til eller endre noe lokalt i en \"{{receiveEncrypted}}\" mappe.",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "SMS-appen din vil åpnes slik at du kan velge mottaker og sende den fra ditt eget nummer.",
"Your email app should open to let you choose the recipient and send it from your own address.": "E-postappen din vil åpnes slik at du kan velge mottaker og sende den fra din egen adresse.",
"days": "dager",
"deleted": "slettet",
"deny": "avvis",
"directories": "mapper",
"file": "fil",
"files": "filer",
"full documentation": "all dokumentasjon",
"folder": "mappe",
"full documentation": "full dokumentasjon",
"items": "elementer",
"modified": "endret",
"permit": "tillat",
"seconds": "sekunder",
"theme": {
"name": {
"black": "Sort",
"dark": "Mørk",
"default": "Standard",
"light": "Lys"
}
},
"unknown device": "ukjent enhet",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} ønsker å dele mappa \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} ønsker å dele mappa \"{{folderlabel}}\" ({{folder}})."
}

View File

@@ -35,7 +35,7 @@
"Are you sure you want to override all remote changes?": "Tem a certeza que quer sobrepor todas as alterações remotas?",
"Are you sure you want to permanently delete all these files?": "Deseja realmente excluir todos estes arquivos permanentemente?",
"Are you sure you want to remove device {%name%}?": "Deseja mesmo remover o dispositivo {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Deseja mesmo remover a pasta {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Deseja mesmo remover a pasta {{label}}?",
"Are you sure you want to restore {%count%} files?": "Deseja mesmo restaurar {{count}} arquivo(s)?",
"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?": "Deseja mesmo fazer a atualização?",
@@ -69,7 +69,7 @@
"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 que usam retransmissão podem podem ter velocidade limitada pelo retransmissor",
"Connections via relays might be rate limited by the relay": "Conexões que usam retransmissão podem ter a 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",
@@ -99,6 +99,7 @@
"Device ID": "ID do dispositivo",
"Device Identification": "Identificação do dispositivo",
"Device Name": "Nome do dispositivo",
"Device Status": "Status do Dispositivo",
"Device is untrusted, enter encryption password": "O dispositivo não é confiável, digite a senha de criptografia",
"Device rate limits": "Limites de velocidade do dispositivo",
"Device that last modified the item": "Dispositivo que modificou o item pela última vez",
@@ -168,6 +169,7 @@
"Folder ID": "ID da pasta",
"Folder Label": "Rótulo da pasta",
"Folder Path": "Caminho da pasta",
"Folder Status": "Status da Pasta",
"Folder Type": "Tipo da pasta",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "O tipo de pasta \"{{receiveEncrypted}}\" só pode ser definido ao adicionar uma nova pasta.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "O tipo de pasta \"{{receiveEncrypted}}\" não pode ser alterado após adicionar a pasta. Você precisa remover a pasta, excluir ou descriptografar os dados do disco e adicionar a pasta novamente.",
@@ -384,6 +386,7 @@
"Staggered File Versioning": "Escalonado",
"Start Browser": "Iniciar navegador",
"Statistics": "Estatísticas",
"Stay logged in": "Ficar conectado",
"Stopped": "Parado",
"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.": "Armazena e sincroniza apenas dados criptografados. As pastas em todos os dispositivos conectados precisam ser configuradas com a mesma senha ou ser do tipo \"{{receiveEncrypted}}\" também.",
"Subject:": "Assunto:",
@@ -545,6 +548,7 @@
"light": "Claro"
}
},
"unknown device": "dispositivo desconhecido",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} quer compartilhar a pasta \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} quer compartilhar a pasta \"{{folderlabel}}\" ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} pode reintroduzir este dispositivo."

View File

@@ -31,9 +31,9 @@
"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 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": "作者",
@@ -82,12 +82,12 @@
"Defaults": "默認值",
"Delete": "刪除",
"Delete Unexpected Items": "刪除不需要項目",
"Deleted {%file%}": "{%file%}已刪除",
"Deleted {%file%}": "{{file}} 已刪除",
"Deselect All": "取消全選",
"Deselect devices to stop sharing this folder with.": "反選設備以停止共享此文件夾",
"Deselect folders to stop sharing with this device.": "停止選擇文件夾以停止與此設備共享。",
"Device": "設備",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "設備 \"{%name%}\"(位於 {%address%} 的 {%device%})請求連接。是否添加新設備?",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "設備 \"{{name}}\"(位於 {{address}} 的 {{device}})請求連接。是否添加新設備?",
"Device Certificate": "設備證書",
"Device ID": "設備 ID",
"Device Identification": "設備標識",
@@ -124,7 +124,7 @@
"Edit Device Defaults": "編輯設備默認值",
"Edit Folder": "編輯文件夾",
"Edit Folder Defaults": "編輯文件夾默認值",
"Editing {%path%}.": "正在編輯 {%path%}。",
"Editing {%path%}.": "正在編輯 {{path}}。",
"Enable Crash Reporting": "啟用自動發送崩潰報告",
"Enable NAT traversal": "啟用 NAT 遍歷",
"Enable Relaying": "開啟中繼",
@@ -161,8 +161,8 @@
"Folder Label": "文件夾標籤",
"Folder Path": "文件夾路徑",
"Folder Type": "文件夾類型",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "添加文件夾後無法更改文件夾類型\"{%receiveEncrypted%}\"。您需要刪除文件夾,刪除或解密磁盤上的數據,然後重新添加文件夾。",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "Folder type \"{{receiveEncrypted}}\" can only be set when adding a new folder.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "添加文件夾後無法更改文件夾類型「{{receiveEncrypted}}」。您需要刪除文件夾,刪除或解密磁盤上的數據,然後重新添加文件夾。",
"Folders": "文件夾",
"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": "永久",
@@ -359,7 +359,7 @@
"Start Browser": "啟動瀏覽器",
"Statistics": "統計",
"Stopped": "已停止",
"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.": "僅存儲和同步加密數據。所有連接設備上的文件夾都需要設置相同的密碼或類型為 \"{%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.": "僅存儲和同步加密數據。所有連接設備上的文件夾都需要設置相同的密碼或類型為 「{{receiveEncrypted}}」。",
"Subject:": "主題:",
"Support": "支持",
"Support Bundle": "支持捆綁包",
@@ -447,9 +447,9 @@
"Unshared Folders": "未共享的文件夾",
"Untrusted": "不信任",
"Up to Date": "同步完成",
"Updated {%file%}": "Updated {%file%}",
"Updated {%file%}": "Updated {{file}}",
"Upgrade": "更新",
"Upgrade To {%version%}": "升級至版本 {%version%}",
"Upgrade To {%version%}": "升級至版本 {{version}}",
"Upgrading": "升級中",
"Upload Rate": "上傳速度",
"Uptime": "已啟動",
@@ -468,11 +468,11 @@
"Waiting to Scan": "等待掃瞄",
"Waiting to Sync": "等待同步",
"Warning": "警告",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "警告,該路徑是已有文件夾\"{%otherFolder%}\"的上級目錄。",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "警告,該路徑是已有文件夾\"{%otherFolderLabel%}\" ({%otherFolder%})的上級目錄。",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "警告,該路徑是已有文件夾\"{%otherFolder%}\"的下級目錄。",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "警告,該路徑是已有文件夾\"{%otherFolderLabel%}\" ({%otherFolder%})的下級目錄。",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "警告:如果你在使用外部的監視器如 {%syncthingInotify%},你應該確保它已經取消激活。",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "警告,該路徑是已有文件夾「{{otherFolder}}」的上級目錄。",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "警告,該路徑是已有文件夾「{{otherFolderLabel}}」({{otherFolder}}的上級目錄。",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "警告,該路徑是已有文件夾「{{otherFolder}}」的下級目錄。",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "警告,該路徑是已有文件夾「{{otherFolderLabel}}」({{otherFolder}}的下級目錄。",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "警告:如果你在使用外部的監視器如 {{syncthingInotify}},你應該確保它已經取消激活。",
"Watch for Changes": "監視更改",
"Watching for Changes": "正在監視更改",
"Watching for changes discovers most changes without periodic scanning.": "對更改的監視無需定期掃瞄就可以發現大多數更改。",
@@ -488,7 +488,7 @@
"You have no ignored folders.": "你沒有已忽略的文件夾。",
"You have unsaved changes. Do you really want to discard them?": "你有未保存的更改。你真的要丟棄它們嗎?",
"You must keep at least one version.": "您必須保留至少一個版本。",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "您絕對不應在\"{%receiveEncrypted%}\"文件夾中本地添加或更改任何內容。",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "您絕對不應在「{{receiveEncrypted}}」文件夾中本地添加或更改任何內容。",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "您的 SMS 應用程序應該打開,讓您選擇收件人並從您自己的電話號碼發送。",
"Your email app should open to let you choose the recipient and send it from your own address.": "您的電子郵件應用程序應該打開,讓您選擇收件人並從您自己的地址發送。",
"days": "天",
@@ -497,7 +497,7 @@
"full documentation": "完整文檔",
"items": "條目",
"seconds": "秒",
"{%device%} wants to share folder \"{%folder%}\".": "{%device%} 想將 「{%folder%}」 文件夾共享給您。",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{%device%} 想要共享 \"{%folderlabel%}\" ({%folder%}) 文件夾給您。",
"{%reintroducer%} might reintroduce this device.": "{%reintroducer%} 可能會重新引入此設備。"
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} 想將 「{{folder}}」 文件夾共享給您。",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} 想要共享「{{folderlabel}}」({{folder}}文件夾給您。",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} 可能會重新引入此設備。"
}

View File

@@ -1 +1 @@
var langPrettyprint = {"ar":"Arabic","bg":"Bulgarian","ca":"Catalan","ca@valencia":"Valencian","cs":"Czech","da":"Danish","de":"German","el":"Greek","en":"English","en-GB":"English (United Kingdom)","es":"Spanish","eu":"Basque","fr":"French","fy":"Frisian","hi":"Hindi","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","ko-KR":"Korean","lt":"Lithuanian","nl":"Dutch","pl":"Polish","pt-BR":"Portuguese (Brazil)","pt-PT":"Portuguese (Portugal)","ro-RO":"Romanian","ru":"Russian","sk":"Slovak","sl":"Slovenian","sv":"Swedish","tr":"Turkish","uk":"Ukrainian","zh-CN":"Chinese (Simplified)","zh-HK":"Chinese (Traditional, Hong Kong)","zh-TW":"Chinese (Traditional)"}
var langPrettyprint = {"ar":"Arabic","bg":"Bulgarian","ca":"Catalan","ca@valencia":"Valencian","cs":"Czech","da":"Danish","de":"German","el":"Greek","en":"English","en-GB":"English (United Kingdom)","es":"Spanish","eu":"Basque","fil":"Filipino","fr":"French","fy":"Frisian","hi":"Hindi","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","ko-KR":"Korean","lt":"Lithuanian","nl":"Dutch","pl":"Polish","pt-BR":"Portuguese (Brazil)","pt-PT":"Portuguese (Portugal)","ro-RO":"Romanian","ru":"Russian","sk":"Slovak","sl":"Slovenian","sv":"Swedish","tr":"Turkish","uk":"Ukrainian","zh-CN":"Chinese (Simplified)","zh-HK":"Chinese (Traditional, Hong Kong)","zh-TW":"Chinese (Traditional)"}

View File

@@ -1 +1 @@
var validLangs = ["ar","bg","ca","ca@valencia","cs","da","de","el","en","en-GB","es","eu","fr","fy","hi","hu","id","it","ja","ko-KR","lt","nl","pl","pt-BR","pt-PT","ro-RO","ru","sk","sl","sv","tr","uk","zh-CN","zh-HK","zh-TW"]
var validLangs = ["ar","bg","ca","ca@valencia","cs","da","de","el","en","en-GB","es","eu","fil","fr","fy","hi","hu","id","it","ja","ko-KR","lt","nl","pl","pt-BR","pt-PT","ro-RO","ru","sk","sl","sv","tr","uk","zh-CN","zh-HK","zh-TW"]

View File

@@ -1050,6 +1050,7 @@
<script type="text/javascript" src="vendor/bootstrap/js/bootstrap.js"></script>
<script type="text/javascript" src="vendor/daterangepicker/daterangepicker.js"></script>
<script type="text/javascript" src="vendor/fancytree/jquery.fancytree-all-deps.js"></script>
<script type="text/javascript" src="vendor/HumanizeDuration.js/humanize-duration.js"></script>
<!-- / vendor scripts -->
<!-- gui application code -->

View File

@@ -7,16 +7,63 @@
* {{1|duration:"h"}} --> <1h
**/
angular.module('syncthing.core')
.filter('duration', function () {
.filter('duration', function ($translate) {
'use strict';
var SECONDS_IN = { "d": 86400, "h": 3600, "m": 60, "s": 1 };
return function (input, precision) {
var result = "";
if (!precision) {
precision = "s";
}
input = parseInt(input, 10);
var language_cc = $translate.use();
if (language_cc != null) {
language_cc = language_cc.replace("-", "_");
var fallbacks = [];
var language = language_cc.substr(0, 2);
switch (language) {
case "zh":
// Use zh_TW for zh_HK
fallbacks.push("zh_TW");
break
}
if (language != language_cc) {
fallbacks.push(language);
}
// Fallback to english, if the language isn't found
fallbacks.push("en");
var units = ["d", "h", "m", "s"];
switch (precision) {
case "d":
units.pop();
// fallthrough
case "h":
units.pop();
// fallthrough
case "m":
units.pop();
// fallthrough
case "s":
break
default:
return "[Error: precision must be d, h, m or s, it's " + precision + "]";
}
try {
// humanizeDuration accepts only milliseconds
return humanizeDuration(input * 1000, {
language: language_cc,
maxDecimalPoints: 0,
units: units,
fallbacks: fallbacks
});
} catch(err) {
console.log(err.message + ": language_cc=" + language_cc)
// if we crash, fallthrough to english
}
}
var result = "";
for (var k in SECONDS_IN) {
var t = (input / SECONDS_IN[k] | 0); // Math.floor

View File

@@ -0,0 +1,56 @@
The MIT License (MIT)
Copyright (c) 2013-2024 Evan Hahn (@EvanHahn)
Portions copyright (c) 2024 Ross Smith II (@rasa)
Other portions copyright their respective authors, see
https://github.com/EvanHahn/HumanizeDuration.js/graphs/contributors
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
This project is also licensed under the Unlicense license, at your option:
The Unlicense
-----------
This is free and unencumbered software released into the public domain.
Anyone is free to copy, modify, publish, use, compile, sell, or
distribute this software, either in source code form or as a compiled
binary, for any purpose, commercial or non-commercial, and by any
means.
In jurisdictions that recognize copyright laws, the author or authors
of this software dedicate any and all copyright interest in the
software to the public domain. We make this dedication for the benefit
of the public at large and to the detriment of our heirs and
successors. We intend this dedication to be an overt act of
relinquishment in perpetuity of all present and future rights to this
software under copyright law.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
OTHER DEALINGS IN THE SOFTWARE.
For more information, please refer to <https://unlicense.org/>
-----------
SPDX-License-Identifier: MIT or UNLICENSE

View File

@@ -0,0 +1,7 @@
help:
@echo To update this package, type: make update
update:
wget -O LICENSE.txt https://raw.githubusercontent.com/rasa/HumanizeDuration.js/main/LICENSE.txt
wget -O humanize-duration.js https://raw.githubusercontent.com/rasa/HumanizeDuration.js/main/humanize-duration.js

View File

@@ -0,0 +1,748 @@
// HumanizeDuration.js - https://git.io/j0HgmQ
// @ts-check
/**
* @typedef {string | ((unitCount: number) => string)} Unit
*/
/**
* @typedef {("y" | "mo" | "w" | "d" | "h" | "m" | "s" | "ms")} UnitName
*/
/**
* @typedef {Object} UnitMeasures
* @prop {number} y
* @prop {number} mo
* @prop {number} w
* @prop {number} d
* @prop {number} h
* @prop {number} m
* @prop {number} s
* @prop {number} ms
*/
/**
* @internal
* @typedef {[string, string, string, string, string, string, string, string, string, string]} DigitReplacements
*/
/**
* @typedef {Object} Language
* @prop {Unit} y
* @prop {Unit} mo
* @prop {Unit} w
* @prop {Unit} d
* @prop {Unit} h
* @prop {Unit} m
* @prop {Unit} s
* @prop {Unit} ms
* @prop {string} [decimal]
* @prop {string} [delimiter]
* @prop {DigitReplacements} [_digitReplacements]
* @prop {boolean} [_numberFirst]
*/
/**
* @typedef {Object} Options
* @prop {string} [language]
* @prop {Record<string, Language>} [languages]
* @prop {string[]} [fallbacks]
* @prop {string} [delimiter]
* @prop {string} [spacer]
* @prop {boolean} [round]
* @prop {number} [largest]
* @prop {UnitName[]} [units]
* @prop {string} [decimal]
* @prop {string} [conjunction]
* @prop {number} [maxDecimalPoints]
* @prop {UnitMeasures} [unitMeasures]
* @prop {boolean} [serialComma]
* @prop {DigitReplacements} [digitReplacements]
*/
/**
* @internal
* @typedef {Required<Options>} NormalizedOptions
*/
(function () {
// Fallback for `Object.assign` if relevant.
var assign =
Object.assign ||
/** @param {...any} destination */
function (destination) {
var source;
for (var i = 1; i < arguments.length; i++) {
source = arguments[i];
for (var prop in source) {
if (has(source, prop)) {
destination[prop] = source[prop];
}
}
}
return destination;
};
// Fallback for `Array.isArray` if relevant.
var isArray =
Array.isArray ||
function (arg) {
return Object.prototype.toString.call(arg) === "[object Array]";
};
// This has to be defined separately because of a bug: we want to alias
// `gr` and `el` for backwards-compatiblity. In a breaking change, we can
// remove `gr` entirely.
// See https://github.com/EvanHahn/HumanizeDuration.js/issues/143 for more.
var GREEK = language("έ", "μ", "ε", "η", "ώ", "λ", "δ", "χδ", ","); //
/**
* @internal
* @type {Record<string, Language>}
*/
var LANGUAGES = {
// Afrikaans (Afrikaans)
af: language("j", "mnd", "w", "d", "u", "m", "s", "ms", ","),
// አማርኛ (Amharic)
am: language("ዓ", "ወ", "ሳ", "ቀ", "ሰ", "ደ", "ሰከ", "ሳ", "ሚሊ"),
//العربية (Arabic) (RTL)
// https://github.com/EvanHahn/HumanizeDuration.js/issues/221#issuecomment-2119762498
// year -> ع stands for "عام" or س stands for "سنة"
// month -> ش stands for "شهر"
// week -> أ stands for "أسبوع"
// day -> ي stands for "يوم"
// hour -> س stands for "ساعة"
// minute -> د stands for "دقيقة"
// second -> ث stands for "ثانية"
ar: assign(language("س", "ش", "أ", "ي", "س", "د", "ث", "م ث", ","), {
_digitReplacements: ["۰", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"]
}),
// български (Bulgarian)
bg: language("г", "мес", "с", "д", "ч", "м", "сек", "мс", ","),
// বাংলা (Bengali)
bn: language("ব", "ম", "সপ্তা", "দ", "ঘ", "মি", "স", "মি.স"),
// català (Catalan)
ca: language("a", "mes", "set", "d", "h", "m", "s", "ms", ","),
//کوردیی ناوەڕاست (Central Kurdish) (RTL)
ckb: language("م چ", "چ", "خ", "ک", "ڕ", "ه", "م", "س", "."),
// čeština (Czech)
cs: language("r", "měs", "t", "d", "h", "m", "s", "ms", ","),
// Cymraeg (Welsh)
cy: language("b", "mis", "wth", "d", "awr", "mun", "eil", "ms"),
// dansk (Danish)
da: language("å", "md", "u", "d", "t", "m", "s", "ms", ","),
// Deutsch (German)
de: language("J", "mo", "w", "t", "std", "m", "s", "ms", ","),
// Ελληνικά (Greek)
el: GREEK,
// English (English)
en: language("y", "mo", "w", "d", "h", "m", "s", "ms"),
// Esperanto (Esperanto)
eo: language("j", "mo", "se", "t", "h", "m", "s", "ms", ","),
// español (Spanish)
es: language("a", "me", "se", "d", "h", "m", "s", "ms", ","),
// eesti keel (Estonian)
et: language("a", "k", "n", "p", "t", "m", "s", "ms", ","),
// euskara (Basque)
eu: language("u", "h", "a", "e", "o", "m", "s", "ms", ","),
//فارسی (Farsi/Persian) (RTL)
fa: language("س", "ما", "ه", "ر", "سا", "دقی", "ثانی", "میلی‌ثانیه"),
// suomi (Finnish)
fi: language("v", "kk", "vk", "pv", "t", "m", "s", "ms", ","),
// føroyskt (Faroese)
fo: language("á", "má", "v", "d", "t", "m", "s", "ms", ","),
// français (French)
fr: language("a", "m", "sem", "j", "h", "m", "s", "ms", ","),
// Ελληνικά (Greek) (el)
gr: GREEK,
//עברית (Hebrew) (RTL)
he: language("ש׳", "ח׳", "שב׳", "י׳", "שע׳", "ד׳", "שנ׳", "מל׳"),
// hrvatski (Croatian)
hr: language("g", "mj", "t", "d", "h", "m", "s", "ms", ","),
// हिंदी (Hindi)
hi: language("व", "म", "स", "द", "घ", "मि", "से", "मि.से"),
// magyar (Hungarian)
hu: language("é", "h", "hét", "n", "ó", "p", "mp", "ms", ","),
// Indonesia (Indonesian)
id: language("t", "b", "mgg", "h", "j", "m", "d", "md"),
// íslenska (Icelandic)
is: language("ár", "mán", "v", "d", "k", "m", "s", "ms"),
// italiano (Italian)
it: language("a", "me", "se", "g", "h", "m", "s", "ms", ","),
// 日本語 (Japanese)
ja: language("年", "月", "週", "日", "時", "分", "秒", "ミリ秒"),
// ភាសាខ្មែរ (Khmer)
km: language("ឆ", "ខ", "សប្តា", "ថ", "ម", "ន", "វ", "មវ"),
// ಕನ್ನಡ (Kannada)
kn: language("ವ", "ತ", "ವ", "ದ", "ಗಂ", "ನಿ", "ಸೆ", "ಮಿಸೆ"),
// 한국어 (Korean)
ko: language("년", "월", "주", "일", "시", "분", "초", "밀리초"),
// Kurdî (Kurdish)
ku: language("sal", "m", "h", "r", "s", "d", "ç", "ms", ","),
// ລາວ (Lao)
lo: language("ປ", "ເດ", "ອ", "ວ", "ຊ", "ນທ", "ວິນ", "ມິລິວິນາທີ", ","),
// lietuvių (Lithuanian)
lt: language("met", "mėn", "sav", "d", "v", "m", "s", "ms", ","),
// latviešu (Latvian)
lv: language("g", "mēn", "n", "d", "st", "m", "s", "ms", ","),
// македонски (Macedonian)
mk: language("г", "мес", "н", "д", "ч", "м", "с", "мс", ","),
// монгол (Mongolian)
mn: language("ж", "с", "дх", "ө", "ц", "м", "с", "мс"),
// मराठी (Marathi)
mr: language("व", "म", "आ", "दि", "त", "मि", "से", "मि.से"),
// Melayu (Malay)
ms: language("thn", "bln", "mgg", "hr", "j", "m", "s", "ms"),
// Nederlands (Dutch)
nl: language("j", "mnd", "w", "d", "u", "m", "s", "ms", ","),
// norsk (Norwegian)
no: language("år", "mnd", "u", "d", "t", "m", "s", "ms", ","),
// polski (Polish)
pl: language("r", "mi", "t", "d", "g", "m", "s", "ms", ","),
// português (Portuguese)
pt: language("a", "mês", "sem", "d", "h", "m", "s", "ms", ","),
// română (Romanian) săpt?
ro: language("a", "l", "să", "z", "h", "m", "s", "ms", ","),
// русский (Russian)
ru: language("г", "мес", "н", "д", "ч", "м", "с", "мс", ","),
// shqip (Albanian) orë? muaj?
sq: language("v", "mu", "j", "d", "o", "m", "s", "ms", ","),
// српски (Serbian)
sr: language("г", "мес", "н", "д", "ч", "м", "с", "мс", ","),
// தமிழ் (Tamil)
ta: language("ஆ", "மா", "வ", "நா", "ம", "நி", "வி", "மி.வி"),
// తెలుగు (Telugu)
te: language("సం", "నె", "వ", "రో", "గం", "ని", "సె", "మి.సె"), //
// українська (Ukrainian)
uk: language("р", "м", "т", "д", "г", "хв", "с", "мс", ","),
//اردو (Urdu) (RTL)
ur: language("س", "م", "ہ", "د", "گ", "م", "س", "م س"),
// slovenčina (Slovak)
sk: language("r", "mes", "t", "d", "h", "m", "s", "ms", ","),
// slovenščina (Slovenian)
sl: language("l", "mes", "t", "d", "ur", "m", "s", "ms", ","),
// svenska (Swedish)
sv: language("å", "mån", "v", "d", "h", "m", "s", "ms", ","),
// Kiswahili (Swahili)
sw: assign(language("mw", "m", "w", "s", "h", "dk", "s", "ms"), {
_numberFirst: true
}),
// Türkçe (Turkish)
tr: language("y", "a", "h", "g", "sa", "d", "s", "ms", ","),
// ไทย (Thai)
th: language("ปี", "ด", "ส", "ว", "ชม", "น", "วิ", "มิลลิวินาที"),
// o'zbek (Uzbek)
uz: language("y", "o", "h", "k", "soa", "m", "s", "ms"),
// Ўзбек (Кирилл) (Uzbek (Cyrillic))
uz_CYR: language("й", "о", "х", "к", "соа", "д", "с", "мс"),
// Tiếng Việt (Vietnamese)
vi: language("n", "th", "t", "ng", "gi", "p", "g", "ms", ","),
// 中文 (简体) (Chinese, simplified)
zh_CN: language("年", "月", "周", "天", "时", "分", "秒", "毫秒"),
// 中文 (繁體) (Chinese, traditional)
zh_TW: language("年", "月", "週", "天", "時", "分", "秒", "毫秒")
};
/**
* Helper function for creating language definitions.
*
* @internal
* @param {Unit} y
* @param {Unit} mo
* @param {Unit} w
* @param {Unit} d
* @param {Unit} h
* @param {Unit} m
* @param {Unit} s
* @param {Unit} ms
* @param {string} [decimal]
* @returns {Language}
*/
function language(y, mo, w, d, h, m, s, ms, decimal) {
/** @type {Language} */
var result = { y: y, mo: mo, w: w, d: d, h: h, m: m, s: s, ms: ms };
if (typeof decimal !== "undefined") {
result.decimal = decimal;
}
return result;
}
/**
* Helper function for Arabic.
*
* @internal
* @param {number} c
* @returns {0 | 1 | 2}
*/
// function getArabicForm(c) {
// if (c === 2) {
// return 1;
// }
// if (c > 2 && c < 11) {
// return 2;
// }
// return 0;
// }
/**
* Helper function for Polish.
*
* @internal
* @param {number} c
* @returns {0 | 1 | 2 | 3}
*/
// function getPolishForm(c) {
// if (c === 1) {
// return 0;
// }
// if (Math.floor(c) !== c) {
// return 1;
// }
// if (c % 10 >= 2 && c % 10 <= 4 && !(c % 100 > 10 && c % 100 < 20)) {
// return 2;
// }
// return 3;
// }
/**
* Helper function for Slavic languages.
*
* @internal
* @param {number} c
* @returns {0 | 1 | 2 | 3}
*/
// function getSlavicForm(c) {
// if (Math.floor(c) !== c) {
// return 2;
// }
// if (
// (c % 100 >= 5 && c % 100 <= 20) ||
// (c % 10 >= 5 && c % 10 <= 9) ||
// c % 10 === 0
// ) {
// return 0;
// }
// if (c % 10 === 1) {
// return 1;
// }
// if (c > 1) {
// return 2;
// }
// return 0;
// }
/**
* Helper function for Czech or Slovak.
*
* @internal
* @param {number} c
* @returns {0 | 1 | 2 | 3}
*/
// function getCzechOrSlovakForm(c) {
// if (c === 1) {
// return 0;
// }
// if (Math.floor(c) !== c) {
// return 1;
// }
// if (c % 10 >= 2 && c % 10 <= 4 && c % 100 < 10) {
// return 2;
// }
// return 3;
// }
/**
* Helper function for Lithuanian.
*
* @internal
* @param {number} c
* @returns {0 | 1 | 2}
*/
// function getLithuanianForm(c) {
// if (c === 1 || (c % 10 === 1 && c % 100 > 20)) {
// return 0;
// }
// if (
// Math.floor(c) !== c ||
// (c % 10 >= 2 && c % 100 > 20) ||
// (c % 10 >= 2 && c % 100 < 10)
// ) {
// return 1;
// }
// return 2;
// }
/**
* Helper function for Latvian.
*
* @internal
* @param {number} c
* @returns {boolean}
*/
// function getLatvianForm(c) {
// return c % 10 === 1 && c % 100 !== 11;
// }
/**
* @internal
* @template T
* @param {T} obj
* @param {keyof T} key
* @returns {boolean}
*/
function has(obj, key) {
return Object.prototype.hasOwnProperty.call(obj, key);
}
/**
* @internal
* @param {Pick<Required<Options>, "language" | "fallbacks" | "languages">} options
* @throws {Error} Throws an error if language is not found.
* @returns {Language}
*/
function getLanguage(options) {
var possibleLanguages = [options.language];
if (has(options, "fallbacks")) {
if (isArray(options.fallbacks) && options.fallbacks.length) {
possibleLanguages = possibleLanguages.concat(options.fallbacks);
} else {
throw new Error("fallbacks must be an array with at least one element");
}
}
for (var i = 0; i < possibleLanguages.length; i++) {
var languageToTry = possibleLanguages[i];
if (has(options.languages, languageToTry)) {
return options.languages[languageToTry];
}
if (has(LANGUAGES, languageToTry)) {
return LANGUAGES[languageToTry];
}
}
throw new Error("No language found.");
}
/**
* @internal
* @param {Piece} piece
* @param {Language} language
* @param {Pick<Required<Options>, "decimal" | "spacer" | "maxDecimalPoints" | "digitReplacements">} options
*/
function renderPiece(piece, language, options) {
var unitName = piece.unitName;
var unitCount = piece.unitCount;
var spacer = options.spacer;
var maxDecimalPoints = options.maxDecimalPoints;
/** @type {string} */
var decimal;
if (has(options, "decimal")) {
decimal = options.decimal;
} else if (has(language, "decimal")) {
decimal = language.decimal;
} else {
decimal = ".";
}
/** @type {undefined | DigitReplacements} */
var digitReplacements;
if ("digitReplacements" in options) {
digitReplacements = options.digitReplacements;
} else if ("_digitReplacements" in language) {
digitReplacements = language._digitReplacements;
}
/** @type {string} */
var formattedCount;
var normalizedUnitCount =
maxDecimalPoints === void 0
? unitCount
: Math.floor(unitCount * Math.pow(10, maxDecimalPoints)) /
Math.pow(10, maxDecimalPoints);
var countStr = normalizedUnitCount.toString();
if (digitReplacements) {
formattedCount = "";
for (var i = 0; i < countStr.length; i++) {
var char = countStr[i];
if (char === ".") {
formattedCount += decimal;
} else {
// @ts-ignore because `char` should always be 0-9 at this point.
formattedCount += digitReplacements[char];
}
}
} else {
formattedCount = countStr.replace(".", decimal);
}
var languageWord = language[unitName];
var word;
if (typeof languageWord === "function") {
word = languageWord(unitCount);
} else {
word = languageWord;
}
if (language._numberFirst) {
return word + spacer + formattedCount;
}
return formattedCount + spacer + word;
}
/**
* @internal
* @typedef {Object} Piece
* @prop {UnitName} unitName
* @prop {number} unitCount
*/
/**
* @internal
* @param {number} ms
* @param {Pick<Required<Options>, "units" | "unitMeasures" | "largest" | "round">} options
* @returns {Piece[]}
*/
function getPieces(ms, options) {
/** @type {UnitName} */
var unitName;
/** @type {number} */
var i;
/** @type {number} */
var unitCount;
/** @type {number} */
var msRemaining;
var units = options.units;
var unitMeasures = options.unitMeasures;
var largest = "largest" in options ? options.largest : Infinity;
if (!units.length) return [];
// Get the counts for each unit. Doesn't round or truncate anything.
// For example, might create an object like `{ y: 7, m: 6, w: 0, d: 5, h: 23.99 }`.
/** @type {Partial<Record<UnitName, number>>} */
var unitCounts = {};
msRemaining = ms;
for (i = 0; i < units.length; i++) {
unitName = units[i];
var unitMs = unitMeasures[unitName];
var isLast = i === units.length - 1;
unitCount = isLast
? msRemaining / unitMs
: Math.floor(msRemaining / unitMs);
unitCounts[unitName] = unitCount;
msRemaining -= unitCount * unitMs;
}
if (options.round) {
// Update counts based on the `largest` option.
// For example, if `largest === 2` and `unitCount` is `{ y: 7, m: 6, w: 0, d: 5, h: 23.99 }`,
// updates to something like `{ y: 7, m: 6.2 }`.
var unitsRemainingBeforeRound = largest;
for (i = 0; i < units.length; i++) {
unitName = units[i];
unitCount = unitCounts[unitName];
if (unitCount === 0) continue;
unitsRemainingBeforeRound--;
// "Take" the rest of the units into this one.
if (unitsRemainingBeforeRound === 0) {
for (var j = i + 1; j < units.length; j++) {
var smallerUnitName = units[j];
var smallerUnitCount = unitCounts[smallerUnitName];
unitCounts[unitName] +=
(smallerUnitCount * unitMeasures[smallerUnitName]) /
unitMeasures[unitName];
unitCounts[smallerUnitName] = 0;
}
break;
}
}
// Round the last piece (which should be the only non-integer).
//
// This can be a little tricky if the last piece "bubbles up" to a larger
// unit. For example, "3 days, 23.99 hours" should be rounded to "4 days".
// It can also require multiple passes. For example, "6 days, 23.99 hours"
// should become "1 week".
for (i = units.length - 1; i >= 0; i--) {
unitName = units[i];
unitCount = unitCounts[unitName];
if (unitCount === 0) continue;
var rounded = Math.round(unitCount);
unitCounts[unitName] = rounded;
if (i === 0) break;
var previousUnitName = units[i - 1];
var previousUnitMs = unitMeasures[previousUnitName];
var amountOfPreviousUnit = Math.floor(
(rounded * unitMeasures[unitName]) / previousUnitMs
);
if (amountOfPreviousUnit) {
unitCounts[previousUnitName] += amountOfPreviousUnit;
unitCounts[unitName] = 0;
} else {
break;
}
}
}
/** @type {Piece[]} */
var result = [];
for (i = 0; i < units.length && result.length < largest; i++) {
unitName = units[i];
unitCount = unitCounts[unitName];
if (unitCount) {
result.push({ unitName: unitName, unitCount: unitCount });
}
}
return result;
}
/**
* @internal
* @param {Piece[]} pieces
* @param {Pick<Required<Options>, "units" | "language" | "languages" | "fallbacks" | "delimiter" | "spacer" | "decimal" | "conjunction" | "maxDecimalPoints" | "serialComma" | "digitReplacements">} options
* @returns {string}
*/
function formatPieces(pieces, options) {
var language = getLanguage(options);
if (!pieces.length) {
var units = options.units;
var smallestUnitName = units[units.length - 1];
return renderPiece(
{ unitName: smallestUnitName, unitCount: 0 },
language,
options
);
}
var conjunction = options.conjunction;
var serialComma = options.serialComma;
var delimiter;
if (has(options, "delimiter")) {
delimiter = options.delimiter;
} else if (has(language, "delimiter")) {
delimiter = language.delimiter;
} else {
delimiter = " ";
}
/** @type {string[]} */
var renderedPieces = [];
for (var i = 0; i < pieces.length; i++) {
renderedPieces.push(renderPiece(pieces[i], language, options));
}
if (!conjunction || pieces.length === 1) {
return renderedPieces.join(delimiter);
}
if (pieces.length === 2) {
return renderedPieces.join(conjunction);
}
return (
renderedPieces.slice(0, -1).join(delimiter) +
(serialComma ? "," : "") +
conjunction +
renderedPieces.slice(-1)
);
}
/**
* Create a humanizer, which lets you change the default options.
*
* @param {Options} [passedOptions]
*/
function humanizer(passedOptions) {
/**
* @param {number} ms
* @param {Options} [humanizerOptions]
* @returns {string}
*/
var result = function humanizer(ms, humanizerOptions) {
// Make sure we have a positive number.
//
// Has the nice side-effect of converting things to numbers. For example,
// converts `"123"` and `Number(123)` to `123`.
ms = Math.abs(ms);
var options = assign({}, result, humanizerOptions || {});
var pieces = getPieces(ms, options);
return formatPieces(pieces, options);
};
return assign(
result,
{
language: "en",
spacer: "",
conjunction: "",
serialComma: true,
units: ["y", "mo", "w", "d", "h", "m", "s"],
languages: {},
round: false,
unitMeasures: {
y: 31557600000,
mo: 2629800000,
w: 604800000,
d: 86400000,
h: 3600000,
m: 60000,
s: 1000,
ms: 1
}
},
passedOptions
);
}
/**
* Humanize a duration.
*
* This is a wrapper around the default humanizer.
*/
var humanizeDuration = assign(humanizer({}), {
getSupportedLanguages: function getSupportedLanguages() {
var result = [];
for (var language in LANGUAGES) {
if (has(LANGUAGES, language) && language !== "gr") {
result.push(language);
}
}
return result;
},
humanizer: humanizer
});
// @ts-ignore
if (typeof define === "function" && define.amd) {
// @ts-ignore
define(function () {
return humanizeDuration;
});
} else if (typeof module !== "undefined" && module.exports) {
module.exports = humanizeDuration;
} else {
this.humanizeDuration = humanizeDuration;
}
})();

View File

@@ -444,7 +444,9 @@ func TestAPIServiceRequests(t *testing.T) {
// testHTTPRequest tries the given test case, comparing the result code,
// content type, and result prefix.
func testHTTPRequest(t *testing.T, baseURL string, tc httpTestCase, apikey string) {
timeout := time.Second
// Since running tests in parallel, the previous 1s timeout proved to be too short.
// https://github.com/syncthing/syncthing/issues/9455
timeout := 10 * time.Second
if tc.Timeout > 0 {
timeout = tc.Timeout
}

93
lib/build/parse.go Normal file
View File

@@ -0,0 +1,93 @@
// Copyright (C) 2019 The Syncthing Authors.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.
package build
import (
"errors"
"regexp"
"strings"
)
// syncthing v1.1.4-rc.1+30-g6aaae618-dirty-crashrep "Erbium Earthworm" (go1.12.5 darwin-amd64) jb@kvin.kastelo.net 2019-05-23 16:08:14 UTC [foo, bar]
// or, somewhere along the way the "+" in the version tag disappeared:
// syncthing v1.23.7-dev.26.gdf7b56ae.dirty-stversionextra "Fermium Flea" (go1.20.5 darwin-arm64) jb@ok.kastelo.net 2023-07-12 06:55:26 UTC [Some Wrapper, purego, stnoupgrade]
var (
longVersionRE = regexp.MustCompile(`syncthing\s+(v[^\s]+)\s+"([^"]+)"\s\(([^\s]+)\s+([^-]+)-([^)]+)\)\s+([^\s]+)[^\[]*(?:\[(.+)\])?$`)
gitExtraRE = regexp.MustCompile(`\.\d+\.g[0-9a-f]+`) // ".1.g6aaae618"
gitExtraSepRE = regexp.MustCompile(`[.-]`) // dot or dash
)
type VersionParts struct {
Version string // "v1.1.4-rc.1+30-g6aaae618-dirty-crashrep"
Tag string // "v1.1.4-rc.1"
Commit string // "6aaae618", blank when absent
Codename string // "Erbium Earthworm"
Runtime string // "go1.12.5"
GOOS string // "darwin"
GOARCH string // "amd64"
Builder string // "jb@kvin.kastelo.net"
Extra []string // "foo", "bar"
}
func (v VersionParts) Environment() string {
if v.Commit != "" {
return "Development"
}
if strings.Contains(v.Tag, "-rc.") {
return "Candidate"
}
if strings.Contains(v.Tag, "-") {
return "Beta"
}
return "Stable"
}
func ParseVersion(line string) (VersionParts, error) {
m := longVersionRE.FindStringSubmatch(line)
if len(m) == 0 {
return VersionParts{}, errors.New("unintelligeble version string")
}
v := VersionParts{
Version: m[1],
Codename: m[2],
Runtime: m[3],
GOOS: m[4],
GOARCH: m[5],
Builder: m[6],
}
// Split the version tag into tag and commit. This is old style
// v1.2.3-something.4+11-g12345678 or newer with just dots
// v1.2.3-something.4.11.g12345678 or v1.2.3-dev.11.g12345678.
parts := []string{v.Version}
if strings.Contains(v.Version, "+") {
parts = strings.Split(v.Version, "+")
} else {
idxs := gitExtraRE.FindStringIndex(v.Version)
if len(idxs) > 0 {
parts = []string{v.Version[:idxs[0]], v.Version[idxs[0]+1:]}
}
}
v.Tag = parts[0]
if len(parts) > 1 {
fields := gitExtraSepRE.Split(parts[1], -1)
if len(fields) >= 2 && strings.HasPrefix(fields[1], "g") {
v.Commit = fields[1][1:]
}
}
if len(m) >= 8 && m[7] != "" {
tags := strings.Split(m[7], ",")
for i := range tags {
tags[i] = strings.TrimSpace(tags[i])
}
v.Extra = tags
}
return v, nil
}

72
lib/build/parse_test.go Normal file
View File

@@ -0,0 +1,72 @@
// Copyright (C) 2019 The Syncthing Authors.
//
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this file,
// You can obtain one at https://mozilla.org/MPL/2.0/.
package build
import (
"fmt"
"testing"
)
func TestParseVersion(t *testing.T) {
cases := []struct {
longVersion string
parsed VersionParts
}{
{
longVersion: `syncthing v1.1.4-rc.1+30-g6aaae618-dirty-crashrep "Erbium Earthworm" (go1.12.5 darwin-amd64) jb@kvin.kastelo.net 2019-05-23 16:08:14 UTC`,
parsed: VersionParts{
Version: "v1.1.4-rc.1+30-g6aaae618-dirty-crashrep",
Tag: "v1.1.4-rc.1",
Commit: "6aaae618",
Codename: "Erbium Earthworm",
Runtime: "go1.12.5",
GOOS: "darwin",
GOARCH: "amd64",
Builder: "jb@kvin.kastelo.net",
},
},
{
longVersion: `syncthing v1.1.4-rc.1+30-g6aaae618-dirty-crashrep "Erbium Earthworm" (go1.12.5 darwin-amd64) jb@kvin.kastelo.net 2019-05-23 16:08:14 UTC [foo, bar]`,
parsed: VersionParts{
Version: "v1.1.4-rc.1+30-g6aaae618-dirty-crashrep",
Tag: "v1.1.4-rc.1",
Commit: "6aaae618",
Codename: "Erbium Earthworm",
Runtime: "go1.12.5",
GOOS: "darwin",
GOARCH: "amd64",
Builder: "jb@kvin.kastelo.net",
Extra: []string{"foo", "bar"},
},
},
{
longVersion: `syncthing v1.23.7-dev.26.gdf7b56ae-stversionextra "Fermium Flea" (go1.20.5 darwin-arm64) jb@ok.kastelo.net 2023-07-12 06:55:26 UTC [Some Wrapper, purego, stnoupgrade]`,
parsed: VersionParts{
Version: "v1.23.7-dev.26.gdf7b56ae-stversionextra",
Tag: "v1.23.7-dev",
Commit: "df7b56ae",
Codename: "Fermium Flea",
Runtime: "go1.20.5",
GOOS: "darwin",
GOARCH: "arm64",
Builder: "jb@ok.kastelo.net",
Extra: []string{"Some Wrapper", "purego", "stnoupgrade"},
},
},
}
for _, tc := range cases {
v, err := ParseVersion(tc.longVersion)
if err != nil {
t.Errorf("%s\nerror: %v\n", tc.longVersion, err)
continue
}
if fmt.Sprint(v) != fmt.Sprint(tc.parsed) {
t.Errorf("%s\nA: %v\nE: %v\n", tc.longVersion, v, tc.parsed)
}
}
}

View File

@@ -924,6 +924,8 @@ func (f *fakeFile) Name() string {
if f.presentedName != "" {
return f.presentedName
}
f.mut.Lock()
defer f.mut.Unlock()
return f.name
}
@@ -949,7 +951,9 @@ func (f *fakeFile) Truncate(size int64) error {
}
func (f *fakeFile) Stat() (FileInfo, error) {
f.mut.Lock()
info := &fakeFileInfo{*f.fakeEntry}
f.mut.Unlock()
if f.presentedName != "" {
info.name = f.presentedName
}

View File

@@ -19,8 +19,7 @@ type nower interface {
var clock = nower(defaultClock{})
type cache struct {
patterns []Pattern
entries map[string]cacheEntry
entries map[string]cacheEntry
}
type cacheEntry struct {
@@ -28,10 +27,9 @@ type cacheEntry struct {
access int64 // Unix nanosecond count. Sufficient until the year 2262.
}
func newCache(patterns []Pattern) *cache {
func newCache() *cache {
return &cache{
patterns: patterns,
entries: make(map[string]cacheEntry),
entries: make(map[string]cacheEntry),
}
}

View File

@@ -21,7 +21,7 @@ func TestCache(t *testing.T) {
clock = oldClock
}()
c := newCache(nil)
c := newCache()
res, ok := c.get("nonexistent")
if res.IsIgnored() || res.IsDeletable() || ok {

View File

@@ -205,7 +205,7 @@ func (m *Matcher) parseLocked(r io.Reader, file string) error {
m.curHash = newHash
m.patterns = patterns
if m.withCache {
m.matches = newCache(patterns)
m.matches = newCache()
}
return err
@@ -231,6 +231,8 @@ func (m *Matcher) Match(file string) (result ignoreresult.R) {
return ignoreresult.NotIgnored
}
file = filepath.ToSlash(file)
if m.matches != nil {
// Check the cache for a known result.
res, ok := m.matches.get(file)
@@ -248,7 +250,6 @@ func (m *Matcher) Match(file string) (result ignoreresult.R) {
// allow skipping matched directories or not. As soon as we hit an
// exclude pattern (with some exceptions), we can't skip directories
// anymore.
file = filepath.ToSlash(file)
var lowercaseFile string
canSkipDir := true
for _, pattern := range m.patterns {

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "STDISCOSRV" "1" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
stdiscosrv \- Syncthing Discovery Server
.SH SYNOPSIS
@@ -112,7 +112,7 @@ entry from the list.
.SS Description
.sp
This guide assumes that you have already set up Syncthing. If you
havent yet, head over to \X'tty: link #getting-started'\fI\%Getting Started\fP\X'tty: link' first.
havent yet, head over to \fI\%Getting Started\fP first.
.SS Installing
.sp
Go to \X'tty: link https://github.com/syncthing/discosrv/releases'\fI\%releases\fP <\fBhttps://github.com/syncthing/discosrv/releases\fP>\X'tty: link' and

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "STRELAYSRV" "1" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
strelaysrv \- Syncthing Relay Server
.SH SYNOPSIS

View File

@@ -28,7 +28,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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-BEP" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-bep \- Block Exchange Protocol v1
.SH INTRODUCTION AND DEFINITIONS
@@ -378,7 +378,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 \X'tty: link #untrusted'\fI\%Untrusted Device Encryption\fP\X'tty: link' 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

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-CONFIG" "5" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-config \- Syncthing Configuration
.SH SYNOPSIS
@@ -84,7 +84,7 @@ with a custom certificate for HTTPS as desired.
.sp
The database is by default stored in the same directory as the config, but
the location may be overridden by the \fB\-\-data\fP or \fB\-\-home\fP flags or the
corresponding environment varibles (\fB$STDATADIR\fP or \fBSTHOMEDIR\fP).
corresponding environment variables (\fB$STDATADIR\fP or \fBSTHOMEDIR\fP).
.sp
The database directory contains the following files, among others:
.INDENT 0.0
@@ -119,7 +119,7 @@ may no longer correspond to the defaults.
.sp
.EX
<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>
<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 fsWatcherTimeoutS=\(dq0\(dq ignorePerms=\(dqfalse\(dq autoNormalize=\(dqtrue\(dq>
<filesystemType>basic</filesystemType>
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq introducedBy=\(dq\(dq>
<encryptionPassword></encryptionPassword>
@@ -225,7 +225,7 @@ may no longer correspond to the defaults.
</options>
<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=\(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>
<folder id=\(dq\(dq label=\(dq\(dq path=\(dq~\(dq type=\(dqsendreceive\(dq rescanIntervalS=\(dq3600\(dq fsWatcherEnabled=\(dqtrue\(dq fsWatcherDelayS=\(dq10\(dq fsWatcherTimeoutS=\(dq0\(dq ignorePerms=\(dqfalse\(dq autoNormalize=\(dqtrue\(dq>
<filesystemType>basic</filesystemType>
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq introducedBy=\(dq\(dq>
<encryptionPassword></encryptionPassword>
@@ -317,7 +317,7 @@ GUI.
.INDENT 3.5
.sp
.EX
<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>
<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 fsWatcherTimeoutS=\(dq0\(dq ignorePerms=\(dqfalse\(dq autoNormalize=\(dqtrue\(dq>
<filesystemType>basic</filesystemType>
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq introducedBy=\(dq\(dq>
<encryptionPassword></encryptionPassword>
@@ -430,6 +430,13 @@ scheduled (only takes effect if \fI\%fsWatcherEnabled\fP is set to \fBtrue\fP).
.UNINDENT
.INDENT 0.0
.TP
.B fsWatcherTimeoutS
The maximum delay before a scan is triggered when a file is continuously
changing. If unset or zero a default value is calculated based on
\fI\%fsWatcherDelayS\fP\&.
.UNINDENT
.INDENT 0.0
.TP
.B ignorePerms
If \fBtrue\fP, files originating from this folder will be announced to remote
devices with the “no permission bits” flag. The remote devices will use
@@ -595,7 +602,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
\X'tty: link #marker-faq'\fI\%How do I serve a folder from a read only filesystem?\fP\X'tty: link'\&. 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
@@ -744,7 +751,7 @@ element:
.INDENT 0.0
.TP
.B id (mandatory)
The \X'tty: link #device-ids'\fI\%device ID\fP\X'tty: link'\&.
The \fI\%device ID\fP\&.
.UNINDENT
.INDENT 0.0
.TP
@@ -1327,7 +1334,7 @@ automatic upgrades.
.TP
.B upgradeToPreReleases
If \fBtrue\fP, automatic upgrades include release candidates (see
\X'tty: link #releases'\fI\%Versions & Releases\fP\X'tty: link').
\fI\%Versions & Releases\fP).
.UNINDENT
.INDENT 0.0
.TP
@@ -1482,7 +1489,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 \X'tty: link #cmdoption-reset-deltas'\fI\%\-\-reset\-deltas\fP\X'tty: link'\&. 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\&.
@@ -1522,7 +1529,7 @@ detailed in \fI\%insecureAllowOldTLSVersions\fP\&.
.sp
.EX
<defaults>
<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>
<folder id=\(dq\(dq label=\(dq\(dq path=\(dq~\(dq type=\(dqsendreceive\(dq rescanIntervalS=\(dq3600\(dq fsWatcherEnabled=\(dqtrue\(dq fsWatcherDelayS=\(dq10\(dq fsWatcherTimeoutS=\(dq0\(dq ignorePerms=\(dqfalse\(dq autoNormalize=\(dqtrue\(dq>
<filesystemType>basic</filesystemType>
<device id=\(dqS7UKX27\-GI7ZTXS\-GC6RKUA\-7AJGZ44\-C6NAYEB\-HSKTJQK\-KJHU2NO\-CWV7EQW\(dq introducedBy=\(dq\(dq>
<encryptionPassword></encryptionPassword>
@@ -1609,7 +1616,7 @@ including the appropriate \fI\%folder.device\fP element underneath.
Added in version 1.19.0.
.sp
Template for the \X'tty: link #ignoring-files'\fI\%ignore patterns\fP\X'tty: link' 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
@@ -1681,12 +1688,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 \X'tty: link #folder-sendonly'\fI\%Send Only Folder\fP\X'tty: link' 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 youd like to sync your home folder in non\-send only mode, you may add the
folder that stores the configuration files to the \X'tty: link #ignoring-files'\fI\%ignore list\fP\X'tty: link'\&.
folder that stores the configuration files to the \fI\%ignore list\fP\&.
If youd also like to backup your configuration files, add another folder in
send only mode for just the configuration folder.
.SH AUTHOR

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-DEVICE-IDS" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-device-ids \- Understanding Device IDs
.sp

View File

@@ -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-EVENT-API" "7" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-EVENT-API" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-event-api \- Event API
.SH DESCRIPTION
@@ -456,7 +456,7 @@ Added in version 0.11.12.
\fBSEE ALSO:\fP
.INDENT 0.0
.INDENT 3.5
The \X'tty: link #statechanged'\fI\%StateChanged\fP\X'tty: link' event.
The \fI\%StateChanged\fP event.
.UNINDENT
.UNINDENT
.SS FolderPaused
@@ -716,7 +716,7 @@ Added in version 0.11.10: The \fBmetadata\fP action.
.SS ListenAddressesChanged
.sp
This event is emitted when a \X'tty: link #listen-addresses'\fI\%listen address\fP\X'tty: link' changes.
This event is emitted when a \fI\%listen address\fP changes.
.INDENT 0.0
.INDENT 3.5
.sp
@@ -981,7 +981,7 @@ Deprecated since version v1.1.2: The \fBfolderID\fP field is a legacy name kept
.SS RemoteDownloadProgress
.sp
This event is emitted when a \X'tty: link #download-progress'\fI\%DownloadProgress\fP\X'tty: link' message is
This event is emitted when a \fI\%DownloadProgress\fP message is
received. It returns a map \fBdata\fP of filenames with a count of
downloaded blocks. The files in questions are currently being
downloaded on the remote \fBdevice\fP and belong to \fBfolder\fP\&.

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-FAQ" "7" "Jul 18, 2024" "v1.27.7" "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
\X'tty: link #config-option-folder.junctionsasdirs'\fI\%the configuration\fP\X'tty: link' 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, \X'tty: link #temporary-files'\fI\%temporary files\fP\X'tty: link', 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
\X'tty: link #temporary-files'\fI\%Temporary files\fP\X'tty: link' 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
\X'tty: link #device-ids'\fI\%Understanding Device IDs\fP\X'tty: link'
\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
\X'tty: link #firewall-setup'\fI\%Firewall Setup\fP\X'tty: link' 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,8 +295,8 @@ 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 \X'tty: link #config-option-options.setlowpriority'\fI\%lower the
process priority\fP\X'tty: link' when starting up.
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
environment variable \fBGOMAXPROCS\fP to the maximum number of CPU cores
@@ -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 \X'tty: link #config-option-gui.insecureskiphostcheck'\fI\%gui.insecureSkipHostcheck\fP\X'tty: link' 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 \X'tty: link #config-locations'\fI\%database
folder\fP\X'tty: link' inside Syncthings data directory and re\-start
note this in the logs and exit. To overcome this delete the \fI\%database
folder\fP inside Syncthings 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 \X'tty: link #relaying'\fI\%relay servers\fP\X'tty: link'\&. 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 \X'tty: link https://relays.syncthing.net'\fI\%the current list of active relays\fP <\fBhttps://relays.syncthing.net\fP>\X'tty: link'\&. 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
\X'tty: link #conflict-handling'\fI\%Conflicting Changes\fP\X'tty: link'
\fI\%Conflicting Changes\fP
.UNINDENT
.UNINDENT
.SS How do I serve a folder from a read only filesystem?
@@ -682,7 +682,7 @@ echo 204800 | sudo tee /proc/sys/fs/inotify/max_user_watches
.SS How do I reset the GUI password?
.sp
If youve forgotten / lost the GUI password, you can reset it using the
\X'tty: link #cmdoption-gui-password'\fI\%\-\-gui\-password\fP\X'tty: link' (and possibly \X'tty: link #cmdoption-gui-user'\fI\%\-\-gui\-user\fP\X'tty: link') 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
@@ -694,7 +694,7 @@ Stop Syncthing: \fBsyncthing cli operations shutdown\fP
Restart Syncthing as usual.
.UNINDENT
.sp
\fIAlternatively, in step 2\fP, you can manually delete the \X'tty: link #config-option-gui.user'\fI\%<user>\fP\X'tty: link' and \X'tty: link #config-option-gui.password'\fI\%<password>\fP\X'tty: link' 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 \fI\%configuration documentation\fP\&.
.sp

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-GLOBALDISCO" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-globaldisco \- Global Discovery Protocol v3
.SH ANNOUNCEMENTS

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-LOCALDISCO" "7" "Jul 18, 2024" "v1.27.7" "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
\X'tty: link #device-ids'\fI\%Understanding Device IDs\fP\X'tty: link' in the Syncthing documentation.
\fI\%Understanding Device IDs\fP in the Syncthing documentation.
.SH ANNOUNCEMENT PACKET
.sp
The Announcement packet has the following structure:

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-NETWORKING" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-networking \- Firewall Setup
.SH ROUTER SETUP
@@ -55,7 +55,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, \X'tty: link #relaying'\fI\%Relaying\fP\X'tty: link' 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
@@ -159,7 +159,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 \X'tty: link #proxying'\fI\%Using Proxies\fP\X'tty: link'\&.
Syncthing can use a SOCKS5 proxy for outbound connections. Please see \fI\%Using Proxies\fP\&.
.SH AUTHOR
The Syncthing Authors
.SH COPYRIGHT

View File

@@ -28,7 +28,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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-RELAY" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-relay \- Relay Protocol v1
.SH WHAT IS A RELAY?

View File

@@ -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-REST-API" "7" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-REST-API" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-rest-api \- REST API
.sp
@@ -102,7 +102,7 @@ $ curl \-H \(dqX\-API\-Key: yourkey\(dq localhost:8384/rest/system/browse?curren
.UNINDENT
.SS GET /rest/system/config (DEPRECATED)
.sp
Deprecated since version v1.12.0: This endpoint still works as before but is deprecated. Use \X'tty: link #rest-config'\fI\%/rest/config\fP\X'tty: link'
Deprecated since version v1.12.0: This endpoint still works as before but is deprecated. Use \fI\%/rest/config\fP
instead.
.sp
@@ -371,7 +371,7 @@ Returns the current configuration.
.SS GET /rest/system/config/insync (DEPRECATED)
.sp
Deprecated since version v1.12.0: This endpoint still works as before but is deprecated. Use
\X'tty: link #rest-config-insync'\fI\%/rest/config/restart\-required\fP\X'tty: link' instead.
\fI\%/rest/config/restart\-required\fP instead.
.sp
Returns whether the config is in sync, i.e. whether the running
@@ -395,7 +395,7 @@ instead.
Post the full contents of the configuration, in the same format as returned by
the corresponding GET request. When posting the configuration succeeds,
the posted configuration is immediately applied, except for changes that require a restart. Query
\X'tty: link #rest-config-insync'\fI\%/rest/config/restart\-required\fP\X'tty: link' to check if a restart is required.
\fI\%/rest/config/restart\-required\fP to check if a restart is required.
.sp
This endpoint is the main point to control Syncthing, even if the change only
concerns a very small part of the config: The usual workflow is to get the
@@ -682,7 +682,7 @@ curl \-X POST \-H \(dqX\-API\-Key: abc123\(dq http://localhost:8384/rest/system/
.UNINDENT
.UNINDENT
.sp
\fBCaution\fP: See \X'tty: link #cmdoption-reset-database'\fI\%\-\-reset\-database\fP\X'tty: link' for \fB\&.stfolder\fP creation
\fBCaution\fP: See \fI\%\-\-reset\-database\fP for \fB\&.stfolder\fP creation
side\-effect and caution regarding mountpoints.
.SS POST /rest/system/restart
.sp
@@ -902,7 +902,7 @@ patterns to be used by default on folders, as an array of single\-line strings.
\fBNOTE:\fP
.INDENT 0.0
.INDENT 3.5
The \X'tty: link #config-option-gui.password'\fI\%gui.password\fP\X'tty: link' configuration option has special handling to
The \fI\%gui.password\fP configuration option has special handling to
accept already hashed passwords. Any valid bcrypt hash is stored verbatim,
while a plaintext password is first hashed.
.UNINDENT
@@ -1035,7 +1035,7 @@ Added in version 0.14.53.
Takes one mandatory parameter, \fBfolder\fP, and returns the list of errors
encountered during scanning or pulling.
.sp
The results can be paginated using the \X'tty: link #rest-pagination'\fI\%common pagination parameters\fP\X'tty: link'\&.
The results can be paginated using the \fI\%common pagination parameters\fP\&.
.INDENT 0.0
.INDENT 3.5
.sp
@@ -1418,7 +1418,7 @@ were changed locally in a receive\-only folder. Thus they differ from the globa
state and could be reverted by pulling from remote devices again, see
\fI\%POST /rest/db/revert\fP\&.
.sp
The results can be paginated using the \X'tty: link #rest-pagination'\fI\%common pagination parameters\fP\X'tty: link'\&.
The results can be paginated using the \fI\%common pagination parameters\fP\&.
.INDENT 0.0
.INDENT 3.5
.sp
@@ -1455,7 +1455,7 @@ Use sparingly.
Takes one mandatory parameter, \fBfolder\fP, and returns lists of files which are
needed by this device in order for it to become in sync.
.sp
The results can be paginated using the \X'tty: link #rest-pagination'\fI\%common pagination parameters\fP\X'tty: link'\&. Pagination happens, across the union of all needed files,
The results can be paginated using the \fI\%common pagination parameters\fP\&. Pagination happens, across the union of all needed files,
that is \- across all 3 sections of the response. For example, given the current
need state is as follows:
.INDENT 0.0
@@ -1559,7 +1559,7 @@ Takes the mandatory parameters \fBfolder\fP and \fBdevice\fP, and returns the li
of files which are needed by that remote device in order for it to become in
sync with the shared folder.
.sp
The results can be paginated using the \X'tty: link #rest-pagination'\fI\%common pagination parameters\fP\X'tty: link'\&.
The results can be paginated using the \fI\%common pagination parameters\fP\&.
.INDENT 0.0
.INDENT 3.5
.sp
@@ -1730,7 +1730,7 @@ To receive events, perform a HTTP GET of \fB/rest/events\fP\&.
.sp
To filter the event list, in effect creating a specific subscription for only
the desired event types, add a parameter \fBevents=EventTypeA,EventTypeB,...\fP
where the event types are any of the \X'tty: link #event-types'\fI\%Event Types\fP\X'tty: link'\&. If no filter is
where the event types are any of the \fI\%Event Types\fP\&. If no filter is
specified, all events \fIexcept\fP \fI\%LocalChangeDetected\fP and
\fI\%RemoteChangeDetected\fP are included.
.sp
@@ -1908,7 +1908,7 @@ Returns the data sent in the anonymous usage report.
.SH DEBUG ENDPOINTS
.SS Debug Endpoints
.sp
These endpoints require the \X'tty: link #config-option-gui.debugging'\fI\%gui.debugging\fP\X'tty: link' configuration option to
These endpoints require the \fI\%gui.debugging\fP configuration option to
be enabled and yield an access denied error code otherwise.
.SS GET /rest/debug/peerCompletion
.sp

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-SECURITY" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-security \- Security Principles
.sp

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-STIGNORE" "5" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-stignore \- Prevent files from being synchronized to other nodes
.SH SYNOPSIS
@@ -124,7 +124,7 @@ more general patterns that follow.
.INDENT 3.5
Negated patterns that can match items below the folder root will cause
Syncthing to traverse otherwise ignored directories. If the
\X'tty: link #scanning'\fI\%watcher\fP\X'tty: link' is enabled, those directories will also be
\fI\%watcher\fP is enabled, those directories will also be
watched. Directories ignored before the first negated pattern can
however be safely skipped, since the first matching pattern wins. For
example:

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING-VERSIONING" "7" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing-versioning \- Keep automatic backups of deleted files by other nodes
.sp
@@ -285,7 +285,7 @@ files permanently.
.SH CONFIGURATION PARAMETER REFERENCE
.sp
The versioning settings are grouped into their own section of each folder in the
\X'tty: link #config-option-folder.versioning'\fI\%configuration file\fP\X'tty: link'\&. 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
@@ -326,7 +326,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 \X'tty: link #config-option-folder.filesystemtype'\fI\%filesystemType\fP\X'tty: link' 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

View File

@@ -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" "May 08, 2024" "v1.27.7" "Syncthing"
.TH "SYNCTHING" "1" "Jul 18, 2024" "v1.27.7" "Syncthing"
.SH NAME
syncthing \- Syncthing
.SH SYNOPSIS
@@ -367,7 +367,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 \X'tty: link #untrusted-decrypt'\fI\%decryption\fP\X'tty: link' 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