This replaces old style errors.Wrap with modern fmt.Errorf and removes
the (direct) dependency on github.com/pkg/errors. A couple of cases are
adjusted by hand as previously errors.Wrap(nil, ...) would return nil,
which is not what fmt.Errorf does.
Locally paused folders will fail on checkFolderRunningLocked() and
therefore abort the loop. Avoid this by skipping paused folders
directly.
Co-authored-by: Jakob Borg <jakob@kastelo.net>
These strings no longer exist in the GUI, hence there is no need to keep
them in the translation json files either.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
* lib/locations: Fix enum values camelCase.
* lib/locations: Remove unused FailuresFile.
* cmd/syncthing: Turn around role of locations storage.
Previously the locations package was used to provide default paths,
possibly with an overridden home directory. Extra paths supplied on
the command line were handled and passed around in the options object.
To make the changed paths available to any other interested package,
override the location setting from the option if supplied, instead of
vice versa when not supplied. Adapt code using this to read from the
locations package instead of passing through the options object.
* lib/locations: Refactor showPaths to locations package.
Generate a reusable string in locations.PrettyPrintPaths().
Enumerating all possible locations in different packages is error
prone, so add a new public function to generate the listing as a
string in the locations package. Adapt cmd/syncthing --paths to use
that instead of its own console output.
* lib/locations: Include CSRF token in pretty printed paths.
* lib/api: New endpoint /rest/system/paths.
The paths should be available for troubleshooting from a running
instance. Using the --paths CLI option is not easy in some
environments, so expose the locations mapping to a JSON endpoint.
Add utility function ListExpandedPaths() that also filters out any
entries which still contain variable placeholders.
* gui: List runtime paths in separate log viewer tab.
* Wrap paths.
* lib/syncthing: Utilize locations.Get() instead of passing an arg.
* Include base directories, move label to table caption.
* gui: Switch to hard-coded paths instead of iterating over all.
* gui: Break aboutModalView into tabs.
Use tabs to separate authors from included third-party software.
* gui: Move paths from log viewer to about modal.
* lib/locations: Adjust pretty print output order to match GUI.
* gui, authors: Remove additional bot names and fix indent.
The indentation changed because of the tabbed about dialog, fix the
authors script to respect that.
Skip Syncthing*Automation in authors list as well.
* Update AUTHORS list to remove bot names.
* Revert AUTHORS email order change.
* Do not emphasize DB and log file locations.
* Review line wrapping.
* review part 1: strings.Builder, naming
* Rename and extend locations.Set() with error handling.
Remodel the Override() function along the existing SetBaseDir() and
rename it to simply Set(). Make sure to use absolute paths when given
log file or GUI assets override options. Add proper error reporting
if that goes wrong.
* Remove obsolete comment about empty logfile option.
* Don't filter out unexpanded baseDir placeholders, only ${timestamp}.
* Restore behavior regarding special "-" logfile argument.
If the option is given, but with empty value, assume the no log
file (same as "-"). Don't try to convert the special value to an
absolute path though and document this fact in a comment for the Set()
function.
* Use template to check for location key validity.
* Don't filter out timestamp placeholders.
* lib/api: Remove paths from /rest/system/status.
* lib/ur: Properly initialize map in failure data (fixes#8479)
Co-authored-by: Jakob Borg <jakob@kastelo.net>
Currently the `Run()` function of the CLI always uses `os.Args` directly.
This change adds an additional `RunWithArgs()` function that allows passing
arguments as `[]string` instead. This is useful when linking against
Syncthing as a library to be able to also expose the CLI.
Also adds idle time and keepalive parameters because how this is
configured has changed in the new package version. The values are those
that seems like might already be default, if keep-alives were enabled,
which is not obvious from the doc comments.
Also, Go 1.19 gofmt reformatting of comments.
all: Add package runtimeos for runtime.GOOS comparisons
I grew tired of hand written string comparisons. This adds generated
constants for the GOOS values, and predefined Is$OS constants that can
be iffed on. In a couple of places I rewrote trivial switch:es to if:s,
and added Illumos where we checked for Solaris (because they are
effectively the same, and if we're going to target one of them that
would be Illumos...).
Currently, there are two issues with the detailed staggered versioning
information displayed in the folder info. Firstly, the maxAge value of
365d is displayed despite matching the default. Secondly, there is no
consideration for the special case of maxAge equal to 0, meaning that
versions are kept forever.
This commit fixes both of those issues, so that the default maxAge is
not displayed and its value of 0 is displayed as "forever".
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
This adds support for syncing ownership on Unixes and on Windows. The
scanner always picks up ownership information, but it is not applied
unless the new folder option "Sync Ownership" is set.
Ownership data is stored in a new FileInfo field called "platform data". This
is intended to hold further platform-specific data in the future
(specifically, extended attributes), which is why the whole design is a
bit overkill for just ownership.
* lib/model: Override scan config for auto-accepted encrypted folders.
Encrypted folders should not have the fs watcher enabled and rarely
benefit from a scheduled rescan. The GUI adjusts the suggested
settings (watcher disabled, one day rescan interval) when accepting a
receive-encrypted folder. Mirror that behavior to the auto-accept
case where the GUI is not involved.
Versioning also does not work well for encrypted folders, same
treatment.
Currently, the filesystem watcher explanation in the Advanced tab in the
Edit Folder modal window is split into two parts. The first is location
in a tooltip that is visible only when hovering the mouse over the small
checkbox, which makes it not easily accessible, e.g. for new or touch
screen users.
No other settings in the Edit Folder window have their explanation
presentend like that. When needed, it is always displayed in their
respective help blocks, which are always visible on the screen. Thus,
move the filesystem watcher explanation from the tooltip to the help
block, merging it with the other part of the explanation in the process.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
* gui: Use discovered IDs from cache when adding a new remote device.
The GUI already does refreshDiscoveryCache() when it comes online and
on every 10 second refresh cycle. Querying the same information
freshly in addDevice() seems unnecessary and adds some more round-trip
delay on a possibly slow network link. Instead use the IDs from the
existing discoveryCache property to populate the suggested ID list.
* Increase maximum suggested device ID count to 100.
For the auto-completion list, which is hidden by default and filtered
by the browser, we can offer more discovered device IDs without
causing much confusion. The list of suggested "nearby" devices is
still limited to the first five.
* Rename $scope.discoveryUnknown.
The old name "discovery" was pretty ambiguous..
This commit updates Fork Awesome from version 1.1.2 from 2018 to version
1.2.0 from 2021. The changes are few and non-breaking, consisting mainly
of new icon additions.
It is worth to note that the new version includes also a Syncthing icon,
which was not present before.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
An off-by-one error could cause tokens to be forgotten. Suppose
tokens := []string{"foo", "bar", "baz", "quux"}
i := 2
token := tokens[i] // token == "baz"
Then, after
copy(tokens[1:], tokens[:i+1])
tokens[0] = token
we have
tokens == []string{"baz", "foo", "bar", "baz"}
The short test actually relied on this bug.
Similar to the "remote has not accepted sharing" message, add a
footnote number 2 to indicate a folder which will not sync with a
certain device because the remote has paused it. Applies to the edit
folder / device modals' sharing tab, as well as the "shared with"
listing and tooltips under device and folder details.
Use the proper encoding function in the relay server when constructing
the URL. In the pool server, parse and re-encode the query values to
sanitize whatever the client sent.
Currently, the "Latest Change" translation string is hard-coded to use
the English-like word order of V ("deleted") + N ("file"). As such, it
is incompatible with languages that require to use a different word
order, e.g. Korean or Japanese. In other words, a proper translation of
the string to those languages is currently impossible.
This commit changes the translation string, so that it includes the file
variable, and thanks to this, it can be easily adopted to languages with
different word order than English.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
This commit replaces `os.MkdirTemp` with `t.TempDir` in tests. The
directory created by `t.TempDir` is automatically removed when the test
and all its subtests complete.
Prior to this commit, temporary directory created using `os.MkdirTemp`
needs to be removed manually by calling `os.RemoveAll`, which is omitted
in some tests. The error handling boilerplate e.g.
defer func() {
if err := os.RemoveAll(dir); err != nil {
t.Fatal(err)
}
}
is also tedious, but `t.TempDir` handles this for us nicely.
Reference: https://pkg.go.dev/testing#T.TempDir
Signed-off-by: Eng Zer Jun <engzerjun@gmail.com>
Showing all folders from disconnected or paused remote devices as
unaccepted would be a lot of false positives. As we cannot know
whether the remote has accepted while it doesn't have an active
connection, let's better report false negatives, as in assuming the
folders are accepted.
* lib/api: Note ItemStarted and ItemFinished for default filtering.
The reasoning why LocalChangeDetected and RemoteChangeDetected events
are not included in the event stream by default (without explicit
filter mask requested) also holds for the ItemStarted and ItemFinished
events. They should be excluded as well when we start to break the
API compatibility for some reason.
* gui: Enumerate unused event types in the eventService.
Define constants for the unused event types as well, for completeness'
sake. They are intentionally not handled in the GUI currently.
* cmd/syncthing: Harmonize uppercase CLI argument placeholders.
Use ALL-UPPERCASE and connecting dashes to distinguish argument
placeholders from literal argument options (e.g. "cpu" or "heap" for
profiling). The dash makes it clear which words form a single
argument and where a new argument starts.
This style is already used for the "syncthing cli debug file" command.
* lib/model: Simplify event data structure.
Using map[string]interface{} is not necessary when all values are
known to be strings.
Having a separate mutex for the three or four instructions needed to
fetch and increment nextID means the overhead exceeds the cost of this
operation. nextID is now handled inside the critical section for
awaiting instead, while the more expensive channel creation has been
moved outside it.
This is mostly a simplification, though it may have minor performance
benefits in some situations. The single-threaded sender benchmark shows
no significant difference:
name old speed new speed delta
RequestsRawTCP-8 55.3MB/s ± 7% 56.6MB/s ± 6% ~ (p=0.190 n=10+10)
RequestsTLSoTCP-8 20.5MB/s ±20% 20.8MB/s ± 8% ~ (p=0.604 n=10+9)
Add a link next to each setting's label to its explanation in the Docs.
This way, it is easy to quickly check what the setting is about without
going to the Docs site separately and searching for it manually.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Right now, the Trash Can versioning info text is displayed for both the
Trash Can and Simple versioning. However, the Simple versioning has its
own info text that is also displayed, which results in two very similar
sentences being shown on the screen.
This commit limits the Trash Can info text to be displayed only when the
Trash Can versioning is selected, and moves the Simple versioning info
text up to the same location as the other one.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Even though technically possible, CJK languages normally don't use
italic text at all, as not only does it make the characters/letters look
unnatural, but also, in the case of complex characters, unreadable too.
For these reasons, it is usually recommended not to use the italic font
style at all [1][2].
This commit changes the default font-style of the i element for Chinese,
Japanese, and Korean langauge to "normal" instead of "italic". In order
to do so, the HTML lang attribute is also changed following each change
of the GUI language.
[1] https://bobtung.medium.com/best-practice-in-chinese-layout-f933aff1728f
[2] https://devblogs.microsoft.com/oldnewthing/20060914-02/?p=29743
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Staggered File Versioning used to have its own cleanInterval that
controlled how often file versions were cleaned. Nowadays, there is a
seperate setting called cleanupIntervalS responsible for the cleanup,
which applies to all File Versioning (except External). Thus, remove the
unneeded code and don't set the param up on new folders anymore.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
* gui: Allow to translate and fix incorrect Versions date filter ranges
Translate the previously English-only ranges used in Versions date
filter. In the process, fix the currently incorrect range calculation.
For instance, let us say it is 08:05. Selecting "today" should set the
range to start at 00:00 and end at 08:05. However, what really happens
is that both start and end are set to 08:05, and as a result "today" is
never shown to the user. The case is the same for "yesterday", which in
contrary to "today" is shown, but its range is fixed at 08:05 on the
previous day.
This commit fixes the above by always calculating "today" starting at
00:00 up to the current moment, and calculating "yesterday" from 00:00
on the previous to 00:00 on the current day.
When it comes to "last x days", the commit fixes the calculation so that
it actually covers the whole day, which is done by moving the start date
to 00:00 on the first day.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
The ignoreDelete warning code originally comprised of two sentences,
which in total were much longer than the current one. Because of that,
some additional fixes were added to make it present itself better, e.g.
white-space was set to normal to allow for text wrap on narrow screens,
and the help link was moved to a new line to make sure both the anchor
and the question mark always stayed together.
However, the code fixes remained despite the final text being much
shorter than the original. Therefore, remove the unnecessary white-space
formatting, and also move the help link right next to the warning. This
makes it clear that the link is related to this particular warning when
both it and the ignore patterns warning are displayed at the same time.
Ref: https://github.com/syncthing/syncthing/pull/8054#issuecomment-978148117
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
* gui: Translate fancytree messages in Versions modal
Currently, the default fancytree info/error messages are used. This
means that a) they are English-only, and b) they are very generic. With
this commit, the messages are added to the translatable strings, and
they are also more specifically related to file versioning.
On a side note, the "moreData" string has been left out on purpose, as
it is not used in the current code. It can be added later if needed.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
* gui: Make ID read-only and hide nearby devices when adding pending devices (fixes#8083)
Currently, there is no distinction between adding "new" and "pending"
devices. For this reason, the user is always presented with a list of
"nearby devices" to choose from. This commit adds such distinction to
the code, and in the case of "pending" device, both the device ID is
made read-only and the nearby devices list is hidden.
As a by-product of the function rename and clean-up, this commit also
hides the non-functional "remove" button that is shown when editing
device defaults.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
The intention was that if no peers are given, we shouldn't start the
listener. We did that anyway, because:
- splitting an empty string on comma returns a slice with one empty
string in it
- parsing the empty string as a device ID returns the empty device ID
so we end up with a valid replication peer which is the empty device ID.
* lib/protocol: Require at least 3.125% savings from compression
The new lz4 library doesn't need its output buffer to be the maximum
size, unlike the old one (which would allocate if it weren't). It can
take a buffer that is of a smaller size and will report if compressed
data can fit inside the buffer (with a small chance of reporting a false
negative). Use that property to our advantage by requiring compressed
data to be at most n-n/32 = .96875*n bytes long for n input bytes.
* lib/protocol: Remove unused receivers
To make DeepSource happy.
* lib/protocol: Micro-optimize lz4Compress
Only write the length if compression was successful. This is a memory
write, so the compiler can't reorder it.
Only check the return value of lz4.CompressBlock. Length-zero inputs
are always expanded by LZ4 compression (the library documents this),
so the check on len(src) isn't needed.
When GOBIN is set, 'go install' cannot install cross-compilied binaries.
To satisfy cross-compilation, it's necessary to add the '-o' to build
target, otherwise 'go build' will discarding the resulting objects when
compiling multiple packages.
Signed-off-by: bekcpear <i@bitbili.net>
* lib/model: Remove bogus fields from connections API endpoint.
Switch the returned data type for the /rest/system/connections element
"total" to use only the Statistics struct. The other fields of the
ConnectionInfo struct are not populated and misleading.
* Lowercase JSON field names.
* lib/model: Get rid of ConnectionInfo.MarshalJSON().
It was missing the StartedAt field from the embedded Statistics
struct. Just lowercasing the JSON attribute names can be done just as
easily with annotations.
* lib/model: Remove bogus startedAt field from totals.
Instead of using the Statistics type with one field empty, just switch
to a free-form map with the three needed fields.
* cmd/syncthing: Remove unnecessary function arguments.
The openGUI() function does not need a device ID to work, and there is
only one caller anyway which uses EmptyDeviceID.
The loadOrDefaultConfig() function is always called with the same
dummy values.
* cmd/syncthing: Avoid misleading info messages from monitor process.
In order to check whether panic reporting is enabled, the monitor
process utilizes the loadOrDefaultConfig() function. In case there is
no config file yet, info messages may be logged during creation if the
config Wrapper, which is discarded immediately after.
Stop using the DefaultConfig() utility function from lib/syncthing and
directly generate a minimal config instead to avoid these.
Add comments to loadOrDefaultConfig() explaining its limited purpose.
* cmd/syncthing/generate: Always write updated config file.
Previously, an existing config file was left untouched unless either
of the --gui-user or --gui-password options was given. Remove that
condition and simplify the checking code.
* lib/config: Factor out ProbeFreePorts().
* cmd/syncthing: Add option --skip-port-probing.
Applies to both the "generate" and "serve" subcommands, as well as the
deprecated --generate option, just as the --no-default-folder flag.
* cmd/syncthing: Remove unnecessary function arguments.
The openGUI() function does not need a device ID to work, and there is
only one caller anyway which uses EmptyDeviceID.
The loadOrDefaultConfig() function is always called with the same
dummy values.
* cmd/syncthing: Avoid misleading info messages from monitor process.
In order to check whether panic reporting is enabled, the monitor
process utilizes the loadOrDefaultConfig() function. In case there is
no config file yet, info messages may be logged during creation if the
config Wrapper, which is discarded immediately after.
Stop using the DefaultConfig() utility function from lib/syncthing and
directly generate a minimal config instead to avoid these.
Add comments to loadOrDefaultConfig() explaining its limited purpose.
* cmd/syncthing/generate: Always write updated config file.
Previously, an existing config file was left untouched unless either
of the --gui-user or --gui-password options was given. Remove that
condition and simplify the checking code.
Use indexOf instead of startsWith to make the now translatable theme
names appear correctly in IE11. This also prevents console log error
spam in the browser. The same problem was previously reported in #6940.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
When pathSep is a constant, the compiler precomputes pathSep+pathSep and
".."+pathSep instead of emitting function calls to compute "//" and
"../". Benchmark results in lib/osutil:
name old time/op new time/op delta
TraversesSymlink-8 8.86µs ± 3% 8.53µs ± 4% -3.79% (p=0.000 n=18+20)
name old alloc/op new alloc/op delta
TraversesSymlink-8 1.06kB ± 0% 1.06kB ± 0% ~ (all equal)
name old allocs/op new allocs/op delta
TraversesSymlink-8 15.0 ± 0% 15.0 ± 0% ~ (all equal)
The locking protocol in nat.Mapping was racy:
* Mapping.addressMap RLock'd, but then returned a map shared between
caller and Mapping, so the lock didn't do anything.
* Operations inside Service.{verifyExistingMappings,acquireNewMappings}
would lock the map for every update, but that means callers to
Mapping.ExternalAddresses can be looping over the map while the
Service methods are concurrently modifying it. When the Go runtime
detects that happening, it panics.
* Mapping.expires was read and updated without locking.
The Service methods now lock the map once and release the lock only when
done.
Also, subscribers no longer get the added and removed addresses, because
none of them were using the information. This was changed for a previous
attempt to retain the fine-grained locking and not reverted because it
simplifies the code.
Accept a subcommand as an alternative to the --generate option. It
accepts a custom config directory through either the --home or
--config options, using the default location if neither is given.
Add the options --gui-user and --gui-password to "generate", but not
the "serve --generate" option form. If either is given, an existing
config will not abort the command, but rather load, modify and save it
with the new credentials. The password can be read from standard
input by passing only a single dash as argument.
Config modification is skipped if the value matches what's already in
the config.
* cmd/syncthing: Utilize lib/locations package in generate().
Instead of manually joining paths with "magic" file names, get them
from the centralized locations helper lib.
* cmd/syncthing: Simplify logging for --generate option.
Visible change: No more timestamp prefixes.
What hash is used to store the password should ideally be an
implementation detail, so that every user of the GUIConfiguration
object automatically agrees on how to handle it. That is currently
distribututed over the confighandler.go and api_auth.go files, plus
tests.
Add the SetHasedPassword() / CompareHashedPassword() API to keep the
hashing method encapsulated. Add a separate test for it and adjust
other users and tests. Remove all deprecated imports of the bcrypt
package.
LoadOrGenerateCertificate() takes two file path arguments, but then
uses the locations package to determine the actual path. Fix that
with a minimally invasive change, by using the arguments instead.
Factor out GenerateCertificate().
The only caller of this function is cmd/syncthing, which passes the
same values, so this is technically a no-op.
* lib/tlsutil: Make storing generated certificate optional. Avoid
temporary cert and key files in tests, keep cert in memory.
Consistently use double dashes and fix typos -conf, -data-dir and
-verify.
Applies also to tests running the syncthing binary for consistency.
* Fix mismatched option name --conf in cli subcommand.
According to the source code comments, the cli option flags should
mirror those from the serve subcommand where applicable. That one is
actually called --config though.
* cli: Fix help text option placeholders.
The urfave/cli package uses the Value field of StringFlag to provide a
default value, not to name the placeholder. That is instead done with
backticks around some part of the Usage field.
* cli: Add missing --data flag in subcommand help text.
The urfave/cli based option parsing uses a fake flags collection to
generate help texts matching the used global options. But the --data
option was omitted from it, although it is definitely required when
using --config as well. Note that it cannot just be ignored, as some
debug stuff actually uses the DB:
syncthing cli --data=/bar --config=/foo debug index dump
By truncating time.Time to an int64 nanosecond count, we lose the
ability to precisely order timestamps before 1678 or after 2262, but we
gain (linux/amd64, Go 1.17.1):
name old time/op new time/op delta
JobQueuePushPopDone10k-8 2.85ms ± 5% 2.29ms ± 2% -19.80% (p=0.000 n=20+18)
JobQueueBump-8 34.0µs ± 1% 29.8µs ± 1% -12.35% (p=0.000 n=19+19)
name old alloc/op new alloc/op delta
JobQueuePushPopDone10k-8 2.56MB ± 0% 1.76MB ± 0% -31.31% (p=0.000 n=18+13)
name old allocs/op new allocs/op delta
JobQueuePushPopDone10k-8 23.0 ± 0% 23.0 ± 0% ~ (all equal)
Results for BenchmarkJobQueueBump are with the fixed version, which no
longer depends on b.N for the amount of work performed. rand.Rand.Intn
is cheap at ~10ns per iteration.
Like Windows and Mac, Android is also an interactive operating system.
On top of that, it usually runs on much slower hardware than the other
two. Because of that, it makes sense to limit the number of hashes used
by default there too.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Add each subdirectory of the guiDir as a translation candidate string.
The key is prefixed with "theme-name-" and the default English
translation corresponds to the directory name turned to title case.
Disable the automatic name mangling in the GUI JS code in favor of
just looking up the translation.
Registry.Get used a full sort to get the minimum of a list, and the sort
was broken because util.AddressUnspecifiedLess assumed it could find out
whether an address is IPv4 or IPv6 from its Network method. However,
net.(TCP|UDP)Addr.Network always returns "tcp"/"udp".
Currently, the default sorting of the file list in the Restore Versions
modal in both case sensitive, and it also does not distinguish between
files and folders. With this change, which uses a slightly modified code
from the fancytree itself (with added folder prioritisation), the sort
becomes case insensitive and also always places folders on top. This is
to make it behave more similar to what file managers do in the commonly
used operating systems (including popular Linux desktop environments).
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
This reverts commit cca17f5306.
Using textarea instead of input makes it possible to enter new lines,
which then are added to config.xml as "
". This breaks the whole
script, because these characters are passed to the command line as "\n".
Therefore, the script should rather remain a single-lined input field.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
The current detection is flawed, because it looks for a few specific
file systems like "msdos" or "fat" to set the mtime window, while in
reality Android seems to report names like "fuseblk", which can stand
for fat, ext4, or even f2fs.
At the moment, we set the mtime window only for a few known names used
for the fat filesystem. With this change, we take a safer approach of
always setting the time window unless we explicitly detect file systems
like ext2/ext3/ex4, which are known not to experience issues with moving
timestamps on Android.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
The list of unshared devices is built from deviceList(), which sorts
the result. But the shared devices are listed in undefined order from
the unsorted currentFolder.devices array. Apply the same sorting
after building the array used in the dialog.
Currently, the dismiss button is displayed as the first of the three
buttons. However, the most common action that the user wants to do when
sharing a new folder is to add it on a different device. Because of
this, the add button should be displayed first as the most prominent of
the three. The ignore button is the opposite of the add button, and also
results in a parmenent action, hence it makes sense to lump the two
together. Thus, the dismiss button should be moved to the last place as
an alternative to the two main actions, when the user is yet unsure what
they want to do with the notification.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
1. Change each modal title text to match the action that is being
executed (i.e. "Revert" to "Revert Local Additions", "Override" to
"Override Changes", "Delete" to "Delete Unexpected Items").
2. Change the icons to match the icons used by each action (i.e. arrow-
circle-down for Revert, arrow-circle-up for Override). Replace the
broken lock icon for Delete with minus-circle.
3. Rearrange the order in the modal HTML code to simplify it a little.
Before this patch, IPv4-compatible addresses (::ffff:aaa.bbb.ccc.ddd)
may be used if a quic6://some.domain:port is specified and both IPv4 and
IPv6 addresses exist for that domain name.
This changes the GC mechanism so that the first pass (which reads all
FileInfos to populate bloom filters with block & version hashes) can
happen concurrently with normal database operations.
The big gcMut still exists, and we grab it temporarily to block all
other modifications while we set up the bloom filters. We then release
the lock and let other things happen, with those other things also
updating the bloom filters as required. Once the first phase is done we
again grab the gcMut, knowing that we are the sole modifier of the
database, and do the cleanup.
I also removed the final compaction step.
* cmd/strelaypoolsrv: Fix minor grammar, use https in links
Add a few minor grammatical/stylistic fixes. Use `https` instead of
`http` in the MaxMind link in the footer.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
* wip
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Disable the Versions button when the folder is paused, because it does
not work, i.e. the versioned files are not loaded. The folder needs to
be unpaused to actually be able to view the versioned file list.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
* Trigger connection loop on config device addition (fixes#7600)
* Also check for device address equality
* Move EqualStrings from api_test to utils, and use in connections/service.go
* Make sure CommitConfiguration cannot block due on the deviceAddressesChanged channel
* Update lib/connections/service.go
Co-authored-by: Jakob Borg <jakob@kastelo.net>
* cmd/syncthing: Don't fail early on api setup error (fixes 7558)
* switch to factory pattern
* refactor config command to show help on nothing
* wip
* wip
* already abort in before
This makes us use TLS 1.3+ on sync connections by default. A new option
`insecureAllowOldTLSVersions` exists to allow communication with TLS
1.2-only clients (roughly Syncthing 1.2.2 and older). Even with that
option set you get a slightly simplified setup, with the cipher suite
order fixed instead of auto detected.
* cmd/syncthing: Don't fail early on api setup error (fixes 7558)
* switch to factory pattern
* refactor config command to show help on nothing
* wip
* wip
* already abort in before
No longer hide the web UI controls for the new untrusted/encrypted
device feature. Testing hasn't been very widespread, but there has been
some and quite a few bugs have been caught and fixed. I believe its time
to not hide it anymore, and cautiously recommend usage. E.g. mention
that the feature hasn't been widely used yet and anyone using it is an
early adopter, but drop the bit about not using it with production data.
We can maybe stress the need for backups in general and especially
using this.
Remove the animation due to its excessive CPU usage, especially when a
large number of files is being downloaded and listed at the same time.
Also, remove the stripes, as they serve no purpose in the now-static
progress bar.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
There was a logic mistake, so the limit in question wasn't used. On my
macOS this doesn't seem to matter, the hard limit returned is 2^63-1 and
setting the soft limit to that works. However I'm assuming that's not
the case for older macOSes since it was so nicely documented, so we
should still have this working. (10240 FDs should be enough for
anybody.)
This is a mostly pointless change to make security scanners and static
analysis tools happy, as they all hate seeing md5. None of our md5 uses
were security relevant, but still. Only visible effect of this change is
that our temp file names for very long file names become slightly longer
than they were previously...
The current text gives an impression that we are currently using a
Receive Encrypted folder, even if we are not. Thus, make the current
text displayed only when the folder is in fact Receive Encrypted, and
add a new string to be displayed when using different folder types.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
This adds a couple of dummy asset files protected by the "noassets"
build tag. The purpose is that it should be possible for, for example,
CI tools and static analysis things to compile and analyze the source
tree without our custom asset generation step. Also makes `go test -tags
noassets ./...` work without building assets first.
Disabled options are currently barely distinguishable from enabled
ones. This changes their background to grey, following the Bootstrap
defaults already used for disabled <select>.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
This truncates times meant for API consumption to second precision,
where fractions won't typically matter or add any value. Exception to
this is timestamps on logs and events, and of course I'm not touching
things like file metadata.
I'm not 100% certain this is an exhaustive change, but it's the things I
found by grepping and following the breadcrumbs from lib/api...
I also considered general-but-ugly solutions, like having the API
serializer itself do reflection magic or even regexps on returned
objects, but decided against it because aurgh...
This adds a button in the top right that changes the config back to the
default theme.
Code wise, it takes the header that was previously a part of the
dashboard component and moves it to the app component, and then adds the
button there. Possibly the header should be a component of it's own, but
that's more of refactor that can happen separately I think.
The config change uses the new config API to just patch the relevant
setting.
I'm not doing an automatic reload because 1) I don't want to figure out
how to do it correctly and 2) this doesn't work reliably anyway, as
for example the current gen GUI does a reload and ends up with
connection refused as the API service is still reloading...
* Provide a sysctl config to raise max UDP buffer size
* Add sysctl config to deb
* Check if `deb-systemd-invoke` is available
Co-authored-by: otbutz <tbutz@optitool.de>
This loosens the ‘is this localhost?’ check to include *.localhost host
names.
This allows for clearer (hence better) names to be used in browsers,
e.g. when accessing a remote syncthing instance ‘foo’ using a ssh port
forward, one can use foo.localhost to remind oneself which one is which.
💡 Without these changes, Syncthing shows a ‘Host check error’ when
pointing a browser at http://foo.localhost/, and with these changes, the
interface loads as usual.
The .localhost top level domain is a reserved top-level domain (RFC 2606):
> The ".localhost" TLD has traditionally been statically defined in
> host DNS implementations as having an A record pointing to the
> loop back IP address and is reserved for such use. Any other use
> would conflict with widely deployed code which assumes this use.
> – https://tools.ietf.org/html/rfc2606
As Wikipedia puts it:
> This allows the use of these names for either documentation purposes
or in local testing scenarios. – https://en.wikipedia.org/wiki/.localhost
On Linux systems, systemd-resolved resolves *.localhost, on purpose:
https://www.freedesktop.org/software/systemd/man/systemd-resolved.service.html
See also #4815, #4816.
* release:
all: Fix Microsoft documentation links in code comments (#7387)
gui: Handle info labels that are longer than available space (fixes#944) (#7386)
gui: Show "Last seen" at the top when device is disconnected (ref #7166) (#7373)
gui: Remove cleanupIntervalS leftovers from External Versioning (ref #7360) (#7378)
gui: Allow setting custom path for all versioning except external (#7377)
lib/fs: Consider options in case-fs caching (fixes#7371) (#7381)
lib/scanner: Pass on errors while hashing (#7380)
build: Update pfilter (#7376)
gui: Hide the Rescan All button when no folders exist (#7367)
lib/connections: Allow QUIC with Go 1.16 (#7372)
gui: Hide non-functional Versions button when using External Versioning (#7365)
gui, man, authors: Update docs, translations, and contributors
gui: Fix setting external versioning command (fixes#7361) (#7362)
lib/versioner: Improve error messages (fixes#7354) (#7357)
gui: Disable Cleanup Interval with External File Versioning as unsupported (#7360)
Apply to table headers the same code as already used for table data.
This way, the headers will be either pushed to the next line, or cut
with an ellipsis if the single word is too long.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Move the "Last seen" field to the very top in the device information.
This way, if a device has disconnected unexpectly, we can quickly check
the time when it was last available. Right now, due to the very long
address field, it is usually necessary to scroll down in order to view
the "Last seen" field.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
If there are no folders present, show only the "Add Folder" button, and
hide the "Rescan All" button. Only show the latter when at least one
folder exists.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Apply to table headers the same code as already used for table data.
This way, the headers will be either pushed to the next line, or cut
with an ellipsis if the single word is too long.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Move the "Last seen" field to the very top in the device information.
This way, if a device has disconnected unexpectly, we can quickly check
the time when it was last available. Right now, due to the very long
address field, it is usually necessary to scroll down in order to view
the "Last seen" field.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
If there are no folders present, show only the "Add Folder" button, and
hide the "Rescan All" button. Only show the latter when at least one
folder exists.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
The button does nothing when the External Versioning is being used, so
it should not be displayed at all to avoid confusing the users.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
As for right now, the External File Versioning does not support Cleanup
Interval. Therefore, the option should no be available at all when using
it.
Ref: https://forum.syncthing.net/t/16346
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
The button does nothing when the External Versioning is being used, so
it should not be displayed at all to avoid confusing the users.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
As for right now, the External File Versioning does not support Cleanup
Interval. Therefore, the option should no be available at all when using
it.
Ref: https://forum.syncthing.net/t/16346
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
An untrusted device will receive padded info for small blocks, and hence
sometimes request a larger block than actually exists on disk.
Previously we let this pass because we didn't have a hash to compare to
in that case and we ignored the EOF error based on that.
Now the untrusted device does pass an encrypted hash that we decrypt and
verify. This means we can't check for len(hash)==0 any more, but on the
other hand we do have a valid hash we can apply to the data we actually
read. If it matches then we don't need to worry about the read
supposedly being a bit short.
Benchmark results on Linux/amd64, using updated benchmark for old and
new:
name old time/op new time/op delta
HashFile-8 88.6ms ± 1% 88.3ms ± 1% -0.33% (p=0.046 n=19+19)
name old speed new speed delta
HashFile-8 201MB/s ± 1% 202MB/s ± 1% +0.33% (p=0.044 n=19+19)
name old alloc/op new alloc/op delta
HashFile-8 59.4kB ± 0% 46.1kB ± 0% -22.47% (p=0.000 n=14+20)
name old allocs/op new allocs/op delta
HashFile-8 29.0 ± 0% 27.0 ± 0% -6.90% (p=0.000 n=20+20)
Co-authored-by: greatroar <@>
* lib/db: Add ExpirePendingFolders().
Use-case is to drop any no-longer-pending folders for a specific
device when parsing its ClusterConfig message where previously offered
folders are not mentioned any more.
The timestamp in ObservedFolder is stored with only second precision,
so round to seconds here as well. This allows calling the function
within the same second of adding or updating entries.
* lib/model: Weed out pending folders when receiving ClusterConfig.
Filter the entries by timestamp, which must be newer than or equal to
the reception time of the ClusterConfig. For just mentioned ones,
this assumption will hold as AddOrUpdatePendingFolder() updates the
timestamp.
* lib/model, gui: Notify when one or more pending folders expired.
Introduce new event type FolderOfferCancelled and use it to trigger a
complete refreshCluster() cycle. Listing individual entries would be
much more code and probably just as much work to answer the API
request.
* lib/model: Add comment and rename ExpirePendingFolders().
* lib/events: Rename FolderOfferCancelled to ClusterPendingChanged.
* lib/model: Reuse ClusterPendingChanged event for cleanPending()
Changing the config does not necessarily mean that the
/resut/cluster/pending endpoints need to be refreshed, but only if
something was actually removed. Detect this and indicate it through
the ClusterPendingChanged event, which is already hooked up to requery
respective endpoints within the GUI.
No more need for a separate refreshCluster() in reaction to
ConfigSaved event or calling refreshConfig().
* lib/model: Gofmt.
* lib/db: Warn instead of info log for failed removal.
* gui: Fix pending notifications not loading on GUI start.
* lib/db: Use short device ID in log message.
* lib/db: Return list of expired folder IDs after deleting them.
* lib/model: Refactor Pending...Changed events.
* lib/model: Adjust format of removed pending folders enumeration.
Use an array of objects with device / folder ID properties, matching
the other places where it's used.
* lib/db: Drop invalid entries in RemovePendingFoldersBeforeTime().
* lib/model: Gofmt.
My local gofmt did not complain here, strangely...
* gui: Handle PendingDevicesChanged event.
Even though it currently only holds one device at a time, wrap the
contents in an array under the "added" property name.
* lib/model: Fix null values in PendingFoldersChanged removed member.
* gui: Handle PendingFoldersChanged event.
* lib/model: Simplify construction of expiredPendingList.
* lib/model: Reduce code duplication in cleanPending().
Use goto and a label for the common parts of calling the DB removal
function and building the event data part.
* lib/events, gui: Mark ...Rejected events deprecated.
Extend comments explaining the conditions when the replacement event
types are emitted.
* lib/model: Wrap removed devices in array of objects as well.
* lib/db: Use iter.Value() instead of needless db.Get(iter.Key())
* lib/db: Add comment explaining RemovePendingFoldersBeforeTime().
* lib/model: Rename fields folderID and deviceID in event data.
* lib/db: Only list actually expired IDs as removed.
Skip entries where Delete() failed as well as invalid entries that got
removed automatically.
* lib/model: Gofmt
This splits the ignore getting to two methods, one that loads from disk
(the old one) and one that just returns whatever is already loaded (the
new one). The folder summary service which is just interested in stats
now uses the latter method. This means that it, and API calls that call
it, does not get blocked by folder I/O.
This adds two new configuration options:
// The number of connections at which we stop trying to connect to more
// devices, zero meaning no limit. Does not affect incoming connections.
ConnectionLimitEnough int
// The maximum number of connections which we will allow in total, zero
// meaning no limit. Affects incoming connections and prevents
// attempting outgoing connections.
ConnectionLimitMax int
These can be used to limit the number of concurrent connections in
various ways.
This adds a statistic to track the last connection duration per device.
It isn't used for much in this PR, but it's available for #7223 to use
in deciding how to order device connection attempts (deprioritizing
devices that just dropped our connection the last time).
The test would fail if the umask on UNIX is greater than 0022, because
the OS transparently subtracts it from the mode passed to Mkdir(), as
the Go documentation confirms.
Our goal here is not to test os.Mkdir(), so just make sure the desired
mode is actually set by forcing it afterwards.
This breaks out some methods from the connection loop to make it simpler
to manage and understand.
Some slight simplifications to remove the `seen` variable (we can filter
`nextDial` based on times are in the future or not, so we don't need to
track `seen`) and adding a minimum loop interval (5s) in case some
dialer goes haywire and requests a 0s redial interval or such.
Otherwise no significant behavioral changes.
This does two things:
- Exclude QUIC from go1.16 builds, automatically, for now, since it
doesn't work and just panics.
- Provide some fake listeners and dialers when QUIC is disabled.
These fake listeners and dialers indicate that they are disabled and
unsupported, which silences "Dialing $address: unknown address scheme:
quic" type of stuff which is not super helpful to the user.
This fixes a regression by restoring two functions removed in commit
a20d85d451, but still used from the HTML
template. Adjust the restored versions to access the new flag storage
structure.
The replacement functions selectAllSharedFolders() and
selectAllUnrelatedFolders() are not functional, so this is just a
quick fix to restore a working state before making the new functions
actually work sensibly.
Just like the respective functions for sharing device selections, give
it a boolean argument instead of writing two almost identical
functions.
In line with the other selectAll...() functions, avoid calling
angular.forEach() and iterate over the folders object directly.
This fixes a regression by restoring two functions removed in commit
a20d85d451, but still used from the HTML
template. Adjust the restored versions to access the new flag storage
structure.
The replacement functions selectAllSharedFolders() and
selectAllUnrelatedFolders() are not functional, so this is just a
quick fix to restore a working state before making the new functions
actually work sensibly.
Just like the respective functions for sharing device selections, give
it a boolean argument instead of writing two almost identical
functions.
In line with the other selectAll...() functions, avoid calling
angular.forEach() and iterate over the folders object directly.
When using a Web browser with JavaScript either disabled or unavailable,
show a warning to let the user know that the Web GUI requires JS in
order to operate.
To achieve this, add a <div> that wraps both the navbar and the main
content, and then move the CSS class ng-cloak from the <html> element to
that <div>. This way, only the JavaScript-dependent part is hidden when
JS is unavailable, and not the whole website, as it is the case right
now. Then, add a <noscript> element right at the start of the <body>
element, so that the warning is also shown right away in text-based Web
browsers. The <noscript> element includes a stripped down version of the
navbar showing only the Syncthing logo, and then a container with the
warning itself. Lastly, leave the footer untouched and always visible,
because it does not rely on JavaScript at all.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
Co-authored-by: Jakob Borg <jakob@kastelo.net>
This removes the switch for using a Badger database, because it has bugs
that it seems there is no interest in fixing, and no actual bug tracker
to track them in.
It retains the actual implementation for the sole purpose of being able
to do the conversion back to LevelDB if anyone is actually running with
USE_BADGER. At some point in a couple of versions we can remove the
implementation as well.
Add specific errors for the failures, resulting in this rather than just
the generic "invalid filename":
[MRIW7] 08:50:50 INFO: Puller (folder default, item "NUL"): syncing: filename is invalid: name is reserved
[MRIW7] 08:50:50 INFO: Puller (folder default, item "fail."): syncing: filename is invalid: name ends with space or period
[MRIW7] 08:50:50 INFO: Puller (folder default, item "sup:yo"): syncing: filename is invalid: name contains reserved character
[MRIW7] 08:50:50 INFO: default: Failed to sync 3 items
Use the IoctlFileClone and IoctlFileCloneRange ioctl wrappers and the
FileCloneRange type provided by golang.org/x/sys/unix instead of
locally implementing them. This also allows to re-enable the code for
ppc/ppc64/ppc64le again (see commit 758a1a6a37 ("lib/fs: Disable ioctl
on ppc (fixes#6898) (#6901)")) since golang.org/x/sys/unix internally
uses the correct FICLONE and FICLONERANGE values depending on $GOARCH.
Most notably, it now detects all-lowercase files and returns these
as-is. The tests have been expanded with two cases and are now used
as a benchmark (admittedly a rather trivial one).
name old time/op new time/op delta
UnicodeLowercaseMaybeChange-8 4.59µs ± 2% 4.57µs ± 1% ~ (p=0.197 n=10+10)
UnicodeLowercaseNoChange-8 3.26µs ± 1% 3.09µs ± 1% -5.27% (p=0.000 n=9+10)
This changes the cache to cache less things, yet retain the required
efficiency for our walk usecase. This uses less memory.
Specifically, instead of keeping result and child caches for each path
level, only keep a single cached child. In practice our operations are
depth-first, or almost depth-first, and then we retain the same hit
ratio for a smaller cache size.
I improved the benchmark so that it counts the Lstat and DirNames
operations performed, and they do not change significantly. The amount
of allocated memory is reduced by 20% and the walk itself is actually
slightly faster.
This also removes the clear based on number of cached names (as that is
not a thing any more) and the timer based clear (which was unused). This
means we'll retain the last cache state forever until it's cleared by a
write operation, but we did that before too and that state is now a lot
smaller...
The overhead compared to not using a casefs, for our typical "double
walk" (walk the tree then stat everything again) is 2x the dirnames we
would otherwise call, and no overhead on the stats (unchanged from old
implementation)
```
name old time/op new time/op delta
WalkCaseFakeFS100k/rawfs-8 306ms ± 1% 305ms ± 2% ~ (p=0.182 n=9+10)
WalkCaseFakeFS100k/casefs-8 579ms ± 5% 557ms ± 1% -3.77% (p=0.000 n=10+10)
name old B/entry new B/entry delta
WalkCaseFakeFS100k/rawfs-8 590 ± 0% 590 ± 0% ~ (all equal)
WalkCaseFakeFS100k/casefs-8 1.09k ± 0% 0.87k ± 0% -19.98% (p=0.000 n=10+10)
name old DirNames/entry new DirNames/entry delta
WalkCaseFakeFS100k/rawfs-8 0.51 ± 0% 0.51 ± 0% ~ (all equal)
WalkCaseFakeFS100k/casefs-8 1.02 ± 0% 1.02 ± 0% ~ (all equal)
name old DirNames/op new DirNames/op delta
WalkCaseFakeFS100k/rawfs-8 51.2k ± 0% 51.2k ± 0% ~ (all equal)
WalkCaseFakeFS100k/casefs-8 102k ± 0% 102k ± 0% ~ (all equal)
name old Lstat/entry new Lstat/entry delta
WalkCaseFakeFS100k/rawfs-8 3.02 ± 0% 3.02 ± 0% ~ (all equal)
WalkCaseFakeFS100k/casefs-8 3.02 ± 0% 3.02 ± 0% ~ (all equal)
name old Lstat/op new Lstat/op delta
WalkCaseFakeFS100k/rawfs-8 302k ± 0% 302k ± 0% ~ (all equal)
WalkCaseFakeFS100k/casefs-8 302k ± 0% 302k ± 0% ~ (all equal)
name old allocs/entry new allocs/entry delta
WalkCaseFakeFS100k/rawfs-8 15.7 ± 0% 15.7 ± 0% ~ (all equal)
WalkCaseFakeFS100k/casefs-8 27.5 ± 0% 26.1 ± 0% -5.09% (p=0.000 n=10+10)
name old ns/entry new ns/entry delta
WalkCaseFakeFS100k/rawfs-8 2.02k ± 1% 2.02k ± 2% ~ (p=0.163 n=9+10)
WalkCaseFakeFS100k/casefs-8 3.83k ± 5% 3.68k ± 1% -3.77% (p=0.000 n=10+10)
name old alloc/op new alloc/op delta
WalkCaseFakeFS100k/rawfs-8 89.2MB ± 0% 89.2MB ± 0% ~ (p=0.364 n=9+10)
WalkCaseFakeFS100k/casefs-8 164MB ± 0% 131MB ± 0% -19.97% (p=0.000 n=10+10)
name old allocs/op new allocs/op delta
WalkCaseFakeFS100k/rawfs-8 2.38M ± 0% 2.38M ± 0% ~ (all equal)
WalkCaseFakeFS100k/casefs-8 4.16M ± 0% 3.95M ± 0% -5.05% (p=0.000 n=10+10)
```
Since iterators must be released before committing or discarding a
transaction we have the pattern of both deferring a release plus doing
it manually. But we can't release twice because we track this with a
WaitGroup that will panic when there are more Done()s than Add()s. This
just adds a boolean to let an iterator keep track.
Use indexOf() == 0 instead of startsWith() to maintain compatibility
and prevent JavaScript error console spam in the Web GUI when used in
Internet Explorer 11 under Windows 7.
Signed-off-by: Tomasz Wilczyński <twilczynski@naver.com>
We created a new fileset before stopping the folder during restart. When
we create that fileset it loads the current metadata and sequence
numbers from the database. But the folder may have time to update those
before stopping, leaving the new fileset with bad data.
This would cause wrong accounting (forgotten files) and potentially
sequence reuse causing files not sent to other devices.
This change reuses the fileset on restart, skipping the issue entirely.
It also moves the creation of the fileset back under the lock so there
should be no chance of concurrency issues here.
We created a new fileset before stopping the folder during restart. When
we create that fileset it loads the current metadata and sequence
numbers from the database. But the folder may have time to update those
before stopping, leaving the new fileset with bad data.
This would cause wrong accounting (forgotten files) and potentially
sequence reuse causing files not sent to other devices.
This change reuses the fileset on restart, skipping the issue entirely.
It also moves the creation of the fileset back under the lock so there
should be no chance of concurrency issues here.
The FileSet.Drop operation in there needs to potentially update a whole lot of global lists, which can take a while (longer than the deadlock interval apparently)
When cap(permanentRelays) >= len(permanentRelays) + len(knownRelays),
append(permanentRelays, knownRelays...)
returns a slice of the array underlying permanentRelays. The subsequent
rand.Shuffle then mixes the permanent and known relays. Sequential
requests may cause strelaypoolsrv to forget its permanent relays. Worse,
concurrent requests may cause shuffling of the same slice on multiple
processors concurrently.
Co-authored-by: greatroar <@>
* Add clean up for Simple File Versioning pt.1
created test
* Add clean up for Simple File Versioning pt.2
Passing the test
* stuck on how javascript communicates with backend
* Add trash clean up for Simple File Versioning
Add trash clean up functionality of to allow the user to delete backups
after specified amount of days.
* Fixed html and js style
* Refactored cleanup test cases
Refactored cleanup test cases to one file and deleted duplicated code.
* Added copyright to test file
* Refactor folder cleanout to utility function
* change utility function to package private
* refactored utility function; fixed build errors
* Updated copyright year.
* refactor test and logging
* refactor html and js
* revert style change in html
* reverted changes in html and some js
* checkout origin head version edit...html
* checkout upstream master and correct file
Quoting the manual:
-trimpath
remove all file system paths from the resulting executable.
Instead of absolute file system paths, the recorded file names
will begin with either "go" (for the standard library),
or a module path@version (when using modules),
or a plain import path (when using GOPATH).
That is, when we panic, instead of:
goroutine 1 [running]:
main.main()
/Users/jb/dev/syncthing/syncthing/cmd/syncthing/main.go:272 +0x116
we get:
goroutine 1 [running]:
main.main()
github.com/syncthing/syncthing@/cmd/syncthing/main.go:272 +0x116
(Module path and file path within module.)
Our authentication is based on device ID (certificate fingerprint) but
we also check the certificate name for ... historical extra security
reasons. (I don't think this adds anything but it is what it is.) Since
that check breaks in Go 1.15 this change does two things:
- Adds a manual check for the peer certificate CommonName, and if they
are equal we are happy and don't call the more advanced
VerifyHostname() function. This allows our old style certificates to
still pass the check.
- Adds the cert name "syncthing" as a DNS SAN when generating the
certificate. This is the correct way nowadays and makes VerifyHostname()
happy in Go 1.15 as well, even without the above patch.
Apparently our Tags field depended on having specific files react to
tags and add themselves there. This, instead, works for all tags.
Also, pass tags to the test command line.
The QUIC package is notorious for being incompatible with either too
old or too new Go releases. Currently it doesn't build with Go 1.15 RC
and I want to test the rest with Go 1.15. With this I can do `go run
build.go --tags noquic` to do that.
With this change we emulate a case sensitive filesystem on top of
insensitive filesystems. This means we correctly pick up case-only renames
and throw a case conflict error when there would be multiple files differing
only in case.
This safety check has a small performance hit (about 20% more filesystem
operations when scanning for changes). The new advanced folder option
`caseSensitiveFS` can be used to disable the safety checks, retaining the
previous behavior on systems known to be fully case sensitive.
Co-authored-by: Jakob Borg <jakob@kastelo.net>
Prompted by https://forum.syncthing.net/t/infinite-filesystem-recursion-detected/15285. In my opinion the filesystem shouldn't throw warnings but pass on errors for the caller to decide what's to be happening with it. Right now in this PR an infinite recursion is a normal scan error, i.e. folder is in failed state and displays failed items, but no warning. I think that's appropriate but if deemed appropriate an additional warning can be thrown in the scanner.
message:`panic: filling Blocks: read C:\Users\Serv-Resp-Tizayuca\AppData\Local\Syncthing\index-v0.14.0.db\006561.ldb: Error de datos (comprobación de redundancia cíclica).`,
exp:`panic: filling Blocks: read x: Error de datos (comprobación de redundancia cíclica).`,
"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 Ключ",
"About":"За програмата",
"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":"Ключ за ППИ",
"About":"Относно",
"Action":"Действие",
"Actions":"Меню",
"Add":"Добави",
"Add Device":"Добави устройство",
"Add Folder":"Добави папка",
"Add Remote Device":"Добави ново устройство",
"Add devices from the introducer to our device list, for mutually shared folders.":"Добавяне на нови устройства през устройства предлагащи други устройства, за взаимно споделени папки.",
"Add new folder?":"Добави нова папка?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.":"Също така интервалът за повторно сканиране ще бъде увеличен (60 пъти, пр. новият интервал бъде 1ч). Освен това може да го зададете и ръчно за всяка папка след като изберете Не.",
"Actions":"Действия",
"Add":"Добавяне",
"Add Device":"Добавяне на устройство",
"Add Folder":"Добавяне на папка",
"Add Remote Device":"Добавяне на устройство",
"Add devices from the introducer to our device list, for mutually shared folders.":"Добавяйте устройства през поръчителите за взаимно споделени папки.",
"Add ignore patterns":"Добавяне на шаблони за пренебрегване",
"Add new folder?":"Добавяне на тази папка?",
"Additionally the full rescan interval will be increased (times 60, i.e. new default of 1h). You can also configure it manually for every folder later after choosing No.":"Също така интервалът за повторно обхождане ще бъде увеличен (60 пъти, пр. новият интервал бъде 1ч). Освен това може да го зададете и ръчно за всяка папка след като изберете Не.",
"Allow Anonymous Usage Reporting?":"Разрешаване изпращането на анонимни статистически данни?",
"All Time":"През цялото време",
"All folders shared with this device must be protected by a password, such that all sent data is unreadable without the given password.":"Всички папки, споделени с устройството трябва да бъдат защитени с парола, така че данните да са недостъпни без нея.",
"Allow Anonymous Usage Reporting?":"Разрешаване на анонимното отчитане на употребата?",
"Allowed Networks":"Разрешени мрежи",
"Alphabetic":"Азбучен ред",
"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?":"Форматът на анонимния доклад е променен. Желаете ли да преминете към новия формат?",
"Are you sure you want to remove device {%name%}?":"Сигурни ли сте, че искате да премахнете устройството {{name}}?",
"Are you sure you want to remove folder {%label%}?":"Сигурни ли сте, че искате да премахнете папката {{label}}?",
"Are you sure you want to restore {%count%} files?":"Сигурни ли сте, че искате да възстановите файла {{count}}?",
"Are you sure you want to upgrade?":"Are you sure you want to upgrade?",
"Altered by ignoring deletes.":"Пренебрегнати са премахнати файлове.",
"An external command handles the versioning. It has to remove the file from the shared folder. If the path to the application contains spaces, it should be quoted.":"Външна команда управлява версиите. Тя трябва да премахне файла от синхронизираната папка. Ако в пътя до приложението има интервали, то той трябва да бъде поставен в кавички.",
"Anonymous Usage Reporting":"Анонимно отчитане на употреба",
"Anonymous usage report format has changed. Would you like to move to the new format?":"Форматът на данните за анонимно отчитане на употреба е променен. Желаете ли да използвате него вместо стария?",
"Apply":"Прилагане",
"Are you sure you want to override all remote changes?":"Сигурни ли сте, че желаете да отмените всички промени, направени отдалечено?",
"Are you sure you want to permanently delete all these files?":"Сигурни ли сте, че желаете всички тези файлове да бъдат безвъзвратно премахнати?",
"Are you sure you want to remove device {%name%}?":"Сигурни ли сте, че желаете устройството {{name}} да бъде премахнато?",
"Are you sure you want to remove folder {%label%}?":"Сигурни ли сте, че желаете папката {{label}} да бъде премахната?",
"Are you sure you want to restore {%count%} files?":"Сигурни ли сте, че желаете {{count}} файла да бъдат възстановени?",
"Are you sure you want to revert all local changes?":"Сигурни ли сте, че желаете всички местни промени да бъдат отменени?",
"Are you sure you want to upgrade?":"Желаете ли приложението да бъде обновено?",
"Automatic upgrade now offers the choice between stable releases and release candidates.":"Автоматичното обновяване вече предлага избор между стабилни версии и кандидат версии.",
"Automatic Crash Reporting":"Автоматично изпращане на доклад за срив",
"Automatic upgrade now offers the choice between stable releases and release candidates.":"Автоматичното обновяване вече предлага избор между стабилни и предварителни издания.",
"Automatic upgrades":"Автоматично обновяване",
"Automatic upgrades are always enabled for candidate releases.":"Automatic upgrades are always enabled for candidate releases.",
"Automatically create or share folders that this device advertises at the default path.":"Автоматично създаване или споделяне на папки, които това устройство предлага в пътя по подразбиране.",
"Available debug logging facilities:":"Дебъгинг функционалност на разположение:",
"Automatic upgrades are always enabled for candidate releases.":"Автоматичното обновяване е винаги включено за предварителните издания.",
"Automatically create or share folders that this device advertises at the default path.":"Автоматично създава в подразбираната папка или споделя папките, които устройството предлага.",
"Available debug logging facilities:":"Достъпни улеснения при отстраняване на дефекти:",
"Be careful!":"Внимание!",
"Bugs":"Бъгове",
"Changelog":"Списък с промени",
"Clean out after":"Изчисти след",
"Click to see discovery failures":"Натиснете, за да видите грешки при откриването",
"Close":"Затвори",
"Bugs":"Дефекти",
"Cancel":"Отказ",
"Changelog":"Дневник на промените",
"Clean out after":"Почистване след",
"Cleaning Versions":"Почистване на версии",
"Cleanup Interval":"Интервал на почистване",
"Click to see full identification string and QR code.":"Преглед на идентификатор и код за QR.",
"Close":"Затваряне",
"Command":"Команда",
"Comment, when used at the start of a line":"Коментар, използван в началото на реда",
"Comment, when used at the start of a line":"Коментар, когато се използва в началото на реда",
"Compression":"Компресиране",
"Configured":"Настроен",
"Connected (Unused)":"Connected (Unused)",
"Connection Error":"Грешка при свързването",
"Connection Type":"Вид връзка",
"Connected (Unused)":"Свързано (неизползвано)",
"Connection Error":"Грешка при осъществяване на връзка",
"Connection Type":"Вид на връзката",
"Connections":"Връзки",
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.":"Постоянния мониторинг за промени вече е част от Syncthing. При промени по файловете се стартира сканиране само за променените папки. Ползите са, че промените биват синхронизирани по-бързо, без да се изисква цялостно сканирания на папките.",
"Copied from elsewhere":"Копиране от някъде другаде",
"Creating ignore patterns, overwriting an existing file at {%path%}.":"Създаване на шаблони за игнориране, презаписване на съществуващ файл в {{path}}.",
"Currently Shared With Devices":"Currently Shared With Devices",
"Continuously watching for changes is now available within Syncthing. This will detect changes on disk and issue a scan on only the modified paths. The benefits are that changes are propagated quicker and that less full scans are required.":"Syncthing вече разполага с постоянно наблюдение за промени. Така се отчитат промените на дисковото устройство и се обхождат само повлияните папки. Ползите са, че промените се разпространяват по-бързо и с по-малко на брой пълни обхождания.",
"Copied from elsewhere":"Копирано от другаде",
"Copied from original":"Копирано от източника",
"Currently Shared With Devices":"Устройства, с които е споделена",
"Custom Range":"В периода",
"Danger!":"Опасност!",
"Debugging Facilities":"Дебъг функционалност",
"Default Folder Path":"Път до папка по подразбиране",
"Deleted":"Изтрито",
"Deselect All":"Никое",
"Deselect devices to stop sharing this folder with.":"Deselect devices to stop sharing this folder with.",
"Debugging Facilities":"Отстраняване на дефекти",
"Default Configuration":"Настройки по подразбиране",
"Default Device":"Устройство по подразбиране",
"Default Folder":"Папка по подразбиране",
"Default Ignore Patterns":"Подразбирани шаблони за пренебрегване",
"Defaults":"Подразбирани",
"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 ID":"Идентификатор на устройство",
"Device Identification":"Идентификатор на устройството",
"Device Identification":"Идентификатор на устройство",
"Device Name":"Име на устройството",
"Device rate limits":"Device rate limits",
"Device is untrusted, enter encryption password":"Устройството е недоверено, въведете парола за шифроване",
"Device rate limits":"Ограничаване на скоростта",
"Device that last modified the item":"Устройство, което последно промени обекта",
"Disabled periodic scanning and disabled watching for changes":"Периодичните сканирания и наблюденията за промяна са деактивирани.",
"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).":"Disables comparing and syncing file permissions. Useful on systems with nonexistent or custom permissions (e.g. FAT, exFAT, Synology, Android).",
"Discard":"Discard",
"Disable Crash Reporting":"Изключване на доклада за срив",
"Disabled":"Изключено",
"Disabled periodic scanning and disabled watching for changes":"Изключено периодично обхождане и изключено наблюдение за промени",
"Disabled periodic scanning and enabled watching for changes":"Изключено периодично обхождане и включено наблюдение за промени",
"Disabled periodic scanning and failed setting up watching for changes, retrying every 1m:":"Изключено периодично обхождане и грешка при започване на наблюдението за промени, прави се опит всяка минута:",
"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":"Отказване",
"Disconnected":"Не е свързано",
"Disconnected (Unused)":"Disconnected (Unused)",
"Disconnected (Unused)":"Не е свързано (неизползвано)",
"Discovered":"Открит",
"Discovery":"Откриване",
"Discovery Failures":"Грешка в откриването",
"Do not restore":"Не възстановявай",
"Do not restore all":"Не възстановявай всички",
"Do you want to enable watching for changes for all your folders?":"Желаете ли да активирате наблюдението за промени на всички папки?",
"Discovery Failures":"Грешка при откриване",
"Discovery Status":"Състояние на откриване",
"Dismiss":"Отхвърляне",
"Do not add it to the ignore list, so this notification may recur.":"Да не бъде добавяна в списъка за пренебрегване, така че да има повторно запитване.",
"Do not restore":"Без възстановяване",
"Do not restore all":"Без възстановяване всички",
"Do you want to enable watching for changes for all your folders?":"Желаете ли да наблюдението за промени да бъде включено за всички папки?",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.":"Въведете не отрицателно число (пр. \"2.35\") и изберете единица.\nПроцентите са като част от размера на цялото дисково пространство.",
"Enter a non-privileged port number (1024 - 65535).":"Въведете непривилегирован номер на порт (1024-65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.":"Въведете адреси разделени със запетая (\"tcp://ip:port\", \"tcp://host:port\") или \"dynamic\", за автоматично откриване на наличните адреси.",
"Enter ignore patterns, one per line.":"Добавете шаблони за игнориране, по един на ред.",
"Enter up to three octal digits.":"Enter up to three octal digits.",
"Enable Crash Reporting":"Включване на доклад за срив",
"Enable NAT traversal":"Преминаване през NAT",
"Enable Relaying":"Ретранслация",
"Enabled":"Включено",
"Enter a non-negative number (e.g., \"2.35\") and select a unit. Percentages are as part of the total disk size.":"Въведете положително число (например „3.14“) и изберете единица мярка. Процентите са части от цялото дисково пространство.",
"Enter a non-privileged port number (1024 - 65535).":"Въведете номер на непривилегирован порт (1024-65535).",
"Enter comma separated (\"tcp://ip:port\", \"tcp://host:port\") addresses or \"dynamic\" to perform automatic discovery of the address.":"Въведете адреси, разделени със запетая („tcp://ip:port“, „tcp://host:port“) или „dynamic“, за автоматично откриване на наличните адреси.",
"Enter ignore patterns, one per line.":"Въведете шаблони за пренебрегване, по един на ред.",
"Enter up to three octal digits.":"Въведете до три осмични цифри.",
"Error":"Грешка",
"External File Versioning":"Външно управление на версиите",
"Failed Items":"Неуспешни",
"Failed to setup, retrying":"Неуспешно конфигуриране, правенe на повторен опит",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.":"Неуспешна връзка към IPv6 сървъри може да се очаква ако няма IPv6 свързаност.",
"File Pull Order":"Ред на сваляне",
"External":"Външни",
"External File Versioning":"Външно управление на версии",
"Failed Items":"Елементи с грешка",
"Failed to load file versions.":"Грешка при зареждане на версии.",
"Failed to load ignore patterns.":"Грешка при зареждане на шаблони за пренебрегване.",
"Failed to setup, retrying":"Грешка при настройване, извършва се повторен опит",
"Failure to connect to IPv6 servers is expected if there is no IPv6 connectivity.":"Неуспешна връзка към сървъри по IPv6 може да се очаква ако няма свързаност по IPv6.",
"File Pull Order":"Ред на изтегляне",
"File Versioning":"Версии на файловете",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.":"Файловете биват преместени в .stversions папка, когато са заменени или изтрити от Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.":"Когато Syncthing замени или изтрие файл той бива преместен в папката .stversions и преименуван - с добавяне на дата и час.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.":"Защитава локалните файловете от промени направени на други устройства, но промените направени на това устройство ще бъдат синхронизирани с останалите устройства.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.":"Промените направени на други устройства ще бъдат прилагани локално, но локалните промени няма да бъдат синхронизирани с останалите устройства.",
"Files are moved to .stversions directory when replaced or deleted by Syncthing.":"Файловете биват преместени в папка .stversions при заменяне или изтриване от Syncthing.",
"Files are moved to date stamped versions in a .stversions directory when replaced or deleted by Syncthing.":"Когато Syncthing замени или изтрие файл той бива преместен в папката .stversions и преименуван чрез добавяне на датата и часа.",
"Files are protected from changes made on other devices, but changes made on this device will be sent to the rest of the cluster.":"Предпазва местните файлове от промени, идващи от другите устройства, но местните промени се изпращат.",
"Files are synchronized from the cluster, but any changes made locally will not be sent to other devices.":"Файловете се синхронизират от другите устройства, но местните промени не се изпращат.",
"Filesystem Watcher Errors":"Грешка при наблюдаване на файловата система",
"Filter by date":"Филтриране по дата",
"Filter by name":"Филтриране по име",
"Folder":"Папка",
"Folder ID":"Идентификатор на папката",
"Folder Label":"Име на папката",
"Folder Path":"Път до папката",
"Folder Type":"Вид папка",
"Folder Type":"Вид на папката",
"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.",
"Full Rescan Interval (s)":"Интервал(и) за периодичното сканиране",
"GUI":"Потребителски интерфейс",
"For the following folders an error occurred while starting to watch for changes. It will be retried every minute, so the errors might go away soon. If they persist, try to fix the underlying issue and ask for help if you can't.":"Грешка при започване на наблюдението за промени на следните папки. Всяка минута ще бъде извършван нов опит, така че грешката скоро може да изчезне. Ако все пак не изчезне, отстранете нейната първопричина или потърсете помощ ако не съумявате.",
"Forever":"Завинаги",
"Full Rescan Interval (s)":"Интервал на пълно обхождане (секунди)",
"GUI":"Графичен интерфейс",
"GUI Authentication Password":"Парола за интерфейса",
"GUI Authentication User":"Потребител за интерфейса",
"GUI Authentication: Set User and Password":"GUI Authentication: Set User and Password",
"GUI Listen Address":"Адрес на слушане на GUI-то",
"GUI Theme":"Тема запотребителския интерфейс",
"GUI Authentication: Set User and Password":"Удостоверяване на графичния интерфейс: потребител и парола",
"GUI Listen Address":"Адрес на слушане",
"GUI Theme":"Тема награфичния интерфейс",
"General":"Общи",
"Generate":"Генерирай",
"Generate":"Подновяване",
"Global Discovery":"Глобално откриване",
"Global Discovery Servers":"Сървъри за глобално откриване",
"Global State":"Глобално състояние",
"Help":"Помощ",
"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.",
"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.":"If you want to prevent other users on this computer from accessing Syncthing and through it your files, consider setting up authentication.",
"Ignore":"Игнорирай",
"Ignore Patterns":"Шаблони за игнориране",
"Ignore Permissions":"Игнорирай правата за достъп",
"Ignored Devices":"Игнорирани устройства",
"Ignored Folders":"Игнорирани папки",
"Ignored at":"Ignored at",
"Incoming Rate Limit (KiB/s)":"Лимит на скоростта за сваляне (KiB/s)",
"Home page":"Страница",
"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, а чрез него и до файловете ви, помислете за удостоверяване на графичния интерфейс.",
"Ignore":"Пренебрегване",
"Ignore Patterns":"Шаблони за пренебрегване",
"Ignore 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.":"Шаблони за пренебрегване могат да бъдат добавяни след като папката бъде създадена. Ако е отметнато, след запазване ще бъде показано текстово поле за шаблоните.",
"Ignored Devices":"Пренебрегнати устройства",
"Ignored Folders":"Пренебрегнати папки",
"Ignored at":"Пренебрегнато на",
"Incoming Rate Limit (KiB/s)":"Ограничение при изтегляне (KiB/s)",
"Incorrect configuration may damage your folder contents and render Syncthing inoperable.":"Неправилни настройки могат да повредят файлове и да попречат на синхронизирането.",
"Introduced By":"Предложено от",
"Introducer":"Може да предлага други устройства",
"Inversion of the given condition (i.e. do not exclude)":"Обратното на даденото условие (пр. не изключвай)",
"Keep Versions":"Пази версии",
"Introducer":"Поръчител",
"Inversion of the given condition (i.e. do not exclude)":"Обръща значението на условието (напр. да не се отхвърля)",
"Keep Versions":"Пазени версии",
"LDAP":"LDAP",
"Largest First":" Първо най-големите",
"Last Scan":"Последно сканирана",
"Largest First":" Първо най-големи",
"Last 30 Days":"Последните 30 дена",
"Last 7 Days":"Последните 7 дена",
"Last Month":"Миналия месец",
"Last Scan":"Последно обхождане",
"Last seen":"Последно видяно",
"Latest Change":"Последна промяна",
"Learn more":"Научете повече",
"Limit":"Limit",
"Listeners":"Синхронизиращи устройства",
"Limit":"Ограничение",
"Listener Failures":"Грешки при очакване на връзка",
"Listener Status":"Очакване на връзка",
"Listeners":"Очакване на връзка",
"Loading data...":"Зареждане на информация...",
"Loading...":"Зареждане...",
"Local Additions":"Local Additions",
"Local Discovery":"Локално откриване",
"Local State":"Локално състояние",
"Local State (Total)":"Локално състояние (общо)",
"Locally Changed Items":"Locally Changed Items",
"Log":"Доклад",
"Log tailing paused. Scroll to the bottom to continue.":"Log tailing paused. Scroll to the bottom to continue.",
"Logs":"Доклади",
"Major Upgrade":"Основно Обновяване",
"Mass actions":"Действия за всички",
"Local Additions":"Местно добавени",
"Local Discovery":"Месно откриване",
"Local State":"Местно състояние",
"Local State (Total)":"Местно състояние (общо)",
"Locally Changed Items":"Местно променени",
"Log":"Дневник",
"Log tailing paused. Scroll to the bottom to continue.":"Добавяне на редове към дневника е спряно. Плъзнете най-долу за да продължи.",
"Logs":"Дневници",
"Major Upgrade":"Обновяване на значимо издание",
"Mass actions":"Мащабни действия",
"Maximum Age":"Максимална възраст",
"Metadata Only":"Само мета информация",
"Minimum Free Disk Space":"Минимално свободно дисково пространство",
"Mod. Device":"Променящо устройство",
"Mod. Time":"Дата на промяна",
"Move to top of queue":"Премести в началото на опашката",
"Multi level wildcard (matches multiple directory levels)":"Маска на много нива (покрива папки с много нива)",
"Move to top of queue":"Премества най-отпред на опашката",
"Multi level wildcard (matches multiple directory levels)":"Заместващ символ за няколко нива (съвпада с папки, вложени на няколко нива)",
"Never":"никога",
"New Device":"Ново устройство",
"New Folder":"Нова папка",
"Newest First":"Първо най-новите",
"Newest First":"Първо най-нови",
"No":"Не",
"No File Versioning":"Без версии",
"No files will be deleted as a result of this operation.":"Няма да бъдат изтрити файлове като резултат от тази операция.",
"No upgrades":"Няма обновления",
"No File Versioning":"Без пазене на версии",
"No files will be deleted as a result of this operation.":"В резултат на операцията няма да бъдат премахнати файлове.",
"No upgrades":"Без обновяване",
"Not shared":"Не споделена",
"Notice":"Известие",
"OK":"ОК",
"OK":"Добре",
"Off":"Изключено",
"Oldest First":"Първо най-старите",
"Oldest First":"Първо най-стари",
"Optional descriptive label for the folder. Can be different on each device.":"Незадължително име на папката. Може да бъде различно на всяко устройство.",
"Options":"Настройки",
"Out of Sync":"Несинхронизирано",
"Out of Sync Items":"Несинхронизирани елементи",
"Outgoing Rate Limit (KiB/s)":"Лимит на скорост за качване (KiB/s)",
"Override Changes":"Наложи локалните промени",
"Outgoing Rate Limit (KiB/s)":"Ограничение при качване (KiB/s)",
"Override":"Налагане",
"Override Changes":"Налагане на местни промени",
"Path":"Път",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for":"Път до папката на това устройство. Ако не съществува ще бъде създадена. Символът тилда (~) може да бъде използван като заместител на",
"Path where new auto accepted folders will be created, as well as the default suggested path when adding new folders via the UI. Tilde character (~) expands to {%tilde%}.":"Къде да бъдат създавани, автоматично приети папки, както и предложението за път, при добавяне на нови папки от потребителският интерфейс. Символът тилда (~) ще бъде заменян с {{tilde}}.",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).":"Пътят, където версиите да бъдат складирани (оставете празно за папката .stversions).",
"Path to the folder on the local computer. Will be created if it does not exist. The tilde character (~) can be used as a shortcut for":"Път до папката на това устройство. Ако не съществува ще бъде създадена. Символът тилда (~) може да бъде използван вместо",
"Path where versions should be stored (leave empty for the default .stversions directory in the shared folder).":"Папка, в която да бъдат запазвани версиите (оставете празно за подразбираната директория .stversions в споделената папка).",
"Pause":"Пауза",
"Pause All":"Пауза на всички",
"Paused":"На пауза",
"Paused (Unused)":"Paused (Unused)",
"Pending changes":"Pending changes",
"Periodic scanning at given interval and disabled watching for changes":"Периодично сканиране, през определен интервал, без мониторинг за промени",
"Periodic scanning at given interval and enabled watching for changes":"Периодично сканиране, през определен интервал, и мониторинг за промени",
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:":"Периодично сканиране, през определен интервал, мониторинга за промени не може да стартира. Всяка минута минута се прави опит за стартиране:",
"Permissions":"Права за достъп",
"Please consult the release notes before performing a major upgrade.":"Моля прочети бележките по обновяването преди да започнеш.",
"Please set a GUI Authentication User and Password in the Settings dialog.":"Моля задайте потребителско име и парола за потребителския интерфейс в секцията Настройки.",
"Please wait":"Моля изчакайте",
"Prefix indicating that the file can be deleted if preventing directory removal":"Представка, която индикира, че файлът може да бъде изтрит ако пречи на премахването на папка",
"Prefix indicating that the pattern should be matched without case sensitivity":"Представка, която индикира, че шаблона няма да прави разлика между главни/малки букви",
"Preparing to Sync":"Preparing to Sync",
"Paused (Unused)":"На пауза (неизползвано)",
"Pending changes":"Незапазени промени",
"Periodic scanning at given interval and disabled watching for changes":"Периодично обхождане без наблюдение за промени",
"Periodic scanning at given interval and enabled watching for changes":"Периодично обхождане и наблюдение за промени",
"Periodic scanning at given interval and failed setting up watching for changes, retrying every 1m:":"Периодично обхождане и грешка при започване на наблюдението за промени, прави се опит всяка минута.",
"Permanently add it to the ignore list, suppressing further notifications.":"Добавяне за постоянно в списъка с пренебрегнати елементи, потискайки бъдещи известия.",
"Please consult the release notes before performing a major upgrade.":"Прочетете бележките по изданието преди да пристъпите към обновяване към значимо издание.",
"Please set a GUI Authentication User and Password in the Settings dialog.":"Задайте потребителско име и парола за графичния интерфейс в настройките.",
"Please wait":"Изчакайте",
"Prefix indicating that the file can be deleted if preventing directory removal":"Представка, указваща че файлът може да бъде изтрит ако пречи при премахване на папката",
"Prefix indicating that the pattern should be matched without case sensitivity":"Представка, указваща че шаблонът не прави разлика в регистъра на буквите",
"Preparing to Sync":"Подготовка за синхронизация",
"Preview":"Преглед",
"Preview Usage Report":"Преглед на статистиката",
"Quick guide to supported patterns":"Бърз наръчник към поддържаните шаблони",
"Preview Usage Report":"Преглед на отчет за употреба",
"Quick guide to supported patterns":"Кратък наръчник на поддържаните шаблони",
"Random":"Произволен",
"Receive Only":"Само получаване",
"Receive Encrypted":"Приема шифровани данни",
"Receive Only":"Само получава",
"Received data is already encrypted":"Получените данни вече са шифровани",
"Recent Changes":"Последни промени",
"Reduced by ignore patterns":"Намалено посредством шаблон за игнориране",
"Release Notes":"Бележки по обновяването",
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.":"Кандидат версиите съдържат най-новата функционалност и поправки. Те са близки до традиционните дву-седмични Synchthing обновления.",
"Remote Devices":"Устройства",
"Remove":"Премахни",
"Reduced by ignore patterns":"Наложени са шаблони за пренебрегване",
"Release Notes":"Бележки по изданието",
"Release candidates contain the latest features and fixes. They are similar to the traditional bi-weekly Syncthing releases.":"Предварителните издания съдържат най-новите възможности и поправки. Те са близки до традиционните, два пъти в седмицата, издания на Synchthing.",
"Remote Devices":"Отдалечени устройства",
"Remote GUI":"Отдалечен графичен интерфейс",
"Remove":"Премахване",
"Remove Device":"Премахване на устройство",
"Remove Folder":"Премахване на папка",
"Required identifier for the folder. Must be the same on all cluster devices.":"Задължителен идентификатор за папката. Трябва да бъде един и същ на всяко устройство.",
"Rescan":"Сканирай",
"Rescan All":"Сканирай всички",
"Rescans":"Повторни сканирания",
"Restart":"Рестартирай",
"Required identifier for the folder. Must be the same on all cluster devices.":"Задължителен идентификатор на папката. Трябва е еднакъв на всички устройства.",
"Rescan":"Обхождане",
"Rescan All":"Обхождане всички",
"Rescans":"Обхождане",
"Restart":"Рестартиране",
"Restart Needed":"Изисква се рестартиране",
"Restarting":"Рестартиране",
"Restore":"Възстановяване",
"Restore Versions":"Възстановяване на версии",
"Resume":"Пусни",
"Resume All":"Пусни всички",
"Reused":"Повторно използван",
"Revert Local Changes":"Revert Local Changes",
"Save":"Запази",
"Scan Time Remaining":"Оставащо време за сканиране",
"Scanning":"Сканиране",
"See external versioning help for supported templated command line parameters.":"Прегледайте външната документацията за поддържаните командни параметри. ",
"Resume":"Възобновяване",
"Resume All":"Възобновяване всички",
"Reused":"Преизползвано",
"Revert":"Отменяне",
"Revert Local Changes":"Отменяне на местни промени",
"Save":"Запазване",
"Scan Time Remaining":"Оставащо време до обхождане",
"Scanning":"Обхождане",
"See external versioning help for supported templated command line parameters.":"Прочетете ръководството за външното управление на версии, за да се запознаете с шаблонните параметри.",
"Select All":"Всички",
"Select a version":"Изберете версия",
"Select additional devices to share this folder with.":"Select additional devices to share this folder with.",
"Select latest version":"Избор на най-новата версия",
"Select oldest version":"Избор на най-старата версия",
"Select the folders to share with this device.":"Изберете папките за споделяне с това устройство.",
"Send & Receive":"Изпращане и получаване",
"Send Only":"Само изпращане",
"Select additional devices to share this folder with.":"Изберете други устройства, с които да споделите с папката.",
"Select additional folders to share with this device.":"Изберете други папки, които да споделите с устройството.",
"Select latest version":"Избиране на най-новата версия",
"Select oldest version":"Избиране на на най-старата версия",
"Send & Receive":"Изпраща и получава",
"Send Only":"Само изпраща",
"Set Ignores on Added Folder":"Добавяне на шаблони за пренебрегване",
"Settings":"Настройки",
"Share":"Сподели",
"Share Folder":"Сподели папка",
"Share Folders With Device":"Споделяне на папки с устройството",
"Share this folder?":"Сподели тази папка?",
"Share":"Споделяне",
"Share Folder":"Споделяне на папка",
"Share this folder?":"Споделяне на папката?",
"Shared Folders":"Споделени папки",
"Shared With":"Споделена с",
"Sharing":"Споделяне",
"Show ID":"Покажи идентификатора",
"Show QR":"Покажи QR",
"Show diff with previous version":"Показване на разликите спрямо предната версия",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.":"Показва се вместо идентификатора на устройството в статуса на клъстъра. Ще се ползва за представяне пред останалите устройства.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.":"Показва се вместо идентификатора на устройството в статуса на клъстъра. Ще бъде попълнено с името, с което сее представило устройството, ако оставите полето празно.",
"Shutdown":"Спри програмата",
"Show ID":"Идентификатор",
"Show QR":"Преглед на QR",
"Show detailed discovery status":"Подробно състояние на откриване",
"Show detailed listener status":"Подробно състояние на слушане",
"Show diff with previous version":"Показване на разликитес предходната версия",
"Shown instead of Device ID in the cluster status. Will be advertised to other devices as an optional default name.":"В списъка на устройствата се показва вместо идентификатор. Ще бъде предложено на другите устройства като име по подразбиране.",
"Shown instead of Device ID in the cluster status. Will be updated to the name the device advertises if left empty.":"В списъка на устройствата се показва вместо идентификатор. Ако бъде оставено празно ще бъде променено на името, което носи устройството.",
"Shutdown":"Изключване",
"Shutdown Complete":"Спирането завършено",
"Simple File Versioning":"Опростени версии",
"Single level wildcard (matches within a directory only)":"Маска на едно ниво (покрива само в папка)",
"Simple":"Обикновени",
"Simple File Versioning":"Обикновени версии",
"Single level wildcard (matches within a directory only)":"Заместващ символ за едно ниво (съвпада само с папка)",
"Size":"Размер",
"Smallest First":"Първо най-малките",
"Smallest First":"Първо най-малки",
"Some discovery methods could not be established for finding other devices or announcing this device:":"Следните методи за откриване не могат да бъдат използвани за намиране на други устройства или за обявяване на това устройство, за да бъде открито от останалите:",
"Some items could not be restored:":"Някои елементи не могат да бъдат възстановени:",
"Source Code":"Сорс код",
"Stable releases and release candidates":"Стабилни версии и кандидати за стабилни версии",
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.":"Стабилните версии са забавени с две седмици. През това време те преминават през тестване като бъдат кандидат версии.",
"Some listening addresses could not be enabled to accept connections:":"Някои от адресите, на които Syncthing очаква връзка не могат да бъдат настроени да получават входящи връзки.",
"Source Code":"Изходен код",
"Stable releases and release candidates":"Стабилни и предварителни издания",
"Stable releases are delayed by about two weeks. During this time they go through testing as release candidates.":"Стабилните издания биват забавяни с две седмици. През този период те преминават през изпитване като предварителни издания.",
"Stable releases only":"Само стабилни версии",
"Staggered File Versioning":"Наслагващи се версии",
"Stores and syncs only encrypted data. Folders on all connected devices need to be set up with the same password or be of type \"{%receiveEncrypted%}\" too.":"Съхранява и синхронизира само шифровани данни. Папките на всички свързани устройства трябва да бъдат настроени със същата парола или също да са от вида „{{receiveEncrypted}}“.",
"Support":"Помощ",
"Support Bundle":"Support Bundle",
"Sync Protocol Listen Addresses":"Адрес за слушане на синхронизиращия протокол",
"Support Bundle":"Архив за поддръжка",
"Sync Protocol Listen Addresses":"Адрес, на който слуша синхронизиращия протокол",
"Sync Status":"Състояние",
"Syncing":"Синхронизиране",
"Syncthing has been shut down.":"Syncthing еспрян.",
"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 is Free and Open Source Software licensed as MPL v2.0.",
"Syncthing is restarting.":"Syncthing се рестартира",
"Syncthing is Free and Open Source Software licensed as MPL v2.0.":"Syncthing е свободен софтуер с отворен код, под лиценза на MPL v2.0.",
"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 upgrading.":"Syncthing се обновява.",
"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.":"Syncthing now supports automatically reporting crashes to the developers. This feature is enabled by default.",
"Syncthing seems to be down, or there is a problem with your Internet connection. Retrying…":"Изглежда, че Syncthing не е включен, или има проблем с връзката с Интернет. Повторен опит...",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.":"Syncthing има проблем при обработването на заявката. Моля, презаредете браузъра или рестартирайте Syncthing ако проблемът продължи.",
"Take me back":"Take me back",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.":"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.",
"The Syncthing Authors":"The Syncthing Authors",
"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 не работи или няма достъп до интернет. Извършва се повторен опит…",
"Syncthing seems to be experiencing a problem processing your request. Please refresh the page or restart Syncthing if the problem persists.":"Syncthing има проблем при обработването на заявката. Презаредете страницата или рестартирайте Syncthing ако проблемът продължава да съществува.",
"Take me back":"Назад",
"The GUI address is overridden by startup options. Changes here will not take effect while the override is in place.":"Адресът на интерфейса не се взима под внимание заради параметри при стартиране. Промените тук няма да бъдат отразени докато параметрите не бъдат променени.",
"The Syncthing Authors":"Автори на Syncthing",
"The Syncthing admin interface is configured to allow remote access without a password.":"Администраторският панел на Syncthing разрешава дистанционен достъп без да изисква парола.",
"The aggregated statistics are publicly available at the URL below.":"Обобщение на събраните статистически ще намерите на долния URL адрес.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.":"Конфигурацията е запазена, но не е активирана. Syncthing трябва да рестартира, за да се активира новата конфигурация.",
"The aggregated statistics are publicly available at the URL below.":"Обобщените статистически данни са публично достъпни на адреса по-долу.",
"The cleanup interval cannot be blank.":"Интервалът на почистване не може да бъде празен.",
"The configuration has been saved but not activated. Syncthing must restart to activate the new configuration.":"Настройките са запазени, но не са приложени. За да влязат в сила Syncthing трябва да се рестартира.",
"The device ID cannot be blank.":"Полето идентификатор на устройство не може да бъде празно.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).":"Идентификатор на устройство за въвеждане тук, може да бъде намерен в \"Промени > Покажи идентификатора\" на другото устройство. Интервалите и тиретата са пожелание (биват прескачани).",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.":"Криптиран статистически доклад ще се изпраща ежедневно. Ползва се, за отичане на ползваните платформи, размер на папки и версии на приложението. При промяна в събираните данни, ще бъдете информирани от подобен на този прозорец.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.":"Въведеният идентификатор на устройство не е валиден. Трябва да бъде 52 или 56 символа и да се състои от букви и цифри, като интервалите и тиретата са пожелание.",
"The device ID to enter here can be found in the \"Actions > Show ID\" dialog on the other device. Spaces and dashes are optional (ignored).":"Идентификаторът на устройството, който да въведете се намира в „Действия > Идентификатор“. Интервалите и дефисите са незадължителни.",
"The encrypted usage report is sent daily. It is used to track common platforms, folder sizes and app versions. If the reported data set is changed you will be prompted with this dialog again.":"Шифрованият отчет за употреба се изпраща ежедневно. Използва се за отчитане на най-често срещаните платформи, размери на папки и издания на приложението. При промяна в събираните данни отново ще бъде поискано вашето съгласие.",
"The entered device ID does not look valid. It should be a 52 or 56 character string consisting of letters and numbers, with spaces and dashes being optional.":"Въведеният идентификатор на устройство не е валиден. Трябва да бъде 52 или 56 символа и да се състои от букви и цифри, като интервалите и дефисите са незадължителни.",
"The folder ID cannot be blank.":"Полето идентификатор на папка не може да бъде празно.",
"The folder ID must be unique.":"Идентификаторът на папката трябва да бъде уникален.",
"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.":"Съдържанието на папката в другите устройства ще бъде презаписано, за да стане еднакво със съдържанието на това устройство. Файловете, които ги няма тук, но съществуват на другите устройства ще бъдат премахнати.",
"The folder content on this device will be overwritten to become identical with other devices. Files newly added here will be deleted.":"Съдържанието на папката в това устройство ще бъде презаписано, за да стане еднакво със съдържанието на другите устройства. Добавените файлове ще бъдат премахнати.",
"The folder path cannot be blank.":"Пътят до папката не може да бъде празен.",
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.":"Използва се следния интервал: за първия час се пази версия на всеки 30 секунди, за първия ден се пази версия на всеки час, за първите 30 дена се пази версия всеки ден, до максимума се пази една версия всяка седмица.",
"The following intervals are used: for the first hour a version is kept every 30 seconds, for the first day a version is kept every hour, for the first 30 days a version is kept every day, until the maximum age a version is kept every week.":"Използват се следните интервали: за първия час се пази версия на всеки 30 секунди, за първия ден - на всеки час, за първите 30 дена - всеки ден, до максимума се пази една версия всяка седмица.",
"The following items could not be synchronized.":"Следните елементи не могат да бъдат синхронизирани.",
"The following items were changed locally.":"The following items were changed locally.",
"The following items were changed locally.":"Следните елементи са променени локално.",
"The following methods are used to discover other devices on the network and announce this device to be found by others:":"Следните методи се използват за откриване на други устройства в мрежата и за обявяване на това устройство, за да бъде открито от останалите:",
"The following unexpected items were found.":"Следните елементи са намерени, но не са очаквани.",
"The interval must be a positive number of seconds.":"Интервалът трябва да е положителен брой секунди.",
"The interval, in seconds, for running cleanup in the versions directory. Zero to disable periodic cleaning.":"Интервал, в секунди, на почистване на папката с версии. Нула изключва периодичното почистване.",
"The maximum age must be a number and cannot be blank.":"Максималната възраст трябва да е число, полето не може да бъде празно.",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).":"Максималното време за пазене на версия (в дни, задайте 0 за да не бъдат изтривани версии).",
"The maximum time to keep a version (in days, set to 0 to keep versions forever).":"Максимална продължителност за пазене на версия (в дни, за да не бъдат изтривани версии задайте 0).",
"The number of days must be a number and cannot be blank.":"Броят дни трябва да бъде число и не може да бъде празно.",
"The number of days to keep files in the trash can. Zero means forever.":"Броят дни за запазване на файловете в кошчето. Нула значи завинаги.",
"The number of old versions to keep, per file.":"Броят стари версии, които да бъдат пазени за всеки файл.",
"The number of days to keep files in the trash can. Zero means forever.":"Брой дни за пазене на файловете в кошчето. Нула значи завинаги.",
"The number of old versions to keep, per file.":"Брой стари версии, които да бъдат пазени за всеки файл.",
"The number of versions must be a number and cannot be blank.":"Броят версии трябва да бъде число и не може да бъде празно.",
"The path cannot be blank.":"Пътят не може да бъде празен.",
"The rate limit must be a non-negative number (0: no limit)":"Ограничението на скоростта трябва да бъде положително число (0: неограничено)",
"The rescan interval must be a non-negative number of seconds.":"Интервала на сканиране трябва да бъденеотрицателночисло в секунди.",
"There are no devices to share this folder with.":"There are no devices to share this folder with.",
"They are retried automatically and will be synced when the error is resolved.":"Ще бъдат спрени и автоматично синхронизирани, когато грешката бъде оправена.",
"This Device":"Вашето устройство",
"This can easily give hackers access to read and change any files on your computer.":"Така се предоставя изключително лесен достъп (четене, редактиране и изтриване) до всеки файл, на компютъра Ви.",
"This is a major version upgrade.":"Това е нова основна версия.",
"This setting controls the free space required on the home (i.e., index database) disk.":"Тази настройка контролира нужното свободното място на основния (пр. този с базата данни) диск.",
"The remote device has not accepted sharing this folder.":"Отдалеченото устройство нееприело да споделя папката.",
"The remote device has paused this folder.":"Отдалеченото устройство е оставило на пауза папката.",
"The rescan interval must be a non-negative number of seconds.":"Интервалът на обхождане трябва да е положителен брой секунди.",
"There are no devices to share this folder with.":"Няма устройства, с които да споделите папката.",
"There are no file versions to restore.":"Файлът няма версии, които да бъдат възстановени.",
"There are no folders to share with this device.":"Няма папка, която да споделите с устройството.",
"They are retried automatically and will be synced when the error is resolved.":"Ще бъдат спрени и автоматично синхронизирани, когато грешката бъде отстранена.",
"This Device":"Това устройство",
"This Month":"Този месец",
"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.":"Тази настройка управлява нужното свободното място на основния (пр. този с банката от данни) диск.",
"Time":"Време",
"Time the item was last modified":"Часът на последна промяна на елемента",
"Trash Can File Versioning":"Само на файловете в кошчето",
"Type":"Тип",
"UNIX Permissions":"UNIX Permissions",
"Unavailable":"Не е на разположение",
"Unavailable/Disabled by administrator or maintainer":"Не е на разположение/Деактивриан от администраторът или поддръжника",
"Time the item was last modified":"Час на последна промяна на елемента",
"Today":"Днес",
"Trash Can":"Кошче за отпадъци",
"Trash Can File Versioning":"Версии от вида „кошче за отпадъци“",
"Twitter":"Twitter",
"Type":"Вид",
"UNIX Permissions":"Права на UNIX",
"Unavailable":"Няма налични",
"Unavailable/Disabled by administrator or maintainer":"Недостъпно или изключено от администратора или поддръжката",
"Unexpected items have been found in this folder.":"В папката са намерени неочаквани елементи.",
"Unignore":"Отменяне на пренебрегване",
"Unknown":"Неясно",
"Unshared":"Несподелена",
"Unshared Devices":"Unshared Devices",
"Unshared Devices":"Устройства, с които не е споделена",
"Unshared Folders":"Несподелени папки",
"Untrusted":"Недоверено",
"Up to Date":"Синхронизирано",
"Updated":"Обновено",
"Upgrade":"Обнови",
"Upgrade To {%version%}":"Обновен до {{version}}",
"Updated {%file%}":"{{file}} обновен",
"Upgrade":"Обновяване",
"Upgrade To {%version%}":"Обновяване до {{version}}",
"Upgrading":"Обновяване",
"Upload Rate":"Скорост на качване",
"Uptime":"Работи от",
"Usage reporting is always enabled for candidate releases.":"Докладът за ползването е винаги включен за кандидат нови версии.",
"Use HTTPS for GUI":"Използвай HTTPS за потребителския интерфейс",
"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":"Версия",
"Usage reporting is always enabled for candidate releases.":"Отчитането наупотребата винагие включено за предварителни издания.",
"Use HTTPS for GUI":"Графичният интерфейс работи под HTTPS",
"Use notifications from the filesystem to detect changed items.":"Използва съобщения от файловата система, за да открива променени елементи.",
"Username/Password has not been set for the GUI authentication. Please consider setting it up.":"Няма зададени потребителско име и парола за достъп до графичния интерфейс. Помислете за създаването им.",
"Version":"Издание",
"Versions":"Версии",
"Versions Path":"Път до версиите",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.":"Версиите биват изтривани автоматично, когато са по-стари от максималната възраст или надминават броя версии разрешени в даден интервал.",
"Waiting to Scan":"Waiting to Scan",
"Waiting to Sync":"Waiting to Sync",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".":"Предупреждение, този път е по-горна директория на съществуващата папка \"{{otherFolder}}\".",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).":"Предупреждение, този път е по-горна директория на съществуващата папка \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".":"Внимание, това е вътрешна папка на вече съществуваща папка \"{{otherFolder}}\".",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).":"Предупреждение, този път епод-директория на съществуващата папка \"{{otherFolderLabel}}\" ({{otherFolder}}).",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.":"Предупреждение: Ако използвате външна програма за наблюдение като {{syncthingInotify}}, трябва да я деактивирате.",
"Watch for Changes":"Мониторинг за промени",
"Watching for Changes":"Мониторинг за промени",
"Watching for changes discovers most changes without periodic scanning.":"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.":"Когато добавяте нов идентификатор на папка имайте предвид, четой се използва за свързване на папките между отделните устройства. Идентификатора разграничава главни/малки букви.",
"Versions are automatically deleted if they are older than the maximum age or exceed the number of files allowed in an interval.":"Версиите биват изтривани автоматично ако са по-стари от максималната възраст или надминават броя разрешени версии за определено време.",
"Waiting to Clean":"Изчаква за почистване",
"Waiting to Scan":"Изчаква за обхождане",
"Waiting to Sync":"Изчаква за синхронизиране",
"Warning":"Внимание",
"Warning, this path is a parent directory of an existing folder \"{%otherFolder%}\".":"Внимание, този път е родителска папка съществуващата „{{otherFolder}}“.",
"Warning, this path is a parent directory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).":"Внимание, този път еродителска папка съществуващата „{{otherFolderLabel}}“ ({{otherFolder}}).",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolder%}\".":"Внимание, този път е подпапка съществуващата „{{otherFolder}}“.",
"Warning, this path is a subdirectory of an existing folder \"{%otherFolderLabel%}\" ({%otherFolder%}).":"Внимание, този път е подпапка на съществуващата „{{otherFolderLabel}}“ ({{otherFolder}}).",
"Warning: If you are using an external watcher like {%syncthingInotify%}, you should make sure it is deactivated.":"Внимание: Ако използвате външно приложение за наблюдение като {{syncthingInotify}}, трябва да го спрете.",
"Watch 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.":"Като добавяте папката имайте предвид, че той се използва за еднозначно указване на папката между устройствата. Има разлика в регистъра на знаците и трябва изцяло да съвпада между всички устройства.",
"Yes":"Да",
"You can also select one of these nearby devices:":"Също така може да изберете едно от устройствата, които намират се наблизо:",
"Yesterday":"Вчера",
"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.":"Може да научите допълнително за двата канала на версии, следвайки връзката по-долу.",
"You have no ignored devices.":"Няма игнорирани устройства.",
"You have no ignored folders.":"Няма игнорирани папки.",
"You have unsaved changes. Do you really want to discard them?":"Има незапазени промени. Наистина ли желаете да ги отмените?",
"You must keep at least one version.":"Трябва да пазиш поне една версия.",
"You can read more about the two release channels at the link below.":"Може да научите повече за двата канала на издание, следвайки препратката по-долу.",
"You have no ignored devices.":"Няма пренебрегнати устройства.",
"You have no ignored folders.":"Няма пренебрегнати папки.",
"You have unsaved changes. Do you really want to discard them?":"Има незапазени промени. Желаете ли да се откажете от тях?",
"You must keep at least one version.":"Необходимо е да има поне една версия.",
"You should never add or change anything locally in a \"{%receiveEncrypted%}\" folder.":"Никога не трябва да променяте нищо в папка от вида „{{receiveEncrypted}}“.",
"days":"дни",
"directories":"папки",
"files":"файла",
"full documentation":"пълна документация",
"items":"елемента",
"{%device%} wants to share folder \"{%folder%}\".":"{{device}} желае да сподели папката \"{{folder}}\".",
"{%device%} wants to share folder \"{%folderlabel%}\" ({%folder%}).":"{{device}} желае да сподели папката \"{{folderlabel}}\" ({{folder}})."
"seconds":"секунди",
"theme-name-black":"Черна",
"theme-name-dark":"Тъмна",
"theme-name-default":"По подразбиране",
"theme-name-light":"Светла",
"{%device%} wants to share folder \"{%folder%}\".":"{{device}} споделя папката „{{folder}}“.",
"{%reintroducer%} might reintroduce this device.":"Поръчителят {{reintroducer}} може отново да предложи това устройство."
}
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.