Compare commits

...

160 Commits

Author SHA1 Message Date
Jakob Borg c7f1d854bd wip
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-19 14:30:42 +02:00
Jakob Borg f877dfed4e wip
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-19 13:09:29 +02:00
Syncthing Release Automation 4ba01b05a1 chore(gui, man, authors): update docs, translations, and contributors 2026-05-18 05:06:12 +00:00
Jakob Borg 14c4ad3af2 build: remove environment annotations
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-12 15:44:51 +02:00
Jakob Borg 08036b1d87 build: be explicit about workflow permissions (#10690)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-12 15:36:20 +02:00
Jakob Borg c0c401efeb build: temporarily disable illumos for release
They let the domain/DNSSEC expire, I need the build to pass.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-12 07:59:47 +02:00
Jakob Borg 658ea62052 build: fix draft/published status for new releases
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-12 07:34:50 +02:00
Syncthing Release Automation 7435e762fb chore(gui, man, authors): update docs, translations, and contributors 2026-05-11 05:04:32 +00:00
Jakob Borg f6c551fe87 chore(fs): remove unused SymlinksSupported() method (#10684)
💀

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-09 10:48:53 +00:00
Umer-Azaz f3a9ee8ed6 chore(gui): upgrade jQuery to 3.7.1 to fix CVE-2020-11022, CVE-2020-11023, CVE-2015-9251 (#10673)
## Summary

- Replace vendored `jquery-2.2.2.js` with `jquery-3.7.1.js` in
`gui/default/vendor/jquery/`
- Update script reference in `gui/default/index.html` to point to the
new file
- Update CDN reference in `cmd/infra/strelaypoolsrv/gui/index.html` from
`jquery-2.1.4.min.js` to `jquery-3.7.1.min.js`

## Why

The previously used jQuery versions (2.2.2 and 2.1.4) are vulnerable to
three known CVEs:

| CVE | Description | Fixed in |
|-----|-------------|----------|
| CVE-2015-9251 | XSS via cross-domain Ajax requests with non-text
content types | jQuery 3.0.0 |
| CVE-2020-11022 | XSS when passing HTML containing `<option>` elements
to manipulation methods | jQuery 3.5.0 |
| CVE-2020-11023 | XSS via passing HTML from untrusted sources to
manipulation methods | jQuery 3.5.0 |

jQuery 3.7.1 is the latest stable release and resolves all three.

## Compatibility notes

The GUI code was audited for jQuery 2→3 breaking changes. No removed
APIs are used:
- `.success()` / `.error()` calls throughout the codebase are
**AngularJS `$http`** promise methods, not jQuery — unaffected
- `.bind('beforeunload', ...)` is deprecated in jQuery 3 but not removed
— still works
- No usage of `.size()`, `.load()` event shorthand, `jQuery.isFunction`,
or `$.type()`

---------

Signed-off-by: Umer Azaz <umer_azaz@yahoo.com>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-05-09 10:30:18 +00:00
Jakob Borg f538b47070 chore(model): slightly improve handling of pulling empty blocks (#10679)
In the common case (sparse files enabled, not reusing old data) we'd
optimise away pulling & writing zero blocks. However in the corner cases
we'd go through the whole processing of pulling the block over the
network which is of course entirely unnecessary.

Now, instead, always take an optimised path for all-zeroes blocks. In
the clean case we do nothing, otherwise we materialise a block of zeroes
and write it directly.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-09 12:15:18 +02:00
Jakob Borg 3709174a86 build(deps): update dependencies (#10683)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-09 06:49:34 +00:00
Jakob Borg 5dd22cfd85 Merge branch 'infrastructure'
* infrastructure:
  fix(stdiscosrv): do graceful shutdown on SIGTERM
2026-05-04 09:54:04 +02:00
Syncthing Release Automation cf5ea40b1a chore(gui, man, authors): update docs, translations, and contributors 2026-05-04 04:54:00 +00:00
Jakob Borg 6c51a59c52 fix(stdiscosrv): do graceful shutdown on SIGTERM
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-05-02 17:26:37 +02:00
Jakob Borg 1919c89de4 build: only run the periodic build jobs in the syncthing org (#10675) 2026-05-01 05:09:14 +00:00
Jakob Borg 774aa11795 fix(stdiscosrv): only read certificate proxy headers with --http (#10674)
These headers should not be inspected when running with a TLS listener.

Additionally, we should really enable them individually instead of
trusting the proxy to filter out the unused variants, but baby steps.

Reported by multiple AI vuln scanners.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-30 18:44:28 +00:00
Jakob Borg 44abd15162 chore(api): use ldap package escape functions (#10672)
Instead of our own variants, which were mostly but not 100% identical.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-29 12:06:12 +02:00
Syncthing Release Automation 0372a79986 chore(gui, man, authors): update docs, translations, and contributors 2026-04-27 04:51:44 +00:00
Jakob Borg 531d7f1a9a build: create GH release as draft, then publish
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 12:43:45 +02:00
Jakob Borg 6bff89a618 docs: release notes for 2.1
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 12:23:35 +02:00
Jakob Borg 86ac4e5017 feat: make block indexing configurable (#10608)
This adds a new folder-level configuration `FullBlockIndex`. It controls
whether we maintain the block index for a given folder -- currently
that's always true, now it becomes possible to turn off. The block index
is used for lookup of blocks across files and folders. Effectively, when
syncing a change, for each block, we check:

1. Is the block already present in the old version of the file? If so,
we can reuse (copy) it without network transfer. **This check is always
possible.**
2. Is the block already present in any other file in this folder or
other folders? If so we can copy it. **This check is only possible with
the full block index.**
3. We must transfer the block over the network.

Maintaining the full block index is costly in time, I/O and database
size. With this PR, maintaining the full block index becomes the default
for send-receive and receive-only folders only, with it disabled for
send-only and receive-encrypted folders. The block index is never useful
for encrypted folders, as blocks are encrypted separate for each file.
It is also not useful for send-only folders by themselves, though the
data in the send-only folder could be reused by other receive-type
folders if it were enabled.

For very large folders it may make sense to disable the full block index
regardless of folder type and just accept the resulting decrease in data
reuse.

Disabling or enabling the option in the GUI causes the index to be
destroyed or rebuilt accordingly.

https://github.com/syncthing/docs/pull/1005

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 11:58:09 +02:00
Luiz Angelo Daros de Luca 84c6b37913 feat(dialer): add HTTP/HTTPS proxy support via CONNECT (#10572)
Register HTTP and HTTPS proxy dialers and implement CONNECT-based
tunneling for HTTP proxies.

The new dialer supports:
- Plain HTTP proxies using CONNECT
- HTTPS proxies by performing a TLS handshake before CONNECT
- Optional basic authentication via Proxy-Authorization (with a warning
when creds are used over cleartext HTTP)

This allows all_proxy to be set to http:// or https:// URLs, enabling
data transfer through HTTP(S) proxies.

### Purpose

Allow peers to connect using HTTP Proxies (CONNECT)

### Testing

Tested with both HTTP and HTTPS proxy connection, using both no auth and
plain authentication.

### Screenshots

No visual change

### Documentation

https://github.com/syncthing/docs/pull/987

## Authorship

Your name and email will be added automatically to the AUTHORS file
based on the commit metadata.

---------

Signed-off-by: Luiz Angelo Daros de Luca <luizluca@gmail.com>
Signed-off-by: Jakob Borg <jakob@kastelo.net>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 09:31:40 +00:00
vvaswani 987e631176 feat: make http session cookie path & duration configurable (fixes #10522) (#10632)
Signed-off-by: Vikram Vaswani <2571660+vvaswani@users.noreply.github.com>
Signed-off-by: Jakob Borg <jakob@kastelo.net>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-04-26 07:59:24 +00:00
Jakob Borg 1f57187461 fix(strelaypoolsrv): retry "not found" errors in registration check
We presumably always intended to retry these, but we didn't.

Relates to #10658.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 15:19:48 +02:00
Jakob Borg a7f47d381e fix(strelaypoolsrv): correct remote address logging
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 15:19:48 +02:00
Jakob Borg 1a7825c7ec fix(strelaysrv): properly use bind address for outgoing requests (fixes #10658) (#10659)
This was lost in #7217 a while back.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 15:18:18 +02:00
Jakob Borg 97fb677887 chore(api): deflake TestHTTPLogin on Windows (#10667)
Hopefully deflakes TestHTTPLogin on Windows, where it currently often
times out, presumably in the config saving stage after already having
started a shutdown of the API and being CPU constrained due to password
hashing.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 15:07:16 +02:00
Jakob Borg 124f6979a4 build: parallelise linux builds slightly (#10666)
They currently take like 25 minutes. This reduces that to approximately
a third, wall-clock wise.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 13:16:12 +02:00
JRNitre 39778de04b fix(gui): fix tabs visually disabled but still clickable during ignore patterns setup (fixes #10634) (#10651)
### Purpose

Fixes issue #10634.

### Testing

Manually tested by reproducing the issue:

- Created a new folder with "Add ignore patterns" enabled
- Verified that after saving, only the "Ignore Patterns" tab remains
accessible
- Confirmed that other tabs are visually disabled and no longer
clickable

### Screenshots

No visible UI changes.

### Explanation of the Fix

**Cause**

The issue was caused by only visually disabling tabs in the UI by
setting
their `href` attribute to an empty string (`href=""`). This made the
tabs
appear disabled, but they were still clickable, leading to confusing
behavior
where users could interact with the tabs without any actual navigation.

**Fix**

- Introduced `isFolderTabDisabled` to centralize the logic for
determining
  whether a tab should be disabled
- Added `onFolderTabClick` to prevent interaction with disabled tabs
- Updated the HTML to remove tab behavior (such as `data-toggle="tab"`
and
  `href`) when a tab is disabled

### Documentation

No documentation changes required.

Signed-off-by: JRNitre <nichinichisou67@outlook.com>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 09:53:35 +02:00
Jakob Borg bcaabedc8e chore(scanner): deflake TestStopWalk (#10664)
The test expected the stopped scanner to produce at most numHashers
additional results, but there's also the case where a directory is
encountered (which doesn't require hashing) and sent directly.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 09:52:50 +02:00
Jakob Borg 46fb888ea3 chore(model): deflake TestCompletionEmptyGlobal (#10663)
There was a race condition where using IndexUpdate would trigger a pull,
which would sync the delete we are looking for, making the completion
100%. By doing the insert directly into the database we are not
triggering these things and get the expected completion percentage
always.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 09:52:27 +02:00
Jakob Borg 36c3331696 chore(model): deflake cluster config tests (#10662)
These have been flaky for a long time, seemingly because the multiple
connection code slightly changed the timing of cluster config sending by
moving them to the connection promotion loop. This adds some resiliency
to that, instead of assuming that the CC:s will be immediately available
after adding the connection.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-24 07:41:17 +00:00
RealCharlesChia 2850b3a46c fix(gui): fallback to folder ID when label is empty in remove dialog (#10657)
## Summary

Fixes issue #10458: When removing a folder without a Folder Label, the
confirmation dialog now shows the folder ID instead of an empty string.

### Before
> Are you sure you want to remove folder **?**

### After  
> Are you sure you want to remove folder **dnjdr-hssze**?

### Changes

Modified `gui/default/syncthing/folder/removeFolderDialogView.html`:
```html
<!-- Before -->
<p translate translate-value-label="{{currentFolder.label}}">

<!-- After -->
<p translate translate-value-label="{{currentFolder.label || currentFolder.id}}">
```

### Testing

1. Create a folder without a label
2. Open the folder edit dialog
3. Click remove
4. Verify the confirmation dialog shows the folder ID instead of blank

Fixes #10458

Signed-off-by: RealCharlesChia <161665317+RealCharlesChia@users.noreply.github.com>
2026-04-23 09:02:25 +00:00
Jakob Borg 2721b7b522 chore(model): more efficient tracking of renames during scan (#10653) 2026-04-23 07:20:52 +02:00
Jakob Borg b1ccf3f3fd chore: trivial fixes (#10650)
... which keep getting filed by AI agents.

Closes #10649, closes #10486, closes #10648, closes #10499, closes
#10647, closes #10635, closes #10636, closes #10607.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-22 06:38:05 +00:00
Syncthing Release Automation 199e07e3d2 chore(gui, man, authors): update docs, translations, and contributors 2026-04-20 04:46:00 +00:00
Syncthing Release Automation 74997c05e8 chore(gui, man, authors): update docs, translations, and contributors 2026-04-13 04:46:14 +00:00
Ben Norcombe 017ef5a57b fix(gui): order folders alphabetically and ensure local device stays hidden (ref #10563, ref #10631)
### Purpose

There were some additional regression created during #10563 and #10631 which are:

* Folders were not being ordered by their label within their group
* Local device could still show up randomly with the list of remote devices

The respective fixes in this PR does the following:

* Ensure sorting of the grouped folders (and devices) are done by group name (the top level map key) and then by the specified nested object property or a fallback property if specified property value is empty. So in the case of the folders it's `label` and device is `name`.
* When populating the `devicesGrouped` using `$scope.otherDevices`, do this within a watcher on `$scope.myID` as this is what `$scope.otherDevices` relies on to determine what is a remote device. This is required because `$scope.myID` might not be populated yet given the indeterministic call order being made to `refreshSystem` and `refreshConfig`.

### Testing

Populate folders and devices into different groups, and ensure the ordering is correct and the local device is not showing in remote devices even after many, many refreshes on the UI or restarts of syncthing entirely.

### Screenshots

Before the fix

<img width="1108" height="951" alt="Screenshot_20260409_083910" src="https://github.com/user-attachments/assets/6eb8cacc-5924-4612-aa70-29ed4f691233" />

After the fix

<img width="1090" height="934" alt="Screenshot_20260409_084553" src="https://github.com/user-attachments/assets/f5b74391-228a-43d3-b5ee-433958236d84" />

### Documentation

N/A

## Authorship

Ben Norcombe [bennorcombe@pm.me](mailto:bennorcombe@pm.me)
2026-04-11 13:52:20 +02:00
Ben Norcombe 6b9fa76c01 fix(gui): don't show local device under remote devices (ref #10563) (#10631)
### Purpose

Regression was introduced in PR #10563 due to new devices grouping
feature not utlising the otherDevices utility function to ensure the
local device is not shown in the remote devices list

### Testing

Open web GUI and ensure your local device isn't listed under Remote
Devices

### Screenshots

Regression before fix 

<img width="589" height="601" alt="Screenshot_20260407_202526"
src="https://github.com/user-attachments/assets/ffa315e4-f901-4d0c-8755-15b0c31464b3"
/>

Fix

<img width="598" height="555" alt="Screenshot_20260407_202656"
src="https://github.com/user-attachments/assets/8f0721c0-3fd2-4ae5-9db5-23c0d46c268e"
/>


### Documentation

N/A

## Authorship

Ben Norcombe [bennorcombe@pm.me](mailto:bennorcombe@pm.me)

Signed-off-by: Ben Norcombe <bennorcombe@pm.me>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-04-08 16:30:46 +00:00
Jakob Borg a211fafdc4 policy: pushing invalidates PR approval
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-08 17:48:27 +02:00
Jakob Borg e4e9402cd9 docs: add release notes for 2.1
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-07 17:25:53 +02:00
Jakob Borg f806967958 Merge branch 'infrastructure'
* infrastructure:
  chore(stdiscosrv): smooth retry-after delays over a slightly larger normal distribution
  chore(stdiscosrv): optionally delay shutdown
  chore(stdiscosrv): adjust desired seen and unseen rate separately
2026-04-07 17:22:35 +02:00
Ben Norcombe 6a26d56ad9 feat(gui, config): support simple folder grouping (fixes #2070) (#10563)
Adds a very simple way to group up folders to help with organising from
the GUI. 

Signed-off-by: Ben Norcombe <bennorcombe@pm.me>
2026-04-07 17:05:41 +02:00
Jakob Borg 5d877f65f5 build: have dependabot group PRs and use cooldown (#10630)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-07 16:57:42 +02:00
dagecko e36bf6d6b1 build: pin 20 third-party actions to immutable commit SHAs (#10625)
fix: pin 20 third-party actions to immutable commit SHAs

Signed-off-by: Chris Nyhuis <cnyhuis@vigilantnow.com>
2026-04-07 16:55:54 +02:00
Jakob Borg 5febc056a8 fix(protocol): limit size of incoming request messages (#10629)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-07 16:28:18 +02:00
dagecko f234a61fb4 build: extract github.ref_name expression to env mapping (#10624)
Signed-off-by: Chris Nyhuis <cnyhuis@vigilantnow.com>
2026-04-06 15:24:12 +00:00
Jakob Borg 3ac9b83f40 chore(stdiscosrv): smooth retry-after delays over a slightly larger normal distribution
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-06 14:49:13 +02:00
Jakob Borg 1d4df9c1f4 chore(stdiscosrv): optionally delay shutdown
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-06 11:06:25 +02:00
Jakob Borg a80b53d113 chore(stdiscosrv): adjust desired seen and unseen rate separately
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-06 10:42:24 +02:00
Jakob Borg b594b7491f chore: systematic syncthing_build_info metric
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-04-06 09:44:49 +02:00
Syncthing Release Automation e2cb283155 chore(gui, man, authors): update docs, translations, and contributors 2026-04-06 04:38:32 +00:00
bt90 ab9b11749c fix(gui): disable autocomplete for folder password (#10342)
Disable autocomplete

Signed-off-by: bt90 <btom1990@googlemail.com>
2026-04-05 14:29:56 +00:00
Syncthing Release Automation 1a3cbca017 chore(gui, man, authors): update docs, translations, and contributors 2026-03-30 04:38:35 +00:00
Marcus Spencer 76f91750c1 build(deps): temporarily switch to fork of gateway discovery library (fixes #10593) (#10594)
Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
Signed-off-by: Jakob Borg <jakob@kastelo.net>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-03-29 22:05:06 +02:00
cui 1106e2e332 fix(stdiscosrv): close file descriptor on flush error in write (#10615)
The error path after bw.Flush() failed referenced fd.Close without calling it, so the descriptor was not closed when flush failed.

Signed-off-by: Weixie Cui <cuiweixie@gmail.com>
2026-03-26 00:37:34 +00:00
Syncthing Release Automation 351be52481 chore(gui, man, authors): update docs, translations, and contributors 2026-03-23 04:35:31 +00:00
Jakob Borg b39c56f82d chore: remove tracking inode change time (#10579)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-03-22 20:24:03 -07:00
Syncthing Release Automation 3b05ba2a8f chore(gui, man, authors): update docs, translations, and contributors 2026-03-16 04:37:43 +00:00
Jakob Borg 9ffce6e3ff chore(sqlite): reduce max open connections, keep them open permanently (fixes #10592) (#10596)
chore(sqlite): reduce max open connections, keep them open permanently (fixes #10592)

Reduces connection churn, possibly tickling concurrency bug on Windows.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-03-13 12:03:22 +00:00
Val Markovic 077a7a0378 fix(systemd): add back chown allowed syscalls (#10605)
fix(systemd): Add back chown allowed syscalls

IFF the user enables the `syncOwnership` feature AND sets
`AmbientCapabilities=CAP_CHOWN CAP_FOWNER` as the docs in
https://docs.syncthing.net/users/autostart.html#permissions state,
THEN syncthing needs to use the `chown` syscall.

PR #10421 added a comprehensive sandbox that breaks `syncOwnership`.
In PR #10602 we fixed one part, which is expanding the default
`CapabilityBoundingSet` (see the PR for details).

But there's a very subtle bug that this PR fixes. PR #10421 sets the
following properties:

    SystemCallFilter=@system-service
    SystemCallFilter=~@privileged io_uring_enter io_uring_register io_uring_setup

(Systemd merges `SystemCallFilter` values; we had to set the property
twice because to negate syscalls, the whole list has to start with `~`.)

The goal was to allow all syscalls in the `@system-service` set, BUT
disallow any `@privileged` syscalls and the `io_uring*` syscalls.

But the sets are not disjoint; `chown` is in both `@system-service` and
in `@privileged`, so it is removed from the allow list by the second
property value.

This property is also parsed in a very peculiar way. From systemd docs:

> If you specify both types of this option (i.e. allow-listing and
> deny-listing), the first encountered will take precedence and will
> dictate the default action (termination or approval of a system call).
> Then the next occurrences of this option will add or delete the listed
> system calls from the set of the filtered system calls, depending of its
> type and the default action. (For example, if you have started with an
> allow list rule for read() and write(), and right after it add a deny
> list rule for write(), then write() will be removed from the set.)

Not only does the order of `SystemCallFilter` properties matter (later
ones can undo effects of prior ones), but the _type_ of the _first_
property sets the overall behavior of the syscall filter: if the first
`SystemCallFilter` value is an allow list, then all syscalls that are
not specified are disallowed by default (and reverse if the first value
is a deny list).

Of course, this is completely different from how other allow/deny lists
are implemented in systemd; for example, `IPAddress[Allow|Deny]`
properties don't work like this at all. >:(

Since this complexity has bit us once, we're removing the additional
deny list of syscalls and sticking with just
`SystemCallFilter=@system-service`.

This leaves some privileged syscalls in the allow list. Other options
would require entering the "deny list by default" mode and deny lists
are less secure than allow lists in general because they have to be
maintained (the kernel always adds new syscalls). The rest of the
sandbox (capability bounds) should be sufficient.

Fixes #10603

Signed-off-by: Val Markovic <val@markovic.io>
2026-03-13 12:53:36 +01:00
Val Markovic c4ff02def7 fix(systemd): support overrides for syncOwnership (#10602)
Syncthing docs in https://docs.syncthing.net/users/autostart.html#permissions
tell the user to set `AmbientCapabilities=CAP_CHOWN CAP_FOWNER` if the
user wishes to use the `syncOwnership` option.

https://github.com/syncthing/syncthing/pull/10421 broke `syncOwnership`
for users that followed that advice because the PR introduced
`CapabilityBoundingSet=` which cancels out any additional capabilities
granted with `AmbientCapabilities`.

(`AmbientCapabilities` _adds_ capabilities; `CapabilityBoundingSet`
_limits_ maximum capabilities to the specified set. Setting
`CapabilityBoundingSet` to an empty list prevents any capabilities from
being acquired in any way.)

This PR fixes the breakage by explicitly setting

    CapabilityBoundingSet=CAP_CHOWN CAP_FOWNER

This does _not_ grant any additional access rights to syncthing if the
user is not explicitly setting `AmbientCapabilities` as well, but it
does loosen the sandbox _a bit_. An attacker compromising the syncthing
process could now more easily expand their access to include
CAP_CHOWN/CAP_FOWNER even if the user is not setting
`AmbientCapabilities`.

Signed-off-by: Val Markovic <val@markovic.io>
2026-03-11 14:11:50 +01:00
Syncthing Release Automation 55d3b7c5db chore(gui, man, authors): update docs, translations, and contributors 2026-03-09 04:28:28 +00:00
Jakob Borg fd129825b2 fix(protocol): verify compressed message length before decompression (#10595) 2026-03-07 16:29:14 +01:00
Jakob Borg 8c7c413f5c build(deps): update dependencies (#10588)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-03-04 07:38:45 +01:00
Jakob Borg 9c7e34b3d1 chore: trigger rebuild 2026-03-03 22:36:13 +01:00
Syncthing Release Automation 55d89d0efb chore(gui, man, authors): update docs, translations, and contributors 2026-03-02 04:25:40 +00:00
Syncthing Release Automation 76db7c6c7b chore(gui, man, authors): update docs, translations, and contributors 2026-02-23 04:32:49 +00:00
Syncthing Release Automation ddafc5f6e5 chore(gui, man, authors): update docs, translations, and contributors 2026-02-16 04:33:52 +00:00
Marcus B Spencer 75dd940128 chore(config, connections): use same reconnection interval for QUIC and TCP (fixes #10507) (#10573)
Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
2026-02-12 10:41:30 +01:00
Jakob Borg dc2a77ab8e chore: build with Go 1.26; use Go 1.25 features (#10570)
WaitGroup.Go and built-in gomaxprocs handling.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-02-11 10:41:38 +00:00
Val Markovic 478d8a007d chore(etc): add more comprehensive systemd sandboxing (#10421)
Update the existing minimal service hardening with a comprehensive
sandbox to minimize blast damage from service compromise.

Please see the detailed code comments for an explanation of what is
sandboxed.

Roughly, we limit: /dev, /proc, /tmp, AF_UNIX, AF_PACKET, execution of
_any_ binary other than "/usr/bin/syncthing" and "/usr/lib",
uncommon syscalls plus io_uring, tons of kernel internals and more. We
also enable a bunch of kernel namespaces for isolation.

In short, pretty much everything is sandboxed and specifically tuned for
syncthing's behavior.

Sadly, we cannot use ProtectSystem=strict by default because we don't
know the directories that the user will be sharing. There's a big
comment block explaining how users can enable it for "extra credit". :)

If the user did add the following options as the unit file recommends:

- ProtectSystem=strict
- ReadWritePaths=/my/shared/dir1 /my/shared/dir2
- ProtectHome=true

Then the user would end up with a *far* more comprehensive sandbox than
anything a container runtime (like Docker/Podman/whatever) would
provide.

Much (but not all) of these options could be ported to the
user/syncthing.service file, BUT it would require work. Systemd does not
allow all of these options to be used with the user service manager,
although using PrivateUsers=true would help with most of it.

I cannot justify the time investment to develop, audit and test the
port to user/syncthing.service so I leave that for interested
contributors.

Tested on Debian Trixie (13) with the following versions:
- v1.29.5, Linux (64-bit Intel/AMD)
- latest HEAD (d3d3fc2d0 committed on Mon Oct 6 01:42:58 2025)

Signed-off-by: Val Markovic <val@markovic.io>
2026-02-11 11:05:49 +01:00
Michael Wang 汪東陽 2ecdc1a593 fix(gui): remove width limit for language select items (#10531)
Signed-off-by: Michael Wang <michael19920327@gmail.com>
2026-02-11 10:54:08 +01:00
Tao f86c1d83db fix(gui): show restarting modal during upgrade restart (fixes #1248) (#10566)
Signed-off-by: steadytao <mail@steadytao.com>
Signed-off-by: Jakob Borg <jakob@kastelo.net>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-02-11 09:46:37 +00:00
Tommy van der Vorst 5cf9168dc2 chore(db): add ability to wait for programmatically started database maintenance, query last maintenance time (#10565)
Also adds a method to query the last database maintenance time.

Signed-off-by: Tommy van der Vorst <tommy@pixelspark.nl>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
2026-02-11 09:28:11 +00:00
Syncthing Release Automation 0b5a08c99a chore(gui, man, authors): update docs, translations, and contributors 2026-02-09 04:34:38 +00:00
Epifeny 1bba07a152 chore(gui): add id and name to Stay logged in checkbox for password managers (#10558)
gui: Add id and name to Stay logged in checkbox for password manager support

Signed-off-by: epifeny <epifeny@users.noreply.github.com>
Co-authored-by: epifeny <epifeny@users.noreply.github.com>
2026-02-05 08:17:06 +01:00
Jakob Borg 2cf7197bfb Merge branch 'infrastructure'
* infrastructure:
  refactor: remove unused support for Azure blob stores
  fix(stdiscosrv): must not modify database entries in-place
2026-02-04 11:06:48 +01:00
Jakob Borg f8a711af4e refactor: remove unused support for Azure blob stores
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-02-04 10:24:17 +01:00
Jakob Borg f731cfa746 fix(stdiscosrv): must not modify database entries in-place
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-02-04 10:24:17 +01:00
Syncthing Release Automation b40f2acdad chore(gui, man, authors): update docs, translations, and contributors 2026-02-02 04:32:24 +00:00
Jakob Borg 8adcffbb59 build: increase allowed permissions for nightly build
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-01-30 13:17:20 +01:00
Syncthing Release Automation c9f0c1c79b chore(gui, man, authors): update docs, translations, and contributors 2026-01-26 04:12:14 +00:00
Shivam Kumar 6a3a28fee7 fix(stdiscosrv): log full device ID on startup (#10541)
Signed-off-by: maishivamhoo123 <maishivamhoo@gmail.com>
2026-01-25 09:05:12 +01:00
Shivam Kumar a5de148d79 fix(stdiscosrv): use fmt.Println for version output (fixes #10523) (#10527)
Signed-off-by: Shivam <maishivamhoo@gmail.com>
2026-01-24 12:06:54 +01:00
Jakob Borg 0735c25c92 build: add build attestation step at release (#10540)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2026-01-24 08:39:01 +00:00
Maxwell G a4783ad5cd chore(gui): include license files for fork-awesome assets (#10539)
The css and svg files have license headers, but there were no separate
license files like the other vendored assets in `gui/default/vendor/*`.
This issue came up while we were working on updating and modernizing the
syncthing package in Fedora Linux.

This commit copies the existing license headers into separate files
to make things easier for license scanning and SCA tools,
such as [Go Vendor Tools](https://fedora.gitlab.io/sigs/go/go-vendor-tools/).

* [...]/css/LICENSE.txt is copied from the license header in
  gui/default/vendor/fork-awesome/css/fork-awesome.css.
* [...]/fonts/LICENSE.txt is copied from the license text in the
  <metadata> tag of
  gui/default/vendor/fork-awesome/fonts/forkawesome-webfont.svg.

Relates: https://src.fedoraproject.org/rpms/syncthing/pull-request/4

Signed-off-by: Maxwell G <maxwell@gtmx.me>
2026-01-23 21:21:00 +01:00
Syncthing Release Automation cb391d25b8 chore(gui, man, authors): update docs, translations, and contributors 2026-01-19 04:08:47 +00:00
Tommy van der Vorst 5bf27a432c chore(sqlite): allow periodic database maintenance to be disabled (#10441)
This change allows the periodic database maintenance to be disabled, while providing a way to programmatically start maintenance at a convenient moment.

Signed-off-by: Tommy van der Vorst <tommy@pixelspark.nl>
2026-01-14 21:10:54 +00:00
Syncthing Release Automation ed0baec2ca chore(gui, man, authors): update docs, translations, and contributors 2026-01-12 04:08:17 +00:00
Syncthing Release Automation 38e95441ee chore(gui, man, authors): update docs, translations, and contributors 2026-01-05 04:11:46 +00:00
Prathik P Kulkarni 50fe0053e8 chore(api): remove charset declaration from JSON content-type (fixes #10500) (#10508)
updated content-type  to application/json (fixes #10500)

Signed-off-by: prathik8794 <me20b030@iittp.ac.in>
2025-12-29 09:49:21 +00:00
Syncthing Release Automation 8f9ffd3c79 chore(gui, man, authors): update docs, translations, and contributors 2025-12-29 04:07:59 +00:00
Jakob Borg 1843cac6d9 fix(db): remove incorrect comment 2025-12-28 19:33:35 +01:00
bt90 b7b494b7cf fix(beacon): skip point-to-point interfaces on Android (#10504) 2025-12-23 18:56:20 +00:00
Jakob Borg 962b917150 build: handle (ignore) new docker artifacts 2025-12-23 09:10:48 +01:00
Jakob Borg f57e92c20a chore: tweak pull retry logic (#10491)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-12-23 08:26:58 +01:00
Jakob Borg b9ab05af02 build: fix hash failure by limiting globbing (#10505)
The glob in **/go.sum fails in some builds because there are a lot of files in ** due to things like the zig cache directory. We can be more specific. Also, avoid a huge build context sent to Docker for the container builds.

---------

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-12-22 19:28:16 +00:00
Syncthing Release Automation 43d826913f chore(gui, man, authors): update docs, translations, and contributors 2025-12-22 04:06:33 +00:00
Marcus B Spencer 801ef0e22d fix(beacon): don't join multicast groups on non-multicast interfaces (fixes #10497) (#10498)
fix(beacon): don't join multicast groups on non-multicast interfaces

Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
2025-12-18 08:58:06 +01:00
Marcus B Spencer e5dfd2c549 chore(beacon): more verbose debug logging (#10496)
Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
2025-12-17 15:04:47 +00:00
Syncthing Release Automation 5800d1acc3 chore(gui, man, authors): update docs, translations, and contributors 2025-12-15 04:06:28 +00:00
Jakob Borg fd9dcbb8c2 build: fix docker build by ensuring qemu (#10492)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-12-13 12:28:12 +00:00
Syncthing Release Automation bc7e56fdcd chore(gui, man, authors): update docs, translations, and contributors 2025-12-08 04:02:18 +00:00
Jakob Borg 7f7f5d87df Merge branch 'infrastructure'
* infrastructure:
  chore(stdiscosrv): use log/slog
  chore(stdiscosrv): larger write buffer
2025-12-02 08:43:15 +01:00
Syncthing Release Automation 49f2736adb chore(gui, man, authors): update docs, translations, and contributors 2025-12-01 04:08:13 +00:00
Jakob Borg cde867cf74 chore(stdiscosrv): use log/slog
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-11-30 11:17:29 +01:00
Jakob Borg 70292b4902 chore(stdiscosrv): larger write buffer
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-11-30 11:17:29 +01:00
Jakob Borg 553c02f244 chore(model): refactor context handling for folder type (#10472)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-11-27 20:34:35 +00:00
André Colomb ce884e5d72 chore(cli): clean up generated usage strings for config commands (fixes #10462) (#10463)
* Show proper subcommand prefix in generated config CLI.
* Remove useless author info and copy command group description.
* Really accept (implicit) -h and --help flags.

These were disabled by HideHelp, leading to an error message in every
usage output.  This way, the flags get documented as well.

* Override AppHelpTemplate to better match Kong's style.
* Override (Sub)commandHelpTemplate to better match Kong's style.
* Use <command> and [flags] like Kong.

Signed-off-by: André Colomb <src@andre.colomb.de>
2025-11-24 16:49:42 +01:00
Syncthing Release Automation 5f702c1406 chore(gui, man, authors): update docs, translations, and contributors 2025-11-24 04:02:55 +00:00
Syncthing Release Automation a6bcd02739 chore(gui, man, authors): update docs, translations, and contributors 2025-11-17 03:57:56 +00:00
Jakob Borg 488c33aef5 chore: update quic-go, adapt to lack of write tracking (#10456)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-11-16 00:48:28 +01:00
Syncthing Release Automation 9241a475e9 chore(gui, man, authors): update docs, translations, and contributors 2025-11-10 03:59:12 +00:00
Syncthing Release Automation 01eef47bbc chore(gui, man, authors): update docs, translations, and contributors 2025-11-03 03:59:21 +00:00
Jakob Borg c518d99c35 build: do not clobber .deb files when publishing 2025-10-31 11:01:09 +01:00
Syncthing Release Automation 81c99e07db chore(gui, man, authors): update docs, translations, and contributors 2025-10-27 03:59:48 +00:00
André Colomb 5279330c1d chore(gui): add Azerbaijani (az) and Kurdish (ckb) l10n templates. (#10442)
Based on user requests from Weblate:

* `@miryusifrahimov` for Azerbaijani
* `@halbast` für Kurdish (Central)

Both seem to be legit and have previously contributed translations on
Weblate.

Signed-off-by: André Colomb <src@andre.colomb.de>
2025-10-26 17:55:03 +01:00
Jakob Borg 194b59b3ed chore: job for adding org members 2025-10-24 08:10:30 +02:00
Jakob Borg 8e796ddb94 chore: linter: errorlint
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg 7c9d06b4d2 chore: linter: embeddedstructfieldcheck
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg df8d8c276e chore: linter: staticcheck
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg 98cf5872e9 chore: linter: perfsprint
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg c883f49a24 chore: linter: usestdlibvars
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg d84280107c chore: linter: canonicalheader
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg d97fd638bc chore: linter: dupword
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg a1069a0d70 chore: linter: intrange
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg 465804161b chore: linter: staticcheck
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Jakob Borg d08f483811 chore: linter: unused
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-10-23 22:48:54 +02:00
Marcus B Spencer 655b4568c1 fix(fs): only apply case option to fakefs in stress test (#10440)
Fixes a regression introduced in #10439, mentioned in [a comment](https://github.com/syncthing/syncthing/pull/10439#issuecomment-3436515824) made by @imsodin:

> That might not be the greatest way to do this, but nevertheless it afaik means that the benchmarks now do case checking once when it shouldn't happen at all, and twice otherwise.

Benchmarks do approximately as well as before the regression, and I think most of them are random chance:

```
                                             │ ../oldold.txt │             ../new.txt             │
                                             │    sec/op     │   sec/op     vs base               │
WalkCaseFakeFS100k/rawfs-8                       654.6m ± 1%   652.6m ± 3%       ~ (p=0.971 n=10)
WalkCaseFakeFS100k/casefs-8                       1.049 ± 2%    1.071 ± 3%       ~ (p=0.190 n=10)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8      1.053 ± 3%    1.081 ± 5%       ~ (p=0.165 n=10)
geomean                                          897.7m        910.8m       +1.46%

                                             │ ../oldold.txt │              ../new.txt               │
                                             │    B/entry    │   B/entry     vs base                 │
WalkCaseFakeFS100k/rawfs-8                      1.274Ki ± 0%   1.274Ki ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-8                     1.771Ki ± 0%   1.771Ki ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8    1.772Ki ± 0%   1.772Ki ± 0%       ~ (p=1.000 n=10) ¹
geomean                                         1.587Ki        1.587Ki       +0.00%
¹ all samples are equal

                                             │ ../oldold.txt  │               ../new.txt                │
                                             │ DirNames/entry │ DirNames/entry  vs base                 │
WalkCaseFakeFS100k/rawfs-8                        512.5m ± 0%      512.5m ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-8                        1.025 ± 0%       1.025 ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8       1.025 ± 0%       1.025 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                           813.5m           813.5m       +0.00%
¹ all samples are equal

                                             │ ../oldold.txt │              ../new.txt              │
                                             │  DirNames/op  │ DirNames/op  vs base                 │
WalkCaseFakeFS100k/rawfs-8                       51.25k ± 0%   51.25k ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-8                      102.5k ± 0%   102.5k ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8     102.5k ± 0%   102.5k ± 0%       ~ (p=1.000 n=10) ¹
geomean                                          81.35k        81.35k       +0.00%
¹ all samples are equal

                                             │ ../oldold.txt │              ../new.txt              │
                                             │  Lstat/entry  │ Lstat/entry  vs base                 │
WalkCaseFakeFS100k/rawfs-8                        5.535 ± 0%    5.535 ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-8                       5.535 ± 0%    5.535 ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8      5.540 ± 0%    5.540 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                           5.537         5.537       +0.00%
¹ all samples are equal

                                             │ ../oldold.txt │              ../new.txt              │
                                             │   Lstat/op    │  Lstat/op    vs base                 │
WalkCaseFakeFS100k/rawfs-8                       553.5k ± 0%   553.5k ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-8                      553.5k ± 0%   553.5k ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8     554.0k ± 0%   554.0k ± 0%       ~ (p=1.000 n=10) ¹
geomean                                          553.7k        553.7k       +0.00%
¹ all samples are equal

                                             │ ../oldold.txt │              ../new.txt               │
                                             │ allocs/entry  │ allocs/entry  vs base                 │
WalkCaseFakeFS100k/rawfs-8                        19.00 ± 0%     19.00 ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-8                       35.35 ± 0%     35.35 ± 0%       ~ (p=1.000 n=10) ¹
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8      35.38 ± 0%     35.38 ± 0%       ~ (p=1.000 n=10) ¹
geomean                                           28.75          28.75       +0.00%
¹ all samples are equal

                                             │ ../oldold.txt │             ../new.txt             │
                                             │   sec/entry   │  sec/entry   vs base               │
WalkCaseFakeFS100k/rawfs-8                       4.328µ ± 1%   4.315µ ± 3%       ~ (p=0.971 n=10)
WalkCaseFakeFS100k/casefs-8                      6.936µ ± 2%   7.082µ ± 3%       ~ (p=0.171 n=10)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8     6.965µ ± 3%   7.147µ ± 5%       ~ (p=0.165 n=10)
geomean                                          5.935µ        6.022µ       +1.46%

                                             │ ../oldold.txt │             ../new.txt              │
                                             │     B/op      │     B/op      vs base               │
WalkCaseFakeFS100k/rawfs-8                      188.3Mi ± 0%   188.3Mi ± 0%  -0.00% (p=0.006 n=10)
WalkCaseFakeFS100k/casefs-8                     261.5Mi ± 0%   261.5Mi ± 0%       ~ (p=0.142 n=10)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8    261.7Mi ± 0%   261.7Mi ± 0%       ~ (p=0.315 n=10)
geomean                                         234.4Mi        234.4Mi       -0.00%

                                             │ ../oldold.txt │             ../new.txt             │
                                             │   allocs/op   │  allocs/op   vs base               │
WalkCaseFakeFS100k/rawfs-8                       2.873M ± 0%   2.873M ± 0%  -0.00% (p=0.026 n=10)
WalkCaseFakeFS100k/casefs-8                      5.346M ± 0%   5.346M ± 0%       ~ (p=0.136 n=10)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8     5.351M ± 0%   5.351M ± 0%       ~ (p=0.305 n=10)
geomean                                          4.348M        4.348M       -0.00%
```

Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
2025-10-23 13:12:03 -05:00
Marcus B Spencer c6a887865f fix(fs): apply case option to fakefs in casefs tests (#10439)
Required for the casefs tests/benchmarks to test the casefs.

Benchmarks do significantly worse (as expected).

```
                                             │ ../old.txt  │             ../new.txt             │
                                             │   sec/op    │   sec/op     vs base               │
WalkCaseFakeFS100k/rawfs-8                     626.5m ± 5%   993.4m ± 1%  +58.56% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-8                     1.011 ± 1%    1.425 ± 1%  +40.94% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8    1.014 ± 2%    1.439 ± 1%  +41.97% (p=0.002 n=6)
geomean                                        862.9m         1.268       +46.94%

                                             │  ../old.txt  │             ../new.txt              │
                                             │   B/entry    │   B/entry     vs base               │
WalkCaseFakeFS100k/rawfs-8                     1.274Ki ± 0%   1.766Ki ± 0%  +38.54% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-8                    1.771Ki ± 0%   2.354Ki ± 0%  +32.98% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8   1.772Ki ± 0%   2.356Ki ± 0%  +32.95% (p=0.002 n=6)
geomean                                        1.587Ki        2.140Ki       +34.80%

                                             │   ../old.txt   │               ../new.txt               │
                                             │ DirNames/entry │ DirNames/entry  vs base                │
WalkCaseFakeFS100k/rawfs-8                        512.5m ± 0%     1025.0m ± 0%  +100.00% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-8                        1.025 ± 0%       1.537 ± 0%   +49.95% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8       1.025 ± 0%       1.537 ± 0%   +49.95% (p=0.002 n=6)
geomean                                           813.5m            1.343        +65.06%

                                             │ ../old.txt  │              ../new.txt              │
                                             │ DirNames/op │ DirNames/op   vs base                │
WalkCaseFakeFS100k/rawfs-8                     51.25k ± 0%   102.49k ± 0%  +100.00% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-8                    102.5k ± 0%    153.7k ± 0%   +50.00% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8   102.5k ± 0%    153.7k ± 0%   +50.00% (p=0.002 n=6)
geomean                                        81.35k         134.3k        +65.10%

                                             │  ../old.txt  │             ../new.txt              │
                                             │ allocs/entry │ allocs/entry  vs base               │
WalkCaseFakeFS100k/rawfs-8                       19.00 ± 0%     35.35 ± 0%  +86.05% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-8                      35.35 ± 0%     54.40 ± 0%  +53.89% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8     35.38 ± 0%     54.46 ± 0%  +53.93% (p=0.002 n=6)
geomean                                          28.75          47.14       +63.95%

                                             │ ../old.txt  │             ../new.txt             │
                                             │  sec/entry  │  sec/entry   vs base               │
WalkCaseFakeFS100k/rawfs-8                     4.143µ ± 5%   6.568µ ± 1%  +58.55% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-8                    6.686µ ± 1%   9.424µ ± 1%  +40.95% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8   6.703µ ± 2%   9.517µ ± 1%  +41.97% (p=0.002 n=6)
geomean                                        5.705µ        8.383µ       +46.94%

                                             │  ../old.txt  │             ../new.txt              │
                                             │     B/op     │     B/op      vs base               │
WalkCaseFakeFS100k/rawfs-8                     188.3Mi ± 0%   260.8Mi ± 0%  +38.51% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-8                    261.5Mi ± 0%   347.7Mi ± 0%  +32.98% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8   261.7Mi ± 0%   348.0Mi ± 0%  +32.96% (p=0.002 n=6)
geomean                                        234.4Mi        316.0Mi       +34.79%

                                             │ ../old.txt  │             ../new.txt             │
                                             │  allocs/op  │  allocs/op   vs base               │
WalkCaseFakeFS100k/rawfs-8                     2.873M ± 0%   5.346M ± 0%  +86.04% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-8                    5.346M ± 0%   8.228M ± 0%  +53.91% (p=0.002 n=6)
WalkCaseFakeFS100k/casefs-otherOpEvery1000-8   5.351M ± 0%   8.236M ± 0%  +53.92% (p=0.002 n=6)
geomean                                        4.348M        7.129M       +63.96%
```

Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
2025-10-23 08:40:42 +00:00
Marcus B Spencer b4565c87ee fix(fs): store getExpireAdd mutex in caseCache (fixes #9836) (#10430)
In #9701 there was a change that put the mutex used for `getExpireAdd` directly in `defaultRealCaser`, which is erroneous because multiple filesystems can share the same `caseCache`.

### Purpose

Fixes #9836 and [Slow sync sending files from Android](https://forum.syncthing.net/t/slow-sync-sending-files-from-android/24208?u=marbens). There may be other issues caused by `getExpireAdd` conflicting with itself, though.

### Testing

Unit tests pass and the case cache and conflict detection _seem_ to behave correctly.

Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
2025-10-18 21:56:03 +02:00
Simon Frei 20d2406a0e chore(upnp): remove incorrect embedding of nat.Service (fixes #10426) (#10428) 2025-10-13 07:11:00 +02:00
Marcus B Spencer d3d3fc2d0e fix(policy): only allow approvals by non-author contributors (#10419)
This replaces `allow_contributor` with `allow_non_author_contributor`,
because the former allows authors to approve their own pull requests.

From https://github.com/syncthing/syncthing/pull/9818#issue-2651431707:

> This adds `allow_contributor: true` which allows approvals by contributors to the PR (*but still not the author themself*, which is a different thing).

This statement conflicts with [the policybot README](https://github.com/palantir/policy-bot/blob/c013552248d2a99911207fa5c0045428ac073fa2/README.md), which says:

> If true, the approvals of someone who has committed to the pull request are
> considered when calculating the status.
> *The pull request author is considered a contributor.*

Signed-off-by: Marcus B Spencer <marcus@marcusspencer.us>
2025-10-06 08:42:58 +02:00
bt90 f8c44923c7 docs(docker): make host network mode the default (#10416)
Signed-off-by: bt90 <btom1990@googlemail.com>
2025-09-29 15:20:44 -04:00
Jakob Borg 6f0acacbd2 fix(sqlite): actually always insert blocks for local files (fixes #10388) (#10411)
Due to a thinko, this optimisation was wildly incorrect and would read
to lack of block reuse when syncing files.

(We do not insert a blocklist per device, but only a single one. We
can't use the fact of whether the insert happened as a criteria for
inserting blocks.)

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-23 12:46:31 +00:00
Jakob Borg 932b4ce9bd fix(model): don't announce untrusted devices to other devices (fixes #10393) (#10408)
fix(model): don't announce untrusted devices to other devices

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-23 13:16:58 +02:00
mrclmr b3e3ca7294 build: update GitHub actions (#10399) 2025-09-22 08:50:09 +03:00
Syncthing Release Automation 41b4c5cd5e chore(gui, man, authors): update docs, translations, and contributors 2025-09-22 03:52:07 +00:00
Tommy van der Vorst eb4eb7524d fix(syncthing): only perform CPU benchmark on startup when logging enabled, and on goroutine (#10398)
Signed-off-by: Tommy van der Vorst <tommy@pixelspark.nl>
Co-authored-by: bt90 <btom1990@googlemail.com>
2025-09-19 07:17:10 +02:00
Tommy van der Vorst a64c5396e9 fix(db): only perform foreign key checking when a migration was applied (#10397) 2025-09-18 12:22:35 +00:00
Jakob Borg 5595113074 fix(gui): don't fetch usage report preview unnecessarily on GUI load (#10395)
IMHO the logic here was inverted. The only use for the report data is to
show a preview when we ask the user whether they want to participate in
usage reporting. However, the GUI would first load the report data and
then consider whether we wanted to show that dialog or not. Instead,
only load if it we're going to show the dialog.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-16 18:01:17 +02:00
Jakob Borg ea19ec64bf fix(ur): properly skip zero/empty fields in report (#10394)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-15 20:35:59 +00:00
Syncthing Release Automation 9de6c5ed69 chore(gui, man, authors): update docs, translations, and contributors 2025-09-15 03:52:28 +00:00
Jakob Borg d037681fd1 fix: improve conflict detection by tracking previous file hash (fixes #10349) (#10351)
This adds a new field to the file information we keep, the "previous
blocks hash". This is the hash of the file contents as it was in its
previous incarnation. That is, every scan that updates the blocks hash
will move the current hash to the "previous" field.

This enables an addition to the conflict detection algorithm: if the
file to be synced is in conflict with the current file on disk
(version-counter wise), but it indicates that it was based on the
precise contents we have (new.prevBlocksHash == current.blocksHash),
then it's not really a conflict.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-13 16:16:28 +02:00
Jakob Borg 1b0eaa093a chore(policy): increase power & responsibility for maintainers
This adds a rule where a maintainer can merge a PR on their own even in
non-trivial cases, which we (I) already do as-is today, but by breaking
the rules instead of following them. This just codifies that behavior.
If we get to a point where it's no longer necessary, that'd be cool.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-13 15:42:54 +02:00
Jakob Borg 3382ccc3f1 chore(model): slightly deflake TestRecvOnlyRevertOwnID (#10390)
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-12 09:41:47 +00:00
Jakob Borg 9ee208b441 chore(sqlite): use normalised tables for file names and versions (#10383)
This changes the files table to use normalisation for the names and
versions. The idea is that these are often common between all remote
devices, and repeating an integer is more efficient than repeating a
long string. A new benchmark bears this out; for a database with 100k
files shared between 31 devices, with some worst case assumption on
version vector size, the database is reduced in size by 50% and the test
finishes quicker:

    Current:
        db_bench_test.go:322: Total size: 6263.70 MiB
    --- PASS: TestBenchmarkSizeManyFilesRemotes (1084.89s)

    New:
        db_bench_test.go:326: Total size: 3049.95 MiB
    --- PASS: TestBenchmarkSizeManyFilesRemotes (776.97s)

The other benchmarks end up about the same within the margin of
variability, with one possible exception being that RemoteNeed seems to
be a little slower on average:

                                          old files/s   new files/s
    Update/n=RemoteNeed/size=1000-8            5.051k        4.654k
    Update/n=RemoteNeed/size=2000-8            5.201k        4.384k
    Update/n=RemoteNeed/size=4000-8            4.943k        4.242k
    Update/n=RemoteNeed/size=8000-8            5.099k        3.527k
    Update/n=RemoteNeed/size=16000-8           3.686k        3.847k
    Update/n=RemoteNeed/size=30000-8           4.456k        3.482k

I'm not sure why, possibly that query can be optimised anyhow.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-12 09:27:41 +00:00
Jakob Borg dd90e8ec7a fix(api): limit size of allowed authentication request (#10386)
We have a slightly naive io.ReadAll on the authentication handler, which
can result in unlimited memory consumption from an unauthenticated API
endpoint. Add a reasonable limit there.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-11 10:11:29 +00:00
Jakob Borg aa6ae0f3b0 fix(sqlite): add _txlock=immediate to modernc implementation (#10384)
For symmetry with the CGO variant.

https://pkg.go.dev/modernc.org/sqlite#Driver.Open

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-11 06:16:31 +00:00
Jakob Borg e8b256793a chore: clean up migrated database (#10381)
Remove the migrated v0.14.0 database format after two weeks. Remove a
few old patterns that are no longer relevant. Ensure the cleanup runs in
both the config and database directories.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-10 12:23:35 +02:00
Catfriend1 8233279a65 chore(ursrv): update regex patterns for Syncthing-Fork entries (#10380)
Update regex patterns for Syncthing-Fork entries

Signed-off-by: Catfriend1 <16361913+Catfriend1@users.noreply.github.com>
2025-09-09 14:34:12 +02:00
Jakob Borg 8e5d5802cc chore(ursrv): calculate more fine-grained percentiles
Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-09 07:37:39 +02:00
Jakob Borg 25ae01b0d7 chore(sqlite): skip database GC entirely when it's provably unnecessary (#10379)
Store the sequence number of the last GC sweep in a KV. Next time, if it
matches we can just skip GC because nothing has been added or removed.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-08 08:55:04 +02:00
Syncthing Release Automation 66583927f8 chore(gui, man, authors): update docs, translations, and contributors 2025-09-08 03:52:21 +00:00
Simon Frei f0328abeaa chore(scanner): always return values to the pools when hashing blocks (#10377)
There are some return statements in between, but putting back the values
isn't my motivation (hardly ever happens), I just find this more
readable. Same with moving `hashLength`: Placed next to the pool the
connection with `sha256.New()` is closer.

Followup to:
chore(scanner): reduce memory pressure by using pools inside hasher #10222
6e26fab3a0

Signed-off-by: Simon Frei <freisim93@gmail.com>
2025-09-07 17:00:19 +02:00
Jakob Borg 4b8d07d91c fix(sqlite): explicitly set temporary directory location (fixes #10368) (#10376)
On Unixes, avoid the /tmp which is likely to become the chosen default.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-07 14:04:47 +02:00
Jakob Borg c33daca3b4 fix(sqlite): less impactful periodic garbage collection (#10374)
Periodic garbage collection can take a long time on large folders. The worst
step is the one for blocks, which are typically orders of magnitude more
numerous than files or block lists.

This improves the situation in by running blocks GC in a number of smaller
range chunks, in random order, and stopping after a time limit. At most ten
minutes per run will be spent garbage collecting blocklists and blocks.

With this, we're not guaranteed to complete a full GC on every run, but
we'll make some progress and get there eventually.

Signed-off-by: Jakob Borg <jakob@kastelo.net>
2025-09-07 14:04:29 +02:00
Amin Vakil a533f453f8 build: trigger nightly build only on syncthing repo (#10375)
Signed-off-by: Amin Vakil <info@aminvakil.com>
2025-09-07 14:03:33 +02:00
264 changed files with 11186 additions and 6821 deletions
+17 -2
View File
@@ -1,13 +1,28 @@
version: 2
updates:
- package-ecosystem: "github-actions"
directory: "/"
schedule:
interval: monthly
open-pull-requests-limit: 10
cooldown:
default-days: 14
groups:
actions:
applies-to: version-updates
patterns:
- "*"
- package-ecosystem: "gomod"
directory: "/"
schedule:
interval: monthly
open-pull-requests-limit: 10
allow:
- dependency-type: direct
cooldown:
default-days: 14
groups:
dependencies:
applies-to: version-updates
patterns:
- "*"
+11 -9
View File
@@ -7,7 +7,7 @@ on:
- infra-*
env:
GO_VERSION: "~1.25.0"
GO_VERSION: "~1.26.0"
CGO_ENABLED: "0"
BUILD_USER: docker
BUILD_HOST: github.syncthing.net
@@ -19,9 +19,8 @@ permissions:
jobs:
docker-syncthing:
name: Build and push Docker images
if: github.repository == 'syncthing/syncthing'
if: github.repository_owner == 'syncthing'
runs-on: ubuntu-latest
environment: docker
strategy:
matrix:
pkg:
@@ -30,23 +29,23 @@ jobs:
- stupgrades
- ursrv
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ env.GO_VERSION }}
check-latest: true
- name: Login to Docker Hub
uses: docker/login-action@v3
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
username: ${{ secrets.DOCKERHUB_USERNAME }}
password: ${{ secrets.DOCKERHUB_TOKEN }}
- name: Login to GHCR
uses: docker/login-action@v3
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: ghcr.io
username: ${{ github.actor }}
@@ -59,8 +58,11 @@ jobs:
mv ${{ matrix.pkg }} ${{ matrix.pkg }}-linux-"$arch"
done
- name: Set up QEMU
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Set Docker tags (all branches)
run: |
@@ -74,7 +76,7 @@ jobs:
echo "TAGS=$tags" >> $GITHUB_ENV
- name: Build and push
uses: docker/build-push-action@v5
uses: docker/build-push-action@ca052bb54ab0790a636c9b5f226502c73d547a25 # v5
with:
context: .
file: ./Dockerfile.${{ matrix.pkg }}
-18
View File
@@ -1,18 +0,0 @@
name: Build Syncthing (Nightly)
on:
schedule:
# Run nightly build at 05:00 UTC
- cron: '00 05 * * *'
workflow_dispatch:
permissions:
contents: write
packages: write
jobs:
build-syncthing:
uses: ./.github/workflows/build-syncthing.yaml
# if we only want nightlies to run for specific users:
# if: contains(fromJSON('["syncthing", "calmh"]'), github.repository_owner)
secrets: inherit
+140 -98
View File
@@ -9,11 +9,16 @@ on:
workflow_call:
workflow_dispatch:
permissions:
contents: read
issues: read
pull-requests: read
env:
# The go version to use for builds. We set check-latest to true when
# installing, so we get the latest patch version that matches the
# expression.
GO_VERSION: "~1.25.0"
GO_VERSION: "~1.26.0"
# Optimize compatibility on the slow architectures.
GOMIPS: softfloat
@@ -51,12 +56,12 @@ jobs:
release-generation: ${{ steps.get-version.outputs.release-generation }}
go-version: ${{ steps.get-go.outputs.go-version }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
ref: ${{ github.ref }} # https://github.com/actions/checkout/issues/882
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ env.GO_VERSION }}
cache: false
@@ -103,7 +108,7 @@ jobs:
runner: ["windows-latest", "ubuntu-latest", "macos-latest"]
# The oldest version in this list should match what we have in our go.mod.
# Variables don't seem to be supported here, or we could have done something nice.
go: ["~1.24.0", "~1.25.0"]
go: ["~1.25.0", "~1.26.0"]
runs-on: ${{ matrix.runner }}
steps:
- name: Set git to use LF
@@ -116,9 +121,9 @@ jobs:
git config --global core.autocrlf false
git config --global core.eol lf
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ matrix.go }}
cache: true
@@ -159,7 +164,7 @@ jobs:
needs:
- build-test
- package-linux
- package-illumos
# - package-illumos
- package-cross
- package-source
- package-debian
@@ -168,7 +173,7 @@ jobs:
- golangci
- meta
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
#
# Windows
@@ -183,21 +188,21 @@ jobs:
VERSION: ${{ needs.facts.outputs.version }}
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
go-version: "~1.25.7" # temporarily stay on Go 1.25 due to linker error on Go 1.26
cache: false
- uses: mlugg/setup-zig@v2
- uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2
- uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-package-windows-${{ hashFiles('**/go.sum') }}
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-package-windows-${{ hashFiles('go.sum') }}
- name: Install dependencies
run: |
@@ -229,13 +234,12 @@ jobs:
codesign-windows:
name: Codesign for Windows
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
environment: release
runs-on: windows-latest
needs:
- package-windows
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: unsigned-packages-windows
path: packages
@@ -249,7 +253,7 @@ jobs:
}
- name: Sign files with Trusted Signing
uses: azure/trusted-signing-action@v0.5.1
uses: azure/trusted-signing-action@0d74250c661747df006298d0fb49944c10f16e03 # v0.5.1
with:
azure-tenant-id: ${{ secrets.AZURE_TRUSTED_SIGNING_TENANT_ID }}
azure-client-id: ${{ secrets.AZURE_TRUSTED_SIGNING_CLIENT_ID }}
@@ -284,56 +288,78 @@ jobs:
#
package-linux:
name: Package for Linux
name: Package for Linux (${{ matrix.group }})
runs-on: ubuntu-latest
needs:
- facts
strategy:
fail-fast: false
# split the build into three groups with roughtly the same amount of
# work, in order to reduce wall clock time
matrix:
include:
- group: common
targets: |
amd64 zig cc -target x86_64-linux-musl
386 zig cc -target x86-linux-musl
arm zig cc -target arm-linux-musleabi -mcpu=arm1136j_s
arm64 zig cc -target aarch64-linux-musl
extra-packages: ""
- group: mips
targets: |
mips zig cc -target mips-linux-musleabi
mipsle zig cc -target mipsel-linux-musleabi
mips64 mips64-linux-gnuabi64-gcc
mips64le mips64el-linux-gnuabi64-gcc
extra-packages: "gcc-mips64-linux-gnuabi64 gcc-mips64el-linux-gnuabi64"
- group: other
targets: |
riscv64 zig cc -target riscv64-linux-musl
s390x zig cc -target s390x-linux-musl
loong64 zig cc -target loongarch64-linux-musl
ppc64le zig cc -target powerpc64le-linux-musl
extra-packages: ""
env:
VERSION: ${{ needs.facts.outputs.version }}
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
- uses: mlugg/setup-zig@v2
- uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2
- uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-package-${{ hashFiles('**/go.sum') }}
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-package-linux-${{ matrix.group }}-${{ hashFiles('go.sum') }}
- name: Install extra packages
if: matrix.extra-packages != ''
run: sudo apt-get install -y ${{ matrix.extra-packages }}
- name: Create packages
run: |
sudo apt-get install -y gcc-mips64-linux-gnuabi64 gcc-mips64el-linux-gnuabi64
for tgt in syncthing stdiscosrv strelaysrv ; do
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch amd64 -cc "zig cc -target x86_64-linux-musl" tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch 386 -cc "zig cc -target x86-linux-musl" tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch arm -cc "zig cc -target arm-linux-musleabi -mcpu=arm1136j_s" tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch arm64 -cc "zig cc -target aarch64-linux-musl" tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch mips -cc "zig cc -target mips-linux-musleabi" tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch mipsle -cc "zig cc -target mipsel-linux-musleabi" tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch mips64 -cc mips64-linux-gnuabi64-gcc tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch mips64le -cc mips64el-linux-gnuabi64-gcc tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch riscv64 -cc "zig cc -target riscv64-linux-musl" tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch s390x -cc "zig cc -target s390x-linux-musl" tar "$tgt"
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch loong64 -cc "zig cc -target loongarch64-linux-musl" tar "$tgt"
# go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch ppc64 -cc "zig cc -target powerpc64-linux-musl" tar "$tgt" # fails with linkmode not supported
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch ppc64le -cc "zig cc -target powerpc64le-linux-musl" tar "$tgt"
echo "$TARGETS" | while read -r arch cc; do
[ -z "$arch" ] && continue
for tgt in syncthing stdiscosrv strelaysrv ; do
go run build.go -tags "${{env.TAGS_LINUX}}" -goos linux -goarch "$arch" -cc "$cc" tar "$tgt"
done
done
env:
CGO_ENABLED: "1"
EXTRA_LDFLAGS: "-linkmode=external -extldflags=-static"
TARGETS: ${{ matrix.targets }}
- name: Archive artifacts
uses: actions/upload-artifact@v4
with:
name: packages-linux
name: packages-linux-${{ matrix.group }}
path: |
*.tar.gz
compat.json
@@ -347,10 +373,10 @@ jobs:
VERSION: ${{ needs.facts.outputs.version }}
GO_VERSION: ${{ needs.facts.outputs.go-version }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Build syncthing in OmniOS VM
uses: vmactions/omnios-vm@v1
uses: vmactions/omnios-vm@68da93c6d9812b29fc90c5b5141b093f84a590fb # v1
with:
envs: "VERSION GO_VERSION CGO_ENABLED"
usesh: true
@@ -380,7 +406,6 @@ jobs:
package-macos:
name: Package for macOS
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
environment: release
runs-on: macos-latest
needs:
- facts
@@ -389,9 +414,9 @@ jobs:
VERSION: ${{ needs.facts.outputs.version }}
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
@@ -401,7 +426,7 @@ jobs:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-package-${{ hashFiles('**/go.sum') }}
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-package-${{ hashFiles('go.sum') }}
- name: Import signing certificate
if: env.CODESIGN_IDENTITY != ''
@@ -478,13 +503,12 @@ jobs:
notarize-macos:
name: Notarize for macOS
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
environment: release
needs:
- package-macos
runs-on: macos-latest
steps:
- name: Download artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: packages-macos
@@ -517,9 +541,9 @@ jobs:
VERSION: ${{ needs.facts.outputs.version }}
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
@@ -529,7 +553,7 @@ jobs:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-cross-${{ hashFiles('**/go.sum') }}
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-cross-${{ hashFiles('go.sum') }}
- name: Create packages
run: |
@@ -584,9 +608,9 @@ jobs:
VERSION: ${{ needs.facts.outputs.version }}
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
@@ -619,11 +643,10 @@ jobs:
sign-for-upgrade:
name: Sign for upgrade
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
environment: release
needs:
- codesign-windows
- package-linux
- package-illumos
# - package-illumos
- package-macos
- package-cross
- package-source
@@ -633,17 +656,21 @@ jobs:
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
repository: syncthing/release-tools
path: tools
- name: Download artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
pattern: packages-*
path: packages
merge-multiple: true
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
@@ -657,8 +684,6 @@ jobs:
export PRIVATE_KEY="$RUNNER_TEMP/privkey.pem"
export PATH="$PATH:$(go env GOPATH)/bin"
echo "$STSIGTOOL_PRIVATE_KEY" | base64 -d > "$PRIVATE_KEY"
mkdir packages
mv packages-*/* packages
pushd packages
"$GITHUB_WORKSPACE/tools/sign-only"
rm -f "$PRIVATE_KEY"
@@ -714,14 +739,14 @@ jobs:
VERSION: ${{ needs.facts.outputs.version }}
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
- uses: ruby/setup-ruby@v1
- uses: ruby/setup-ruby@eab2afb99481ca09a4e91171a8e0aee0e89bfedd # v1
with:
ruby-version: '3.0'
@@ -729,14 +754,14 @@ jobs:
run: |
gem install fpm
- uses: mlugg/setup-zig@v2
- uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2
- uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-debian-${{ hashFiles('**/go.sum') }}
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-debian-${{ hashFiles('go.sum') }}
- name: Package for Debian (CGO)
run: |
@@ -764,24 +789,23 @@ jobs:
publish-nightly:
name: Publish nightly build
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && startsWith(github.ref, 'refs/heads/release-nightly')
environment: release
needs:
- sign-for-upgrade
- facts
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
repository: syncthing/release-tools
path: tools
- name: Download artifacts
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: packages-signed
path: packages
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
@@ -813,9 +837,11 @@ jobs:
publish-release-files:
name: Publish release files
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release' || startsWith(github.ref, 'refs/tags/v'))
environment: release
permissions:
contents: write
id-token: write
attestations: write
artifact-metadata: write
needs:
- sign-for-upgrade
- package-debian
@@ -825,27 +851,27 @@ jobs:
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
ref: ${{ github.ref }} # https://github.com/actions/checkout/issues/882
- name: Download signed packages
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: packages-signed
path: packages
- name: Download debian packages
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: debian-packages
path: packages
- uses: actions/setup-go@v5
- name: Create GitHub build provenance attestations
uses: actions/attest-build-provenance@v3
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
subject-path: packages/*
- name: Push to object store (${{ env.VERSION }})
uses: docker://docker.io/rclone/rclone:latest
@@ -883,14 +909,17 @@ jobs:
if ! gh release view --json name "$VERSION" >/dev/null 2>&1 ; then
gh release create "$VERSION" \
$maybePrerelease \
--draft \
--title "$VERSION" \
--notes-from-tag
fi
gh release upload --clobber "$VERSION" \
packages/*.asc packages/*.json \
packages/syncthing-*.tar.gz \
packages/syncthing-*.zip \
packages/syncthing_*.deb
gh release edit "$VERSION" --draft=false
PKGS=$(pwd)/packages
cd /tmp # gh will not release for repo x while inside repo y
@@ -899,12 +928,14 @@ jobs:
if ! gh release view --json name "$VERSION" >/dev/null 2>&1 ; then
gh release create "$VERSION" \
$maybePrerelease \
--draft \
--title "$VERSION" \
--notes "https://github.com/syncthing/syncthing/releases/tag/$VERSION"
fi
gh release upload --clobber "$VERSION" \
$PKGS/*.asc \
$PKGS/*${repo}*
gh release edit "$VERSION" --draft=false
done
env:
GH_TOKEN: ${{ secrets.ACTIONS_GITHUB_TOKEN }}
@@ -916,7 +947,6 @@ jobs:
publish-apt:
name: Publish APT
if: github.repository_owner == 'syncthing' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch') && (github.ref == 'refs/heads/release-nightly' || startsWith(github.ref, 'refs/tags/v'))
environment: release
needs:
- package-debian
- facts
@@ -927,7 +957,7 @@ jobs:
runs-on: ubuntu-latest
steps:
- name: Download packages
uses: actions/download-artifact@v4
uses: actions/download-artifact@v7
with:
name: debian-packages
path: packages
@@ -949,7 +979,7 @@ jobs:
- name: Prepare packages
run: |
sudo chown -R $(id -u) apt/pool
mv packages/*.deb apt/pool
mv -n packages/*.deb apt/pool
- name: Update archive
uses: docker://ghcr.io/kastelo/ezapt:latest
@@ -988,6 +1018,7 @@ jobs:
VERSION: ${{ needs.facts.outputs.version }}
RELEASE_KIND: ${{ needs.facts.outputs.release-kind }}
strategy:
fail-fast: false
matrix:
pkg:
- syncthing
@@ -1004,55 +1035,60 @@ jobs:
dockerfile: Dockerfile.stdiscosrv
image: discosrv
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
- uses: mlugg/setup-zig@v2
- uses: mlugg/setup-zig@d1434d08867e3ee9daa34448df10607b98908d29 # v2
- uses: actions/cache@v4
with:
path: |
~/.cache/go-build
~/go/pkg/mod
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-docker-${{ matrix.pkg }}-${{ hashFiles('**/go.sum') }}
key: ${{ runner.os }}-go-${{ needs.facts.outputs.go-version }}-docker-${{ matrix.pkg }}-${{ hashFiles('go.sum') }}
- name: Build binaries (CGO)
run: |
mkdir bin
# amd64
go run build.go -goos linux -goarch amd64 -tags "${{env.TAGS_LINUX}}" -cc "zig cc -target x86_64-linux-musl" -no-upgrade build ${{ matrix.pkg }}
mv ${{ matrix.pkg }} ${{ matrix.pkg }}-linux-amd64
mv ${{ matrix.pkg }} bin/${{ matrix.pkg }}-linux-amd64
# arm64
go run build.go -goos linux -goarch arm64 -tags "${{env.TAGS_LINUX}}" -cc "zig cc -target aarch64-linux-musl" -no-upgrade build ${{ matrix.pkg }}
mv ${{ matrix.pkg }} ${{ matrix.pkg }}-linux-arm64
mv ${{ matrix.pkg }} bin/${{ matrix.pkg }}-linux-arm64
# arm
go run build.go -goos linux -goarch arm -tags "${{env.TAGS_LINUX}}" -cc "zig cc -target arm-linux-musleabi -mcpu=arm1136j_s" -no-upgrade build ${{ matrix.pkg }}
mv ${{ matrix.pkg }} ${{ matrix.pkg }}-linux-arm
mv ${{ matrix.pkg }} bin/${{ matrix.pkg }}-linux-arm
env:
CGO_ENABLED: "1"
BUILD_USER: docker
EXTRA_LDFLAGS: "-linkmode=external -extldflags=-static"
- name: Login to GHCR
uses: docker/login-action@v3
uses: docker/login-action@c94ce9fb468520275223c153574b00df6fe4bcc9 # v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Set up QEMU
uses: docker/setup-qemu-action@c7c53464625b32c7a7e944ae62b3e17d2b600130 # v3
- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v3
uses: docker/setup-buildx-action@8d2750c68a42422c14e847fe6c8ac0403b4cbd6f # v3
- name: Set version tags
run: |
version=${VERSION#v}
repo=ghcr.io/${{ github.repository_owner }}/${{ matrix.image }}
ref="${{github.ref_name}}"
ref="${REF_NAME}"
ref=${ref//\//-} # slashes to dashes
# List of tags for ghcr.io
@@ -1070,11 +1106,18 @@ jobs:
echo Pushing to $tags
echo "DOCKER_TAGS=$tags" >> $GITHUB_ENV
env:
REF_NAME: ${{github.ref_name}}
- name: Prepare context dir
run: |
mkdir ctx
mv bin/* script ctx
- name: Build and push Docker image
uses: docker/build-push-action@v5
uses: docker/build-push-action@10e90e3645eae34f1e60eeb005ba3a3d33f178e8 # v6
with:
context: .
context: ctx
file: ${{ matrix.dockerfile }}
platforms: linux/amd64,linux/arm64,linux/arm/7
tags: ${{ env.DOCKER_TAGS }}
@@ -1094,12 +1137,11 @@ jobs:
runs-on: ubuntu-latest
needs:
- docker-ghcr
environment: docker
env:
DOCKERHUB_USERNAME: ${{ secrets.DOCKERHUB_USERNAME }}
DOCKERHUB_TOKEN: ${{ secrets.DOCKERHUB_TOKEN }}
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- name: Sync images
uses: docker://docker.io/regclient/regsync:latest
with:
@@ -1117,9 +1159,9 @@ jobs:
needs:
- facts
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: ${{ needs.facts.outputs.go-version }}
cache: false
@@ -1139,8 +1181,8 @@ jobs:
name: Run golangci-lint
if: github.event_name == 'pull_request'
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
go-version: 'stable'
@@ -1148,7 +1190,7 @@ jobs:
run: go run build.go assets
- name: golangci-lint
uses: golangci/golangci-lint-action@v8
uses: golangci/golangci-lint-action@4afd733a84b1f43292c63897423277bb7f4313a9 # v8
with:
only-new-issues: true
@@ -1160,8 +1202,8 @@ jobs:
name: Run meta checks
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-go@v5
- uses: actions/checkout@v5
- uses: actions/setup-go@v6
with:
go-version: 'stable'
+4 -1
View File
@@ -2,6 +2,9 @@ name: Mirrors
on: [push, delete]
permissions:
contents: read
jobs:
codeberg:
name: Mirror to Codeberg
@@ -11,7 +14,7 @@ jobs:
- uses: actions/checkout@v3
with:
fetch-depth: 0
- uses: yesolutions/mirror-action@master
- uses: yesolutions/mirror-action@662fce0eced8996f64d7fa264d76cddd84827f33 # master
with:
REMOTE: ssh://git@codeberg.org/${{ github.repository }}.git
GIT_SSH_PRIVATE_KEY: ${{ secrets.CODEBERG_PUSH_KEY }}
+21
View File
@@ -0,0 +1,21 @@
name: Org membership recommendations
on:
workflow_dispatch:
schedule:
- cron: '0 0 1 * *'
jobs:
run-recommendation:
name: Check for a recommendation
if: github.repository_owner == 'syncthing'
runs-on: ubuntu-latest
steps:
- uses: docker://ghcr.io/calmh/github-org-members:latest
env:
GITHUB_ORGANISATION: syncthing
GITHUB_TOKEN: ${{ secrets.GOM_GITHUB_TOKEN }}
GOM_IGNORE_USERS: ${{ secrets.GOM_IGNORE_USERS }}
GOM_ALSO_REPOS: ${{ secrets.GOM_ALSO_REPOS }}
+2 -1
View File
@@ -20,8 +20,9 @@ jobs:
labels:
name: Set labels
if: github.repository_owner == 'syncthing'
runs-on: ubuntu-latest
steps:
- uses: srvaroa/labeler@v1
- uses: srvaroa/labeler@9c29ad1ef33d169f9ef33c52722faf47a566bcf3 # v1
env:
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
+4 -4
View File
@@ -12,16 +12,16 @@ permissions:
jobs:
create-release-tag:
name: Create release tag
if: github.repository_owner == 'syncthing'
runs-on: ubuntu-latest
environment: release
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
ref: ${{ github.ref }} # https://github.com/actions/checkout/issues/882
token: ${{ secrets.ACTIONS_GITHUB_TOKEN }}
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: stable
@@ -53,7 +53,7 @@ jobs:
git push origin "$NEXT"
- name: Trigger the build
uses: benc-uk/workflow-dispatch@v1
uses: benc-uk/workflow-dispatch@7a027648b88c2413826b6ddd6c76114894dc5ec4 # v1
with:
workflow: build-syncthing.yaml
ref: refs/tags/${{ env.NEXT }}
+6 -2
View File
@@ -5,14 +5,18 @@ on:
# Run nightly build at 01:00 UTC
- cron: '00 01 * * *'
permissions:
contents: write
jobs:
trigger-nightly:
runs-on: ubuntu-latest
name: Push to release-nightly to trigger build
if: github.repository_owner == 'syncthing'
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
token: ${{ secrets.ACTIONS_GITHUB_TOKEN }}
fetch-depth: 0
@@ -4,17 +4,20 @@ on:
schedule:
- cron: '42 3 * * 1'
permissions:
contents: write
jobs:
update_transifex_docs:
runs-on: ubuntu-latest
name: Update translations and documentation
steps:
- uses: actions/checkout@v4
- uses: actions/checkout@v5
with:
fetch-depth: 0
token: ${{ secrets.ACTIONS_GITHUB_TOKEN }}
- uses: actions/setup-go@v5
- uses: actions/setup-go@v6
with:
go-version: stable
- run: |
+9
View File
@@ -70,6 +70,15 @@ linters:
# Rollback errors can be ignored
- linters: [errcheck]
source: Rollback
# Embedded fields named in selectors may add clarity
- linters: [staticcheck]
text: QF1008
# Don't necessarily rewrite !(foo || bar) to !foo && !bar
- linters: [staticcheck]
text: QF1001
# Don't necessarily pass the context just for the sake of the logger
- linters: [contextcheck]
text: "->log`"
settings:
sloglint:
context: "scope"
+20 -5
View File
@@ -8,17 +8,20 @@
policy:
approval:
- subject is conventional commit
- project metadata requires maintainer approval
- or:
- project metadata requires maintainer approval
- a maintainer claims responsibility
- or:
- is approved by a syncthing contributor
- is a translation or dependency update by a contributor
- is a trivial change by a contributor
- a maintainer claims responsibility
# Additionally, contributors can disapprove of a PR
# Additionally, maintainers can disapprove of a PR
disapproval:
requires:
teams:
- syncthing/contributors
- syncthing/maintainers
# The rules for the policy are described below.
@@ -49,7 +52,8 @@ approval_rules:
- syncthing/maintainers
options:
ignore_update_merges: true
allow_contributor: true
allow_non_author_contributor: true
invalidate_on_push: true
# Regular pull requests require approval by an active contributor
- name: is approved by a syncthing contributor
@@ -59,7 +63,8 @@ approval_rules:
- syncthing/contributors
options:
ignore_update_merges: true
allow_contributor: true
allow_non_author_contributor: true
invalidate_on_push: true
# Changes to some files (translations, dependencies, compatibility) do not
# require approval if they were proposed by a contributor and have a
@@ -96,3 +101,13 @@ approval_rules:
has_author_in:
teams:
- syncthing/contributors
# A member of the maintainers group can take responsibility by adding the
# appropriate label.
- name: a maintainer claims responsibility
if:
has_labels:
- maintainer-responsibility
has_author_in:
teams:
- syncthing/maintainers
+16 -1
View File
@@ -32,6 +32,7 @@ Evgeny Kuznetsov <evgeny@kuznetsov.md>
greatroar <61184462+greatroar@users.noreply.github.com>
Lars K.W. Gohlke (lkwg82) <lkwg82@gmx.de>
Lode Hoste (Zillode) <zillode@zillode.be>
Marcus B Spencer <marcus@marcusspencer.xyz> <marcus@marcusspencer.us>
Michael Ploujnikov (plouj) <ploujj@gmail.com>
Ross Smith II (rasa) <ross@smithii.com>
Stefan Tatschner (rumpelsepp) <stefan@sevenbyte.org> <rumpelsepp@sevenbyte.org> <stefan@rumpelsepp.org>
@@ -67,6 +68,7 @@ Aurélien Rainone <476650+arl@users.noreply.github.com>
BAHADIR YILMAZ <bahadiryilmaz32@gmail.com>
Bart De Vries (mogwa1) <devriesb@gmail.com>
Beat Reichenbach <44111292+beatreichenbach@users.noreply.github.com>
Ben Norcombe <bennorcombe@pm.me>
Ben Shepherd (benshep) <bjashepherd@gmail.com>
Ben Sidhom (bsidhom) <bsidhom@gmail.com>
Benedikt Heine (bebehei) <bebe@bebehei.de>
@@ -89,6 +91,7 @@ chucic <chucic@seznam.cz>
cjc7373 <niuchangcun@gmail.com>
Colin Kennedy (moshen) <moshen.colin@gmail.com>
Cromefire_ <tim.l@nghorst.net> <26320625+cromefire@users.noreply.github.com>
cui <cuiweixie@gmail.com>
Cyprien Devillez <cypx@users.noreply.github.com>
d-volution <49024624+d-volution@users.noreply.github.com>
Dan <benda.daniel@gmail.com>
@@ -118,6 +121,8 @@ Elliot Huffman <thelich2@gmail.com>
Emil Hessman (ceh) <emil@hessman.se>
Eng Zer Jun <engzerjun@gmail.com>
entity0xfe <109791748+entity0xfe@users.noreply.github.com> <entity0xfe@my.domain>
Epifeny <batterystarter@gmail.com>
epifeny <epifeny@users.noreply.github.com>
Eric Lesiuta <elesiuta@gmail.com>
Erik Meitner (WSGCSysadmin) <e.meitner@willystreet.coop>
Evan Spensley <94762716+0evan@users.noreply.github.com>
@@ -169,6 +174,7 @@ John Rinehart (fuzzybear3965) <johnrichardrinehart@gmail.com>
Jonas Thelemann <e-mail@jonas-thelemann.de>
Jonathan <artback@protonmail.com> <jonagn@gmail.com>
Jose Manuel Delicado (jmdaweb) <jmdaweb@hotmail.com> <jmdaweb@users.noreply.github.com>
JRNitre <nichinichisou67@outlook.com>
jtagcat <git-514635f7@jtag.cat> <git-12dbd862@jtag.cat>
Julian Lehrhuber <jul13579@users.noreply.github.com>
Jörg Thalheim <Mic92@users.noreply.github.com>
@@ -191,6 +197,7 @@ Leo Arias (elopio) <yo@elopio.net>
Liu Siyuan (liusy182) <liusy182@gmail.com> <liusy182@hotmail.com>
Lord Landon Agahnim (LordLandon) <lordlandon@gmail.com>
LSmithx2 <42276854+lsmithx2@users.noreply.github.com>
Luiz Angelo Daros de Luca <luizluca@gmail.com>
Lukas Lihotzki <lukas@lihotzki.de>
Luke Hamburg <1992842+luckman212@users.noreply.github.com>
luzpaz <luzpaz@users.noreply.github.com>
@@ -198,7 +205,6 @@ Majed Abdulaziz (majedev) <majed.alhajry@gmail.com>
Marc Laporte (marclaporte) <marc@marclaporte.com> <marc@laporte.name>
Marcel Meyer <mm.marcelmeyer@gmail.com>
Marcin Dziadus (marcindziadus) <dziadus.marcin@gmail.com>
Marcus B Spencer <marcus@marcusspencer.xyz> <marcus@marcusspencer.us>
Marcus Legendre <marcus.legendre@gmail.com>
Mario Majila <mariustshipichik@gmail.com>
Mark Pulford (mpx) <mark@kyne.com.au>
@@ -215,8 +221,10 @@ Max <github@germancoding.com>
Max Schulze (kralo) <max.schulze@online.de> <kralo@users.noreply.github.com>
MaximAL <almaximal@ya.ru>
Maximilian <maxi.rostock@outlook.de> <public@complexvector.space>
Maxwell G <maxwell@gtmx.me>
Michael Jephcote (Rewt0r) <rewt0r@gmx.com> <Rewt0r@users.noreply.github.com>
Michael Rienstra <mrienstra@gmail.com>
Michael Wang 汪東陽 <michael19920327@gmail.com>
MichaIng <micha@dietpi.com>
Migelo <miha@filetki.si>
Mike Boone <mike@boonedocks.net>
@@ -257,9 +265,11 @@ Philippe Schommers (filoozoom) <philippe@schommers.be>
Phill Luby (pluby) <phill.luby@newredo.com>
Piotr Bejda (piobpl) <piotrb10@gmail.com>
polyfloyd <polyfloyd@users.noreply.github.com>
Prathik P Kulkarni <83969842+prathik8794@users.noreply.github.com>
pullmerge <166967364+pullmerge@users.noreply.github.com>
Quentin Hibon <qh.public@yahoo.com>
Rahmi Pruitt <rjpruitt16@gmail.com>
RealCharlesChia <161665317+RealCharlesChia@users.noreply.github.com>
red_led <red-led@users.noreply.github.com>
Robert Carosi (nov1n) <robert@carosi.nl>
Roberto Santalla <roobre@users.noreply.github.com>
@@ -276,6 +286,7 @@ Sergey Mishin (ralder) <ralder@yandex.ru>
Sertonix <83883937+Sertonix@users.noreply.github.com>
Severin von Wnuck-Lipinski <ss7@live.de>
Shaarad Dalvi <60266155+shaaraddalvi@users.noreply.github.com> <shdalv@microsoft.com>
Shivam Kumar <155747305+maishivamhoo123@users.noreply.github.com>
Simon Mwepu <simonmwepu@gmail.com>
Simon Pickup <simon@pickupinfinity.com>
Sly_tom_cat <slytomcat@mail.ru>
@@ -285,6 +296,7 @@ Steven Eckhoff <steven.eckhoff.opensource@gmail.com>
Suhas Gundimeda (snugghash) <suhas.gundimeda@gmail.com> <snugghash@gmail.com>
Sven Bachmann <dev@mcbachmann.de>
Sébastien WENSKE <sebastien@wenske.fr>
Tao <mail@steadytao.com>
Taylor Khan (nelsonkhan) <nelsonkhan@gmail.com>
Terrance <git@terrance.allofti.me>
TheCreeper <TheCreeper@users.noreply.github.com>
@@ -300,7 +312,9 @@ Tom Jakubowski <tom@crystae.net>
Tully Robinson (tojrobinson) <tully@tojr.org>
Tyler Brazier (tylerbrazier) <tyler@tylerbrazier.com>
Tyler Kropp <kropptyler@gmail.com>
Umer-Azaz <umer_azaz@yahoo.com>
Unrud (Unrud) <unrud@openaliasbox.org> <Unrud@users.noreply.github.com>
Val Markovic <val@markovic.io>
vapatel2 <149737089+vapatel2@users.noreply.github.com>
Veeti Paananen (veeti) <veeti.paananen@rojekti.fi>
Victor Buinsky (buinsky) <vix_booja@tut.by>
@@ -308,6 +322,7 @@ Vik <63919734+ViktorOn@users.noreply.github.com>
Vil Brekin (Vilbrekin) <vilbrekin@gmail.com>
villekalliomaki <53118179+villekalliomaki@users.noreply.github.com>
Vladimir Rusinov <vrusinov@google.com> <vladimir.rusinov@gmail.com>
vvaswani <2571660+vvaswani@users.noreply.github.com>
wangguoliang <liangcszzu@163.com>
WangXi <xib1102@icloud.com>
Will Rouesnel <wrouesnel@wrouesnel.com>
+20 -64
View File
@@ -23,52 +23,7 @@ example `UMASK=002`.
**Docker cli**
```
$ docker pull syncthing/syncthing
$ docker run -p 8384:8384 -p 22000:22000/tcp -p 22000:22000/udp -p 21027:21027/udp \
-v /wherever/st-sync:/var/syncthing \
--hostname=my-syncthing \
syncthing/syncthing:latest
```
**Docker compose**
```yml
---
version: "3"
services:
syncthing:
image: syncthing/syncthing
container_name: syncthing
hostname: my-syncthing
environment:
- PUID=1000
- PGID=1000
volumes:
- /wherever/st-sync:/var/syncthing
ports:
- 8384:8384 # Web UI
- 22000:22000/tcp # TCP file transfers
- 22000:22000/udp # QUIC file transfers
- 21027:21027/udp # Receive local discovery broadcasts
restart: unless-stopped
healthcheck:
test: curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1
interval: 1m
timeout: 10s
retries: 3
```
## Discovery
Note that Docker's default network mode prevents local IP addresses from
being discovered, as Syncthing is only able to see the internal IP of the
container on the `172.17.0.0/16` subnet. This will result in poor transfer rates
if local device addresses are not manually configured.
It is therefore advisable to use the [host network mode](https://docs.docker.com/network/host/) instead:
**Docker cli**
```
$ docker pull syncthing/syncthing
$ docker run --network=host \
$ docker run --network=host -e STGUIADDRESS= \
-v /wherever/st-sync:/var/syncthing \
syncthing/syncthing:latest
```
@@ -85,6 +40,7 @@ services:
environment:
- PUID=1000
- PGID=1000
- STGUIADDRESS=
volumes:
- /wherever/st-sync:/var/syncthing
network_mode: host
@@ -96,27 +52,27 @@ services:
retries: 3
```
## Discovery
Please note that Docker's default network mode prevents local IP addresses
from being discovered, as Syncthing can only see the internal IP address of
the container on the `172.17.0.0/16` subnet. This would likely break the ability
for nodes to establish LAN connections properly, resulting in poor transfer
rates unless local device addresses are configured manually.
It is therefore strongly recommended to stick to the [host network mode](https://docs.docker.com/network/host/),
as shown above.
Be aware that syncthing alone is now in control of what interfaces and ports it
listens on. You can edit the syncthing configuration to change the defaults if
there are conflicts.
## GUI Security
By default Syncthing inside the Docker image listens on 0.0.0.0:8384 to
allow GUI connections via the Docker proxy. This is set by the
`STGUIADDRESS` environment variable in the Dockerfile, as it differs from
what Syncthing would otherwise use by default. This means you should set up
authentication in the GUI, like for any other externally reachable Syncthing
instance. If you do not require the GUI, or you use host networking, you can
unset the `STGUIADDRESS` variable to have Syncthing fall back to listening
on 127.0.0.1:
```
$ docker pull syncthing/syncthing
$ docker run -e STGUIADDRESS= \
-v /wherever/st-sync:/var/syncthing \
syncthing/syncthing:latest
```
With the environment variable unset Syncthing will follow what is set in the
configuration file / GUI settings dialog.
By default Syncthing inside the Docker image listens on `0.0.0.0:8384`. This
allows GUI connections when running without host network mode. The example
above unsets the `STGUIADDRESS` environment variable to have Syncthing fall
back to listening on what has been configured in the configuration file or the
GUI settings dialog. By default this is the localhost IP address `127.0.0.1`.
If you configure your GUI to be externally reachable, make sure you set up
authentication and enable TLS.
-2
View File
@@ -15,8 +15,6 @@ import (
"log"
"os"
"path/filepath"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
)
func main() {
-1
View File
@@ -18,7 +18,6 @@ import (
"google.golang.org/protobuf/proto"
"github.com/syncthing/syncthing/internal/gen/discoproto"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/beacon"
"github.com/syncthing/syncthing/lib/discover"
"github.com/syncthing/syncthing/lib/protocol"
-2
View File
@@ -14,8 +14,6 @@ import (
"net/http"
"os"
"time"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
)
type event struct {
-1
View File
@@ -13,7 +13,6 @@ import (
"os"
"path/filepath"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/scanner"
)
-1
View File
@@ -16,7 +16,6 @@ import (
"os"
"time"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/discover"
"github.com/syncthing/syncthing/lib/events"
-1
View File
@@ -12,7 +12,6 @@ import (
"fmt"
"os"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/fs"
"github.com/syncthing/syncthing/lib/ignore"
)
-2
View File
@@ -15,8 +15,6 @@ import (
"os"
"path/filepath"
"time"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
)
func main() {
-1
View File
@@ -12,7 +12,6 @@ import (
"log"
"os"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/signature"
"github.com/syncthing/syncthing/lib/upgrade"
)
+2 -5
View File
@@ -26,7 +26,6 @@ import (
"sync/atomic"
"time"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/protocol"
)
@@ -53,11 +52,9 @@ func main() {
// Run one certificate generator per CPU core.
var wg sync.WaitGroup
for i := 0; i < runtime.GOMAXPROCS(-1); i++ {
wg.Add(1)
go func() {
wg.Go(func() {
generatePrefixed(prefix, &count, found, stop)
wg.Done()
}()
})
}
// Save the result, when one has been found.
-2
View File
@@ -13,8 +13,6 @@ import (
"io"
"os"
"time"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
)
func main() {
+5 -4
View File
@@ -28,7 +28,6 @@ import (
"github.com/alecthomas/kong"
raven "github.com/getsentry/raven-go"
"github.com/prometheus/client_golang/prometheus/promhttp"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/ur"
)
@@ -102,6 +101,8 @@ func main() {
}
log.SetOutput(os.Stdout)
log.Println(build.LongVersionFor("stcrashreceiver"))
if err := http.ListenAndServe(params.Listen, mux); err != nil {
log.Fatalln("HTTP serve:", err)
}
@@ -118,7 +119,7 @@ func handleFailureFn(dsn, failureDir string, ignore *ignorePatterns) func(w http
bs, err := io.ReadAll(lr)
req.Body.Close()
if err != nil {
http.Error(w, err.Error(), 500)
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
@@ -130,7 +131,7 @@ func handleFailureFn(dsn, failureDir string, ignore *ignorePatterns) func(w http
var reports []ur.FailureReport
err = json.Unmarshal(bs, &reports)
if err != nil {
http.Error(w, err.Error(), 400)
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
if len(reports) == 0 {
@@ -141,7 +142,7 @@ func handleFailureFn(dsn, failureDir string, ignore *ignorePatterns) func(w http
version, err := build.ParseVersion(reports[0].Version)
if err != nil {
http.Error(w, err.Error(), 400)
http.Error(w, err.Error(), http.StatusBadRequest)
return
}
for _, r := range reports {
+2 -2
View File
@@ -90,7 +90,7 @@ func sendReport(dsn string, pkt *raven.Packet, userID string) error {
}
// The client sets release and such on the packet before sending, in the
// misguided idea that it knows this better than than the packet we give
// misguided idea that it knows this better than the packet we give
// it. So we copy the values from the packet to the client first...
cli.SetRelease(pkt.Release)
cli.SetEnvironment(pkt.Environment)
@@ -136,7 +136,7 @@ func parseCrashReport(path string, report []byte) (*raven.Packet, error) {
r := bytes.NewReader(report)
ctx, _, err := stack.ScanSnapshot(r, io.Discard, stack.DefaultOpts())
if err != nil && err != io.EOF {
if err != nil && !errors.Is(err, io.EOF) {
return nil, err
}
if ctx == nil || len(ctx.Goroutines) == 0 {
+3 -3
View File
@@ -10,7 +10,7 @@ import (
"bytes"
"compress/gzip"
"crypto/sha256"
"fmt"
"encoding/hex"
"net"
"net/http"
"os"
@@ -23,7 +23,7 @@ import (
// remote IP, and the current month.
func userIDFor(req *http.Request) string {
addr := req.RemoteAddr
if fwd := req.Header.Get("x-forwarded-for"); fwd != "" {
if fwd := req.Header.Get("X-Forwarded-For"); fwd != "" {
addr = fwd
}
if host, _, err := net.SplitHostPort(addr); err == nil {
@@ -32,7 +32,7 @@ func userIDFor(req *http.Request) string {
now := time.Now().Format("200601")
salt := "stcrashreporter"
hash := sha256.Sum256([]byte(salt + addr + now))
return fmt.Sprintf("%x", hash[:8])
return hex.EncodeToString(hash[:8])
}
// 01234567890abcdef... => 01/23
+1 -1
View File
@@ -193,7 +193,7 @@
</div>
<script type="text/javascript" src="https://code.jquery.com/jquery-2.1.4.min.js"></script>
<script type="text/javascript" src="https://code.jquery.com/jquery-3.7.1.min.js"></script>
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/angular.js/1.5.8/angular.min.js"></script>
<script type="text/javascript" src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
</body>
+9 -6
View File
@@ -27,7 +27,7 @@ import (
"github.com/syncthing/syncthing/cmd/infra/strelaypoolsrv/auto"
"github.com/syncthing/syncthing/lib/assets"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/geoip"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/rand"
@@ -147,6 +147,8 @@ func main() {
flag.Parse()
log.Println(build.LongVersionFor("strelaypoolsrv"))
requests = make(chan request, requestQueueLen)
geoip, err := geoip.NewGeoLite2CityProvider(context.Background(), geoipAccountID, geoipLicenseKey, os.TempDir())
if err != nil {
@@ -162,7 +164,7 @@ func main() {
testCert = createTestCertificate()
for i := 0; i < requestProcessors; i++ {
for range requestProcessors {
go requestProcessor(geoip)
}
@@ -180,7 +182,7 @@ func main() {
relayTestsTotal.WithLabelValues("success").Inc()
}
}
// Run the the stats refresher once the relays are loaded.
// Run the stats refresher once the relays are loaded.
statsRefresher(statsRefresh)
}()
@@ -426,7 +428,7 @@ func handleRegister(w http.ResponseWriter, r *http.Request) {
newRelay.URL = uri.String()
} else if host != rhost && relayCert == nil {
if debug {
log.Println("IP address advertised does not match client IP address", r.RemoteAddr, uri)
log.Println("IP address advertised does not match client IP address", rhost, uri)
}
http.Error(w, fmt.Sprintf("IP advertised %s does not match client IP %s", host, rhost), http.StatusUnauthorized)
return
@@ -450,13 +452,13 @@ func handleRegister(w http.ResponseWriter, r *http.Request) {
case requests <- request{&newRelay, reschan, prometheus.NewTimer(relayTestActionsSeconds.WithLabelValues("queue"))}:
result := <-reschan
if result.err != nil {
log.Println("Join from", r.RemoteAddr, "failed:", result.err)
log.Println("Join from", rhost, "failed:", result.err)
globalBlocklist.AddError(rhost)
relayTestsTotal.WithLabelValues("failed").Inc()
http.Error(w, result.err.Error(), http.StatusBadRequest)
return
}
log.Println("Join from", r.RemoteAddr, "succeeded")
log.Println("Join from", rhost, "succeeded")
globalBlocklist.ClearErrors(rhost)
relayTestsTotal.WithLabelValues("success").Inc()
w.Header().Set("Content-Type", "application/json; charset=utf-8")
@@ -653,6 +655,7 @@ func getLocation(host string, geoip *geoip.Provider) location {
type loggingResponseWriter struct {
http.ResponseWriter
statusCode int
}
+2 -4
View File
@@ -108,8 +108,7 @@ func refreshStats() {
results := make(chan statsFetchResult, len(relays))
for _, rel := range relays {
wg.Add(1)
go func(rel *relay) {
wg.Go(func() {
t0 := time.Now()
stats := fetchStats(rel)
duration := time.Since(t0).Seconds()
@@ -123,8 +122,7 @@ func refreshStats() {
relay: rel,
stats: fetchStats(rel),
}
wg.Done()
}(rel)
})
}
wg.Wait()
+3 -1
View File
@@ -25,7 +25,7 @@ import (
"github.com/alecthomas/kong"
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/syncthing/syncthing/internal/slogutil"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/httpcache"
"github.com/syncthing/syncthing/lib/upgrade"
)
@@ -45,6 +45,8 @@ func main() {
Level: slog.LevelInfo,
})))
slog.Info(build.LongVersionFor("stupgrades"))
if err := server(&params); err != nil {
fmt.Printf("Error: %v\n", err)
os.Exit(1)
+3 -1
View File
@@ -13,7 +13,7 @@ import (
"github.com/alecthomas/kong"
"github.com/syncthing/syncthing/cmd/infra/ursrv/serve"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/build"
)
type CLI struct {
@@ -25,6 +25,8 @@ func main() {
Level: slog.LevelInfo,
})))
slog.Info(build.LongVersionFor("ursrv"))
var cli CLI
ctx := kong.Parse(&cli)
if err := ctx.Run(); err != nil {
+9 -8
View File
@@ -8,6 +8,7 @@ package serve
import (
"context"
"fmt"
"log/slog"
"reflect"
"slices"
@@ -46,7 +47,7 @@ func newMetricsSet(srv *server) *metricsSet {
var initForType func(reflect.Type)
initForType = func(t reflect.Type) {
for i := 0; i < t.NumField(); i++ {
for i := range t.NumField() {
field := t.Field(i)
if field.Type.Kind() == reflect.Struct {
initForType(field.Type)
@@ -174,7 +175,7 @@ func (s *metricsSet) addReport(r *contract.Report) {
func (s *metricsSet) addReportStruct(v reflect.Value, gaugeVecs map[string][]string) {
t := v.Type()
for i := 0; i < v.NumField(); i++ {
for i := range v.NumField() {
field := v.Field(i)
if field.Kind() == reflect.Struct {
s.addReportStruct(field, gaugeVecs)
@@ -335,12 +336,12 @@ func (q *metricSummary) Collect(c chan<- prometheus.Metric) {
}
slices.Sort(vs)
c <- prometheus.MustNewConstMetric(q.qDesc, prometheus.GaugeValue, vs[0], append(labelVals, "0")...)
c <- prometheus.MustNewConstMetric(q.qDesc, prometheus.GaugeValue, vs[len(vs)*5/100], append(labelVals, "0.05")...)
c <- prometheus.MustNewConstMetric(q.qDesc, prometheus.GaugeValue, vs[len(vs)/2], append(labelVals, "0.5")...)
c <- prometheus.MustNewConstMetric(q.qDesc, prometheus.GaugeValue, vs[len(vs)*9/10], append(labelVals, "0.9")...)
c <- prometheus.MustNewConstMetric(q.qDesc, prometheus.GaugeValue, vs[len(vs)*95/100], append(labelVals, "0.95")...)
c <- prometheus.MustNewConstMetric(q.qDesc, prometheus.GaugeValue, vs[len(vs)-1], append(labelVals, "1")...)
pctiles := []float64{0, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 0.75, 0.9, 0.95, 0.975, 0.99, 1}
for _, pct := range pctiles {
idx := int(float64(len(vs)-1) * pct)
c <- prometheus.MustNewConstMetric(q.qDesc, prometheus.GaugeValue, vs[idx], append(labelVals, fmt.Sprint(pct))...)
}
}
}
+2 -12
View File
@@ -27,7 +27,6 @@ import (
"github.com/prometheus/client_golang/prometheus/promhttp"
"github.com/puzpuzpuz/xsync/v3"
"github.com/syncthing/syncthing/internal/blob"
"github.com/syncthing/syncthing/internal/blob/azureblob"
"github.com/syncthing/syncthing/internal/blob/s3"
"github.com/syncthing/syncthing/internal/slogutil"
"github.com/syncthing/syncthing/lib/build"
@@ -49,10 +48,6 @@ type CLI struct {
S3Bucket string `name:"s3-bucket" env:"UR_S3_BUCKET"`
S3AccessKeyID string `name:"s3-access-key-id" env:"UR_S3_ACCESS_KEY_ID"`
S3SecretKey string `name:"s3-secret-key" env:"UR_S3_SECRET_KEY"`
AzureBlobAccount string `name:"azure-blob-account" env:"UR_AZUREBLOB_ACCOUNT"`
AzureBlobKey string `name:"azure-blob-key" env:"UR_AZUREBLOB_KEY"`
AzureBlobContainer string `name:"azure-blob-container" env:"UR_AZUREBLOB_CONTAINER"`
}
var (
@@ -79,7 +74,8 @@ var (
{regexp.MustCompile(`\svagrant@bullseye`), "F-Droid"},
{regexp.MustCompile(`\svagrant@bookworm`), "F-Droid"},
{regexp.MustCompile(`Anwender@NET2017`), "Syncthing-Fork (3rd party)"},
{regexp.MustCompile(`\sreproducible-build@Catfriend1-syncthing-android`), "Syncthing-Fork Catfriend1 (3rd party)"},
{regexp.MustCompile(`\sreproducible-build@nel0x-syncthing-android-gplay`), "Syncthing-Fork nel0x (3rd party)"},
{regexp.MustCompile(`\sbuilduser@(archlinux|svetlemodry)`), "Arch (3rd party)"},
{regexp.MustCompile(`\ssyncthing@archlinux`), "Arch (3rd party)"},
@@ -137,12 +133,6 @@ func (cli *CLI) Run() error {
slog.Error("Failed to create S3 session", slogutil.Error(err))
return err
}
} else if cli.AzureBlobAccount != "" {
blobs, err = azureblob.NewBlobStore(cli.AzureBlobAccount, cli.AzureBlobKey, cli.AzureBlobContainer)
if err != nil {
slog.Error("Failed to create Azure blob store", slogutil.Error(err))
return err
}
}
if _, err := os.Stat(cli.DumpFile); err != nil && blobs != nil {
+3 -2
View File
@@ -10,7 +10,7 @@ import (
"context"
"fmt"
"io"
"log"
"log/slog"
amqp "github.com/rabbitmq/amqp091-go"
"github.com/thejerf/suture/v4"
@@ -23,6 +23,7 @@ import (
type amqpReplicator struct {
suture.Service
broker string
sender *amqpSender
receiver *amqpReceiver
@@ -172,7 +173,7 @@ func (s *amqpReceiver) Serve(ctx context.Context) error {
id, err = protocol.DeviceIDFromString(string(rec.Key))
}
if err != nil {
log.Println("Replication device ID:", err)
slog.Warn("Failed to parse replication device ID", "error", err)
replicationRecvsTotal.WithLabelValues("error").Inc()
continue
}
+35 -32
View File
@@ -18,6 +18,7 @@ import (
"fmt"
io "io"
"log"
"log/slog"
"math/rand"
"net"
"net/http"
@@ -66,7 +67,7 @@ type contextKey int
const idKey contextKey = iota
func newAPISrv(addr string, cert tls.Certificate, db database, repl replicator, useHTTP, compression bool, desiredNotFoundRate float64) *apiSrv {
func newAPISrv(addr string, cert tls.Certificate, db database, repl replicator, useHTTP, compression bool, desiredUnseenNotFoundRate, desiredSeenNotFoundRate float64) *apiSrv {
return &apiSrv{
addr: addr,
cert: cert,
@@ -77,13 +78,13 @@ func newAPISrv(addr string, cert tls.Certificate, db database, repl replicator,
seenTracker: &retryAfterTracker{
name: "seenTracker",
bucketStarts: time.Now(),
desiredRate: desiredNotFoundRate / 2,
desiredRate: desiredSeenNotFoundRate,
currentDelay: notFoundRetryUnknownMinSeconds,
},
notSeenTracker: &retryAfterTracker{
name: "notSeenTracker",
bucketStarts: time.Now(),
desiredRate: desiredNotFoundRate / 2,
desiredRate: desiredUnseenNotFoundRate,
currentDelay: notFoundRetryUnknownMaxSeconds / 2,
},
}
@@ -93,7 +94,7 @@ func (s *apiSrv) Serve(ctx context.Context) error {
if s.useHTTP {
listener, err := net.Listen("tcp", s.addr)
if err != nil {
log.Println("Listen:", err)
slog.ErrorContext(ctx, "Failed to listen", "error", err)
return err
}
s.listener = listener
@@ -107,7 +108,7 @@ func (s *apiSrv) Serve(ctx context.Context) error {
tlsListener, err := tls.Listen("tcp", s.addr, tlsCfg)
if err != nil {
log.Println("Listen:", err)
slog.ErrorContext(ctx, "Failed to listen", "error", err)
return err
}
s.listener = tlsListener
@@ -132,7 +133,7 @@ func (s *apiSrv) Serve(ctx context.Context) error {
err := srv.Serve(s.listener)
if err != nil {
log.Println("Serve:", err)
slog.ErrorContext(ctx, "Failed to serve", "error", err)
}
return err
}
@@ -151,9 +152,7 @@ func (s *apiSrv) handler(w http.ResponseWriter, req *http.Request) {
reqID := requestID(rand.Int63())
req = req.WithContext(context.WithValue(req.Context(), idKey, reqID))
if debug {
log.Println(reqID, req.Method, req.URL, req.Proto)
}
slog.Debug("Handling request", "id", reqID, "method", req.Method, "url", req.URL, "proto", req.Proto)
remoteAddr := &net.TCPAddr{
IP: nil,
@@ -174,7 +173,7 @@ func (s *apiSrv) handler(w http.ResponseWriter, req *http.Request) {
var err error
remoteAddr, err = net.ResolveTCPAddr("tcp", req.RemoteAddr)
if err != nil {
log.Println("remoteAddr:", err)
slog.Warn("Failed to resolve remote address", "address", req.RemoteAddr, "error", err)
lw.Header().Set("Retry-After", errorRetryAfterString())
http.Error(lw, "Internal Server Error", http.StatusInternalServerError)
apiRequestsTotal.WithLabelValues("no_remote_addr").Inc()
@@ -197,9 +196,7 @@ func (s *apiSrv) handleGET(w http.ResponseWriter, req *http.Request) {
deviceID, err := protocol.DeviceIDFromString(req.URL.Query().Get("device"))
if err != nil {
if debug {
log.Println(reqID, "bad device param:", err)
}
slog.Debug("Request with bad device param", "id", reqID, "error", err)
lookupRequestsTotal.WithLabelValues("bad_request").Inc()
w.Header().Set("Retry-After", errorRetryAfterString())
http.Error(w, "Bad Request", http.StatusBadRequest)
@@ -257,11 +254,9 @@ func (s *apiSrv) handleGET(w http.ResponseWriter, req *http.Request) {
func (s *apiSrv) handlePOST(remoteAddr *net.TCPAddr, w http.ResponseWriter, req *http.Request) {
reqID := req.Context().Value(idKey).(requestID)
rawCert, err := certificateBytes(req)
rawCert, err := s.certificateBytes(req)
if err != nil {
if debug {
log.Println(reqID, "no certificates:", err)
}
slog.Debug("Request without certificates", "id", reqID, "error", err)
announceRequestsTotal.WithLabelValues("no_certificate").Inc()
w.Header().Set("Retry-After", errorRetryAfterString())
http.Error(w, "Forbidden", http.StatusForbidden)
@@ -270,9 +265,7 @@ func (s *apiSrv) handlePOST(remoteAddr *net.TCPAddr, w http.ResponseWriter, req
var ann announcement
if err := json.NewDecoder(req.Body).Decode(&ann); err != nil {
if debug {
log.Println(reqID, "decode:", err)
}
slog.Debug("Failed to decode request", "id", reqID, "error", err)
announceRequestsTotal.WithLabelValues("bad_request").Inc()
w.Header().Set("Retry-After", errorRetryAfterString())
http.Error(w, "Bad Request", http.StatusBadRequest)
@@ -283,9 +276,7 @@ func (s *apiSrv) handlePOST(remoteAddr *net.TCPAddr, w http.ResponseWriter, req
addresses := fixupAddresses(remoteAddr, ann.Addresses)
if len(addresses) == 0 {
if debug {
log.Println(reqID, "no addresses")
}
slog.Debug("Request without addresses", "id", reqID, "error", err)
announceRequestsTotal.WithLabelValues("bad_request").Inc()
w.Header().Set("Retry-After", errorRetryAfterString())
http.Error(w, "Bad Request", http.StatusBadRequest)
@@ -293,9 +284,7 @@ func (s *apiSrv) handlePOST(remoteAddr *net.TCPAddr, w http.ResponseWriter, req
}
if err := s.handleAnnounce(deviceID, addresses); err != nil {
if debug {
log.Println(reqID, "handle:", err)
}
slog.Debug("Failed to handle request", "id", reqID, "error", err)
announceRequestsTotal.WithLabelValues("internal_error").Inc()
w.Header().Set("Retry-After", errorRetryAfterString())
http.Error(w, "Internal Server Error", http.StatusInternalServerError)
@@ -306,9 +295,7 @@ func (s *apiSrv) handlePOST(remoteAddr *net.TCPAddr, w http.ResponseWriter, req
w.Header().Set("Reannounce-After", reannounceAfterString())
w.WriteHeader(http.StatusNoContent)
if debug {
log.Println(reqID, "announced", deviceID, addresses)
}
slog.Debug("Device announced", "id", reqID, "device", deviceID, "addresses", addresses)
}
func (s *apiSrv) Stop() {
@@ -343,14 +330,17 @@ func handlePing(w http.ResponseWriter, _ *http.Request) {
w.WriteHeader(http.StatusNoContent)
}
func certificateBytes(req *http.Request) ([]byte, error) {
func (s *apiSrv) certificateBytes(req *http.Request) ([]byte, error) {
if req.TLS != nil && len(req.TLS.PeerCertificates) > 0 {
return req.TLS.PeerCertificates[0].Raw, nil
}
if !s.useHTTP {
return nil, errors.New("no certificate presented")
}
var bs []byte
if hdr := req.Header.Get("X-SSL-Cert"); hdr != "" {
if hdr := req.Header.Get("X-Ssl-Cert"); hdr != "" {
if strings.Contains(hdr, "%") {
// Nginx using $ssl_client_escaped_cert
// The certificate is in PEM format with url encoding.
@@ -513,6 +503,7 @@ func fixupAddresses(remote *net.TCPAddr, addresses []string) []string {
type loggingResponseWriter struct {
http.ResponseWriter
statusCode int
}
@@ -576,5 +567,17 @@ func (t *retryAfterTracker) retryAfterS() int {
}
t.curCount++
t.mut.Unlock()
return t.currentDelay + rand.Intn(t.currentDelay/4)
// Skewed normal distribution with the mean at currentDelay and the
// limits (50% and 150%) at 3 standard deviations
nf := rand.NormFloat64()
minD := max(notFoundRetryUnknownMinSeconds, t.currentDelay/2)
maxD := min(notFoundRetryUnknownMaxSeconds, t.currentDelay*3/2)
intv := float64(maxD - t.currentDelay)
if nf < 0 {
intv = float64(t.currentDelay - minD)
}
nf = min(max(nf*intv/3+float64(t.currentDelay), notFoundRetryUnknownMinSeconds), notFoundRetryUnknownMaxSeconds)
return int(nf)
}
+49 -1
View File
@@ -18,6 +18,7 @@ import (
"regexp"
"strings"
"testing"
"time"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/tlsutil"
@@ -106,12 +107,59 @@ func addr(host string, port int) *net.TCPAddr {
}
}
func TestRetryAfterSHistogram(t *testing.T) {
tracker := &retryAfterTracker{
name: "test",
bucketStarts: time.Now(),
desiredRate: 100,
currentDelay: 1800,
}
const n = 1000
bucketSize := 60 // seconds per histogram bucket
numBuckets := (notFoundRetryUnknownMaxSeconds + bucketSize - 1) / bucketSize
buckets := make([]int, numBuckets)
for i := 0; i < n; i++ {
v := tracker.retryAfterS()
if v < notFoundRetryUnknownMinSeconds || v > notFoundRetryUnknownMaxSeconds {
t.Fatalf("retryAfterS() = %d, out of range [%d, %d]", v, notFoundRetryUnknownMinSeconds, notFoundRetryUnknownMaxSeconds)
}
b := (v - 1) / bucketSize
if b >= numBuckets {
b = numBuckets - 1
}
buckets[b]++
}
// Print a horizontal histogram
maxCount := 0
for _, c := range buckets {
if c > maxCount {
maxCount = c
}
}
barWidth := 60
for i, c := range buckets {
lo := i*bucketSize + 1
hi := (i + 1) * bucketSize
if hi > notFoundRetryUnknownMaxSeconds {
hi = notFoundRetryUnknownMaxSeconds
}
bar := ""
if maxCount > 0 {
bar = strings.Repeat("#", c*barWidth/maxCount)
}
t.Logf("%4d-%4ds | %-*s %d", lo, hi, barWidth, bar, c)
}
}
func BenchmarkAPIRequests(b *testing.B) {
db := newInMemoryStore(b.TempDir(), 0, nil)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
go db.Serve(ctx)
api := newAPISrv("127.0.0.1:0", tls.Certificate{}, db, nil, true, true, 1000)
api := newAPISrv("127.0.0.1:0", tls.Certificate{}, db, nil, true, true, 1000, 1000)
srv := httptest.NewServer(http.HandlerFunc(api.handler))
kf := b.TempDir() + "/cert"
+62 -42
View File
@@ -13,7 +13,7 @@ import (
"encoding/binary"
"errors"
"io"
"log"
"log/slog"
"os"
"path"
"runtime"
@@ -74,24 +74,24 @@ func newInMemoryStore(dir string, flushInterval time.Duration, blobs blob.Store)
// Try to read from blob storage
latestKey, cerr := blobs.LatestKey(context.Background())
if cerr != nil {
log.Println("Error finding database from blob storage:", cerr)
slog.Error("Failed to find database in blob storage", "error", cerr)
return s
}
fd, cerr := os.Create(path.Join(s.dir, "records.db"))
if cerr != nil {
log.Println("Error creating database file:", cerr)
slog.Error("Failed to create database file", "error", cerr)
return s
}
if cerr := blobs.Download(context.Background(), latestKey, fd); cerr != nil {
log.Printf("Error downloading database from blob storage: %v", cerr)
slog.Error("Failed to download database from blob storage", "error", cerr)
}
_ = fd.Close()
nr, err = s.read()
}
if err != nil {
log.Println("Error reading database:", err)
slog.Error("Failed to read database", "error", err)
}
log.Printf("Read %d records from database", nr)
slog.Info("Loaded database", "records", nr)
s.expireAndCalculateStatistics()
return s
}
@@ -113,7 +113,7 @@ func (s *inMemoryStore) merge(key *protocol.DeviceID, addrs []*discosrv.Database
}
if oldRec, ok := s.m.Load(*key); ok {
newRec = merge(oldRec, newRec)
newRec = merge(newRec, oldRec)
}
s.m.Store(*key, newRec)
@@ -135,7 +135,13 @@ func (s *inMemoryStore) get(key *protocol.DeviceID) (*discosrv.DatabaseRecord, e
return &discosrv.DatabaseRecord{}, nil
}
rec.Addresses = expire(rec.Addresses, s.clock.Now())
naddresses, changed := expire(rec.Addresses, s.clock.Now())
if changed {
rec = &discosrv.DatabaseRecord{
Addresses: naddresses,
Seen: rec.Seen,
}
}
databaseOperations.WithLabelValues(dbOpGet, dbResSuccess).Inc()
return rec, nil
}
@@ -153,13 +159,13 @@ loop:
for {
select {
case <-t.C:
log.Println("Calculating statistics")
slog.InfoContext(ctx, "Calculating statistics")
s.expireAndCalculateStatistics()
log.Println("Flushing database")
slog.InfoContext(ctx, "Flushing database")
if err := s.write(); err != nil {
log.Println("Error writing database:", err)
slog.ErrorContext(ctx, "Failed to write database", "error", err)
}
log.Println("Finished flushing database")
slog.InfoContext(ctx, "Finished flushing database")
t.Reset(s.flushInterval)
case <-ctx.Done():
@@ -184,12 +190,12 @@ func (s *inMemoryStore) expireAndCalculateStatistics() {
}
n++
addresses := expire(rec.Addresses, now)
if len(addresses) == 0 {
rec.Addresses = nil
s.m.Store(key, rec)
} else if len(addresses) != len(rec.Addresses) {
rec.Addresses = addresses
addresses, changed := expire(rec.Addresses, now)
if changed {
rec = &discosrv.DatabaseRecord{
Addresses: addresses,
Seen: rec.Seen,
}
s.m.Store(key, rec)
}
@@ -256,7 +262,7 @@ func (s *inMemoryStore) write() (err error) {
if err != nil {
return err
}
bw := bufio.NewWriter(fd)
bw := bufio.NewWriterSize(fd, 1<<20)
var buf []byte
var rangeErr error
@@ -300,7 +306,7 @@ func (s *inMemoryStore) write() (err error) {
}
if err := bw.Flush(); err != nil {
_ = fd.Close
_ = fd.Close()
return err
}
if err := fd.Close(); err != nil {
@@ -310,18 +316,24 @@ func (s *inMemoryStore) write() (err error) {
return err
}
if info, err := os.Lstat(dbf); err == nil {
slog.Info("Saved database", "name", dbf, "size", info.Size(), "modtime", info.ModTime())
} else {
slog.Warn("Failed to stat database after save", "error", err)
}
// Upload to blob storage
if s.blobs != nil {
fd, err = os.Open(dbf)
if err != nil {
log.Printf("Error uploading database to blob storage: %v", err)
slog.Error("Failed to upload database to blob storage", "error", err)
return nil
}
defer fd.Close()
if err := s.blobs.Upload(context.Background(), s.objKey, fd); err != nil {
log.Printf("Error uploading database to blob storage: %v", err)
slog.Error("Failed to upload database to blob storage", "error", err)
}
log.Println("Finished uploading database")
slog.Info("Finished uploading database")
}
return nil
@@ -360,14 +372,14 @@ func (s *inMemoryStore) read() (int, error) {
key, err = protocol.DeviceIDFromString(string(rec.Key))
}
if err != nil {
log.Println("Bad device ID:", err)
slog.Error("Got bad device ID while reading database", "error", err)
continue
}
slices.SortFunc(rec.Addresses, Cmp)
rec.Addresses = slices.CompactFunc(rec.Addresses, Equal)
rec.Addresses, _ = expire(slices.CompactFunc(rec.Addresses, Equal), s.clock.Now())
s.m.Store(key, &discosrv.DatabaseRecord{
Addresses: expire(rec.Addresses, s.clock.Now()),
Addresses: rec.Addresses,
Seen: rec.Seen,
})
nr++
@@ -378,7 +390,7 @@ func (s *inMemoryStore) read() (int, error) {
// merge returns the merged result of the two database records a and b. The
// result is the union of the two address sets, with the newer expiry time
// chosen for any duplicates. The address list in a is overwritten and
// reused for the result.
// reused for the result; b is not modified.
func merge(a, b *discosrv.DatabaseRecord) *discosrv.DatabaseRecord {
// Both lists must be sorted for this to work.
@@ -409,25 +421,33 @@ func merge(a, b *discosrv.DatabaseRecord) *discosrv.DatabaseRecord {
return a
}
// expire returns the list of addresses after removing expired entries.
// Expiration happen in place, so the slice given as the parameter is
// destroyed. Internal order is preserved.
func expire(addrs []*discosrv.DatabaseAddress, now time.Time) []*discosrv.DatabaseAddress {
// expire returns the list of addresses after removing expired entries. A
// new slice is allocated if any changes are required, and the changed
// boolean indicates whether that happened or not.
func expire(addrs []*discosrv.DatabaseAddress, now time.Time) (result []*discosrv.DatabaseAddress, changed bool) {
cutoff := now.UnixNano()
naddrs := addrs[:0]
for i := range addrs {
if i > 0 && addrs[i].Address == addrs[i-1].Address {
// Skip duplicates
continue
}
if addrs[i].Expires >= cutoff {
naddrs = append(naddrs, addrs[i])
remains := 0
for _, a := range addrs {
if a.Expires < cutoff {
changed = true
} else {
remains++
}
}
if len(naddrs) == 0 {
return nil
if !changed {
return addrs, false
}
return naddrs
if remains == 0 {
return nil, true
}
naddrs := make([]*discosrv.DatabaseAddress, 0, remains)
for _, a := range addrs {
if a.Expires >= cutoff {
naddrs = append(naddrs, a)
}
}
return naddrs, true
}
func Cmp(d, other *discosrv.DatabaseAddress) (n int) {
+1 -1
View File
@@ -161,7 +161,7 @@ func TestFilter(t *testing.T) {
}
for _, tc := range cases {
res := expire(tc.a, time.Unix(0, 10))
res, _ := expire(tc.a, time.Unix(0, 10))
if fmt.Sprint(res) != fmt.Sprint(tc.b) {
t.Errorf("Incorrect result %v, expected %v", res, tc.b)
}
+37 -34
View File
@@ -9,12 +9,12 @@ package main
import (
"context"
"crypto/tls"
"log"
"fmt"
"log/slog"
"net/http"
_ "net/http/pprof"
"os"
"os/signal"
"runtime"
"syscall"
"time"
"github.com/alecthomas/kong"
@@ -22,9 +22,8 @@ import (
"github.com/thejerf/suture/v4"
"github.com/syncthing/syncthing/internal/blob"
"github.com/syncthing/syncthing/internal/blob/azureblob"
"github.com/syncthing/syncthing/internal/blob/s3"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/internal/slogutil"
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/rand"
@@ -32,8 +31,7 @@ import (
)
const (
addressExpiryTime = 2 * time.Hour
databaseStatisticsInterval = 5 * time.Minute
addressExpiryTime = 2 * time.Hour
// Reannounce-After is set to reannounceAfterSeconds +
// random(reannounzeFuzzSeconds), similar for Retry-After
@@ -60,13 +58,16 @@ const (
var debug = false
type CLI struct {
Cert string `group:"Listen" help:"Certificate file" default:"./cert.pem" env:"DISCOVERY_CERT_FILE"`
Key string `group:"Listen" help:"Key file" default:"./key.pem" env:"DISCOVERY_KEY_FILE"`
HTTP bool `group:"Listen" help:"Listen on HTTP (behind an HTTPS proxy)" env:"DISCOVERY_HTTP"`
Compression bool `group:"Listen" help:"Enable GZIP compression of responses" env:"DISCOVERY_COMPRESSION"`
Listen string `group:"Listen" help:"Listen address" default:":8443" env:"DISCOVERY_LISTEN"`
MetricsListen string `group:"Listen" help:"Metrics listen address" env:"DISCOVERY_METRICS_LISTEN"`
DesiredNotFoundRate float64 `group:"Listen" help:"Desired maximum rate of not-found replies (/s)" default:"1000"`
Cert string `group:"Listen" help:"Certificate file" default:"./cert.pem" env:"DISCOVERY_CERT_FILE"`
Key string `group:"Listen" help:"Key file" default:"./key.pem" env:"DISCOVERY_KEY_FILE"`
HTTP bool `group:"Listen" help:"Listen on HTTP (behind an HTTPS proxy)" env:"DISCOVERY_HTTP"`
Compression bool `group:"Listen" help:"Enable GZIP compression of responses" env:"DISCOVERY_COMPRESSION"`
Listen string `group:"Listen" help:"Listen address" default:":8443" env:"DISCOVERY_LISTEN"`
MetricsListen string `group:"Listen" help:"Metrics listen address" env:"DISCOVERY_METRICS_LISTEN"`
DesiredUnseenNotFoundRate float64 `group:"Listen" help:"Desired maximum rate of not-found replies for never seen devices (/s)" default:"1000" env:"DISCOVERY_UNSEEN_RATE"`
DesiredSeenNotFoundRate float64 `group:"Listen" help:"Desired maximum rate of not-found replies for previously seen devices (/s)" default:"1000" env:"DISCOVERY_SEEN_RATE"`
ShutdownDelay float64 `help:"Time to wait before shutdown after receiving a shutdown signal (s)" env:"DISCOVERY_SHUTDOWN_DELAY"`
DBDir string `group:"Database" help:"Database directory" default:"." env:"DISCOVERY_DB_DIR"`
DBFlushInterval time.Duration `group:"Database" help:"Interval between database flushes" default:"5m" env:"DISCOVERY_DB_FLUSH_INTERVAL"`
@@ -77,10 +78,6 @@ type CLI struct {
DBS3AccessKeyID string `name:"db-s3-access-key-id" group:"Database (S3 backup)" hidden:"true" help:"S3 access key ID for database" env:"DISCOVERY_DB_S3_ACCESS_KEY_ID"`
DBS3SecretKey string `name:"db-s3-secret-key" group:"Database (S3 backup)" hidden:"true" help:"S3 secret key for database" env:"DISCOVERY_DB_S3_SECRET_KEY"`
DBAzureBlobAccount string `name:"db-azure-blob-account" env:"DISCOVERY_DB_AZUREBLOB_ACCOUNT"`
DBAzureBlobKey string `name:"db-azure-blob-key" env:"DISCOVERY_DB_AZUREBLOB_KEY"`
DBAzureBlobContainer string `name:"db-azure-blob-container" env:"DISCOVERY_DB_AZUREBLOB_CONTAINER"`
AMQPAddress string `group:"AMQP replication" hidden:"true" help:"Address to AMQP broker" env:"DISCOVERY_AMQP_ADDRESS"`
Debug bool `short:"d" help:"Print debug output" env:"DISCOVERY_DEBUG"`
@@ -88,34 +85,37 @@ type CLI struct {
}
func main() {
log.SetOutput(os.Stdout)
var cli CLI
kong.Parse(&cli)
debug = cli.Debug
log.Println(build.LongVersionFor("stdiscosrv"))
level := slog.LevelInfo
if cli.Debug {
level = slog.LevelDebug
}
slogutil.SetDefaultLevel(level)
if cli.Version {
fmt.Println(build.LongVersionFor("stdiscosrv"))
return
}
buildInfo.WithLabelValues(build.Version, runtime.Version(), build.User, build.Date.UTC().Format("2006-01-02T15:04:05Z")).Set(1)
slog.Info(build.LongVersionFor("stdiscosrv"))
var cert tls.Certificate
if !cli.HTTP {
var err error
cert, err = tls.LoadX509KeyPair(cli.Cert, cli.Key)
if os.IsNotExist(err) {
log.Println("Failed to load keypair. Generating one, this might take a while...")
slog.Info("Failed to load keypair. Generating one, this might take a while...")
cert, err = tlsutil.NewCertificate(cli.Cert, cli.Key, "stdiscosrv", 20*365, false)
if err != nil {
log.Fatalln("Failed to generate X509 key pair:", err)
slog.Error("Failed to generate X509 key pair", "error", err)
os.Exit(1)
}
} else if err != nil {
log.Fatalln("Failed to load keypair:", err)
slog.Error("Failed to load keypair", "error", err)
os.Exit(1)
}
devID := protocol.NewDeviceID(cert.Certificate[0])
log.Println("Server device ID is", devID)
slog.Info("Loaded certificate keypair", "deviceId", devID.String())
}
// Root of the service tree.
@@ -129,11 +129,10 @@ func main() {
var err error
if cli.DBS3Endpoint != "" {
blobs, err = s3.NewSession(cli.DBS3Endpoint, cli.DBS3Region, cli.DBS3Bucket, cli.DBS3AccessKeyID, cli.DBS3SecretKey)
} else if cli.DBAzureBlobAccount != "" {
blobs, err = azureblob.NewBlobStore(cli.DBAzureBlobAccount, cli.DBAzureBlobKey, cli.DBAzureBlobContainer)
}
if err != nil {
log.Fatalf("Failed to create blob store: %v", err)
slog.Error("Failed to create blob store", "error", err)
os.Exit(1)
}
// Start the database.
@@ -150,7 +149,7 @@ func main() {
}
// Start the main API server.
qs := newAPISrv(cli.Listen, cert, db, repl, cli.HTTP, cli.Compression, cli.DesiredNotFoundRate)
qs := newAPISrv(cli.Listen, cert, db, repl, cli.HTTP, cli.Compression, cli.DesiredUnseenNotFoundRate, cli.DesiredSeenNotFoundRate)
main.Add(qs)
// If we have a metrics port configured, start a metrics handler.
@@ -158,7 +157,9 @@ func main() {
go func() {
mux := http.NewServeMux()
mux.Handle("/metrics", promhttp.Handler())
log.Fatal(http.ListenAndServe(cli.MetricsListen, mux))
err := http.ListenAndServe(cli.MetricsListen, mux)
slog.Error("Failed to serve", "error", err)
os.Exit(1)
}()
}
@@ -168,9 +169,11 @@ func main() {
// Cancel on signal
signalChan := make(chan os.Signal, 1)
signal.Notify(signalChan, os.Interrupt)
signal.Notify(signalChan, syscall.SIGTERM)
go func() {
sig := <-signalChan
log.Printf("Received signal %s; shutting down", sig)
slog.Info("Received signal; shutting down", "signal", sig, "delay", cli.ShutdownDelay)
time.Sleep(time.Duration(float64(time.Second) * cli.ShutdownDelay))
cancel()
}()
+1 -9
View File
@@ -11,14 +11,6 @@ import (
)
var (
buildInfo = prometheus.NewGaugeVec(
prometheus.GaugeOpts{
Namespace: "syncthing",
Subsystem: "discovery",
Name: "build_info",
Help: "A metric with a constant '1' value labeled by version, goversion, builduser and builddate from which stdiscosrv was built.",
}, []string{"version", "goversion", "builduser", "builddate"})
apiRequestsTotal = prometheus.NewCounterVec(
prometheus.CounterOpts{
Namespace: "syncthing",
@@ -132,7 +124,7 @@ const (
)
func init() {
prometheus.MustRegister(buildInfo,
prometheus.MustRegister(
apiRequestsTotal, apiRequestsSeconds,
lookupRequestsTotal, announceRequestsTotal,
replicationSendsTotal, replicationRecvsTotal,
+17 -10
View File
@@ -14,6 +14,7 @@ import (
"os"
"os/signal"
"path/filepath"
"strconv"
"strings"
"sync/atomic"
"syscall"
@@ -21,7 +22,6 @@ import (
"golang.org/x/time/rate"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/events"
@@ -71,9 +71,13 @@ var (
// httpClient is the HTTP client we use for outbound requests. It has a
// timeout and may get further options set during initialization.
var httpClient = &http.Client{
Timeout: 30 * time.Second,
}
var (
httpTransport = &http.Transport{}
httpClient = &http.Client{
Timeout: 30 * time.Second,
Transport: httpTransport,
}
)
func main() {
log.SetFlags(log.Lshortfile | log.LstdFlags)
@@ -132,9 +136,7 @@ func main() {
// also come from that address.
laddr.Port = 0
boundDialer := &net.Dialer{LocalAddr: laddr}
httpClient.Transport = &http.Transport{
DialContext: boundDialer.DialContext,
}
httpTransport.DialContext = boundDialer.DialContext
}
log.Println(longVer)
@@ -163,6 +165,11 @@ func main() {
}
}
// Outgoing HTTPS requests may use our certificate for authentication
httpTransport.TLSClientConfig = &tls.Config{
Certificates: []tls.Certificate{cert},
}
tlsCfg := &tls.Config{
Certificates: []tls.Certificate{cert},
NextProtos: []string{protocol.ProtocolName},
@@ -247,10 +254,10 @@ func main() {
query.Set("pingInterval", pingInterval.String())
query.Set("networkTimeout", networkTimeout.String())
if sessionLimitBps > 0 {
query.Set("sessionLimitBps", fmt.Sprint(sessionLimitBps))
query.Set("sessionLimitBps", strconv.Itoa(sessionLimitBps))
}
if globalLimitBps > 0 {
query.Set("globalLimitBps", fmt.Sprint(globalLimitBps))
query.Set("globalLimitBps", strconv.Itoa(globalLimitBps))
}
if statusAddr != "" {
query.Set("statusAddr", statusAddr)
@@ -277,7 +284,7 @@ func main() {
for _, pool := range pools {
pool = strings.TrimSpace(pool)
if len(pool) > 0 {
go poolHandler(pool, uri, mapping, cert)
go poolHandler(pool, uri, mapping)
}
}
+2 -20
View File
@@ -4,7 +4,6 @@ package main
import (
"bytes"
"crypto/tls"
"encoding/json"
"io"
"log"
@@ -17,7 +16,7 @@ const (
httpStatusEnhanceYourCalm = 429
)
func poolHandler(pool string, uri *url.URL, mapping mapping, ownCert tls.Certificate) {
func poolHandler(pool string, uri *url.URL, mapping mapping) {
if debug {
log.Println("Joining", pool)
}
@@ -32,24 +31,7 @@ func poolHandler(pool string, uri *url.URL, mapping mapping, ownCert tls.Certifi
uriCopy.String(),
})
poolUrl, err := url.Parse(pool)
if err != nil {
log.Printf("Could not parse pool url '%s': %v", pool, err)
}
client := http.DefaultClient
if poolUrl.Scheme == "https" {
// Sent our certificate in join request
client = &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
Certificates: []tls.Certificate{ownCert},
},
},
}
}
resp, err := client.Post(pool, "application/json", &b)
resp, err := httpClient.Post(pool, "application/json", &b) //nolint:noctx
if err != nil {
log.Printf("Error joining pool %v: HTTP request: %v", pool, err)
time.Sleep(time.Minute)
+2 -9
View File
@@ -158,19 +158,12 @@ func (s *session) Serve() {
}
wg := sync.WaitGroup{}
wg.Add(2)
var err0 error
go func() {
err0 = s.proxy(s.conns[0], s.conns[1])
wg.Done()
}()
wg.Go(func() { err0 = s.proxy(s.conns[0], s.conns[1]) })
var err1 error
go func() {
err1 = s.proxy(s.conns[1], s.conns[0])
wg.Done()
}()
wg.Go(func() { err1 = s.proxy(s.conns[1], s.conns[0]) })
sessionMut.Lock()
activeSessions = append(activeSessions, s)
+1 -1
View File
@@ -122,7 +122,7 @@ func (r *rateCalculator) updateRates(interval time.Duration) {
func (r *rateCalculator) rate(periods int) int64 {
var tot int64
for i := 0; i < periods; i++ {
for i := range periods {
tot += r.rates[i]
}
return tot / int64(periods)
+3 -2
View File
@@ -6,6 +6,7 @@ import (
"bufio"
"context"
"crypto/tls"
"errors"
"flag"
"log"
"net"
@@ -14,7 +15,6 @@ import (
"path/filepath"
"time"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
syncthingprotocol "github.com/syncthing/syncthing/lib/protocol"
"github.com/syncthing/syncthing/lib/relay/client"
"github.com/syncthing/syncthing/lib/relay/protocol"
@@ -133,7 +133,8 @@ func connectToStdio(stdin <-chan string, conn net.Conn) {
conn.SetReadDeadline(time.Now().Add(time.Millisecond))
n, err := conn.Read(buf[0:])
if err != nil {
nerr, ok := err.(net.Error)
var nerr net.Error
ok := errors.As(err, &nerr)
if !ok || !nerr.Timeout() {
log.Println(err)
return
+1 -1
View File
@@ -10,7 +10,7 @@ import (
func setTCPOptions(conn net.Conn) error {
tcpConn, ok := conn.(*net.TCPConn)
if !ok {
return errors.New("Not a TCP connection")
return errors.New("not a TCP connection")
}
if err := tcpConn.SetLinger(0); err != nil {
return err
+4 -3
View File
@@ -32,6 +32,7 @@ type APIClient interface {
type apiClient struct {
http.Client
cfg config.GUIConfiguration
apikey string
}
@@ -91,11 +92,11 @@ func loadGUIConfig() (config.GUIConfiguration, error) {
guiCfg := cfg.GUI()
if guiCfg.Address() == "" {
return config.GUIConfiguration{}, errors.New("Could not find GUI Address")
return config.GUIConfiguration{}, errors.New("could not find GUI Address")
}
if guiCfg.APIKey == "" {
return config.GUIConfiguration{}, errors.New("Could not find GUI API key")
return config.GUIConfiguration{}, errors.New("could not find GUI API key")
}
return guiCfg, nil
@@ -113,7 +114,7 @@ func (c *apiClient) Endpoint() string {
}
func (c *apiClient) Do(req *http.Request) (*http.Response, error) {
req.Header.Set("X-API-Key", c.apikey)
req.Header.Set("X-Api-Key", c.apikey)
resp, err := c.Client.Do(req)
if err != nil {
return nil, err
+59 -4
View File
@@ -10,6 +10,7 @@ import (
"encoding/json"
"errors"
"fmt"
"net/http"
"reflect"
"github.com/AudriusButkevicius/recli"
@@ -18,6 +19,53 @@ import (
"github.com/urfave/cli"
)
// Try to mimic the kong output format through custom help templates
var customAppHelpTemplate = `Usage: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .Commands}} <command> [flags]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}
{{.Description}}{{if .VisibleFlags}}
Flags:
{{range $index, $option := .VisibleFlags}}{{if $index}}
{{end}}{{$option}}{{end}}{{end}}{{if .VisibleCommands}}
Commands:{{range .VisibleCategories}}{{if .Name}}
{{.Name}}:{{range .VisibleCommands}}
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{end}}
`
var customCommandHelpTemplate = `Usage: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}}{{if .VisibleFlags}} [flags]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}
{{.Usage}}{{if .VisibleFlags}}
Flags:
{{range $index, $option := .VisibleFlags}}{{if $index}}
{{end}}{{$option}}{{end}}{{end}}{{if .Category}}
Category:
{{.Category}}{{end}}{{if .Description}}
{{.Description}}{{end}}
`
var customSubcommandHelpTemplate = `Usage: {{if .UsageText}}{{.UsageText}}{{else}}{{.HelpName}} <command>{{if .VisibleFlags}} [flags]{{end}} {{if .ArgsUsage}}{{.ArgsUsage}}{{else}}[arguments...]{{end}}{{end}}{{if .Description}}
{{.Description}}{{else}}{{if .Usage}}
{{.Usage}}{{end}}{{end}}{{if .VisibleFlags}}
Flags:
{{range $index, $option := .VisibleFlags}}{{if $index}}
{{end}}{{$option}}{{end}}{{end}}{{if .VisibleCommands}}
Commands:{{range .VisibleCategories}}{{if .Name}}
{{.Name}}:{{range .VisibleCommands}}
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{else}}{{range .VisibleCommands}}
{{join .Names ", "}}{{"\t"}}{{.Usage}}{{end}}{{end}}{{end}}{{end}}
`
type configHandler struct {
original, cfg config.Configuration
client APIClient
@@ -28,13 +76,18 @@ type configCommand struct {
Args []string `arg:"" default:"-h"`
}
func (c *configCommand) Run(ctx Context, _ *kong.Context) error {
func (c *configCommand) Run(ctx Context, outerCtx *kong.Context) error {
app := cli.NewApp()
app.Name = "syncthing"
app.Author = "The Syncthing Authors"
app.Name = "syncthing cli config"
app.HelpName = "syncthing cli config"
app.Description = outerCtx.Selected().Help
app.Metadata = map[string]interface{}{
"clientFactory": ctx.clientFactory,
}
app.CustomAppHelpTemplate = customAppHelpTemplate
// Override global templates, as this is out only usage of the package
cli.CommandHelpTemplate = customCommandHelpTemplate
cli.SubcommandHelpTemplate = customSubcommandHelpTemplate
h := new(configHandler)
h.client, h.err = ctx.clientFactory.getClient()
@@ -55,6 +108,8 @@ func (c *configCommand) Run(ctx Context, _ *kong.Context) error {
app.Commands = commands
app.HideHelp = true
// Explicitly re-add help only as flags, not as commands
app.Flags = []cli.Flag{cli.HelpFlag}
app.Before = h.configBefore
app.After = h.configAfter
@@ -86,7 +141,7 @@ func (h *configHandler) configAfter(_ *cli.Context) error {
if err != nil {
return err
}
if resp.StatusCode != 200 {
if resp.StatusCode != http.StatusOK {
body, err := responseToBArray(resp)
if err != nil {
return err
+2 -1
View File
@@ -9,6 +9,7 @@ package cli
import (
"errors"
"fmt"
"net/http"
"strings"
"github.com/alecthomas/kong"
@@ -34,7 +35,7 @@ func (e *errorsPushCommand) Run(ctx Context) error {
if err != nil {
return err
}
if response.StatusCode != 200 {
if response.StatusCode != http.StatusOK {
errStr = fmt.Sprint("Failed to push error\nStatus code: ", response.StatusCode)
bytes, err := responseToBArray(response)
if err != nil {
+2 -1
View File
@@ -10,6 +10,7 @@ import (
"bufio"
"errors"
"fmt"
"net/http"
"path/filepath"
"github.com/alecthomas/kong"
@@ -63,7 +64,7 @@ func (f *folderOverrideCommand) Run(ctx Context) error {
if err != nil {
return err
}
if response.StatusCode != 200 {
if response.StatusCode != http.StatusOK {
errStr := fmt.Sprint("Failed to override changes\nStatus code: ", response.StatusCode)
bytes, err := responseToBArray(response)
if err != nil {
+1 -1
View File
@@ -31,7 +31,7 @@ const (
// directory to the crash reporting server as urlBase. Uploads are attempted
// with the newest log first.
//
// This can can block for a long time. The context can set a final deadline
// This can block for a long time. The context can set a final deadline
// for this.
func uploadPanicLogs(ctx context.Context, urlBase, dir string) {
files, err := filepath.Glob(filepath.Join(dir, "panic-*.log"))
+45 -39
View File
@@ -42,7 +42,6 @@ import (
"github.com/syncthing/syncthing/internal/db"
"github.com/syncthing/syncthing/internal/db/sqlite"
"github.com/syncthing/syncthing/internal/slogutil"
_ "github.com/syncthing/syncthing/lib/automaxprocs"
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/config"
"github.com/syncthing/syncthing/lib/dialer"
@@ -155,7 +154,7 @@ type serveCmd struct {
AllowNewerConfig bool `help:"Allow loading newer than current config version" env:"STALLOWNEWERCONFIG"`
Audit bool `help:"Write events to audit file" env:"STAUDIT"`
AuditFile string `name:"auditfile" help:"Specify audit file (use \"-\" for stdout, \"--\" for stderr)" placeholder:"PATH" env:"STAUDITFILE"`
DBMaintenanceInterval time.Duration `help:"Database maintenance interval" default:"8h" env:"STDBMAINTENANCEINTERVAL"`
DBMaintenanceInterval time.Duration `help:"Database maintenance interval; set to zero to disable periodic maintenance" default:"8h" env:"STDBMAINTENANCEINTERVAL"`
DBDeleteRetentionInterval time.Duration `help:"Database deleted item retention interval" default:"10920h" env:"STDBDELETERETENTIONINTERVAL"`
GUIAddress string `name:"gui-address" help:"Override GUI address (e.g. \"http://192.0.2.42:8443\")" placeholder:"URL" env:"STGUIADDRESS"`
GUIAPIKey string `name:"gui-apikey" help:"Override GUI API key" placeholder:"API-KEY" env:"STGUIAPIKEY"`
@@ -388,8 +387,8 @@ func upgradeViaRest() error {
}
u.Path = path.Join(u.Path, "rest/system/upgrade")
target := u.String()
r, _ := http.NewRequest("POST", target, nil)
r.Header.Set("X-API-Key", cfg.GUI().APIKey)
r, _ := http.NewRequest(http.MethodPost, target, nil)
r.Header.Set("X-Api-Key", cfg.GUI().APIKey)
tr := &http.Transport{
DialContext: dialer.DialContext,
@@ -407,7 +406,7 @@ func upgradeViaRest() error {
defer resp.Body.Close()
if resp.StatusCode != 200 {
if resp.StatusCode != http.StatusOK {
bs, err := io.ReadAll(resp.Body)
if err != nil {
return err
@@ -529,7 +528,8 @@ func (c *serveCmd) syncthingMain() {
err = upgrade.To(release)
}
if err != nil {
if _, ok := err.(*errNoUpgrade); ok || err == errTooEarlyUpgradeCheck || err == errTooEarlyUpgrade {
var noUpgradeErr *errNoUpgrade
if errors.As(err, &noUpgradeErr) || errors.Is(err, errTooEarlyUpgradeCheck) || errors.Is(err, errTooEarlyUpgrade) {
slog.Debug("Initial automatic upgrade", slogutil.Error(err))
} else {
slog.Info("Initial automatic upgrade", slogutil.Error(err))
@@ -659,13 +659,14 @@ func auditWriter(auditFile string) io.Writer {
var auditDest string
var auditFlags int
if auditFile == "-" {
switch auditFile {
case "-":
fd = os.Stdout
auditDest = "stdout"
} else if auditFile == "--" {
case "--":
fd = os.Stderr
auditDest = "stderr"
} else {
default:
if auditFile == "" {
auditFile = locations.GetTimestamped(locations.AuditLog)
auditFlags = os.O_WRONLY | os.O_CREATE | os.O_EXCL
@@ -720,7 +721,7 @@ func autoUpgrade(cfg config.Wrapper, app *syncthing.App, evLogger events.Logger)
checkInterval := time.Duration(opts.AutoUpgradeIntervalH) * time.Hour
rel, err := upgrade.LatestRelease(opts.ReleasesURL, build.Version, opts.UpgradeToPreReleases)
if err == upgrade.ErrUpgradeUnsupported {
if errors.Is(err, upgrade.ErrUpgradeUnsupported) {
sub.Unsubscribe()
return
}
@@ -746,8 +747,13 @@ func autoUpgrade(cfg config.Wrapper, app *syncthing.App, evLogger events.Logger)
continue
}
sub.Unsubscribe()
restartDelay := time.Minute
evLogger.Log(events.UpgradeRestartScheduled, map[string]any{
"delayS": int(restartDelay / time.Second),
"newVersion": rel.Tag,
})
slog.Error("Automatically upgraded, restarting in 1 minute", slog.String("newVersion", rel.Tag))
time.Sleep(time.Minute)
time.Sleep(restartDelay)
app.Stop(svcutil.ExitUpgrade)
return
}
@@ -781,40 +787,39 @@ func initialAutoUpgradeCheck(misc *db.Typed) (upgrade.Release, error) {
// suitable time after they have gone out of fashion.
func cleanConfigDirectory() {
patterns := map[string]time.Duration{
"panic-*.log": 7 * 24 * time.Hour, // keep panic logs for a week
"audit-*.log": 7 * 24 * time.Hour, // keep audit logs for a week
"index": 14 * 24 * time.Hour, // keep old index format for two weeks
"index-v0.11.0.db": 14 * 24 * time.Hour, // keep old index format for two weeks
"index-v0.13.0.db": 14 * 24 * time.Hour, // keep old index format for two weeks
"index*.converted": 14 * 24 * time.Hour, // keep old converted indexes for two weeks
"config.xml.v*": 30 * 24 * time.Hour, // old config versions for a month
"*.idx.gz": 30 * 24 * time.Hour, // these should for sure no longer exist
"backup-of-v0.8": 30 * 24 * time.Hour, // these neither
"tmp-index-sorter.*": time.Minute, // these should never exist on startup
"support-bundle-*": 30 * 24 * time.Hour, // keep old support bundle zip or folder for a month
"csrftokens.txt": 0, // deprecated, remove immediately
"panic-*.log": 7 * 24 * time.Hour, // keep panic logs for a week
"audit-*.log": 7 * 24 * time.Hour, // keep audit logs for a week
"index-v0.14.0.db-migrated": 14 * 24 * time.Hour, // keep old index format for two weeks
"config.xml.v*": 30 * 24 * time.Hour, // old config versions for a month
"support-bundle-*": 30 * 24 * time.Hour, // keep old support bundle zip or folder for a month
}
for pat, dur := range patterns {
fs := fs.NewFilesystem(fs.FilesystemTypeBasic, locations.GetBaseDir(locations.ConfigBaseDir))
files, err := fs.Glob(pat)
if err != nil {
slog.Warn("Failed to clean config directory", slogutil.Error(err))
continue
}
for _, file := range files {
info, err := fs.Lstat(file)
locations := slices.Compact([]string{
locations.GetBaseDir(locations.ConfigBaseDir),
locations.GetBaseDir(locations.DataBaseDir),
})
for _, loc := range locations {
fs := fs.NewFilesystem(fs.FilesystemTypeBasic, loc)
for pat, dur := range patterns {
entries, err := fs.Glob(pat)
if err != nil {
slog.Warn("Failed to clean config directory", slogutil.Error(err))
continue
}
if time.Since(info.ModTime()) > dur {
if err = fs.RemoveAll(file); err != nil {
for _, entry := range entries {
info, err := fs.Lstat(entry)
if err != nil {
slog.Warn("Failed to clean config directory", slogutil.Error(err))
} else {
slog.Warn("Cleaned away old file", slogutil.FilePath(filepath.Base(file)))
continue
}
if time.Since(info.ModTime()) > dur {
if err = fs.RemoveAll(entry); err != nil {
slog.Warn("Failed to clean config directory", slogutil.Error(err))
} else {
slog.Warn("Cleaned away old file", slogutil.FilePath(filepath.Base(entry)))
}
}
}
}
@@ -837,7 +842,8 @@ func setPauseState(cfgWrapper config.Wrapper, paused bool) {
}
func exitCodeForUpgrade(err error) int {
if _, ok := err.(*errNoUpgrade); ok {
var noUpgradeErr *errNoUpgrade
if errors.As(err, &noUpgradeErr) {
return svcutil.ExitNoUpgradeAvailable.AsInt()
}
return svcutil.ExitError.AsInt()
@@ -1048,7 +1054,7 @@ func (m migratingAPI) Serve(ctx context.Context) error {
srv := &http.Server{
Addr: m.addr,
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain")
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
w.Write([]byte("*** Database migration in progress ***\n\n"))
for _, line := range slogutil.GlobalRecorder.Since(time.Time{}) {
_, _ = line.WriteTo(w, slogutil.DefaultLineFormat)
+5 -12
View File
@@ -9,6 +9,7 @@ package main
import (
"bufio"
"context"
"errors"
"fmt"
"io"
"log/slog"
@@ -136,17 +137,8 @@ func (c *serveCmd) monitorMain() {
var wg sync.WaitGroup
wg.Add(1)
go func() {
copyStderr(stderr, dst)
wg.Done()
}()
wg.Add(1)
go func() {
copyStdout(stdout, dst)
wg.Done()
}()
wg.Go(func() { copyStderr(stderr, dst) })
wg.Go(func() { copyStdout(stdout, dst) })
exit := make(chan error)
@@ -176,7 +168,8 @@ func (c *serveCmd) monitorMain() {
os.Exit(svcutil.ExitSuccess.AsInt())
}
if exiterr, ok := err.(*exec.ExitError); ok {
exiterr := &exec.ExitError{}
if errors.As(err, &exiterr) {
exitCode := exiterr.ExitCode()
if stopped || c.NoRestart {
os.Exit(exitCode)
+2 -19
View File
@@ -18,6 +18,7 @@ import (
"github.com/syncthing/syncthing/lib/build"
"github.com/syncthing/syncthing/lib/locations"
"github.com/syncthing/syncthing/lib/osutil"
"github.com/syncthing/syncthing/lib/protocol"
"golang.org/x/exp/constraints"
)
@@ -61,7 +62,7 @@ func savePerfStats(file string) {
rss,
rate(prevIn, in, timeDiff, 1e3),
rate(prevOut, out, timeDiff, 1e3),
dirsize(locations.Get(locations.Database))/1024,
osutil.DirSize(locations.Get(locations.Database))/1024,
)
prevTime = t
@@ -84,21 +85,3 @@ func rate[T number](prev, cur T, d time.Duration, div float64) float64 {
rate := float64(diff) / d.Seconds() / div
return rate
}
func dirsize(location string) int64 {
entries, err := os.ReadDir(location)
if err != nil {
return 0
}
var size int64
for _, entry := range entries {
fi, err := entry.Info()
if err != nil {
continue
}
size += fi.Size()
}
return size
}
+7
View File
@@ -39,3 +39,10 @@
darwin: "21"
linux: "3.2"
windows: "10.0"
- runtime: go1.26 # no changes from 1.25
requirements:
darwin: "21"
linux: "3.2"
windows: "10.0"
+198 -8
View File
@@ -16,16 +16,206 @@ RestartSec=1
SuccessExitStatus=3 4
RestartForceExitStatus=3 4
# Hardening
ProtectSystem=full
PrivateTmp=true
SystemCallArchitectures=native
MemoryDenyWriteExecute=true
NoNewPrivileges=true
#############
# SANDBOXING
#############
#
# This section contains best-effort sandboxing of syncthing. Such sandboxing is
# useful to reduce the blast damage of a syncthing exploit.
#
# The sandboxing is "best-effort" only because some of these options are ignored
# if your systemd or kernel are too old or configured in unusual ways. Systemd
# should (but may not) tell you in the journal logs if that's the case. See the
# logs (after starting the service) with:
#
# journalctl --boot --pager-end --unit syncthing@<user-you-used>.service
#
# See systemd's analysis of syncthing's sandbox with:
#
# systemd-analyze security syncthing@<user-you-used>.service
#
# Most of these sandboxing options are documented in `man systemd.exec`.
#
# NOTE: Some of these options _appear_ redundant with each other... but
# depending on the version and configs of systemd and the kernel, some of the
# "redundant" options may be non-functional while others still work.
# We recommend leaving the "redundant" options in place.
# Elevated permissions to sync ownership (disabled by default),
# see https://docs.syncthing.net/advanced/folder-sync-ownership
# Makes /usr, /boot, /efi and /etc read-only.
ProtectSystem=full
# Protect several system areas syncthing should not be touching.
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectKernelLogs=true
ProtectControlGroups=true
ProtectHostname=true
ProtectClock=true
# No new privileges through SUID/SGID binaries
NoNewPrivileges=true
# Prevents *setting* SUID/SGID bits on files/dirs
RestrictSUIDSGID=true
# Prevent memory pages that are both writable and executable. This kills JIT
# compilers, but syncthing is precompiled.
MemoryDenyWriteExecute=true
# Prevents creation of unprivileged user namespaces which are a significant
# source of privilege escalation exploits.
#
# (In 2023, Google saw 44% of kernel exploits using unpriv. user namespaces.
# Source: https://ubuntu.com/blog/ubuntu-23-10-restricted-unprivileged-user-namespaces)
#
# The service can still be placed *inside* such user namespaces (and is, through
# other sandboxing options), it just can't create any itself.
RestrictNamespaces=true
# RT task scheduling can be abused for denial-of-service
RestrictRealtime=true
# NOTE: This option is poorly named. It doesn't _restrict_ the listed families,
# it _allows_ the listed families. Unlisted ones are restricted.
#
# Specifically, notice the absence of AF_PACKET (raw packets).
# AF_UNIX is needed to support binding to UNIX sockets.
# AF_NETLINK is needed to support hotplugging of network devices and because
# otherwise we see the following (non-fatal) error on startup:
#
# Failed to list network interfaces (error="route ip+net: netlinkrib:
# address family not supported by protocol" log.pkg=upnp)
#
# This option does NOT affect systemd socket passing using .socket units.
RestrictAddressFamilies=AF_INET AF_INET6 AF_NETLINK AF_UNIX
# The lifetime limit of (superuser) capabilities that syncthing can acquire.
# This option _restricts_ capabilities.
#
# NOTE: This is set to `CAP_CHOWN CAP_FOWNER` to avoid breaking users that have
# set `AmbientCapabilities=CAP_CHOWN CAP_FOWNER` to enable the `syncOwnership`
# option as described in:
# https://docs.syncthing.net/users/autostart.html#permissions
#
# If you do not use the `syncOwnership` option, you can set this to:
# CapabilityBoundingSet=
CapabilityBoundingSet=CAP_CHOWN CAP_FOWNER
# Start with empty (superuser) capabilities.
# This option _expands_ capabilities.
# AmbientCapabilities should equal CapabilityBoundingSet.
#
# NOTE: IFF you wish to use the `syncOwnership` option, you must set this to:
# AmbientCapabilities=CAP_CHOWN CAP_FOWNER
# in a systemd drop-in file. Be aware that this gives syncthing the ability to
# change or ignore file ownership across the entire operating system.
AmbientCapabilities=
# Disables `personality` system call; it can be used for privilege escalation.
LockPersonality=true
# Prevents circumvention of restrictions through the use of x86 syscalls on
# x86-64 systems.
SystemCallArchitectures=native
# Clean up IPC objects after service stops.
RemoveIPC=true
# Create private namespace for System V IPC.
# NOTE: This does not apply to AF_UNIX sockets which are more commonly used.
PrivateIPC=true
# Completely isolated /tmp and /var/tmp
PrivateTmp=disconnected
# New /dev with safe virtual devices like /dev/null
PrivateDevices=true
# Allow access to devices explicitly listed with DeviceAllow and pseudo devices
# like /dev/null.
DevicePolicy=closed
# Creates a new PID namespace. /proc now contains only entries for processes
# in this PID namespace.
PrivatePIDs=true
# Make processes owned by other users hidden in /proc/
ProtectProc=invisible
# Prevent access to non-pid interfaces in /proc.
ProcSubset=pid
# System call allow-list. `@system-service` is a systemd-provided category that
# allows common syscalls needed for system services.
SystemCallFilter=@system-service
# Return EPERM when a disallowed syscall is made instead of killing the process.
SystemCallErrorNumber=EPERM
# Digits from left to right; disallow creation of files with:
# - special security-related bits like setuid/setgid
# - (no restrictions on file owner permissions)
# - group-writable access
# - world-readable access
# NOTE: The default value is 0022. We are only restricting special security bits
# and world-readable access.
# NOTE: Syncthing can still _explicitly_ change file permissions using `chmod`.
UMask=7027
# The default HOME folder for system users on Debian-like systems is
# /nonexistent, which should never exist.
# We prevent syncthing from accessing that folder it if was previously created
# through misconfiguration, or from creating it if it's (correctly) missing.
InaccessiblePaths=-/nonexistent
##################
# OPTIONAL CONFIG
##################
#
# Users that want to tweak this service file should add a systemd drop-in
# file to avoid changing the original file.
#
# Documentation describing drop-in files:
# https://www.freedesktop.org/software/systemd/man/latest/systemd.unit.html
#
# Example drop-in file location (assuming user "syncthing"):
# /etc/systemd/system/syncthing@syncthing.service.d/override.conf
#
## Elevated permissions to sync ownership (disabled by default),
## see https://docs.syncthing.net/advanced/folder-sync-ownership
##
## NOTE:
## - Use the same value for *both* of these options.
## - PrivateUsers=false must be set (false is the default, but you might have
## changed it to true in the "extra credit" section below).
#AmbientCapabilities=CAP_CHOWN CAP_FOWNER
#CapabilityBoundingSet=CAP_CHOWN CAP_FOWNER
#########################
# EXTRA CREDIT FOR USERS
#########################
#
# Users that want to harden their systems further should set the following
# properties. (Also through a systemd drop-in file; see comments above.)
#
## Makes all of / read-only *except*:
## - /dev/, /proc/ and /sys/ (see other Protect* options)
## - ReadWritePaths=
## - StateDirectory=, LogsDirectory= and similar
##
## This cannot be enabled by default because we don't know which folders you wish to
## share. If enabling this option, enable it along with ReadWritePaths=, e.g.:
## ReadWritePaths=/my/shared/dir1 /my/shared/dir2
#ProtectSystem=strict
#
## When enabled, sets up a new user namespace. Maps the "root" user and group as
## well as the unit's own user and group to themselves and everything else to
## the "nobody" user and group.
## This is useful to securely detach the user and group databases used by the
## unit from the rest of the system, and thus to create an effective sandbox
## environment.
#PrivateUsers=true
#
## Makes /home, /root and /run/user *invisible* while allowing BindPaths= and
## BindReadOnlyPaths= to "carve out" access to parts of those dirs.
## (Use 'true' instead of 'tmpfs' if you don't need to carve out anything.)
##
## "Invisible" is superior to read-only provided by ProtectSystem=strict because
## it prevents information disclosure of private user data in case of service
## compromise.
#ProtectHome=tmpfs
#
## Disallow execution of all binaries. ExecPaths= below carves out exceptions.
## Can't be enabled by default due to the External File Versioning feature:
## https://docs.syncthing.net/users/versioning.html#external-file-versioning
##
## If you do not use that feature, you can enable both NoExecPaths and
## ExecPaths.
## If you do use that featuer, you can still use these options; just add
## the paths to the binaries you invoke to ExecPaths so they can be executed.
#NoExecPaths=/
## Allow execution of syncthing and system shared libraries.
## NOTE: If you are seeing an error like
## "Failed to execute /some/path/to/syncthing: Permission denied", this is the
## option you need to update to use your non-standard install location.
#ExecPaths=/usr/bin/syncthing /usr/lib
[Install]
WantedBy=multi-user.target
+39 -39
View File
@@ -1,11 +1,10 @@
module github.com/syncthing/syncthing
go 1.24.0
go 1.25.0
require (
github.com/AudriusButkevicius/recli v0.0.7
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.2
github.com/alecthomas/kong v1.12.1
github.com/alecthomas/kong v1.15.0
github.com/aws/aws-sdk-go v1.55.8
github.com/calmh/incontainer v1.0.0
github.com/calmh/xdr v1.2.0
@@ -13,27 +12,27 @@ require (
github.com/coreos/go-semver v0.3.1
github.com/d4l3k/messagediff v1.2.1
github.com/getsentry/raven-go v0.2.0
github.com/go-ldap/ldap/v3 v3.4.11
github.com/go-ldap/ldap/v3 v3.4.13
github.com/gobwas/glob v0.2.3
github.com/gofrs/flock v0.12.1
github.com/gofrs/flock v0.13.0
github.com/hashicorp/golang-lru/v2 v2.0.7
github.com/jackpal/gateway v1.0.16
github.com/jackpal/gateway v1.1.1
github.com/jackpal/go-nat-pmp v1.0.2
github.com/jmoiron/sqlx v1.4.0
github.com/julienschmidt/httprouter v1.3.0
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
github.com/maruel/panicparse/v2 v2.5.0
github.com/mattn/go-sqlite3 v1.14.31
github.com/mattn/go-sqlite3 v1.14.44
github.com/maxmind/geoipupdate/v6 v6.1.0
github.com/miscreant/miscreant.go v0.0.0-20200214223636-26d376326b75
github.com/oschwald/geoip2-golang v1.13.0
github.com/pierrec/lz4/v4 v4.1.22
github.com/prometheus/client_golang v1.23.0
github.com/pierrec/lz4/v4 v4.1.26
github.com/prometheus/client_golang v1.23.2
github.com/puzpuzpuz/xsync/v3 v3.5.1
github.com/quic-go/quic-go v0.52.0
github.com/rabbitmq/amqp091-go v1.10.0
github.com/quic-go/quic-go v0.59.0
github.com/rabbitmq/amqp091-go v1.11.0
github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9
github.com/shirou/gopsutil/v4 v4.25.6 // https://github.com/shirou/gopsutil/issues/1898
github.com/shirou/gopsutil/v4 v4.26.4
github.com/syncthing/notify v0.0.0-20250528144937-c7027d4f7465
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d
github.com/thejerf/suture/v4 v4.0.6
@@ -41,22 +40,19 @@ require (
github.com/vitrun/qart v0.0.0-20160531060029-bf64b92db6b0
github.com/willabides/kongplete v0.4.0
github.com/wlynxg/anet v0.0.5
go.uber.org/automaxprocs v1.6.0
golang.org/x/crypto v0.41.0
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50
golang.org/x/net v0.43.0
golang.org/x/sys v0.35.0
golang.org/x/text v0.28.0
golang.org/x/time v0.12.0
google.golang.org/protobuf v1.36.7
modernc.org/sqlite v1.38.2
golang.org/x/crypto v0.51.0
golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a
golang.org/x/net v0.54.0
golang.org/x/sys v0.44.0
golang.org/x/text v0.37.0
golang.org/x/time v0.15.0
google.golang.org/protobuf v1.36.11
modernc.org/sqlite v1.50.0
sigs.k8s.io/yaml v1.6.0
)
require (
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 // indirect
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 // indirect
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 // indirect
github.com/Azure/go-ntlmssp v0.1.0 // indirect
github.com/beorn7/perks v1.0.1 // indirect
github.com/cenkalti/backoff/v4 v4.3.0 // indirect
github.com/certifi/gocertifi v0.0.0-20210507211836-431795d63e8d // indirect
@@ -64,11 +60,10 @@ require (
github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/ebitengine/purego v0.8.4 // indirect
github.com/ebitengine/purego v0.10.0 // indirect
github.com/fsnotify/fsnotify v1.7.0 // indirect
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 // indirect
github.com/go-ole/go-ole v1.3.0 // indirect
github.com/go-task/slim-sprig/v3 v3.0.0 // indirect
github.com/golang/snappy v0.0.4 // indirect
github.com/google/pprof v0.0.0-20250423184734-337e5dd93bb4 // indirect
github.com/google/uuid v1.6.0 // indirect
@@ -77,34 +72,34 @@ require (
github.com/jmespath/go-jmespath v0.4.0 // indirect
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/maxbrunsfeld/counterfeiter/v6 v6.11.3 // indirect
github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 // indirect
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
github.com/ncruces/go-strftime v0.1.9 // indirect
github.com/ncruces/go-strftime v1.0.0 // indirect
github.com/nxadm/tail v1.4.11 // indirect
github.com/onsi/ginkgo/v2 v2.23.4 // indirect
github.com/oschwald/maxminddb-golang v1.13.1 // indirect
github.com/pkg/errors v0.9.1 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/posener/complete v1.2.3 // indirect
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 // indirect
github.com/prometheus/client_model v0.6.2 // indirect
github.com/prometheus/common v0.65.0 // indirect
github.com/prometheus/common v0.66.1 // indirect
github.com/prometheus/procfs v0.16.1 // indirect
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec // indirect
github.com/riywo/loginshell v0.0.0-20200815045211-7d26008be1ab // indirect
github.com/rogpeppe/go-internal v1.12.0 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/stretchr/objx v0.5.2 // indirect
github.com/stretchr/testify v1.10.0 // indirect
github.com/tklauser/go-sysconf v0.3.15 // indirect
github.com/tklauser/numcpus v0.10.0 // indirect
github.com/stretchr/testify v1.11.1 // indirect
github.com/tklauser/go-sysconf v0.3.16 // indirect
github.com/tklauser/numcpus v0.11.0 // indirect
github.com/yusufpapurcu/wmi v1.2.4 // indirect
go.uber.org/mock v0.5.2 // indirect
go.yaml.in/yaml/v2 v2.4.2 // indirect
golang.org/x/mod v0.27.0 // indirect
golang.org/x/sync v0.16.0 // indirect
golang.org/x/tools v0.36.0 // indirect
golang.org/x/mod v0.36.0 // indirect
golang.org/x/sync v0.20.0 // indirect
golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 // indirect
golang.org/x/tools v0.45.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
modernc.org/libc v1.66.3 // indirect
modernc.org/libc v1.72.0 // indirect
modernc.org/mathutil v1.7.1 // indirect
modernc.org/memory v1.11.0 // indirect
)
@@ -112,8 +107,13 @@ require (
// https://github.com/gobwas/glob/pull/55
replace github.com/gobwas/glob v0.2.3 => github.com/calmh/glob v0.0.0-20220615080505-1d823af5017b
// https://github.com/jackpal/gateway/pull/49
replace github.com/jackpal/gateway v1.1.1 => github.com/marbens-arch/gateway v1.1.2-0.20260308173556-c567cc04e7d4
// https://github.com/mattn/go-sqlite3/pull/1338
replace github.com/mattn/go-sqlite3 v1.14.31 => github.com/calmh/go-sqlite3 v1.14.32-0.20250812195006-80712c77b76a
// https://github.com/mattn/go-sqlite3/pull/1399
// https://github.com/mattn/go-sqlite3/pull/1400
replace github.com/mattn/go-sqlite3 v1.14.44 => github.com/calmh/go-sqlite3 v1.14.45-0.20260519121030-00c8bf368e65
tool (
github.com/calmh/xdr/cmd/genxdr
+78 -99
View File
@@ -2,37 +2,25 @@ filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA=
filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4=
github.com/AudriusButkevicius/recli v0.0.7 h1:9zjbYlTupi+W5SJXm2cR2sV2mJAIg1sIfDcsW7hrkPM=
github.com/AudriusButkevicius/recli v0.0.7/go.mod h1:Nhfib1j/VFnLrXL9cHgA+/n2O6P5THuWelOnbfPNd78=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1 h1:Wc1ml6QlJs2BHQ/9Bqu1jiyggbsSjramq2oUmp5WeIo=
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.18.1/go.mod h1:Ot/6aikWnKWi4l9QB7qVSwa8iMphQNqkWALMoNT3rzM=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1 h1:B+blDbyVIG3WaikNxPnhPiJ1MThR03b3vKGtER95TP4=
github.com/Azure/azure-sdk-for-go/sdk/azidentity v1.10.1/go.mod h1:JdM5psgjfBf5fo2uWOZhflPWyDBZ/O/CNAH9CtsuZE4=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1 h1:FPKJS1T+clwv+OLGt13a8UjqeRuh0O4SJ3lUriThc+4=
github.com/Azure/azure-sdk-for-go/sdk/internal v1.11.1/go.mod h1:j2chePtV91HrC22tGoRX3sGY42uF13WzmmV80/OdVAA=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1 h1:/Zt+cDPnpC3OVDm/JKLOs7M2DKmLRIIp3XIx9pHHiig=
github.com/Azure/azure-sdk-for-go/sdk/resourcemanager/storage/armstorage v1.8.1/go.mod h1:Ng3urmn6dYe8gnbCMoHHVl5APYz2txho3koEkV2o2HA=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.2 h1:FwladfywkNirM+FZYLBR2kBz5C8Tg0fw5w5Y7meRXWI=
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.2/go.mod h1:vv5Ad0RrIoT1lJFdWBZwt4mB1+j+V8DUroixmKDTCdk=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358 h1:mFRzDkZVAjdal+s7s0MwaRv9igoPqLRdzOLzw/8Xvq8=
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358/go.mod h1:chxPXzSsl7ZWRAuOIE23GDNzjWuZquvFlgA8xmpunjU=
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2 h1:oygO0locgZJe7PpYPXT5A29ZkwJaPqcva7BVeemZOZs=
github.com/AzureAD/microsoft-authentication-library-for-go v1.4.2/go.mod h1:wP83P5OoQ5p6ip3ScPr0BAq0BvuPAvacpEuSzyouqAI=
github.com/Azure/go-ntlmssp v0.1.0 h1:DjFo6YtWzNqNvQdrwEyr/e4nhU3vRiwenz5QX7sFz+A=
github.com/Azure/go-ntlmssp v0.1.0/go.mod h1:NYqdhxd/8aAct/s4qSYZEerdPuH1liG2/X9DiVTbhpk=
github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho=
github.com/alecthomas/assert/v2 v2.11.0 h1:2Q9r3ki8+JYXvGsDyBXwH3LcJ+WK5D0gc5E8vS6K3D0=
github.com/alecthomas/assert/v2 v2.11.0/go.mod h1:Bze95FyfUr7x34QZrjL+XP+0qgp/zg8yS+TtBj1WA3k=
github.com/alecthomas/kong v1.12.1 h1:iq6aMJDcFYP9uFrLdsiZQ2ZMmcshduyGv4Pek0MQPW0=
github.com/alecthomas/kong v1.12.1/go.mod h1:p2vqieVMeTAnaC83txKtXe8FLke2X07aruPWXyMPQrU=
github.com/alecthomas/repr v0.4.0 h1:GhI2A8MACjfegCPVq9f1FLvIBS+DrQ2KQBFZP1iFzXc=
github.com/alecthomas/repr v0.4.0/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa h1:LHTHcTQiSGT7VVbI0o4wBRNQIgn917usHWOd6VAffYI=
github.com/alexbrainman/sspi v0.0.0-20231016080023-1a75b4708caa/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
github.com/alecthomas/kong v1.15.0 h1:BVJstKbpO73zKpmIu+m/aLRrNmWwxXPIGTNin9VmLVI=
github.com/alecthomas/kong v1.15.0/go.mod h1:wrlbXem1CWqUV5Vbmss5ISYhsVPkBb1Yo7YKJghju2I=
github.com/alecthomas/repr v0.5.2 h1:SU73FTI9D1P5UNtvseffFSGmdNci/O6RsqzeXJtP0Qs=
github.com/alecthomas/repr v0.5.2/go.mod h1:Fr0507jx4eOXV7AlPV6AVZLYrLIuIeSOWtW57eE/O/4=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e h1:4dAU9FXIyQktpoUAgOJK3OTFc/xug0PCXYCqU0FgDKI=
github.com/alexbrainman/sspi v0.0.0-20250919150558-7d374ff0d59e/go.mod h1:cEWa1LVoE5KvSD9ONXsZrj0z6KqySlCCNKHlLzbqAt4=
github.com/aws/aws-sdk-go v1.55.8 h1:JRmEUbU52aJQZ2AjX4q4Wu7t4uZjOu71uyNmaWlUkJQ=
github.com/aws/aws-sdk-go v1.55.8/go.mod h1:ZkViS9AqA6otK+JBBNH2++sx1sgxrPKcSzPPvQkUtXk=
github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM=
github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw=
github.com/calmh/glob v0.0.0-20220615080505-1d823af5017b h1:Fjm4GuJ+TGMgqfGHN42IQArJb77CfD/mAwLbDUoJe6g=
github.com/calmh/glob v0.0.0-20220615080505-1d823af5017b/go.mod h1:91K7jfEsgJSyfSrX+gmrRfZMtntx6JsHolWubGXDopg=
github.com/calmh/go-sqlite3 v1.14.32-0.20250812195006-80712c77b76a h1:lTe5qJApKNO+zZCa3/P/7UxM4c58CXWOegv9eODPWvs=
github.com/calmh/go-sqlite3 v1.14.32-0.20250812195006-80712c77b76a/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/calmh/go-sqlite3 v1.14.45-0.20260519121030-00c8bf368e65 h1:4tbv1D+AkdxV4si6cdT3+8lr/c/gJqBdW6yGi8I7z3E=
github.com/calmh/go-sqlite3 v1.14.45-0.20260519121030-00c8bf368e65/go.mod h1:pjEuOr8IwzLJP2MfGeTb0A35jauH+C2kbHKBr7yXKVQ=
github.com/calmh/incontainer v1.0.0 h1:g2cTUtZuFGmMGX8GoykPkN1Judj2uw8/3/aEtq4Z/rg=
github.com/calmh/incontainer v1.0.0/go.mod h1:eOhqnw15c9X+4RNBe0W3HlUZFfX16O0EDsCOInTndHY=
github.com/calmh/xdr v1.2.0 h1:GaGSNH4ZDw9kNdYqle6+RcAENiaQ8/611Ok+jQbBEeU=
@@ -59,8 +47,8 @@ github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/dustin/go-humanize v1.0.1 h1:GzkhY7T5VNhEkwH0PVJgjz+fX1rhBrR7pRT3mDkpeCY=
github.com/dustin/go-humanize v1.0.1/go.mod h1:Mu1zIs6XwVuF/gI1OepvI0qD18qycQx+mFykh5fBlto=
github.com/ebitengine/purego v0.8.4 h1:CF7LEKg5FFOsASUj0+QwaXf8Ht6TlFxg09+S9wz0omw=
github.com/ebitengine/purego v0.8.4/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/ebitengine/purego v0.10.0 h1:QIw4xfpWT6GWTzaW5XEKy3HXoqrJGx1ijYHzTF0/ISU=
github.com/ebitengine/purego v0.10.0/go.mod h1:iIjxzd6CiRiOG0UyXP+V1+jWqUXVjPKLAI0mRfJZTmQ=
github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo=
github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ=
github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU=
@@ -71,22 +59,16 @@ github.com/getsentry/raven-go v0.2.0 h1:no+xWJRb5ZI7eE8TWgIq1jLulQiIoLG0IfYxv5JY
github.com/getsentry/raven-go v0.2.0/go.mod h1:KungGk8q33+aIAZUIVWZDr2OfAEBsO49PX4NzFV5kcQ=
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667 h1:BP4M0CvQ4S3TGls2FvczZtj5Re/2ZzkV9VwqPHH/3Bo=
github.com/go-asn1-ber/asn1-ber v1.5.8-0.20250403174932-29230038a667/go.mod h1:hEBeB/ic+5LoWskz+yKT7vGhhPYkProFKoKdwZRWMe0=
github.com/go-ldap/ldap/v3 v3.4.11 h1:4k0Yxweg+a3OyBLjdYn5OKglv18JNvfDykSoI8bW0gU=
github.com/go-ldap/ldap/v3 v3.4.11/go.mod h1:bY7t0FLK8OAVpp/vV6sSlpz3EQDGcQwc8pF0ujLgKvM=
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-ldap/ldap/v3 v3.4.13 h1:+x1nG9h+MZN7h/lUi5Q3UZ0fJ1GyDQYbPvbuH38baDQ=
github.com/go-ldap/ldap/v3 v3.4.13/go.mod h1:LxsGZV6vbaK0sIvYfsv47rfh4ca0JXokCoKjZxsszv0=
github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0=
github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE=
github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78=
github.com/go-sql-driver/mysql v1.8.1 h1:LedoTUt/eveggdHS9qUFC1EFSa8bU2+1pZjSRpvNJ1Y=
github.com/go-sql-driver/mysql v1.8.1/go.mod h1:wEBSXgmK//2ZFJyE+qWnIsVGmvmEKlqwuVSjsCm7DZg=
github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE=
github.com/go-task/slim-sprig/v3 v3.0.0 h1:sUs3vkvUymDpBKi3qH1YSqBQk9+9D/8M2mN1vB6EwHI=
github.com/go-task/slim-sprig/v3 v3.0.0/go.mod h1:W848ghGpv3Qj3dhTPRyJypKRiqCdHZiAzKg9hl15HA8=
github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E=
github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0=
github.com/golang-jwt/jwt/v5 v5.2.3 h1:kkGXqQOBSDDWRhWNXTFpqGSCMyh/PLnqUvMGJPDJDs0=
github.com/golang-jwt/jwt/v5 v5.2.3/go.mod h1:pqrtFR0X4osieyHYxtmOUWsAWrfe1Q5UVIyoH402zdk=
github.com/gofrs/flock v0.13.0 h1:95JolYOvGMqeH31+FC7D2+uULf6mG61mEZ/A8dRYMzw=
github.com/gofrs/flock v0.13.0/go.mod h1:jxeyy9R1auM5S6JYDBhDt+E2TCo7DkratH4Pgi8P+Z0=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
@@ -124,8 +106,6 @@ github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUq
github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg=
github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU=
github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc=
github.com/jackpal/gateway v1.0.16 h1:mTBRuHSW8qviVqX7kXnxKevqlfS/OA01ys6k6fxSX7w=
github.com/jackpal/gateway v1.0.16/go.mod h1:IOn1OUbso/cGYmnCBZbCEqhNCLSz0xxdtIpUpri5/nA=
github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus=
github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc=
github.com/jcmturner/aescts/v2 v2.0.0 h1:9YKLH6ey7H4eDBXW8khjYslgyqG2xZikXP0EQFKrle8=
@@ -162,21 +142,23 @@ github.com/lib/pq v1.10.9 h1:YXG7RB+JIjhP29X+OtkiDnYaXQwpS4JEWq7dtCCRUEw=
github.com/lib/pq v1.10.9/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683 h1:7UMa6KCCMjZEMDtTVdcGu0B1GmmC7QJKiCCjyTAWQy0=
github.com/lufia/plan9stats v0.0.0-20240909124753-873cd0166683/go.mod h1:ilwx/Dta8jXAgpFYFvSWEMwxmbWXyiUHkd5FwyKhb5k=
github.com/marbens-arch/gateway v1.1.2-0.20260308173556-c567cc04e7d4 h1:8TAc8a26Pp0+8I6rj43BqhMi84D1zvtY0sPzO3IKnBw=
github.com/marbens-arch/gateway v1.1.2-0.20260308173556-c567cc04e7d4/go.mod h1:Tl1vZVtUaXx5j6P5HFmv45alhEi4yHHLfT4PRbB7eyw=
github.com/maruel/panicparse/v2 v2.5.0 h1:yCtuS0FWjfd0RTYMXGpDvWcb0kINm8xJGu18/xMUh00=
github.com/maruel/panicparse/v2 v2.5.0/go.mod h1:DA2fDiBk63bKfBf4CVZP9gb4fuvzdPbLDsSI873hweQ=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-sqlite3 v1.14.22/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
github.com/maxbrunsfeld/counterfeiter/v6 v6.11.3 h1:Eaq36EIyJNp7b3qDhjV7jmDVq/yPeW2v4pTqzGbOGB4=
github.com/maxbrunsfeld/counterfeiter/v6 v6.11.3/go.mod h1:6KKUoQBZBW6PDXJtNfqeEjPXMj/ITTk+cWK9t9uS5+E=
github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0 h1:aOeI7xAOVdK+R6xbVsZuU9HmCZYmQVmZgPf9xJUd2Sg=
github.com/maxbrunsfeld/counterfeiter/v6 v6.12.0/go.mod h1:0hZWbtfeCYUQeAQdPLUzETiBhUSns7O6LDj9vH88xKA=
github.com/maxmind/geoipupdate/v6 v6.1.0 h1:sdtTHzzQNJlXF5+fd/EoPTucRHyMonYt/Cok8xzzfqA=
github.com/maxmind/geoipupdate/v6 v6.1.0/go.mod h1:cZYCDzfMzTY4v6dKRdV7KTB6SStxtn3yFkiJ1btTGGc=
github.com/miscreant/miscreant.go v0.0.0-20200214223636-26d376326b75 h1:cUVxyR+UfmdEAZGJ8IiKld1O0dbGotEnkMolG5hfMSY=
github.com/miscreant/miscreant.go v0.0.0-20200214223636-26d376326b75/go.mod h1:pBbZyGwC5i16IBkjVKoy/sznA8jPD/K9iedwe1ESE6w=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 h1:C3w9PqII01/Oq1c1nUAm88MOHcQC9l5mIlSMApZMrHA=
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822/go.mod h1:+n7T8mK8HuQTcFwEeznm/DIxMOiR9yIdICNftLE1DvQ=
github.com/ncruces/go-strftime v0.1.9 h1:bY0MQC28UADQmHmaF5dgpLmImcShSi2kHU9XLdhx/f4=
github.com/ncruces/go-strftime v0.1.9/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/ncruces/go-strftime v1.0.0 h1:HMFp8mLCTPp341M/ZnA4qaf7ZlsbTc+miZjCLOFAw7w=
github.com/ncruces/go-strftime v1.0.0/go.mod h1:Fwc5htZGVVkseilnfgOVb9mKy6w1naJmn9CehxcKcls=
github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A=
github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU=
github.com/nxadm/tail v1.4.11 h1:8feyoE3OzPrcshW5/MJ4sGESc5cqmGkGCWlco4l0bqY=
@@ -187,22 +169,18 @@ github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vv
github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE=
github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU=
github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c=
github.com/onsi/ginkgo/v2 v2.23.4 h1:ktYTpKJAVZnDT4VjxSbiBenUjmlL/5QkBEocaWXiQus=
github.com/onsi/ginkgo/v2 v2.23.4/go.mod h1:Bt66ApGPBFzHyR+JO10Zbt0Gsp4uWxu5mIOTusL46e8=
github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY=
github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo=
github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY=
github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro=
github.com/onsi/gomega v1.37.0 h1:CdEG8g0S133B4OswTDC/5XPSzE1OeP29QOioj2PID2Y=
github.com/onsi/gomega v1.37.0/go.mod h1:8D9+Txp43QWKhM24yyOBEdpkzN8FvJyAwecBgsU4KU0=
github.com/onsi/gomega v1.38.2 h1:eZCjf2xjZAqe+LeWvKb5weQ+NcPwX84kqJ0cZNxok2A=
github.com/onsi/gomega v1.38.2/go.mod h1:W2MJcYxRGV63b418Ai34Ud0hEdTVXq9NW9+Sx6uXf3k=
github.com/oschwald/geoip2-golang v1.13.0 h1:Q44/Ldc703pasJeP5V9+aFSZFmBN7DKHbNsSFzQATJI=
github.com/oschwald/geoip2-golang v1.13.0/go.mod h1:P9zG+54KPEFOliZ29i7SeYZ/GM6tfEL+rgSn03hYuUo=
github.com/oschwald/maxminddb-golang v1.13.1 h1:G3wwjdN9JmIK2o/ermkHM+98oX5fS+k5MbwsmL4MRQE=
github.com/oschwald/maxminddb-golang v1.13.1/go.mod h1:K4pgV9N/GcK694KSTmVSDTODk4IsCNThNdTmnaBZ/F8=
github.com/pierrec/lz4/v4 v4.1.22 h1:cKFw6uJDK+/gfw5BcDL0JL5aBsAFdsIT18eRtLj7VIU=
github.com/pierrec/lz4/v4 v4.1.22/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c h1:+mdjkGKdHQG3305AYmdv1U2eRNDiU2ErMBj1gwrq8eQ=
github.com/pkg/browser v0.0.0-20240102092130-5ac0b6a4141c/go.mod h1:7rwL4CYBLnjLxUqIJNnCWiEdr3bn6IUYi15bNlnbCCU=
github.com/pierrec/lz4/v4 v4.1.26 h1:GrpZw1gZttORinvzBdXPUXATeqlJjqUG/D87TKMnhjY=
github.com/pierrec/lz4/v4 v4.1.26/go.mod h1:EoQMVJgeeEOMsCqCzqFm2O0cJvljX2nGZjcRIPL34O4=
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
@@ -212,22 +190,20 @@ github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXq
github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55 h1:o4JXh1EVt9k/+g42oCprj/FisM4qX9L3sZB3upGN2ZU=
github.com/power-devops/perfstat v0.0.0-20240221224432-82ca36839d55/go.mod h1:OmDBASR4679mdNQnz2pUhc2G8CO2JrUAVFDRBDP/hJE=
github.com/prashantv/gostub v1.1.0 h1:BTyx3RfQjRHnUWaGF9oQos79AlQ5k8WNktv7VGvVH4g=
github.com/prashantv/gostub v1.1.0/go.mod h1:A5zLQHz7ieHGG7is6LLXLz7I8+3LZzsrV0P1IAHhP5U=
github.com/prometheus/client_golang v1.23.0 h1:ust4zpdl9r4trLY/gSjlm07PuiBq2ynaXXlptpfy8Uc=
github.com/prometheus/client_golang v1.23.0/go.mod h1:i/o0R9ByOnHX0McrTMTyhYvKE4haaf2mW08I+jGAjEE=
github.com/prometheus/client_golang v1.23.2 h1:Je96obch5RDVy3FDMndoUsjAhG5Edi49h0RJWRi/o0o=
github.com/prometheus/client_golang v1.23.2/go.mod h1:Tb1a6LWHB3/SPIzCoaDXI4I8UHKeFTEQ1YCr+0Gyqmg=
github.com/prometheus/client_model v0.6.2 h1:oBsgwpGs7iVziMvrGhE53c/GrLUsZdHnqNwqPLxwZyk=
github.com/prometheus/client_model v0.6.2/go.mod h1:y3m2F6Gdpfy6Ut/GBsUqTWZqCUvMVzSfMLjcu6wAwpE=
github.com/prometheus/common v0.65.0 h1:QDwzd+G1twt//Kwj/Ww6E9FQq1iVMmODnILtW1t2VzE=
github.com/prometheus/common v0.65.0/go.mod h1:0gZns+BLRQ3V6NdaerOhMbwwRbNh9hkGINtQAsP5GS8=
github.com/prometheus/common v0.66.1 h1:h5E0h5/Y8niHc5DlaLlWLArTQI7tMrsfQjHV+d9ZoGs=
github.com/prometheus/common v0.66.1/go.mod h1:gcaUsgf3KfRSwHY4dIMXLPV0K/Wg1oZ8+SbZk/HH/dA=
github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzMyRg=
github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is=
github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg=
github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA=
github.com/quic-go/quic-go v0.52.0 h1:/SlHrCRElyaU6MaEPKqKr9z83sBg2v4FLLvWM+Z47pA=
github.com/quic-go/quic-go v0.52.0/go.mod h1:MFlGGpcpJqRAfmYi6NC2cptDPSxRWTOGNuP4wqrWmzQ=
github.com/rabbitmq/amqp091-go v1.10.0 h1:STpn5XsHlHGcecLmMFCtg7mqq0RnD+zFr4uzukfVhBw=
github.com/rabbitmq/amqp091-go v1.10.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
github.com/quic-go/quic-go v0.59.0 h1:OLJkp1Mlm/aS7dpKgTc6cnpynnD2Xg7C1pwL6vy/SAw=
github.com/quic-go/quic-go v0.59.0/go.mod h1:upnsH4Ju1YkqpLXC305eW3yDZ4NfnNbmQRCMWS58IKU=
github.com/rabbitmq/amqp091-go v1.11.0 h1:HxIctVm9Gid/Vtn706necmZ7Wj6pgGI2eqplRbEY8O8=
github.com/rabbitmq/amqp091-go v1.11.0/go.mod h1:Hy4jKW5kQART1u+JkDTF9YYOQUHXqMuhrgxOEeS7G4o=
github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9 h1:bsUq1dX0N8AOIL7EB/X911+m4EHsnWEHeJ0c+3TTBrg=
github.com/rcrowley/go-metrics v0.0.0-20250401214520-65e299d6c5c9/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4=
github.com/remyoudompheng/bigfft v0.0.0-20230129092748-24d4a6f8daec h1:W09IVJc94icq4NjY3clb7Lk8O1qJ8BdBEF8z0ibU0rE=
@@ -240,8 +216,8 @@ github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf
github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM=
github.com/sclevine/spec v1.4.0 h1:z/Q9idDcay5m5irkZ28M7PtQM4aOISzOpj4bUPkDee8=
github.com/sclevine/spec v1.4.0/go.mod h1:LvpgJaFyvQzRvc1kaDs0bulYwzC70PbiYjC4QnFHkOM=
github.com/shirou/gopsutil/v4 v4.25.6 h1:kLysI2JsKorfaFPcYmcJqbzROzsBWEOAtw6A7dIfqXs=
github.com/shirou/gopsutil/v4 v4.25.6/go.mod h1:PfybzyydfZcN+JMMjkF6Zb8Mq1A/VcogFFg7hj50W9c=
github.com/shirou/gopsutil/v4 v4.26.4 h1:B4SXVbcwTyrocPHEmWBC4uCYr4Xcu3MK1TXqbprAOWY=
github.com/shirou/gopsutil/v4 v4.26.4/go.mod h1:LZ6ewCSkBqUpvSOf+LsTGnRinC6iaNUNMGBtDkJBaLQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
@@ -253,18 +229,19 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/
github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals=
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo=
github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA=
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/syncthing/notify v0.0.0-20250528144937-c7027d4f7465 h1:yhxdTGmFkAM2TFA65c3NgGwpnIkUM8oVqPX2e9S7IVg=
github.com/syncthing/notify v0.0.0-20250528144937-c7027d4f7465/go.mod h1:J0q59IWjLtpRIJulohwqEZvjzwOfTEPp8SVhDJl+y0Y=
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d h1:vfofYNRScrDdvS342BElfbETmL1Aiz3i2t0zfRj16Hs=
github.com/syndtr/goleveldb v1.0.1-0.20220721030215-126854af5e6d/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48=
github.com/thejerf/suture/v4 v4.0.6 h1:QsuCEsCqb03xF9tPAsWAj8QOAJBgQI1c0VqJNaingg8=
github.com/thejerf/suture/v4 v4.0.6/go.mod h1:gu9Y4dXNUWFrByqRt30Rm9/UZ0wzRSt9AJS6xu/ZGxU=
github.com/tklauser/go-sysconf v0.3.15 h1:VE89k0criAymJ/Os65CSn1IXaol+1wrsFHEB8Ol49K4=
github.com/tklauser/go-sysconf v0.3.15/go.mod h1:Dmjwr6tYFIseJw7a3dRLJfsHAMXZ3nEnL/aZY+0IuI4=
github.com/tklauser/numcpus v0.10.0 h1:18njr6LDBk1zuna922MgdjQuJFjrdppsZG60sHGfjso=
github.com/tklauser/numcpus v0.10.0/go.mod h1:BiTKazU708GQTYF4mB+cmlpT2Is1gLk7XVuEeem8LsQ=
github.com/tklauser/go-sysconf v0.3.16 h1:frioLaCQSsF5Cy1jgRBrzr6t502KIIwQ0MArYICU0nA=
github.com/tklauser/go-sysconf v0.3.16/go.mod h1:/qNL9xxDhc7tx3HSRsLWNnuzbVfh3e7gh/BmM179nYI=
github.com/tklauser/numcpus v0.11.0 h1:nSTwhKH5e1dMNsCdVBukSZrURJRoHbSEQjdEbY+9RXw=
github.com/tklauser/numcpus v0.11.0/go.mod h1:z+LwcLq54uWZTX0u/bGobaV34u6V7KNlTZejzM6/3MQ=
github.com/urfave/cli v1.20.0/go.mod h1:70zkFmudgCuE/ngEzBv17Jvp/497gISqfk5gWijbERA=
github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ=
github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo=
@@ -277,26 +254,24 @@ github.com/wlynxg/anet v0.0.5/go.mod h1:eay5PRQr7fIVAMbTbchTnO9gG65Hg/uYGdc7mguH
github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74=
github.com/yusufpapurcu/wmi v1.2.4 h1:zFUKzehAFReQwLys1b/iSMl+JQGSCSjtVqQn9bBrPo0=
github.com/yusufpapurcu/wmi v1.2.4/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0=
go.uber.org/automaxprocs v1.6.0 h1:O3y2/QNTOdbF+e/dpXNNW7Rx2hZ4sTIPyybbxyNqTUs=
go.uber.org/automaxprocs v1.6.0/go.mod h1:ifeIMSnPZuznNm6jmdzmU3/bfk01Fe2fotchwEFJ8r8=
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
go.uber.org/mock v0.5.2 h1:LbtPTcP8A5k9WPXj54PPPbjcI4Y6lhyOZXn+VS7wNko=
go.uber.org/mock v0.5.2/go.mod h1:wLlUxC2vVTPTaE3UD51E0BGOAElKrILxhVSDYQLld5o=
go.yaml.in/yaml/v2 v2.4.2 h1:DzmwEr2rDGHl7lsFgAHxmNz/1NlQ7xLIrlN2h5d1eGI=
go.yaml.in/yaml/v2 v2.4.2/go.mod h1:081UH+NErpNdqlCXm3TtEran0rJZGxAYx9hb/ELlsPU=
go.yaml.in/yaml/v3 v3.0.3 h1:bXOww4E/J3f66rav3pX3m8w6jDE4knZjGOw8b5Y6iNE=
go.yaml.in/yaml/v3 v3.0.3/go.mod h1:tBHosrYAkRZjRAOREWbDnBXUf08JOwYq++0QNwQiWzI=
go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc=
go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg=
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50 h1:3yiSh9fhy5/RhCSntf4Sy0Tnx50DmMpQ4MQdKKk4yg4=
golang.org/x/exp v0.0.0-20250811191247-51f88131bc50/go.mod h1:rT6SFzZ7oxADUDx58pcaKFTcZ+inxAa9fTrYx/uVYwg=
golang.org/x/crypto v0.51.0 h1:IBPXwPfKxY7cWQZ38ZCIRPI50YLeevDLlLnyC5wRGTI=
golang.org/x/crypto v0.51.0/go.mod h1:8AdwkbraGNABw2kOX6YFPs3WM22XqI4EXEd8g+x7Oc8=
golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a h1:+3jdDGGB8NGb1Zktc737jlt3/A5f6UlwSzmvqUuufxw=
golang.org/x/exp v0.0.0-20260508232706-74f9aab9d74a/go.mod h1:d2fgXJLVs4dYDHUk5lwMIfzRzSrWCfGZb0ZqeLa/Vcw=
golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA=
golang.org/x/mod v0.27.0 h1:kb+q2PyFnEADO2IEF935ehFUXlWiNjJWtRNgBLSfbxQ=
golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc=
golang.org/x/mod v0.36.0 h1:JJjpVx6myfUsUdAzZuOSTTmRE0PfZeNWzzvKrP7amb4=
golang.org/x/mod v0.36.0/go.mod h1:moc6ELqsWcOw5Ef3xVprK5ul/MvtVvkIXLziUOICjUQ=
golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
@@ -305,13 +280,13 @@ golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwY
golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk=
golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk=
golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/net v0.54.0 h1:2zJIZAxAHV/OHCDTCOHAYehQzLfSXuf/5SoL/Dv6w/w=
golang.org/x/net v0.54.0/go.mod h1:Sj4oj8jK6XmHpBZU/zWHw3BV3abl4Kvi+Ut7cQcY+cQ=
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
golang.org/x/sync v0.16.0 h1:ycBJEhp9p4vXvUZNszeOq0kGTPghopOL8q0fq3vstxw=
golang.org/x/sync v0.16.0/go.mod h1:1dzgHSNfp02xaA81J2MS99Qcpr2w7fw1gpm99rleRqA=
golang.org/x/sync v0.20.0 h1:e0PTpb7pjO8GAtTs2dQ6jYa5BWYlMuX047Dco/pItO4=
golang.org/x/sync v0.20.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -334,23 +309,25 @@ golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBc
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/sys v0.44.0 h1:ildZl3J4uzeKP07r2F++Op7E9B29JRUy+a27EibtBTQ=
golang.org/x/sys v0.44.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6 h1:HjU6IWBiAgRIdAJ9/y1rwCn+UELEmwV+VsTLzj/W4sE=
golang.org/x/telemetry v0.0.0-20260508192327-42602be52be6/go.mod h1:Eqhaxk/wZsWEH8CRxLwj6xzEJbz7k1EFGqx7nyCoabE=
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
golang.org/x/time v0.12.0 h1:ScB/8o8olJvc+CQPWrK3fPZNfh7qgwCrY0zJmoEQLSE=
golang.org/x/time v0.12.0/go.mod h1:CDIdPxbZBQxdj6cxyCIdrNogrJKMJ7pr37NYpMcMDSg=
golang.org/x/text v0.37.0 h1:Cqjiwd9eSg8e0QAkyCaQTNHFIIzWtidPahFWR83rTrc=
golang.org/x/text v0.37.0/go.mod h1:a5sjxXGs9hsn/AJVwuElvCAo9v8QYLzvavO5z2PiM38=
golang.org/x/time v0.15.0 h1:bbrp8t3bGUeFOx08pvsMYRTCVSMk89u4tKbNOZbp88U=
golang.org/x/time v0.15.0/go.mod h1:Y4YMaQmXwGQZoFaVFk4YpCt4FLQMYKZe9oeV/f4MSno=
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA=
golang.org/x/tools v0.36.0 h1:kWS0uv/zsvHEle1LbV5LE8QujrxB3wfQyxHfhOk0Qkg=
golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s=
golang.org/x/tools v0.45.0 h1:18qN3FAooORvApf5XjCXgsuayZOEtXf6JK18I3+ONa8=
golang.org/x/tools v0.45.0/go.mod h1:LuUGqqaXcXMEFEruIVJVm5mgDD8vww/z/SR1gQ4uE/0=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -364,8 +341,8 @@ google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzi
google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU=
google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw=
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
google.golang.org/protobuf v1.36.7 h1:IgrO7UwFQGJdRNXH/sQux4R1Dj1WAKcLElzeeRaXV2A=
google.golang.org/protobuf v1.36.7/go.mod h1:jduwjTPXsFjZGTmRluh+L6NjiWu7pchiJ2/5YcXBHnY=
google.golang.org/protobuf v1.36.11 h1:fV6ZwhNocDyBLK0dj+fg8ektcVegBBuEolpbTQyBNVE=
google.golang.org/protobuf v1.36.11/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk=
gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q=
@@ -381,18 +358,20 @@ gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
modernc.org/cc/v4 v4.26.2 h1:991HMkLjJzYBIfha6ECZdjrIYz2/1ayr+FL8GN+CNzM=
modernc.org/cc/v4 v4.26.2/go.mod h1:uVtb5OGqUKpoLWhqwNQo/8LwvoiEBLvZXIQ/SmO6mL0=
modernc.org/ccgo/v4 v4.28.0 h1:rjznn6WWehKq7dG4JtLRKxb52Ecv8OUGah8+Z/SfpNU=
modernc.org/ccgo/v4 v4.28.0/go.mod h1:JygV3+9AV6SmPhDasu4JgquwU81XAKLd3OKTUDNOiKE=
modernc.org/fileutil v1.3.8 h1:qtzNm7ED75pd1C7WgAGcK4edm4fvhtBsEiI/0NQ54YM=
modernc.org/fileutil v1.3.8/go.mod h1:HxmghZSZVAz/LXcMNwZPA/DRrQZEVP9VX0V4LQGQFOc=
modernc.org/cc/v4 v4.27.3 h1:uNCgn37E5U09mTv1XgskEVUJ8ADKpmFMPxzGJ0TSo+U=
modernc.org/cc/v4 v4.27.3/go.mod h1:3YjcbCqhoTTHPycJDRl2WZKKFj0nwcOIPBfEZK0Hdk8=
modernc.org/ccgo/v4 v4.32.4 h1:L5OB8rpEX4ZsXEQwGozRfJyJSFHbbNVOoQ59DU9/KuU=
modernc.org/ccgo/v4 v4.32.4/go.mod h1:lY7f+fiTDHfcv6YlRgSkxYfhs+UvOEEzj49jAn2TOx0=
modernc.org/fileutil v1.4.0 h1:j6ZzNTftVS054gi281TyLjHPp6CPHr2KCxEXjEbD6SM=
modernc.org/fileutil v1.4.0/go.mod h1:EqdKFDxiByqxLk8ozOxObDSfcVOv/54xDs/DUHdvCUU=
modernc.org/gc/v2 v2.6.5 h1:nyqdV8q46KvTpZlsw66kWqwXRHdjIlJOhG6kxiV/9xI=
modernc.org/gc/v2 v2.6.5/go.mod h1:YgIahr1ypgfe7chRuJi2gD7DBQiKSLMPgBQe9oIiito=
modernc.org/gc/v3 v3.1.2 h1:ZtDCnhonXSZexk/AYsegNRV1lJGgaNZJuKjJSWKyEqo=
modernc.org/gc/v3 v3.1.2/go.mod h1:HFK/6AGESC7Ex+EZJhJ2Gni6cTaYpSMmU/cT9RmlfYY=
modernc.org/goabi0 v0.2.0 h1:HvEowk7LxcPd0eq6mVOAEMai46V+i7Jrj13t4AzuNks=
modernc.org/goabi0 v0.2.0/go.mod h1:CEFRnnJhKvWT1c1JTI3Avm+tgOWbkOu5oPA8eH8LnMI=
modernc.org/libc v1.66.3 h1:cfCbjTUcdsKyyZZfEUKfoHcP3S0Wkvz3jgSzByEWVCQ=
modernc.org/libc v1.66.3/go.mod h1:XD9zO8kt59cANKvHPXpx7yS2ELPheAey0vjIuZOhOU8=
modernc.org/libc v1.72.0 h1:IEu559v9a0XWjw0DPoVKtXpO2qt5NVLAnFaBbjq+n8c=
modernc.org/libc v1.72.0/go.mod h1:tTU8DL8A+XLVkEY3x5E/tO7s2Q/q42EtnNWda/L5QhQ=
modernc.org/mathutil v1.7.1 h1:GCZVGXdaN8gTqB1Mf/usp1Y/hSqgI2vAGGP4jZMCxOU=
modernc.org/mathutil v1.7.1/go.mod h1:4p5IwJITfppl0G4sUEDtCr4DthTaT47/N3aT6MhfgJg=
modernc.org/memory v1.11.0 h1:o4QC8aMQzmcwCK3t3Ux/ZHmwFPzE6hf2Y5LbkRs+hbI=
@@ -401,8 +380,8 @@ modernc.org/opt v0.1.4 h1:2kNGMRiUjrp4LcaPuLY2PzUfqM/w9N23quVwhKt5Qm8=
modernc.org/opt v0.1.4/go.mod h1:03fq9lsNfvkYSfxrfUhZCWPk1lm4cq4N+Bh//bEtgns=
modernc.org/sortutil v1.2.1 h1:+xyoGf15mM3NMlPDnFqrteY07klSFxLElE2PVuWIJ7w=
modernc.org/sortutil v1.2.1/go.mod h1:7ZI3a3REbai7gzCLcotuw9AC4VZVpYMjDzETGsSMqJE=
modernc.org/sqlite v1.38.2 h1:Aclu7+tgjgcQVShZqim41Bbw9Cho0y/7WzYptXqkEek=
modernc.org/sqlite v1.38.2/go.mod h1:cPTJYSlgg3Sfg046yBShXENNtPrWrDX8bsbAQBzgQ5E=
modernc.org/sqlite v1.50.0 h1:eMowQSWLK0MeiQTdmz3lqoF5dqclujdlIKeJA11+7oM=
modernc.org/sqlite v1.50.0/go.mod h1:m0w8xhwYUVY3H6pSDwc3gkJ/irZT/0YEXwBlhaxQEew=
modernc.org/strutil v1.2.1 h1:UneZBkQA+DX2Rp35KcM69cSsNES9ly8mQWD71HKlOA0=
modernc.org/strutil v1.2.1/go.mod h1:EHkiggD70koQxjVdSBM3JKM7k6L0FbGE5eymy9i3B9A=
modernc.org/token v1.1.0 h1:Xl7Ap9dKaEs5kLoOQeQmPWevfnk/DM5qcLcYlA8ys6Y=
+2 -2
View File
@@ -221,8 +221,8 @@ li[language-select] > .dropdown-menu {
}
li[language-select] > .dropdown-menu > li > a {
overflow: hidden;
text-overflow: ellipsis;
white-space: normal;
overflow-wrap: break-word;
}
.nav>li{
+35 -25
View File
@@ -1,5 +1,5 @@
{
"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 new major version may not be compatible with previous versions.": "الإصدار الجديد قد لا يتوافق مع الإصدارات السابقة.",
"API Key": "مفتاح واجهة برمجة التطبيقات \"API\"",
@@ -7,15 +7,15 @@
"Action": "إجراء",
"Actions": "الإجراءات",
"Active filter rules": "قواعد التصفية النشطة",
"Add": "إضافة",
"Add Device": "إضافة جهاز",
"Add Folder": "إضافة مجلد",
"Add Remote Device": "إضافة جهاز بعيد",
"Add": "أضف",
"Add Device": "أضف جهاز",
"Add Folder": "أضف مجلد",
"Add Remote Device": "أضف جهاز بعيد",
"Add devices from the introducer to our device list, for mutually shared folders.": "أضف أجهزة من الوسيط إلى قائمة الأجهزة الخاصة بنا، للمجلدات المشتركة بشكل متبادل.",
"Add filter entry": "إضافة عامل التصفية",
"Add filter entry": "أضف عامل التصفية",
"Add ignore patterns": "أضف أنماط التجاهل",
"Add new folder?": "إضافة مجلد جديد؟",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "بالإضافة إلى ذلك ، سيُزاد الفاصل الزمني لإعادة الفحص الكامل (60 مرة، وهو الافتراضي الجديد من 1H). يمكنك أيضًا التحكم بالإعدادات وتعديلها يدويًا لكل مجلد لاحقًا بعد اختيار \"لا\".",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "بالإضافة إلى ذلك، سيُزاد الفاصل الزمني لإعادة الفحص الكامل (60 مرة، وهو الافتراضي الجديد من 1H). يمكنك أيضًا التحكم بالإعدادات وتعديلها يدويًا لكل مجلد لاحقًا بعد اختيار \"لا\".",
"Address": "العنوان",
"Addresses": "العناوين",
"Advanced": "متقدم",
@@ -36,7 +36,7 @@
"Are you sure you want to override all remote changes?": "هل أنت متأكد أنك تريد تجاوز كافة التغييرات عن بُعد؟",
"Are you sure you want to permanently delete all these files?": "هل أنت متأكد أنك تريد حذف كل هذه الملفات بشكل دائم؟",
"Are you sure you want to remove device {%name%}?": "هل أنت متيقِّن من حذف هذا الجهاز {{name}}؟",
"Are you sure you want to remove folder {%label%}?": "هل انت متاكد من حذف المجلد {{label}}؟",
"Are you sure you want to remove folder {%label%}?": "أمتاكد من حذف المجلد {{label}}؟",
"Are you sure you want to restore {%count%} files?": "هل انت متاكد من استعادة {{count}} ملف؟",
"Are you sure you want to revert all local changes?": "هل أنت متأكد أنك تريد التراجع عن كافة التغييرات المحلية؟",
"Are you sure you want to upgrade?": "هل أنت متأكد أنك تريد الترقية؟",
@@ -50,11 +50,12 @@
"Automatically create or share folders that this device advertises at the default path.": "أنشئ وشارك المجلدات الموجودة في المسار الافتراضي تلقائيا.",
"Available debug logging facilities:": "خدمات سجلات تدقيق البرمجيات المتوفرة:",
"Be careful!": "احذر!",
"Block Indexing": "فهرسة الكُتل",
"Body:": "جسم:",
"Bugs": "أخطاء برمجية",
"Cancel": "إلغاء",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "لا يمكن تفعيله عندما يكون نوع المجلد هو \"{{foldertype}}\".",
"Changelog": "سجل التغيير",
"Changelog": "سجل التغييرات",
"Clean out after": "نظف بعد",
"Cleaning Versions": "إصدارات نظيفة",
"Cleanup Interval": "الفاصل الزمني للتنظيف",
@@ -76,12 +77,13 @@
"Copied from elsewhere": "منسوخ من مكان أخر",
"Copied from original": "منسوخ من الأصل",
"Copied!": "نُسِخَ!",
"Copy": "نسخ",
"Copy": "انسخ",
"Copy failed! Try to select and copy manually.": "فشل النسخ! حاول التحديد والنسخ يدويًا.",
"Currently Shared With Devices": "مُشارَك مع الأجهزة حاليا",
"Custom Range": "نطاق مخصص",
"Danger!": "خطر!",
"Database Location": "موقع قاعدة البيانات",
"Debug": "تصحيح العلل",
"Debugging Facilities": "خدمات تدقيق البرمجيات",
"Default": "أفتراضي",
"Default Configuration": "اعدادات افتراضية",
@@ -89,15 +91,16 @@
"Default Folder": "المجلد الافتراضي",
"Default Ignore Patterns": "أنماط التجاهل الافتراضية",
"Defaults": "الافتراضات",
"Delete": "حذف",
"Delete Unexpected Items": "حذف العناصر غير المتوقعة",
"Deleted {%file%}": "حُذِفت {{file}}",
"Delete": "احذف",
"Delete Unexpected Items": "احذف العناصر غير المتوقعة",
"Deleted {%file%}": "حُذِف {{file}}",
"Deselect All": "الغاء تحديد الكل",
"Deselect devices to stop sharing this folder with.": "قم بإلغاء تحديد الأجهزة لإيقاف مشاركة هذا المجلد معها.",
"Deselect folders to stop sharing with this device.": "قم بإلغاء تحديد المجلدات لإيقاف المشاركة مع هذا الجهاز.",
"Device": "جهاز",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "الجهاز \"{{name}}\" ({{device}} في {{address}}) يرغب في الاتصال، إضافة جهاز جديد؟",
"Device Certificate": "شهادة الجهاز",
"Device Group": "مجموعة الجهاز",
"Device ID": "معرف الجهاز",
"Device Identification": "معرف الجهاز",
"Device Name": "اسم الجهاز",
@@ -112,7 +115,7 @@
"Disabled periodic scanning and enabled watching for changes": "تعطيل المسح الدوري وتفعيل مشاهدة التغييرات",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "تعطيل المسح الدوري وفشل إعداد مشاهدة التغييرات، إعادة المحاولة كل 1 دقيقة:",
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "تعطيل مقارنة أذونات الملفات ومزامنتها. مفيد على الأنظمة ذات الأذونات غير الموجودة أو المخصصة (مثل FAT و exFAT و Synology و Android).",
"Discard": "تجاهل",
"Discard": "أهمِل",
"Disconnected": "غير متصل",
"Disconnected (Inactive)": "غير متصل (غير نشط)",
"Disconnected (Unused)": "غير متصل (غير مستخدم)",
@@ -135,10 +138,10 @@
"Edit Folder": "تعديل المجلد",
"Edit Folder Defaults": "تعديل الإعدادت الافتراضية للمجلد",
"Editing {%path%}.": "تعديل {{path}}.",
"Enable Crash Reporting": "تفعيل التبليغ عن الاخطاء",
"Enable NAT traversal": "تفعيل اجتياز النات",
"Enable Relaying": "تفعيل الترحيل",
"Enabled": "مفعل",
"Enable Crash Reporting": "فعِّل التبليغ عن الإنهيار",
"Enable NAT traversal": "فعِّل اجتياز NAT",
"Enable Relaying": "فعِّل الترحيل",
"Enabled": ُفعّل",
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "يفعل إرسال البيانات الثانوية، وتطبيق البيانات الثانوية المستوردة. قد يطلب صلاحيات أكثر.",
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "تصدير بيانات ثانوية، ولا يطبق البيانات الثانوية المستوردة. قد يؤثر سلبا على الأداء. يفعل تلقائيا عند تفعيل \"مزامنة البيانات الثانوية\".",
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "يفعل إرسال معلومات الملكية للأجهزة الأخرى، ويفعل معلومات الملكية المستوردة. غالبا ما يطلب صلاحيات أكثر.",
@@ -168,6 +171,7 @@
"Filter by date": "فلترة بالتاريخ",
"Filter by name": "فلتر باستخدام الاسم",
"Folder": "مجلد",
"Folder Group": "مجموعة المجلد",
"Folder ID": "مُعرِّف المجلد",
"Folder Label": "تسمية المجلد",
"Folder Path": "مسار المجلد",
@@ -195,7 +199,7 @@
"Help": "مساعدة",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "ملحوظة: إذا كان الإعداد الافتراضي هو الرفض، وحدها قواعد الرفض تُرصد. جرب إضافة \"السماح للكل\" كخيار أخير.",
"Home page": "الصفحة الرئيسية",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "ومع ذلك، تشير إعداداتك الحالية إلى أنك قد لا ترغب في تمكينه. لذلك توقف الإبلاغ التلقائي عن الأعطال.",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "ومع ذلك، تشير إعداداتك الحالية إلى أنك قد لا ترغب في تفعيله. لذلك توقف الإبلاغ التلقائي عن الأعطال.",
"Identification": "المُعرِّف",
"If untrusted, enter encryption password": "في حالة الرِّيبة، أدخل كلمة سر التشفير",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "إذا أردت منع المستخدمين الآخرين على هذا الحاسب من الوصول لملفاتك من خلال Syncthing، يُنصَح بإعداد وثائق الملكية.",
@@ -210,6 +214,7 @@
"Incoming Rate Limit (KiB/s)": "الحد الأقصى البيانات الواردة (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "الإعدادات الغير صحيحة قد تدمر بيانات المجلد وتُفْشِلُ المزامنة.",
"Incorrect user name or password.": "رُصِدَ خطأ في اسم المستخدم أو كلمة المرور.",
"Info": "معلومات",
"Internally used paths:": "المسار المستخدم محليّا:",
"Introduced By": "عرف بواسطة",
"Introducer": "الوسيط",
@@ -227,6 +232,7 @@
"Learn more": "اعرف أكثر",
"Learn more at {%url%}": "اطلع على المزيد في {{url}}",
"Limit": "الحد",
"Limit Bandwidth in LAN": "تحديد عرض النطاق الترددي في الشبكة المحلية",
"Listener Failures": "أعطال المنصت",
"Listener Status": "حالة المنصت",
"Listeners": "المنصتين",
@@ -246,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "تتبع السجل متوقف، مَرِّر للأسفل للاستئناف.",
"Login failed, see Syncthing logs for details.": "فشل تسجيل الدخول، اطَّلِع على سِجِلِّ Syncthing للتفاصيل.",
"Logs": "سجلات",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "الاحتفاظ بفهرس لجميع الكُتل الموجودة في المجلد، مما يتيح إعادة استخدام الكتل من ملفات أخرى عند مزامنة التغييرات. عطّل هذا الخيار لتقليل حجم قاعدة البيانات، ولكن على حساب عدم القدرة على إعادة استخدام الكتل عبر الملفات المختلفة.",
"Major Upgrade": "ترقية أساسية",
"Mass actions": "التأثيرات العامة",
"Maximum Age": "أقصى مدة",
@@ -276,6 +283,8 @@
"Off": "اطفئ",
"Oldest First": "الأقدم أولا",
"Optional descriptive label for the folder. Can be different on each device.": "تسمية وصفية اختيارية للمجلد. يمكن أن تكون مختلفة على كل جهاز.",
"Optional group for the device. Can be different on each device.": "مجموعة اختيارية للجهاز. يمكن أن تختلف من جهاز لآخر.",
"Optional group for the folder. Can be different on each device.": "مجموعة اختيارية للمجلد. يمكن أن تختلف من جهاز لآخر.",
"Options": "خيارات",
"Out of Sync": "خارج التزامن",
"Out of Sync Items": "عناصر خارج التزامن",
@@ -321,9 +330,9 @@
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "مُمَهِّدات الإصدار تحتوي على آخر الخصائص والإصلاحات. وهي مماثلة للإصدارات النصف شهرية التقليدية لـ Syncthing .",
"Remote Devices": "جهاز بعيد",
"Remote GUI": "الواجهة النائية",
"Remove": "إزالة",
"Remove Device": "حذف جهاز",
"Remove Folder": "حذف مجلد",
"Remove": "أزِل",
"Remove Device": "أزِل الجهاز",
"Remove Folder": "أزِل المجلد",
"Required identifier for the folder. Must be the same on all cluster devices.": "يتطلب معرفًا للمجلد. يجب أن يستخدم نفس المعرف لبقية الأجهزة.",
"Rescan": "إعادة فحص",
"Rescan All": "إعادة فحص الكل",
@@ -387,6 +396,7 @@
"Staggered": "مترنِّح",
"Staggered File Versioning": "تقسمات إصدارات الملف مهترئة",
"Start Browser": "تشغيل المتصفح",
"Starting": "يبدأ",
"Statistics": "إحصائيات",
"Stay logged in": "ابقِ مُسجل الدخول",
"Stopped": "متوقف",
@@ -512,14 +522,14 @@
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "تحذير، هذا المجلد هو أحد محتويات مجلد مضاف مسبقا \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "تحذير: إذا كنت مستخدما لمراقب خارجي كـ {{syncthingInotify}}، تأكد من تعطيله.",
"Watch for Changes": "راقب التغييرات",
"Watching for Changes": "جاري مراقبة التغيرات",
"Watching for Changes": "يراقب التغيرات",
"Watching for changes discovers most changes without periodic scanning.": "مراقبة التغييرات تكشف معظم التغييرات دون إجراء المسح الدوري.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "يجب إضافة الأجهزة الجديدة في الطرفين.",
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "عند إضافة مجلد جديد ، ضع في الاعتبار أن معرف المجلد يُستخدم لربط المجلدات معًا بين الأجهزة المختلفة. وهي حساسة لحالة الأحرف لذا يجب أن تتطابق تمامًا بين جميع الأجهزة.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "إذا عُرفَّ Syncthing بأنه أكثر من واحد على كلا الجهازين، فإنه سيحاول إقامة عدة اتصالات متوازية. إذا اختلفت القِيَم، أعلاها ستُستخدَم. صَفِّرها لتترك القرار لـ Syncthing.",
"Yes": "نعم",
"Yesterday": "أمس",
"You can also copy and paste the text into a new message manually.": "يكنك نسخ النص لتدرجه في رسالة جديدة بنفسك.",
"You can also copy and paste the text into a new message manually.": مكنك نسخ النص ولصقه في رسالة جديدة يدويًا.",
"You can also select one of these nearby devices:": "يمكنك أيضا اختيار واحدة من الأجهزة القريبة:",
"You can change your choice at any time in the Settings dialog.": "يمكنك تغيير اختيارك في أي وقت بواسطة الاعدادات.",
"You can read more about the two release channels at the link below.": "يمكنك قراءة المزيد عن إصداريّ القناتين عبر الرابط بالأسفل.",
@@ -531,7 +541,7 @@
"Your SMS app should open to let you choose the recipient and send it from your own number.": "ينبغي أن يسمح تطبيق SMS لديك بأن تختار مستلما ويرسلها من رقمك.",
"Your email app should open to let you choose the recipient and send it from your own address.": "ينبغي أن يسمح تطبيق البريد الإلكتروني الخاص بك باختيار مستلم و أن يرسلها من عنوانك.",
"days": "أيام",
"deleted": "مُسِحَ",
"deleted": "حُذِف",
"deny": "امنع",
"directories": "مجلدات",
"file": "ملف",
+2
View File
@@ -0,0 +1,2 @@
{
}
+1
View File
@@ -27,6 +27,7 @@
"Allowed Networks": "Дазволеныя Сеткі",
"Alphabetic": "Па Алфавіту",
"Altered by ignoring deletes.": "Зменена з-за ігнаравання выдаленняў.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Заўсёды ўключана для папак з тыпам \"{{foldertype}}\".",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Знешняя каманда утрымлівае версіянаванне. Яно патрабуе выдалення файла з агульнай дырэкторыі. Калі шлях да прыкладання ўтрымлівае прабелы, трэба іх выдаліць.",
"Anonymous Usage Reporting": "Ананімная Спрадвыздача Аб Выкарыстанні",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Фармат ананімнай спрадвыздачы аб выкарыстанні быў зменены. Ці жадаеце вы выкарыстоўваць новы фармат?",
+8 -1
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Автоматично създава в подразбираната папка или споделя папките, които устройството предлага.",
"Available debug logging facilities:": "Достъпни улеснения при отстраняване на дефекти:",
"Be careful!": "Внимание!",
"Block Indexing": "Индексиране на блокове",
"Body:": "Съдържание:",
"Bugs": "Дефекти",
"Cancel": "Отказ",
@@ -99,6 +100,7 @@
"Device": "Устройство",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Устройство \"{{name}}\" ({{device}}) с адрес {{address}} желае да се свърже. Да бъде ли добавено?",
"Device Certificate": "Сертификат на устройството",
"Device Group": "Група устройства",
"Device ID": "Идентификатор на устройство",
"Device Identification": "Идентификатор на устройство",
"Device Name": "Име на устройството",
@@ -169,6 +171,7 @@
"Filter by date": "Филтриране по дата",
"Filter by name": "Филтриране по име",
"Folder": "Папка",
"Folder Group": "Група папки",
"Folder ID": "Идентификатор на папката",
"Folder Label": "Име на папката",
"Folder Path": "Път до папката",
@@ -177,7 +180,7 @@
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "Вида „{{receiveEncrypted}}“ може да бъде избран само при добавяне на папка.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "Видът папката „{{receiveEncrypted}}“ не може да бъде променян след нейното създаване. Трябва да я премахнете, изтриете или разшифровате съдържанието и да добавите папката отново.",
"Folders": "Папки",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Грешка при започване на наблюдението за промени на следните папки. Всяка минута ще бъде извършван нов опит, така че грешката скоро може да изчезне. Ако все пак не изчезне, отстранете нейната първопричина или потърсете помощ ако не съумявате.",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Грешка при започване на наблюдението за промени на следните папки. Всяка минута ще бъде извършван нов опит, така че грешката скоро може да изчезне. Ако все пак не изчезне, отстранете първопричината или ако не съумявате потърсете помощ.",
"Forever": "Завинаги",
"Full Rescan Interval (s)": "Интервал на пълно обхождане (секунди)",
"GUI": "Интерфейс",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Добавяне на редове към дневника е спряно. Плъзнете най-долу за да продължи.",
"Login failed, see Syncthing logs for details.": "Грешка при вход, за подробности проверете в дневника на Syncthing.",
"Logs": "Дневници",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Поддържане на индекс на всички блокове в папката, което позволява повторното им използване от други файлове при синхронизиране на промените. Изключете, за да намалите размера на базата данни за сметка на невъзможността да използвате блокове между различните файлове.",
"Major Upgrade": "Обновяване на значимо издание",
"Mass actions": "Мащабни действия",
"Maximum Age": "Максимална възраст",
@@ -279,6 +283,8 @@
"Off": "Изключено",
"Oldest First": "Първо най-старите",
"Optional descriptive label for the folder. Can be different on each device.": "Незадължително име на папката. Може да бъде различно на всяко устройство.",
"Optional group for the device. Can be different on each device.": "Незадължителна група за устройството. Може да е различна за всяко устройство.",
"Optional group for the folder. Can be different on each device.": "Незадължителна група за папката. Може да е различна на всяко устройство.",
"Options": "Настройки",
"Out of Sync": "Несинхронизирано",
"Out of Sync Items": "Несинхронизирани елементи",
@@ -390,6 +396,7 @@
"Staggered": "Разпределени",
"Staggered File Versioning": "Разпределени версии",
"Start Browser": "Отваряне на мрежов четец",
"Starting": "Стартиране",
"Statistics": "Статистика",
"Stay logged in": "Оставане в системата",
"Stopped": "Спряна",
+3
View File
@@ -82,6 +82,7 @@
"Custom Range": "Interval personalitzat",
"Danger!": "Perill!",
"Database Location": "Ubicació de la base de dades",
"Debug": "Depuració",
"Debugging Facilities": "Utilitats de Depuració",
"Default": "Per defecte",
"Default Configuration": "Configuració predeterminada",
@@ -210,6 +211,7 @@
"Incoming Rate Limit (KiB/s)": "Límit de velocitat d'entrada (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Una configuració incorrecta pot malmetre els continguts de la teva carpeta i que Syncthing esdevingui inoperatiu.",
"Incorrect user name or password.": "Nom d'usuari o contrasenya incorrecta.",
"Info": "Informació",
"Internally used paths:": "Camins utilitzats internament:",
"Introduced By": "Introduït per",
"Introducer": "Introductor",
@@ -227,6 +229,7 @@
"Learn more": "Aprèn més",
"Learn more at {%url%}": "Més informació a {{url}}",
"Limit": "Límit",
"Limit Bandwidth in LAN": "Limita l'amplada de banda a la LAN",
"Listener Failures": "Errors en l'escolta",
"Listener Status": "Estat de l'oient",
"Listeners": "Oients",
@@ -67,7 +67,7 @@
"Connection Type": "Tipus de connexió",
"Connections": "Connexions",
"Connections via relays might be rate limited by the relay": "Les connexions mitjançant relés poden estar limitades pel relé",
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Ara està disponible la revisió continua de canvix dins de Syncthing. Acò detectarà els canvis i llençarà un escaneig sols a les rutes modificades. Els beneficis són que els canvis es propaguen mé ràpidamente i es necessiten menys escanejos complets.",
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Ara està disponible la revisió continua de canvis dins de Syncthing. Això detectarà els canvis i llançarà un escaneig sols a les rutes modificades. Els beneficis són que els canvis es propaguen més ràpidament i es necessiten menys escanejos complets.",
"Copied from elsewhere": "Copiat de qualsevol lloc",
"Copied from original": "Copiat de l'original",
"Copied!": "Copiat!",
+2
View File
@@ -0,0 +1,2 @@
{
}
+8 -1
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Automatisch Ordner im Standardpfad erstellen oder freigeben, die dieses Gerät ankündigt.",
"Available debug logging facilities:": "Verfügbare Debugging-Möglichkeiten:",
"Be careful!": "Vorsicht!",
"Block Indexing": "Blockindizierung",
"Body:": "Nachrichtentext:",
"Bugs": "Fehler",
"Cancel": "Abbrechen",
@@ -99,6 +100,7 @@
"Device": "Gerät",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Gerät „{{name}}“ ({{device}} {{address}}) möchte sich verbinden. Gerät hinzufügen?",
"Device Certificate": "Gerätezertifikat",
"Device Group": "Gerätegruppe",
"Device ID": "Gerätekennung",
"Device Identification": "Geräteidentifikation",
"Device Name": "Gerätename",
@@ -169,6 +171,7 @@
"Filter by date": "Nach Datum sortieren",
"Filter by name": "Nach Namen sortieren",
"Folder": "Ordner",
"Folder Group": "Ordnergruppe",
"Folder ID": "Ordnerkennung",
"Folder Label": "Ordnerbezeichnung",
"Folder Path": "Ordnerpfad",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Protokolländerungsverfolgung angehalten. Zum Ende blättern, um fortzufahren.",
"Login failed, see Syncthing logs for details.": "Anmeldung fehlgeschlagen, siehe Syncthing-Protokolle für Details.",
"Logs": "Protokolle",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Ein Index über alle Blöcke im Ordner führen, sodass Blöcke aus anderen Dateien bei der Synchronisierung von Änderungen wiederverwendet werden können. Diese Option deaktivieren, um die Datenbankgröße zu verringern allerdings können Blöcke dann nicht mehr dateiübergreifend wiederverwendet werden.",
"Major Upgrade": "Hauptversionsaktualisierung",
"Mass actions": "Massenaktionen",
"Maximum Age": "Höchstalter",
@@ -279,6 +283,8 @@
"Off": "Aus",
"Oldest First": "Älteste zuerst",
"Optional descriptive label for the folder. Can be different on each device.": "Optionale beschreibende Bezeichnung des Ordners. Kann auf jedem Gerät unterschiedlich sein.",
"Optional group for the device. Can be different on each device.": "Optionale Gruppe für das Gerät. Kann auf jedem Gerät unterschiedlich sein.",
"Optional group for the folder. Can be different on each device.": "Optionale Gruppe für den Ordner. Kann auf jedem Gerät unterschiedlich sein.",
"Options": "Optionen",
"Out of Sync": "Nicht synchronisiert",
"Out of Sync Items": "Nicht synchronisierte Elemente",
@@ -291,7 +297,7 @@
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Pfad zum Ordner auf dem lokalen Gerät. Ordner wird erzeugt, wenn er nicht existiert. Das Tilde-Zeichen (~) kann als Abkürzung verwendet werden für",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Pfad, in dem Versionen gespeichert werden sollen (leer lassen für den Standardordner .stversions im freigegebenen Ordner).",
"Paths": "Pfade",
"Pause": "Pause",
"Pause": "Pausiert",
"Pause All": "Alles pausieren",
"Paused": "Pausiert",
"Paused (Unused)": "Pausiert (nicht genutzt)",
@@ -390,6 +396,7 @@
"Staggered": "Stufenweise",
"Staggered File Versioning": "Stufenweise Dateiversionierung",
"Start Browser": "Browser starten",
"Starting": "Startet",
"Statistics": "Statistiken",
"Stay logged in": "Angemeldet bleiben",
"Stopped": "Gestoppt",
+1 -1
View File
@@ -397,7 +397,7 @@
"Sync Protocol Listen Addresses": "Διευθύνσεις για το πρωτόκολλο συγχρονισμού",
"Sync Status": "Κατάσταση συγχρονισμού",
"Syncing": "Συγχρονίζω",
"Syncthing device ID for \"{%devicename%}\"": "Συγχρονισμός αναγνωριστικού συσκευής για \"{{devicename}}\"",
"Syncthing device ID for \"{%devicename%}\"": "Αναγνωριστικό Syncthing για συσκευή \"{{devicename}}\"",
"Syncthing has been shut down.": "Το Syncthing έχει απενεργοποιηθεί.",
"Syncthing includes the following software or portions thereof:": "Το Syncthing περιλαμβάνει τα παρακάτω λογισμικά ή μέρη αυτών:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Το Syncthing είναι ελεύθερο λογισμικό και ανοικτού κώδικα, με άδεια MPL v2.0.",
+9
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Automatically create or share folders that this device advertises at the default path.",
"Available debug logging facilities:": "Available debug logging facilities:",
"Be careful!": "Be careful!",
"Block Indexing": "Block Indexing",
"Body:": "Body:",
"Bugs": "Bugs",
"Cancel": "Cancel",
@@ -82,6 +83,7 @@
"Custom Range": "Custom Range",
"Danger!": "Danger!",
"Database Location": "Database Location",
"Debug": "Debug",
"Debugging Facilities": "Debugging Facilities",
"Default": "Default",
"Default Configuration": "Default Configuration",
@@ -98,6 +100,7 @@
"Device": "Device",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Device \"{{name}}\" ({{device}} at {{address}}) wants to connect. Add new device?",
"Device Certificate": "Device Certificate",
"Device Group": "Device Group",
"Device ID": "Device ID",
"Device Identification": "Device Identification",
"Device Name": "Device Name",
@@ -168,6 +171,7 @@
"Filter by date": "Filter by date",
"Filter by name": "Filter by name",
"Folder": "Folder",
"Folder Group": "Folder Group",
"Folder ID": "Folder ID",
"Folder Label": "Folder Label",
"Folder Path": "Folder Path",
@@ -210,6 +214,7 @@
"Incoming Rate Limit (KiB/s)": "Incoming Rate Limit (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Incorrect configuration may damage your folder contents and render Syncthing inoperable.",
"Incorrect user name or password.": "Incorrect username or password.",
"Info": "Info",
"Internally used paths:": "Internally used paths:",
"Introduced By": "Introduced By",
"Introducer": "Introducer",
@@ -247,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Log tailing paused. Scroll to the bottom to continue.",
"Login failed, see Syncthing logs for details.": "Login failed, see Syncthing logs for details.",
"Logs": "Logs",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.",
"Major Upgrade": "Major Upgrade",
"Mass actions": "Mass actions",
"Maximum Age": "Maximum Age",
@@ -277,6 +283,8 @@
"Off": "Off",
"Oldest First": "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.",
"Optional group for the device. Can be different on each device.": "Optional group for the device. Can be different on each device.",
"Optional group for the folder. Can be different on each device.": "Optional group 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",
@@ -388,6 +396,7 @@
"Staggered": "Staggered",
"Staggered File Versioning": "Staggered File Versioning",
"Start Browser": "Start Browser",
"Starting": "Starting",
"Statistics": "Statistics",
"Stay logged in": "Stay logged in",
"Stopped": "Stopped",
+7
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Automatically create or share folders that this device advertises at the default path.",
"Available debug logging facilities:": "Available debug logging facilities:",
"Be careful!": "Be careful!",
"Block Indexing": "Block Indexing",
"Body:": "Body:",
"Bugs": "Bugs",
"Cancel": "Cancel",
@@ -99,6 +100,7 @@
"Device": "Device",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Device \"{{name}}\" ({{device}} at {{address}}) wants to connect. Add new device?",
"Device Certificate": "Device Certificate",
"Device Group": "Device Group",
"Device ID": "Device ID",
"Device Identification": "Device Identification",
"Device Name": "Device Name",
@@ -169,6 +171,7 @@
"Filter by date": "Filter by date",
"Filter by name": "Filter by name",
"Folder": "Folder",
"Folder Group": "Folder Group",
"Folder ID": "Folder ID",
"Folder Label": "Folder Label",
"Folder Path": "Folder Path",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Log tailing paused. Scroll to the bottom to continue.",
"Login failed, see Syncthing logs for details.": "Login failed, see Syncthing logs for details.",
"Logs": "Logs",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.",
"Major Upgrade": "Major Upgrade",
"Mass actions": "Mass actions",
"Maximum Age": "Maximum Age",
@@ -279,6 +283,8 @@
"Off": "Off",
"Oldest First": "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.",
"Optional group for the device. Can be different on each device.": "Optional group for the device. Can be different on each device.",
"Optional group for the folder. Can be different on each device.": "Optional group 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",
@@ -390,6 +396,7 @@
"Staggered": "Staggered",
"Staggered File Versioning": "Staggered File Versioning",
"Start Browser": "Start Browser",
"Starting": "Starting",
"Statistics": "Statistics",
"Stay logged in": "Stay logged in",
"Stopped": "Stopped",
+416 -218
View File
@@ -1,369 +1,567 @@
{
"A device with that ID is already added.": "Aparato kun samtia ID estis jam aldonita.",
"A device with that ID is already added.": "Aparato kun tiu identigilo estis jam aldonita.",
"A negative number of days doesn't make sense.": "Negativa numero de tagoj ne havas sencon.",
"A new major version may not be compatible with previous versions.": "Nova ĉefa versio eble ne kongruanta kun antaŭaj versioj.",
"API Key": "Ŝlosilo API",
"A new major version may not be compatible with previous versions.": "Nova ĉefa versio eble povas ne kongrui kun antaŭaj versioj.",
"API Key": "Ŝlosilo de aplikaĵa interfaco",
"About": "Pri",
"Action": "Ago",
"Actions": "Agoj",
"Active filter rules": "Aktivaj filtrilaj reguloj",
"Add": "Aldoni",
"Add Device": "Aldoni aparaton",
"Add Folder": "Aldoni dosierujon",
"Add Remote Device": "Aldoni foran aparaton",
"Add devices from the introducer to our device list, for mutually shared folders.": "Aldoni aparatojn de la enkondukanto ĝis nia aparatlisto, por reciproke komunigitaj dosierujoj.",
"Add new folder?": "Ĉu aldoni novan dosierujon?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Aldone, plena reskana intervalo estos pliigita (60-oble, t.e. nova defaŭlto estas 1h). Vi povas ankaŭ agordi ĝin permane por ĉiu dosierujo poste post elekto de Ne.",
"Add filter entry": "Aldoni filtrilon",
"Add ignore patterns": "Aldoni ŝablonon de ignorado",
"Add new folder?": "Ĉu aldoni novan dosierujon?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Aldone, la plena intertempo de reskanado estos pliigita (60-oble, t.e. nova defaŭlto estas 1h). Vi povas ankaŭ agordi ĝin permane por ĉiu dosierujo poste post elekto de \"Ne\".",
"Address": "Adreso",
"Addresses": "Adresoj",
"Advanced": "Altnivela",
"Advanced Configuration": "Altnivela Agordo",
"All Data": "Ĉiuj Datumoj",
"Advanced": "Altnivelaj",
"Advanced Configuration": "Altnivelaj agordoj",
"All Data": "Ĉiuj datumoj",
"All Time": "Ĉiam",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Ĉiuj dosierujoj, kiuj estas dividitaj kun ĉi tiu aparato devas esti protektitaj per pasvorto, tiel ĉiuj senditaj datumoj estas nelegeblaj sen la pasvorto.",
"Allow Anonymous Usage Reporting?": "Permesi Anoniman Raporton de Uzado?",
"Allowed Networks": "Permesitaj Retoj",
"Allow Anonymous Usage Reporting?": "Permesi anoniman raporton de uzado?",
"Allowed Networks": "Permesitaj retoj",
"Alphabetic": "Alfabeta",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Ekstera komando manipulas la version. Ĝi devas forigi la dosieron el la komunigita dosierujo. Se la vojo al la apliko elhavas blankoj, ĝi devas esti inter citiloj.",
"Anonymous Usage Reporting": "Anonima Raporto de Uzado",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Formato de anonima raporto de uzado ŝanĝis. Ĉu vi ŝatus transiri al la nova formato?",
"Altered by ignoring deletes.": "Ŝanĝita per ignorado de forigadoj.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Ĉiam ŝaltita, kiam la tipo de dosierujo estas \"{{foldertype}}\".",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Ekstera komando manipulas la konservadon de versioj. Ĝi devas forigi la dosieron el la komunigita dosierujo. Se la vojo al la aplikaĵo enhavas spacetojn, ĝi devas esti inter citiloj.",
"Anonymous Usage Reporting": "Anonima raportado de uzado",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Formato de anonima raporto de uzado ŝanĝiĝis. Ĉu vi ŝatus transiri al la nova formato?",
"Applied to LAN": "Aplikita en lokaj retoj",
"Apply": "Apliki",
"Are you sure you want to override all remote changes?": "Ĉu vi certas, ke vi volas transpasi ĉiujn forajn ŝanĝojn?",
"Are you sure you want to permanently delete all these files?": "Ĉu vi certas, ke vi volas porĉiame forigi ĉiujn ĉi tiujn dosierojn?",
"Are you sure you want to remove device {%name%}?": "Ĉu vi certas, ke vi volas forigi aparaton {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Ĉu vi certas, ke vi volas forigi dosierujon {{label}}?",
"Are you sure you want to restore {%count%} files?": "Ĉu vi certas, ke vi volas restarigi {{count}} dosierojn?",
"Are you sure you want to revert all local changes?": "Ĉu vi certas, ke vi volas malfari ĉiujn lokajn ŝanĝojn?",
"Are you sure you want to upgrade?": "Ĉu vi certe volas plinovigi?",
"Auto Accept": "Akcepti Aŭtomate",
"Automatic Crash Reporting": "Aŭtomata raportado de kraŝoj",
"Are you sure you want to upgrade?": "Ĉu vi certe volas ĝisdatiĝi?",
"Authentication Required": "Aŭtentokontrolo bezonata",
"Authors": "Aŭtoroj",
"Auto Accept": "Akcepti aŭtomate",
"Automatic Crash Reporting": "Aŭtomata raportado de paneoj",
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Aŭtomata ĝisdatigo nun proponas la elekton inter stabilaj eldonoj kaj kandidataj eldonoj.",
"Automatic upgrades": "Aŭtomataj ĝisdatigoj",
"Automatic upgrades are always enabled for candidate releases.": "Aŭtomataj ĝisdatigoj ĉiam ŝaltitaj por kandidataj eldonoj.",
"Automatically create or share folders that this device advertises at the default path.": "Aŭtomate krei aŭ komunigi dosierujojn, kiujn ĉi tiu aparato anoncas, ĉe la defaŭlta vojo.",
"Available debug logging facilities:": "Disponeblaj elpurigadaj protokoliloj:",
"Automatic upgrades are always enabled for candidate releases.": "Aŭtomataj ĝisdatigoj estas ĉiam ŝaltitaj por kandidataj eldonoj.",
"Automatically create or share folders that this device advertises at the default path.": "Aŭtomate krei aŭ komunigi dosierujojn, kiujn ĉi tiu aparato anoncas ĉe la defaŭlta vojo.",
"Available debug logging facilities:": "Disponeblaj sencimigaj protokoliloj:",
"Be careful!": "Atentu!",
"Block Indexing": "Indeksado de blokoj",
"Body:": "Enhavo:",
"Bugs": "Cimoj",
"Cancel": "Nuligi",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Ne povas esti ŝaltita, kiam la tipo de dosierujo estas \"{{foldertype}}\".",
"Changelog": "Ŝanĝoprotokolo",
"Clean out after": "Purigi poste",
"Click to see full identification string and QR code.": "Alklaku por vidi la plenan identigan signovicon kaj QR-kodo",
"Clean out after": "Purigi post",
"Cleaning Versions": "Purigado de versioj",
"Cleanup Interval": "Intertempo de purigado",
"Click to see full identification string and QR code.": "Alklaku por vidi la plenan identigan signovicon kaj QR-kodon.",
"Close": "Fermi",
"Command": "Komando",
"Comment, when used at the start of a line": "Komento, kiam uzita ĉe la komenco de lineo",
"Comment, when used at the start of a line": "Komento, kiam uzata ĉe la komenco de linio",
"Compression": "Densigo",
"Configuration Directory": "Dosierujo de agordaro",
"Configuration File": "Dosiero de agordaro",
"Configured": "Agordita",
"Connection Error": "Eraro de Konekto",
"Connection Type": "Tipo de Konekto",
"Connected (Unused)": "Konektita (ne uzata)",
"Connection Error": "Eraro de konekto",
"Connection Management": "Mastrumado de konektoj",
"Connection Type": "Tipo de konekto",
"Connections": "Konektoj",
"Connections via relays might be rate limited by the relay": "Konektoj, kiu uzas plusendilon, povas esti limigitaj en ofteco fare de la plusendilo",
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Daŭra rigardado je ŝanĝoj estas nun havebla ene Syncthing. Ĉi tio detektos ŝangoj sur disko kaj skanos nur modifitajn vojojn. La avantaĝo estas en pli rapifa propagiĝo de ŝanĝoj kaj bezono je malpli plenaj skanoj.",
"Copied from elsewhere": "Kopiita el aliloke",
"Copied from original": "Kopiita el la originalo",
"Currently Shared With Devices": "Nune komunigita kun aparatoj",
"Copied!": "Kopiita!",
"Copy": "Kopii",
"Copy failed! Try to select and copy manually.": "Kopiado malsukcesis! Klopodu elekti kaj kopii permane.",
"Currently Shared With Devices": "Nune kunhavata kun aparatoj",
"Custom Range": "Propra intervalo",
"Danger!": "Danĝero!",
"Debugging Facilities": "Elpurigadiloj",
"Database Location": "Loko de datumbazo",
"Debug": "Sencimigo",
"Debugging Facilities": "Sencimigiloj",
"Default": "Defaŭlta",
"Default Configuration": "Defaŭlta agordo",
"Default Folder": "Defaŭlta Dosierujo",
"Default Device": "Defaŭlta aparato",
"Default Folder": "Defaŭlta dosierujo",
"Default Ignore Patterns": "Defaŭltaj ŝablonoj de ignorado",
"Defaults": "Defaŭltoj",
"Delete": "Forigu",
"Delete Unexpected Items": "Forigi neatenditajn erojn",
"Deleted {%file%}": "Forigita: {{file}}",
"Deselect All": "Malelekti Ĉiujn",
"Deselect devices to stop sharing this folder with.": "Malelekti aparatojn por ĉesi komunigi tiun ĉi dosierujon kun ili.",
"Deselect devices to stop sharing this folder with.": "Malelekti aparatojn por ĉesi kunhavadon de tiu ĉi dosierujo kun ili.",
"Deselect folders to stop sharing with this device.": "Malelekti dosierujojn por ĉesi kunhavadon kun tiu ĉi aparato.",
"Device": "Aparato",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Aparato \"{{name}}\" ({{device}} ĉe {{address}}) volas konekti. Aldoni la novan aparaton?",
"Device ID": "Aparato ID",
"Device Identification": "Identigo de Aparato",
"Device Name": "Nomo de Aparato",
"Device Certificate": "Atestilo de aparato",
"Device Group": "Grupo de aparato",
"Device ID": "Identigilo de aparato",
"Device Identification": "Identigado de aparato",
"Device Name": "Nomo de aparato",
"Device Status": "Stato de aparato",
"Device is untrusted, enter encryption password": "Aparato ne estas fidinda, entajpu pasvorto por ĉifrado",
"Device rate limits": "Limoj de rapideco de aparato",
"Device that last modified the item": "Aparato kiu laste modifis la eron",
"Device that last modified the item": "Aparato, kiu laste modifis la eron",
"Devices": "Aparatoj",
"Disable Crash Reporting": "Malŝalti raportadon de kraŝoj",
"Disabled": "Malebligita",
"Disabled periodic scanning and disabled watching for changes": "Malebligita perioda skanado kaj malebligita rigardado je ŝanĝoj",
"Disabled periodic scanning and enabled watching for changes": "Malebligita perioda skanado kaj ebligita rigardado je ŝanĝoj",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Malebligita perioda skanado kaj malsukcesis agordi rigardadon je ŝanĝoj. Provante denove ĉiuminute:",
"Disabled": "Malŝaltita",
"Disabled periodic scanning and disabled watching for changes": "Perioda skanado kaj atendado por ŝanĝoj malŝaltitaj",
"Disabled periodic scanning and enabled watching for changes": "Perioda skanado malŝaltita kaj atendado por ŝanĝoj ŝaltita",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Perioda skanado malŝaltita kaj agordado de atendado por ŝanĝoj malsukcesis, reprovado ĉiuminute:",
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Malŝaltas komparadon kaj sinkronigadon de dosieraj permesoj. Uzinda por operaciumoj kaj dosiersistemoj, en kiuj mankas aŭ nekongruas permesoj (ekz. FAT, exFAT, Synology, Android).",
"Discard": "Forĵeti",
"Disconnected": "Malkonektita",
"Disconnected (Inactive)": "Malkonektita (malaktiva)",
"Disconnected (Unused)": "Malkonektita (ne uzata)",
"Discovered": "Malkovrita",
"Discovery": "Malkovro",
"Discovery Failures": "Malsukcesoj de Malkovro",
"Discovery Failures": "Malsukcesoj de malkovrado",
"Discovery Status": "Stato de malkovrado",
"Dismiss": "Forsendi",
"Do not add it to the ignore list, so this notification may recur.": "Ne aldonu ĝin al la listo de ignoraĵoj, por ke tiu ĉi sciigo povos reaperi poste.",
"Do not restore": "Ne restarigu",
"Do not restore all": "Ne restarigu ĉion",
"Do you want to enable watching for changes for all your folders?": "Ĉu vi volas ebligi rigardado je ŝanĝoj por ĉiuj viaj dosierujoj?",
"Do you want to enable watching for changes for all your folders?": "Ĉu vi volas ebligi atendadon por ŝanĝoj por ĉiuj viaj dosierujoj?",
"Documentation": "Dokumentado",
"Download Rate": "Elŝutrapideco",
"Downloaded": "Elŝutita",
"Downloading": "Elŝutado",
"Edit": "Redakti",
"Edit Device": "Redakti Aparaton",
"Edit Folder": "Redakti Dosierujon",
"Edit Device": "Redakti aparaton",
"Edit Device Defaults": "Redakti aparatajn defaŭltojn",
"Edit Folder": "Redakti dosierujon",
"Edit Folder Defaults": "Redakti dosierujajn defaŭltojn",
"Editing {%path%}.": "Redaktado de {{path}}.",
"Enable Crash Reporting": "Ŝalti raportadon de kraŝoj",
"Enable NAT traversal": "Ŝaltu trairan NAT",
"Enable Relaying": "Ŝaltu Relajsadon",
"Enabled": "Ebligita",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Enigu ne negativan nombron (ekz. \"2.35\") kaj elektu uniton. Procentoj estas kiel parto de tuta grandeco de disko.",
"Enter a non-privileged port number (1024 - 65535).": "Enigu ne privilegiitan numeron de pordo (1024- 65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Enigu adresojn dividitajn per komoj (\"tcp://ip:port\", \"tcp://host:port\") aŭ \"dynamic\" por elfari aŭtomatan malkovradon de la adreso.",
"Enter ignore patterns, one per line.": "Enigu ignorantajn ŝablonojn, unu po linio.",
"Enable Crash Reporting": "Ŝalti raportadon de paneoj",
"Enable NAT traversal": "Ŝaltu trairadon de NAT",
"Enable Relaying": "Ŝalti plusendadon",
"Enabled": "Ŝaltita",
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Ŝaltas sendadon de aldonaj dosieraj atributoj al aliaj aparatoj, kaj aplikadon de alvenantaj atributoj. Ĉi tio povas postuli, ke la programo estas rulata kun pliigitaj permesoj.",
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Ŝaltas sendadon de aldonaj dosieraj atributoj al aliaj aparatoj, sed ne aplikadon de alvenantaj atributoj. Ĉi tio povas grave influi rendimenton de la programo. Ĉiam ŝaltita, se \"Sinkronigi aldonajn atributojn\" estas ŝaltita.",
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Ŝaltas sendadon de informoj pri propreco al aliaj aparatoj, kaj aplikadon de alvenantaj informoj. Ĉi tio ofte postulas, ke la programo estas rulata kun pliigitaj permesoj.",
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Ŝaltas sendadon de informoj pri propreco al aliaj aparatoj, sed ne aplikadon de alvenantaj informoj. Ĉi tio povas grave influi rendimenton de programo. Ĉiam ŝaltita, se \"Sinkronigi proprecon\" estas ŝaltita.",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Enigu ne negativan nombron (ekz. \"2.35\") kaj elektu uniton. Elcentoj funkcias kiel parto de la tuta grandeco de disko.",
"Enter a non-privileged port number (1024 - 65535).": "Enigu ne privilegiitan numeron de pordo (1024 - 65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Enigu adresojn, dividitajn per komoj (\"tcp://ip:port\", \"tcp://host:port\"), aŭ \"dynamic\" por elfari aŭtomatan malkovradon de la adreso.",
"Enter ignore patterns, one per line.": "Enigu ŝablonojn de ignorado, unu po linio.",
"Enter up to three octal digits.": "Entajpu ĝis tri okumajn ciferojn.",
"Error": "Eraro",
"External File Versioning": "Ekstera Versionado de Dosiero",
"Failed Items": "Malsukcesaj Eroj",
"Failed to set up, retrying": "Malsukcesis agordi, provante denove",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "Malsukceso por konekti al IPv6 serviloj atendante se ekzistas neniu IPv6 konektebleco.",
"File Pull Order": "Ordo por Tiri Dosieron",
"File Versioning": "Versionado de Dosieroj",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Dosieroj estas movigitaj al .stversions dosierujo kiam anstataŭigitaj aŭ forigitaj en Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Dosieroj estas movigitaj al date stampitaj versioj en .stversions dosierujo kiam ili estas anstataŭigitaj aŭ forigitaj en Syncthing.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Dosieroj estas protektataj kontraŭ ŝanĝoj faritaj en aliaj aparatoj, sed ŝanĝoj faritaj en ĉi tiu aparato estos senditaj al cetera parto de la grupo.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Dosieroj estas sinkronigitaj de la grupo, sed ajnaj ŝanĝoj faritaj loke ne estis senditaj al aliaj aparatoj.",
"Filesystem Watcher Errors": "Eraroj de Rigardanto de Dosiersistemo",
"Filter by date": "Filtri per daton",
"Filter by name": "Filtri per nomon",
"Extended Attributes": "Aldonaj atributoj",
"Extended Attributes Filter": "Filtrilo de aldonaj atributoj",
"External": "Ekstera",
"External File Versioning": "Ekstera versiado de dosieroj",
"Failed Items": "Malsukcesaj eroj",
"Failed to load file versions.": "Eraro dum ŝarĝado de dosieraj versioj.",
"Failed to load ignore patterns.": "Eraro dum ŝarĝado de ŝablonoj de ignorado.",
"Failed to set up, retrying": "Agordado malsukcesis, reprovado",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "Malsukceso dum konekto al serviloj de protokolo IPv6 estas atendebla, se ekzistas neniu konekteblo per IPv6.",
"File Pull Order": "Ordo por tirado de dosieroj",
"File Versioning": "Versiado de dosieroj",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Dosieroj estas movigitaj al dosierujo \".stversions\", kiam anstataŭigitaj aŭ forigitaj de Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Dosieroj estas movigitaj al dato-stampitaj versioj en dosierujo \".stversions\", kiam anstataŭigitaj aŭ forigitaj de Syncthing.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Dosieroj estas protektataj kontraŭ ŝanĝoj, faritaj en aliaj aparatoj, sed ŝanĝoj, faritaj en ĉi tiu aparato, estos senditaj al la restantaj aparatoj.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Dosieroj estas sinkronigitaj de la aparataro, sed ajnaj ŝanĝoj, faritaj loke, ne estos senditaj al aliaj aparatoj.",
"Filesystem Watcher Errors": "Eraroj de atendado por dosiersistemo",
"Filter by date": "Filtri per dato",
"Filter by name": "Filtri per nomo",
"Folder": "Dosierujo",
"Folder ID": "Dosieruja ID",
"Folder Label": "Dosieruja Etikedo",
"Folder Path": "Dosieruja Vojo",
"Folder Type": "Dosieruja Tipo",
"Folder Group": "Grupo de dosierujoj",
"Folder ID": "Dosieruja identigilo",
"Folder Label": "Dosieruja etikedo",
"Folder Path": "Dosieruja vojo",
"Folder Status": "Stato de dosierujo",
"Folder Type": "Dosieruja tipo",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "Dosieruja tipo \"{{receiveEncrypted}}\" povas esti agordita nur dum aldonado de nova dosierujo.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "Dosieruja tipo \"{{receiveEncrypted}}\" ne povas esti ŝanĝita post aldonado de dosierujo. Vi devas forigi la dosierujon, forigi aŭ malĉifri la datumoj en la disko, kaj aldoni la dosierujon denove.",
"Folders": "Dosierujoj",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Por la sekvantaj dosierujoj eraro okazis dum komencado de rigardado je ŝanĝoj. Provante denove ĉiuminute, do eraroj eble foriros baldaŭ. Se ili persistas, provu ripari subkuŝantan problemon kaj petu helpon, se vi ne povas.",
"Full Rescan Interval (s)": "Plena Reskana Intervalo (s)",
"GUI": "Grafika Interfaco",
"GUI Authentication Password": "Pasvorta Aŭtentigo en Grafika Interfaco",
"GUI Authentication User": "Uzanta Aŭtentigo en Grafika Interfaco",
"GUI Listen Address": "Adreso de Aŭskultado en Grafika Interfaco",
"GUI Theme": "Etoso de Grafika Interfaco",
"General": "Ĝenerala",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Por la sekvantaj dosierujoj eraro okazis dum komencado de atendado por ŝanĝoj. Reprovado okazos ĉiuminute, do eraroj eble foriros baldaŭ. Se ili persistas, provu ripari la problemon, kaŭzantan ĉi tion, kaj petu helpon, se vi ne povas.",
"Forever": "Por ĉiam",
"Full Rescan Interval (s)": "Intertempo de plena reskanado (s)",
"GUI": "Grafika interfaco",
"GUI / API HTTPS Certificate": "Atestilo de HTTPS por grafika / aplikaĵa interfaco",
"GUI Authentication Password": "Pasvorto por aŭtentigo per grafika interfaco",
"GUI Authentication User": "Uzanto por aŭtentigo per grafika interfaco",
"GUI Authentication: Set User and Password": "Aŭtentigo por grafika interfaco: Agordi uzantnomon kaj pasvorton",
"GUI Listen Address": "Adreso de aŭskultado por grafika interfaco",
"GUI Override Directory": "Dosierujo de transpaso por grafika interfaco",
"GUI Theme": "Etoso de grafika interfaco",
"General": "Ĝeneralaj",
"Generate": "Generi",
"Global Discovery": "Malloka Malkovro",
"Global Discovery Servers": "Serviloj de Malloka Malkovro",
"Global State": "Malloka Stato",
"Global Discovery": "Malloka malkovrado",
"Global Discovery Servers": "Serviloj de malloka malkovrado",
"Global State": "Malloka stato",
"Help": "Helpo",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Avizo: nur negaj reguloj estas detektita, dum la defaŭlto estas negado. Pripensu aldonadon de \"permesu ĉion\" kiel la lasta regulo.",
"Home page": "Hejma paĝo",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Se vi volas malhelpi aliajn uzantojn sur ĉi tiu komputilo atingi Syncthing kaj per ĝi viajn dosierojn, konsideru agordi aŭtentokontrolon.",
"Ignore": "Ignoru",
"Ignore Patterns": "Ignorantaj Ŝablonoj",
"Ignore Permissions": "Ignori Permesojn",
"Ignored Devices": "Ignoritaj Aparatoj",
"Ignored Folders": "Ignoritaj Dosierujoj",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Tamen, viaj aktualaj agordoj indikas, ke vi ne volas ŝalti ĝin. Aŭtomata paneoraportado estis malŝaltita por vi.",
"Identification": "Identigo",
"If untrusted, enter encryption password": "Se ne fidinda, entajpu pasvorton por ĉifrado",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Se vi volas malhelpi aliajn uzantojn sur ĉi tiu komputilo atingi la programon Syncthing kaj, per ĝi, viajn dosierojn, pripensu agordi aŭtentigon.",
"Ignore": "Ignori",
"Ignore Patterns": "Ŝablonoj de ignorado",
"Ignore Permissions": "Ignori permesojn",
"Ignore patterns can only be added after the folder is created. If checked, an input field to enter ignore patterns will be presented after saving.": "Ŝablonoj de ignorado povas esti aldonitaj nur post kreado de dosierujo. Se ŝaltita, tekstokampo por enigo de ŝablonoj estos prezentita post konservado.",
"Ignored Devices": "Ignoritaj aparatoj",
"Ignored Folders": "Ignoritaj dosierujoj",
"Ignored at": "Ignorita ĉe",
"Incoming Rate Limit (KiB/s)": "Alvenanta Rapideco Limo (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Erara agordo povas difekti viajn dosierujajn enhavojn kaj senefikigi Syncthing-n.",
"Introduced By": "Enkondukita Per",
"Introducer": "Enkondukanto",
"Included Software": "Inkluzivita programaro",
"Incoming Rate Limit (KiB/s)": "Limigo de alvenanta rapideco (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Erara agordo povas difekti viajn dosierujajn enhavojn kaj senefikigi la programon Syncthing.",
"Incorrect user name or password.": "Malĝusta uzantnomo aŭ pasvorto.",
"Info": "Informo",
"Internally used paths:": "Interne uzataj vojoj:",
"Introduced By": "Konatigita de",
"Introducer": "Konatiganto",
"Introduction": "Konatigo",
"Inversion of the given condition (i.e. do not exclude)": "Inversigo de la donita kondiĉo (t.e. ne ekskludi)",
"Keep Versions": "Konservi Versiojn",
"Keep Versions": "Konservi versiojn",
"LDAP": "LDAP",
"Largest First": "Plej Granda Unue",
"Last Scan": "Lasta Skano",
"Last seen": "Lasta vidita",
"Latest Change": "Lasta Ŝanĝo",
"Learn more": "Lerni pli",
"Largest First": "Plej grandaj unue",
"Last 30 Days": "Lastaj 30 tagoj",
"Last 7 Days": "Lastaj 7 tagoj",
"Last Month": "Lasta monato",
"Last Scan": "Lasta skano",
"Last seen": "Laste vidita je",
"Latest Change": "Lasta ŝanĝo",
"Learn more": "Lernu pli",
"Learn more at {%url%}": "Lernu pli ĉe {{url}}",
"Limit": "Limo",
"Limit Bandwidth in LAN": "Limigi trafikon en lokaj retoj",
"Listener Failures": "Malsukcesoj de aŭskultiloj",
"Listener Status": "Stato de aŭskultiloj",
"Listeners": "Aŭskultantoj",
"Loading data...": "Ŝarĝas datumojn...",
"Loading...": "Ŝarĝas...",
"Loading data...": "Ŝarĝado de datumoj...",
"Loading...": "Ŝarĝado...",
"Local Additions": "Lokaj aldonoj",
"Local Discovery": "Loka Malkovro",
"Local State": "Loka Stato",
"Local State (Total)": "Loka Stato (Tuta)",
"Locally Changed Items": "Loke Ŝanĝitaj Eroj",
"Local Discovery": "Loka malkovrado",
"Local State": "Loka stato",
"Local State (Total)": "Loka stato (tuta)",
"Locally Changed Items": "Loke ŝanĝitaj eroj",
"Log": "Protokolo",
"Log File": "Protokola dosiero",
"Log In": "Ensaluti",
"Log Out": "Elsaluti",
"Log in to see paths information.": "Ensalutu por vidi informojn pri vojoj.",
"Log in to see version information.": "Ensalutu por vidi informojn pri versioj.",
"Log tailing paused. Scroll to the bottom to continue.": "Sekvado de protokolo paŭzita. Rulumu al la supro por daŭrigi.",
"Login failed, see Syncthing logs for details.": "Ensaluto malsukcesis, vidu la protokolojn de Syncthing por detaloj.",
"Logs": "Protokoloj",
"Major Upgrade": "Ĉefa Ĝisdatigo",
"Mass actions": "Amasa agoj",
"Maximum Age": "Maksimuma Aĝo",
"Metadata Only": "Nur Metadatumoj",
"Minimum Free Disk Space": "Minimuma Libera Diskospaco",
"Mod. Device": "Mod. Aparato",
"Mod. Time": "Mod. Tempo",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Konservi indekson de ĉiuj blokoj en la dosierujo, ebligante reuzadon de blokoj el aliaj dosierojn dum sinkronigado de ŝanĝoj. Malŝalti por malpliigado de datumbazo, kun kosto de neebleco de reuzado de blokoj inter dosieroj.",
"Major Upgrade": "Granda ĝisdatigo",
"Mass actions": "Amasaj agoj",
"Maximum Age": "Maksimuma aĝo",
"Maximum single entry size": "Maksimuma grando de unuopa ero",
"Maximum total size": "Maksimuma tuta grando",
"Metadata Only": "Nur metadatumoj",
"Minimum Free Disk Space": "Minimuma libera diskospaco",
"Mod. Device": "Mod. aparato",
"Mod. Time": "Tempo de mod.",
"More than a month ago": "Pli ol monato antaŭ",
"More than a week ago": "Pli ol semajno antaŭ",
"More than a year ago": "Pli ol jaro antaŭ",
"Move to top of queue": "Movi al la supro de atendovico",
"Multi level wildcard (matches multiple directory levels)": "Multnivela ĵokero (egalas multoblajn dosierujaj niveloj)",
"Never": "Neniam",
"New Device": "Nova Aparato",
"New Folder": "Nova Dosierujo",
"Newest First": "Plejnova Unue",
"New Device": "Nova aparato",
"New Folder": "Nova dosierujo",
"Newest First": "Plej novaj unue",
"No": "Ne",
"No File Versioning": "Sen Dosiera Versionado",
"No File Versioning": "Sen versiado de dosieroj",
"No files will be deleted as a result of this operation.": "Neniuj dosieroj estos forigitaj rezulte de ĉi tiu ago.",
"No rules set": "Neniuj reguloj agorditaj",
"No upgrades": "Sen ĝisdatigoj",
"Not shared": "Ne kunhavata",
"Notice": "Avizo",
"Number of Connections": "Nombro de konektoj",
"OK": "Bone",
"Off": "Malŝata",
"Oldest First": "Malnova Unue",
"Off": "Malŝaltita",
"Oldest First": "Plej malnovaj unue",
"Optional descriptive label for the folder. Can be different on each device.": "Laŭvola priskriba etikedo por la dosierujo. Povas esti malsama en ĉiu aparato.",
"Options": "Opcioj",
"Out of Sync": "Elsinkronigita",
"Out of Sync Items": "Elsinkronigitaj Eroj",
"Outgoing Rate Limit (KiB/s)": "Eliranta Rapideco Limo (KiB/s)",
"Override Changes": "Transpasi Ŝanĝojn",
"Optional group for the device. Can be different on each device.": "Laŭvola grupo por la aparato. Povas esti malsama en ĉiu aparato.",
"Optional group for the folder. Can be different on each device.": "Laŭvola grupo por la dosierujo. Povas esti malsama en ĉiu aparato.",
"Options": "Agordoj",
"Out of Sync": "Desinkronigita",
"Out of Sync Items": "Desinkronigitaj eroj",
"Outgoing Rate Limit (KiB/s)": "Limo de eliranta rapideco (KiB/s)",
"Override": "Transpasi",
"Override Changes": "Transpasi ŝanĝojn",
"Ownership": "Propreco",
"Password": "Pasvorto",
"Path": "Vojo",
"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": "Vojo de la dosierujo en la loka komputilo. Kreiĝos se ne ekzistas. La tilda signo (~) povas esti uzata kiel mallongigilo por",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Vojo kies versioj devus esti stokitaj (lasu malplena por la defaŭlta .stversions dosierujo en la komunigita dosierujo).",
"Pause": "Paŭzu",
"Pause All": "Paŭzu Ĉion",
"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": "Vojo de la dosierujo en la loka komputilo. Estos kreita, se ne ekzistas. La tilda signo (~) povas esti uzata kiel mallongigilo por",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Vojo, kie versioj devus esti stokitaj (lasu malplena por la defaŭlta dosierujo \".stversions\" en la kunhavata dosierujo).",
"Paths": "Vojoj",
"Pause": "Paŭzigi",
"Pause All": "Paŭzigi ĉiujn",
"Paused": "Paŭzita",
"Paused (Unused)": "Paŭzita (ne uzata)",
"Pending changes": "Pritraktataj ŝanĝoj",
"Periodic scanning at given interval and disabled watching for changes": "Perioda skanado ĉe donita intervalo kaj malebligita rigardado je ŝanĝoj",
"Periodic scanning at given interval and enabled watching for changes": "Perioda skanado ĉe donita intervalo kaj ebligita rigardado je ŝanĝoj",
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "Perioda skanado ĉe donita intervalo kaj malsukcesis agordi rigardadon je ŝanĝoj. Provante denove ĉiuminute:",
"Please consult the release notes before performing a major upgrade.": "Bonvolu konsulti la notojn de eldono antaŭ elfari ĉefan ĝisdatigon.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Bonvolu agordi GUI Authentication Uzanto kaj Pasvorto en la agordoj dialogo.",
"Please wait": "Bonvolu atendi",
"Prefix indicating that the file can be deleted if preventing directory removal": "Prefikso indikanta, ke la dosiero povas esti forigita, se ĝi malhelpas forigi dosierujon",
"Prefix indicating that the pattern should be matched without case sensitivity": "Prefikso indikanta, ke la ŝablono devus esti egalita usklecoblinde.",
"Preparing to Sync": "Pretigante sinkronigadon",
"Periodic scanning at given interval and disabled watching for changes": "Perioda skanado ĉe donita intervalo ŝaltita kaj atendado por ŝanĝoj malŝaltita",
"Periodic scanning at given interval and enabled watching for changes": "Perioda skanado ĉe donita intertempo kaj atendado por ŝanĝoj ŝaltitaj",
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "Perioda skanado ĉe donita intertempo kaj agordado de atendado por ŝanĝoj malsukcesis, reprovado ĉiuminute:",
"Permanently add it to the ignore list, suppressing further notifications.": "Porĉiame aldoni ĝin al la listo de ignoraĵoj, silentigante estontajn sciigojn.",
"Please consult the release notes before performing a major upgrade.": "Bonvolu konsultu la notojn de eldono antaŭ elfarado de granda ĝisdatigo.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Bonvolu agordu la uzanton kaj pasvorton de aŭtentigo per grafika interfaco en la dialogo \"Agordoj\".",
"Please wait": "Bonvolu atendu",
"Prefix indicating that the file can be deleted if preventing directory removal": "Prefikso, indikanta, ke la dosiero povas esti forigita, se ĝi malhelpas forigi dosierujon",
"Prefix indicating that the pattern should be matched without case sensitivity": "Prefikso, indikanta, ke la ŝablono devus esti komparita usklecoblinde",
"Preparing to Sync": "Pretigado por sinkronigado",
"Preview": "Antaŭrigardo",
"Preview Usage Report": "Antaŭrigardo Uzada Raporto",
"Quick guide to supported patterns": "Rapida gvidilo pri subtenata ŝablonoj",
"QR code": "QR-kodo",
"QUIC LAN": "Loka reto per QUIC",
"QUIC WAN": "Malloka reto per QUIC",
"Quick guide to supported patterns": "Rapida gvidilo pri subtenataj ŝablonoj",
"Random": "Hazarda",
"Receive Only": "Nur Ricevi",
"Recent Changes": "Lastatempaj Ŝanĝoj",
"Reduced by ignore patterns": "Malpliigita per ignorantaj ŝablonoj",
"Release Notes": "Notoj de Eldono",
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "Kandidataj eldonoj enhavas la lastajn trajtojn kaj korektojn. Ili estas similaj al la tradiciaj dusemajnaj Syncthing eldonoj.",
"Remote Devices": "Foraj Aparatoj",
"Remove": "Forigu",
"Remove Device": "Forigi Aparaton",
"Remove Folder": "Forigi Dosierujon",
"Required identifier for the folder. Must be the same on all cluster devices.": "Nepra identigilo por la dosierujo. Devas esti la sama en ĉiuj aparatoj de la grupo.",
"Rescan": "Reskanu",
"Rescan All": "Reskanu Ĉion",
"Receive Encrypted": "Ricevi ĉifritajn",
"Receive Only": "Nur ricevi",
"Received data is already encrypted": "Ricevataj datumoj estas jam ĉifritaj",
"Recent Changes": "Lastatempaj ŝanĝoj",
"Reduced by ignore patterns": "Malpliigita per ŝablonoj de ignorado",
"Relay LAN": "Loka reto kun plusendado",
"Relay WAN": "Malloka reto kun plusendado",
"Release Notes": "Notoj de eldono",
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "Kandidataj eldonoj enhavas la lastajn funkciojn kaj korektojn. Ili estas similaj al la tradiciaj dusemajnaj eldonoj de Syncthing.",
"Remote Devices": "Foraj aparatoj",
"Remote GUI": "Fora grafika interfaco",
"Remove": "Forigi",
"Remove Device": "Forigi aparaton",
"Remove Folder": "Forigi dosierujon",
"Required identifier for the folder. Must be the same on all cluster devices.": "Nepra identigilo por la dosierujo. Devas esti la sama en ĉiuj aparatoj de la aparataro.",
"Rescan": "Reskani",
"Rescan All": "Reskani ĉiujn",
"Rescans": "Reskanoj",
"Restart": "Restartu",
"Restart Needed": "Restarto Bezonata",
"Restart": "Restartigi",
"Restart Needed": "Restarto bezonata",
"Restarting": "Restartado",
"Restore": "Restarigi",
"Restore Versions": "Restarigi Versiojn",
"Resume": "Daŭrigu",
"Resume All": "Daŭrigu Ĉion",
"Restore": "Restaŭri",
"Restore Versions": "Restaŭri versiojn",
"Resume": "Daŭrigi",
"Resume All": "Daŭrigi ĉiujn",
"Reused": "Reuzita",
"Revert Local Changes": "Reverti Lokajn Ŝangojn",
"Save": "Konservu",
"Scan Time Remaining": "Restanta Tempo de Skano",
"Revert": "Malfari",
"Revert Local Changes": "Malfari lokajn ŝanĝojn",
"Save": "Konservi",
"Saving changes": "Konservado de ŝanĝoj",
"Scan Time Remaining": "Restanta tempo de skanado",
"Scanning": "Skanado",
"See external versioning help for supported templated command line parameters.": "Vidu informlibron de ekstera versionado por subtenata ŝablona parametroj de komandlinio.",
"Select All": "Elekti Ĉiujn",
"See external versioning help for supported templated command line parameters.": "Vidu informlibron de ekstera versiado por subtenataj ŝablonaj parametroj de komandlinio.",
"Select All": "Elekti ĉiujn",
"Select a version": "Elekti version",
"Select additional devices to share this folder with.": "Elektu pliajn aparatojn por komunigi tiun ĉi dosierujon kun ili.",
"Select additional folders to share with this device.": "Elektu aldonajn dosierujojn, kiuj estos kunhavita kun ĉi tiu aparato.",
"Select latest version": "Elekti plej novan version",
"Select oldest version": "Elekti plej malnovan version",
"Send & Receive": "Sendi kaj Ricevi",
"Send Only": "Nur Sendi",
"Send & Receive": "Sendi kaj ricevi",
"Send Extended Attributes": "Sendi aldonajn atributojn",
"Send Only": "Nur sendi",
"Send Ownership": "Sendi proprecon",
"Set Ignores on Added Folder": "Agordi ignoraĵojn por aldonata dosierujo",
"Settings": "Agordoj",
"Share": "Komunigi",
"Share Folder": "Komunigu Dosierujon",
"Share this folder?": "Komunigi ĉi tiun dosierujon?",
"Shared With": "Komunigita Kun",
"Sharing": "Komunigo",
"Show ID": "Montru ID",
"Show QR": "Montru QR",
"Show diff with previous version": "Montri diferenco kun antaŭa versio",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Montrita anstataŭ ID de Aparato en la statuso de la grupo. Estos anoncita al aliaj aparatoj kiel laŭvola defaŭlta nomo.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Montri anstataŭ ID de Aparato en la statuso de la grupo. Estos ĝisdatigita al la nomo de la aparato sciigante se ĝi estas lasita malplena.",
"Shut Down": "Sistemfermo",
"Shutdown Complete": "Sistemfermo Tuta",
"Simple File Versioning": "Simpla Versionado de Dosieroj",
"Share": "Kunhavigi",
"Share Folder": "Kunhavigi dosierujon",
"Share by Email": "Kunhavigi per retpoŝto",
"Share by SMS": "Kunhavigi per SMS",
"Share this folder?": "Ĉu kunhavigi ĉi tiun dosierujon?",
"Shared Folders": "Kunhavataj dosieroj",
"Shared With": "Kunhavata kun",
"Sharing": "Kunhavado",
"Show ID": "Montri identigilon",
"Show QR": "Montri QR-kodon",
"Show detailed discovery status": "Montri detalan staton de malkovrado",
"Show detailed listener status": "Montri detalan staton de aŭskultiloj",
"Show diff with previous version": "Montri diferencon kun antaŭa versio",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Montrita anstataŭ identigilo de aparato en la statuso de la aparatato. Estos anoncita al aliaj aparatoj kiel laŭvola defaŭlta nomo.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Montrita anstataŭ identigilo de aparato en la statuso de la aparataro. Estos ĝisdatigita al la nomo de la aparato, kiun ĝi sciigos, se lasita malplena.",
"Shut Down": "Malŝalti",
"Shutdown Complete": "Malŝaltado plenumita",
"Simple": "Simpla",
"Simple File Versioning": "Simpla versiado de dosieroj",
"Single level wildcard (matches within a directory only)": "Ununivela ĵokero (egalas nur ene de dosierujo)",
"Size": "Grandeco",
"Smallest First": "Plej Malgranda Unue",
"Some items could not be restored:": "Iuj eroj ne povis esti restarigitaj:",
"Size": "Grando",
"Smallest First": "Plej malgrandaj unue",
"Some discovery methods could not be established for finding other devices or announcing this device:": "Iuj metodoj de malkovrado ne povas esti starigitaj por trovado de aliaj aparatoj aŭ anoncado de tiu ĉi aparato:",
"Some items could not be restored:": "Iuj eroj ne povis esti restaŭritaj:",
"Some listening addresses could not be enabled to accept connections:": "Iuj adresoj de aŭskultado ne povas esti ŝaltitaj por akceptado de konektoj:",
"Source Code": "Fontkodo",
"Stable releases and release candidates": "Stabilaj eldonoj kaj kandidataj eldonoj",
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.": "Stabilaj eldonoj prokrastas je ĉirkaŭ du semjanoj. Dum tiu tempo ili estos testataj kiel kandidataj eldonoj.",
"Stable releases only": "Nur stabilaj eldonoj",
"Staggered File Versioning": "Gradigita Dosiera Versionado",
"Start Browser": "Startu Retumilon",
"Staggered": "Gradigita",
"Staggered File Versioning": "Gradigita versiado de dosieroj",
"Start Browser": "Starti retumilon",
"Starting": "Komencado",
"Statistics": "Statistikoj",
"Stay logged in": "Resti ensalutita",
"Stopped": "Haltita",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Enmemorigas kaj sinkronigas nur ĉifritajn datumojn. Dosierujoj en ĉiuj konektitaj aparatoj devas ankaŭ esti agordita kun la sama pasvorto aŭ havi tipon \"{{receiveEncrypted}}\".",
"Subject:": "Temo:",
"Support": "Subteno",
"Support Bundle": "Pakaĵo por subteno",
"Sync Protocol Listen Addresses": "Aŭskultado Adresoj de Sinkprotokolo",
"Syncing": "Sinkronigas",
"Sync Extended Attributes": "Sinkronigi aldonajn atributojn",
"Sync Ownership": "Sinkronigi proprecon",
"Sync Protocol Listen Addresses": "Aŭskultataj adresoj de sinkroniga protokolo",
"Sync Status": "Stato de sinkronigado",
"Syncing": "Sinkronigado",
"Syncthing device ID for \"{%devicename%}\"": "Identigilo Syncthing de aparato \"{{devicename}}\"",
"Syncthing has been shut down.": "Syncthing estis malŝaltita.",
"Syncthing includes the following software or portions thereof:": "Syncthing inkluzivas la jenajn programarojn aŭ porciojn ĝiajn:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing estas libera kaj malferma fonta programaro licencita kiel MPL v2.0.",
"Syncthing is restarting.": "Syncthing estas restartanta.",
"Syncthing is upgrading.": "Syncthing estas ĝisdatigita.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing ŝajnas nefunkcii, aŭ estas problemo kun via retkonekto. Reprovado...",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing ŝajnas renkonti problemon kun la traktado de via peto. Bonvolu refreŝigi la paĝon aŭ restarti Syncthing se la problemo daŭras.",
"Syncthing includes the following software or portions thereof:": "Syncthing inkluzivas la jenajn programarojn aŭ ties porciojn:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing estas libera kaj malfermitkoda programo, licencita per permesilo MPL v2.0.",
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing estas programo por daŭra sinkronigado de dosieroj. Ĝi sinkronigas dosierojn inter du aŭ pli komputiloj realtempe, sekure protektita de rigardantoj. Viaj datumoj restas viaj, kaj vi meritas elekti, kie ili estas enmemorigataj, kun kiuj eksteraj liverantoj ili estas kunhavataj, kaj kiel ili estas transmetataj tra la interreto.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing aŭskultas per la sekvaj retaj adresoj por provoj de konekto el aliaj aparatoj:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing ne aŭskultas por konektaj el aliaj aparatoj per iu ajn adreso. Nur elirantaj konektoj povos funkcii.",
"Syncthing is restarting.": "Syncthing restartiĝas.",
"Syncthing is saving changes.": "Syncthing konservas la ŝanĝojn.",
"Syncthing is upgrading.": "Syncthing ĝisdatiĝas.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing nun subtenas aŭtomatan raportadon de paneoj al la disvolvantoj. Ĉi tiu funkcio estas defaŭlte ŝaltita.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing ŝajnas nefunkcia, aŭ estas problemo kun via retkonekto. Reprovado…",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing ŝajnas renkonti problemon kun la traktado de via peto. Bonvolu refreŝigu la paĝon aŭ restarti la programon Syncthing, se la problemo daŭras.",
"TCP LAN": "Loka reto per TCP",
"TCP WAN": "Malloka reto per TCP",
"Take me back": "Prenu min reen",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "La adreso de grafika interfaco estas superregita per startigaj agordoj. Ŝanĝoj ĉi tie ne efektiviĝas dum la superrego estas aktuala.",
"The Syncthing Authors": "La aŭtoroj de Syncthing",
"The Syncthing admin interface is configured to allow remote access without a password.": "La administra interfaco de Syncthing estas agordita por permesi foran atingon sen pasvorto.",
"The aggregated statistics are publicly available at the URL below.": "La agregita statistikoj estas publike disponebla ĉe la URL malsupre.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La agordo estis registrita sed ne aktivigita. Syncthing devas restarti por aktivigi la novan agordon.",
"The device ID cannot be blank.": "La aparato ID ne povas esti malplena.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "La aparato ID por eniri ĉi tie estas trovebla per \"Agoj > Montru ID\" dialogo en la alia aparato. Interspacoj kaj streketoj estas opcio (ignorigita).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "La ĉifrita raporto de uzado estas sendata ĉiutage. Ĝi estas uzata por sekvi komunajn platformojn, dosierujajn grandojn kaj aplikaĵajn versiojn. Se la raporto datumaro ŝanĝis, vi estos avertata per ĉi tiu dialogo denove.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "La enigita aparato ID ne ŝajnas valida. Ĝi devas esti signoĉeno el 52 aŭ 56 karaktroj longa enhavanta leterojn kaj nombrojn, kun interspacoj kaj streketoj opciaj.",
"The folder ID cannot be blank.": "La dosierujo ID ne povas esti malplena.",
"The folder ID must be unique.": "La dosierujo ID devas esti unika.",
"The cleanup interval cannot be blank.": "La intertempo de purigado ne povas esti malplena.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La agordo estis registrita, sed ne aktivigita. Syncthing devas restarti por aktivigi la novan agordaron.",
"The device ID cannot be blank.": "La aparata identigilo ne povas esti malplena.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "La identigilo de aparato por eniri ĉi tie estas trovebla per dialogo \"Agoj > Montri identigilon\" en la alia aparato. Spacetoj kaj streketoj estas opciaj (ignoritaj).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "La ĉifrita raporto de uzado estas sendata ĉiutage. Ĝi estas uzata por sekvi kutimajn platformojn, dosierujajn grandojn kaj aplikaĵajn versiojn. Se la raporto datumaro ŝanĝiĝis, vi estos avertata per ĉi tiu dialogo denove.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "La enigita aparata identigilo ne ŝajnas valida. Ĝi devas esti signoĉeno el 52 aŭ 56 simboloj longa, enhavanta leterojn kaj nombrojn, kun opciaj interspacoj kaj streketoj.",
"The folder ID cannot be blank.": "La dosieruja identigilo ne povas esti malplena.",
"The folder ID must be unique.": "La dosieruja identigilo devas esti unika.",
"The folder content on other devices will be overwritten to become identical with this device. Files not present here will be deleted on other devices.": "La enhavo de dosierujo en aliaj aparatoj estas superskribita por esti sama al ĉi tiu aparato. Dosieroj, ne ekzistantaj ĉi tie, estos forigitaj en aliaj aparatoj.",
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.": "La enhavo de dosierujo en ĉi tiu aparato estas superskribita por esti sama al aliaj aparatoj. Dosieroj, freŝe aldonitaj ĉi tien, estos forigitaj.",
"The folder path cannot be blank.": "La vojo de dosierujo ne povas esti malplena.",
"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.": "La jenaj intervaloj estas uzataj: dum la unua horo version restas dum ĉiuj 30 sekundoj, dum la unua tago versio restas konservita dum ĉiu horo, dum la unuaj 30 tagoj versio estas konservita dum ĉiu tago, ĝis la maksimume aĝa versio restas konservita dum ĉiu semajno.",
"The following items could not be synchronized.": "La sekvantaj eroj ne povas esti sinkronigitaj.",
"The following items were changed locally.": "La sekvantaj eroj estis ŝanĝitaj loke.",
"The following methods are used to discover other devices on the network and announce this device to be found by others:": "La sekvaj metodoj estas uzataj por malkovri aliajn aparatojn en la reto kaj anonci ĉi tiun aparaton por esti trovita de aliaj:",
"The following text will automatically be inserted into a new message.": "La sekva teksto estos aŭtomate enmetita al novan mesaĝon.",
"The following unexpected items were found.": "La sekvaj neatenditaj eroj estis trovitaj.",
"The interval must be a positive number of seconds.": "La intertempo devas esti pozitiva nombro da sekundoj.",
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "La intertempo, en sekundoj, por ruli purigadon en la dosierujo de versioj. Nul malŝaltas periodan purigadon.",
"The maximum age must be a number and cannot be blank.": "La maksimuma aĝo devas esti nombro kaj ne povas esti malplena.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "La maksimuma tempo por konservi version (en tagoj, agordi je 0 por konservi versiojn eterne).",
"The number of connections must be a non-negative number.": "La nombro de konektoj devas esti ne-negativan nombron.",
"The number of days must be a number and cannot be blank.": "La nombro da tagoj devas esti nombro kaj ne povas esti malplena.",
"The number of days to keep files in the trash can. Zero means forever.": "La nombro da tagoj por konservi dosierojn en la rubujo. Nulo signifas eterne.",
"The number of old versions to keep, per file.": "La nombro da malnovaj versioj por konservi, po ĉiu dosiero.",
"The number of versions must be a number and cannot be blank.": "La nombro da versioj devas esti nombro kaj ne povas esti malplena.",
"The path cannot be blank.": "La vojo ne povas esti malplena.",
"The rate limit is applied to the accumulated traffic of all connections to this device.": "La limigo de ofteco estas aplikita al la amasigita trafiko de ĉiuj konektoj al ĉiu ti aparato.",
"The rate limit must be a non-negative number (0: no limit)": "La rapideca limo devas esti pozitiva nombro (0: senlimo)",
"The remote device has not accepted sharing this folder.": "La fora aparato ne akceptis kunhavadon de ĉiu ti dosierujo.",
"The remote device has paused this folder.": "La fora aparato paŭzigis ĉi tiun dosierujon.",
"The rescan interval must be a non-negative number of seconds.": "La intervalo de reskano devas esti pozitiva nombro da sekundoj.",
"There are no devices to share this folder with.": "Estas neniu aparato kun kiu komunigi tiun ĉi dosierujon.",
"There are no devices to share this folder with.": "Estas neniu aparato, kun kiu kunhavigi tiun ĉi dosierujon.",
"There are no file versions to restore.": "Estas neniuj dosieraj versioj por restaŭrado.",
"There are no folders to share with this device.": "Estas neniuj dosierujoj por kunhavado kun tiu ĉi aparato.",
"They are retried automatically and will be synced when the error is resolved.": "Ili estas reprovitaj aŭtomate kaj estos sinkronigitaj kiam la eraro estas solvita.",
"This Device": "Ĉi Tiu Aparato",
"This Device": "Ĉi tiu aparato",
"This Month": "Tiu ĉi monato",
"This can easily give hackers access to read and change any files on your computer.": "Ĉi tio povas facile doni al kodumuloj atingon por legi kaj ŝanĝi ajnajn dosierojn en via komputilo.",
"This is a major version upgrade.": "Ĉi tio estas ĉefversio ĝisdatigita.",
"This setting controls the free space required on the home (i.e., index database) disk.": "Ĉi tiu agordo regas la libera spaco postulita sur la hejma (t.e. indeksa datumbaza) disko.",
"This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "Ĉi tiu aparato ne povas aŭtomate malkovri aliajn aparatojn aŭ anonci sia adreso por esti trovita de aliaj. Nur aparatoj kun statike agorditaj adresoj povas konekti.",
"This is a major version upgrade.": "Ĉi tio estas granda ĝisdatigo.",
"This setting controls the free space required on the home (i.e., index database) disk.": "Ĉi tiu agordo regas la liberan spacon, postulitan sur la hejma disko (t.e. en kiu la indeksa datumbazo estas enmemorigata).",
"Time": "Tempo",
"Time the item was last modified": "Tempo de lasta modifo de la ero",
"Trash Can File Versioning": "Rubuja Dosiera Versionado",
"To connect with the Syncthing device named \"{%devicename%}\", add a new remote device on your end with this ID:": "Por konekti al aparato Syncthing nomita \"{{devicename}}\", aldonu novan foran aparaton kun ĉi tiu identigilo en via aparato:",
"To permit a rule, have the checkbox checked. To deny a rule, leave it unchecked.": "Por permesi regulon, ŝalti la markobutonon. Por negi regulon, malŝalti ĝin.",
"Today": "Hodiaŭ",
"Trash Can": "Rubujo",
"Trash Can File Versioning": "Rubuja versiado de dosieroj",
"Type": "Tipo",
"UNIX Permissions": "Permesoj UNIX",
"UNIX Permissions": "Permesoj de UNIX",
"Unavailable": "Ne disponebla",
"Unavailable/Disabled by administrator or maintainer": "Ne disponebla/Malebligita de administranto aŭ subtenanto",
"Undecided (will prompt)": "Hezitema (demandos)",
"Unignore": "Malignoru",
"Unexpected Items": "Neatenditaj eroj",
"Unexpected items have been found in this folder.": "Neatenditaj eroj estis trovitaj en ĉi tiu dosierujo.",
"Unignore": "Malignori",
"Unknown": "Nekonata",
"Unshared": "Nekomunigita",
"Unshared Devices": "Malkomunigitaj aparatoj",
"Unshared": "Nekunhavata",
"Unshared Devices": "Nekunhavataj aparatoj",
"Unshared Folders": "Nekunhavataj dosierujoj",
"Untrusted": "Ne fidita",
"Up to Date": "Ĝisdata",
"Upgrade": "Altgradigo",
"Upgrade To {%version%}": "Altgradigi Al {{version}}",
"Upgrading": "Altgradigata",
"Updated {%file%}": "Ĝisdatigita: {{file}}",
"Upgrade": "Ĝisdatigo",
"Upgrade To {%version%}": "Ĝisdatigi al {{version}}",
"Upgrading": "Ĝisdatigado",
"Upload Rate": "Alŝutrapideco",
"Uptime": "Daŭro de funkciado",
"Usage reporting is always enabled for candidate releases.": "Uzada raportado ĉiam ŝaltita por kandidataj eldonoj.",
"Use HTTPS for GUI": "Uzi HTTPS por grafika interfaco.",
"Use HTTPS for GUI": "Uzi HTTPS por grafika interfaco",
"Use notifications from the filesystem to detect changed items.": "Uzi sciigoj de la dosiersistemo por detekti ŝanĝitajn erojn.",
"User": "Uzanto",
"User Home": "Hejmo de uzanto",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Uzantnomo kaj pasvorto ne estis agorditaj por aŭtentokontrolo per grafika interfaco. Bonvolu pripensi agordi ilin.",
"Using a QUIC connection over LAN": "QUIC-konekto sur loka reto uzata",
"Using a QUIC connection over WAN": "QUIC-konekto sur malloka reto uzata",
"Using a direct TCP connection over LAN": "Rekta TCP-konekto sur loka reto uzata",
"Using a direct TCP connection over WAN": "Rekta TCP-konekto sur malloka reto uzata",
"Version": "Versio",
"Versions": "Versioj",
"Versions Path": "Vojo de Versioj",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Versioj estas aŭtomate forigita se ili estas pli malnovaj ol la maksimuma aĝo aŭ superas la nombron da dosieroj permesita en intervalo.",
"Waiting to Scan": "Atendante skanadon",
"Waiting to Sync": "Atendante sinkronigadon",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "Averto, ĉi tiu vojo estas parenta dosierujo de ekzistanta dosierujo \"{{otherFolder}}\".",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Averto, ĉi tiu vojo estas parenta dosierujo de ekzistanta dosierujo \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Versions Path": "Vojo de versioj",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Versioj estas aŭtomate forigitaj, se ili estas pli malnovaj ol la maksimuma aĝo, aŭ superas la nombron da dosieroj, permesitaj en intertempo.",
"Waiting to Clean": "Atendado por purigado",
"Waiting to Scan": "Atendado por skanado",
"Waiting to Sync": "Atendado por sinkronigado",
"Warning": "Averto",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "Averto, ĉi tiu vojo estas parenca dosierujo de ekzistanta dosierujo \"{{otherFolder}}\".",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Averto, ĉi tiu vojo estas parenca dosierujo de ekzistanta dosierujo \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Averto, ĉi tiu vojo estas subdosierujo de ekzistanta dosierujo \"{{otherFolder}}\".",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Averto, ĉi tiu vojo estas subdosierujo de ekzistanta dosierujo \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "Averto: se vi uzas ekstera rigardanto simila al {{syncthingInotify}}, vi devas certiĝi ĝi estas senaktivita.",
"Watch for Changes": "Rigardi Ŝanĝojn",
"Watching for Changes": "Rigardado je Ŝanĝoj",
"Watching for changes discovers most changes without periodic scanning.": "Rigardado je ŝanĝoj malkovras plejparton de la ŝanĝoj sen perioda skanado.",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "Averto: se vi uzas eksteran rigardanton, similan al {{syncthingInotify}}, vi devas certiĝi, ke ĝi estas malaktiva.",
"Watch for Changes": "Atendi por ŝanĝoj",
"Watching for Changes": "Atendado por ŝanĝoj",
"Watching for changes discovers most changes without periodic scanning.": "Atendado por ŝanĝoj malkovras plejparton de la ŝanĝoj sen perioda skanado.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Dum la aldonado de nova aparato, memoru ke ĉi tiu aparato devas esti aldonita en la alia flanko ankaŭ.",
"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.": "Dum la aldonado de nova dosierujo, memoru ke la Dosieruja ID estas uzita por ligi la dosierujojn kune inter aparatoj. Ili estas literfakodistingaj kaj devas kongrui precize inter ĉiuj aparatoj.",
"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.": "Dum la aldonado de nova dosierujo, memoru ke la dosieruja identigilo estas uzita por ligi la dosierujojn kune inter aparatoj. Ili estas usklecodistingaj kaj devas kongrui precize inter ĉiuj aparatoj.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Kiam agordita kiel pli ol unu en ambaŭ aparatoj, Syncthing provos starigi multajn samtempajn konektojn. Se la valoroj malsamaj, la pleja estos uzata. Agordu kiel nul, por ke Syncthing decidos mem.",
"Yes": "Jes",
"Yesterday": "Hieraŭ",
"You can also copy and paste the text into a new message manually.": "Vi povas ankaŭ kopii kaj alglui la tekston en novan mesaĝon permane.",
"You can also select one of these nearby devices:": "Vi povas ankaŭ elekti unu el ĉi tiuj proksimaj aparatoj:",
"You can change your choice at any time in the Settings dialog.": "Vi povas ŝanĝi vian elekton iam ajn en la Agorda dialogo.",
"You can change your choice at any time in the Settings dialog.": "Vi povas ŝanĝi vian elekton iam ajn en la dialogo \"Agordoj\".",
"You can read more about the two release channels at the link below.": "Vi povas legi plu pri la du eldonkanaloj per la malsupra ligilo.",
"You have no ignored devices.": "Vi havas neniujn ignoritajn aparatojn.",
"You have no ignored folders.": "Vi havas neniujn ignoritajn dosierujojn.",
"You have unsaved changes. Do you really want to discard them?": "Vi havas ne konservitaj ŝanĝoj. Ĉu vi vere volas forĵeti ilin?",
"You have no ignored devices.": "Vi havas neniujn ignoratajn aparatojn.",
"You have no ignored folders.": "Vi havas neniujn ignoratajn dosierujojn.",
"You have unsaved changes. Do you really want to discard them?": "Vi havas nekonservitajn ŝanĝojn. Ĉu vi vere volas forĵeti ilin?",
"You must keep at least one version.": "Vi devas konservi almenaŭ unu version.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Vi neniam devus aldoni aŭ ŝanĝi ion ajn loke en dosierujo \"{{receiveEncrypted}}\".",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "Via SMS-apo devus malfermi, por ke vi povas elekti la adresaton kaj sendi la mesaĝon el via telefonnumero.",
"Your email app should open to let you choose the recipient and send it from your own address.": "Via retpoŝta apo devus malfermi, por ke vi povas elekti la adresaton kaj sendi la mesaĝon el via retpoŝtadreso.",
"days": "tagoj",
"deleted": "forigita",
"deny": "negi",
"directories": "dosierujoj",
"file": "dosiero",
"files": "dosieroj",
"folder": "dosierujo",
"full documentation": "tuta dokumentado",
"items": "eroj",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} volas komunigi dosierujon \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} volas komunigi dosierujon \"{{folderlabel}}\" ({{folder}})."
"modified": "modifita",
"permit": "permesi",
"seconds": "sekundoj",
"theme": {
"name": {
"black": "Nigra",
"dark": "Malhela",
"default": "Defaŭlta",
"light": "Hela"
}
},
"unknown device": "nekonata aparato",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} volas kunhavigi dosierujon \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} volas kunhavigi dosierujon \"{{folderlabel}}\" ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} povas rekonatigi ĉi tiun aparaton."
}
+239 -227
View File
@@ -6,15 +6,15 @@
"About": "Acerca de",
"Action": "Acción",
"Actions": "Acciones",
"Active filter rules": "Activadas las reglas del filtro",
"Add": "Agregar",
"Add Device": "Agregar el dispositivo",
"Add Folder": "Agregar Carpeta",
"Add Remote Device": "Añadir un dispositivo remoto",
"Add devices from the introducer to our device list, for mutually shared folders.": "Añadir dispositivos del presentador a nuestra lista de dispositivos para las carpetas compartidas mutuamente.",
"Add filter entry": "Añadir una entrada al filtro",
"Add ignore patterns": "Agregar patrones a ignorar",
"Add new folder?": "¿Agregar una carpeta nueva?",
"Active filter rules": "Reglas habilitadas del filtro",
"Add": "Añadir",
"Add Device": "Añadir dispositivo",
"Add Folder": "Añadir carpeta",
"Add Remote Device": "Añadir dispositivo remoto",
"Add devices from the introducer to our device list, for mutually shared folders.": "Añade dispositivos de la lista del presentador a nuestra lista de dispositivos, para carpetas compartidas simultáneamente.",
"Add filter entry": "Añadir regla",
"Add ignore patterns": "Añadir patrones a ignorar",
"Add new folder?": "¿Añadir carpeta nueva?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Además, se aumentará el intervalo de reescaneo completo (60 veces, es decir, nuevo valor predeterminado de 1 hora). También puede configurarlo manualmente para cada carpeta después de elegir No.",
"Address": "Dirección",
"Addresses": "Direcciones",
@@ -22,23 +22,24 @@
"Advanced Configuration": "Configuración Avanzada",
"All Data": "Todos los datos",
"All Time": "Todo el tiempo",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Todas las carpetas compartidas con este dispositivo deben estar protegidas por una contraseña, de forma que todos los datos enviados sean ilegibles sin la contraseña indicada.",
"Allow Anonymous Usage Reporting?": "¿Deseas permitir el envío anónimo de informes de uso?",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Todas las carpetas compartidas con este dispositivo deben estar protegidas por una contraseña, de forma que todos los datos enviados sean ilegibles sin dicha contraseña.",
"Allow Anonymous Usage Reporting?": "¿Permites el informe de uso anónimo?",
"Allowed Networks": "Redes permitidas",
"Alphabetic": "Alfabético",
"Altered by ignoring deletes.": "Alterado ignorando eliminaciones.",
"Altered by ignoring deletes.": "Alterado, ignorando eliminaciones.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Siempre habilitado cuando el tipo de carpeta es \"{{foldertype}}\".",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Un comando externo maneja las versiones. Tienes que eliminar el archivo de la carpeta compartida. Si la ruta a la aplicación contiene espacios, ésta debe estar entre comillas.",
"Anonymous Usage Reporting": "Informe anónimo de uso",
"Anonymous Usage Reporting": "Informe de uso anónimo",
"Anonymous usage report format has changed. Would you like to move to the new format?": "El formato del informe de uso anónimo a cambiado. ¿Le gustaría pasar al nuevo formato?",
"Applied to LAN": "Aplicado a la LAN",
"Apply": "Solicitar",
"Are you sure you want to override all remote changes?": "¿Está seguro(a) de que desea sobreescribir todos los cambios remotos?",
"Are you sure you want to permanently delete all these files?": "¿Está seguro de que desea eliminar permanentemente todos estos archivos?",
"Are you sure you want to remove device {%name%}?": "¿Está seguro que desea eliminar el dispositivo {{name}}?",
"Are you sure you want to remove folder {%label%}?": "¿Está seguro que desea eliminar la carpeta {{label}}?",
"Are you sure you want to restore {%count%} files?": "¿Está seguro que desea restaurar {{count}} archivos?",
"Are you sure you want to revert all local changes?": "¿Está seguro(a) de que desea revertir todos los cambios locales?",
"Are you sure you want to upgrade?": "¿Está seguro(a) de que desea actualizar?",
"Are you sure you want to override all remote changes?": "¿Estás seguro de que quieres sobreescribir todos los cambios remotos?",
"Are you sure you want to permanently delete all these files?": "¿Estás seguro de que quieres eliminar permanentemente todos estos archivos?",
"Are you sure you want to remove device {%name%}?": "¿Estás seguro de que quieres eliminar el dispositivo {{name}}?",
"Are you sure you want to remove folder {%label%}?": "¿Estás seguro de que quieres eliminar la carpeta {{label}}?",
"Are you sure you want to restore {%count%} files?": "¿Estás seguro de que quieres restaurar {{count}} archivos?",
"Are you sure you want to revert all local changes?": "¿Estás seguro de que quieres revertir todos los cambios locales?",
"Are you sure you want to upgrade?": "¿Estás seguro de que quieres actualizar?",
"Authentication Required": "Autenticación requerida",
"Authors": "Autores",
"Auto Accept": "Aceptar automáticamente",
@@ -46,27 +47,29 @@
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Ahora la actualización automática permite elegir entre versiones estables o versiones candidatas.",
"Automatic upgrades": "Actualizaciones automáticas",
"Automatic upgrades are always enabled for candidate releases.": "Las actualizaciones automáticas siempre están activadas para las versiones candidatas.",
"Automatically create or share folders that this device advertises at the default path.": "Crear o compartir automáticamente carpetas que este dispositivo anuncia en la ruta por defecto.",
"Available debug logging facilities:": "Funciones de registro de depuración disponibles:",
"Automatically create or share folders that this device advertises at the default path.": "Crea o comparte automáticamente las carpetas que el dispositivo anuncia en la ruta predeterminada.",
"Available debug logging facilities:": "Servicios de depuración disponibles:",
"Be careful!": "¡Ten cuidado!",
"Block Indexing": "Indexación por bloques",
"Body:": "Contenido:",
"Bugs": "Errores",
"Cancel": "Cancelar",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "No se puede habilitar cuando el tipo de carpeta es \"{{foldertype}}\".",
"Changelog": "Registro de cambios",
"Clean out after": "Limpiar tras",
"Cleaning Versions": "Limpiando Versiones",
"Cleanup Interval": "Intervalo de Limpieza",
"Click to see full identification string and QR code.": "Haga clic para ver la cadena de identificación completa y su código QR.",
"Cleaning Versions": "Limpiando versiones",
"Cleanup Interval": "Intervalo de limpieza",
"Click to see full identification string and QR code.": "Haz clic para ver el identificador completo y su código QR.",
"Close": "Cerrar",
"Command": "Dominio",
"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": "Comenta la línea cuando se usa al comienzo (no se tiene en cuenta)",
"Compression": "Compresión",
"Configuration Directory": "Carpeta de la configuración",
"Configuration File": "Archivo de configuración",
"Configured": "Configurado",
"Connected (Unused)": "Conectado (Sin Uso)",
"Connection Error": "Error de conexión",
"Connection Management": "Gestión de las conexiones",
"Connection Management": "Gestión de conexiones",
"Connection Type": "Tipo de conexión",
"Connections": "Conexiones",
"Connections via relays might be rate limited by the relay": "Las conexiones a través de relés pueden estar limitadas por la velocidad del relé",
@@ -75,40 +78,42 @@
"Copied from original": "Copiado del original",
"Copied!": "¡Copiado!",
"Copy": "Copiar",
"Copy failed! Try to select and copy manually.": "¡Copia fallida! Intente seleccionar y copiar manualmente.",
"Currently Shared With Devices": "Actualmente Compartida con los Dispositivos",
"Copy failed! Try to select and copy manually.": "¡Copia fallida! Intenta seleccionar y copiar manualmente.",
"Currently Shared With Devices": "Actualmente compartida con",
"Custom Range": "Rango personalizado",
"Danger!": "¡Peligro!",
"Database Location": "Ubicación de la base de datos",
"Debug": "Depurar",
"Debugging Facilities": "Servicios de depuración",
"Default": "Predeterminado",
"Default Configuration": "Configuración Predeterminada",
"Default Configuration": "Configuración predeterminada",
"Default Device": "Dispositivo Predeterminado",
"Default Folder": "Carpeta Predeterminada",
"Default Ignore Patterns": "Ignorar patrones por defecto",
"Defaults": "Valores Predeterminados",
"Delete": "Borrar",
"Delete Unexpected Items": "Borrar Elementos Inesperados",
"Default Ignore Patterns": "Ignorar patrones predeterminados",
"Defaults": "Valores predeterminados",
"Delete": "Eliminar",
"Delete Unexpected Items": "Eliminar Elementos Inesperados",
"Deleted {%file%}": "Eliminado {{file}}",
"Deselect All": "Deseleccionar Todo",
"Deselect devices to stop sharing this folder with.": "Deseleccionar dispositivos con los cuales dejar de compartir esta carpeta.",
"Deselect folders to stop sharing with this device.": "Deseleccionar carpetas para dejar de compartir con este dispositivo.",
"Deselect All": "Deseleccionar todo",
"Deselect devices to stop sharing this folder with.": "Deselecciona dispositivos para dejar de compartir esta carpeta.",
"Deselect folders to stop sharing with this device.": "Deselecciona carpetas para dejar de compartir con este dispositivo.",
"Device": "Dispositivo",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "El dispositivo \"{{name}}\" ({{device}} en la dirección {{address}}) quiere conectarse. Añadir nuevo dispositivo?",
"Device Certificate": "Certificado del dispositivo",
"Device ID": "ID del Dispositivo",
"Device Identification": "Identificación del Dispositivo",
"Device Name": "Nombre del Dispositivo",
"Device Group": "Grupo dispositivo",
"Device ID": "ID del dispositivo",
"Device Identification": "Identificador del Dispositivo",
"Device Name": "Nombre del dispositivo",
"Device Status": "Estado del dispositivo",
"Device is untrusted, enter encryption password": "El dispositivo no es de confianza, introduzca la contraseña de cifrado",
"Device is untrusted, enter encryption password": "El dispositivo no es de confianza, introduce la contraseña de cifrado",
"Device rate limits": "Límites de velocidad del dispositivo",
"Device that last modified the item": "Dispositivo que modificó por última vez el ítem",
"Devices": "Dispositivos",
"Disable Crash Reporting": "Desactivar Informes de Fallos",
"Disable Crash Reporting": "Desactivar informes de fallos",
"Disabled": "Deshabilitado",
"Disabled periodic scanning and disabled watching for changes": "Se desactivó el escaneo periódico y se desactivó el control de cambios",
"Disabled periodic scanning and enabled watching for changes": "Se desactivó el escaneo periódico y se activó el control de cambios",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Se desactivó el escaneo periódico y falló la configuración para detectar cambios, volviendo a intentarlo cada 1 m:",
"Disabled periodic scanning and disabled watching for changes": "Escaneo periódico desactivado y control de cambios desactivado",
"Disabled periodic scanning and enabled watching for changes": "Escaneo periódico desactivado y control de cambios activado",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Escaneo periódico desactivado y fallo en la detección de cambios, reintentando cada 1m:",
"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).": "Desactiva la comparación y sincronización de los permisos de los archivos. Útil en sistemas con permisos inexistentes o personalizados (por ejemplo, FAT, exFAT, Synology, Android).",
"Discard": "Descartar",
"Disconnected": "Desconectado",
@@ -116,137 +121,141 @@
"Disconnected (Unused)": "Desconectado (Sin Uso)",
"Discovered": "Descubierto",
"Discovery": "Descubrimiento",
"Discovery Failures": "Fallos de Descubrimiento",
"Discovery Status": "Estado de Descubrimiento",
"Discovery Failures": "Fallos de descubrimiento",
"Discovery Status": "Estado de descubrimiento",
"Dismiss": "Descartar",
"Do not add it to the ignore list, so this notification may recur.": "No agregarlo a la lista de ignorados, de modo que esta notificación sea recurrente.",
"Do not add it to the ignore list, so this notification may recur.": "No añadirlo a la lista de ignorados, de modo que esta notificación sea recurrente.",
"Do not restore": "No restaurar",
"Do not restore all": "No restaurar todos",
"Do you want to enable watching for changes for all your folders?": "¿Deseas activar el control de cambios en todas tus carpetas?",
"Do you want to enable watching for changes for all your folders?": "¿Quieres activar el control de cambios en todas tus carpetas?",
"Documentation": "Documentación",
"Download Rate": "Velocidad de descarga",
"Downloaded": "Descargado",
"Downloading": "Descargando",
"Edit": "Editar",
"Edit Device": "Editar Dispositivo",
"Edit Device Defaults": "Editar Valores Predeterminados del Dispositivo",
"Edit Device Defaults": "Editar valores predeterminados del dispositivo",
"Edit Folder": "Editar Carpeta",
"Edit Folder Defaults": "Editar Valores Predeterminados de las Carpeta",
"Edit Folder Defaults": "Editar valores predeterminados de las carpeta",
"Editing {%path%}.": "Editando {{path}}.",
"Enable Crash Reporting": "Activar Informes de Fallos",
"Enable Crash Reporting": "Activar informes de fallos",
"Enable NAT traversal": "Permitir NAT transversal",
"Enable Relaying": "Habilitar Retransmisión",
"Enable Relaying": "Habilitar retransmisión",
"Enabled": "Activado",
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Permite enviar atributos ampliados a otros dispositivos y aplicar atributos ampliados entrantes. Puede ser necesario ejecutarlo con privilegios elevados.",
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Permite enviar atributos ampliados a otros dispositivos, pero no aplicar los atributos ampliados entrantes. Esto puede tener un impacto significativo en el rendimiento. Siempre se activa cuando \"Sincronizar atributos extendidos\" está activado.",
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Hace que la información de propiedad se envíe a otros dispositivos y que se aplique la información de propiedad recibida. Por lo general, requiere ejecutarse con privilegios elevados.",
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Permite enviar información de propiedad a otros dispositivos, pero no aplicar la información de propiedad entrante. Esto puede tener un impacto significativo en el rendimiento. Siempre se activa cuando \"Sincronizar propiedad\" está activado.",
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Permite enviar atributos extendidos a otros dispositivos y aplicar atributos extendidos entrantes. Puede ser necesaria la ejecución con privilegios elevados.",
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Permite enviar atributos extendidos a otros dispositivos, pero no aplica los atributos extendidos entrantes. Puede tener impacto en el rendimiento. Siempre se habilita cuando \"Sincronizar atributos extendidos\" está habilitado.",
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Permite enviar información de propietario a otros dispositivos y que se aplique la información de propietario recibida. Puede ser necesaria la ejecución con privilegios elevados.",
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Permite enviar información de propietario a otros dispositivos, pero no aplicar la información de propiedad entrante. Puede tener impacto en el rendimiento. Siempre se habilita cuando \"Sincronizar propietario\" está habilitado.",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Introduce un número no negativo (por ejemplo, \"2.35\") y selecciona una unidad. Los porcentajes son como parte del tamaño total del disco.",
"Enter a non-privileged port number (1024 - 65535).": "Introduce un puerto sin privilegios (1024 - 65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Introduzca direcciones separadas por comas (\"tcp://ip:port\", \"tcp://host:port\") o \"dynamic\" para realizar el descubrimiento automático de la dirección.",
"Enter ignore patterns, one per line.": "Introducir patrones a ignorar, uno por línea.",
"Enter up to three octal digits.": "Introduzca hasta tres dígitos octales.",
"Error": "Fallo",
"Extended Attributes": "Atributos ampliados",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Introduce direcciones separadas por comas (\"tcp://ip:port\", \"tcp://host:port\") o \"dynamic\" para realizar el descubrimiento automático de la dirección.",
"Enter ignore patterns, one per line.": "Introduce patrones a ignorar, uno por línea.",
"Enter up to three octal digits.": "Introduce hasta tres dígitos octales.",
"Error": "Error",
"Extended Attributes": "Atributos extendidos",
"Extended Attributes Filter": "Filtro de atributos extendidos",
"External": "Externo",
"External File Versioning": "Versionado externo de fichero",
"External File Versioning": "Externo",
"Failed Items": "Elementos fallidos",
"Failed to load file versions.": "Error al cargar las versiones de los archivos.",
"Failed to load ignore patterns.": "No se pudieron cargar los patrones de ignorar.",
"Failed to load ignore patterns.": "No se pudieron cargar los patrones a ignorar.",
"Failed to set up, retrying": "Fallo en la configuración, reintentando",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "Se espera un fallo al conectar a los servidores IPv6 si no hay conectividad IPv6.",
"File Pull Order": "Orden de Obtención de los Archivos",
"File Versioning": "Versionado de ficheros",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Los ficheros son movidos a la carpeta .stversions cuando son reemplazados o borrados por Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Los ficheros son movidos a una carpeta .stversions a versiones con control de fecha cuando son reemplazados o borrados por Syncthing.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Los ficheros son protegidos por los cambios hechos en otros dispositivos, pero los cambios hechos en este dispositivo serán enviados al resto del grupo (cluster).",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Los archivos se sincronizan desde el clúster, pero los cambios realizados localmente no se enviarán a otros dispositivos.",
"Filesystem Watcher Errors": "Errores del Vigilante del Sistema de Archivos",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "Se espera que la conexión a servidores IPv6 falle si no hay conectividad IPv6.",
"File Pull Order": "Orden de descarga",
"File Versioning": "Versionado de archivos",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Los archivos son movidos al directorio .stversions cuando son reemplazados o eliminados por Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Los archivos son movidos a versiones con fecha en el directorio .stversions cuando son reemplazados o eliminados por Syncthing.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Los archivos están protegidos de cambios en los otros dispositivos, pero los cambios en este dispositivo se enviarán al resto.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Los archivos se sincronizan desde los otros dispositivos, pero los cambios locales no se enviarán a estos.",
"Filesystem Watcher Errors": "Errores del watcher del sistema de archivos",
"Filter by date": "Filtrar por fecha",
"Filter by name": "Filtrar por nombre",
"Folder": "Carpeta",
"Folder ID": "ID de carpeta",
"Folder Label": "Etiqueta de la Carpeta",
"Folder Group": "Grupo carpeta",
"Folder ID": "ID de la carpeta",
"Folder Label": "Etiqueta de la carpeta",
"Folder Path": "Ruta de la carpeta",
"Folder Status": "Estado de la carpeta",
"Folder Type": "Tipo de carpeta",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "El tipo de carpeta \"{{receiveEncrypted}}\" solo puede ser establecido al agregar una nueva carpeta.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "El tipo de carpeta \"{{receiveEncrypted}}\" no se puede cambiar después de añadir la carpeta. Es necesario eliminar la carpeta, borrar o descifrar los datos en el disco y volver a añadir la carpeta.",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "El tipo de carpeta \"{{receiveEncrypted}}\" sólo puede ser seleccionado al añadir una nueva carpeta.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "El tipo de carpeta \"{{receiveEncrypted}}\" no se puede cambiar después de añadir la carpeta. Es necesario eliminar la carpeta, eliminar o descifrar los datos en el disco y volver a añadir la carpeta.",
"Folders": "Carpetas",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "En las siguientes carpetas se ha producido un error al empezar a buscar cambios. Se volverá a intentar cada minuto, por lo que los errores podrían solucionarse pronto. Si persisten, trata de arreglar el problema subyacente y pide ayuda si no puedes.",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Se ha producido un error al comenzar a buscar cambios para las siguientes carpetas. Se hará un reintento cada minuto, por lo que los errores podrían desaparecer pronto. Si persisten trata de arreglar el problema subyacente o pide ayuda.",
"Forever": "Para siempre",
"Full Rescan Interval (s)": "Intervalo de rescaneo completo (s)",
"GUI": "Interfaz gráfica del usuario",
"Full Rescan Interval (s)": "Intervalo reescaneo completo",
"GUI": "Interfaz gráfica",
"GUI / API HTTPS Certificate": "Certificado HTTPS GUI / API",
"GUI Authentication Password": "Contraseña de la Interfaz Gráfica de Usuario (GUI)",
"GUI Authentication User": "Autentificación de usuario de la Interfaz Gráfica de Usuario (GUI)",
"GUI Authentication: Set User and Password": "Autenticación de la GUI: Establezca el Usuario y Contraseña",
"GUI Listen Address": "Dirección de la interfaz de usuario",
"GUI Authentication Password": "Contraseña de la interfaz gráfica",
"GUI Authentication User": "Usuario de la interfaz gráfica",
"GUI Authentication: Set User and Password": "Autenticación GUI: configura usuario y contraseña",
"GUI Listen Address": "Dirección de la interfaz gráfica",
"GUI Override Directory": "Directorio de reemplazo de GUI",
"GUI Theme": "Tema GUI",
"GUI Theme": "Tema de la interfaz gráfica",
"General": "General",
"Generate": "Generar",
"Global Discovery": "Descubrimiento global",
"Global Discovery Servers": "Servidores Globales de Descubrimiento",
"Global Discovery Servers": "Servidores globales de descubrimiento",
"Global State": "Estado global",
"Help": "Ayuda",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Sugerencia: solo se detectan reglas de denegación mientras que el valor predeterminado es denegar. Considere agregar \"permitir cualquiera\" como última regla.",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Sugerencia: sólo se detectan reglas para denegar y el valor predeterminado es denegar. Considera añadir \"permitir cualquiera\" como última regla.",
"Home page": "Página de inicio",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Sin embargo, su configuración actual indica que puede no quererla activa. Hemos desactivado los informes automáticos de fallos por usted.",
"Identification": "Identificación",
"If untrusted, enter encryption password": "Si no es de confianza, introduzca la contraseña de cifrado",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Si desea evitar que otros usuarios de esta computadora accedan a Syncthing y, a través de él, a sus archivos, considere establecer la autenticación.",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Sin embargo tu configuración actual indica que puedes no querer habilitarlo. Hemos desactivado los informes automáticos de fallos por .",
"Identification": "Identificador",
"If untrusted, enter encryption password": "Si no es de confianza, introduce la contraseña de cifrado",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Si quieres evitar que otros usuarios de este ordenador accedan a Syncthing y a tus archivos a través de él, considera habilitar la autenticación.",
"Ignore": "Ignorar",
"Ignore Patterns": "Patrones a ignorar",
"Ignore Permissions": "Permisos a ignorar",
"Ignore patterns can only be added after the folder is created. If checked, an input field to enter ignore patterns will be presented after saving.": "Los patrones a ignorar solo se pueden agregar luego de que la carpeta sea creada. Cuando se marca, se presentará un campo de entrada para introducir los patrones a ignorar después de guardar.",
"Ignore Permissions": "Ignorar permisos",
"Ignore patterns can only be added after the folder is created. If checked, an input field to enter ignore patterns will be presented after saving.": "Los patrones a ignorar solo se pueden añadir después de que la carpeta sea creada. Cuando se marca, después de guardar se presentará un campo de entrada para introducir los patrones a ignorar.",
"Ignored Devices": "Dispositivos ignorados",
"Ignored Folders": "Carpetas ignoradas",
"Ignored at": "Ignorados en",
"Included Software": "Programas incluidos",
"Incoming Rate Limit (KiB/s)": "Límite de descarga (KiB/s)",
"Incoming Rate Limit (KiB/s)": "Limite tráfico de entrada (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Una configuración incorrecta puede corromper el contenido de la carpeta y poner a Syncthing en un estado inoperante.",
"Incorrect user name or password.": "Nombre de usuario o contraseña incorrectos.",
"Info": "Información",
"Internally used paths:": "Rutas de uso interno:",
"Introduced By": "Introducido por",
"Introduced By": "Presentado por",
"Introducer": "Presentador",
"Introduction": "Introducción",
"Inversion of the given condition (i.e. do not exclude)": "Inversión de la condición dada (por ejemplo, \"no excluir\")",
"Keep Versions": "Mantener versiones",
"Keep Versions": "Versiones a conservar",
"LDAP": "LDAP",
"Largest First": "Más grande primero",
"Largest First": "Mayor tamaño primero",
"Last 30 Days": "Últimos 30 días",
"Last 7 Days": "Últimos 7 días",
"Last Month": "Último mes",
"Last Scan": "Último escaneo",
"Last seen": "Visto por última vez",
"Latest Change": "Último Cambio",
"Latest Change": "Último cambio",
"Learn more": "Saber más",
"Learn more at {%url%}": "Más información en {{url}}",
"Limit": "Límite",
"Listener Failures": "Fallos de Oyente",
"Listener Status": "Estado de Oyente",
"Limit Bandwidth in LAN": "Limitar ancho de banda en LAN",
"Listener Failures": "Fallos del oyente",
"Listener Status": "Estado del oyente",
"Listeners": "Oyentes",
"Loading data...": "Cargando datos...",
"Loading...": "Cargando...",
"Local Additions": "Adiciones Locales",
"Local Additions": "Cambios Locales",
"Local Discovery": "Descubrimiento local",
"Local State": "Estado local",
"Local State (Total)": "Estado Local (Total)",
"Locally Changed Items": "Elementos Cambiados Localmente",
"Local State (Total)": "Estado local (Total)",
"Locally Changed Items": "Cambiados localmente",
"Log": "Registro",
"Log File": "Archivo de registro",
"Log In": "Iniciar sesión",
"Log Out": "Cerrar sesión",
"Log in to see paths information.": "Inicia sesión para ver la información sobre las rutas.",
"Log in to see version information.": "Inicia sesión para ver la información sobre la versión.",
"Log tailing paused. Scroll to the bottom to continue.": "Seguimiento del registro pausado. Desplácese hasta el final para continuar.",
"Log tailing paused. Scroll to the bottom to continue.": "Seguimiento del registro pausado. Desplázate hasta el final para continuar.",
"Login failed, see Syncthing logs for details.": "El inicio de sesión falló, mira los registros de Syncthing para más detalles.",
"Logs": "Registros",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Mantiene un índice de todos los bloques de la carpeta, lo que permite reutilizar bloques de otros archivos al sincronizar cambios. Desactívalo para reducir el tamaño de la base de datos a costa de no poder reutilizar bloques entre archivos.",
"Major Upgrade": "Actualización importante",
"Mass actions": "Acción masiva",
"Maximum Age": "Edad máxima",
"Maximum Age": "Antigüedad máxima",
"Maximum single entry size": "Tamaño máximo de una entrada",
"Maximum total size": "Tamaño máximo total",
"Metadata Only": "Sólo metadatos",
@@ -259,48 +268,50 @@
"Move to top of queue": "Mover al principio de la cola",
"Multi level wildcard (matches multiple directory levels)": "Comodín multinivel (coincide con múltiples niveles de directorio)",
"Never": "Nunca",
"New Device": "Nuevo Dispositivo",
"New Folder": "Nueva Carpeta",
"Newest First": "El más nuevo primero",
"New Device": "Nuevo dispositivo",
"New Folder": "Nueva carpeta",
"Newest First": "Más reciente primero",
"No": "No",
"No File Versioning": "Sin versionado de fichero",
"No File Versioning": "Sin versionado de archivos",
"No files will be deleted as a result of this operation.": "Ningún archivo será eliminado como resultado de esta operación.",
"No rules set": "No se han fijado normas",
"No upgrades": "Sin actualizaciones",
"Not shared": "No Compartido(a)",
"Not shared": "No compartida",
"Notice": "Aviso",
"Number of Connections": "Número de conexiones",
"OK": "De acuerdo",
"Off": "Desactivado",
"Oldest First": "El más antiguo primero",
"Optional descriptive label for the folder. Can be different on each device.": "Etiqueta descriptiva opcional para la carpeta. Puede ser diferente en cada dispositivo.",
"Oldest First": "Más antiguo primero",
"Optional descriptive label for the folder. Can be different on each device.": "Etiqueta descriptiva opcional de la carpeta. Puede ser diferente en cada dispositivo.",
"Optional group for the device. Can be different on each device.": "Grupo opcional para el dispositivo. Puede ser diferente en cada dispositivo.",
"Optional group for the folder. Can be different on each device.": "Grupo opcional para la carpeta. Puede ser diferente en cada dispositivo.",
"Options": "Opciones",
"Out of Sync": "No sincronizado",
"Out of Sync Items": "Elementos no sincronizados",
"Outgoing Rate Limit (KiB/s)": "Límite de subida (KiB/s)",
"Outgoing Rate Limit (KiB/s)": "Limite tráfico de salida (KiB/s)",
"Override": "Sobreescribir",
"Override Changes": "Anular cambios",
"Ownership": "Propiedad",
"Ownership": "Propietario",
"Password": "Contraseña",
"Path": "Ruta",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Ruta a la carpeta en el dispositivo local. Se creará la carpeta si no existe. El carácter de la tilde (~) se puede utilizar como abreviatura de",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "La ruta donde las versiones deben ser almacenadas (dejar vacío para el directorio .stversions por defecto en la carpeta compartida).",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Ruta de la carpeta en el dispositivo local. Si no existe será creada. El carácter (~) se puede usar como abreviatura de",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Ruta donde almacenar las versiones (deja vacío para usar el directorio predeterminado .stversions en la carpeta compartida).",
"Paths": "Rutas",
"Pause": "Pausar",
"Pause All": "Pausar todo",
"Paused": "Pausado",
"Paused (Unused)": "Pausado(a) (Sin Uso)",
"Paused (Unused)": "Pausado (No usado)",
"Pending changes": "Cambios pendientes",
"Periodic scanning at given interval and disabled watching for changes": "Escaneando periódicamente a un intervalo dado y detección de cambios desactivada",
"Periodic scanning at given interval and enabled watching for changes": "Escaneando periódicamente a un intervalo dado y detección de cambios activada",
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "Escaneando periódicamente a un intervalo dado y falló la configuración para detectar cambios, volviendo a intentarlo cada 1 m:",
"Permanently add it to the ignore list, suppressing further notifications.": "Agregarlo permanentemente a la lista de ignorados, suprimiendo futuras notificaciones.",
"Please consult the release notes before performing a major upgrade.": "Por favor, consultar las notas de la versión antes de realizar una actualización importante.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Por favor, introduzca un Usuario y Contraseña para la Autenticación de la Interfaz de Usuario en el panel de Ajustes.",
"Periodic scanning at given interval and disabled watching for changes": "Escaneo periódico a intervalos, detección de cambios deshabilitada",
"Periodic scanning at given interval and enabled watching for changes": "Escaneo periódico a intervalos, detección de cambios habilitada",
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "Escaneo periódico a intervalos y fallo en la detección de cambios, reintentando cada 1m:",
"Permanently add it to the ignore list, suppressing further notifications.": "Añadirlo permanentemente a la lista de ignorados, suprimiendo futuras notificaciones.",
"Please consult the release notes before performing a major upgrade.": "Por favor, consulta las notas de la versión antes de realizar una actualización importante.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Por favor, introduce un usuario y contraseña para la autenticación de la interfaz gráfica en Ajustes.",
"Please wait": "Por favor, espere",
"Prefix indicating that the file can be deleted if preventing directory removal": "Prefijo que indica que el archivo puede ser eliminado si se impide el borrado del directorio",
"Prefix indicating that the file can be deleted if preventing directory removal": "Prefijo que indica que el archivo puede ser eliminado si se impide eliminar el directorio",
"Prefix indicating that the pattern should be matched without case sensitivity": "Prefijo que indica que el patrón debe coincidir sin distinguir mayúsculas de minúsculas",
"Preparing to Sync": "Preparándose para Sincronizar",
"Preparing to Sync": "Preparando Sincronización",
"Preview": "Vista previa",
"Preview Usage Report": "Previsualizar el Informe de Uso",
"QR code": "Código QR",
@@ -309,22 +320,22 @@
"Quick guide to supported patterns": "Guía rápida de patrones soportados",
"Random": "Aleatorio",
"Receive Encrypted": "Recibir Encriptado",
"Receive Only": "Solo Recibir",
"Receive Only": "Sólo Recibir",
"Received data is already encrypted": "Los datos recibidos ya están cifrados",
"Recent Changes": "Cambios recientes",
"Reduced by ignore patterns": "Reducido por patrones de ignorar",
"Reduced by ignore patterns": "Reducido por patrones a ignorar",
"Relay LAN": "Relé LAN",
"Relay WAN": "Relé WAN",
"Release Notes": "Notas de la versión",
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "Las versiones candidatas contienen las últimas funcionalidades y correcciones. Son similares a las tradicionales versiones bisemanales de Syncthing.",
"Remote Devices": "Otros dispositivos",
"Remote GUI": "GUI Remota",
"Remote Devices": "Dispositivos Remotos",
"Remote GUI": "GUI remota",
"Remove": "Eliminar",
"Remove Device": "Eliminar dispositivo",
"Remove Folder": "Remover carpeta",
"Required identifier for the folder. Must be the same on all cluster devices.": "Identificador requerido para la carpeta. Debe ser el mismo en todos los dispositivos del clúster.",
"Rescan": "Volver a analizar",
"Rescan All": "Volver a analizar Todo",
"Required identifier for the folder. Must be the same on all cluster devices.": "Identificador requerido de la carpeta. Debe ser el mismo en todos los dispositivos del clúster.",
"Rescan": "Reescanear",
"Rescan All": "Reescanear todo",
"Rescans": "Reescaneos",
"Restart": "Reiniciar",
"Restart Needed": "Reinicio necesario",
@@ -335,150 +346,151 @@
"Resume All": "Continuar todo",
"Reused": "Reutilizado",
"Revert": "Revertir",
"Revert Local Changes": "Revertir Cambios Locales",
"Revert Local Changes": "Revertir cambios locales",
"Save": "Guardar",
"Saving changes": "Guardar los cambios",
"Scan Time Remaining": "Tiempo Restante de Escaneo",
"Scanning": "Analizando",
"See external versioning help for supported templated command line parameters.": "Vea la ayuda del gestor de versiones externo para los parámetros de linea de comandos que usan una plantilla.",
"Select All": "Seleccionar Todo",
"Scan Time Remaining": "Tiempo restante de escaneo",
"Scanning": "Escaneando",
"See external versioning help for supported templated command line parameters.": "Ve a la ayuda del gestor de versiones externo para las parámetros de linea de comandos compatibles.",
"Select All": "Seleccionar todo",
"Select a version": "Seleccione una versión",
"Select additional devices to share this folder with.": "Seleccionar dispositivos adicionales con los cuales compartir esta carpeta.",
"Select additional folders to share with this device.": "Seleccionar carpetas adicionales para compartir con este dispositivo.",
"Select latest version": "Seleccione la última versión",
"Select oldest version": "Seleccione la versión más antigua",
"Select additional devices to share this folder with.": "Selecciona dispositivos adicionales para compartir esta carpeta.",
"Select additional folders to share with this device.": "Selecciona carpetas adicionales para compartir con este dispositivo.",
"Select latest version": "Selecciona la última versión",
"Select oldest version": "Selecciona la versión más antigua",
"Send & Receive": "Enviar y Recibir",
"Send Extended Attributes": "Enviar atributos extendidos",
"Send Only": "Solo Enviar",
"Send Ownership": "Enviar Titularidad",
"Set Ignores on Added Folder": "Establecer Ignorados en Carpeta Agregada",
"Send Only": "Sólo Enviar",
"Send Ownership": "Enviar propietario",
"Set Ignores on Added Folder": "Establecer ignorados en carpeta añadida",
"Settings": "Ajustes",
"Share": "Compartir",
"Share Folder": "Compartir carpeta",
"Share by Email": "Compartir por correo electrónico",
"Share by Email": "Compartir por email",
"Share by SMS": "Compartir por SMS",
"Share this folder?": "¿Deseas compartir esta carpeta?",
"Shared Folders": "Carpetas Compartidas",
"Shared With": "Compartir con",
"Sharing": "Compartiendo",
"Share this folder?": "¿Quieres compartir esta carpeta?",
"Shared Folders": "Carpetas compartidas",
"Shared With": "Compartida con",
"Sharing": "Compartir",
"Show ID": "Mostrar ID",
"Show QR": "Mostrar QR",
"Show detailed discovery status": "Mostrar estado de descubrimiento detallado",
"Show detailed listener status": "Mostrar estado de oyente detallado",
"Show diff with previous version": "Mostrar la diferencia con la versión anterior",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Se muestra en lugar del ID del dispositivo en el estado del grupo (cluster). Se notificará a los otros dispositivos como nombre opcional por defecto.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Se muestra en lugar del ID del dispositivo en el estado del grupo (cluster). Se actualizará al nombre que el dispositivo anuncia si se deja vacío.",
"Show diff with previous version": "Mostrar diferencias con la versión anterior",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Se muestra en lugar del ID del dispositivo en el estado del grupo (cluster). Se notificará a los otros dispositivos como nombre opcional predeterminado.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Sustituye al ID del dispositivo en el estado del grupo (cluster). Si se deja vacío se usará el nombre que anuncia el dispositivo.",
"Shut Down": "Apagar",
"Shutdown Complete": "Apagar completamente",
"Simple": "Sencillo",
"Simple File Versioning": "Versionado simple de fichero",
"Simple": "Simple",
"Simple File Versioning": "Simple",
"Single level wildcard (matches within a directory only)": "Comodín de nivel único (coincide solamente dentro de un directorio)",
"Size": "Tamaño",
"Smallest First": "El más pequeño primero",
"Smallest First": "Menor tamaño primero",
"Some discovery methods could not be established for finding other devices or announcing this device:": "No se han podido establecer algunos métodos de descubrimiento para encontrar otros dispositivos o para anunciar este dispositivo:",
"Some items could not be restored:": "Algunos ítemes no pudieron ser restaurados:",
"Some listening addresses could not be enabled to accept connections:": "Algunas direcciones de escucha no pudieron ser activadas para aceptar conexiones:",
"Some items could not be restored:": "Algunos elementos no pudieron ser restaurados:",
"Some listening addresses could not be enabled to accept connections:": "Algunas direcciones de escucha no pudieron activarse para aceptar conexiones:",
"Source Code": "Código fuente",
"Stable releases and release candidates": "Versiones estables y versiones candidatas",
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.": "Las versiones estables son publicadas cada dos semanas. Durante este tiempo son probadas como versiones candidatas.",
"Stable releases only": "Solo versiones estables",
"Staggered": "Gradual",
"Staggered File Versioning": "Versionado escalonado de fichero",
"Start Browser": "Iniciar el navegador",
"Staggered File Versioning": "Escalonado",
"Start Browser": "Iniciar en navegador",
"Starting": "Iniciando",
"Statistics": "Estadísticas",
"Stay logged in": "Permanecer conectado",
"Stopped": "Detenido",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Almacena y sincroniza sólo los datos cifrados. Las carpetas de todos los dispositivos conectados deben estar configuradas con la misma contraseña o ser también del tipo \"{{receiveEncrypted}}\".",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Sólo almacena y sincroniza datos cifrados. Las carpetas de todos los dispositivos conectados deben estar configuradas con la misma contraseña o ser del tipo \"{{receiveEncrypted}}\".",
"Subject:": "Asunto:",
"Support": "Forum",
"Support Bundle": "Paquete de Soporte",
"Sync Extended Attributes": "Atributos ampliados de sincronización",
"Sync Ownership": "Sincronizar la información de la propiedad",
"Support": "Soporte",
"Support Bundle": "Paquete de soporte",
"Sync Extended Attributes": "Sincronizar atributos extendidos",
"Sync Ownership": "Sincronizar propietario",
"Sync Protocol Listen Addresses": "Direcciones de escucha del protocolo de sincronización",
"Sync Status": "Estado de la sincronización",
"Syncing": "Sincronizando",
"Syncthing device ID for \"{%devicename%}\"": "ID del dispositivo de sincronización para \"{{devicename}}\"",
"Syncthing has been shut down.": "Syncthing se ha detenido.",
"Syncthing includes the following software or portions thereof:": "Syncthing incluye el siguiente software o partes de él:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing es Software Libre y de Código Abierto con licencia MPL v2.0.",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing es software libre de código abierto con licencia MPL v2.0.",
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing es una aplicación para la sincronización continua de archivos. Sincroniza archivos entre dos o más computadoras en tiempo real, con protección contra miradas indiscretas. Tus datos son solo tuyos y mereces elegir dónde se almacenan, si se comparten con terceros y cómo se transmiten a través de Internet.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing está a la escucha en las siguientes direcciones de red en busca de intentos de conexión de otros dispositivos:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing no está a la escucha de intentos de conexión de otros dispositivos en ninguna dirección. Solo pueden funcionar las conexiones salientes de este dispositivo.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing está a la escucha en las siguientes direcciones de red en busca de intentos de conexión desde otros dispositivos:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing no está a la escucha de intentos de conexión desde otros dispositivos en ninguna dirección. Solo pueden funcionar las conexiones salientes de este dispositivo.",
"Syncthing is restarting.": "Syncthing se está reiniciando.",
"Syncthing is saving changes.": "La sincronización guarda los cambios.",
"Syncthing is upgrading.": "Syncthing se está actualizando.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing ahora soporta el reportar automáticamente las fallas a los desarrolladores. Esta característica está habilitada por defecto.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing soporta ahora el reporte automático de fallos a los desarrolladores. Esta función está habilitada por defecto.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Parece que la sincronización no funciona o hay un problema con la conexión a Internet. Intentando lo otra vez…",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing tiene problemas para procesar tu solicitud. Por favor, actualiza la página o reinicia Syncthing si el problema persiste.",
"TCP LAN": "TCP LAN",
"TCP WAN": "TCP WAN",
"Take me back": "Llévame de vuelta",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "La dirección de la Interfaz Gráfica de Ususario (GUI) está sobreescrita por las opciones de inicio. Los cambios aquí no tendrán efecto mientras la sobreescritura esté activa.",
"The Syncthing Authors": "Los Autores de Syncthing",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "La dirección de la interfaz gráfica está anulada por las opciones de inicio. Los cambios aquí no tendrán efecto mientras continue la anulación.",
"The Syncthing Authors": "Los autores de Syncthing",
"The Syncthing admin interface is configured to allow remote access without a password.": "El panel de administración de Syncthing está configurado para permitir el acceso remoto sin contraseña.",
"The aggregated statistics are publicly available at the URL below.": "Las estadísticas agragadas están disponibles públicamente en la URL de abajo.",
"The cleanup interval cannot be blank.": "El intervalo de limpieza no puede ser nulo.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configuración ha sido grabada pero no activada. Syncthing debe reiniciarse para activar la nueva configuración.",
"The device ID cannot be blank.": "La ID del dispositivo no puede estar vacía.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "El ID del dispositivo que hay que introducir aquí se puede encontrar en el diálogo \"Acciones > Mostrar ID\" en el otro dispositivo. Los espacios y las barras son opcionales (ignorados).",
"The cleanup interval cannot be blank.": "El intervalo de limpieza no puede estar vacío.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "La configuración ha sido guardada pero no activada. Syncthing debe reiniciarse para activar la nueva configuración.",
"The device ID cannot be blank.": "El ID del dispositivo no puede estar vacío.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "El ID del dispositivo a introducir aquí se puede encontrar en el diálogo \"Acciones > Mostrar ID\" del otro dispositivo. Los espacios y barras son opcionales (ignorados).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "El informe encriptado de uso se envía diariamente. Se usa para rastrear plataformas comunes, tamaños de carpetas y versiones de la aplicación. Si el conjunto de datos enviados en el informes se cambia, se le pedirá a usted autorización de nuevo.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "La ID del dispositivo introducida no parece válida. Debe ser una cadena de 52 ó 56 caracteres formada por letras y números, con espacios y guiones opcionales.",
"The folder ID cannot be blank.": "La ID de la carpeta no puede estar vacía.",
"The folder ID must be unique.": "La ID de la carpeta debe ser única.",
"The folder content on other devices will be overwritten to become identical with this device. Files not present here will be deleted on other devices.": "El contenido de las carpetas de otros dispositivos será sobreescritos para que sea idéntico al de este dispositivo. Archivos no presentes aquí serán eliminados de otros dispositivos.",
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.": "El contenido de las carpetas en este dispositivo será sobreescrito para ser idéntico al de otros dispositivos. Los archivos que se agreguen aquí se eliminarán.",
"The folder path cannot be blank.": "La ruta de la carpeta no puede estar en blanco.",
"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.": "Se utilizan los siguientes intervalos: para la primera hora se mantiene una versión cada 30 segundos, para el primer día se mantiene una versión cada hora, para los primeros 30 días se mantiene una versión diaria hasta la edad máxima de una semana.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "El ID del dispositivo introducido no parece válido. Debe ser una cadena de 52 ó 56 caracteres formada por letras y números, con espacios y guiones opcionales.",
"The folder ID cannot be blank.": "El ID de la carpeta no puede estar vacío.",
"The folder ID must be unique.": "El ID de la carpeta debe ser único.",
"The folder content on other devices will be overwritten to become identical with this device. Files not present here will be deleted on other devices.": "El contenido de la carpeta en el resto de dispositivos será sobreescritos para que sea idéntico al de este dispositivo. Los archivos no presentes aquí serán eliminados de los otros dispositivos.",
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.": "El contenido de la carpeta en este dispositivo será sobreescrito para que sea idéntico al resto de dispositivos. Los archivos añadidos localmente serán eliminados.",
"The folder path cannot be blank.": "La ruta de la carpeta no puede estar vacía.",
"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.": "Se usan los siguientes intervalos: durante la primera hora se conserva una versión cada 30 segundos, durante el primer día se conserva una versión cada hora, durante los primeros 30 días se conserva una versión cada día, y hasta alcanzar la antigüedad máxima se conserva una versión por semana.",
"The following items could not be synchronized.": "Los siguientes elementos no pueden ser sincronizados.",
"The following items were changed locally.": "Los siguientes elementos fueron cambiados localmente.",
"The following methods are used to discover other devices on the network and announce this device to be found by others:": "Los siguientes métodos son usados para descubrir otros dispositivos en la red y anunciar este dispositivo para que sea encontrado por otros:",
"The following text will automatically be inserted into a new message.": "El siguiente texto se insertará automáticamente en un nuevo mensaje.",
"The following unexpected items were found.": "Los siguientes elementos inesperados fueron encontrados.",
"The interval must be a positive number of seconds.": "El intervalo debe ser un número de segundos positivo.",
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "El intervalo, en segundos, para ejecutar la limpieza del directorio de versiones. Cero para desactivar la limpieza periódica.",
"The maximum age must be a number and cannot be blank.": "La edad máxima debe ser un número y no puede estar vacía.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "El tiempo máximo para mantener una versión en días (introducir 0 para mantener las versiones indefinidamente).",
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Intervalo en segundos para ejecutar la limpieza del directorio de versiones. Cero desactiva la limpieza periódica.",
"The maximum age must be a number and cannot be blank.": "La antigüedad máxima debe ser un número y no puede estar vacía.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Tiempo máximo en días para conservar una versión. Cero significa indefinidamente.",
"The number of connections must be a non-negative number.": "El número de las conexiones debe ser un número que no sea negativo.",
"The number of days must be a number and cannot be blank.": "El número de días debe ser un número y no puede estar en blanco.",
"The number of days to keep files in the trash can. Zero means forever.": "El número de días para mantener los archivos en la papelera. Cero significa \"para siempre\".",
"The number of old versions to keep, per file.": "El número de versiones a antiguas a mantener para cada fichero.",
"The number of days must be a number and cannot be blank.": "El número de días debe ser un número y no puede estar vacío.",
"The number of days to keep files in the trash can. Zero means forever.": "Número de días para conservar los archivos en la papelera. Cero significa indefinidamente.",
"The number of old versions to keep, per file.": "Número de versiones antiguas a conservar por cada archivo.",
"The number of versions must be a number and cannot be blank.": "El número de versiones debe ser un número y no puede estar vacío.",
"The path cannot be blank.": "La ruta no puede estar vacía.",
"The rate limit is applied to the accumulated traffic of all connections to this device.": "El límite de velocidad se aplica al tráfico acumulado de todas las conexiones a este dispositivo.",
"The rate limit must be a non-negative number (0: no limit)": "El límite de velocidad debe ser un número no negativo (0: sin límite)",
"The remote device has not accepted sharing this folder.": "El dispositivo remoto no ha aceptado compartir esta carpeta.",
"The remote device has paused this folder.": "El dispositivo remoto ha puesto en pausa esta carpeta.",
"The rescan interval must be a non-negative number of seconds.": "El intervalo de actualización debe ser un número positivo de segundos.",
"There are no devices to share this folder with.": "No hay dispositivos con los cuales compartir esta carpeta.",
"The rescan interval must be a non-negative number of seconds.": "El intervalo de reescaneo debe ser un número positivo de segundos.",
"There are no devices to share this folder with.": "No hay dispositivos con los que compartir esta carpeta.",
"There are no file versions to restore.": "No hay versiones de archivos para restaurar.",
"There are no folders to share with this device.": "No hay carpetas para compartir con este dispositivo.",
"They are retried automatically and will be synced when the error is resolved.": "Se reintentarán de forma automática y se sincronizarán cuando se resuelva el error.",
"This Device": "Este Dispositivo",
"This Month": "Este mes",
"This can easily give hackers access to read and change any files on your computer.": "Esto podría permitir fácilmente el acceso a hackers para leer y modificar cualquier fichero de tu equipo.",
"This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "Este dispositivo no puede descubrir automáticamente a otros dispositivos o anunciar su propia dirección para que sea encontrado con otros. Solo dispositivos con direcciones configuradas como estáticas pueden conectarse.",
"This can easily give hackers access to read and change any files on your computer.": "Esto podría permitir fácilmente el acceso a hackers para leer y modificar cualquier archivo de tu equipo.",
"This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "Este dispositivo no puede descubrir automáticamente a otros dispositivos o anunciar su propia dirección para que sea descubierto por otros. Solo dispositivos con direcciones estáticas configuradas pueden conectarse.",
"This is a major version upgrade.": "Hay una actualización importante.",
"This setting controls the free space required on the home (i.e., index database) disk.": "Este ajuste controla el espacio libre necesario en el disco principal (por ejemplo, el índice de la base de datos).",
"This setting controls the free space required on the home (i.e., index database) disk.": "Determina el espacio libre necesario en el disco principal (con la. base de datos de índices).",
"Time": "Hora",
"Time the item was last modified": "Hora en que el ítem fue modificado por última vez",
"Time the item was last modified": "Hora de última modificación del elemento",
"To connect with the Syncthing device named \"{%devicename%}\", add a new remote device on your end with this ID:": "Para conectarse con el dispositivo Syncthing llamado \"{{devicename}}\", añada un nuevo dispositivo remoto en su extremo con este ID:",
"To permit a rule, have the checkbox checked. To deny a rule, leave it unchecked.": "Para permitir una regla, marque la casilla. Para denegar una regla, déjela sin marcar.",
"To permit a rule, have the checkbox checked. To deny a rule, leave it unchecked.": "Para permitir una regla, marca la casilla. Para denegar una regla, déjala sin marcar.",
"Today": "Hoy",
"Trash Can": "Papelera",
"Trash Can File Versioning": "Versionado de archivos de la papelera",
"Trash Can File Versioning": "Papelera",
"Type": "Tipo",
"UNIX Permissions": "Permisos de UNIX",
"Unavailable": "No disponible",
"Unavailable/Disabled by administrator or maintainer": "No disponible/Deshabilitado por el administrador o mantenedor",
"Undecided (will prompt)": "No decidido (se preguntará)",
"Unexpected Items": "Elementos Inesperados",
"Unexpected items have been found in this folder.": "Se han encontrado Elementos Inesperados en esta carpeta.",
"Unexpected Items": "Elementos inesperados",
"Unexpected items have been found in this folder.": "Se han encontrado elementos inesperados en esta carpeta.",
"Unignore": "Dejar de ignorar",
"Unknown": "Desconocido",
"Unshared": "No compartido",
"Unshared Devices": "Dispositivos no Enlazados",
"Unshared Folders": "Carpetas no Compartidas",
"Untrusted": "No Confiable",
"Unshared Devices": "No compartida con",
"Unshared Folders": "Carpetas no compartidas",
"Untrusted": "No confiable",
"Up to Date": "Actualizado",
"Updated {%file%}": "Actualizado {{file}}",
"Upgrade": "Actualizar",
@@ -487,11 +499,11 @@
"Upload Rate": "Velocidad de subida",
"Uptime": "Tiempo de funcionamiento",
"Usage reporting is always enabled for candidate releases.": "El informe de uso está siempre habilitado en las versiones candidatas.",
"Use HTTPS for GUI": "Usar HTTPS para la Interfaz Gráfica de Usuario (GUI)",
"Use notifications from the filesystem to detect changed items.": "Usar notificaciones del sistema de archivos para detectar elementos cambiados.",
"Use HTTPS for GUI": "Usar HTTPS para la interfaz gráfica",
"Use notifications from the filesystem to detect changed items.": "Usa las notificaciones del sistema de archivos para detectar elementos cambiados.",
"User": "Usuario",
"User Home": "Carpeta de inicio del usuario",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "No se ha configurado el nombre de usuario/la contraseña para la autenticación de la GUI. Por favor, considere configurarlos.",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "No se ha configurado el nombre de usuario/la contraseña para la autenticación de la GUI. Por favor, considera configurarlos.",
"Using a QUIC connection over LAN": "Usando una conexión QUIC a través de una LAN",
"Using a QUIC connection over WAN": "Usando una conexión QUIC a través de una WAN",
"Using a direct TCP connection over LAN": "Utilizar una conexión TCP directa a través de LAN",
@@ -499,44 +511,44 @@
"Version": "Versión",
"Versions": "Versiones",
"Versions Path": "Ruta de las versiones",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Las versiones se borran automáticamente si son más antiguas que la edad máxima o exceden el número de ficheros permitidos en un intervalo.",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Las versiones se eliminan automáticamente si son más antiguas que la antigüedad máxima o se excede el número de archivos permitidos en un intervalo.",
"Waiting to Clean": "Esperando para Limpiar",
"Waiting to Scan": "Esperando para Escanear",
"Waiting to Sync": "Esperando para Sincronizar",
"Warning": "Advertencia",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "¡Peligro! Esta ruta es un directorio principal de la carpeta ya existente \"{{otherFolder}}\".",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Advertencia, esta ruta es una carpeta principal de una carpeta existente \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Peligro! Esta ruta es un subdirectorio de una carpeta ya existente llamada \"{{otherFolder}}\".",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Peligro, esta ruta es un subdirectorio de una carpeta ya existente llamada \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "Advertencia: Si estás utilizando un observador externo como {{syncthingInotify}}, debes asegurarte de que está desactivado.",
"Watch for Changes": "Monitorear los cambios",
"Watching for Changes": "Vigilando los cambios",
"Watching for changes discovers most changes without periodic scanning.": "El control de cambios descubre la mayoría de cambios sin el escaneo periódico.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Cuando añada un nuevo dispositivo, tenga en cuenta que este debe añadirse también en el otro lado.",
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Cuando añada una nueva carpeta, tenga en cuenta que su ID se usa para unir carpetas entre dispositivos. Son sensibles a las mayúsculas y deben coincidir exactamente entre todos los dispositivos.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Cuando se configura en más de uno o en ambos dispositivos, Syncthing intentará establecer múltiples conexiones simultáneamente. Si los valores difieren, se utilizará el más alto. Pon cero para que Syncthing decida por ti.",
"Waiting to Scan": "Esperando para escanear",
"Waiting to Sync": "Esperando para sincronizar",
"Warning": "Atención",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "Atención, esta ruta es un directorio principal de la carpeta ya existente \"{{otherFolder}}\".",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Atención, esta ruta es una carpeta principal de una carpeta existente \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Atención, esta ruta es un subdirectorio de una carpeta ya existente llamada \"{{otherFolder}}\".",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Atención, esta ruta es un subdirectorio de una carpeta ya existente llamada \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "Atención: si estás utilizando un observador externo como {{syncthingInotify}}, debes asegurarte de que está desactivado.",
"Watch for Changes": "Detectar cambios",
"Watching for Changes": "Detectando cambios",
"Watching for changes discovers most changes without periodic scanning.": "La detección de cambios descubre la mayoría de cambios sin el escaneo periódico.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Cuando añadas un nuevo dispositivo, ten en cuenta que este debe añadirse también en el otro lado.",
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Cuando añadas una nueva carpeta, ten en cuenta que su ID se usa para unir carpetas entre dispositivos. Son sensibles a las mayúsculas y deben coincidir exactamente entre todos los dispositivos.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Cuando se configura a más de una en ambos dispositivos, Syncthing intentará establecer múltiples conexiones simultáneamente. Si los valores difieren se usará el más alto. Deja a cero para que Syncthing decida.",
"Yes": "Si",
"Yesterday": "Ayer",
"You can also copy and paste the text into a new message manually.": "También puedes copiar y pegar manualmente el texto en un nuevo mensaje.",
"You can also select one of these nearby devices:": "También puede seleccionar uno de estos dispositivos cercanos:",
"You can change your choice at any time in the Settings dialog.": "Puedes cambiar tu elección en cualquier momento en el panel de Ajustes.",
"You can read more about the two release channels at the link below.": "Puedes leer más sobre los dos método de publicación de versiones en el siguiente enlace.",
"You have no ignored devices.": "No tienes dispositivos ignorados.",
"You have no ignored folders.": "No tienes carpetas ignoradas.",
"You have unsaved changes. Do you really want to discard them?": "Tienes cambios sin guardar. ¿Quieres descartarlos realmente?",
"You must keep at least one version.": "Debes mantener al menos una versión.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Nunca debe agregar o cambiar nada localmente en una carpeta \"{{receiveEncrypted}}\".",
"You can read more about the two release channels at the link below.": "Puedes leer más sobre los dos canales de publicación de versiones en el siguiente enlace.",
"You have no ignored devices.": "No hay dispositivos ignorados.",
"You have no ignored folders.": "No hay carpetas ignoradas.",
"You have unsaved changes. Do you really want to discard them?": "Hay cambios sin guardar. ¿Estás seguro de que quieres descartarlos?",
"You must keep at least one version.": "Debes conservar al menos una versión.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Nunca debes añadir o cambiar nada localmente en una carpeta \"{{receiveEncrypted}}\".",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "Tu aplicación de SMS debería abrirse para permitirte elegir el destinatario y enviarlo desde tu propio número.",
"Your email app should open to let you choose the recipient and send it from your own address.": "Tu aplicación de correo electrónico debería abrirse para permitirte elegir el destinatario y enviarlo desde tu propia dirección.",
"Your email app should open to let you choose the recipient and send it from your own address.": "Tu aplicación de email debería abrirse para permitirte elegir el destinatario y enviarlo desde tu propia dirección.",
"days": "días",
"deleted": "eliminado",
"deny": "denegar",
"directories": "directorios",
"file": "fichero",
"file": "archivo",
"files": "archivos",
"folder": "carpeta",
"full documentation": "Documentación completa",
"items": "Elementos",
"items": "elementos",
"modified": "modificado",
"permit": "permiso",
"seconds": "segundos",
@@ -551,5 +563,5 @@
"unknown device": "dispositivo desconocido",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} quiere compartir la carpeta \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} quiere compartir la carpeta \"{{folderlabel}}\" ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} puede reintroducir este dispositivo."
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} puede presentar de nuevo este dispositivo."
}
+394 -29
View File
@@ -1,132 +1,497 @@
{
"A device with that ID is already added.": "Sellise tunnusega seade on juba lisatud.",
"A negative number of days doesn't make sense.": "Negatiivne päevade arv ei ole loogiline.",
"A new major version may not be compatible with previous versions.": "Uus põhiversioon ei pruugi ühilduv varasemate versioonidega.",
"API Key": "API võti",
"About": "Rakenduse teave",
"Action": "Tegevus",
"Actions": "Tegevused",
"Active filter rules": "Aktiivsed filtrireeglid",
"Add": "Lisa",
"Add Device": "Lisa seade",
"Add Folder": "Lisa kaust",
"Add Remote Device": "Lisa kaugseade",
"Add devices from the introducer to our device list, for mutually shared folders.": "Ühiselt jagatud kaustade halduseks lisa kokkuviija poolt teadaantud seadmed meie seadmeloendisse.",
"Add filter entry": "Lisa filtrikirje",
"Add ignore patterns": "Lisa eiramismustreid",
"Add new folder?": "Kas lisad uue kausta?",
"Address": "Aadress",
"Addresses": "Aadressid",
"Advanced": "Täiendavad seadistused",
"Advanced Configuration": "Täiendavad seadistused",
"All Data": "Kõik andmed",
"All Time": "Kõik ajad",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Kõik selle seadmega jagatud kaustad peavad olema kaitstud salasõnaga, mis tähendab, et edastatud andmed on ilma salasõnata loetamatud.",
"Allow Anonymous Usage Reporting?": "Kas lubad anonüümset statistikakogumist rakenduse kasutamise kohta?",
"Allowed Networks": "Lubatud võrgud",
"Alphabetic": "Tähestikuline",
"Altered by ignoring deletes.": "Muudetud eirates kustutamisi.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Kui kausta tüüp on „{{foldertype}}“, siis on alati lülitatud sisse.",
"Anonymous Usage Reporting": "Anonüümne aruandlus kasutuse kohta",
"Applied to LAN": "Kehtib kohtvõrgu puhul",
"Apply": "Rakenda",
"Are you sure you want to override all remote changes?": "Kas sa soovid sürjutada kõik eemalt tehtud muudatused?",
"Are you sure you want to permanently delete all these files?": "Kas sa oled kindel, et soovid jäädavalt kõik need failid kustutada?",
"Are you sure you want to remove device {%name%}?": "Kas sa oled kindel, et soovid {{name}} seadme eemaldada?",
"Are you sure you want to remove folder {%label%}?": "Kas sa oled kindel, et soovid {{label}} kausta eemaldada?",
"Are you sure you want to restore {%count%} files?": "Kas sa oled kindel, et soovid {{count}} faili taastada?",
"Are you sure you want to revert all local changes?": "Kas sa oled kindel, et soovid kõik kohalikud muudatused tagasi pöörata?",
"Are you sure you want to upgrade?": "Kas sa oled kindel, et soovid uuendamise ette võtta?",
"Authentication Required": "Autentimine on vajalik",
"Authors": "Autorid",
"Auto Accept": "Nõustu automaatselt",
"Automatic Crash Reporting": "Automaatne teavitus rakenduste kokkujooksmise kohta",
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Automaatsed uuendused võimaldavad nüüd valida stabiilsete versioonide ja kandidaatversioonide vahel.",
"Automatic upgrades": "Automaatsed uuendused",
"Automatic upgrades are always enabled for candidate releases.": "Automaatsed uuendused on kandidaatversioonide puhul alati lubatud.",
"Available debug logging facilities:": "Saadavaolevad logimisklassid veaotsinguteadate logimiseks:",
"Be careful!": "Ettevaatust!",
"Cancel": "Loobu",
"Changelog": "Muudatuste nimekiri",
"Body:": "Kirja sisu:",
"Bugs": "Vead",
"Cancel": "Katkesta",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Kui kausta tüüp on „{{foldertype}}“, siis seda ei saa kasutada.",
"Changelog": "Muudatuste ajalugu",
"Clean out after": "Puhasta peale järgneva aja möödumist",
"Cleaning Versions": "Kustutan versioone",
"Cleanup Interval": "Kustutamise välp",
"Click to see full identification string and QR code.": "Täispikka tunnust ja QR-koodi näed, kui klõpsad siin.",
"Close": "Sulge",
"Command": "Käsk",
"Comment, when used at the start of a line": "Kommentaar, kasutades rea alguses",
"Compression": "Pakkimine",
"Configuration Directory": "Seadistuste kaust",
"Configuration File": "Seadistuste fail",
"Configured": "Seadistatud",
"Connected (Unused)": "Ühendatud (pole kasutusel)",
"Connection Error": "Ühenduse viga",
"Connection Management": "Ühenduste haldus",
"Connection Type": "Ühenduse tüüp",
"Connections": "Ühendused",
"Connections via relays might be rate limited by the relay": "Edastussõlmede kasutamisel võivad kohalduda ühenduse kiiruspiirangud",
"Copied from elsewhere": "Kopeeritud mujalt",
"Copied from original": "Kopeeritud algallikast",
"Copied!": "Kopeeritud!",
"Copy": "Kopeeri",
"Copy failed! Try to select and copy manually.": "Kopeerimine ei õnnestunud! Proovi valida ja kopeerida käsitsi.",
"Currently Shared With Devices": "Hetkel jagatud seadmetega",
"Custom Range": "Sinu valitud vahemik",
"Danger!": "Ohtlik!",
"Database Location": "Andmebaasi asukoht",
"Debug": "Veaotsing",
"Debugging Facilities": "Teadete tüübid veaotsingul",
"Default": "Vaikimisi",
"Default Configuration": "Vaikimisi seadistus",
"Default Device": "Vaikimisi seade",
"Default Folder": "Vaikimisi kaust",
"Default Ignore Patterns": "Vaikimisi eiramismustrid",
"Defaults": "Vaikimisi väärtused",
"Delete": "Kustuta",
"Delete Unexpected Items": "Kustuta mittesoovitud objektid",
"Deleted {%file%}": "Kustutasin {{file}} faili",
"Deselect All": "Eemalda kogu valik",
"Deselect devices to stop sharing this folder with.": "Eemalda seadmed, millega sa enam ei taha seda kausta jagada.",
"Deselect folders to stop sharing with this device.": "Eemalda kaustad, mida sa enam ei taha selle seadmega jagada.",
"Device": "Seade",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Seade \"{{name}}\" ({{device}} aadressil {{address}}) soovib luua ühendust. Kas lisada uus seade?",
"Device ID": "Seadme ID",
"Device Certificate": "Seadme sertifikaat",
"Device ID": "Seadme tunnus",
"Device Identification": "Seadme tuvastamine",
"Device Name": "Seadme nimi",
"Device Status": "Seadme olek",
"Device is untrusted, enter encryption password": "Seadme pole usaldusväärne, palun sisesta krüptimise salasõna",
"Device rate limits": "Seadme kiiruspiirangud",
"Device that last modified the item": "Sead, kus objekt oli viimati muudetud",
"Devices": "Seadmed",
"Disable Crash Reporting": "Lülita rakenduse kokkujooksmisest teavitamine välja",
"Disabled": "Pole kasutusel",
"Disabled periodic scanning and disabled watching for changes": "Regulaarne skaneerimine ja muudatuste jälgimine on lülitatud välja",
"Disabled periodic scanning and enabled watching for changes": "Regulaarne skaneerimine on lülitatud välja ja muudatuste jälgimine on lülitatud sisse",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:": "Regulaarne skaneerimine on lülitatud välja ja muudatuste jälgimise sisselülitamine ei õnnestunud, proovin iga minuti järel uuesti:",
"Discard": "Loobu",
"Disconnected": "Ühendus puudub",
"Disconnected (Inactive)": "Ühendus on katkestatud (pole aktiivne)",
"Disconnected (Unused)": "Ühendus on katkestatud (pole kasutatud)",
"Discovered": "Tuvastatud",
"Discovery": "Avastamine",
"Discovery Failures": "Vead avastamisel",
"Discovery Status": "Avastamise olek",
"Dismiss": "Loobu",
"Do not restore": "Ära taasta",
"Do not restore all": "Ära taasta kõiki",
"Do you want to enable watching for changes for all your folders?": "Kas sa tahad lülitada sisse kõikide oma kaustade muudatuste jälgimise?",
"Documentation": "Dokumentatsioon",
"Download Rate": "Allalaadimise Kiirus",
"Downloaded": "Alla laetud",
"Download Rate": "Allalaadimise kiirus",
"Downloaded": "Allalaaditud",
"Downloading": "Allalaadimine",
"Edit": "Muuda",
"Edit Device": "Muuda Seadet",
"Edit Device": "Muuda seadet",
"Edit Device Defaults": "Muuda seadme vaikeseadistusi",
"Edit Folder": "Muuda Kausta",
"Edit Folder Defaults": "Muuda kaustade vaikimisi seadistusi",
"Editing {%path%}.": "{{path}} muutmine.",
"Enable Crash Reporting": "Võta kasutusele rakenduse kokkujooksmistest teatamine",
"Enable NAT traversal": "Luba NAT traversal",
"Enable Relaying": "Luba edastussõlmede kasutamine",
"Enabled": "Kasutusel",
"Enter a non-privileged port number (1024 - 65535).": "Sisesta pordi number vabast segmendist (1024 - 65535).",
"Enter ignore patterns, one per line.": "Sisesta eiramiste mustrid üks muster ühele reale.",
"Enter up to three octal digits.": "Sisesta kuni kolm kaheksandsüsteemis arvu.",
"Error": "Viga",
"Extended Attributes": "Täiendavad atribuudid/andmed",
"Extended Attributes Filter": "Täiendavate atribuutide/andmete filter",
"External": "Väline",
"External File Versioning": "Väline failide versioonihaldus",
"Failed Items": "Ebaõnnestunud objektid",
"Failed to load file versions.": "Failiversioonide laadimine ei õnnestunud.",
"Failed to load ignore patterns.": "Eiramismustrite laadimine ei õnnestunud.",
"Failed to set up, retrying": "Seadistamine ei õnnestunud, proovin uuesti",
"File Pull Order": "Failide Tirimise Järjekord",
"File Versioning": "Failide versioonihaldus",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Failid liigutatakse asendamisel või kustutamisel .stversions kataloogi.",
"Filesystem Watcher Errors": "Failisüsteemi jälgija vead",
"Filter by date": "Filtreeri kuupäeva alusel",
"Filter by name": "Filtreeri nime alusel",
"Folder": "Kaust",
"Folder ID": "Kausta ID",
"Folder Label": "Kausta Silt",
"Folder Type": "Kausta Tüüp",
"Folder Path": "Kausta asukoht",
"Folder Status": "Kausta olek",
"Folder Type": "Kausta tüüp",
"Folders": "Kaustad",
"Forever": "Igavesti",
"Full Rescan Interval (s)": "Täiemahulise kordusskaneerimise välp (sek)",
"GUI": "Kasutajaliides",
"GUI Authentication Password": "GUI Autentimise Salasõna",
"GUI / API HTTPS Certificate": "GUI / API HTTPS sertifikaat",
"GUI Authentication Password": "Salasõna kasutajaliidese autentimiseks",
"GUI Authentication User": "GUI Autentimise Kasutajatunnus",
"GUI Authentication: Set User and Password": "Kasutajaliidese autentimine: sisesta kasutajanimi ja salasõna",
"GUI Listen Address": "Aadress, mida kasutajaliides kuulab",
"GUI Override Directory": "Kasutajaliidese sürjutamise kaust",
"GUI Theme": "GUI Teema",
"General": "Üldist",
"Generate": "Genereeri",
"Global State": "Globaalne Olek",
"Help": "Abi",
"Global Discovery": "Üldine avastamine",
"Global Discovery Servers": "Üldised tuvastusserverid",
"Global State": "Üldine olek",
"Help": "Abiteave",
"Home page": "Avaleht",
"Identification": "Tunnus",
"If untrusted, enter encryption password": "Kui usaldusväärsus on veel kinnitamata, siis sisesta krüptosalasõna",
"Ignore": "Ignoreeri",
"Ignore Patterns": "Ignoreeri Mustreid",
"Ignore Patterns": "Eira mustreid",
"Ignore Permissions": "Ignoreeri Õigusi",
"Incoming Rate Limit (KiB/s)": "Siseneva Kiiruse Piirang (KiB/s)",
"Ignored Devices": "Eiratud seadmed",
"Ignored Folders": "Eiratud kaustad",
"Ignored at": "Eiratud seadmes",
"Included Software": "Kaasa arvatud tarkvara",
"Incoming Rate Limit (KiB/s)": "Siseneva liikluse kiiruspiirang (KiB/s)",
"Incorrect user name or password.": "Vigane kasutajanimi või salasõna.",
"Info": "Teave",
"Internally used paths:": "Sisemiselt kasutatud asukohad:",
"Introduced By": "Seda on kokku viinud",
"Introducer": "Kokkuviija",
"Introduction": "Sissejuhatus",
"Inversion of the given condition (i.e. do not exclude)": "Antud tingimuse pöördtingimus (ehk ära välista)",
"Keep Versions": "Säilita Versioone",
"LDAP": "LDAP",
"Largest First": "Suurim Enne",
"Largest First": "Esmalt suuremad",
"Last 30 Days": "Viimased 30 päeva",
"Last 7 Days": "Viimased 7 päeva",
"Last Month": "Viimane kuu",
"Last Scan": "Viimane skaneerimine",
"Last seen": "Viimati nähtud",
"Latest Change": "Viimane Muudatus",
"Learn more": "Veel infot",
"Local State": "Kohalik Olek",
"Local State (Total)": "Kohalik Olek (Summaarne)",
"Maximum Age": "Maksimaalne Vanus",
"Metadata Only": "Ainult Meta-andmed",
"Learn more at {%url%}": "Lisateavet leiad siit: {{url}}",
"Limit": "Piirang",
"Limit Bandwidth in LAN": "Piira ribalaiust kohtvõrgus",
"Listener Failures": "Kuulaja vead",
"Listener Status": "Kuulaja olek",
"Listeners": "Kuulajad",
"Loading data...": "Laadin andmeid…",
"Loading...": "Laadin...",
"Local Additions": "Kohalikud lisandused",
"Local Discovery": "Kohalik avastamine",
"Local State": "Kohalik olek",
"Local State (Total)": "Kohalik olek (summaarne)",
"Locally Changed Items": "Kohalikus seadmes muudetud objektid",
"Log": "Logi",
"Log File": "Logifail",
"Log In": "Logi sisse",
"Log Out": "Logi välja",
"Log in to see paths information.": "Asukohtade teavet näed peale sisselogimist.",
"Log in to see version information.": "Versiooniteavet näed peale sisselogimist.",
"Log tailing paused. Scroll to the bottom to continue.": "Logi lõpu täiendamine on peatunud. Jätkamiseks keri väljund lõpuni.",
"Login failed, see Syncthing logs for details.": "Sisselogimine ei õnnestunud. Üksikasjalikku teavet leiad Syncthingi logidest.",
"Logs": "Logid",
"Major Upgrade": "Suurem versiooniuuendus",
"Mass actions": "Pakktöötlused",
"Maximum Age": "Maksimaalne vanus",
"Maximum single entry size": "Maksimaalne ühe objekti maht",
"Maximum total size": "Maksimaalne kogumaht",
"Metadata Only": "Ainult metaandmed",
"Minimum Free Disk Space": "Minimaalne Vaba Kettaruum",
"Mod. Device": "Muudetud seadmes",
"Mod. Time": "Muutmise aeg",
"More than a month ago": "Enam, kui kuu tagasi",
"More than a week ago": "Enam, kui nädal tagasi",
"More than a year ago": "Enam, kui aasta tagasi",
"Move to top of queue": "Liiguta järjekorra algusesse",
"Multi level wildcard (matches multiple directory levels)": "Mitmetasandiline metamärk (vastab mitmele kaustapuu tasandile)",
"Never": "Eikunagi",
"New Device": "Uus Seade",
"New Folder": "Uus Kaust",
"Newest First": "Uusimad Ennem",
"Newest First": "Esmalt uuemad",
"No": "Ei",
"No File Versioning": "Failide versioonihaldus puudub",
"No files will be deleted as a result of this operation.": "Selle tegevuse tulemusel ei kustutata ühtegi faili.",
"No rules set": "Ühtegi reeglit pole määratud",
"No upgrades": "Uuendusi pole",
"Not shared": "Pole jagatud",
"Notice": "Märkus",
"Number of Connections": "Ühenduste arv",
"OK": "Sobib",
"Oldest First": "Vanimad Ennem",
"Off": "Pole kasutusel",
"Oldest First": "Esmalt vanemad",
"Optional descriptive label for the folder. Can be different on each device.": "Kausta kirjeldav silt, kui vajad seda. Võib olla igas seadmes erinev.",
"Options": "Valikud",
"Outgoing Rate Limit (KiB/s)": "Väljuva Kiiruse Piirang (KiB/s)",
"Override Changes": "Kirjuta Muudatused Üle",
"Out of Sync": "Pole sünkroonis",
"Out of Sync Items": "Sünkroonimata objektid",
"Outgoing Rate Limit (KiB/s)": "Väljuva kiiruse piirang (KiB/s)",
"Override": "Sürjutamine",
"Override Changes": "Sürjuta muudatused",
"Ownership": "Omand",
"Password": "Salasõna",
"Path": "Asukoht",
"Paths": "Asukohad",
"Pause": "Peata",
"Pause All": "Peata Kõik",
"Paused": "Peatatud",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Palun seadista GUI Autentimise Kasutajatunnus ning Salasõna Seadistuste dialoogist.",
"Paused (Unused)": "Peatatud (pole kasutatud)",
"Pending changes": "Ootel muudatused",
"Please consult the release notes before performing a major upgrade.": "Enne suurema versiooniuuenduse tegemist palun loe muudatuste logi ja uue versiooni teavet.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Kasutajaliidese autentimiseks sisesta seadistuste vaatest kasutajanimi ja salasõna.",
"Please wait": "Palun oota",
"Preparing to Sync": "Valmistun sünkroonima",
"Preview": "Eelvaade",
"Preview Usage Report": "Kasutusaruande eelvaade",
"QR code": "QR-kood",
"QUIC LAN": "QUIC LAN",
"QUIC WAN": "QUIC WAN",
"Quick guide to supported patterns": "Toetatud mustrite kiirjuhend",
"Random": "Juhuslik",
"Receive Encrypted": "Vastuvõtmine krüptituna",
"Receive Only": "Ainult vastuvõtmine",
"Received data is already encrypted": "Vastuvõetud andmed on juba krüptitud",
"Recent Changes": "Hiljutised muudatused",
"Reduced by ignore patterns": "Hiljutised eiramismustrid",
"Relay LAN": "Edasta kohtvõrgus",
"Relay WAN": "Edasta laivõrgus",
"Release Notes": "Muudatuste logi",
"Remote Devices": "Kaugseadmed",
"Remote GUI": "Kaugseadme graafiline kasutajaliides",
"Remove": "Eemalda",
"Remove Device": "Kaugseade",
"Remove Folder": "Kaugkaust",
"Required identifier for the folder. Must be the same on all cluster devices.": "Kohustuslik kausta identifikaator. Peab olema sama kõigil klastri seadmetel.",
"Rescan": "Skaneeri uuesti",
"Rescan All": "Skaneeri kõik uuesti",
"Rescans": "Uuesti skaneerimised",
"Restart": "Taaskäivita",
"Restart Needed": "Taaskäivitamine Vajalik",
"Restarting": "Taaskäivitamine",
"Restore": "Taasta",
"Restore Versions": "Taasta versioone",
"Resume": "Jätka",
"Resume All": "Jätka Kõik",
"Reused": "Uuesti kasutatud",
"Revert": "Pööra muudatus tagasi",
"Revert Local Changes": "Pööra kohalikud muudatused tagasi",
"Save": "Salvesta",
"Saving changes": "Salvestan muudatusi",
"Scan Time Remaining": "Järelejäänud skaneerimisaeg",
"Scanning": "Skaneerin",
"Select All": "Vali kõik",
"Select a version": "Vali versioon",
"Select additional devices to share this folder with.": "Vali täiendavad seadmed, millega tahad seda kausta jagada.",
"Select additional folders to share with this device.": "Vali täiendavad kaustad, mida tahad selle seadmega jagada.",
"Select latest version": "Vali viimane versioon",
"Select oldest version": "Vali vanim versioon",
"Send & Receive": "Saatmine ja vastuvõtmine",
"Send Extended Attributes": "Saada täiendavaid andmeid",
"Send Only": "Ainult saatmine",
"Send Ownership": "Edasta omand",
"Set Ignores on Added Folder": "Märgista lisatud kausta eiramised",
"Settings": "Seadistused",
"Share": "Jaga",
"Share Folder": "Jaga Kausta",
"Share this folder?": "Kas jagada seda kausta?",
"Share Folder": "Jaga kausta",
"Share by Email": "Jaga e-kirjaga",
"Share by SMS": "Jaga SMS-iga",
"Share this folder?": "Kas tahad jagada seda kausta?",
"Shared Folders": "Jagatud kaustad",
"Shared With": "Jagatud järgnevalt",
"Sharing": "Jagamine",
"Show ID": "Kuva ID",
"Show QR": "Kuva QR",
"Simple File Versioning": "Lihtne Faili Versioonindus",
"Show detailed discovery status": "Näita avastamise üksikasjalikku olekut",
"Show detailed listener status": "Näita kuulaja üksikasjalikku olekut",
"Show diff with previous version": "Näita erinevust eelmise versiooniga",
"Shut Down": "Lülita välja",
"Shutdown Complete": "Väljalülitamine on lõppenud",
"Simple": "Lihtne",
"Simple File Versioning": "Failide lihtne versioonihaldus",
"Single level wildcard (matches within a directory only)": "Ühetasandiline metamärk (vastavust otsitakse vaid kausta sees)",
"Size": "Suurus",
"Smallest First": "Esmalt väiksemad",
"Some items could not be restored:": "Mõne objekti taastamine polnud võimalik:",
"Some listening addresses could not be enabled to accept connections:": "Ühenduse loomiseks polnud võimalik mõnda kuulamisaadressi kinnitada:",
"Source Code": "Lähtekood",
"Stable releases only": "Ainult stabiilsed väljalasked",
"Stable releases and release candidates": "Stabiilsed versioonid ja kandidaatversioonid",
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.": "Stabiilsete versioonide viiteaeg on kaks nädalat. Selle aja kestel neid testitakse kui kandidaatversioone.",
"Stable releases only": "Ainult stabiilsed versioonid",
"Staggered": "Järkjärguline",
"Staggered File Versioning": "Järkjärguline failide versioonihaldus",
"Start Browser": "Käivita Brauser",
"Statistics": "Statistika",
"Stay logged in": "Jää sisselogituks",
"Stopped": "Peatatud",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Salvestab ja sünkroonib vaid krüptitud andmeid. Kaustad kõikides teistes seadmetes peavad olema seadistatud sama salasõnaga ning nende tüüp peab olema ka „{{receiveEncrypted}}“.",
"Subject:": "Teema:",
"Support": "Abi",
"Support Bundle": "Veaotsingu tugipakett",
"Sync Extended Attributes": "Sünkrooni täiendavaid atribuute/andmeid",
"Sync Ownership": "Sünkrooni omand",
"Sync Protocol Listen Addresses": "Sünkroonimisprotokolli kuulamisaadress",
"Sync Status": "Sünkroonimise olek",
"Syncing": "Sünkroniseerimine",
"Syncthing device ID for \"{%devicename%}\"": "Syncthingi seadmetunnus „{{devicename}}“ seadme jaoks",
"Syncthing has been shut down.": "Syncthing on seisatud.",
"Syncthing includes the following software or portions thereof:": "Syncthingis leidub järgnevat tarkvara või nende alamkomponenete:",
"Syncthing is restarting.": "Syncthing taaskäivitub.",
"Syncthing is saving changes.": "Syncthing salvestab muudatusi.",
"Syncthing is upgrading.": "Syncthing uueneb.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing oskab nüüd kokkujooksmistest arendajatele automaatselt teada anda. See funktsionaalsus on vaikimisi lülitatud sisse.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing ei tundu toimima, aga võib-olla on lihtsalt probleem internetiühendusega. Proovin uuesti…",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing ei suutnud sinu päringut töödelda. Probleemi püsimisel värskenda lehte või taaskäivita Syncthing.",
"The device ID cannot be blank.": "Seadme ID ei tohi olla tühi.",
"TCP LAN": "Kohtvõrgu TCP",
"TCP WAN": "Laivõrgu TCP",
"Take me back": "Vii mind tagasi",
"The Syncthing Authors": "Syncthingi autorid",
"The Syncthing admin interface is configured to allow remote access without a password.": "Syncthingi haldusliides on seadistatud lubamaks ligipääsu ilma salasõnata.",
"The aggregated statistics are publicly available at the URL below.": "Koondstatistika on avalikult saadaval järgneval lehel.",
"The cleanup interval cannot be blank.": "Puhastamise välp ei saa jääda tühjaks.",
"The device ID cannot be blank.": "Seadme tunnus ei tohi olla tühi.",
"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.": "Krüptitud kasutusaruanne saadetakse kord päevas. Sellega peetakse arvet kasutatavate platvormide, rakenduste versioonide ja kaustade suuruste üle. Kui varemteatatud andmekogu muutub, siis sa näed seda vaadet uuesti.",
"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.": "Seadme tunnus ei tundu olema korrektne. Ta peaks olema 52 või 56 märki pikk, kus leidub vaid numbreid ja tähemärke ning võib olla ka tühikuid ja kriipse.",
"The folder ID cannot be blank.": "Kausta ID ei tohi olla tühi.",
"The folder ID must be unique.": "Kausta ID peab olema unikaalne.",
"The folder path cannot be blank.": "Kausta asukoht ei tohi olla tühi.",
"The following items could not be synchronized.": "Järgnevaid üksusi ei õnnestunud sünkroniseerida.",
"The following items were changed locally.": "Järgnevad objektid on muudetud kohalikus seadmes.",
"The following unexpected items were found.": "Leidus järgmisi ootamatuid objekte.",
"The interval must be a positive number of seconds.": "Välp peab olema positiivne täisarv sekundites.",
"The maximum age must be a number and cannot be blank.": "Maksimaalne vanus peab olema arv ning ei tohi olla tühi.",
"The number of connections must be a non-negative number.": "Ühenduste arv peab olema nullist suurem number.",
"The number of days must be a number and cannot be blank.": "Päevade arv peab olema number ega tohi jääda tühjaks.",
"The number of days to keep files in the trash can. Zero means forever.": "Päevade arv failide hoidmiseks prügikastis. Null (0) tähistab piiranguteta hoidmist.",
"The number of old versions to keep, per file.": "Alleshoitavate faili vanade versioonide arv.",
"The number of versions must be a number and cannot be blank.": "Versioonide arv peab olema number ega tohi jääda tühjaks.",
"The path cannot be blank.": "Asukoht ei saa jääda tühjaks.",
"The rate limit must be a non-negative number (0: no limit)": "Kiiruspiirang peab olema positiivne täisarv (0 tähendab piirangu puudumist)",
"The remote device has not accepted sharing this folder.": "Kaugseade pole selle kausta sünkroonimisega nõustunud.",
"The remote device has paused this folder.": "Kaugseade on peatanud selle kausta sünkroonimise.",
"There are no devices to share this folder with.": "Pole ühtegi seadet, millega saaks seda kausta jagada.",
"There are no file versions to restore.": "Pole ühtegi taastatavat failiversiooni.",
"There are no folders to share with this device.": "Pole ühtegi kausta, mida selle seadmega jagada.",
"This Device": "See seade",
"This Month": "Sel kuul",
"This is a major version upgrade.": "Tegemist on suurema versiooniuuendusega.",
"Time": "Aeg",
"Time the item was last modified": "Aeg, millal objekti viimati muudeti",
"Today": "Täna",
"Trash Can": "Prügikast",
"Trash Can File Versioning": "Prügikastifailide versioonihaldus",
"Type": "Tüüp",
"UNIX Permissions": "UNIX-i õigused",
"Unavailable": "Pole saadaval",
"Unavailable/Disabled by administrator or maintainer": "Pole saadaval või haldaja/peakasutaja poolt keelatud",
"Undecided (will prompt)": "Määratlemata (kuulub üleküsimisele)",
"Unexpected Items": "Ootamatud ja plaanivälised objektid",
"Unexpected items have been found in this folder.": "Selles kaustas leidus ootamatuid objekte.",
"Unignore": "Lõpeta eiramine",
"Unknown": "Teadmata",
"Upload Rate": "Üleslaadimise Kiirus",
"Unshared": "Pole jagatud",
"Unshared Devices": "Mittejagatud seadmed",
"Unshared Folders": "Mittejagatud kaustad",
"Untrusted": "Pole usaldusväärne",
"Up to Date": "Uuendatud ja sünkroonis",
"Updated {%file%}": "{{file}} fail on uuendatud",
"Upgrade": "Uuenda",
"Upgrade To {%version%}": "Uuenda versioonini {{version}}",
"Upgrading": "Uuendan",
"Upload Rate": "Üleslaadimise kiirus",
"Uptime": "Kasulik tööaeg",
"Usage reporting is always enabled for candidate releases.": "Kandidaatversioonide puhul on kasutusaruannete saatmine alati sisse lülitatud.",
"Use HTTPS for GUI": "Kasuta HTTPS'i GUI jaoks",
"Use notifications from the filesystem to detect changed items.": "Muudetud objektide tuvastamiseks kasuta operatsioonisüsteemi teavitusi.",
"User": "Kasutaja",
"User Home": "Kasutaja kodukaust",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Kasutajaliidese autentimiseks pole lisatud kasutajanime ja salasõna. Me soovitame, et kindlasti teed seda.",
"Using a QUIC connection over LAN": "Kasutades QUIC-ühendust kohtvõrgus",
"Using a QUIC connection over WAN": "Kasutades QUIC-ühendust laivõrgus",
"Using a direct TCP connection over LAN": "Kasutades TCP otseühendust kohtvõrgus",
"Using a direct TCP connection over WAN": "Kasutades TCP otseühendust kaugvõrgus",
"Version": "Versioon",
"Versions": "Versioonid",
"Versions Path": "Versioonide asukoht",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Varasemad versioonid kustutatakse automaatselt, kui nende vanus ületab suurima lubatud vanuse või nende arv ületab antud ajavahemikule lubatud arvu.",
"Waiting to Clean": "Ootan tühjendamist",
"Waiting to Scan": "Ootan skaneerimist",
"Waiting to Sync": "Ootan sünkroonimist",
"Warning": "Hoiatus",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".": "Hoiatus: see asukoht on olemasoleva „{{otherFolder}}“ kausta ülemkaust.",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Hoiatus: see asukoht on olemasoleva „{{otherFolderLabel}}“ ({{otherFolder}}) kausta ülemkaust.",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Hoiatus: see asukoht on olemasoleva „{{otherFolder}}“ kausta alamkaust.",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Hoiatus: see asukoht on olemasoleva „{{otherFolderLabel}}“ ({{otherFolder}}) kausta alamkaust.",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "Hoiatus: kui kasutad välist muudatuste jälgijat, nagu {{syncthingInotify}}, siis palun kontrolli, et ta on lülitatud välja.",
"Watch for Changes": "Jälgi muudatusi",
"Watching for Changes": "Jälgin muudatusi",
"Watching for changes discovers most changes without periodic scanning.": "Muudatuste jälgimisega on võimalik tuvastada enamus muudatusi ilma perioodilise skaneerimiseta.",
"Yes": "Jah",
"Yesterday": "Eile",
"You can also copy and paste the text into a new message manually.": "Sa võid ka kopeerida ja asetada teksti uude sõnumisse käsitsi.",
"You can also select one of these nearby devices:": "Sa võid ka valida mõne läheduses asuvatest seadmetest:",
"You can change your choice at any time in the Settings dialog.": "Sa võid oma valikut alati muuta vaatest „Seadistused“.",
"You can read more about the two release channels at the link below.": "Mainitud versioonitüübi kohta saad lähemalt lugeda klikates järgnevat linki.",
"You have no ignored devices.": "Sul pole ühtegi eiratud seadet.",
"You have no ignored folders.": "Sul pole ühtegi eiratud kausta.",
"You have unsaved changes. Do you really want to discard them?": "Sul on salvestamata muudatusi. Kas sa kindlasti tahad neist loobuda?",
"You must keep at least one version.": "Sa pead alles hoidma vähemalt ühe versiooni.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Sa ei peaks kunagi kohalikult lisama kausta „{{receiveEncrypted}}“ ega seal midagi muutma.",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "Nüüd peaks avanema sinu SMS-rakendus, saad valida adressaadi ja talle saata info oma nime alt.",
"Your email app should open to let you choose the recipient and send it from your own address.": "Nüüd peaks avanema sinu e-posti rakendus, saad valida adressaadi ja talle saata info oma nime alt.",
"days": "päeva",
"deleted": "kustutatud",
"deny": "keela",
"directories": "kaustad",
"file": "fail",
"files": "failid",
"folder": "kaust",
"full documentation": "täisdokumentatsioon",
"items": "objektid",
"modified": "muudetud",
"permit": "luba",
"seconds": "sekundit",
"theme": {
"name": {
"black": "Süsimust kujundus",
"dark": "Tume kujundus",
"default": "Vaikimisi kujundus",
"light": "Hele kujundus"
}
},
"unknown device": "tundmatu seade",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} soovib jagada kausta \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} soovib jagada kausta \"{{folderlabel}}\" ({{folder}})."
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} soovib jagada kausta \"{{folderlabel}}\" ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} võib selle seadme uuesti kokku viia."
}
+30 -30
View File
@@ -1,11 +1,11 @@
{
"A device with that ID is already added.": "May naidagdag na device na may ganitong ding ID.",
"A negative number of days doesn't make sense.": "Walang saysay ang negatibong numero ng araw.",
"A new major version may not be compatible with previous versions.": "Maaring hindi compatible ang isang bagong major na beryson sa mga nakaraang bersyon.",
"A device with that ID is already added.": "May naidagdag na device na may ganito ring ID.",
"A negative number of days doesn't make sense.": "Walang saysay ang negatibong bilang ng araw.",
"A new major version may not be compatible with previous versions.": "Maaring hindi compatible ang isang bagong major na bersiyon sa mga nakaraang bersiyon.",
"API Key": "API Key",
"About": "Tungkol sa",
"Action": "Aksyon",
"Actions": "Mga Aksyon",
"Action": "Aksiyon",
"Actions": "Mga Aksiyon",
"Active filter rules": "Mga aktibong tuntunin sa pag-filter",
"Add": "Magdagdag",
"Add Device": "Magdagdag ng Device",
@@ -56,7 +56,7 @@
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Hindi maaaring paganahin kapag ang uri ng folder ay \"{{foldertype}}\".",
"Changelog": "Mga Pagbabago",
"Clean out after": "Linisin pagkatapos",
"Cleaning Versions": "Mga Bersyon ng Paglinis",
"Cleaning Versions": "Mga Bersiyon ng Paglinis",
"Cleanup Interval": "Pagitan ng Paglinis",
"Click to see full identification string and QR code.": "I-click upang makita ang buong string ng pagkakakilanlan at QR code.",
"Close": "Isara",
@@ -155,14 +155,14 @@
"External": "Panlabas",
"External File Versioning": "Panlabas na File Versioning",
"Failed Items": "Mga Nabigong Item",
"Failed to load file versions.": "Nabigong i-load ang mga bersyon ng file.",
"Failed to load file versions.": "Nabigong i-load ang mga bersiyon ng file.",
"Failed to load ignore patterns.": "Nabigong i-load ang mga ignore pattern.",
"Failed to set up, retrying": "Nabigong i-set up, sinusubukan muli",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "Inaasahan ang pagbigo sa pagkonekta sa mga IPv6 na server kapag walang konektibidad sa IPv6.",
"File Pull Order": "Order ng Pagkuha ng File",
"File Versioning": "File Versioning",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Nilipat ang mga file sa .stversions na direktoryo kapag pinalitan o binura ng Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Nililipat ang mga file sa mga naka-date stamp na bersyon sa .stversions na direktoryo kapag pinalitan o binura ng Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Nililipat ang mga file sa mga naka-date stamp na bersiyon sa .stversions na direktoryo kapag pinalitan o binura ng Syncthing.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Pinoprotektahan ang mga file mula sa mga pagbabago sa ibang device, pero ipapadala sa ibang cluster ang mga pagbabago na ginawa sa device na ito.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Sini-synchronize mula sa cluster ang mga file, pero hindi ipapadala sa mga ibang device ang mgaanumang pagbabago.",
"Filesystem Watcher Errors": "Mga Error sa Taganood ng Filesystem",
@@ -217,7 +217,7 @@
"Introducer": "Tagapagpakilala",
"Introduction": "Panimula",
"Inversion of the given condition (i.e. do not exclude)": "Pabaliktad ng ibinigay na kundisyon (hal. huwag ibukod)",
"Keep Versions": "Panatilihin ang mga Bersyon",
"Keep Versions": "Panatilihin ang mga Bersiyon",
"LDAP": "LDAP",
"Largest First": "Pinakamalaki Muna",
"Last 30 Days": "Huling 30 Araw",
@@ -245,12 +245,12 @@
"Log In": "Mag-Log In",
"Log Out": "Mag-Log Out",
"Log in to see paths information.": "Mag-log in upang makita ang impormasyon ng mga path.",
"Log in to see version information.": "Mag-log in upang makita ang impormasyon ng bersyon.",
"Log in to see version information.": "Mag-log in upang makita ang impormasyon ng bersiyon.",
"Log tailing paused. Scroll to the bottom to continue.": "Na-pause ang tailing ng tala. Mag-scroll pababa para magpatuloy.",
"Login failed, see Syncthing logs for details.": "Nabigo ang pag-login, tignan ang mga tala ng Syncthing para sa mga detalye.",
"Logs": "Mga Tala",
"Major Upgrade": "Major na Upgrade",
"Mass actions": "Mga maramihang aksyon",
"Mass actions": "Mga maramihang aksiyon",
"Maximum Age": "Pinakamataas na Edad",
"Maximum single entry size": "Pinakamataas na laki ng isang entry",
"Maximum total size": "Pinakamataas na kabuuang laki",
@@ -289,7 +289,7 @@
"Password": "Password",
"Path": "Path",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Path papunta sa folder sa computer na ito. Gagawin kapag hindi umiiral. Maaring gamitin ang tilde na character (~) bilang shortcut sa",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Path kung saan ilalagay ang mga bersyon (iwanang walang laman para sa default .stversions na direktoryo sa binabahaging folder).",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Path kung saan ilalagay ang mga bersiyon (iwanang walang laman para sa default .stversions na direktoryo sa binabahaging folder).",
"Paths": "Mga Path",
"Pause": "I-pause",
"Pause All": "I-pause Lahat",
@@ -335,7 +335,7 @@
"Restart Needed": "Kinakailangan ng Restart",
"Restarting": "Nagre-restart",
"Restore": "I-restore",
"Restore Versions": "I-restore ang Mga Bersyon",
"Restore Versions": "I-restore ang Mga Bersiyon",
"Resume": "I-resume",
"Resume All": "I-resume Lahat",
"Reused": "Ginamit muli",
@@ -345,13 +345,13 @@
"Saving changes": "Sine-save ang mga pagbabago",
"Scan Time Remaining": "Natitirang Oras sa Pag-scan",
"Scanning": "Sina-scan",
"See external versioning help for supported templated command line parameters.": "Tingnan ang tulong sa external na pag-bersyon para sa mga sinusuportahang naka-template na parameter ng command line.",
"See external versioning help for supported templated command line parameters.": "Tingnan ang tulong sa external na pag-bersiyon para sa mga sinusuportahang naka-template na parameter ng command line.",
"Select All": "Piliin Lahat",
"Select a version": "Pumili ng bersyon",
"Select a version": "Pumili ng bersiyon",
"Select additional devices to share this folder with.": "Pumili ng mga karagdagang device para ibagagi ang folder na ito.",
"Select additional folders to share with this device.": "Pumili ng mga karagdagang folder para ibagagi sa device na ito.",
"Select latest version": "Piliin ang pinakabagong bersyon",
"Select oldest version": "Piliin ang pinakalumang bersyon",
"Select latest version": "Piliin ang pinakabagong bersiyon",
"Select oldest version": "Piliin ang pinakalumang bersiyon",
"Send & Receive": "Magpadala at Makatanggap",
"Send Extended Attributes": "Magpadala ng mga Pinalawak na Attribute",
"Send Only": "Magpadala Lamang",
@@ -370,7 +370,7 @@
"Show QR": "Ipakita ang QR",
"Show detailed discovery status": "Magpakita ng detalyadong status sa pagtuklas",
"Show detailed listener status": "Ipakita ang detalyadong status sa listener",
"Show diff with previous version": "Ipakita ang diff sa nakaraang bersyon",
"Show diff with previous version": "Ipakita ang diff sa nakaraang bersiyon",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Ipinapakita sa halip na Device ID sa status ng cluster. Ia-advertise sa iba pang mga device bilang opsyonal na default na pangalan.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Ipinapakita sa halip na Device ID sa status ng cluster. Ia-update sa pangalan na ina-advertise ng device kung iiwanang walang laman.",
"Shut Down": "I-shutdown",
@@ -425,15 +425,15 @@
"The cleanup interval cannot be blank.": "Hindi maaaring walang laman ang pagitan ng paglinis.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Na-save na ang configuration ngunit hindi naka-activate. Kailangang mag-restart ang Syncthing para i-activate ang bagong configuration.",
"The device ID cannot be blank.": "Hindi maaaring walang laman ang Device ID.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Mahahanap ang device ID na ilalagay dito sa \"Mga Aksyon > Ipakita ang ID\" na dialog sa isa pang device. Opsyonal ang mga puwang at gitling (hindi pinapansin).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Araw-araw na pinapadala ang naka-encrypt na ulat sa paggamit. Ginagamit ito sa pag-track ng mga karaniwang platform, laki ng folder, at bersyon ng app. Kapag nabago ang tinakdang data ng ulat ipo-prompt kang muli ng dialog na ito.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Mahahanap ang device ID na ilalagay dito sa \"Mga Aksiyon > Ipakita ang ID\" na dialog sa isa pang device. Opsyonal ang mga puwang at gitling (hindi pinapansin).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Araw-araw na pinapadala ang naka-encrypt na ulat sa paggamit. Ginagamit ito sa pag-track ng mga karaniwang platform, laki ng folder, at bersiyon ng app. Kapag nabago ang tinakdang data ng ulat ipo-prompt kang muli ng dialog na ito.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Mukhang hindi angkop ang inilagay na device ID. Dapat itong 52 o 56 na character na string na binubuo ng mga titik at numero, na may mga puwang at gitling bilang opsyonal.",
"The folder ID cannot be blank.": "Hindi maaaring walang laman ang folder ID.",
"The folder ID must be unique.": "Kailangang kakaiba ang folder ID.",
"The folder content on other devices will be overwritten to become identical with this device. Files not present here will be deleted on other devices.": "Io-overwrite ang nilalaman ng folder sa mga ibang device para maging magkapareho sa device na ito. Ang mga file na hindi nandito ay buburahin sa mga ibang device.",
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.": "Io-overwrite ang nilalaman ng folder sa mga ibang device para maging magkapareho sa device na ito. Ang mga file na kamakilang dinagdag dito ay buburahin sa mga ibang device.",
"The folder path cannot be blank.": "Hindi maaaring walang laman ang path ng folder.",
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.": "Ang mga sumusunod na pagitan ay ginagamit: sa unang oras ang isang bersyon ay pinapanatili bawat 30 segundo, sa unang araw ang isang bersyon ay pinapanatili bawat oras, sa unang 30 araw ang isang bersyon ay pinapanatili bawat araw, hanggang sa pinakamataas na edad ang isang bersyon ay pinapanatili bawat linggo.",
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.": "Ang mga sumusunod na pagitan ay ginagamit: sa unang oras ang isang bersiyon ay pinapanatili bawat 30 segundo, sa unang araw ang isang bersiyon ay pinapanatili bawat oras, sa unang 30 araw ang isang bersiyon ay pinapanatili bawat araw, hanggang sa pinakamataas na edad ang isang bersiyon ay pinapanatili bawat linggo.",
"The following items could not be synchronized.": "Hindi ma-synchronize ang mga sumusunod na item.",
"The following items were changed locally.": "Binago ng lokal ang mga sumusunod na item.",
"The following methods are used to discover other devices on the network and announce this device to be found by others:": "Ang mga sumusunod na paraan ay ginagamit upang tumuklas ng mga ibang device sa network at ipahayag ang device na ito na mahanap ng iba:",
@@ -442,12 +442,12 @@
"The interval must be a positive number of seconds.": "Dapat positibong numero ng segundo ang pagitan.",
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Ang pagitan, bilang segundo, para sa pagtakbo ng paglinis sa versions na direktoryo. Sero para i-disable ang periodical na paglinis.",
"The maximum age must be a number and cannot be blank.": "Dapat numero ang pinakamataas na edad at hindi maaaring walang laman.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Ang pinakamataas na oras para panatilihin ang bersyon (bilang araw, itakda sa 0 para panatilihin ang mga bersyon magpakailanman).",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Ang pinakamataas na oras para panatilihin ang bersiyon (bilang araw, itakda sa 0 para panatilihin ang mga bersiyon magpakailanman).",
"The number of connections must be a non-negative number.": "Dapat hindi negatibong numero ang bilang ng mga koneksyon.",
"The number of days must be a number and cannot be blank.": "Dapat numero ang bilang ng araw at hindi maaaring walang laman.",
"The number of days to keep files in the trash can. Zero means forever.": "Ang bilang ng araw para panatilihin ang mga file sa basurahan. Ang sero ay ibig sabihin ay magpakailanman.",
"The number of old versions to keep, per file.": "Ang bilang ng mga lumang bersyon na dapat panatilihin, bawat file.",
"The number of versions must be a number and cannot be blank.": "Dapat numero ang bilang ng mga bersyon at hindi maaaring walang laman.",
"The number of old versions to keep, per file.": "Ang bilang ng mga lumang bersiyon na dapat panatilihin, bawat file.",
"The number of versions must be a number and cannot be blank.": "Dapat numero ang bilang ng mga bersiyon at hindi maaaring walang laman.",
"The path cannot be blank.": "Hindi maaaring walang laman ang path.",
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Ina-apply ang rate limit sa naipon na traffic ng lahat ng mga koneksyon sa device na ito.",
"The rate limit must be a non-negative number (0: no limit)": "Dapat hindi negatibong numero ang rate limit (0: walang limitasyon)",
@@ -462,7 +462,7 @@
"This Month": "Itong Buwan",
"This can easily give hackers access to read and change any files on your computer.": "Madali nitong mabibigyan ang mga hacker ng access na basahin at baguhin ang anumang mga file sa iyong computer.",
"This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "Hindi awtomatikong tutuklasin ng device na ito ng mga ibang device o i-annouce ang sarili nitong address para mahanap ng iba. Makakakonekta lamang ang mga device na may static na naka-configure na address.",
"This is a major version upgrade.": "Ito ay isang upgrade sa major na bersyon.",
"This is a major version upgrade.": "Ito ay isang upgrade sa major na bersiyon.",
"This setting controls the free space required on the home (i.e., index database) disk.": "Kinokontrol ng setting na ito ang kinakailangan na bakanteng espasyo sa home (hal., index database) disk.",
"Time": "Oras",
"Time the item was last modified": "Oras na huling binago ang file",
@@ -501,10 +501,10 @@
"Using a QUIC connection over WAN": "Gumagamit ng QUIC na koneksyon mula sa WAN",
"Using a direct TCP connection over LAN": "Gumagamit ng direktang TCP na koneksyon mula sa LAN",
"Using a direct TCP connection over WAN": "Gumagamit ng direktang TCP na koneksyon mula sa WAN",
"Version": "Bersyon",
"Versions": "Mga Bersyon",
"Versions Path": "Path ng Mga Bersyon",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Awtomatikong buburahin ang mgs bersyon kapag mas matanda sila kaysa sa pinakamataas na edad o lumalagpas sa numero ng mga file na pinapayagan sa pagitan.",
"Version": "Bersiyon",
"Versions": "Mga Bersiyon",
"Versions Path": "Path ng Mga Bersiyon",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Awtomatikong buburahin ang mgs bersiyon kapag mas matanda sila kaysa sa pinakamataas na edad o lumalagpas sa numero ng mga file na pinapayagan sa pagitan.",
"Waiting to Clean": "Naghihintay para Linisin",
"Waiting to Scan": "Naghihintay para Mag-scan",
"Waiting to Sync": "Naghihintay para Mag-sync",
@@ -529,7 +529,7 @@
"You have no ignored devices.": "Wala kang mga hindi pinapansin na device.",
"You have no ignored folders.": "Wala kang mga hindi pinapansin na folder.",
"You have unsaved changes. Do you really want to discard them?": "Mayroon kang mga hindi na-save na pagbabago. Gusto mo ba talagang i-discard ang mga ito?",
"You must keep at least one version.": "Kailangan mong magpanatili ng kahit isang bersyon.",
"You must keep at least one version.": "Kailangan mong magpanatili ng kahit isang bersiyon.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Hindi ka dapat magdagdag o magpalit ng anumang lokal sa folder na \"{{receiveEncrypted}}\".",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "Magbubukas ang iyong SMS app para hayaan kang pumili ng tatanggap at ipadala ito mula sa sarili mong numero.",
"Your email app should open to let you choose the recipient and send it from your own address.": "Magbubukas ang iyong email app para hayaan kang pumili ng tatanggap at ipadala mula sa sarili mong address.",
+51 -44
View File
@@ -1,5 +1,5 @@
{
"A device with that ID is already added.": "Un appareil portant cet ID est déjà présent.",
"A device with that ID is already added.": "Cet ID est déjà enregistré.",
"A negative number of days doesn't make sense.": "Ce champ n'accepte qu'un entier positif ou nul.",
"A new major version may not be compatible with previous versions.": "Une nouvelle version majeure peut présenter des incompatibilités avec les versions antérieures.",
"API Key": "Clé d'API",
@@ -9,11 +9,11 @@
"Active filter rules": "Filtres enregistrés",
"Add": "Ajouter",
"Add Device": "Ajouter l'appareil",
"Add Folder": "Ajouter un partage",
"Add Remote Device": "Ajouter un appareil",
"Add devices from the introducer to our device list, for mutually shared folders.": "Ajouter des appareils de l'introducteur à notre liste d'appareils, pour les partages en commun.",
"Add Folder": "Ajouter un partage...",
"Add Remote Device": "Ajouter un appareil...",
"Add devices from the introducer to our device list, for mutually shared folders.": "Ajouter les appareils de l'introducteur à notre liste, pour les partages que nous avons en commun.",
"Add filter entry": "Ajouter une entrée de filtrage",
"Add ignore patterns": "Ajouter des masques d'exclusion",
"Add ignore patterns": "Ajouter des modèles d'exclusion",
"Add new folder?": "Ajouter ce partage ?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Dans ce cas, l'intervalle de réanalyse complète sera augmenté (60 fois, c.-à-d. une nouvelle valeur par défaut de 1h). Vous pouvez également la configurer manuellement plus tard, pour chaque partage, après avoir choisi Non.",
"Address": "Adresse",
@@ -30,26 +30,27 @@
"Always turned on when the folder type is \"{%foldertype%}\".": "Toujours activé pour le type de partage \"{{foldertype}}\".",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Une commande externe gère les versions de fichiers. Il lui incombe de supprimer les fichiers du répertoire partagé. Si le chemin contient des espaces, il doit être spécifié entre guillemets.",
"Anonymous Usage Reporting": "Rapport anonyme de statistiques d'utilisation",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Le format du rapport anonyme d'utilisation a changé. Voulez-vous passer au nouveau format ?",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Le format du rapport anonyme d'utilisation a changé. Voulez-vous adopter le nouveau format?",
"Applied to LAN": "Appliqué au LAN",
"Apply": "Appliquer",
"Are you sure you want to override all remote changes?": "Voulez-vous vraiment écraser tous les changements distants ?",
"Are you sure you want to permanently delete all these files?": "Êtes-vous sûrs de vouloir définitivement supprimer tous ces fichiers ?",
"Are you sure you want to remove device {%name%}?": "Êtes-vous sûr de vouloir supprimer l'appareil {{name}} ?",
"Are you sure you want to remove folder {%label%}?": "Êtes-vous sûr de vouloir supprimer le partage {{label}} ?",
"Are you sure you want to restore {%count%} files?": "Êtes-vous sûr de vouloir restaurer {{count}} fichiers ?",
"Are you sure you want to revert all local changes?": "Voulez-vous vraiment écraser tous les changements locaux ?",
"Are you sure you want to upgrade?": "Voulez-vous vraiment mettre à jour ?",
"Are you sure you want to override all remote changes?": "Voulez-vous vraiment écraser toutes les modifications distantes?",
"Are you sure you want to permanently delete all these files?": "Voulez-vous vraiment supprimer tous ces fichiers définitivement?",
"Are you sure you want to remove device {%name%}?": "Voulez-vous vraiment supprimer lappareil {{name}}?",
"Are you sure you want to remove folder {%label%}?": "Voulez-vous vraiment supprimer le partage {{label}}?",
"Are you sure you want to restore {%count%} files?": "Voulez-vous vraiment restaurer {{count}} fichiers?",
"Are you sure you want to revert all local changes?": "Voulez-vous vraiment annuler toutes les modifications locales?",
"Are you sure you want to upgrade?": "Voulez-vous vraiment mettre à jour?",
"Authentication Required": "Authentification nécessaire",
"Authors": "Auteurs",
"Auto Accept": "Accepter automatiquement",
"Auto Accept": "Accepter automatiquement ses invitations",
"Automatic Crash Reporting": "Rapports de plantage automatiques",
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Le système de mise à jour automatique propose le choix entre versions stables et versions préliminaires.",
"Automatic upgrades": "Mises à jour automatiques",
"Automatic upgrades are always enabled for candidate releases.": "Les mises à jour automatiques sont toujours activées pour les versions préliminaires (-rc.N).",
"Automatically create or share folders that this device advertises at the default path.": "Automatiquement créer ou partager les partages que cet appareil annonce sur le chemin par défaut.",
"Automatic upgrades are always enabled for candidate releases.": "Les mises à jour automatiques sont toujours activées pour les versions mineures.",
"Automatically create or share folders that this device advertises at the default path.": "Automatiquement créer dans le chemin par défaut les partages auxquels cet appareil vous propose de participer, ou accepter leur partage s'ils pré-existent.",
"Available debug logging facilities:": "Outils de débogage disponibles :",
"Be careful!": "Faites attention !",
"Block Indexing": "Indexation des blocs",
"Body:": "Corps du message :",
"Bugs": "Bogues",
"Cancel": "Annuler",
@@ -72,7 +73,7 @@
"Connection Type": "Type de connexion",
"Connections": "Connexions",
"Connections via relays might be rate limited by the relay": "Les connexions via un relais sont généralement limitées en débit par les capacités du relais",
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "La surveillance permanente des changements est maintenant disponible. C'est le disque qui signale les modifications à Syncthing qui lance alors une analyse uniquement sur les partages modifiés. Les avantages sont que les changements sont propagés plus rapidement et moins d'analyses complètes sont nécessaires.",
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "La surveillance permanente des changements est maintenant disponible. C'est le disque qui signale les modifications à Syncthing qui lance alors une analyse uniquement sur les partages modifiés. Les avantages sont que les changements sont propagés plus rapidement et que moins d'analyses complètes sont nécessaires.",
"Copied from elsewhere": "Copié d'ailleurs",
"Copied from original": "Copié depuis l'original",
"Copied!": "Copié dans le presse-papiers !",
@@ -88,7 +89,7 @@
"Default Configuration": "Préférences pour les créations (non rétroactif)",
"Default Device": "Nouveaux appareils",
"Default Folder": "Nouveaux partages",
"Default Ignore Patterns": "Masques d'exclusion par défaut",
"Default Ignore Patterns": "Modèles d'exclusion par défaut",
"Defaults": "Personnalisation",
"Delete": "Supprimer",
"Delete Unexpected Items": "Supprimer les éléments inattendus",
@@ -99,6 +100,7 @@
"Device": "Appareil",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "L'appareil \"{{name}}\" ({{device}} à l'adresse {{address}}) demande à se connecter. Acceptez-vous de l'ajouter à votre liste d'appareils connus ?",
"Device Certificate": "Certificat de l'appareil",
"Device Group": "Groupe d'appareils",
"Device ID": "ID de l'appareil",
"Device Identification": "Identifiant de l'appareil",
"Device Name": "Nom convivial local de l'appareil",
@@ -122,7 +124,7 @@
"Discovery Failures": "Échecs de découverte",
"Discovery Status": "État de la découverte",
"Dismiss": "Écarter",
"Do not add it to the ignore list, so this notification may recur.": "Attendre la disparition de cette demande : évite l'ajout immédiat à la liste noire persistante.",
"Do not add it to the ignore list, so this notification may recur.": "Attendre l'expiration de cette demande : évite l'ajout immédiat à la liste noire persistante.",
"Do not restore": "Ne pas restaurer",
"Do not restore all": "Ne pas tout restaurer",
"Do you want to enable watching for changes for all your folders?": "Voulez-vous activer la surveillance des changements sur tous vos partages ?",
@@ -147,7 +149,7 @@
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Nombre positif (p.ex, \"2.35\") et unité. Pourcentage de l'espace disque total.",
"Enter a non-privileged port number (1024 - 65535).": "Entrez un numéro de port non-privilégié (1024 - 65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Entrer les adresses (\"tcp://ip:port\" ou \"tcp://hôte:port\") séparées par une virgule, ou \"dynamic\" afin d'activer la recherche automatique de l'adresse.",
"Enter ignore patterns, one per line.": "Entrez les masques d'exclusion, un par ligne.",
"Enter ignore patterns, one per line.": "Entrez les modèles d'exclusion, un par ligne.",
"Enter up to three octal digits.": "Entrez jusqu'à 3 chiffres octaux.",
"Error": "Erreur",
"Extended Attributes": "Attributs étendus",
@@ -156,7 +158,7 @@
"External File Versioning": "Gestion externe des versions de fichiers",
"Failed Items": "Éléments en échec",
"Failed to load file versions.": "Échec de chargement des versions de fichiers.",
"Failed to load ignore patterns.": "Échec du chargement des masques d'exclusions.",
"Failed to load ignore patterns.": "Échec du chargement des modèles d'exclusions.",
"Failed to set up, retrying": "Échec, nouvel essai",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "La connexion aux serveurs en IPv6 va échouer s'il n'y a pas de connectivité IPv6.",
"File Pull Order": "Ordre de récupération des fichiers",
@@ -169,6 +171,7 @@
"Filter by date": "Filtrer par date",
"Filter by name": "Filtrer par nom",
"Folder": "Partage",
"Folder Group": "Groupe de partages",
"Folder ID": "ID du partage",
"Folder Label": "Nom du partage",
"Folder Path": "Chemin racine du partage",
@@ -182,12 +185,12 @@
"Full Rescan Interval (s)": "Intervalle de réanalyse complète (s)",
"GUI": "Interface graphique",
"GUI / API HTTPS Certificate": "Certificat HTTPS GUI/API",
"GUI Authentication Password": "Mot de passe d'authentification GUI",
"GUI Authentication User": "Utilisateur autorisé GUI",
"GUI Authentication: Set User and Password": "Authentification à l'interface graphique : régler nom d'utilisateur et mot de passe",
"GUI Listen Address": "Adresse d'écoute du GUI",
"GUI Authentication Password": "Mot de passe de linterface graphique",
"GUI Authentication User": "Nom dutilisateur de linterface graphique",
"GUI Authentication: Set User and Password": "Authentification à linterface graphique : configuration du nom dutilisateur et du mot de passe",
"GUI Listen Address": "Adresse découte de linterface graphique",
"GUI Override Directory": "Répertoire de remplacement GUI",
"GUI Theme": "Thème graphique",
"GUI Theme": "Thème de linterface graphique",
"General": "Général",
"Generate": "Générer",
"Global Discovery": "Découverte globale",
@@ -203,7 +206,7 @@
"Ignore": "Refuser",
"Ignore Patterns": "Exclusions",
"Ignore Permissions": "Ignorer les permissions",
"Ignore patterns can only be added after the folder is created. If checked, an input field to enter ignore patterns will be presented after saving.": "L'ajout de masques d'exclusion ne peut se faire qu'après la création du partage. En cochant cette case il vous sera proposé de saisir (ou si vous avez déjà défini des valeurs par défaut, de compléter) une liste d'exclusions après l'enregistrement.",
"Ignore patterns can only be added after the folder is created. If checked, an input field to enter ignore patterns will be presented after saving.": "L'ajout de modèles d'exclusion ne peut se faire qu'après la création du partage. En cochant cette case il vous sera proposé de saisir (ou si vous avez déjà défini des valeurs par défaut, de compléter) une liste d'exclusions après l'enregistrement.",
"Ignored Devices": "Appareils refusés",
"Ignored Folders": "Partages refusés",
"Ignored at": "Refusé le",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Le défilement du journal est en pause. Faites défiler jusqu'en bas pour continuer.",
"Login failed, see Syncthing logs for details.": "Échec de connexion, consultez les journaux de Syncthing pour les détails.",
"Logs": "Journaux",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Entretient un index de tous les blocs du répertoire pour permettre leur réutilisation depuis d'autres fichiers lors de changements dans la synchronisation. Désactivez pour diminuer la taille de la base de donnée, au prix de téléchargements potentiellement plus longs.",
"Major Upgrade": "Mise à jour majeure",
"Mass actions": "Actions multiples",
"Maximum Age": "Ancienneté maximum",
@@ -256,8 +260,8 @@
"Maximum total size": "Taille maximum totale",
"Metadata Only": "Métadonnées uniquement",
"Minimum Free Disk Space": "Espace disque libre minimum",
"Mod. Device": "Appareil modificateur",
"Mod. Time": "Date de modification",
"Mod. Device": "Modificateur",
"Mod. Time": "Dernière modif.",
"More than a month ago": "Plus d'un mois",
"More than a week ago": "Plus d'une semaine",
"More than a year ago": "Plus d'un an",
@@ -278,7 +282,9 @@
"OK": "OK",
"Off": "Désactivée",
"Oldest First": "Les plus anciens en premier",
"Optional descriptive label for the folder. Can be different on each device.": "Nom local, descriptif et optionnel du partage. Il peut être différent sur chaque appareil.",
"Optional descriptive label for the folder. Can be different on each device.": "Nom local, convivial et optionnel du partage, à notre guise. Il peut être différent sur chaque appareil. Par une notification initiale d'invitation, il sera proposé tel quel aux nouveaux participants choisis dans l'onglet suivant (Liaisons).\nAstuce : comme il est modifiable ultérieurement, soyons prévenant en indiquant un nom bien parlant pour nos invités, puis quand ils l'auront accepté, renommons-le si besoin pour nous-même (exemple : je crée un partage personnel prévu pour deux membres seulement où je commence par donner mon propre nom au partage pour l'invitation, puis je le renomme plus tard au nom du partenaire quand celui-ci l'a accepté). Réfléchissons bien, dans notre intérêt, au chemin ~définitif~ du répertoire, automatiquement repris d'ici mais modifiable dans \"Chemin racine du partage\" ci-dessous lors de la création). Évitons les erreurs d'orthographe et de casse dans le nom car il servira de suffixe au chemin proposé en création (local et distant) et ce chemin, côté local, n'est modifiable à posteriori que via la configuration avancée.",
"Optional group for the device. Can be different on each device.": "Groupe optionnel de cet appareil pour le listage en chapitres dans l'écran principal. Il peut être différent sur chaque appareil.",
"Optional group for the folder. Can be different on each device.": "Groupe optionnel de ce partage pour le listage en chapitres dans l'écran principal. Il peut être différent sur chaque appareil.",
"Options": "Options",
"Out of Sync": "Désynchronisé",
"Out of Sync Items": "Éléments non synchronisés",
@@ -288,7 +294,7 @@
"Ownership": "Propriétaire",
"Password": "Mot de passe",
"Path": "Chemin",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Chemin local du partage. Est créé s'il n'existe pas. Le caractère tilde (~) peut être utilisé comme un raccourci pour",
"Path 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": "En création/acceptation manuelle d'un nouveau partage, c'est le chemin complet du répertoire à partager dans l'appareil local. Il peut être différent du \"Nom du partage\" (voir l'astuce dans l'aide correspondante ci-dessus). Il sera créé s'il n'existe pas. Nous pouvons entrer un chemin absolu (p.ex. \"/home/moi/Sync/Exemple\") ou relatif à celui du programme (p.ex \"..\\Partages\\Exemple\" - utile pour installation portable).\n\nDans l'écran de définition des valeurs par défaut \"Préférences pour les créations\"/\"Pour les nouveaux partages\" (menu Actions/Configuration), ce champ indique le chemin de base dans lequel seront créés les répertoires racine des partages que nous créerons ultérieurement ou auxquels nous accepterons de participer. Le caractère tilde (~) est un raccourci signifiant \"mon répertoire personnel\"",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Chemin où les versions seront conservées (laisser vide pour utiliser le dossier par défaut .stversions dans le partage).",
"Paths": "Chemins",
"Pause": "Pause",
@@ -301,23 +307,23 @@
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "Analyse périodique à intervalle défini et échec d'activation de la surveillance des changements. Nouvel essai toutes les 1mn :",
"Permanently add it to the ignore list, suppressing further notifications.": "L'ajouter à la liste des ignorés pour éviter des notifications ultérieures.",
"Please consult the release notes before performing a major upgrade.": "Veuillez consulter les notes de version avant de réaliser une mise à jour majeure.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Veuillez définir un nom d'utilisateur et un mot de passe dans la fenêtre de Configuration.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Veuillez configurer un nom dutilisateur et un mot de passe dans la fenêtre de Configuration.",
"Please wait": "Merci de patienter",
"Prefix indicating that the file can be deleted if preventing directory removal": "Ce préfixe autorise la suppression des fichiers pour permettre la suppression de répertoires",
"Prefix indicating that the pattern should be matched without case sensitivity": "Ce préfixe, inutile sur Windows et Mac OS, indique que le masque d'exclusion est insensible à la casse",
"Prefix indicating that the pattern should be matched without case sensitivity": "Ce préfixe, utile même sur Windows et Mac OS, indique que le masque d'exclusion est insensible à la casse",
"Preparing to Sync": "Préparation à la synchronisation",
"Preview": "Aperçu",
"Preview Usage Report": "Aperçu du rapport de statistiques d'utilisation",
"QR code": "Code QR",
"QUIC LAN": "LAN QUIC",
"QUIC WAN": "WAN QUIC",
"Quick guide to supported patterns": "Guide rapide des masques compatibles ci-dessous",
"Quick guide to supported patterns": "Guide rapide des modèles compatibles ci-dessous",
"Random": "Aléatoire",
"Receive Encrypted": "Réception chiffrée",
"Receive Only": "Réception seulement",
"Received data is already encrypted": "Les données reçues sont déjà chiffrées",
"Recent Changes": "Changements récents",
"Reduced by ignore patterns": "(Limité par des masques d'exclusion)",
"Reduced by ignore patterns": "(Limité par des modèles d'exclusion)",
"Relay LAN": "Relais LAN",
"Relay WAN": "Relais WAN",
"Release Notes": "Notes de version",
@@ -327,7 +333,7 @@
"Remove": "Enlever",
"Remove Device": "Supprimer l'appareil",
"Remove Folder": "Supprimer le partage",
"Required identifier for the folder. Must be the same on all cluster devices.": "Identifiant du partage. Doit être le même sur tous les appareils concernés (généré aléatoirement, mais modifiable à la création, par exemple pour faire entrer un appareil dans un partage pré-existant actuellement non connecté mais dont on connaît déjà l'ID, ou s'il n'y a personne à l'autre bout pour vous inviter à y participer).",
"Required identifier for the folder. Must be the same on all cluster devices.": "Identifiant du partage. Doit être le même sur tous les appareils concernés (généré aléatoirement, c'est pratique, mais il modifiable à notre gré à la création, par exemple pour faire entrer cet appareil dans un partage pré-existant actuellement non connecté mais dont on connaîtrait déjà l'identifiant, ou s'il n'y a personne à l'autre bout pour nous y inviter).",
"Rescan": "Réanalyser",
"Rescan All": "Tout réanalyser",
"Rescans": "Réanalyses/Surveillance",
@@ -348,7 +354,7 @@
"See external versioning help for supported templated command line parameters.": "Consulter l'aide de la gestion externe des versions pour les paramètres supportés de modèles de lignes de commande.",
"Select All": "Tout sélectionner",
"Select a version": "Choisissez une version",
"Select additional devices to share this folder with.": "Sélectionnez des appareils membres supplémentaires pour ce partage.",
"Select additional devices to share this folder with.": "Invitez des appareils membres supplémentaires pour ce partage.",
"Select additional folders to share with this device.": "Choisissez des partages supplémentaires pour cet appareil.",
"Select latest version": "Restaurer la dernière version",
"Select oldest version": "Restaurer la plus ancienne version",
@@ -365,14 +371,14 @@
"Share this folder?": "Acceptez-vous ce partage ?",
"Shared Folders": "Partages",
"Shared With": "Participant(s)",
"Sharing": "Partages",
"Sharing": "Liaisons",
"Show ID": "Afficher mon ID",
"Show QR": "Afficher le QR",
"Show detailed discovery status": "Afficher l'état détaillé de découverte",
"Show detailed listener status": "Afficher l'état détaillé de l'écouteur",
"Show diff with previous version": "Afficher les différences avec la version précédente",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Affiché à la place de l'ID de l'appareil dans l'état du groupe. Sera diffusé aux autres appareils comme nom convivial optionnel par défaut.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Nom convivial local affiché à la place de l'ID de l'appareil dans la plupart des écrans. Si laissé vide, c'est le nom convivial local de l'appareil distant qui sera utilisé. (Modifiable ultérieurement).",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Affiché à la place de l'ID de l'appareil dans l'état de la grappe. Sera diffusé aux autres appareils comme nom convivial optionnel par défaut.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Nom convivial local affiché à la place de l'ID de l'appareil dans la plupart des écrans. Si laissé vide, il sera peuplé par le nom convivial choisi par le propriétaire de l'appareil distant dès que celui-ci sera en ligne. (Modifiable ultérieurement).",
"Shut Down": "Arrêter",
"Shutdown Complete": "Arrêt complet",
"Simple": "Suivi simplifié",
@@ -390,6 +396,7 @@
"Staggered": "Versions échelonnées",
"Staggered File Versioning": "Versions échelonnées des fichiers",
"Start Browser": "Lancer le navigateur web",
"Starting": "Démarrage en cours",
"Statistics": "Statistiques",
"Stay logged in": "Rester connecté",
"Stopped": "Arrêté",
@@ -418,7 +425,7 @@
"TCP LAN": "Réseau local TCP",
"TCP WAN": "Réseau distant TCP",
"Take me back": "Vérifier",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "L'adresse de l'interface graphique est remplacée par une ou des options de lancement. Les modifications apportées ici ne seront pas effectives tant que ces options seront utilisées.",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "Ladresse de linterface graphique est actuellement définie via les options de lancement. Les modifications apportées ici ne seront pas effectives tant que ces options seront utilisées.",
"The Syncthing Authors": "Les concepteurs de Syncthing",
"The Syncthing admin interface is configured to allow remote access without a password.": "L'interface d'administration de Syncthing est paramétrée pour autoriser les accès à distance sans mot de passe.",
"The aggregated statistics are publicly available at the URL below.": "Les statistiques agrégées sont disponibles publiquement à l'adresse ci-dessous.",
@@ -492,11 +499,11 @@
"Upload Rate": "Envoi : Débit (Volume)",
"Uptime": "Durée de fonctionnement",
"Usage reporting is always enabled for candidate releases.": "L'envoi des statistiques d'utilisation est obligatoirement actif pour les versions préliminaires.",
"Use HTTPS for GUI": "Utiliser l'HTTPS pour le GUI",
"Use HTTPS for GUI": "Utiliser HTTPS pour linterface graphique",
"Use notifications from the filesystem to detect changed items.": "Utiliser les notifications du système de fichiers pour détecter les éléments modifiés.",
"User": "Utilisateur",
"User Home": "Répertoire de base de l'utilisateur",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Utilisateur/Mot de passe n'ont pas été définis pour l'accès à l'interface graphique. Envisagez de le faire.",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Lauthentification à linterface graphique par nom dutilisateur et mot de passe nest pas configurée. Vous devriez envisager de le faire.",
"Using a QUIC connection over LAN": "Connexion QUIC sur LAN",
"Using a QUIC connection over WAN": "Connexion QUIC sur WAN",
"Using a direct TCP connection over LAN": "Connexion TCP directe LAN",
@@ -517,7 +524,7 @@
"Watch for Changes": "Écouter les changements",
"Watching for Changes": "Surveillance des changements",
"Watching for changes discovers most changes without periodic scanning.": "La surveillance des changements découvre la plupart des changements sans réanalyses périodiques.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Lorsque vous ajoutez un appareil, gardez à l'esprit que le votre doit aussi être ajouté de l'autre coté.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Lorsque vous ajoutez un appareil, vous lui envoyez une invitation. Gardez à l'esprit qu'elle doit être accepe de l'autre coté, soyez patient.",
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Lorsqu'un nouveau partage est ajouté, gardez à l'esprit que c'est cet ID qui est utilisée pour lier les répertoires à travers les appareils. L'ID est sensible à la casse et sera forcément la même sur tous les appareils participant à ce partage.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Au-delà de un sur chaque appareil, Syncthing tentera d'établir autant de connexions simultanées. Si les valeurs diffèrent, la plus grande sera utilisée. Laissez à zéro pour laisser Syncthing décider.",
"Yes": "Oui",
+7
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Cruthaigh nó comhroinn fillteáin go huathoibríoch a fhógraíonn an gléas seo ag an gcosán réamhshocraithe.",
"Available debug logging facilities:": "Áiseanna logála dífhabhtaithe atá ar fáil:",
"Be careful!": "Bí cúramach!",
"Block Indexing": "Innéacsú Bloc",
"Body:": "Comhlacht:",
"Bugs": "Fabhtanna",
"Cancel": "Cuir ar ceal",
@@ -99,6 +100,7 @@
"Device": "Gléas",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Device \"{{name}}\" ({{device}} at {{address}}) ag iarraidh ceangal. Cuir gléas nua leis?",
"Device Certificate": "Teastas Gléis",
"Device Group": "Grúpa Gléasanna",
"Device ID": "Aitheantas gléis",
"Device Identification": "Aitheantas gléis",
"Device Name": "Ainm an Ghléis",
@@ -169,6 +171,7 @@
"Filter by date": "Scag de réir dáta",
"Filter by name": "Scag de réir ainm",
"Folder": "Fillteán",
"Folder Group": "Grúpa Fillteán",
"Folder ID": "Aitheantas an fhillteáin",
"Folder Label": "Lipéad Fillteáin",
"Folder Path": "Conair an Fhillteáin",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Bhí eireaball loga ar sos. Scrollaigh go bun an leathanaigh chun leanúint ar aghaidh.",
"Login failed, see Syncthing logs for details.": "Theip ar logáil isteach, féach logaí sioncronaithe le haghaidh sonraí.",
"Logs": "Logchomhaid",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Coinnigh innéacs de na bloic uile sa fhillteán, rud a chuireann ar chumas athúsáid bloic ó chomhaid eile agus athruithe á sioncrónú. Díchumasaigh chun méid an bhunachair shonraí a laghdú ar chostas gan a bheith in ann bloic a athúsáid trasna comhad.",
"Major Upgrade": "Uasghrádú Mór",
"Mass actions": "Gníomhartha Aifrinn",
"Maximum Age": "Aois Uasta",
@@ -279,6 +283,8 @@
"Off": "As",
"Oldest First": "An Chéad duine is sine",
"Optional descriptive label for the folder. Can be different on each device.": "Lipéad tuairisciúil roghnach don fhillteán. Is féidir a bheith difriúil ar gach gléas.",
"Optional group for the device. Can be different on each device.": "Grúpa roghnach don fheiste. Féadfaidh sé a bheith difriúil ar gach feiste.",
"Optional group for the folder. Can be different on each device.": "Grúpa roghnach don fhillteán. Féadfaidh sé a bheith difriúil ar gach gléas.",
"Options": "Roghanna",
"Out of Sync": "As Sioncronú",
"Out of Sync Items": "As Míreanna Sioncronaithe",
@@ -390,6 +396,7 @@
"Staggered": "Tuislithe",
"Staggered File Versioning": "Leagan Comhad Staggered",
"Start Browser": "Tosaigh Brabhsálaí",
"Starting": "Ag tosú",
"Statistics": "Staitisticí",
"Stay logged in": "Fan logáilte isteach",
"Stopped": "Stoptha",
+101 -39
View File
@@ -11,22 +11,23 @@
"Add Device": "Engadir dispositivo",
"Add Folder": "Engadir cartafol",
"Add Remote Device": "Engadir dispositivo remoto",
"Add devices from the introducer to our device list, for mutually shared folders.": "Engadir dispositivos desde o enviador ao noso dispositivo, para cartafois mutuamente compartidos.",
"Add devices from the introducer to our device list, for mutually shared folders.": "Engadir dispositivos desde o enviador ao noso dispositivo, para cartafoles mutuamente compartidos.",
"Add filter entry": "Engadir unha entrada ao filtro",
"Add ignore patterns": "Engadir patróns a ignorar",
"Add new folder?": "Engadir novo cartafol?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Ademais, aumentarase o lapso de reescaneo completo (60 veces, é dicir, novo por defecto dunha hora). Tamén pode configuralo de xeito manual para cada cartafol logo de escoller No.",
"Address": "Enderezo",
"Addresses": "Enderezos",
"Advanced": "Avanzado",
"Advanced": "Avanzada",
"Advanced Configuration": "Configuración avanzada",
"All Data": "Todos os datos",
"All Time": "Todo o tempo",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Todos os cartafois compartidos con este dispositivo teñen que estar protexidos por un contrasinal, de modo que os datos enviados sexan ilexibles sen o constrasinal indicado.",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Todos os cartafoles compartidos con este dispositivo teñen que estar protexidos por un contrasinal, de xeito que os datos enviados non se poidan ler sen o constrasinal.",
"Allow Anonymous Usage Reporting?": "Permitir o informe de uso anónimo?",
"Allowed Networks": "Redes permitidas",
"Alphabetic": "Alfabética",
"Altered by ignoring deletes.": "Cambiado por ignorar o borrado.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Sempre acendido cando o cartafol é de tipo \"{{foldertype}}\".",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Un comando externo xestiona as versións. Ten que eliminar o ficheiro do cartafol compartido. Si a ruta ao aplicativo contén espazos, deberían ir acotados.",
"Anonymous Usage Reporting": "Informe anónimo de uso",
"Anonymous usage report format has changed. Would you like to move to the new format?": "O formato do informe de uso anónimo cambiou. Quere usar o novo formato?",
@@ -46,12 +47,13 @@
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Agora a actualización automática permite escoller entre versións estables e versións candidatas.",
"Automatic upgrades": "Actualizacións automáticas",
"Automatic upgrades are always enabled for candidate releases.": "As actualizacións automáticas sempre están activadas para versións candidatas.",
"Automatically create or share folders that this device advertises at the default path.": "Crear ou compartir automaticamente os cartafoles na ruta predeterminada que este dispositivo anuncia.",
"Automatically create or share folders that this device advertises at the default path.": "Crear ou compartir automaticamente na ruta predeterminada os cartafoles que este dispositivo anuncia.",
"Available debug logging facilities:": "Ferramentas de depuración dispoñibles:",
"Be careful!": "Teña coidado!",
"Body:": "Corpo:",
"Bugs": "Erros",
"Cancel": "Cancelar",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Non se pode activar cando o cartafol é de tipo \"{{foldertype}}\".",
"Changelog": "Rexistro de cambios",
"Clean out after": "Limpar despois",
"Cleaning Versions": "Limpando Versións",
@@ -80,6 +82,7 @@
"Custom Range": "Rango personalizado",
"Danger!": "Perigo!",
"Database Location": "Localización da Base de Datos",
"Debug": "Depurar",
"Debugging Facilities": "Ferramentas de depuración",
"Default": "Predeterminado",
"Default Configuration": "Configuración Predeterminada",
@@ -92,7 +95,7 @@
"Deleted {%file%}": "Eliminado {{file}}",
"Deselect All": "Deseleccionar Todo",
"Deselect devices to stop sharing this folder with.": "Deleccionar os dispositivos cos que deixar de compartir este cartafol.",
"Deselect folders to stop sharing with this device.": "Deseleccionar os cartafois que deixar de compartir con este dispositivo.",
"Deselect folders to stop sharing with this device.": "Deseleccionar os cartafoles que deixen de compartirse con este dispositivo.",
"Device": "Dispositivo",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "O dispositivo \"{{name}}\" ({{device}} en {{address}}) quere conectarse. Engadir o dispositivo?",
"Device Certificate": "Certificado do Dispositivo",
@@ -122,7 +125,7 @@
"Do not add it to the ignore list, so this notification may recur.": "Non engadilo á lista de ignorados, para que esta notificación poida repetirse.",
"Do not restore": "Non restaurar",
"Do not restore all": "Non restablecer todo",
"Do you want to enable watching for changes for all your folders?": "Quere habilitar o control de cambios para todos os seus cartafois?",
"Do you want to enable watching for changes for all your folders?": "Queres activar o control de cambios para todos os teus cartafoles?",
"Documentation": "Documentación",
"Download Rate": "Velocidade de Descarga",
"Downloaded": "Descargado",
@@ -131,7 +134,7 @@
"Edit Device": "Editar o Dispositivo",
"Edit Device Defaults": "Editar predeterminados do dispositivo",
"Edit Folder": "Editar o Cartafol",
"Edit Folder Defaults": "Editar predeterminados dos cartafoles",
"Edit Folder Defaults": "Editar as predeterminacións dos Cartafoles",
"Editing {%path%}.": "Editando {{path}}.",
"Enable Crash Reporting": "Activar informar dos fallos",
"Enable NAT traversal": "Habilitar o NAT traversal",
@@ -140,16 +143,17 @@
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Activa o envío de atributos extendidos a outros dispositivos, e aplicar os atributos extendidos recibidos. Podería requerir a execución con privilexios elevados.",
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Activa o envío de atributos extendidos a outros dispositivos, pero non aplica atributos extendidos que se reciben. Isto podería afectar significativamente ao rendemento. Sempre está activado cando «Sincr Atributos Extendidos\" está activado.",
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Activa o envío de información sobre a propiedade a outros dispositivos, e aplica a información sobre a propiedade cando se recibe. Normalmente require a execución con privilexios elevados.",
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Activa o envío a outros dispositivos de información sobre a propiedade, pero non aplica información entrante sobre a propiedade. Isto pode afectar en gran medida ao rendemento. Está sempre activado cando \"Sincronización da propiedade\" está activada.",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Introduza un número non negativo (por exemplo, \"2.35\") e seleccione unha unidade. As porcentaxes son como partes totais do tamaño do disco.",
"Enter a non-privileged port number (1024 - 65535).": "Introduza un número de porto non privilexiado (1024-65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Introduza direccións separadas por comas (\"tcp://ip:porto\", \"tcp://host:porto\") ou \"dynamic\" para realizar o descubrimento automático da dirección.",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Introduza enderezos separados por comas (\"tcp://ip:porto\", \"tcp://host:porto\") ou \"dynamic\" para realizar o descubrimento automático do enderezo.",
"Enter ignore patterns, one per line.": "Introduza patróns a ignorar, un por liña.",
"Enter up to three octal digits.": "Introduza ata tres díxitos octais.",
"Error": "Erro",
"Extended Attributes": "Atributos Estendidos",
"Extended Attributes Filter": "Filtro de Atributos Estendidos",
"External": "Externo",
"External File Versioning": "Versionado de Fichiro Externo",
"External File Versioning": "Versionado de Ficheiro Externo",
"Failed Items": "Elmentos fallados",
"Failed to load file versions.": "Fallou a carga das versións dos ficheiros.",
"Failed to load ignore patterns.": "Fallou a carga de patróns ignorados.",
@@ -158,6 +162,10 @@
"File Pull Order": "Orde de Obtención de Arquivos",
"File Versioning": "Versionado de Ficheiros",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Os ficheiros móvense ao directorio .stversions cando se substitúen ou eleminan con Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Os ficheiros móvense a unha versión marcada coa data no directorio .stversions cando Syncthing os substitúe ou elimina.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "O ficheiros están protexidos dos cambios realizados por outros dispositivos, pero os cambios neste dispositivo serán sincronizados co resto do grupo.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Os ficheiros están sincronizados desde o grupo, pero os cambios realizados localmente non se envían aos outros dispositivos.",
"Filesystem Watcher Errors": "Vixiante de erros no sistema de ficheiros",
"Filter by date": "FIltrar por data",
"Filter by name": "Filtrar por nome",
"Folder": "Cartafol",
@@ -167,16 +175,18 @@
"Folder Status": "Estado do Cartafol",
"Folder Type": "Tipo do Cartafol",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "O tipo de cartafol \"{{receiveEncrypted}}\" so pode ser establecido ao engadir un cartafol novo.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "O tipo de cartafol \"{{receiveEncrypted}}\" non se pode cambiar despois de engadir o cartafol. Ten que eliminar o cartafol, eliminar ou desencriptar os datos do disco e volver a engadirlo.",
"Folders": "Cartafois",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "O tipo de cartafol \"{{receiveEncrypted}}\" non se pode cambiar despois de engadir o cartafol. Ten que eliminar o cartafol, eliminar ou descifrar os datos do disco e volver a engadirlo.",
"Folders": "Cartafoles",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Houbo un erro nos seguintes cartafoles ao comezar a comprobar os cambios. Vaise reintentar cada minutos, polo que os erros pronto poderían desaparecer. Se persisten, intente solucionar o problema de base e pida axuda se non pode arranxalo.",
"Forever": "Para sempre",
"Full Rescan Interval (s)": "Intervalo de Escaneamento Completo (s)",
"GUI": "GUI",
"GUI": "Interface",
"GUI / API HTTPS Certificate": "Certificado HTTPS GUI/API",
"GUI Authentication Password": "Contrasinal de Autenticación da GUI",
"GUI Authentication User": "Usuario de Autenticación da GUI",
"GUI Authentication: Set User and Password": "Autenticación da GUI: Establecer o Usuario e o Contrasinal",
"GUI Listen Address": "Dirección de Escoita da GUI",
"GUI Listen Address": "Enderezo de Escoita da GUI",
"GUI Override Directory": "Interface do directorio de sobrescritura",
"GUI Theme": "Tema da GUI",
"General": "Xeral",
"Generate": "Xerar",
@@ -185,10 +195,26 @@
"Global State": "Estado Global",
"Help": "Axuda",
"Home page": "Páxina de inicio",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Emporiso, os axustes actuais indican que igual non quere activalo. Desactivamos para vostede o aviso automático de fallo.",
"Identification": "Identificación",
"If untrusted, enter encryption password": "Se non é de confianza, escriba un contrasinal",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Se queres evitar que outras persoas usuarias desta computadora accedan a Syncthing e a través del e aos teus ficheiros, considera establecer a autenticación.",
"Ignore": "Ignorar",
"Ignore Patterns": "Ignorar patróns",
"Ignore Permissions": "Ignorar permisos",
"Ignore patterns can only be added after the folder is created. If checked, an input field to enter ignore patterns will be presented after saving.": "Só se poden engadir os patróns a ignorar despois de crear o cartafol. Se está marcado, vaise mostrar un campo de texto para escribir patróns a ignorar despois de gardar.",
"Ignored Devices": "Dispositivos Ignorados",
"Ignored Folders": "Cartafoles ignorados",
"Ignored at": "Ignorado o",
"Included Software": "Software incluído",
"Incoming Rate Limit (KiB/s)": "Límite de Descaga (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Unha configuración incorrecta pode danar os contidos do teu cartafol e deixar Syncthing inutilizable.",
"Incorrect user name or password.": "Nome de usuario ou contrasinal incorrecto.",
"Info": "Info",
"Internally used paths:": "Rutas internas utilizadas:",
"Introduced By": "Presentado por",
"Introducer": "Presentador",
"Introduction": "Presentación",
"Inversion of the given condition (i.e. do not exclude)": "Inversión da condición dada (por exemplo, non excluír)",
"Keep Versions": "Manter Versións",
"LDAP": "LDAP",
@@ -199,7 +225,13 @@
"Last Scan": "Último escaneamento",
"Last seen": "Visto por última vez",
"Latest Change": "Último cambio",
"Learn more": "Saber máis",
"Learn more at {%url%}": "Aprenda máis en {{url}}",
"Limit": "Límite",
"Limit Bandwidth in LAN": "Limitar ancho de banda na LAN",
"Listener Failures": "Fallos na escoita",
"Listener Status": "Estado da escoita",
"Listeners": "Instancias á escoita",
"Loading data...": "Cargando datos...",
"Loading...": "Cargando...",
"Local Additions": "Adicións\tlocais",
@@ -213,18 +245,23 @@
"Log Out": "Pechar Sesión",
"Log in to see paths information.": "Inicia sesión para ver información das rutas.",
"Log in to see version information.": "Inicia sesión para ver información da versión.",
"Log tailing paused. Scroll to the bottom to continue.": "Rexistro continuo en pausa. Desprácese abaixo para continuar.",
"Login failed, see Syncthing logs for details.": "Fallou o inicio de sesión, vexa os rexistros de Syngthing para máis detalles.",
"Logs": "Rexistros",
"Major Upgrade": "Actualización Maior",
"Mass actions": "Accións en masa",
"Maximum Age": "Idade Máxima",
"Maximum single entry size": "Tamaño máximo dunha única entrada",
"Maximum total size": "Tamaño máximo total",
"Metadata Only": "Só Metadatos",
"Minimum Free Disk Space": "Espacio Mínimo Libre no Disco",
"Mod. Device": "Dispositivo Mod.",
"Mod. Time": "Hora da Mod.",
"More than a month ago": "Fai máis dun mes",
"More than a week ago": "Fai máis dunha semana",
"More than a year ago": "Fai máis dun ano",
"Move to top of queue": "Mover a enriba da cola",
"Multi level wildcard (matches multiple directory levels)": "Comodín multi nivel (concorda con varios niveis de directorios)",
"Never": "Nunca",
"New Device": "Dispositivo Novo",
"New Folder": "Cartafol Novo",
@@ -235,10 +272,15 @@
"No rules set": "Sen regras",
"No upgrades": "Sen actualizacións",
"Not shared": "Non compartido",
"Notice": "Aviso",
"Number of Connections": "Número de Conexións",
"OK": "OK",
"Off": "Non activo",
"Oldest First": "Máis Vellos Primeiro",
"Optional descriptive label for the folder. Can be different on each device.": "Etiqueta descritiva opcional para o cartafol. Pode ser distinta en cada dispositivo",
"Optional descriptive label for the folder. Can be different on each device.": "Etiqueta descritiva optativa para o cartafol. Pode ser distinta en cada dispositivo.",
"Options": "Opcións",
"Out of Sync": "Sen sincronizar",
"Out of Sync Items": "Elementos sen sincronizar",
"Outgoing Rate Limit (KiB/s)": "Límite de Saída (KiB/s)",
"Override": "Sobrescribir",
"Override Changes": "Sobrescribir os Cambios",
@@ -253,10 +295,14 @@
"Paused": "Parada",
"Paused (Unused)": "Parada (Sen uso)",
"Pending changes": "Cambios pendentes",
"Periodic scanning at given interval and disabled watching for changes": "Escaneo periódico a intervalos dados e desactivada a busca de cambios",
"Periodic scanning at given interval and enabled watching for changes": "Escaneo periódico a intervalos dados e activa a busca de cambios",
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:": "Escaneo periódico a intervalos dados e fallou o axuste de buscar cambios, reintentando cada minuto:",
"Permanently add it to the ignore list, suppressing further notifications.": "Engadilo permanentemente á lista de ignorados, suprimindo notificacións futuras.",
"Please consult the release notes before performing a major upgrade.": "Por favor consulte as notas de lanzamento antes de realizar unha actualización maior.",
"Please set a GUI Authentication User and Password in the Settings dialog.": "Por favor configure un Usuario e Contrasinal de Autenticación para a GUI no diálogo de Configuración.",
"Please wait": "Por favor espere",
"Prefix indicating that the file can be deleted if preventing directory removal": "Prefixo que indica que o ficheiro se pode eliminar se evita a eliminación do directorio",
"Prefix indicating that the pattern should be matched without case sensitivity": "Prefixo que indica que o patrón debe coincidir sen distinguir maiúsculas e minúsculas",
"Preparing to Sync": "Preparandose para Sincronizar",
"Preview": "Vista previa",
@@ -266,8 +312,9 @@
"QUIC WAN": "QUIC WAN",
"Quick guide to supported patterns": "Guía rápida dos patróns soportados",
"Random": "Aleatorio",
"Receive Encrypted": "Recibir datos cifrados",
"Receive Only": "Só Recibir",
"Received data is already encrypted": "Os datos recibidos xa están encriptados",
"Received data is already encrypted": "Os datos recibidos xa están cifrados",
"Recent Changes": "Cambios Recentes",
"Reduced by ignore patterns": "Reducido por patróns de ignorar",
"Relay LAN": "Relevo LAN",
@@ -297,23 +344,25 @@
"Saving changes": "Gardando os cambios",
"Scan Time Remaining": "Tempo Restante de Reescaneo",
"Scanning": "Escaneando",
"See external versioning help for supported templated command line parameters.": "Ver axuda externa sobre versións para os modelos de parámetros na liña de ordes.",
"Select All": "Seleccionar Todo",
"Select a version": "Seleccionar unha versión",
"Select additional devices to share this folder with.": "Seleccione dispositivos adicionais cos que compartir este cartafol.",
"Select additional folders to share with this device.": "Seleccione cartafois adicionais para compatir con este dispositivo.",
"Select additional folders to share with this device.": "Seleccione cartafoles adicionais para compatir con este dispositivo.",
"Select latest version": "Seleccionar a última versión",
"Select oldest version": "Seleccionar a versión máis vella",
"Send & Receive": "Enviar e Recibir",
"Send Extended Attributes": "Enviar Atributos Extensos",
"Send Extended Attributes": "Enviar Atributos ampliados",
"Send Only": "Só Enviar",
"Send Ownership": "Enviar Propiedade",
"Set Ignores on Added Folder": "Establecer ignorados no Cartafol engadido",
"Settings": "Configuración",
"Share": "Compartir",
"Share Folder": "Compartir Cartafol",
"Share by Email": "Compartir por Correo Electrónico",
"Share by SMS": "Compartir por SMS",
"Share this folder?": "Compartir este cartafol?",
"Shared Folders": "Cartafois Compartidos",
"Shared Folders": "Cartafoles Compartidos",
"Shared With": "Compartido Con",
"Sharing": "Compartindo",
"Show ID": "Mostrar ID",
@@ -332,20 +381,24 @@
"Smallest First": "Os máis pequenos primeiro",
"Some discovery methods could not be established for finding other devices or announcing this device:": "Algúns métodos de descubrimento non se puideron establecer para descubrir outros dispositivo ou anunciarse:",
"Some items could not be restored:": "Non se puideron recuperar algúns ítems:",
"Some listening addresses could not be enabled to accept connections:": "Algunhas direccións de escoita non se puideron habilitar para aceptar conexións:",
"Some listening addresses could not be enabled to accept connections:": "Algúns enderezos de escoita non se puideron activar para aceptar conexións:",
"Source Code": "Código Fonte",
"Stable releases and release candidates": "Versións estables e candidatos de lanzamento",
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.": "As versións estables retrásanse ao redor de dúas semanas. Durante este tempo próbanse como candidatas de lanzamento.",
"Stable releases only": "Só versións estables",
"Staggered": "Gradual",
"Staggered File Versioning": "Versionado de Ficheiros Gradual",
"Start Browser": "Iniciar o Buscador",
"Statistics": "Estadísticas",
"Statistics": "Estatísticas",
"Stay logged in": "Manter a sesión",
"Stopped": "Parado",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Só almacena e sincroniza datos encriptados. Os cartafois en todos os dispositivos conectados necesitan configuarse co mesmo constrasinal ou ser do tipo \"{{receiveEncrypted}}\" tamén.",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Só almacena e sincroniza datos cifrados. Os cartafoles en todos os dispositivos conectados necesitan configuarse co mesmo constrasinal ou ser do tipo \"{{receiveEncrypted}}\" tamén.",
"Subject:": "Asunto:",
"Sync Extended Attributes": "Sincronizar os Atributos Extendidos",
"Support": "Axuda",
"Support Bundle": "Paquete de axuda",
"Sync Extended Attributes": "Sincronizar os Atributos ampliados",
"Sync Ownership": "Sincronizar Propiedade",
"Sync Protocol Listen Addresses": "Direccións de Escoita do Protocolo de Sincronización",
"Sync Protocol Listen Addresses": "Enderezos de Escoita do Protocolo de Sincronización",
"Sync Status": "Estado da Sincronización",
"Syncing": "Sincronizando",
"Syncthing device ID for \"{%devicename%}\"": "Sincronizando o ID de dispositivo para \"{{devicename}}\"",
@@ -353,8 +406,8 @@
"Syncthing includes the following software or portions thereof:": "Syncthing inclúe todo o seguinte software ou porcións dos mesmos:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing e Software Libre licenciado baixo a MPL v2.0.",
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing e un programa de sincronización de ficheiros continua. Sincroniza ficheiros entre dous ou máis computadores en tempo real, de maneira segura protexida de miradas indiscretas. Os teus datos son só teus e mereces elixir onde se gardan, se é cunha terceira parte, e como se transmiten pola rede.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing está escoitando nas seguintes direccións de rede intentos de conexión doutros dispositivos:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing non está escoitando intentos de conexión doutros dispositivos en ningunha dirección. Só funcionarán as conexións saíntes deste dispositivo.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing está á escoita de intentos de conexión doutros dispositivos nos seguintes enderezos de rede:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing non está agardando intentos de conexión doutros dispositivos en ningún enderezo. Só funcionarán as conexións saíntes deste dispositivo.",
"Syncthing is restarting.": "Syncthing estase a reiniciar.",
"Syncthing is saving changes.": "Syncthing esta a gardar os cambios.",
"Syncthing is upgrading.": "Syncthing estase a actualizar.",
@@ -364,20 +417,22 @@
"TCP LAN": "LAN TCP",
"TCP WAN": "WAN TCP",
"Take me back": "Léveme de volta",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "A dirección da GUI sobrescríbese polas opcións de arranque. Os cambios aquí non terán efecto mentres que a invalidación estea activa.",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "O enderezo da GUI sobrescríbese polas opcións de arranque. Os cambios feitos aquí non terán efecto mentres que a sobrescritura estea activa.",
"The Syncthing Authors": "Os Autores de Syncthing",
"The Syncthing admin interface is configured to allow remote access without a password.": "A inteface de aministración de Syncthing está configurada para permitir o acceso remoto sen ningún contrasinal.",
"The aggregated statistics are publicly available at the URL below.": "As estatísticas agregadas son públicas na URL de debaixo.",
"The cleanup interval cannot be blank.": "O intervalo de limpeza non pode estar en branco.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Gardouse a configuración pero non se activou. Ten que reiniciar Syncthing para activar a configuración nova.",
"The device ID cannot be blank.": "O ID de dispositivo non pode estar en branco.",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "O informe de uso encriptado envíase diariamente. Úsase para seguir plataformas comús, tamaños de cartafois e versións da aplicación. Se os datos que se envían cambian, preguntaráselle con este diálogo outra vez.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "O ID de dispositivo a escribir aquí pódese atopar no cadro \"Accións > Mostrar ID\" no outro dispositivo. Os espazos e guións son optativos (ignóranse).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "O informe de uso cifrado envíase diariamente. Úsase para seguir plataformas comúns, tamaños de cartafoles e versións da aplicación. Se os datos que se envían cambian, preguntaráselle con este diálogo outra vez.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "O ID de dispositivo introducido non parece válido. Ten que ser unha cadea de 52 ou 56 caracteres consistente de letras e números, sendo opcionais os espacios e guións.",
"The folder ID cannot be blank.": "O ID de cartafol non pode estar en branco.",
"The folder ID must be unique.": "O ID de cartafol ten que ser único.",
"The folder content on other devices will be overwritten to become identical with this device. Files not present here will be deleted on other devices.": "O contenido do cartafol en outros dispositivos será sobrescrito para volverse identico con este dispositivo. Os ficheiros que non estean aquí eliminaranse nos outros dispositivos.",
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.": "O contenido do cartafol neste dispositivo será sobrescrito para volverse idéntico aos outros dispositivos. Os ficheiros novos serán eliminados.",
"The folder path cannot be blank.": "A ruta do cartafol non pode estar en branco.",
"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.": "Úsanse os seguintes intervalos: na primeira hora gárdase unha versión cada 30 segundos, durante o primeiro día cada hora, nos seguintes 30 días gárdase unha versión diaria, ata o tempo máximo establecido que se garda unha versión semanal.",
"The following items could not be synchronized.": "Non se puido sincronizar os seguintes ítems.",
"The following items were changed locally.": "Cambiáronse localmente os seguintes ítems.",
"The following methods are used to discover other devices on the network and announce this device to be found by others:": "Os seguintes métodos úsanse para descubrir outros dispositivos na rede e anunciar este dispositivo para que o encontren outros:",
@@ -400,11 +455,12 @@
"The rescan interval must be a non-negative number of seconds.": "O intervalo de reescaneo ten que ser un número non negativo de segundos.",
"There are no devices to share this folder with.": "Non hai dispositivos cos que compartir este cartafol.",
"There are no file versions to restore.": "Non hai versións de ficheriso para restaurar.",
"There are no folders to share with this device.": "Non hai cartafois que compartir con este dispositivo.",
"There are no folders to share with this device.": "Non hai cartafoles que compartir con este dispositivo.",
"They are retried automatically and will be synced when the error is resolved.": "Reinténtase automáticamente e sincronízanse cando se resolve o erro.",
"This Device": "Este Dispositivo",
"This Month": "Este Mes",
"This can easily give hackers access to read and change any files on your computer.": "Esto pode dar acceso fácil a hackers para ler e cambiar ficheiros no teu compturador.",
"This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "Este dispositivo non pode descubrir outros dispositivos automaticamente ou anunciar a súa dirección a outros. So se poden contectar dispositivos con direccións estáticas configuradas.",
"This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "Este dispositivo non pode descubrir outros dispositivos automaticamente ou anunciar o seu enderezo a outros. So se poden contectar dispositivos con enderezos estáticos configurados.",
"This is a major version upgrade.": "Esta é unha actualización maior.",
"This setting controls the free space required on the home (i.e., index database) disk.": "Este axuste controla o espacio en disco dispoñible necesario no disco principal (p.ej. índice da base de datos).",
"Time": "Hora",
@@ -421,11 +477,11 @@
"Undecided (will prompt)": "Sen decidir (preguntará)",
"Unexpected Items": "Ítems non espeardos",
"Unexpected items have been found in this folder.": "Atopáronse ítems non esperados neste cartafol.",
"Unignore": "Des-ignorar",
"Unignore": "Non ignorar",
"Unknown": "Descoñecido",
"Unshared": "Des-compartido",
"Unshared Devices": "Dispositivos des-compartidos",
"Unshared Folders": "Cartafois des-compartidos",
"Unshared": "Non compartido",
"Unshared Devices": "Dispositivos non compartidos",
"Unshared Folders": "Cartafoles non compartidos",
"Untrusted": "Sen confiar",
"Up to Date": "Ao día",
"Updated {%file%}": "Actualizouse {{file}}",
@@ -456,8 +512,13 @@
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Aviso, esta ruta e un directorio pai dun cartafol existente \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".": "Aviso, esta ruta é un subdirectorio dun cartafol existente \"{{otherFolder}}\".",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).": "Aviso, esta ruta é un subdirectorio de un cartafol existente \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.": "Aviso: se utiliza un vixiante externo como {{syncthingInotify}}, debería comprobar que está desactivado.",
"Watch for Changes": "Buscar cambios",
"Watching for Changes": "Buscando cambios",
"Watching for changes discovers most changes without periodic scanning.": "Ao buscar cambios atópanse a maioiría dos cambios sen escaneo periódico.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Ao engadir un dispositivo novo, teña en mente que tamén debe engadir o dispositivo do outro lado.",
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "Ao engadir un cartafol novo, teña en mete que o ID de Cartafol úsase para enlazar os cartafois entre dispositivos. Son sensíbles a maiúsculas e teñen que coincidir exactamente entre dispositivos.",
"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.": "Ao engadir un cartafol novo, teña en mete que o ID de Cartafol úsase para enlazar os cartafoles entre dispositivos. Son sensibles a maiúsculas e teñen que coincidir exactamente entre dispositivos.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Cando se establece máis de un en ambos dispositivos, Syncthing intentará establecer múltiples conexións concurrentes. Se os valores difiren, o máis alto será o que se use. Estableza cero para que Syncthing decida.",
"Yes": "Sí",
"Yesterday": "Onte",
"You can also copy and paste the text into a new message manually.": "Tamén pode copiar e pegar o texto nunha mensaxe de xeito manual.",
@@ -465,12 +526,12 @@
"You can change your choice at any time in the Settings dialog.": "Tamén pode cambiar a súa decisión en calqueira momento no diálogo de Opcións.",
"You can read more about the two release channels at the link below.": "Pode ler máis sobre as dúas canles de lanzamentos na ligazón de debaixo.",
"You have no ignored devices.": "Non ten dispositivos ignorados.",
"You have no ignored folders.": "Non ten cartafois ignorados.",
"You have no ignored folders.": "Non ten cartafoles ignorados.",
"You have unsaved changes. Do you really want to discard them?": "Ten cambios sen gardar. Realmente quere descartalos?",
"You must keep at least one version.": "Ten que manter ao menos unha versión.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Nunca debe engadir nen cambiar nada localmente nun cartafol \"{{receiveEncrypted}}\".",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "A súa aplicación SMS debe abrirse para deixarlle escoller un destinatario e envialo desde o seu propio número.",
"Your email app should open to let you choose the recipient and send it from your own address.": "A súa amplicación de correo debe abrirse para deixarlle escoller un destinatario e envialo desde a súa propia dirección.",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "A túa aplicación SMS debe abrirse para deixarche elixir un correspondente e envialo desde o teu propio número.",
"Your email app should open to let you choose the recipient and send it from your own address.": "A túa aplicación de correo ten que abrirse para deixarche escoller a persoa correspondente e envialo desde o teu propio enderezo.",
"days": "días",
"deleted": "eliminado",
"deny": "denegar",
@@ -492,6 +553,7 @@
}
},
"unknown device": "dispositivo descoñecido",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} quere compartir o cartafol \"{{cartafol}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} quere compartir o cartafol \"{{folderlabel}}\" ({{folder}})."
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} quere compartir o cartafol \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} quere compartir o cartafol \"{{folderlabel}}\" ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} quere volver a presentar este dispositivo."
}
+2
View File
@@ -82,6 +82,7 @@
"Custom Range": "טווח מותאם אישית",
"Danger!": "סכנה!",
"Database Location": "מיקום מסד נתונים",
"Debug": "איתור באגים",
"Debugging Facilities": "מתקני דיבוג",
"Default": "ברירת מחדל",
"Default Configuration": "תצורת ברירת מחדל",
@@ -210,6 +211,7 @@
"Incoming Rate Limit (KiB/s)": "מגבלת קצב נכנס (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "תצורה שגויה עלולה לגרום נזק לתכולת התיקייה שלך ולהפוך את Syncthing לבלתי ניתן להפעלה.",
"Incorrect user name or password.": "שם משתמש או סיסמה שגויים.",
"Info": "מידע",
"Internally used paths:": "נתיבים בשימוש פנימי:",
"Introduced By": "הוצג על ידי",
"Introducer": "מציג",
+6
View File
@@ -49,6 +49,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Automatski stvorite ili dijelite mape koje ovaj uređaj oglašava na zadanoj stazi.",
"Available debug logging facilities:": "Dostupni alati za bilježenje grešaka:",
"Be careful!": "Pazi!",
"Block Indexing": "Indeksiranje blokova",
"Body:": "Sadržaj:",
"Bugs": "Greške",
"Cancel": "Odustani",
@@ -98,6 +99,7 @@
"Device": "Uređaj",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Uređaj „{{name}}“ ({{device}} na {{address}}) se želi povezati. Dodati novi uređaj?",
"Device Certificate": "Certifikat uređaja",
"Device Group": "Grupa uređaja",
"Device ID": "ID uređaja",
"Device Identification": "Identifikacija uređaja",
"Device Name": "Ime uređaja",
@@ -168,6 +170,7 @@
"Filter by date": "Filtriraj po datumu",
"Filter by name": "Filtriraj po imenu",
"Folder": "Mapa",
"Folder Group": "Grupa mapa",
"Folder ID": "ID mape",
"Folder Label": "Oznaka mape",
"Folder Path": "Staza mape",
@@ -275,6 +278,8 @@
"Off": "Isključeno",
"Oldest First": "Najprije najstarije",
"Optional descriptive label for the folder. Can be different on each device.": "Neobavezna opisna etiketa za mapu. Može biti različita na svakom uređaju.",
"Optional group for the device. Can be different on each device.": "Opcionalna grupa za uređaj. Može biti drugačija na svakom uređaju.",
"Optional group for the folder. Can be different on each device.": "Opcionalna grupa za mapu. Može biti drugačija na svakom uređaju.",
"Options": "Opcije",
"Out of Sync": "Nesinkronizirano",
"Out of Sync Items": "Nesinkronizirane stavke",
@@ -386,6 +391,7 @@
"Staggered": "U fazama",
"Staggered File Versioning": "Upravljanje verzijama datoteka u fazama",
"Start Browser": "Pokreni preglednik",
"Starting": "Pokretanje",
"Statistics": "Statistike",
"Stay logged in": "Ostanite prijavljeni",
"Stopped": "Zaustavljeno",
+44 -4
View File
@@ -1,16 +1,18 @@
{
"A device with that ID is already added.": "Már van hozzáadott eszköz ezzel az azonosítóval.",
"A negative number of days doesn't make sense.": "Negatív számú napnak nincs értelme.",
"A new major version may not be compatible with previous versions.": "Az új főverzió nem feltétlenül kompatibilis az előző verziókkal.",
"A new major version may not be compatible with previous versions.": "Az új főverzió nem biztos, hogy kompatibilis az előző verziókkal.",
"API Key": "API-kulcs",
"About": "Névjegy",
"About": "Rólunk",
"Action": "Művelet",
"Actions": "Műveletek",
"Active filter rules": "Aktív szűrők",
"Add": "Hozzáadás",
"Add Device": "Eszköz hozzáadása",
"Add Folder": "Mappa hozzáadása",
"Add Remote Device": "Távoli eszköz hozzáadása",
"Add devices from the introducer to our device list, for mutually shared folders.": "Eszközök hozzáadása a bevezetőről az eszköz listához, a közösen megosztott mappákhoz.",
"Add filter entry": "Szűrő hozzáadása",
"Add ignore patterns": "Mellőzési minták hozzáadása",
"Add new folder?": "Hozzáadható az új mappa?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Ezzel együtt a teljes átnézési intervallum jóval meg fog nőni (60-szoros értékre, vagyis 1 óra az új alapértelmezett érték). A „Nem” kiválasztásával később kézzel is módosítható ez az érték minden egyes mappára külön-külön.",
@@ -25,9 +27,11 @@
"Allowed Networks": "Engedélyezett hálózatok",
"Alphabetic": "ABC sorrendben",
"Altered by ignoring deletes.": "Módosítva a törlések figyelmen kívül hagyásával.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Mindig aktív, ha a mappa típusa \"{{foldertype}}\".",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Külső program kezeli a fájlverzió-követést. Az távolítja el a fájlt a megosztott mappából. Ha az alkalmazás útvonala szóközöket tartalmaz, zárójelezni szükséges az útvonalat.",
"Anonymous Usage Reporting": "Névtelen felhasználási adatok küldése",
"Anonymous usage report format has changed. Would you like to move to the new format?": "A névtelen használati jelentés formátuma megváltozott. Szeretnél áttérni az új formátumra?",
"Applied to LAN": "LAN-ra alkalmazva",
"Apply": "Alkalmazás",
"Are you sure you want to override all remote changes?": "Biztos, hogy felülírható minden távoli módosítás?",
"Are you sure you want to permanently delete all these files?": "Biztos, hogy véglegesen törölhetőek mindezek a fájlok?",
@@ -36,6 +40,7 @@
"Are you sure you want to restore {%count%} files?": "Biztos, hogy vissza akarod állítani a(z) {{count}} fájlt?",
"Are you sure you want to revert all local changes?": "Biztos, hogy visszavonható minden helyi módosítás?",
"Are you sure you want to upgrade?": "Biztos, hogy frissíteni akarod?",
"Authentication Required": "Hitelesítés szükséges",
"Authors": "Szerzők",
"Auto Accept": "Automatikus elfogadás",
"Automatic Crash Reporting": "Automatikus összeomlás-jelentés",
@@ -48,6 +53,7 @@
"Body:": "Szövegmező:",
"Bugs": "Hibák",
"Cancel": "Mégsem",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Nem elérhető, ha a mappa típusa \"{{foldertype}}\".",
"Changelog": "Változások",
"Clean out after": "Takarítás",
"Cleaning Versions": "Tisztító verziók",
@@ -62,6 +68,7 @@
"Configured": "Beállított",
"Connected (Unused)": "Kapcsolódva (használaton kívül)",
"Connection Error": "Kapcsolódási hiba",
"Connection Management": "Kapcsolatkezelő",
"Connection Type": "Kapcsolattípus",
"Connections": "Kapcsolatok",
"Connections via relays might be rate limited by the relay": "A közvetítőkön keresztüli csatlakozások sebességét a közvetítő korlátozhatja",
@@ -75,7 +82,9 @@
"Custom Range": "Egyedi intervallum",
"Danger!": "Veszély!",
"Database Location": "Az adatbázis helye",
"Debug": "Hibakeresés",
"Debugging Facilities": "Hibakeresési képességek",
"Default": "Alapértelmezett",
"Default Configuration": "Alapértelmezett beállítások",
"Default Device": "Alapértelmezett eszköz",
"Default Folder": "Alapértelmezett mappa",
@@ -93,6 +102,7 @@
"Device ID": "Eszközazonosító",
"Device Identification": "Eszközazonosító",
"Device Name": "Eszköz neve",
"Device Status": "Eszközállapot",
"Device is untrusted, enter encryption password": "Az eszköz nem megbízható, adjon meg titkosítási jelszót",
"Device rate limits": "Eszköz sávszélessége",
"Device that last modified the item": "Az eszköz, amely utoljára módosította az elemet",
@@ -141,6 +151,7 @@
"Enter up to three octal digits.": "Adjon meg legfeljebb három oktális számjegyet.",
"Error": "Hiba",
"Extended Attributes": "Kiterjesztett attribútumok",
"Extended Attributes Filter": "Kiterjesztett attribútum-szűrő",
"External": "Külső",
"External File Versioning": "Külső fájlverzió-követés",
"Failed Items": "Hibás elemek",
@@ -161,6 +172,7 @@
"Folder ID": "Mappaazonosító",
"Folder Label": "Mappacímke",
"Folder Path": "Mappa elérési útvonala",
"Folder Status": "Mappaállapot",
"Folder Type": "Mappatípus",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "A(z) „{{receiveEncrypted}}” mappatípus csak új mappa hozzáadásakor adható meg.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "A „{{receiveEncrypted}}” mappa típusa nem változtatható meg a létrehozása után. El kell távolítani a mappát, az adatokat törölni kell vagy visszafejteni a lemezen és újra hozzáadni a mappát.",
@@ -182,6 +194,7 @@
"Global Discovery Servers": "Globális felfedező kiszolgálók",
"Global State": "Globális állapot",
"Help": "Súgó",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Tipp: csak tiltó szabályok találhatók, miközben az alapértelmezés is tiltás. Fontolja meg egy „permit any” (mindent engedélyező) szabály hozzáadását utolsóként.",
"Home page": "Főoldal",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "A jelenlegi beállítások azonban azt jelzik, hogy nem kívánja engedélyezni. Az automatikus összeomlás-jelentés ezért letiltásra került.",
"Identification": "Azonosítás",
@@ -197,9 +210,12 @@
"Included Software": "Felhasznált szoftver",
"Incoming Rate Limit (KiB/s)": "Bejövő sebességkorlát (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Helytelen konfiguráció esetén károsodhat a mappák tartalma és működésképtelenné válhat a Syncthing.",
"Incorrect user name or password.": "Hibás felhasználónév vagy jelszó.",
"Info": "Infó",
"Internally used paths:": "Belsőleg használt útvonal:",
"Introduced By": "Bevezette",
"Introducer": "Bevezető",
"Introduction": "Bemutatkozás",
"Inversion of the given condition (i.e. do not exclude)": "A feltétel ellentéte (pl. ki nem hagyás)",
"Keep Versions": "Megtartott verziók",
"LDAP": "LDAP",
@@ -213,6 +229,7 @@
"Learn more": "Tudj meg többet",
"Learn more at {%url%}": "További információ itt: {{url}}",
"Limit": "Sebességkorlát",
"Limit Bandwidth in LAN": "LAN sávszélesség korlátozása",
"Listener Failures": "Figyelő hibák",
"Listener Status": "Figyelő állapot",
"Listeners": "Figyelők",
@@ -225,11 +242,18 @@
"Locally Changed Items": "Helyileg változott elemek",
"Log": "Napló",
"Log File": "Naplófájl",
"Log In": "Bejelentkezés",
"Log Out": "Kijelentkezés",
"Log in to see paths information.": "Jelentkezzen be az útvonalinformációk megtekintéséhez.",
"Log in to see version information.": "Jelentkezzen be a verzióinformációk megtekintéséhez.",
"Log tailing paused. Scroll to the bottom to continue.": "Napló utolsó sorainak figyelése szüneteltetve. Alulra görgetve lehet folytatni.",
"Login failed, see Syncthing logs for details.": "Sikertelen bejelentkezés, részletek a Syncthing naplófájlokban.",
"Logs": "Naplófájlok",
"Major Upgrade": "Főverzió-frissítés",
"Mass actions": "Tömeges műveletek",
"Maximum Age": "Maximális kor",
"Maximum single entry size": "Maximális egyedi méret",
"Maximum total size": "Maximális összesített méret",
"Metadata Only": "Csak metaadatok",
"Minimum Free Disk Space": "Minimális szabad lemezterület",
"Mod. Device": "Módosító eszköz",
@@ -246,9 +270,11 @@
"No": "Nem",
"No File Versioning": "Nincs fájlverzió-követés",
"No files will be deleted as a result of this operation.": "A művelet eredményeként egyetlen fájl sem lesz törölve.",
"No rules set": "Nincsenek szabályok",
"No upgrades": "Nincsenek frissítések",
"Not shared": "Nem megosztott",
"Notice": "Megjegyzés",
"Number of Connections": "Kapcsolatok száma",
"OK": "Rendben",
"Off": "Kikapcsolva",
"Oldest First": "Régebbi először",
@@ -260,8 +286,9 @@
"Override": "Felülírás",
"Override Changes": "Változtatások felülbírálása",
"Ownership": "Tulajdonjog",
"Password": "Jelszó",
"Path": "Útvonal",
"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": "A mappa elérési útvonala az eszközön. Amennyiben nem létezik, a program automatikusan létrehozza. A hullámvonal (~) a következő helyettesítésre használható:",
"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": "A mappa elérési útvonala az eszközön. Amennyiben nem létezik, a program automatikusan létrehozza. A hullámvonal (~) a következő helyettesítésre használható",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "A verziók tárolására szolgáló elérési út (hagyd üresen a megosztott mappa alapértelmezett .stversions könyvtárának használatához).",
"Paths": "Elérési utak",
"Pause": "Szüneteltetés",
@@ -315,6 +342,7 @@
"Revert": "Visszaállítás",
"Revert Local Changes": "Helyi módosítások visszavonása",
"Save": "Mentés",
"Saving changes": "Változtatások mentése",
"Scan Time Remaining": "Fennmaradó átnézési idő",
"Scanning": "Átnézés",
"See external versioning help for supported templated command line parameters.": "A támogatott parancssori paraméter sablonokat a külső verziókezelő súgójában találod.",
@@ -336,7 +364,7 @@
"Share by SMS": "Megosztás SMS-ben",
"Share this folder?": "Megosztható ez a mappa?",
"Shared Folders": "Megosztott mappák",
"Shared With": "Megosztva ezekkel:",
"Shared With": "Megosztva ezekkel",
"Sharing": "Megosztás",
"Show ID": "Azonosító megjelenítése",
"Show QR": "QR-kód megjelenítése",
@@ -363,6 +391,7 @@
"Staggered File Versioning": "Többszintű fájlverzió-követés",
"Start Browser": "Böngésző indítása",
"Statistics": "Statisztika",
"Stay logged in": "Maradjon bejelentkezve",
"Stopped": "Leállítva",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Csak titkosított adatokat tárol és szinkronizál. Minden kapcsolatban lévő eszközön a mappákat ugyanazzal a jelszóval kell védeni vagy „{{receiveEncrypted}}” típusúnak kell lenniük.",
"Subject:": "Tárgy:",
@@ -381,6 +410,7 @@
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "A Syncthing a következő hálózati címeken figyel más eszközök csatlakozási kísérleteire:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "A Syncthing semmilyen címen nem figyel más eszközök csatlakozási kísérleteire. Csak kimenő kapcsolatok működhetnek erről az eszközről.",
"Syncthing is restarting.": "Syncthing újraindul.",
"Syncthing is saving changes.": "A Syncthing éppen ment.",
"Syncthing is upgrading.": "Syncthing frissül.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "A Syncthing már támogatja az automatikus összeomlás-jelentések küldését a fejlesztők felé. Ez a funkció alapértelmezetten be van kapcsolva.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Úgy tűnik, hogy a Syncthing nem működik, vagy valami probléma van a hálózati kapcsolattal. Újra próbálom…",
@@ -413,11 +443,13 @@
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "A verziók mappáin futó tisztítási folyamat intervalluma másodpercekben kifejezve. A nullával letiltható az időszakos tisztítás.",
"The maximum age must be a number and cannot be blank.": "A maximális kornak számnak kell lenni és nem lehet üres.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "A verziók megtartásának maximális ideje (napokban, 0-t megadva örökre megmaradnak).",
"The number of connections must be a non-negative number.": "A kapcsolatok száma nem lehet negatív.",
"The number of days must be a number and cannot be blank.": "A napok száma szám kell legyen és nem lehet üres.",
"The number of days to keep files in the trash can. Zero means forever.": "A napok száma, ameddig a fájlok meg lesznek tartva a szemetesben. A 0 azt jelenti, hogy örökre.",
"The number of old versions to keep, per file.": "A megtartott régi verziók száma fájlonként.",
"The number of versions must be a number and cannot be blank.": "A megtartott verziók száma nem lehet üres.",
"The path cannot be blank.": "Az elérési útvonal nem lehet üres.",
"The rate limit is applied to the accumulated traffic of all connections to this device.": "A sebességkorlátozás az eszközhöz tartozó összes kapcsolat összforgalmára vonatkozik.",
"The rate limit must be a non-negative number (0: no limit)": "A sebességlimitnek pozitív számnak kell lennie (0: nincs limit)",
"The remote device has not accepted sharing this folder.": "A távoli eszköz nem fogadta el ennek a mappának a megosztását.",
"The remote device has paused this folder.": "A távoli eszköz szünetelteti ezt a mappát.",
@@ -435,6 +467,7 @@
"Time": "Idő",
"Time the item was last modified": "Az idő, amikor utoljára módosítva lett az elem",
"To connect with the Syncthing device named \"{%devicename%}\", add a new remote device on your end with this ID:": "A \"{{devicename}}\" nevű Syncthing eszközzel való kapcsolódáshoz adjon hozzá egy új távoli eszközt a saját oldalán ezzel az azonosítóval:",
"To permit a rule, have the checkbox checked. To deny a rule, leave it unchecked.": "Egy szabály engedélyezéséhez jelölje be a jelölőnégyzetet. Elutasításához hagyja üresen.",
"Today": "Ma",
"Trash Can": "Szemetes",
"Trash Can File Versioning": "Szemetes fájlverzió-követés",
@@ -461,8 +494,11 @@
"Usage reporting is always enabled for candidate releases.": "Az előzetes kiadásokban a használati jelentés mindig engedélyezett.",
"Use HTTPS for GUI": "HTTPS használata a grafikus felülethez",
"Use notifications from the filesystem to detect changed items.": "A fájlrendszer által szolgáltatott értesítések alkalmazása a megváltozott elemek keresésére.",
"User": "Felhasználó",
"User Home": "Felhasználói kezdőlap",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Még nincs felhasználó és jelszó beállítva a grafikus felülethez. Érdemes megfontolni a beállítását.",
"Using a QUIC connection over LAN": "QUIC-kapcsolat használata LAN-on keresztül",
"Using a QUIC connection over WAN": "QUIC-kapcsolat használata WAN-on keresztül",
"Using a direct TCP connection over LAN": "Közvetlen TCP-kapcsolat használata LAN-on keresztül",
"Using a direct TCP connection over WAN": "Közvetlen TCP-kapcsolat használata WAN-on keresztül",
"Version": "Verzió",
@@ -483,6 +519,7 @@
"Watching for changes discovers most changes without periodic scanning.": "A változások keresése felfedezi a legtöbb változást periodikus átnézés nélkül.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Új eszköz hozzáadásakor nem szabad elfeledkezni arról, hogy a másik oldalon ezt az eszközt is hozzá kell adni.",
"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.": "Új eszköz hozzáadásakor észben kell tartani, hogy a mappaazonosító arra való, hogy összekösse a mappákat az eszközökön. Az azonosító kisbetű-nagybetű érzékeny és pontosan egyeznie kell az eszközökön.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Ha mindkét eszközön egynél többre van beállítva, a Syncthing több párhuzamos kapcsolat létrehozását fogja megkísérelni. Eltérő értékeknél, a legmagasabb érték lesz használva. Állítsa nullára, hogy a Syncthing döntsön.",
"Yes": "Igen",
"Yesterday": "Tegnap",
"You can also copy and paste the text into a new message manually.": "A szöveget kézzel is bemásolhatja és beillesztheti egy új üzenetbe.",
@@ -498,6 +535,7 @@
"Your email app should open to let you choose the recipient and send it from your own address.": "Az e-mail alkalmazásnak meg kell nyílnia, hogy kiválaszthassa a címzettet, és elküldhesse a saját címéről.",
"days": "nap",
"deleted": "törölve",
"deny": "megtagad",
"directories": "mappa",
"file": "fájl",
"files": "fájl",
@@ -505,6 +543,7 @@
"full documentation": "teljes dokumentáció",
"items": "elem",
"modified": "módosított",
"permit": "engedélyez",
"seconds": "másodperc",
"theme": {
"name": {
@@ -514,6 +553,7 @@
"light": "Világos"
}
},
"unknown device": "ismeretlen eszköz",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} szeretné megosztani a mappát: „{{folder}}”.",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} szeretné megosztani a mappát: „{{folderlabel}}” ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} újra bevezetheti ezt az eszközt."
+89
View File
@@ -27,6 +27,7 @@
"Allowed Networks": "Jaringan Terizinkan",
"Alphabetic": "Alfabet",
"Altered by ignoring deletes.": "Diubah dengan mengabaikan penghapusan.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Selalu aktif ketika tipe folder adalah \"{{foldertype}}\".",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Perintah eksternal menangani pemversian. Ia harus menghapus berkas dari folder yang dibagi. Jika lokasi aplikasi terdapat spasi, itu harus dikutip.",
"Anonymous Usage Reporting": "Pelaporan Penggunaan Anonim",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Format pelaporan penggunaan anonim telah berubah. Maukah anda pindah menggunakan format yang baru?",
@@ -52,6 +53,7 @@
"Body:": "Badan:",
"Bugs": "Bugs",
"Cancel": "Batal",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Tidak dapat diaktifkan ketika tipe folder adalah \"{{foldertype}}\".",
"Changelog": "Log Perubahan",
"Clean out after": "Bersihkan setelah",
"Cleaning Versions": "Versi Pembersihan",
@@ -80,6 +82,7 @@
"Custom Range": "Rentang Kustom",
"Danger!": "Bahaya!",
"Database Location": "Lokasi Database",
"Debug": "Debug",
"Debugging Facilities": "Fasilitas Debug",
"Default": "Default",
"Default Configuration": "Konfigurasi Bawaan",
@@ -99,6 +102,7 @@
"Device ID": "ID Perangkat",
"Device Identification": "Identifikasi Perangkat",
"Device Name": "Nama Perangkat",
"Device Status": "Status Perangkat",
"Device is untrusted, enter encryption password": "Perangkat tidak dipercaya, masukkan sandi enkripsi",
"Device rate limits": "Batas kecepatan perangkat",
"Device that last modified the item": "Perangkat yang terakhir mengubah berkas",
@@ -136,12 +140,19 @@
"Enable NAT traversal": "Aktifkan Traversal NAT",
"Enable Relaying": "Aktifkan Relay",
"Enabled": "Aktif",
"Enables sending extended attributes to other devices, and applying incoming extended attributes. May require running with elevated privileges.": "Mengaktifkan pengiriman atribut tambahan ke perangkat lain, serta penerapan atribut tambahan yang diterima. Mungkin memerlukan eksekusi dengan hak akses tingkat tinggi.",
"Enables sending extended attributes to other devices, but not applying incoming extended attributes. This can have a significant performance impact. Always enabled when \"Sync Extended Attributes\" is enabled.": "Mengaktifkan pengiriman atribut tambahan ke perangkat lain, tetapi tidak menerapkan atribut tambahan yang diterima. Hal ini dapat berdampak signifikan terhadap kinerja. Selalu aktif ketika “Sync Extended Attributes” diaktifkan.",
"Enables sending ownership information to other devices, and applying incoming ownership information. Typically requires running with elevated privileges.": "Mengaktifkan pengiriman informasi kepemilikan ke perangkat lain, dan menerapkan informasi kepemilikan yang masuk. Biasanya memerlukan menjalankan dengan hak istimewa yang ditinggikan.",
"Enables sending ownership information to other devices, but not applying incoming ownership information. This can have a significant performance impact. Always enabled when \"Sync Ownership\" is enabled.": "Mengaktifkan pengiriman informasi kepemilikan ke perangkat lain, tetapi tidak menerapkan informasi kepemilikan yang masuk. Ini dapat berdampak signifikan pada kinerja. Selalu diaktifkan ketika \"Sinkronisasi Kepemilikan\" diaktifkan.",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.": "Masukkan nomor yang bukan negatif (contoh \"2.35\") dan pilih sebuah unit. Persentase adalah bagian dari total ukuran penyimpanan.",
"Enter a non-privileged port number (1024 - 65535).": "Masukkan nomor port yang tidak \"istimewa\" (1024 - 65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.": "Masukkan alamat yang dipisah oleh koma (\"tcp://ip:port\", \"tcp://host:port\") atau \"dynamic\" untuk melakukan penemuan alamat secara otomatis.",
"Enter ignore patterns, one per line.": "Masukkan pola pengabaian, satu per baris.",
"Enter up to three octal digits.": "Masukkan hingga tiga digit oktal.",
"Error": "Galat",
"Extended Attributes": "Atribut yang Diperluas",
"Extended Attributes Filter": "Filter Atribut yang Diperluas",
"External": "Eksternal",
"External File Versioning": "Pemversian Berkas Eksternal",
"Failed Items": "Berkas yang gagal",
"Failed to load file versions.": "Gagal memuat versi berkas.",
@@ -157,20 +168,25 @@
"Filesystem Watcher Errors": "Galat Filesystem Watcher",
"Filter by date": "Saring menurut tanggal",
"Filter by name": "Saring menurut nama",
"Folder": "Folder",
"Folder ID": "ID Folder",
"Folder Label": "Label Folder",
"Folder Path": "Lokasi Folder",
"Folder Status": "Status Folder",
"Folder Type": "Tipe Folder",
"Folder type \"{%receiveEncrypted%}\" can only be set when adding a new folder.": "Folder tipe \"{{receiveEncrypted}}\" hanya bisa diatur ketika menambah folder baru.",
"Folder type \"{%receiveEncrypted%}\" cannot be changed after adding the folder. You need to remove the folder, delete or decrypt the data on disk, and add the folder again.": "Folder tipe \"{{receiveEncrypted}}\" tidak dapat diubah setelah menambah folder. Anda perlu menghapus folder tersebut, hapus atau dekripsi data dalam penyimpanan, dan menambah folder kembali.",
"Folders": "Folder",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "Untuk folder berikut sebuah galat terjadi saat memulai fitur lihat perubahan. Ia akan dicoba setiap menit, maka galat mungkin hilang sebentar lagi. Jika mereka berthan, coba perbaiki masalah yang mendasar dan meminta bantuan jika anda tidak bisa.",
"Forever": "Selamanya",
"Full Rescan Interval (s)": "Interval Pindai Ulang Penuh (detik)",
"GUI": "GUI",
"GUI / API HTTPS Certificate": "Sertifikat HTTPS GUI / API",
"GUI Authentication Password": "Sandi Otentikasi GUI",
"GUI Authentication User": "Pengguna Otentikasi GUI",
"GUI Authentication: Set User and Password": "Otentikasi GUI: Atur Pengguna dan Sandi",
"GUI Listen Address": "Alamat Pendengaran GUI",
"GUI Override Directory": "Direktori Penimpaan GUI",
"GUI Theme": "Tema GUI",
"General": "Umum",
"Generate": "Generasi",
@@ -178,6 +194,7 @@
"Global Discovery Servers": "Server Penemuan Global",
"Global State": "Status Global",
"Help": "Panduan",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Petunjuk: hanya aturan-tolak yang terdeteksi sementara defaultnya adalah tolak. Pertimbangkan untuk menambahkan \"izinkan semua\" sebagai aturan terakhir.",
"Home page": "Situs",
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Namun, pengaturan anda sekarang mengindikasi anda mungkin tidak ingin fitur diaktifkan. Kami telah menonaktifkan pelaporan crash otomatis untuk anda.",
"Identification": "Identifikasi",
@@ -190,10 +207,15 @@
"Ignored Devices": "Perangkat yang Diabaikan",
"Ignored Folders": "Folder yang Diabaikan",
"Ignored at": "Diabaikan di",
"Included Software": "Perangkat Lunak yang Disertakan",
"Incoming Rate Limit (KiB/s)": "Batas Kecepatan Unduh (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Konfigurasi salah dapat merusak isi folder dan membuat Syncthing tidak dapat dijalankan.",
"Incorrect user name or password.": "Nama pengguna atau kata sandi salah.",
"Info": "Info",
"Internally used paths:": "Jalur yang digunakan secara internal:",
"Introduced By": "Dikenalkan Oleh",
"Introducer": "Pengenal",
"Introduction": "Pendahuluan",
"Inversion of the given condition (i.e. do not exclude)": "Inversi dari kondisi yang diberikan (yakni jangan dikecualikan)",
"Keep Versions": "Jumlah Versi yang Disimpan",
"LDAP": "LDAP",
@@ -205,7 +227,9 @@
"Last seen": "Terakhir dilihat",
"Latest Change": "Perubahan Terbaru",
"Learn more": "Pelajari lebih lanjut",
"Learn more at {%url%}": "Pelajari lebih lanjut di {{url}}",
"Limit": "Batas",
"Limit Bandwidth in LAN": "Batasi Bandwidth di LAN",
"Listener Failures": "Kegagalan Pendengar",
"Listener Status": "Status Pendengar",
"Listeners": "Pendengar",
@@ -217,14 +241,26 @@
"Local State (Total)": "Keadaan Lokal (Total)",
"Locally Changed Items": "Berkas yang Diubah Secara Lokal",
"Log": "Log",
"Log File": "File Log",
"Log In": "Masuk",
"Log Out": "Keluar",
"Log in to see paths information.": "Masuk untuk melihat informasi jalur.",
"Log in to see version information.": "Masuk untuk melihat informasi versi.",
"Log tailing paused. Scroll to the bottom to continue.": "Pembuntutan log diberhentikan sementara. Gulir ke bawah untuk melanjutkan.",
"Login failed, see Syncthing logs for details.": "Login gagal, lihat log Syncthing untuk detailnya.",
"Logs": "Log",
"Major Upgrade": "Major Upgrade",
"Mass actions": "Aksi massal",
"Maximum Age": "Usia Maksimum",
"Maximum single entry size": "Ukuran entri tunggal maksimum",
"Maximum total size": "Ukuran total maksimum",
"Metadata Only": "Hanya Metadata",
"Minimum Free Disk Space": "Ruang Penyimpanan Kosong Minimum",
"Mod. Device": "Perangkat Pengubah",
"Mod. Time": "Waktu Diubah",
"More than a month ago": "Lebih dari sebulan yang lalu",
"More than a week ago": "Lebih dari seminggu yang lalu",
"More than a year ago": "Lebih dari setahun yang lalu",
"Move to top of queue": "Pindah ke daftar tunggu teratas",
"Multi level wildcard (matches multiple directory levels)": "Wildcard multi tingkat (cocok dalam tingkat direktori apapun)",
"Never": "Tidak Pernah",
@@ -234,9 +270,11 @@
"No": "Tidak",
"No File Versioning": "Tidak Ada Pemversian Berkas",
"No files will be deleted as a result of this operation.": "Tidak ada berkas yang akan dihapus akibat dari operasi ini.",
"No rules set": "Tidak ada aturan yang ditetapkan",
"No upgrades": "Tidak ada peningkatan",
"Not shared": "Tidak terbagi",
"Notice": "Pemberitahuan",
"Number of Connections": "Jumlah Koneksi",
"OK": "OK",
"Off": "Mati",
"Oldest First": "Tertua Dahulu",
@@ -247,9 +285,12 @@
"Outgoing Rate Limit (KiB/s)": "Batas Kecepatan Unggah (KiB/s)",
"Override": "Timpa",
"Override Changes": "Timpa Perubahan",
"Ownership": "Kepemilikan",
"Password": "Kata Sandi",
"Path": "Lokasi",
"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": "Lokasi folder dalam komputer lokal. Akan dibuat jika tidak ada. Karakter tilde (~) dapat digunakan sebagai pintasan untuk",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Lokasi berbagai versi berkas disimpan (tinggalkan kosong untuk menggunakan direktori .stversions bawaan dalam folder).",
"Paths": "Jalur",
"Pause": "Jeda",
"Pause All": "Jeda Semua",
"Paused": "Terjeda",
@@ -267,6 +308,9 @@
"Preparing to Sync": "Bersiap untuk Mensinkron",
"Preview": "Pratinjau",
"Preview Usage Report": "Laporan Pratinjau Penggunaan",
"QR code": "Kode QR",
"QUIC LAN": "QUIC LAN",
"QUIC WAN": "QUIC WAN",
"Quick guide to supported patterns": "Panduan cepat untuk pola yang didukung",
"Random": "Acak",
"Receive Encrypted": "Terima Dienkripsi",
@@ -274,6 +318,8 @@
"Received data is already encrypted": "Data yang diterima telah dienkripsi",
"Recent Changes": "Perubahan Terkini",
"Reduced by ignore patterns": "Dikurangi oleh pola pengabaian",
"Relay LAN": "Relay LAN",
"Relay WAN": "Relay WAN",
"Release Notes": "Catatan Rilis",
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.": "Rilis kandidat memiliki fitur terbaru dan perbaikan. Mereka mirip dengan rilis tradisional Syncthing.",
"Remote Devices": "Perangkat Jarak Jauh",
@@ -296,6 +342,7 @@
"Revert": "Kembalikan",
"Revert Local Changes": "Kembalikan Perubahan Lokal",
"Save": "Simpan",
"Saving changes": "Menyimpan perubahan",
"Scan Time Remaining": "Waktu Pindai Tersisa",
"Scanning": "Pemindaian",
"See external versioning help for supported templated command line parameters.": "Lihat panduan pemversian eksternal untuk contoh parameter baris perintah yang didukung.",
@@ -306,11 +353,15 @@
"Select latest version": "Pilih versi terbaru",
"Select oldest version": "Pilih versi tertua",
"Send & Receive": "Kirim & Terima",
"Send Extended Attributes": "Kirim Atribut yang Diperluas",
"Send Only": "Hanya Kirim",
"Send Ownership": "Kirim Kepemilikan",
"Set Ignores on Added Folder": "Atur Pengabaian dalam Folder yang Ditambahkan",
"Settings": "Pengaturan",
"Share": "Bagi",
"Share Folder": "Bagi Folder",
"Share by Email": "Bagikan melalui Email",
"Share by SMS": "Bagikan melalui SMS",
"Share this folder?": "Bagi Folder Ini?",
"Shared Folders": "Folder Yang Dibagi",
"Shared With": "Dibagi Dengan",
@@ -324,6 +375,7 @@
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Ditampilkan sebagai ganti ID Perangkat dalam status gugus. Akan diubah menjadi nama yang perangkat umumkan jika tidak diisi.",
"Shut Down": "Matikan",
"Shutdown Complete": "Pematian Selesai",
"Simple": "Sederhana",
"Simple File Versioning": "Pemversian Berkas Sederhana",
"Single level wildcard (matches within a directory only)": "Wildcard tingkat tunggal (cocok hanya dalam satu direktori saja)",
"Size": "Ukuran",
@@ -335,25 +387,36 @@
"Stable releases and release candidates": "Rilis stabil dan rilis kandidat",
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.": "Rilis stabil tertunda sebanyak dua minggu. Selama masa ini, mereka dalam masa pengujian sebagai rilis kandidat.",
"Stable releases only": "Hanya rilis stabil",
"Staggered": "Bertahap",
"Staggered File Versioning": "Pemversian Berkas Bergiliran",
"Start Browser": "Mulai Peramban",
"Statistics": "Statistik",
"Stay logged in": "Tetap masuk",
"Stopped": "Telah Berhenti",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Hanya menyimpan dan mensinkronisasi data yang dienkripsi. Folder dalam semua perangkat yang tersambung perlu diatur dengan sandi yang sama atau tipe \"{{receiveEncrypted}}\" juga.",
"Subject:": "Subjek:",
"Support": "Bantuan",
"Support Bundle": "Paket Bantuan",
"Sync Extended Attributes": "Sinkronisasi Atribut yang Diperluas",
"Sync Ownership": "Sinkronisasi Kepemilikan",
"Sync Protocol Listen Addresses": "Alamat Pendengar Protokol Sinkronisasi",
"Sync Status": "Status Sinkronisasi",
"Syncing": "Sinkronisasi",
"Syncthing device ID for \"{%devicename%}\"": "ID perangkat Syncthing untuk \"{{devicename}}\"",
"Syncthing has been shut down.": "Syncthing telah dimatikan.",
"Syncthing includes the following software or portions thereof:": "Syncthing includes the following software or portions thereof:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing adalah Software Gratis dan Open Source dengan lisensi MPL v2.0.",
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing adalah program sinkronisasi file berkelanjutan. Program ini menyinkronkan file antara dua komputer atau lebih secara real time, terlindungi dengan aman dari mata-mata. Data Anda adalah milik Anda sendiri dan Anda berhak memilih di mana data tersebut disimpan, apakah dibagikan ke pihak ketiga, dan bagaimana data tersebut ditransmisikan melalui internet.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing sedang mendengar di alamat jaringan berikut untuk percobaan koneksi dari perangkat lain:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing sedang tidak mendengar dari percobaan koneksi dari perangkat lain dari semua alamat. Hanya koneksi keluar dari perangkat ini mungkin berhasil.",
"Syncthing is restarting.": "Syncthing sedang memulai ulang.",
"Syncthing is saving changes.": "Syncthing sedang menyimpan perubahan.",
"Syncthing is upgrading.": "Syncthing sedang meningkatkan.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing sekarang mendukung melaporkan crash secara otomatis ke pengembang. Fitur ini diaktifkan secara bawaan.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.",
"TCP LAN": "TCP LAN",
"TCP WAN": "TCP WAN",
"Take me back": "Bawa saya kembali",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.": "Alamat GUI diambil alih oleh parameter memulai Syncthing. Perubahan disini tidak akan memiliki efek saat pengambilan alih aktif.",
"The Syncthing Authors": "Pencipta-pencipta Syncthing",
@@ -374,17 +437,22 @@
"The following items could not be synchronized.": "Berkas berikut tidak dapat disinkron.",
"The following items were changed locally.": "Berkas berikut telah diubah secara lokal.",
"The following methods are used to discover other devices on the network and announce this device to be found by others:": "Metode berikut digunakan untuk menemukan perangkat lain di jaringan dan mengumumkan perangkat ini untuk dapat ditemukan oleh perangkat lain:",
"The following text will automatically be inserted into a new message.": "Teks berikut akan secara otomatis disisipkan ke dalam pesan baru.",
"The following unexpected items were found.": "Berkas tidak terduga berikut telah ditemukan.",
"The interval must be a positive number of seconds.": "Interval harus berupa angka detik positif.",
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.": "Interval, dalam detik, untuk melakukan pembersihan dalam direktori versi. Nol untuk menonaktifkan pembersihan periodik.",
"The maximum age must be a number and cannot be blank.": "Usia maksimum harus berupa angka dan tidak dapat kosong.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).": "Waktu maksimum untuk menyimpan sebuah versi (dalam hari, atur ke 0 untuk menyimpan versi selamanya).",
"The number of connections must be a non-negative number.": "Jumlah koneksi harus berupa angka tidak negatif.",
"The number of days must be a number and cannot be blank.": "Jumlah hari harus berupa angka dan tidak dapat kosong.",
"The number of days to keep files in the trash can. Zero means forever.": "Jumlah hari untuk menyimpan berkas dalam tempat sampah. Nol berarti selamanya.",
"The number of old versions to keep, per file.": "Jumlah versi lama untuk disimpan, setiap berkas.",
"The number of versions must be a number and cannot be blank.": "Jumlah versi harus berupa angka dan tidak dapat kosong.",
"The path cannot be blank.": "Lokasi tidak dapat kosong.",
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Batas kecepatan diterapkan pada akumulasi lalu lintas dari semua koneksi ke perangkat ini.",
"The rate limit must be a non-negative number (0: no limit)": "Pembatasan kecepatan harus berupa angka positif (0: tidak terbatas)",
"The remote device has not accepted sharing this folder.": "Perangkat jarak jauh belum menerima berbagi folder ini.",
"The remote device has paused this folder.": "Perangkat jarak jauh telah menjeda folder ini.",
"The rescan interval must be a non-negative number of seconds.": "Interval pemindaian ulang harus berupa angka positif.",
"There are no devices to share this folder with.": "Tidak ada perangkat untuk membagikan folder ini.",
"There are no file versions to restore.": "Tidak ada versi berkas untuk dipulihkan.",
@@ -398,7 +466,10 @@
"This setting controls the free space required on the home (i.e., index database) disk.": "Pengaturan ini mengontrol jumlah penyimpanan kosong yang dibutuhkan dalam penyimpanan utama (contoh database indeks).",
"Time": "Waktu",
"Time the item was last modified": "Waktu file terakhir dimodifikasi",
"To connect with the Syncthing device named \"{%devicename%}\", add a new remote device on your end with this ID:": "Untuk terhubung dengan perangkat Syncthing bernama \"{{devicename}}\", tambahkan perangkat jarak jauh baru di pihak Anda dengan ID ini:",
"To permit a rule, have the checkbox checked. To deny a rule, leave it unchecked.": "Untuk mengizinkan sebuah aturan, centang kotaknya. Untuk menolak sebuah aturan, biarkan tidak dicentang.",
"Today": "Hari Ini",
"Trash Can": "Tempat Sampah",
"Trash Can File Versioning": "Pemversian Berkas Tempat Sampah",
"Type": "Tipe",
"UNIX Permissions": "Izin UNIX",
@@ -414,6 +485,7 @@
"Unshared Folders": "Folder Tidak Terbagi",
"Untrusted": "Tidak Terpercaya",
"Up to Date": "Tersinkron",
"Updated {%file%}": "Memperbarui {{file}}",
"Upgrade": "Tingkatkan",
"Upgrade To {%version%}": "Tingkatkan Ke {{version}}",
"Upgrading": "Meningkatkan",
@@ -422,7 +494,13 @@
"Usage reporting is always enabled for candidate releases.": "Pelaporan penggunaan selalu aktif untuk rilis kandidat.",
"Use HTTPS for GUI": "Gunakan HTTPS untuk GUI",
"Use notifications from the filesystem to detect changed items.": "Gunakan notifikasi dari filesistem untuk melihat perubahan berkas.",
"User": "Pengguna",
"User Home": "Beranda Pengguna",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Nama pengguna/sandi belum diatur untuk otentikasi GUI. Harap pertimbangkan menyiapkannya.",
"Using a QUIC connection over LAN": "Menggunakan koneksi QUIC melalui LAN",
"Using a QUIC connection over WAN": "Menggunakan koneksi QUIC melalui WAN",
"Using a direct TCP connection over LAN": "Menggunakan koneksi TCP langsung melalui LAN",
"Using a direct TCP connection over WAN": "Menggunakan koneksi TCP langsung melalui WAN",
"Version": "Versi",
"Versions": "Versi",
"Versions Path": "Lokasi Versi",
@@ -441,8 +519,10 @@
"Watching for changes discovers most changes without periodic scanning.": "Memantau perubahan menemukan kebanyakan perubahan tanpa pemindaian periodik.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "Ketika menambah perangkat baru, perlu diingat bahwa perangkat ini juga harus ditambahkan pada sisi lain juga.",
"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.": "Ketika menambah sebuah folder baru, perlu diingat bahwa ID Folder digunakan untuk mengikat folder antar perangkat. Mereka peka terhadap kapitalisasi huruf dan harus sama pada semua perangkat.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "Ketika diatur lebih dari satu pada kedua perangkat, Syncthing akan mencoba membuat beberapa koneksi bersamaan. Jika nilainya berbeda, nilai tertinggi yang akan digunakan. Atur ke nol untuk membiarkan Syncthing memutuskan.",
"Yes": "Iya",
"Yesterday": "Kemarin",
"You can also copy and paste the text into a new message manually.": "Anda juga dapat menyalin dan menempelkan teks ke dalam pesan baru secara manual.",
"You can also select one of these nearby devices:": "Anda juga dapat memilih salah satu perangkat disekitar berikut:",
"You can change your choice at any time in the Settings dialog.": "Anda dapat mengubah pilihan anda dalam dialog Pengaturan.",
"You can read more about the two release channels at the link below.": "Anda dapat membaca lebih lanjut tentang dua saluran rilis pada tautan di bawah.",
@@ -451,11 +531,19 @@
"You have unsaved changes. Do you really want to discard them?": "Anda mempunyai perubahan yang belum disimpan. Apakah anda ingin membuangnya?",
"You must keep at least one version.": "Anda seharusnya menyimpan setidaknya satu versi.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "Anda sebaiknya tidak pernah menambah atau mengubah apapun secara lokal dalam folder \"{{receiveEncrypted}}\".",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "Aplikasi SMS Anda akan terbuka untuk memungkinkan Anda memilih penerima dan mengirimkannya dari nomor Anda sendiri.",
"Your email app should open to let you choose the recipient and send it from your own address.": "Aplikasi email Anda akan terbuka untuk memungkinkan Anda memilih penerima dan mengirimkannya dari alamat Anda sendiri.",
"days": "hari",
"deleted": "dihapus",
"deny": "tolak",
"directories": "direktori",
"file": "file",
"files": "berkas",
"folder": "folder",
"full documentation": "dokumentasi penuh",
"items": "berkas",
"modified": "dimodifikasi",
"permit": "izinkan",
"seconds": "detik",
"theme": {
"name": {
@@ -465,6 +553,7 @@
"light": "Terang"
}
},
"unknown device": "perangkat tidak dikenal",
"{%device%} wants to share folder \"{%folder%}\".": "{{device}} ingin berbagi folder \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).": "{{device}} ingin berbagi folder \"{{folderlabel}}\" ({{folder}}).",
"{%reintroducer%} might reintroduce this device.": "{{reintroducer}} mungkin memperkenalkan ulang perangkat ini."
+3
View File
@@ -82,6 +82,7 @@
"Custom Range": "Intervallo personalizzato",
"Danger!": "Pericolo!",
"Database Location": "Posizione del database",
"Debug": "Debug",
"Debugging Facilities": "Servizi di Debug",
"Default": "Default",
"Default Configuration": "Configurazione predefinita",
@@ -210,6 +211,7 @@
"Incoming Rate Limit (KiB/s)": "Limite Velocità in Ingresso (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Una configurazione non corretta potrebbe danneggiare il contenuto delle cartelle e rendere Syncthing inoperativo.",
"Incorrect user name or password.": "Nome utente o password errati.",
"Info": "Info",
"Internally used paths:": "Percorsi interni utilizzati:",
"Introduced By": "Introdotto da",
"Introducer": "Introduttore",
@@ -227,6 +229,7 @@
"Learn more": "Per saperne di più",
"Learn more at {%url%}": "Scopri di più su {{url}}",
"Limit": "Limite",
"Limit Bandwidth in LAN": "Limitare la larghezza di banda nella LAN",
"Listener Failures": "Fallimenti dell'Ascoltatore",
"Listener Status": "Stato dell'Ascoltatore",
"Listeners": "In Ascolto",
+7 -2
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "이 기기가 통보하는 폴더를 기본 경로에서 자동으로 생성 또는 공유합나다.",
"Available debug logging facilities:": "사용 가능한 디버그 기록 기능:",
"Be careful!": "주의하십시오!",
"Block Indexing": "블록 색인",
"Body:": "내용:",
"Bugs": "버그",
"Cancel": "취소",
@@ -99,6 +100,7 @@
"Device": "기기",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "\"{{name}}\" ({{device}} 기기가 {{address}}) 주소에서 접속을 요청했습니다. 새 기기를 추가하시겠습니까?",
"Device Certificate": "기기 인증서",
"Device Group": "기기 그룹",
"Device ID": "기기 아이디",
"Device Identification": "기기 아이디",
"Device Name": "기기명",
@@ -169,6 +171,7 @@
"Filter by date": "날짜별 검색",
"Filter by name": "이름별 검색",
"Folder": "폴더",
"Folder Group": "폴더 그룹",
"Folder ID": "폴더 아이디",
"Folder Label": "폴더명",
"Folder Path": "폴더 경로",
@@ -278,7 +281,9 @@
"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.": "폴더를 묘사하는 선택적 이름입니다. 기기마다 달리 설정할 수 있습니다.",
"Optional group for the device. Can be different on each device.": "기기의 선택적 그룹입니다. 기기마다 달리 설정할 수 있습니다.",
"Optional group for the folder. Can be different on each device.": "펄더의 선택적 그룹입니다. 기기마다 달리 설정할 수 있습니다.",
"Options": "옵션",
"Out of Sync": "동기화 미완료",
"Out of Sync Items": "동기화 미완료 항목",
@@ -463,7 +468,7 @@
"This can easily give hackers access to read and change any files on your computer.": "이로 인해서는 해커들이 현재 컴퓨터의 모든 파일을 손쉽게 읽고 변경할 수 있게 됩니다.",
"This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "이 기기는 다른 기기를 자동으로 탐지하거나 다른 기기로부터 발견되도록 자신의 주소를 통보할 수 없습니다. 고정 주소로 설정한 기기만이 현재 기기에 접속할 수 있습니다.",
"This is a major version upgrade.": "주요 버전 업데이트입니다.",
"This setting controls the free space required on the home (i.e., index database) disk.": "이 설정은 시스템(즉, 인덱스 데이터베이스가 있는) 저장 장치의 여유 공간을 관리합니다.",
"This setting controls the free space required on the home (i.e., index database) disk.": "이 설정은 시스템(즉, 인 데이터베이스가 위치한) 저장 장치의 여유 공간을 관리합니다.",
"Time": "시간",
"Time the item was last modified": "항목이 가장 최근에 수정된 시간",
"To connect with the Syncthing device named \"{%devicename%}\", add a new remote device on your end with this ID:": "\"{{devicename}}\" 기기와 연동하려면 아래의 아이디를 이용해 본인의 기기에서 새로운 기기를 추가하십시오.",
+11
View File
@@ -26,6 +26,7 @@
"Allow Anonymous Usage Reporting?": "Siųsti anoniminę naudojimo ataskaitą?",
"Allowed Networks": "Leidžiami tinklai",
"Alphabetic": "Abėcėlės tvarka",
"Always turned on when the folder type is \"{%foldertype%}\".": "Visada įjungta, kai aplanko tipas yra „{{foldertype}}“.",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Išorinė komanda apdoroja versijų valdymą. Ji turi pašalinti failą iš bendrinamo aplanko. Jei kelyje į programą yra tarpų, jie turėtų būti imami į kabutes.",
"Anonymous Usage Reporting": "Anoniminė naudojimo ataskaita",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Anoniminės naudojimo ataskaitos formatas pasikeitė. Ar norėtumėte pereiti prie naujojo formato?",
@@ -51,8 +52,10 @@
"Body:": "Turinys:",
"Bugs": "Klaidos",
"Cancel": "Atsisakyti",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Negali būti įjungta, kai aplanko tipas yra „{{foldertype}}“.",
"Changelog": "Keitinių žurnalas",
"Clean out after": "Išvalyti po",
"Cleaning Versions": "Versijų išvalymas",
"Cleanup Interval": "Išvalymo intervalas",
"Click to see full identification string and QR code.": "Spustelėkite, kad pamatytumėte visą identifikavimo eilutę ir QR kodą.",
"Close": "Užverti",
@@ -78,10 +81,13 @@
"Custom Range": "Tinkintas rėžis",
"Danger!": "Pavojus!",
"Database Location": "Duomenų bazės vieta",
"Debug": "Derinimas",
"Debugging Facilities": "Derinimo priemonės",
"Default": "Numatytasis",
"Default Configuration": "Numatytoji konfigūracija",
"Default Device": "Numatytasis įrenginys",
"Default Folder": "Numatytasis aplankas",
"Default Ignore Patterns": "Numatytieji nepaisymo šablonai",
"Defaults": "Numatytosios reikšmės",
"Delete": "Ištrinti",
"Delete Unexpected Items": "Ištrinti netikėtus elementus",
@@ -195,6 +201,8 @@
"Incoming Rate Limit (KiB/s)": "Atsiunčiamo srauto maksimalus greitis (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Neteisinga konfigūracija gali pažeisti jūsų aplankų turinį ir padaryti Syncthing neoperuotina.",
"Incorrect user name or password.": "Neteisingas naudotojo vardas ar slaptažodis.",
"Info": "Informacija",
"Internally used paths:": "Viduje naudojami keliai:",
"Introduced By": "Supažindė",
"Introducer": "Supažindintojas",
"Inversion of the given condition (i.e. do not exclude)": "Apversti sąlygas (pvz.: nenustoti naudoti)",
@@ -207,6 +215,8 @@
"Learn more": "Sužinoti daugiau",
"Learn more at {%url%}": "Sužinokite daugiau, adresu {{url}}",
"Limit": "Apribojimas",
"Listener Failures": "Klausytojo nesėkmės",
"Listener Status": "Klausytojo būsena",
"Listeners": "Klausytojai",
"Loading data...": "Įkeliami duomenys...",
"Loading...": "Įkeliama...",
@@ -334,6 +344,7 @@
"Show ID": "Rodyti ID",
"Show QR": "Rodyti QR",
"Show detailed discovery status": "Rodyti išsamią atradimo būseną",
"Show detailed listener status": "Rodyti išsamią klausytojo būseną",
"Show diff with previous version": "Rodyti skirtumus su ankstesne versija",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.": "Grupės būsenoje rodomas vietoje įrenginio vardo. Kiti įrenginiai matys kaip pasirinktinį vardą.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.": "Grupės būsenoje rodomas vietoje įrenginio vardo. Bus atnaujintas į įrenginio vardą jei nieko neįrašysite.",
+7
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Automatycznie współdziel lub utwórz w domyślnej ścieżce foldery anonsowane przez to urządzenie.",
"Available debug logging facilities:": "Dostępne narzędzia logujące do debugowania:",
"Be careful!": "Ostrożnie!",
"Block Indexing": "Indeksowanie bloków",
"Body:": "Treść:",
"Bugs": "Błędy",
"Cancel": "Anuluj",
@@ -99,6 +100,7 @@
"Device": "Urządzenie",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Urządzenie o nazwie \"{{name}}\" {{device}} pod adresem ({{address}}) chce się połączyć. Czy dodać nowe urządzenie?",
"Device Certificate": "Certyfikat urządzenia",
"Device Group": "Grupa urządzenia",
"Device ID": "Identyfikator urządzenia",
"Device Identification": "Identyfikator urządzenia",
"Device Name": "Nazwa urządzenia",
@@ -169,6 +171,7 @@
"Filter by date": "Filtruj według daty",
"Filter by name": "Filtruj według nazwy",
"Folder": "Folder",
"Folder Group": "Grupa folderu",
"Folder ID": "Identyfikator folderu",
"Folder Label": "Etykieta folderu",
"Folder Path": "Ścieżka folderu",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Zatrzymano wypisywanie logów. Przewiń w dół, aby je wznowić.",
"Login failed, see Syncthing logs for details.": "Logowanie nie powiodło się. Sprawdź szczegóły w dzienniku zdarzeń programu.",
"Logs": "Dziennik zdarzeń",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Utrzymuj indeks wszystkich bloków w folderze, umożliwiając ponowne wykorzystanie bloków z innych plików podczas synchronizowania zmian. Wyłącz tę opcję, aby zmniejszyć rozmiar bazy danych, ale kosztem braku możliwości ponownego wykorzystania bloków w różnych plikach.",
"Major Upgrade": "Duża aktualizacja",
"Mass actions": "Działania masowe",
"Maximum Age": "Maksymalny wiek",
@@ -279,6 +283,8 @@
"Off": "Wyłączona",
"Oldest First": "Od najstarszych",
"Optional descriptive label for the folder. Can be different on each device.": "Opcjonalna opisowa etykieta dla folderu. Może być inna na każdym urządzeniu.",
"Optional group for the device. Can be different on each device.": "Opcjonalna grupa dla urządzenia. Może być inna na każdym urządzeniu.",
"Optional group for the folder. Can be different on each device.": "Opcjonalna grupa dla folderu. Może być inna na każdym urządzeniu.",
"Options": "Opcje",
"Out of Sync": "Niezsynchronizowane",
"Out of Sync Items": "Elementy niezsynchronizowane",
@@ -390,6 +396,7 @@
"Staggered": "Rozbudowane",
"Staggered File Versioning": "Rozbudowane wersjonowanie plików",
"Start Browser": "Uruchom przeglądarkę",
"Starting": "Rozpoczynanie",
"Statistics": "Statystyki",
"Stay logged in": "Pozostań zalogowany",
"Stopped": "Zatrzymany",
+7
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Criar ou compartilhar automaticamente pastas que este dispositivo anuncia no caminho padrão.",
"Available debug logging facilities:": "Facilidades de depuração disponíveis:",
"Be careful!": "Tenha cuidado!",
"Block Indexing": "Indexação de blocos",
"Body:": "Corpo:",
"Bugs": "Erros",
"Cancel": "Cancelar",
@@ -99,6 +100,7 @@
"Device": "Dispositivo",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Dispositivo \"{{name}}\" ({{device}} em {{address}}) quer se conectar. Adicionar novo dispositivo?",
"Device Certificate": "Certificado do dispositivo",
"Device Group": "Grupo de dispositivos",
"Device ID": "ID do dispositivo",
"Device Identification": "Identificação do dispositivo",
"Device Name": "Nome do dispositivo",
@@ -169,6 +171,7 @@
"Filter by date": "Filtrar por data",
"Filter by name": "Filtrar por nome",
"Folder": "Pasta",
"Folder Group": "Grupo de pastas",
"Folder ID": "ID da pasta",
"Folder Label": "Rótulo da pasta",
"Folder Path": "Caminho da pasta",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Log tailing pausado. Role até o final para continuar.",
"Login failed, see Syncthing logs for details.": "Falha no login. Veja os logs do Syncthing para mais detalhes.",
"Logs": "Registros",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Mantenha um índice de todos os blocos da pasta, permitindo a reutilização de blocos de outros arquivos ao sincronizar alterações. Desative para reduzir o tamanho do banco de dados ao custo de não poder reutilizar blocos entre arquivos.",
"Major Upgrade": "Atualização \"major\"",
"Mass actions": "Ações em massa",
"Maximum Age": "Idade máxima",
@@ -279,6 +283,8 @@
"Off": "Desligada",
"Oldest First": "Mais antigo primeiro",
"Optional descriptive label for the folder. Can be different on each device.": "Descrição opcional da pasta. Pode ser diferente em cada dispositivo.",
"Optional group for the device. Can be different on each device.": "Grupo opcional para o dispositivo. Pode ser diferente em cada dispositivo.",
"Optional group for the folder. Can be different on each device.": "Grupo opcional para a pasta. Pode ser diferente em cada dispositivo.",
"Options": "Opções",
"Out of Sync": "Fora de sincronia",
"Out of Sync Items": "Fora de sincronia",
@@ -390,6 +396,7 @@
"Staggered": "Escalonado",
"Staggered File Versioning": "Escalonado",
"Start Browser": "Iniciar navegador",
"Starting": "Iniciando",
"Statistics": "Estatísticas",
"Stay logged in": "Ficar conectado",
"Stopped": "Parado",
+20
View File
@@ -27,6 +27,7 @@
"Allowed Networks": "Rețele permise",
"Alphabetic": "Alfabetic",
"Altered by ignoring deletes.": "Modificat prin ignorarea ștergerilor.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Întotdeauna activat când tipul de folder este „{{foldertype}}”.",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "O comandă externă gestionează versiunea. Trebuie să elimine fișierul din mapa partajat. Dacă calea către aplicație conține spații, ar trebui să fie pusă între ghilimele.",
"Anonymous Usage Reporting": "Raport Anonim despre Folosirea Aplicației",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Formatul raportului de utilizare anonim s-a schimbat. Doriți să vă mutați în noul format?",
@@ -52,6 +53,7 @@
"Body:": "Corp:",
"Bugs": "Bug-uri",
"Cancel": "Renunță",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Nu poate fi activat când tipul de folder este „{{foldertype}}”.",
"Changelog": "Noutăți",
"Clean out after": "Curăță după",
"Cleaning Versions": "Curățare versiuni",
@@ -218,6 +220,9 @@
"Minimum Free Disk Space": "Minimum Free Disk Space",
"Mod. Device": "Mod. Device",
"Mod. Time": "Mod. Time",
"More than a month ago": "Acum mai mult de o lună",
"More than a week ago": "Acum mai mult de o săptămână",
"More than a year ago": "Acum mai bine de un an",
"Move to top of queue": "Mută la începutul listei",
"Multi level wildcard (matches multiple directory levels)": "Asterisc de nivel multiplu (corespunde fișierelor și sub-fișierelor)",
"Never": "Niciodată",
@@ -242,6 +247,7 @@
"Path": "Path",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for": "Localizarea fișierului în acest computer. Dacă nu există, va fi creat. Tilda (~) înlocuiește ",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).": "Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).",
"Paths": "Căi",
"Pause": "Pauză",
"Pause All": "Pause All",
"Paused": "Paused",
@@ -259,6 +265,7 @@
"Preparing to Sync": "Preparing to Sync",
"Preview": "Previzualizează",
"Preview Usage Report": "Vezi raportul de utilizare",
"QR code": "Cod QR",
"Quick guide to supported patterns": "Ghid rapid pentru regulile suportate",
"Random": "Random",
"Receive Encrypted": "Receive Encrypted",
@@ -301,6 +308,8 @@
"Settings": "Setări",
"Share": "Împarte",
"Share Folder": "Împarte Mapa",
"Share by Email": "Partajare prin e-mail",
"Share by SMS": "Partajare prin SMS",
"Share this folder?": "Împarte această mapă?",
"Shared Folders": "Shared Folders",
"Shared With": "Împarte Cu",
@@ -330,6 +339,7 @@
"Statistics": "Statistici",
"Stopped": "Oprit",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.": "Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{{receiveEncrypted}}\" too.",
"Subject:": "Suibiect:",
"Support": "Suport Tehnic",
"Support Bundle": "Support Bundle",
"Sync Protocol Listen Addresses": "Adresa protocolului de sincronizare",
@@ -377,15 +387,18 @@
"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.": "Intervalul de rescanare trebuie să nu fie un număr negativ de secunde. ",
"There are no devices to share this folder with.": "There are no devices to share this folder with.",
"There are no file versions to restore.": "Nu există versiuni de fișiere de restaurat.",
"There are no folders to share with this device.": "There are no folders to share with this device.",
"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 Month": "Luna aceasta",
"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 device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.": "This device cannot automatically discover other devices or announce its own address to be found by others. Only devices with statically configured addresses can connect.",
"This is a major version upgrade.": "This is a major version upgrade.",
"This setting controls the free space required on the home (i.e., index database) disk.": "This setting controls the free space required on the home (i.e., index database) disk.",
"Time": "Time",
"Time the item was last modified": "Time the item was last modified",
"Today": "Azi",
"Trash Can File Versioning": "Trash Can File Versioning",
"Type": "Type",
"UNIX Permissions": "UNIX Permissions",
@@ -401,6 +414,7 @@
"Unshared Folders": "Unshared Folders",
"Untrusted": "Untrusted",
"Up to Date": "La Zi",
"Updated {%file%}": "{{file}} actualizat",
"Upgrade": "Upgrade",
"Upgrade To {%version%}": "Actualizează La Versiunea {{version}}",
"Upgrading": "Se Actualizează",
@@ -408,6 +422,7 @@
"Uptime": "Uptime",
"Usage reporting is always enabled for candidate releases.": "Usage reporting is always enabled for candidate releases.",
"Use HTTPS for GUI": "Foloseşte HTTPS pentru interfaţă",
"Use notifications from the filesystem to detect changed items.": "Folosește notificările din filesystem pentru a detecta elementele modificate.",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Username/Password has not been set for the GUI authentication. Please consider setting it up.",
"Version": "Versiune",
"Versions": "Versions",
@@ -428,6 +443,8 @@
"When adding a new device, keep in mind that this device must be added on the other side too.": "Când adaugi un dispozitiv nou, trebuie să adaugi şi dispozitivul curent în dispozitivul nou.",
"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.": "Cînd adăugaţi un fişier nou, nu uitaţi că ID-ul fişierului va rămîne acelaşi pe toate dispozitivele. Iar literele mari sînt diferite de literele mici. ",
"Yes": "Da",
"Yesterday": "Ieri",
"You can also copy and paste the text into a new message manually.": "De asemenea, puteți copia și lipi manual textul într-un mesaj nou.",
"You can also select one of these nearby devices:": "You can also select one of these nearby devices:",
"You can change your choice at any time in the Settings dialog.": "You can change your choice at any time in the Settings dialog.",
"You can read more about the two release channels at the link below.": "You can read more about the two release channels at the link below.",
@@ -436,7 +453,10 @@
"You have unsaved changes. Do you really want to discard them?": "You have unsaved changes. Do you really want to discard them?",
"You must keep at least one version.": "Trebuie să păstrezi cel puţin o versiune.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.": "You should never add or change anything locally in a \"{{receiveEncrypted}}\" folder.",
"Your SMS app should open to let you choose the recipient and send it from your own number.": "Aplicația SMS ar trebui să se deschidă pentru a vă permite să alegeți destinatarul și să trimiteți mesajul de pe propriul număr.",
"Your email app should open to let you choose the recipient and send it from your own address.": "Aplicația de e-mail ar trebui să se deschidă pentru a vă permite să alegeți destinatarul și să trimiteți mesajul de la propria adresă.",
"days": "Zile",
"deleted": "șters",
"directories": "directories",
"files": "files",
"full documentation": "toată documentaţia",
+1 -1
View File
@@ -410,7 +410,7 @@
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing ожидает подключения от других устройств на следующих сетевых адресах:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing не ожидает попыток подключения ни на каких адресах. Только исходящие подключения могут работать на этом устройстве.",
"Syncthing is restarting.": "Перезапуск Syncthing.",
"Syncthing is saving changes.": "Синхронизация это сохранение изменений.",
"Syncthing is saving changes.": "Syncthing сохраняет изменения.",
"Syncthing is upgrading.": "Обновление Syncthing.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.": "Syncthing теперь поддерживает автоматическую отправку отчетов о сбоях разработчикам. Эта функция включена по умолчанию.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Кажется, Syncthing не запущен или есть проблемы с подключением к Интернету. Переподключаюсь…",
+30 -23
View File
@@ -21,7 +21,7 @@
"Advanced": "Avancerat",
"Advanced Configuration": "Avancerad konfiguration",
"All Data": "Alla data",
"All Time": "Någonsin",
"All Time": "All tid",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Alla mappar som delas med denna enhet måste skyddas av ett lösenord, så att alla skickade data är oläsliga utan det angivna lösenordet.",
"Allow Anonymous Usage Reporting?": "Tillåt anonym användarstatistiksrapportering?",
"Allowed Networks": "Tillåtna nätverk",
@@ -31,7 +31,7 @@
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Ett externt kommando hanterar versionen. Det måste ta bort filen från den delade mappen. Om sökvägen till applikationen innehåller mellanslag bör den citeras.",
"Anonymous Usage Reporting": "Anonym användarstatistiksrapportering",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Anonymt användningsrapportformat har ändrats. Vill du flytta till det nya formatet?",
"Applied to LAN": "Applicerad på LAN",
"Applied to LAN": "Tillämpas på LAN",
"Apply": "Tillämpa",
"Are you sure you want to override all remote changes?": "Är du säker på att du vill åsidosätta alla fjärrändringar?",
"Are you sure you want to permanently delete all these files?": "Är du säker på att du vill ta bort alla dessa filer permanent?",
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Skapa eller dela automatiskt mappar som denna enhet annonserar på standardsökvägen.",
"Available debug logging facilities:": "Tillgängliga felsökningsfunktioner:",
"Be careful!": "Var aktsam!",
"Block Indexing": "Blockindexering",
"Body:": "Meddelande:",
"Bugs": "Felrapporter",
"Cancel": "Avbryt",
@@ -75,10 +76,10 @@
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.": "Kontinuerlig bevakning av ändringar är nu tillgängligt i Syncthing. Detta kommer att upptäcka ändringar på disken och utfärda en skanning på endast de ändrade sökvägarna. Fördelarna är att ändringar delas snabbare och att mindre fullständiga skanningar krävs.",
"Copied from elsewhere": "Kopierat från annanstans",
"Copied from original": "Kopierat från original",
"Copied!": "Kopierad!",
"Copied!": "Kopierat!",
"Copy": "Kopiera",
"Copy failed! Try to select and copy manually.": "Kopieringen misslyckades! Försök att markera och kopiera manuellt.",
"Currently Shared With Devices": "För närvarande delas med enheter",
"Currently Shared With Devices": "Delas för närvarande med enheter",
"Custom Range": "Anpassat intervall",
"Danger!": "Fara!",
"Database Location": "Databasplats",
@@ -99,6 +100,7 @@
"Device": "Enhet",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "Enhet \"{{name}}\" ({{device}} på {{address}}) vill ansluta. Lägg till ny enhet?",
"Device Certificate": "Enhetscertifikat",
"Device Group": "Enhetsgrupp",
"Device ID": "Enhets-ID",
"Device Identification": "Enhetens identifikation",
"Device Name": "Enhetsnamn",
@@ -161,14 +163,15 @@
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.": "Det går inte att ansluta till IPv6-servrar om det inte finns någon IPv6-anslutning.",
"File Pull Order": "Filhämtningsprioritering",
"File Versioning": "Filversionshantering",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Filer flyttas till .stversions-mappen vid byte eller tas bort av Syncthing.",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.": "Filer flyttas till .stversions-mappen när de ersätts eller tas bort av Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.": "Filer flyttas till datumstämplade versioner i en .stversions-mapp när de ersätts eller tas bort av Syncthing.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.": "Filer skyddas från ändringar gjorda på andra enheter, men ändringar som görs på denna nod skickas till de andra klustermedlemmarna.",
"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 är skyddade från ändringar som görs på andra enheter, men ändringar som görs på den här enheten skickas till resten av klustret.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.": "Filer synkroniseras från klustret, men alla ändringar som görs lokalt skickas inte till andra enheter.",
"Filesystem Watcher Errors": "Filsystem bevakarfel",
"Filesystem Watcher Errors": "Fel i filsystembevakaren",
"Filter by date": "Filtrera efter datum",
"Filter by name": "Filtrera efter namn",
"Folder": "Mapp",
"Folder Group": "Mappgrupp",
"Folder ID": "Mapp-ID",
"Folder Label": "Mappetikett",
"Folder Path": "Mappsökväg",
@@ -179,7 +182,7 @@
"Folders": "Mappar",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.": "För följande mappar uppstod ett fel när du började bevaka ändringar. Det kommer att omförsökas varje minut, så felen kan försvinna snart. Om de fortsätter, försök att åtgärda det underliggande problemet och fråga om hjälp om du inte kan.",
"Forever": "För alltid",
"Full Rescan Interval (s)": "Fullständigt återkommande skanningsintervall (s)",
"Full Rescan Interval (s)": "Intervall för fullständig omskanning (s)",
"GUI": "Grafiskt användargränssnitt",
"GUI / API HTTPS Certificate": "HTTPS-certifikat för gränssnitt / API",
"GUI Authentication Password": "Autentiseringslösenord för gränssnitt",
@@ -199,7 +202,7 @@
"However, your current settings indicate you might not want it enabled. We have disabled automatic crash reporting for you.": "Dina aktuella inställningar indikerar dock att du kanske inte vill att ha det aktiverat. Vi har inaktiverat automatisk kraschrapportering för dig.",
"Identification": "Identifiering",
"If untrusted, enter encryption password": "Om opålitlig, ange krypteringslösenord",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Om du vill förhindra att andra användare på denna dator får åtkomst till Syncthing och genom det dina filer, överväg att ställa in autentisering.",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.": "Om du vill förhindra att andra användare på denna dator får åtkomst till Syncthing och dina filer via det, överväg att konfigurera autentisering.",
"Ignore": "Ignorera",
"Ignore Patterns": "Ignoreringsmönster",
"Ignore Permissions": "Ignorera rättigheter",
@@ -209,7 +212,7 @@
"Ignored at": "Ignorerad vid",
"Included Software": "Inkluderad programvara",
"Incoming Rate Limit (KiB/s)": "Ingående hastighetsgräns (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Inkorrekt konfiguration kan skada innehållet i mappen och få Syncthing att sluta fungera.",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Felaktig konfiguration kan skada innehållet i mappen och få Syncthing att sluta fungera.",
"Incorrect user name or password.": "Felaktigt användarnamn eller lösenord.",
"Info": "Info",
"Internally used paths:": "Internt använda sökvägar:",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Loggning pausad. Bläddra till botten för att fortsätta.",
"Login failed, see Syncthing logs for details.": "Inloggningen misslyckades, se Syncthing-loggarna för detaljer.",
"Logs": "Loggar",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Upprätthåll ett index över alla block i mappen, vilket möjliggör återanvändning av block från andra filer vid synkronisering av ändringar. Inaktivera för att minska databasens storlek på bekostnad av att inte kunna återanvända block mellan filer.",
"Major Upgrade": "Större uppgradering",
"Mass actions": "Massåtgärder",
"Maximum Age": "Högsta ålder",
@@ -259,7 +263,7 @@
"Mod. Device": "Enhet som utförde ändring",
"Mod. Time": "Tid för ändring",
"More than a month ago": "Mer än en månad sedan",
"More than a week ago": "Mer än en vecka sedan",
"More than a week ago": "För mer än en vecka sedan",
"More than a year ago": "Mer än ett år sedan",
"Move to top of queue": "Flytta till överst i kön",
"Multi level wildcard (matches multiple directory levels)": "Flernivå jokertecken (matchar flera mappnivåer)",
@@ -279,6 +283,8 @@
"Off": "Av",
"Oldest First": "Äldsta först",
"Optional descriptive label for the folder. Can be different on each device.": "Valfri beskrivande etikett för mappen. Kan vara olika på varje enhet.",
"Optional group for the device. Can be different on each device.": "Valfri grupp för enheten. Kan vara olika på varje enhet.",
"Optional group for the folder. Can be different on each device.": "Valfri grupp för mappen. Kan vara olika på varje enhet.",
"Options": "Alternativ",
"Out of Sync": "Osynkroniserad",
"Out of Sync Items": "Osynkroniserade objekt",
@@ -390,6 +396,7 @@
"Staggered": "Förskjuten",
"Staggered File Versioning": "Filversionshantering i intervall",
"Start Browser": "Starta webbläsaren",
"Starting": "Börjar",
"Statistics": "Statistik",
"Stay logged in": "Förbli inloggad",
"Stopped": "Stoppad",
@@ -402,11 +409,11 @@
"Sync Protocol Listen Addresses": "Lyssnaradresser för synkroniseringsprotokoll",
"Sync Status": "Synkroniseringsstatus",
"Syncing": "Synkroniserar",
"Syncthing device ID for \"{%devicename%}\"": "Synkronisera enhets-ID för \"{{devicename}}\"",
"Syncthing has been shut down.": "Synkronisering har stängts av.",
"Syncthing device ID for \"{%devicename%}\"": "Syncthing enhets-ID för \"{{devicename}}\"",
"Syncthing has been shut down.": "Syncthing har stängts av.",
"Syncthing includes the following software or portions thereof:": "Syncthing innehåller följande mjukvarupaket eller delar av dem:",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.": "Syncthing har fri och öppen källkod licensierad som MPL v2.0.",
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing är ett program för kontinuerlig filsynkronisering. Den synkroniserar filer mellan två eller flera datorer i realtid, säkert skyddade från nyfikna ögon. Dina data är enbart din data och du förtjänar att välja var den lagras, om den delas med någon tredje part och hur den överförs över internet.",
"Syncthing is a continuous file synchronization program. It synchronizes files between two or more computers in real time, safely protected from prying eyes. Your data is your data alone and you deserve to choose where it is stored, whether it is shared with some third party, and how it's transmitted over the internet.": "Syncthing är ett program för kontinuerlig filsynkronisering. Den synkroniserar filer mellan två eller flera datorer i realtid, säkert skyddade från nyfikna ögon. Dina data är dina data och du har rätt att välja var de lagras, om de delas med någon tredje part och hur de överförs över internet.",
"Syncthing is listening on the following network addresses for connection attempts from other devices:": "Syncthing lyssnar på följande nätverksadresser för anslutningsförsök från andra enheter:",
"Syncthing is not listening for connection attempts from other devices on any address. Only outgoing connections from this device may work.": "Syncthing lyssnar inte efter anslutningsförsök från andra enheter på någon adress. Endast utgående anslutningar från denna enhet kanske fungerar.",
"Syncthing is restarting.": "Syncthing startar om.",
@@ -425,11 +432,11 @@
"The cleanup interval cannot be blank.": "Rensningsintervallet kan inte vara tomt.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Konfigurationen har sparats men inte aktiverats. Syncthing måste startas om för att aktivera den nya konfigurationen.",
"The device ID cannot be blank.": "Enhets-ID kan inte vara tomt.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Enhets-ID som du anger här finns i dialogrutan \"Åtgärder > Visa ID\" på denna enhet. Mellanslag och bindestreck är valfria (ignoreras).",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).": "Enhets-ID som du anger här finns i dialogrutan \"Åtgärder > Visa ID\" på den andra enheten. Mellanslag och bindestreck är valfria (ignoreras).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes, and app versions. If the reported data set is changed you will be prompted with this dialog again.": "Den krypterade användningsrapporten skickas dagligen. Det används för att spåra vanliga plattformar, mappstorlekar och appversioner. Om den rapporterade datauppsättningen ändras kommer du att uppmanas med denna dialogruta igen.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.": "Det inmatade enhets-ID:t verkar inte vara korrekt. Det ska vara en 52 eller 56 teckensträng bestående av siffror och bokstäver, eventuellt med mellanrum och bindestreck.",
"The folder ID cannot be blank.": "Mapp-ID får inte vara tomt.",
"The folder ID must be unique.": "Mapp-ID måste vara unik.",
"The folder ID must be unique.": "Mapp-ID måste vara unikt.",
"The folder content on other devices will be overwritten to become identical with this device. Files not present here will be deleted on other devices.": "Mappinnehållet på andra enheter skrivs över så att det blir identiskt med denna enhet. Filer som inte finns här kommer att tas bort på andra enheter.",
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.": "Mappinnehållet på denna enhet skrivs över för att bli identiskt med andra enheter. Filer som nyligen har lagts till här kommer att tas bort.",
"The folder path cannot be blank.": "Mappsökvägen kan inte vara tom.",
@@ -450,10 +457,10 @@
"The number of versions must be a number and cannot be blank.": "Antalet versioner måste vara ett nummer och kan inte lämnas tomt.",
"The path cannot be blank.": "Sökvägen kan inte vara tom.",
"The rate limit is applied to the accumulated traffic of all connections to this device.": "Hastighetsgränsen tillämpas på den ackumulerade trafiken för alla anslutningar till denna enhet.",
"The rate limit must be a non-negative number (0: no limit)": "Frekvensgränsen måste vara ett icke-negativt tal (0: ingen gräns)",
"The rate limit must be a non-negative number (0: no limit)": "Hastighetsgränsen måste vara ett icke-negativt tal (0: ingen gräns)",
"The remote device has not accepted sharing this folder.": "Fjärrenheten har inte accepterat delning av denna mapp.",
"The remote device has paused this folder.": "Fjärrenheten har pausat denna mapp.",
"The rescan interval must be a non-negative number of seconds.": "Förnyelseintervallet måste vara ett positivt antal sekunder.",
"The rescan interval must be a non-negative number of seconds.": "Omskanningsintervallet måste vara ett positivt antal sekunder.",
"There are no devices to share this folder with.": "Det finns inga enheter att dela denna mapp med.",
"There are no file versions to restore.": "Det finns inga filversioner att återställa.",
"There are no folders to share with this device.": "Det finns inga mappar att dela med denna enhet.",
@@ -475,7 +482,7 @@
"UNIX Permissions": "UNIX-behörigheter",
"Unavailable": "Otillgänglig",
"Unavailable/Disabled by administrator or maintainer": "Otillgängligt/inaktiverat av administratör eller underhållare",
"Undecided (will prompt)": "Obeslutad (kommer att skriva)",
"Undecided (will prompt)": "Obeslutad (kommer att fråga)",
"Unexpected Items": "Oväntade objekt",
"Unexpected items have been found in this folder.": "Oväntade objekt har hittats i denna mapp.",
"Unignore": "Sluta ignorera",
@@ -499,12 +506,12 @@
"Username/Password has not been set for the GUI authentication. Please consider setting it up.": "Användarnamn/lösenord har inte ställts in för autentisering av det grafiska gränssnittet. Överväg att ställa in det.",
"Using a QUIC connection over LAN": "Använder en QUIC-anslutning över LAN",
"Using a QUIC connection over WAN": "Använder en QUIC-anslutning över WAN",
"Using a direct TCP connection over LAN": "Använda en direkt TCP-anslutning över LAN",
"Using a direct TCP connection over WAN": "Använda en direkt TCP-anslutning över WAN",
"Using a direct TCP connection over LAN": "Använder en direkt TCP-anslutning över LAN",
"Using a direct TCP connection over WAN": "Använder en direkt TCP-anslutning över WAN",
"Version": "Version",
"Versions": "Versioner",
"Versions Path": "Sökväg för versioner",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Versioner tas bort automatiskt när de är äldre än den maximala åldersgränsen eller överstiger frekvensen i intervallet.",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.": "Versioner tas automatiskt bort om de är äldre än den maximala åldern eller överskrider antalet filer som tillåts i ett intervall.",
"Waiting to Clean": "Väntar på att rensa",
"Waiting to Scan": "Väntar på att skanna",
"Waiting to Sync": "Väntar på att synkronisera",
@@ -518,7 +525,7 @@
"Watching for Changes": "Bevakar ändringar",
"Watching for changes discovers most changes without periodic scanning.": "Bevakning av ändringar upptäcker de flesta ändringar utan periodisk skanning.",
"When adding a new device, keep in mind that this device must be added on the other side too.": "När du lägger till en ny enhet, kom ihåg att denna enhet måste läggas till på den andra enheten också.",
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "När du lägger till ny mapp, tänk på att mapp-ID knyter ihop mappar mellan olika enheter. De skiftlägeskänsliga och måste matcha precis mellan alla enheter.",
"When adding a new folder, keep in mind that the Folder ID is used to tie folders together between devices. They are case sensitive and must match exactly between all devices.": "När du lägger till ny mapp, tänk på att mapp-ID knyter ihop mappar mellan olika enheter. De är skiftlägeskänsliga och måste matcha precis mellan alla enheter.",
"When set to more than one on both devices, Syncthing will attempt to establish multiple concurrent connections. If the values differ, the highest will be used. Set to zero to let Syncthing decide.": "När den är inställd på mer än en på båda enheterna kommer Syncthing att försöka upprätta flera samtidiga anslutningar. Om värdena skiljer sig kommer det högsta att användas. Ställ in på noll för att låta Syncthing bestämma.",
"Yes": "Ja",
"Yesterday": "Igår",
+7
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "Bu cihazın duyurduğu klasörleri otomatik olarak varsayılan yolda oluşturun veya paylaşın.",
"Available debug logging facilities:": "Mevcut hata ayıklama günlüklemesi olanakları:",
"Be careful!": "Dikkatli olun!",
"Block Indexing": "Blok İndeksleme",
"Body:": "Gövde:",
"Bugs": "Hatalar",
"Cancel": "İptal",
@@ -99,6 +100,7 @@
"Device": "Cihaz",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "\"{{name}}\" ({{address}} adresindeki {{device}}) cihazı bağlanmak istiyor. Yeni cihaz eklensin mi?",
"Device Certificate": "Cihaz Sertifikası",
"Device Group": "Cihaz Grubu",
"Device ID": "Cihaz Kimliği",
"Device Identification": "Cihaz Kimliği",
"Device Name": "Cihaz Adı",
@@ -169,6 +171,7 @@
"Filter by date": "Tarihe göre süz",
"Filter by name": "İsme göre süz",
"Folder": "Klasör",
"Folder Group": "Klasör Grubu",
"Folder ID": "Klasör Kimliği",
"Folder Label": "Klasör Etiketi",
"Folder Path": "Klasör Yolu",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "Günlük kuyruğu duraklatıldı. Devam etmek için aşağı kaydırın.",
"Login failed, see Syncthing logs for details.": "Oturum açma başarısız oldu, ayrıntılar için Syncthing günlüklerine bakın.",
"Logs": "Günlükler",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "Değişiklikleri eşitlerken diğer dosyalardaki blokların yeniden kullanılmasını sağlamak için klasördeki tüm blokların indeksini koruyun. Blokları dosyalar arasında yeniden kullanamama pahasına veritabanı boyutunu azaltmak için etkisizleştirin.",
"Major Upgrade": "Büyük Yükseltme",
"Mass actions": "Toplu eylemler",
"Maximum Age": "En Fazla Yaş",
@@ -279,6 +283,8 @@
"Off": "Kapalı",
"Oldest First": "Önce En Eski Olan",
"Optional descriptive label for the folder. Can be different on each device.": "Klasör için isteğe bağlı açıklayıcı etiket. Her cihazda farklı olabilir.",
"Optional group for the device. Can be different on each device.": "Cihaz için isteğe bağlı grup. Her cihazda farklı olabilir.",
"Optional group for the folder. Can be different on each device.": "Klasör için isteğe bağlı grup. Her cihazda farklı olabilir.",
"Options": "Seçenekler",
"Out of Sync": "Eşitlenmemiş",
"Out of Sync Items": "Eşitlenmemiş Öğeler",
@@ -390,6 +396,7 @@
"Staggered": "Aşamalı",
"Staggered File Versioning": "Aşamalı Dosya Sürümlendirme",
"Start Browser": "Tarayıcıyı başlat",
"Starting": "Başlıyor",
"Statistics": "İstatistikler",
"Stay logged in": "Oturum açık kalsın",
"Stopped": "Durduruldu",
+52 -15
View File
@@ -1,39 +1,58 @@
{
"A device with that ID is already added.": "ID thiết bị này đã được thêm",
"A device with that ID is already added.": "ID thiết bị này đã được thêm.",
"A negative number of days doesn't make sense.": "Số ngày không được âm.",
"A new major version may not be compatible with previous versions.": "Phiên bản chính mới có thể sẽ không tương thích với các bản cũ.",
"API Key": "Khoá API",
"About": "Thông tin",
"Action": "Hành động",
"Actions": "Thao tác",
"Active filter rules": "Quy tắc lọc đang hoạt động",
"Add": "Thêm",
"Add Device": "Thêm thiết bị",
"Add Folder": "Thêm thư mục",
"Add Remote Device": "Thêm thiết bị từ xa",
"Add devices from the introducer to our device list, for mutually shared folders.": "Thêm thiết bị từ người giới thiệu vào danh sách thiết bị của chúng ta để chia sẻ thư mục với nhau",
"Add devices from the introducer to our device list, for mutually shared folders.": "Thêm thiết bị từ người giới thiệu vào danh sách thiết bị của chúng ta để chia sẻ thư mục với nhau.",
"Add filter entry": "Thêm mục lọc",
"Add ignore patterns": "Thêm các mẫu bỏ qua",
"Add new folder?": "Thêm thư mục mới?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Khoảng thời gian quét lại toàn bộ sẽ được tăng lên (60 lần, nghĩa là mặc định là 1 giờ). Bạn cũng có thể cấu hình thủ công lại cho mọi thư mục sau khi chọn Không",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.": "Khoảng thời gian quét lại toàn bộ sẽ được tăng lên (60 lần, nghĩa là mặc định là 1 giờ). Bạn cũng có thể cấu hình thủ công lại cho mọi thư mục sau khi chọn Không.",
"Address": "Địa chỉ",
"Addresses": "Các địa chỉ",
"Advanced": "Nâng cao",
"Advanced Configuration": "Cấu hình nâng cao",
"All Data": "Tất cả dữ liệu",
"All Time": "Toàn thời gian",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.": "Tất cả các thư mục chia sẻ với thiết bị này phải được bảo vệ bằng mật khẩu, sao cho tất cả dữ liệu gửi đi sẽ không thể đọc được nếu không có mật khẩu đã cung cấp.",
"Allow Anonymous Usage Reporting?": "Cho phép báo cáo sử dụng ẩn danh?",
"Allowed Networks": "Các mạng được phép",
"Alphabetic": "A-Z",
"Alphabetic": "Theo thứ tự chữ cái",
"Altered by ignoring deletes.": "Đã thay đổi nhưng bỏ qua việc xóa.",
"Always turned on when the folder type is \"{%foldertype%}\".": "Luôn bật khi loại thư mục là \"{{foldertype}}\".",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.": "Một tập lệnh ngoại vi chịu trách nhiệm phiên bản hóa. Nó phải xóa tệp tin khỏi thư mục được chia sẻ. Nếu đường dẫn đến tập tin chứa khoảng trắng, nó sẽ được trích dẫn.",
"Anonymous Usage Reporting": "Báo cáo sử dụng ẩn danh",
"Anonymous usage report format has changed. Would you like to move to the new format?": "Định dạng báo cáo sử dụng ẩn danh đã thay đổi. Bạn có muốn chuyển sang định dạng mới?",
"Are you sure you want to remove device {%name%}?": "Bạn có chắc chắn muốn xóa thiết bị này không [[Tên thiết bị]]?",
"Are you sure you want to remove folder {%label%}?": "Bạn có chắc chắn muốn xóa thư mục này không [[nhãn]]?",
"Are you sure you want to restore {%count%} files?": "Bạn có chắc chắn muốn khôi phục [[số lượng]] tệp tin?",
"Applied to LAN": "Áp dụng cho mạng LAN",
"Apply": "Áp dụng",
"Are you sure you want to override all remote changes?": "Bạn có chắc chắn muốn ghi đè lên tất cả các thay đổi từ xa không?",
"Are you sure you want to permanently delete all these files?": "Bạn có chắc chắn muốn xóa vĩnh viễn tất cả các tệp này không?",
"Are you sure you want to remove device {%name%}?": "Bạn có chắc chắn muốn xóa thiết bị {{name}} không?",
"Are you sure you want to remove folder {%label%}?": "Bạn có chắc chắn muốn xóa thư mục {{label}} không?",
"Are you sure you want to restore {%count%} files?": "Bạn có chắc chắn muốn khôi phục {{count}} tệp tin?",
"Are you sure you want to revert all local changes?": "Bạn có chắc chắn muốn hoàn tác tất cả các thay đổi cục bộ không?",
"Are you sure you want to upgrade?": "Bạn có chắc chắn muốn nâng cấp không?",
"Authentication Required": "Yêu cầu xác thực",
"Authors": "Tác giả",
"Auto Accept": "Tự động chấp nhận",
"Automatic Crash Reporting": "Báo cáo sự cố tự động",
"Automatic upgrade now offers the choice between stable releases and release candidates.": "Nâng cấp tự động hiện đang cung cấp lựa chọn giữa các bản phát hành ổn định và bản phát hành thử nghiệm.",
"Automatic upgrades": "Cập nhật tự động",
"Automatically create or share folders that this device advertises at the default path.": "Tự động tạo hoặc chia sẻ các thư mục mà thiết bị này giới thiệu ở đường dẫn mặc định.",
"Available debug logging facilities:": "Phương tiện ghi nhật ký gỡ lỗi có sẵn:",
"Be careful!": "Cẩn thận!",
"Body:": "Nội dung:",
"Bugs": "Lỗi",
"Cancel": "Hủy",
"Cannot be enabled when the folder type is \"{%foldertype%}\".": "Không thể kích hoạt khi loại thư mục là \"{{foldertype}}\".",
"Changelog": "Lịch sử thay đổi",
"Clean out after": "Dọn dẹp sau",
"Close": "Đóng",
@@ -82,23 +101,40 @@
"Folder ID": "ID thư mục",
"Folder Label": "Nhãn thư mục",
"Folder Path": "Đ.dẫn đến th.mục",
"Folder Type": "Loại thu mục",
"Folders": "Các th.mục",
"GUI": "GUI",
"GUI Authentication Password": "Mật khẩu xác minh GUI",
"GUI Authentication User": "Người dùng xác minh GUI",
"Forever": "Mãi mãi",
"Full Rescan Interval (s)": "Khoảng thời gian quét lại toàn bộ (giây)",
"GUI": "Giao diện người dùng (GUI)",
"GUI / API HTTPS Certificate": "",
"GUI Authentication Password": "Mật khẩu xác thực GUI",
"GUI Authentication User": "Người dùng xác thực GUI",
"GUI Authentication: Set User and Password": "Xác thực GUI: Đặt người dùng và mật khẩu",
"GUI Listen Address": "Địa chỉ lắng nghe GUI",
"GUI Override Directory": "",
"GUI Theme": "Chủ đề giao diện GUI",
"General": "Chung",
"Generate": "Tạo mới",
"Global Discovery": "Dò tìm toàn cầu",
"Global Discovery Servers": "Các m.chủ dò tìm toàn cầu",
"Global Discovery Servers": "Các máy chủ khám phá toàn cầu",
"Global State": "Tr.thái toàn cầu",
"Help": "Trợ giúp",
"Hint: only deny-rules detected while the default is deny. Consider adding \"permit any\" as last rule.": "Gợi ý: chỉ phát hiện các rule từ chối (deny-rules) trong khi mặc định là deny. Hãy cân nhắc thêm “permit any” làm quy tắc cuối cùng.",
"Home page": "Trang chủ",
"Identification": "Nhận dạng",
"Ignore": "Bỏ qua",
"Ignore Patterns": "Bỏ qua các quy luật",
"Ignore Permissions": "Bỏ qua các giấy phép",
"Ignored Devices": "Các thiết bị bỏ qua",
"Ignored Folders": "Các thư mục bị bỏ qua",
"Ignored at": "Bỏ qua tại",
"Included Software": "Phần mềm đi kèm",
"Incoming Rate Limit (KiB/s)": "Giới hạn t.độ đầu vào (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.": "Cấu hình không đúng có thể làm mất mát dữ liệu và khiến Syncthing ngừng hoạt động.",
"Incorrect user name or password.": "Tên người dùng hoặc mật khẩu không chính xác.",
"Info": "Thông tin",
"Introducer": "Th.bị giới thiệu",
"Inversion of the given condition (i.e. do not exclude)": "Đảo ngược điều kiện cho trước (VD: không được loại trừ)",
"Inversion of the given condition (i.e. do not exclude)": "Đảo ngược điều kiện cho trước (Ví dụ: không được loại trừ)",
"Keep Versions": "Giữ các ph.bản",
"LDAP": "LDAP",
"Largest First": "Lớn nhất đầu tiên",
@@ -174,11 +210,12 @@
"Support": "Hỗ trợ",
"Sync Protocol Listen Addresses": "Đồng bộ các đ.chỉ l.nghe giao thức",
"Syncing": "Đang đ.bộ",
"Syncthing has been shut down.": "Đã tắt Syncthing.",
"Syncthing includes the following software or portions thereof:": "Syncthing bao gồm các ph.mềm hoặc ph.tử của các ph.mềm sau:",
"Syncthing device ID for \"{%devicename%}\"": "Mã định danh thiết bị Syncthing cho \"{{devicename}}\"",
"Syncthing has been shut down.": "Syncthing đã bị tắt.",
"Syncthing includes the following software or portions thereof:": "Syncthing bao gồm các phần mềm sau hoặc một phần của chúng:",
"Syncthing is restarting.": "Syncthing đang kh.động lại.",
"Syncthing is upgrading.": "Syncthing đang n.cấp.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Có vẻ như Syncthing đang bị nghẽn hoặc là mạng của bạn có vấn đề. Đang thử lại...",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…": "Syncthing dường như đang gặp sự cố hoặc có vấn đề với kết nối Internet của bạn. Đang thử lại",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.": "Có vẻ như Syncthing đang gặp phải v.đề khi x.lý yêu cầu của bạn. Xin làm mới trang hoặc kh.động lại Syncthing nếu v.đề vẫn còn tiếp diễn.",
"The Syncthing admin interface is configured to allow remote access without a password.": "Giao diện q.trị của Syncthing được c.hình nhằm cho phép tr.cập từ xa không cần mật khẩu.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.": "Cấu hình đã được lưu nhưng chưa được kích hoạt. Syncthing phải khởi động lại để kích hoạt cấu hình mới. ",
+7
View File
@@ -50,6 +50,7 @@
"Automatically create or share folders that this device advertises at the default path.": "自动创建或共享此设备在默认路径上显示的文件夹。",
"Available debug logging facilities:": "可用的调试日志功能:",
"Be careful!": "小心!",
"Block Indexing": "块索引",
"Body:": "正文:",
"Bugs": "问题反馈",
"Cancel": "取消",
@@ -99,6 +100,7 @@
"Device": "设备",
"Device \"{%name%}\" ({%device%} at {%address%}) wants to connect. Add new device?": "设备“{{name}}”({{address}} 处的 {{device}})想要连接。添加新设备?",
"Device Certificate": "设备证书",
"Device Group": "设备组",
"Device ID": "设备 ID",
"Device Identification": "设备标识",
"Device Name": "设备名",
@@ -169,6 +171,7 @@
"Filter by date": "按日期筛选",
"Filter by name": "按名称筛选",
"Folder": "文件夹",
"Folder Group": "文件夹组",
"Folder ID": "文件夹 ID",
"Folder Label": "文件夹标签",
"Folder Path": "文件夹路径",
@@ -249,6 +252,7 @@
"Log tailing paused. Scroll to the bottom to continue.": "日志跟踪已暂停。滚动到底部继续。",
"Login failed, see Syncthing logs for details.": "登录失败,有关详细信息,请参阅 Syncthing 日志。",
"Logs": "日志",
"Maintain an index of all blocks in the folder, enabling reuse of blocks from other files when syncing changes. Disable to reduce database size at the cost of not being able to reuse blocks across files.": "维护文件夹中所有块的索引,以便在同步更改时复用来自其他文件的块。禁用可减小数据库大小,但代价是无法跨文件复用块。",
"Major Upgrade": "重大更新",
"Mass actions": "批量操作",
"Maximum Age": "最长保留时间",
@@ -279,6 +283,8 @@
"Off": "关闭",
"Oldest First": "最旧优先",
"Optional descriptive label for the folder. Can be different on each device.": "文件夹的可选描述性标签。每个设备上可能不同。",
"Optional group for the device. Can be different on each device.": "设备的可选分组。各设备可设置不同分组。",
"Optional group for the folder. Can be different on each device.": "文件夹的可选分组。各设备可设置不同分组。",
"Options": "选项",
"Out of Sync": "未同步",
"Out of Sync Items": "未同步的项目",
@@ -390,6 +396,7 @@
"Staggered": "阶段",
"Staggered File Versioning": "阶段文件版本控制",
"Start Browser": "启动浏览器",
"Starting": "正在启动",
"Statistics": "统计",
"Stay logged in": "保持登录",
"Stopped": "已停止",
+1 -1
View File
@@ -1 +1 @@
var langPrettyprint = {"ar":"Arabic","bg":"Bulgarian","ca":"Catalan","ca@valencia":"Valencian","cs":"Czech","da":"Danish","de":"German","el":"Greek","en":"English","en-GB":"English (United Kingdom)","es":"Spanish","eu":"Basque","fil":"Filipino","fr":"French","fy":"Frisian","ga":"Irish","he-IL":"Hebrew (Israel)","hi":"Hindi","hr":"Croatian","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","ko-KR":"Korean","lt":"Lithuanian","nl":"Dutch","pl":"Polish","pt-BR":"Portuguese (Brazil)","pt-PT":"Portuguese (Portugal)","ro-RO":"Romanian","ru":"Russian","sk":"Slovak","sl":"Slovenian","sv":"Swedish","tr":"Turkish","uk":"Ukrainian","zh-CN":"Chinese (Simplified Han script)","zh-HK":"Chinese (Traditional Han script, Hong Kong)","zh-TW":"Chinese (Traditional Han script)"}
var langPrettyprint = {"ar":"Arabic","bg":"Bulgarian","ca":"Catalan","ca@valencia":"Valencian","cs":"Czech","da":"Danish","de":"German","el":"Greek","en":"English","en-GB":"English (United Kingdom)","eo":"Esperanto","es":"Spanish","eu":"Basque","fil":"Filipino","fr":"French","fy":"Frisian","ga":"Irish","gl":"Galician","he-IL":"Hebrew (Israel)","hi":"Hindi","hr":"Croatian","hu":"Hungarian","id":"Indonesian","it":"Italian","ja":"Japanese","ko-KR":"Korean","lt":"Lithuanian","nl":"Dutch","pl":"Polish","pt-BR":"Portuguese (Brazil)","pt-PT":"Portuguese (Portugal)","ro-RO":"Romanian","ru":"Russian","sk":"Slovak","sl":"Slovenian","sv":"Swedish","tr":"Turkish","uk":"Ukrainian","zh-CN":"Chinese (Simplified Han script)","zh-HK":"Chinese (Traditional Han script, Hong Kong)","zh-TW":"Chinese (Traditional Han script)"}
+1 -1
View File
@@ -1 +1 @@
var validLangs = ["ar","bg","ca","ca@valencia","cs","da","de","el","en","en-GB","es","eu","fil","fr","fy","ga","he-IL","hi","hr","hu","id","it","ja","ko-KR","lt","nl","pl","pt-BR","pt-PT","ro-RO","ru","sk","sl","sv","tr","uk","zh-CN","zh-HK","zh-TW"]
var validLangs = ["ar","bg","ca","ca@valencia","cs","da","de","el","en","en-GB","eo","es","eu","fil","fr","fy","ga","gl","he-IL","hi","hr","hu","id","it","ja","ko-KR","lt","nl","pl","pt-BR","pt-PT","ro-RO","ru","sk","sl","sv","tr","uk","zh-CN","zh-HK","zh-TW"]
+479 -462
View File
@@ -354,7 +354,7 @@
<div class="form-group">
<label>
<input type="checkbox" ng-model="login.stayLoggedIn" >&nbsp;<span translate>Stay logged in</span>
<input type="checkbox" id="stayLoggedIn" name="stayLoggedIn" ng-model="login.stayLoggedIn" >&nbsp;<span translate>Stay logged in</span>
</label>
</div>
@@ -381,264 +381,276 @@
<div class="col-md-6" aria-labelledby="folder_list" role="region" >
<h3 id="folder_list"><span translate>Folders</span><span ng-if="folderList().length > 1"> ({{folderList().length}})</span></h3>
<div class="panel-group" id="folders">
<div class="panel panel-default" ng-repeat="folder in folderList()">
<button class="btn panel-heading" data-toggle="collapse" data-parent="#folders" data-target="#folder-{{$index}}" aria-expanded="false">
<div class="panel-progress" ng-show="folderStatus(folder) == 'syncing'" ng-attr-style="width: {{syncPercentage(folder.id) | percent}}"></div>
<div class="panel-progress" ng-show="folderStatus(folder) == 'scanning' && scanProgress[folder.id] != undefined" ng-attr-style="width: {{scanPercentage(folder.id) | percent}}"></div>
<h4 class="panel-title">
<div class="panel-icon hidden-xs">
<span ng-if="folder.type == 'sendreceive'" class="fas fa-fw fa-folder"></span>
<span ng-if="folder.type == 'sendonly'" class="fas fa-fw fa-upload"></span>
<span ng-if="folder.type == 'receiveonly'" class="fas fa-fw fa-download"></span>
<span ng-if="folder.type == 'receiveencrypted'" class="fas fa-fw fa-lock"></span>
<div ng-repeat="(folderGroupName, groupedFolders) in foldersGrouped">
<h4 ng-if="folderGroupName !== ''">{{ folderGroupName }}
<span ng-if="groupedFolders.length > 1 && folderGroupName.length > 0"> ({{groupedFolders.length}})</span>
</h4>
<div class="panel-group" id="folders-{{ $index }}">
<div class="panel panel-default" ng-repeat="folder in groupedFolders">
<button class="btn panel-heading" data-toggle="collapse" data-parent="#folders-{{$index}}" data-target="#folder-{{$parent.$index}}-{{$index}}" aria-expanded="false">
<div class="panel-progress" ng-show="folderStatus(folder) == 'syncing'" ng-attr-style="width: {{syncPercentage(folder.id) | percent}}"></div>
<div class="panel-progress" ng-show="folderStatus(folder) == 'scanning' && scanProgress[folder.id] != undefined" ng-attr-style="width: {{scanPercentage(folder.id) | percent}}"></div>
<h4 class="panel-title">
<div class="panel-icon hidden-xs">
<span ng-if="folder.type == 'sendreceive'" class="fas fa-fw fa-folder"></span>
<span ng-if="folder.type == 'sendonly'" class="fas fa-fw fa-upload"></span>
<span ng-if="folder.type == 'receiveonly'" class="fas fa-fw fa-download"></span>
<span ng-if="folder.type == 'receiveencrypted'" class="fas fa-fw fa-lock"></span>
</div>
<div class="panel-status pull-right text-{{folderClass(folder)}}" ng-switch="folderStatus(folder)">
<span class="hidden-xs">{{folderStatusText(folder)}}</span>
<span ng-switch-when="scanning" ng-if="scanPercentage(folder.id) != undefined">({{scanPercentage(folder.id) | percent}})</span>
<span ng-switch-when="syncing">({{syncPercentage(folder.id) | percent}}, {{model[folder.id].needBytes | binary}}B)</span>
<span class="inline-icon">
<span class="visible-xs fa fa-fw {{folderStatusIcon(folder)}}" aria-label="{{folderStatusText(folder)}}"></span>
</span>
</div>
<div class="panel-title-text">
<span tooltip data-original-title="{{folder.label.length != 0 ? folder.id : ''}}">{{folder.label.length != 0 ? folder.label : folder.id}}</span>
</div>
</h4>
</button>
<div id="folder-{{$parent.$index}}-{{$index}}" class="panel-collapse collapse">
<div class="panel-body less-padding">
<table class="table table-condensed table-striped table-auto">
<tbody>
<tr class="visible-xs">
<th><span class="fa fa-fw {{folderStatusIcon(folder)}}"></span>&nbsp;<span translate>Folder Status</span></th>
<td class="text-right">{{folderStatusText(folder)}}</td>
</tr>
<tr ng-show="folder.label != undefined && folder.label.length > 0">
<th><span class="fas fa-fw fa-info-circle"></span>&nbsp;<span translate>Folder ID</span></th>
<td class="text-right no-overflow-ellipse">{{folder.id}}</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-folder-open"></span>&nbsp;<span translate>Folder Path</span></th>
<td class="text-right">
<span tooltip data-original-title="{{folder.path}}">{{folder.path}}</span>
</td>
</tr>
<tr ng-if="!folder.paused && (model[folder.id].invalid || model[folder.id].error)">
<th><span class="fas fa-fw fa-exclamation-triangle"></span>&nbsp;<span translate>Error</span></th>
<td class="text-right">
<span tooltip data-original-title="{{model[folder.id].invalid || model[folder.id].error}}">{{model[folder.id].invalid || model[folder.id].error}}</span>
</td>
</tr>
<tr ng-if="!folder.paused">
<th><span class="fas fa-fw fa-globe"></span>&nbsp;<span translate>Global State</span></th>
<td class="text-right">
<span tooltip data-original-title="{{model[folder.id].globalFiles | alwaysNumber | localeNumber}} {{'files' | translate}}, {{model[folder.id].globalDirectories | alwaysNumber | localeNumber}} {{'directories' | translate}}, ~{{model[folder.id].globalBytes | binary}}B">
<span class="far fa-copy"></span>&nbsp;{{model[folder.id].globalFiles | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-folder"></span>&nbsp;{{model[folder.id].globalDirectories | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-hdd"></span>&nbsp;~{{model[folder.id].globalBytes | binary}}B
</span>
</td>
</tr>
<tr ng-if="!folder.paused">
<th><span class="fas fa-fw fa-home"></span>&nbsp;<span translate>Local State</span></th>
<td class="text-right">
<div>
<span tooltip data-original-title="{{model[folder.id].localFiles | alwaysNumber | localeNumber}} {{'files' | translate}}, {{model[folder.id].localDirectories | alwaysNumber | localeNumber}} {{'directories' | translate}}, ~{{model[folder.id].localBytes | binary}}B">
<span class="far fa-copy"></span>&nbsp;{{model[folder.id].localFiles | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-folder"></span>&nbsp;{{model[folder.id].localDirectories | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-hdd"></span>&nbsp;~{{model[folder.id].localBytes | binary}}B
</span>
</div>
<div ng-if="model[folder.id].ignorePatterns">
<a href="" ng-click="editFolderExisting(folder, '#folder-ignores')"><i class="small" translate>Reduced by ignore patterns</i></a>
</div>
<div ng-if="folder.ignoreDelete">
<i class="small">
<span translate>Altered by ignoring deletes.</span>
<a href="{{docsURL('advanced/folder-ignoredelete')}}" target="_blank">
<span class="fas fa-question-circle"></span>&nbsp;<span translate>Help</span>
</a>
</i>
</div>
</td>
</tr>
<tr ng-if="model[folder.id].needTotalItems > 0">
<th><span class="fas fa-fw fa-cloud-download-alt"></span>&nbsp;<span translate>Out of Sync Items</span></th>
<td class="text-right">
<a href="" ng-click="showNeed(folder.id)">{{model[folder.id].needTotalItems | alwaysNumber | localeNumber}} <span translate>items</span>, ~{{model[folder.id].needBytes | binary}}B</a>
</td>
</tr>
<tr ng-if="folderStatus(folder) === 'scanning' && scanRate(folder.id) > 0">
<th><span class="fas fa-fw fa-hourglass-half"></span>&nbsp;<span translate>Scan Time Remaining</span></th>
<td class="text-right">
<span tooltip data-original-title="{{scanRate(folder.id) | binary}}B/s">~ {{scanRemaining(folder.id)}}</span>
</td>
</tr>
<tr ng-if="hasFailedFiles(folder.id)">
<th><span class="fas fa-fw fa-exclamation-circle"></span>&nbsp;<span translate>Failed Items</span></th>
<!-- Show the number of failed items as a link to bring up the list. -->
<td class="text-right">
<a href="" ng-click="showFailed(folder.id)">{{model[folder.id].pullErrors | alwaysNumber | localeNumber}}&nbsp;<span translate>items</span></a>
</td>
</tr>
<tr ng-if="hasReceiveOnlyChanged(folder)">
<th><span class="fas fa-fw fa-exclamation-circle"></span>&nbsp;<span translate>Locally Changed Items</span></th>
<td class="text-right">
<a href="" ng-click="showLocalChanged(folder.id, folder.type)">{{model[folder.id].receiveOnlyTotalItems | alwaysNumber | localeNumber}} <span translate>items</span>, ~{{model[folder.id].receiveOnlyChangedBytes | binary}}B</a>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-folder"></span>&nbsp;<span translate>Folder Type</span></th>
<td class="text-right">
<span ng-if="folder.type == 'sendreceive'" translate>Send &amp; Receive</span>
<span ng-if="folder.type == 'sendonly'" translate>Send Only</span>
<span ng-if="folder.type == 'receiveonly'" translate>Receive Only</span>
<span ng-if="folder.type == 'receiveencrypted'" translate>Receive Encrypted</span>
</td>
</tr>
<tr>
<th><span class="far fa-fw fa-book"></span>&nbsp;<span translate>Block Indexing</span></th>
<td class="text-right">
<span ng-if="folder.blockIndexing" translate>Yes</span>
<span ng-if="!folder.blockIndexing" translate>No</span>
</td>
</tr>
<tr ng-if="folder.ignorePerms">
<th><span class="far fa-fw fa-minus-square"></span>&nbsp;<span translate>Ignore Permissions</span></th>
<td class="text-right">
<span translate>Yes</span>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-refresh"></span>&nbsp;<span translate>Rescans</span></th>
<td class="text-right">
<div ng-if="folder.rescanIntervalS > 0">
<span ng-if="!folder.fsWatcherEnabled" tooltip data-original-title="{{'Periodic scanning at given interval and disabled watching for changes' | translate}}">
<span class="far fa-clock"></span>&nbsp;{{folder.rescanIntervalS | duration}}&ensp;
<span class="fas fa-eye-slash"></span>&nbsp;<span translate>Disabled</span>
</span>
<span ng-if="folder.fsWatcherEnabled && (!model[folder.id].watchError || folder.paused || folderStatus(folder) === 'stopped')" tooltip data-original-title="{{'Periodic scanning at given interval and enabled watching for changes' | translate}}">
<span class="far fa-clock"></span>&nbsp;{{folder.rescanIntervalS | duration}}&ensp;
<span class="fas fa-eye"></span>&nbsp;<span translate>Enabled</span>
</span>
<span ng-if="folder.fsWatcherEnabled && !folder.paused && folderStatus(folder) !== 'stopped' && model[folder.id].watchError" tooltip data-original-title="{{'Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:' | translate}}<br/>{{model[folder.id].watchError}}">
<span class="far fa-clock"></span>&nbsp;{{folder.rescanIntervalS | duration}}&ensp;
<span class="fas fa-eye-slash"></span>&nbsp;<span translate>Failed to set up, retrying</span>
</span>
</div>
<div ng-if="folder.rescanIntervalS <= 0">
<span ng-if="!folder.fsWatcherEnabled" tooltip data-original-title="{{'Disabled periodic scanning and disabled watching for changes' | translate}}">
<span class="far fa-clock"></span>&nbsp;<span translate>Disabled</span>&ensp;
<span class="fas fa-eye-slash"></span>&nbsp;<span translate>Disabled</span>
</span>
<span ng-if="folder.fsWatcherEnabled && (!model[folder.id].watchError || folder.paused || folderStatus(folder) === 'stopped')" tooltip data-original-title="{{'Disabled periodic scanning and enabled watching for changes' | translate}}">
<span class="far fa-clock"></span>&nbsp;<span translate>Disabled</span>&ensp;
<span class="fas fa-eye"></span>&nbsp;<span translate>Enabled</span>
</span>
<span ng-if="folder.fsWatcherEnabled && !folder.paused && folderStatus(folder) !== 'stopped' && model[folder.id].watchError" tooltip data-original-title="{{'Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:' | translate}}<br/>{{model[folder.id].watchError}}">
<span class="far fa-clock"></span>&nbsp;<span translate>Disabled</span>&ensp;
<span class="fas fa-eye-slash"></span>&nbsp;<span translate>Failed to set up, retrying</span>
</span>
</div>
</td>
</tr>
<tr ng-if="folder.type != 'sendonly'">
<th><span class="fas fa-fw fa-sort"></span>&nbsp;<span translate>File Pull Order</span></th>
<td class="text-right" ng-switch="folder.order">
<span ng-switch-when="random" translate>Random</span>
<span ng-switch-when="alphabetic" translate>Alphabetic</span>
<span ng-switch-when="smallestFirst" translate>Smallest First</span>
<span ng-switch-when="largestFirst" translate>Largest First</span>
<span ng-switch-when="oldestFirst" translate>Oldest First</span>
<span ng-switch-when="newestFirst" translate>Newest First</span>
</td>
</tr>
<tr ng-if="folder.versioning.type">
<th><span class="fa fa-fw fa-files-o"></span>&nbsp;<span translate>File Versioning</span></th>
<td class="text-right">
<span ng-switch="folder.versioning.type">
<span ng-switch-when="trashcan" translate>Trash Can</span>
<span ng-switch-when="simple" translate>Simple</span>
<span ng-switch-when="staggered" translate>Staggered</span>
<span ng-switch-when="external" tooltip data-original-title="{{folder.versioning.params.command}}" translate>External</span>
</span>
<span ng-if="folder.versioning.type != 'external'">
<span ng-if="(folder.versioning.type == 'trashcan' || folder.versioning.type == 'simple')" tooltip data-original-title="{{'Clean out after' | translate}}">
&ensp;<span class="fa fa-calendar"></span>&nbsp;<span ng-if="folder.versioning.params.cleanoutDays == 0" translate>Disabled</span><span ng-if="folder.versioning.params.cleanoutDays > 0">{{folder.versioning.params.cleanoutDays * 86400 | duration:"d"}}</span>
</span>
<span ng-if="folder.versioning.type == 'simple'" tooltip data-original-title="{{'Keep Versions' | translate}}">
&ensp;<span class="fa fa-file-archive-o"></span>&nbsp;{{folder.versioning.params.keep}}
</span>
<span ng-if="folder.versioning.type == 'staggered'" tooltip data-original-title="{{'Maximum Age' | translate}}">
&ensp;<span class="fa fa-calendar"></span>&nbsp;<span ng-if="folder.versioning.params.maxAge == 0" translate>Forever</span><span ng-if="folder.versioning.params.maxAge > 0">{{folder.versioning.params.maxAge | duration}}</span>
</span>
<span tooltip data-original-title="{{'Cleanup Interval' | translate}}">
&ensp;<span class="fa fa-recycle"></span>&nbsp;<span ng-if="folder.versioning.cleanupIntervalS == 0" translate>Disabled</span><span ng-if="folder.versioning.cleanupIntervalS > 0">{{folder.versioning.cleanupIntervalS | duration}}</span>
</span>
<!-- Keep the path last, so that it truncates without pushing other information out of the screen. -->
<span tooltip data-original-title="{{folder.versioning.fsPath === '' ? '.stversions' : folder.versioning.fsPath}}">
&ensp;<span class="fa fa-folder-open-o"></span>&nbsp;{{folder.versioning.fsPath === '' ? '.stversions' : folder.versioning.fsPath}}
</span>
</span>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-share-alt"></span>&nbsp;<span translate>Shared With</span></th>
<td class="text-right no-overflow-ellipse overflow-break-word">
<span ng-repeat="device in otherDevices(folder.devices)">
<span ng-if="folder.type !== 'receiveencrypted' && device.encryptionPassword" class="text-nowrap">
<span class="fa fa-lock"></span>&nbsp;<!-- Avoid stray space...
--></span><!-- Avoid stray space...
--><span ng-switch="completion[device.deviceID][folder.id].remoteState"><!-- Avoid stray space...
--><a ng-switch-when="notSharing" href="" ng-click="editDeviceExisting(devices[device.deviceID])" data-original-title="{{'The remote device has not accepted sharing this folder.' | translate}}" tooltip>{{deviceName(devices[device.deviceID])}}<sup>1</sup></a><!-- Avoid stray space...
--><a ng-switch-when="paused" href="" ng-click="editDeviceExisting(devices[device.deviceID])" data-original-title="{{'The remote device has paused this folder.' | translate}}" tooltip>{{deviceName(devices[device.deviceID])}}<sup>2</sup></a><!-- Avoid stray space...
--><a ng-switch-default href="" ng-click="editDeviceExisting(devices[device.deviceID])">{{deviceName(devices[device.deviceID])}}</a><!-- Avoid stray space...
--><span ng-if="!$last">,</span>
</span>
</span>
</td>
</tr>
<tr ng-if="folderStats[folder.id].lastScan">
<th><span class="far fa-fw fa-clock"></span>&nbsp;<span translate>Last Scan</span></th>
<td translate ng-if="folderStats[folder.id].lastScanDays >= 365" class="text-right">Never</td>
<td ng-if="folderStats[folder.id].lastScanDays < 365" class="text-right">
<span>{{folderStats[folder.id].lastScan | date:'yyyy-MM-dd HH:mm:ss'}}</span>
</td>
</tr>
<tr ng-if="folder.type != 'sendonly' && folder.type != 'receiveencrypted' && folderStats[folder.id].lastFile && folderStats[folder.id].lastFile.filename">
<th><span class="fas fa-fw fa-exchange-alt"></span>&nbsp;<span translate>Latest Change</span></th>
<td class="text-right">
<span tooltip data-original-title="{{folderStats[folder.id].lastFile.filename}} @ {{folderStats[folder.id].lastFile.at | date:'yyyy-MM-dd HH:mm:ss'}}">
<span translate translate-value-file="{{folderStats[folder.id].lastFile.filename | basename}}" ng-if="!folderStats[folder.id].lastFile.deleted">Updated {%file%}</span>
<span translate translate-value-file="{{folderStats[folder.id].lastFile.filename | basename}}" ng-if="folderStats[folder.id].lastFile.deleted">Deleted {%file%}</span>
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel-status pull-right text-{{folderClass(folder)}}" ng-switch="folderStatus(folder)">
<span class="hidden-xs">{{folderStatusText(folder)}}</span>
<span ng-switch-when="scanning" ng-if="scanPercentage(folder.id) != undefined">({{scanPercentage(folder.id) | percent}})</span>
<span ng-switch-when="syncing">({{syncPercentage(folder.id) | percent}}, {{model[folder.id].needBytes | binary}}B)</span>
<span class="inline-icon">
<span class="visible-xs fa fa-fw {{folderStatusIcon(folder)}}" aria-label="{{folderStatusText(folder)}}"></span>
<div class="panel-footer">
<button type="button" class="btn btn-sm btn-danger pull-left" ng-click="revertOverrideConfirmationModal('override', folder.id)" ng-if="folderStatus(folder) == 'outofsync' && folder.type == 'sendonly'">
<span class="fas fa-arrow-circle-up"></span>&nbsp;<span translate>Override Changes</span>
</button>
<button type="button" class="btn btn-sm btn-danger pull-left" ng-click="revertOverrideConfirmationModal('revert', folder.id)" ng-if="hasReceiveOnlyChanged(folder) && ['outofsync', 'faileditems', 'localadditions'].indexOf(folderStatus(folder)) >= 0">
<span class="fa fa-arrow-circle-down"></span>&nbsp;<span translate>Revert Local Changes</span>
</button>
<button type="button" class="btn btn-sm btn-danger pull-left" ng-click="revertOverrideConfirmationModal('deleteEnc', folder.id)" ng-if="hasReceiveEncryptedItems(folder) && ['outofsync', 'faileditems', 'localunencrypted'].indexOf(folderStatus(folder)) >= 0">
<span class="fa fa-minus-circle"></span>&nbsp;<span translate>Delete Unexpected Items</span>
</button>
<span class="pull-right">
<button ng-if="!folder.paused" type="button" class="btn btn-sm btn-default" ng-click="setFolderPause(folder.id, true)">
<span class="fas fa-pause"></span>&nbsp;<span translate>Pause</span>
</button>
<button ng-if="folder.paused" type="button" class="btn btn-sm btn-default" ng-click="setFolderPause(folder.id, false)">
<span class="fas fa-play"></span>&nbsp;<span translate>Resume</span>
</button>
<button type="button" class="btn btn-default btn-sm" ng-click="restoreVersions.show(folder.id)" ng-if="folder.versioning.type && folder.versioning.type != 'external'" ng-disabled="folder.paused">
<span class="fas fa-undo"></span>&nbsp;<span translate>Versions</span>
</button>
<button type="button" class="btn btn-sm btn-default" ng-click="rescanFolder(folder.id)" ng-disabled="['idle', 'stopped', 'unshared', 'outofsync', 'faileditems', 'localadditions'].indexOf(folderStatus(folder)) < 0">
<span class="fas fa-refresh"></span>&nbsp;<span translate>Rescan</span>
</button>
<button type="button" class="btn btn-sm btn-default" ng-click="editFolderExisting(folder)">
<span class="fas fa-pencil-alt"></span>&nbsp;<span translate>Edit</span>
</button>
</span>
<div class="clearfix"></div>
</div>
<div class="panel-title-text">
<span tooltip data-original-title="{{folder.label.length != 0 ? folder.id : ''}}">{{folder.label.length != 0 ? folder.label : folder.id}}</span>
</div>
</h4>
</button>
<div id="folder-{{$index}}" class="panel-collapse collapse">
<div class="panel-body less-padding">
<table class="table table-condensed table-striped table-auto">
<tbody>
<tr class="visible-xs">
<th><span class="fa fa-fw {{folderStatusIcon(folder)}}"></span>&nbsp;<span translate>Folder Status</span></th>
<td class="text-right">{{folderStatusText(folder)}}</td>
</tr>
<tr ng-show="folder.label != undefined && folder.label.length > 0">
<th><span class="fas fa-fw fa-info-circle"></span>&nbsp;<span translate>Folder ID</span></th>
<td class="text-right no-overflow-ellipse">{{folder.id}}</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-folder-open"></span>&nbsp;<span translate>Folder Path</span></th>
<td class="text-right">
<span tooltip data-original-title="{{folder.path}}">{{folder.path}}</span>
</td>
</tr>
<tr ng-if="!folder.paused && (model[folder.id].invalid || model[folder.id].error)">
<th><span class="fas fa-fw fa-exclamation-triangle"></span>&nbsp;<span translate>Error</span></th>
<td class="text-right">
<span tooltip data-original-title="{{model[folder.id].invalid || model[folder.id].error}}">{{model[folder.id].invalid || model[folder.id].error}}</span>
</td>
</tr>
<tr ng-if="!folder.paused">
<th><span class="fas fa-fw fa-globe"></span>&nbsp;<span translate>Global State</span></th>
<td class="text-right">
<span tooltip data-original-title="{{model[folder.id].globalFiles | alwaysNumber | localeNumber}} {{'files' | translate}}, {{model[folder.id].globalDirectories | alwaysNumber | localeNumber}} {{'directories' | translate}}, ~{{model[folder.id].globalBytes | binary}}B">
<span class="far fa-copy"></span>&nbsp;{{model[folder.id].globalFiles | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-folder"></span>&nbsp;{{model[folder.id].globalDirectories | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-hdd"></span>&nbsp;~{{model[folder.id].globalBytes | binary}}B
</span>
</td>
</tr>
<tr ng-if="!folder.paused">
<th><span class="fas fa-fw fa-home"></span>&nbsp;<span translate>Local State</span></th>
<td class="text-right">
<div>
<span tooltip data-original-title="{{model[folder.id].localFiles | alwaysNumber | localeNumber}} {{'files' | translate}}, {{model[folder.id].localDirectories | alwaysNumber | localeNumber}} {{'directories' | translate}}, ~{{model[folder.id].localBytes | binary}}B">
<span class="far fa-copy"></span>&nbsp;{{model[folder.id].localFiles | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-folder"></span>&nbsp;{{model[folder.id].localDirectories | alwaysNumber | localeNumber}}&ensp;
<span class="far fa-hdd"></span>&nbsp;~{{model[folder.id].localBytes | binary}}B
</span>
</div>
<div ng-if="model[folder.id].ignorePatterns">
<a href="" ng-click="editFolderExisting(folder, '#folder-ignores')"><i class="small" translate>Reduced by ignore patterns</i></a>
</div>
<div ng-if="folder.ignoreDelete">
<i class="small">
<span translate>Altered by ignoring deletes.</span>
<a href="{{docsURL('advanced/folder-ignoredelete')}}" target="_blank">
<span class="fas fa-question-circle"></span>&nbsp;<span translate>Help</span>
</a>
</i>
</div>
</td>
</tr>
<tr ng-if="model[folder.id].needTotalItems > 0">
<th><span class="fas fa-fw fa-cloud-download-alt"></span>&nbsp;<span translate>Out of Sync Items</span></th>
<td class="text-right">
<a href="" ng-click="showNeed(folder.id)">{{model[folder.id].needTotalItems | alwaysNumber | localeNumber}} <span translate>items</span>, ~{{model[folder.id].needBytes | binary}}B</a>
</td>
</tr>
<tr ng-if="folderStatus(folder) === 'scanning' && scanRate(folder.id) > 0">
<th><span class="fas fa-fw fa-hourglass-half"></span>&nbsp;<span translate>Scan Time Remaining</span></th>
<td class="text-right">
<span tooltip data-original-title="{{scanRate(folder.id) | binary}}B/s">~ {{scanRemaining(folder.id)}}</span>
</td>
</tr>
<tr ng-if="hasFailedFiles(folder.id)">
<th><span class="fas fa-fw fa-exclamation-circle"></span>&nbsp;<span translate>Failed Items</span></th>
<!-- Show the number of failed items as a link to bring up the list. -->
<td class="text-right">
<a href="" ng-click="showFailed(folder.id)">{{model[folder.id].pullErrors | alwaysNumber | localeNumber}}&nbsp;<span translate>items</span></a>
</td>
</tr>
<tr ng-if="hasReceiveOnlyChanged(folder)">
<th><span class="fas fa-fw fa-exclamation-circle"></span>&nbsp;<span translate>Locally Changed Items</span></th>
<td class="text-right">
<a href="" ng-click="showLocalChanged(folder.id, folder.type)">{{model[folder.id].receiveOnlyTotalItems | alwaysNumber | localeNumber}} <span translate>items</span>, ~{{model[folder.id].receiveOnlyChangedBytes | binary}}B</a>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-folder"></span>&nbsp;<span translate>Folder Type</span></th>
<td class="text-right">
<span ng-if="folder.type == 'sendreceive'" translate>Send &amp; Receive</span>
<span ng-if="folder.type == 'sendonly'" translate>Send Only</span>
<span ng-if="folder.type == 'receiveonly'" translate>Receive Only</span>
<span ng-if="folder.type == 'receiveencrypted'" translate>Receive Encrypted</span>
</td>
</tr>
<tr ng-if="folder.ignorePerms">
<th><span class="far fa-fw fa-minus-square"></span>&nbsp;<span translate>Ignore Permissions</span></th>
<td class="text-right">
<span translate>Yes</span>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-refresh"></span>&nbsp;<span translate>Rescans</span></th>
<td class="text-right">
<div ng-if="folder.rescanIntervalS > 0">
<span ng-if="!folder.fsWatcherEnabled" tooltip data-original-title="{{'Periodic scanning at given interval and disabled watching for changes' | translate}}">
<span class="far fa-clock"></span>&nbsp;{{folder.rescanIntervalS | duration}}&ensp;
<span class="fas fa-eye-slash"></span>&nbsp;<span translate>Disabled</span>
</span>
<span ng-if="folder.fsWatcherEnabled && (!model[folder.id].watchError || folder.paused || folderStatus(folder) === 'stopped')" tooltip data-original-title="{{'Periodic scanning at given interval and enabled watching for changes' | translate}}">
<span class="far fa-clock"></span>&nbsp;{{folder.rescanIntervalS | duration}}&ensp;
<span class="fas fa-eye"></span>&nbsp;<span translate>Enabled</span>
</span>
<span ng-if="folder.fsWatcherEnabled && !folder.paused && folderStatus(folder) !== 'stopped' && model[folder.id].watchError" tooltip data-original-title="{{'Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:' | translate}}<br/>{{model[folder.id].watchError}}">
<span class="far fa-clock"></span>&nbsp;{{folder.rescanIntervalS | duration}}&ensp;
<span class="fas fa-eye-slash"></span>&nbsp;<span translate>Failed to set up, retrying</span>
</span>
</div>
<div ng-if="folder.rescanIntervalS <= 0">
<span ng-if="!folder.fsWatcherEnabled" tooltip data-original-title="{{'Disabled periodic scanning and disabled watching for changes' | translate}}">
<span class="far fa-clock"></span>&nbsp;<span translate>Disabled</span>&ensp;
<span class="fas fa-eye-slash"></span>&nbsp;<span translate>Disabled</span>
</span>
<span ng-if="folder.fsWatcherEnabled && (!model[folder.id].watchError || folder.paused || folderStatus(folder) === 'stopped')" tooltip data-original-title="{{'Disabled periodic scanning and enabled watching for changes' | translate}}">
<span class="far fa-clock"></span>&nbsp;<span translate>Disabled</span>&ensp;
<span class="fas fa-eye"></span>&nbsp;<span translate>Enabled</span>
</span>
<span ng-if="folder.fsWatcherEnabled && !folder.paused && folderStatus(folder) !== 'stopped' && model[folder.id].watchError" tooltip data-original-title="{{'Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:' | translate}}<br/>{{model[folder.id].watchError}}">
<span class="far fa-clock"></span>&nbsp;<span translate>Disabled</span>&ensp;
<span class="fas fa-eye-slash"></span>&nbsp;<span translate>Failed to set up, retrying</span>
</span>
</div>
</td>
</tr>
<tr ng-if="folder.type != 'sendonly'">
<th><span class="fas fa-fw fa-sort"></span>&nbsp;<span translate>File Pull Order</span></th>
<td class="text-right" ng-switch="folder.order">
<span ng-switch-when="random" translate>Random</span>
<span ng-switch-when="alphabetic" translate>Alphabetic</span>
<span ng-switch-when="smallestFirst" translate>Smallest First</span>
<span ng-switch-when="largestFirst" translate>Largest First</span>
<span ng-switch-when="oldestFirst" translate>Oldest First</span>
<span ng-switch-when="newestFirst" translate>Newest First</span>
</td>
</tr>
<tr ng-if="folder.versioning.type">
<th><span class="fa fa-fw fa-files-o"></span>&nbsp;<span translate>File Versioning</span></th>
<td class="text-right">
<span ng-switch="folder.versioning.type">
<span ng-switch-when="trashcan" translate>Trash Can</span>
<span ng-switch-when="simple" translate>Simple</span>
<span ng-switch-when="staggered" translate>Staggered</span>
<span ng-switch-when="external" tooltip data-original-title="{{folder.versioning.params.command}}" translate>External</span>
</span>
<span ng-if="folder.versioning.type != 'external'">
<span ng-if="(folder.versioning.type == 'trashcan' || folder.versioning.type == 'simple')" tooltip data-original-title="{{'Clean out after' | translate}}">
&ensp;<span class="fa fa-calendar"></span>&nbsp;<span ng-if="folder.versioning.params.cleanoutDays == 0" translate>Disabled</span><span ng-if="folder.versioning.params.cleanoutDays > 0">{{folder.versioning.params.cleanoutDays * 86400 | duration:"d"}}</span>
</span>
<span ng-if="folder.versioning.type == 'simple'" tooltip data-original-title="{{'Keep Versions' | translate}}">
&ensp;<span class="fa fa-file-archive-o"></span>&nbsp;{{folder.versioning.params.keep}}
</span>
<span ng-if="folder.versioning.type == 'staggered'" tooltip data-original-title="{{'Maximum Age' | translate}}">
&ensp;<span class="fa fa-calendar"></span>&nbsp;<span ng-if="folder.versioning.params.maxAge == 0" translate>Forever</span><span ng-if="folder.versioning.params.maxAge > 0">{{folder.versioning.params.maxAge | duration}}</span>
</span>
<span tooltip data-original-title="{{'Cleanup Interval' | translate}}">
&ensp;<span class="fa fa-recycle"></span>&nbsp;<span ng-if="folder.versioning.cleanupIntervalS == 0" translate>Disabled</span><span ng-if="folder.versioning.cleanupIntervalS > 0">{{folder.versioning.cleanupIntervalS | duration}}</span>
</span>
<!-- Keep the path last, so that it truncates without pushing other information out of the screen. -->
<span tooltip data-original-title="{{folder.versioning.fsPath === '' ? '.stversions' : folder.versioning.fsPath}}">
&ensp;<span class="fa fa-folder-open-o"></span>&nbsp;{{folder.versioning.fsPath === '' ? '.stversions' : folder.versioning.fsPath}}
</span>
</span>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-share-alt"></span>&nbsp;<span translate>Shared With</span></th>
<td class="text-right no-overflow-ellipse overflow-break-word">
<span ng-repeat="device in otherDevices(folder.devices)">
<span ng-if="folder.type !== 'receiveencrypted' && device.encryptionPassword" class="text-nowrap">
<span class="fa fa-lock"></span>&nbsp;<!-- Avoid stray space...
--></span><!-- Avoid stray space...
--><span ng-switch="completion[device.deviceID][folder.id].remoteState"><!-- Avoid stray space...
--><a ng-switch-when="notSharing" href="" ng-click="editDeviceExisting(devices[device.deviceID])" data-original-title="{{'The remote device has not accepted sharing this folder.' | translate}}" tooltip>{{deviceName(devices[device.deviceID])}}<sup>1</sup></a><!-- Avoid stray space...
--><a ng-switch-when="paused" href="" ng-click="editDeviceExisting(devices[device.deviceID])" data-original-title="{{'The remote device has paused this folder.' | translate}}" tooltip>{{deviceName(devices[device.deviceID])}}<sup>2</sup></a><!-- Avoid stray space...
--><a ng-switch-default href="" ng-click="editDeviceExisting(devices[device.deviceID])">{{deviceName(devices[device.deviceID])}}</a><!-- Avoid stray space...
--><span ng-if="!$last">,</span>
</span>
</span>
</td>
</tr>
<tr ng-if="folderStats[folder.id].lastScan">
<th><span class="far fa-fw fa-clock"></span>&nbsp;<span translate>Last Scan</span></th>
<td translate ng-if="folderStats[folder.id].lastScanDays >= 365" class="text-right">Never</td>
<td ng-if="folderStats[folder.id].lastScanDays < 365" class="text-right">
<span>{{folderStats[folder.id].lastScan | date:'yyyy-MM-dd HH:mm:ss'}}</span>
</td>
</tr>
<tr ng-if="folder.type != 'sendonly' && folder.type != 'receiveencrypted' && folderStats[folder.id].lastFile && folderStats[folder.id].lastFile.filename">
<th><span class="fas fa-fw fa-exchange-alt"></span>&nbsp;<span translate>Latest Change</span></th>
<td class="text-right">
<span tooltip data-original-title="{{folderStats[folder.id].lastFile.filename}} @ {{folderStats[folder.id].lastFile.at | date:'yyyy-MM-dd HH:mm:ss'}}">
<span translate translate-value-file="{{folderStats[folder.id].lastFile.filename | basename}}" ng-if="!folderStats[folder.id].lastFile.deleted">Updated {%file%}</span>
<span translate translate-value-file="{{folderStats[folder.id].lastFile.filename | basename}}" ng-if="folderStats[folder.id].lastFile.deleted">Deleted {%file%}</span>
</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel-footer">
<button type="button" class="btn btn-sm btn-danger pull-left" ng-click="revertOverrideConfirmationModal('override', folder.id)" ng-if="folderStatus(folder) == 'outofsync' && folder.type == 'sendonly'">
<span class="fas fa-arrow-circle-up"></span>&nbsp;<span translate>Override Changes</span>
</button>
<button type="button" class="btn btn-sm btn-danger pull-left" ng-click="revertOverrideConfirmationModal('revert', folder.id)" ng-if="hasReceiveOnlyChanged(folder) && ['outofsync', 'faileditems', 'localadditions'].indexOf(folderStatus(folder)) >= 0">
<span class="fa fa-arrow-circle-down"></span>&nbsp;<span translate>Revert Local Changes</span>
</button>
<button type="button" class="btn btn-sm btn-danger pull-left" ng-click="revertOverrideConfirmationModal('deleteEnc', folder.id)" ng-if="hasReceiveEncryptedItems(folder) && ['outofsync', 'faileditems', 'localunencrypted'].indexOf(folderStatus(folder)) >= 0">
<span class="fa fa-minus-circle"></span>&nbsp;<span translate>Delete Unexpected Items</span>
</button>
<span class="pull-right">
<button ng-if="!folder.paused" type="button" class="btn btn-sm btn-default" ng-click="setFolderPause(folder.id, true)">
<span class="fas fa-pause"></span>&nbsp;<span translate>Pause</span>
</button>
<button ng-if="folder.paused" type="button" class="btn btn-sm btn-default" ng-click="setFolderPause(folder.id, false)">
<span class="fas fa-play"></span>&nbsp;<span translate>Resume</span>
</button>
<button type="button" class="btn btn-default btn-sm" ng-click="restoreVersions.show(folder.id)" ng-if="folder.versioning.type && folder.versioning.type != 'external'" ng-disabled="folder.paused">
<span class="fas fa-undo"></span>&nbsp;<span translate>Versions</span>
</button>
<button type="button" class="btn btn-sm btn-default" ng-click="rescanFolder(folder.id)" ng-disabled="['idle', 'stopped', 'unshared', 'outofsync', 'faileditems', 'localadditions'].indexOf(folderStatus(folder)) < 0">
<span class="fas fa-refresh"></span>&nbsp;<span translate>Rescan</span>
</button>
<button type="button" class="btn btn-sm btn-default" ng-click="editFolderExisting(folder)">
<span class="fas fa-pencil-alt"></span>&nbsp;<span translate>Edit</span>
</button>
</span>
<div class="clearfix"></div>
</div>
</div>
</div>
@@ -770,215 +782,220 @@
<!-- Remote devices -->
<h3><span translate>Remote Devices</span> <span ng-if="otherDevices().length > 1"> ({{otherDevices().length}})</span></h3>
<div class="panel-group" id="devices">
<div class="panel panel-default" ng-repeat="deviceCfg in otherDevices()">
<button class="btn panel-heading" data-toggle="collapse" data-parent="#devices" data-target="#device-{{$index}}" aria-expanded="false">
<div class="panel-progress" ng-show="deviceStatus(deviceCfg) == 'syncing'" ng-attr-style="width: {{completion[deviceCfg.deviceID]._total | percent}}"></div>
<h4 class="panel-title">
<identicon class="panel-icon" data-value="deviceCfg.deviceID"></identicon>
<div class="panel-status pull-right text-{{deviceClass(deviceCfg)}}" ng-switch="deviceStatus(deviceCfg)">
<span class="hidden-xs">{{deviceStatusText(deviceCfg)}}</span>
<span ng-switch-when="syncing">({{completion[deviceCfg.deviceID]._total | percent}}, {{completion[deviceCfg.deviceID]._needBytes | binary}}B)</span>
<span class="inline-icon">
<span class="visible-xs fa fa-fw {{deviceStatusIcon(deviceCfg)}}" aria-label="{{deviceStatusText(deviceCfg)}}"></span>
</span>
<span class="inline-icon">
<span ng-class="rdConnTypeIcon(rdConnType(deviceCfg.deviceID))" class="reception reception-theme"></span>
</span>
<div ng-repeat="(deviceGroupName, groupedDevices) in devicesGrouped">
<h4>{{ deviceGroupName }}
<span ng-if="groupedDevices.length > 1 && deviceGroupName.length > 0"> ({{groupedDevices.length}})</span>
</h4>
<div class="panel-group" id="devices-{{ $index }}">
<div class="panel panel-default" ng-repeat="deviceCfg in groupedDevices">
<button class="btn panel-heading" data-toggle="collapse" data-parent="#devices-{{ $parent.$index }}" data-target="#device-{{$parent.$index}}-{{$index}}" aria-expanded="false">
<div class="panel-progress" ng-show="deviceStatus(deviceCfg) == 'syncing'" ng-attr-style="width: {{completion[deviceCfg.deviceID]._total | percent}}"></div>
<h4 class="panel-title">
<identicon class="panel-icon" data-value="deviceCfg.deviceID"></identicon>
<div class="panel-status pull-right text-{{deviceClass(deviceCfg)}}" ng-switch="deviceStatus(deviceCfg)">
<span class="hidden-xs">{{deviceStatusText(deviceCfg)}}</span>
<span ng-switch-when="syncing">({{completion[deviceCfg.deviceID]._total | percent}}, {{completion[deviceCfg.deviceID]._needBytes | binary}}B)</span>
<span class="inline-icon">
<span class="visible-xs fa fa-fw {{deviceStatusIcon(deviceCfg)}}" aria-label="{{deviceStatusText(deviceCfg)}}"></span>
</span>
<span class="inline-icon">
<span ng-class="rdConnTypeIcon(rdConnType(deviceCfg.deviceID))" class="reception reception-theme"></span>
</span>
</div>
<div class="panel-title-text">{{deviceName(deviceCfg)}}</div>
</h4>
</button>
<div id="device-{{$parent.$index}}-{{$index}}" class="panel-collapse collapse">
<div class="panel-body less-padding">
<table class="table table-condensed table-striped table-auto">
<tbody>
<tr class="visible-xs">
<th><span class="fa fa-fw {{deviceStatusIcon(deviceCfg)}}"></span>&nbsp;<span translate>Device Status</span></th>
<td class="text-right">{{deviceStatusText(deviceCfg)}}</td>
</tr>
<tr ng-if="!connections[deviceCfg.deviceID].connected">
<th><span class="fas fa-fw fa-eye"></span>&nbsp;<span translate>Last seen</span></th>
<td class="text-right">
<div ng-if="!deviceStats[deviceCfg.deviceID].lastSeenDays" translate>
Never
</div>
<div ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays">
<div>
{{deviceStats[deviceCfg.deviceID].lastSeen | date:"yyyy-MM-dd HH:mm:ss"}}
</div>
<div ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 7">
<i ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays < 30" translate>More than a week ago</i>
<i class="text-warning" ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 30 && deviceStats[deviceCfg.deviceID].lastSeenDays < 365" translate>More than a month ago</i>
<i class="text-danger" ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 365" translate>More than a year ago</i>
</div>
</div>
</td>
</tr>
<tr ng-if="!connections[deviceCfg.deviceID].connected && deviceFolders(deviceCfg).length > 0">
<th><span class="fas fa-fw fa-cloud"></span>&nbsp;<span translate>Sync Status</span></th>
<td translate ng-if="completion[deviceCfg.deviceID]._total == 100" class="text-right">Up to Date</td>
<td ng-if="completion[deviceCfg.deviceID]._total < 100" class="text-right">
<span class="hidden-xs" translate>Out of Sync</span> ({{completion[deviceCfg.deviceID]._total | percent}})
</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="fas fa-fw fa-cloud-download-alt"></span>&nbsp;<span translate>Download Rate</span></th>
<td class="text-right">
<a href="#" class="toggler" ng-click="toggleUnits()">
<span ng-if="!metricRates">{{connections[deviceCfg.deviceID].inbps | binary}}B/s</span>
<span ng-if="metricRates">{{connections[deviceCfg.deviceID].inbps*8 | metric}}bps</span>
({{connections[deviceCfg.deviceID].inBytesTotal | binary}}B)
<small ng-if="deviceCfg.maxRecvKbps > 0"><br/>
<i class="text-muted"><span translate>Limit</span>:
<span ng-if="!metricRates">{{deviceCfg.maxRecvKbps*1024 | binary}}B/s</span>
<span ng-if="metricRates">{{deviceCfg.maxRecvKbps*1024*8 | metric}}bps</span>
</i>
</small>
</a>
</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="fas fa-fw fa-cloud-upload-alt"></span>&nbsp;<span translate>Upload Rate</span></th>
<td class="text-right">
<a href="#" class="toggler" ng-click="toggleUnits()">
<span ng-if="!metricRates">{{connections[deviceCfg.deviceID].outbps | binary}}B/s</span>
<span ng-if="metricRates">{{connections[deviceCfg.deviceID].outbps*8 | metric}}bps</span>
({{connections[deviceCfg.deviceID].outBytesTotal | binary}}B)
<small ng-if="deviceCfg.maxSendKbps > 0"><br/>
<i class="text-muted"><span translate>Limit</span>:
<span ng-if="!metricRates">{{deviceCfg.maxSendKbps*1024 | binary}}B/s</span>
<span ng-if="metricRates">{{deviceCfg.maxSendKbps*1024*8 | metric}}bps</span>
</i>
</small>
</a>
</td>
</tr>
<tr ng-if="completion[deviceCfg.deviceID]._needItems">
<th><span class="fas fa-fw fa-exchange-alt"></span>&nbsp;<span translate>Out of Sync Items</span></th>
<td class="text-right">
<a href="" ng-click="showRemoteNeed(deviceCfg)">{{completion[deviceCfg.deviceID]._needItems | alwaysNumber | localeNumber}} <span translate>items</span>, ~{{completion[deviceCfg.deviceID]._needBytes | binary}}B</a>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-link"></span>&nbsp;<span translate>Address</span></th>
<td ng-if="connections[deviceCfg.deviceID].connected" class="text-right">
<span tooltip data-original-title="{{ connections[deviceCfg.deviceID].type.indexOf('Relay') > -1 ? '' : connections[deviceCfg.deviceID].type }} {{ connections[deviceCfg.deviceID].crypto }}">
{{deviceAddr(deviceCfg)}}
</span>
</td>
<td ng-if="!connections[deviceCfg.deviceID].connected" class="text-right">
<span ng-repeat="addr in deviceCfg.addresses">
<span tooltip data-original-title="{{'Configured' | translate}}">{{addr}}</span><br>
<small ng-if="system.lastDialStatus[addr].error && !deviceCfg.paused" tooltip data-original-title="{{system.lastDialStatus[addr].error}}" class="text-danger">{{abbreviatedError(addr)}}<br></small>
</span>
<span ng-repeat="addr in discoveryCache[deviceCfg.deviceID].addresses">
<span tooltip data-original-title="{{'Discovered' | translate}}">{{addr}}</span><br>
<small ng-if="system.lastDialStatus[addr].error && !deviceCfg.paused" tooltip data-original-title="{{system.lastDialStatus[addr].error}}" class="text-danger">{{abbreviatedError(addr)}}<br></small>
</span>
</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="reception reception-4 reception-theme"></span>&nbsp;<span translate>Connection Type</span></th>
<td class="text-right">
<span tooltip data-original-title="{{rdConnDetails(rdConnType(deviceCfg.deviceID))}}">
{{rdConnTypeString(rdConnType(deviceCfg.deviceID))}}
</span>
</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="fas fa-fw fa-random"></span>&nbsp;<span translate>Number of Connections</span></th>
<td class="text-right">
<span ng-if="connections[deviceCfg.deviceID].secondary.length">1 + {{connections[deviceCfg.deviceID].secondary.length | alwaysNumber}}</span>
<span ng-if="!connections[deviceCfg.deviceID].secondary.length">1</span>
</td>
</tr>
<tr ng-if="deviceCfg.allowedNetworks.length > 0">
<th><span class="fas fa-fw fa-filter"></span>&nbsp;<span translate>Allowed Networks</span></th>
<td class="text-right">
<span>{{deviceCfg.allowedNetworks.join(", ")}}</span>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-compress"></span>&nbsp;<span translate>Compression</span></th>
<td class="text-right">
<span ng-if="deviceCfg.compression == 'always'" translate>All Data</span>
<span ng-if="deviceCfg.compression == 'metadata'" translate>Metadata Only</span>
<span ng-if="deviceCfg.compression == 'never'" translate>Off</span>
</td>
</tr>
<tr ng-if="deviceCfg.introducer">
<th><span class="far fa-fw fa-thumbs-up"></span>&nbsp;<span translate>Introducer</span></th>
<td translate class="text-right">Yes</td>
</tr>
<tr ng-if="deviceCfg.introducedBy">
<th><span class="far fa-fw fa-handshake-o"></span>&nbsp;<span translate>Introduced By</span></th>
<td class="text-right">{{ deviceName(devices[deviceCfg.introducedBy]) || deviceShortID(deviceCfg.introducedBy) }}</td>
</tr>
<tr ng-if="deviceCfg.autoAcceptFolders">
<th><span class="fa fa-fw fa-level-down"></span>&nbsp;<span translate>Auto Accept</span></th>
<td translate class="text-right">Yes</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-qrcode"></span>&nbsp;<span translate>Identification</span></th>
<td class="text-right">
<span tooltip data-original-title="{{'Click to see full identification string and QR code.' | translate}}">
<a href="" ng-click="showDeviceIdentification(deviceCfg)">{{deviceShortID(deviceCfg.deviceID)}}</a>
</span>
</td>
</tr>
<tr ng-if="deviceCfg.untrusted">
<th><span class="fa fa-fw fa-user-secret"></span>&nbsp;<span translate>Untrusted</span></th>
<td translate class="text-right">Yes</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].clientVersion">
<th><span class="fas fa-fw fa-tag"></span>&nbsp;<span translate>Version</span></th>
<td class="text-right">{{connections[deviceCfg.deviceID].clientVersion}}</td>
</tr>
<tr ng-if="deviceFolders(deviceCfg).length > 0">
<th><span class="fas fa-fw fa-folder"></span>&nbsp;<span translate>Folders</span></th>
<td class="text-right no-overflow-ellipse overflow-break-word">
<span ng-repeat="folderID in deviceFolders(deviceCfg)">
<span ng-if="folderIsSharedEncrypted(folderID, deviceCfg.deviceID)" class="text-nowrap">
<span class="fa fa-lock"></span>&nbsp;<!-- Avoid stray space...
--></span><!-- Avoid stray space...
--><span ng-switch="completion[deviceCfg.deviceID][folderID].remoteState"><!-- Avoid stray space...
--><span ng-switch-when="notSharing" data-original-title="{{'The remote device has not accepted sharing this folder.' | translate}}" tooltip>{{folderLabel(folderID)}}<sup>1</sup></span><!-- Avoid stray space...
--><span ng-switch-when="paused" data-original-title="{{'The remote device has paused this folder.' | translate}}" tooltip>{{folderLabel(folderID)}}<sup>2</sup></span><!-- Avoid stray space...
--><span ng-switch-default>{{folderLabel(folderID)}}</span><!-- Avoid stray space...
--><span ng-if="!$last">,</span>
</span>
</span>
</td>
</tr>
<tr ng-if="deviceCfg.remoteGUIPort > 0">
<th><span class="fas fa-fw fa-desktop"></span>&nbsp;<span translate>Remote GUI</span></th>
<td class="text-right" ng-attr-title="Port {{deviceCfg.remoteGUIPort}}">
<!-- Apply RFC6874 encoding for IPv6 link-local zone identifier -->
<a ng-if="hasRemoteGUIAddress(deviceCfg)" href="{{remoteGUIAddress(deviceCfg).replace('%', '%25')}}">{{remoteGUIAddress(deviceCfg)}}</a>
<span translate ng-if="!hasRemoteGUIAddress(deviceCfg)">Unknown</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel-footer">
<span class="pull-right">
<button ng-if="!deviceCfg.paused" type="button" class="btn btn-sm btn-default" ng-click="setDevicePause(deviceCfg.deviceID, true)">
<span class="fas fa-pause"></span>&nbsp;<span translate>Pause</span>
</button>
<button ng-if="deviceCfg.paused" type="button" class="btn btn-sm btn-default" ng-click="setDevicePause(deviceCfg.deviceID, false)">
<span class="fas fa-play"></span>&nbsp;<span translate>Resume</span>
</button>
<button type="button" class="btn btn-sm btn-default" ng-click="editDeviceExisting(deviceCfg)">
<span class="fas fa-pencil-alt"></span>&nbsp;<span translate>Edit</span>
</button>
</span>
<div class="clearfix"></div>
</div>
</div>
<div class="panel-title-text">{{deviceName(deviceCfg)}}</div>
</h4>
</button>
<div id="device-{{$index}}" class="panel-collapse collapse">
<div class="panel-body less-padding">
<table class="table table-condensed table-striped table-auto">
<tbody>
<tr class="visible-xs">
<th><span class="fa fa-fw {{deviceStatusIcon(deviceCfg)}}"></span>&nbsp;<span translate>Device Status</span></th>
<td class="text-right">{{deviceStatusText(deviceCfg)}}</td>
</tr>
<tr ng-if="!connections[deviceCfg.deviceID].connected">
<th><span class="fas fa-fw fa-eye"></span>&nbsp;<span translate>Last seen</span></th>
<td class="text-right">
<div ng-if="!deviceStats[deviceCfg.deviceID].lastSeenDays" translate>
Never
</div>
<div ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays">
<div>
{{deviceStats[deviceCfg.deviceID].lastSeen | date:"yyyy-MM-dd HH:mm:ss"}}
</div>
<div ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 7">
<i ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays < 30" translate>More than a week ago</i>
<i class="text-warning" ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 30 && deviceStats[deviceCfg.deviceID].lastSeenDays < 365" translate>More than a month ago</i>
<i class="text-danger" ng-if="deviceStats[deviceCfg.deviceID].lastSeenDays >= 365" translate>More than a year ago</i>
</div>
</div>
</td>
</tr>
<tr ng-if="!connections[deviceCfg.deviceID].connected && deviceFolders(deviceCfg).length > 0">
<th><span class="fas fa-fw fa-cloud"></span>&nbsp;<span translate>Sync Status</span></th>
<td translate ng-if="completion[deviceCfg.deviceID]._total == 100" class="text-right">Up to Date</td>
<td ng-if="completion[deviceCfg.deviceID]._total < 100" class="text-right">
<span class="hidden-xs" translate>Out of Sync</span> ({{completion[deviceCfg.deviceID]._total | percent}})
</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="fas fa-fw fa-cloud-download-alt"></span>&nbsp;<span translate>Download Rate</span></th>
<td class="text-right">
<a href="#" class="toggler" ng-click="toggleUnits()">
<span ng-if="!metricRates">{{connections[deviceCfg.deviceID].inbps | binary}}B/s</span>
<span ng-if="metricRates">{{connections[deviceCfg.deviceID].inbps*8 | metric}}bps</span>
({{connections[deviceCfg.deviceID].inBytesTotal | binary}}B)
<small ng-if="deviceCfg.maxRecvKbps > 0"><br/>
<i class="text-muted"><span translate>Limit</span>:
<span ng-if="!metricRates">{{deviceCfg.maxRecvKbps*1024 | binary}}B/s</span>
<span ng-if="metricRates">{{deviceCfg.maxRecvKbps*1024*8 | metric}}bps</span>
</i>
</small>
</a>
</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="fas fa-fw fa-cloud-upload-alt"></span>&nbsp;<span translate>Upload Rate</span></th>
<td class="text-right">
<a href="#" class="toggler" ng-click="toggleUnits()">
<span ng-if="!metricRates">{{connections[deviceCfg.deviceID].outbps | binary}}B/s</span>
<span ng-if="metricRates">{{connections[deviceCfg.deviceID].outbps*8 | metric}}bps</span>
({{connections[deviceCfg.deviceID].outBytesTotal | binary}}B)
<small ng-if="deviceCfg.maxSendKbps > 0"><br/>
<i class="text-muted"><span translate>Limit</span>:
<span ng-if="!metricRates">{{deviceCfg.maxSendKbps*1024 | binary}}B/s</span>
<span ng-if="metricRates">{{deviceCfg.maxSendKbps*1024*8 | metric}}bps</span>
</i>
</small>
</a>
</td>
</tr>
<tr ng-if="completion[deviceCfg.deviceID]._needItems">
<th><span class="fas fa-fw fa-exchange-alt"></span>&nbsp;<span translate>Out of Sync Items</span></th>
<td class="text-right">
<a href="" ng-click="showRemoteNeed(deviceCfg)">{{completion[deviceCfg.deviceID]._needItems | alwaysNumber | localeNumber}} <span translate>items</span>, ~{{completion[deviceCfg.deviceID]._needBytes | binary}}B</a>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-link"></span>&nbsp;<span translate>Address</span></th>
<td ng-if="connections[deviceCfg.deviceID].connected" class="text-right">
<span tooltip data-original-title="{{ connections[deviceCfg.deviceID].type.indexOf('Relay') > -1 ? '' : connections[deviceCfg.deviceID].type }} {{ connections[deviceCfg.deviceID].crypto }}">
{{deviceAddr(deviceCfg)}}
</span>
</td>
<td ng-if="!connections[deviceCfg.deviceID].connected" class="text-right">
<span ng-repeat="addr in deviceCfg.addresses">
<span tooltip data-original-title="{{'Configured' | translate}}">{{addr}}</span><br>
<small ng-if="system.lastDialStatus[addr].error && !deviceCfg.paused" tooltip data-original-title="{{system.lastDialStatus[addr].error}}" class="text-danger">{{abbreviatedError(addr)}}<br></small>
</span>
<span ng-repeat="addr in discoveryCache[deviceCfg.deviceID].addresses">
<span tooltip data-original-title="{{'Discovered' | translate}}">{{addr}}</span><br>
<small ng-if="system.lastDialStatus[addr].error && !deviceCfg.paused" tooltip data-original-title="{{system.lastDialStatus[addr].error}}" class="text-danger">{{abbreviatedError(addr)}}<br></small>
</span>
</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="reception reception-4 reception-theme"></span>&nbsp;<span translate>Connection Type</span></th>
<td class="text-right">
<span tooltip data-original-title="{{rdConnDetails(rdConnType(deviceCfg.deviceID))}}">
{{rdConnTypeString(rdConnType(deviceCfg.deviceID))}}
</span>
</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].connected">
<th><span class="fas fa-fw fa-random"></span>&nbsp;<span translate>Number of Connections</span></th>
<td class="text-right">
<span ng-if="connections[deviceCfg.deviceID].secondary.length">1 + {{connections[deviceCfg.deviceID].secondary.length | alwaysNumber}}</span>
<span ng-if="!connections[deviceCfg.deviceID].secondary.length">1</span>
</td>
</tr>
<tr ng-if="deviceCfg.allowedNetworks.length > 0">
<th><span class="fas fa-fw fa-filter"></span>&nbsp;<span translate>Allowed Networks</span></th>
<td class="text-right">
<span>{{deviceCfg.allowedNetworks.join(", ")}}</span>
</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-compress"></span>&nbsp;<span translate>Compression</span></th>
<td class="text-right">
<span ng-if="deviceCfg.compression == 'always'" translate>All Data</span>
<span ng-if="deviceCfg.compression == 'metadata'" translate>Metadata Only</span>
<span ng-if="deviceCfg.compression == 'never'" translate>Off</span>
</td>
</tr>
<tr ng-if="deviceCfg.introducer">
<th><span class="far fa-fw fa-thumbs-up"></span>&nbsp;<span translate>Introducer</span></th>
<td translate class="text-right">Yes</td>
</tr>
<tr ng-if="deviceCfg.introducedBy">
<th><span class="far fa-fw fa-handshake-o"></span>&nbsp;<span translate>Introduced By</span></th>
<td class="text-right">{{ deviceName(devices[deviceCfg.introducedBy]) || deviceShortID(deviceCfg.introducedBy) }}</td>
</tr>
<tr ng-if="deviceCfg.autoAcceptFolders">
<th><span class="fa fa-fw fa-level-down"></span>&nbsp;<span translate>Auto Accept</span></th>
<td translate class="text-right">Yes</td>
</tr>
<tr>
<th><span class="fas fa-fw fa-qrcode"></span>&nbsp;<span translate>Identification</span></th>
<td class="text-right">
<span tooltip data-original-title="{{'Click to see full identification string and QR code.' | translate}}">
<a href="" ng-click="showDeviceIdentification(deviceCfg)">{{deviceShortID(deviceCfg.deviceID)}}</a>
</span>
</td>
</tr>
<tr ng-if="deviceCfg.untrusted">
<th><span class="fa fa-fw fa-user-secret"></span>&nbsp;<span translate>Untrusted</span></th>
<td translate class="text-right">Yes</td>
</tr>
<tr ng-if="connections[deviceCfg.deviceID].clientVersion">
<th><span class="fas fa-fw fa-tag"></span>&nbsp;<span translate>Version</span></th>
<td class="text-right">{{connections[deviceCfg.deviceID].clientVersion}}</td>
</tr>
<tr ng-if="deviceFolders(deviceCfg).length > 0">
<th><span class="fas fa-fw fa-folder"></span>&nbsp;<span translate>Folders</span></th>
<td class="text-right no-overflow-ellipse overflow-break-word">
<span ng-repeat="folderID in deviceFolders(deviceCfg)">
<span ng-if="folderIsSharedEncrypted(folderID, deviceCfg.deviceID)" class="text-nowrap">
<span class="fa fa-lock"></span>&nbsp;<!-- Avoid stray space...
--></span><!-- Avoid stray space...
--><span ng-switch="completion[deviceCfg.deviceID][folderID].remoteState"><!-- Avoid stray space...
--><span ng-switch-when="notSharing" data-original-title="{{'The remote device has not accepted sharing this folder.' | translate}}" tooltip>{{folderLabel(folderID)}}<sup>1</sup></span><!-- Avoid stray space...
--><span ng-switch-when="paused" data-original-title="{{'The remote device has paused this folder.' | translate}}" tooltip>{{folderLabel(folderID)}}<sup>2</sup></span><!-- Avoid stray space...
--><span ng-switch-default>{{folderLabel(folderID)}}</span><!-- Avoid stray space...
--><span ng-if="!$last">,</span>
</span>
</span>
</td>
</tr>
<tr ng-if="deviceCfg.remoteGUIPort > 0">
<th><span class="fas fa-fw fa-desktop"></span>&nbsp;<span translate>Remote GUI</span></th>
<td class="text-right" ng-attr-title="Port {{deviceCfg.remoteGUIPort}}">
<!-- Apply RFC6874 encoding for IPv6 link-local zone identifier -->
<a ng-if="hasRemoteGUIAddress(deviceCfg)" href="{{remoteGUIAddress(deviceCfg).replace('%', '%25')}}">{{remoteGUIAddress(deviceCfg)}}</a>
<span translate ng-if="!hasRemoteGUIAddress(deviceCfg)">Unknown</span>
</td>
</tr>
</tbody>
</table>
</div>
<div class="panel-footer">
<span class="pull-right">
<button ng-if="!deviceCfg.paused" type="button" class="btn btn-sm btn-default" ng-click="setDevicePause(deviceCfg.deviceID, true)">
<span class="fas fa-pause"></span>&nbsp;<span translate>Pause</span>
</button>
<button ng-if="deviceCfg.paused" type="button" class="btn btn-sm btn-default" ng-click="setDevicePause(deviceCfg.deviceID, false)">
<span class="fas fa-play"></span>&nbsp;<span translate>Resume</span>
</button>
<button type="button" class="btn btn-sm btn-default" ng-click="editDeviceExisting(deviceCfg)">
<span class="fas fa-pencil-alt"></span>&nbsp;<span translate>Edit</span>
</button>
</span>
<div class="clearfix"></div>
</div>
</div>
</div>
</div>
<div class="form-group">
<span class="pull-right">
<button type="button" class="btn btn-sm btn-default" ng-click="setAllDevicesPause(true)" ng-if="isAtleastOneDevicePausedStateSetTo(false)">
@@ -1034,7 +1051,7 @@
<ng-include src="'syncthing/device/shareDeviceIdDialogView.html'"></ng-include>
<!-- vendor scripts -->
<script type="text/javascript" src="vendor/jquery/jquery-2.2.2.js"></script>
<script type="text/javascript" src="vendor/jquery/jquery-3.7.1.js"></script>
<script type="text/javascript" src="vendor/angular/angular.js"></script>
<script type="text/javascript" src="vendor/angular/angular-sanitize.js"></script>
<script type="text/javascript" src="vendor/angular/angular-translate.js"></script>
@@ -30,7 +30,7 @@
<h4 class="text-center" translate>The Syncthing Authors</h4>
<div class="row">
<div class="col-md-12" id="contributor-list">
Jakob Borg, Audrius Butkevicius, Simon Frei, Tomasz Wilczyński, Alexander Graf, Alexandre Viau, Anderson Mesquita, André Colomb, Antony Male, Ben Schulz, bt90, Caleb Callaway, Daniel Harte, Emil Lundberg, Eric P, Evgeny Kuznetsov, greatroar, Lars K.W. Gohlke, Lode Hoste, Michael Ploujnikov, Ross Smith II, Stefan Tatschner, Tommy van der Vorst, Wulf Weich, Adam Piggott, Adel Qalieh, Aleksey Vasenev, Alessandro G., Alex Ionescu, Alex Lindeman, Alex Xu, Alexander Seiler, Alexandre Alves, Aman Gupta, Andreas Sommer, andresvia, Andrew Rabert, Andrey D, andyleap, Anjan Momi, Anthony Goeckner, Antoine Lamielle, Anur, Aranjedeath, ardevd, Arkadiusz Tymiński, Aroun, Arthur Axel fREW Schmidt, Artur Zubilewicz, Ashish Bhate, Aurélien Rainone, BAHADIR YILMAZ, Bart De Vries, Beat Reichenbach, Ben Shepherd, Ben Sidhom, Benedikt Heine, Benno Fünfstück, Benny Ng, boomsquared, Boqin Qin, Boris Rybalkin, Brendan Long, Catfriend1, Cathryne Linenweaver, Cedric Staniewski, Chih-Hsuan Yen, Choongkyu, Chris Howie, Chris Joel, Christian Kujau, Christian Prescott, chucic, cjc7373, Colin Kennedy, Cromefire_, Cyprien Devillez, d-volution, Dan, Daniel Barczyk, Daniel Bergmann, Daniel Martí, Daniel Padrta, Daniil Gentili, Darshil Chanpura, dashangcun, David Rimmer, DeflateAwning, Denis A., Dennis Wilson, derekriemer, DerRockWolf, desbma, Devon G. Redekopp, digital, Dimitri Papadopoulos Orfanos, Dmitry Saveliev, domain, Domenic Horner, Dominik Heidler, Elias Jarlebring, Elliot Huffman, Emil Hessman, Eng Zer Jun, entity0xfe, Eric Lesiuta, Erik Meitner, Evan Spensley, Federico Castagnini, Felix, Felix Ableitner, Felix Lampe, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gahl Saraf, georgespatton, ghjklw, Gilli Sigurdsson, Gleb Sinyavskiy, Graham Miln, Greg, guangwu, gudvinr, Gusted, Han Boetes, HansK-p, Harrison Jones, Hazem Krimi, Heiko Zuerker, Hireworks, Hugo Locurcio, Iain Barnett, Ian Johnson, ignacy123, Iskander Sharipov, Jaakko Hannikainen, Jack Croft, Jacob, Jake Peterson, James O'Beirne, James Patterson, Jaroslav Lichtblau, Jaroslav Malec, Jaspitta, Jaya Chithra, Jaya Kumar, Jeffery To, jelle van der Waa, Jens Diemer, Jochen Voss, Johan Vromans, John Rinehart, Jonas Thelemann, Jonathan, Jose Manuel Delicado, jtagcat, Julian Lehrhuber, Jörg Thalheim, Jędrzej Kula, Kapil Sareen, Karol Różycki, Kebin Liu, Keith Harrison, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Kevin Bushiri, Kevin White, Jr., klemens, Kurt Fitzner, kylosus, Lars Lehtonen, Laurent Etiemble, Leo Arias, Liu Siyuan, Lord Landon Agahnim, LSmithx2, Lukas Lihotzki, Luke Hamburg, luzpaz, Majed Abdulaziz, Marc Laporte, Marcel Meyer, Marcin Dziadus, Marcus B Spencer, Marcus Legendre, Mario Majila, Mark Pulford, Martchus, Mateusz Naściszewski, Mateusz Ż, mathias4833, Matic Potočnik, Matt Burke, Matt Robenolt, Matteo Ruina, Maurizio Tomasi, Max, Max Schulze, MaximAL, Maximilian, Michael Jephcote, Michael Rienstra, MichaIng, Migelo, Mike Boone, MikeLund, MikolajTwarog, Mingxuan Lin, mv1005, Nate Morrison, nf, Nicholas Rishel, Nick Busey, Nico Stapelbroek, Nicolas Braud-Santoni, Nicolas Perraut, Niels Peter Roest, Nils Jakobi, NinoM4ster, Nitroretro, NoLooseEnds, Oliver Freyermuth, orangekame3, otbutz, overkill, Oyebanji Jacob Mayowa, Pablo, Pascal Jungblut, Paul Brit, Paul Donald, Pawel Palenica, perewa, Peter Badida, Peter Dave Hello, Peter Hoeg, Peter Marquardt, Phani Rithvij, Phil Davis, Philippe Schommers, Phill Luby, Piotr Bejda, polyfloyd, pullmerge, Quentin Hibon, Rahmi Pruitt, red_led, Robert Carosi, Roberto Santalla, Robin Schoonover, Roman Zaynetdinov, rubenbe, Ruslan Yevdokymov, Ryan Qian, Ryan Sullivan, Sacheendra Talluri, Scott Klupfel, sec65, Sergey Mishin, Sertonix, Severin von Wnuck-Lipinski, Shaarad Dalvi, Simon Mwepu, Simon Pickup, Sly_tom_cat, Sonu Kumar Saw, Stefan Kuntz, Steven Eckhoff, Suhas Gundimeda, Sven Bachmann, Sébastien WENSKE, Taylor Khan, Terrance, TheCreeper, Thomas, Thomas Hipp, Tim Abell, Tim Howes, Tobias Frölich, Tobias Klauser, Tobias Nygren, Tobias Tom, Tom Jakubowski, Tully Robinson, Tyler Brazier, Tyler Kropp, Unrud, vapatel2, Veeti Paananen, Victor Buinsky, Vik, Vil Brekin, villekalliomaki, Vladimir Rusinov, wangguoliang, WangXi, Will Rouesnel, William A. Kennington III, wouter bolsterlee, xarx00, Xavier O., xjtdy888, Yannic A., yparitcher, 佛跳墙, 落心
Jakob Borg, Audrius Butkevicius, Simon Frei, Tomasz Wilczyński, Alexander Graf, Alexandre Viau, Anderson Mesquita, André Colomb, Antony Male, Ben Schulz, bt90, Caleb Callaway, Daniel Harte, Emil Lundberg, Eric P, Evgeny Kuznetsov, greatroar, Lars K.W. Gohlke, Lode Hoste, Marcus B Spencer, Michael Ploujnikov, Ross Smith II, Stefan Tatschner, Tommy van der Vorst, Wulf Weich, Adam Piggott, Adel Qalieh, Aleksey Vasenev, Alessandro G., Alex Ionescu, Alex Lindeman, Alex Xu, Alexander Seiler, Alexandre Alves, Aman Gupta, Andreas Sommer, andresvia, Andrew Rabert, Andrey D, andyleap, Anjan Momi, Anthony Goeckner, Antoine Lamielle, Anur, Aranjedeath, ardevd, Arkadiusz Tymiński, Aroun, Arthur Axel fREW Schmidt, Artur Zubilewicz, Ashish Bhate, Aurélien Rainone, BAHADIR YILMAZ, Bart De Vries, Beat Reichenbach, Ben Norcombe, Ben Shepherd, Ben Sidhom, Benedikt Heine, Benno Fünfstück, Benny Ng, boomsquared, Boqin Qin, Boris Rybalkin, Brendan Long, Catfriend1, Cathryne Linenweaver, Cedric Staniewski, Chih-Hsuan Yen, Choongkyu, Chris Howie, Chris Joel, Christian Kujau, Christian Prescott, chucic, cjc7373, Colin Kennedy, Cromefire_, cui, Cyprien Devillez, d-volution, Dan, Daniel Barczyk, Daniel Bergmann, Daniel Martí, Daniel Padrta, Daniil Gentili, Darshil Chanpura, dashangcun, David Rimmer, DeflateAwning, Denis A., Dennis Wilson, derekriemer, DerRockWolf, desbma, Devon G. Redekopp, digital, Dimitri Papadopoulos Orfanos, Dmitry Saveliev, domain, Domenic Horner, Dominik Heidler, Elias Jarlebring, Elliot Huffman, Emil Hessman, Eng Zer Jun, entity0xfe, Epifeny, epifeny, Eric Lesiuta, Erik Meitner, Evan Spensley, Federico Castagnini, Felix, Felix Ableitner, Felix Lampe, Felix Unterpaintner, Francois-Xavier Gsell, Frank Isemann, Gahl Saraf, georgespatton, ghjklw, Gilli Sigurdsson, Gleb Sinyavskiy, Graham Miln, Greg, guangwu, gudvinr, Gusted, Han Boetes, HansK-p, Harrison Jones, Hazem Krimi, Heiko Zuerker, Hireworks, Hugo Locurcio, Iain Barnett, Ian Johnson, ignacy123, Iskander Sharipov, Jaakko Hannikainen, Jack Croft, Jacob, Jake Peterson, James O'Beirne, James Patterson, Jaroslav Lichtblau, Jaroslav Malec, Jaspitta, Jaya Chithra, Jaya Kumar, Jeffery To, jelle van der Waa, Jens Diemer, Jochen Voss, Johan Vromans, John Rinehart, Jonas Thelemann, Jonathan, Jose Manuel Delicado, JRNitre, jtagcat, Julian Lehrhuber, Jörg Thalheim, Jędrzej Kula, Kapil Sareen, Karol Różycki, Kebin Liu, Keith Harrison, Kelong Cong, Ken'ichi Kamada, Kevin Allen, Kevin Bushiri, Kevin White, Jr., klemens, Kurt Fitzner, kylosus, Lars Lehtonen, Laurent Etiemble, Leo Arias, Liu Siyuan, Lord Landon Agahnim, LSmithx2, Luiz Angelo Daros de Luca, Lukas Lihotzki, Luke Hamburg, luzpaz, Majed Abdulaziz, Marc Laporte, Marcel Meyer, Marcin Dziadus, Marcus Legendre, Mario Majila, Mark Pulford, Martchus, Mateusz Naściszewski, Mateusz Ż, mathias4833, Matic Potočnik, Matt Burke, Matt Robenolt, Matteo Ruina, Maurizio Tomasi, Max, Max Schulze, MaximAL, Maximilian, Maxwell G, Michael Jephcote, Michael Rienstra, Michael Wang 汪東陽, MichaIng, Migelo, Mike Boone, MikeLund, MikolajTwarog, Mingxuan Lin, mv1005, Nate Morrison, nf, Nicholas Rishel, Nick Busey, Nico Stapelbroek, Nicolas Braud-Santoni, Nicolas Perraut, Niels Peter Roest, Nils Jakobi, NinoM4ster, Nitroretro, NoLooseEnds, Oliver Freyermuth, orangekame3, otbutz, overkill, Oyebanji Jacob Mayowa, Pablo, Pascal Jungblut, Paul Brit, Paul Donald, Pawel Palenica, perewa, Peter Badida, Peter Dave Hello, Peter Hoeg, Peter Marquardt, Phani Rithvij, Phil Davis, Philippe Schommers, Phill Luby, Piotr Bejda, polyfloyd, Prathik P Kulkarni, pullmerge, Quentin Hibon, Rahmi Pruitt, RealCharlesChia, red_led, Robert Carosi, Roberto Santalla, Robin Schoonover, Roman Zaynetdinov, rubenbe, Ruslan Yevdokymov, Ryan Qian, Ryan Sullivan, Sacheendra Talluri, Scott Klupfel, sec65, Sergey Mishin, Sertonix, Severin von Wnuck-Lipinski, Shaarad Dalvi, Shivam Kumar, Simon Mwepu, Simon Pickup, Sly_tom_cat, Sonu Kumar Saw, Stefan Kuntz, Steven Eckhoff, Suhas Gundimeda, Sven Bachmann, Sébastien WENSKE, Tao, Taylor Khan, Terrance, TheCreeper, Thomas, Thomas Hipp, Tim Abell, Tim Howes, Tobias Frölich, Tobias Klauser, Tobias Nygren, Tobias Tom, Tom Jakubowski, Tully Robinson, Tyler Brazier, Tyler Kropp, Umer-Azaz, Unrud, Val Markovic, vapatel2, Veeti Paananen, Victor Buinsky, Vik, Vil Brekin, villekalliomaki, Vladimir Rusinov, vvaswani, wangguoliang, WangXi, Will Rouesnel, William A. Kennington III, wouter bolsterlee, xarx00, Xavier O., xjtdy888, Yannic A., yparitcher, 佛跳墙, 落心
</div>
</div>
</div>
@@ -62,7 +62,7 @@ Jakob Borg, Audrius Butkevicius, Simon Frei, Tomasz Wilczyński, Alexander Graf,
<li><a href="https://github.com/davecgh/go-spew">davecgh/go-spew</a>, Copyright &copy; 2012-2016 Dave Collins.</li>
<li><a href="https://github.com/go-asn1-ber/asn1-ber">go-asn1-ber/asn1-ber</a>, Copyright &copy; 2011-2015 Michael Mitton (mmitton@gmail.com).</li>
<li><a href="https://github.com/go-ldap/ldap">go-ldap/ldap</a>, Copyright &copy; 2011-2015 Michael Mitton (mmitton@gmail.com).</li>
<li><a href="https://github.com/uber-go/automaxprocs">go.uber.org/automaxprocs</a>, Copyright &copy; 2017 Uber Technologies, Inc.</li>
<li><a href="https://go.yaml.in/yaml/v2">go.yaml.in/yaml/v2</a>, Copyright &copy; 2026, the go.yaml.in/yaml/v2 authors.</li>
<li><a href="https://github.com/gobwas/glob">gobwas/glob</a>, Copyright &copy; 2016 Sergey Kamardin.</li>
<li><a href="https://github.com/gofrs/flock">gofrs/flock</a>, Copyright &copy; 2018-2025, The Gofrs.</li>
<li><a href="https://github.com/golang/snappy">golang/snappy</a>, Copyright &copy; 2011 The Snappy-Go Authors.</li>
@@ -23,10 +23,10 @@
<span ng-switch-default ng-switch="selected[id]">
<span ng-switch-when='true' ng-switch="untrusted">
<span ng-switch-when='true' ng-class="{'has-error': !encryptionPasswords[id]}">
<input class="form-control input-sm" type="{{plain ? 'text' : 'password'}}" ng-model="encryptionPasswords[id]" required placeholder="{{'Device is untrusted, enter encryption password' | translate}}" />
<input class="form-control input-sm" type="{{plain ? 'text' : 'password'}}" ng-model="encryptionPasswords[id]" autocomplete="off" required placeholder="{{'Device is untrusted, enter encryption password' | translate}}" />
</span>
<span ng-switch-default>
<input class="form-control input-sm" type="{{plain ? 'text' : 'password'}}" ng-model="encryptionPasswords[id]" placeholder="{{'If untrusted, enter encryption password' | translate}}" />
<input class="form-control input-sm" type="{{plain ? 'text' : 'password'}}" ng-model="encryptionPasswords[id]" autocomplete="off" placeholder="{{'If untrusted, enter encryption password' | translate}}" />
</span>
</span>
<span ng-switch-default>
@@ -73,6 +73,7 @@ angular.module('syncthing.core')
CLUSTER_CONFIG_RECEIVED: 'ClusterConfigReceived', // Emitted when receiving a remote device's cluster config
DOWNLOAD_PROGRESS: 'DownloadProgress', // Emitted during file downloads for each folder for each file
FAILURE: 'Failure', // Specific errors sent to the usage reporting server for diagnosis
UPGRADE_RESTART_SCHEDULED: 'UpgradeRestartScheduled', // Auto-upgrade completed, restart scheduled
FOLDER_COMPLETION: 'FolderCompletion', //Emitted when the local or remote contents for a folder changes
FOLDER_REJECTED: 'FolderRejected', // DEPRECATED: Emitted when a device sends index information for a folder we do not have, or have but do not share with the device in question
PENDING_FOLDERS_CHANGED: 'PendingFoldersChanged', // Emitted when pending folders were added / updated (offered by some device, but not shared to them) or removed (folder ignored or added or no longer offered from the remote device)
@@ -11,6 +11,8 @@ angular.module('syncthing.core')
var navigatingAway = false;
var online = false;
var restarting = false;
var restartExpectedFrom = 0;
var restartExpectedUntil = 0;
function initController() {
LocaleService.autoConfigLocale();
@@ -33,6 +35,34 @@ angular.module('syncthing.core')
Events.start();
}
function clearRestartExpectation() {
restartExpectedFrom = 0;
restartExpectedUntil = 0;
}
function setRestartExpectation(delayS) {
var delay = delayS > 0 ? delayS : 60;
var delayMs = delay * 1000;
var earlyMs = 5 * 1000;
var graceMs = 60 * 1000;
var now = Date.now();
restartExpectedFrom = now + Math.max(0, delayMs - earlyMs);
restartExpectedUntil = now + delayMs + graceMs;
}
function restartExpectedNow() {
if (!restartExpectedUntil) {
return false;
}
var now = Date.now();
if (now > restartExpectedUntil) {
clearRestartExpectation();
return false;
}
return now >= restartExpectedFrom;
}
// public/scope definitions
// window.metadata is set in /meta.js which requires authentication
@@ -51,12 +81,14 @@ angular.module('syncthing.core')
$scope.model = {};
$scope.myID = '';
$scope.devices = {};
$scope.devicesGrouped = {};
$scope.discoveryCache = {};
$scope.protocolChanged = false;
$scope.reportData = {};
$scope.reportDataPreview = '';
$scope.reportPreview = false;
$scope.folders = {};
$scope.foldersGrouped = {};
$scope.seenError = '';
$scope.upgradeInfo = null;
$scope.deviceStats = {};
@@ -187,13 +219,14 @@ angular.module('syncthing.core')
$scope.version = data;
}).error($scope.emitHTTPError);
$http.get(urlbase + '/svc/report').success(function (data) {
$scope.reportData = data;
if ($scope.system && $scope.config.options.urAccepted > -1 && $scope.config.options.urSeen < $scope.system.urVersionMax && $scope.config.options.urAccepted < $scope.system.urVersionMax) {
// Usage reporting format has changed, prompt the user to re-accept.
if ($scope.system && $scope.config.options.urAccepted > -1 && $scope.config.options.urSeen < $scope.system.urVersionMax && $scope.config.options.urAccepted < $scope.system.urVersionMax) {
// Usage reporting decision has not been taken or format
// has changed, prompt the user to (re-)accept.
$http.get(urlbase + '/svc/report').success(function (data) {
$scope.reportData = data;
showModal('#ur');
}
}).error($scope.emitHTTPError);
}).error($scope.emitHTTPError);
}
$http.get(urlbase + '/system/upgrade').success(function (data) {
$scope.upgradeInfo = data;
@@ -203,6 +236,7 @@ angular.module('syncthing.core')
online = true;
restarting = false;
clearRestartExpectation();
hideModal('#networkError');
hideModal('#restarting');
hideModal('#shutdown');
@@ -217,10 +251,26 @@ angular.module('syncthing.core')
console.log('UIOffline');
online = false;
if (!restarting) {
showModal('#networkError');
if (restartExpectedNow()) {
restarting = true;
showModal('#restarting');
} else {
showModal('#networkError');
}
}
});
$scope.$on(Events.UPGRADE_RESTART_SCHEDULED, function (_event, arg) {
var delayS = 0;
if (arg && arg.data && arg.data.delayS !== undefined) {
delayS = parseInt(arg.data.delayS, 10);
if (isNaN(delayS) || delayS < 0) {
delayS = 0;
}
}
setRestartExpectation(delayS);
});
$scope.$on('HTTPError', function (event, arg) {
// Emitted when a HTTP call fails. We use the status code to try
// to figure out what's wrong.
@@ -517,15 +567,43 @@ angular.module('syncthing.core')
_needBytes: 0,
_needItems: 0
};
};
// myID is watched as $scope.otherDevices() relies on this
// and it can potenitally not be loaded due to this function
// scope being called in an undetermistic manner
$scope.$watch('myID', function(myID) {
if (myID) {
$scope.devicesGrouped = {};
const otherDevices = $scope.otherDevices();
for (var id in otherDevices) {
if ($scope.devicesGrouped[otherDevices[id].group] === undefined) {
$scope.devicesGrouped[otherDevices[id].group] = [];
}
$scope.devicesGrouped[otherDevices[id].group].push(otherDevices[id]);
};
$scope.devicesGrouped = sortByKeyThenProperty($scope.devicesGrouped, "name", "deviceID");
}
});
$scope.folders = folderMap($scope.config.folders);
$scope.foldersGrouped = {};
Object.keys($scope.folders).forEach(function (folder) {
refreshFolder(folder);
$scope.folders[folder].devices.forEach(function (deviceCfg) {
refreshCompletion(deviceCfg.deviceID, folder);
});
if ($scope.foldersGrouped[$scope.folders[folder].group] === undefined) {
$scope.foldersGrouped[$scope.folders[folder].group] = [];
}
$scope.foldersGrouped[$scope.folders[folder].group].push($scope.folders[folder]);
});
$scope.foldersGrouped = sortByKeyThenProperty($scope.foldersGrouped, "label", "id");
refreshNoAuthWarning();
setDefaultTheme();
@@ -534,6 +612,31 @@ angular.module('syncthing.core')
}
}
// Sort firstly by the top level key of the object and then by
// prop name provided for the array of objects for each key.
// If the prop returns has an empty value, then use the
// fallback prop provided.
function sortByKeyThenProperty(obj, prop, fallbackProp) {
const sorted = {};
Object.keys(obj)
.sort()
.forEach((key) => {
sorted[key] = obj[key].sort((a, b) => {
let aProp = prop;
let bProp = prop;
if (!a[aProp]) {
aProp = fallbackProp;
}
if (!b[bProp]) {
bProp = fallbackProp;
}
return a[aProp].localeCompare(b[bProp]);
});
});
return sorted;
}
function refreshSystem() {
return $http.get(urlbase + '/system/status').success(function (data) {
$scope.myID = data.myID;
@@ -1019,7 +1122,7 @@ angular.module('syncthing.core')
if (status == 'paused') {
return 'default';
}
if (status === 'syncing' || status === 'sync-preparing' || status === 'scanning' || status === 'cleaning') {
if (status === 'syncing' || status === 'sync-preparing' || status === 'scanning' || status === 'cleaning' || status === 'starting') {
return 'primary';
}
if (status === 'unknown') {
@@ -1217,6 +1320,7 @@ angular.module('syncthing.core')
case 'scan-waiting':
case 'sync-preparing':
case 'sync-waiting':
case 'starting':
return 'fa-hourglass-half';
case 'cleaning':
return 'fa-recycle';
@@ -1252,6 +1356,8 @@ angular.module('syncthing.core')
return $translate.instant('Failed Items');
case 'idle':
return $translate.instant('Up to Date');
case 'starting':
return $translate.instant('Starting');
case 'localadditions':
return $translate.instant('Local Additions');
case 'localunencrypted':
@@ -2231,6 +2337,12 @@ angular.module('syncthing.core')
} else {
$scope.currentFolder.fsWatcherEnabled = true;
}
var type = $scope.currentFolder.type;
if ($scope.currentFolder._editing !== 'existing') {
// Never automatically change block indexing, only suggest
// the value on new folder creation.
$scope.currentFolder.blockIndexing = (type === 'sendreceive' || type === 'receiveonly');
}
$scope.setFSWatcherIntervalDefault();
};
@@ -2610,6 +2722,27 @@ angular.module('syncthing.core')
}
}, $scope.emitHTTPError);
};
$scope.isFolderTabDisabled = function (tab) {
if (!$scope.currentFolder) {
return false;
}
if ($scope.currentFolder._editing === "new-ignores") {
return tab !== "ignores";
}
if (tab === "ignores" && $scope.currentFolder._recvEnc) {
return true;
}
return false;
};
$scope.onFolderTabClick = function ($event, tab) {
if ($scope.isFolderTabDisabled(tab)) {
$event.preventDefault();
$event.stopPropagation();
return false;
}
};
function saveFolderIgnoresExisting() {
if ($scope.ignores.disabled) {

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