Compare commits

..
Author SHA1 Message Date
Jakob Borg f2f9113fd9 nothing: Dummy commit 2016-05-14 08:02:02 +02:00
98 changed files with 653 additions and 1250 deletions
-1
View File
@@ -8,7 +8,6 @@ Anderson Mesquita <andersonvom@gmail.com>
Andrew Dunham <andrew@du.nham.ca> Andrew Dunham <andrew@du.nham.ca>
Antony Male <antony.male@gmail.com> Antony Male <antony.male@gmail.com>
Arthur Axel fREW Schmidt <frew@afoolishmanifesto.com> <frioux@gmail.com> Arthur Axel fREW Schmidt <frew@afoolishmanifesto.com> <frioux@gmail.com>
Alexandre Viau <alexandre@alexandreviau.net> <aviau@debian.org>
Audrius Butkevicius <audrius.butkevicius@gmail.com> Audrius Butkevicius <audrius.butkevicius@gmail.com>
Bart De Vries <devriesb@gmail.com> Bart De Vries <devriesb@gmail.com>
Ben Curthoys <ben@bencurthoys.com> Ben Curthoys <ben@bencurthoys.com>
+1 -5
View File
@@ -1,11 +1,7 @@
Do not report security issues in this bug tracker. Instead, contact
security@syncthing.net directly - see https://syncthing.net/security.html
for more information.
If your issue is a support request ("How do I get my devices to connect?" If your issue is a support request ("How do I get my devices to connect?"
or similar), please use the support forum at https://forum.syncthing.net/ or similar), please use the support forum at https://forum.syncthing.net/
where a large number of helpful people hang out. This issue tracker is for where a large number of helpful people hang out. This issue tracker is for
reporting bugs or feature requests directly to the developers. reporting bugs or feature requests directly to the developers.
If your issue is a bug report, replace this boilerplate with a description If your issue is a bug report, replace this boilerplate with a description
of the problem, being sure to include at least: of the problem, being sure to include at least:
-1
View File
@@ -7,7 +7,6 @@ andersonvom <andersonvom@gmail.com>
andrew-d <andrew@du.nham.ca> andrew-d <andrew@du.nham.ca>
asdil12 <dominik@heidler.eu> asdil12 <dominik@heidler.eu>
AudriusButkevicius <audrius.butkevicius@gmail.com> AudriusButkevicius <audrius.butkevicius@gmail.com>
aviau <alexandre@alexandreviau.net> <aviau@debian.org>
bencurthoys <ben@bencurthoys.com> bencurthoys <ben@bencurthoys.com>
bigbear2nd <bigbear2nd@gmail.com> bigbear2nd <bigbear2nd@gmail.com>
brbecker <brbecker@gmail.com> brbecker <brbecker@gmail.com>
+15 -23
View File
@@ -117,8 +117,16 @@ func main() {
log.SetOutput(os.Stdout) log.SetOutput(os.Stdout)
log.SetFlags(0) log.SetFlags(0)
// If GOPATH isn't set, set it correctly with the assumption that we are
// in $GOPATH/src/github.com/syncthing/syncthing.
if os.Getenv("GOPATH") == "" { if os.Getenv("GOPATH") == "" {
setGoPath() cwd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
gopath := filepath.Clean(filepath.Join(cwd, "../../../../"))
log.Println("GOPATH is", gopath)
os.Setenv("GOPATH", gopath)
} }
// We use Go 1.5+ vendoring. // We use Go 1.5+ vendoring.
@@ -128,7 +136,12 @@ func main() {
// might have installed during "build.go setup". // might have installed during "build.go setup".
os.Setenv("PATH", fmt.Sprintf("%s%cbin%c%s", os.Getenv("GOPATH"), os.PathSeparator, os.PathListSeparator, os.Getenv("PATH"))) os.Setenv("PATH", fmt.Sprintf("%s%cbin%c%s", os.Getenv("GOPATH"), os.PathSeparator, os.PathListSeparator, os.Getenv("PATH")))
parseFlags() flag.StringVar(&goarch, "goarch", runtime.GOARCH, "GOARCH")
flag.StringVar(&goos, "goos", runtime.GOOS, "GOOS")
flag.BoolVar(&noupgrade, "no-upgrade", noupgrade, "Disable upgrade functionality")
flag.StringVar(&version, "version", getVersion(), "Set compiled in version string")
flag.BoolVar(&race, "race", race, "Use race detector")
flag.Parse()
switch goarch { switch goarch {
case "386", "amd64", "arm", "arm64", "ppc64", "ppc64le": case "386", "amd64", "arm", "arm64", "ppc64", "ppc64le":
@@ -228,27 +241,6 @@ func main() {
} }
} }
// setGoPath sets GOPATH correctly with the assumption that we are
// in $GOPATH/src/github.com/syncthing/syncthing.
func setGoPath() {
cwd, err := os.Getwd()
if err != nil {
log.Fatal(err)
}
gopath := filepath.Clean(filepath.Join(cwd, "../../../../"))
log.Println("GOPATH is", gopath)
os.Setenv("GOPATH", gopath)
}
func parseFlags() {
flag.StringVar(&goarch, "goarch", runtime.GOARCH, "GOARCH")
flag.StringVar(&goos, "goos", runtime.GOOS, "GOOS")
flag.BoolVar(&noupgrade, "no-upgrade", noupgrade, "Disable upgrade functionality")
flag.StringVar(&version, "version", getVersion(), "Set compiled in version string")
flag.BoolVar(&race, "race", race, "Use race detector")
flag.Parse()
}
func checkRequiredGoVersion() (float64, bool) { func checkRequiredGoVersion() (float64, bool) {
re := regexp.MustCompile(`go(\d+\.\d+)`) re := regexp.MustCompile(`go(\d+\.\d+)`)
ver := runtime.Version() ver := runtime.Version()
+4
View File
@@ -461,6 +461,10 @@ func corsMiddleware(next http.Handler) http.Handler {
// //
// See https://www.w3.org/TR/cors/ for details. // See https://www.w3.org/TR/cors/ for details.
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
// Add a generous access-control-allow-origin header since we may be
// redirecting REST requests over protocols
w.Header().Add("Access-Control-Allow-Origin", "*")
// Process OPTIONS requests // Process OPTIONS requests
if r.Method == "OPTIONS" { if r.Method == "OPTIONS" {
// Only GET/POST Methods are supported // Only GET/POST Methods are supported
+13 -2
View File
@@ -41,8 +41,7 @@ func csrfMiddleware(unique string, prefix string, cfg config.GUIConfiguration, n
return return
} }
// Allow requests for anything not under the protected path prefix, // Allow requests for the front page, and set a CSRF cookie if there isn't already a valid one.
// and set a CSRF cookie if there isn't already a valid one.
if !strings.HasPrefix(r.URL.Path, prefix) { if !strings.HasPrefix(r.URL.Path, prefix) {
cookie, err := r.Cookie("CSRF-Token-" + unique) cookie, err := r.Cookie("CSRF-Token-" + unique)
if err != nil || !validCsrfToken(cookie.Value) { if err != nil || !validCsrfToken(cookie.Value) {
@@ -57,6 +56,18 @@ func csrfMiddleware(unique string, prefix string, cfg config.GUIConfiguration, n
return return
} }
if r.Method == "GET" {
// Allow GET requests unconditionally, but if we got the CSRF
// token cookie do the verification anyway so we keep the
// csrfTokens list sorted by recent usage. We don't care about the
// outcome of the validity check.
if cookie, err := r.Cookie("CSRF-Token-" + unique); err == nil {
validCsrfToken(cookie.Value)
}
next.ServeHTTP(w, r)
return
}
// Verify the CSRF token // Verify the CSRF token
token := r.Header.Get("X-CSRF-Token-" + unique) token := r.Header.Get("X-CSRF-Token-" + unique)
if !validCsrfToken(token) { if !validCsrfToken(token) {
+4 -83
View File
@@ -189,9 +189,7 @@ type httpTestCase struct {
} }
func TestAPIServiceRequests(t *testing.T) { func TestAPIServiceRequests(t *testing.T) {
const testAPIKey = "foobarbaz"
cfg := new(mockedConfig) cfg := new(mockedConfig)
cfg.gui.APIKey = testAPIKey
baseURL, err := startHTTP(cfg) baseURL, err := startHTTP(cfg)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@@ -346,13 +344,13 @@ func TestAPIServiceRequests(t *testing.T) {
for _, tc := range cases { for _, tc := range cases {
t.Log("Testing", tc.URL, "...") t.Log("Testing", tc.URL, "...")
testHTTPRequest(t, baseURL, tc, testAPIKey) testHTTPRequest(t, baseURL, tc)
} }
} }
// testHTTPRequest tries the given test case, comparing the result code, // testHTTPRequest tries the given test case, comparing the result code,
// content type, and result prefix. // content type, and result prefix.
func testHTTPRequest(t *testing.T, baseURL string, tc httpTestCase, apikey string) { func testHTTPRequest(t *testing.T, baseURL string, tc httpTestCase) {
timeout := time.Second timeout := time.Second
if tc.Timeout > 0 { if tc.Timeout > 0 {
timeout = tc.Timeout timeout = tc.Timeout
@@ -361,14 +359,7 @@ func testHTTPRequest(t *testing.T, baseURL string, tc httpTestCase, apikey strin
Timeout: timeout, Timeout: timeout,
} }
req, err := http.NewRequest("GET", baseURL+tc.URL, nil) resp, err := cli.Get(baseURL + tc.URL)
if err != nil {
t.Errorf("Unexpected error requesting %s: %v", tc.URL, err)
return
}
req.Header.Set("X-API-Key", apikey)
resp, err := cli.Do(req)
if err != nil { if err != nil {
t.Errorf("Unexpected error requesting %s: %v", tc.URL, err) t.Errorf("Unexpected error requesting %s: %v", tc.URL, err)
return return
@@ -409,7 +400,7 @@ func TestHTTPLogin(t *testing.T) {
// Verify rejection when not using authorization // Verify rejection when not using authorization
req, _ := http.NewRequest("GET", baseURL, nil) req, _ := http.NewRequest("GET", baseURL+"/rest/system/status", nil)
resp, err := http.DefaultClient.Do(req) resp, err := http.DefaultClient.Do(req)
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
@@ -500,73 +491,3 @@ func startHTTP(cfg *mockedConfig) (string, error) {
return baseURL, nil return baseURL, nil
} }
func TestCSRFRequired(t *testing.T) {
const testAPIKey = "foobarbaz"
cfg := new(mockedConfig)
cfg.gui.APIKey = testAPIKey
baseURL, err := startHTTP(cfg)
cli := &http.Client{
Timeout: time.Second,
}
// Getting the base URL (i.e. "/") should succeed.
resp, err := cli.Get(baseURL)
if err != nil {
t.Fatal("Unexpected error from getting base URL:", err)
}
resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Fatal("Getting base URL should succeed, not", resp.Status)
}
// Find the returned CSRF token for future use
var csrfTokenName, csrfTokenValue string
for _, cookie := range resp.Cookies() {
if strings.HasPrefix(cookie.Name, "CSRF-Token") {
csrfTokenName = cookie.Name
csrfTokenValue = cookie.Value
break
}
}
// Calling on /rest without a token should fail
resp, err = cli.Get(baseURL + "/rest/system/config")
if err != nil {
t.Fatal("Unexpected error from getting /rest/system/config:", err)
}
resp.Body.Close()
if resp.StatusCode != http.StatusForbidden {
t.Fatal("Getting /rest/system/config without CSRF token should fail, not", resp.Status)
}
// Calling on /rest with a token should succeed
req, _ := http.NewRequest("GET", baseURL+"/rest/system/config", nil)
req.Header.Set("X-"+csrfTokenName, csrfTokenValue)
resp, err = cli.Do(req)
if err != nil {
t.Fatal("Unexpected error from getting /rest/system/config:", err)
}
resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Fatal("Getting /rest/system/config with CSRF token should succeed, not", resp.Status)
}
// Calling on /rest with the API key should succeed
req, _ = http.NewRequest("GET", baseURL+"/rest/system/config", nil)
req.Header.Set("X-API-Key", testAPIKey)
resp, err = cli.Do(req)
if err != nil {
t.Fatal("Unexpected error from getting /rest/system/config:", err)
}
resp.Body.Close()
if resp.StatusCode != http.StatusOK {
t.Fatal("Getting /rest/system/config with API key should succeed, not", resp.Status)
}
}
+2 -3
View File
@@ -532,9 +532,8 @@ func syncthingMain(runtimeOptions RuntimeOptions) {
errors := logger.NewRecorder(l, logger.LevelWarn, maxSystemErrors, 0) errors := logger.NewRecorder(l, logger.LevelWarn, maxSystemErrors, 0)
systemLog := logger.NewRecorder(l, logger.LevelDebug, maxSystemLog, initialSystemLog) systemLog := logger.NewRecorder(l, logger.LevelDebug, maxSystemLog, initialSystemLog)
// Event subscription for the API; must start early to catch the early events. The LocalDiskUpdated // Event subscription for the API; must start early to catch the early events.
// event might overwhelm the event reciever in some situations so we will not subscribe to it here. apiSub := events.NewBufferedSubscription(events.Default.Subscribe(events.AllEvents), 1000)
apiSub := events.NewBufferedSubscription(events.Default.Subscribe(events.AllEvents&^events.LocalChangeDetected), 1000)
if len(os.Getenv("GOMAXPROCS")) == 0 { if len(os.Getenv("GOMAXPROCS")) == 0 {
runtime.GOMAXPROCS(runtime.NumCPU()) runtime.GOMAXPROCS(runtime.NumCPU())
+1 -15
View File
@@ -72,18 +72,15 @@ func (s *verboseService) formatEvent(ev events.Event) string {
case events.Starting: case events.Starting:
return fmt.Sprintf("Starting up (%s)", ev.Data.(map[string]string)["home"]) return fmt.Sprintf("Starting up (%s)", ev.Data.(map[string]string)["home"])
case events.StartupComplete: case events.StartupComplete:
return "Startup complete" return "Startup complete"
case events.DeviceDiscovered: case events.DeviceDiscovered:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
return fmt.Sprintf("Discovered device %v at %v", data["device"], data["addrs"]) return fmt.Sprintf("Discovered device %v at %v", data["device"], data["addrs"])
case events.DeviceConnected: case events.DeviceConnected:
data := ev.Data.(map[string]string) data := ev.Data.(map[string]string)
return fmt.Sprintf("Connected to device %v at %v (type %s)", data["id"], data["addr"], data["type"]) return fmt.Sprintf("Connected to device %v at %v (type %s)", data["id"], data["addr"], data["type"])
case events.DeviceDisconnected: case events.DeviceDisconnected:
data := ev.Data.(map[string]string) data := ev.Data.(map[string]string)
return fmt.Sprintf("Disconnected from device %v", data["id"]) return fmt.Sprintf("Disconnected from device %v", data["id"])
@@ -92,11 +89,6 @@ func (s *verboseService) formatEvent(ev events.Event) string {
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
return fmt.Sprintf("Folder %q is now %v", data["folder"], data["to"]) return fmt.Sprintf("Folder %q is now %v", data["folder"], data["to"])
case events.LocalChangeDetected:
data := ev.Data.(map[string]string)
// Local change detected in folder "foo": modified file /Users/jb/whatever
return fmt.Sprintf("Local change detected in folder %q: %s %s %s", data["folder"], data["action"], data["type"], data["path"])
case events.RemoteIndexUpdated: case events.RemoteIndexUpdated:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
return fmt.Sprintf("Device %v sent an index update for %q with %d items", data["device"], data["folder"], data["items"]) return fmt.Sprintf("Device %v sent an index update for %q with %d items", data["device"], data["folder"], data["items"])
@@ -104,7 +96,6 @@ func (s *verboseService) formatEvent(ev events.Event) string {
case events.DeviceRejected: case events.DeviceRejected:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
return fmt.Sprintf("Rejected connection from device %v at %v", data["device"], data["address"]) return fmt.Sprintf("Rejected connection from device %v at %v", data["device"], data["address"])
case events.FolderRejected: case events.FolderRejected:
data := ev.Data.(map[string]string) data := ev.Data.(map[string]string)
return fmt.Sprintf("Rejected unshared folder %q from device %v", data["folder"], data["device"]) return fmt.Sprintf("Rejected unshared folder %q from device %v", data["folder"], data["device"])
@@ -112,7 +103,6 @@ func (s *verboseService) formatEvent(ev events.Event) string {
case events.ItemStarted: case events.ItemStarted:
data := ev.Data.(map[string]string) data := ev.Data.(map[string]string)
return fmt.Sprintf("Started syncing %q / %q (%v %v)", data["folder"], data["item"], data["action"], data["type"]) return fmt.Sprintf("Started syncing %q / %q (%v %v)", data["folder"], data["item"], data["action"], data["type"])
case events.ItemFinished: case events.ItemFinished:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
if err, ok := data["error"].(*string); ok && err != nil { if err, ok := data["error"].(*string); ok && err != nil {
@@ -129,7 +119,6 @@ func (s *verboseService) formatEvent(ev events.Event) string {
case events.FolderCompletion: case events.FolderCompletion:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
return fmt.Sprintf("Completion for folder %q on device %v is %v%%", data["folder"], data["device"], data["completion"]) return fmt.Sprintf("Completion for folder %q on device %v is %v%%", data["folder"], data["device"], data["completion"])
case events.FolderSummary: case events.FolderSummary:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
sum := data["summary"].(map[string]interface{}) sum := data["summary"].(map[string]interface{})
@@ -137,7 +126,6 @@ func (s *verboseService) formatEvent(ev events.Event) string {
delete(sum, "ignorePatterns") delete(sum, "ignorePatterns")
delete(sum, "stateChanged") delete(sum, "stateChanged")
return fmt.Sprintf("Summary for folder %q is %v", data["folder"], data["summary"]) return fmt.Sprintf("Summary for folder %q is %v", data["folder"], data["summary"])
case events.FolderScanProgress: case events.FolderScanProgress:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
folder := data["folder"].(string) folder := data["folder"].(string)
@@ -154,19 +142,16 @@ func (s *verboseService) formatEvent(ev events.Event) string {
data := ev.Data.(map[string]string) data := ev.Data.(map[string]string)
device := data["device"] device := data["device"]
return fmt.Sprintf("Device %v was paused", device) return fmt.Sprintf("Device %v was paused", device)
case events.DeviceResumed: case events.DeviceResumed:
data := ev.Data.(map[string]string) data := ev.Data.(map[string]string)
device := data["device"] device := data["device"]
return fmt.Sprintf("Device %v was resumed", device) return fmt.Sprintf("Device %v was resumed", device)
case events.ListenAddressesChanged: case events.ListenAddressesChanged:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
address := data["address"] address := data["address"]
lan := data["lan"] lan := data["lan"]
wan := data["wan"] wan := data["wan"]
return fmt.Sprintf("Listen address %s resolution has changed: lan addresses: %s wan addresses: %s", address, lan, wan) return fmt.Sprintf("Listen address %s resolution has changed: lan addresses: %s wan addresses: %s", address, lan, wan)
case events.LoginAttempt: case events.LoginAttempt:
data := ev.Data.(map[string]interface{}) data := ev.Data.(map[string]interface{})
username := data["username"].(string) username := data["username"].(string)
@@ -177,6 +162,7 @@ func (s *verboseService) formatEvent(ev events.Event) string {
success = "failed" success = "failed"
} }
return fmt.Sprintf("Login %s for username %s.", success, username) return fmt.Sprintf("Login %s for username %s.", success, username)
} }
return fmt.Sprintf("%s %#v", ev.Type, ev) return fmt.Sprintf("%s %#v", ev.Type, ev)
@@ -1,6 +1,5 @@
[Unit] [Unit]
Description=Restart Syncthing after resume Description=Restart Syncthing after resume
Documentation=man:syncthing(1)
After=suspend.target After=suspend.target
[Service] [Service]
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Коментар, използван в началото на реда", "Comment, when used at the start of a line": "Коментар, използван в началото на реда",
"Compression": "Компресиране", "Compression": "Компресиране",
"Connection Error": "Грешка при свързването", "Connection Error": "Грешка при свързването",
"Connection Type": "Вид връзка",
"Copied from elsewhere": "Копиране от някъде другаде", "Copied from elsewhere": "Копиране от някъде другаде",
"Copied from original": "Копиран от оригинала", "Copied from original": "Копиран от оригинала",
"Copyright © 2014-2016 the following Contributors:": "Всички правата запазени © 2014-2016 Сътрудници:", "Copyright © 2014-2016 the following Contributors:": "Всички правата запазени © 2014-2016 Сътрудници:",
@@ -75,7 +74,6 @@
"Folder Label": "Етикет на папката", "Folder Label": "Етикет на папката",
"Folder Master": "Главна папка", "Folder Master": "Главна папка",
"Folder Path": "Път до папката", "Folder Path": "Път до папката",
"Folder Type": "Вид папка",
"Folders": "Папки", "Folders": "Папки",
"GUI": "Потребителски интерфейс", "GUI": "Потребителски интерфейс",
"GUI Authentication Password": "Парола за потребителския интерфейс", "GUI Authentication Password": "Парола за потребителския интерфейс",
@@ -100,12 +98,10 @@
"Last File Received": "Последния получен файл", "Last File Received": "Последния получен файл",
"Last seen": "Последно видян", "Last seen": "Последно видян",
"Later": "По-късно", "Later": "По-късно",
"Listeners": "Слушащи",
"Local Discovery": "Локално откриване", "Local Discovery": "Локално откриване",
"Local State": "Локално състояние", "Local State": "Локално състояние",
"Local State (Total)": "Локално състояние (Общо)", "Local State (Total)": "Локално състояние (Общо)",
"Major Upgrade": "Основно Обновяване", "Major Upgrade": "Основно Обновяване",
"Master": "Главен",
"Maximum Age": "Максимална възраст", "Maximum Age": "Максимална възраст",
"Metadata Only": "Само мета информация", "Metadata Only": "Само мета информация",
"Minimum Free Disk Space": "Минимално свободно дисково пространство", "Minimum Free Disk Space": "Минимално свободно дисково пространство",
@@ -117,7 +113,6 @@
"Newest First": "Първо най-новите", "Newest First": "Първо най-новите",
"No": "Не", "No": "Не",
"No File Versioning": "Без версии", "No File Versioning": "Без версии",
"Normal": "Нормален",
"Notice": "Известие", "Notice": "Известие",
"OK": "ОК", "OK": "ОК",
"Off": "Изключено", "Off": "Изключено",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Comentari quan és usat al principi d'una línia", "Comment, when used at the start of a line": "Comentari quan és usat al principi d'una línia",
"Compression": "Compressió", "Compression": "Compressió",
"Connection Error": "Error de connexió", "Connection Error": "Error de connexió",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Copiat d'un altre lloc", "Copied from elsewhere": "Copiat d'un altre lloc",
"Copied from original": "Copiat de l'original", "Copied from original": "Copiat de l'original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Carpeta mestra", "Folder Master": "Carpeta mestra",
"Folder Path": "Camí de carpeta", "Folder Path": "Camí de carpeta",
"Folder Type": "Folder Type",
"Folders": "Carpetes", "Folders": "Carpetes",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Contrasenya d'autenticació GUI", "GUI Authentication Password": "Contrasenya d'autenticació GUI",
@@ -100,12 +98,10 @@
"Last File Received": "Últim fitxer rebut", "Last File Received": "Últim fitxer rebut",
"Last seen": "Vist per última vegada", "Last seen": "Vist per última vegada",
"Later": "Després", "Later": "Després",
"Listeners": "Listeners",
"Local Discovery": "Descobriment Local", "Local Discovery": "Descobriment Local",
"Local State": "Estat local", "Local State": "Estat local",
"Local State (Total)": "Estat local (Total)", "Local State (Total)": "Estat local (Total)",
"Major Upgrade": "Actualització major", "Major Upgrade": "Actualització major",
"Master": "Master",
"Maximum Age": "Antiguitat Màxima", "Maximum Age": "Antiguitat Màxima",
"Metadata Only": "Només metadades", "Metadata Only": "Només metadades",
"Minimum Free Disk Space": "Espai de disc lliure mínim", "Minimum Free Disk Space": "Espai de disc lliure mínim",
@@ -117,7 +113,6 @@
"Newest First": "Més nou primer", "Newest First": "Més nou primer",
"No": "No", "No": "No",
"No File Versioning": "Sense Versionat de Fitxer", "No File Versioning": "Sense Versionat de Fitxer",
"Normal": "Normal",
"Notice": "Avís", "Notice": "Avís",
"OK": "OK", "OK": "OK",
"Off": "Desactivar", "Off": "Desactivar",
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Comentar, quant s'utilitza al principi d'una línia", "Comment, when used at the start of a line": "Comentar, quant s'utilitza al principi d'una línia",
"Compression": "Compresió", "Compression": "Compresió",
"Connection Error": "Error de connexió", "Connection Error": "Error de connexió",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Copiat de qualsevol lloc", "Copied from elsewhere": "Copiat de qualsevol lloc",
"Copied from original": "Copiat de l'original", "Copied from original": "Copiat de l'original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 els següents Col·laboradors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 els següents Col·laboradors:",
@@ -75,7 +74,6 @@
"Folder Label": "Etiqueta de la Carpeta", "Folder Label": "Etiqueta de la Carpeta",
"Folder Master": "Carpeta principal", "Folder Master": "Carpeta principal",
"Folder Path": "Ruta de la carpeta", "Folder Path": "Ruta de la carpeta",
"Folder Type": "Folder Type",
"Folders": "Carpetes", "Folders": "Carpetes",
"GUI": "IGU (Interfície Gràfica d'Usuari)", "GUI": "IGU (Interfície Gràfica d'Usuari)",
"GUI Authentication Password": "Password d'autenticació de l'Interfície Gràfica d'Usuari (GUI)", "GUI Authentication Password": "Password d'autenticació de l'Interfície Gràfica d'Usuari (GUI)",
@@ -100,12 +98,10 @@
"Last File Received": "Darrer fitxer rebut", "Last File Received": "Darrer fitxer rebut",
"Last seen": "Vist per última vegada", "Last seen": "Vist per última vegada",
"Later": "Més tard", "Later": "Més tard",
"Listeners": "Listeners",
"Local Discovery": "Descobriment local", "Local Discovery": "Descobriment local",
"Local State": "Estat local", "Local State": "Estat local",
"Local State (Total)": "Estat Local (Total)", "Local State (Total)": "Estat Local (Total)",
"Major Upgrade": "Actualització important", "Major Upgrade": "Actualització important",
"Master": "Master",
"Maximum Age": "Edat màxima", "Maximum Age": "Edat màxima",
"Metadata Only": "Sols metadades", "Metadata Only": "Sols metadades",
"Minimum Free Disk Space": "Espai minim de disc lliure", "Minimum Free Disk Space": "Espai minim de disc lliure",
@@ -117,7 +113,6 @@
"Newest First": "El més nou primer", "Newest First": "El més nou primer",
"No": "No", "No": "No",
"No File Versioning": "Sense versionat de fitxer", "No File Versioning": "Sense versionat de fitxer",
"Normal": "Normal",
"Notice": "Avís", "Notice": "Avís",
"OK": "OK", "OK": "OK",
"Off": "Off", "Off": "Off",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Komentář, pokud použito na začátku řádku", "Comment, when used at the start of a line": "Komentář, pokud použito na začátku řádku",
"Compression": "Komprese", "Compression": "Komprese",
"Connection Error": "Chyba připojení", "Connection Error": "Chyba připojení",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Zkopírováno odjinud", "Copied from elsewhere": "Zkopírováno odjinud",
"Copied from original": "Zkopírováno z originálu", "Copied from original": "Zkopírováno z originálu",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 následující přispěvatelé:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 následující přispěvatelé:",
@@ -75,7 +74,6 @@
"Folder Label": "Jmenovka adresáře", "Folder Label": "Jmenovka adresáře",
"Folder Master": "Master adresář", "Folder Master": "Master adresář",
"Folder Path": "Cesta k adresáři", "Folder Path": "Cesta k adresáři",
"Folder Type": "Folder Type",
"Folders": "Adresáře", "Folders": "Adresáře",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Přihlašovací heslo pro GUI", "GUI Authentication Password": "Přihlašovací heslo pro GUI",
@@ -100,12 +98,10 @@
"Last File Received": "Poslední přijatý soubor", "Last File Received": "Poslední přijatý soubor",
"Last seen": "Naposledy spatřen", "Last seen": "Naposledy spatřen",
"Later": "Později", "Later": "Později",
"Listeners": "Listeners",
"Local Discovery": "Místní oznamování", "Local Discovery": "Místní oznamování",
"Local State": "Místní status", "Local State": "Místní status",
"Local State (Total)": "Místní status (Celkem)", "Local State (Total)": "Místní status (Celkem)",
"Major Upgrade": "Důležitá aktualizace", "Major Upgrade": "Důležitá aktualizace",
"Master": "Master",
"Maximum Age": "Maximální časový limit", "Maximum Age": "Maximální časový limit",
"Metadata Only": "Pouze metadata", "Metadata Only": "Pouze metadata",
"Minimum Free Disk Space": "Minimální velikost volného místa na disku", "Minimum Free Disk Space": "Minimální velikost volného místa na disku",
@@ -117,7 +113,6 @@
"Newest First": "Od nejnovějšího", "Newest First": "Od nejnovějšího",
"No": "Ne", "No": "Ne",
"No File Versioning": "Bez verzování souborů", "No File Versioning": "Bez verzování souborů",
"Normal": "Normal",
"Notice": "Oznámení", "Notice": "Oznámení",
"OK": "OK", "OK": "OK",
"Off": "Vypnuta", "Off": "Vypnuta",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Kommentering som bruges i starten af en linje", "Comment, when used at the start of a line": "Kommentering som bruges i starten af en linje",
"Compression": "Anvend komprimering", "Compression": "Anvend komprimering",
"Connection Error": "Tilslutnings fejl", "Connection Error": "Tilslutnings fejl",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Kopieret fra et andet sted", "Copied from elsewhere": "Kopieret fra et andet sted",
"Copied from original": "Kopieret fra originalen", "Copied from original": "Kopieret fra originalen",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Mastermappe", "Folder Master": "Mastermappe",
"Folder Path": "Mappesti", "Folder Path": "Mappesti",
"Folder Type": "Folder Type",
"Folders": "Mapper", "Folders": "Mapper",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "GUI-kodeord", "GUI Authentication Password": "GUI-kodeord",
@@ -100,12 +98,10 @@
"Last File Received": "Sidste modtaget fil", "Last File Received": "Sidste modtaget fil",
"Last seen": "Sidst set", "Last seen": "Sidst set",
"Later": "Senere", "Later": "Senere",
"Listeners": "Listeners",
"Local Discovery": "Lokal opslag", "Local Discovery": "Lokal opslag",
"Local State": "Lokal tilstand", "Local State": "Lokal tilstand",
"Local State (Total)": "Lokal tilstand (total)", "Local State (Total)": "Lokal tilstand (total)",
"Major Upgrade": "Ny version", "Major Upgrade": "Ny version",
"Master": "Master",
"Maximum Age": "Maks alder", "Maximum Age": "Maks alder",
"Metadata Only": "Kun metadata", "Metadata Only": "Kun metadata",
"Minimum Free Disk Space": "Mindst ledig diskplads", "Minimum Free Disk Space": "Mindst ledig diskplads",
@@ -117,7 +113,6 @@
"Newest First": "Nyeste først", "Newest First": "Nyeste først",
"No": "Nej", "No": "Nej",
"No File Versioning": "Ingen filversion", "No File Versioning": "Ingen filversion",
"Normal": "Normal",
"Notice": "OBS", "Notice": "OBS",
"OK": "OK", "OK": "OK",
"Off": "Slå fra", "Off": "Slå fra",
+3 -8
View File
@@ -21,18 +21,17 @@
"An external command handles the versioning. It has to remove the file from the synced folder.": "Ein externer Programmaufruf handhabt die Versionierung. Es muss die Datei aus dem zu synchronisierendem Verzeichnis entfernen.", "An external command handles the versioning. It has to remove the file from the synced folder.": "Ein externer Programmaufruf handhabt die Versionierung. Es muss die Datei aus dem zu synchronisierendem Verzeichnis entfernen.",
"Anonymous Usage Reporting": "Anonymer Nutzungsbericht", "Anonymous Usage Reporting": "Anonymer Nutzungsbericht",
"Any devices configured on an introducer device will be added to this device as well.": "Alle Geräte, die beim Verteiler eingetragen sind, werden auch bei diesem Gerät eingetragen", "Any devices configured on an introducer device will be added to this device as well.": "Alle Geräte, die beim Verteiler eingetragen sind, werden auch bei diesem Gerät eingetragen",
"Automatic upgrades": "Automatische Updates aktivieren", "Automatic upgrades": "automatische Updates",
"Be careful!": "Vorsicht!", "Be careful!": "Vorsicht!",
"Bugs": "Fehler", "Bugs": "Fehler",
"CPU Utilization": "Prozessorauslastung", "CPU Utilization": "Prozessorauslastung",
"Changelog": "Änderungsprotokoll", "Changelog": "Änderungsprotokoll",
"Clean out after": "Löschen nach", "Clean out after": "Löschen nach",
"Close": "Schließen", "Close": "Schließen",
"Command": "Befehl", "Command": "Kommando",
"Comment, when used at the start of a line": "Kommentar, wenn am Anfang der Zeile benutzt.", "Comment, when used at the start of a line": "Kommentar, wenn am Anfang der Zeile benutzt.",
"Compression": "Komprimierung", "Compression": "Komprimierung",
"Connection Error": "Verbindungsfehler", "Connection Error": "Verbindungsfehler",
"Connection Type": "Verbindungstyp",
"Copied from elsewhere": "Von anderer Quelle kopiert", "Copied from elsewhere": "Von anderer Quelle kopiert",
"Copied from original": "Vom Original kopiert", "Copied from original": "Vom Original kopiert",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 der folgenden Unterstützer:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 der folgenden Unterstützer:",
@@ -75,7 +74,6 @@
"Folder Label": "Verzeichnisbezeichnung", "Folder Label": "Verzeichnisbezeichnung",
"Folder Master": "Master Verzeichnis - schreibgeschützt", "Folder Master": "Master Verzeichnis - schreibgeschützt",
"Folder Path": "Verzeichnispfad", "Folder Path": "Verzeichnispfad",
"Folder Type": "Ordnertyp",
"Folders": "Verzeichnisse", "Folders": "Verzeichnisse",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Passwort für Zugang zur Benutzeroberfläche", "GUI Authentication Password": "Passwort für Zugang zur Benutzeroberfläche",
@@ -100,12 +98,10 @@
"Last File Received": "Letzte Änderung", "Last File Received": "Letzte Änderung",
"Last seen": "Zuletzt online", "Last seen": "Zuletzt online",
"Later": "Später", "Later": "Später",
"Listeners": "Lauscher",
"Local Discovery": "Lokale Gerätesuche", "Local Discovery": "Lokale Gerätesuche",
"Local State": "Lokaler Status", "Local State": "Lokaler Status",
"Local State (Total)": "Lokaler Status (Gesamt)", "Local State (Total)": "Lokaler Status (Gesamt)",
"Major Upgrade": "Hauptversionsupgrade", "Major Upgrade": "Hauptversionsupgrade",
"Master": "Master",
"Maximum Age": "Höchstalter", "Maximum Age": "Höchstalter",
"Metadata Only": "Nur Metadaten", "Metadata Only": "Nur Metadaten",
"Minimum Free Disk Space": "Minimal freier Festplattenspeicher", "Minimum Free Disk Space": "Minimal freier Festplattenspeicher",
@@ -117,7 +113,6 @@
"Newest First": "Neueste zuerst", "Newest First": "Neueste zuerst",
"No": "Nein", "No": "Nein",
"No File Versioning": "Keine Dateiversionierung", "No File Versioning": "Keine Dateiversionierung",
"Normal": "Normal",
"Notice": "Hinweis", "Notice": "Hinweis",
"OK": "OK", "OK": "OK",
"Off": "Aus", "Off": "Aus",
@@ -245,5 +240,5 @@
"items": "Objekte", "items": "Objekte",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} möchte das Verzeichnis \"{{folder}}\" teilen.", "{%device%} wants to share folder \"{%folder%}\".": "{{device}} möchte das Verzeichnis \"{{folder}}\" teilen.",
"{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} möchte das Verzeichnis \"{{folderLabel}}\" ({{folder}}) teilen.", "{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} möchte das Verzeichnis \"{{folderLabel}}\" ({{folder}}) teilen.",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} möchte den Ordner \"{{folderLabel}}\" ({{folder}}) teilen." "{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} möchte das Verzeichnis \"{{folderLabel}}\" ({{folder}}) teilen."
} }
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Σχόλιο, όταν χρησιμοποιείται στην αρχή μιας γραμμής", "Comment, when used at the start of a line": "Σχόλιο, όταν χρησιμοποιείται στην αρχή μιας γραμμής",
"Compression": "Συμπίεση", "Compression": "Συμπίεση",
"Connection Error": "Σφάλμα σύνδεσης", "Connection Error": "Σφάλμα σύνδεσης",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Έχει αντιγραφεί από κάπου αλλού", "Copied from elsewhere": "Έχει αντιγραφεί από κάπου αλλού",
"Copied from original": "Έχει αντιγραφεί από το πρωτότυπο", "Copied from original": "Έχει αντιγραφεί από το πρωτότυπο",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Να μην επιτρέπονται αλλαγές", "Folder Master": "Να μην επιτρέπονται αλλαγές",
"Folder Path": "Μονοπάτι φακέλου", "Folder Path": "Μονοπάτι φακέλου",
"Folder Type": "Folder Type",
"Folders": "Φάκελοι", "Folders": "Φάκελοι",
"GUI": "Γραφικό περιβάλλον", "GUI": "Γραφικό περιβάλλον",
"GUI Authentication Password": "Κωδικός για την πρόσβαση στη διεπαφή", "GUI Authentication Password": "Κωδικός για την πρόσβαση στη διεπαφή",
@@ -100,12 +98,10 @@
"Last File Received": "Πιο πρόσφατο αρχείο", "Last File Received": "Πιο πρόσφατο αρχείο",
"Last seen": "Τελευταία φορά συνδεδεμένος", "Last seen": "Τελευταία φορά συνδεδεμένος",
"Later": "Αργότερα", "Later": "Αργότερα",
"Listeners": "Listeners",
"Local Discovery": "Τοπική ανεύρεση", "Local Discovery": "Τοπική ανεύρεση",
"Local State": "Τοπική κατάσταση", "Local State": "Τοπική κατάσταση",
"Local State (Total)": "Τοπική κατάσταση (συνολικά)", "Local State (Total)": "Τοπική κατάσταση (συνολικά)",
"Major Upgrade": "Σημαντική αναβάθμιση", "Major Upgrade": "Σημαντική αναβάθμιση",
"Master": "Master",
"Maximum Age": "Μέγιστη ηλικία", "Maximum Age": "Μέγιστη ηλικία",
"Metadata Only": "Μόνο μεταδεδομένα", "Metadata Only": "Μόνο μεταδεδομένα",
"Minimum Free Disk Space": "Ελάχιστος ελεύθερος αποθηκευτικός χώρος", "Minimum Free Disk Space": "Ελάχιστος ελεύθερος αποθηκευτικός χώρος",
@@ -117,7 +113,6 @@
"Newest First": "Το νεότερο πρώτα", "Newest First": "Το νεότερο πρώτα",
"No": "Όχι", "No": "Όχι",
"No File Versioning": "Να μην τηρούνται εκδόσεις", "No File Versioning": "Να μην τηρούνται εκδόσεις",
"Normal": "Normal",
"Notice": "Σημείωση", "Notice": "Σημείωση",
"OK": "OK", "OK": "OK",
"Off": "Απενεργοποιημένο", "Off": "Απενεργοποιημένο",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Comment, when used at the start of a line", "Comment, when used at the start of a line": "Comment, when used at the start of a line",
"Compression": "Compression", "Compression": "Compression",
"Connection Error": "Connection Error", "Connection Error": "Connection Error",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Copied from elsewhere", "Copied from elsewhere": "Copied from elsewhere",
"Copied from original": "Copied from original", "Copied from original": "Copied from original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Folder Master", "Folder Master": "Folder Master",
"Folder Path": "Folder Path", "Folder Path": "Folder Path",
"Folder Type": "Folder Type",
"Folders": "Folders", "Folders": "Folders",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "GUI Authentication Password", "GUI Authentication Password": "GUI Authentication Password",
@@ -100,12 +98,10 @@
"Last File Received": "Last File Received", "Last File Received": "Last File Received",
"Last seen": "Last seen", "Last seen": "Last seen",
"Later": "Later", "Later": "Later",
"Listeners": "Listeners",
"Local Discovery": "Local Discovery", "Local Discovery": "Local Discovery",
"Local State": "Local State", "Local State": "Local State",
"Local State (Total)": "Local State (Total)", "Local State (Total)": "Local State (Total)",
"Major Upgrade": "Major Upgrade", "Major Upgrade": "Major Upgrade",
"Master": "Master",
"Maximum Age": "Maximum Age", "Maximum Age": "Maximum Age",
"Metadata Only": "Metadata Only", "Metadata Only": "Metadata Only",
"Minimum Free Disk Space": "Minimum Free Disk Space", "Minimum Free Disk Space": "Minimum Free Disk Space",
@@ -117,7 +113,6 @@
"Newest First": "Newest First", "Newest First": "Newest First",
"No": "No", "No": "No",
"No File Versioning": "No File Versioning", "No File Versioning": "No File Versioning",
"Normal": "Normal",
"Notice": "Notice", "Notice": "Notice",
"OK": "OK", "OK": "OK",
"Off": "Off", "Off": "Off",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Comment, when used at the start of a line", "Comment, when used at the start of a line": "Comment, when used at the start of a line",
"Compression": "Compression", "Compression": "Compression",
"Connection Error": "Connection Error", "Connection Error": "Connection Error",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Copied from elsewhere", "Copied from elsewhere": "Copied from elsewhere",
"Copied from original": "Copied from original", "Copied from original": "Copied from original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Folder Master", "Folder Master": "Folder Master",
"Folder Path": "Folder Path", "Folder Path": "Folder Path",
"Folder Type": "Folder Type",
"Folders": "Folders", "Folders": "Folders",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "GUI Authentication Password", "GUI Authentication Password": "GUI Authentication Password",
@@ -100,12 +98,10 @@
"Last File Received": "Last File Received", "Last File Received": "Last File Received",
"Last seen": "Last seen", "Last seen": "Last seen",
"Later": "Later", "Later": "Later",
"Listeners": "Listeners",
"Local Discovery": "Local Discovery", "Local Discovery": "Local Discovery",
"Local State": "Local State", "Local State": "Local State",
"Local State (Total)": "Local State (Total)", "Local State (Total)": "Local State (Total)",
"Major Upgrade": "Major Upgrade", "Major Upgrade": "Major Upgrade",
"Master": "Master",
"Maximum Age": "Maximum Age", "Maximum Age": "Maximum Age",
"Metadata Only": "Metadata Only", "Metadata Only": "Metadata Only",
"Minimum Free Disk Space": "Minimum Free Disk Space", "Minimum Free Disk Space": "Minimum Free Disk Space",
@@ -117,7 +113,6 @@
"Newest First": "Newest First", "Newest First": "Newest First",
"No": "No", "No": "No",
"No File Versioning": "No File Versioning", "No File Versioning": "No File Versioning",
"Normal": "Normal",
"Notice": "Notice", "Notice": "Notice",
"OK": "OK", "OK": "OK",
"Off": "Off", "Off": "Off",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Comentar, cuando se usa al comienzo de una línea", "Comment, when used at the start of a line": "Comentar, cuando se usa al comienzo de una línea",
"Compression": "Compresión", "Compression": "Compresión",
"Connection Error": "Error de conexión", "Connection Error": "Error de conexión",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Copiado de otro sitio", "Copied from elsewhere": "Copiado de otro sitio",
"Copied from original": "Copiado del original", "Copied from original": "Copiado del original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 los siguientes Colaboradores:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 los siguientes Colaboradores:",
@@ -75,7 +74,6 @@
"Folder Label": "Etiqueta de la Carpeta", "Folder Label": "Etiqueta de la Carpeta",
"Folder Master": "Carpeta principal", "Folder Master": "Carpeta principal",
"Folder Path": "Ruta de la carpeta", "Folder Path": "Ruta de la carpeta",
"Folder Type": "Folder Type",
"Folders": "Carpetas", "Folders": "Carpetas",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Password de la Interfaz Gráfica de Usuario (GUI)", "GUI Authentication Password": "Password de la Interfaz Gráfica de Usuario (GUI)",
@@ -100,12 +98,10 @@
"Last File Received": "Último fichero recibido", "Last File Received": "Último fichero recibido",
"Last seen": "Visto por última vez", "Last seen": "Visto por última vez",
"Later": "Más tarde", "Later": "Más tarde",
"Listeners": "Listeners",
"Local Discovery": "Descubrimiento local", "Local Discovery": "Descubrimiento local",
"Local State": "Estado local", "Local State": "Estado local",
"Local State (Total)": "Estado Local (Total)", "Local State (Total)": "Estado Local (Total)",
"Major Upgrade": "Actualización importante", "Major Upgrade": "Actualización importante",
"Master": "Master",
"Maximum Age": "Edad máxima", "Maximum Age": "Edad máxima",
"Metadata Only": "Sólo metadatos", "Metadata Only": "Sólo metadatos",
"Minimum Free Disk Space": "Espacio mínimo libre en disco", "Minimum Free Disk Space": "Espacio mínimo libre en disco",
@@ -117,7 +113,6 @@
"Newest First": "El más nuevo primero", "Newest First": "El más nuevo primero",
"No": "No", "No": "No",
"No File Versioning": "Sin versionado de fichero", "No File Versioning": "Sin versionado de fichero",
"Normal": "Normal",
"Notice": "Aviso", "Notice": "Aviso",
"OK": "OK", "OK": "OK",
"Off": "Desconectar", "Off": "Desconectar",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Comentario, cuando es utilizado al inicio de una línea.", "Comment, when used at the start of a line": "Comentario, cuando es utilizado al inicio de una línea.",
"Compression": "Compresión", "Compression": "Compresión",
"Connection Error": "Error de conexión", "Connection Error": "Error de conexión",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Copiado desde otra parte.", "Copied from elsewhere": "Copiado desde otra parte.",
"Copied from original": "Copiado del original", "Copied from original": "Copiado del original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 los siguientes contribuidores:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 los siguientes contribuidores:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Repositorio maestro", "Folder Master": "Repositorio maestro",
"Folder Path": "Ruta del repositorio", "Folder Path": "Ruta del repositorio",
"Folder Type": "Folder Type",
"Folders": "Repositorios", "Folders": "Repositorios",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Contraseña de autenticación de la GUI", "GUI Authentication Password": "Contraseña de autenticación de la GUI",
@@ -100,12 +98,10 @@
"Last File Received": "Último archivo recibido", "Last File Received": "Último archivo recibido",
"Last seen": "Visto por ultima vez", "Last seen": "Visto por ultima vez",
"Later": "Más tarde", "Later": "Más tarde",
"Listeners": "Listeners",
"Local Discovery": "Búsqueda en red local", "Local Discovery": "Búsqueda en red local",
"Local State": "Estado local", "Local State": "Estado local",
"Local State (Total)": "Estado local (total)", "Local State (Total)": "Estado local (total)",
"Major Upgrade": "Actualización mayor", "Major Upgrade": "Actualización mayor",
"Master": "Master",
"Maximum Age": "Edad máxima", "Maximum Age": "Edad máxima",
"Metadata Only": "Sólo metadatos", "Metadata Only": "Sólo metadatos",
"Minimum Free Disk Space": "Espacio mínimo libre en disco", "Minimum Free Disk Space": "Espacio mínimo libre en disco",
@@ -117,7 +113,6 @@
"Newest First": "Nuevo primero", "Newest First": "Nuevo primero",
"No": "No", "No": "No",
"No File Versioning": "Sin control de versiones de archivos", "No File Versioning": "Sin control de versiones de archivos",
"Normal": "Normal",
"Notice": "Aviso", "Notice": "Aviso",
"OK": "OK", "OK": "OK",
"Off": "Apagado", "Off": "Apagado",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Kommentti, käytettäessä rivin alussa", "Comment, when used at the start of a line": "Kommentti, käytettäessä rivin alussa",
"Compression": "Pakkaus", "Compression": "Pakkaus",
"Connection Error": "Yhteysvirhe", "Connection Error": "Yhteysvirhe",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Kopioitu muualta", "Copied from elsewhere": "Kopioitu muualta",
"Copied from original": "Kopioitu alkuperäisestä lähteestä", "Copied from original": "Kopioitu alkuperäisestä lähteestä",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Hallitsijakansio", "Folder Master": "Hallitsijakansio",
"Folder Path": "Kansion polku", "Folder Path": "Kansion polku",
"Folder Type": "Folder Type",
"Folders": "Kansiot", "Folders": "Kansiot",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "GUI:n salasana", "GUI Authentication Password": "GUI:n salasana",
@@ -100,12 +98,10 @@
"Last File Received": "Viimeksi vastaanotettu tiedosto", "Last File Received": "Viimeksi vastaanotettu tiedosto",
"Last seen": "Nähty viimeksi", "Last seen": "Nähty viimeksi",
"Later": "Myöhemmin", "Later": "Myöhemmin",
"Listeners": "Listeners",
"Local Discovery": "Paikallinen etsintä", "Local Discovery": "Paikallinen etsintä",
"Local State": "Paikallinen tila", "Local State": "Paikallinen tila",
"Local State (Total)": "Paikallinen tila (Yhteensä)", "Local State (Total)": "Paikallinen tila (Yhteensä)",
"Major Upgrade": "Pääversion päivitys.", "Major Upgrade": "Pääversion päivitys.",
"Master": "Master",
"Maximum Age": "Maksimi-ikä", "Maximum Age": "Maksimi-ikä",
"Metadata Only": "Vain metadata", "Metadata Only": "Vain metadata",
"Minimum Free Disk Space": "Vapaan levytilan vähimmäismäärä", "Minimum Free Disk Space": "Vapaan levytilan vähimmäismäärä",
@@ -117,7 +113,6 @@
"Newest First": "Uusin ensin", "Newest First": "Uusin ensin",
"No": "Ei", "No": "Ei",
"No File Versioning": "Ei tiedostoversiointia", "No File Versioning": "Ei tiedostoversiointia",
"Normal": "Normal",
"Notice": "Huomautus", "Notice": "Huomautus",
"OK": "OK", "OK": "OK",
"Off": "Pois", "Off": "Pois",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Commentaire lorsque utilisé en début de ligne", "Comment, when used at the start of a line": "Commentaire lorsque utilisé en début de ligne",
"Compression": "Compression", "Compression": "Compression",
"Connection Error": "Erreur de connexion", "Connection Error": "Erreur de connexion",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Copié d'ailleurs", "Copied from elsewhere": "Copié d'ailleurs",
"Copied from original": "Copié depuis l'original", "Copied from original": "Copié depuis l'original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Répertoire maître", "Folder Master": "Répertoire maître",
"Folder Path": "Chemin du répertoire", "Folder Path": "Chemin du répertoire",
"Folder Type": "Folder Type",
"Folders": "Dossiers", "Folders": "Dossiers",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Mot de passe d'authentification GUI", "GUI Authentication Password": "Mot de passe d'authentification GUI",
@@ -100,12 +98,10 @@
"Last File Received": "Dernier fichier reçu", "Last File Received": "Dernier fichier reçu",
"Last seen": "Dernière apparition", "Last seen": "Dernière apparition",
"Later": "Plus tard", "Later": "Plus tard",
"Listeners": "Listeners",
"Local Discovery": "Recherche locale", "Local Discovery": "Recherche locale",
"Local State": "État local", "Local State": "État local",
"Local State (Total)": "État local (Total)", "Local State (Total)": "État local (Total)",
"Major Upgrade": "Mise à jour majeure", "Major Upgrade": "Mise à jour majeure",
"Master": "Master",
"Maximum Age": "Ancienneté maximum", "Maximum Age": "Ancienneté maximum",
"Metadata Only": "Métadonnées uniquement", "Metadata Only": "Métadonnées uniquement",
"Minimum Free Disk Space": "Espace disque libre minimum", "Minimum Free Disk Space": "Espace disque libre minimum",
@@ -117,7 +113,6 @@
"Newest First": "Les plus récents en premier", "Newest First": "Les plus récents en premier",
"No": "Non", "No": "Non",
"No File Versioning": "Pas de version de fichier", "No File Versioning": "Pas de version de fichier",
"Normal": "Normal",
"Notice": "Notification", "Notice": "Notification",
"OK": "OK", "OK": "OK",
"Off": "Éteint", "Off": "Éteint",
+2 -7
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Commentaire lorsque utilisé en début de ligne", "Comment, when used at the start of a line": "Commentaire lorsque utilisé en début de ligne",
"Compression": "Compression", "Compression": "Compression",
"Connection Error": "Erreur de connexion", "Connection Error": "Erreur de connexion",
"Connection Type": "Type de connexion",
"Copied from elsewhere": "Copié d'ailleurs", "Copied from elsewhere": "Copié d'ailleurs",
"Copied from original": "Copié depuis l'original", "Copied from original": "Copié depuis l'original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016, les contributeurs suivants:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016, les contributeurs suivants:",
@@ -75,7 +74,6 @@
"Folder Label": "Étiquette du dossier", "Folder Label": "Étiquette du dossier",
"Folder Master": "Dossier maître", "Folder Master": "Dossier maître",
"Folder Path": "Chemin du dossier", "Folder Path": "Chemin du dossier",
"Folder Type": "Type de répertoire",
"Folders": "Dossiers", "Folders": "Dossiers",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Mot de passe d'authentification GUI", "GUI Authentication Password": "Mot de passe d'authentification GUI",
@@ -100,12 +98,10 @@
"Last File Received": "Dernier fichier reçu", "Last File Received": "Dernier fichier reçu",
"Last seen": "Dernière apparition", "Last seen": "Dernière apparition",
"Later": "Plus tard", "Later": "Plus tard",
"Listeners": "Systèmes en écoute",
"Local Discovery": "Recherche locale", "Local Discovery": "Recherche locale",
"Local State": "État local", "Local State": "État local",
"Local State (Total)": "État local (Total)", "Local State (Total)": "État local (Total)",
"Major Upgrade": "Mise à jour majeure", "Major Upgrade": "Mise à jour majeure",
"Master": "Maitre",
"Maximum Age": "Ancienneté maximum", "Maximum Age": "Ancienneté maximum",
"Metadata Only": "Métadonnées uniquement", "Metadata Only": "Métadonnées uniquement",
"Minimum Free Disk Space": "Espace disque libre minimum", "Minimum Free Disk Space": "Espace disque libre minimum",
@@ -117,7 +113,6 @@
"Newest First": "Les plus récents en premier", "Newest First": "Les plus récents en premier",
"No": "Non", "No": "Non",
"No File Versioning": "Pas de version de fichier", "No File Versioning": "Pas de version de fichier",
"Normal": "Normal",
"Notice": "Notification", "Notice": "Notification",
"OK": "OK", "OK": "OK",
"Off": "Éteint", "Off": "Éteint",
@@ -157,7 +152,7 @@
"Reused": "Réutilisé", "Reused": "Réutilisé",
"Save": "Sauver", "Save": "Sauver",
"Scan Time Remaining": "Intervalle entre chaque analyse", "Scan Time Remaining": "Intervalle entre chaque analyse",
"Scanning": "Analyse en cours", "Scanning": "En cours d'analyse",
"Select the devices to share this folder with.": "Sélectionner les machines avec qui partager ce dossier.", "Select the devices to share this folder with.": "Sélectionner les machines avec qui partager ce dossier.",
"Select the folders to share with this device.": "Sélectionner les dossiers à partager avec cette machine.", "Select the folders to share with this device.": "Sélectionner les dossiers à partager avec cette machine.",
"Settings": "Configuration", "Settings": "Configuration",
@@ -184,7 +179,7 @@
"Stopped": "Arrêté", "Stopped": "Arrêté",
"Support": "Aide", "Support": "Aide",
"Sync Protocol Listen Addresses": "Adresse d'écoute du protocole de synchronisation", "Sync Protocol Listen Addresses": "Adresse d'écoute du protocole de synchronisation",
"Syncing": "Synchronisation en cours", "Syncing": "En cours de synchronisation",
"Syncthing has been shut down.": "Syncthing a été éteint.", "Syncthing has been shut down.": "Syncthing a été éteint.",
"Syncthing includes the following software or portions thereof:": "Syncthing intègre les logiciels suivants (ou des éléments provenant de ces logiciels) :", "Syncthing includes the following software or portions thereof:": "Syncthing intègre les logiciels suivants (ou des éléments provenant de ces logiciels) :",
"Syncthing is restarting.": "Syncthing est cours de redémarrage.", "Syncthing is restarting.": "Syncthing est cours de redémarrage.",
+1 -6
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Kommentaar, wannear as brûkt by it begjin fan in rige", "Comment, when used at the start of a line": "Kommentaar, wannear as brûkt by it begjin fan in rige",
"Compression": "Kompresje", "Compression": "Kompresje",
"Connection Error": "Ferbiningsflater", "Connection Error": "Ferbiningsflater",
"Connection Type": "Ferbiningstype",
"Copied from elsewhere": "Oernommen fan earne oars", "Copied from elsewhere": "Oernommen fan earne oars",
"Copied from original": "Oernommen fan orizjineel", "Copied from original": "Oernommen fan orizjineel",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 de folgende bydragers:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 de folgende bydragers:",
@@ -56,7 +55,7 @@
"Edit Device": "Apparaat bewurkje", "Edit Device": "Apparaat bewurkje",
"Edit Folder": "Map bewurkje", "Edit Folder": "Map bewurkje",
"Editing": "Bewurkjen", "Editing": "Bewurkjen",
"Enable NAT traversal": "NAT-trochkruse ynskeakelje", "Enable NAT traversal": "Enable NAT traversal",
"Enable Relaying": "Trochjaan tastean", "Enable Relaying": "Trochjaan tastean",
"Enable UPnP": "UPnP oansette", "Enable UPnP": "UPnP oansette",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Fier troch komma's skieden (\"tcp://ip:port\", \"tcp://host:port\") adressen yn of \"dynamic\" om automatyske ûntdekking fan it adres út te fieren.", "Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Fier troch komma's skieden (\"tcp://ip:port\", \"tcp://host:port\") adressen yn of \"dynamic\" om automatyske ûntdekking fan it adres út te fieren.",
@@ -75,7 +74,6 @@
"Folder Label": "Map-opskrift", "Folder Label": "Map-opskrift",
"Folder Master": "Map-master", "Folder Master": "Map-master",
"Folder Path": "Map-paad", "Folder Path": "Map-paad",
"Folder Type": "Maptype",
"Folders": "Mappen", "Folders": "Mappen",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Wachtwurd foar ferifikaasje yn GUI", "GUI Authentication Password": "Wachtwurd foar ferifikaasje yn GUI",
@@ -100,12 +98,10 @@
"Last File Received": "Leste triem ûntfongen", "Last File Received": "Leste triem ûntfongen",
"Last seen": "Lêst sjoen", "Last seen": "Lêst sjoen",
"Later": "Letter", "Later": "Letter",
"Listeners": "Harkers",
"Local Discovery": "Lokale ûntdekking", "Local Discovery": "Lokale ûntdekking",
"Local State": "Lokale tastân", "Local State": "Lokale tastân",
"Local State (Total)": "Lokale tastân (Folledich)", "Local State (Total)": "Lokale tastân (Folledich)",
"Major Upgrade": "Wichtige fernijing", "Major Upgrade": "Wichtige fernijing",
"Master": "Master",
"Maximum Age": "Maksimale âldens", "Maximum Age": "Maksimale âldens",
"Metadata Only": "Allinnich metadata", "Metadata Only": "Allinnich metadata",
"Minimum Free Disk Space": "Minimale frije skiifromte", "Minimum Free Disk Space": "Minimale frije skiifromte",
@@ -117,7 +113,6 @@
"Newest First": "Nijste earst", "Newest First": "Nijste earst",
"No": "Nee", "No": "Nee",
"No File Versioning": "Gjin triemferzjebehear", "No File Versioning": "Gjin triemferzjebehear",
"Normal": "Normaal",
"Notice": "Notysje", "Notice": "Notysje",
"OK": "Okee", "OK": "Okee",
"Off": "Ut", "Off": "Ut",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Megjegyzés, a sor elején használva", "Comment, when used at the start of a line": "Megjegyzés, a sor elején használva",
"Compression": "Tömörítés", "Compression": "Tömörítés",
"Connection Error": "Kapcsolódási hiba", "Connection Error": "Kapcsolódási hiba",
"Connection Type": "Kapcsolat típus",
"Copied from elsewhere": "Másolva máshonnan", "Copied from elsewhere": "Másolva máshonnan",
"Copied from original": "Másolva az eredetiről", "Copied from original": "Másolva az eredetiről",
"Copyright © 2014-2016 the following Contributors:": "Szerzői jog © 2014-2016 az alábbi közreműködők:", "Copyright © 2014-2016 the following Contributors:": "Szerzői jog © 2014-2016 az alábbi közreműködők:",
@@ -75,7 +74,6 @@
"Folder Label": "Mappa címke", "Folder Label": "Mappa címke",
"Folder Master": "Központi mappa", "Folder Master": "Központi mappa",
"Folder Path": "Mappa elérési útja", "Folder Path": "Mappa elérési útja",
"Folder Type": "Mappa típus",
"Folders": "Mappák", "Folders": "Mappák",
"GUI": "Grafikus felület", "GUI": "Grafikus felület",
"GUI Authentication Password": "Grafikus felület jelszava", "GUI Authentication Password": "Grafikus felület jelszava",
@@ -100,12 +98,10 @@
"Last File Received": "Utolsó beérkezett fájl", "Last File Received": "Utolsó beérkezett fájl",
"Last seen": "Utoljára látva", "Last seen": "Utoljára látva",
"Later": "Később", "Later": "Később",
"Listeners": "Kapcsolatok",
"Local Discovery": "Helyi felfedezés", "Local Discovery": "Helyi felfedezés",
"Local State": "Helyi állapot", "Local State": "Helyi állapot",
"Local State (Total)": "Helyi állapot (Teljes)", "Local State (Total)": "Helyi állapot (Teljes)",
"Major Upgrade": "Főverzió frissítés", "Major Upgrade": "Főverzió frissítés",
"Master": "Központi",
"Maximum Age": "Maximális kor", "Maximum Age": "Maximális kor",
"Metadata Only": "Csak metaadatok", "Metadata Only": "Csak metaadatok",
"Minimum Free Disk Space": "Minimális szabad lemezterület", "Minimum Free Disk Space": "Minimális szabad lemezterület",
@@ -117,7 +113,6 @@
"Newest First": "Újabb először", "Newest First": "Újabb először",
"No": "Nem", "No": "Nem",
"No File Versioning": "Nincs fájl verziókövetés", "No File Versioning": "Nincs fájl verziókövetés",
"Normal": "Normál",
"Notice": "Megjegyzés", "Notice": "Megjegyzés",
"OK": "Rendben", "OK": "Rendben",
"Off": "Kikapcsolva", "Off": "Kikapcsolva",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Komentar, digunakan saat awal baris", "Comment, when used at the start of a line": "Komentar, digunakan saat awal baris",
"Compression": "Kompresi", "Compression": "Kompresi",
"Connection Error": "Koneksi Galat", "Connection Error": "Koneksi Galat",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Tersalin dari tempat lain", "Copied from elsewhere": "Tersalin dari tempat lain",
"Copied from original": "Tersalin dari asal", "Copied from original": "Tersalin dari asal",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Master Folder", "Folder Master": "Master Folder",
"Folder Path": "Path Folder", "Folder Path": "Path Folder",
"Folder Type": "Folder Type",
"Folders": "Folder", "Folders": "Folder",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Sandi Otentikasi GUI", "GUI Authentication Password": "Sandi Otentikasi GUI",
@@ -100,12 +98,10 @@
"Last File Received": "Last File Received", "Last File Received": "Last File Received",
"Last seen": "Last seen", "Last seen": "Last seen",
"Later": "Later", "Later": "Later",
"Listeners": "Listeners",
"Local Discovery": "Local Discovery", "Local Discovery": "Local Discovery",
"Local State": "Local State", "Local State": "Local State",
"Local State (Total)": "Local State (Total)", "Local State (Total)": "Local State (Total)",
"Major Upgrade": "Major Upgrade", "Major Upgrade": "Major Upgrade",
"Master": "Master",
"Maximum Age": "Maximum Age", "Maximum Age": "Maximum Age",
"Metadata Only": "Metadata Only", "Metadata Only": "Metadata Only",
"Minimum Free Disk Space": "Minimum Free Disk Space", "Minimum Free Disk Space": "Minimum Free Disk Space",
@@ -117,7 +113,6 @@
"Newest First": "Newest First", "Newest First": "Newest First",
"No": "No", "No": "No",
"No File Versioning": "No File Versioning", "No File Versioning": "No File Versioning",
"Normal": "Normal",
"Notice": "Notice", "Notice": "Notice",
"OK": "OK", "OK": "OK",
"Off": "Off", "Off": "Off",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Per commentare, va inserito all'inizio di una riga", "Comment, when used at the start of a line": "Per commentare, va inserito all'inizio di una riga",
"Compression": "Compressione", "Compression": "Compressione",
"Connection Error": "Errore di Connessione", "Connection Error": "Errore di Connessione",
"Connection Type": "Tipo di Connessione",
"Copied from elsewhere": "Copiato da qualche altra parte", "Copied from elsewhere": "Copiato da qualche altra parte",
"Copied from original": "Copiato dall'originale", "Copied from original": "Copiato dall'originale",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 i seguenti Collaboratori:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 i seguenti Collaboratori:",
@@ -75,7 +74,6 @@
"Folder Label": "Etichetta per la cartella", "Folder Label": "Etichetta per la cartella",
"Folder Master": "Cartella Principale", "Folder Master": "Cartella Principale",
"Folder Path": "Percorso Cartella", "Folder Path": "Percorso Cartella",
"Folder Type": "Tipo di Cartella",
"Folders": "Cartelle", "Folders": "Cartelle",
"GUI": "Interfaccia grafica utente", "GUI": "Interfaccia grafica utente",
"GUI Authentication Password": "Password di Autenticazione dell'Utente", "GUI Authentication Password": "Password di Autenticazione dell'Utente",
@@ -100,12 +98,10 @@
"Last File Received": "Ultimo File Ricevuto", "Last File Received": "Ultimo File Ricevuto",
"Last seen": "Ultima connessione", "Last seen": "Ultima connessione",
"Later": "Più Tardi", "Later": "Più Tardi",
"Listeners": "In ascolto",
"Local Discovery": "Individuazione Locale", "Local Discovery": "Individuazione Locale",
"Local State": "Stato Locale", "Local State": "Stato Locale",
"Local State (Total)": "Stato Locale (Totale)", "Local State (Total)": "Stato Locale (Totale)",
"Major Upgrade": "Aggiornamento principale", "Major Upgrade": "Aggiornamento principale",
"Master": "Principale",
"Maximum Age": "Durata Massima", "Maximum Age": "Durata Massima",
"Metadata Only": "Solo i Metadati", "Metadata Only": "Solo i Metadati",
"Minimum Free Disk Space": "Minimo spazio libero su disco", "Minimum Free Disk Space": "Minimo spazio libero su disco",
@@ -117,7 +113,6 @@
"Newest First": "Prima il più recente", "Newest First": "Prima il più recente",
"No": "No", "No": "No",
"No File Versioning": "Nessun Controllo Versione", "No File Versioning": "Nessun Controllo Versione",
"Normal": "Normale",
"Notice": "Avviso", "Notice": "Avviso",
"OK": "OK", "OK": "OK",
"Off": "Disattiva", "Off": "Disattiva",
+1 -6
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "行頭で使用された場合、コメント行", "Comment, when used at the start of a line": "行頭で使用された場合、コメント行",
"Compression": "圧縮", "Compression": "圧縮",
"Connection Error": "接続エラー", "Connection Error": "接続エラー",
"Connection Type": "接続種別",
"Copied from elsewhere": "別ファイルからコピー済", "Copied from elsewhere": "別ファイルからコピー済",
"Copied from original": "元ファイルからコピー済", "Copied from original": "元ファイルからコピー済",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "フォルダー名", "Folder Label": "フォルダー名",
"Folder Master": "フォルダーのマスター", "Folder Master": "フォルダーのマスター",
"Folder Path": "フォルダーパス", "Folder Path": "フォルダーパス",
"Folder Type": "フォルダーの種類",
"Folders": "フォルダー", "Folders": "フォルダー",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "GUI認証パスワード", "GUI Authentication Password": "GUI認証パスワード",
@@ -100,12 +98,10 @@
"Last File Received": "最後に受信したファイル", "Last File Received": "最後に受信したファイル",
"Last seen": "最終接続日時", "Last seen": "最終接続日時",
"Later": "後で設定", "Later": "後で設定",
"Listeners": "待ち受けポート",
"Local Discovery": "LAN内で探索", "Local Discovery": "LAN内で探索",
"Local State": "ローカル状態", "Local State": "ローカル状態",
"Local State (Total)": "ローカル状態 (合計)", "Local State (Total)": "ローカル状態 (合計)",
"Major Upgrade": "メジャーアップグレード", "Major Upgrade": "メジャーアップグレード",
"Master": "マスター",
"Maximum Age": "最大寿命", "Maximum Age": "最大寿命",
"Metadata Only": "メタデータのみ", "Metadata Only": "メタデータのみ",
"Minimum Free Disk Space": "同期を停止する最小空きディスク容量", "Minimum Free Disk Space": "同期を停止する最小空きディスク容量",
@@ -117,7 +113,6 @@
"Newest First": "新しい順", "Newest First": "新しい順",
"No": "いいえ", "No": "いいえ",
"No File Versioning": "バージョン管理をしない", "No File Versioning": "バージョン管理をしない",
"Normal": "通常",
"Notice": "通知", "Notice": "通知",
"OK": "OK", "OK": "OK",
"Off": "オフ", "Off": "オフ",
@@ -197,7 +192,7 @@
"The device ID cannot be blank.": "デバイスIDは空欄にできません。", "The device ID cannot be blank.": "デバイスIDは空欄にできません。",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ここに入力するデバイスIDは、接続したい相手側デバイスの [メニュー]→[IDを表示] で確認することができます。スペースとハイフンは入力しなくてもかまいません。", "The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ここに入力するデバイスIDは、接続したい相手側デバイスの [メニュー]→[IDを表示] で確認することができます。スペースとハイフンは入力しなくてもかまいません。",
"The device ID to enter here can be found in the \"Edit > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ここに入力するデバイスIDは、接続したい相手側デバイスの [メニュー]→[IDを表示] で確認することができます。スペースとハイフンは入力しなくてもかまいません。", "The device ID to enter here can be found in the \"Edit > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "ここに入力するデバイスIDは、接続したい相手側デバイスの [メニュー]→[IDを表示] で確認することができます。スペースとハイフンは入力しなくてもかまいません。",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "利用状況レポートは暗号化されて毎日送信されます。この情報はプラットフォーム、フォルダの大きさ、アプリのバージョンを調査するために使われます。送信するデータセットが変更された場合、このダイアログで再度確認が求められます。", "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "利用状況レポートは暗号化されて毎日送信されます。この情報はプラットフォーム、フォルダの大きさ、アプリのバージョンを調査するために使われます。レポートのデータが変更された場合、このダイアログがまた表示されます。",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "入力されたデバイスIDが正しくありません。デバイスIDは、52文字または56文字のアルファベットと数字からなる文字列です。スペースとハイフンは入力してもしなくてもかまいません。", "The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "入力されたデバイスIDが正しくありません。デバイスIDは、52文字または56文字のアルファベットと数字からなる文字列です。スペースとハイフンは入力してもしなくてもかまいません。",
"The first command line parameter is the folder path and the second parameter is the relative path in the folder.": "第1コマンドライン引数はフォルダーのパス、第2引数はフォルダー内の相対パスです。", "The first command line parameter is the folder path and the second parameter is the relative path in the folder.": "第1コマンドライン引数はフォルダーのパス、第2引数はフォルダー内の相対パスです。",
"The folder ID cannot be blank.": "フォルダーIDは空欄にできません。", "The folder ID cannot be blank.": "フォルダーIDは空欄にできません。",
+244
View File
@@ -0,0 +1,244 @@
{
"A device with that ID is already added.": "A device with that ID is already added.",
"A negative number of days doesn't make sense.": "A negative number of days doesn't make sense.",
"A new major version may not be compatible with previous versions.": "새로운 메이저 버전은 이전 버전과 호환되지 않을 수 있습니다.",
"API Key": "API 키",
"About": " 정보",
"Actions": "동작",
"Add": "추가",
"Add Device": "기기 추가",
"Add Folder": "폴더 추가",
"Add Remote Device": "Add Remote Device",
"Add new folder?": "새로운 폴더를 추가하시겠습니까?",
"Address": "주소",
"Addresses": "주소",
"Advanced": "Advanced",
"Advanced Configuration": "Advanced Configuration",
"Advanced settings": "Advanced settings",
"All Data": "전체 데이터",
"Allow Anonymous Usage Reporting?": "익명 사용 보고서를 보내시겠습니까?",
"Alphabetic": "알파벳순",
"An external command handles the versioning. It has to remove the file from the synced folder.": "외부 커맨드가 파일 버전을 관리합니다. 동기화된 폴더에서 파일을 삭제해야 합니다.",
"Anonymous Usage Reporting": "익명 사용 보고서",
"Any devices configured on an introducer device will be added to this device as well.": "유도 장치에 추가된 기기들은 이 기기에도 동시에 추가됩니다.",
"Automatic upgrades": "자동 업데이트",
"Be careful!": "Be careful!",
"Bugs": "버그",
"CPU Utilization": "CPU 사용률",
"Changelog": "바뀐 점",
"Clean out after": "Clean out after",
"Close": "닫기",
"Command": "커맨드",
"Comment, when used at the start of a line": "명령행에서 시작을 할수 있어요.",
"Compression": "압축",
"Connection Error": "연결 에러",
"Copied from elsewhere": "다른 곳에서 복사됨",
"Copied from original": "원본에서 복사됨",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
"Copyright © 2015 the following Contributors:": "Copyright © 2015 the following Contributors:",
"Danger!": "Danger!",
"Delete": "삭제",
"Deleted": "Deleted",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Device \"{{name}}\" ({{device}} at {{address}}) wants to connect. Add new device?",
"Device ID": "기기 ID",
"Device Identification": "기기 식별자",
"Device Name": "기기 이름",
"Device {%device%} ({%address%}) wants to connect. Add new device?": "다른 기기 {{device}} ({{address}}) 에서 접속을 요청했습니다. 새 장치를 추가하시겠습니까?",
"Devices": "기기",
"Disconnected": "연결 끊김",
"Discovery": "Discovery",
"Documentation": "문서",
"Download Rate": "다운로드 속도",
"Downloaded": "다운로드됨",
"Downloading": "다운로드 중",
"Edit": "편집",
"Edit Device": "기기 편집",
"Edit Folder": "폴더 편집",
"Editing": "편집",
"Enable NAT traversal": "Enable NAT traversal",
"Enable Relaying": "Enable Relaying",
"Enable UPnP": "UPnP 활성화",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.",
"Enter ignore patterns, one per line.": "무시할 패턴을 한 줄에 하나씩 입력하세요.",
"Error": "오류",
"External File Versioning": "외부 파일 버전 관리",
"Failed Items": "Failed Items",
"File Pull Order": "파일 동기화 순서",
"File Versioning": "파일 버전 관리",
"File permission bits are ignored when looking for changes. Use on FAT file systems.": "파일을 동기화할 때 파일 권한이 무시됩니다. FAT 파일 시스템에서 사용하세요.",
"Files are moved to .stversions folder when replaced or deleted by Syncthing.": "Files are moved to .stversions folder when replaced or deleted by Syncthing.",
"Files are moved to date stamped versions in a .stversions folder when replaced or deleted by Syncthing.": "파일이 Syncthing에 의해서 교체되거나 삭제되면 .stversions 폴더에 있는 날짜가 바뀐 버전으로 이동됩니다.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "다른 장치가 파일을 편집할 수 없으며 반드시 이 장치의 내용을 기준으로 동기화합니다.",
"Folder": "Folder",
"Folder ID": "폴더 ID",
"Folder Label": "Folder Label",
"Folder Master": "폴더 소유자",
"Folder Path": "폴더 경로",
"Folders": "폴더",
"GUI": "GUI",
"GUI Authentication Password": "GUI 인증 비밀번호",
"GUI Authentication User": "GUI 인증 사용자",
"GUI Listen Addresses": "GUI 주소",
"Generate": "생성",
"Global Discovery": "글로벌 탐색",
"Global Discovery Server": "글로벌 탐색 서버",
"Global Discovery Servers": "Global Discovery Servers",
"Global State": "글로벌 서버 상태",
"Help": "도움말",
"Home page": "Home page",
"Ignore": "무시",
"Ignore Patterns": "패턴 무시",
"Ignore Permissions": "권한 무시",
"Incoming Rate Limit (KiB/s)": "다운로드 속도 제한 (KiB/S)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Incorrect configuration may damage your folder contents and render Syncthing inoperable.",
"Introducer": "유도",
"Inversion of the given condition (i.e. do not exclude)": "주어진 조건의 반대(전혀 배제하지 않음)",
"Keep Versions": "버전 보관",
"Largest First": "큰 파일 순",
"Last File Received": "마지막으로 받은 파일",
"Last seen": "마지막 접속",
"Later": "나중에",
"Local Discovery": "로컬 노드 검색",
"Local State": "로컬 상태",
"Local State (Total)": "Local State (Total)",
"Major Upgrade": "메이저 업데이트",
"Maximum Age": "최대 보존 기간",
"Metadata Only": "메타데이터만",
"Minimum Free Disk Space": "Minimum Free Disk Space",
"Move to top of queue": "대기열 상단으로 이동",
"Multi level wildcard (matches multiple directory levels)": "다중 레벨 와일드 카드 (여러 단계의 디렉토리와 일치하는 경우)",
"Never": "사용 안 함",
"New Device": "새 기기",
"New Folder": "새 폴더",
"Newest First": "새로운 파일순",
"No": "아니오",
"No File Versioning": "파일 버전 관리 안 함",
"Notice": "공지",
"OK": "확인",
"Off": "꺼짐",
"Oldest First": "오래된 파일순",
"Optional descriptive label for the folder. Can be different on each device.": "Optional descriptive label for the folder. Can be different on each device.",
"Options": "Options",
"Out of Sync": "Out of Sync",
"Out of Sync Items": "동기화되지 않은 항목",
"Outgoing Rate Limit (KiB/s)": "업로드 속도 제한 (KiB/s)",
"Override Changes": "덮어쓰기",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "로컬 컴퓨터에 있는 폴더의 경로를 지정합니다. 존재하지 않는 폴더일 경우 자동으로 생성됩니다. 물결 기호 (~)는 아래와 같은 폴더를 나타냅니다.",
"Path where versions should be stored (leave empty for the default .stversions folder in the folder).": "버전을 보관할 경로 (비워둘 시 기본값 .stversions 폴더로 지정됨)",
"Pause": "Pause",
"Paused": "Paused",
"Please consult the release notes before performing a major upgrade.": "메이저 업데이트를 하기 전에 먼저 릴리즈 노트를 살펴보세요.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Please set a GUI Authentication User and Password in the Settings dialog.",
"Please wait": "기다려 주십시오",
"Preview": "미리보기",
"Preview Usage Report": "사용 보고서 미리보기",
"Quick guide to supported patterns": "지원하는 패턴에 대한 빠른 도움말",
"RAM Utilization": "RAM 사용량",
"Random": "무작위",
"Relay Servers": "Relay Servers",
"Relayed via": "Relayed via",
"Relays": "Relays",
"Release Notes": "릴리즈 노트",
"Remote Devices": "Remote Devices",
"Remove": "Remove",
"Required identifier for the folder. Must be the same on all cluster devices.": "Required identifier for the folder. Must be the same on all cluster devices.",
"Rescan": "재탐색",
"Rescan All": "전체 재탐색",
"Rescan Interval": "재탐색 간격",
"Restart": "재시작",
"Restart Needed": "재시작 필요함",
"Restarting": "재시작 중",
"Resume": "Resume",
"Reused": "재개",
"Save": "저장",
"Scan Time Remaining": "Scan Time Remaining",
"Scanning": "탐색중",
"Select the devices to share this folder with.": "이 폴더를 공유할 장치를 선택합니다.",
"Select the folders to share with this device.": "이 장치와 공유할 폴더를 선택합니다.",
"Settings": "설정",
"Share": "공유",
"Share Folder": "폴더 공유",
"Share Folders With Device": "폴더를 공유할 기기",
"Share With Devices": "공유할 기기",
"Share this folder?": "이 폴더를 공유하시겠습니까?",
"Shared With": "~와 공유",
"Short identifier for the folder. Must be the same on all cluster devices.": "간단한 폴더 식별자입니다. 모든 장치에서 동일해야 합니다.",
"Show ID": "내 기기 ID",
"Show QR": "Show QR",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "장치에 대한 아이디로 표시됩니다. 옵션에 얻은 기본이름으로 다른장치에 통보합니다.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "아이디가 비어있는 경우 기본 값으로 다른 장치에 업데이트 됩니다.",
"Shutdown": "종료",
"Shutdown Complete": "종료 완료",
"Simple File Versioning": "간단한 파일 버전 관리",
"Single level wildcard (matches within a directory only)": "단일 레벨 와일드카드 (하나의 디렉토리만 일치하는 경우)",
"Smallest First": "작은 파일순",
"Source Code": "소스 코드",
"Staggered File Versioning": "타임스탬프 기준 파일 버전 관리",
"Start Browser": "브라우저 열기",
"Statistics": "Statistics",
"Stopped": "중지됨",
"Support": "지원",
"Sync Protocol Listen Addresses": "동기화 프로토콜 수신 주소",
"Syncing": "동기화 중",
"Syncthing has been shut down.": "Syncthing이 종료되었습니다.",
"Syncthing includes the following software or portions thereof:": "Syncthing은 다음과 같은 소프트웨어나 그 일부를 포함합니다:",
"Syncthing is restarting.": "Syncthing이 재시작 중입니다.",
"Syncthing is upgrading.": "Syncthing이 업데이트 중입니다.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing이 중지되었거나 인터넷 연결에 문제가 있는 것 같습니다. 재시도 중입니다...",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing에서 요청을 처리하는 중에 문제가 발생했습니다. 계속 문제가 발생하면 페이지를 다시 불러오거나 Syncthing을 재시작해 보세요.",
"The Syncthing admin interface is configured to allow remote access without a password.": "The Syncthing admin interface is configured to allow remote access without a password.",
"The aggregated statistics are publicly available at {%url%}.": "수집된 통계는 {{URL}} 에서 공개적으로 볼 수 있습니다.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "설정이 저장되었지만 활성화되지 않았습니다. 설정을 활성화 하려면 Syncthing을 다시 시작하세요.",
"The device ID cannot be blank.": "기기 ID는 비워 둘 수 없습니다.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).",
"The device ID to enter here can be found in the \"Edit > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "여기에 입력한 기기 ID가 다른 장치의 \"편집 - ID 보기\"에 표시됩니다. 공백과 하이픈은 세지 않습니다. 즉 무시됩니다.",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "암호화된 사용 보고서는 매일 전송됩니다 사용 중인 플랫폼과 폴더 크기, 앱 버전이 포함되어 있습니다. 전송되는 데이터가 변경되면 다시 이 대화 상자가 나타납니다.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "입력한 기기 ID가 올바르지 않습니다. 52/56자의 알파벳과 숫자로 구성되어 있으며, 공백과 하이픈은 포함되지 않습니다.",
"The first command line parameter is the folder path and the second parameter is the relative path in the folder.": "첫 명령행 옵션은 폴더 경로이고 두 번째 명령행 옵션은 폴더의 상대 경로입니다.",
"The folder ID cannot be blank.": "폴더 ID는 비워 둘 수 없습니다.",
"The folder ID must be a short identifier (64 characters or less) consisting of letters, numbers and the dot (.), dash (-) and underscode (_) characters only.": "폴더 ID는 문자, 숫자, 마침표(.), 붙임표(-), 밑줄 문자(_)로만 구성되어 있는 짧은 식별자(64자 이하)여야 합니다.",
"The folder ID must be unique.": "폴더 ID는 중복될 수 없습니다.",
"The folder path cannot be blank.": "폴더 경로는 비워 둘 수 없습니다.",
"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.": "다음과 같은 간격이 사용됩니다: 첫 한 시간 동안은 버전이 매 30초마다 유지되며, 첫 하루 동안은 매 시간, 첫 한 달 동안은 매 일마다 유지됩니다. 그리고 최대 날짜까지는 버전이 매 주마다 유지됩니다.",
"The following items could not be synchronized.": "The following items could not be synchronized.",
"The maximum age must be a number and cannot be blank.": "최대 보존 기간은 숫자여야 하며 비워 둘 수 없습니다.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "버전을 유지할 최대 시간을 지정합니다. 일단위이며 버전을 계속 유지하려면 0을 입력하세요,",
"The minimum free disk space percentage must be a non-negative number between 0 and 100 (inclusive).": "The minimum free disk space percentage must be a non-negative number between 0 and 100 (inclusive).",
"The number of days must be a number and cannot be blank.": "The number of days must be a number and cannot be blank.",
"The number of days to keep files in the trash can. Zero means forever.": "The number of days to keep files in the trash can. Zero means forever.",
"The number of old versions to keep, per file.": "각 파일별로 유지할 이전 버전의 개수를 지정합니다.",
"The number of versions must be a number and cannot be blank.": "버전 개수는 숫자여야 하며 비워 둘 수 없습니다.",
"The path cannot be blank.": "경로는 비워 둘 수 없습니다.",
"The rate limit must be a non-negative number (0: no limit)": "The rate limit must be a non-negative number (0: no limit)",
"The rescan interval must be a non-negative number of seconds.": "재검색 간격은 초단위이며 양수로 입력해야 합니다.",
"They are retried automatically and will be synced when the error is resolved.": "They are retried automatically and will be synced when the error is resolved.",
"This Device": "This Device",
"This can easily give hackers access to read and change any files on your computer.": "This can easily give hackers access to read and change any files on your computer.",
"This is a major version upgrade.": "이 업데이트는 메이저 버전입니다.",
"Trash Can File Versioning": "Trash Can File Versioning",
"Unknown": "알 수 없음",
"Unshared": "공유되지 않음",
"Unused": "사용되지 않음",
"Up to Date": "최신 데이터",
"Updated": "Updated",
"Upgrade": "업데이트",
"Upgrade To {%version%}": "{{version}} 으로 업데이트",
"Upgrading": "업데이트 중",
"Upload Rate": "업로드 속도",
"Uptime": "가동 시간",
"Use HTTPS for GUI": "GUI에서 HTTPS 프로토콜 사용",
"Version": "버전",
"Versions Path": "버전 저장 경로",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "최대 보존 기간보다 오래되었거나 지정한 개수를 넘긴 버전은 자동으로 삭제됩니다.",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Warning, this path is a subdirectory of an existing folder \"{{otherFolder}}\".",
"When adding a new device, keep in mind that this device must be added on the other side too.": "새 장치를 추가할 시 추가한 기기 쪽에서도 이 장치를 추가해야 합니다.",
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "새 폴더를 추가할 시 폴더 ID는 장치간에 폴더를 묶을 때 사용됩니다. 대소문자를 구분하며 모든 장치에서 같은 ID를 사용해야 합니다.",
"Yes": "예",
"You must keep at least one version.": "최소 한 개의 버전은 유지해야 합니다.",
"days": "days",
"full documentation": "전체 문서",
"items": "항목",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} 에서 폴더 \\\"{{folder}}\\\" 를 공유하길 원합니다.",
"{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} wants to share folder \"{{folderLabel}}\" ({{folder}}).",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} wants to share folder \"{{folderlabel}}\" ({{folder}})."
}
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Komentaras naudojamas naujoje eilutėje", "Comment, when used at the start of a line": "Komentaras naudojamas naujoje eilutėje",
"Compression": "Kompresija", "Compression": "Kompresija",
"Connection Error": "Susijungimo klaida", "Connection Error": "Susijungimo klaida",
"Connection Type": "Ryšio tipas",
"Copied from elsewhere": "Nukopijuota iš kitur", "Copied from elsewhere": "Nukopijuota iš kitur",
"Copied from original": "Nukopijuota iš originalo", "Copied from original": "Nukopijuota iš originalo",
"Copyright © 2014-2016 the following Contributors:": "Autorių teisės © 2014-2016 šių bendraautorių:", "Copyright © 2014-2016 the following Contributors:": "Autorių teisės © 2014-2016 šių bendraautorių:",
@@ -75,7 +74,6 @@
"Folder Label": "Aplanko etiketė", "Folder Label": "Aplanko etiketė",
"Folder Master": "Aplanko vadovas", "Folder Master": "Aplanko vadovas",
"Folder Path": "Kelias iki aplanko", "Folder Path": "Kelias iki aplanko",
"Folder Type": "Aplanko tipas",
"Folders": "Aplankai", "Folders": "Aplankai",
"GUI": "Valdymo skydelis", "GUI": "Valdymo skydelis",
"GUI Authentication Password": "Valdymo skydelio slaptažodis", "GUI Authentication Password": "Valdymo skydelio slaptažodis",
@@ -100,12 +98,10 @@
"Last File Received": "Paskutinis priimtas failas", "Last File Received": "Paskutinis priimtas failas",
"Last seen": "Paskutinį kartą matytas", "Last seen": "Paskutinį kartą matytas",
"Later": "Vėliau", "Later": "Vėliau",
"Listeners": "Listeners",
"Local Discovery": "Vietinis matomumas", "Local Discovery": "Vietinis matomumas",
"Local State": "Vietinė būsena", "Local State": "Vietinė būsena",
"Local State (Total)": "Vietinė būsena (Bendrai)", "Local State (Total)": "Vietinė būsena (Bendrai)",
"Major Upgrade": "Stambus atnaujinimas", "Major Upgrade": "Stambus atnaujinimas",
"Master": "Master",
"Maximum Age": "Maksimalus amžius", "Maximum Age": "Maksimalus amžius",
"Metadata Only": "Metaduomenims", "Metadata Only": "Metaduomenims",
"Minimum Free Disk Space": "Minimum laisvos vietos diske", "Minimum Free Disk Space": "Minimum laisvos vietos diske",
@@ -117,7 +113,6 @@
"Newest First": "Naujausi pirmiau", "Newest First": "Naujausi pirmiau",
"No": "Ne", "No": "Ne",
"No File Versioning": "Nėra versijų valdymo", "No File Versioning": "Nėra versijų valdymo",
"Normal": "Normal",
"Notice": "Įspėjimas", "Notice": "Įspėjimas",
"OK": "Gerai", "OK": "Gerai",
"Off": "Netaikoma", "Off": "Netaikoma",
+13 -18
View File
@@ -8,13 +8,13 @@
"Add": "Legg til", "Add": "Legg til",
"Add Device": "Legg til Enhet", "Add Device": "Legg til Enhet",
"Add Folder": "Legg til Mappe", "Add Folder": "Legg til Mappe",
"Add Remote Device": "Legg til ekstern enhet", "Add Remote Device": "Add Remote Device",
"Add new folder?": "Legg til ny mappe?", "Add new folder?": "Legg til ny mappe?",
"Address": "Adresse", "Address": "Adresse",
"Addresses": "Adresser", "Addresses": "Adresser",
"Advanced": "Avansert", "Advanced": "Avansert",
"Advanced Configuration": "Avanserte Innstillinger", "Advanced Configuration": "Avanserte Innstillinger",
"Advanced settings": "Avanserte innstillinger ", "Advanced settings": "Advanced settings",
"All Data": "Alle data", "All Data": "Alle data",
"Allow Anonymous Usage Reporting?": "Tillat Anonym Innsamling Av Brukerdata?", "Allow Anonymous Usage Reporting?": "Tillat Anonym Innsamling Av Brukerdata?",
"Alphabetic": "Alfabetisk", "Alphabetic": "Alfabetisk",
@@ -32,15 +32,14 @@
"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", "Compression": "Komprimering",
"Connection Error": "Tilkoblingsfeil", "Connection Error": "Tilkoblingsfeil",
"Connection Type": "Tilkoblingstype",
"Copied from elsewhere": "Kopiert fra et annet sted", "Copied from elsewhere": "Kopiert fra et annet sted",
"Copied from original": "Kopiert fra original", "Copied from original": "Kopiert fra original",
"Copyright © 2014-2016 the following Contributors:": "Opphavsrett © 2014-2016 for følgende bidragsytere:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
"Copyright © 2015 the following Contributors:": "Opphavsrett © 2015 de følgende bidragsytere:", "Copyright © 2015 the following Contributors:": "Opphavsrett © 2015 de følgende bidragsytere:",
"Danger!": "Fare!", "Danger!": "Fare!",
"Delete": "Slett", "Delete": "Slett",
"Deleted": "Slettet", "Deleted": "Slettet",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Enhet \"{{name}}\" ({{device}} {{address}}) ønsker å koble til. Legge til ny enhet?", "Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Device \"{{name}}\" ({{device}} at {{address}}) wants to connect. Add new device?",
"Device ID": "Enhets ID", "Device ID": "Enhets ID",
"Device Identification": "Enhetskjennemerke", "Device Identification": "Enhetskjennemerke",
"Device Name": "Navn på Enhet", "Device Name": "Navn på Enhet",
@@ -56,7 +55,7 @@
"Edit Device": "Rediger Enhet", "Edit Device": "Rediger Enhet",
"Edit Folder": "Rediger Mappe", "Edit Folder": "Rediger Mappe",
"Editing": "Redigerer", "Editing": "Redigerer",
"Enable NAT traversal": "Slå på NAT traversering", "Enable NAT traversal": "Enable NAT traversal",
"Enable Relaying": "Aktiver relésending", "Enable Relaying": "Aktiver relésending",
"Enable UPnP": "Aktiver UPnP", "Enable UPnP": "Aktiver UPnP",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Skriv inn kommaseparerte (\"tcp://ip:port\", \"tcp://host:port\") adresser, eller ordet \"dynamic\" for å gjøre automatisk oppslag for adressen.", "Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Skriv inn kommaseparerte (\"tcp://ip:port\", \"tcp://host:port\") adresser, eller ordet \"dynamic\" for å gjøre automatisk oppslag for adressen.",
@@ -72,10 +71,9 @@
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Filer er beskyttet mot endringer som er gjort på andre enheter, men endringer som er gjort på denne enheten blir sendt til resten av gruppen.", "Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Filer er beskyttet mot endringer som er gjort på andre enheter, men endringer som er gjort på denne enheten blir sendt til resten av gruppen.",
"Folder": "Katalog", "Folder": "Katalog",
"Folder ID": "Mappe ID", "Folder ID": "Mappe ID",
"Folder Label": "Merkelapp for katalog", "Folder Label": "Folder Label",
"Folder Master": "Styrende Mappe", "Folder Master": "Styrende Mappe",
"Folder Path": "Mappeplassering", "Folder Path": "Mappeplassering",
"Folder Type": "Katalogtype",
"Folders": "Mapper", "Folders": "Mapper",
"GUI": "grafisk brukergrensesnitt", "GUI": "grafisk brukergrensesnitt",
"GUI Authentication Password": "Passord for GUI-autenisering", "GUI Authentication Password": "Passord for GUI-autenisering",
@@ -100,12 +98,10 @@
"Last File Received": "Sist Mottatte Fil", "Last File Received": "Sist Mottatte Fil",
"Last seen": "Sist sett", "Last seen": "Sist sett",
"Later": "Senere", "Later": "Senere",
"Listeners": "Lyttere",
"Local Discovery": "Lokalt oppslag", "Local Discovery": "Lokalt oppslag",
"Local State": "Lokal Tilstand", "Local State": "Lokal Tilstand",
"Local State (Total)": "Lokal Tilstand (Total)", "Local State (Total)": "Lokal Tilstand (Total)",
"Major Upgrade": "Hovedoppgradering", "Major Upgrade": "Hovedoppgradering",
"Master": "Hoved",
"Maximum Age": "Maksimal Levetid", "Maximum Age": "Maksimal Levetid",
"Metadata Only": "Kun metadata", "Metadata Only": "Kun metadata",
"Minimum Free Disk Space": "Nødvendig ledig diskplass", "Minimum Free Disk Space": "Nødvendig ledig diskplass",
@@ -117,12 +113,11 @@
"Newest First": "Den nyeste først", "Newest First": "Den nyeste først",
"No": "Nei", "No": "Nei",
"No File Versioning": "Ingen Versjonskontroll", "No File Versioning": "Ingen Versjonskontroll",
"Normal": "Normal",
"Notice": "Merknader", "Notice": "Merknader",
"OK": "OK", "OK": "OK",
"Off": "Av", "Off": "Av",
"Oldest First": "Den eldste først", "Oldest First": "Den eldste først",
"Optional descriptive label for the folder. Can be different on each device.": "Valgfri merkelapp på katalogen. Denne kan være ulik på forskjellige enheter", "Optional descriptive label for the folder. Can be different on each device.": "Optional descriptive label for the folder. Can be different on each device.",
"Options": "Valg", "Options": "Valg",
"Out of Sync": "Ikke synkronisert", "Out of Sync": "Ikke synkronisert",
"Out of Sync Items": "Ikke Synkroniserte Element", "Out of Sync Items": "Ikke Synkroniserte Element",
@@ -144,9 +139,9 @@
"Relayed via": "Relé via", "Relayed via": "Relé via",
"Relays": "Reléer", "Relays": "Reléer",
"Release Notes": "Utgivelsesnotat", "Release Notes": "Utgivelsesnotat",
"Remote Devices": "Andre enheter", "Remote Devices": "Remote Devices",
"Remove": "Fjern", "Remove": "Fjern",
"Required identifier for the folder. Must be the same on all cluster devices.": "Påkrevd identifikator for katalogen. Denne må være lik på alle enheter i samme klynge.", "Required identifier for the folder. Must be the same on all cluster devices.": "Required identifier for the folder. Must be the same on all cluster devices.",
"Rescan": "Gjennomsøk på nytt", "Rescan": "Gjennomsøk på nytt",
"Rescan All": "Gjennomsøk alt på nytt", "Rescan All": "Gjennomsøk alt på nytt",
"Rescan Interval": "Intervall for gjennomsøking", "Rescan Interval": "Intervall for gjennomsøking",
@@ -217,7 +212,7 @@
"The rate limit must be a non-negative number (0: no limit)": "Hastighetsbegrensningen kan ikke være et negativt tall (0: ingen begrensing)", "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.", "The rescan interval must be a non-negative number of seconds.": "Antall sekund for intervallet kan ikke være negativt.",
"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.", "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 Device": "This Device",
"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 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 hovedoppgradering", "This is a major version upgrade.": "Dette er en hovedoppgradering",
"Trash Can File Versioning": "Papirkurv Versjonskontroll", "Trash Can File Versioning": "Papirkurv Versjonskontroll",
@@ -235,7 +230,7 @@
"Version": "Versjon", "Version": "Versjon",
"Versions Path": "Plassering Av 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.", "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.",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Advarsel, denne stien er en underkatalog i en eksisterende katalog \"{{otherFolder}}\".", "Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Warning, this path is a subdirectory of an existing folder \"{{otherFolder}}\".",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Merk at når en ny enhet blir lagt til må denne også legges til på andre siden.", "When adding a new device, keep in mind that this device must be added on the other side too.": "Merk at når en ny enhet blir lagt til må denne også legges til på andre siden.",
"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.", "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", "Yes": "Ja",
@@ -244,6 +239,6 @@
"full documentation": "all dokumentasjon", "full documentation": "all dokumentasjon",
"items": "elementer", "items": "elementer",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} ønsker å dele mappen \"{{folder}}\".", "{%device%} wants to share folder \"{%folder%}\".": "{{device}} ønsker å dele mappen \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} ønsker å dele katalogen \"{{folderLabel}}\" ({{folder}}).", "{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} wants to share folder \"{{folderLabel}}\" ({{folder}}).",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} ønsker å dele katalogen \"{{folderlabel}}\" ({{folder}})." "{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} wants to share folder \"{{folderlabel}}\" ({{folder}})."
} }
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Reageer indien gebruikt aan het begin van een lijn.", "Comment, when used at the start of a line": "Reageer indien gebruikt aan het begin van een lijn.",
"Compression": "Compressie", "Compression": "Compressie",
"Connection Error": "Verbindingsfout", "Connection Error": "Verbindingsfout",
"Connection Type": "Soort verbinding",
"Copied from elsewhere": "Gekopieerd vanaf elders", "Copied from elsewhere": "Gekopieerd vanaf elders",
"Copied from original": "Gekopieerd van het origineel", "Copied from original": "Gekopieerd van het origineel",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 voor de volgende contributanten:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 voor de volgende contributanten:",
@@ -75,7 +74,6 @@
"Folder Label": "Map label", "Folder Label": "Map label",
"Folder Master": "Hoofdmap", "Folder Master": "Hoofdmap",
"Folder Path": "Maplocatie", "Folder Path": "Maplocatie",
"Folder Type": "Soort map",
"Folders": "Mappen", "Folders": "Mappen",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "GUI-wachtwoord", "GUI Authentication Password": "GUI-wachtwoord",
@@ -100,12 +98,10 @@
"Last File Received": "Laatst ontvangen bestand", "Last File Received": "Laatst ontvangen bestand",
"Last seen": "Laatst gezien op", "Last seen": "Laatst gezien op",
"Later": "Later", "Later": "Later",
"Listeners": "Luisteraars",
"Local Discovery": "Lokaal zoeken", "Local Discovery": "Lokaal zoeken",
"Local State": "Lokale status", "Local State": "Lokale status",
"Local State (Total)": "Lokale status (totaal)", "Local State (Total)": "Lokale status (totaal)",
"Major Upgrade": "Grote update", "Major Upgrade": "Grote update",
"Master": "Master",
"Maximum Age": "Maximum leeftijd", "Maximum Age": "Maximum leeftijd",
"Metadata Only": "Alleen metadata", "Metadata Only": "Alleen metadata",
"Minimum Free Disk Space": "Minimale vrije schijfruimte", "Minimum Free Disk Space": "Minimale vrije schijfruimte",
@@ -117,7 +113,6 @@
"Newest First": "Nieuwste eerst", "Newest First": "Nieuwste eerst",
"No": "Nee", "No": "Nee",
"No File Versioning": "Geen versiebeheer", "No File Versioning": "Geen versiebeheer",
"Normal": "Normaal",
"Notice": "Mededeling", "Notice": "Mededeling",
"OK": "OK", "OK": "OK",
"Off": "Uit", "Off": "Uit",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Kommentar, når brukt i starten av linja", "Comment, when used at the start of a line": "Kommentar, når brukt i starten av linja",
"Compression": "Komprimering", "Compression": "Komprimering",
"Connection Error": "Tilkoplingsfeil", "Connection Error": "Tilkoplingsfeil",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Kopiert frå ein annan stad", "Copied from elsewhere": "Kopiert frå ein annan stad",
"Copied from original": "Kopiert frå originalen", "Copied from original": "Kopiert frå originalen",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Styrande Mappe", "Folder Master": "Styrande Mappe",
"Folder Path": "Mappeplassering", "Folder Path": "Mappeplassering",
"Folder Type": "Folder Type",
"Folders": "Mapper", "Folders": "Mapper",
"GUI": "grafisk brukargrensesnitt", "GUI": "grafisk brukargrensesnitt",
"GUI Authentication Password": "GUI Passord", "GUI Authentication Password": "GUI Passord",
@@ -100,12 +98,10 @@
"Last File Received": "Siste mottatte fila", "Last File Received": "Siste mottatte fila",
"Last seen": "Sist sett", "Last seen": "Sist sett",
"Later": "Seinare", "Later": "Seinare",
"Listeners": "Listeners",
"Local Discovery": "Lokal oppdaging", "Local Discovery": "Lokal oppdaging",
"Local State": "Lokal Tilstand", "Local State": "Lokal Tilstand",
"Local State (Total)": "Lokal tilstand (total)", "Local State (Total)": "Lokal tilstand (total)",
"Major Upgrade": "Hovudoppgradering", "Major Upgrade": "Hovudoppgradering",
"Master": "Master",
"Maximum Age": "Maksimal Levetid", "Maximum Age": "Maksimal Levetid",
"Metadata Only": "Berre metadata", "Metadata Only": "Berre metadata",
"Minimum Free Disk Space": "Naudsynt ledig diskplass", "Minimum Free Disk Space": "Naudsynt ledig diskplass",
@@ -117,7 +113,6 @@
"Newest First": "Nyaste fyrst", "Newest First": "Nyaste fyrst",
"No": "Nei", "No": "Nei",
"No File Versioning": "Ingen filutgåvehandtering", "No File Versioning": "Ingen filutgåvehandtering",
"Normal": "Normal",
"Notice": "Merknad", "Notice": "Merknad",
"OK": "OK", "OK": "OK",
"Off": "Av", "Off": "Av",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Komentarz, jeżeli użyty na początku linii", "Comment, when used at the start of a line": "Komentarz, jeżeli użyty na początku linii",
"Compression": "Kompresja", "Compression": "Kompresja",
"Connection Error": "Błąd połączenia", "Connection Error": "Błąd połączenia",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Skopiowane z innego miejsca ", "Copied from elsewhere": "Skopiowane z innego miejsca ",
"Copied from original": "Skopiowane z oryginału", "Copied from original": "Skopiowane z oryginału",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016: ", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016: ",
@@ -75,7 +74,6 @@
"Folder Label": "Etykieta folderu", "Folder Label": "Etykieta folderu",
"Folder Master": "Główny folder", "Folder Master": "Główny folder",
"Folder Path": "Ścieżka folderu", "Folder Path": "Ścieżka folderu",
"Folder Type": "Folder Type",
"Folders": "Foldery", "Folders": "Foldery",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Hasło", "GUI Authentication Password": "Hasło",
@@ -100,12 +98,10 @@
"Last File Received": "Ostatni otrzymany plik", "Last File Received": "Ostatni otrzymany plik",
"Last seen": "Ostatnio widziany", "Last seen": "Ostatnio widziany",
"Later": "Później", "Later": "Później",
"Listeners": "Listeners",
"Local Discovery": "Lokalne odnajdywanie", "Local Discovery": "Lokalne odnajdywanie",
"Local State": "Status lokalny", "Local State": "Status lokalny",
"Local State (Total)": "Status lokalny (suma)", "Local State (Total)": "Status lokalny (suma)",
"Major Upgrade": "Ważna aktualizacja", "Major Upgrade": "Ważna aktualizacja",
"Master": "Master",
"Maximum Age": "Maksymalny wiek", "Maximum Age": "Maksymalny wiek",
"Metadata Only": "Tylko metadane", "Metadata Only": "Tylko metadane",
"Minimum Free Disk Space": "Minimum wolnego miejsca na dysku", "Minimum Free Disk Space": "Minimum wolnego miejsca na dysku",
@@ -117,7 +113,6 @@
"Newest First": "Najnowsze na początku", "Newest First": "Najnowsze na początku",
"No": "Nie", "No": "Nie",
"No File Versioning": "Bez wersjonowania pliku", "No File Versioning": "Bez wersjonowania pliku",
"Normal": "Normal",
"Notice": "Wskazówka", "Notice": "Wskazówka",
"OK": "OK", "OK": "OK",
"Off": "Wyłącz", "Off": "Wyłącz",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Comentário, se usado no início de uma linha", "Comment, when used at the start of a line": "Comentário, se usado no início de uma linha",
"Compression": "Compressão", "Compression": "Compressão",
"Connection Error": "Erro de conexão", "Connection Error": "Erro de conexão",
"Connection Type": "Tipo da conexão",
"Copied from elsewhere": "Copiado de outro lugar", "Copied from elsewhere": "Copiado de outro lugar",
"Copied from original": "Copiado do original", "Copied from original": "Copiado do original",
"Copyright © 2014-2016 the following Contributors:": "Direitos reservados © 2014-2016 aos seguintes colaboradores:", "Copyright © 2014-2016 the following Contributors:": "Direitos reservados © 2014-2016 aos seguintes colaboradores:",
@@ -75,7 +74,6 @@
"Folder Label": "Rótulo da pasta", "Folder Label": "Rótulo da pasta",
"Folder Master": "Pasta mestre", "Folder Master": "Pasta mestre",
"Folder Path": "Caminho da pasta", "Folder Path": "Caminho da pasta",
"Folder Type": "Tipo da pasta",
"Folders": "Pastas", "Folders": "Pastas",
"GUI": "Interface gráfica", "GUI": "Interface gráfica",
"GUI Authentication Password": "Senha para acesso à interface", "GUI Authentication Password": "Senha para acesso à interface",
@@ -100,12 +98,10 @@
"Last File Received": "Último arquivo recebido", "Last File Received": "Último arquivo recebido",
"Last seen": "Visto por último em", "Last seen": "Visto por último em",
"Later": "Depois", "Later": "Depois",
"Listeners": "Escutadores",
"Local Discovery": "Descoberta local", "Local Discovery": "Descoberta local",
"Local State": "Estado local", "Local State": "Estado local",
"Local State (Total)": "Estado local (total)", "Local State (Total)": "Estado local (total)",
"Major Upgrade": "Atualização \"major\"", "Major Upgrade": "Atualização \"major\"",
"Master": "Mestre",
"Maximum Age": "Idade máxima", "Maximum Age": "Idade máxima",
"Metadata Only": "Somente metadados", "Metadata Only": "Somente metadados",
"Minimum Free Disk Space": "Espaço livre mínimo no disco", "Minimum Free Disk Space": "Espaço livre mínimo no disco",
@@ -117,7 +113,6 @@
"Newest First": "Mais novo primeiro", "Newest First": "Mais novo primeiro",
"No": "Não", "No": "Não",
"No File Versioning": "Sem versionamento de arquivos", "No File Versioning": "Sem versionamento de arquivos",
"Normal": "Normal",
"Notice": "Aviso", "Notice": "Aviso",
"OK": "OK", "OK": "OK",
"Off": "Desligada", "Off": "Desligada",
+5 -10
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Comentário, quando usado no início de uma linha", "Comment, when used at the start of a line": "Comentário, quando usado no início de uma linha",
"Compression": "Compressão", "Compression": "Compressão",
"Connection Error": "Erro de ligação", "Connection Error": "Erro de ligação",
"Connection Type": "Tipo de ligação",
"Copied from elsewhere": "Copiado doutro sítio", "Copied from elsewhere": "Copiado doutro sítio",
"Copied from original": "Copiado do original", "Copied from original": "Copiado do original",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 os seguintes contribuidores:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 os seguintes contribuidores:",
@@ -47,7 +46,7 @@
"Device {%device%} ({%address%}) wants to connect. Add new device?": "O dispositivo {{device}} ({{address}}) quer conectar-se. Adiciono este novo dispositivo?", "Device {%device%} ({%address%}) wants to connect. Add new device?": "O dispositivo {{device}} ({{address}}) quer conectar-se. Adiciono este novo dispositivo?",
"Devices": "Dispositivos", "Devices": "Dispositivos",
"Disconnected": "Desconectado", "Disconnected": "Desconectado",
"Discovery": "Pesquisa", "Discovery": "Detecção",
"Documentation": "Documentação", "Documentation": "Documentação",
"Download Rate": "Velocidade de recepção", "Download Rate": "Velocidade de recepção",
"Downloaded": "Recebido", "Downloaded": "Recebido",
@@ -75,16 +74,15 @@
"Folder Label": "Etiqueta da pasta", "Folder Label": "Etiqueta da pasta",
"Folder Master": "Pasta mestre", "Folder Master": "Pasta mestre",
"Folder Path": "Caminho da pasta", "Folder Path": "Caminho da pasta",
"Folder Type": "Tipo de pasta",
"Folders": "Pastas", "Folders": "Pastas",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Senha da autenticação na interface gráfica", "GUI Authentication Password": "Senha da autenticação na interface gráfica",
"GUI Authentication User": "Utilizador da autenticação na interface gráfica", "GUI Authentication User": "Utilizador da autenticação na interface gráfica",
"GUI Listen Addresses": "Endereço de escuta da interface gráfica", "GUI Listen Addresses": "Endereço de escuta da interface gráfica",
"Generate": "Gerar", "Generate": "Gerar",
"Global Discovery": "Pesquisa global", "Global Discovery": "Detecção global",
"Global Discovery Server": "Servidor de pesquisa global", "Global Discovery Server": "Servidor de detecção global",
"Global Discovery Servers": "Servidores de pesquisa global", "Global Discovery Servers": "Servidores de detecção global",
"Global State": "Estado global", "Global State": "Estado global",
"Help": "Ajuda", "Help": "Ajuda",
"Home page": "Página do projecto", "Home page": "Página do projecto",
@@ -100,12 +98,10 @@
"Last File Received": "Último ficheiro recebido", "Last File Received": "Último ficheiro recebido",
"Last seen": "Última vez que foi verificado", "Last seen": "Última vez que foi verificado",
"Later": "Mais tarde", "Later": "Mais tarde",
"Listeners": "Auscultadores", "Local Discovery": "Detecção local",
"Local Discovery": "Pesquisa local",
"Local State": "Estado local", "Local State": "Estado local",
"Local State (Total)": "Estado local (total)", "Local State (Total)": "Estado local (total)",
"Major Upgrade": "Actualização importante", "Major Upgrade": "Actualização importante",
"Master": "Mestre",
"Maximum Age": "Idade máxima", "Maximum Age": "Idade máxima",
"Metadata Only": "Metadados apenas", "Metadata Only": "Metadados apenas",
"Minimum Free Disk Space": "Espaço livre mínimo no disco", "Minimum Free Disk Space": "Espaço livre mínimo no disco",
@@ -117,7 +113,6 @@
"Newest First": "Primeiro os mais recentes", "Newest First": "Primeiro os mais recentes",
"No": "Não", "No": "Não",
"No File Versioning": "Nenhuma", "No File Versioning": "Nenhuma",
"Normal": "Normal",
"Notice": "Avisos", "Notice": "Avisos",
"OK": "OK", "OK": "OK",
"Off": "Desligada", "Off": "Desligada",
+31 -36
View File
@@ -16,15 +16,15 @@
"Advanced Configuration": "Дополнительные настройки", "Advanced Configuration": "Дополнительные настройки",
"Advanced settings": "Дополнительные настройки", "Advanced settings": "Дополнительные настройки",
"All Data": "Все данные", "All Data": "Все данные",
"Allow Anonymous Usage Reporting?": "Разрешить анонимный отчет об использовании?", "Allow Anonymous Usage Reporting?": "Разрешить сбор анонимной статистики использования?",
"Alphabetic": "По алфавиту", "Alphabetic": "По алфавиту",
"An external command handles the versioning. It has to remove the file from the synced folder.": "Внешний процесс управляет версиями файлов. Процесс удалит файл из синхронизируемой папки.", "An external command handles the versioning. It has to remove the file from the synced folder.": "Внешний процесс управляет версиями файлов. Процесс удалит файл из синхронизируемой папки.",
"Anonymous Usage Reporting": "Анонимный отчет об использовании", "Anonymous Usage Reporting": "Анонимная статистика использования",
"Any devices configured on an introducer device will be added to this device as well.": "Все устройства, подключённые к устройству-рекомендателю, будут добавлены к текущему устройству.", "Any devices configured on an introducer device will be added to this device as well.": "Все устройства, подключённые к устройству-рекомендателю, будут добавлены к текущему устройству.",
"Automatic upgrades": "Автообновление", "Automatic upgrades": "Автообновление",
"Be careful!": "Будьте осторожны!", "Be careful!": "Будьте осторожны!",
"Bugs": "Ошибки", "Bugs": "Ошибки",
"CPU Utilization": "Загрузка ЦП", "CPU Utilization": "Загрузка ЦПУ",
"Changelog": "Журнал изменений", "Changelog": "Журнал изменений",
"Clean out after": "Очистить после", "Clean out after": "Очистить после",
"Close": "Закрыть", "Close": "Закрыть",
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Комментарий, если используется в начале строки", "Comment, when used at the start of a line": "Комментарий, если используется в начале строки",
"Compression": "Сжатие", "Compression": "Сжатие",
"Connection Error": "Ошибка подключения", "Connection Error": "Ошибка подключения",
"Connection Type": "Тип соединения",
"Copied from elsewhere": "Скопировано из другого места", "Copied from elsewhere": "Скопировано из другого места",
"Copied from original": "Скопировано с оригинала", "Copied from original": "Скопировано с оригинала",
"Copyright © 2014-2016 the following Contributors:": "Авторские права © 2014–2016 принадлежат:", "Copyright © 2014-2016 the following Contributors:": "Авторские права © 2014–2016 принадлежат:",
@@ -52,14 +51,14 @@
"Download Rate": "Скорость загрузки", "Download Rate": "Скорость загрузки",
"Downloaded": "Загружено", "Downloaded": "Загружено",
"Downloading": "Загрузка", "Downloading": "Загрузка",
"Edit": "Редактировать", "Edit": "Изменить",
"Edit Device": "Редактирование устройства", "Edit Device": "Изменить устройство",
"Edit Folder": "Редактирование папки", "Edit Folder": "Изменить папку",
"Editing": "Редактирование", "Editing": "Редактирование",
"Enable NAT traversal": "Включить NAT traversal", "Enable NAT traversal": "Включить NAT traversal",
"Enable Relaying": "Включить релеи", "Enable Relaying": "Включить релеи",
"Enable UPnP": "Включить UPnP", "Enable UPnP": "Включить UPnP",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Введите через запятую («tcp://ip:port», «tcp://host:port») адреса, либо «dynamic», чтобы выполнить автоматическое обнаружение адреса.", "Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Введите адреса через запятую (\"tcp://ip:port\", \"tcp://host:port\") или \"dynamic\" для автоматического поиска адресов.",
"Enter ignore patterns, one per line.": "Введите шаблоны игнорирования, по одному на строку.", "Enter ignore patterns, one per line.": "Введите шаблоны игнорирования, по одному на строку.",
"Error": "Ошибка", "Error": "Ошибка",
"External File Versioning": "Внешний контроль версий файлов", "External File Versioning": "Внешний контроль версий файлов",
@@ -75,7 +74,6 @@
"Folder Label": "Ярлык папки", "Folder Label": "Ярлык папки",
"Folder Master": "Папка-оригинал", "Folder Master": "Папка-оригинал",
"Folder Path": "Путь к папке", "Folder Path": "Путь к папке",
"Folder Type": "Тип папки",
"Folders": "Папки", "Folders": "Папки",
"GUI": "Интерфейс", "GUI": "Интерфейс",
"GUI Authentication Password": "Пароль для доступа к панели управления", "GUI Authentication Password": "Пароль для доступа к панели управления",
@@ -91,21 +89,19 @@
"Ignore": "Игнорировать", "Ignore": "Игнорировать",
"Ignore Patterns": "Шаблоны игнорирования", "Ignore Patterns": "Шаблоны игнорирования",
"Ignore Permissions": "Игнорировать файловые права доступа", "Ignore Permissions": "Игнорировать файловые права доступа",
"Incoming Rate Limit (KiB/s)": "Ограничение входящей скорости (КиБ/с)", "Incoming Rate Limit (KiB/s)": "Ограничение входящего потока (Кбит/сек)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Неправильные настройки могут повредить содержимое папок и сделать Syncthing неработоспособным.", "Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Неправильные настройки могут повредить содержимое папок и сделать Syncthing нерабочим",
"Introducer": "Рекомендатель", "Introducer": "Рекомендатель",
"Inversion of the given condition (i.e. do not exclude)": "Инвертировать текущее условие (например, исключить)", "Inversion of the given condition (i.e. do not exclude)": "Инвертировать текущее условие (например, исключить)",
"Keep Versions": "Количество хранимых версий", "Keep Versions": "Количество хранимых версий",
"Largest First": "Сначала большие", "Largest First": "Сначала большие",
"Last File Received": "Последний полученный файл", "Last File Received": "Последний полученный файл",
"Last seen": "Был доступен", "Last seen": "Был доступен",
"Later": "Позже", "Later": "Потом",
"Listeners": "Listeners",
"Local Discovery": "Локальное обнаружение", "Local Discovery": "Локальное обнаружение",
"Local State": "Локальное состояние", "Local State": "Локальное состояние",
"Local State (Total)": "Локально (всего)", "Local State (Total)": "Локально (всего)",
"Major Upgrade": "Обновление основной версии", "Major Upgrade": "Обновление основной версии",
"Master": "Master",
"Maximum Age": "Максимальный срок", "Maximum Age": "Максимальный срок",
"Metadata Only": "Только метаданные", "Metadata Only": "Только метаданные",
"Minimum Free Disk Space": "Минимальное свободное место на диске", "Minimum Free Disk Space": "Минимальное свободное место на диске",
@@ -117,7 +113,6 @@
"Newest First": "Сначала новые", "Newest First": "Сначала новые",
"No": "Нет", "No": "Нет",
"No File Versioning": "Без управления версиями файлов", "No File Versioning": "Без управления версиями файлов",
"Normal": "Normal",
"Notice": "Внимание", "Notice": "Внимание",
"OK": "ОК", "OK": "ОК",
"Off": "Отключить", "Off": "Отключить",
@@ -125,32 +120,32 @@
"Optional descriptive label for the folder. Can be different on each device.": "Необязательное описательное название папки. Может различаться на разных устройствах.", "Optional descriptive label for the folder. Can be different on each device.": "Необязательное описательное название папки. Может различаться на разных устройствах.",
"Options": "Настройки", "Options": "Настройки",
"Out of Sync": "Нет синхронизации", "Out of Sync": "Нет синхронизации",
"Out of Sync Items": "Несинхронизированные элементы", "Out of Sync Items": "Не синхронизированные пункты",
"Outgoing Rate Limit (KiB/s)": "Ограничение исходящей скорости (КиБ/с)", "Outgoing Rate Limit (KiB/s)": "Предел скорости отдачи (KiB/s)",
"Override Changes": "Перезаписать изменения", "Override Changes": "Перезаписать изменения",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Путь к папке на локальном компьютере. Если её не существует, то она будет создана. Тильда (~) может использоваться как сокращение для", "Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Путь к папке на локальном компьютере. Если её не существует, то она будет создана. Тильда (~) может использоваться как сокращение для",
"Path where versions should be stored (leave empty for the default .stversions folder in the folder).": "Путь, где должны храниться версии (оставьте пустым, чтобы использовать папку по умолчанию .stversions внутри папки).", "Path where versions should be stored (leave empty for the default .stversions folder in the folder).": "Путь, где должны храниться версии (оставьте пустым, чтобы использовать папку по умолчанию .stversions внутри папки).",
"Pause": "Пауза", "Pause": "Пауза",
"Paused": "Приостановлено", "Paused": "Остановлено",
"Please consult the release notes before performing a major upgrade.": "Перед проведением обновления основной версии ознакомтесь, пожалуйста, с Замечаниями к версии", "Please consult the release notes before performing a major upgrade.": "Перед проведением обновления основной версии ознакомтесь, пожалуйста, с Замечаниями к версии",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Установите имя пользователя и пароль для интерфейса в настройках", "Please set a GUI Authentication User and Password in the Settings dialog.": "Установите имя пользователя и пароль для интерфейса в настройках",
"Please wait": "Пожалуйста, подождите", "Please wait": "Пожалуйста, подождите",
"Preview": "Предварительный просмотр", "Preview": "Предварительный просмотр",
"Preview Usage Report": "Посмотреть отчёт об использовании", "Preview Usage Report": "Посмотреть отчёт об использовании",
"Quick guide to supported patterns": "Краткое руководство по поддерживаемым шаблонам", "Quick guide to supported patterns": "Краткое руководство по поддерживаемым шаблонам",
"RAM Utilization": "Использование памяти", "RAM Utilization": "Использование ОЗУ",
"Random": "Случайно", "Random": "Случайно",
"Relay Servers": "Релеи", "Relay Servers": "Релеи",
"Relayed via": "Релей через", "Relayed via": "Релей через",
"Relays": "Релеи", "Relays": "Релеи",
"Release Notes": "Примечания к выпуску", "Release Notes": "Замечания к версии",
"Remote Devices": "Удалённые устройства", "Remote Devices": "Удалённые устройства",
"Remove": "Удалить", "Remove": "Удалить",
"Required identifier for the folder. Must be the same on all cluster devices.": "Обязательный идентификатор папки. Должен быть одним и тем же на всех устройствах кластера.", "Required identifier for the folder. Must be the same on all cluster devices.": "Обязательный идентификатор папки. Должен быть одним и тем же на всех устройствах кластера.",
"Rescan": "Пересканировать", "Rescan": "Пересканирование",
"Rescan All": "Пересканировать все", "Rescan All": "Пересканировать все",
"Rescan Interval": "Интервал пересканирования", "Rescan Interval": "Интервал пересканирования",
"Restart": "Перезапустить", "Restart": "Перезапуск",
"Restart Needed": "Требуется перезапуск", "Restart Needed": "Требуется перезапуск",
"Restarting": "Перезапуск", "Restarting": "Перезапуск",
"Resume": "Возобновить", "Resume": "Возобновить",
@@ -159,7 +154,7 @@
"Scan Time Remaining": "Оставшееся время сканирования", "Scan Time Remaining": "Оставшееся время сканирования",
"Scanning": "Сканирование", "Scanning": "Сканирование",
"Select the devices to share this folder with.": "Выберите устройства, для которых будет доступна эта папка.", "Select the devices to share this folder with.": "Выберите устройства, для которых будет доступна эта папка.",
"Select the folders to share with this device.": "Выберите папки, которые будут доступны этому устройству.", "Select the folders to share with this device.": "Выберите папку для предоставления доступа данному устройству",
"Settings": "Настройки", "Settings": "Настройки",
"Share": "Предоставить доступ", "Share": "Предоставить доступ",
"Share Folder": "Предоставить доступ к папке", "Share Folder": "Предоставить доступ к папке",
@@ -173,32 +168,32 @@
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Отображается вместо ID устройства в статусе группы. Будет разослан другим устройствам в качестве имени по умолчанию.", "Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Отображается вместо ID устройства в статусе группы. Будет разослан другим устройствам в качестве имени по умолчанию.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Отображается вместо ID устройства в статусе группы. Если поле не заполнено, то будет установлено имя, передаваемое этим устройством.", "Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Отображается вместо ID устройства в статусе группы. Если поле не заполнено, то будет установлено имя, передаваемое этим устройством.",
"Shutdown": "Выключить", "Shutdown": "Выключить",
"Shutdown Complete": "Выключение", "Shutdown Complete": "Выключено",
"Simple File Versioning": "Простое управление версиями файлов", "Simple File Versioning": "Простое управление версиями файлов",
"Single level wildcard (matches within a directory only)": "Одноуровневая маска (поиск совпадений только внутри папки)", "Single level wildcard (matches within a directory only)": "Одноуровневая маска (поиск совпадений только внутри папки)",
"Smallest First": "Сначала маленькие", "Smallest First": "Сначала маленькие",
"Source Code": "Исходный код", "Source Code": "Исходный код",
"Staggered File Versioning": "Ступенчатое управление версиями файлов", "Staggered File Versioning": "Ступенчатое управление версиями файлов",
"Start Browser": "Запускать браузер", "Start Browser": "Открыть браузер",
"Statistics": "Статистика", "Statistics": "Статистика",
"Stopped": "Остановлено", "Stopped": "Остановлено",
"Support": "Поддержка", "Support": "Поддержка",
"Sync Protocol Listen Addresses": "Адрес протокола синхронизации", "Sync Protocol Listen Addresses": "Адрес протокола синхронизации",
"Syncing": "Синхронизация", "Syncing": "Синхронизация",
"Syncthing has been shut down.": "Syncthing был выключен.", "Syncthing has been shut down.": "Syncthing выключен.",
"Syncthing includes the following software or portions thereof:": "Syncthing включает в себя следующее ПО или его части:", "Syncthing includes the following software or portions thereof:": "Syncthing включает в себя следующее ПО или его части:",
"Syncthing is restarting.": "Перезапуск Syncthing.", "Syncthing is restarting.": "Перезапуск Syncthing",
"Syncthing is upgrading.": "Обновление Syncthing.", "Syncthing is upgrading.": "Обновление Syncthing ",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Кажется, Syncthing не запущен или есть проблемы с подключением к Интернету. Переподключаюсь...", "Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Кажется, Syncthing не запущен или есть проблемы с подключением к Интернету. Переподключаюсь...",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing столкнулся с проблемой при обработке Вашего запроса. Пожалуйста, обновите страницу или перезапустите Syncthing если проблема повторится.", "Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing столкнулся с проблемой при обработке Вашего запроса. Пожалуйста, обновите страницу или перезапустите Syncthing если проблема повторится.",
"The Syncthing admin interface is configured to allow remote access without a password.": "Административный интерфейс Syncthing настроен для предоставления удаленного доступа без пароля.", "The Syncthing admin interface is configured to allow remote access without a password.": "Административный интерфейс Syncthing настроен для предоставления удаленного доступа без пароля.",
"The aggregated statistics are publicly available at {%url%}.": "Суммарная статистика общедоступна на {{url}}.", "The aggregated statistics are publicly available at {%url%}.": "Суммарная статистика общедоступна на {{url}}.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Конфигурация была сохранена, но не активирована. Syncthing должен быть перезапущен для применения новой конфигурации.", "The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Конфигурация была сохранена но не активирована. Для активации новой конфигурации необходимо рестартовать Syncthing.",
"The device ID cannot be blank.": "ID устройства не может быть пустым.", "The device ID cannot be blank.": "ID устройства не может быть пустым.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Идентификатор устройства можно найти в диалоге «Действия → Показать ID» на другом устройстве. Пробелы и дефисы вводить не обязательно (игнорируются).", "The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Идентификатор устройства можно найти в диалоге «Действия → Показать ID» на другом устройстве. Пробелы и дефисы вводить не обязательно (они игнорируются).",
"The device ID to enter here can be found in the \"Edit > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Идентификатор устройства можно найти в диалоге «Редактирование Показать ID» на другом устройстве. Пробелы и дефисы вводить не обязательно (игнорируются).", "The device ID to enter here can be found in the \"Edit > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Идентификатор устройства, который следует тут ввести, может быть найден в диалоге \"Редактирование > Показать ID\" на другом устройстве. Пробелы и тире не обязательны (игнорируются).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Зашифрованный отчет об использовании отправляется ежедневно. Это используется для отслеживания общих платформ, размеров папок и версий приложения. Если отчетные данные изменятся, вам будет снова показано это диалоговое окно.", "The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Зашифрованный отчет об использовании отправляется ежедневно. Это используется для отслеживания общих платформ, размеров папок и версий приложения. Если отчетные данные изменятся, вам будет снова показано это диалоговое окно.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Введён недопустимый ID устройства. Он должен состоять из букв и цифр, может включать пробелы и дефисы, длина должна быть 52 или 56 символов.", "The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Введён недопустимый ID устройства. Он должен состоять из букв и цифр, может включать пробелы и дефисы, длина должна быть от 52 до 56 символов, ",
"The first command line parameter is the folder path and the second parameter is the relative path in the folder.": "Первый параметр командной строки - путь к папке, второй параметр - относительный путь в папке.", "The first command line parameter is the folder path and the second parameter is the relative path in the folder.": "Первый параметр командной строки - путь к папке, второй параметр - относительный путь в папке.",
"The folder ID cannot be blank.": "ID папки не может быть пустым.", "The folder ID cannot be blank.": "ID папки не может быть пустым.",
"The folder ID must be a short identifier (64 characters or less) consisting of letters, numbers and the dot (.), dash (-) and underscode (_) characters only.": "ID папки должен быть коротким (не более 64 символов), должен состоять только из букв, цифр, точек (.), дефисов (-) или подчёркиваний (_).", "The folder ID must be a short identifier (64 characters or less) consisting of letters, numbers and the dot (.), dash (-) and underscode (_) characters only.": "ID папки должен быть коротким (не более 64 символов), должен состоять только из букв, цифр, точек (.), дефисов (-) или подчёркиваний (_).",
@@ -224,13 +219,13 @@
"Unknown": "Неизвестно", "Unknown": "Неизвестно",
"Unshared": "Необщедоступно", "Unshared": "Необщедоступно",
"Unused": "Не используется", "Unused": "Не используется",
"Up to Date": "В актуальном состоянии", "Up to Date": "Обновлено",
"Updated": "Обновлено", "Updated": "Обновлено",
"Upgrade": "Обновить", "Upgrade": "Обновить",
"Upgrade To {%version%}": "Обновить до {{version}}", "Upgrade To {%version%}": "Обновить до {{version}}",
"Upgrading": "Обновление", "Upgrading": "Обновление",
"Upload Rate": "Скорость отдачи", "Upload Rate": "Скорость отдачи",
"Uptime": "Время работы", "Uptime": "Аптайм",
"Use HTTPS for GUI": "Использовать HTTPS для панели управления", "Use HTTPS for GUI": "Использовать HTTPS для панели управления",
"Version": "Версия", "Version": "Версия",
"Versions Path": "Путь к версиям", "Versions Path": "Путь к версиям",
@@ -240,10 +235,10 @@
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Когда добавляете новую папку, помните, что ID папок используются для того, чтобы связывать папки между всеми устройствами. Они чувствительны к регистру и должны совпадать на всех используемых устройствах.", "When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Когда добавляете новую папку, помните, что ID папок используются для того, чтобы связывать папки между всеми устройствами. Они чувствительны к регистру и должны совпадать на всех используемых устройствах.",
"Yes": "Да", "Yes": "Да",
"You must keep at least one version.": "Вы должны хранить как минимум одну версию.", "You must keep at least one version.": "Вы должны хранить как минимум одну версию.",
"days": "дней", "days": "Дней",
"full documentation": "полная документация", "full documentation": "полная документация",
"items": "элементы", "items": "элементы",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} хочет поделиться папкой «{{folder}}».", "{%device%} wants to share folder \"{%folder%}\".": "{{device}} хочет поделиться папкой \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} хочет поделиться папкой «{{folderLabel}}» ({{folder}}).", "{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} хочет поделиться папкой «{{folderLabel}}» ({{folder}}).",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} хочет поделиться папкой «{{folderlabel}}» ({{folder}})." "{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} хочет поделиться папкой «{{folderlabel}}» ({{folder}})."
} }
+4 -9
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Kommentar, vid början av en rad.", "Comment, when used at the start of a line": "Kommentar, vid början av en rad.",
"Compression": "Komprimering", "Compression": "Komprimering",
"Connection Error": "Anslutningsproblem", "Connection Error": "Anslutningsproblem",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Kopierat utifrån", "Copied from elsewhere": "Kopierat utifrån",
"Copied from original": "Oförändrat", "Copied from original": "Oförändrat",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 följande bidragande:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 följande bidragande:",
@@ -75,7 +74,6 @@
"Folder Label": "Katalog etikett", "Folder Label": "Katalog etikett",
"Folder Master": "Huvudlagring", "Folder Master": "Huvudlagring",
"Folder Path": "Sökväg", "Folder Path": "Sökväg",
"Folder Type": "Folder Type",
"Folders": "Kataloger", "Folders": "Kataloger",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "GUI-lösenord", "GUI Authentication Password": "GUI-lösenord",
@@ -100,12 +98,10 @@
"Last File Received": "Senast Mottagna Fil", "Last File Received": "Senast Mottagna Fil",
"Last seen": "Senast online", "Last seen": "Senast online",
"Later": "Senare", "Later": "Senare",
"Listeners": "Listeners",
"Local Discovery": "Lokal uppslagning", "Local Discovery": "Lokal uppslagning",
"Local State": "Lokal status", "Local State": "Lokal status",
"Local State (Total)": "Lokal status (Total)", "Local State (Total)": "Lokal status (Total)",
"Major Upgrade": "Stor uppgradering", "Major Upgrade": "Stor uppgradering",
"Master": "Master",
"Maximum Age": "Högsta åldersgräns", "Maximum Age": "Högsta åldersgräns",
"Metadata Only": "Endast metadata", "Metadata Only": "Endast metadata",
"Minimum Free Disk Space": "Minimum ledigt diskutrymme", "Minimum Free Disk Space": "Minimum ledigt diskutrymme",
@@ -117,7 +113,6 @@
"Newest First": "Nyast först", "Newest First": "Nyast först",
"No": "Nej", "No": "Nej",
"No File Versioning": "Ingen versionshantering", "No File Versioning": "Ingen versionshantering",
"Normal": "Normal",
"Notice": "Observera", "Notice": "Observera",
"OK": "OK", "OK": "OK",
"Off": "Av", "Off": "Av",
@@ -146,7 +141,7 @@
"Release Notes": "versionsnyheter", "Release Notes": "versionsnyheter",
"Remote Devices": "Fjärrenheter", "Remote Devices": "Fjärrenheter",
"Remove": "Ta bort", "Remove": "Ta bort",
"Required identifier for the folder. Must be the same on all cluster devices.": "Krävs identifierare för katalogen. Måste vara densamma på alla kluster enheter.", "Required identifier for the folder. Must be the same on all cluster devices.": "Krävs identifierare för mappen. Måste vara densamma på alla kluster enheter.",
"Rescan": "Uppdatera", "Rescan": "Uppdatera",
"Rescan All": "Uppdatera alla", "Rescan All": "Uppdatera alla",
"Rescan Interval": "Uppdateringsintervall", "Rescan Interval": "Uppdateringsintervall",
@@ -156,7 +151,7 @@
"Resume": "Återuppta", "Resume": "Återuppta",
"Reused": "Återanvänt", "Reused": "Återanvänt",
"Save": "Spara", "Save": "Spara",
"Scan Time Remaining": "Granska återstående tid", "Scan Time Remaining": "Skanna Återstående Tid",
"Scanning": "Uppdaterar", "Scanning": "Uppdaterar",
"Select the devices to share this folder with.": "Ange enheterna att dela den här katalogen med.", "Select the devices to share this folder with.": "Ange enheterna att dela den här katalogen med.",
"Select the folders to share with this device.": "Välj kataloger att dela med den här enheten.", "Select the folders to share with this device.": "Välj kataloger att dela med den här enheten.",
@@ -244,6 +239,6 @@
"full documentation": "fullständig dokumentation", "full documentation": "fullständig dokumentation",
"items": "poster", "items": "poster",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} vill dela katalogen \"{{folder}}\".", "{%device%} wants to share folder \"{%folder%}\".": "{{device}} vill dela katalogen \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} vill dela katalogen \"{{folderLabel}}\" ({{folder}}).", "{%device%} wants to share folder \"{%folderLabel%}\" ({%folder%}).": "{{device}} vill dela mappen \"{{folderLabel}}\" ({{folder}}).",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} vill dela katalogen \"{{folderlabel}}\" ({{folder}})." "{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} vill dela mappen \"{{folderlabel}}\" ({{folder}})."
} }
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Satır başında kullanıldığında açıklama özelliği taşır", "Comment, when used at the start of a line": "Satır başında kullanıldığında açıklama özelliği taşır",
"Compression": "Sıkıştırma", "Compression": "Sıkıştırma",
"Connection Error": "Bağlantı hatası", "Connection Error": "Bağlantı hatası",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Başka bir yerden kopyalanmış", "Copied from elsewhere": "Başka bir yerden kopyalanmış",
"Copied from original": "Aslından kopyalanmış", "Copied from original": "Aslından kopyalanmış",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 the following Contributors:",
@@ -75,7 +74,6 @@
"Folder Label": "Folder Label", "Folder Label": "Folder Label",
"Folder Master": "Ana Klasör", "Folder Master": "Ana Klasör",
"Folder Path": "Klasör Yolu", "Folder Path": "Klasör Yolu",
"Folder Type": "Folder Type",
"Folders": "Klasörler", "Folders": "Klasörler",
"GUI": "GUI / Kullanıcı Grafik Arayüzü", "GUI": "GUI / Kullanıcı Grafik Arayüzü",
"GUI Authentication Password": "GUI Kimlik Doğrulaması için Kullanıcı Parolası", "GUI Authentication Password": "GUI Kimlik Doğrulaması için Kullanıcı Parolası",
@@ -100,12 +98,10 @@
"Last File Received": "Alınan Son Dosya", "Last File Received": "Alınan Son Dosya",
"Last seen": "Son Görülen", "Last seen": "Son Görülen",
"Later": "Sonra", "Later": "Sonra",
"Listeners": "Listeners",
"Local Discovery": "Yerel Discovery", "Local Discovery": "Yerel Discovery",
"Local State": "Yerel Durum", "Local State": "Yerel Durum",
"Local State (Total)": "Yerel Durum (Toplamı)", "Local State (Total)": "Yerel Durum (Toplamı)",
"Major Upgrade": "Birincil Yükseltme", "Major Upgrade": "Birincil Yükseltme",
"Master": "Master",
"Maximum Age": "Azami Süre", "Maximum Age": "Azami Süre",
"Metadata Only": "Sadece Üstveri", "Metadata Only": "Sadece Üstveri",
"Minimum Free Disk Space": "En Az Boş Disk Alanı", "Minimum Free Disk Space": "En Az Boş Disk Alanı",
@@ -117,7 +113,6 @@
"Newest First": "En yeni olan önce", "Newest First": "En yeni olan önce",
"No": "Hayır", "No": "Hayır",
"No File Versioning": "Dosya Sürümlendirmesi Yok", "No File Versioning": "Dosya Sürümlendirmesi Yok",
"Normal": "Normal",
"Notice": "Uyarı", "Notice": "Uyarı",
"OK": "Tamam", "OK": "Tamam",
"Off": "Kapalı", "Off": "Kapalı",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Коментар, якщо використовується на початку рядка", "Comment, when used at the start of a line": "Коментар, якщо використовується на початку рядка",
"Compression": "Стиснення", "Compression": "Стиснення",
"Connection Error": "Помилка з’єднання", "Connection Error": "Помилка з’єднання",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Скопійовано з іншого місця", "Copied from elsewhere": "Скопійовано з іншого місця",
"Copied from original": "Скопійовано з оригіналу", "Copied from original": "Скопійовано з оригіналу",
"Copyright © 2014-2016 the following Contributors:": "© 2014-2016 Всі права застережено, вклад внесли:", "Copyright © 2014-2016 the following Contributors:": "© 2014-2016 Всі права застережено, вклад внесли:",
@@ -75,7 +74,6 @@
"Folder Label": "Мітка директорії", "Folder Label": "Мітка директорії",
"Folder Master": "Вважати за оригінал", "Folder Master": "Вважати за оригінал",
"Folder Path": "Шлях до директорії", "Folder Path": "Шлях до директорії",
"Folder Type": "Folder Type",
"Folders": "Директорії", "Folders": "Директорії",
"GUI": "Графічний інтерфейс", "GUI": "Графічний інтерфейс",
"GUI Authentication Password": "Пароль для доступу до панелі управління", "GUI Authentication Password": "Пароль для доступу до панелі управління",
@@ -100,12 +98,10 @@
"Last File Received": "Останній завантажений файл", "Last File Received": "Останній завантажений файл",
"Last seen": "З’являвся останній раз", "Last seen": "З’являвся останній раз",
"Later": "Пізніше", "Later": "Пізніше",
"Listeners": "Listeners",
"Local Discovery": "Локальне виявлення (LAN)", "Local Discovery": "Локальне виявлення (LAN)",
"Local State": "Локальний статус", "Local State": "Локальний статус",
"Local State (Total)": "Локальний статус (загалом)", "Local State (Total)": "Локальний статус (загалом)",
"Major Upgrade": "Мажорне оновлення", "Major Upgrade": "Мажорне оновлення",
"Master": "Master",
"Maximum Age": "Максимальний вік", "Maximum Age": "Максимальний вік",
"Metadata Only": "Тільки метадані", "Metadata Only": "Тільки метадані",
"Minimum Free Disk Space": "Мінімальний вільний простір на диску", "Minimum Free Disk Space": "Мінімальний вільний простір на диску",
@@ -117,7 +113,6 @@
"Newest First": "Спершу новіші", "Newest First": "Спершу новіші",
"No": "Ні", "No": "Ні",
"No File Versioning": "Версіонування вимкнено", "No File Versioning": "Версіонування вимкнено",
"Normal": "Normal",
"Notice": "Повідомлення", "Notice": "Повідомлення",
"OK": "Гаразд", "OK": "Гаразд",
"Off": "Вимкнути", "Off": "Вимкнути",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "Bình luận, khi dùng trước đầu dòng", "Comment, when used at the start of a line": "Bình luận, khi dùng trước đầu dòng",
"Compression": "Nén", "Compression": "Nén",
"Connection Error": "Lỗi kết nối", "Connection Error": "Lỗi kết nối",
"Connection Type": "Connection Type",
"Copied from elsewhere": "Đã sao chép từ nơi khác", "Copied from elsewhere": "Đã sao chép từ nơi khác",
"Copied from original": "Đã sao chép từ nguồn", "Copied from original": "Đã sao chép từ nguồn",
"Copyright © 2014-2016 the following Contributors:": "Bản quyền © 2014-2016 thuộc về các nhà cộng tác sau:", "Copyright © 2014-2016 the following Contributors:": "Bản quyền © 2014-2016 thuộc về các nhà cộng tác sau:",
@@ -75,7 +74,6 @@
"Folder Label": "Nhãn thư mục", "Folder Label": "Nhãn thư mục",
"Folder Master": "Thư mục Chủ", "Folder Master": "Thư mục Chủ",
"Folder Path": "Đ.dẫn đến th.mục", "Folder Path": "Đ.dẫn đến th.mục",
"Folder Type": "Folder Type",
"Folders": "Các th.mục", "Folders": "Các th.mục",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "Mật khẩu xác minh GUI", "GUI Authentication Password": "Mật khẩu xác minh GUI",
@@ -100,12 +98,10 @@
"Last File Received": "T.tin nhận được gần đây", "Last File Received": "T.tin nhận được gần đây",
"Last seen": "Thấy lần cuối", "Last seen": "Thấy lần cuối",
"Later": "Để sau", "Later": "Để sau",
"Listeners": "Listeners",
"Local Discovery": "Dò tìm cục bộ", "Local Discovery": "Dò tìm cục bộ",
"Local State": "Tr.thái cục bộ", "Local State": "Tr.thái cục bộ",
"Local State (Total)": "Tr.thái cục bộ (Tổng)", "Local State (Total)": "Tr.thái cục bộ (Tổng)",
"Major Upgrade": "Bản n.cấp q.trọng", "Major Upgrade": "Bản n.cấp q.trọng",
"Master": "Master",
"Maximum Age": "Thời hạn tối đa", "Maximum Age": "Thời hạn tối đa",
"Metadata Only": "Chỉ siêu dữ liệu", "Metadata Only": "Chỉ siêu dữ liệu",
"Minimum Free Disk Space": "Dung lượng đĩa trống tối thiểu", "Minimum Free Disk Space": "Dung lượng đĩa trống tối thiểu",
@@ -117,7 +113,6 @@
"Newest First": "Mới nhất đầu tiên", "Newest First": "Mới nhất đầu tiên",
"No": "Không", "No": "Không",
"No File Versioning": "Không dùng", "No File Versioning": "Không dùng",
"Normal": "Normal",
"Notice": "Chú ý", "Notice": "Chú ý",
"OK": "OK", "OK": "OK",
"Off": "Tắt", "Off": "Tắt",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "注释,在行首使用", "Comment, when used at the start of a line": "注释,在行首使用",
"Compression": "压缩", "Compression": "压缩",
"Connection Error": "连接出错", "Connection Error": "连接出错",
"Connection Type": "Connection Type",
"Copied from elsewhere": "从其他设备复制", "Copied from elsewhere": "从其他设备复制",
"Copied from original": "从源复制", "Copied from original": "从源复制",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 以下贡献者:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 以下贡献者:",
@@ -75,7 +74,6 @@
"Folder Label": "文件夹标签", "Folder Label": "文件夹标签",
"Folder Master": "主文件夹", "Folder Master": "主文件夹",
"Folder Path": "文件夹路径", "Folder Path": "文件夹路径",
"Folder Type": "Folder Type",
"Folders": "文件夹", "Folders": "文件夹",
"GUI": "图形用户界面", "GUI": "图形用户界面",
"GUI Authentication Password": "图形管理界面密码", "GUI Authentication Password": "图形管理界面密码",
@@ -100,12 +98,10 @@
"Last File Received": "最后接收的文件", "Last File Received": "最后接收的文件",
"Last seen": "最后可见", "Last seen": "最后可见",
"Later": "稍后", "Later": "稍后",
"Listeners": "Listeners",
"Local Discovery": "在局域网上寻找设备", "Local Discovery": "在局域网上寻找设备",
"Local State": "本地状态", "Local State": "本地状态",
"Local State (Total)": "本地状态汇总", "Local State (Total)": "本地状态汇总",
"Major Upgrade": "重大更新", "Major Upgrade": "重大更新",
"Master": "Master",
"Maximum Age": "历史版本最长保留时间", "Maximum Age": "历史版本最长保留时间",
"Metadata Only": "仅元数据", "Metadata Only": "仅元数据",
"Minimum Free Disk Space": "最低可用磁盘空间", "Minimum Free Disk Space": "最低可用磁盘空间",
@@ -117,7 +113,6 @@
"Newest First": "新文件优先", "Newest First": "新文件优先",
"No": "否", "No": "否",
"No File Versioning": "不启用版本控制", "No File Versioning": "不启用版本控制",
"Normal": "Normal",
"Notice": "提示", "Notice": "提示",
"OK": "确定", "OK": "确定",
"Off": "关闭", "Off": "关闭",
-5
View File
@@ -32,7 +32,6 @@
"Comment, when used at the start of a line": "註解,當輸入在一行的開頭時", "Comment, when used at the start of a line": "註解,當輸入在一行的開頭時",
"Compression": "壓縮", "Compression": "壓縮",
"Connection Error": "連線錯誤", "Connection Error": "連線錯誤",
"Connection Type": "Connection Type",
"Copied from elsewhere": "從別處複製", "Copied from elsewhere": "從別處複製",
"Copied from original": "從原處複製", "Copied from original": "從原處複製",
"Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 下列貢獻者:", "Copyright © 2014-2016 the following Contributors:": "Copyright © 2014-2016 下列貢獻者:",
@@ -75,7 +74,6 @@
"Folder Label": "資料夾標籤", "Folder Label": "資料夾標籤",
"Folder Master": "主資料夾", "Folder Master": "主資料夾",
"Folder Path": "資料夾路徑", "Folder Path": "資料夾路徑",
"Folder Type": "Folder Type",
"Folders": "資料夾", "Folders": "資料夾",
"GUI": "GUI", "GUI": "GUI",
"GUI Authentication Password": "GUI 認證密碼", "GUI Authentication Password": "GUI 認證密碼",
@@ -100,12 +98,10 @@
"Last File Received": "最後接收的檔案", "Last File Received": "最後接收的檔案",
"Last seen": "最後發現時間", "Last seen": "最後發現時間",
"Later": "稍後", "Later": "稍後",
"Listeners": "Listeners",
"Local Discovery": "本機探索", "Local Discovery": "本機探索",
"Local State": "本機狀態", "Local State": "本機狀態",
"Local State (Total)": "本機狀態 (總結)", "Local State (Total)": "本機狀態 (總結)",
"Major Upgrade": "重大更新", "Major Upgrade": "重大更新",
"Master": "Master",
"Maximum Age": "最長保留時間", "Maximum Age": "最長保留時間",
"Metadata Only": "僅中繼資料", "Metadata Only": "僅中繼資料",
"Minimum Free Disk Space": "最少閒置磁碟空間", "Minimum Free Disk Space": "最少閒置磁碟空間",
@@ -117,7 +113,6 @@
"Newest First": "最新的優先", "Newest First": "最新的優先",
"No": "否", "No": "否",
"No File Versioning": "無檔案版本控制", "No File Versioning": "無檔案版本控制",
"Normal": "Normal",
"Notice": "注意", "Notice": "注意",
"OK": "確定", "OK": "確定",
"Off": "關閉", "Off": "關閉",
+1 -1
View File
@@ -1 +1 @@
var langPrettyprint = {"bg":"Bulgarian","ca":"Catalan","ca@valencia":"Catalan (Valencian)","cs":"Czech","da":"Danish","de":"German","el":"Greek","en":"English","en-GB":"English (United Kingdom)","es":"Spanish","es-ES":"Spanish (Spain)","fi":"Finnish","fr":"French","fr-CA":"French (Canada)","fy":"Western Frisian","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","lt":"Lithuanian","nb":"Norwegian Bokmål","nl":"Dutch","nn":"Norwegian Nynorsk","pl":"Polish","pt-BR":"Portuguese (Brazil)","pt-PT":"Portuguese (Portugal)","ru":"Russian","sv":"Swedish","tr":"Turkish","uk":"Ukrainian","vi":"Vietnamese","zh-CN":"Chinese (China)","zh-TW":"Chinese (Taiwan)"} var langPrettyprint = {"bg":"Bulgarian","ca":"Catalan","ca@valencia":"Catalan (Valencian)","cs":"Czech","da":"Danish","de":"German","el":"Greek","en":"English","en-GB":"English (United Kingdom)","es":"Spanish","es-ES":"Spanish (Spain)","fi":"Finnish","fr":"French","fr-CA":"French (Canada)","fy":"Western Frisian","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","ko-KR":"Korean (Korea)","lt":"Lithuanian","nb":"Norwegian Bokmål","nl":"Dutch","nn":"Norwegian Nynorsk","pl":"Polish","pt-BR":"Portuguese (Brazil)","pt-PT":"Portuguese (Portugal)","ru":"Russian","sv":"Swedish","tr":"Turkish","uk":"Ukrainian","vi":"Vietnamese","zh-CN":"Chinese (China)","zh-TW":"Chinese (Taiwan)"}
+1 -1
View File
@@ -1 +1 @@
var validLangs = ["bg","ca","ca@valencia","cs","da","de","el","en","en-GB","es","es-ES","fi","fr","fr-CA","fy","hu","id","it","ja","lt","nb","nl","nn","pl","pt-BR","pt-PT","ru","sv","tr","uk","vi","zh-CN","zh-TW"] var validLangs = ["bg","ca","ca@valencia","cs","da","de","el","en","en-GB","es","es-ES","fi","fr","fr-CA","fy","hu","id","it","ja","ko-KR","lt","nb","nl","nn","pl","pt-BR","pt-PT","ru","sv","tr","uk","vi","zh-CN","zh-TW"]
Regular → Executable
+1 -1
View File
@@ -50,7 +50,7 @@
</li> </li>
<li class="dropdown" language-select></li> <li class="dropdown" language-select></li>
<li> <li>
<a class="navbar-link" href="https://docs.syncthing.net/intro/gui.html" target="_blank"> <a href="https://docs.syncthing.net/intro/gui.html" target="_blank">
<span class="fa fa-question-circle"></span>&nbsp;<span class="hidden-xs" translate>Help</span> <span class="fa fa-question-circle"></span>&nbsp;<span class="hidden-xs" translate>Help</span>
</a> </a>
</li> </li>
@@ -11,7 +11,7 @@
<p translate>Copyright &copy; 2014-2016 the following Contributors:</p> <p translate>Copyright &copy; 2014-2016 the following Contributors:</p>
<div class="row"> <div class="row">
<div class="col-md-12" id="contributor-list"> <div class="col-md-12" id="contributor-list">
Jakob Borg, Audrius Butkevicius, Alexander Graf, Anderson Mesquita, Ben Schulz, Caleb Callaway, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Philippe Schommers, Ryan Sullivan, Sergey Mishin, Stefan Tatschner, Aaron Bieber, Adam Piggott, Alessandro G., Alexandre Viau, Andrew Dunham, Antony Male, Arthur Axel fREW Schmidt, Bart De Vries, Ben Curthoys, Ben Sidhom, Benny Ng, Brandon Philips, Brendan Long, Brian R. Becker, Carsten Hagemann, Cathryne Linenweaver, Chris Howie, Chris Joel, Colin Kennedy, Daniel Bergmann, Daniel Harte, Daniel Martí, David Rimmer, Denis A., Dennis Wilson, Dominik Heidler, Elias Jarlebring, Emil Hessman, Erik Meitner, Federico Castagnini, Felix Ableitner, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gilli Sigurdsson, Jaakko Hannikainen, Jacek Szafarkiewicz, Jake Peterson, James Patterson, Jaroslav Malec, Jens Diemer, Jochen Voss, Johan Vromans, Karol Różycki, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Laurent Etiemble, Lord Landon Agahnim, Marc Laporte, Marc Pujol, Marcin Dziadus, Mateusz Naściszewski, Matt Burke, Max Schulze, Michael Jephcote, Michael Tilli, Nate Morrison, Pascal Jungblut, Peter Hoeg, Phill Luby, Piotr Bejda, Scott Klupfel, Stefan Kuntz, Tim Abell, Tobias Nygren, Tomas Cerveny, Tully Robinson, Tyler Brazier, Veeti Paananen, Victor Buinsky, Vil Brekin, William A. Kennington III, Wulf Weich, Yannic A. Jakob Borg, Audrius Butkevicius, Alexander Graf, Anderson Mesquita, Ben Schulz, Caleb Callaway, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Philippe Schommers, Ryan Sullivan, Sergey Mishin, Stefan Tatschner, Aaron Bieber, Adam Piggott, Alessandro G., Andrew Dunham, Antony Male, Arthur Axel fREW Schmidt, Bart De Vries, Ben Curthoys, Ben Sidhom, Benny Ng, Brandon Philips, Brendan Long, Brian R. Becker, Carsten Hagemann, Cathryne Linenweaver, Chris Howie, Chris Joel, Colin Kennedy, Daniel Bergmann, Daniel Harte, Daniel Martí, David Rimmer, Denis A., Dennis Wilson, Dominik Heidler, Elias Jarlebring, Emil Hessman, Erik Meitner, Federico Castagnini, Felix Ableitner, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gilli Sigurdsson, Jaakko Hannikainen, Jacek Szafarkiewicz, Jake Peterson, James Patterson, Jaroslav Malec, Jens Diemer, Jochen Voss, Johan Vromans, Karol Różycki, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Laurent Etiemble, Lord Landon Agahnim, Marc Laporte, Marc Pujol, Marcin Dziadus, Mateusz Naściszewski, Matt Burke, Max Schulze, Michael Jephcote, Michael Tilli, Nate Morrison, Pascal Jungblut, Peter Hoeg, Phill Luby, Piotr Bejda, Scott Klupfel, Stefan Kuntz, Tim Abell, Tobias Nygren, Tomas Cerveny, Tully Robinson, Tyler Brazier, Veeti Paananen, Victor Buinsky, Vil Brekin, William A. Kennington III, Wulf Weich, Yannic A.
</div> </div>
</div> </div>
<hr/> <hr/>
@@ -56,24 +56,11 @@
</div> </div>
</div> </div>
<div class="row"> <div class="form-group">
<div class="col-md-6"> <div class="checkbox">
<div class="form-group"> <label>
<div class="checkbox"> <input id="GlobalAnnEnabled" type="checkbox" ng-model="tmpOptions.globalAnnounceEnabled"> <span translate>Global Discovery</span>
<label> </label>
<input id="GlobalAnnEnabled" type="checkbox" ng-model="tmpOptions.globalAnnounceEnabled"> <span translate>Global Discovery</span>
</label>
</div>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<div class="checkbox">
<label>
<input id="RelaysEnabled" type="checkbox" ng-model="tmpOptions.relaysEnabled"> <span translate>Enable Relaying</span>
</label>
</div>
</div>
</div> </div>
</div> </div>
-19
View File
@@ -12,25 +12,6 @@
* https://github.com/angular-ui/bootstrap/blob/master/src/pagination/pagination.js * https://github.com/angular-ui/bootstrap/blob/master/src/pagination/pagination.js
* *
* Copyright 2014 Michael Bromley <michael@michaelbromley.co.uk> * Copyright 2014 Michael Bromley <michael@michaelbromley.co.uk>
*
* 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.
*
*/ */
(function() { (function() {
@@ -2,25 +2,6 @@
* angular-translate - v2.11.0 - 2016-03-20 * angular-translate - v2.11.0 - 2016-03-20
* *
* Copyright (c) 2016 The angular-translate team, Pascal Precht; Licensed MIT * Copyright (c) 2016 The angular-translate team, Pascal Precht; Licensed MIT
*
* 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.
*
*/ */
(function (root, factory) { (function (root, factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
-19
View File
@@ -2,25 +2,6 @@
* angular-translate - v2.9.0 - 2016-01-24 * angular-translate - v2.9.0 - 2016-01-24
* *
* Copyright (c) 2016 The angular-translate team, Pascal Precht; Licensed MIT * Copyright (c) 2016 The angular-translate team, Pascal Precht; Licensed MIT
*
* 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.
*
*/ */
(function (root, factory) { (function (root, factory) {
if (typeof define === 'function' && define.amd) { if (typeof define === 'function' && define.amd) {
+48 -67
View File
@@ -2,25 +2,6 @@
* @license AngularJS v1.2.9 * @license AngularJS v1.2.9
* (c) 2010-2014 Google, Inc. http://angularjs.org * (c) 2010-2014 Google, Inc. http://angularjs.org
* License: MIT * License: MIT
*
* 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.
*
*/ */
(function(window, document, undefined) {'use strict'; (function(window, document, undefined) {'use strict';
@@ -1766,10 +1747,10 @@ function setupModuleLoader(window) {
/* global /* global
angularModule: true, angularModule: true,
version: true, version: true,
$LocaleProvider, $LocaleProvider,
$CompileProvider, $CompileProvider,
htmlAnchorDirective, htmlAnchorDirective,
inputDirective, inputDirective,
inputDirective, inputDirective,
@@ -3433,11 +3414,11 @@ function annotate(fn) {
* var Ping = function() { * var Ping = function() {
* this.$http = $http; * this.$http = $http;
* }; * };
* *
* Ping.prototype.send = function() { * Ping.prototype.send = function() {
* return this.$http.get('/ping'); * return this.$http.get('/ping');
* }; * };
* *
* return Ping; * return Ping;
* }]); * }]);
* </pre> * </pre>
@@ -3768,7 +3749,7 @@ function createInjector(modulesToLoad) {
* *
* It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor. * It also watches the `$location.hash()` and scrolls whenever it changes to match any anchor.
* This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`. * This can be disabled by calling `$anchorScrollProvider.disableAutoScrolling()`.
* *
* @example * @example
<example> <example>
<file name="index.html"> <file name="index.html">
@@ -3783,7 +3764,7 @@ function createInjector(modulesToLoad) {
// set the location.hash to the id of // set the location.hash to the id of
// the element you wish to scroll to. // the element you wish to scroll to.
$location.hash('bottom'); $location.hash('bottom');
// call $anchorScroll() // call $anchorScroll()
$anchorScroll(); $anchorScroll();
} }
@@ -3871,7 +3852,7 @@ var $animateMinErr = minErr('$animate');
*/ */
var $AnimateProvider = ['$provide', function($provide) { var $AnimateProvider = ['$provide', function($provide) {
this.$$selectors = {}; this.$$selectors = {};
@@ -4012,7 +3993,7 @@ var $AnimateProvider = ['$provide', function($provide) {
* @description Moves the position of the provided element within the DOM to be placed * @description Moves the position of the provided element within the DOM to be placed
* either after the `after` element or inside of the `parent` element. Once complete, the * either after the `after` element or inside of the `parent` element. Once complete, the
* done() callback will be fired (if provided). * done() callback will be fired (if provided).
* *
* @param {jQuery/jqLite element} element the element which will be moved around within the * @param {jQuery/jqLite element} element the element which will be moved around within the
* DOM * DOM
* @param {jQuery/jqLite element} parent the parent element where the element will be * @param {jQuery/jqLite element} parent the parent element where the element will be
@@ -4477,9 +4458,9 @@ function $BrowserProvider(){
* *
* @description * @description
* Factory that constructs cache objects and gives access to them. * Factory that constructs cache objects and gives access to them.
* *
* <pre> * <pre>
* *
* var cache = $cacheFactory('cacheId'); * var cache = $cacheFactory('cacheId');
* expect($cacheFactory.get('cacheId')).toBe(cache); * expect($cacheFactory.get('cacheId')).toBe(cache);
* expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined(); * expect($cacheFactory.get('noSuchCacheId')).not.toBeDefined();
@@ -4488,8 +4469,8 @@ function $BrowserProvider(){
* cache.put("another key", "another value"); * cache.put("another key", "another value");
* *
* // We've specified no options on creation * // We've specified no options on creation
* expect(cache.info()).toEqual({id: 'cacheId', size: 2}); * expect(cache.info()).toEqual({id: 'cacheId', size: 2});
* *
* </pre> * </pre>
* *
* *
@@ -4672,7 +4653,7 @@ function $CacheFactoryProvider() {
* The first time a template is used, it is loaded in the template cache for quick retrieval. You * The first time a template is used, it is loaded in the template cache for quick retrieval. You
* can load templates directly into the cache in a `script` tag, or by consuming the * can load templates directly into the cache in a `script` tag, or by consuming the
* `$templateCache` service directly. * `$templateCache` service directly.
* *
* Adding via the `script` tag: * Adding via the `script` tag:
* <pre> * <pre>
* <html ng-app> * <html ng-app>
@@ -4684,29 +4665,29 @@ function $CacheFactoryProvider() {
* ... * ...
* </html> * </html>
* </pre> * </pre>
* *
* **Note:** the `script` tag containing the template does not need to be included in the `head` of * **Note:** the `script` tag containing the template does not need to be included in the `head` of
* the document, but it must be below the `ng-app` definition. * the document, but it must be below the `ng-app` definition.
* *
* Adding via the $templateCache service: * Adding via the $templateCache service:
* *
* <pre> * <pre>
* var myApp = angular.module('myApp', []); * var myApp = angular.module('myApp', []);
* myApp.run(function($templateCache) { * myApp.run(function($templateCache) {
* $templateCache.put('templateId.html', 'This is the content of the template'); * $templateCache.put('templateId.html', 'This is the content of the template');
* }); * });
* </pre> * </pre>
* *
* To retrieve the template later, simply use it in your HTML: * To retrieve the template later, simply use it in your HTML:
* <pre> * <pre>
* <div ng-include=" 'templateId.html' "></div> * <div ng-include=" 'templateId.html' "></div>
* </pre> * </pre>
* *
* or get it via Javascript: * or get it via Javascript:
* <pre> * <pre>
* $templateCache.get('templateId.html') * $templateCache.get('templateId.html')
* </pre> * </pre>
* *
* See {@link ng.$cacheFactory $cacheFactory}. * See {@link ng.$cacheFactory $cacheFactory}.
* *
*/ */
@@ -6828,12 +6809,12 @@ function $DocumentProvider(){
* Any uncaught exception in angular expressions is delegated to this service. * Any uncaught exception in angular expressions is delegated to this service.
* The default implementation simply delegates to `$log.error` which logs it into * The default implementation simply delegates to `$log.error` which logs it into
* the browser console. * the browser console.
* *
* In unit tests, if `angular-mocks.js` is loaded, this service is overridden by * In unit tests, if `angular-mocks.js` is loaded, this service is overridden by
* {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing. * {@link ngMock.$exceptionHandler mock $exceptionHandler} which aids in testing.
* *
* ## Example: * ## Example:
* *
* <pre> * <pre>
* angular.module('exceptionOverride', []).factory('$exceptionHandler', function () { * angular.module('exceptionOverride', []).factory('$exceptionHandler', function () {
* return function (exception, cause) { * return function (exception, cause) {
@@ -6842,7 +6823,7 @@ function $DocumentProvider(){
* }; * };
* }); * });
* </pre> * </pre>
* *
* This example will override the normal action of `$exceptionHandler`, to make angular * This example will override the normal action of `$exceptionHandler`, to make angular
* exceptions fail hard when they happen, instead of just logging to the console. * exceptions fail hard when they happen, instead of just logging to the console.
* *
@@ -8341,7 +8322,7 @@ function $IntervalProvider() {
* In tests you can use {@link ngMock.$interval#methods_flush `$interval.flush(millis)`} to * In tests you can use {@link ngMock.$interval#methods_flush `$interval.flush(millis)`} to
* move forward by `millis` milliseconds and trigger any functions scheduled to run in that * move forward by `millis` milliseconds and trigger any functions scheduled to run in that
* time. * time.
* *
* <div class="alert alert-warning"> * <div class="alert alert-warning">
* **Note**: Intervals created by this service must be explicitly destroyed when you are finished * **Note**: Intervals created by this service must be explicitly destroyed when you are finished
* with them. In particular they are not automatically destroyed when a controller's scope or a * with them. In particular they are not automatically destroyed when a controller's scope or a
@@ -8454,7 +8435,7 @@ function $IntervalProvider() {
promise = deferred.promise, promise = deferred.promise,
iteration = 0, iteration = 0,
skipApply = (isDefined(invokeApply) && !invokeApply); skipApply = (isDefined(invokeApply) && !invokeApply);
count = isDefined(count) ? count : 0, count = isDefined(count) ? count : 0,
promise.then(null, null, fn); promise.then(null, null, fn);
@@ -9289,7 +9270,7 @@ function $LocationProvider(){
* @description * @description
* Simple service for logging. Default implementation safely writes the message * Simple service for logging. Default implementation safely writes the message
* into the browser's console (if present). * into the browser's console (if present).
* *
* The main purpose of this service is to simplify debugging and troubleshooting. * The main purpose of this service is to simplify debugging and troubleshooting.
* *
* The default is to log `debug` messages. You can use * The default is to log `debug` messages. You can use
@@ -9326,7 +9307,7 @@ function $LocationProvider(){
function $LogProvider(){ function $LogProvider(){
var debug = true, var debug = true,
self = this; self = this;
/** /**
* @ngdoc property * @ngdoc property
* @name ng.$logProvider#debugEnabled * @name ng.$logProvider#debugEnabled
@@ -9343,7 +9324,7 @@ function $LogProvider(){
return debug; return debug;
} }
}; };
this.$get = ['$window', function($window){ this.$get = ['$window', function($window){
return { return {
/** /**
@@ -9385,12 +9366,12 @@ function $LogProvider(){
* Write an error message * Write an error message
*/ */
error: consoleLog('error'), error: consoleLog('error'),
/** /**
* @ngdoc method * @ngdoc method
* @name ng.$log#debug * @name ng.$log#debug
* @methodOf ng.$log * @methodOf ng.$log
* *
* @description * @description
* Write a debug message * Write a debug message
*/ */
@@ -12842,7 +12823,7 @@ function $SceDelegateProvider() {
* allowing only the files in a specific directory to do this. Ensuring that the internal API * allowing only the files in a specific directory to do this. Ensuring that the internal API
* exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task. * exposed by that code doesn't markup arbitrary values as safe then becomes a more manageable task.
* *
* In the case of AngularJS' SCE service, one uses {@link ng.$sce#methods_trustAs $sce.trustAs} * In the case of AngularJS' SCE service, one uses {@link ng.$sce#methods_trustAs $sce.trustAs}
* (and shorthand methods such as {@link ng.$sce#methods_trustAsHtml $sce.trustAsHtml}, etc.) to * (and shorthand methods such as {@link ng.$sce#methods_trustAsHtml $sce.trustAsHtml}, etc.) to
* obtain values that will be accepted by SCE / privileged contexts. * obtain values that will be accepted by SCE / privileged contexts.
* *
@@ -13591,7 +13572,7 @@ function $TimeoutProvider() {
* will invoke `fn` within the {@link ng.$rootScope.Scope#methods_$apply $apply} block. * will invoke `fn` within the {@link ng.$rootScope.Scope#methods_$apply $apply} block.
* @returns {Promise} Promise that will be resolved when the timeout is reached. The value this * @returns {Promise} Promise that will be resolved when the timeout is reached. The value this
* promise will be resolved with is the return value of the `fn` function. * promise will be resolved with is the return value of the `fn` function.
* *
*/ */
function timeout(fn, delay, invokeApply) { function timeout(fn, delay, invokeApply) {
var deferred = $q.defer(), var deferred = $q.defer(),
@@ -13825,7 +13806,7 @@ function $WindowProvider(){
* *
* The filter function is registered with the `$injector` under the filter name suffix with * The filter function is registered with the `$injector` under the filter name suffix with
* `Filter`. * `Filter`.
* *
* <pre> * <pre>
* it('should be the same instance', inject( * it('should be the same instance', inject(
* function($filterProvider) { * function($filterProvider) {
@@ -13901,7 +13882,7 @@ function $FilterProvider($provide) {
}]; }];
//////////////////////////////////////// ////////////////////////////////////////
/* global /* global
currencyFilter: false, currencyFilter: false,
dateFilter: false, dateFilter: false,
@@ -14609,9 +14590,9 @@ var uppercaseFilter = valueFn(uppercase);
* the value and sign (positive or negative) of `limit`. * the value and sign (positive or negative) of `limit`.
* *
* @param {Array|string} input Source array or string to be limited. * @param {Array|string} input Source array or string to be limited.
* @param {string|number} limit The length of the returned array or string. If the `limit` number * @param {string|number} limit The length of the returned array or string. If the `limit` number
* is positive, `limit` number of items from the beginning of the source array/string are copied. * is positive, `limit` number of items from the beginning of the source array/string are copied.
* If the number is negative, `limit` number of items from the end of the source array/string * If the number is negative, `limit` number of items from the end of the source array/string
* are copied. The `limit` will be trimmed if it exceeds `array.length` * are copied. The `limit` will be trimmed if it exceeds `array.length`
* @returns {Array|string} A new sub-array or substring of length `limit` or less if input array * @returns {Array|string} A new sub-array or substring of length `limit` or less if input array
* had less than `limit` elements. * had less than `limit` elements.
@@ -14661,7 +14642,7 @@ var uppercaseFilter = valueFn(uppercase);
function limitToFilter(){ function limitToFilter(){
return function(input, limit) { return function(input, limit) {
if (!isArray(input) && !isString(input)) return input; if (!isArray(input) && !isString(input)) return input;
limit = int(limit); limit = int(limit);
if (isString(input)) { if (isString(input)) {
@@ -15063,7 +15044,7 @@ var htmlAnchorDirective = valueFn({
</doc:example> </doc:example>
* *
* @element INPUT * @element INPUT
* @param {expression} ngDisabled If the {@link guide/expression expression} is truthy, * @param {expression} ngDisabled If the {@link guide/expression expression} is truthy,
* then special attribute "disabled" will be set on the element * then special attribute "disabled" will be set on the element
*/ */
@@ -15098,7 +15079,7 @@ var htmlAnchorDirective = valueFn({
</doc:example> </doc:example>
* *
* @element INPUT * @element INPUT
* @param {expression} ngChecked If the {@link guide/expression expression} is truthy, * @param {expression} ngChecked If the {@link guide/expression expression} is truthy,
* then special attribute "checked" will be set on the element * then special attribute "checked" will be set on the element
*/ */
@@ -15133,7 +15114,7 @@ var htmlAnchorDirective = valueFn({
</doc:example> </doc:example>
* *
* @element INPUT * @element INPUT
* @param {expression} ngReadonly If the {@link guide/expression expression} is truthy, * @param {expression} ngReadonly If the {@link guide/expression expression} is truthy,
* then special attribute "readonly" will be set on the element * then special attribute "readonly" will be set on the element
*/ */
@@ -15152,7 +15133,7 @@ var htmlAnchorDirective = valueFn({
* The `ngSelected` directive solves this problem for the `selected` atttribute. * The `ngSelected` directive solves this problem for the `selected` atttribute.
* This complementary directive is not removed by the browser and so provides * This complementary directive is not removed by the browser and so provides
* a permanent reliable place to store the binding information. * a permanent reliable place to store the binding information.
* *
* @example * @example
<doc:example> <doc:example>
<doc:source> <doc:source>
@@ -15172,7 +15153,7 @@ var htmlAnchorDirective = valueFn({
</doc:example> </doc:example>
* *
* @element OPTION * @element OPTION
* @param {expression} ngSelected If the {@link guide/expression expression} is truthy, * @param {expression} ngSelected If the {@link guide/expression expression} is truthy,
* then special attribute "selected" will be set on the element * then special attribute "selected" will be set on the element
*/ */
@@ -15208,7 +15189,7 @@ var htmlAnchorDirective = valueFn({
</doc:example> </doc:example>
* *
* @element DETAILS * @element DETAILS
* @param {expression} ngOpen If the {@link guide/expression expression} is truthy, * @param {expression} ngOpen If the {@link guide/expression expression} is truthy,
* then special attribute "open" will be set on the element * then special attribute "open" will be set on the element
*/ */
@@ -15294,7 +15275,7 @@ var nullFormCtrl = {
* - `pattern` * - `pattern`
* - `required` * - `required`
* - `url` * - `url`
* *
* @description * @description
* `FormController` keeps track of all its controls and nested forms as well as state of them, * `FormController` keeps track of all its controls and nested forms as well as state of them,
* such as being valid/invalid or dirty/pristine. * such as being valid/invalid or dirty/pristine.
@@ -17203,14 +17184,14 @@ var ngBindTemplateDirective = ['$interpolate', function($interpolate) {
* *
* @example * @example
Try it here: enter text in text box and watch the greeting change. Try it here: enter text in text box and watch the greeting change.
<example module="ngBindHtmlExample" deps="angular-sanitize.js"> <example module="ngBindHtmlExample" deps="angular-sanitize.js">
<file name="index.html"> <file name="index.html">
<div ng-controller="ngBindHtmlCtrl"> <div ng-controller="ngBindHtmlCtrl">
<p ng-bind-html="myHTML"></p> <p ng-bind-html="myHTML"></p>
</div> </div>
</file> </file>
<file name="script.js"> <file name="script.js">
angular.module('ngBindHtmlExample', ['ngSanitize']) angular.module('ngBindHtmlExample', ['ngSanitize'])
@@ -20368,7 +20349,7 @@ var selectDirective = ['$compile', '$parse', function($compile, $parse) {
// We now build up the list of options we need (we merge later) // We now build up the list of options we need (we merge later)
for (index = 0; length = keys.length, index < length; index++) { for (index = 0; length = keys.length, index < length; index++) {
key = index; key = index;
if (keyName) { if (keyName) {
key = keys[index]; key = keys[index];
@@ -20576,4 +20557,4 @@ var styleDirective = valueFn({
})(window, document); })(window, document);
!angular.$$csp() && angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}</style>'); !angular.$$csp() && angular.element(document).find('head').prepend('<style type="text/css">@charset "UTF-8";[ng\\:cloak],[ng-cloak],[data-ng-cloak],[x-ng-cloak],.ng-cloak,.x-ng-cloak,.ng-hide{display:none !important;}ng\\:form{display:block;}</style>');
-18
View File
@@ -9,24 +9,6 @@
* Released under the MIT license * Released under the MIT license
* http://jquery.org/license * http://jquery.org/license
* *
* 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.
*
* Date: 2016-03-17T17:51Z * Date: 2016-03-17T17:51Z
*/ */
+22 -72
View File
@@ -14,7 +14,6 @@ import (
"io/ioutil" "io/ioutil"
"net/url" "net/url"
"os" "os"
"path"
"sort" "sort"
"strings" "strings"
@@ -24,15 +23,15 @@ import (
const ( const (
OldestHandledVersion = 10 OldestHandledVersion = 10
CurrentVersion = 15 CurrentVersion = 14
MaxRescanIntervalS = 365 * 24 * 60 * 60 MaxRescanIntervalS = 365 * 24 * 60 * 60
) )
var ( var (
// DefaultListenAddresses should be substituted when the configuration // DefaultListenAddresses should be substituted when the configuration
// contains <listenAddress>default</listenAddress>. This is done by the // contains <listenAddress>default</listenAddress>. This is
// "consumer" of the configuration as we don't want these saved to the // done by the "consumer" of the configuration, as we don't want these
// config. // saved to the config.
DefaultListenAddresses = []string{ DefaultListenAddresses = []string{
"tcp://0.0.0.0:22000", "tcp://0.0.0.0:22000",
"dynamic+https://relays.syncthing.net/endpoint", "dynamic+https://relays.syncthing.net/endpoint",
@@ -202,9 +201,6 @@ func (cfg *Configuration) prepare(myID protocol.DeviceID) {
if cfg.Version == 13 { if cfg.Version == 13 {
convertV13V14(cfg) convertV13V14(cfg)
} }
if cfg.Version == 14 {
convertV14V15(cfg)
}
// Build a list of available devices // Build a list of available devices
existingDevices := make(map[protocol.DeviceID]bool) existingDevices := make(map[protocol.DeviceID]bool)
@@ -258,81 +254,39 @@ func (cfg *Configuration) prepare(myID protocol.DeviceID) {
} }
} }
func convertV14V15(cfg *Configuration) {
// Undo v0.13.0 broken migration
for i, addr := range cfg.Options.GlobalAnnServers {
switch addr {
case "default-v4v2/":
cfg.Options.GlobalAnnServers[i] = "default-v4"
case "default-v6v2/":
cfg.Options.GlobalAnnServers[i] = "default-v6"
}
}
cfg.Version = 15
}
func convertV13V14(cfg *Configuration) { func convertV13V14(cfg *Configuration) {
// Not using the ignore cache is the new default. Disable it on existing // Not using the ignore cache is the new default. Disable it on existing
// configurations. // configurations.
cfg.Options.CacheIgnoredFiles = false cfg.Options.CacheIgnoredFiles = false
// Migrate UPnP -> NAT options
cfg.Options.NATEnabled = cfg.Options.DeprecatedUPnPEnabled cfg.Options.NATEnabled = cfg.Options.DeprecatedUPnPEnabled
cfg.Options.DeprecatedUPnPEnabled = false
cfg.Options.NATLeaseM = cfg.Options.DeprecatedUPnPLeaseM cfg.Options.NATLeaseM = cfg.Options.DeprecatedUPnPLeaseM
cfg.Options.DeprecatedUPnPLeaseM = 0
cfg.Options.NATRenewalM = cfg.Options.DeprecatedUPnPRenewalM cfg.Options.NATRenewalM = cfg.Options.DeprecatedUPnPRenewalM
cfg.Options.DeprecatedUPnPRenewalM = 0
cfg.Options.NATTimeoutS = cfg.Options.DeprecatedUPnPTimeoutS cfg.Options.NATTimeoutS = cfg.Options.DeprecatedUPnPTimeoutS
cfg.Options.DeprecatedUPnPTimeoutS = 0 if cfg.Options.DeprecatedRelaysEnabled {
cfg.Options.ListenAddresses = append(cfg.Options.ListenAddresses, cfg.Options.DeprecatedRelayServers...)
// Replace the default listen address "tcp://0.0.0.0:22000" with the // Replace our two fairly long addresses with 'default' if both exist.
// string "default", but only if we also have the default relay pool var newAddresses []string
// among the relay servers as this is implied by the new "default" for _, addr := range cfg.Options.ListenAddresses {
// entry. if addr != "tcp://0.0.0.0:22000" && addr != "dynamic+https://relays.syncthing.net/endpoint" {
hasDefault := false newAddresses = append(newAddresses, addr)
for _, raddr := range cfg.Options.DeprecatedRelayServers {
if raddr == "dynamic+https://relays.syncthing.net/endpoint" {
for i, addr := range cfg.Options.ListenAddresses {
if addr == "tcp://0.0.0.0:22000" {
cfg.Options.ListenAddresses[i] = "default"
hasDefault = true
break
}
} }
break }
if len(newAddresses)+2 == len(cfg.Options.ListenAddresses) {
cfg.Options.ListenAddresses = append([]string{"default"}, newAddresses...)
} }
} }
cfg.Options.DeprecatedRelaysEnabled = false
// Copy relay addresses into listen addresses.
for _, addr := range cfg.Options.DeprecatedRelayServers {
if hasDefault && addr == "dynamic+https://relays.syncthing.net/endpoint" {
// Skip the default relay address if we already have the
// "default" entry in the list.
continue
}
if addr == "" {
continue
}
cfg.Options.ListenAddresses = append(cfg.Options.ListenAddresses, addr)
}
cfg.Options.DeprecatedRelayServers = nil cfg.Options.DeprecatedRelayServers = nil
// For consistency
sort.Strings(cfg.Options.ListenAddresses)
var newAddrs []string var newAddrs []string
for _, addr := range cfg.Options.GlobalAnnServers { for _, addr := range cfg.Options.GlobalAnnServers {
uri, err := url.Parse(addr) if addr != "default" {
if err != nil { uri, err := url.Parse(addr)
// That's odd. Skip the broken address. if err != nil {
continue panic(err)
} }
if uri.Scheme == "https" { uri.Path += "v2/"
uri.Path = path.Join(uri.Path, "v2") + "/"
addr = uri.String() addr = uri.String()
} }
@@ -348,10 +302,6 @@ func convertV13V14(cfg *Configuration) {
} }
cfg.Folders[i].DeprecatedReadOnly = false cfg.Folders[i].DeprecatedReadOnly = false
} }
// v0.13-beta already had config version 13 but did not get the new URL
if cfg.Options.ReleasesURL == "https://api.github.com/repos/syncthing/syncthing/releases?per_page=30" {
cfg.Options.ReleasesURL = "https://upgrades.syncthing.net/meta.json"
}
cfg.Version = 14 cfg.Version = 14
} }
+4 -66
View File
@@ -12,9 +12,7 @@ import (
"fmt" "fmt"
"os" "os"
"path/filepath" "path/filepath"
"reflect"
"runtime" "runtime"
"sort"
"strings" "strings"
"testing" "testing"
@@ -42,7 +40,6 @@ func TestDefaultValues(t *testing.T) {
MaxSendKbps: 0, MaxSendKbps: 0,
MaxRecvKbps: 0, MaxRecvKbps: 0,
ReconnectIntervalS: 60, ReconnectIntervalS: 60,
RelaysEnabled: true,
RelayReconnectIntervalM: 10, RelayReconnectIntervalM: 10,
StartBrowser: true, StartBrowser: true,
NATEnabled: true, NATEnabled: true,
@@ -172,7 +169,6 @@ func TestOverriddenValues(t *testing.T) {
MaxSendKbps: 1234, MaxSendKbps: 1234,
MaxRecvKbps: 2341, MaxRecvKbps: 2341,
ReconnectIntervalS: 6000, ReconnectIntervalS: 6000,
RelaysEnabled: false,
RelayReconnectIntervalM: 20, RelayReconnectIntervalM: 20,
StartBrowser: false, StartBrowser: false,
NATEnabled: false, NATEnabled: false,
@@ -365,12 +361,12 @@ func TestIssue1750(t *testing.T) {
t.Errorf("%q != %q", cfg.Options().ListenAddresses[1], "tcp://:23001") t.Errorf("%q != %q", cfg.Options().ListenAddresses[1], "tcp://:23001")
} }
if cfg.Options().GlobalAnnServers[0] != "udp4://syncthing.nym.se:22026" { if cfg.Options().GlobalAnnServers[0] != "udp4://syncthing.nym.se:22026/v2/" {
t.Errorf("%q != %q", cfg.Options().GlobalAnnServers[0], "udp4://syncthing.nym.se:22026") t.Errorf("%q != %q", cfg.Options().GlobalAnnServers[0], "udp4://syncthing.nym.se:22026/v2/")
} }
if cfg.Options().GlobalAnnServers[1] != "udp4://syncthing.nym.se:22027" { if cfg.Options().GlobalAnnServers[1] != "udp4://syncthing.nym.se:22027/v2/" {
t.Errorf("%q != %q", cfg.Options().GlobalAnnServers[1], "udp4://syncthing.nym.se:22027") t.Errorf("%q != %q", cfg.Options().GlobalAnnServers[1], "udp4://syncthing.nym.se:22027/v2/")
} }
} }
@@ -620,61 +616,3 @@ func TestRemoveDuplicateDevicesFolders(t *testing.T) {
t.Errorf("Incorrect number of folder devices, %d != 2", l) t.Errorf("Incorrect number of folder devices, %d != 2", l)
} }
} }
func TestV14ListenAddressesMigration(t *testing.T) {
tcs := [][3][]string{
// Default listen plus default relays is now "default"
{
{"tcp://0.0.0.0:22000"},
{"dynamic+https://relays.syncthing.net/endpoint"},
{"default"},
},
// Default listen address without any relay addresses gets converted
// to just the listen address. It's easier this way, and frankly the
// user has gone to some trouble to get the empty string in the
// config to start with...
{
{"tcp://0.0.0.0:22000"}, // old listen addrs
{""}, // old relay addrs
{"tcp://0.0.0.0:22000"}, // new listen addrs
},
// Default listen plus non-default relays gets copied verbatim
{
{"tcp://0.0.0.0:22000"},
{"dynamic+https://other.example.com"},
{"tcp://0.0.0.0:22000", "dynamic+https://other.example.com"},
},
// Non-default listen plus default relays gets copied verbatim
{
{"tcp://1.2.3.4:22000"},
{"dynamic+https://relays.syncthing.net/endpoint"},
{"tcp://1.2.3.4:22000", "dynamic+https://relays.syncthing.net/endpoint"},
},
// Default stuff gets sucked into "default", the rest gets copied
{
{"tcp://0.0.0.0:22000", "tcp://1.2.3.4:22000"},
{"dynamic+https://relays.syncthing.net/endpoint", "relay://other.example.com"},
{"default", "tcp://1.2.3.4:22000", "relay://other.example.com"},
},
}
for _, tc := range tcs {
cfg := Configuration{
Version: 13,
Options: OptionsConfiguration{
ListenAddresses: tc[0],
DeprecatedRelayServers: tc[1],
},
}
convertV13V14(&cfg)
if cfg.Version != 14 {
t.Error("Configuration was not converted")
}
sort.Strings(tc[2])
if !reflect.DeepEqual(cfg.Options.ListenAddresses, tc[2]) {
t.Errorf("Migration error; actual %#v != expected %#v", cfg.Options.ListenAddresses, tc[2])
}
}
}
+6 -6
View File
@@ -16,7 +16,6 @@ type OptionsConfiguration struct {
MaxSendKbps int `xml:"maxSendKbps" json:"maxSendKbps"` MaxSendKbps int `xml:"maxSendKbps" json:"maxSendKbps"`
MaxRecvKbps int `xml:"maxRecvKbps" json:"maxRecvKbps"` MaxRecvKbps int `xml:"maxRecvKbps" json:"maxRecvKbps"`
ReconnectIntervalS int `xml:"reconnectionIntervalS" json:"reconnectionIntervalS" default:"60"` ReconnectIntervalS int `xml:"reconnectionIntervalS" json:"reconnectionIntervalS" default:"60"`
RelaysEnabled bool `xml:"relaysEnabled" json:"relaysEnabled" default:"true"`
RelayReconnectIntervalM int `xml:"relayReconnectIntervalM" json:"relayReconnectIntervalM" default:"10"` RelayReconnectIntervalM int `xml:"relayReconnectIntervalM" json:"relayReconnectIntervalM" default:"10"`
StartBrowser bool `xml:"startBrowser" json:"startBrowser" default:"true"` StartBrowser bool `xml:"startBrowser" json:"startBrowser" default:"true"`
NATEnabled bool `xml:"natEnabled" json:"natEnabled" default:"true"` NATEnabled bool `xml:"natEnabled" json:"natEnabled" default:"true"`
@@ -41,11 +40,12 @@ type OptionsConfiguration struct {
OverwriteRemoteDevNames bool `xml:"overwriteRemoteDeviceNamesOnConnect" json:"overwriteRemoteDeviceNamesOnConnect" default:"false"` OverwriteRemoteDevNames bool `xml:"overwriteRemoteDeviceNamesOnConnect" json:"overwriteRemoteDeviceNamesOnConnect" default:"false"`
TempIndexMinBlocks int `xml:"tempIndexMinBlocks" json:"tempIndexMinBlocks" default:"10"` TempIndexMinBlocks int `xml:"tempIndexMinBlocks" json:"tempIndexMinBlocks" default:"10"`
DeprecatedUPnPEnabled bool `xml:"upnpEnabled,omitempty" json:"-"` DeprecatedUPnPEnabled bool `xml:"upnpEnabled" json:"-"`
DeprecatedUPnPLeaseM int `xml:"upnpLeaseMinutes,omitempty" json:"-"` DeprecatedUPnPLeaseM int `xml:"upnpLeaseMinutes" json:"-"`
DeprecatedUPnPRenewalM int `xml:"upnpRenewalMinutes,omitempty" json:"-"` DeprecatedUPnPRenewalM int `xml:"upnpRenewalMinutes" json:"-"`
DeprecatedUPnPTimeoutS int `xml:"upnpTimeoutSeconds,omitempty" json:"-"` DeprecatedUPnPTimeoutS int `xml:"upnpTimeoutSeconds" json:"-"`
DeprecatedRelayServers []string `xml:"relayServer,omitempty" json:"-"` DeprecatedRelaysEnabled bool `xml:"relaysEnabled" json:"-"`
DeprecatedRelayServers []string `xml:"relayServer" json:"-"`
} }
func (orig OptionsConfiguration) Copy() OptionsConfiguration { func (orig OptionsConfiguration) Copy() OptionsConfiguration {
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
-14
View File
@@ -1,14 +0,0 @@
<configuration version="15">
<folder id="test" path="testdata" type="readonly" ignorePerms="false" rescanIntervalS="600" autoNormalize="true">
<device id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR"></device>
<device id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2"></device>
<minDiskFreePct>1</minDiskFreePct>
<maxConflicts>-1</maxConflicts>
</folder>
<device id="AIR6LPZ-7K4PTTV-UXQSMUU-CPQ5YWH-OEDFIIQ-JUG777G-2YQXXR5-YD6AWQR" name="node one" compression="metadata">
<address>tcp://a</address>
</device>
<device id="P56IOI7-MZJNU2Y-IQGDREY-DM2MGTI-MGL3BXN-PQ6W5BM-TBBZ4TJ-XZWICQ2" name="node two" compression="metadata">
<address>tcp://b</address>
</device>
</configuration>
Vendored Regular → Executable
View File
Vendored Regular → Executable
View File
+4 -8
View File
@@ -70,6 +70,10 @@ func (d *relayDialer) RedialFrequency() time.Duration {
return time.Duration(d.cfg.Options().RelayReconnectIntervalM) * time.Minute return time.Duration(d.cfg.Options().RelayReconnectIntervalM) * time.Minute
} }
func (d *relayDialer) String() string {
return "Relay Dialer"
}
type relayDialerFactory struct{} type relayDialerFactory struct{}
func (relayDialerFactory) New(cfg *config.Wrapper, tlsCfg *tls.Config) genericDialer { func (relayDialerFactory) New(cfg *config.Wrapper, tlsCfg *tls.Config) genericDialer {
@@ -82,11 +86,3 @@ func (relayDialerFactory) New(cfg *config.Wrapper, tlsCfg *tls.Config) genericDi
func (relayDialerFactory) Priority() int { func (relayDialerFactory) Priority() int {
return relayPriority return relayPriority
} }
func (relayDialerFactory) Enabled(cfg config.Configuration) bool {
return cfg.Options.RelaysEnabled
}
func (relayDialerFactory) String() string {
return "Relay Dialer"
}
+10 -24
View File
@@ -13,26 +13,23 @@ import (
"sync" "sync"
"time" "time"
"github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/dialer" "github.com/syncthing/syncthing/lib/dialer"
"github.com/syncthing/syncthing/lib/nat" "github.com/syncthing/syncthing/lib/nat"
"github.com/syncthing/syncthing/lib/relay/client" "github.com/syncthing/syncthing/lib/relay/client"
) )
func init() { func init() {
factory := &relayListenerFactory{} listeners["relay"] = newRelayListener
listeners["relay"] = factory listeners["dynamic+http"] = newRelayListener
listeners["dynamic+http"] = factory listeners["dynamic+https"] = newRelayListener
listeners["dynamic+https"] = factory
} }
type relayListener struct { type relayListener struct {
onAddressesChangedNotifier onAddressesChangedNotifier
uri *url.URL uri *url.URL
tlsCfg *tls.Config tlsCfg *tls.Config
conns chan IntermediateConnection conns chan IntermediateConnection
factory listenerFactory
err error err error
client client.RelayClient client client.RelayClient
@@ -157,25 +154,14 @@ func (t *relayListener) Error() error {
return cerr return cerr
} }
func (t *relayListener) Factory() listenerFactory {
return t.factory
}
func (t *relayListener) String() string { func (t *relayListener) String() string {
return t.uri.String() return t.uri.String()
} }
type relayListenerFactory struct{} func newRelayListener(uri *url.URL, tlsCfg *tls.Config, conns chan IntermediateConnection, natService *nat.Service) genericListener {
func (f *relayListenerFactory) New(uri *url.URL, cfg *config.Wrapper, tlsCfg *tls.Config, conns chan IntermediateConnection, natService *nat.Service) genericListener {
return &relayListener{ return &relayListener{
uri: uri, uri: uri,
tlsCfg: tlsCfg, tlsCfg: tlsCfg,
conns: conns, conns: conns,
factory: f,
} }
} }
func (relayListenerFactory) Enabled(cfg config.Configuration) bool {
return cfg.Options.RelaysEnabled
}
+52 -109
View File
@@ -9,7 +9,6 @@ package connections
import ( import (
"crypto/tls" "crypto/tls"
"encoding/binary" "encoding/binary"
"errors"
"fmt" "fmt"
"io" "io"
"net" "net"
@@ -113,10 +112,6 @@ func NewService(cfg *config.Wrapper, myID protocol.DeviceID, mdl Model, tlsCfg *
return service return service
} }
var (
errDisabled = errors.New("disabled by configuration")
)
func (s *Service) handle() { func (s *Service) handle() {
next: next:
for c := range s.conns { for c := range s.conns {
@@ -242,35 +237,24 @@ next:
func (s *Service) connect() { func (s *Service) connect() {
nextDial := make(map[string]time.Time) nextDial := make(map[string]time.Time)
delay := time.Second
sleep := time.Second
// Used as delay for the first few connection attempts, increases bestDialerPrio := 1<<31 - 1 // worse prio won't build on 32 bit
// exponentially for _, df := range dialers {
initialRampup := time.Second if prio := df.Priority(); prio < bestDialerPrio {
bestDialerPrio = prio
// Calculated from actual dialers reconnectInterval }
var sleep time.Duration }
for { for {
cfg := s.cfg.Raw()
bestDialerPrio := 1<<31 - 1 // worse prio won't build on 32 bit
for _, df := range dialers {
if !df.Enabled(cfg) {
continue
}
if prio := df.Priority(); prio < bestDialerPrio {
bestDialerPrio = prio
}
}
l.Debugln("Reconnect loop") l.Debugln("Reconnect loop")
now := time.Now() now := time.Now()
var seen []string var seen []string
nextDevice: nextDevice:
for _, deviceCfg := range cfg.Devices { for deviceID, deviceCfg := range s.cfg.Devices() {
deviceID := deviceCfg.DeviceID
if deviceID == s.myID { if deviceID == s.myID {
continue continue
} }
@@ -308,40 +292,35 @@ func (s *Service) connect() {
seen = append(seen, addrs...) seen = append(seen, addrs...)
for _, addr := range addrs { for _, addr := range addrs {
nextDialAt, ok := nextDial[addr]
if ok && initialRampup >= sleep && nextDialAt.After(now) {
l.Debugf("Not dialing %v as sleep is %v, next dial is at %s and current time is %s", addr, sleep, nextDialAt, now)
continue
}
// If we fail at any step before actually getting the dialer
// retry in a minute
nextDial[addr] = now.Add(time.Minute)
uri, err := url.Parse(addr) uri, err := url.Parse(addr)
if err != nil { if err != nil {
l.Infof("Dialer for %s: %v", addr, err) l.Infoln("Failed to parse connection url:", addr, err)
continue continue
} }
dialerFactory, err := s.getDialerFactory(cfg, uri) dialerFactory, ok := dialers[uri.Scheme]
if err == errDisabled { if !ok {
l.Debugln("Dialer for", uri, "is disabled") l.Debugln("Unknown address schema", uri)
continue
}
if err != nil {
l.Infof("Dialer for %v: %v", uri, err)
continue
}
if connected && dialerFactory.Priority() >= ct.Priority {
l.Debugf("Not dialing using %s as priorty is less than current connection (%d >= %d)", dialerFactory, dialerFactory.Priority(), ct.Priority)
continue continue
} }
dialer := dialerFactory.New(s.cfg, s.tlsCfg) dialer := dialerFactory.New(s.cfg, s.tlsCfg)
l.Debugln("dial", deviceCfg.DeviceID, uri)
nextDial[addr] = now.Add(dialer.RedialFrequency())
nextDialAt, ok := nextDial[uri.String()]
// See below for comments on this delay >= sleep check
if delay >= sleep && ok && nextDialAt.After(now) {
l.Debugf("Not dialing as next dial is at %s and current time is %s", nextDialAt, now)
continue
}
nextDial[uri.String()] = now.Add(dialer.RedialFrequency())
if connected && dialer.Priority() >= ct.Priority {
l.Debugf("Not dialing using %s as priorty is less than current connection (%d >= %d)", dialer, dialer.Priority(), ct.Priority)
continue
}
l.Debugln("dial", deviceCfg.DeviceID, uri)
conn, err := dialer.Dial(deviceID, uri) conn, err := dialer.Dial(deviceID, uri)
if err != nil { if err != nil {
l.Debugln("dial failed", deviceCfg.DeviceID, uri, err) l.Debugln("dial failed", deviceCfg.DeviceID, uri, err)
@@ -359,12 +338,12 @@ func (s *Service) connect() {
nextDial, sleep = filterAndFindSleepDuration(nextDial, seen, now) nextDial, sleep = filterAndFindSleepDuration(nextDial, seen, now)
if initialRampup < sleep { // delay variable is used to trigger much more frequent dialing after
l.Debugln("initial rampup; sleep", initialRampup, "and update to", initialRampup*2) // initial startup, essentially causing redials every 1, 2, 4, 8... seconds
time.Sleep(initialRampup) if delay < sleep {
initialRampup *= 2 time.Sleep(delay)
delay *= 2
} else { } else {
l.Debugln("sleep until next dial", sleep)
time.Sleep(sleep) time.Sleep(sleep)
} }
} }
@@ -387,16 +366,24 @@ func (s *Service) shouldLimit(addr net.Addr) bool {
return !tcpaddr.IP.IsLoopback() return !tcpaddr.IP.IsLoopback()
} }
func (s *Service) createListener(factory listenerFactory, uri *url.URL) bool { func (s *Service) createListener(addr string) {
// must be called with listenerMut held // must be called with listenerMut held
uri, err := url.Parse(addr)
if err != nil {
l.Infoln("Failed to parse listen address:", addr, err)
return
}
l.Debugln("Starting listener", uri) listenerFactory, ok := listeners[uri.Scheme]
if !ok {
l.Infoln("Unknown listen address scheme:", uri.String())
return
}
listener := factory.New(uri, s.cfg, s.tlsCfg, s.conns, s.natService) listener := listenerFactory(uri, s.tlsCfg, s.conns, s.natService)
listener.OnAddressesChanged(s.logListenAddressesChangedEvent) listener.OnAddressesChanged(s.logListenAddressesChangedEvent)
s.listeners[uri.String()] = listener s.listeners[addr] = listener
s.listenerTokens[uri.String()] = s.Add(listener) s.listenerTokens[addr] = s.Add(listener)
return true
} }
func (s *Service) logListenAddressesChangedEvent(l genericListener) { func (s *Service) logListenAddressesChangedEvent(l genericListener) {
@@ -430,33 +417,15 @@ func (s *Service) CommitConfiguration(from, to config.Configuration) bool {
s.listenersMut.Lock() s.listenersMut.Lock()
seen := make(map[string]struct{}) seen := make(map[string]struct{})
for _, addr := range config.Wrap("", to).ListenAddresses() { for _, addr := range config.Wrap("", to).ListenAddresses() {
if _, ok := s.listeners[addr]; ok { if _, ok := s.listeners[addr]; !ok {
seen[addr] = struct{}{} l.Debugln("Staring listener", addr)
continue s.createListener(addr)
} }
uri, err := url.Parse(addr)
if err != nil {
l.Infof("Listener for %s: %v", addr, err)
continue
}
factory, err := s.getListenerFactory(to, uri)
if err == errDisabled {
l.Debugln("Listener for", uri, "is disabled")
continue
}
if err != nil {
l.Infof("Listener for %v: %v", uri, err)
continue
}
s.createListener(factory, uri)
seen[addr] = struct{}{} seen[addr] = struct{}{}
} }
for addr, listener := range s.listeners { for addr := range s.listeners {
if _, ok := seen[addr]; !ok || !listener.Factory().Enabled(to) { if _, ok := seen[addr]; !ok {
l.Debugln("Stopping listener", addr) l.Debugln("Stopping listener", addr)
s.Remove(s.listenerTokens[addr]) s.Remove(s.listenerTokens[addr])
delete(s.listenerTokens, addr) delete(s.listenerTokens, addr)
@@ -525,32 +494,6 @@ func (s *Service) Status() map[string]interface{} {
return result return result
} }
func (s *Service) getDialerFactory(cfg config.Configuration, uri *url.URL) (dialerFactory, error) {
dialerFactory, ok := dialers[uri.Scheme]
if !ok {
return nil, fmt.Errorf("unknown address scheme %q", uri.Scheme)
}
if !dialerFactory.Enabled(cfg) {
return nil, errDisabled
}
return dialerFactory, nil
}
func (s *Service) getListenerFactory(cfg config.Configuration, uri *url.URL) (listenerFactory, error) {
listenerFactory, ok := listeners[uri.Scheme]
if !ok {
return nil, fmt.Errorf("unknown address scheme %q", uri.Scheme)
}
if !listenerFactory.Enabled(cfg) {
return nil, errDisabled
}
return listenerFactory, nil
}
func exchangeHello(c net.Conn, h protocol.HelloMessage) (protocol.HelloMessage, error) { func exchangeHello(c net.Conn, h protocol.HelloMessage) (protocol.HelloMessage, error) {
if err := c.SetDeadline(time.Now().Add(2 * time.Second)); err != nil { if err := c.SetDeadline(time.Now().Add(2 * time.Second)); err != nil {
return protocol.HelloMessage{}, err return protocol.HelloMessage{}, err
+3 -7
View File
@@ -31,19 +31,16 @@ type Connection struct {
type dialerFactory interface { type dialerFactory interface {
New(*config.Wrapper, *tls.Config) genericDialer New(*config.Wrapper, *tls.Config) genericDialer
Priority() int Priority() int
Enabled(config.Configuration) bool
String() string
} }
type genericDialer interface { type genericDialer interface {
Dial(protocol.DeviceID, *url.URL) (IntermediateConnection, error) Dial(protocol.DeviceID, *url.URL) (IntermediateConnection, error)
Priority() int
RedialFrequency() time.Duration RedialFrequency() time.Duration
String() string
} }
type listenerFactory interface { type listenerFactory func(*url.URL, *tls.Config, chan IntermediateConnection, *nat.Service) genericListener
New(*url.URL, *config.Wrapper, *tls.Config, chan IntermediateConnection, *nat.Service) genericListener
Enabled(config.Configuration) bool
}
type genericListener interface { type genericListener interface {
Serve() Serve()
@@ -61,7 +58,6 @@ type genericListener interface {
Error() error Error() error
OnAddressesChanged(func(genericListener)) OnAddressesChanged(func(genericListener))
String() string String() string
Factory() listenerFactory
} }
type Model interface { type Model interface {
+17 -11
View File
@@ -8,6 +8,7 @@ package connections
import ( import (
"crypto/tls" "crypto/tls"
"net"
"net/url" "net/url"
"time" "time"
@@ -19,9 +20,8 @@ import (
const tcpPriority = 10 const tcpPriority = 10
func init() { func init() {
factory := &tcpDialerFactory{}
for _, scheme := range []string{"tcp", "tcp4", "tcp6"} { for _, scheme := range []string{"tcp", "tcp4", "tcp6"} {
dialers[scheme] = factory dialers[scheme] = tcpDialerFactory{}
} }
} }
@@ -33,7 +33,13 @@ type tcpDialer struct {
func (d *tcpDialer) Dial(id protocol.DeviceID, uri *url.URL) (IntermediateConnection, error) { func (d *tcpDialer) Dial(id protocol.DeviceID, uri *url.URL) (IntermediateConnection, error) {
uri = fixupPort(uri) uri = fixupPort(uri)
conn, err := dialer.DialTimeout(uri.Scheme, uri.Host, 10*time.Second) raddr, err := net.ResolveTCPAddr(uri.Scheme, uri.Host)
if err != nil {
l.Debugln(err)
return IntermediateConnection{}, err
}
conn, err := dialer.DialTimeout(raddr.Network(), raddr.String(), 10*time.Second)
if err != nil { if err != nil {
l.Debugln(err) l.Debugln(err)
return IntermediateConnection{}, err return IntermediateConnection{}, err
@@ -49,10 +55,18 @@ func (d *tcpDialer) Dial(id protocol.DeviceID, uri *url.URL) (IntermediateConnec
return IntermediateConnection{tc, "TCP (Client)", tcpPriority}, nil return IntermediateConnection{tc, "TCP (Client)", tcpPriority}, nil
} }
func (tcpDialer) Priority() int {
return tcpPriority
}
func (d *tcpDialer) RedialFrequency() time.Duration { func (d *tcpDialer) RedialFrequency() time.Duration {
return time.Duration(d.cfg.Options().ReconnectIntervalS) * time.Second return time.Duration(d.cfg.Options().ReconnectIntervalS) * time.Second
} }
func (d *tcpDialer) String() string {
return "TCP Dialer"
}
type tcpDialerFactory struct{} type tcpDialerFactory struct{}
func (tcpDialerFactory) New(cfg *config.Wrapper, tlsCfg *tls.Config) genericDialer { func (tcpDialerFactory) New(cfg *config.Wrapper, tlsCfg *tls.Config) genericDialer {
@@ -65,11 +79,3 @@ func (tcpDialerFactory) New(cfg *config.Wrapper, tlsCfg *tls.Config) genericDial
func (tcpDialerFactory) Priority() int { func (tcpDialerFactory) Priority() int {
return tcpPriority return tcpPriority
} }
func (tcpDialerFactory) Enabled(cfg config.Configuration) bool {
return true
}
func (tcpDialerFactory) String() string {
return "TCP Dialer"
}
+7 -24
View File
@@ -14,26 +14,23 @@ import (
"sync" "sync"
"time" "time"
"github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/dialer" "github.com/syncthing/syncthing/lib/dialer"
"github.com/syncthing/syncthing/lib/nat" "github.com/syncthing/syncthing/lib/nat"
) )
func init() { func init() {
factory := &tcpListenerFactory{}
for _, scheme := range []string{"tcp", "tcp4", "tcp6"} { for _, scheme := range []string{"tcp", "tcp4", "tcp6"} {
listeners[scheme] = factory listeners[scheme] = newTCPListener
} }
} }
type tcpListener struct { type tcpListener struct {
onAddressesChangedNotifier onAddressesChangedNotifier
uri *url.URL uri *url.URL
tlsCfg *tls.Config tlsCfg *tls.Config
stop chan struct{} stop chan struct{}
conns chan IntermediateConnection conns chan IntermediateConnection
factory listenerFactory
natService *nat.Service natService *nat.Service
mapping *nat.Mapping mapping *nat.Mapping
@@ -66,9 +63,6 @@ func (t *tcpListener) Serve() {
} }
defer listener.Close() defer listener.Close()
l.Infof("TCP listener (%v) starting", listener.Addr())
defer l.Infof("TCP listener (%v) shutting down", listener.Addr())
mapping := t.natService.NewMapping(nat.TCP, tcaddr.IP, tcaddr.Port) mapping := t.natService.NewMapping(nat.TCP, tcaddr.IP, tcaddr.Port)
mapping.OnChanged(func(_ *nat.Mapping, _, _ []nat.Address) { mapping.OnChanged(func(_ *nat.Mapping, _, _ []nat.Address) {
t.notifyAddressesChanged(t) t.notifyAddressesChanged(t)
@@ -158,34 +152,23 @@ func (t *tcpListener) String() string {
return t.uri.String() return t.uri.String()
} }
func (t *tcpListener) Factory() listenerFactory { func newTCPListener(uri *url.URL, tlsCfg *tls.Config, conns chan IntermediateConnection, natService *nat.Service) genericListener {
return t.factory
}
type tcpListenerFactory struct{}
func (f *tcpListenerFactory) New(uri *url.URL, cfg *config.Wrapper, tlsCfg *tls.Config, conns chan IntermediateConnection, natService *nat.Service) genericListener {
return &tcpListener{ return &tcpListener{
uri: fixupPort(uri), uri: fixupPort(uri),
tlsCfg: tlsCfg, tlsCfg: tlsCfg,
conns: conns, conns: conns,
natService: natService, natService: natService,
stop: make(chan struct{}), stop: make(chan struct{}),
factory: f,
} }
} }
func (tcpListenerFactory) Enabled(cfg config.Configuration) bool {
return true
}
func fixupPort(uri *url.URL) *url.URL { func fixupPort(uri *url.URL) *url.URL {
copyURI := *uri copyURI := *uri
host, port, err := net.SplitHostPort(uri.Host) host, port, err := net.SplitHostPort(uri.Host)
if err != nil && strings.HasPrefix(err.Error(), "missing port") { if err != nil && strings.HasPrefix(err.Error(), "missing port") {
// addr is on the form "1.2.3.4" // addr is on the form "1.2.3.4"
copyURI.Host = net.JoinHostPort(uri.Host, "22000") copyURI.Host = net.JoinHostPort(host, "22000")
} else if err == nil && port == "" { } else if err == nil && port == "" {
// addr is on the form "1.2.3.4:" // addr is on the form "1.2.3.4:"
copyURI.Host = net.JoinHostPort(host, "22000") copyURI.Host = net.JoinHostPort(host, "22000")
-3
View File
@@ -27,7 +27,6 @@ const (
DeviceRejected DeviceRejected
DevicePaused DevicePaused
DeviceResumed DeviceResumed
LocalChangeDetected
LocalIndexUpdated LocalIndexUpdated
RemoteIndexUpdated RemoteIndexUpdated
ItemStarted ItemStarted
@@ -62,8 +61,6 @@ func (t EventType) String() string {
return "DeviceDisconnected" return "DeviceDisconnected"
case DeviceRejected: case DeviceRejected:
return "DeviceRejected" return "DeviceRejected"
case LocalChangeDetected:
return "LocalChangeDetected"
case LocalIndexUpdated: case LocalIndexUpdated:
return "LocalIndexUpdated" return "LocalIndexUpdated"
case RemoteIndexUpdated: case RemoteIndexUpdated:
+6 -60
View File
@@ -1234,21 +1234,6 @@ func sendIndexTo(initial bool, minLocalVer int64, conn protocol.Connection, fold
return maxLocalVer, err return maxLocalVer, err
} }
func (m *Model) updateLocalsFromScanning(folder string, fs []protocol.FileInfo) {
m.updateLocals(folder, fs)
// Fire the LocalChangeDetected event to notify listeners about local
// updates.
m.fmut.RLock()
path := m.folderCfgs[folder].Path()
m.fmut.RUnlock()
m.localChangeDetected(folder, path, fs)
}
func (m *Model) updateLocalsFromPulling(folder string, fs []protocol.FileInfo) {
m.updateLocals(folder, fs)
}
func (m *Model) updateLocals(folder string, fs []protocol.FileInfo) { func (m *Model) updateLocals(folder string, fs []protocol.FileInfo) {
m.fmut.RLock() m.fmut.RLock()
files := m.folderFiles[folder] files := m.folderFiles[folder]
@@ -1272,44 +1257,6 @@ func (m *Model) updateLocals(folder string, fs []protocol.FileInfo) {
}) })
} }
func (m *Model) localChangeDetected(folder, path string, files []protocol.FileInfo) {
// For windows paths, strip unwanted chars from the front
path = strings.Replace(path, `\\?\`, "", 1)
for _, file := range files {
objType := "file"
action := "modified"
// If our local vector is verison 1 AND it is the only version vector so far seen for this file then
// it is a new file. Else if it is > 1 it's not new, and if it is 1 but another shortId version vector
// exists then it is new for us but created elsewhere so the file is still not new but modified by us.
// Only if it is truly new do we change this to 'added', else we leave it as 'modified'.
if len(file.Version) == 1 && file.Version[0].Value == 1 {
action = "added"
}
if file.IsDirectory() {
objType = "dir"
}
if file.IsDeleted() {
action = "deleted"
}
// If the file is a level or more deep then the forward slash seperator is embedded
// in the filename and makes the path look wierd on windows, so lets fix it
filename := filepath.FromSlash(file.Name)
// And append it to the filepath
path := filepath.Join(path, filename)
events.Default.Log(events.LocalChangeDetected, map[string]string{
"folder": folder,
"action": action,
"type": objType,
"path": path,
})
}
}
func (m *Model) requestGlobal(deviceID protocol.DeviceID, folder, name string, offset int64, size int, hash []byte, fromTemporary bool) ([]byte, error) { func (m *Model) requestGlobal(deviceID protocol.DeviceID, folder, name string, offset int64, size int, hash []byte, fromTemporary bool) ([]byte, error) {
m.pmut.RLock() m.pmut.RLock()
nc, ok := m.conn[deviceID] nc, ok := m.conn[deviceID]
@@ -1497,7 +1444,7 @@ func (m *Model) internalScanFolderSubdirs(folder string, subs []string) error {
l.Infof("Stopping folder %s mid-scan due to folder error: %s", folder, err) l.Infof("Stopping folder %s mid-scan due to folder error: %s", folder, err)
return err return err
} }
m.updateLocalsFromScanning(folder, batch) m.updateLocals(folder, batch)
batch = batch[:0] batch = batch[:0]
blocksHandled = 0 blocksHandled = 0
} }
@@ -1509,7 +1456,7 @@ func (m *Model) internalScanFolderSubdirs(folder string, subs []string) error {
l.Infof("Stopping folder %s mid-scan due to folder error: %s", folder, err) l.Infof("Stopping folder %s mid-scan due to folder error: %s", folder, err)
return err return err
} else if len(batch) > 0 { } else if len(batch) > 0 {
m.updateLocalsFromScanning(folder, batch) m.updateLocals(folder, batch)
} }
if len(subs) == 0 { if len(subs) == 0 {
@@ -1531,7 +1478,7 @@ func (m *Model) internalScanFolderSubdirs(folder string, subs []string) error {
iterError = err iterError = err
return false return false
} }
m.updateLocalsFromScanning(folder, batch) m.updateLocals(folder, batch)
batch = batch[:0] batch = batch[:0]
} }
@@ -1583,7 +1530,7 @@ func (m *Model) internalScanFolderSubdirs(folder string, subs []string) error {
l.Infof("Stopping folder %s mid-scan due to folder error: %s", folder, err) l.Infof("Stopping folder %s mid-scan due to folder error: %s", folder, err)
return err return err
} else if len(batch) > 0 { } else if len(batch) > 0 {
m.updateLocalsFromScanning(folder, batch) m.updateLocals(folder, batch)
} }
runner.setState(FolderIdle) runner.setState(FolderIdle)
@@ -1711,7 +1658,7 @@ func (m *Model) Override(folder string) {
fs.WithNeed(protocol.LocalDeviceID, func(fi db.FileIntf) bool { fs.WithNeed(protocol.LocalDeviceID, func(fi db.FileIntf) bool {
need := fi.(protocol.FileInfo) need := fi.(protocol.FileInfo)
if len(batch) == indexBatchSize { if len(batch) == indexBatchSize {
m.updateLocalsFromScanning(folder, batch) m.updateLocals(folder, batch)
batch = batch[:0] batch = batch[:0]
} }
@@ -1731,7 +1678,7 @@ func (m *Model) Override(folder string) {
return true return true
}) })
if len(batch) > 0 { if len(batch) > 0 {
m.updateLocalsFromScanning(folder, batch) m.updateLocals(folder, batch)
} }
runner.setState(FolderIdle) runner.setState(FolderIdle)
} }
@@ -2071,7 +2018,6 @@ func (m *Model) CommitConfiguration(from, to config.Configuration) bool {
from.Options.URAccepted = to.Options.URAccepted from.Options.URAccepted = to.Options.URAccepted
from.Options.URUniqueID = to.Options.URUniqueID from.Options.URUniqueID = to.Options.URUniqueID
from.Options.ListenAddresses = to.Options.ListenAddresses from.Options.ListenAddresses = to.Options.ListenAddresses
from.Options.RelaysEnabled = to.Options.RelaysEnabled
// All of the other generic options require restart. Or at least they may; // All of the other generic options require restart. Or at least they may;
// removing this check requires going through those options carefully and // removing this check requires going through those options carefully and
// making sure there are individual services that handle them correctly. // making sure there are individual services that handle them correctly.
+1 -3
View File
@@ -1398,9 +1398,7 @@ func (f *rwFolder) dbUpdaterRoutine() {
lastFile = job.file lastFile = job.file
} }
// All updates to file/folder objects that originated remotely f.model.updateLocals(f.folderID, files)
// (across the network) use this call to updateLocals
f.model.updateLocalsFromPulling(f.folderID, files)
if found { if found {
f.model.receivedFile(f.folderID, lastFile) f.model.receivedFile(f.folderID, lastFile)
+3 -3
View File
@@ -62,7 +62,7 @@ func setUpModel(file protocol.FileInfo) *Model {
model := NewModel(defaultConfig, protocol.LocalDeviceID, "device", "syncthing", "dev", db, nil) model := NewModel(defaultConfig, protocol.LocalDeviceID, "device", "syncthing", "dev", db, nil)
model.AddFolder(defaultFolderConfig) model.AddFolder(defaultFolderConfig)
// Update index // Update index
model.updateLocalsFromScanning("default", []protocol.FileInfo{file}) model.updateLocals("default", []protocol.FileInfo{file})
return model return model
} }
@@ -255,7 +255,7 @@ func TestCopierCleanup(t *testing.T) {
file.Blocks = []protocol.BlockInfo{blocks[1]} file.Blocks = []protocol.BlockInfo{blocks[1]}
file.Version = file.Version.Update(protocol.LocalDeviceID.Short()) file.Version = file.Version.Update(protocol.LocalDeviceID.Short())
// Update index (removing old blocks) // Update index (removing old blocks)
m.updateLocalsFromScanning("default", []protocol.FileInfo{file}) m.updateLocals("default", []protocol.FileInfo{file})
if m.finder.Iterate(folders, blocks[0].Hash, iterFn) { if m.finder.Iterate(folders, blocks[0].Hash, iterFn) {
t.Error("Unexpected block found") t.Error("Unexpected block found")
@@ -268,7 +268,7 @@ func TestCopierCleanup(t *testing.T) {
file.Blocks = []protocol.BlockInfo{blocks[0]} file.Blocks = []protocol.BlockInfo{blocks[0]}
file.Version = file.Version.Update(protocol.LocalDeviceID.Short()) file.Version = file.Version.Update(protocol.LocalDeviceID.Short())
// Update index (removing old blocks) // Update index (removing old blocks)
m.updateLocalsFromScanning("default", []protocol.FileInfo{file}) m.updateLocals("default", []protocol.FileInfo{file})
if !m.finder.Iterate(folders, blocks[0].Hash, iterFn) { if !m.finder.Iterate(folders, blocks[0].Hash, iterFn) {
t.Error("Unexpected block found") t.Error("Unexpected block found")
+3 -27
View File
@@ -1,31 +1,7 @@
// Copyright 2009 The Go Authors. All rights reserved. // Copyright 2009 The Go Authors. All rights reserved.
// // Use of this source code is governed by a BSD-style
// Redistribution and use in source and binary forms, with or without // license that can be found in the LICENSE file.
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// Modified by Zillode to fix https://github.com/syncthing/syncthing/issues/1822 // Modified by Zillode to fix https://github.com/syncthing/syncthing/issues/1822
// Sync with https://github.com/golang/go/blob/master/src/os/path.go // Sync with https://github.com/golang/go/blob/master/src/os/path.go
// See https://github.com/golang/go/issues/10900 // See https://github.com/golang/go/issues/10900
+1 -1
View File
@@ -98,7 +98,7 @@ func (v Vector) GreaterEqual(b Vector) bool {
return comp == Greater || comp == Equal return comp == Greater || comp == Equal
} }
// Concurrent returns true when the two vectors are concurrent. // Concurrent returns true when the two vectors are concrurrent.
func (v Vector) Concurrent(b Vector) bool { func (v Vector) Concurrent(b Vector) bool {
comp := v.Compare(b) comp := v.Compare(b)
return comp == ConcurrentGreater || comp == ConcurrentLesser return comp == ConcurrentGreater || comp == ConcurrentLesser
+1 -2
View File
@@ -89,8 +89,7 @@ func (c *staticClient) Serve() {
return return
} }
l.Infof("Joined relay %s://%s", c.uri.Scheme, c.uri.Host) l.Infoln("Joined relay", c.uri)
defer l.Infof("Disconnected from relay %s://%s", c.uri.Scheme, c.uri.Host)
c.mut.Lock() c.mut.Lock()
c.connected = true c.connected = true
+5 -1
View File
@@ -180,7 +180,11 @@ func upgradeToURL(archiveName, binary string, url string) error {
if err != nil { if err != nil {
return err return err
} }
return os.Rename(fname, binary) err = os.Rename(fname, binary)
if err != nil {
return err
}
return nil
} }
func readRelease(archiveName, dir, url string) (string, error) { func readRelease(archiveName, dir, url string) (string, error) {
+4 -27
View File
@@ -1,34 +1,11 @@
// Copyright (C) 2016 The Syncthing Authors. // Copyright (C) 2016 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 http://mozilla.org/MPL/2.0/.
// Adapted from https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/IGD.go // Adapted from https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/IGD.go
// Copyright (c) 2010 Jack Palevich (https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/LICENSE) // Copyright (c) 2010 Jack Palevich (https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/LICENSE)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
package upnp package upnp
+10 -28
View File
@@ -1,34 +1,11 @@
// Copyright (C) 2016 The Syncthing Authors. // Copyright (C) 2016 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 http://mozilla.org/MPL/2.0/.
// Adapted from https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/IGD.go // Adapted from https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/IGD.go
// Copyright (c) 2010 Jack Palevich (https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/LICENSE) // Copyright (c) 2010 Jack Palevich (https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/LICENSE)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
package upnp package upnp
@@ -87,7 +64,12 @@ func (s *IGDService) DeletePortMapping(protocol nat.Protocol, externalPort int)
body := fmt.Sprintf(tpl, s.URN, externalPort, protocol) body := fmt.Sprintf(tpl, s.URN, externalPort, protocol)
_, err := soapRequest(s.URL, s.URN, "DeletePortMapping", body) _, err := soapRequest(s.URL, s.URN, "DeletePortMapping", body)
return err
if err != nil {
return err
}
return nil
} }
// GetExternalIPAddress queries the IGD service for its external IP address. // GetExternalIPAddress queries the IGD service for its external IP address.
+4 -26
View File
@@ -1,33 +1,11 @@
// Copyright (C) 2014 The Syncthing Authors. // Copyright (C) 2014 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 http://mozilla.org/MPL/2.0/.
// Adapted from https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/IGD.go // Adapted from https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/IGD.go
// Copyright (c) 2010 Jack Palevich (https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/LICENSE) // Copyright (c) 2010 Jack Palevich (https://github.com/jackpal/Taipei-Torrent/blob/dd88a8bfac6431c01d959ce3c745e74b8a911793/LICENSE)
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are
// met:
//
// * Redistributions of source code must retain the above copyright
// notice, this list of conditions and the following disclaimer.
// * Redistributions in binary form must reproduce the above
// copyright notice, this list of conditions and the following disclaimer
// in the documentation and/or other materials provided with the
// distribution.
// * Neither the name of Google Inc. nor the names of its
// contributors may be used to endorse or promote products derived from
// this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
// Package upnp implements UPnP InternetGatewayDevice discovery, querying, and port mapping. // Package upnp implements UPnP InternetGatewayDevice discovery, querying, and port mapping.
package upnp package upnp
+3 -3
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-BEP" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-BEP" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-bep \- Block Exchange Protocol v1 syncthing-bep \- Block Exchange Protocol v1
. .
@@ -232,7 +232,7 @@ For C=1:
The Length field contains the length, in bytes, of the compressed The Length field contains the length, in bytes, of the compressed
message data plus a four byte uncompressed length field. message data plus a four byte uncompressed length field.
.IP \(bu 2 .IP \(bu 2
The compressed message data is preceded by a 32 bit field denoting The compressed message data is preceeded by a 32 bit field denoting
the length of the uncompressed message. the length of the uncompressed message.
.IP \(bu 2 .IP \(bu 2
The message data is compressed using the LZ4 format and algorithm The message data is compressed using the LZ4 format and algorithm
@@ -1149,7 +1149,7 @@ is no longer available, therefore the list of block indexes should be truncated.
Messages with \fBForget\fP bit set MUST NOT have any block indexes. Messages with \fBForget\fP bit set MUST NOT have any block indexes.
.sp .sp
Any update message which is being sent for a different \fBVersion\fP of the same Any update message which is being sent for a different \fBVersion\fP of the same
file name must be preceded with an update message for the old version of that file name must be preceeded with an update message for the old version of that
file with the \fBForget\fP bit set. file with the \fBForget\fP bit set.
.sp .sp
As a safeguard on the receiving side, value of \fBVersion\fP changing between As a safeguard on the receiving side, value of \fBVersion\fP changing between
+51 -125
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-CONFIG" "5" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-CONFIG" "5" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-config \- Syncthing Configuration syncthing-config \- Syncthing Configuration
. .
@@ -81,8 +81,8 @@ The following shows the default configuration file:
.sp .sp
.nf .nf
.ft C .ft C
<configuration version="14"> <configuration version="12">
<folder id="zj2AA\-q55a7" label="Default Folder (zj2AA\-q55a7)" path="/Users/jb/Sync/" type="readwrite" rescanIntervalS="60" ignorePerms="false" autoNormalize="true"> <folder id="default" path="/Users/jb/Sync/" ro="false" rescanIntervalS="60" ignorePerms="false" autoNormalize="true">
<device id="3LT2GA5\-CQI4XJM\-WTZ264P\-MLOGMHL\-MCRLDNT\-MZV4RD3\-KA745CL\-OGAERQZ"></device> <device id="3LT2GA5\-CQI4XJM\-WTZ264P\-MLOGMHL\-MCRLDNT\-MZV4RD3\-KA745CL\-OGAERQZ"></device>
<minDiskFreePct>1</minDiskFreePct> <minDiskFreePct>1</minDiskFreePct>
<versioning></versioning> <versioning></versioning>
@@ -94,35 +94,34 @@ The following shows the default configuration file:
<scanProgressIntervalS>0</scanProgressIntervalS> <scanProgressIntervalS>0</scanProgressIntervalS>
<pullerSleepS>0</pullerSleepS> <pullerSleepS>0</pullerSleepS>
<pullerPauseS>0</pullerPauseS> <pullerPauseS>0</pullerPauseS>
<maxConflicts>\-1</maxConflicts> <maxConflicts>0</maxConflicts>
<disableSparseFiles>false</disableSparseFiles>
<disableTempIndexes>false</disableTempIndexes>
</folder> </folder>
<device id="3LT2GA5\-CQI4XJM\-WTZ264P\-MLOGMHL\-MCRLDNT\-MZV4RD3\-KA745CL\-OGAERQZ" name="syno" compression="metadata" introducer="false"> <device id="3LT2GA5\-CQI4XJM\-WTZ264P\-MLOGMHL\-MCRLDNT\-MZV4RD3\-KA745CL\-OGAERQZ" name="syno" compression="metadata" introducer="false">
<address>dynamic</address> <address>dynamic</address>
</device> </device>
<gui enabled="true" tls="false"> <gui enabled="true" tls="false">
<address>127.0.0.1:8384</address> <address>127.0.0.1:52620</address>
<apikey>k1dnz1Dd0rzTBjjFFh7CXPnrF12C49B1</apikey> <apikey>k1dnz1Dd0rzTBjjFFh7CXPnrF12C49B1</apikey>
<theme>default</theme>
</gui> </gui>
<options> <options>
<listenAddress>default</listenAddress> <listenAddress>tcp://0.0.0.0:22000</listenAddress>
<globalAnnounceServer>default</globalAnnounceServer> <globalAnnounceServer>default</globalAnnounceServer>
<globalAnnounceEnabled>true</globalAnnounceEnabled> <globalAnnounceEnabled>true</globalAnnounceEnabled>
<localAnnounceEnabled>true</localAnnounceEnabled> <localAnnounceEnabled>true</localAnnounceEnabled>
<localAnnouncePort>21027</localAnnouncePort> <localAnnouncePort>21027</localAnnouncePort>
<localAnnounceMCAddr>[ff12::8384]:21027</localAnnounceMCAddr> <localAnnounceMCAddr>[ff12::8384]:21027</localAnnounceMCAddr>
<relayServer>dynamic+https://relays.syncthing.net/endpoint</relayServer>
<maxSendKbps>0</maxSendKbps> <maxSendKbps>0</maxSendKbps>
<maxRecvKbps>0</maxRecvKbps> <maxRecvKbps>0</maxRecvKbps>
<reconnectionIntervalS>60</reconnectionIntervalS> <reconnectionIntervalS>60</reconnectionIntervalS>
<relaysEnabled>true</relaysEnabled> <relaysEnabled>true</relaysEnabled>
<relayReconnectIntervalM>10</relayReconnectIntervalM> <relayReconnectIntervalM>10</relayReconnectIntervalM>
<relayWithoutGlobalAnn>false</relayWithoutGlobalAnn>
<startBrowser>true</startBrowser> <startBrowser>true</startBrowser>
<natEnabled>true</natEnabled> <upnpEnabled>true</upnpEnabled>
<natLeaseMinutes>60</natLeaseMinutes> <upnpLeaseMinutes>60</upnpLeaseMinutes>
<natRenewalMinutes>30</natRenewalMinutes> <upnpRenewalMinutes>30</upnpRenewalMinutes>
<natTimeoutSeconds>10</natTimeoutSeconds> <upnpTimeoutSeconds>10</upnpTimeoutSeconds>
<urAccepted>0</urAccepted> <urAccepted>0</urAccepted>
<urUniqueID></urUniqueID> <urUniqueID></urUniqueID>
<urURL>https://data.syncthing.net/newdata</urURL> <urURL>https://data.syncthing.net/newdata</urURL>
@@ -131,14 +130,13 @@ The following shows the default configuration file:
<restartOnWakeup>true</restartOnWakeup> <restartOnWakeup>true</restartOnWakeup>
<autoUpgradeIntervalH>12</autoUpgradeIntervalH> <autoUpgradeIntervalH>12</autoUpgradeIntervalH>
<keepTemporariesH>24</keepTemporariesH> <keepTemporariesH>24</keepTemporariesH>
<cacheIgnoredFiles>false</cacheIgnoredFiles> <cacheIgnoredFiles>true</cacheIgnoredFiles>
<progressUpdateIntervalS>5</progressUpdateIntervalS> <progressUpdateIntervalS>5</progressUpdateIntervalS>
<symlinksEnabled>true</symlinksEnabled> <symlinksEnabled>true</symlinksEnabled>
<limitBandwidthInLan>false</limitBandwidthInLan> <limitBandwidthInLan>false</limitBandwidthInLan>
<databaseBlockCacheMiB>0</databaseBlockCacheMiB>
<minHomeDiskFreePct>1</minHomeDiskFreePct> <minHomeDiskFreePct>1</minHomeDiskFreePct>
<releasesURL>https://api.github.com/repos/syncthing/syncthing/releases?per_page=30</releasesURL> <releasesURL>https://api.github.com/repos/syncthing/syncthing/releases?per_page=30</releasesURL>
<overwriteRemoteDeviceNamesOnConnect>false</overwriteRemoteDeviceNamesOnConnect>
<tempIndexMinBlocks>10</tempIndexMinBlocks>
</options> </options>
</configuration> </configuration>
.ft P .ft P
@@ -160,7 +158,7 @@ migration from previous formats.
.sp .sp
.nf .nf
.ft C .ft C
<folder id="zj2AA\-q55a7" label="Default Folder (zj2AA\-q55a7)" path="/Users/jb/Sync/" type="readwrite" rescanIntervalS="60" ignorePerms="false" autoNormalize="true" ro="false"> <folder id="default" path="/Users/jb/Sync/" ro="false" rescanIntervalS="60" ignorePerms="false" autoNormalize="true">
<device id="3LT2GA5\-CQI4XJM\-WTZ264P\-MLOGMHL\-MCRLDNT\-MZV4RD3\-KA745CL\-OGAERQZ"></device> <device id="3LT2GA5\-CQI4XJM\-WTZ264P\-MLOGMHL\-MCRLDNT\-MZV4RD3\-KA745CL\-OGAERQZ"></device>
<minDiskFreePct>1</minDiskFreePct> <minDiskFreePct>1</minDiskFreePct>
<versioning></versioning> <versioning></versioning>
@@ -172,9 +170,7 @@ migration from previous formats.
<scanProgressIntervalS>0</scanProgressIntervalS> <scanProgressIntervalS>0</scanProgressIntervalS>
<pullerSleepS>0</pullerSleepS> <pullerSleepS>0</pullerSleepS>
<pullerPauseS>0</pullerPauseS> <pullerPauseS>0</pullerPauseS>
<maxConflicts>\-1</maxConflicts> <maxConflicts>0</maxConflicts>
<disableSparseFiles>false</disableSparseFiles>
<disableTempIndexes>false</disableTempIndexes>
</folder> </folder>
.ft P .ft P
.fi .fi
@@ -189,25 +185,13 @@ element:
.B id .B id
The folder ID, must be unique. (mandatory) The folder ID, must be unique. (mandatory)
.TP .TP
.B label
The label of a folder is a human readable and descriptive local name.
Can be different on each device. (optional)
.TP
.B path .B path
The path to the directory where the folder is stored on this The path to the directory where the folder is stored on this
device; not sent to other devices. (mandatory) device; not sent to other devices. (mandatory)
.TP .TP
.B type .B ro
Controls how the folder is handled by Syncthing. Possible values are: True if the folder is read only (Master mode; will not be modified by
.INDENT 7.0 Syncthing) on this device.
.TP
.B readwrite
The folder is in default mode. Sending local and accepting remote changes.
.TP
.B readonly
The folder is in "master" mode \-\- it will not be modified by
syncthing on this device.
.UNINDENT
.TP .TP
.B rescanIntervalS .B rescanIntervalS
The rescan interval, in seconds. Can be set to zero to disable when external The rescan interval, in seconds. Can be set to zero to disable when external
@@ -290,16 +274,6 @@ what you\(aqre doing.
The maximum number of conflict copies to keep around for any given file. The maximum number of conflict copies to keep around for any given file.
The default, \-1, means an unlimited number. Setting this to zero disables The default, \-1, means an unlimited number. Setting this to zero disables
conflict copies altogether. conflict copies altogether.
.TP
.B disableSparseFiles
By default, blocks containing all zeroes are not written, causing files
to be sparse on filesystems that support the concept. When set to true,
sparse files will not be created.
.TP
.B disableTempIndexes
By default, devices exchange information about blocks available in
transfers that are still in progress. When set to true, such information
is not exchanged for this folder.
.UNINDENT .UNINDENT
.SH DEVICE ELEMENT .SH DEVICE ELEMENT
.INDENT 0.0 .INDENT 0.0
@@ -410,7 +384,6 @@ This optional element lists device IDs that have been specifically ignored. One
<gui enabled="true" tls="false"> <gui enabled="true" tls="false">
<address>127.0.0.1:8384</address> <address>127.0.0.1:8384</address>
<apikey>l7jSbCqPD95JYZ0g8vi4ZLAMg3ulnN1b</apikey> <apikey>l7jSbCqPD95JYZ0g8vi4ZLAMg3ulnN1b</apikey>
<theme>default</theme>
</gui> </gui>
.ft P .ft P
.fi .fi
@@ -429,9 +402,6 @@ If not \fBtrue\fP, the GUI and API will not be started.
If set to \fBtrue\fP, TLS (HTTPS) will be enforced. Non\-HTTPS requests will If set to \fBtrue\fP, TLS (HTTPS) will be enforced. Non\-HTTPS requests will
be redirected to HTTPS. When this is set to \fBfalse\fP, TLS connections are be redirected to HTTPS. When this is set to \fBfalse\fP, TLS connections are
still possible but it is not mandatory. still possible but it is not mandatory.
.TP
.B theme
The name of the theme to use.
.UNINDENT .UNINDENT
.sp .sp
The following child elements may be present: The following child elements may be present:
@@ -445,10 +415,16 @@ Allowed address formats are:
.B IPv4 address and port (\fB127.0.0.1:8384\fP) .B IPv4 address and port (\fB127.0.0.1:8384\fP)
The address and port is used as given. The address and port is used as given.
.TP .TP
.B IPv4 wildcard and port (\fBtcp4://0.0.0.0\fP, \fBtcp4://:8384\fP)
These are equivalent and will result in Syncthing listening on all interfaces via IPv4 only.
.TP
.B IPv6 address and port (\fB[::1]:8384\fP) .B IPv6 address and port (\fB[::1]:8384\fP)
The address and port is used as given. The address must be enclosed in The address and port is used as given. The address must be enclosed in
square brackets. square brackets.
.TP .TP
.B IPv6 wildcard and port (\fBtcp6://[::]:8384\fP, \fBtcp6://:8384\fP)
These are equivalent and will result in Syncthing listening on all interfaces via IPv6 only.
.TP
.B Wildcard and port (\fB0.0.0.0:12345\fP, \fB[::]:12345\fP, \fB:12345\fP) .B Wildcard and port (\fB0.0.0.0:12345\fP, \fB[::]:12345\fP, \fB:12345\fP)
These are equivalent and will result in Syncthing listening on all These are equivalent and will result in Syncthing listening on all
interfaces via both IPv4 and IPv6. interfaces via both IPv4 and IPv6.
@@ -470,22 +446,24 @@ If set, this is the API key that enables usage of the REST interface.
.nf .nf
.ft C .ft C
<options> <options>
<listenAddress>default</listenAddress> <listenAddress>tcp://0.0.0.0:22000</listenAddress>
<globalAnnounceServer>default</globalAnnounceServer> <globalAnnounceServer>default</globalAnnounceServer>
<globalAnnounceEnabled>true</globalAnnounceEnabled> <globalAnnounceEnabled>true</globalAnnounceEnabled>
<localAnnounceEnabled>true</localAnnounceEnabled> <localAnnounceEnabled>true</localAnnounceEnabled>
<localAnnouncePort>21027</localAnnouncePort> <localAnnouncePort>21027</localAnnouncePort>
<localAnnounceMCAddr>[ff12::8384]:21027</localAnnounceMCAddr> <localAnnounceMCAddr>[ff12::8384]:21027</localAnnounceMCAddr>
<relayServer>dynamic+https://relays.syncthing.net/endpoint</relayServer>
<maxSendKbps>0</maxSendKbps> <maxSendKbps>0</maxSendKbps>
<maxRecvKbps>0</maxRecvKbps> <maxRecvKbps>0</maxRecvKbps>
<reconnectionIntervalS>60</reconnectionIntervalS> <reconnectionIntervalS>60</reconnectionIntervalS>
<relaysEnabled>true</relaysEnabled> <relaysEnabled>true</relaysEnabled>
<relayReconnectIntervalM>10</relayReconnectIntervalM> <relayReconnectIntervalM>10</relayReconnectIntervalM>
<relayWithoutGlobalAnn>false</relayWithoutGlobalAnn>
<startBrowser>true</startBrowser> <startBrowser>true</startBrowser>
<natEnabled>true</natEnabled> <upnpEnabled>true</upnpEnabled>
<natLeaseMinutes>60</natLeaseMinutes> <upnpLeaseMinutes>60</upnpLeaseMinutes>
<natRenewalMinutes>30</natRenewalMinutes> <upnpRenewalMinutes>30</upnpRenewalMinutes>
<natTimeoutSeconds>10</natTimeoutSeconds> <upnpTimeoutSeconds>10</upnpTimeoutSeconds>
<urAccepted>0</urAccepted> <urAccepted>0</urAccepted>
<urUniqueID></urUniqueID> <urUniqueID></urUniqueID>
<urURL>https://data.syncthing.net/newdata</urURL> <urURL>https://data.syncthing.net/newdata</urURL>
@@ -494,14 +472,13 @@ If set, this is the API key that enables usage of the REST interface.
<restartOnWakeup>true</restartOnWakeup> <restartOnWakeup>true</restartOnWakeup>
<autoUpgradeIntervalH>12</autoUpgradeIntervalH> <autoUpgradeIntervalH>12</autoUpgradeIntervalH>
<keepTemporariesH>24</keepTemporariesH> <keepTemporariesH>24</keepTemporariesH>
<cacheIgnoredFiles>false</cacheIgnoredFiles> <cacheIgnoredFiles>true</cacheIgnoredFiles>
<progressUpdateIntervalS>5</progressUpdateIntervalS> <progressUpdateIntervalS>5</progressUpdateIntervalS>
<symlinksEnabled>true</symlinksEnabled> <symlinksEnabled>true</symlinksEnabled>
<limitBandwidthInLan>false</limitBandwidthInLan> <limitBandwidthInLan>false</limitBandwidthInLan>
<databaseBlockCacheMiB>0</databaseBlockCacheMiB>
<minHomeDiskFreePct>1</minHomeDiskFreePct> <minHomeDiskFreePct>1</minHomeDiskFreePct>
<releasesURL>https://api.github.com/repos/syncthing/syncthing/releases?per_page=30</releasesURL> <releasesURL>https://api.github.com/repos/syncthing/syncthing/releases?per_page=30</releasesURL>
<overwriteRemoteDeviceNamesOnConnect>false</overwriteRemoteDeviceNamesOnConnect>
<tempIndexMinBlocks>10</tempIndexMinBlocks>
</options> </options>
.ft P .ft P
.fi .fi
@@ -512,8 +489,10 @@ The \fBoptions\fP element contains all other global configuration options.
.INDENT 0.0 .INDENT 0.0
.TP .TP
.B listenAddress .B listenAddress
The listen address for incoming sync connections. See The listen address for incoming sync connections. See the \fBaddress\fP
\fI\%Listen Addresses\fP for allowed syntax. element under the \fI\%GUI Element\fP for allowed syntax, with the addition
that the address must have a protocol scheme prefix. Currently \fBtcp://\fP
is the only supported protocol scheme.
.TP .TP
.B globalAnnounceServer .B globalAnnounceServer
A URI to a global announce (discovery) server, or the word \fBdefault\fP to A URI to a global announce (discovery) server, or the word \fBdefault\fP to
@@ -560,20 +539,25 @@ When true, relays will be connected to and potentially used for device to device
.B relayReconnectIntervalM .B relayReconnectIntervalM
Sets the interval, in minutes, between relay reconnect attempts. Sets the interval, in minutes, between relay reconnect attempts.
.TP .TP
.B relayWithoutGlobalAnn
When set to true, relay connections will be attempted even when global
discovery is disabled. This is useful only in the case where devices are
known to be connected to the same relays. The default is \fBfalse\fP\&.
.TP
.B startBrowser .B startBrowser
Whether to attempt to start a browser to show the GUI when Syncthing starts. Whether to attempt to start a browser to show the GUI when Syncthing starts.
.TP .TP
.B natEnabled .B upnpEnabled
Whether to attempt to perform an UPnP and NAT\-PMP port mapping for Whether to attempt to perform an UPnP port mapping for incoming sync
incoming sync connections. connections.
.TP .TP
.B natLeaseMinutes .B upnpLeaseMinutes
Request a lease for this many minutes; zero to request a permanent lease. Request a lease for this many minutes; zero to request a permanent lease.
.TP .TP
.B natRenewalMinutes .B upnpRenewalMinutes
Attempt to renew the lease after this many minutes. Attempt to renew the lease after this many minutes.
.TP .TP
.B natTimeoutSeconds .B upnpTimeoutSeconds
When scanning for UPnP devices, wait this long for responses. When scanning for UPnP devices, wait this long for responses.
.TP .TP
.B urAccepted .B urAccepted
@@ -610,9 +594,8 @@ Keep temporary failed transfers for this many hours. While the temporaries
are kept, the data they contain need not be transferred again. are kept, the data they contain need not be transferred again.
.TP .TP
.B cacheIgnoredFiles .B cacheIgnoredFiles
Whether to cache the results of ignore pattern evaluation. Performance Whether to cache the results of ignore pattern evaluation. Performance at
at the price of memory. Defaults to \fBfalse\fP as the cost for evaluating the price of memory.
ignores is usually not significant.
.TP .TP
.B progressUpdateIntervalS .B progressUpdateIntervalS
How often in seconds the progress of ongoing downloads is made available to How often in seconds the progress of ongoing downloads is made available to
@@ -643,63 +626,6 @@ the configuration and index.
.TP .TP
.B releasesURL .B releasesURL
The URL from which release information is loaded, for automatic upgrades. The URL from which release information is loaded, for automatic upgrades.
.TP
.B overwriteRemoteDeviceNamesOnConnect
If set, device names will always be overwritten with the name given by
remote on each connection. By default, the name that the remote device
announces will only be adopted when a name has not already been set.
.TP
.B tempIndexMinBlocks
When exchanging index information for incomplete transfers, only take
into account files that have at least this many blocks.
.UNINDENT
.SS Listen Addresses
.sp
The following address types are accepted in sync protocol listen addresses:
.INDENT 0.0
.TP
.B TCP wildcard and port (\fBtcp://0.0.0.0:22000\fP, \fBtcp://:22000\fP)
These are equivalent and will result in Syncthing listening on all
interfaces, IPv4 and IPv6, on the specified port.
.TP
.B TCP IPv4 wildcard and port (\fBtcp4://0.0.0.0:22000\fP, \fBtcp4://:22000\fP)
These are equivalent and will result in Syncthing listening on all
interfaces via IPv4 only.
.TP
.B TCP IPv4 address and port (\fBtcp4://192.0.2.1:22000\fP)
These are equivalent and will result in Syncthing listening on the
specified address and port only.
.TP
.B TCP IPv6 wildcard and port (\fBtcp6://[::]:22000\fP, \fBtcp6://:22000\fP)
These are equivalent and will result in Syncthing listening on all
interfaces via IPv6 only.
.TP
.B TCP IPv6 address and port (\fBtcp6://[2001:db8::42]:22000\fP)
These are equivalent and will result in Syncthing listening on the
specified address and port only.
.TP
.B Static relay address (\fBrelay://192.0.2.42:22067?id=abcd123...\fP)
Syncthing will connect to and listen for incoming connections via the
specified relay address.
.INDENT 7.0
.INDENT 3.5
.SS Todo
.sp
Document available URL parameters.
.UNINDENT
.UNINDENT
.TP
.B Dynamic relay pool (\fBdynamic+https://192.0.2.42/relays\fP)
Syncthing will fetch the specified HTTPS URL, parse it for a JSON payload
describing relays, select a relay from the available ones and listen via
that as if specified as a static relay above.
.INDENT 7.0
.INDENT 3.5
.SS Todo
.sp
Document available URL parameters.
.UNINDENT
.UNINDENT
.UNINDENT .UNINDENT
.SH SYNCING CONFIGURATION FILES .SH SYNCING CONFIGURATION FILES
.sp .sp
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-DEVICE-IDS" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-DEVICE-IDS" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-device-ids \- Understanding Device IDs syncthing-device-ids \- Understanding Device IDs
. .
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-EVENT-API" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-EVENT-API" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-event-api \- Event API syncthing-event-api \- Event API
. .
+1 -10
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-FAQ" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-FAQ" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-faq \- Frequently Asked Questions syncthing-faq \- Frequently Asked Questions
. .
@@ -152,11 +152,6 @@ encrypted using AES\-128. When receiving data, it must be decrypted.
.IP 3. 3 .IP 3. 3
There is a certain amount of housekeeping that must be done to track the There is a certain amount of housekeeping that must be done to track the
current and available versions of each file in the index database. current and available versions of each file in the index database.
.IP 4. 3
By default Syncthing uses periodic scanning every 60 seconds to detect
file changes. This means checking every file\(aqs modification time and
comparing it to the database. This can cause spikes of CPU usage for large
folders.
.UNINDENT .UNINDENT
.sp .sp
Hashing, compression and encryption cost CPU time. Also, using the GUI Hashing, compression and encryption cost CPU time. Also, using the GUI
@@ -169,10 +164,6 @@ environment variable \fBGOMAXPROCS\fP to the maximum number of CPU cores
Syncthing should use at any given moment. For example, \fBGOMAXPROCS=2\fP on a Syncthing should use at any given moment. For example, \fBGOMAXPROCS=2\fP on a
machine with four cores will limit Syncthing to no more than half the machine with four cores will limit Syncthing to no more than half the
system\(aqs CPU power. system\(aqs CPU power.
.sp
To reduce CPU spikes from scanning activity, use a filesystem notifications
plugin. This is delivered by default via Synctrayzor, Syncthing\-GTK and on
Android. For other setups, consider using \fI\%syncthing\-inotify\fP <\fBhttps://github.com/syncthing/syncthing-inotify\fP>\&.
.SS Should I keep my device IDs secret? .SS Should I keep my device IDs secret?
.sp .sp
No. The IDs are not sensitive. Given a device ID it\(aqs possible to find the IP No. The IDs are not sensitive. Given a device ID it\(aqs possible to find the IP
+3 -3
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-GLOBALDISCO" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-GLOBALDISCO" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-globaldisco \- Global Discovery Protocol v3 syncthing-globaldisco \- Global Discovery Protocol v3
. .
@@ -67,7 +67,7 @@ certificate was presented, status \fB403\fP (Forbidden) is returned. If the
posted data doesn\(aqt conform to the expected format, \fB400\fP (Bad Request) is posted data doesn\(aqt conform to the expected format, \fB400\fP (Bad Request) is
returned. returned.
.sp .sp
In successful responses, the server may return a \fBReannounce\-After\fP header In successfull responses, the server may return a \fBReannounce\-After\fP header
containing the number of seconds after which the client should perform a new containing the number of seconds after which the client should perform a new
announcement. announcement.
.sp .sp
@@ -84,7 +84,7 @@ Queries are performed as HTTPS GET requests to the announce server URL. The
requested device ID is passed as the query parameter "device", in canonical requested device ID is passed as the query parameter "device", in canonical
string form, i.e. \fBhttps://announce.syncthing.net/?device=ABC12345\-....\fP string form, i.e. \fBhttps://announce.syncthing.net/?device=ABC12345\-....\fP
.sp .sp
Successful responses will have status code \fB200\fP (OK) and carry a JSON payload Successfull responses will have status code \fB200\fP (OK) and carry a JSON payload
of the same format as the announcement above. The response will not contain of the same format as the announcement above. The response will not contain
empty or unspecified addresses. empty or unspecified addresses.
.sp .sp
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-LOCALDISCO" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-LOCALDISCO" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-localdisco \- Local Discovery Protocol v3 syncthing-localdisco \- Local Discovery Protocol v3
. .
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-NETWORKING" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-NETWORKING" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-networking \- Firewall Setup syncthing-networking \- Firewall Setup
. .
+2 -2
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-RELAY" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-RELAY" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-relay \- Relay Protocol v1 syncthing-relay \- Relay Protocol v1
. .
@@ -337,7 +337,7 @@ _
.TE .TE
.SH MESSAGES .SH MESSAGES
.sp .sp
All messages are preceded by a header message. Header message contains the All messages are preceeded by a header message. Header message contains the
magic value 0x9E79BC40, message type integer, and message length. magic value 0x9E79BC40, message type integer, and message length.
.sp .sp
\fBWARNING:\fP \fBWARNING:\fP
+3 -29
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-REST-API" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-REST-API" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-rest-api \- REST API syncthing-rest-api \- REST API
. .
@@ -574,31 +574,8 @@ It takes one parameter, \fBfolder\fP, and either updates the content of
the \fB\&.stignore\fP echoing it back as a response, or returns an error. the \fB\&.stignore\fP echoing it back as a response, or returns an error.
.SS GET /rest/db/need .SS GET /rest/db/need
.sp .sp
Takes one mandatory parameter, \fBfolder\fP, and returns lists of files which are Takes one parameter, \fBfolder\fP, and returns lists of files which are
needed by this device in order for it to become in sync. needed by this device in order for it to become in sync.
.sp
Furthermore takes an optional \fBpage\fP and \fBperpage\fP arguments for pagination.
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
.IP 1. 3
\fBprogress\fP has 15 items
.IP 2. 3
\fBqueued\fP has 3 items
.IP 3. 3
\fBrest\fP has 12 items
.UNINDENT
.sp
If you issue a query with \fBpage=1\fP and \fBperpage=10\fP, only the \fBprogress\fP
section in the response will have 10 items. If you issue a request query with
\fBpage=2\fP and \fBperpage=10\fP, \fBprogress\fP section will have the last 5 items,
\fBqueued\fP section will have all 3 items, and \fBrest\fP section will have first
2 items. If you issue a query for \fBpage=3\fP and \fBperpage=10\fP, you will only
have the last 10 items of the \fBrest\fP section.
.sp
In all these calls, \fBtotal\fP will be 30 to indicate the total number of
available items.
.INDENT 0.0 .INDENT 0.0
.INDENT 3.5 .INDENT 3.5
.sp .sp
@@ -626,10 +603,7 @@ available items.
# This happens when we start downloading files, and new files get added while we are downloading. # This happens when we start downloading files, and new files get added while we are downloading.
"rest": [ "rest": [
... ...
], ]
"page": 1,
"perpage": 100,
"total": 2000
} }
.ft P .ft P
.fi .fi
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-SECURITY" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-SECURITY" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-security \- Security Principles syncthing-security \- Security Principles
. .
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING-STIGNORE" "5" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING-STIGNORE" "5" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing-stignore \- Prevent files from being synchronized to other nodes syncthing-stignore \- Prevent files from being synchronized to other nodes
. .
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "TODO" "7" "May 21, 2016" "v0.12" "Syncthing" .TH "TODO" "7" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
Todo \- Keep automatic backups of deleted files by other nodes Todo \- Keep automatic backups of deleted files by other nodes
. .
+1 -1
View File
@@ -1,6 +1,6 @@
.\" Man page generated from reStructuredText. .\" Man page generated from reStructuredText.
. .
.TH "SYNCTHING" "1" "May 21, 2016" "v0.12" "Syncthing" .TH "SYNCTHING" "1" "May 01, 2016" "v0.12" "Syncthing"
.SH NAME .SH NAME
syncthing \- Syncthing syncthing \- Syncthing
. .
+13 -22
View File
@@ -1,5 +1,5 @@
<configuration version="14"> <configuration version="12">
<folder id="default" label="" path="s1/" type="readwrite" rescanIntervalS="10" ignorePerms="false" autoNormalize="true"> <folder id="default" path="s1/" ro="false" rescanIntervalS="10" ignorePerms="false" autoNormalize="true">
<device id="I6KAH76-66SLLLB-5PFXSOA-UFJCDZC-YAOMLEK-CP2GB32-BV5RQST-3PSROAU"></device> <device id="I6KAH76-66SLLLB-5PFXSOA-UFJCDZC-YAOMLEK-CP2GB32-BV5RQST-3PSROAU"></device>
<device id="MRIW7OK-NETT3M4-N6SBWME-N25O76W-YJKVXPH-FUMQJ3S-P57B74J-GBITBAC"></device> <device id="MRIW7OK-NETT3M4-N6SBWME-N25O76W-YJKVXPH-FUMQJ3S-P57B74J-GBITBAC"></device>
<device id="373HSRP-QLPNLIE-JYKZVQF-P4PKZ63-R2ZE6K3-YD442U2-JHBGBQG-WWXAHAU"></device> <device id="373HSRP-QLPNLIE-JYKZVQF-P4PKZ63-R2ZE6K3-YD442U2-JHBGBQG-WWXAHAU"></device>
@@ -15,10 +15,8 @@
<pullerSleepS>0</pullerSleepS> <pullerSleepS>0</pullerSleepS>
<pullerPauseS>0</pullerPauseS> <pullerPauseS>0</pullerPauseS>
<maxConflicts>-1</maxConflicts> <maxConflicts>-1</maxConflicts>
<disableSparseFiles>false</disableSparseFiles>
<disableTempIndexes>false</disableTempIndexes>
</folder> </folder>
<folder id="¯\_(ツ)_/¯ Räksmörgås 动作 Адрес" label="" path="s12-1/" type="readwrite" rescanIntervalS="10" ignorePerms="false" autoNormalize="true"> <folder id="¯\_(ツ)_/¯ Räksmörgås 动作 Адрес" path="s12-1/" ro="false" rescanIntervalS="10" ignorePerms="false" autoNormalize="true">
<device id="I6KAH76-66SLLLB-5PFXSOA-UFJCDZC-YAOMLEK-CP2GB32-BV5RQST-3PSROAU"></device> <device id="I6KAH76-66SLLLB-5PFXSOA-UFJCDZC-YAOMLEK-CP2GB32-BV5RQST-3PSROAU"></device>
<device id="MRIW7OK-NETT3M4-N6SBWME-N25O76W-YJKVXPH-FUMQJ3S-P57B74J-GBITBAC"></device> <device id="MRIW7OK-NETT3M4-N6SBWME-N25O76W-YJKVXPH-FUMQJ3S-P57B74J-GBITBAC"></device>
<minDiskFreePct>1</minDiskFreePct> <minDiskFreePct>1</minDiskFreePct>
@@ -32,8 +30,6 @@
<pullerSleepS>0</pullerSleepS> <pullerSleepS>0</pullerSleepS>
<pullerPauseS>0</pullerPauseS> <pullerPauseS>0</pullerPauseS>
<maxConflicts>-1</maxConflicts> <maxConflicts>-1</maxConflicts>
<disableSparseFiles>false</disableSparseFiles>
<disableTempIndexes>false</disableTempIndexes>
</folder> </folder>
<device id="EJHMPAQ-OGCVORE-ISB4IS3-SYYVJXF-TKJGLTU-66DIQPF-GJ5D2GX-GQ3OWQK" name="s4" compression="metadata" introducer="false"> <device id="EJHMPAQ-OGCVORE-ISB4IS3-SYYVJXF-TKJGLTU-66DIQPF-GJ5D2GX-GQ3OWQK" name="s4" compression="metadata" introducer="false">
<address>tcp://127.0.0.1:22004</address> <address>tcp://127.0.0.1:22004</address>
@@ -55,25 +51,26 @@
<user>testuser</user> <user>testuser</user>
<password>$2a$10$7tKL5uvLDGn5s2VLPM2yWOK/II45az0mTel8hxAUJDRQN1Tk2QYwu</password> <password>$2a$10$7tKL5uvLDGn5s2VLPM2yWOK/II45az0mTel8hxAUJDRQN1Tk2QYwu</password>
<apikey>abc123</apikey> <apikey>abc123</apikey>
<theme>default</theme>
</gui> </gui>
<options> <options>
<listenAddress>tcp://127.0.0.1:22001</listenAddress> <listenAddress>tcp://127.0.0.1:22001</listenAddress>
<listenAddress>dynamic+https://relays.syncthing.net/endpoint</listenAddress>
<globalAnnounceServer>default</globalAnnounceServer> <globalAnnounceServer>default</globalAnnounceServer>
<globalAnnounceEnabled>false</globalAnnounceEnabled> <globalAnnounceEnabled>false</globalAnnounceEnabled>
<localAnnounceEnabled>true</localAnnounceEnabled> <localAnnounceEnabled>true</localAnnounceEnabled>
<localAnnouncePort>21027</localAnnouncePort> <localAnnouncePort>21027</localAnnouncePort>
<localAnnounceMCAddr>[ff12::8384]:21027</localAnnounceMCAddr> <localAnnounceMCAddr>[ff12::8384]:21027</localAnnounceMCAddr>
<relayServer>dynamic+https://relays.syncthing.net/endpoint</relayServer>
<maxSendKbps>0</maxSendKbps> <maxSendKbps>0</maxSendKbps>
<maxRecvKbps>0</maxRecvKbps> <maxRecvKbps>0</maxRecvKbps>
<reconnectionIntervalS>5</reconnectionIntervalS> <reconnectionIntervalS>5</reconnectionIntervalS>
<relaysEnabled>true</relaysEnabled>
<relayReconnectIntervalM>10</relayReconnectIntervalM> <relayReconnectIntervalM>10</relayReconnectIntervalM>
<relayWithoutGlobalAnn>false</relayWithoutGlobalAnn>
<startBrowser>false</startBrowser> <startBrowser>false</startBrowser>
<natEnabled>true</natEnabled> <upnpEnabled>true</upnpEnabled>
<natLeaseMinutes>0</natLeaseMinutes> <upnpLeaseMinutes>0</upnpLeaseMinutes>
<natRenewalMinutes>30</natRenewalMinutes> <upnpRenewalMinutes>30</upnpRenewalMinutes>
<natTimeoutSeconds>10</natTimeoutSeconds> <upnpTimeoutSeconds>10</upnpTimeoutSeconds>
<urAccepted>-1</urAccepted> <urAccepted>-1</urAccepted>
<urUniqueID></urUniqueID> <urUniqueID></urUniqueID>
<urURL>https://data.syncthing.net/newdata</urURL> <urURL>https://data.syncthing.net/newdata</urURL>
@@ -82,18 +79,12 @@
<restartOnWakeup>true</restartOnWakeup> <restartOnWakeup>true</restartOnWakeup>
<autoUpgradeIntervalH>12</autoUpgradeIntervalH> <autoUpgradeIntervalH>12</autoUpgradeIntervalH>
<keepTemporariesH>24</keepTemporariesH> <keepTemporariesH>24</keepTemporariesH>
<cacheIgnoredFiles>false</cacheIgnoredFiles> <cacheIgnoredFiles>true</cacheIgnoredFiles>
<progressUpdateIntervalS>5</progressUpdateIntervalS> <progressUpdateIntervalS>5</progressUpdateIntervalS>
<symlinksEnabled>true</symlinksEnabled> <symlinksEnabled>true</symlinksEnabled>
<limitBandwidthInLan>false</limitBandwidthInLan> <limitBandwidthInLan>false</limitBandwidthInLan>
<databaseBlockCacheMiB>0</databaseBlockCacheMiB>
<minHomeDiskFreePct>1</minHomeDiskFreePct> <minHomeDiskFreePct>1</minHomeDiskFreePct>
<releasesURL>https://upgrades.syncthing.net/meta.json</releasesURL> <releasesURL>https://api.github.com/repos/syncthing/syncthing/releases?per_page=30</releasesURL>
<overwriteRemoteDeviceNamesOnConnect>false</overwriteRemoteDeviceNamesOnConnect>
<tempIndexMinBlocks>10</tempIndexMinBlocks>
<upnpEnabled>true</upnpEnabled>
<upnpLeaseMinutes>0</upnpLeaseMinutes>
<upnpRenewalMinutes>30</upnpRenewalMinutes>
<upnpTimeoutSeconds>10</upnpTimeoutSeconds>
<relaysEnabled>false</relaysEnabled>
</options> </options>
</configuration> </configuration>
+4 -2
View File
@@ -1,9 +1,11 @@
package natpmp package natpmp
import "testing" import (
"testing"
)
func TestNatPMP(t *testing.T) { func TestNatPMP(t *testing.T) {
client, err := NewClientForDefaultGateway(0) client, err := NewClientForDefaultGateway()
if err != nil { if err != nil {
t.Errorf("NewClientForDefaultGateway() = %v,%v", client, err) t.Errorf("NewClientForDefaultGateway() = %v,%v", client, err)
return return
+1 -1
View File
@@ -4,7 +4,7 @@
{ {
"importpath": "github.com/AudriusButkevicius/go-nat-pmp", "importpath": "github.com/AudriusButkevicius/go-nat-pmp",
"repository": "https://github.com/AudriusButkevicius/go-nat-pmp", "repository": "https://github.com/AudriusButkevicius/go-nat-pmp",
"revision": "e9d7ecafd6f4cd4f59fc45bb9a47466ce637d0fe", "revision": "88a8019a0eff7e9db55f458230b867f0d7e5d48f",
"branch": "master" "branch": "master"
}, },
{ {